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

    技术2024-10-07  73

    以前要在运行时创建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;

    最新回复(0)