Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: wo Initialisierungen von Formularen durchführen.

  Alt 11. Sep 2008, 11:14
Ich würde mir eine generische Formular-Klasse erstellen, die die Label-Beschriftungen bei Bedarf aus einer Datei lädt.
Weiterhin würde ich mir einen Observer (GOF-Strategy, Observer-Pattern) schreiben, der beim Sprachenwechsel alle Formulare benachrichtigt.

Die Formulare melden sich beim Observer an (subscribe), sobald sie erzeugt werden (FormCreate-Methode) und melden sich wieder ab (unsubscribe), wenn sie zerstört werden (FormDestroy).

Alle deine Formulare leitest Du dann von diesem TMultiLanguageForm ab und musst dich dann um gar nichts mehr kümmern.

Der Observer verwaltet eigentlich nur eine Liste von TMultiLanguageForm. Meldet sich eine Form an, kommt es in die Liste. meldet sie sich ab, wird sie aus der Liste entfernt. Beim Sprachwechsel werden einfach alle Formulare der Liste nacheinander aufgefortert, ihre Spracheinstellungen neu zu laden.
Delphi-Quellcode:
unit MultiLingualForms;

interface
uses Classes, Forms;
Type

  IObserverReceiver = Interface
     Procedure Notify (Const aMessage : String);
     End;

  TLanguageObserver = Class
  private
    FObserver : TInterfaceList;
  Public
    Constructor Create;
    Destructor Destroy; Override;
    Procedure Subscribe (aObserver : IObserverReceiver);
    Procedure Unsubscribe(aObserver : IObserverReceiver);
    Procedure Notify;
    End;

  TMultiLanguageForm = Class (TForm, IObserverReceiver)
  protected
    Procedure DoCreate; Override;
    Procedure DoDestroy; Override;
    Procedure ChangeLanguage;
    Procedure IObserverReceiver.Notify = ChangeLanguage;
  End;

Function Observer : TLanguageObserver;

implementation

{ TLanguageObserver }
Var
  _Observer : TLanguageObserver;

Function Observer : TLanguageObserver;
Begin
  If not Assigned (_Observer) Then _Observer := TLanguageObserver.Create;
  Result := _Observer
End;

constructor TLanguageObserver.Create;
begin
  inherited;
  FObserver := TInterfaceList.Create;
end;

destructor TLanguageObserver.Destroy;
begin
  FObserver.Free;
  inherited;
end;

procedure TLanguageObserver.Notify;
Var
  i : Integer;

begin
  For i:=0 To FObserver.Count-1 do
    IObserverReceiver(FObserver[i]).Notify;
end;

procedure TLanguageObserver.Subscribe(aObserver: IObserverReceiver);
begin
  If FObserver.IndexOf(aObserver)=-1 Then
    FObserver.Add(aObserver)
end;

procedure TLanguageObserver.Unsubscribe(aObserver: IObserverReceiver);
begin
  FObserver.Remove(aObserver)
end;

{ TMultiLanguageForm }

procedure TMultiLanguageForm.DoCreate;
begin
  inherited;
  Observer.Subscribe(Self);
  ChangeLanguage;
end;

procedure TMultiLanguageForm.DoDestroy;
begin
  Observer.Unsubscribe(Self);
  inherited;
end;

procedure TMultiLanguageForm.ChangeLanguage;
begin
// Sprachdatei laden und eigene Label neu setzen
end;

initialization
  _Observer := Nil;
finalization
  _Observer.Free;
end.
Beim Sprachwechsel einfach 'Observer.Notify' aufrufen, der macht den Rest.


Nebenbei gibt es sehr schöne Tools, die einem die Entwicklung mehrsprachiger Anwendungen erleichtern. GnuGetText oder TsiLang sind zwei Kandidaten, aber es gibt sicherlich noch Andere.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat