Laden...

FORM: Event zwischen Konstuktor und Load-Event

Erstellt von DarkProjekt vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.166 Views
D
DarkProjekt Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren
FORM: Event zwischen Konstuktor und Load-Event

Moin zusammen!

Ich habe folgendes Problem.

Ich habe eine Basis-Form-Klasse (Form A). Alle weiteren Forms werden von dieser Form abgeleitet.

Bisher ist es so, dass ich im Load-Event der abgeleiteten Form alle Initialisierungen (Databindings etc.) vorgenommen habe.

Nun möchte ich aber gerne noch vor dem Load-Event mitbekommen, ob alle Initialisierungen erfolgreich waren. Daher habe ich in Form A eine Methode "Init" geschaffen, die im Konstuktor von Form A aufgerufen wird.

In der abgeleiteten Form habe ich dann alle Funktion aus dem Load-Event in das neue Init-Event verschoben.

Mein Problem ist nun, dass zum Aufruf der Init-Methode noch nicht das "InitializeComponent" der abgeleiteten Form aufgerufen wurde und ich daher nicht auf die Steuerelemente zugreifen kann.

Ich habe leider keine Möglichkeit gefunden, mich dazwischenzuschalten, wenn der Konstuktur komplett erledigt ist. Habt Ihr da ne Idee zu? Danke schon mal im Voraus!

S
93 Beiträge seit 2008
vor 10 Jahren

Ich habe solche Anforderungen auch öfters, und habe mir da ganz einfach geholfen.
Du mußt doch sowieso die Show oder Showdialog Methode aufrufen, um die Form anzuzeigen.
Überschreibe doch einfach die entsprechende Methode durch eine eigene. Da kannst Du dann alle Initialisierungsfunktionen ausführen.

Du darfst dann nur nicht vergessen, am ende Deiner Methode die entsprechne Base-Methode aufzurufen

D
DarkProjekt Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren

Vielen Dank für die sehr schnelle Antwort.

Manchmal liegt die Antwort so nah und man kommt nicht drauf. Funktioniert wunderbar.

Das einzige "Problem" hierbei ist, dass ich nicht vor dem Show()-Aufruf prüfen kann, ob das Init erfolgreich war.

S
93 Beiträge seit 2008
vor 10 Jahren

Ammer in Deiner selbstgeschriebenen Show Methode vor dem eigenlichen base.Show. Wenn die Überprüfung fehl schlägt, kannst Du das dann entsprechen behandeln, bovor es weitergeht.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo DarkProjekt,

Nun möchte ich aber gerne noch vor dem Load-Event mitbekommen, ob alle Initialisierungen erfolgreich waren.

erklär mal bitte den Grund für diese Anforderung.

herbivore

D
DarkProjekt Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren

Ammer in Deiner selbstgeschriebenen Show Methode vor dem eigenlichen base.Show. Wenn die Überprüfung fehl schlägt, kannst Du das dann entsprechen behandeln, bovor es weitergeht.

Genau, das mache ich z.Zt. auch. Ich hätte die Überprüfung nur gerne in der aufrufenden (Menü)Klasse gemacht um dort die Wahl zu haben, ob ich die Form trotzdem anzeige oder nicht.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo DarkProjekt,

was soll denn bei der Initialisierung eines Menüs fehlschlagen? Ich meine rein auf GUI-Ebene? Kann es sein, dass du hier ein Problem, dessen Lösung eigentlich in der Trennung von GUI und Modell liegen würde, und daher auch im Modell gelöst werden sollte, auf einem Um- oder gar Irrweg zu lösen versuchst?

Ansonsten ist es doch überhaupt kein Problem, eine Klasse mit einer Methode oder Property auszustatten, die darüber Auskunft gibt, ob die Initialisierung erfolgreich war. Diese kann man dann zu jedem gewünschten Zeitpunkt aufrufen, also auch vor dem Show.

Von der Möglichkeit, im Konstruktor eine Exception zu werfen, und so zu verhindern, dass ein fehlerhaft initialisiertes Objekt überhaupt erstellt wird, mal ganz abgesehen.

herbivore

D
DarkProjekt Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren

Hallo herbivore,

Die Initialisierung des Menüs meine ich gar nicht. Das Menü erzeugt Instanzen der Form, die dann als MDI-Child angezeigt werden.

In dieser Initialisierungsphase kann eine Menge passieren. Es werden Daten geladen, an die Controls gebunden, Events abonniert etc. Das hängt dann auch immer vom jeweiligen Entwickler ab.

Möglich wäre es natürlich auch, dass ich die Init-Methode zwischen dem Konstruktor und Show() aufrufe und dann einfach ein bool zurückgeben. Allerdings bin ich dann auch dazu gezwungen, diese Methode immer selbst aufzurufen, was ich wiederum gerne verhindern würde. 😃

Das ganze ist jetzt natürlich ein bisschen Spielerei. Die Lösung von san-software funktioniert wunderbar und letztendlich könnte ich auch einen Parameter übergeben, ob die Form trotzdem angezeigt werden soll.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo DarkProjekt,

ich habe nicht gesagt, die Init-Methode separat aufzurufen, sondern eine Methode zu schreiben und diese bei Bedarf aufzurufen, mit der man abfragen kann, ob die Initialisierung erfolgreich war. Das war es ja, was du ermitteln wolltest.

Ansonsten hast du bestätigt, was ich vermutet habe. Die Probleme mit der Initialisierung kommen nicht aus dem GUI, sondern aus dem Modell (bzw. dem DAL). Wenn du GUI und Modell trennst, kannst du die nötigen Modellobjekte erstellen und erst wenn das fehlerfrei geklappt hat das Form erzeugen (und die fertigen Modellobjekte z.B. dem Konstruktor des Forms per Parameter übergeben). Sprich, die Erzeugung der Forms beginnt überhaupt nur, wenn alle Voraussetzungen erfüllt sind und deren Initialisierung damit überhaupt nicht mehr fehlschlagen kann.

Die Trennung von Modell und GUI hilft hier also mehr als irgendwelche Schlenker an das Forms heran zu programmieren.

herbivore

D
DarkProjekt Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren

Hallo herbivore,

ich habe nicht gesagt, die Init-Methode separat aufzurufen, sondern eine Methode zu schreiben und diese bei Bedarf aufzurufen, mit der man abfragen kann, ob die Initialisierung erfolgreich war. Das war es ja, was du ermitteln wolltest.

Dann bin ich (wenn wir bei der vorhanden Modellstruktur bleiben) wieder beim Ausgangsproblem. Ich kann mein Init nicht im Konstuktor der Basisklasse aufrufen, da die Controls in der abgeleiteten Form noch nicht existieren. Der nächste Schritt ist ja dann schon, die Form anzuzeigen. Statt der Prüfmethode hätte ich in der Basisform eine Property eingerichtet, die auf true gesetzt ist, wenn die Initialisierung erfolgt ist (aber das kommt ja aufs gleiche raus).

Ansonsten hast du bestätigt, was ich vermutet habe. Die Probleme mit der Initialisierung kommen nicht aus dem GUI, sondern aus dem Modell (bzw. dem DAL). Wenn du GUI und Modell trennst, kannst du die nötigen Modellobjekte erstellen und erst wenn das fehlerfrei geklappt hat das Form erzeugen

Wir haben im Grunde schon eine Trennung nach GUI und Logik. Nur werden halt die DAL bzw. die BLL Objekte aus der Form heraus referenziert und nicht aus dem Menü.
Das ist sicherlich nicht der ideale Weg, aber das zu ändern bekomme ich in unserem System nicht mehr umgesetzt 😃