Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Abfolge der Startereignisse (onCreate, onActivate, onShow)


bole - Do 12.04.12 19:24
Titel: Abfolge der Startereignisse (onCreate, onActivate, onShow)
Hallo Zusammen

Ich habe ein Problem mit der abfolge der Start Ereignisse. Ich habe ein Formular und darauf ein Tabsheet. Diese Tabsheet wird beim Start durch des Ereignis TabSheet.OnShow ausgefüllt. So weit so Gut aber leider wird dieses Ereignis vor dem OnActivate Ereignis des Formulares aufgerufen. Darin wird eine verbindung zur DB erstellt die beim Ausfüllen noch nicht sheht...

Die DB kann ich auch nicht im OnCreate Ereignis öffnen, das gibt eine Exception.

Gibt es eine Möglichkeit die Abfolge der Startereignisse zu ändern? Oder muss ich in den Sauren Apfel beissen und zuerst abfragen ob die DB verfügbar ist (Wenn ja: füllen; wenn nein: DB zuerst öffnen)

Vielen Dank für Eure Hilfe.

Gruss

Bole


bummi - Do 12.04.12 20:05

Ändern kannst Du sie nicht ....


trm - Do 12.04.12 21:29

Ein Versuch wäre, das Pagecontrol komplett zu verstecken (im OE), dann, im OnShow des Formulars das Pagecontrol auf Visible setzen, dadurch könnte das OnShow erst jetzt ausgeführt werden.

Edit: gerade gesteste, geht :)


jaenicke - Do 12.04.12 22:04

Warum benutzt du denn die Ereignisse so wie du sie nutzt? :gruebel:

OnCreate --> Sachen, die im Formularobjekt immer vohanden sind, erzeugen (passiert einmal im Lebenszyklus des Formulars)
OnShow --> Vorgänge ausführen, die bei jeder Anzeige des Formulars passieren sollen (passiert bei jedem Anzeigen durch Show/ShowModal)
OnActivate --> Vorgänge ausführen, die jedesmal beim Aktivieren des Formulars (z.B. durch Anklicken) passieren sollen (passiert ggf. immer wieder während das Formular lebt)

Für mich liest sich das so, als ob entweder alles in OnShow gehört oder du in OnShow die DB erzeugst / initialisierst und dir dann eine Message schickst, in deren Behndlung du dann die Verbindung aufbaust. Das eignet sich dann, wenn du die Verbindung erst machen willst nachdem das Formular schon sichtbar ist.


bole - Do 12.04.12 23:37

Vielen Dank für die zahlreichen Tipps!

Das ist ein an und für sich kleines Programm mit nur einem Formular. Eigentlich denke ich das initalisieren der DB sollte einmal am Anfang gemacht werden. Also im OnCreate Ereignis. Leider bekomme ich da eine Zugriffsverletzung. Ich vermute die Unit mit der DB Anbindung (ado) ist noch nicht bereit.

Allerdings habe ich keine Erfahrung mit Datenbankeanbindung mit Delphi... Ich habe das erste mal mit Hilfe dieses Tutorials http://www.delphi-treff.de/tutorials/datenbanken/flexible-ado-connection-zur-ansteuerung-einer-access-datenbank/einleitung/ so etwas gebastelt und bin eigentlich schon froh das es soweit läuft und meine Abfragen funktionieren... :D

Ich denke ich werde der einfachkeit halber die Lösung von user profile icontrm nehmen.

Gruss

Bole


bummi - Do 12.04.12 23:48

eigentlich sollte es kein Problem sein die DB zu öffnen. Ist die Connection in eine Datenmodul, wenn ja ist dieses bereits erzeugt?


jaenicke - Sa 14.04.12 00:38

Da in dem Tutorial ein Datenmodul benutzt wird, wird das wohl in der Tat das Problem sein. Daher kurz zur Erklärung:
Standardmäßig erzeugt Delphi der Reihe nach alle Formulare und Datenmodule. Danach werden diese dann ggf. sichtbar gemacht. Das OnCreate des Formulars passiert logischerweise bei dessen Erzeugung. Da du das Datenmodul nach dem Formular erzeugt hast, ist dieses daher noch gar nicht an der Reihe gewesen und nich nicht erzeugt.

Lösungsmöglichkeiten:
Entweder erzeugst du das Datenmodul manuell vorher oder du initialisierst die Datenbank schlicht im OnCreate des Datenmoduls. :zwinker: