您的位置:首页 > 其它

关于Record类型RTTI反射的用途和方法

2011-01-11 15:31 141 查看
问题的引入:
准备做一个多国语言软件,发现信息变量(都是字符串)数量庞大,如果简单的通过 “变量=readstring”从ini文件中获取的话,几百个变量就是几百行,这个工作量非常大,而且也不易维护。如果使用RTTI反射机制,未来变量变化时,赋值程序不用修改,只需修改变量结构,这是一劳永逸的做法。
注意:本例程使用delphi2010,delphi老版本不支持record类型的反射。如果使用老版本,需把record类型换为自定义类,这里只演示使用Record类型的方法。
办法如下:
先在C盘建立一个文本文件 c:/vars.txt ,内容如下(key值大小写均可)
name=SUNSTONE
age=37
sex=男
address=吉林省长春市
程序如下:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TmyRec = record
Name, Age, Sex, Address: string;
end;
var
Form2: TForm2;
implementation
uses rtti;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
VarList: TStrings;
MyVar: TmyRec;
RTX: TRttiContext;
RT: TRttiType;
RF: TRttiField;
begin
Memo1.Clear;
VarList := TStringList.Create;
try
// 读取变量文件
VarList.LoadFromFile('c:/vars.txt');
// Record类型的RTTI反射
RT := RTX.GetType(TypeInfo(TmyRec));
for RF in RT.AsRecord.GetFields do
begin
Memo1.Lines.Add(RF.Name);
RF.SetValue(@MyVar, VarList.Values[RF.Name]);
end;
finally
VarList.Free;
end;
// 检查结果
Memo1.Lines.Add('');
Memo1.Lines.Add('----检查结果----');
Memo1.Lines.Add('Name: ' + MyVar.Name);
Memo1.Lines.Add('Age: ' + MyVar.Age);
Memo1.Lines.Add('Sex: ' + MyVar.Sex);
Memo1.Lines.Add('Address: ' + MyVar.Address);
end;
end.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunstone/archive/2009/11/17/4819048.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐