[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]