转载自:http://blog.sina.com.cn/s/blog_6250a9df0101sqem.html

TControlClass = class of TControl;//  此处必须定义一个类引用,创建时需要使用类引用来创建

function CreateControl(ControlClass: TControlClass; const ControlName: string; X, Y, W, H: Integerl;AOwner: TWinControl): TControl;
//ControlClass为TControl 所有的子类
begin
  Result := ControlClass.Create(AOwner);
  with Result do
  begin
    Parent := AOwner;
    Name := ControlName;
    SetBounds(X, Y, W, H);
    Visible := True;
  end;
end;

//用法
CreateControl(TEdit, 'Edit1', 10, 10, 100, 20,Self);
CreateControl(TButton, 'TButton1', 10, 10, 100, 20,Self);

Delphi:用类名创建对象
Delphi在开发一些通用的系统中,需要使用类似于Java中反射的机制,Delphi中有RTTI,但并不十分好用(说实在没特别认真的研究过RTTI), 现在将一种较为简单的根据类名创建实例的方法记录在这里:
我们知道Windows的类管理机制中,允许向系统注册一个类信息并在其它地方使用,在Delphi的VCL中,这种机制被重新定义为允许注册一个可序列化的类,即从TPersistent继承下来的类便拥有这种属性,因此我们在定义一个类的时候注册到系统,通过getClass/FindClass即可从系统中取得这个类的描述并实例化。
例子如下:
TTest = class(TPersistent)
  public
    procedure test; virtual; abstract;
end;
TTestClass = class of TTest;  // 此处必须定义一个类引用,创建时需要使用类引用来创建...
TTestSub1 = class(TTest)
  public
    procedure test; override;
end;
procedureTTestSub1.test;
begin
    showmessage('TTestSub1.test');
end;
initialization
    RegisterClass(TTestSub1);
finalization
    UnregisterClass(TTestSub1); 
调用的时候:
var obj : TTest; 
clsName = 'TTestSub1';
obj := TTestClass(FindClass(clsName)).Create;
obj.test; //此时显示的是'TTestSub1.test',即调用的是TTestSub1中的test方法
说明:这种方法实际上就是一个典型的TEMPLATE METHOD模式。TTest被定义成模板类,通过定义一个操作中的抽象操作在基础类中,而将实际实现延迟到子类中实现。系统不需要知道子类,通过操纵这个基础类即可完成需要的操作。

另外:{$M+/-}可用于RTTI中而不需要定义类从TPersistent继承,但这里必须从TPersistent继承。

以下部分转载自:http://www.cnblogs.com/yangxuming/p/6707459.html

Type
  TControlCls = Class of TControl;
function CreateComponent(ControlCls: TControlCls): TControl;
begin
  result:=ControlCls.Create(Form1);
  ...
end;
function CreateComponent(ControlCls: TControl): TControl;
begin
  result:=ControlCls.Create(Form1);
  ...
end;

前者要求传入一个 类, 而后者要求传入一个 对象(类的实例)
type 
MyClassRef=calss of CMyClass //表示MyClassRef为指向CMyClass或其父类的指针

类的引用就像指向类的指针一样
类引用就是类的类型,可以声明一个类引用变量赋给它一个类,可以通过这个变量创建对象的实例。

类之类
当你不确定调用的类模型时候用到类之类。
也可以说是类指针~

Delphi Class of相关推荐

  1. Delphi 之Copyrect的使用

    http://cqujsjcyj.iteye.com/blog/380970 Copyrect的使用(图片复制.放大.以及做图片放大镜等) 一.从一个选取一个区域中的图象到另一个图象组件中的固定区域 ...

  2. delphi 10 seattle 中 解决IOS 9 限制使用HTTP 服务问题

    IOS 9 于17号早上正式开始推送,早上起来立马安装,这次升级包只有1G, 安装空间也大大降低(想起IOS 8 升级时,几乎把手机里面的东西删光了,满眼都是泪). 虽然安装后,网上几乎是铺天盖地的吐 ...

  3. 奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit

    在Delphi中使用PrintDialog打印对话框的时候,这个控件有三个选项,就是PrintRang那个属性的三个选项,其中有一个选项三,让我们自定义选择页码范围来打印.但是比较蛋疼的是,这个地方选 ...

  4. DELPHI 中 Window 消息大全使用详解

    Window 消息大全使用详解 导读: Delphi是Borland公司的一种面向对象的可视化软件开发工具. Delphi集中了Visual C++和Visual Basic两者的优点:容易上手.功能 ...

  5. [原]SSL 开发简述(Delphi)

    一.            简介 现在网上有关SSL的资料较多的是基于VC开发,Delphi的SSL开发资源很少. 本文主要使用OpenSSL为基础,讲述SSL的有关开发流程.OpenSSL功能非常丰 ...

  6. 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子

    前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了. 譬如: ADD AX,BX; 这相当于 Delphi 中的 AX := AX + BX; 另外提前来个列表 ...

  7. ado控件连接oracle,在Delphi 7中用ADOConnection控件连接Oracle 9i的问题

    我在本地机器上安装了oracle客户端,其中tnsnames.ora文件中的内容如下: dbtest_212.113.74.23 = (DESCRIPTION = (ADDRESS_LIST = (A ...

  8. delphi自定义事件处理

    http://www.cnblogs.com/ywangzi/archive/2012/09/06/2673414.html delphi自定义事件处理 为什么我们点击按钮,就会执行按钮的onclic ...

  9. 【delphi】Byte数组与String类型的转换

    string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...

  10. RADStudio连接MySQL_使用FireDac(Delphi)在Firebird中创建数据库

    我最近从AnyDac改为FireDac(8.0.5.3365).我们正在运行Delphi 2006. 当我使用此组件的AnyDac版本时,我可以通过执行以下操作来创建新数据库. 设置我的连接 fCon ...

最新文章

  1. delphi中的dbgrid使用
  2. Nginx + CGI/FastCGI + C/Cpp
  3. 工业用微型计算机笔记(4)~编码,寄存器,引脚
  4. ASP.NET多线程的使用
  5. openvino安装小记
  6. == 和 === 有什么区别
  7. [haoi2011]向量
  8. 白话SOA:面向服务+组件+架构
  9. 常用数字及模拟视频接口
  10. java的create vm_JNI_CreateJavaVM(Runtime::Create())
  11. chrome 插件--B站自动发弹幕
  12. IDEA 依赖自动导入,不用每次手动点击Load Maven Changes图标
  13. Hive 的SQL基本操作
  14. 记录LeetCode处女作
  15. 怎么将一个音频无损剪切
  16. 从零到一实现复杂表格需求(antd table 合并行 合并列)
  17. 北京小汽车出行比例首次下降
  18. 用oracle发送电子邮件
  19. 【学习通】解决学习通不能复制粘贴
  20. 品赏第一行“Android代码“---Hello World

热门文章

  1. java计算机毕业设计学生健康信息管理源程序+mysql+系统+lw文档+远程调试
  2. 前端获取图片宽高的几种方法
  3. nginx [alert] worker_connections are not enough
  4. 在计算机软件系统中文字处理软件属于,计算机考试题库:计算机考试模拟练习题(195)...
  5. isreal 实阵判断
  6. 魔兽世界用迅闪更新的问题
  7. 来自itouch的测试
  8. JAVA矩阵包JAMA学习
  9. Java获取中文汉字拼音首字母方法一(更快速)
  10. 蓝桥杯基础练习~芯片测试FJ的字符串Sine之舞数的读法完美的代价