Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
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
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
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.
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!
<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