Hallo Neg,
weil ich nur der erste sein möchte, der Dir hier antwortet ("Beer!"), möchte ich Dich an dieser Stelle lediglich auf Interfaces hinweisen.
Eine Lösung der Art
Delphi-Quellcode:
type
IMyInterface = interface
['YourGUID']
procedure RefreshLanguage;
end;
TMyFrame = class(TFrame, IMyInterface)
protected
procedure RefreshLanguage;
end;
TForm1 = class(TForm, IMyInterface)
protected
procedure RefreshLangauge;
end;
sollte darüber hinaus die Erweiturung des Konzepts auf andere Klassen (zB
TForm) ermöglichen, die nicht von einer abstrakten Oberklasse erben, ohne das der Client (Aufrufer) angepasst werden muss:
Delphi-Quellcode:
var
myInterface: IMyInterface;
myFrame: TMyFrame;
begin
myFrame:= TMyFrame.Create(AForm);
with myFrame do
//...
// use instances' interface
myInterface:= myFrame;
myInterface.RefreshLanguage;
myInterface:= AForm;
myInterface.RefreshLanguage;
// syntactical suggar
(myFrame as IMyInterface).RefreshLanguage;
(AForm as IMyInterface).RefreshLanguage;
Ich empfehle Dir weiterhin eine Registratur aller anpassbaren Elemente (zB in Form eines
singelton pattern) zu etablieren, bei der Sich die entsprechenden Komponenten bei der Erzeugung registrieren bzw beim Freigeben abmelden
Delphi-Quellcode:
constructor TMyFrame.Create(..);
begin
inherited;
TLanguageSingelton.Instance.Register(Self);
end;
um später zB mit dem Aufruf
TLanguageSingelton.Instance.RefreshLanguage;
alle zu aktualisierenen Exemplare zu iterieren unabhängig davon, auf welchen Controls sie sich tatsächlich befinden...
Falls Du später mehrere solcher Funktionalitäten zur Verfügung stellen solltest, könnte dieser Ansatz jedoch schnell in sog "god-interfaces" ausarten. Für diesen Fall könnte man lieber ein Delegations-Objekt oder die simplifizierte Delphi-Variante, ein Ereignis, registrieren, dass das alleinige Wissen über die durchzuführenden Aktionen hat...