Показать сообщение отдельно
  #2  
Старый 03.11.2023, 10:32
xchgeaxeax xchgeaxeax вне форума
Прохожий
 
Регистрация: 11.05.2023
Сообщения: 15
Версия Delphi: D7, Laz v2.2.6
Репутация: 10
По умолчанию

Поставьте перед проверкой в конце цикла Application.ProcessMessages и устанавливайте флаг в событии OnChange.

P.S. По вашему описанию цикла следует, что проверка компонента производится дважды на каждой итерации цикла. Зачем?
Код:
buffer := Memo1.Text; // Сохранили текст из TMemo в локальную переменную
if buffer <> '' then repeat // Начинаем цикл, если буфер не пустой (проверка в начале, перед циклом)
  // Какие-то действия с buffer
  temp := buffer; // Сохранили предыдущий буфер
  buffer := Memo1.Text; // Получили информацию из компонента (однократно за итерацию обращаемся к компоненту)
until (buffer = temp) or (buffer = ''); // Проверили на изменения или опустошение (первичное условие)
// buffer = temp  это проверка на наличие изменений в тексте
// buffer = ''  это первичное условие входа в цикл
или так
Код:
change := true; // Устанавливаем флаг для входа в цикл
// или так
// change := Memo1.Text <> '';
while change do begin
  buffer := Memo1.Text; // сохраняем данные из компонента в буфер
  change := false; // сбрасываем флаг изменения компонента
  // Какие-то действия с buffer
  Application.ProcessMessages; // Обработали сообщения (по сути вызвали OnChange, если были изменения в Memo1)
end;
// ...
procedure TForm1.Memo1Change(Sender: TObject);
begin
  change := true; // Установили глобальный флаг
end; 
Но если возникла необходимость работать в цикле с графическими компонентами, тогда лучше цикл развернуть в событие по таймеру. Так компонент будет успевать принять изменения, которые может вносить пользователь или другая программа.
Код:
procedure TForm1.Memo1Change(Sender: TObject);
begin
  Timer1.Enabled := False; // Остановили таймер
  Timer1.Enabled := True; // Перезапустили. Нужно, чтобы пользователь успевал набирать текст, а не обрабатывалась каждая введённая с клавиатуры буква. Так при задержке в 500 мс надо вводить как минимум по 2 буквы в секунду, чтобы не началась обработка изменений.
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Timer1.Enabled := False; // Остановили таймер т.к. эту итерацию после изменений выполнили
   // Какие-то действия с Memo1.Text после внесения изменений с клавиатуры
end;

Каждый графический компонент работает с очередью сообщений Windows. Используя его как буфер в циклах вы дополнительно генерируете кучу не нужных сообщений для обновления интерфейса и взаимодействия между графическими компонентами.
Ответить с цитированием