Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Übergabe von Einstellungen, wie am elegantesten?

  Alt 8. Dez 2003, 10:29
Hallo Ulrich,

Du konntest das State-Pattern (GoF, Bei Google suchenstate 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 (Bei Google suchenlock 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...
gruß, choose
  Mit Zitat antworten Zitat