![]() |
auf dynamische lokal erstellte form zugreifen
Hallo Community,
Ich habe mir eine dynamische Form lokal erstellt:
Delphi-Quellcode:
Nun möchte ich gern nach dem Erstellen der Form in anderen Procedures auf diese zugreifen. Wenn ich überhaupt irgendeine Informationen dafür vorher speichern muss, lege ich es in meinem record UserData.Data ab. Kann ich irgendwie ganz einfach auf eine Form Variable zugreifen und von dort aus die Panels und das Image ansprechen oder muss ich das mithilfe von SendMessage regeln (wenn nur so, dann bitte wie genau?)?
with TF_Session.Create(nil) do
begin Panel1.Caption:=bla; StatusIcon:=TIcon.Create; try IL_Icons.GetIcon(Index,icon); I_Status.Picture.Icon:=icon; finally icon.Free; end; UserData.Data:=Handle; // kann auch TForm oder so speichern, was ich halt brauche Panel2.Caption:=blabla; Caption:='hehe^^'; Show; end; Bitte um Hilfe... |
Re: auf dynamische lokal erstellte form zugreifen
Warum erstellst du sie lokal? Leg doch die Instanzvariable in deiner FormKlasse ab. Wenn du mehrere Forms dynamisch erstellen willst, dann kannst du ja ein Array von der Instanzvariable erstellen oder eventuell auch eine TList (TObjectList).
Lokale Variablen werden nach dem Aufruf der Prozedur/Funktion entfernt, du kannst also nicht mehr darauf zugreifen ;) //edit: Wenn du nur lokale Variablen hast, dann kannst du nur Messages schicken. Wie das genau geht, verrät dir Luckie in seinem ![]() |
Re: auf dynamische lokal erstellte form zugreifen
Hallo,
das funktioniert so:
Delphi-Quellcode:
Malo's Vorschlag mit den Messages ist zwar grundsätzlich möglich aber eigentlcih ziemlich daneben. Wenn das Formular als Paramenter übergeben wird benötigt man auch keine privaten Felder.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,unit2; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } procedure ShowText(aForm : TForm2); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var aForm : TForm2; begin aForm:=TForm2.create(Nil); Try ShowText(aForm); // Auch Formularen können als Parameter übergeben werden. Finally aForm.Release; aForm:=Nil; end; end; procedure TForm1.ShowText(aForm: TForm2); begin ShowMessage(AForm.Text); end; end. |
Re: auf dynamische lokal erstellte form zugreifen
Hallo,
das funktioniert so:
Delphi-Quellcode:
Malo's Vorschlag mit den Messages ist zwar grundsätzlich möglich aber eigentlcih ziemlich daneben. Wenn das Formular als Paramenter übergeben wird benötigt man auch keine privaten Felder.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,unit2; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } procedure ShowText(aForm : TForm2); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var aForm : TForm2; begin aForm:=TForm2.create(Nil); Try ShowText(aForm); // Auch Formulare können als Parameter übergeben werden. Finally aForm.Release; aForm:=Nil; end; end; procedure TForm1.ShowText(aForm: TForm2); begin ShowMessage(AForm.Text); end; end. [edit] MAGIC zweimal das gleiche Posting :shock: [/edit] |
Re: auf dynamische lokal erstellte form zugreifen
Zitat:
|
Re: auf dynamische lokal erstellte form zugreifen
Zitat:
Delphi-Quellcode:
Wenn Du auch außerhalb der Methode Button1Click auf
procedure TForm1.Button1Click(Sender: TObject);
var aForm : TForm2; begin aForm:=TForm2.create(Nil); // <-- Hier wird das Form erzeugt Try // Hier ist nach der Erzeugung des Formulars ShowText(aForm); // Auch Formulare können als Parameter übergeben werden. Finally aForm.Release; aForm:=Nil; end; end; das Form zugreifen möchtest ist der Ansatz das Form lokal zu erzeugen äußerst ungünstigt. Dann solltest Du ein privates Feld verwenden. |
Re: auf dynamische lokal erstellte form zugreifen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe auch vor einiger Zeit ein Programm, in denen ich eine Form oft brauchte, gebaut. Ich habe dann irgendwo das im Anhang befindliche Tutorial gefunden, was sehr hilfreich und leicht verständlich ist.
Was er sowas, was du brauchst? ~~~ Anhang: |~| Pointer-multipleForms.zip |
Re: auf dynamische lokal erstellte form zugreifen
Genial, danke !
|
Re: auf dynamische lokal erstellte form zugreifen
mmh, dann halt als Extra-Post^^
Ich habe es jetzt erst mal mit einem array of TForm versucht und dabei folgendes Problem entdeckt:
Delphi-Quellcode:
Wieso zeigt mir der Compiler bei SetLength "inkompatible Typen" an?
procedure TF_Session.DeleteArray(var a:array of TF_Session; Index:Integer);
begin a[Index]:=a[High(a)]; { -- letze Form aus array entfernen -- } FreeAndNil(a[Length(a)-1]); SetLength(a,Length(a)-1); end; [edit] Habe das Problem jetzt lösen können^^ Ich musste vorher noch den ArrayTyp als Parameter anders angeben:
Delphi-Quellcode:
[/edit]
type
TFormArray = array of TForm; procedure DeleteArray(var a:TFormArray; Index:Integer); |
Re: auf dynamische lokal erstellte form zugreifen
Ich bins noch mal^^
Ich habe jetzt eine weitere Variante zum dynamischen Erstellen von einer Form:
Delphi-Quellcode:
Die Variable F_Options ist ja bereits durch meine VCL-Form deklariert, d.h. ich brauche keine Extra-Variable lokal zu deklarieren. Wenn ich jetzt nicht mehr als eine erstellte Form habe, kann ich von überall daraufzugreifen. Da ich aber gern mehrere Versionen meiner Form darstellen möchte, gibt es wieder das Problem mit dem Zugriff auf die bestimmte Form. Ich hatte mir überlegt (bin aber stark dagegen, jedoch ist es meine einzige Möglichkeit, meiner Meinung nach, abgesehen von Messages), mithilfe von FindComponent über den Komponentenname der Form zu arbeiten.
if (F_Options = nil) then
begin F_Options:=TF_Options.Create(nil); //F_Options.Name:='unique 1'; F_Options.Show; end; procedure TF_Options.FormClose(Sender: TObject; var Action: TCloseAction); begin F_Options:=nil; Action:=caFree; end; Hat jemand von euch eine andere, bessere Idee? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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 by Thomas Breitkreuz