Wann ist die Initialisierung komplett?

Rund um die LCL und andere Komponenten
Antworten
braunbär
Beiträge: 458
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Wann ist die Initialisierung komplett?

Beitrag von braunbär »

Gibt es ein Ereignis zum Zeitpunkt, wenn die Initialisierung der Mainform und aller Forms, die beim Programmstart automatisch erstellt werden, abgeschlossen ist? Beim FormCreate des Hauptformulars wohl nicht, das wird glaube ich aufgerufen, bevor das Hauptformular mit seinen Komponenten erstellt wird - oder irre ich mich da?

Derzeit behelfe ich mir mit einem Timer, der im Formcreate für 2 Sekunden gestartet wird und hoffe, dass dann alles fertig ist - aber wirklich elegant ist diese Vorgangsweise nicht.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 296
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Wann ist die Initialisierung komplett?

Beitrag von Jorg3000 »

Moin!
In der Datei Projektname.lpr werden alle Formulare erzeugt und danach Application.Run aufgerufen.
Ich habe stumpf vor Application.Run noch einen eigenen Funktionsaufruf eingefügt. Funktioniert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6651
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wann ist die Initialisierung komplett?

Beitrag von af0815 »

Der meiner Meinung nach sicherste Zeitpunkt ist der erste Aufruf von ApplicatioShow. Dort habe ich meinen Initialisierung Aufruf. Und dort, nur dort, werden auch die anderen Forms, wenn nötig erzeugt.

Warum das ganze:
Es ist konsistent über alle Betriebssysteme und Widgets
Man hat hier eine ganz genaue Kontrolle über die erstellten Forms
Es ist zu diesem Zeitpunkt wirklich alles initialisiert
Ich kann hier schon eigene Configs einlesen und damit meine anderen Forms mit Parametern versorgen
Datenbank Verbindungen können hier sauber erstellt werden, EV. geprüft werden ob der Server vorhanden ist
...

Beim FormDestroy mache ich das ganze in verkehrter Reihenfolge


Das funktioniert seit Jahren(Jahrzehnten) und hatte damals schon bei Delphi funktioniert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1034
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Wann ist die Initialisierung komplett?

Beitrag von charlytango »

ich hab das ähnlich wie Jorg3000 gelöst.

Code: Alles auswählen

  Application.Scaled:=True;
  RequireDerivedFormResource := True;
  Application.Initialize;
  frmSplashScreen := TfrmSplashScreen.Create(Application);
  try
    frmSplashScreen.Show;

    frmSplashScreen.Update;
    Application.ProcessMessages; // to be sure to show the splash screen
    MyGlobalInit;

    Application.CreateForm(TfrmMain, frmMain);
    frmSplashScreen.Hide;
  finally
    frmSplashScreen.Free;
  end;
  Application.Run;               


Einfach auch weil ich im Splashscreen auch Infos aus dem Initialisierungsprozess anzeigen will.
MyGlobalInit kümmert sich um alle nötigen DB-Verbindungen, applikationsweite Einstellungen, Logging und GUI.
af0815 hat geschrieben: Do 23. Jan 2025, 07:46 sicherste Zeitpunkt ist der erste Aufruf von ApplicatioShow.
wie kommst du da ran? Gibt es da ein Event in das man schreiben kann? Merke gerade wieder, ich bin nach wie vor bei vielen Themen blank ;-)


Benutzeravatar
Zvoni
Beiträge: 250
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Wann ist die Initialisierung komplett?

Beitrag von Zvoni »

theo hat geschrieben: Do 23. Jan 2025, 11:06 S.a. hier: https://wiki.freepascal.org/Execute_act ... m_is_shown
Jepp.
Ich maches es in der Regel per OnActivate mit Sperrvariablen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

braunbär
Beiträge: 458
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Wann ist die Initialisierung komplett?

Beitrag von braunbär »

theo hat geschrieben: Do 23. Jan 2025, 11:06 S.a. hier: https://wiki.freepascal.org/Execute_act ... m_is_shown
Ah, da ist ja sogar mein (für meine Vorstellungen etwas dilettantischer) Timer-Ansatz auch als eine Möglichkeit beschrieben :D

Danke für die Antworten, die Idee mit dem OnActivate gefällt mir eigentlich am besten.
Der Splash-screen, im dem gleichzeitig die Startup-Aktivitäten angezeigt werden, ist aber auch eine gute Idee.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6651
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wann ist die Initialisierung komplett?

Beitrag von af0815 »

braunbär hat geschrieben: Do 23. Jan 2025, 14:32
theo hat geschrieben: Do 23. Jan 2025, 11:06 S.a. hier: https://wiki.freepascal.org/Execute_act ... m_is_shown
Ah, da ist ja sogar mein (für meine Vorstellungen etwas dilettantischer) Timer-Ansatz auch als eine Möglichkeit beschrieben :D
Richtig gemacht, ist der nicht diletantisch. Macht nur Sinn wenn man das ganze verzögert initialisieren will. Man muss nur wiederum aufpassen, das der Timer zum richtigen Zeitpunkt enabled wird. Einfach nur automatisch enablen lassen, kann da wiederum ins Auge gehen, weil nicht alles von den Komponeneten bereits initialisiert bzw. vorhanden sein muß.
braunbär hat geschrieben: Do 23. Jan 2025, 14:32 Danke für die Antworten, die Idee mit dem OnActivate gefällt mir eigentlich am besten.
Der Splash-screen, im dem gleichzeitig die Startup-Aktivitäten angezeigt werden, ist aber auch eine gute Idee.
Das OnActivate hat sich bei mir seit den frühen Delphi Zeiten als stabil erwiesen, auch über die verschiedenen Betriebssystem und Widgetset sist diese Methode entsprechend stabil.

Den Splashscreen mach ich ganz speziell, das ist bei mir ein SIngleton, der sich aber wenn das Programm in Ruhe kommt auch selbst deaktivieren kann. Vielleicht liefere ich den Code dafür mal im Forum. Geht damit echt gut und man kann auch Fortschrittsbalken, Infos etc. damit anzeigen und den Benutzer das gefühl geben, da wird was im Hintergrund echt gearbeitet :-) Und der Code ist auf allen von mir verwendeten Plattformen auch lauffähig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1571
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Wann ist die Initialisierung komplett?

Beitrag von fliegermichl »

Vielleicht kann man ja mal einen FeatureRequest einreichen, daß ein Event OnApplicationReady oder so eingeführt wird.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6651
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wann ist die Initialisierung komplett?

Beitrag von af0815 »

fliegermichl hat geschrieben: Do 23. Jan 2025, 16:19 Vielleicht kann man ja mal einen FeatureRequest einreichen, daß ein Event OnApplicationReady oder so eingeführt wird.
Wozu ? Vor allen, wer soll das werfen ? Man beachte die verschiedensten Möglichkeiten wie eine Applikation starten kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3175
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: Wann ist die Initialisierung komplett?

Beitrag von Socke »

af0815 hat geschrieben: Do 23. Jan 2025, 16:12
braunbär hat geschrieben: Do 23. Jan 2025, 14:32
theo hat geschrieben: Do 23. Jan 2025, 11:06 S.a. hier: https://wiki.freepascal.org/Execute_act ... m_is_shown
Ah, da ist ja sogar mein (für meine Vorstellungen etwas dilettantischer) Timer-Ansatz auch als eine Möglichkeit beschrieben :D
Richtig gemacht, ist der nicht diletantisch. Macht nur Sinn wenn man das ganze verzögert initialisieren will. Man muss nur wiederum aufpassen, das der Timer zum richtigen Zeitpunkt enabled wird. Einfach nur automatisch enablen lassen, kann da wiederum ins Auge gehen, weil nicht alles von den Komponeneten bereits initialisiert bzw. vorhanden sein muß.
Das Timer-Event wird doch vom Widget ausgelöst und in Application.Run abgearbeitet. Bis dahin sind alle (automatisch erzeugten) Formulare vollständig. Weitere Initialisierung natürlich ausgenommen.

Wenn der Timer sein Event explizit aufruft, wenn er auf aktiv gestellt wird, hast du ein Problem.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten