Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhängig (https://www.delphipraxis.net/190218-vorgehensweise-beim-laden-und-speichern-von-programmeinstellungen-%7C-benutzerabhaengig.html)

Headbucket 13. Sep 2016 13:59

Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhängig
 
Hallo miteinander,

ich habe ein paar allgemeine Fragen zur Vorgehensweise beim Laden und Speichern von Programmeinstellungen. Die Thematik scheint simpel, doch ich zerbreche mir schon eine ganze Weile den Kopf darüber und hoffe nun frischen Input zu erhalten :-).

Bisherige Vorgehensweise

Zur Zeit speichere ich meine Daten auf 3 verschiedene Art und Weisen:
  • INI-Dateien | Recht selten geworden, aber es soll dem Benutzer möglich sein manche Einstellungen selbst zu ändern, welche nicht unbedingt über Dialoge im Programm zu ändern sind.
  • XML-Dateien | Komplexere Speicherstrukturen, welche nicht vom Benutzer geändert werden sollen. Es soll jedoch trotzdem möglich sein mal etwas "nachzuschauen".
  • SQLite-Dateien | Alle sonstigen "unwichtigen" Einstellungen, die man in der Oberfläche verändern kann (Farbeinstellungen, usw). Außerdem verschiedene Texte usw.

Von jedem Dateityp gibt es mehrere Dateien. Jede Datei steht dann für eine bestimmte Thematik. Die Einstellungen werden übrigens im Programm immer genau dann geladen, wenn sie benötigt werden. So werden Sie z.B. einmal im Einstellungsdialog geladen, wo ich auch einige Einstellungen verändern kann. Werden die Einstellungen dann im späteren Programm benötigt, dann werde sie auch nochmal geladen. So kann es natürlich vorkommen, dass ich Einstellungen mehrmals lade.

Wünsche

Nun habe ich zwei große Wünsche, welche sich mit meiner bisherigen Vorgehensweise wohl nicht so ganz umsetzen lassen:

(1) Ich möchte verschiedene Einstellungen benutzerabhängig machen. So soll es z.B. neben den globale Einstellungen, welche zuerst geladen werden, auch benutzerabhängige Einstellungen geben, welche ggf. die globalen Einstellungen überschreiben (ähnlich Linux- oder GIT-Konfigurationsdateien).

(2) Mein Programm gibt nach der Ausführung eine Ergebnisdatei aus (XML-Datei). Hier möchte ich gerne alle Programmeinstellungen mitspeichern. Das mag jetzt erstmal etwas übermütig klingen, macht für meinen Anwendungsfall aber durchaus Sinn.

Lösungsfindung

Beide Wünsche würden sich einigermaßen leicht umsetzen lassen, wenn ich wirklich nur EINE Konfigurationsdatei habe. Diese wird dann in meinem Programm am Anfang global geladen (zunächst mit den globalen Einstellungen und danach mit den benutzerabhängigen). Dann müsste ich aber erstens alle Einstellungen in eine Datei packen (sehr unübersichtlich) und außerdem müsste ich alle Einstellungen am Anfang global laden - anderenfalls wird es wohl komplizierter umsetzbar.

Mich würden deshalb mal eure Konzepte zum Laden und Speichern von Einstellungen interessieren. Wie speichert ihr? Habt ihr auch benutzerabhängige Einstellungen? Und wie ist dann eure Handhabung im Delphi? Habt ihr für Konfigurationseinstellungen vllt sogar extra Klassen in extra Units?
Leider habe ich zu diesem Thema auch kaum Literatur im Internet gefunden. Vllt habe ich aber auch einfach nach den falschen Begriffen gesucht.

Wahrscheinlich wird es auf eine oder mehrere Units hinauslaufen, welche verschiedene Klassen implementieren, wo die Einstellungen gelesen und geschrieben werden können. Hier stellt sich mir dann aber direkt die Frage, ob man solche Klassen dann global erstellt oder doch lieber nur bei Bedarf. Dann kann es natürlich vorkommen, dass ich große Klassen mehrmals erzeugen muss.

Vielen Dank fürs durchlesen und die Hilfe!

Grüße
Headbucket

haentschman 13. Sep 2016 14:54

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Hallöle...:P
Zitat:

Habt ihr für Konfigurationseinstellungen vllt sogar extra Klassen in extra Units?
...du sagst es. :P

Vorher eine Frage an dich... (nicht böse gemeint :P) Sagen dir die Begriffe Vererbung etwas? Wenn nicht, solltest du damit anfangen.

Wenn du das innerlicht hast, dann kann man die komplexeren Fragen beantworten. 8-)

Beispiel:
1. Klasse aus verschiedenen Basis Klassen abgeleitet.
2. z.B. aus verschieden INI laden.
3. Einstellungen die immer da sind (globale) und progammspezifische in einer Klasse

dGeek 13. Sep 2016 15:02

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Zitat:

Zitat von haentschman (Beitrag 1347526)
Beispiel:
1. Klasse aus verschiedenen Basis Klassen abgeleitet.
2. z.B. aus verschieden INI laden.
3. Einstellungen die immer da sind (globale) und progammspezifische in einer Klasse

Wieso so kompliziert mit Klassen und alle dem?

DeddyH 13. Sep 2016 15:10

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Wieso keine Interfaces? Dann ließe sich die Applikation recht einfach erweitern, ohne dass man auf der GUI-Ebene eine Zeile Code ändern müsste.

haentschman 13. Sep 2016 15:13

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Moin...:P

Aus verschieden Gründen:
1. eine Klasse kapselt den Code für eine AUFGABE
2. Erweiterung einer Klasse für die AUFGABE mit anderen OPTIONEN
3. Eine Klasse ist WIEDERVERWENDBAR
4. Klasse ist OOP ...

...usw. :zwinker:

Zitat:

Wieso keine Interfaces?
...ich glaube das das zu weit führt. :wink:

dGeek 13. Sep 2016 15:16

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Nur wo werden dann z.B. für eine ini-Datei die Sections und Idents übergeben?
Das ist dann doch außerhalb. Dann ist diese Klasse ja nix anderes als ein Wrapper?

Oder ich verstehe es nicht :lol:

DeddyH 13. Sep 2016 15:18

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Was interessiert es denn den "Speichernden", wie die eigentliche Speicherung implementiert ist? Der muss nix von Idents und Sections wissen, dafür ist die Speicherklasse zuständig.

dGeek 13. Sep 2016 15:20

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Zitat:

Zitat von DeddyH (Beitrag 1347531)
Was interessiert es denn den "Speichernden", wie die eigentliche Speicherung implementiert ist? Der muss nix von Idents und Sections wissen, dafür ist die Speicherklasse zuständig.

Das meinte ich nicht. Ich frage mich nur, wie die Klasse wiederverwendbar sein soll.
Denn wenn ich Sections und Idents doch eh außerhalb der Klasse "angebe" / von außerhalb der Klasse übergebe, wofür dann noch eine Klasse und all der Aufwand?

DeddyH 13. Sep 2016 15:22

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Von welcher Klasse redest Du jetzt?

haentschman 13. Sep 2016 15:24

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Zitat:

Nur wo werden dann z.B. für eine ini-Datei die Sections und Idents übergeben
Versuche dich zu lösen. 8-) Deinem Programm soll es es wurst sein WOHER z.B. die Hintergrundfarbe kommt. Ob aus einer INI oder aus Nachbars Garten. :P Das regelt die "Speicherklasse".
Wenn du eine INI verwendest dann mußt du auch den Code impementieren. :P

Aviator 13. Sep 2016 15:29

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Zitat:

Zitat von DeddyH (Beitrag 1347528)
Wieso keine Interfaces? Dann ließe sich die Applikation recht einfach erweitern, ohne dass man auf der GUI-Ebene eine Zeile Code ändern müsste.

Das würde mich jetzt aber auch interessieren. Habe auch umfangreiche Einstellungen in meinem Programm bei dem fast jedes Control auf der Form in Hintergrundfarbe, Schriftart, Schriftgröße usw. angepasst werden kann. Habe mich immer schon gefragt wie das einfacher gehen sollte.

Wäre über ein Beispiel das so eine Funktion zeigt super dankbar. :cyclops:

DeddyH 13. Sep 2016 15:40

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Im Augenblick ist das eher ungünstig, aber zu Hause könnte ich mal schnell was basteln. Ich glaube aber, Sir Rufo hat zu einem ähnlichen Problem auch schon einmal eine Interface-Lösung gezeigt, allerdings konnte ich den Thread auf die Schnelle nicht finden.

dGeek 13. Sep 2016 15:42

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Meinst du das hier?
http://www.delphipraxis.net/1277612-post3.html

DeddyH 13. Sep 2016 15:44

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Exakt :thumb:

Aviator 13. Sep 2016 17:04

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Zitat:

Zitat von DeddyH (Beitrag 1347536)
Im Augenblick ist das eher ungünstig, aber zu Hause könnte ich mal schnell was basteln. Ich glaube aber, Sir Rufo hat zu einem ähnlichen Problem auch schon einmal eine Interface-Lösung gezeigt, allerdings konnte ich den Thread auf die Schnelle nicht finden.

Das heißt aber das ich dann (zumindest per Schleife) durch alle Komponenten interieren müsste um von jeder die Properties zu lesen und zu schreiben, oder?

Im Einstellungsfenster müsste dann aber auch komponentenbezogen für alle Komponenten eine Einstellungsmöglichkeit vorhanden sein. Wahrscheinlich dann über eine ComboBox aus der man die gewünschte Komponente wählt?

@Headbucket: Ich hoffe ich kapere den Thread jetzt nicht und das sind auch Informationen die du gebrauchen könntest. :cyclops: :-D

DeddyH 13. Sep 2016 17:49

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Das ist richtig, meine Anregung mit dem Interface bezog sich ja auch auf die Art der Speicherung (Ini, Registry, XML, Datenbank oder wo auch immer). Schau Dir doch den verlinkten Thread einmal an, das entspricht ziemlich genau dem, was mir durch den Kopf schoss.

Aviator 13. Sep 2016 18:45

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Zitat:

Zitat von DeddyH (Beitrag 1347557)
Das ist richtig, meine Anregung mit dem Interface bezog sich ja auch auf die Art der Speicherung (Ini, Registry, XML, Datenbank oder wo auch immer). Schau Dir doch den verlinkten Thread einmal an, das entspricht ziemlich genau dem, was mir durch den Kopf schoss.

Ja habe ich mir bereits angeschaut. Ist auch alles logisch. Mir ging es nur darum, wie ich nachher die SaveSetting() oder um beim Beispiel aus dem Link zu bleiben SetBool() Procedure aufrufe um alle Komponenten zu speichern.

In meinem Fall würde ich die Einstellungen in einer Datenbank speichern um an jedem Arbeitsplatz die gleichen Einstellungen zu haben. Jetzt stellt sich mir die Frage wie ich das konkret machen würde.
Würde ich an das Interface am besten die Komponente übergeben und in der Klasse die das Interface implementiert die Eigenschaften selbst auslesen oder wie macht man so etwas?

Ich weiß das wird jetzt sehr speziell und es ist auch nicht mein Thread, aber ich habe die Befürchtung, dass ich nicht der Einzige bin der da evtl. verschiedene Dinge zu umständlich macht.

Headbucket 14. Sep 2016 06:39

AW: Vorgehensweise beim Laden und Speichern von Programmeinstellungen | Benutzerabhän
 
Vielen Dank schonmal für die zahlreichen Antworten!

Zitat:

Zitat von haentschman (Beitrag 1347526)
Vorher eine Frage an dich... (nicht böse gemeint :P) Sagen dir die Begriffe Vererbung etwas? Wenn nicht, solltest du damit anfangen.

Natürlich sagt mir Vererbung etwas :wink: Wird auch exzessiv von mir betrieben.

Für die Speicherung bestimmter Objekte verwende ich sogar schon Interfaces. So kann wahlweise als XML, in SQLite oder auf einer Server-Datenbank gespeichert werden.

Nungut. Dann werde ich wohl die Speicherung mal auf verschiedene Klassen verteilen. Meine Bedenken waren da einfach, dass ich damit zu viel "Overhead" produziere, wenn ich diese Klassen wieder und wieder erzeuge und die Daten (mitunter Daten, welche ich in dem Moment gar nicht benötige) ständig neu lade, solange ich die Klassen nicht global halte. Wenn ich dann auch noch verschiedene Berechtigungsebenen habe, dann muss ich die Daten ja sowieso schon jedes mal mehrmals laden (globale Einstellungen, Benutzereinstellungen, usw.). Ich sträube mich aber irgendwie dagegen diese Klassen dann alle global zu halten - schwierig.

Es handelt sich halt um ein riesiges Programm mit 1000 verschiedenen Einstellungen. Aber wahrscheinlich sollte ich gerade deshalb mal etwas Ordnung reinbringen. Falls jemand aber mal praktisch und nicht nur theoretisch :P ein komplexes Speichersystem im Einsatz hat, dann würde ich mich über Erfahrungsberichte freuen.

Zitat:

Zitat von dGeek (Beitrag 1347537)

Diesen Thread werde ich mir auch nochmal genauer anschauen.

Besten Dank nochmal für die vielen Antworten!

Grüße
Headbucket


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 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