Que se passe-t-il lors du déclenchement d'une action ?

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gestion des actions VCL à l'aide d'une liste d'actions


Lorsqu'un événement est déclenché, il se produit la série d'événements qui s'applique d'abord aux actions génériques. Ensuite, si l'événement ne gère pas l'action, une autre séquence d'événements intervient.

Réponse par les événements

Quand un composant ou un contrôle client est cliqué ou subit un autre type d'opération, se produit une série d'événements auxquels vous pouvez répondre. Par exemple, le code suivant est le gestionnaire d'événement pour une action qui inverse la visibilité d'une barre d'outils quand une action est exécutée :

procedure TForm1.Action1Execute(Sender: TObject);
begin
  { Toggle Toolbar1's visibility }
  ToolBar1.Visible := not ToolBar1.Visible;
end;
void __fastcall TForm1::Action1Execute(TObject *Sender)
{
    // Toggle Toolbar1's visibility
    ToolBar1->Visible = !ToolBar1->Visible;
}

Remarque :  Pour des informations générales sur les événements et les gestionnaires d'événement, voir Utilisation des événements et des gestionnaires d'événements.

Vous pouvez fournir un gestionnaire d'événement qui réponde à l'un des trois différents niveaux : action, liste d'actions ou application. Cela ne vous concerne que si vous utilisez une nouvelle action générique et non une action standard prédéfinie. En effet, les actions standard ont un comportement intégré qui s'exécute automatiquement lorsque ces événements se produisent.

L'ordre dans lequel les gestionnaires d'événements répondront aux événements est le suivant :

  1. Liste d'actions
  2. Application
  3. Action

Lorsque l'utilisateur clique sur un contrôle client, Delphi appelle la méthode Execute de l'action qui s'adresse d'abord à la liste d'actions, puis à l'objet Application, enfin à l'action elle-même lorsque ni la liste d'actions ni l'application ne la gère. Delphi suit cette séquence de répartition lors de la recherche d'une façon de répondre à l'action de l'utilisateur :

Si vous fournissez un gestionnaire d'événement OnExecute pour la liste d'actions et qu'il gère l'action, l'application se poursuit.

Le gestionnaire d'événement de la liste d'actions dispose d'un paramètre Handled qui renvoie False par défaut. Si le gestionnaire est défini et gère l'événement, il renvoie True et la séquence de traitement s'arrête là. Par exemple :

procedure TForm1.ActionList1ExecuteAction(Action: TBasicAction; var Handled: Boolean);
begin
  Handled := True;
end;
void __fastcall TForm1::ActionList1ExecuteAction(TBasicAction *Action,
    bool &Handled) {
    Handled = true;
}

Si vous ne définissez pas Handled par True dans le gestionnaire d'événement de la liste d'actions, le traitement se poursuit.

Si vous n'avez pas écrit de gestionnaire d'événement OnExecute pour la liste d'actions ou si le gestionnaire ne gère pas l'action, le gestionnaire d'événement OnActionExecute de l'application est déclenché. S'il gère l'action, l'application continue.

L'objet Application global reçoit un événement Vcl.Forms.TApplication.OnActionExecute si l'une des listes d'actions de l'application échoue en gérant un événement. Comme le gestionnaire d'événement OnExecutede la liste d'actions, le gestionnaire OnActionExecute dispose d'un paramètre Handled qui renvoie False par défaut. Si un gestionnaire d'événement est défini et gère l'événement, il renvoie True, et la séquence de traitement s'arrête ici. Par exemple :

procedure TForm1.ApplicationExecuteAction(Action: TBasicAction; var Handled: Boolean);
begin
  { Prevent execution of all actions in Application }
  Handled := True;
end;
void __fastcall TForm1::ApplicationExecuteAction(TBasicAction *Action,
    bool &Handled)
{
    // Prevent execution of all actions in Application 
    Handled = true;
}

Si le gestionnaire d'événement OnExecute de l'application ne gère pas l'action, le gestionnaire d'événement OnActionExecute de l'action est déclenché.

Vous pouvez utiliser des actions intégrées ou créer vos propres classes d'actions qui savent comment opérer sur des classes cibles spécifiques (telles que les contrôles de saisie). Quand aucun gestionnaire d'événement n'est trouvé à n'importe quel niveau, l'application essaie ensuite de trouver une cible sur laquelle exécuter l'action. Quand l'application trouve une cible pour laquelle l'action sait quoi faire, elle déclenche l'action. Voir Comment les actions trouvent leurs cibles pour plus d'informations sur la manière dont l'application trouve une cible pouvant correspondre à une classe d'actions prédéfinie.

Voir aussi