我想实例化一个类,但我只在字符串中有它的名字。有办法吗?
答案 0 :(得分:29)
这是来自Delphi的帮助(Delphi 2006,但至少也可以从Delphi 7获得):
<强>语法强> function GetClass(const AClassName:string):TPersistentClass;
<强>描述强> 调用GetClass以从类名获取类。此类可用作需要类的例程的参数。必须在GetClass找到它之前注册类。在加载表单时,将自动注册表单声明中引用的表单类和组件类(实例变量)。可以通过调用RegisterClass或RegisterClasses来注册其他类。
这里有一些示例代码。这样做只是因为TButton是一个TControl,因此类型转换是有效的。
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClasses([TButton, TForm]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CRef : TPersistentClass;
AControl : TControl;
begin
CRef := GetClass('TButton');
if CRef<>nil then
begin
AControl := TControl(TControlClass(CRef).Create(Self));
with AControl do
begin
Parent := Self;
Width := 50;
Height := 30;
end;
end;
end;
答案 1 :(得分:2)
当我需要这样做时,我构建了自己的Object Factory,它使用了一个特殊的子类TStringList,我目前正在使用Delphi 7,所以字符串列表类只支持将一个Object附加到一个String,然后我得到子类TStringList使得它也可以处理类类型,所以现在我可以实例化一个对象,只是将它的类名传递给工厂。这样工作:
1st - 加载Singleton对象工厂;
第2步 - 将任何对象注册到工厂,可以在单元的初始化部分;
主要工厂的方法可以是:isClassRegistered,registerClass,instantiateClass(ClassName:STring):TObject;
这样我可以实例化任何对象,或者使用先前的实例化对象,甚至是它们的子集。
我宁愿使用枚举类型而不是字符串来标识类。
备注:这是一个非常非常简洁的例子,一个功能完备的代码更复杂,但是,相信我,而不是太多。