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,改为原来的名字,这样就可以了

 

posted @ 2022-08-21 17:22  一曲轻扬  阅读(1133)  评论(0)    收藏  举报