Delphi-PRAXiS

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 Dynamisches Formular (https://www.delphipraxis.net/23609-dynamisches-formular.html)

undertaker 6. Jun 2004 12:24


Dynamisches Formular
 
Ich bin dabei ein Chatprogramm zu entwickeln, in dem es auch möglich sein soll einen privatchat zu öffnen. Da ich nicht weiß, wie viele privatchats ein user aufmacht, sollen die Formulare dafür dynamisch erstellt werden. Ich hab mich hier im Forum mal umgesehen und zwei Lösungen gefunden, die aber beid noch nicht so funktionieren, wie ich es mir wünsche.

Lösung 1 (aus der Code-Libary):


Code:
initialization
   RegisterClass(TMeinFormular66);
end;
Code:
function CreateComponentByClassName(const name:string; AOwner:TComponent):TComponent;
begin
   // Sollte die Klasse mit dem Namen "name" nicht registriert worden sein,
   // dann wird in FindClass eine Exception ausgelöst
   Result := TComponentClass(FindClass(name)).Create(AOwner);
end;
Code:
var
   newform : TForm;
begin
   newform := CreateComponentByClassName('TMeinFormular66', nil) as TForm;
   newform.ShowModal; // anzeigen
   newform.Free; // und wieder vernichten
end;
Hierbei hab ich probleme mit dem initialization, ich habs ganz am ende meiner unit gesetzt damit es überhaupt lief, aber ich sollte auch TMainformular66 deklarieren und ich weiß nicht wie.

Die zweite Lösung (die ich etwas einfacher finde):
Code:
procedure TclientForm.pchatBitBtnClick(Sender: TObject);
var
   NF: TForm;

   procedure dOnClick(self: TObject; Sender: TObject);
   begin
         showmessage('test');
         editprivat.text:='test'; //funktioniert nicht
         NF.Close;                //funktioniert nicht
   end;


begin
  NF := TForm.Create (Self);
  NF.show;
with Tedit.Create(NF) do
begin
parent := NF;
name:='editprivat';
caption := 'lalalalei';
end;
with Tbutton.Create(NF) do
begin
parent := NF;
caption := 'test';
      top:=100;
      height:=25;
      width:=80;
      name:='button' + inttostr(privatchats);
      mtdbtn.Code := @dOnClick;
      mtdbtn.Data := Self;
      OnClick := TNotifyEvent(mtdbtn);

end;

end;
Ich habe hier das Problem, das ich nicht weiß, wie ich auf das erstelle editfeld zugreifen kann um zB den Text zu ändern. Ich kann ja auch mehrere instanzen dieses Formulares öffenen, aber wie unterscheide ich die vom Hauptprogramm aus? Außerdem bekomme ich eine Fehlermeldung, wenn ich die Form schließen (NF.close) oder frei machen will (NF.free).

MrKnogge 6. Jun 2004 12:29

Re: Dynamisches Formular
 
Du kannst das Chatfenster auch zur entwurfszeit erstellen, und dann beliebg viele solcher Formulare zur Laufzeit erstellen.

undertaker 6. Jun 2004 21:06

Re: Dynamisches Formular
 
Ich hab das Formular ja durch NF := TForm.Create (Self); zur Laufzeit erstellt, nur weiß ich jetzt net, wie ich vom Hauptformular darauf zugreifen kann, besonders weil ich ja mehrere Instanzen starten kann.

BKempf 6. Jun 2004 21:12

Re: Dynamisches Formular
 
Zitat:

Zitat von undertaker
Ich hab das Formular ja durch NF := TForm.Create (Self); zur Laufzeit erstellt, nur weiß ich jetzt net, wie ich vom Hauptformular darauf zugreifen kann, besonders weil ich ja mehrere Instanzen starten kann.

Du koenntest dir Referenzen auf die einzelnen Formulare z.B. in einer TObjectList merken. NF enthaelt ja hoechstens eine Referenz auf die zuletzt erzeugte Instanz, das kannst du nicht verwenden, wenn du ein anderes Formular ansprechen willst.


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