网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
Delphi RTTI的使用例子
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式

最近在用C#,觉得它的反射真是不错,在也不用将数据库反回的值一行行,一个属性一个属性的给对象进行赋值了。让代码看着少了很多。
Delphi 也有RTTI 一直没有用过,将大家的代码归纳了一下。给看看能不能更精减和合理一些。
 

uses TypInfo

type
TXRTTI=class

public
//给定一个数据集合将值设置给对象

//得到一个对象的属性的数据类型
class function GetObjAttTypeInfo(obj:TPersistent;const AAtt:String;var ATypeInfo:TTypeInfo):Boolean;
//给定一个属性名和值,给对象设置
class function SetObjValue(obj:TPersistent;const AAtt:String;AValue:Variant;ATypeInfo:TTypeInfo):Boolean;overload;
class function SetObjValue(obj:TPersistent;const AAtt:String;AValue:Variant):Boolean;overload;
class function SetObjValueStr(obj:TPersistent;const AAtt:String;AValue:String):Boolean;overload;
//根据一个属性名,得到对象的值
class function GetObjValue(obj:TPersistent;const AAtt:String):Variant;
class function GetObjValueToStr(obj:TPersistent;const AAtt:String):String;

end;

TXDB=class
//将数据集转换为对象列表
class function DataSetToList(ADOQ:TADOQuery;AClass:TPersistentClass;AList:TList):Integer;
class function DataSetToObj(ADOQ:TADOQuery;obj:TPersistent;ARow:Integer=1):Boolean;
end;

implementation

{ TXDB }

class function TXDB.DataSetToList(ADOQ:TADOQuery;AClass: TPersistentClass; AList: TList): Integer;
var
obj:TPersistent;
i,f:Integer;

PropList: PPropList;
ClassTypeInfo: PTypeInfo;
ClassTypeData: PTypeData;
begin
//先取对象属性信息
ClassTypeInfo := AClass.ClassInfo;
ClassTypeData := GetTypeData(ClassTypeInfo);
GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
GetPropInfos(AClass.ClassInfo, PropList);

for f:=0 to ADOQ.FieldCount-1 do
begin
ADOQ.Fields[f].Tag:=-1;
for i := 0 to ClassTypeData.PropCount - 1 do
if (PropList[i]^.PropType^.Kind <> tkMethod) then
if SameText(ADOQ.Fields[f].FieldName,PropList[i]^.Name) then
begin
ADOQ.Fields[f].Tag:=i;
Break;
end;
end;
//数据集合转换成对象列表
while Not ADOQ.Eof do
begin
obj:=AClass.Create;
for i:=0 to ADOQ.FieldList.Count-1 do
begin
if (ADOQ.Fields[i].Tag>=0)and(ADOQ.Fields[i].Value<>Null) then
TXRTTI.SetObjValue(obj,ADOQ.Fields[i].FieldName,ADOQ.Fields[i].Value,PropList[ADOQ.Fields[i].Tag]^.PropType^^);
end;
AList.Add(obj);
ADOQ.Next;
end;

FreeMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
Result:=AList.Count;
end;

class function TXDB.DataSetToObj(ADOQ: TADOQuery;
obj:TPersistent;ARow:Integer=1): Boolean;
var
i,f:Integer;

PropList: PPropList;
ClassTypeInfo: PTypeInfo;
ClassTypeData: PTypeData;
begin
//先取对象属性信息
ClassTypeInfo := obj.ClassInfo;
ClassTypeData := GetTypeData(ClassTypeInfo);
GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
GetPropInfos(obj.ClassInfo, PropList);

for f:=0 to ADOQ.FieldCount-1 do
begin
ADOQ.Fields[f].Tag:=-1;
for i := 0 to ClassTypeData.PropCount - 1 do
if (PropList[i]^.PropType^.Kind <> tkMethod) then
if SameText(ADOQ.Fields[f].FieldName,PropList[i]^.Name) then
begin
ADOQ.Fields[f].Tag:=i;
Break;
end;
end;
//数据集合转换成对象列表
ADOQ.RecNo:=ARow;
for i:=0 to ADOQ.FieldList.Count-1 do
begin
if (ADOQ.Fields[i].Tag>=0)and(ADOQ.Fields[i].Value&

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号