Es gibt auch noch eine sehr interessante Möglichkeit diese Properties vorzubelegen: mit einer
Fabrikmethode.
Üblichweise wird ein Formular ja so erzeugt:
form3 := TForm3.Create(nil);
oder alternativ auch so:
Application.CreateForm(TForm4, form4);
Das ändern wir jetzt, indem wird das Formular nicht selbst direkt erzeugen, sondern einer anderen Klasse den Auftrag geben, für uns das Formular zu erzeugen:
TAppFormFactory.CreateForm(TForm5, form5);
Die Fabrikmethode erlaubt es, bestimmte Dinge wie z.B. Fontgrösse global für die gesamte Anwendung zu ändern.
Es gibt allerdings die Einschränkung, dass das nur für Formulare geht, die dynamisch zur Programmlaufzeit erzeugt werden.
Bei den Formularen, die in der Projektdatei automatisch erzeut werden, geht das leider nicht, da die Erzeugung mit Application.CreateForm stattfindet und sich die
IDE da ungern hineinreden lässt.
Die Klasse TAppFormFactory sieht z.B. so aus:
Delphi-Quellcode:
type
TAppFormFactory=class(TObject)
protected
class procedure ModifyComponent(comp:TComponent);
public
class procedure CreateForm(InstanceClass: TComponentClass; var Reference);
end;
implementation
class procedure TAppFormFactory.ModifyComponent(comp:TComponent);
begin
if Comp is TForm then
begin
TForm(Comp).Position := poScreenCenter; // default Form Position
end
else if Comp is TLabel then
begin
// Fontname und Grösse wurden beim Programmstart aus einer Ini-Datei gelesen
// und in globalen Variablen abgelegt
TLabel(Comp).Font.Name := globalLabelFont;
TLabel(Comp).Font.Size := globalLabelSize;
end;
for i := 0 to Comp.ComponentCount-1 do
ModifyComponent(comp.Components[i]) // rekursiver Aufruf für alle untergeordneten Komponenten
end;
class procedure TAppFormFactory.CreateForm(InstanceClass: TComponentClass; var Reference);
begin
Application.CreateForm(InstanceClass, Reference); // Formular erzeugen
ModifyComponent(TComponent(Reference)); // Eigenschaften anpassen
{$IFDEF DEBUG}
with (Reference as TForm) do
Caption := Classname+ '-' + Caption; // jedes Formular trägt seinen Klassenname in der Caption
{$ENDIF}
end;
Man kann das jetzt noch ausbauen, indem man nicht nur eine FabrikMethode (hier: CreateForm) sondern verschiedene auf ihren jeweiligen Einsatzzweck zugeschnittene Methoden (z.B. CreateModalForm) verwendet.
Ausserdem sollte man eine Basisklasse mit virtuellen Methoden haben und die Formfactory-Klasse davon ableiten.
So kann man je nach Einsatzzweck verschiedene FormFactory-Klassen verwenden.