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
相关产品推荐
相关产品推荐

