问题的引入:
准备做一个多国语言软件,发现信息变量(都是字符串)数量庞大,如果简单的通过 “变量=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.
相关文章
- delphi 关于 TRegEx.Split()
- delphi2010 的自带的内存泄漏检测
- delphi2010读取MySQL数据库TEXT类型乱码的解决方案
- delphi关于dbgrid和webbrowser的焦点问题
- 关于Delphi XE2的FMX的一点点研究之消息篇
- Delphi2010安装TWordApplication控件
- Delphi 中的MD5实现方法及delphi2009和delphi2010中用法
- Delphi关于TJPEGImage的使用(BMP\ JPG格式转换)
- Delphi中关于Canvas.TextOut的用法
- Delphi2010中字符串汇编需要注意的一点,以及支持