[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
Erik Sperling Johansen >erik@info-pro.no> Stefan Hoffmeister wrote:
If the user keeps either key pressed and the change of the item
(ComboBox.OnChange) takes a long(ish) time an annoying delay will be
noticed.
As a "work around" I would like to react to the change of the
ItemIndex only after a short period of time, e.g. 100 ms.
Here's an example. Written in D2, but technique should work OK in D1 too. Just a simple form with a combo and a label. You probably should consider using Yield in addition to the call to Application.ProcessMessages, to avoid slowing down the PC when the forms message queue is empty.
--------------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
const
// Just some message constant
PM_COMBOCHANGE = WM_USER + 8001;
// 500 ms
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
// Update the starting time for the delay
StartTick := GetTickCount;
end else begin
// We're in the loop
InProc := TRUE;
// Initial starting time
StartTick := GetTickCount;
// Wait until wanted time has elapsed.
// If proc gets called again, starting time will change
while GetTickCount - StartTick < CWantedDelay do Application.ProcessMessages;
// Increment a counter, just for illustration of when to do the actual OnChange work
Label1.Caption := IntToStr ( StrToIntDef ( Label1.Caption, 0 ) + 1);
// We're finished with the loop
InProc := FALSE;
end;
end;
end.
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]