Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Formulare dynamisch erzeugen per Buttonklick


Flash106 - Do 31.03.05 20:19
Titel: Formulare dynamisch erzeugen per Buttonklick
Hallo,

1. Wie kann ich ein formular dynamisch erzeugen wenn ich auf einen Button klicke?
2. Ich möchte immer wieder auf den Button klicken und ein neues Formular erzeugen können, aber danach auch jedes formular einzeln ansprechen können.
3. Ich möchte, wenn ich auf einen anderen Button klicke, das sich dann alle formular schließen.

Wie realisiere ich sowas am besten???
Danke im vorraus... :)


AXMD - Do 31.03.05 20:35

Suche in: Delphi-Forum, Delphi-Library APPLICATION.CREATEFORM*

AXMD


Flash106 - Do 31.03.05 21:02

hm.. das doofe ist das ich immer ein und das selbe formular damit erzeuge... ich brauche aber unterschiedlichte. Wenn ich z.b. eine button drauf tue der ein info fenster zeigt darf das nicht bei allen forms sein. ich brauch keine instanz vom hauptformular sonder eigenständige formulare...


der_zaehe - Do 31.03.05 21:02

ich bin auch erst kürzlich dahinter gekommen, wie das geht und habe das problem auf meine art und weise gelöst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
...
private
  FensterListe : TStringList;´
...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FensterListe := TStringList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Form2 : TForm2;
begin
  Form2 := TForm2.Create(self);
  Form2.Show;                                    // Weiß net ob das nötig ist, aber schaden kanns net
  FensterListe.AddObject('Bla',Form2);
end;

procedure TForm1.Button2Click(Sender: TObject);  // Alle Forms der Reihe nach schliessen.
var
  i : Integer;
begin
  for i := 0 to FensterListe.Count-1 do
    TForm2(FensterListe.Objects[i]).Close;       // Typenumwandlung net vergessen
end;


ich hab den Code jetzt net getestet aber so ähnlich hat der bei mir funktioniert.
das Application.CreateForm lass für dein dynamisch erstelltes Formular am besten ganz weg.

du kannst die einzelnen Formulare auch unterscheiden, indem du sie unter verschiedenen Namen in die TStringList einträgst. Dann kannst du mit

Delphi-Quelltext
1:
TForm2(FensterListe.Objects[FensterListe.IndexOf(<Name des Fensters, von dir vergeben>)])                    

auf das gewünschte Fenster zugreifen.


ich hoff ich hab dich jetz net missverstanden und du meinst das dynamische Erzeugen unterschiedlicher Formulare.


AXMD - Do 31.03.05 21:11

user profile iconder_zaehe hat folgendes geschrieben:
ich bin auch erst kürzlich dahinter gekommen, wie das geht und habe das problem auf meine art und weise gelöst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
...
private
  FensterListe : TStringList;´
...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FensterListe := TStringList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Form2 : TForm2;
begin
  Form2 := TForm2.Create(self);
  Form2.Show;                                    // Weiß net ob das nötig ist, aber schaden kanns net
  FensterListe.AddObject('Bla',Form2);
end;

procedure TForm1.Button2Click(Sender: TObject);  // Alle Forms der Reihe nach schliessen.
var
  i : Integer;
begin
  for i := 0 to FensterListe.Count-1 do
    TForm2(FensterListe.Objects[i]).Close;       // Typenumwandlung net vergessen
end;


ich hab den Code jetzt net getestet aber so ähnlich hat der bei mir funktioniert.
das Application.CreateForm lass für dein dynamisch erstelltes Formular am besten ganz weg.

du kannst die einzelnen Formulare auch unterscheiden, indem du sie unter verschiedenen Namen in die TStringList einträgst. Dann kannst du mit

Delphi-Quelltext
1:
TForm2(FensterListe.Objects[FensterListe.IndexOf(<Name des Fensters, von dir vergeben>)])                    

auf das gewünschte Fenster zugreifen.


ich hoff ich hab dich jetz net missverstanden und du meinst das dynamische Erzeugen unterschiedlicher Formulare.


Wär's nicht einfacher, nur eine TList zu nehmen? TStringList ist für den Anwendungsfall nicht unbedingt notwendig.

AXMD


der_zaehe - Do 31.03.05 21:18

mist
stimmt :)
an den object-typ hab ich grad gar net gedacht. ich programmier noch net soo lange (3/4 jahr?) und hab dem entsprechend delphi-erfahrung :D
also: TList statt TStringList


cutelaw - Fr 01.04.05 08:43

joa, nimmm auf alle fälle TList. und beim button 2 sollteste die formulare auch wieder freigeben, die verbraten sonst weiterhin speicher. oder in einer liste merken und bei button1 drauf prüfen, und ggf. die bereits vorhandenen unbenutzten forms wieder verwenden.


der_zaehe - Fr 01.04.05 22:30

ach, deshalb musste ich mich immer wundern, warum meine programme in laufzeit immer mehr arbeitsspeicher verbraucht haben user defined image


Muetze1 - Sa 02.04.05 22:58

Moin!

Und warum nicht gleich eine TObjectList?? Und wenn du OwnsObjects auf True lässt, dann wird das Formular beim Delete() sogar automatisch freigegeben...

MfG
Muetze1


der_zaehe - So 03.04.05 12:51

irre! das brauch ich! user defined image
zur erklärung: ich bin anfaenger und noch nicht über alle kompos und objekt-typen informiert.


Muetze1 - So 03.04.05 14:26

Moin!

user profile iconder_zaehe hat folgendes geschrieben:
zur erklärung: ich bin anfaenger und noch nicht über alle kompos und objekt-typen informiert.


Ging auch eher in Richtung AXMD, der das ganze vorgeschlagen hatte. Es war nicht in Bezug auf dich gemeint.

MfG
Muetze1