Announcement

Collapse
No announcement yet.

FormActivate oder FormCreate ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • FormActivate oder FormCreate ?

    Hallo, sicherlich kann mir jemand erklären, wann man am besten FormActivate verwendet oder wann man
    FormCreate benutzt. Vielen Dank für eine Erklärung. Gruss ph

  • #2
    Hallo,<br>
    bei "FormCreate" wird das Formular gerade erzeugt. Ich benutze diese Funktion beispielsweise zum Einlesen von Daten aus INIs usw., um schon im Vorfeld (noch bevor das Fenster zu sehen ist) irgendwelche Optione ein-, um- oder abzuschalten.<br><br>
    "FormActivate" benutze ich beispielsweise dann, wenn ich mein Formular unsichtbar machen will. Wenn ich beispielsweise mein Programm mit einer Verbindung zur TNA ausrüsten will, so dass es nur als Symbol zu sehen ist, dann rufe ich diese Funktionen in "FormActivate" auf, weil der Versuch bei "FormCreate" zu einer Fehlermeldung führen würde.<br><br>
    Laut Delphi-Hilfe ist die Reihenfolge so:<br>
    1. OnCreate<br>2. OnShow<br>3. OnActivate<br>4. OnPaint<br><br>
    Mathias

    Comment


    • #3
      Hallo Peter!

      Das hängt ganz davon ab, was Du bei dem jeweiligen Event machern willst.
      Beim Create wird Deine Ereignisbehandlung nur beim Erzeugen Deines Formularobjektes ausgeführt.
      Beispiel: Ich hinterlege meine Fenstereigenschaft (Größe, Status) in der Registry und lese sie beim Create wieder aus.

      Beim Activate wird Deine Ereignisbehandlung jedes mal ausgeführt, wenn Dein Fenster den Focus bekommt.

      Nicht zu vergessen das Show Event. Hier wird Deine Ereignisbehandlung bei jedem Anzeigen Deines Fensters ausgeführt.
      Beispiel: Bei mir werden die Fenster über Knoten in einem Treeview aufgerufen. Abhängig vom Vaterknoten muss dann im jeweiligen Fenster ein Listview neu gefüllt werden., Das mache ich dann im Show - Ereignis.

      Man muss sich also überlegen, wie oft eine bestimmte Prozedur ausgeführt werden muss, um zum gewünschten Ergebnis zu kommen, und dann das passende Ereignis wählen. Würde ich mein Listview zum Beispiel beim Create füllen, so würde das nur einmal passieren, nämlich beim ersten Aufruf.

      m.f.G. Andreas Kädin

      Comment


      • #4
        Hallo,

        noch ein Nachtrag zu den Ausführungen von Andreas: Beim OnCreate muß beim Zugriff auf andere Formulare, Datenmodule etc. noch auf die Erstellungsfolge geachtet werden, damit die anderen Forms auch wirklich schon "da" sind, wenn das OnCreate aufgerufen wird. Im OnActivate sind dagegen mit Sicherheit alle Forms bereits erstellt. Ich gehe deshalb meistens einen Mischweg:<pre>
        OnCreate:
        begin
        <b>FCreate := True;</b>
        ...Allgemeine Dinge (Ini einlesen etc.)....
        end;

        OnActivate:
        begin
        if FCreate then
        begin
        ...Alles das was Erstellung anderer Forms voraussetzt und
        nur einmal passieren soll...
        <b>FCreate := False;</b>
        end;
        ...Alles was im OnActivate bei jedem Aufruf passieren soll...
        end;</pre>

        Gruß Fal
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          <b>Im OnActivate sind dagegen mit Sicherheit alle Forms bereits erstellt</b>. Dies setzt natürlich voraus das alle Formulare automatisch beim Programstart erstellt wurden. Bei umfangreichen projekten ist das aber Resourcenbelastend und unnötig. OnActivate() ist damit ein schlechter Platz. Im OnActivate() sollte alles untergebracht werden das mit dem Fokus, der Sichtbarkeit oder eventl. Aktualisierungen zu tun hat, NICHTS das mit generellen Initialisierungen/Speicherallozierungen/Objecterstellungen usw. zu tun hat. Sowas gehört in OnCreate() oder zu finalization in's OnDestroy() Event.<br>

          Damit trifft Mathias Philosophie am ehesten den Kern der Sache.<br>

          Gruß Hagen

          PS: Beachte das OnActivate() nicht ZWANGLSLÄUFIG aufgerufen wird. In einer MDI Anwendung bekämen bei Application Aktivierung z.B. NUR das MDI-Form=Hauptform der Anwnednung das OnActivate() die einzelnen MDI-Client Formulare bekommen dagegen KEIN OnActivate() !! Ähnliches gilt für OnShow() einen MDI-Childs, da das OS voraussetzt das diese IMMER sichtbar sind !

          Comment

          Working...
          X