Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi auf dynamische lokal erstellte form zugreifen (https://www.delphipraxis.net/46532-auf-dynamische-lokal-erstellte-form-zugreifen.html)

Nogge 26. Mai 2005 17:32


auf dynamische lokal erstellte form zugreifen
 
Hallo Community,
Ich habe mir eine dynamische Form lokal erstellt:
Delphi-Quellcode:
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;
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?)?
Bitte um Hilfe...

malo 26. Mai 2005 17:39

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 Win32-API-Tutorial ;)

Jens Schumann 26. Mai 2005 18:05

Re: auf dynamische lokal erstellte form zugreifen
 
Hallo,
das funktioniert so:
Delphi-Quellcode:
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.
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.

Jens Schumann 26. Mai 2005 18:05

Re: auf dynamische lokal erstellte form zugreifen
 
Hallo,
das funktioniert so:
Delphi-Quellcode:
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.
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.

[edit] MAGIC zweimal das gleiche Posting :shock: [/edit]

Nogge 26. Mai 2005 18:11

Re: auf dynamische lokal erstellte form zugreifen
 
Zitat:

Nun möchte ich gern nach dem Erstellen der Form in anderen Procedures auf diese zugreifen.
D.h. deine Methode, Jens Schumann, funktioniert nicht so, wie das gern hätte^^ Ich werde mal schauen, ob ein "array of TForm" für meine Zwecke angebracht ist.

Jens Schumann 26. Mai 2005 18:18

Re: auf dynamische lokal erstellte form zugreifen
 
Zitat:

Zitat von Nogge
Zitat:

Nun möchte ich gern nach dem Erstellen der Form in anderen Procedures auf diese zugreifen.
D.h. deine Methode, Jens Schumann, funktioniert nicht so, wie das gern hätte^^ Ich werde mal schauen, ob ein "array of TForm" für meine Zwecke angebracht ist.

Delphi-Quellcode:
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;
Wenn Du auch außerhalb der Methode Button1Click auf
das Form zugreifen möchtest ist der Ansatz das Form lokal zu erzeugen
äußerst ungünstigt. Dann solltest Du ein privates Feld verwenden.

Jarmen_Kell 26. Mai 2005 18:21

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

Nogge 27. Mai 2005 05:43

Re: auf dynamische lokal erstellte form zugreifen
 
Genial, danke !

Nogge 27. Mai 2005 12:41

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:
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;
Wieso zeigt mir der Compiler bei SetLength "inkompatible Typen" an?
[edit] Habe das Problem jetzt lösen können^^ Ich musste vorher noch den ArrayTyp als Parameter anders angeben:
Delphi-Quellcode:
type
  TFormArray = array of TForm;

procedure DeleteArray(var a:TFormArray; Index:Integer);
[/edit]

Nogge 19. Jul 2005 11:03

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:
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;
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.
Hat jemand von euch eine andere, bessere Idee?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 1 von 2  1 2      

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