Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2022, 22:34   #21
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

EM_SETWORDBREAKPROC через него устанавливается callback функция имеющая параметрыEDITWORDBREAKPROCA
Код:
EDITWORDBREAKPROCA Editwordbreakproca;

function Editwordbreakproca(
  [in] LPSTR lpch, // Указатель на строку
  [in] int ichCurrent, // Текущий индекс в строке
  [in] int cch, // Длина строки
  [in] int code // причина вызова
): Integer; stdcall;
begin...end;
ее вы и должны написать
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 22:43   #22
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Ув. macomics. Посмотрите, пож-та, начало обсуждения. Kronos913, насколько я понял, предполагает наличие нескольких длинных строк в мемо, которые будут разбиваться на несколько более мелких строк. Если бы речь в ТЗ была об одной длинной строке, то вне всякого сомнения, берем Rect и форматируем. В ТЗ предполагается, что длинные строки, будут иметь разную длину и разбиваться на строки разной длины.
Viktor61 вне форума Ответить с цитированием
Старый 09.05.2022, 22:49   #23
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Ув. Viktor61. Попробуйте выведя одну длинную строку с нужной разбивкой в некоторой Rect прибавить к Rect.Top разницу Rect.Bottom - Rect.Top и выводить следующую длинную строку до тех пор пока вновь полученное значение Rect.Top не превысит ClientHeight. Для реализации этого хитрого плана стоит написать цикл.
2) Вы попробуйте распечатать в консоли всю строку получаемую в callback функцию.
Цитата:
A pointer to the text of the edit control.
Эта длинная строка и будет всем текстом Memo. Значит при выполнении разбивки вам надо учитывать не только длину одной строки, но и переходы на новую строку. DrawText это и делает.
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 23:02   #24
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Спасибо. Будем разбираться.
Viktor61 вне форума Ответить с цитированием
Старый 11.05.2022, 16:43   #25
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Работающий код
Код:
function CopyLongStr(const sMemoText, sMarker: string): string;
var
  s : string;
begin
  Result := s;
  s := Copy(sMemoText, 1, pos(sMarker, sMemoText)-1);
  if Length(s) > 0 then Result := s;
end;
Где sMemoText - Memo.Text
sMarker - редко используемый символ,
который необходимо прибавить в конце длинной строки (например, тильда- '~')
В сообщении Kronos913 от 04.05.2022, 22:37 это следует понимать как (См. рисунок)
Строка1_1111111111111~
Строка2~

Использовать ф-цию можно примерно так
Код:
procedure TForm2.btn2Click(Sender: TObject);
var
  s0, s : string;
begin
//  sMarker := '~';
  s := mmo1.Text;
  s0:= mmo1.Text;
  while Length(s) > 0 do
   begin
    s:= CopyLongStr(s0,'~');
    if Length(s) > 0 then  ShowMessage(s);
    Delete(s0, 1, pos('~', s0));
   end;
end;
Viktor61 вне форума Ответить с цитированием
Старый 11.05.2022, 16:48   #26
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Конечно, знаки-маркеры будут дезориентировать неопытного пользователя (он их может стирать и проч., что неудобно).
Если ув. macomics покажет работающий код, который будет использовать различные механизмы которые он предлагал (EM_SETWORDBREAKPROC и проч.), мы с Kronos913'ом скажем ему большое человеческое СПАСИБО!
Viktor61 вне форума Ответить с цитированием
Старый 11.05.2022, 19:26   #27
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Работа DrawText(..., DT_WORDBREAK);
Изображения
Тип файла: png 2022-05-11_21-54-39.png (15.0 Кб, 21 просмотров)
Вложения
Тип файла: zip main.zip (1.1 Кб, 4 просмотров)

Последний раз редактировалось macomics; 11.05.2022 в 21:58.
macomics вне форума Ответить с цитированием
Старый 11.05.2022, 19:36   #28
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

субкласс сможете сделать, чтобы самостоятельно текст рисовать в Memo1?
macomics вне форума Ответить с цитированием
Старый 11.05.2022, 20:00   #29
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Еще один вариант появился:
Код:
SetWindowLong(Memo1.Handle, GWL_STYLE, GetWindowLong(Memo1.Handle, GWL_STYLE) and not ES_AUTOHSCROLL);

Последний раз редактировалось macomics; 11.05.2022 в 20:05.
macomics вне форума Ответить с цитированием
Старый 11.05.2022, 23:02   #30
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию Во вложении

Ув. macomics! В прикреплённом файле только exe-шник. Без кода... Вы именно это хотели прикрепить?
Изображения
Тип файла: png Снимок_.PNG (14.3 Кб, 19 просмотров)
Viktor61 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос данных из одной БД в другую Максикок SQL, базы данных 1 15.03.2015 22:54
Перенос данных из одной таблицы в другую atenon Фриланс 5 23.07.2014 06:18
Перенос данных из одной книги в другую and150382 Microsoft Office Excel 3 26.03.2013 12:21
перенос из одной таблицы БД в другую WishHunter Помощь студентам 9 21.02.2013 08:15
Перенос данных из одной БД в другую demiancz БД в Delphi 1 11.03.2012 18:53