|
||||
|
СобытияСозданиеСоздание события во время выполнения приложенияна примере переопределения события в Memo: memo.onchange:= memo1Change; procedure TForm1.Memo1Change(Sender: TObject); begin panel1.caption:= 'Содержимое было изменено'; end; Задержка выполненияЗадержка выполнения OnChange (Delphi 2)В случае нажатия пользователем клавиши или изменении текущего элемента компонента ComboBox, вы обратите внимание на досадную задержку, возникающую при генерации события OnChange. Так как "работа кипит", я хотел бы отреагировать на изменение ItemIndex несколько позднее, например, 100 миллисекунд спустя. Вот что у меня получилось. Созданный в Delphi2, код подходит также и для Delphi 1. На простой форме располагаем компоненты ComboBox и Label. Необходимым дополнением является вызов Application.ProcessMessages, позволяющий избежать замедления работы PC, когда очередь сообщений для формы пуста. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const // Просто некоторая константа сообщения PM_COMBOCHANGE = WM_USER + 8001; // 500 миллисекунд CWantedDelay = 500; type TForm1 = class(TForm) ComboBox1: TComboBox; Label1: TLabel; procedure ComboBox1Change(Sender: TObject); private procedure PMComboChange(var message : TMessage); message PM_COMBOCHANGE; public end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.ComboBox1Change(Sender: TObject); begin PostMessage(Handle, PM_COMBOCHANGE, 0, 0); end; procedure TForm1.PMComboChange(var message : TMessage); const InProc: BOOLEAN = FALSE; StartTick: LONGINT = 0; begin if InProc then begin // Обновляем стартовое время задержки StartTick:= GetTickCount; end else begin // Организация цикла InProc:= TRUE; // Инициализация стартового времени StartTick:= GetTickCount; // Ожидаем истечения стартового времени. // Пока стартовое время не исчерпалось, позволяем операционной системе обрабатывать сообщения while GetTickCount - StartTick < CWantedDelay do Application.ProcessMessages; // Иллюстративное приращение счетчика, задающее некоторую реальную работу обработчику события OnChange Label1.Caption:= IntToStr(StrToIntDef(Label1.Caption, 0) + 1); // Завершение цикла InProc:= FALSE; end; end; end. |
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх |
||||
|