Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programmoberfläche dynamisch erzeugen (https://www.delphipraxis.net/99128-programmoberflaeche-dynamisch-erzeugen.html)

meisteralex 7. Sep 2007 09:00


Programmoberfläche dynamisch erzeugen
 
Hi Leute, ich möchte eine Client - Server - Applikation schreiben, in welcher die Programmoberfläche beim Client dinamisch erzeugt wirde.
Als Beispiel bekommt der Client vom Server z.b. die Information "Zeige eine Tabelle mit 2x2 Spalten an und darunter 2 Buttons welche die Aufschriften 'Speichern' und 'Speichern unter' haben".
Der Client soll nun aus diesen Informationen dynamisch eine Programmoberfläche generieren!
Also so ein bischen wie HTML soll das funktionieren

Ist sowas in Delphi zu realisieren ?

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

SirThornberry 7. Sep 2007 09:03

Re: Programmoberfläche dinamisch erzeugen
 
natürlich. Wenn du Dinge auf dem Formular zur Designzeit plazierst wird dir das beim Laden abgenommen. Wenn nicht musst du eben genau das machen was sonst automatisch gemacht wird.
Delphi-Quellcode:
ObjectInstanz := TDeinObject.Create(möglicheParameter);
[...]
ObjectInstanz.Free;

meisteralex 7. Sep 2007 09:08

Re: Programmoberfläche dinamisch erzeugen
 
puhhhh wie mache ich das z.b. mit einem button ?
und wie kann ich dem button dann ne funktion zuweisen ?

SirThornberry 7. Sep 2007 09:12

Re: Programmoberfläche dynamisch erzeugen
 
such mal nach "dynamisch" da solltest du auch einiges zu dem Thema finden.
Für den Button könnte es so aussehen.
Delphi-Quellcode:
private
  fButtons: Array of TButton;
[...]

var
  lButton : TButton;
begin
  lButton := TButton.Create(Self);
  lButton.Parent := Self;
  lButton.SetBounds(0, 0, 200, 50);
  lButton.OnClick := DeineClickMethode;

  SetLength(fButtons, Length(fButtons) + 1);
  fButtons[Length(fButtons) - 1] := lButton;
[...]
//spätestens zu Programmende wieder zerstören
for i := 0 to Length(fButtons) - 1 do
  fButtons[i].Free;
SetLength(fButtons, 0);

bernau 7. Sep 2007 09:40

Re: Programmoberfläche dynamisch erzeugen
 
Zitat:

Zitat von SirThornberry
Delphi-Quellcode:
//spätestens zu Programmende wieder zerstören
for i := 0 to Length(fButtons) - 1 do
  fButtons[i].Free;

Ist es nicht so, daß das Form sich um die Zerstörung der angelegten Buttons kümmert, da du ja die Form, welche ja in "self" hinterlegt ist, als Parent und als Owner angegeben hast?


Gerd

SirThornberry 7. Sep 2007 09:49

Re: Programmoberfläche dynamisch erzeugen
 
psst! Jemandem der damit anfängt Objekte zu erzeugen sollte gar nicht erst auf die Idee kommen etwas nicht frei zu geben.
Und es schadet ja nicht wenn er es frei gibt.

mkinzler 7. Sep 2007 09:54

Re: Programmoberfläche dynamisch erzeugen
 
Dann aber FreeAndNil()

SirThornberry 7. Sep 2007 09:57

Re: Programmoberfläche dynamisch erzeugen
 
ok, da geh ich grad noch mit. Wobei der Programmierer auch so programmieren sollte das er weiß ob ein Object frei gegeben wurde oder nicht und das nicht nur anhand dessen ob die Instanzvariable nil ist. Es gibt einige die führen mehrfach ein FreeAndNil auf ihre Instanzvarible aus anstelle die Programmlogic so zu gestalten das nur einmal das ganze aufgerufen wird und das auch nur wenn es notwendig ist.

mkinzler 7. Sep 2007 09:59

Re: Programmoberfläche dynamisch erzeugen
 
Stimmt sicherlich, aber wenn er die Objekte mit einem Owner erzeugt und sie trotzdem händisch freigibt, könnte es sonst zu Problemen kommen.

SirThornberry 7. Sep 2007 10:00

Re: Programmoberfläche dynamisch erzeugen
 
Zitat:

Zitat von mkinzler
Stimmt sicherlich, aber wenn er die Objekte mit einem Owner erzeugt und sie trotzdem händisch freigibt, könnte es sonst zu Problemen kommen.

Nein, denn die Componenten tragen sich in ihrem Destructor aus dem Owner aus. Zu dem weiß der Owner nicht von irgendwelchen Instanzvariablen die es in rauhen Mengen geben kann.

meisteralex 7. Sep 2007 10:32

Re: Programmoberfläche dynamisch erzeugen
 
wie würde ich denn nun am besten z.b. eine tabelle dynamisch erstellen lassen ?

SirThornberry 7. Sep 2007 10:34

Re: Programmoberfläche dynamisch erzeugen
 
mit welcher Komponente würdest du denn eine Tabelle darstellen wenn du es nicht dynamich machst? mit genau der gleichen solltest du es auch machen wenn es dynmich erzeugt wird.

bernau 7. Sep 2007 12:05

Re: Programmoberfläche dynamisch erzeugen
 
Zitat:

Zitat von SirThornberry
psst! Jemandem der damit anfängt Objekte zu erzeugen sollte gar nicht erst auf die Idee kommen etwas nicht frei zu geben.
Und es schadet ja nicht wenn er es frei gibt.

Ich stimme dir in dieser Beziehung vollkommen zu.

Ich wollte damit nur angeben, daß es möglich ist, daß das Objekt (TButton) an einer anderen Stelle freigegeben werden "kann" und man sich schon überlegen muss, wann man mit deiner Variante die Buttons freigibt. Sollte die andere Stelle "schneller" mit der Freigabe sein als du, dann läufst du mit deiner Variante in eine Exception. Wie gesagt, dein array bekommt einfach nicht mit, wenn die Buttens von einer anderen Stelle freigegeben werden. Wenn schon, dann solltes du bei der Freigabe dich überzeugen, daß der Zeiger in deinem array tatsächlich auf eine noch gültige instanz zeigt. (Einfach mit components und componentcount prüfen)

Teilweise ist es ja auch gewünscht, daß ein anderes Objekt sich um die Freigabe meiner manuell erzeugen Objekte kümmert. Siehe TObjectList mit "ownsobjects:=true". Würdest du dich dort auch um die Freigabe deiner erzeugten Objekte kümmern? Die gleiche Ausnahme sehe ich in Objekten vom Type TComponent. Wenn ich einen Owner angebe, dann weiss ich, dass ich die Kontrolle abgeben kann.



Gerd

bernau 7. Sep 2007 12:09

Re: Programmoberfläche dynamisch erzeugen
 
Zitat:

Zitat von mkinzler
Dann aber FreeAndNil()

Das ist im Falle von SirThornberry code eingendlich egal. Mit FreeAndNil wird lediglich der Zeiger im Array auf nil gesetzt. Das Array setzt er aber mit setlength auf die Größe 0, nachdem er alle objekte freigegeben hat.

Gerd


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz