Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Setup (mittels Klasse) über mehrere Forms: Speichern/Laden (https://www.delphipraxis.net/210122-setup-mittels-klasse-ueber-mehrere-forms-speichern-laden.html)

NoGAD 3. Mär 2022 09:48

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

Gausi 3. Mär 2022 10:04

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:
GlobalSettings.LoadString('MainFormCaption', MainForm.Caption);
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).

NoGAD 3. Mär 2022 10:22

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

Uwe Raabe 3. Mär 2022 10:38

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:
    [Stored('DefaultExt'), Default('.csv')]
    property DefaultExt: string read FDefaultExt write FDefaultExt;
    [Stored('TransferFolder'), Default('F:\')]
    property DefaultPath: string read FDefaultPath write FDefaultPath;
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.

NoGAD 3. Mär 2022 11:15

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

NoGAD 3. Mär 2022 11:36

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:
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);
usw.


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

KodeZwerg 4. Mär 2022 10:54

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

NoGAD 4. Mär 2022 19:28

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:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz