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值