分享

使用dxNavBar动态创建应用程序菜单

 npkaida 2016-03-20
  一、如何动态创建dxNavBar内容:
  1. function TMain.GetAcitonByCaption(const aCategory,aCaption: string): Integer;  
  2. var  
  3.   i: Integer;  
  4. begin  
  5.   Result := -1;  
  6.   for i := 0 to ActionManager1.ActionCount-1 do  
  7.   begin  
  8.     if System.SysUtils.SameText(TAction(ActionManager1.Actions[i]).Category,aCategory) and  
  9.        System.SysUtils.SameText(TAction(ActionManager1.Actions[i]).Caption,aCaption)  
  10.     then  
  11.     begin  
  12.       Result := i;  
  13.       Exit;  
  14.     end;  
  15.   end;  
  16. end;  
  17.   
  18. procedure TMain.FormShow(Sender: TObject);  
  19. var  
  20.   aBarItem:TdxNavBarItem;  
  21.   aBarGroup:TdxNavBargroup;  
  22.   iAction :Integer;  
  23. begin  
  24.   dxNavBar1.Items.Clear;  
  25.   dxNavBar1.Groups.Clear;  
  26.   //++++++++++++++++++++++++++++++++++++++++++++++++//  
  27.   aBarGroup:=dxNavBar1.Groups.Add;  
  28.   aBarGroup.Caption := '系统设置';  
  29.    
  30.   aBarItem:=dxNavBar1.Items.Add;  
  31.   aBarItem.Caption:= '操作员管理';  
  32.   //aBarItem.OnClick:= button1.OnClick; //绑定事件  
  33.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  34.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  35.   
  36.   aBarGroup.CreateLink(aBarItem); aBarItem:=dxNavBar1.Items.Add;  
  37.   aBarItem.Caption := '权限管理';  
  38.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  39.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]); aBarGroup.CreateLink(aBarItem);  
  40.   
  41.   aBarItem:=dxNavBar1.Items.Add;  
  42.   aBarItem.Caption := '报表设计中心';  
  43.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  44.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  45.   aBarGroup.CreateLink(aBarItem);  
  46.   
  47.   aBarItem:=dxNavBar1.Items.Add;  
  48.   aBarItem.Caption:= '系统退出';  
  49.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  50.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  51.   aBarGroup.CreateLink(aBarItem);  
  52.   
  53.   //++++++++++++++++++++++++++++++++++++++++++++++++//  
  54.   aBarGroup := dxNavBar1.Groups.Add;  
  55.   aBarGroup.Caption := '接口管理';  
  56.   
  57.   aBarItem:=dxNavBar1.Items.Add;  
  58.   aBarItem.Caption := '学生基本信息接口';  
  59.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  60.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  61.   aBarGroup.CreateLink(aBarItem);  
  62.   
  63.   aBarItem:=dxNavBar1.Items.Add;  
  64.   aBarItem.Caption := '学生教学任务接口';  
  65.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  66.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  67.   aBarGroup.CreateLink(aBarItem);  
  68.   
  69.   aBarItem:=dxNavBar1.Items.Add; aBarItem.Caption := '学生教材缴费接口';  
  70.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);      aBarItem.Action := TAction(ActionManager1.Actions[iAction]); aBarGroup.CreateLink(aBarItem);  
  71.   
  72.   aBarItem:=dxNavBar1.Items.Add;  
  73.   aBarItem.Caption := '学生教材结算接口';  
  74.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  75.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  76.   aBarGroup.CreateLink(aBarItem);  
  77.   //++++++++++++++++++++++++++++++++++++++++++++++++//  
  78.   aBarGroup := dxNavBar1.Groups.Add;  
  79.   aBarGroup.Caption := '帮助';  
  80.   
  81.   aBarItem:=dxNavBar1.Items.Add;  
  82.   aBarItem.Caption := '用户手册';  
  83.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  84.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  85.   aBarGroup.CreateLink(aBarItem);  
  86.   
  87.   aBarItem.Caption := '关于……';  
  88.   iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);  
  89.   aBarItem.Action := TAction(ActionManager1.Actions[iAction]);  
  90.   aBarGroup.CreateLink(aBarItem);  
  91. end;   

二、实际生成一个左边的dxBar菜单例子:

  1. procedure TMain.InitMenuItem(dxNavBar1:TdxNavBar);  
  2. var  
  3.   iAction: Integer;  
  4.   aTag:string;  
  5.   sMenu:string;  
  6.   
  7.   dxNavBarGroup:TdxNavBarGroup;  
  8.   dxNavBarItem:TdxNavBarItem;  
  9.   dxNavBarLink:TdxNavBarItemLink;  
  10.   dxNavBarSeparator:TdxNavBarSeparator;  
  11.   cds_Master,cds_Delta:TClientDataSet;  
  12.   
  13.   procedure InitdxNavBar;  
  14.   begin  
  15.     dxNavBar1.Groups.Clear;  
  16.     with dxNavBar1.DefaultStyles do  
  17.     begin  
  18.       GroupHeader.Font.Name := '微软雅黑';  
  19.       GroupHeader.Font.Style := [fsBold];  
  20.       GroupHeader.Font.Size := 9;  
  21.       GroupHeader.Font.Color := clBlack;  
  22.   
  23.       Item.Font.Name := '微软雅黑';  
  24.       Item.Font.Style := [];  
  25.       Item.Font.Size := 9;  
  26.       Item.Font.Color := clBlack;  
  27.   
  28.       ItemHotTracked.Font.Color := clBlue;  
  29.       ItemHotTracked.Font.Style := [fsUnderline];  
  30.   
  31.       ItemPressed.Font.Color := clBlue;  
  32.       ItemPressed.Font.Style := [];  
  33.     end;  
  34.   end;  
  35.   procedure OpenMaster;  
  36.   var  
  37.     sqlstr:string;  
  38.   begin  
  39.     if gb_Czy_Level='-1' then  
  40.       sqlstr := 'select 项目名称,Id from 菜单项目表 where pId=-1 order by id'  
  41.     else  
  42.       sqlstr := 'select 项目名称,Id from view_操作员权限表 where 操作员编号='+  
  43.                 quotedstr(gb_Czy_ID)+' and pid=-1 order by id';  
  44.     cds_Master.XMLData := dm.OpenData(sqlstr);  
  45.   end;  
  46.   procedure OpenDelta(const id:integer);  
  47.   var  
  48.     sqlstr:string;  
  49.   begin  
  50.     if gb_Czy_Level='-1' then  
  51.       sqlstr := 'select * from 菜单项目表 where pId='+IntToStr(id)+' and pId<>-1 order by id'  
  52.     else  
  53.       sqlstr := 'select * from view_操作员权限表 where 操作员编号='+quotedstr(gb_Czy_ID)+  
  54.                 ' and 是否可用=1 and pId='+IntToStr(id)+' and pId<>-1 order by id';  
  55.     cds_Delta.XMLData := dm.OpenData(sqlstr);  
  56.   end;  
  57. begin  
  58.   cds_Master := TClientDataSet.Create(nil);  
  59.   cds_Delta := TClientDataSet.Create(nil);  
  60.   try  
  61.     InitdxNavBar;//设置一些格式,清除设计期的数据等  
  62.     OpenMaster;  
  63.     while not cds_Master.Eof do  
  64.     begin  
  65.       dxNavBarGroup := dxNavBar1.Groups.Add;  
  66.       dxNavBar1.Hint := cds_Master.FieldByName('项目名称').AsString;  
  67.       dxNavBarGroup.Caption := Copy(dxNavBar1.Hint,4,100);  
  68.       dxNavBarGroup.Visible := True;  
  69.       dxNavBarGroup.Expandable := True;  
  70.       dxNavBarGroup.Expanded := dxNavBarGroup.Index < 3;  
  71.       //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//  
  72.   
  73.       OpenDelta(cds_Master.FieldByName('id').AsInteger);  
  74.   
  75.       cds_Delta.First;  
  76.       aTag := cds_Delta.FieldByName('Tag').AsString;  
  77.       while not cds_Delta.Eof do  
  78.       begin  
  79.         sMenu := cds_Delta.FieldByName('项目名称').AsString;  
  80.         iAction := GetAcitonByCaption(cds_Master.FieldByName('项目名称').AsString,sMenu);  
  81.   
  82.         if iAction<>-1 then  
  83.         begin  
  84.   
  85.           //创建一个dxBarButton,相当于创建一个菜单项  
  86.           dxNavBarItem := dxNavBar1.Items.Add;  
  87.           dxNavBarItem.Action := TAction(ActionManger1.Actions[iAction]);  
  88.   
  89.           dxNavBarGroup := TdxNavBarGroup(dxNavBar1.Groups.ItemByCaption(Copy(ActionManger1.Actions[iAction].Category,4,100)));  
  90.           dxNavBarLink := dxNavBarGroup.CreateLink(dxNavBarItem);  
  91.           dxNavBarGroup.LinksUseSmallImages := True;  
  92.           //==================加分隔线,但是不成功,不知道为何?==============//  
  93.           if (cds_Delta.FieldByName('Tag').AsString<>aTag) then  
  94.           begin  
  95.             aTag := cds_Delta.FieldByName('Tag').AsString;  
  96.             if (cds_Delta.RecNo<cds_Delta.RecordCount) then  
  97.             begin  
  98.               //dxNavBarSeparator := TdxNavBarSeparator(dxNavBar1.Items.Add);//  
  99.               //dxNavBarSeparator.Name := 'dxNavBarSeparator1';  
  100.               //dxNavBarLink := dxNavBarGroup.CreateLink(dxNavBarSeparator);  
  101.               //dxNavBarLink.DisplayName := '';//  
  102.             end;  
  103.           end;  
  104.           //==================================================================//  
  105.         end;  
  106.         cds_Delta.Next;  
  107.       end; //end while ...  
  108.       cds_Master.Next;  
  109.     end;  
  110.   finally  
  111.     cds_Delta.Free;  
  112.     cds_Master.Free;  
  113.   end;  
  114. end;  

三、动态生成dxBarManager内容例子(即生成“主菜单”--MainMenu):
  1. procedure TMain.InitMenuItem(dxBarManager1: TdxBarManager);  
  2. var  
  3.   i,iAction: Integer;  
  4.   iNo,aTag:string;  
  5.   sName,sMenu,sCategory:string;  
  6.   dxBarSubItem:TdxBarSubItem;  
  7.   dxBarButton:TdxBarButton;  
  8.   dxBarItemLink:TdxBarItemLink;  
  9.   dxBarSeparator:TdxBarSeparator; //分隔线  
  10.   cds_Master,cds_Temp:TClientDataSet;  
  11.   procedure ReleasedxBarManager;  
  12.   var  
  13.     i:Integer;  
  14.   begin  
  15.     //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//  
  16.     dxBarManager1Bar1.ItemLinks.Clear;  
  17.     for i := dxBarManager1Bar1.ItemLinks.Count-1 downto 0 do  
  18.       dxBarManager1Bar1.ItemLinks.Delete(dxBarManager1Bar1.ItemLinks.Count-1);  
  19.     for i := dxBarManager1.ItemCount-1 downto 0 do  
  20.       dxBarManager1.Items[i].Free;  
  21.     for i := dxBarManager1.GroupCount-1 downto 0 do  
  22.       dxBarManager1.Groups[i].Free;  
  23.   
  24.     dxBarManager1.Categories.Clear;  
  25.     dxBarManager1.Categories.Add('default');  
  26.     //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//  
  27.   end;  
  28.   procedure OpenMaster;  
  29.   var  
  30.     sqlstr:string;  
  31.   begin  
  32.     if gb_Czy_Level='-1' then  
  33.       sqlstr := 'select 项目名称,Id from 菜单项目表 where pId=-1 order by id'  
  34.     else  
  35.       sqlstr := 'select 项目名称,Id from view_操作员权限表 where 操作员编号='+  
  36.                 quotedstr(gb_Czy_ID)+' and pid=-1 order by id';  
  37.     cds_Master.XMLData := dm.OpenData(sqlstr);  
  38.   end;  
  39.   procedure OpenDelta(const id:integer);  
  40.   var  
  41.     sqlstr:string;  
  42.   begin  
  43.     if gb_Czy_Level='-1' then  
  44.       sqlstr := 'select * from 菜单项目表 where pId='+IntToStr(id)+' and pId<>-1 order by id'  
  45.     else  
  46.       sqlstr := 'select * from view_操作员权限表 where 操作员编号='+quotedstr(gb_Czy_ID)+  
  47.                 ' and 是否可用=1 and pId='+IntToStr(id)+' and pId<>-1 order by id';  
  48.     cds_Temp.XMLData := dm.OpenData(sqlstr);  
  49.   end;  
  50. begin  
  51.   ReleasedxBarManager;//清理dxBarManager  
  52.   cds_Master := TClientDataSet.Create(nil);  
  53.   cds_Temp := TClientDataSet.Create(nil);  
  54.   try  
  55.     OpenMaster;  
  56.     while not cds_Master.Eof do  
  57.     begin  
  58.       OpenDelta(cds_Master.FieldByName('id').AsInteger);  
  59.       if cds_Temp.RecordCount>0 then  
  60.       begin  
  61.         sCategory := cds_Master.FieldByName('项目名称').AsString;  
  62.         iNo := Copy(sCategory,1,2);  
  63.         sName := Format('dxBarSubItem%s',[iNo]);//取出【01.系统设置】中的01数字出来];  
  64.         sCategory := Copy(sCategory,4,100);  
  65.   
  66.         //创建一个dxSubItem,相当于创建一个主菜单项  
  67.         dxBarSubItem := TdxBarSubItem.Create(Self);  
  68.         dxBarSubItem.Caption := sCategory;  
  69.         dxBarSubItem.Category := 0;  
  70.         dxBarSubItem.Visible := ivAlways;//ivNever;//  
  71.         dxBarSubItem.Name := sName;  
  72.   
  73.         //放置在dxBar上  
  74.         dxBarItemLink := dxBarSubItem.BarManager.Bars[0].ItemLinks.Add;  
  75.         dxBarItemLink.Item := dxBarSubItem;  
  76.       end;  
  77.       //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//  
  78.   
  79.       cds_Temp.First;  
  80.       aTag := cds_Temp.FieldByName('Tag').AsString;  
  81.       while not cds_Temp.Eof do  
  82.       begin  
  83.         sMenu := cds_Temp.FieldByName('项目名称').AsString;  
  84.         iAction := GetAcitonByCaption(cds_Master.FieldByName('项目名称').AsString,sMenu);  
  85.   
  86.         if iAction<>-1 then  
  87.         begin  
  88.           if (cds_Temp.FieldByName('Tag').AsString<>aTag) then  
  89.           begin  
  90.             aTag := cds_Temp.FieldByName('Tag').AsString;  
  91.             if (cds_Temp.RecNo<>1) then //and (cds_Temp.RecNo<>cds_Temp.RecordCount) then  
  92.             begin  
  93.               dxBarSeparator := TdxBarSeparator.Create(Self);  
  94.               dxBarSeparator.ShowCaption := False;  
  95.               dxBarItemLink := dxBarSubItem.ItemLinks.Add;  
  96.               dxBarItemLink.Item := dxBarSeparator;  
  97.             end;  
  98.           end;  
  99.           //创建一个dxBarButton,相当于创建一个菜单项  
  100.           dxBarButton := TdxBarButton.Create(Self);//内存资源由Self负责管理  
  101.           dxBarButton.Caption := sMenu;  
  102.           dxBarButton.Action := TAction(ActionManger1.Actions[iAction]);  
  103.           dxBarButton.Category := 0;  
  104.           dxBarButton.Tag := TAction(ActionManger1.Actions[iAction]).Tag;  
  105.           //dxBarButton.Name := TAction(ActionManger1.Actions[iAction]).Name;//Format('dxBarButton_%-2d',[ii]);  
  106.   
  107.           dxBarItemLink := dxBarSubItem.ItemLinks.Add;  
  108.           dxBarItemLink.Item := dxBarButton;  
  109.         end;  
  110.         cds_Temp.Next;  
  111.       end; //end while ...  
  112.       cds_Master.Next;  
  113.     end;  
  114.   finally  
  115.     cds_Temp.Free;  
  116.     cds_Master.Free;  
  117.   end;  
  118. end;  
四、在实际项目中的一个截图:



五、那么能否从dxBarManager中导入内容到dxNavBar中呢?可以:

  1. procedure TForm1.dxBarManagerTodxNavBar;  
  2. var  
  3.   i, j: Integer;  
  4.   item: TdxBarSubItem;  
  5.   group: TdxNavBarGroup;  
  6.   bar: TdxNavBarItem;  
  7. begin  
  8.   dxNavBar1.Groups.Clear;  
  9.   for i := 0 to dxBarManager1Bar1.ItemLinks.Count - 1 do  
  10.   begin  
  11.     item := TdxBarSubItem(dxBarManager1Bar1.ItemLinks[i].Control.Item);     
  12.     group := dxNavBar1.Groups.Add;  
  13.     group.Caption := item.Caption;  
  14.     for j := 0 to item.ItemLinks.Count - 1 do  
  15.     begin  
  16.       bar := dxNavBar1.Items.Add;  
  17.       bar.Caption := item.ItemLinks.Items[j].Caption;  
  18.       bar.OnClick := dxNavBarItemClick;  
  19.       bar.SmallImageIndex := 0;  
  20.       group.CreateLink(bar);  
  21.     end;  
  22.   end;  
  23. end;  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多