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

Delphi XE增强的RTTI妙用--动态创建包中的窗口类的更多相关文章

  1. MFC动态创建对话框中的按钮控件并创建其响应消息

    转自:http://www.cnblogs.com/huhu0013/p/4626686.html 动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 1 ...

  2. Fineui 根据datatable结构动态创建grid列,帮助类。动态绑定grid。

    public class FineuiHelper     {         /// <summary>         /// 动态创建Grid结构,在 Page_Init事件里执行( ...

  3. OrmLite动态创建表,一个实体类创建多张表的的偏招

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/LonelyRoamer/article/details/26299355 在做一个Android的项 ...

  4. MFC原理第四讲.动态创建机制

    MFC原理第四讲.动态创建机制 一丶要学习的知识点以及简介 动态创建是什么意思? 动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷. 例如: char * ClassNa ...

  5. ViewContainerRef 动态创建视图

    Angular DOM 操作 相关的APIs和类: 查询DOM节点 template variable ref: 模版变量引用,相当于react中的ref ViewChild: 查询DOM,返回单个元 ...

  6. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

  7. delphi里动态创建AlphaControls实现换肤

    AlphaControls是一套Delphi下的优秀的皮肤vcl控件.几年前,一般用得比较多的是vclskin,使用很方便,可惜这套2010年已经停止维护了.后来就看到更多的人开始推崇AlphaCon ...

  8. [转载]: delphi中XLSReadWrite控件的使用(2)---delphi XE下安装

    一.下载 官方下载网址: http://www.axolot.com/components/download.htm 从这里可以下载到从Delphi5到DelphiXE全部支持的版本. 二.软件安装 ...

  9. delphi XE Berlin ReadProcessMemory WriteProcessMemory

    delphi  XE,Berlin [dcc32 Error] Unit9.pas(93): E2033 Types of actual and formal var parameters must ...

随机推荐

  1. 【CF954I】Yet Another String Matching Problem(FFT)

    [CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...

  2. go的web框架beego

    安装 beego 包含一些示例应用程序以帮您学习并使用 beego 应用框架. 您需要安装 Go 1.1+ 以确保所有功能的正常使用. 你需要安装或者升级 Beego 和 Bee 的开发工具: $ g ...

  3. git查看/修改 用户名和邮箱

    用户名和邮箱地址的作用 用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变. 每次commit都会用用户名和邮箱纪录. github的contributions统计就是按邮箱来统计的. ...

  4. PHP字符串定义方式和单引号双引号的区别

    $str=<<<任意标记 ......................... .............................. 任何标记; 单引号和双引号的区别? ''号 ...

  5. My deep learning reading list

    My deep learning reading list 主要是顺着Bengio的PAMI review的文章找出来的.包括几本综述文章,将近100篇论文,各位山头们的Presentation.全部 ...

  6. [转]C++中cin、cin.get()、cin.getline()、getline()函数的简单总结

    参考原文:http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html,另外做了一些修改~ 1.cin 2.cin.get() 3 ...

  7. JAVA多线程提高五:原子性操作类的应用

    当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...

  8. Windows下的MySQL删除data文件夹后……

    MySQL删除data文件夹后,怎么都无法启动了,出现错误: 150106 9:28:43 [Note] Plugin 'FEDERATED' is disabled. wampmysqld: Tab ...

  9. iOS 程序启动流程

    iOS程序启动原理   技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong   iOS应用程序运行 ...

  10. 旅游(CSUST省赛选拔赛2+状压dp+最短路)

    题目链接:http://csustacm.com:4803/problem/1016 题目: 思路:状压dp+最短路,比赛的时候有想到状压dp,但是最短路部分写挫了,然后就卡死了,对不起出题人~dis ...