Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Properties von Forms und Komponenten mit vorgegebenen We

  Alt 23. Sep 2008, 03:38
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.
  Mit Zitat antworten Zitat