当前位置: 首页 > 编程日记 > 正文

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

第三部分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

相关文章:

中序非递归遍历二叉树

二叉树的递归算法虽然简单,但是会导致时间复杂度比较高,下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树,和元素类型为二叉树的栈 typedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild; }BiTNode,*BiTr…

修改属性使按钮处于无验证状态

.net 页面中如果有验证不为空的控件,而且有重置按钮。此时需要将重置按钮的属性设置为无验证状态 如图将CausesValidation属性设置为false转载于:https://www.cnblogs.com/xiaopanlyu/archive/2012/06/28/2568823.html

poj3253

本文地址:https://www.cnblogs.com/maplefighting/p/9116850.html 题目名称:Fence Repair 链接:http://poj.org/problem?id3253 题意:农夫准备把木板切成n块,每块长度为Li,每次切木板时需要花费切时木板的…

一起谈.NET技术,C#中int和System.Int32理解总结

最近园里的TeamOne写了一篇《[C#] int与System.Int32有什么区别》,发现里面有不少精彩的评论,所以忍不住想这篇文章总结一下: 本文的主要参考资料: 1.《理解C#中的System.Int32和int:并非鸡和鸡蛋》Author:Dixin 2.《[C#] int与Sy…

java多线程编程01---------基本概念

一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小伙伴有所帮助。 (一)进程、线…

Linux下查看Nginx,tomcat等的并发连接数和连接状态

1、查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态: netstat -n | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}或者: netstat -n | awk /^tcp/ {state[$NF]} END {for(key in state) print key,"t"…

Java笔记整理-02.Java基础语法

1,标识符 由英文字母、数字、_(下划线)和$组成,长度不限。其中英文字母包含大写字母(A~Z)和小写字母(a~z),数字包含0到9。 标识符的第一个字符不能是数字(即…

android中The connection to adb is down,问题和解决 AndroidEclipseAntXML

1.报错:BUILD FAILEDD:\workspace\ganji\build.xml:144: The following error occurred while executing this line:D:\workspace\ganji\build.xml:271: Unable to delete file D:\workspace\ganji\tmp\proguard\tmp.jar解决:已经开了一个模拟器了&#…

建立可扩展的silverlight应用框架 step-4

通过外部配置文件加载模块module 在上一节中为项目引入了“Prism”框架,并建立了一个Hello Prism做测试。这里要把项 目好好的整理一下。使其更加的合理和具有可扩展性。 我的目的是,在左侧的导航栏目里点击按钮,相应的右侧的主体部分显示不同…

ntp时间同步服务

前言 NTP 网络时间协议用来同步网络上不同主机的系统时间。你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间。而另一方面,一个 NTP 服务器会将它的时间和任意公共 NTP 服务器,或者你选定的服务器同步。由 NTP 管理的所有…

C# GDI+ 简单绘图 (三)

感谢大家的支持,这几天从早忙到晚,一个字累呀!!!现在挺困的,但是又不习惯这么早睡觉,哎~~还是利用这个时间继续来写第三篇吧.前两篇已经基本向大家介绍了绘图的基本知识.那么,我就用我们上两篇所学的,做几个例子.我们先来做一个简单的----仿QQ截图,关于这个的例子其…

用java实现一个简易自动提款机

用java实现一个简易自动提款机,且有以下要求 如何实现呢?首先,我们定义一个用户类User,同时根据要求设计好属性(本人部分命名没有使用驼峰命名法,不够规范)。因为一个人可能有多个卡,卡号又不能重复&#x…

mysql java jdbc 如何 update select

2019年8月6日17:28:07 sql 不知道怎么写,也没去查,因为需求可能中途需要修改值,有点麻烦 直接用jdbc实现。 查询出来的值,直接根据update条件更新,写在一个方法里 public static void GetWeiLiaoMsg(String day) {try …

2000DC和DNS迁移到2003 R2

2000DC和DNS迁移到2003 R2 实验环境:一台TPLINK路由器,三台电脑,以下简称A,B,C。A当作公司的2000DC和DNS服务器。B当作公司要升级的2003R2 DC。C 当作客户机,测试用。1. 对TPLINK路由器&…

SAP EWM 代码实现Transportation Unit(TU)的创建

在EWM中很少有创建或者修改业务对象的BAPI存在,更多的是通过很多面向对象的类方法来实现。 以下这个简单的创建TU应该能很好的体现SCM平台中的OO特性。 REPORT yewm_tu_creation NO STANDARD PAGE HEADING. TYPES: BEGIN OF lty_key_wrk, tu_num TY…

libcurl 客户端实例

参考库 libftp (though its in C)ftplib (again, looks like C)libCurl seems to have FTP capabilities.ace源码&#xff1a;main.c #include <stdio.h> #include <string.h>#include <curl/curl.h> #include <sys/types.h> #include <sys/stat.h&…

哈夫曼树的生成及哈夫曼编码

首先构造哈夫曼树结构体&#xff0c;初始化哈夫曼树的四个无符号整型域&#xff0c;输入文本&#xff0c;统计各个字符的权值&#xff0c;然后构建哈夫曼树&#xff0c;从根到叶子逆向求哈夫曼树的编码。 #include"stdio.h" #include"string.h" #include&…

shiro(2)-架构与配置

认证就是用户确认身份的过程&#xff0c;确认登录的用户身份能够操作的内容。 使用shiro认证分为以下几个步骤&#xff1a; 1&#xff0c;得到主体的认证和凭据。 // lets login the current user so we can check against roles and permissions:if (!currentUser.isAuthentic…

unity中的UI状态机,用于各界面之间的切换和跳转

首先感谢姜雪松先生&#xff0c;大家可以去他的博客查看注释以及代码等&#xff0c;http://jxwgame.blog.51cto.com/943299/1613585 言归正传&#xff1a; 1.在开发项目的过程中&#xff0c;总是会遇到这样的问题&#xff0c;从一个界面跳转到另外一个界面&#xff0c;每次操作…

【转载】Session服务器配置指南与使用经验

作者&#xff1a;张子秋出处&#xff1a;http://www.cnblogs.com/zhangziqiu/ 原文链接&#xff1a;http://www.cnblogs.com/zhangziqiu/archive/2009/03/26/sessionserver.htm一、摘要所有Web程序都会使用Session保存数据. 使用独立的Session服务器可以解决负载均衡场景中的Se…

如何使用jdbc连接数据库

如何使用jdbc连接数据库 数据库是一个有组织的数据集合。数据库管理系统以一种与数据库格式一致的方式&#xff0c;提供了存储和组织数据的机制。数据库管理系统允许在不考虑内部数据表示的情况下访问和存储数据。 java程序使用JDBC API与数据库通信&#xff0c;并用它操纵数…

Mysql配置查询

查看mysql数据库的线程数&#xff1a; show global status like Thread%; 如果我们在MySQL服务器配置文件中设置了thread_cache_size&#xff0c;当客户端断开之后&#xff0c;服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_c…

自我暗示的三大规律

伟人之所以伟大&#xff0c;是因为别人放弃时&#xff0c;他却在坚持。理解暗示的三大规律后&#xff0c;你就会清楚地知道&#xff0c;为什么在别人放弃的时候&#xff0c;你仍然要坚持。 自我暗示第一规律&#xff1a;重复 经常重复一种思想会产生信念&#xff0c;进而变得坚…

python爬虫入门urllib库的使用

urllib库的使用&#xff0c;非常简单。 import urllib2response urllib2.urlopen("http://www.baidu.com") print response.read() 只要几句代码就可以把一个网站的源代码下载下来。 官方文档&#xff1a;https://docs.python.org/2/library/urllib2.html urllib2.u…

maven如何在eclipse上加载

maven如何在eclipse上安装和使用 maven是Apache旗下的定级开源工具,在项目管理方面有强大的能力。Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性&#xff0c;所以常常用两三行 Maven 构建脚本就可以构建…

初步判断内存泄漏方法

有时候&#xff0c;内存泄漏不明显&#xff0c;或者怀疑系统有内存泄漏&#xff0c;我们可以通过下面介绍的方法初步确认系统是否存在内存泄漏。首先在Java命令行中增加-verbose:gc参数&#xff0c;然后重新启动java进程。当系统运行过程中,JVM进行垃圾回收的时候&#xff0c;会…

com组件和一般dll的区别

这阵子在想一个需要利用com组件的小程序怎么做&#xff0c;突然想起上次去面试的时候考官问过autocad开发时为什么要利用com&#xff0c;而不采用一般的dll呢&#xff1f; 到google上查了一下&#xff0c;许多人也问了一样的问题&#xff1a;&#xff09; 用com来写程序…

WinCE6.0 修改开机Logo方法集锦(二)

中秋假期已过&#xff0c;回来继续该博文主题。今天讲解第二种方法&#xff0c;将Logo图片的数据写入到Nand Flash中&#xff0c;在启动初始化LCD的时候&#xff0c;从固定的地址将数据读出并填充到显示缓存中。<?xml:namespace prefix o ns "urn:schemas-microsoft…

[动态dp]线段树维护转移矩阵

背景&#xff1a;czy上课讲了新知识&#xff0c;从未见到过&#xff0c;总结一下。 所谓动态dp&#xff0c;是在动态规划的基础上&#xff0c;需要维护一些修改操作的算法。 这类题目分为如下三个步骤&#xff1a;&#xff08;都是对于常系数齐次递推问题&#xff09; 1先不考虑…

原始ajax方式调用asp.net后台方法

aspx页面&#xff1a; <% Page Language"C#" AutoEventWireup"true" CodeFile"Data.aspx.cs" Inherits"Data" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xht…