Erstellungsreihenfolge Forms

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Erstellungsreihenfolge Forms

Beitrag von Eclipticon »

Guten Abend!

In einem Projekt verwende ich folgenden Code:

Code: Alles auswählen

begin
  Application.Title:='Bla';
  Application.Initialize;
  Application.CreateForm(TDebugForm, DebugForm);
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
DebugForm muss ich zwingend vor MainForm erzeugen, da TMainForm.FormCreate bereits Ressourcen von DebugForm verwendet. Das Problem ist nur ... damit wird DebugForm zum Hauptfenster, MainForm wird zwar erzeugt, ist aber per default nicht sichtbar.

Es ist sicher hinzubekommen, aber wie sieht in Euren Augen eine programmiertechnisch saubere Loesung aus?

Danke :-)

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Erstellungsreihenfolge Forms

Beitrag von Eclipticon »

Zu allem Uebel ist natuerlich auch die Ausfuehrung des gesamten Programms an die erste erstellte Form geknuepft ...

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Erstellungsreihenfolge Forms

Beitrag von theo »

Was verstehst du unter "Ressourcen"?
Nimm die doch einfach auf's Hauptformular oder je nachdem in ein Datenmodul.
Oder lade sie nicht OnCreate sondern vllt. OnShow oder ....

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Erstellungsreihenfolge Forms

Beitrag von MAC »

darf ich dir etwas empfehlen.
OnCreate zu benutzen ist eigentlich eine recht komplizierte sache, denn das form1.oncreate kommt direkt, noch bevor die komponenten auf der form erstellt oder andere formen erstellt wurden sind.
Edit: Falsch, beim aufruf von OnShow ist die gesammt Form mit allen komponenten darauf erstellt. Aber noch nicht die Form2.

Verwende ein Timer- das mach ich schon seit 2 Jahren. Ein Timer , heißt der übersichts-halber "starter" , interval 1 Sekunde. Enabled True;
onTimer:

Code: Alles auswählen

starter.Enabled := False; // wird nur 1 einziges mal ausgeführt...
//...
//...
andererTimer1.Enabled := True;
Die anderen Timer werden erst danach enabled damit dieser wirklich als erstes kommt. Der Timer wird jetzt erst gestartet wenn alles erstellt ist. jede form und jede komponente darauf.
Zuletzt geändert von MAC am Mo 7. Feb 2011, 17:26, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Erstellungsreihenfolge Forms

Beitrag von Socke »

Man könnte auch einen Event-Handler fürs erste Anzeigen eines Formulars hinzufügen; muss man aber im Code tun.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Erstellungsreihenfolge Forms

Beitrag von Eclipticon »

theo hat geschrieben:Was verstehst du unter "Ressourcen"?
Super, natuerlich voll reingefallen ;-) Ich war offensichtlich lang genug von Delphi, Lazarus etc. weg, dass ich ganz vergessen habe, dass "Ressourcen" eine ganz spezielle Bedeutung hat! Was ich meinte war: Ich muss bei der Erstellung meiner MainForm debug output speichern und das mache ich ueber Aufruf von Methoden von TDebugForm. Dazu muss es zu diesem Zeitpunkt aber natuerlich schon eine Instanz von TDebugForm geben ...

Der Hinweis mit OnShow ist aber gut ... da dieser Event beim Hauptfenster einer Applikation nur ein mal eintreten sollten (oder?!?), kann ich die Initialisierung ja dort hin verlagern und damit schon auf die fertig erzeugte Instanz von TDebugForm zugreifen ...

Merci :-)

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Erstellungsreihenfolge Forms

Beitrag von Eclipticon »

Hi MAC,
MAC hat geschrieben:OnCreate zu benutzen ist eigentlich eine recht komplizierte sache, denn das form1.oncreate kommt direkt, noch bevor die komponenten auf der form erstellt oder andere formen erstellt wurden sind.
jetzt bin ich ein wenig irritiert: Ich greife in TForm1.FormCreate haeufig auf Komponenten von TForm1 zu und hatte damit noch nie Probleme ... wie funktioniert das, wenn OnCreate vor der Erstellung der Komponenten ausgeloest wird?

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Erstellungsreihenfolge Forms

Beitrag von theo »

Eclipticon hat geschrieben: Der Hinweis mit OnShow ist aber gut ... da dieser Event beim Hauptfenster einer Applikation nur ein mal eintreten sollten (oder?!?),
Im Normalfall ja, es sei denn du machst ausdrücklich nochmal Form.Hide/Form.Show
Wenn du ganz sicher gehen willst kannst du noch ein Flag setzen beim ersten OnShow, damit der Code sicher nur einmal ausgeführt wird.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Erstellungsreihenfolge Forms

Beitrag von Teekeks »

Tada!

Code: Alles auswählen

begin
  Application.Title:='Bla';
  Application.Initialize;
  DebugForm:=TDebugForm.Create;
  DebugForm.Show;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  DebugForm.free;
end.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Erstellungsreihenfolge Forms

Beitrag von m.fuchs »

Du könntest auch die Erzeugung des DebugForms aus der .lpr rauswerfen und das stattdessen als erstes im TMainForm.OnCreate erledigen.

mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Erstellungsreihenfolge Forms

Beitrag von carli »

Wozu der ganze Aufwand? Die Erstellungsreihenfolge lässt sich ganz bequem in den Projekteinstellungen setzen

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Erstellungsreihenfolge Forms

Beitrag von MAC »

Eclipticon hat geschrieben:Hi MAC,
MAC hat geschrieben:OnCreate zu benutzen ist eigentlich eine recht komplizierte sache, denn das form1.oncreate kommt direkt, noch bevor die komponenten auf der form erstellt oder andere formen erstellt wurden sind.
jetzt bin ich ein wenig irritiert: Ich greife in TForm1.FormCreate haeufig auf Komponenten von TForm1 zu und hatte damit noch nie Probleme ... wie funktioniert das, wenn OnCreate vor der Erstellung der Komponenten ausgeloest wird?
Upps , ich hab mich geirrt. Anscheined exsistiert beim aufruf, Form1 und alle daraufliegenden komponenten. Aber noch nicht die debug-form.
Beim aufruf des Timers ist alles vorhanden...


OnShow kann man verwenden, wenn du eine Form aber öffters zeigst und versteckst kann das kompliziert werden...

Code: Alles auswählen

Signatur := nil;

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Erstellungsreihenfolge Forms

Beitrag von Eclipticon »

carli hat geschrieben:Wozu der ganze Aufwand? Die Erstellungsreihenfolge lässt sich ganz bequem in den Projekteinstellungen setzen
Weil das lt. Projekteinstellungen zuerst erstellte Formular auch das Hauptformular ist ... und sobald man dieses schliesst, endet auch die Applikation. Bei einem Debug-Fenster nicht unbedingt ein erwuenschter Effekt ...

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: Erstellungsreihenfolge Forms

Beitrag von Poelser »

In einem Delphi-Projekt habe ich die Reihenfolge so gelöst, dass ich als erstes ein DatenModul erstelle:

Code: Alles auswählen

Application.Initialize;
  Application.Title := 'blabla';
  Application.CreateForm(TDataModule1, DataModule1);
  if not Application.Terminated then
  begin
    Application.CreateForm(TMenuHauptauswahl, MenuHauptauswahl);
    Application.Run;
  end;
Dann kann im OnCreate des Datenmoduls ein Form erstellt und ggf. ausgeführt werden. Ich habe dort z.B. die Anmeldemaske untergebracht. Das müsste auch mit Lazarus so funktionieren.

Antworten