使用cxTreeList创建权限管理

设计数据库结构及内容格式如下

设计界面如下,打开、保存、打印这三列Properties改为CheckBox方式显示

加载菜单代码如下

procedure TForm1.Button1Click(Sender: TObject);
var
  pNode: TcxTreeListNode;  // 父节点
  RootKey: string;  // 根节点的键值
  RootNode, ChildNode: TcxTreeListNode;  // 根节点和子节点

// 根据键值查找对应的根节点

  function FindRootNodeByKey(const Key: string): TcxTreeListNode;
  var
    i: Integer;
  begin
    for i := 0 to cxTreeList1.Count - 1 do
    begin
      Result := cxTreeList1.Items[i];
      if CompareText(Result.Values[4], Key) = 0 then
        Exit;
    end;
    Result := nil;
  end;

begin
  cxTreeList1.Clear;  // 清空树列表

  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.add('select * from db.dbo.Menu');  // 查询数据库中的菜单数据
    SQL.add('order by id');  // 按ID排序
    Open;

    if RecordCount > 0 then
    begin
      First;
      while not eof do
      begin
        if FieldByName('pid').AsInteger = 0 then
        begin
      // 如果父节点的pid为0,则为根节点
          pNode := cxTreeList1.Add;
          pNode.Values[0] := FieldByName('caption').AsString;  // 设置节点的文本
          pNode.Values[1] := False;
          pNode.Values[2] := False;
          pNode.Values[3] := False;
          pNode.Values[4] := FieldByName('id').AsString;  // 设置节点的键值
        end
        else
        begin
      // 如果父节点的pid不为0,则为子节点
          RootKey := FieldByName('pid').AsString;
          RootNode := FindRootNodeByKey(RootKey);  // 根据键值查找对应的根节点
          ChildNode := RootNode.AddChild;  // 在根节点下添加子节点
          ChildNode.Values[0] := FieldByName('caption').AsString;  // 设置节点的文本
          ChildNode.Values[1] := False;
          ChildNode.Values[2] := False;
          ChildNode.Values[3] := False;
          ChildNode.Values[4] := FieldByName('id').AsString;  // 设置节点的键值
        end;
        Next;
      end;
    end;
  end;
end;

这段代码是一个按钮的点击事件处理程序。它从数据库中查询菜单数据,并将数据显示在一个树状列表控件中。代码首先清空树列表,然后执行数据库查询操作。对于每一条查询结果,根据父节点的pid字段判断是根节点还是子节点,并将节点的文本和键值设置好,然后添加到树列表中。最后,更新游标到下一条查询结果,直到查询结束。

展开和关闭按钮事件

  cxTreeList1.FullExpand;  //全部展开
  cxTreeList1.FullCollapse;//全部关闭

选中后显示选中内容代码如下

procedure TForm1.cxTreeList1SelectionChanged(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.Add('选中项:' + cxTreeList1.FocusedNode.Values[0]);
  Memo1.Lines.Add('打开:' + cxTreeList1.FocusedNode.Values[1]);
  Memo1.Lines.Add('保存:' + cxTreeList1.FocusedNode.Values[2]);
  Memo1.Lines.Add('打印:' + cxTreeList1.FocusedNode.Values[3]);
end;

循环显示勾选的内容代码如下

procedure TForm1.Button4Click(Sender: TObject);
var
  i: Integer;
begin
  Memo1.Clear;
  for i := 0 to cxTreeList1.AbsoluteCount - 1 do
  begin
    if cxTreeList1.AbsoluteItems[i].Values[1] = True then
    begin
      Memo1.Lines.Add('打开:' + cxTreeList1.AbsoluteItems[i].Values[0]);
    end;
    if cxTreeList1.AbsoluteItems[i].Values[2] = True then
    begin
      Memo1.Lines.Add('保存:' + cxTreeList1.AbsoluteItems[i].Values[0]);
    end;
    if cxTreeList1.AbsoluteItems[i].Values[3] = True then
    begin
      Memo1.Lines.Add('打印:' + cxTreeList1.AbsoluteItems[i].Values[0]);
    end;
  end;
end;

效果展示

 

posted @ 2024-01-22 21:18  liessay  阅读(103)  评论(0编辑  收藏  举报