Поставьте перед проверкой в конце цикла 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. Используя его как буфер в циклах вы дополнительно генерируете кучу не нужных сообщений для обновления интерфейса и взаимодействия между графическими компонентами.