Procedure call with delay in Delphi and Lazarus

With the latest threading library from Delphi XE7, it’s been quite easy to start a procedure with a delay. The TTask does its job very well:

  TTask.Create(
    procedure
    begin
      Sleep(1000);//delay of 1s
      ShowMessage('Hello');
    end).Start;

This is very easy but it has one big issue – you cannot easily stop the execution before the delay limit is reached and it can be used only in the latest Delphi versions. So I came up with my own alternative:

  TOCallWithDelay.Create(Self, 1000,
    procedure
    begin
      ShowMessage('Hello');
    end);

The first parameter is the component owner – if the owner is destroyed (e.g. you close the dialog before the limit), the procedure call won’t be executed. The class works in Delphi 5 and newer on all supported platforms, including mobile/ARC. FPC/Lazarus is supported as well.

If you want to stop the object in the future, use:

procedure TForm1.Btn1Click(Sender: TObject);
var
  xCall: TOCallWithDelay;
begin
  TOCallWithDelay.Create(Self, @xCall, 1000,
    procedure
    begin
      ShowMessage('Hello');
    end);

  xCall.Free;//stop TOCallWithDelay -> do not call the method
end;

Download the source code with a simple test project:
OCallWithDelay.zip

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>