AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Controls über Klassenname erstellen?

Offene Frage von "sensei2"
Ein Thema von sensei2 · begonnen am 9. Sep 2009 · letzter Beitrag vom 10. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
sensei2

Registriert seit: 9. Mai 2009
5 Beiträge
 
#1

Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 16:29
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.
  Mit Zitat antworten Zitat
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#2

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 17:19
Ein Mini Beispiel:

Delphi-Quellcode:
  if edit.Text ='tbuttonthen
  begin
    (TButton.Create(self)).parent := self;
  end;
  Mit Zitat antworten Zitat
sensei2

Registriert seit: 9. Mai 2009
5 Beiträge
 
#3

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 17:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.120 Beiträge
 
Delphi 12 Athens
 
#4

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 18:05
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
sensei2

Registriert seit: 9. Mai 2009
5 Beiträge
 
#5

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 18:19
Kann man sich alle Componenten von Delphi auflisten lassen und diese dann registrieren?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 19:04
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;
fork me on Github
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#7

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 19:14
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 20:52
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Controls über Klassenname erstellen?

  Alt 9. Sep 2009, 20:56
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Controls über Klassenname erstellen?

  Alt 10. Sep 2009, 00:06
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 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.
fork me on Github
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 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