Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Form aus String erstellen (https://www.delphipraxis.net/170594-form-aus-string-erstellen.html)

HolgerCW 25. Sep 2012 10:24

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:
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;
Wie kann ich die richtige Klasse der Form bei den Fragezeichen einfügen ?

Gruss

Holger

vagtler 25. Sep 2012 10:28

AW: Form aus String erstellen
 
Stichwort Factory

HolgerCW 25. Sep 2012 10:30

AW: Form aus String erstellen
 
Hallo,

danke für die schnelle Antwort, aber kannst mir ein bisschen mehr helfen ...

Gruss

Holger

shmia 25. Sep 2012 10:48

AW: Form aus String erstellen
 
Kuck mal hier in der Code-Library
http://www.delphipraxis.net/20198-fo...-erzeugen.html

HolgerCW 25. Sep 2012 11:08

AW: Form aus String erstellen
 
Danke,

aber wo kommt denn dieses "initialization" im Delphi-Code hin ?

Gruss

Holger

vagtler 25. Sep 2012 11:17

AW: Form aus String erstellen
 
Die Begriffe delphi und initialization mal in Google einzutippen kommt Dir nicht in den Sinn?

mkinzler 25. Sep 2012 11:23

AW: Form aus String erstellen
 
Wer macht den sowas? :shock:
Am Ende rätst du ihm noch, dass er die Doku liest. :wink:

HolgerCW 25. Sep 2012 11:33

AW: Form aus String erstellen
 
Wenn ich initialization unter die uses packke kommt eine Fehlermeldung . erwartet, aber ; erhalten ...

HolgerCW 25. Sep 2012 12:04

AW: Form aus String erstellen
 
Habe jetzt folgenden Code zusammengebaut:

Code:
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;
Wenn ich aber nun im FormClose-Ereignis der Form folgenden Code hinterlege:

Code:

FreeandNil(FM_Material);
reagiert das nicht mehr. Was ist zu tuen?

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);

Sir Rufo 25. Sep 2012 12:06

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.

HolgerCW 25. Sep 2012 12:16

AW: Form aus String erstellen
 
Vielleicht mal ein wenig Beispielcode was gemeint ist mit die Variable mit der Instanz übergeben.

vagtler 25. Sep 2012 12:28

AW: Form aus String erstellen
 
Zitat:

Zitat von mkinzler (Beitrag 1184331)
[...] Am Ende rätst du ihm noch, dass er die Doku liest. :wink:

Das wäre jetzt aber wirklich zu viel verlangt... :mrgreen:

shmia 25. Sep 2012 12:29

AW: Form aus String erstellen
 
Zitat:

Zitat von HolgerCW (Beitrag 1184336)
P.S: Eigentlich wollte ich ohne so eine Registrierung auskommen. Damit das voll dynamisch ist.

Man kann sich nicht duschen ohne nass zu machen.

Ich würde folgende Strategie empfehlen:
1.) prüfen, ob das Formular schon angelegt wurde
Delphi-Quellcode:
{**************************************************************************
 * 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;
2.) Falls das Formular schon existiert mit
Delphi-Quellcode:
.BringToFront()
nach vorne bringen
3.) Falls das Formular noch nicht existiert wird es dynamisch erzeugt
so wie in der Code-Library beschrieben

HolgerCW 25. Sep 2012 12:36

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:

FM_Material.Close; //Beispiel
Nur das klappt ja nun nicht mehr.

Gruss

Holger

Sir Rufo 25. Sep 2012 13:09

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:
MeineForm
speicherst, dann würde ich das auch mal mit
Delphi-Quellcode:
MeineForm.Close
versuchen.

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.

HolgerCW 25. Sep 2012 13:18

AW: Form aus String erstellen
 
Kann man der dynamischen Form nicht beim erstellen irgendwie den "Originalen"-Namen mitgeben ?

Medium 25. Sep 2012 13:19

AW: Form aus String erstellen
 
Name der Form <> Name einer Variablen, die auf die Instanz zeigt!

Bummi 25. Sep 2012 13:24

AW: Form aus String erstellen
 
StringList.addObject ??

Sir Rufo 25. Sep 2012 13:34

AW: Form aus String erstellen
 
Zitat:

Zitat von HolgerCW (Beitrag 1184355)
Kann man der dynamischen Form nicht beim erstellen irgendwie den "Originalen"-Namen mitgeben ?

Nö, aber man kann die in dieser globalen Variablen speichern.

Delphi-Quellcode:
FM_Material := ...

HolgerCW 25. Sep 2012 13:39

AW: Form aus String erstellen
 
Also funktioniert das nur mit globalen Variablen ?

So ein Zugriff geht ja auch nicht:

Code:

FM_Material.LA_Material_Langtext.Caption := '-';
FM_Material.WB_Browser.Navigate('about:blank');
FM_Material.DBG_Material.SetFocus;
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.

Sir Rufo 25. Sep 2012 13:48

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

Medium 25. Sep 2012 14:21

AW: Form aus String erstellen
 
Zitat:

Zitat von HolgerCW (Beitrag 1184362)
Ich kann ja nicht einfach aus FM_Material -> MeineForm machen etc.

Warum?

HolgerCW 26. Sep 2012 06:58

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

Bummi 26. Sep 2012 07:46

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;

DeddyH 26. Sep 2012 08:35

AW: Form aus String erstellen
 
Oder die benannten Instanzen eliminieren und Dir eine Methode schreiben, die je nach Formklasse die Einstellungen vornimmt.

HolgerCW 26. Sep 2012 08:54

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:
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;
Gruss

Holger

Medium 26. Sep 2012 08:59

AW: Form aus String erstellen
 
Edit: Unfug gelöscht, hab die Create-Situation nicht beachtet.

HolgerCW 26. Sep 2012 09:19

AW: Form aus String erstellen
 
Jemand noch eine Idee ?

vagtler 26. Sep 2012 09:36

AW: Form aus String erstellen
 
Zitat:

Zitat von HolgerCW (Beitrag 1184470)
[...] Nur sind auch die Programmierungen, welche auf die FormAB etc. zugreifen schon erstellt. Heisst es steht überall FormAB.Label1.Caption := 'Text' [...]

Und hier zeigt sich wieder einmal ganz besonders eindrucksvoll, was passiert, wenn man zuerst programmiert und dann nachdenkt.

Ein Haus wird auch erst geplant und dann gebaut...

HolgerCW 26. Sep 2012 13:20

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 ...

Bummi 26. Sep 2012 13:29

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.

Sir Rufo 26. Sep 2012 14:14

AW: Form aus String erstellen
 
Zitat:

Zitat von HolgerCW (Beitrag 1184558)
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 ...

Zeig doch mal den Source von FM_Material und alle weiteren Quellen, wo du auf FM_Material verweist

HolgerCW 28. Sep 2012 08:12

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 17:50 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