erzeugte und angedockte forms speichern?

Forum für alles rund um die MSEide und MSEgui
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1423
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

Hallo,

wenn ich meinem mainfo.statfile einen Wert zuweise, dann werden standardmäßig verschiedene Dinge wie die Position, Status (maximiert etc.) gespeichert und beim nächsten Programmstart wieder geladen.

Wenn ich aber per Programmcode Formulare erzeugt und z.b. angedockt habe, sind die beim nächsten Programmstart wieder weg.
Gibt es ein Standardverfahren, daß auch diese gespeichert und wieder hergestellt werden können?

Viele Grüße
Michael

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: erzeugte und angedockte forms speichern?

Beitrag von mse »

Es gibt verschiedene Möglichkeiten. Die Universellste ist, in den zusätzlichen Formularen weitere tstatfile zu verwenden, welche in options sfo_memory gesetzt haben. Die Daten werden dann in einem virtuellen file system innerhalb der Applikation gespeichert. "filename" setzt man z.B. auf Namen welche auf "fo.sta" enden. Im Haupt-statfile des Hauptformulares setzt man 'savedmemoryfiles' auf "*fo.sta" (ohne Gänsefüsschen) , die memory Daten werden dann in die Haupt- *.sta Datei gesichert. Die Zusatzformulare müssen erzeugt werden nachdem das Haupt-tstatfile geladen wurde und sie müssen geschlossen werden bevor das Hauptformular geschlossen wird.
Falls alle Formulare während der gesamten Laufzeit instantiiert bleiben, kann man auch für alle Formulare das Haupt-tstatfile verwenden, muss dann aber tstatfile.readstat() im Code aufrufen nachdem alle Formulare erzeugt wurden und tstatfile.writestat() bevor das erste Formular aufgelöst wird. mainfo.options fo_autoreadstat und fo_autowritestat sind false.
Um weitere Informationen zu speichern kann man tstatfile.onstatread/onstatwrite/onstatupdate verwenden, in deinem Fall vermutlich z.B. welche tabpages erzeugt werden müssen.

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

Re: erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

Hmm, klappt irgendwie nicht.

Ich hab mal mein "Projekt" (im Moment eher Test und Spielwiese) angehängt.
In mainfo habe ich einen Toolbar mit ein paar Toolbutton darin sowie einige Actions.
Bei den ersten 3 Buttons wird die angegebene Action ausgeführt, bei den beiden letzten nicht?!?

Bei den Menuitems gibt es nur onBeforeExecute, onAfterExecute und onExecute. Ich bräuchte sowas wie onClick.
Wenn der Anwender auf das Menu "Fenster" klickt, will ich durch application.windows iterieren und das submenu befüllen. Klappt aber leider auch nicht.
Dateianhänge
dc.zip
(173.01 KiB) 203-mal heruntergeladen

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: erzeugte und angedockte forms speichern?

Beitrag von mse »

fliegermichl hat geschrieben:Bei den ersten 3 Buttons wird die angegebene Action ausgeführt, bei den beiden letzten nicht?!?

Man kann die in der verlinkten taction vorgegebenen Werte im tmenuitem überschreiben. Die Flags "as_local*" in "state" bestimmen ob die lokalen oder die Werte der Actionkomponente verwendet werden. Die Flags werden durch Setzen des entsprechenden lokalen Wertes im Objektinspektor automatisch gesetzt. Bei item3 und item4 ist das für onexecute der Fall, (localonexecute1.png).
localonexecute1.png

Bitte lösche as_localonexecute um wieder den Wert aus taction zu übernehmen (localonexecute2.png).
localonexecute2.png

Bei den Menuitems gibt es nur onBeforeExecute, onAfterExecute und onExecute. Ich bräuchte sowas wie onClick.
Wenn der Anwender auf das Menu "Fenster" klickt, will ich durch application.windows iterieren und das submenu befüllen. Klappt aber leider auch nicht.

Dafür ist tmainmenu.onupdate vorgesehen.

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

Re: erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

Danke erstmal für die Infos.

Wie kann sich die Einstellung as_localonexecute umstellen? Evtl. hatte ich früher mal ein onexecute event zu diesen toolbuttons, dass ich später wieder gelöscht hatte.

wenn ich durch application.windows iteriere, dann bekomme ich objekte des Typs twindow. Von denen stammen die mseforms aber nicht ab. Was hat es damit auf sich?
Gibt es soetwas wie Screen.Forms bei Lazarus?

Was habe ich mit dem speichern der Forms in dem statfile falsch gemacht?

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: erzeugte und angedockte forms speichern?

Beitrag von mse »

fliegermichl hat geschrieben:Wie kann sich die Einstellung as_localonexecute umstellen? Evtl. hatte ich früher mal ein onexecute event zu diesen toolbuttons, dass ich später wieder gelöscht hatte.

Genau.
wenn ich durch application.windows iteriere, dann bekomme ich objekte des Typs twindow. Von denen stammen die mseforms aber nicht ab. Was hat es damit auf sich?

twindow kapselt das Fenster des Betriebs- oder Graphiksystems (window-handle). In MSEgui gibt es nur ein window-handle pro Formular/top-level-widget. Das top-level-widget erzeugt ein twindow bei Bedarf, die twidget.window Eigenschaften (auch der Kinder) geben die dem top-level-widget zugeordnete twindow Instanz zurück. Jeder twidget Nachkomme oder auch twidget selbst kann als top-level-widget wirken, tform ist in dieser Hinsicht nichts Spezielles.
Gibt es soetwas wie Screen.Forms bei Lazarus?

application.windows[n].owner liefert die zugeordnete twidget Instanz, meistens ist das ein tmseform.
Was habe ich mit dem speichern der Forms in dem statfile falsch gemacht?

Die "tnewdockingfo" sind mit keinem "tstatfile" verknüpft, zudem müssen sie beim Programmstart aus den statfile-Daten im Code erzeugt werden, da dazu die Hilfe des Compiler notwendig ist.
Zur Verwaltung von Dock-Panels gibt es "tdockpanelformcontroller" (tab 'Widget'), ein Beispiel ist hier:
https://gitlab.com/mseide-msegui/mseuni ... controller

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

Re: erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

mse hat geschrieben:Es gibt verschiedene Möglichkeiten. Die Universellste ist, in den zusätzlichen Formularen weitere tstatfile zu verwenden, welche in options sfo_memory gesetzt haben. Die Daten werden dann in einem virtuellen file system innerhalb der Applikation gespeichert. "filename" setzt man z.B. auf Namen welche auf "fo.sta" enden. Im Haupt-statfile des Hauptformulares setzt man 'savedmemoryfiles' auf "*fo.sta" (ohne Gänsefüsschen) , die memory Daten werden dann in die Haupt- *.sta Datei gesichert. Die Zusatzformulare müssen erzeugt werden nachdem das Haupt-tstatfile geladen wurde und sie müssen geschlossen werden bevor das Hauptformular geschlossen wird.
Falls alle Formulare während der gesamten Laufzeit instantiiert bleiben, kann man auch für alle Formulare das Haupt-tstatfile verwenden, muss dann aber tstatfile.readstat() im Code aufrufen nachdem alle Formulare erzeugt wurden und tstatfile.writestat() bevor das erste Formular aufgelöst wird. mainfo.options fo_autoreadstat und fo_autowritestat sind false.
Um weitere Informationen zu speichern kann man tstatfile.onstatread/onstatwrite/onstatupdate verwenden, in deinem Fall vermutlich z.B. welche tabpages erzeugt werden müssen.


Ich hab das jetzt nochmal versucht.
in jedem Formular ein tstatfile gesetzt, filename auf fo.sta, options auf [sfo_memory,sfo_transaction,sfo_savedata,sfo_autoreadstat,sfo_autowritestat,sfo_activatorread,sfo_activatorwrite]
im mainfo.statfile savedmemoryfiles auch auf fo.sta gesetzt.

Es werden beim beenden der Anwendung auch Daten über die erzeugten child Formulare in das main statfile gschrieben. Wenn ich das Programm aber erneut starte, werden die Formulare aber nicht wieder erzeugt. Irgendwo fehlt wahrscheinlich noch was.

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: erzeugte und angedockte forms speichern?

Beitrag von mse »

fliegermichl hat geschrieben:Es werden beim beenden der Anwendung auch Daten über die erzeugten child Formulare in das main statfile gschrieben. Wenn ich das Programm aber erneut starte, werden die Formulare aber nicht wieder erzeugt. Irgendwo fehlt wahrscheinlich noch was.

TStatFile kann keine Formulare von sich aus erzeugen, das muss im Code erledigt werden. Z.B. kann eine Liste der Formularnamen in mainstatfile.onstatwrite mit writer.writearray() geschrieben werden und in mainstat.onstatread() mit reader.readarray() gelesen und die entsprechenden Formulare erzeugt werden.
TDockPanelFormController benutzt einen entsprechenden Mechanismus um die Dockpanels zu erzeugen.

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

Re: erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

Aber wozu gibt es denn dann die Optionen sfo_savedata,sfo_autoreadstat,sfo_autowritestat ?

Ich möchte doch nur erreichen, dass wenn der Anwender sich ein Layout mit verschiedenen gedockten Formularen zusammengestellt hat, er dieses speichern und später wieder laden kann. So wie es in der mseide ja auch geht.
Da habe ich übrigens mal gespickt. Die Klasse tpanelfo hat doch auch kein statfile und trotzdem wird es automatisch gespeichert und wiederhergestellt und auch was mit wem wo angedockt war.

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: erzeugte und angedockte forms speichern?

Beitrag von mse »

fliegermichl hat geschrieben:Aber wozu gibt es denn dann die Optionen sfo_savedata,sfo_autoreadstat,sfo_autowritestat ?

sfo_savedata -> speichere die eigenen Daten in die bei tstatfile.statfile gewählte tstatfile Instanz.
sfo_autoreadstat -> rufe tstatfile.readstat() automatisch auf nachdem die statfile-Daten aus der in tstatfile.statfile gewählten tstatfile Instanz geladen wurden. tstatfile.readstat() überträgt die Werte in die verknüpften Komponenten.
sfo_autowritestat -> rufe tstatfile.writestat() automatisch auf bevor die statfile-Daten in die in tstatfile.statfile gewählten tstatfile Instanz geschrieben werden. tstatfile.writestat() holt die Werte aus den verknüpften Komponenten.
Ich möchte doch nur erreichen, dass wenn der Anwender sich ein Layout mit verschiedenen gedockten Formularen zusammengestellt hat, er dieses speichern und später wieder laden kann. So wie es in der mseide ja auch geht.
Da habe ich übrigens mal gespickt. Die Klasse tpanelfo hat doch auch kein statfile und trotzdem wird es automatisch gespeichert und wiederhergestellt und auch was mit wem wo angedockt war.

Schau mal in MSEide mainfo.basedock, dort ist die "statfile" Eigenschaft gesetzt.
Zur Verwaltung der durch die Anwender erzeugten DockPanels benutzt MSEide TDockPanelFormController aus 'Widget'. Erzeugst du zusätzlich DockPanels zur Laufzeit?
Edit:
Ein weiteres und einfacheres Beispiel ist MSEgit:
https://gitlab.com/mseide-msegui/mseuni ... ols/msegit

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

Re: erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

Ich werd mir das mal in der mseide genauer anschauen.

Ich erzeuge nur ähnlich wie in MSEide von TDockform abgeleitete Formulare mit denen per Drag and Dock ein Windowlayout zusammengestellt werden kann und dieses will ich natürlich auch speichern und wieder laden können.
Was ist den der Unterschied zwischen TDockpanel und TDockform?

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: erzeugte und angedockte forms speichern?

Beitrag von mse »

fliegermichl hat geschrieben:Ich werd mir das mal in der mseide genauer anschauen.

Besser MSEgit, das ist einfacher.
Ich erzeuge nur ähnlich wie in MSEide von TDockform abgeleitete Formulare mit denen per Drag and Dock ein Windowlayout zusammengestellt werden kann und dieses will ich natürlich auch speichern und wieder laden können.

Wenn du nicht weiterkommst, mache bitte ein vereinfachtes Beispiel.
Was ist den der Unterschied zwischen TDockpanel und TDockform?

TDockform hat die ganze TForm Funktionalität, TDockpanel erbt lediglich von TScalingWidget.

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

Re: erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

mse hat geschrieben:
fliegermichl hat geschrieben:Ich werd mir das mal in der mseide genauer anschauen.

Besser MSEgit, das ist einfacher.
Ich erzeuge nur ähnlich wie in MSEide von TDockform abgeleitete Formulare mit denen per Drag and Dock ein Windowlayout zusammengestellt werden kann und dieses will ich natürlich auch speichern und wieder laden können.

Wenn du nicht weiterkommst, mache bitte ein vereinfachtes Beispiel.
Was ist den der Unterschied zwischen TDockpanel und TDockform?

TDockform hat die ganze TForm Funktionalität, TDockpanel erbt lediglich von TScalingWidget.


Darf ich die Unit panelform.pas/mfm aus mseide in meinem Projekt verwenden? Ich hab die Routinen loadwindowslayout und savewindowslayout aus der main.pas sowie die panelform in mein Projekt übernommen und nur etwas angepasst. Jetzt lädt und speichert es die Formulare so wie gewünscht.

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: erzeugte und angedockte forms speichern?

Beitrag von mse »

fliegermichl hat geschrieben:Darf ich die Unit panelform.pas/mfm aus mseide in meinem Projekt verwenden? Ich hab die Routinen loadwindowslayout und savewindowslayout aus der main.pas sowie die panelform in mein Projekt übernommen und nur etwas angepasst. Jetzt lädt und speichert es die Formulare so wie gewünscht.

MSEide ist GPL. Ich habe die panelform.* Dateien unter "LGPL with static linking exception" nach lib/common/designutils kopiert:
https://gitlab.com/mseide-msegui/mseide ... esignutils
tpanelfo ist allerdings veraltet, heutzutage übernimmt die TDockPanelformController die Funktion, siehe MSEgit:
https://gitlab.com/mseide-msegui/mseuni ... ols/msegit

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

Re: erzeugte und angedockte forms speichern?

Beitrag von fliegermichl »

Ja das speichern mit dem TDockformController werde ich mir anschauen müssen. Ich habe nämlich festgestellt, daß savepanellayout und loadpanellayout hart codiert tpanelfo Klassen erzeugen. Dann sind meine von tpanelfo abgeleiteten Formularklassen wieder weg.

Antworten