zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    JavaScript事件处理
    JavaScript模拟"类"的三种方法
    非构造函数的继承和拷贝
    构造函数的继承
    vim开发环境
    socket之非阻塞
    网络编程
    多线程
    消息队列
    信号
  • 原文地址:https://www.cnblogs.com/del88/p/6364297.html
Copyright © 2011-2022 走看看