12

我想实例化一个类,但我只有它的名字在一个字符串中。有办法吗?

4

2 回答 2

29

这是来自 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;
于 2009-03-31T13:54:52.517 回答
2

当我需要这样做时,我构建了自己的对象工厂,它使用了一个特殊的子类 TStringList,我目前使用的是 Delphi 7,所以字符串列表类只支持将一个对象附加到一个字符串,然后我得到子类 TStringList 来实现它也可能处理类类型,所以现在我可以实例化一个对象,只需将它的类名传递给工厂。以这种方式工作:

1st - 加载一个单例对象工厂;
2st - 向工厂注册任何对象,可以在单元的初始化部分;

主要的 Factory 方法可能是:isClassRegistered、registerClass、instanceateClass(ClassName: STring): TObject;

这样我就可以实例化任何对象,或者使用之前实例化的对象,甚至是它们的一个子集。

我宁愿使用枚举类型而不是字符串来标识一个类。

备注:这是一个非常非常简洁的例子,一个完整的函数式代码更复杂,但是,相信我,不会太多。

于 2009-06-22T11:54:19.530 回答