关于类的入门例子(9): 获取对象的 RTTI 属性与事件的函数
2008-01-14 02:25
465 查看
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, xmldom, XMLIntf, XMLBrokr, msxmldom, XMLDoc; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; Memo2: TMemo; XMLDocument1: TXMLDocument; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses TypInfo; {获取类的信息, 需要这个单元} //获取对象的 RTTI 属性与事件的函数 function GetPropertyAndEventList(obj: TObject; pList,eList: TStringList): Boolean; var ClassTypeInfo: PTypeInfo; {类的信息结构指针} ClassDataInfo: PTypeData; {类的数据结构指针} propertyList : PPropList; {TPropInfo 是属性的数据结构; PPropList 是其指针; TPropList 是属性结构指针的列表数组; PPropList 是指向这个数组的指针} num : Integer; {记录属性的总数} size: Integer; {记录属性结构的大小} i: Integer; begin ClassTypeInfo := obj.ClassInfo; {先获取: 类的信息结构指针} ClassDataInfo := GetTypeData(ClassTypeInfo); {再获取: 类的数据结构指针} num := ClassDataInfo.PropCount; {属性总数} size := SizeOf(TPropInfo); {属性结构大小} GetMem(propertyList, size*num); {给属性数组分配内存} GetPropInfos(ClassTypeInfo, propertyList); {获取属性列表} for i := 0 to num - 1 do begin if propertyList[i].PropType^.Kind = tkMethod then {如果是事件; 事件也是属性吗, 给分出来} eList.Add(propertyList[i].Name) else pList.Add(propertyList[i].Name); end; pList.Sort; eList.Sort; {排序} FreeMem(propertyList); {释放属性数组的内存} Result := True; end; //测试 procedure TForm1.Button1Click(Sender: TObject); var PL,EL: TStringList; begin PL := TStringList.Create; EL := TStringList.Create; Memo1.Clear; Memo2.Clear; GetPropertyAndEventList(Self, PL, EL); {调用函数, 第一个参数是对象名} Memo1.Lines := PL; Memo2.Lines := EL; PL.Free; EL.Free; end; end.
相关文章推荐
- 获取对象的 RTTI 属性与事件的函数
- 获取 E盘下所有文件的文件名;关于 File 对象的属性;关于 FileWriter 对象的属性;
- 001_关于循环绑定事件函数中的对象索引值与this
- 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值
- 获取自定义属性/event的触发事件对象和绑定事件对象
- 获取对象样式属性函数getStyle()
- 事件对象相关函数与例子(MSDN)
- Python帮助函数调试函数 用于获取对象的属性及属性值
- 关于ajax对象一些常用属性、事件和方法大小写比较常见的问题总结
- 属性函数php 获取对象所有属性(仅公有属性)
- 获取对象的接口信息(方法/属性/事件)(VB6代码)
- 关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例(在Delphi 初始化每一个TWinControl 对象时,将会在窗体 的属性(PropData)中加入一些标志,DLL的HInstance的值与HOST 进程的HInstance并不一致)
- javascript事件:获取事件对象getEvent函数
- 一个关于el中获取对象属性的错误
- 关于在IE9下RequiredFieldValidator出现“无法获取属性“toLowerCase”的值: 对象为 null 或未定义”的Bug
- js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称
- 获取对象样式属性函数getStyle()
- Python帮助函数调试函数 用于获取对象的属性及属性值
- js获取指定节点对象的样式属性的值的封装函数(兼容ie、Opera和符合w3c标准浏览器)
- js向body创建对象、对象属性、对象事件,js获取元素坐标、元素边框大小、真实大小