Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Controls über Klassenname erstellen? (https://www.delphipraxis.net/139985-controls-ueber-klassenname-erstellen.html)

sensei2 9. Sep 2009 16:29


Controls über Klassenname erstellen?
 
Hallo,
ist es in Delphi möglich Steuerelemente zur Laufzeit über ihren Klassennamen zu erstellen?
Beispielsweise gebe ich in ein Edit "TButton" ein und es wird ein Button erzeugt.
Dies soll mit jedem beliebigen Klassennamen eines Steuerelementes funktionieren.

martin_ 9. Sep 2009 17:19

Re: Controls über Klassenname erstellen?
 
Ein Mini Beispiel:

Delphi-Quellcode:
  if edit.Text ='tbutton' then
  begin
    (TButton.Create(self)).parent := self;
  end;

sensei2 9. Sep 2009 17:41

Re: Controls über Klassenname erstellen?
 
Das meine ich nicht. Es geht mir darum, dass man das mit jedem beliebigen Steuerelement machen kann. z.B auch mit TLabel, TEdit, TMemo... und ich möchte diese ungern alle per case abfragen und dann erstellen.
Ich bräuchte etwas wie
Delphi-Quellcode:
control:=TControl(getclass(edit1.text)).Create(self);
control.Parent:=self;
das funktioniert aber nicht.

himitsu 9. Sep 2009 18:05

Re: Controls über Klassenname erstellen?
 
Dafür müßten die Klassen irgendwo in einer Liste registriert sein, was sie nicht sind.

Im Falle von GetClass müßtes du die Klasse vorher bei Classes.RegGroups registrieren.

sensei2 9. Sep 2009 18:19

Re: Controls über Klassenname erstellen?
 
Kann man sich alle Componenten von Delphi auflisten lassen und diese dann registrieren?

sx2008 9. Sep 2009 19:04

Re: Controls über Klassenname erstellen?
 
So sollte es gehen:
Delphi-Quellcode:
control:=TControlClass(FindClass(edit1.text)).Create(self);
// hier zuerst Left,Top, Height und Width setzen (bzw. SetBounds() aufrufen), bevor Parent gesetzt wird
// das verhindert unnötige Methodenaufrufe
control.Top := ...
control.Parent:=self;
Die harte Typumwandlung mit TConrolClass ist etwas gefährlich - hier könnte man besser mit "as" arbeiten
(aber ich kann's grad nicht ausprobieren)
Delphi-Quellcode:
control:=(FindClass(edit1.text) as TControlClass).Create(self);
control.Parent:=self;

Tryer 9. Sep 2009 19:14

Re: Controls über Klassenname erstellen?
 
FindClass ist "GetClass() <> nil", bringt also eher noch weniger. (TControlClass(False))?

Eine passende Liste gibt es zur Laufzeit einfach nicht.
Selber erstellen, oder bleiben lassen.

MfG,
Dirk

Bernhard Geyer 9. Sep 2009 20:52

Re: Controls über Klassenname erstellen?
 
Ich denke im Rahmen der RTTI müsste sich u.U noch einiges verstecken. Denn Delphi-Apps müssen ihre Formulare auch aus der Exe streamen und die IDE erkennt ja auch wenn DFM-Klassenangaben nicht mit den der Pas-Datei übereinstimmen.

Apollonius 9. Sep 2009 20:56

Re: Controls über Klassenname erstellen?
 
Das ist richtig. Klassen, die mit M+ kompiliert wurden, speichern für jedes als published deklarierte Feld den Namen und den Typen. Aus dem Typen lässt sich mittels ClassName leicht der Name erhalten.

Das Problem ist bei Verwendung dieser Informationen allerdings, dass sich auf diese Weise eben nicht der Typ TEdit erhalten lässt, wenn kein Edit auf dem Formular liegt, was aber anscheinend im Sinn des Threaderstellers liegt.

sx2008 10. Sep 2009 00:06

Re: Controls über Klassenname erstellen?
 
Zitat:

Zitat von Tryer
FindClass ist "GetClass() <> nil", bringt also eher noch weniger.

FindClass wirft eine Exception, wenn die Klasse nicht gefunden wird.
Das ist ist hier ein erwünschtes Verhalten.
Zitat:

Zitat von Tryer
Eine passende Liste gibt es zur Laufzeit einfach nicht.

Dann frage ich mich, wie ein Formular seine Komponenten erzeugt ohne dass explizit Aufrufe ala Label1 := TLabel.Create(self) vorhanden sind.
Die Informationen sind da; blos die VCL verbirgt sie vor dem Programmierer.


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