AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

auf dynamische lokal erstellte form zugreifen

Ein Thema von Nogge · begonnen am 26. Mai 2005 · letzter Beitrag vom 21. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2   
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#1

auf dynamische lokal erstellte form zugreifen

  Alt 26. Mai 2005, 17:32
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...
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#2

Re: auf dynamische lokal erstellte form zugreifen

  Alt 26. Mai 2005, 17:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: auf dynamische lokal erstellte form zugreifen

  Alt 26. Mai 2005, 18:05
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#4

Re: auf dynamische lokal erstellte form zugreifen

  Alt 26. Mai 2005, 18:05
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 [/edit]
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#5

Re: auf dynamische lokal erstellte form zugreifen

  Alt 26. Mai 2005, 18:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#6

Re: auf dynamische lokal erstellte form zugreifen

  Alt 26. Mai 2005, 18:18
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Jarmen_Kell

Registriert seit: 17. Mär 2005
188 Beiträge
 
#7

Re: auf dynamische lokal erstellte form zugreifen

  Alt 26. Mai 2005, 18:21
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
Angehängte Dateien
Dateityp: zip pointer-multipleforms_211.zip (15,3 KB, 27x aufgerufen)
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#8

Re: auf dynamische lokal erstellte form zugreifen

  Alt 27. Mai 2005, 05:43
Genial, danke !
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#9

Re: auf dynamische lokal erstellte form zugreifen

  Alt 27. Mai 2005, 12:41
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]
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#10

Re: auf dynamische lokal erstellte form zugreifen

  Alt 19. Jul 2005, 11:03
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 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