|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Изменение комппанента
Фрумчане можно проделать подобную штуку, если да, то как
Идет цикл, в начале цикла проверется состояние компонента МЕМО, дальше идут разные манипуляции и в конце еще раз проверяется компонента МЕМО и если он изменился с момента первой проверки, цикл повторяестя? |
#2
|
|||
|
|||
Поставьте перед проверкой в конце цикла 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. Используя его как буфер в циклах вы дополнительно генерируете кучу не нужных сообщений для обновления интерфейса и взаимодействия между графическими компонентами. |