HandleMessageExample (Delphi)
Description
The following code demonstrates background processing using the OnIdle event and using the HandleMessage method to allow messages or background processing to get through. Note: You must add MyIdleHandler to the Form1 methods.
Code
var
{ Global variables to show the order of events }
XPos, YPos, Delta: integer;
{ Utility procedure to display messages }
{ Add it at the beginning of the implementation section. }
procedure StatusMsg(
MyForm : TForm1; Canvas : TCanvas; Message : string; Bkg : Boolean);
begin
if not bkg then
Canvas.Font.Style := [fsBold]; {Foreground messages are in bold type. }
Canvas.TextOut(XPos, YPos, Message);
if not bkg then
Canvas.Font.Style := [];
{ Change Xpos and YPos to prepare for the next message. }
Ypos := Ypos + Delta;
if YPos >= MyForm.ClientHeight - 10 then
begin
YPos := 10;
Xpos := Xpos + 180;
end;
if (Xpos >= MyForm.ClientWidth - 100) then
begin
if (Canvas.Font.Color = clRed) then
Canvas.Font.Color := clBlack
else
Canvas.Font.Color := clRed;
Xpos := 10;
end;
end;
{ This is the form�s OnCreate event handler. }
{ It initializes global variables and sets the OnIdle
event handler. }
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption := 'Do not yield';
Button2.Caption := 'Handle Message';
Application.OnIdle:= MyIdleHandler;
XPos := 10;
YPos := 10;
Delta := Abs(Canvas.Font.Height) + 1;
end;
{
This is the OnIdle event handler. It is set in the form�s
OnCreate event handler, so you need to only add it as a private
method of the form. Usually, it would perform
background processing for the application. This one simply
writes a message to let you know when it is there.
procedure TForm1.MyIdleHandler(Sender: TObject; var Done: Boolean);
begin
StatusMsg(
Form1, Canvas, 'This represents a background process.', True);
end;
{
Set this method as the OnClick event handler of Button1. It
performs a calculation without yielding to other messages or
idle time.
procedure TForm1.Button1Click(Sender: TObject);
var
I, J, X, Y: Word;
begin
StatusMsg(
Form1, Canvas, 'The synchronous handler is starting', False);
I := 0;
J := 0;
while I < 10 do
begin
Randomize;
while J < 10 do
begin
Y := Random(J);
Inc(J);
end;
X := Random(I);
Inc(I);
end;
StatusMsg(
Form1, Canvas, 'The synchronous handler is done', False);
end;
{
Set this method as the OnClick event handler of Button2. It
performs a calculation, but calls HandleMessage to allow idle
time or asynchronous message processing.
procedure TForm1.Button2Click(Sender: TObject);
var
I, J, X, Y: Word;
begin
StatusMsg(
Form1, Canvas, 'The asynchronous handler is starting', False);
I := 0;
J := 0;
while I < 10 do
begin
Randomize;
while J < 10 do
begin
Y := Random(J);
Inc(J);
end;
X := Random(I);
Inc(I);
{ yield to OnIdle or other messages }
Application.HandleMessage;
end;
StatusMsg(
Form1, Canvas, 'The asynchronous handler is done', False);
end;
Uses
- Vcl.Forms.TApplication.HandleMessage ( fr | de | ja )
- Vcl.Forms.TApplication.OnIdle ( fr | de | ja )
- Vcl.Graphics.TFontStyles ( fr | de | ja )