1517 Stimmen

Delphi: Event Reihenfolge einer Form - Von OnCreate bis OnDestroy

Info von Stefan Trost | Letztes Update am 02.11.2022 | Erstellt am 29.03.2013

Jede Form durchläuft beim Öffnen und beim Schließen einige Events in einer bestimmten Reihenfolge. Diese Events möchte ich in dieser Info vorstellen und aufzeigen, in welcher Reihenfolge und an welchem Punkt sie ausgeführt werden.

Form erzeugen

Beim Erzeugen der Form werden folgende Events in der folgenden Reihenfolge ausgeführt. Die späteren Events dieser Liste können auch in bestimmten Fällen während der Programmausführung aufgerufen werden.

  1. OnCreate: Das OnCreate Event wird nur einmal beim Erzeugen einer Form ausgeführt. Meist geschieht dies automatisch beim Starten des Programms wenn alle Formen des Programms standardmäßig beim Programmaufruf erstellt werden. Das OnCreate Event eignet sich zum Beispiel dazu, Variablen zu initialisieren, die während der gesamten Ausführungszeit des Programms gebraucht werden. Diese Variablen sollten dann im OnDestroy Event wieder mit "free" freigegeben werden.
  2. OnShow: Mit dem OnShow Event wird eine Form sichtbar. OnShow folgt dem OnCreate Event und kann auch während der Programmausführung ausgeführt werden. Zum Beispiel wenn wir das "visible" einer Form auf "true" setzen oder eine bislang unsichtbare Form mit "Form.Show" sichtbar machen.
  3. OnActivate: OnActivate wird immer aufgerufen, wenn die entsprechende Form den Fokus bekommt. Also wenn erst ein anderes Fenster aktiviert war und der Nutzer auf das Fenster klickt. Wenn eine Anwendung zwei Fenster hat und der Nutzer zwischen diesen Fenstern wechselt, wird bei jedem Wechsel das OnActivate der entsprechenden Form ausgeführt. Im OnActivate Element kann man zum Beispiel den Fokus auf ein bestimmtes Element manuell setzen.
  4. OnPaint: Wird immer ausgeführt, wenn die Form neu gezeichnet werden muss, zum Beispiel weil ein anderes Fenster die Form überdeckt hat. Hier kann man zum Beispiel eigene Dinge auf die Form malen.
  5. OnResize: OnResize wird jedes mal ausgeführt, wenn man die Größe der Form ändert. Hat man bestimmte Controls, die sich je nach Größe der Form ändern sollen (zum Beispiel die Left oder Top Position), kann man den Code dafür in das OnResize Event schreiben.

Form schließen

Beim Schließen des Fenster beziehungsweise beim endgültigen Auflösen der Form werden die folgenden Events in der folgenden Reihenfolge ausgeführt:

  1. OnCloseQuery: Beim Versuch des Schließens einer Form (zum Beispiel wenn ein Nutzer auf das rote X klickt), wird noch bevor die Form geschlossen wird das OnCloseQuery Event ausgeführt. In diesem Event kann man das Schließen der Form noch verhindern, in dem man die Variable "CanClose" auf "false" setzt. Zum Beispiel kann man im OnCloseQuery eine Dialogbox anzeigen, ob der Nutzer das Programm wirklich schließen möchte oder noch Änderungen speichern möchte: if MessageDlg('Schließen ohne zu speichern?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := false; Klickt der Nutzer auf Abbrechen, werden alle weiteren Events nicht mehr ausgeführt und der Nutzer kehrt zurück zum Programm.
  2. OnClose: Wenn das Schließen im OnCloseQuery Event nicht verhindert wurde, wird OnClose ausgeführt. Auch im OnClose Event gibt es eine Variable namens "Action" vom Typ "TCloseAction". Setzen wir diese auf "caNone" wird wieder das Schließen der Form verhindert. Setzen wir sie auf "caMinimize" wird die Form minimiert statt geschlossen. "caHide" setzt die Form stattdessen auf unsichtbar und "caFree" gibt die Form frei.
  3. OnDeactivate: An dieser Stelle verliert die Form den Fokus.
  4. OnHide: An dieser Stelle wird die Form unsichtbar.
  5. OnDestroy: Hier wird die Form abschließend geschlossen und freigegeben. Handelt es sich um die MainForm, wird das gesamte Programm geschlossen. Alle Variablen, die man im OnCreate initialisiert hat, kann man an dieser Stelle wieder freigeben.

AntwortenPositivNegativ
66 Stimmen

Zu diesem Beitrag habe ich folgende Anmerkungen:

Lazarus:

  • TForm.OnCreate - Form.Visible=false und Form ist unsichtbar
    Form bleibt unsichtbar auch nach Form.Show;
    und Application.ProcessMessages;
  • TForm.OnShow - Form.Visible=true, aber Form bleibt unsichtbar
    trotz Form.Visible=true und unverändert
    auch nach Application.ProcessMessages;
  • TForm.OnActivate - Form.Visible=true und Form ist endlich sichtbar

Delphi:

  • TForm.OnCreate - Form.Visible=false und Form ist unsichtbar
    Form wird aber bereits innerhalb der
    OnCreate-Routine sichtbar nach Form.Show;
    und Application.ProcessMessages;
    sowie nach Beendigung von TForm.OnCreate
  • TForm.OnShow - Form.Visible=true und Form ist sichtbar
  • TForm.OnActivate - Form.Visible=true und Form ist sichtbar

Präzisierung zu OnActivate: TForm.OnActivate wird immer dann aufgerufen, wenn die entsprechende Form erstmalig den Fokus bekommt, also nach OnCreate und nach dem nachfolgenden ersten Aufruf von OnShow.

Wenn eine Anwendung mehrere Fenster hat und der Nutzer später zwischen diesen Fenstern wechselt, wird bei jedem Wechsel das OnActivate-Ereignis der bei diesem Wechsel aktivierten Form der gleichen Anwendung ausgelöst.

Wenn dagegen zuvor eine andere Anwendung aktiviert war und der Nutzer dann auf das Fenster klickt, dann wird dadurch nicht etwa dessen OnActivate-Routine aufgerufen, sondern stattdessen das OnActivate-Ereignis Application.OnActivate des Application-Objekts der zu dem angeklickten Fenster gehörigen Anwendung ausgelöst.
30.10.2017 um 16:42

AntwortenPositiv Negativ
Antworten

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.