Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter