Hallo Ulrich,
Du konntest das State-Pattern (GoF,
state design pattern) einsetzen und die Konfiguration in einem Exemplar einer Konfigurationsklasse
TConfig speichern. Diese Klasse hat bspw die Eigenschaften
ZielServer und
Kommunikationsport, die auf private Felder gemappt werden. Beim Speichern wird außerdem ein Ereignis
OnChange ausgelöst (das der Einfachheit halber direkt im Konstruktor gesetzt werden könnte). Konfigurationen können dabei ihren Zustand kopieren in der Form
AConfig.Assign(AnotherConfig);
Damit bei einem Aufruf von
Assign nicht für jede Eigenschaft ein
OnChange-Ereignis ausgelöst wird, eignet sich zudem der Einsatz des Lock-Patterns (
lock design pattern) ähnlich dem von
TStrings (siehe
OH BeginUpdate,
EndUpdate).
Das Hauptformular und das Konfigurationformular aggregieren jeweils ein Exemplar von
TConfig
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin
FConfig:= TConfig.Create(Self.ConfigChanged);
end;
wobei der Setter jeweils auf
Assign gemappt wird (ähnlich der Eigenschaft
Font bei
TControl)
Delphi-Quellcode:
procedure TMainForm.SetConfig(const Value: TConfig);
begin
FConfig.Assign(Value);
end;
Der Aufruf des Konfigurationsformulars könnte dann so aussehen:
Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
begin
with TFormConfig.Create(Self) do
try
Config:= Self.Config;
if ShowModal=mrOK then
Self.Config:= Config;
finally
Free;
end;
end;
Es wird zunächst die Bisherige Konfiguration in das Zustandsobjekt des Konfigurationsfensters kopiert, überprüft, ob der Dialog erfolgreich geschlossen wurde und in diesem Fall die dort geänderte Konfiguration "zurückkopiert".
Auf der Seite des Konfigurationsfenster sollte eine Veränderung der Konfiguration die aktualisierung der Eingabefelder bewirken:
Delphi-Quellcode:
procedure TFormConfig.ConfigChanged(Sender: TObject);
begin
Edit1.Text:= Config.ZielServer;
Edit2.Text:= IntToStr(Config.KommunikationsPort);
end;
und der Klick auf den "OK"-Knopf sollte dann die Eingaben aus dem Formular lesen und das aggregierte Konfigurationsobjekt aktualisieren.
In dieser Implementierung habe ich ein temporäres Exemplar erzeugt, damit Fehler während der Aktualisierung keine inkonsistente Konfiguration hinterlassen...
Delphi-Quellcode:
procedure TFormConfig.BtnOKClick(Sender: TObject);
var
myConfig: TConfig;
begin
myConfig:= TConfig.Create;
try
myConfig.ZielServer:= Edit1.Text;
myConfig.KommunikationsPort:= StrToInt(Edit2.Text);
Self.Config:= myConfig;
finally
myConfig.Free;
end;
end;
Wenn beim Laden und Speichern von Konfigurationen brauchst Du nun nur noch mit Exemplaren von
TConfig arbeiten...