delphi 做一个动态PopupMenu菜单
效果要求: 点击树形结构不同的行,弹出不一样的下拉菜单
窗体设计:

数据库设计:
因为树形结构用的是DEV的TcxDBTreeList组件,ID/组织名称/父级ID/图片ID这四个是必须的.
类型是用来判断是组织属性的(0为公司,1为部门,你也可以分的更细一点).部门是可有可无的.
树形结构字段绑定:

TcxDBTreeList额外的知识点:
一.当前选择的节点: Node:=cxDBTreeList1.selections[0],如果TcxDBTreeList没有数据或者没有选中节点,则返回nil值
二.判断Node下是否有子节点: if Node.HasChildren then
三.如果要取当前值,应该直接访问数据集,而不是在组件里瞎搞.

实际效果:
当点先RKDX公司时,有三个菜单
当点选其它部门时,只有两个菜单


取消 [部门] 字段的显示,会更加简洁:

核心代码:
procedure TForm1.PopupMenu1Popup(Sender: TObject); var iType: Integer; begin with FDQuery1 do begin if RecordCount = 0 then // 当没有数据时 begin m1.Visible := True; N1.Visible := False; N2.Visible := False; N3.Visible := False; Exit; end;
//这里应该直接访问数据集,而不是去检查树形结构当前点选的是哪一个,很多人会犯这种错误 iType := FieldByName('类型').AsInteger; if iType = 0 then // 公司 begin m1.Visible := True; N1.Visible := True; N2.Visible := True; N3.Visible := False; Exit; end; if iType = 1 then // 部门 begin m1.Visible := False; N1.Visible := False; N2.Visible := True; N3.Visible := True; Exit; end; end; end;
2023-03-11更新
TcxDBTreeList有时候存在异常.实际表现为: 我的目录数据有三百行左右,层级也才两层,默认查询控件(FDQuery)为激活状态,打开窗口时,SQL加载至少需要5秒钟以,我问了群里了大神,他们的建议是:
-----------------------------------------------------------------------------


解决方案,删除掉原来的TcxDBTreeList控件,再重新添加TcxDBTreeList,改为原来的名字,这样就可以了

浙公网安备 33010602011771号