巧用Delphi 2010 RTTI 管理常量(const)!

简介: 常量定义(const)在D7及D7之前的版本,一般只能在单元里,以全局方式声明和定义。自D7之后的新版本,常量可以放在一个类里声明,比如放在 类的 public或private里。

常量定义(const)在D7及D7之前的版本,一般只能在单元里,以全局方式声明和定义。自D7之后的新版本,常量可以放在一个类里声明,比如放在 类的 publicprivate里。

       有那么一种常量,你希望常量的名称和真实的常量值一样,比如,用于作配置文件的常量。当然,如果你不觉得辛苦,一般来说,常量名和常量值逐个敲出来,也无可厚非。但是,如果你还在使用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;
var
RTX:TRttiContext;
RT:TRttiType;
RF:TRttiField;
iCount:Integer;
begin
Result := 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 获取指定记录的地址。

 

很简单吧,希望能对你有点帮助!

相关文章
|
5月前
|
C语言
C语言15---在VC中变量的注意点和变量的注意细节
C语言15---在VC中变量的注意点和变量的注意细节
|
7月前
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(下)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
25 1
|
7月前
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(中)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
27 0
|
7月前
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(上)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
22 0
|
编译器 Go
Go语言常量完全手册 const用法看这一篇就够了
Go语言常量完全手册 const用法看这一篇就够了
857 0
|
Go
这才是模拟枚举的最佳方式 Go语言const+iota实现简明优雅
这才是模拟枚举的最佳方式 Go语言const+iota实现简明优雅
128 0
|
存储 编译器 C语言
C语言进阶教程(const定义的变量真的不能被改变吗?)
C语言进阶教程(const定义的变量真的不能被改变吗?)
199 0
|
存储 安全 编译器
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
C语言——enum枚举实例、知识点。使用枚举,减少相同定义步骤,简洁数据1.1.5
枚举是C语言常见的一种基本数据类型,它可以避免多个整数定义的麻烦,使代码整洁干净易读如此一看,就觉得繁琐无比,大量重复#define xx明显增加代码量,且数值需自己一一对应而枚举,可以解决这种定义连续数值的过程当变量第一个值未自定义时,第一个枚举成员的默认值则为整型0,后续成员值依次加1,如此时MON=0,TUE=1,WED=2·····.........
C语言——enum枚举实例、知识点。使用枚举,减少相同定义步骤,简洁数据1.1.5
VB编程:巧用常量定义数组-37
VB编程:巧用常量定义数组-37
220 0