HandleMessageExample (Delphi)
From RAD Studio Code Examples
Language:
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 )