Delphi 将类字符串转换为TClass
鉴于课程: 使用 调用注册表//其中定义了振动。Delphi 将类字符串转换为TClass,delphi,delphi-7,Delphi,Delphi 7,鉴于课程: 使用 调用注册表//其中定义了振动。 类型 TMyLabel=类别(可旋转) //一些已出版的道具 TMySubLabel=class(TMyLabel) //更多已出版的道具 //some other classes descendent of TMyLabel. TMyLabelClass = class of TMyLabel; 我的要求是实施: function StringToClass(string aClassName): TClass; begin /
类型 TMyLabel=类别(可旋转) //一些已出版的道具 TMySubLabel=class(TMyLabel) //更多已出版的道具
//some other classes descendent of TMyLabel.
TMyLabelClass = class of TMyLabel;
我的要求是实施:
function StringToClass(string aClassName): TClass;
begin
//your implementation goes here
end;
用法:
function GetMyLabelInstance(string aClassName):TMyLabel;
var
lCloned: TMyLabel;
begin
Tclass lClass = StringToClass('TMySubLabel');
lCloned := TMyLabelClass(lClass).Create;
end;
我使用的是Delphi 7,我的对象不是从TPersistent派生的,因此此解决方案不适用于我的情况:
谢谢,因为您的类不是
t持久的
后代,所以您必须实现自己的注册类
/FindClass
过程
我通常通过在TStringList
(或者对于较新的Delphi版本,TDictionary
)中注册类的名称来实现这一点,如中所示。我在定义类的单元的初始化
部分进行注册
然后,您可以使用FindClass
函数根据类的名称检索类,或者直接使用工厂过程根据类的名称创建正确类的实例
我还考虑了一个很好的做法来打包<代码> TSTRIGLISTRON/COD>,注册过程和工厂过程在一个类中实现为一个单独的。
如果要用作工厂,还必须向基类(TMyLabel)添加虚拟构造函数,并定义元类类型
TMyLabelClass=class of TMyLabel
,并强制转换StringList.Objects[i]到TMyLabelClass而不是TClass到您链接的问题,不会假设该类是持久的,它与您添加到TStringList
TClass lClass=StringToClass('TMySubLabel')的任何内容一起工作代码>在我看来有点像C-ish。这是Delphi(某种变体)中可以接受的语法,还是仅仅是一个伪代码?答案是:函数StringToClass(string aClassName):TClass;开始变量lXSClass:TClass;begin lXSClass:=RemClassRegistry.URIToClass('myUri',aClassName);结果:=TMyLabelClass(lXSClass)。创建;结束;所以问题不是重复的不,不是。您的“答案”不是实际的代码,也不会编译。答案是:函数StringToClass(stringaclassname):TClass;开始变量lXSClass:TClass;begin lXSClass:=RemClassRegistry.URIToClass('myUri',aClassName);结果:=TMyLabelClass(lXSClass)。创建;结束\r\n计划:所有my类都是TRemotable(在InvokeRegistry定义)的后代。InvokeRegistry包含RemClassRegistry.URIToClass方法,该方法通过RemClassRegistry.RegisterXSClass读取与其关联的TClass值