Delphi 用RTTI实现用字符串,取出对应属性的值
需求环境:
1.用户登陆成功后,我用一个记录类型TUser,来记录用户相关的一个信息,其中包括一些权限,这部分内容大概有几十个之多. 这里我们先不讨论这种方案的优劣,只谈实现方法
2.现在设定:当用户想要点开某一个模块时,需要先要在TUser里面查询用户是否有权限打开这个模块.因为权限太多了,不可能用if或者case来做判断,所以当时想到了遍历类型来实现,也就是TRRI,需要在Use中引用RTTI单元
数据库设计:
核心代码是下面这段:
function TDM.loopRecord(aTypeInfo, instance: Pointer; FieldName: string): Integer; var RTX: TRttiContext; RT: TRttiType; RF: TRttiField; begin RT := RTX.GetType(aTypeInfo); for RF in RT.AsRecord.GetFields do begin if RF.Name = FieldName then // 判断当前字段名是否与用户点击的模块名相同 begin Result := RF.GetValue(instance).AsInteger; //返回这个字段的值 Exit; end; end; end;
调用:
//判断用户是否有权限打开模块,这里我做的设置是: 0:无权限,1:读,2:读与打印,3读写与打印
//Tuser因为是定义在uDm单元中的,所以要写全. UserInfo是TUser的实例,第三参数是模块的名称,自己拼的 if DM.loopRecord(TypeInfo(udm.Tuser), @UserInfo, 'Frm'+PageName) = 0 then begin DM.tip.Show('权限不足', '您当前的权限不允许打开此模块!');//弹出信息框,这里用的是DEV里面的TdxAlertWindowManager Exit; end;