Dans ce cas, il faut faire un appel à la méthode
ProcessMessages
de la classe
Application
dans la boucle. L'exemple présenté ci-dessous déclenche une tache ininterrompue lors du clic sur un bouton. Nous dessinons un quadrillage par rebonds successifs du pinceau sur les bords de la fenêtre. Déclarez tout d'abord une variable Stop en global :
//...
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool Stop; /* Placez la variable ici */
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//...
}
Maintenant, nous allons écrire le gestionnaire d'événement OnClick du bouton de dessin.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
static int x_inc = 1; // Incrémentation d'abscisse
static int y_inc = 1; // Incrémentation d'ordonnée
static int X = 10; // Position initiale (abscisse)
static int Y = 10; // Position initiale (ordonnée)
Stop = false; // La boucle est activée.
/* Le seul moyen d'arrêter la boucle est
de positionner la variable Stop à true */
while(!Stop)
{
Canvas->MoveTo(X, Y); // Placement du pinceau en (X, Y)
X += x_inc; // Incrémentation des positions
Y += y_inc;
// Change la couleur de la ligne aléatoirement
Canvas->Pen->Color = RGB(rand()%255, rand()%255, rand()%255);
Canvas->LineTo(X, Y); // Ligne jusqu'à la nouvelle position
/* Si la position du pinceau sort de la zone cliente
de la fenêtre, on inverse les incrémentations, ce qui donne
l'effet de "rebond" */
if (X > ClientWidth || X 0) x_inc = -x_inc;
if (Y > ClientHeight || Y 0) y_inc = -y_inc;
/* L'appel à cette fonction évite le blocage de l'application :
les messages et clics sur autres boutons sont traités */
Application->ProcessMessages();
}
}
Maintenant, il nous faut pouvoir arrêter cette boucle dessin. Pour cela, nous avons vu qu'il suffit de placer la variable
Stop
à true. Placez un autre bouton sur la fiche. Dans son gestionnaire d'événement OnClick, placez le code suivant :
Stop = true
. Ce qui donne la fonction suivante :
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Stop = true;
}
Si un clic sur le bouton a lieu, il sera traité par l'appel à
Application->ProcessMessages()
. Enfin, il faut pouvoir quitter le programme. Pour cela, utilisez l'événement OnCloseQuery de la fiche et placez-y également le code
Stop = true
.
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
Stop = true;
}