首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
Windows程序
> 详细
delphi RTTI 反射技术
时间:
2016-03-30 22:24:47
阅读:
437
评论:
0
收藏:
0
[点我收藏+]
标签:
[delphi]
view plain
copy
unit Unit_main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TypInfo;
type
TForm_main =
class(TForm)
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
PTKeyDog = ^TKeyDog;
TKeyDog =
record
id: Integer;
projectname:
string;
city:
string;
letter:
string;
hash:
string;
code:
string;
note:
string;
filepath:
string;
userid: Integer;
end;
{ 自定义的类 }
TMyClass =
class(TComponent)
public
procedure msg(
const str:
string);
function Add(
const a, b: Integer): Integer;
end;
// 编译指令 Methodinfo 是 Delphi 2009 新增的, 只有它打开了, ObjAuto 才可以获取 public 区的信息.
// 这样, ObjAuto 可以获取 TClass3 的 public、published 和默认区域的信息.
{
$M+}
{$METHODINFO ON}
TClass3 =
class
function Fun3:
string;
private
function Fun3Private:
string;
protected
function Fun3Protected:
string;
public
function Fun3Public:
string;
published
function Fun3Published:
string;
end;
{$METHODINFO OFF}
{
$M-}
var
Form_main: TForm_main;
implementation
uses
Rtti, ObjAuto;
{$R *.dfm}
// 获取对象的 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 TForm_main
.Button10Click(Sender: TObject);
var
obj: TMyClass;
t: TRttiType;
m1, m2: TRttiMethod;
r: TValue;
// TRttiMethod.Invoke 的返回类型
begin
t := TRttiContext
.Create
.GetType(TMyClass);
{ 获取 TMyClass 类的两个方法 }
m1 := t
.GetMethod(
‘msg‘);
{ procedure }
m2 := t
.GetMethod(
‘Add‘);
{ function }
obj := TMyClass
.Create(Self);
{ 调用需要依赖一个已存在的对象 }
{ 调用 msg 过程 }
m1
.Invoke(obj, [
‘Delphi 2010‘]);
{ 将弹出信息框 }
{ 调用 Add 函数 }
r := m2
.Invoke(obj, [
1,
2]);
{ 其返回值是个 TValue 类型的结构 }
ShowMessage(IntToStr(r
.AsInteger));
{ 3 }
obj
.Free;
end;
procedure TForm_main
.Button11Click(Sender: TObject);
var
obj: TMyClass;
t: TRttiType;
p: TRttiProperty;
r: TValue;
begin
obj := TMyClass
.Create(Self);
t := TRttiContext
.Create
.GetType(TMyClass);
p := t
.GetProperty(
‘Name‘);
// 继承自TComponent的name
r := p
.GetValue(obj);
ShowMessage(r
.AsString);
{ 原来的 }
p
.SetValue(obj,
‘NewName‘);
r := p
.GetValue(obj);
ShowMessage(r
.AsString);
{ NewName }
obj
.Free;
end;
procedure TForm_main
.Button12Click(Sender: TObject);
var
t: TRttiType;
p: TRttiProperty;
r: TValue;
begin
t := TRttiContext
.Create
.GetType(TButton);
p := t
.GetProperty(
‘Align‘);
p
.SetValue(Button1, TValue
.FromOrdinal(TypeInfo(TAlign), Ord(alLeft)));
r := p
.GetValue(Button1);
ShowMessage(IntToStr(r
.AsOrdinal));
{ 3 }
end;
procedure TForm_main
.Button13Click(Sender: TObject);
var
MiArr: TMethodInfoArray;
Mi: PMethodInfoHeader;
obj: TClass3;
begin
obj := TClass3
.Create;
MiArr := GetMethods(obj
.ClassType);
Memo1
.Clear;
for Mi
in MiArr
do
Memo1
.Lines
.Add(
string(Mi
.Name));
obj
.Free;
end;
procedure TForm_main
.Button1Click(Sender: TObject);
var
propertyL, EventL: TStringList;
begin
// 属性
propertyL := TStringList
.Create;
// 事件
EventL := TStringList
.Create;
Memo1
.Clear;
Memo2
.Clear;
GetPropertyAndEventList(Self, propertyL, EventL);
{ 调用函数, 第一个参数是对象名 }
Memo1
.Lines := propertyL;
Memo2
.Lines := EventL;
propertyL
.Free;
EventL
.Free;
end;
procedure TForm_main
.Button2Click(Sender: TObject);
var
ctx: TRttiContext;
t: TRttiType;
begin
Memo1
.Clear;
for t
in ctx
.GetTypes
do
Memo1
.Lines
.Add(t
.Name);
end;
procedure TForm_main
.Button3Click(Sender: TObject);
var
ctx: TRttiContext;
t: TRttiType;
m: TRttiMethod;
begin
Memo1
.Clear;
t := ctx
.GetType(TButton);
// for m in t.GetMethods do Memo1.Lines.Add(m.Name);
for m
in t
.GetMethods
do
Memo1
.Lines
.Add(m
.ToString);
end;
procedure TForm_main
.Button4Click(Sender: TObject);
var
ctx: TRttiContext;
t: TRttiType;
p: TRttiProperty;
begin
Memo1
.Clear;
t := ctx
.GetType(TButton);
// for p in t.GetProperties do Memo1.Lines.Add(p.Name);
for p
in t
.GetProperties
do
Memo1
.Lines
.Add(p
.ToString);
end;
procedure TForm_main
.Button5Click(Sender: TObject);
var
ctx: TRttiContext;
t: TRttiType;
f: TRttiField;
begin
Memo1
.Clear;
t := ctx
.GetType(TButton);
// for f in t.GetFields do Memo1.Lines.Add(f.Name);
for f
in t
.GetFields
do
Memo1
.Lines
.Add(f
.ToString);
end;
// http://my.oschina.net/hermer/blog/320075
procedure TForm_main
.Button6Click(Sender: TObject);
var
ctx: TRttiContext;
t: TRttiType;
ms: TArray<TRttiMethod>;
ps: TArray<TRttiProperty>;
fs: TArray<TRttiField>;
begin
Memo1
.Clear;
t := ctx
.GetType(TButton);
ms := t
.GetMethods;
ps := t
.GetProperties;
fs := t
.GetFields;
Memo1
.Lines
.Add(Format(
‘%s 类共有 %d 个方法‘, [t
.Name, Length(ms)]));
Memo1
.Lines
.Add(Format(
‘%s 类共有 %d 个属性‘, [t
.Name, Length(ps)]));
Memo1
.Lines
.Add(Format(
‘%s 类共有 %d 个字段‘, [t
.Name, Length(fs)]));
end;
procedure TForm_main
.Button7Click(Sender: TObject);
var
t: TRttiRecordType;
f: TRttiField;
begin
Memo1
.Clear;
t := TRttiContext
.Create
.GetType(TypeInfo(TPoint)).AsRecord;
Memo1
.Lines
.Add(t
.QualifiedName);
Memo1
.Lines
.Add(Format(
‘Size: %d‘, [t
.TypeSize]));
Memo1
.Lines
.Add(EmptyStr);
Memo1
.Lines
.Add(Format(
‘字段数: %d‘, [Length(t
.GetFields)]));
Memo1
.Lines
.Add(Format(
‘方法数: %d‘, [Length(t
.GetMethods)]));
Memo1
.Lines
.Add(Format(
‘属性数: %d‘, [Length(t
.GetProperties)]));
Memo1
.Lines
.Add(EmptyStr);
Memo1
.Lines
.Add(
‘全部字段:‘);
for f
in t
.GetFields
do
Memo1
.Lines
.Add(f
.ToString);
end;
procedure TForm_main
.Button8Click(Sender: TObject);
var
t: TRttiRecordType;
f: TRttiField;
begin
Memo1
.Clear;
t := TRttiContext
.Create
.GetType(TypeInfo(TKeyDog)).AsRecord;
Memo1
.Lines
.Add(t
.QualifiedName);
Memo1
.Lines
.Add(Format(
‘Size: %d‘, [t
.TypeSize]));
Memo1
.Lines
.Add(EmptyStr);
Memo1
.Lines
.Add(Format(
‘字段数: %d‘, [Length(t
.GetFields)]));
Memo1
.Lines
.Add(Format(
‘方法数: %d‘, [Length(t
.GetMethods)]));
Memo1
.Lines
.Add(Format(
‘属性数: %d‘, [Length(t
.GetProperties)]));
Memo1
.Lines
.Add(EmptyStr);
Memo1
.Lines
.Add(
‘全部字段:‘);
for f
in t
.GetFields
do
Memo1
.Lines
.Add(f
.ToString);
end;
procedure TForm_main
.Button9Click(Sender: TObject);
var
t: TRttiOrdinalType;
begin
Memo1
.Clear;
// 先从类型名获取类型信息对象
t := TRttiContext
.Create
.GetType(TypeInfo(Byte))
as TRttiOrdinalType;
Memo1
.Lines
.Add(Format(
‘%s - %s‘, [t
.Name, t
.QualifiedName]));
Memo1
.Lines
.Add(Format(
‘Size: %d‘, [t
.TypeSize]));
Memo1
.Lines
.Add(
‘QualifiedName: ‘ + t
.QualifiedName);
Memo1
.Lines
.Add(Format(
‘Min,Max: %d , %d‘, [t
.MinValue, t
.MaxValue]));
Memo1
.Lines
.Add(EmptyStr);
// 空字串
// 可以用 AsOrdinal 方法代替前面的 as TRttiOrdinalType
t := TRttiContext
.Create
.GetType(TypeInfo(Word)).AsOrdinal;
Memo1
.Lines
.Add(Format(
‘%s: %s‘, [t
.Name, t
.QualifiedName]));
Memo1
.Lines
.Add(Format(
‘Size: %d‘, [t
.TypeSize]));
Memo1
.Lines
.Add(Format(
‘Min,Max: %d , %d‘, [t
.MinValue, t
.MaxValue]));
Memo1
.Lines
.Add(EmptyStr);
// 也可以直接强制转换
t := TRttiOrdinalType(TRttiContext
.Create
.GetType(TypeInfo(Integer)));
Memo1
.Lines
.Add(Format(
‘%s: %s‘, [t
.Name, t
.QualifiedName]));
Memo1
.Lines
.Add(Format(
‘Size: %d‘, [t
.TypeSize]));
Memo1
.Lines
.Add(Format(
‘Min,Max: %d , %d‘, [t
.MinValue, t
.MaxValue]));
Memo1
.Lines
.Add(EmptyStr);
end;
{ TMyClass }
function TMyClass
.Add(
const a, b: Integer): Integer;
begin
Result := a + b;
end;
procedure TMyClass
.msg(
const str:
string);
begin
MessageDlg(str, mtInformation, [mbYes],
0);
end;
{ TClass3 }
function TClass3
.Fun3:
string;
begin
Result :=
‘Fun3‘;
end;
function TClass3
.Fun3Private:
string;
begin
Result :=
‘Fun3Private‘;
end;
function TClass3
.Fun3Protected:
string;
begin
Result :=
‘Fun3Protected‘;
end;
function TClass3
.Fun3Public:
string;
begin
Result :=
‘Fun3Public‘;
end;
function TClass3
.Fun3Published:
string;
begin
Result :=
‘Fun3Published‘;
end;
end.
http://blog.csdn.net/earbao/article/details/46729785
delphi RTTI 反射技术
标签:
原文地址:http://www.cnblogs.com/findumars/p/5338856.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建)
2021-07-28
windows 查看文件的md5/sha1/sha256
2021-07-28
git windows下换行符问题 LF与CRLF转换
2021-07-27
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。
2021-07-26
K8S--可视化界面Kubernetes Dashboard(API Server方式)
2021-07-26
Redis安装成windows服务
2021-07-26
c#32位支持大内存(>2gb)
2021-07-23
【c#】Dev BarStaticItem问题汇总
2021-07-23
Exception: URL fetch failure on https://s3.amazonaws.com/text-datasets/nietzsche.txt: None -- [WinError 10054] 远程主机强迫关闭了一个现有的连接。
2021-07-22
WinForm使用DataGridView实现类似Excel表格的查找替换
2021-07-22
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!