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;

 

 

posted @ 2023-01-06 19:36  一曲轻扬  阅读(331)  评论(0编辑  收藏  举报