Was passiert, wenn eine Aktion ausgelöst wird

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Behandeln von VCL-Aktionen mit einer Aktionsliste


Wenn ein Ereignis ausgelöst wird, treten mehrere Ereignisse auf, die hauptsächlich für die Verwendung mit generischen Aktionen vorgesehen sind. Falls das Ereignis die Aktion nicht verarbeitet, tritt eine weitere Sequenz von Ereignissen auf.

Auf Ereignisse reagieren

Werden eine Client-Komponente oder ein Steuerelement angeklickt oder auf andere Weise angesprochen, treten mehrere Ereignisse auf, auf die Sie reagieren können. Der folgende Quelltext beispielsweise zeigt die Ereignisbehandlungsroutine für eine Aktion, die die Sichtbarkeit einer Aktionsliste umschaltet, wenn die Aktion verarbeitet wird:

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;
}

Hinweis: Umfassende Informationen zu Ereignissen und Ereignisbehandlungsroutinen finden Sie unter Ereignisse und Ereignisbehandlungsroutinen.

Sie können eine Ereignisbehandlungsroutine schreiben, die auf einer der Ebenen reagiert: auf der Ebene einer Aktion, auf der Ebene der Aktionsliste oder auf Anwendungsebene. Dies ist nur dann relevant, wenn Sie statt einer vordefinierten Standardaktion eine neue, generische Aktion verwenden. Sie brauchen sich nicht darum zu kümmern, wenn Sie Standardaktionen verwenden, weil Standardaktionen ein intern festgelegtes Verhalten aufweisen, das ausgeführt wird, sobald diese Ereignisse auftreten.

Ereignisbehandlungsroutinen reagieren in der folgenden Reihenfolge auf Ereignisse:

  1. Aktionsliste
  2. Anwendung
  3. Aktion

Wenn der Benutzer auf ein Client-Steuerelement klickt, ruft Delphi die Execute-Methode der Aktion auf, die die Aktionsliste als erste unterstützt, dann das Application-Objekt, dann die Aktion selbst, wenn weder die Aktionsliste noch die Anwendung sie verarbeiten. Genauer gesagt, Delphi folgt seiner Dispatching-Reihenfolge, wenn es versucht, auf die Benutzeraktion zu reagieren:

Wenn Sie eine OnExecute-Ereignisbehandlungsroutine für die Aktionsliste bereitstellen und diese die Aktion verarbeitet, wird die Anwendung fortgesetzt.

Die Ereignisbehandlungsroutine der Aktionsliste nimmt einen Parameter entgegen, Handled, der standardmäßig False zurückgibt. Ist die Ereignisbehandlungsroutine zugeordnet und verarbeitet sie das Ereignis, gibt sie True zurück, und die Verarbeitungsfolge endet hier. Beispiel:

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

Wird dem Parameter Handled in der Ereignisbehandlungsroutine der Aktionsliste nicht der Wert True zugewiesen, dann wird die Verarbeitung fortgesetzt.

Falls Sie für die Aktionsliste keine Ereignisbehandlungsroutine für OnExecute geschrieben haben oder diese Behandlungsroutine für die Aktion nicht zuständig ist, dann wird die für die Anwendung definierte Ereignisbehandlungsroutine für OnActionExecute aufgerufen. Falls sie die Aktion verarbeitet, wird die Anwendung fortgesetzt.

Das globale Application-Objekt empfängt ein Forms.OnActionExecute-Ereignis, wenn keine Aktionsliste der Anwendung das Ereignis behandelt. Wie die OnExecute-Ereignisbehandlungsroutine der Aktionsliste nimmt auch die OnActionExecute-Ereignisbehandlungsroutine einen Parameter entgegen, Handled, der standardmäßig False zurückgibt. Wurde eine Ereignisbehandlungsroutine zugewiesen, die das Ereignis behandelt, dann gibt der Parameter True zurück, und die Verarbeitungssequenz endet hier. Beispiel:

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;
}

Falls die OnExecute-Ereignisbehandlungsroutine der Anwendung die Aktion nicht verarbeitet, wird die OnExecute-Ereignisbehandlungsroutine der Aktion ausgeführt.

Sie können die vordefinierten Aktionen verwenden oder Ihre eigenen Aktionsklassen erzeugen, die "wissen", wie bestimmte Zielklassen (wie beispielsweise Eingabesteuerelemente) behandelt werden müssen. Wird auf keiner Ebene eine Ereignisbehandlungsroutine gefunden, versucht die Anwendung als nächstes, ein Ziel zu finden, für das sie die Aktion ausführen kann. Wenn die Anwendung ein entsprechendes Ziel findet, ruft es die Aktion auf. Weitere Informationen hierzu finden Sie unter Wie Aktionen ihre Zielobjekte lokalisieren.

Siehe auch