You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TDBGridEh类归属查询及多组件子元素通用权限处理方案咨询

问题解答

1. TDBGridEh类归属与报错原因

TDBGridEh是第三方EhLib组件库的网格控件,它的继承链为 TComponent → TControl → TCustomControl → TCustomGrid → TCustomDBGridEh → TDBGridEh,它并不继承自VCL原生的TCustomDBGrid、TDBGrid,所以你写的is TCustomDBGrid、is TDBGrid判断永远返回假,只有is TCustomGrid会命中。
你遇到的「未声明的标识符」报错,是因为没有在单元的uses部分引入EhLib对应的DBGridEh单元,添加后即可正常识别TDBGridEh类型。

2. 多控件统一权限控制实现方案

可以实现同时适配三种控件的统一逻辑,修改后的完整代码如下:
首先在单元的uses列表中添加DBGridEh单元,再替换原有过程代码:

procedure RightsOnSubElements(AForm: TForm; AComp: TComponent);

  // 查找原生TDBGrid的对应列
  function FindFieldColumn_DBGrid(AGrid: TDBGrid; const FieldName: String): TColumn;
  var
    i: Integer;
  begin
    Result := nil;
    for i := 0 to AGrid.Columns.Count - 1 do
      if AnsiCompareText(AGrid.Columns[i].FieldName, FieldName) = 0 then
      begin
        Result := AGrid.Columns[i];
        Break;
      end;
  end;

  // 查找TDBGridEh的对应列
  function FindFieldColumn_DBGridEh(AGrid: TDBGridEh; const FieldName: String): TColumnEh;
  var
    i: Integer;
  begin
    Result := nil;
    for i := 0 to AGrid.Columns.Count - 1 do
      if AnsiCompareText(AGrid.Columns[i].FieldName, FieldName) = 0 then
      begin
        Result := AGrid.Columns[i];
        Break;
      end;
  end;
     
var
  Column : TColumn;
  ColumnEh : TColumnEh;
  i: Integer;
begin
  fMain.qSubElements.Close;
  fMain.qSubElements.Parambyname('Form_Name').AsString := AForm.Name;
  fMain.qSubElements.Parambyname('ROLE_ID').AsInteger := ROLE_ID;
  fMain.qSubElements.Parambyname('name').AsString := AComp.Name;
  fMain.qSubElements.Open;
  if fMain.qSubElements.RecordCount > 0 then begin
    while not fMain.qSubElements.Eof do begin
      for i := 0 to AForm.ComponentCount - 1 do
        // 处理菜单项逻辑保持不变
        if (AForm.Components[i] is TMenuItem) then begin
          if UpperCase(AForm.Components[i].Name) = UpperCase(fMain.qSubElements.FieldByName('Sub_Name').AsString) then
          begin
            (AForm.Components[i] as TMenuItem).Visible := fmain.qSubElements.FieldByName('Visible').AsBoolean;
            (AForm.Components[i] as TMenuItem).Enabled := fmain.qSubElements.FieldByName('Enabled').AsBoolean;
          end;
        end
        // 处理原生TDBGrid
        else if (AForm.Components[i] is TDBGrid) then begin
          if UpperCase(AForm.Components[i].Name) = UpperCase(fMain.qSubElements.FieldByName('Name').AsString) then
          begin
            Column := FindFieldColumn_DBGrid(AComp as TDBGrid, fMain.qSubElements.FieldByName('sub_name').AsString);
            if Assigned(Column) then Column.Visible := fMain.qSubElements.FieldByName('Visible').AsBoolean;
          end;
        end
        // 新增TDBGridEh处理分支
        else if (AForm.Components[i] is TDBGridEh) then begin
          if UpperCase(AForm.Components[i].Name) = UpperCase(fMain.qSubElements.FieldByName('Name').AsString) then
          begin
            ColumnEh := FindFieldColumn_DBGridEh(AComp as TDBGridEh, fMain.qSubElements.FieldByName('sub_name').AsString);
            if Assigned(ColumnEh) then ColumnEh.Visible := fMain.qSubElements.FieldByName('Visible').AsBoolean;
          end;
      end;
                
      fMain.qSubElements.Next;
    end;
  end;
end;

修改说明

  • 新增了TDBGridEh专属的列查找函数,因为TDBGridEh的列类型为TColumnEh,与VCL原生TColumn不兼容
  • 新增了TDBGridEh的类型判断分支,权限控制逻辑与原生TDBGrid保持一致,仅做了类型适配
  • 原有TMainMenu子元素、TDBGrid的处理逻辑完全保留,不需要修改原有业务逻辑

内容的提问来源于stack exchange,提问作者basti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:24:02