erzeugte und angedockte forms speichern?
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
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
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
-
- 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?
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.
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.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
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.
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) 254-mal heruntergeladen
-
- 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?
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). Bitte lösche as_localonexecute um wieder den Wert aus taction zu übernehmen (localonexecute2.png).fliegermichl hat geschrieben: Bei den ersten 3 Buttons wird die angegebene Action ausgeführt, bei den beiden letzten nicht?!?
Dafür ist tmainmenu.onupdate vorgesehen.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.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
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?
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?
-
- 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?
Genau.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.
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.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?
application.windows[n].owner liefert die zugeordnete twidget Instanz, meistens ist das ein tmseform.Gibt es soetwas wie Screen.Forms bei Lazarus?
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.Was habe ich mit dem speichern der Forms in dem statfile falsch gemacht?
Zur Verwaltung von Dock-Panels gibt es "tdockpanelformcontroller" (tab 'Widget'), ein Beispiel ist hier:
https://gitlab.com/mseide-msegui/mseuni ... controller
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
Ich hab das jetzt nochmal versucht.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.
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.
-
- 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?
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.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.
TDockPanelFormController benutzt einen entsprechenden Mechanismus um die Dockpanels zu erzeugen.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
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.
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.
-
- 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?
sfo_savedata -> speichere die eigenen Daten in die bei tstatfile.statfile gewählte tstatfile Instanz.fliegermichl hat geschrieben:Aber wozu gibt es denn dann die Optionen sfo_savedata,sfo_autoreadstat,sfo_autowritestat ?
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.
Schau mal in MSEide mainfo.basedock, dort ist die "statfile" Eigenschaft gesetzt.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.
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
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?
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?
-
- 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?
Besser MSEgit, das ist einfacher.fliegermichl hat geschrieben:Ich werd mir das mal in der mseide genauer anschauen.
Wenn du nicht weiterkommst, mache bitte ein vereinfachtes Beispiel.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.
TDockform hat die ganze TForm Funktionalität, TDockpanel erbt lediglich von TScalingWidget.Was ist den der Unterschied zwischen TDockpanel und TDockform?
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
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 hat geschrieben:Besser MSEgit, das ist einfacher.fliegermichl hat geschrieben:Ich werd mir das mal in der mseide genauer anschauen.Wenn du nicht weiterkommst, mache bitte ein vereinfachtes Beispiel.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.TDockform hat die ganze TForm Funktionalität, TDockpanel erbt lediglich von TScalingWidget.Was ist den der Unterschied zwischen TDockpanel und TDockform?
-
- 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?
MSEide ist GPL. Ich habe die panelform.* Dateien unter "LGPL with static linking exception" nach lib/common/designutils kopiert: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.
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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?
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.