Hallo zusammen,
ich entwickler zurzeit einige Komponenten, die in Lazarus zur Designtime verwendet werden sollen, aber erst zur Laufzeit aktiv werden. Der Benutzer soll zur Entwurfszeit in Lazarus verschiedene Einstellungen vornehmen können, diese sollen dort jedoch nur gespeichert werden. Wenn das Programm startet, sollen verschiedene Aktionen in Abhängigkeit der Einstellungen durchgeführt werden (z.B. Worker-Threads starten und mit den angegeben Daten versorgen).
Wie speichert man hier idealerweise die Daten und zu welchen Zeitpunkten werden die Daten von der Persistenz "produktiv" gesetzt? Kann man während der Laufzeit nur mit den produktiven Daten arbeiten und zum Streamen die Daten in der Persistenz aktualisieren?
Persistenz zwischen Designtime und Runtime
-
Socke
- Lazarusforum e. V.
- Beiträge: 3188
- 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:
Persistenz zwischen Designtime und Runtime
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
mse
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Persistenz zwischen Designtime und Runtime
Komponenten können durch Auswerten von "tcomponent.componentstate csdesigning" den Entwurfszeitszustand erkennen.
Die Aktivierung geschieht meist in "loaded()", da dort bereits alle Komponenten des Formulares geladen sind. Manchmal ist das zu früh, da Abhängigkeiten zu weiteren Formularen bestehen. In diesem Fall muss das Erstellen der abhängigen Formulare zwischen "begingloballoading()"/"endgloballoading()" geschehen. Eine andere Möglichkeit ist das Aktivieren beim Start der main event loop. In MSEgui wird das durch das posten eines events an sich selbst durchgeführt.
Die letzte Frage verstehe ich leider nicht.
Die Aktivierung geschieht meist in "loaded()", da dort bereits alle Komponenten des Formulares geladen sind. Manchmal ist das zu früh, da Abhängigkeiten zu weiteren Formularen bestehen. In diesem Fall muss das Erstellen der abhängigen Formulare zwischen "begingloballoading()"/"endgloballoading()" geschehen. Eine andere Möglichkeit ist das Aktivieren beim Start der main event loop. In MSEgui wird das durch das posten eines events an sich selbst durchgeführt.
Die letzte Frage verstehe ich leider nicht.
-
Socke
- Lazarusforum e. V.
- Beiträge: 3188
- 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: Persistenz zwischen Designtime und Runtime
Vielen Dank für den Hinweis auf die Methode Loaded(); vielleicht ist es genau das, was ich suche.mse hat geschrieben:Komponenten können durch Auswerten von "tcomponent.componentstate csdesigning" den Entwurfszeitszustand erkennen.
Die Aktivierung geschieht meist in "loaded()", da dort bereits alle Komponenten des Formulares geladen sind. Manchmal ist das zu früh, da Abhängigkeiten zu weiteren Formularen bestehen. In diesem Fall muss das Erstellen der abhängigen Formulare zwischen "begingloballoading()"/"endgloballoading()" geschehen. Eine andere Möglichkeit ist das Aktivieren beim Start der main event loop. In MSEgui wird das durch das posten eines events an sich selbst durchgeführt.
Die letzte Frage verstehe ich leider nicht.
Als kleinen Hinweis am Rande: Die Komponenten sollen eigenständig funktionsfähig sein und nicht auf Formulare beschränkt sein; auch wenn dies das bevorzuge Einsatzgebiet sein wird.
Um meine Frage zu verdeutlichen schreibe ich mal die Übergänge der Daten von einem Zustand in den anderen auf:
- Designzeit: Eigenschaften werden festgelegt und in die LFM-Datei des Formulars gestreamt
- Laufzeit, Loading: Streaming von der LFM-Datei in die Eigenschaften der Komponente; bisher keine weiter Aktion
- Laufzeit, alles geladen: Start der Worker-Threads wenn die Eigenschaft "Running" den Wert "True" hat
- Laufzeit: Zugriff auf aktuelle Werte der Worker-Threads bzw. auf gespeicherte Werte falls kein Worker-Thread existiert
- Laufzeit, Writing: Worker-Threads werden gestoppt, Aktuelle Werte werden gespeichert und können dann gestream werden
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
mse
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Persistenz zwischen Designtime und Runtime
Mit streamen meinst du in *.lfm abspeichern durch writecomponent()/writerootcomponent()? Wenn das Formular mit den geänderten Daten wieder in Lazarus geöffnet werden soll gibt es vermutlich einiges zu beachten.Socke hat geschrieben: [*]Laufzeit, Writing: Worker-Threads werden gestoppt, Aktuelle Werte werden gespeichert und können dann gestream werden[/list]
"loaded()" wird frühestens dann aufgerufen. In einem "begingoballoading()" Block wird es verzögert bis zum Aufruf von "endgloballoading()". Dies kann für inline Komponenten (z.B. TFrame) auch implizit geschehen. In der Regel wird in der überschriebenen loaded() Prozedur zuerst "inherited" aufgerufen damit das "csLoading" flag rückgesetzt wird.Gibt es eine Methode in TComponent, die aufgerufen wird, sobald alle Kinder des Owners fertig geladen wurden?