我想实例化一个类,但我只有它的名字在一个字符串中。有办法吗?
2 回答
这是来自 Delphi 帮助(Delphi 2006,但也至少可从 Delphi 7 获得):
语法 函数GetClass(const AClassName: string): TPersistentClass;
描述 调用 GetClass 从类名中获取类。此类可用作需要类的例程的参数。必须先注册 Class,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;
当我需要这样做时,我构建了自己的对象工厂,它使用了一个特殊的子类 TStringList,我目前使用的是 Delphi 7,所以字符串列表类只支持将一个对象附加到一个字符串,然后我得到子类 TStringList 来实现它也可能处理类类型,所以现在我可以实例化一个对象,只需将它的类名传递给工厂。以这种方式工作:
1st - 加载一个单例对象工厂;
2st - 向工厂注册任何对象,可以在单元的初始化部分;
主要的 Factory 方法可能是:isClassRegistered、registerClass、instanceateClass(ClassName: STring): TObject;
这样我就可以实例化任何对象,或者使用之前实例化的对象,甚至是它们的一个子集。
我宁愿使用枚举类型而不是字符串来标识一个类。
备注:这是一个非常非常简洁的例子,一个完整的函数式代码更复杂,但是,相信我,不会太多。