HandleMessage (C++)
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
// Global variables to show the order of events int XPos, YPos, Delta; /* This is a utility procedure to display messages. Add it at the beginning of the unit. */ void StatusMsg(TForm *Form, TCanvas *Canvas, char *Message, bool Bkg) { if (!Bkg) Canvas->Font->Style = TFontStyles() << fsBold; // Foreground messages are bold. Canvas->TextOut(XPos, YPos, Message); if (!Bkg) Canvas->Font->Style = TFontStyles(); // Change Xpos and YPos to prepare for the next message. YPos += Delta; if (YPos >= Form->ClientHeight - 10) { YPos = 10; XPos += 180; } if (XPos >= Form->ClientWidth - 100) { if (Canvas->Font->Color == clRed) Canvas->Font->Color = clBlack; else Canvas->Font->Color = clRed; XPos = 10; } } /* This is the OnCreate event handler for Form1. It initializes global values and sets the application's OnIdle event handler. */ __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Button1->Caption = "Do not yield"; Button2->Caption = "Handle Message"; Application->OnIdle = MyIdleHandler; XPos = 10; YPos = 10; if (Canvas->Font->Height > 0) Delta = Canvas->Font->Height + 1; else Delta = 1 - Canvas->Font->Height; } /* This is the OnIdle event handler. It is set in the Form's OnCreate event handler, so you only need to 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 inform you when it is there. */ void __fastcall TForm1::MyIdleHandler(TObject *Sender, bool &Done) { StatusMsg(Form1, Canvas, "This represents a background process.", true); } /* This is the OnClick event handler for Button1. It simulates a lengthy process. */ void __fastcall TForm1::Button1Click(TObject *Sender) { int X, Y; StatusMsg(Form1, Canvas, "The Button1Click handler is starting", false); for (int I = 0; I < 100; I++) { randomize(); for (int J = 0; J < 100; J++) Y = random(J); X = random(I); } StatusMsg(Form1, Canvas, "The Button1Click handler is done", false); } /* This is the OnClick event handler for button2. It simulates a lengthy process that allows other messages to be processed. */ void __fastcall TForm1::Button2Click(TObject *Sender) { int X, Y; StatusMsg(Form1, Canvas, "The Button2Click handler is starting", false); for (int I = 0; I < 100; I++) { randomize(); for (int J = 0; J < 100; J++) { Y = random(J); } // Yield to OnIdle or other messages Application->HandleMessage(); X = random(I); } StatusMsg(Form1, Canvas, "The Button2Click handler is done", false); }
Uses
- Vcl.Forms.TApplication.HandleMessage ( fr | de | ja )
- Vcl.Forms.TApplication.OnIdle ( fr | de | ja )
- Vcl.Graphics.TFontStyles ( fr | de | ja )