delphi XE增强的RTTI妙用--动态创建包中的窗口类  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi XE增强的RTTI妙用--动态创建包中的窗口类


以前要在运行时创建package中的form类,必须要在form单元文件中这样注册类:

Initialization
  RegisterClass(TForm3);
Finalization
  UnRegisterClass(TForm3);

然后在调用模块中,通过FindClass或GetClass函数返回一个TPersistentClass,再通过此类引用创建窗口类:

  AClass := GetClass(ClassName);
  aForm := TCustomForm(AClass.Create).Create(Application);


现在,通过XE中增强的RTTI,也可以完成同样的工作。

首先,package中的申明form的单元文件中,不再需要调用RegisterClass注册窗口类,因为窗口类的RTTI信息,已经在编译时写入到了二进制文件中。

在调用模块中,可以这样进行创建窗口类:

var
  LContext: TRttiContext;
  LPackage: TRttiPackage;
  LClass: TRttiInstanceType;
  aForm: TCustomForm;
begin
  LContext := TRttiContext.Create;

  for LPackage in LContext.GetPackages() do
  begin
    if SameText(ExtractFileName(LPackage.Name), 'Package1.bpl') then
    begin
      LClass := LPackage.FindType('Unit3.TForm3') as TRttiInstanceType;
      aForm := LClass.MetaclassType.Create as TCustomForm;
      aForm.Create(Application);
      aForm.Show;
      aForm.BringToFront;
    end;
  end;
end;

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ddqqyy/archive/2011/02/05/6172867.aspx


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.044387817382812 seconds