有没有办法在delphi中通过名称实例化一个类?

时间:2009-03-31 13:48:06

标签: delphi delphi-7

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

2 个答案:

答案 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;

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

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

备注:这是一个非常非常简洁的例子,一个功能完备的代码更复杂,但是,相信我,而不是太多。