Delphi-Version: 2006
Form aus String erstellen
Hallo zusammen,
habe zwei Formen als *.pas - Datei erstellt. Jetzt möchte ich diese erstellen lassen, wenn in einer String-Variable der Name der entsprechenden Form steht. Folgendes habe ich schon erstellt:
Code:
Wie kann ich die richtige Klasse der Form bei den Fragezeichen einfügen ?
var
Form_Name: String; MeineForm: TForm; If Form_Name <> '' then begin MeineForm := TForm(Form_Name); If MeineForm = nil then Application.CreateForm(???, MeineForm); MeineForm.Show; end; Gruss Holger |
AW: Form aus String erstellen
Stichwort Factory
|
AW: Form aus String erstellen
Hallo,
danke für die schnelle Antwort, aber kannst mir ein bisschen mehr helfen ... Gruss Holger |
AW: Form aus String erstellen
Kuck mal hier in der Code-Library
http://www.delphipraxis.net/20198-fo...-erzeugen.html |
AW: Form aus String erstellen
Danke,
aber wo kommt denn dieses "initialization" im Delphi-Code hin ? Gruss Holger |
AW: Form aus String erstellen
Die Begriffe delphi und initialization mal in Google einzutippen kommt Dir nicht in den Sinn?
|
AW: Form aus String erstellen
Wer macht den sowas? :shock:
Am Ende rätst du ihm noch, dass er die Doku liest. :wink: |
AW: Form aus String erstellen
Wenn ich initialization unter die uses packke kommt eine Fehlermeldung . erwartet, aber ; erhalten ...
|
AW: Form aus String erstellen
Habe jetzt folgenden Code zusammengebaut:
Code:
Wenn ich aber nun im FormClose-Ereignis der Form folgenden Code hinterlege:
var
Form_Name, DatMod_Name: String; MeineForm: TForm; MeineForm_Klasse: TComponentClass; begin Form_Name := 'FM_Material'; //Als Beispiel RegisterClass(TFM_Material); MeineForm_Klasse := TComponentClass(FindClass('T' + Form_Name)); MeineForm := TForm(FindComponent(Form_Name)); If MeineForm = nil then Application.CreateForm(MeineForm_Klasse, MeineForm); MeineForm.Show;
Code:
reagiert das nicht mehr. Was ist zu tuen?FreeandNil(FM_Material); P.S: Eigentlich wollte ich ohne so eine Registrierung auskommen. Damit das voll dynamisch ist. Dann kann ich auch gleich folgendes machen:
Code:
If MeineForm = nil then Application.CreateForm(TFM_Material, FM_Material); |
AW: Form aus String erstellen
Vielleicht mal die Variable mit der Instanz übergeben?
upps, das ist ja noch schlimmer als gedacht. Im OnClose gibt es einen Parameter den man mit caFree bestücken kann. Allerdings weiß die Form-Instanz ja nicht in welcher Instanz-Variablen du die überall gespeichert hast und kann daher diese auch nicht auf nil setzen. |
AW: Form aus String erstellen
Vielleicht mal ein wenig Beispielcode was gemeint ist mit die Variable mit der Instanz übergeben.
|
AW: Form aus String erstellen
Zitat:
|
AW: Form aus String erstellen
Zitat:
Ich würde folgende Strategie empfehlen: 1.) prüfen, ob das Formular schon angelegt wurde
Delphi-Quellcode:
2.) Falls das Formular schon existiert mit
{**************************************************************************
* NAME: FindForm * DESC: Sucht in Screen.Forms nach einem Formular mit der übergebenenen * Formularklasse. Findet das erste Formular in Screen.Forms das * von dieser Klasse abgeleitet ist. Weitere Instanzen können nicht * gefunden werden. *************************************************************************} function FindForm(FormClass: TFormClass): TForm; var iForm: Integer; begin Result := nil; for iForm := 0 to Screen.FormCount-1 do begin if Screen.Forms[iForm] is FormClass then begin Result := Screen.Forms[iForm]; Break; end; end; end;
Delphi-Quellcode:
nach vorne bringen
.BringToFront()
3.) Falls das Formular noch nicht existiert wird es dynamisch erzeugt so wie in der Code-Library beschrieben |
AW: Form aus String erstellen
Ok,
aber wenn ich die Form dynamisch erstellt habe, wie spreche ich diese dann an. Mit dem ursprünglichen Form-Namen geht es ja nicht mehr. Soll heissen, wie kann ich aus anderen Prozeduren auf die erstellte Form zugreifen ? Vorher ging es ja mit:
Code:
Nur das klappt ja nun nicht mehr.FM_Material.Close; //Beispiel Gruss Holger |
AW: Form aus String erstellen
Wenn ich auf etwas zurückgreifen möchte, dann muss ich mir das merken, und auch merken wo ich das gemerkt habe.
Wenn du die Referenz auf die Form in
Delphi-Quellcode:
speicherst, dann würde ich das auch mal mit
MeineForm
Delphi-Quellcode:
versuchen.
MeineForm.Close
Aber Achtung: Die Standard Variablen für Formulare sind globale Variablen und somit für alle erreichbar. Allerdings würde ich eh davon abraten bei einer dynamischen Erstellung dieses in globalen Variablen abzulegen. Irgendwo wird es erzeugt und von dort wird die Referenz einfach weitergereicht an die, die es brauchen. |
AW: Form aus String erstellen
Kann man der dynamischen Form nicht beim erstellen irgendwie den "Originalen"-Namen mitgeben ?
|
AW: Form aus String erstellen
Name der Form <> Name einer Variablen, die auf die Instanz zeigt!
|
AW: Form aus String erstellen
StringList.addObject ??
|
AW: Form aus String erstellen
Zitat:
Delphi-Quellcode:
FM_Material := ...
|
AW: Form aus String erstellen
Also funktioniert das nur mit globalen Variablen ?
So ein Zugriff geht ja auch nicht:
Code:
Der obige Code existiert schon. Nur wenn ich nun die Form FM_Material dynamisch erstelle, weiß ich nicht wie ich diese ganzen Zugriffe anpassen kann. Ich kann ja nicht einfach aus FM_Material -> MeineForm machen etc.FM_Material.LA_Material_Langtext.Caption := '-'; FM_Material.WB_Browser.Navigate('about:blank'); FM_Material.DBG_Material.SetFocus; |
AW: Form aus String erstellen
Das funktioniert nicht nur mit globalen Variablen, aber es muss halt entsprechend programmiert sein, damit es ohne funktioniert.
Globale Variablen sind zwar ein sehr einfacher aber auch ein sehr anfälliger Weg. Darum wird dieser idR auch nicht beschritten - öh sollte :) Vielleicht kannst du ja mal schildern, was du genau erreichen willst, dann kann man da schon eher etwas zu sagen, wie man die Dynamik ohne globale Falle realisiert |
AW: Form aus String erstellen
Zitat:
|
AW: Form aus String erstellen
Hier nochmal was ich eigentlich will:
Ich habe eine TreeView-Baumstruktur. Wenn der User nun auf node1 klickt soll die FormAB erstellt werden. Klickt der User auf node2 soll die FormCD erstellt werden. Ich möchte aber nicht in dem Ereignis des TreeViews fest einprogrammieren, welche Form erstellt werden soll, sondern hinterlege die Information in einer Datenbank. Soll heißen. Der User klickt auf node1, es wird in der Datenbank nachgeschaut welche Form geöffnet werden soll. (Dort steht der Name der Form) und dementsprechend wird dann die Form erstellt. Die Formen habe ich aber alle schon in Delphi designed. Nun soll die Form mit Hilfe des Formnamens erstellt werden. Nur sind auch die Programmierungen, welche auf die FormAB etc. zugreifen schon erstellt. Heisst es steht überall FormAB.Label1.Caption := 'Text' Wenn ich die FormAB, aber wie in diesem Thema erstelle, kann ich nicht mehr mit FormAB.Label1.Caption die Form steuern. Was muss ich abändern, damit es klappen kann ? Gruss Holger |
AW: Form aus String erstellen
Als Schmuddelnötlösung könntest Du in den Construktoren Deiner Forms etwas in der Art einbauen.
Delphi-Quellcode:
Constructor TFormA.Create(AOwner:TComponent); // override
begin inherited; FormA := Self; end; |
AW: Form aus String erstellen
Oder die benannten Instanzen eliminieren und Dir eine Methode schreiben, die je nach Formklasse die Einstellungen vornimmt.
|
AW: Form aus String erstellen
Schmuddelnötlösung funktioniert.
Jetzte würde ich gerne hier noch die Registrierung so hinbekommen, das ich dies nicht fest vorbelegen muss ? Geht das ? Hier der Code:
Code:
Gruss
var
Form_Name: String; MeineForm: TForm; MeineForm_Klasse: TComponentClass; begin ... Form_Name := 'FM_Material' //Beispiel RegisterClass(TFM_Material); //Das hier würde ich gerne variabel gestalten MeineForm_Klasse := TComponentClass(FindClass('T' + Form_Name)); MeineForm := TForm(FindComponent(Form_Name)); If MeineForm = nil then Application.CreateForm(MeineForm_Klasse, MeineForm); MeineForm.Show; Holger |
AW: Form aus String erstellen
Edit: Unfug gelöscht, hab die Create-Situation nicht beachtet.
|
AW: Form aus String erstellen
Jemand noch eine Idee ?
|
AW: Form aus String erstellen
Zitat:
Ein Haus wird auch erst geplant und dann gebaut... |
AW: Form aus String erstellen
Das hilft mir jetz auch nicht weiter.
Es klappt schon, nur mit der Registrierung gefällt mir noch nicht. Wüsste auch nicht was ich ohne vorherige Programmierung da hätte besser machen können bei der Registrierung. Weitere Ideen willkommen, zwecks der variablen Registrierung ... |
AW: Form aus String erstellen
Du musst Deine Forms ja ohnehin alle von Hand erstellen, häng einfach unten einen
initilization Abschnitt dran mit der Registrierung, dann ist alles sauber verräumt. |
AW: Form aus String erstellen
Zitat:
|
AW: Form aus String erstellen
Hallo Bummi,
das mit initilization war die Lösung. Vielen dank dafür. Die Lösung gefällt mir und somit kann das Thema hier geschlossen werden. Vielen dank an alle für die Hilfen. MfG Holger |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz