VCL动态创建对象-根据类名创建对象


在开发的过程中我们有时需要在运行创建某个类或都它的子类的对象,而在设计时我们并不知道到底要创建哪个具体子类的的实例,这就需要用到动态创建的方法。

       Delphi可以根据类的名字来创建对,我们说这种方法是动态创建对,这利益于Delphi非常强大的RTTI支持,我们在运行能够得到的对象的类型的和类本身的信息非常丰富。除了经常用到的Is和As操作,Delphi还提供直接操作类本身的函数,如RegisterClass,UnRegisterClass,GetClass,FindClass,这几个函数操作的对象是持久化类TPersistent的子类,即TPersistentClass类的变量。这里的TPersistentClass类的变量是表示一个类,它实际是一类的指针,因为Delphi中的类本身就是一个指针,它保存了类的VMT在内存中地址。

我们看下面的代码:

procedure TForm1.btn1Click(Sender: TObject);

var AClass,BClass:TPersistentClass;

begin

  AClass:=TForm1;

  BClass:= TPersistentClass(ClassType);

  mmo1.Clear;

  mmo1.Lines.Add(IntToHex(LongWord(AClass),8));

  mmo1.Lines.Add(IntToHex(LongWord(BClass),8))

end;

这里我们把TForm1类赋给TPersistentClass类型的变量AClass,就是说AClass的值是TForm1,BClass的值是对象Form1的类的引用,ClasaType在Delphi帮助文件中的说明

ClassType dynamically determines the type of an object and returns its class reference, or metaclass.下面的结果显示AClass和BClass的值相同,都是TForm1在内存中的地址。

这里如果我们对 If Self is AClass进行测试,会得去True.

这里如果对 if self is AClass进行测试得到的结果是True。

下面的代码显示了如何通过类名来创建类的实例对象

  TBaseClass=class of TBase;

  TBase=class(TPersistent)

  end;

  TDeriveA=class(TBase)

  end;

  TDeriveB=class(TBase)

  end;

procedure TForm1.btn2Click(Sender: TObject);

var AObj,BObj:TBase;

    AClassName,BClassName:string;

    BaseClass:TBaseClass;

begin

  RegisterClasses([TDerive1,TDerive2]);

  AClassName:='TDerive1';

  BClassName:='TDerive2';

  BaseClass:=TBaseClass(FindClass(AClassName));

  AObj:=BaseClass.Create;

  mmo1.Lines.Add(AObj.ClassName);

  BaseClass:=TBaseClass(FindClass(BClassName));

  BObj:=BaseClass.Create;

  mmo1.Lines.Add(BObj.ClassName);

  AObj.Free;

  BObj.Free;

end;

RegisterClass和RegisterClasses用来向系统注册我们自定义的类的,这些类必须是从TPersistent或其派生类继承下来的类FindClass用来获得一个已经向系统注册过的类,它返回一个TPersistentClass类型的值,就是一类引用变量。

下面的结果显示我们分别通过类名'TDerive1'和'TDerive12’成功创建了TDerive1类的对象AObj和TDerive2类的对象BObj。

通常我们会在新的单元定义我们自己设计的类,我们只需在单元的初始华代码段调用RegisterClass注册我们自己设计的类,就可以在其他单元根据类名来创建这些类的对象,其他单元只需引用自定义基类所在的单元 ,而不必引用我们定义子类的的单元,后来有新的子类加入时也不必改变其他单元的引用关系!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值