Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringToComponent (Class TPanel not found.) (https://www.delphipraxis.net/180106-stringtocomponent-class-tpanel-not-found.html)

globalenemy 23. Apr 2014 13:42

Delphi-Version: XE5

StringToComponent (Class TPanel not found.)
 
Grüße,

Ich hab mir folgende Funktionen geschnappt:
http://docwiki.embarcadero.com/CodeE...g_%28Delphi%29

Und möchte diese auf ein Panel mit beliebigem Inhalt anwenden. Allerdings bekomm ich die Fehlermeldung "Class TPanel not found.". Was hat das zu bedeuten?
Ist die funktion humbug, oder mach ich was falsch? Ich möchte ein Panel kopieren und als ein neues einfügen. Da die funktion die Namen der Komponenten nicht ändert muss ich das natürlich im string nachträglich selber tun. Das wird einfach per RegEx geschehn, denke ich.

Mein Panel als String:
Code:
'object InnerPanel1: TPanel'#$D#$A' Left = 0'#$D#$A' Top = 56'#$D#$A' Width = 200'#$D#$A' Height = 56'#$D#$A' BevelInner = bvRaised'#$D#$A' BevelKind = bkFlat'#$D#$A' BevelOuter = bvNone'#$D#$A' Caption = ''InnerPanel1'''#$D#$A' Color = clWindow'#$D#$A' DoubleBuffered = True'#$D#$A' ParentBackground = False'#$D#$A' ParentDoubleBuffered = False'#$D#$A' PopupMenu = FormDesigner.IPPopup'#$D#$A' ShowCaption = False'#$D#$A' TabOrder = 1'#$D#$A' DesignSize = ('#$D#$A'   196'#$D#$A'   52)'#$D#$A' object IP1LineActionBtmLft: TLine'#$D#$A'   Left = 0'#$D#$A'   Top = 0'#$D#$A'   Width = 200'#$D#$A'   Height = 56'#$D#$A'   Enabled = False'#$D#$A'   Style = lsBottomLeft'#$D#$A' end'#$D#$A' object IP1LineActionTopRht: TLine'#$D#$A'   Left = 0'#$D#$A'   Top = 0'#$D#$A'   Width = 200'#$D#$A'   Height = 56'#$D#$A'   Enabled = False'#$D#$A'   Style = lsTopRight'#$D#$A' end'#$D#$A' object IP1Label: TLabel'#$D#$A'   Left = 8'#$D#$A'   Top = 8'#$D#$A'   Width = 180'#$D#$A'   Height = 36'#$D#$A'   Alignment = taCenter'#$D#$A'   Anchors = [akLeft, akTop, akRight, akBottom]'#$D#$A'   AutoSize = False'#$D#$A'   Caption = ''action1'''#$D#$A'   Layout = tlCenter'#$D#$A'   ExplicitWidth = 184'#$D#$A'   ExplicitHeight = 40'#$D#$A' end'#$D#$A'end'#$D#$A
Hab grad mal verucht Zeile 15 des snippets in meinem Code umzusetzen:
'IPanel = class(TPanel);' und alle TPanel zu IPanel geschrieben.
ohne erfolg. (Class IPanel not found.)

DeddyH 23. Apr 2014 14:01

AW: StringToComponent (Class TPanel not found.)
 
Vielleicht muss ExtCtrls eingebunden sein?

himitsu 23. Apr 2014 14:16

AW: StringToComponent (Class TPanel not found.)
 
Nein, es müssen die Komponenten erst registriert werden, welche man da verwenden will,
denn wie soll der Loader die Typen sonst finden? (und wehe jemand erwähnt die neue RTTI, denn Diese kennt der Loader nicht)
Siehe
Delphi-Quellcode:
RegisterClass(MyScrollBar);
in dem Beispiel.


Ich empfehle diese aber vor Aufruf der Ladefunktion zu registrieren und danach dann (im finally) wieder zu deregistrieren, denn eine Klasse darf nur einmal registriert sein und der zweite Versuch wird eine Exception werfen (falls das nicht inzwischen umgebaut wurde).
(in dem Beispiel ging das, da die klasse sonst nirgendwo verwendet wird)

PS: Der VCL-Loader, welcher die DFMs läd, da hat entweder der Compiler oder der Loader (weiß jetzt nicht wer das genau macht) aus der Klassendefinition die Typen der published Felder ausgelesen und holt sich darüber die Typen, registriert Diese und läd dann erst die DFM.



[add]
RTTI: Man kann über einen unqulifizierten Namen (ohne Namespace/Unit) keinen Typen genau bestimmen/suchen.
Erstellt mal mehrere Units, da drin ist überall je eine TForm1 und dann versucht über die RTTI die "richtige" TForm1 aus den Vielen rauszufinden.

globalenemy 23. Apr 2014 14:36

AW: StringToComponent (Class TPanel not found.)
 
vielen dank himitsu. läuft rund.


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