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

    技术2022-06-26  58

    常量定义(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 获取指定记录的地址。

     

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


    最新回复(0)