AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Setup (mittels Klasse) über mehrere Forms: Speichern/Laden
Thema durchsuchen
Ansicht
Themen-Optionen

Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

Ein Thema von NoGAD · begonnen am 3. Mär 2022 · letzter Beitrag vom 4. Mär 2022
Antwort Antwort
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
325 Beiträge
 
Delphi 10.4 Sydney
 
#1

Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 3. Mär 2022, 09:48
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
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 3. Mär 2022, 10:04
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
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).
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
325 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 3. Mär 2022, 10:22
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
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.008 Beiträge
 
Delphi 12 Athens
 
#4

AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 3. Mär 2022, 10:38
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
325 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 3. Mär 2022, 11:15
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
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
325 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 3. Mär 2022, 11:36
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
Mathias
Ich vergesse einfach zu viel.

Geändert von NoGAD ( 3. Mär 2022 um 11:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 4. Mär 2022, 10:54
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
325 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Setup (mittels Klasse) über mehrere Forms: Speichern/Laden

  Alt 4. Mär 2022, 19:28
Danke, das hilft

Ähnlich habe ich es mit meiner Klasse auch gemacht.

LG
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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