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.