Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#2

Re: 'TMyForm' nach TMyForm casten ? ("lebendig" we

  Alt 30. Sep 2003, 18:14
Trivial ist die Lösung nicht, aber interessant.

Du schreibst eine Klasse, die Dir Formulare zurückgibt. Da sie die Dinger produziert nennen wir sie einfach mal FormFactory. Was die genau macht kommt am Ende. Im Initialization Teil der Unit-Deklaration erzeugst Du eine globale(!) Variable mit der Factory und erzeugst eine Instanz. Im Finalization Teil zerstörst Du sie wieder. Wir programmieren schliesslich ordentlich

Diese Unit (wo die FormFactory drin ist) bindest Du bei allen Formularen ein, die Du zur Laufzeit herzaubern willst.

Im Initialization Teil der Units mit den Formularen trägst Du das Formular dann in der Factory ein. Du machst das Formular also sozusagen bei der Factory bekannt.

Die Factory selber macht folgendes:

Sie hält einen Container von Formularnamen und einen von Forms vor. Ein Formular wird dann z.B. mit:
Delphi-Quellcode:
Initialization
   FormFactory.RegisterForm('Normales Fenster', TForm);
registriert.

Die Factory nimmt also einen String und ein Objekt vom Typ TForm auf. Da jedes Deiner Formulare von TForm abgeleitet ist ist das kein Problem. Diese Registrierung packt deine Factory dann ins 'Lager'.

Wenn Du nun ein Formular haben willst, machst Du folgendes:
Delphi-Quellcode:
var Formular: TForm
begin
   Formular := FormFactory.GetForm('Normales Fenster');
Die Factory sucht nun nach dem String, pickt sich die übergebene Klasse heraus (in dem Fall ein TForm) und erzeugt das ganze Ding. z.B. in einem result := m_FormArray[m_NameArray.IndexOf('Normales Fenster')].Create(self);

Anstelle dem fixen String halt eine Variable.

Da in dem Formarray ja ein Pointer auf die beim Registrieren angegebene Klasse vorliegt und eben kein reguläres TForm kannst Du hierüber alle registrierten Formulare zur Laufzeit anfordern.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat