Поставьте перед проверкой в конце цикла Application.ProcessMessages и устанавливайте флаг в событии OnChange.
P.S. По вашему описанию цикла следует, что проверка компонента производится дважды на каждой итерации цикла. Зачем?
Код:
1 2 3 4 5 6 7 8 | buffer := Memo1 . Text;
if buffer <> '' then repeat
temp := buffer;
buffer := Memo1 . Text;
until (buffer = temp) or (buffer = '' );
|
или так
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | change := true ;
while change do begin
buffer := Memo1 . Text;
change := false ;
Application . ProcessMessages;
end ;
procedure TForm1 . Memo1Change(Sender: TObject);
begin
change := true ;
end ;
|
Но если возникла необходимость работать в цикле с графическими компонентами, тогда лучше цикл развернуть в событие по таймеру. Так компонент будет успевать принять изменения, которые может вносить пользователь или другая программа.
Код:
1 2 3 4 5 6 7 8 9 10 11 | procedure TForm1 . Memo1Change(Sender: TObject);
begin
Timer1 . Enabled := False ;
Timer1 . Enabled := True ;
end ;
procedure TForm1 . Timer1Timer(Sender: TObject);
begin
Timer1 . Enabled := False ;
end ;
|
Каждый графический компонент работает с очередью сообщений Windows. Используя его как буфер в циклах вы дополнительно генерируете кучу не нужных сообщений для обновления интерфейса и взаимодействия между графическими компонентами.