![]() |
TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Hi,
ich versuch mal zu erklären was ich gerne machen würde. Ich habe ein Programm mit einem Menü als Hauptfenster. Darin gibt es x Einträge die immer für eine Tabelle in einer Datenbank stehen. Das ganz läuft dynamisch. Es gibt also eine "MainForm" die alles notwendige enthält um die Informationen einer Tabelle der Datenbank anzuzeigen. Über eine Abfrage wird nun die Anzahl der Tabellen in der DB Abgefragt und je nach dem wie viele Tabellen da sind Einträge im Menü erstellt. Der Aufruf erfolgt in so fern dynamisch, dass die Form immer mit dem TabellenNamen erzeugt wird und in sich selbst dann die Captions usw. anpasst und die jeweiligen Daten darstellt. Ich habe also stand jetzt 20 Menüpunkte aber nur eine HauptMaske("TMainForm" - Ableitung von "TForm"). Was ich nun gern erreichen würde. Es gibt manche Tabellen wo die Maske einen leicht abweichenden Aufbau zum Standard haben soll. Ich leite mir also in der IDE eine neue Form "TTolleNeueForm" von "TMainForm" ab. Im Menu erstelle ich einen Punkt zum Aufruf händisch. Ich würde jetzt gerne erreichen das beim klick auf den händisch eingefügten Menü Punkt nicht die TMainForm created wird sondern die "TTolleNeueForm". Und das Dynmaisch, also zb. über getclass('T'+Tabellenname), die Forms würden nämlich jeweils wie die Tabellen heißen und über ein RegisterClass im initialize Teil kann ich das dann schön Programmweit abfragen ob es etwas gibt. Nur leider krieg ich das mit dem Create nicht hin. Ich hoffe es ist einigermaßen verständlich was ich vor habe. :oops: Grüße PJM |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Ich habe das mal schnell hingetippt ohne zu testen. Aber so in etwas würde ich das machen, wobei die Funtion GetMainFormClass die entsprechende Formclass ermitteln müsste.
Delphi-Quellcode:
type
TMainFormClass = class of TMainForm; ... var FC: TMainFormClass ; F: TMainForm; begin FC := GetMainFormClass(TableName); F := TC.Create(...); try .... F.ShowModal; finally F.Release; end; end; |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Und was funktioniert an
Delphi-Quellcode:
jetzt nicht?
GetClass('T' + Tabellenname)
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
Entweder man kodiert das hart oder registriert in einer TList/TDictionary die Formualrtypen und durchsucht diese. Wenn man nichts findet, könnte es eine Standard geben. |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
Und über das Tpersistent bekomme ich es nicht gebacken... |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
Du könntest dann einfach aus deinen Menüpunkten immer die selbe Formklasse verwenden und übergibst beim Create einen Parameter, auf den die Form reagieren kann. Je nach Parameter, wird der passende Frame genutzt. |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Hier ein einfaches Beispiel:
Delphi-Quellcode:
procedure TForm1.bt1Click(Sender: TObject);
var F: TPersistentClass; D:TForm; begin F := FindClass('TForm2'); if Assigned(F) then begin Application.CreateForm(TComponentClass(F) , D); D.Show; end; end; |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
Wenn ich so darüber Nachdenke, sollte vielleicht erstmal geklärt werden, ab wann die Anwendung weiß, welche Maske erforderlich ist. Irgendwann muss irgendeine passende Information in der Anwendung ja vorhanden sein. |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Ich habe noch eine Typenprüfung hinzugefügt:
Delphi-Quellcode:
uses
System.TypInfo; ... procedure TForm1.bt1Click(Sender: TObject); var F: TPersistentClass; D:TForm; begin F := FindClass('TForm2'); if Assigned(F) and PTypeInfo(F.ClassInfo).TypeData^.ClassType.InheritsFrom(TCustomForm) then begin Application.CreateForm(TComponentClass(F) , D); D.Show; end; end; |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
Delphi-Quellcode:
type
TMainFormClass = class of TMainForm; var MainFormClass: TMainFormClass; PersistentClass: TPersistentClass; begin MainFormClass := TMainForm; PersistentClass := GetClass('TTolleNeueForm'); if PersistentClass <> nil then MainFormClass := TMainFormClass(PersistentClass); myForm := MainFormClass.Create(Application); end; |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
gelöscht
|
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
Delphi-Quellcode:
if Assigned(PersistentClass) then
begin Assert(PersistentClass.InheritsFrom(TMainForm)); MainFormClass := TMainFormClass(PersistentClass); end; |
AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
Zitat:
Hab mich in den letzten Tagen mehr mit Klassen und insbesondere auch RTTI auseinander gesetzt. Wilkommen in einer neuen Abstraktionsebene :-D Mein Kopf raucht, aber auf eine gute weise :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz