Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Forms Dynamisch Erstellen (https://www.delphipraxis.net/69289-forms-dynamisch-erstellen.html)

Real_Thunder 12. Mai 2006 22:58


Forms Dynamisch Erstellen
 
Moin erstmal, ich bin es mal wieder

Habe nach einer Antwort gesucht, hier im forum nichts gefunden, und ebens wenig bei google

hier mein problem..

meine anwendung soll während der laufzeit eine beliebe anzahl von forms erstellen können....
also quasi wie z.b. icq..

also muß ich die forms ja zur laufzeit erstellen....
soweit auch noch kein problem...

nun möchte ich aber eine undefinierte anzahl von forms erstellen lassen...

und da ich soweit ich weiß für jede form ne var brauche, und sie vorher declariert werden müssen,
ist ja ein mindestwert gegeben..

Könnte mir jemand erklären wie ich es so programmieren könnte das meine anwendung praktisch unbegrente formen erstellen kann ?

Vielen Dank im vorrau

Nikolas 12. Mai 2006 23:01

Re: Forms Dynamisch Erstellen
 
Schreib dir ein Klasse, die alle Funktionen des Formulars beinhaltet, also erstellen, Komponenten, benötigte Funktionen, usw.
Im Programm könntest du dann ein dynamisches Array aus diesen Klassen machen und bei Bedarf das Array vergrößern.

Delphi-Quellcode:
MyFormClass= TClass
...

List: array of MyFormclass;

// Neues Form:
Setlength(list, length(list+1)
List[length(list)]:= Myformclass.create;
usw...

Real_Thunder 12. Mai 2006 23:15

Re: Forms Dynamisch Erstellen
 
Danke erstmal hört sich ja logisch an, doch habe ich keinen Plan wie ich das Anstellen soll...

Könntest du es ein wenig erläutern ?

bin delphi neuling... eigendlich oop neuling.. habe nur mit anderen programmiersprachen zu tun gehabt......
wie meinst du das mit klasse die alle funktionen enthält....

naja werde es erstmal so veruchen, wie es mir meine logic sagt...

nat 12. Mai 2006 23:15

Re: Forms Dynamisch Erstellen
 
kleine korrektur:
Zitat:

List: array of MyFormclass;

// Neues Form:
Setlength(list, length(list)+1)
List[high(list)]:= Myformclass.create;
usw...
:warn: :wink:

Real_Thunder 12. Mai 2006 23:47

Re: Forms Dynamisch Erstellen
 
Wo muß ich
Delphi-Quellcode:
MyFormClass= TClass
eintragen, habe es in type versucht will aber nicht...

binwie gesagt bin auf diesem gebiet neu...
und bitte keine sprüche wie grundlagen lernen etc.

Matze 12. Mai 2006 23:51

Re: Forms Dynamisch Erstellen
 
Moin

Zitat:

Zitat von Real_Thunder
[...] habe es in type versucht will aber nicht...

Das müsste eigentlich schon gehen. Beispiel:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  MyFormClass = TClass;

Real_Thunder 13. Mai 2006 00:18

Re: Forms Dynamisch Erstellen
 
Danke Matthias,

habe nun volgenes versiucht
Delphi-Quellcode:
unit hauptform;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
  MyFormClass: TClass;
  end;

type
  MyFormClass = TClass;

var
  Form1: TForm1;
  List: array of MyFormclass;





implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Neues Form:
  Setlength(list, length(list+1)
  List[length(list)]:= Myformclass.create;
end;

end.
Allerdings erhalte ich diese fehlermeldung:
[Fehler] hauptform.pas(40): E2010 Inkompatible Typen: 'TClass' und 'TObject'

soganz habe ich das prinzip noch nicht verstanden...
Sorry, aber wie gesagt, bin sehr wissbegierieg aber halt noch ein newbee...

Matze 13. Mai 2006 00:34

Re: Forms Dynamisch Erstellen
 
Hallo,

wenn es dir um gewöhnliche Formulare geht, kannst du es so machen:

Delphi-Quellcode:
type
  MyForm = TForm;

var
  List: array of TForm;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Neues Form:
  Setlength(List, high(List) + 1);
  List[high(list)]:= MyForm.Create(Self);
end;
Attribute kannst du dann so setzen;

Delphi-Quellcode:
List[0].Width := 500;
List[0].Height:= 200;
List[0].Show;

List[1]. ...
Je nach Anzahl der Formulare. Freigeben geht dann einfach so:

Delphi-Quellcode:
FreeAndNil(List[x]);

Grüße

nat 13. Mai 2006 00:42

Re: Forms Dynamisch Erstellen
 
also jetzt ma von vorne :)

ich würde mir mein formular komplett so designen wie ichs gerne möchte.
dann speichere ich die unit und binde sie in meine main-unit ein.
gehen wir ma von der standard namesvergebung aus.
mein dynamisch erzeugtes form (dein s.g. chat-fenster bei icq)soll ma
form2 in der unit unit2 sein. dann fügst du bei deinem projekt
(meist ja form1 in unit1) in der uses klausel "unit2" hinzu.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Unit2, Windows, Messages, ...;
dann deklarierst du dir n array der die ganzen dynamisch erstellten
forms aufnimmt.
Delphi-Quellcode:
var
  FormList: array of TForm2;
und wenn du ne neue instanz von form2 erstellt dann vergrößerst du
den array um ein element und speicherst es da.
Delphi-Quellcode:
var
  frm: TForm2;
begin
  frm := TForm2.Create;
  frm.Show;

  setlength(FormList, length(FormList)+1);
  FormList[high(FormList)] := frm;
end;
wenn dein prog beendet wird oder du aus einem anderen grund alle
instanzen von form2 freigeben willst sollte das so aussehen
(z.B. in OnDestroy von deinem form1)
Delphi-Quellcode:
var
  i: integer;
begin
  for i:=0 to high(FormList) do
    FormList[i].free;
  setlength(FormList, 0);
end;

edit: da war wohl jemand schneller als ich...

Real_Thunder 13. Mai 2006 01:12

Re: Forms Dynamisch Erstellen
 
Jups, vielen dank es klappt... ihr müßt mich doch nun alle für völlig doof halten....

Naja nun habe ich es verstanden, (und nicht nur doof abgetippt bzw copy & paste)

ist ja auch an sich logisch, wenn man eine var für nen objekt braucht, das man dafr ein dyn array benutzt..

Da war noch ein Kleiner fehler drin, der sender hat bei create gefehlt...

so und für alle die genauso doof wie ich sind und das selbe prblem haben, hier die Komplettlösung:


Delphi-Quellcode:
unit unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, unit2; // Hier die Unit/Form eintage
                                      // die immer wieder geöffnet werden soll
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private

  public

  end;

var
  Form1: TForm1;
  FormList: array of TForm2;  // Ein Array erzeugen mit den Werten von TForm2

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm2;                     // Declaration für TForm2
begin
  frm := TForm2.Create(self);      // TForm2 Erstellen
  frm := frm.Show;                 // TForm2 Anzeigen


  setlength(FormList, length(FormList)+1); // Array um ein Element erhöhrn
  FormList[high(FormList)] := frm;
end;
end.
unit2:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    RichEdit1: TRichEdit;
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.

Noch mal viele Dank anAlle die mir geholfen haben...
Ich gehe mich jetzt erstma ne runde ich die ecke stelen und schämen


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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