![]() |
Re: wo Initialisierungen von Formularen durchführen.
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:
Beim Sprachwechsel einfach 'Observer.Notify' aufrufen, der macht den Rest.
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. 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz