![]() |
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: |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin Stevie,
Zitat:
Zu dem Zeitpunkt, zu dem das Formular es "weiss", kann ja eine Eigenschaft auf true gesetzt werden, die das anzeigt, und die Du abfragst, bevor Du eine neue Instanz der gleichen Klasse bildest. |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Das hab ich jetzt nicht verstanden! :mrgreen:
Meine ChildForms haben alle die Eigenschaft SingleInstace, die nur zur Designzeit gesetzt wird. Somit wird die Eigenschaft in der dfm gespeichert und ist erst bekannt, wenn das Formular geladen wurde, also im Konstruktor. Wie kann ich jetzt an die Eigenschaft kommen, ohne das Formular anzeigen - oder viel besser - erstellen zu müssen? |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin Stevie,
jetzt hab' ich es verstanden :firejump: :mrgreen: Ausprobiert hab' ich das jetzt nicht, aber hier könnte es dann, wie Du ja selber schon angedeutet hast, mit einer Klasssenfunktion gehen, die Dir den Wert der zur Designzeit gesetzten Eigenschaft zurückliefert. |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Zitat:
|
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin Stevie,
stimmt. Bevor keine Instanz gebildet wurde, hast Du ja auch keinen Zugriff auf die Eigenschaften :wall: :wall: :wall: Ist noch zu früh :mrgreen: Mal eine ganz wirre Idee: Lies doch die Resource aus. |
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Zitat:
|
Re: Reihenfolge von Create, OnCreate und Laden der Formulard
Moin! Interessantes problem.
Ich hätte es mit ner virtuellen klassen-methode gemacht, die einfach nur true oder false zurück gibt und hätte auf eine eigene property verzichtet. Allerdings ist ne property natürlich relativ elegant einzustellen :wink: Des DFM-stream direkt zu zerpflücken, ist IMO uncool, auch wenn es kein problem wäre. Wie wäre es mit ner kleinen globalen stringliste, in der die klassen registriert werden, die im setter von singleInstace true übergeben kriegen. Dann kann man auch die besagte klassen methode implementieren und hat alle nötigen information zur rechten zeit :-D ...was meint ihr? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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