常量定义(const)在D7及D7之前的版本,一般只能在单元里,以全局方式声明和定义。自D7之后的新版本,常量可以放在一个类里声明,比如放在 类的 public或private里。
有那么一种常量,你希望常量的名称和真实的常量值一样,比如,用于作配置文件的常量。当然,如果你不觉得辛苦,一般来说,常量名和常量值逐个敲出来,也无可厚非。但是,如果你还在使用D2010作开发而不发挥新RTTI技术,很显然,你已经Out了,不随波逐流使用新技术,连“走马观花”赏花的机会也没有。
为了方便管理常量,我们需要声明一个记录类型。为啥使用记录类型而不是类呢?因为记录类型不用创建和释放,其次,记录比类更节省系统资源。
//参数的名称信息,用于常量设置,都是字符串TParamName = record Socket:string; System:string; DBConfig:string; //通讯参数 ThreadCount:string; Port:string; SessionLife:string; TimeOut:string; ZipRate:string; Encrypt:string; //系统参数 AutoRun:string; SocketLog:string; BusinessLog:string; DBLog:string; //数据库配置 Server:string; Provider:string; DataBase:string; DBPort:string; UserName:string; UserPswd:string; Pooling:string; PoolMax:string; PoolMin:string; PoolLife:string;end;
------------我们使用一个新的方法管理 记录类型的 RTTI--------------------------------------
uses RTTI;
function TRttiInfo.SetRecordDeftValue(TypeInfoValue, RecValue: Pointer): Boolean;varRTX:TRttiContext;RT:TRttiType;RF:TRttiField;iCount:Integer;beginResult := False;try RTX := TRttiContext.Create; RT := RTX.GetType(TypeInfoValue); iCount := 0; for RF in RT.AsRecord.GetFields do begin RF.SetValue(RecValue,RF.Name); Inc(iCount); end; Result := iCount >0;finally RTX.Free;end;
end;
--------------调用就非常简单,需要指针来辅助参数传输了---------------
var
SysParamName:TParamName ;//记录声明
调用:
RttiInfo.SetRecordDeftValue(TypeInfo(TParamName),@SysParamName);
1、 由于记录类型是一个抽象的类型,没有具体的类型名,因此需要借助 TypeInfo来获取类型信息
2、通过 @SysParamName 获取指定记录的地址。
很简单吧,希望能对你有点帮助!