USEGEAR

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

unigui菜单【3】

unigui菜单TuniTreeView

根据数据库表中的内容,显示菜单的处理:

复制代码
function TMainForm.CreateMenu: Integer;
var
  myMenuPoint : PMyMenuRec;
  i :Integer;
  menu_id ,menu_name, menu_url: string;
  mynodes : TUniTreeNodes;
  mynode,tmp_node : TUniTreeNode;
begin //建立菜单树
  MenuTree.Items.Clear;
  mynodes := MenuTree.Items;
  MenuTree.BeginUpdate;
  with UniMainModule do
    begin //取表中菜单
      fdqryBase.Open('select* from sm_menu order by menu_id');
      fdqryBase.First;
      while not fdqryBase.Eof do
        begin
          menu_id := fdqryBase.FieldByName('menu_id').AsString;
          menu_name := fdqryBase.FieldByName('menu_name').AsString;
          if fdqryBase.FieldByName('menu_url').AsString = '' then
            begin  //确认是否根菜单
              mynode := mynodes.Add(nil,fdqryBase.FieldByName('menu_name').AsString);
            end else
            begin

              tmp_node := mynodes.add(mynode,menu_name);
              New(myMenuPoint);
              myMenuPoint^.menu_id := menu_id;
              myMenuPoint^.menu_name := menu_name;
              myMenuPoint^.menu_url := fdqryBase.FieldByName('menu_url').AsString;
              tmp_node.Data :=  myMenuPoint;

            end;
          fdqryBase.Next;
        end;
    end;
  MenuTree.EndUpdate;

  for i := 0 to MenuTree.Items.Count-1 do
    begin
      mynode := MenuTree.Items[i];
      if mynode.HasChildren then begin
        mynode.ImageIndex := 0;
        mynode.SelectedIndex := 0;
      end else begin
        mynode.ImageIndex := 2;
        mynode.SelectedIndex := 3;
      end;
  end;
  MenuTree.FullCollapse;
end;
View Code
复制代码

其中item的node有二个属性caption和data。把指针data用起来,在点击时自动调用显示form。

type
   PMyMenuRec = ^TMyMenuRec;
   TMyMenuRec = Record
     menu_id:string;
     menu_name:string;
     menu_url:string;
   end;

点击菜单项的处理

procedure TMainForm.MenuTreeClick(Sender: TObject);
begin
  if Assigned(MenuTree.Selected.data) then
     begin
       if PMyMenuRec(MenuTree.Selected.data).menu_url<>'' then
        ShowFrame(PMyMenuRec(MenuTree.Selected.data).menu_name,PMyMenuRec(MenuTree.Selected.data).menu_url);
     end;
end;

 

复制代码
function TMainForm.ShowFrame(Caption, FormClassName: string): Integer;
var
i: integer;
sheet: TUniTabSheet;
begin
  for i := 0 to page.PageCount - 1 do
  begin
  if page.Pages[i].Caption = Caption then
    begin
      page.ActivePageIndex := i;
      exit;
    end;
  end;
  sheet := TUniTabSheet.Create(Self);
  sheet.Closable := True;
  sheet.Caption := Caption;
  sheet.PageControl := page;

  FCurrentFrame :=  TUniFrameClass(FindClass(FormClassName)).Create(Self);
  FCurrentFrame.Align := alClient;
  FCurrentFrame.Parent := sheet;
  page.ActivePage := sheet;

end;
复制代码

表菜单记录。

10    登记客户信息    NULL
1001    新客户    TUniFrmeWebEmbedBase
1002    修改客户    222
20    客户查询    NULL
2001    按地区    43
2002    按行业    3452
30    客户信息统计    NULL
40    客户新机报表    NULL

表结构

复制代码
CREATE TABLE [dbo].[SM_menu](
    [menu_id] [nvarchar](32) NOT NULL,
    [menu_name] [nvarchar](30) NULL,
    [menu_url] [nvarchar](50) NULL,
 CONSTRAINT [PK153] PRIMARY KEY CLUSTERED 
(
    [menu_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
复制代码

 

posted on   USEGEAR  阅读(1288)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
历史上的今天:
2016-08-03 firebird的递归查询
点击右上角即可分享
微信分享提示