Einstellungsverwaltung in der Applikation

Rund um die LCL und andere Komponenten

Einstellungsverwaltung in der Applikation

Beitragvon charlytango » 3. Jan 2019, 00:18 Einstellungsverwaltung in der Applikation

Hi,

Einstellungen die ich applikationsweit benötige, verwalte ich in einem TMemdataset.
Initialisierung, Zugriff, etc habe ich bisher in einem Datamodul gemacht das mit der Applikation erzeugt wurde.

Code: Alles auswählen
 
unit udmSettings;
....
type
  TdmSettings = class(TDataModule)
  ...
end;
 
var
  dmSettings: TdmSettings;
 
implementation
....


in der *.lpr Datei:
Code: Alles auswählen
 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  ....
  Application.CreateForm(TdmSettings, dmSettings)//Einstellungen verwalten
  Application.CreateForm(TfrmMain, frmMain);          //Hauptformular erzeugen
  Application.Run;
end.


Somit war alles was im Datenmodul behandelt wurde auch applikationsweit über die Variable dmSettings verwendbar/sichtbar - es musste nur das Datenmodul per uses udmSettings in die jeweilige Unit eingebunden werden.

Nun hat jede Applikation so ihre kleinen Eigenheiten und man kann nicht immer alles über einen Kamm scheren.
Bislang habe ich dann das Datenmodul in dem die Funktionen lagen vererbt und abweichendes Verhalten im Nachfolger eingebaut.
Jetzt hatte schon das alte Delphi mit der Vererbung von Datenmodulen seine liebe Not und Lazarus scheint da auch noch eine Macke zu haben.
Gelegentlich findet die IDE zusammengehörende Komponenten dann nicht mehr und zerschießt die Vererbung -- kann auch sein dass ich dazu zu dämlich bin, unschön ist diese Lösung allemal.

Ich versuchte jetzt alle nötigen Funktionen direkt in eine Unit zu packen (ohne *.lfm) und alle benötigten Komponenten selbst zu erstellen und ggfs auch zuzuweisen.
Passt auch, soweit ich das bis jetzt beurteilen kann.

Nur muss ich das Objekt mit den Einstellungen aus der Klasse selbst erzeugen und damit bin ich mit meinem Latein irgendwie am Ende.
Dabei geht es mir nicht darum wie ich ein Objekt erzeuge sondern um die Sichtbarkeit des erzeugten Objektes in der Applikation.

Wo bzw wie erzeuge ich das Objekt das meine Einstellungen verwaltet damit alle Units und Forms darauf zur Laufzeit zugreifen können?
Gibt es da eine ebenso elegante Lösung wie die mit den Datamodulen ?

Oder muss ich es im Hauptformular erzeugen und alle Units müssen das Hauptformular mit eingebunden haben damit man darauf zugreifen kann?
Oder eine allgemeine Objektliste auf die man irgendwie kommt?

Die Anforderung ist sicher nicht sehr exotisch, Programmparameter braucht fast jeder -- aber wie löst ihr das elegant?

Danke im voraus!
charlytango
 
Beiträge: 137
Registriert: 12. Sep 2015, 11:10
Wohnort: Wien
OS, Lazarus, FPC: Laz 1.8 | 
CPU-Target: Win 32Bit, 64bit
Nach oben

Beitragvon Warf » 3. Jan 2019, 01:18 Re: Einstellungsverwaltung in der Applikation

Zwei Optionen: 1. Singelton:
Code: Alles auswählen
Unit Settings;
...
type
  TSettings = class
  ...
  end;
 
function Settings: TSettings;
 
implementation
function Settings: TSettings;
const _Settings: TSettings = nil; // globale variable die Prozedur lokal ist
begin
  if not Assigned(_Settings) then
  begin
    _Settings = TSettings.Create(...);
    // erstes mal aufrufen: Lade Einstellungen
  end;
  Result := _Settings
end;
 
end.


2. Initialization verwenden:
Code: Alles auswählen
Unit Settings;
...
type
  TSettings = class
  ...
  end;
var Settings: TSettings;
 
implementation
 
initialization // wird beim laden der Unit ausgeführt -> bei Programmstart
  Settings = TSettings.Create(...);
  // Settings laden
end.


beides lässt sich mit dem Finalization block kombinieren falls am ende des Programmes noch aufgeräumt werden muss:

Code: Alles auswählen
Unit Settings;
...
type
  TSettings = class
  ...
  end;
var Settings: TSettings;
 
implementation
 
initialization // wird beim laden der Unit ausgeführt -> bei Programmstart
  Settings = TSettings.Create(...);
  // Settings laden
finalization
  Settings.Free;
end.


Der singelton hat den Vorteil das die Settings nur geladen werden wenn auch darauf zugegriffen wird, die Initializaition wird immer beim Programmstart ausgeführt sobald die Unit irgendwo in den uses steht
Warf
 
Beiträge: 1047
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon charlytango » 3. Jan 2019, 18:32 Re: Einstellungsverwaltung in der Applikation

erstmal danke - wenn du das so einfach hinskizzierst, hab ich einige Wissenslücken durch die ein ICE quer passt ;)

Da werde ich mich mal damit beschäftigen
Merci vielmals !
charlytango
 
Beiträge: 137
Registriert: 12. Sep 2015, 11:10
Wohnort: Wien
OS, Lazarus, FPC: Laz 1.8 | 
CPU-Target: Win 32Bit, 64bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried