第三部分RTTI相关函数

GetTypeData 函数

GetPropInfo 函数
FindPropInfo 函数
GetPropInfos 函数
SortPropList 函数

GetPropList 函数

GetObjectPropClass 函数
PropType / PropIsType 函数
IsPublishedProp 函数
IsStoredProp 函数
FreeAndNilProperties 函数
SetToString / StringToSet 函数
GetEnumName / GetEnumValue / GetEnumNameValue 函数

GetTypeData 函数

GetTypeData 函数根据 TTypeInfo 指针获得 TTypeData 的地址。

function GetTypeData(TypeInfo: PTypeInfo): PTypeData;
asm
XOR  EDX,EDX  ; EDX 清零
MOV  DL,[EAX].TTypeInfo.Name.Byte[0]  ; 获得 Name 字符串长度
LEA  EAX,[EAX].TTypeInfo.Name[EDX+1]  ; 获得 TTypeData 的地址
end;

GetPropInfo 函数

GetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo。它有四种重载形式,后面三种重载的实现都是调用第一种形式。AKinds 参数用于限制属性的类型,如果得到的 PPropInfo 不属于指定的类型,则返回 nil。

function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo;

function GetPropInfo(Instance: TObject; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(AClass: TClass; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string;
AKinds: TTypeKinds): PPropInfo;

FindPropInfo 函数

FindPropInfo 函数根据属性名称获得属性的 RTTI 指针,它只是在 GetPropInfo 函数的基础上加上了错误检查功能,如果没有属性 RTTI 信息,则触发 EPropertyError 异常。

function FindPropInfo(Instance: TObject; const PropName: string): PPropInfo;
function FindPropInfo(AClass: TClass; const PropName: string): PPropInfo;

GetPropInfos 函数

GetPropInfos 函数的功能是把一个类(class)所有属性 RTTI 指针 PPropInfo 填充至传入的参数 PPropList 数组中。

注意:这个函数不负责分配该数组的内容,使用前必须根据属性的数量分配足够的空间。该数组结束后必须清除分配的内容。

procedure GetPropInfos(TypeInfo: PTypeInfo; PropList: PPropList);

注:使用 GetPropList 实现相同的功能更方便。

SortPropList 函数

SortPropList 可以对 GetPropInfos 函数填充的属性信息指针数组按属性名称排序。

procedure SortPropList(PropList: PPropList; PropCount: Integer);

在 VCL 中 SortPropList 只被 GetPropList 函数使用。

GetPropList 函数

GetPropList 函数同 GetPropInfos 一样,填充 PPropList 数组。GetPropList 实际上是调用 GetPropInfos 进行填充工作,最后返回已填充的属性的数量。

function GetPropList(TypeInfo: PTypeInfo; TypeKinds: TTypeKinds;
PropList: PPropList; SortList: Boolean): Integer;

function GetPropList(TypeInfo: PTypeInfo; out PropList: PPropList): Integer;
function GetPropList(AObject: TObject; out PropList: PPropList): Integer;

注意:GetPropList 的内存分配有点混乱,上面第一个 GetPropList 必须自己分配 PPrpList 数组的内存,后面二个 GetPropList 会自动分配 PPropList 数组的内存。造成这种情况的原因是:第一个 GetPropList 可以设置 TypeKinds 参数限制只返回指定类型的属性,这样就不能直接得到可能返回的属性数量。TypeKinds 参数可以设置为 tkAny,表示返回所有数据类型的属性。

第一个 GetPropList 函数可以设置 SortList 参数对属性名称进行排序。它实际上是调用第二个 GetPropList 并调用 SortPropList 函数执行排序。

注意:PPropList 不再使用的时候,要记得使用 FreeMem 函数清除数组内存(根据返回值是否大于1)。

GetObjectPropClass 函数

GetObjectPropClass 函数用于返回对象类型的属性所属的类(class)。

function GetObjectPropClass(Instance: TObject; PropInfo: PPropInfo): TClass;
function GetObjectPropClass(Instance: TObject; const PropName: string): TClass;
function GetObjectPropClass(PropInfo: PPropInfo): TClass;

这个函数被 SetObjectProp 函数使用,用于参数检验。

PropType / PropIsType 函数

PropType 函数用于获得属性的数据类型。

function PropType(Instance: TObject; const PropName: string): TTypeKind;
function PropType(AClass: TClass; const PropName: string): TTypeKind;

PropIsType 判断属性是否属于某种数据类型。它调用 PropType 实现功能。

function PropIsType(Instance: TObject; const PropName: string;
TypeKind: TTypeKind): Boolean;
function PropIsType(AClass: TClass; const PropName: string;
TypeKind: TTypeKind): Boolean;

IsPublishedProp 函数

IsPublishedProp 函数用于判断属性是否是 published 属性,它通过检查该属性 RTTI 指针是否等于 nil 来实现功能。

function IsPublishedProp(Instance: TObject; const PropName: string): Boolean;
function IsPublishedProp(AClass: TClass; const PropName: string): Boolean;

IsPublishedProp 函数没有被 VCL 使用。

IsStoredProp 函数

IsStoredProp 函数使用属性信息中的 TPropInfo.StoredProp 函数指针来调用属性定义时用 stored 关键字定义的函数的结果。

这个函数被用于 Delphi 持续机制,TWriter.WriteProperties 方法调用 IsStoredProp 判断是否需要把该属性的值写入流中。

function IsStoredProp(Instance: TObject; PropInfo: PPropInfo): Boolean;
function IsStoredProp(Instance: TObject; const PropName: string): Boolean;

FreeAndNilProperties 函数

FreeAndNilProperties 函数用于清除一个对象的所有 published 的对象类型的属性的对象。这个函数调用 GetObjectProp 执行获得对象属性的对象句柄,并调用对象的 Free 方法清除这个对象,然后调用 SetObjectProp 设置该属性为 nil。

procedure FreeAndNilProperties(AObject: TObject);

我不知道这个函数能用在哪里,至少 VCL 中没有使用这个函数。

SetToString / StringToSet 函数

SetToString 和 StringToSet 是两个 RTTI 辅助函数,它们把集合值转换为字符串,或者把字符串转换为集合值。

function SetToString(PropInfo: PPropInfo; Value: Integer;
Brackets: Boolean = False): string;

function StringToSet(PropInfo: PPropInfo; const Value: string): Integer;

注意:这里的集合值最多只能包含 32 个元素(4 bytes),这是集合 RTTI 的限制。

GetEnumName / GetEnumValue / GetEnumNameValue 函数

GetEnumName 函数根据枚举整数值返回枚举字符串。它可以返回以下三种枚举名称:

Integer:直接返回 IntToStr(Integer)
Boolean:返回 True/False
Enum  :返回 TTypeData^.NameList 中存储的枚举名称

function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string;

GetEnumValue 函数根据枚举字符串返回枚举整数值。它与 GetEnumName 类似,可以返回三种枚举的整数值,但对于 Enum 类型,它调用了 GetEnumNameValue 函数。

function GetEnumValue(TypeInfo: PTypeInfo; const Name: string): Integer;

GetEnumNameValue 函数与 GetEnumValue 函数功能差不多,但它是个汇编函数,只能返回纯枚举类型的值。其工作原理也是匹配 TTypeData^.NameList 值。

function GetEnumNameValue(TypeInfo: PTypeInfo; const Name: string): Integer;

注意:GetEnumNameValue 隐藏在 Implementation 段,不能直接使用,它是为 GetEnumValue 函数服务的。

转载于:https://www.cnblogs.com/xiuyusoft/archive/2011/06/15/2081654.html

RTTI(三)相关函数1【转自大富翁】相关推荐

  1. Delphi编程 -- 使用CPUID指令获取CPU信息(转自大富翁)

    最近到整理了一份CPU的信息,应该算是比较全面的吧. 几乎现在所有的X86 CPU都内置了CPUID指令以辨别真伪,一些CPU厂商例如AMD,VIA等还内置了更加丰富的扩展CPUID指令,用着更方便了 ...

  2. CPU信息的获得(转自大富翁)

    最近到整理了一份CPU的信息,应该算是比较全面的吧. 几乎现在所有的X86 CPU都内置了CPUID指令以辨别真伪,一些CPU厂商例如AMD,VIA等还内置了更加丰富的扩展CPUID指令,用着更方便了 ...

  3. 程序读取计算机设备管理器中各设备的状态(启用/禁用)?(转自大富翁)

    此部分代码请大家给加上注释. const   DEV_CLASS_NAME    = 'Net';   DEM_CLASS_NAME    = 'MEDIA';   DEC_CLASS_NAME   ...

  4. C#操作Excel(三)相关函数

    设置Excel格式和WorkBook.SaveAs函数详解 设置Excel格式 Excel.Range contentRange = excel_conftable.Range[excel_conft ...

  5. 拼音反查(转自大富翁)

    直接用下面的单元来取拼音吧: unit IMCode; (*     简化版拼音反查单元=====================     修改于 Trueway(TM) LiQunwei     修 ...

  6. python一个富翁试图与陌生人做一笔生意_VB实验报告一

    <VB实验报告一>由会员分享,可在线阅读,更多相关<VB实验报告一(9页珍藏版)>请在人人文库网上搜索. 1.VB程序设计实验单元一实验报告专业班级: 姓名 学号 指导教师: ...

  7. 一个富翁试图与陌生人做一笔生意用python_实验报告1 - 图文 -

    实验报告(一) 实验题目:实验循环结构第八题实验 实验环境:VB程序(6.0中文版) 实验目的:掌握常用内部函数的使用,掌握表达式.赋值语句的正确书写规则,掌握IF条件语句的使用掌握情况语句的使用. ...

  8. 一个富翁试图与陌生人做一笔生意用python_2009年青岛市程序设计试题

    附件: 各辅导教师做出并调试正确后,做成WORD格式,包含题目及答案,发给电教站蒋华程, 将在本栏目展示,供大家学习.答案将标明出处. _________________________小学试题答案- ...

  9. 硅谷年轻富翁群:挑战自我 不愿坐享其成(转)

    导读:<纽约时报>10月28日刊登了分析文章指出,虽然互联网行业每年会制造出一批年轻的千万富翁,但不少年纪刚三十出头的年轻富翁们并不愿坐享其成,而是再次投入到互联网新<nobr> ...

最新文章

  1. python下载不下来_Python不能下载zip文件,而Browser/Selenium可以下载,这是为什么?...
  2. Android媒体播放框架MediaSessionCompat介绍实践
  3. 变压器符号_变压器电路图符号大全
  4. Spark DataFrame 添加自增id
  5. 指针常量和常量指针简单区分理解
  6. 叶县有没有计算机培训学校,叶县中等专业学校
  7. sqlplus 登录数据库
  8. android 日期相,Android日历始终保持相同的日期
  9. 旧版java_Java旧版本清理|JavaRa旧版本清理下载_V2.4 官方版_9号软件下载
  10. 全国计算机一级证书重点知识,全国计算机一级
  11. 蓝桥杯——蓝肽子序列
  12. 有效的运营技巧让中国卖家在跨境电商领域销量翻番
  13. MCMC_calibration
  14. 楼宇控制系统发展过程
  15. centos 6.8使用wine安装QQ2016
  16. 2021-2027全球与中国气溶胶采样器市场现状及未来发展趋势
  17. 你的言语一解开,就发出亮光
  18. mfc | mfc集成opencv,实现监控、拍照、录像、录像播放(保姆级教程)
  19. STM32F4软件IIC的使用
  20. APView500电能质量在线监测装置

热门文章

  1. 一些linux下的性能监测工具
  2. SQL Server 最佳实践分析器使用小结
  3. mysql中3张表如何关联查询_mysql三张表关联查询
  4. linux病毒木马分析,Linux平台“盖茨木马”分析
  5. java更新blob字段的值_对一个BLOB字段如何用update 来更新?? (100分)
  6. java人工洗牌窗口程序_求解,用JAVA写洗牌与发牌模拟程序
  7. 敲代码括号技巧_阅码神奇Souceinsight使用小技巧总结
  8. linux多用户怎么表示,Linux如何建立多用户
  9. cli vue 卸载,vue Cli 环境删除与重装教程 - 版本文档
  10. java正则截取xml节点_实例讲述Java使用正则表达式截取重复出现的XML字符串功能...