![]() |
Reihenfolge von Create, OnCreate und Laden der Formulardatei
Noch ne Frage zur Formular-Vererbung:
An welcher Stelle wird denn eine Formular-Datei geladen? Mein Problem ist folgendes: In meiner Basis-Klasse hab ich die Eigenschaft SingleInstance, die aussagt, ob nur eine Instanz dieses Fensters erstellt werden darf oder nicht. Sie wird im Basisklassen-Konstruktor auf True gesetzt. Diese Eigenschaft ist aber natürlich in einem von dieser Basisklasse abgeleiteten Form veränderbar. Aber ich muss in der Basisklasse implementieren, ob das Formular nun erstellt werden darf oder nicht. Allerdings hab ich da noch nicht den Wert der Eigenschaft aus der "letzten Generation". Ich muss irgendwie in der Basis-Klasse dort einhaken, wo die dfm-Datei geladen wurde. An welcher Stelle ist das? Irgendwie wird der Wert nicht richtig geladen und der Wert aus dem Basisklassen-Konstruktor steht in der Eigenschaft. Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt... Das ganze macht mich irgendwie kirre :drunken: :stupid: |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin!
Die DFM Parameter werden erst nach dem Constructor geladen, da schliesslich die Instanz ordentlich erstellt worden sein. Als Lösungstipp folgendes: Definiere die neue Variable als Property zum Zugriff und rufe bei der Set Methode eine virtuelle Funktion auf. Diese kannst du dann überschreiben in den Ableitungen und bekommst beim setzen dann somit das "Laden" mit. Ist zwar nicht das besten, aber sollte funktionieren. Haben wir ähnlich auch schonmal angewendet. Ansonsten wäre eine fast bessere Methode dabei, wenn du die virtuelle Methode nicht von der Set-Routine der Proeprty aufrufst sondern nach dem Create der Form (also nach dem Form1 := TForm1.Create()) - und wenn du es dadurch selbst explizit die Form erstellen musst, aber da sind die DFM Einstellungen schon geladen zu dem Zeitpunkt. Ansonsten als dritte Möglichkeit musst du mal forschen, da auch der ComponentState eine csLoading Element hat und somit "wissen" die Instanzen davon, was geschieht - u.a. auch das Laden der Properties. Vielleicht findest du dazu noch eine virtuelle Methode zum überschreiben als Event zum triggern. Ich habe leider im Moment kein Delphi hier um selber nachzuschauen. Aber das mal so als Tipps... MfG Muetze1 |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
:pale: Uff, ähm, ja... Könntest du mir vielleicht ein Beispiel geben? Ich blick das noch nicht ganz.
|
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin!
Für welchen der 3 Vorschläge? Dabei sollte der letzte aber der einfachste sein und IMHO doch klar sein, wie er gemeint war. Ansonsten nochmal durchlesen und Fragen stellen bzw. sagen zu welchem ein Beispiel. Ich bin da etwas faul und will hier nicht 3 Beispiele zusammentippen... 8) MfG Muetze1 |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
So, ich hab mich jetzt mal ein bisschen dahintergeklemmt. 8)
Also, ich habe folgende Klassen:
Code:
Die Methode ist folgendermaßen implementiert:
TCustomFormEx (Basis-Klasse, in der die Properties registriert werden)
| V TFormEx (Klasse mit dfm-Datei, einige Komponenten) | V TForm1 (das Formular, was letztendlich aufgerufen wird)
Delphi-Quellcode:
Es scheint richtig zu funktionieren, ist das denn auch korrekt so?
constructor TCustomFormEx.Create(AOwner: TComponent);
begin FSingleInstance := True; inherited; if not (csDesigning in ComponentState) and FSingleInstance then //wenn schon Instanz vorhanden, dann abbrechen und vorhandene Instanz in den Vordergrund holen end; |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin!
Da stellt sich für mich die Frage: Woher nimmst du die vorhandene Instanz? Weil in den Klassenroutinen hast du ja, egal in welcher Ableitung du bist, immer nur die aktuelle, zu erzeugende Instanz. Wo sicherst du dir einen Instanzpointer der ersten Instanz? Ansonsten ist dein Ansatz schon nicht schlecht, aber leider zu früh, denn der reine Constructor wird wie gesagt vor dem Laden der Eigenschaften aufgerufen. IMHO sind die Eigenschaften im FormCreate vorhanden, daher könntest du da mal ansetzen... MfG Muetze1 |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Zitat:
Delphi-Quellcode:
constructor TCustomFormEx.Create(AOwner: TComponent);
var i: Integer; Form: TForm; begin FSingleInstance := True; inherited; Form := nil; if not (csDesigning in ComponentState) and FSingleInstance then for i := 0 to Pred(Screen.FormCount) do if Screen.Forms[i].InheritsFrom(Self.ClassType) and (Screen.Forms[i] <> Self) then begin Form := Screen.Forms[i]; Break; end; if Assigned(Form) then Abort; end; Zitat:
Also bleibt jetzt noch das Problem, des kurzen Erscheinens des Formulars. Das Problem ist: ich kann es nicht Visible auf False setzen, weil es ein MDIChild-Form ist. |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Du kannst vielleicht auch 'Loaded' überschreiben,
Gruß, teebee |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin Stevie,
wenn nur eine Instanz des Objektes erstellt werden darf, wäre es doch einfacher die Eigenschaft public zu machen, und vor dem Erzeugen einer Instanz abzufragen. Inwieweit macht es Sinn, eine Klasse, sozusagen, selber entscheiden zu lassen, ob eine Instanz gebildet werden darf? |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Zitat:
Ich will auch nicht über den Menüpunkt gehen (deaktivieren). Das Problem ist ja, dass das Formular erst weiß, ob es SingleInstance ist oder nicht, wenn es erstellt wurde. Ginge das mit einer Klassenfunktion? Sie sucht praktisch nach einer Instanz ihrer Klasse und wenn sie sie gefunden hat, dann schaut sie dort nach, ob das eine SingleInstanz-Klasse ist oder nicht. Wenn nicht, dann neu erzeugen und wenn keine Instanz gefunden wurde dann sowieso!? :wall: :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz