<body>
<p><font face="Arial">In der Hilfe findet man folgendes Beipiel:</font>
<p><font face="Arial">type TControlClass = class of TControl;</font></p>
<p><font face="Arial">function CreateControl(ControlClass: TControlClass; const
ControlName: string; X, Y, W, H: Integer): TControl; <br>
begin <br>
</font> <font face="Arial">Result := ControlClass.Create(MainForm); <br>
with Result do <br>
begin <br>
Parent := MainForm; <br>
Name := ControlName; <br>
SetBounds(X, Y, W, H); <br>
Visible := True; <br>
end; <br>
end;</font>
<p><font face="Arial">Der Funktion CreateControl wird eine Klassenreferenz als
Parameter übergeben. Er bestimmt, welche Art von Steuerelement erstellt wird.
Der Parameter wird anschließend beim Aufruf des Konstruktors verwendet. Da
Klassentypbezeichner Klassenreferenzwerte enthalten, kann im Aufruf von
CreateControl der Bezeichner der Klasse angegeben werden, um eine Instanz vor
ihr zu erstellen:</font>
<p><font face="Arial">CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);</font></p>
<p> </p>
<p><font face="Arial">Ich brauche etwas ähnliches. Ich will eine Routine
schreiben der ich eine von TForm abgeleitete Klasse übergebe. Soweit kein
Problem. Ich möchte das Result <br>
aber in der jeweiligen Formularvariable haben. Wenn ich das mit einem Fenster
meiner Anwendung probiere, bekomme ich für ein Form frmKto: TfrmKto immer eine
Typenunverträglichkeit. Der Rückgabetyp muss also eigentlich auch dem
übergebenen ClassNamen entsprechen.</font></p>
<p><font face="Arial">Hintergrund ist, dass meine Anwendung über 100
verschiedene Forms hat. Da ich nicht will, dass die die ganze Zeit im Speicher
rumhängen, erzeuge ich sie dann wenn sie gebraucht werden, und gebe sie beim
Schließen wieder frei.</font></p>
<p><font face="Arial">Das sieht dann immer so aus:</font></p>
<p><font face="Arial">if frmKto = nil then</font></p>
<p><font face="Arial"> frmKto = TfrmKto.Create(Application)</font></p>
<p><font face="Arial">with frmKto do</font></p>
<p><font face="Arial">...irgendwas</font></p>
<p><font face="Arial">Dafür suche ich einfach eine bessere Variante so in der
Art:</font></p>
<p><font face="Arial">with LoadForm(frmKto,TfrmKto,Application) do</font></p>
<p><font face="Arial">...irgendwas</font></p>
<p><font face="Arial">Kann jemand helfen?</font></p>
<p> </p>
<p><font face="Arial">Mit freundlichen Grüßen</font></p>
<p><font face="Arial">Andreas Käding</font></p>
</body>
<p><font face="Arial">In der Hilfe findet man folgendes Beipiel:</font>
<p><font face="Arial">type TControlClass = class of TControl;</font></p>
<p><font face="Arial">function CreateControl(ControlClass: TControlClass; const
ControlName: string; X, Y, W, H: Integer): TControl; <br>
begin <br>
</font> <font face="Arial">Result := ControlClass.Create(MainForm); <br>
with Result do <br>
begin <br>
Parent := MainForm; <br>
Name := ControlName; <br>
SetBounds(X, Y, W, H); <br>
Visible := True; <br>
end; <br>
end;</font>
<p><font face="Arial">Der Funktion CreateControl wird eine Klassenreferenz als
Parameter übergeben. Er bestimmt, welche Art von Steuerelement erstellt wird.
Der Parameter wird anschließend beim Aufruf des Konstruktors verwendet. Da
Klassentypbezeichner Klassenreferenzwerte enthalten, kann im Aufruf von
CreateControl der Bezeichner der Klasse angegeben werden, um eine Instanz vor
ihr zu erstellen:</font>
<p><font face="Arial">CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);</font></p>
<p> </p>
<p><font face="Arial">Ich brauche etwas ähnliches. Ich will eine Routine
schreiben der ich eine von TForm abgeleitete Klasse übergebe. Soweit kein
Problem. Ich möchte das Result <br>
aber in der jeweiligen Formularvariable haben. Wenn ich das mit einem Fenster
meiner Anwendung probiere, bekomme ich für ein Form frmKto: TfrmKto immer eine
Typenunverträglichkeit. Der Rückgabetyp muss also eigentlich auch dem
übergebenen ClassNamen entsprechen.</font></p>
<p><font face="Arial">Hintergrund ist, dass meine Anwendung über 100
verschiedene Forms hat. Da ich nicht will, dass die die ganze Zeit im Speicher
rumhängen, erzeuge ich sie dann wenn sie gebraucht werden, und gebe sie beim
Schließen wieder frei.</font></p>
<p><font face="Arial">Das sieht dann immer so aus:</font></p>
<p><font face="Arial">if frmKto = nil then</font></p>
<p><font face="Arial"> frmKto = TfrmKto.Create(Application)</font></p>
<p><font face="Arial">with frmKto do</font></p>
<p><font face="Arial">...irgendwas</font></p>
<p><font face="Arial">Dafür suche ich einfach eine bessere Variante so in der
Art:</font></p>
<p><font face="Arial">with LoadForm(frmKto,TfrmKto,Application) do</font></p>
<p><font face="Arial">...irgendwas</font></p>
<p><font face="Arial">Kann jemand helfen?</font></p>
<p> </p>
<p><font face="Arial">Mit freundlichen Grüßen</font></p>
<p><font face="Arial">Andreas Käding</font></p>
</body>
Comment