给出类:
使用
InvokeRegistry; //定义了TRemotable。
类型
TMyLabel = class(TRemotable)
//一些已发布的道具
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派生的,因此这个解决方案不适用于我的情况: How to convert classname as string to a class?
谢谢,
答案 0 :(得分:1)
由于您的课程不是TPersistent
后代,您必须实施自己的RegisterClass
/ FindClass
程序。
我通常通过在TStringList
(或TDictionary<string, TClass>
中为新的Delphi版本)注册名称来实现此目的,如TOndrej's answer中所述。我在定义类的单元的initialization
部分进行注册。
然后,您可以使用FindClass
函数根据其名称检索类,或者直接根据类的名称直接创建正确类的实例的工厂过程。
我还考虑一个好的做法,将TStringList
,注册程序和工厂程序打包成一个单独实现的类。
如果要用作工厂,还必须向基类(TMyLabel)添加虚拟构造函数,并定义元类型TMyLabelClass = class of TMyLabel
,并将StringList.Objects [i]强制转换为TMyLabelClass TClass