AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Reihenfolge von Create, OnCreate und Laden der Formulardatei

Reihenfolge von Create, OnCreate und Laden der Formulardatei

Ein Thema von Stevie · begonnen am 28. Jun 2004 · letzter Beitrag vom 1. Jul 2004
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Reihenfolge von Create, OnCreate und Laden der Formulardatei

  Alt 28. Jun 2004, 19:39
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 28. Jun 2004, 22:20
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 29. Jun 2004, 07:36
Uff, ähm, ja... Könntest du mir vielleicht ein Beispiel geben? Ich blick das noch nicht ganz.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 29. Jun 2004, 09:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 29. Jun 2004, 11:02
So, ich hab mich jetzt mal ein bisschen dahintergeklemmt. 8)
Also, ich habe folgende Klassen:
Code:
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)
Die Methode ist folgendermaßen implementiert:
Delphi-Quellcode:
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;
Es scheint richtig zu funktionieren, ist das denn auch korrekt so?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 29. Jun 2004, 11:52
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 29. Jun 2004, 12:44
Zitat von Muetze1:
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?
Ich mach das so (klappt noch nicht so ganz, weil das Formular kurz aufblinkt und dann wieder zerstört wird):
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 von Muetze1:
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...
Nein, diesmal bist du leider auf dem Holzweg, weil im Konstruktor von TCustomForm die DoCreate-Methode aufgerufen wird, und dadurch werden die OnCreate-Methoden abgehandelt.

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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#8

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 29. Jun 2004, 18:22
Du kannst vielleicht auch 'Loaded' überschreiben,

Gruß, teebee
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 29. Jun 2004, 18:40
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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

Re: Reihenfolge von Create, OnCreate und Laden der Formulard

  Alt 1. Jul 2004, 07:49
Zitat von Christian Seehase:
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?
Insofern als dass ich verschiedene MDIChildForms habe, aber einige dürfen nur eimnmal geöffnet werden, andere aber mehrmals.
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!?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz