![]() |
Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Hallo,
über eine extra Unit habe ich eine Klasse erstellt, in welcher Programmweit und auch Formularübegreifend Einstellungen abgelegt werden. Wie gestalte ich nun das Abspeichern / Einlesen, so dass ich die einzelnen Forms nicht in der Unit angeben muss? Oder anders gefragt: Wie macht ihr das Setup? LG Mathias |
AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Eine Möglichkeit wäre, der Form jeweils nur das Settings-Objekt zu übergeben bzw. bekannt zu machen, so dass die Form selber dann eine Methode aufrufen kann wie
Delphi-Quellcode:
Speichern entsprechend. Das Settings-Objekt kümmert sich dann darum, dass die Daten passend gespeichert werden und beim nächsten Programmstart wieder verfügbar sind (Ini-Datei, JSON-Datei, Registry, Datenbank, CloudServer, wasweißich...). Diese Klasse kümemrt sich also um das Wie. Was gespeichert wird, bleibt Sache der Forms (oder halt anderer Objekte).
GlobalSettings.LoadString('MainFormCaption', MainForm.Caption);
|
AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Hallo Gausi,
danke für den Tipp. So ähnlich habe ich das auch schon in Angriff genommen. Ich hatte gehofft, dass es unkomplizierter geht, mit weniger Aufwand für jede Form. Auch im Hinblick auf Erweiterungen muss dann immer die Klasse und auch die Form entsprechend angepasst werden. Hast Du das in Nempp auch so gemacht? LG Mathias |
AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Ich habe mir dazu ein kleines Framework gebastelt, bei dem sich der Aufwand im jeweiligen Form auf das Dekorieren der zu speichernden Properties mit speziellen Attributen beschränkt. Da ich alle Forms von einem gemeinsamen Basisform ableite, beschränkt sich der wenige notwendige Code auf genau dieses.
In den abgeleiteten Forms steht dann im Wesentlichen nur sowas:
Delphi-Quellcode:
Den Code kann ich (noch) nicht so allgemein veröffentlichen, aber wenn du Interesse hast, schick mir 'ne PM, dann können wir das sicher irgendwie zusammen hinkriegen. Etwas Feedback von außen wäre mir ganz recht.
[Stored('DefaultExt'), Default('.csv')]
property DefaultExt: string read FDefaultExt write FDefaultExt; [Stored('TransferFolder'), Default('F:\')] property DefaultPath: string read FDefaultPath write FDefaultPath; |
AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Hallo Uwe,
vielen Dank für das Angebot. Leider muss ich immer wieder einsehen, dass ich als Hobbyprogrammierer sehr schnell an meine Grenzen stoße. in Deinem Beispiel erkenne ich noch nicht einmal, was das in den eckigen Klammern zu bedeuten hat. Daher wäre es sicherlich besser, wenn Du jemanden zu Rate ziehst, der mehr Fachwissen hat :-) LG Mathias |
AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Eine kleine generelle Frage habe ich bitte noch.
Was ist aus der Sicht eines Programmierers gängiger - oder vom Programmierstil her besser? A: Einstellungen für Controls direkt in des Control einzulesen (z.B. Checkbox1.Checked := readbool...) B: Einstellungen erst in Variablen (oder in eine Klasse) einzulesen und im Anschluss den Controls zuzuweisen (chk_usefarbe := readbool ... ; Checkbox1.Checked := chk_usefarbe) ? Die Frage stellt sich mir gerade, weil ich Elemente auf einer Form ja durchlaufen kann und diese über Namen in eine ini/xml... Datei speichern kann. Hier brauche ich im Prinzip noch nicht einmal darauf achten, ob neue Elemente hinzukommen. Als kleines Beispiel:
Delphi-Quellcode:
usw.
function TForm_Setup.LoadSetupXML(aPathAndFilename: String; aSetup: TSetupClass): Boolean;
var DummyX, DummyY, DummyZ: Integer; Dummy_Setup: TXMLConfig; Dummy_PC: TPageControl; begin { :: Setup aus einer Datei einlesen :: } try try // prüfen, ob Datei exisitiert if FileExists(aPathAndFilename) then begin { Werte einlesen } Dummy_Setup := TXMLConfig.Create(aPathAndFilename); Dummy_PC := PageControl_Setup; with Dummy_Setup do begin for DummyX := 0 to Dummy_PC.PageCount - 1 do for DummyY := 0 to Dummy_PC.Pages[DummyX].ControlCount - 1 do begin if (Dummy_PC.Pages[DummyX].Controls[DummyY] is TLabel) or (Dummy_PC.Pages[DummyX].Controls[DummyY] is TScrollBox) or (Dummy_PC.Pages[DummyX].Controls[DummyY] is TPageControl) then Continue; if Dummy_PC.Pages[DummyX].Controls[DummyY] is TCheckBox then (Dummy_PC.Pages[DummyX].Controls[DummyY] as TCheckBox).Checked := ReadBoolean(Dummy_PC.Pages[DummyX].Name, (Dummy_PC.Pages[DummyX].Controls[DummyY] as TCheckBox).Name, (Dummy_PC.Pages[DummyX].Controls[DummyY] as TCheckBox).Checked); if Dummy_PC.Pages[DummyX].Controls[DummyY] is TCheckListBox then begin for DummyZ := 0 to (Dummy_PC.Pages[DummyX].Controls[DummyY] as TCheckListBox).Count - 1 do (Dummy_PC.Pages[DummyX].Controls[DummyY] as TCheckListBox).Checked[DummyZ] := ReadBoolean(Dummy_PC.Pages[DummyX].Name, (Dummy_PC.Pages[DummyX].Controls[DummyY] as TCheckListBox).Name + '_' + IntToStr(DummyZ), (Dummy_PC.Pages[DummyX].Controls[DummyY] as TCheckListBox).Checked[DummyZ]); end; if Dummy_PC.Pages[DummyX].Controls[DummyY] is TEdit then (Dummy_PC.Pages[DummyX].Controls[DummyY] as TEdit).Text := ReadString(Dummy_PC.Pages[DummyX].Name, (Dummy_PC.Pages[DummyX].Controls[DummyY] as TEdit).Name, (Dummy_PC.Pages[DummyX].Controls[DummyY] as TEdit).Text); if Dummy_PC.Pages[DummyX].Controls[DummyY] is TRadioGroup then (Dummy_PC.Pages[DummyX].Controls[DummyY] as TRadioGroup).ItemIndex := ReadInteger(Dummy_PC.Pages[DummyX].Name, (Dummy_PC.Pages[DummyX].Controls[DummyY] as TRadioGroup).Name, (Dummy_PC.Pages[DummyX].Controls[DummyY] as TRadioGroup).ItemIndex); Hier lese ich ja direkt in die Controls ein. Im Anschluss kann ich dann diese Werte alle in meine Klasse übetragen:
Delphi-Quellcode:
function TForm_Setup.GetSetup(aSetup: TSetupClass): Boolean;
begin { :: Einstellungen aus den Komponenten einlesen :: } try try aSetup.Setup_Font.F_fnt_Zimmer_Generell.Assign(Memo_Setup_Grid_Font.Font); aSetup.Setup_Font.f_fnt_Zimmer_MouseHover.Assign(Memo_Setup_GridMouse_Font.Font); { TabSheet 09 } { Aussehen Hauptprogramm } aSetup.Setup_AusehenHauptProgramm.F_fnt_Setup_MainColorFont.Assign(Memo_Setup_MainColorFont.Font); aSetup.Setup_AusehenHauptProgramm.F_clr_MainButton_Leave := ColorBox_Setup_MainButton_Leave.Selected; aSetup.Setup_AusehenHauptProgramm.F_clr_MainButton_Enter := ColorBox_Setup_MainButton_Enter.Selected; finally Result := true; end; except Result := False; end; end; Wäre das eine "gute" Idee? LG Mathias |
AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Hallo, ich gehe da meist sehr "KodeZwerg"-typisch vor.
Programm intern ist eine globale unit für alles verantwortlich, die behält alle von mir nötigen Einstellungen per inmemory database parat. Ich lege datensätze meist so an: "StoreSetup(Formname)" um tatsächlich alles zu sichern aber meist nutz ich overloaded "StoreSetup(Formname, Control)" um etwas geziehlt zu sichern. Vor dem beenden sichere ich die daten "irgendwie", das "irgendwie" kann vieles sein, db datei, ini datei, bin datei, system registrierung etc... Beim neustart wird dieses "irgendwie" zurück in die inmemory database geladen. Dann nur noch pro form in einem event alles reinladen "LoadSetup(formname)", so ist es generisch verwendbar (über ComponentCount iteriere ich dann durch und setze Werte) Ich hoffe ich konnte mich klar genug ausdrücken und dir vielleicht sogar eine Idee vermitteln |
AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Danke, das hilft :-)
Ähnlich habe ich es mit meiner Klasse auch gemacht. LG :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz