一、如何动态创建dxNavBar内容:- function TMain.GetAcitonByCaption(const aCategory,aCaption: string): Integer;
- var
- i: Integer;
- begin
- Result := -1;
- for i := 0 to ActionManager1.ActionCount-1 do
- begin
- if System.SysUtils.SameText(TAction(ActionManager1.Actions[i]).Category,aCategory) and
- System.SysUtils.SameText(TAction(ActionManager1.Actions[i]).Caption,aCaption)
- then
- begin
- Result := i;
- Exit;
- end;
- end;
- end;
-
- procedure TMain.FormShow(Sender: TObject);
- var
- aBarItem:TdxNavBarItem;
- aBarGroup:TdxNavBargroup;
- iAction :Integer;
- begin
- dxNavBar1.Items.Clear;
- dxNavBar1.Groups.Clear;
- //++++++++++++++++++++++++++++++++++++++++++++++++//
- aBarGroup:=dxNavBar1.Groups.Add;
- aBarGroup.Caption := '系统设置';
-
- aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption:= '操作员管理';
- //aBarItem.OnClick:= button1.OnClick; //绑定事件
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
-
- aBarGroup.CreateLink(aBarItem); aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption := '权限管理';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]); aBarGroup.CreateLink(aBarItem);
-
- aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption := '报表设计中心';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
- aBarGroup.CreateLink(aBarItem);
-
- aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption:= '系统退出';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
- aBarGroup.CreateLink(aBarItem);
-
- //++++++++++++++++++++++++++++++++++++++++++++++++//
- aBarGroup := dxNavBar1.Groups.Add;
- aBarGroup.Caption := '接口管理';
-
- aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption := '学生基本信息接口';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
- aBarGroup.CreateLink(aBarItem);
-
- aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption := '学生教学任务接口';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
- aBarGroup.CreateLink(aBarItem);
-
- aBarItem:=dxNavBar1.Items.Add; aBarItem.Caption := '学生教材缴费接口';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu); aBarItem.Action := TAction(ActionManager1.Actions[iAction]); aBarGroup.CreateLink(aBarItem);
-
- aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption := '学生教材结算接口';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
- aBarGroup.CreateLink(aBarItem);
- //++++++++++++++++++++++++++++++++++++++++++++++++//
- aBarGroup := dxNavBar1.Groups.Add;
- aBarGroup.Caption := '帮助';
-
- aBarItem:=dxNavBar1.Items.Add;
- aBarItem.Caption := '用户手册';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
- aBarGroup.CreateLink(aBarItem);
-
- aBarItem.Caption := '关于……';
- iAction := GetAcitonByCaption(cds_Master.FieldByName(aBarItem.Caption).AsString,sMenu);
- aBarItem.Action := TAction(ActionManager1.Actions[iAction]);
- aBarGroup.CreateLink(aBarItem);
- end;
二、实际生成一个左边的dxBar菜单例子:
三、动态生成dxBarManager内容例子(即生成“主菜单”--MainMenu):- procedure TMain.InitMenuItem(dxBarManager1: TdxBarManager);
- var
- i,iAction: Integer;
- iNo,aTag:string;
- sName,sMenu,sCategory:string;
- dxBarSubItem:TdxBarSubItem;
- dxBarButton:TdxBarButton;
- dxBarItemLink:TdxBarItemLink;
- dxBarSeparator:TdxBarSeparator; //分隔线
- cds_Master,cds_Temp:TClientDataSet;
- procedure ReleasedxBarManager;
- var
- i:Integer;
- begin
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
- dxBarManager1Bar1.ItemLinks.Clear;
- for i := dxBarManager1Bar1.ItemLinks.Count-1 downto 0 do
- dxBarManager1Bar1.ItemLinks.Delete(dxBarManager1Bar1.ItemLinks.Count-1);
- for i := dxBarManager1.ItemCount-1 downto 0 do
- dxBarManager1.Items[i].Free;
- for i := dxBarManager1.GroupCount-1 downto 0 do
- dxBarManager1.Groups[i].Free;
-
- dxBarManager1.Categories.Clear;
- dxBarManager1.Categories.Add('default');
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
- end;
- procedure OpenMaster;
- var
- sqlstr:string;
- begin
- if gb_Czy_Level='-1' then
- sqlstr := 'select 项目名称,Id from 菜单项目表 where pId=-1 order by id'
- else
- sqlstr := 'select 项目名称,Id from view_操作员权限表 where 操作员编号='+
- quotedstr(gb_Czy_ID)+' and pid=-1 order by id';
- cds_Master.XMLData := dm.OpenData(sqlstr);
- end;
- procedure OpenDelta(const id:integer);
- var
- sqlstr:string;
- begin
- if gb_Czy_Level='-1' then
- sqlstr := 'select * from 菜单项目表 where pId='+IntToStr(id)+' and pId<>-1 order by id'
- else
- sqlstr := 'select * from view_操作员权限表 where 操作员编号='+quotedstr(gb_Czy_ID)+
- ' and 是否可用=1 and pId='+IntToStr(id)+' and pId<>-1 order by id';
- cds_Temp.XMLData := dm.OpenData(sqlstr);
- end;
- begin
- ReleasedxBarManager;//清理dxBarManager
- cds_Master := TClientDataSet.Create(nil);
- cds_Temp := TClientDataSet.Create(nil);
- try
- OpenMaster;
- while not cds_Master.Eof do
- begin
- OpenDelta(cds_Master.FieldByName('id').AsInteger);
- if cds_Temp.RecordCount>0 then
- begin
- sCategory := cds_Master.FieldByName('项目名称').AsString;
- iNo := Copy(sCategory,1,2);
- sName := Format('dxBarSubItem%s',[iNo]);//取出【01.系统设置】中的01数字出来];
- sCategory := Copy(sCategory,4,100);
-
- //创建一个dxSubItem,相当于创建一个主菜单项
- dxBarSubItem := TdxBarSubItem.Create(Self);
- dxBarSubItem.Caption := sCategory;
- dxBarSubItem.Category := 0;
- dxBarSubItem.Visible := ivAlways;//ivNever;//
- dxBarSubItem.Name := sName;
-
- //放置在dxBar上
- dxBarItemLink := dxBarSubItem.BarManager.Bars[0].ItemLinks.Add;
- dxBarItemLink.Item := dxBarSubItem;
- end;
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
-
- cds_Temp.First;
- aTag := cds_Temp.FieldByName('Tag').AsString;
- while not cds_Temp.Eof do
- begin
- sMenu := cds_Temp.FieldByName('项目名称').AsString;
- iAction := GetAcitonByCaption(cds_Master.FieldByName('项目名称').AsString,sMenu);
-
- if iAction<>-1 then
- begin
- if (cds_Temp.FieldByName('Tag').AsString<>aTag) then
- begin
- aTag := cds_Temp.FieldByName('Tag').AsString;
- if (cds_Temp.RecNo<>1) then //and (cds_Temp.RecNo<>cds_Temp.RecordCount) then
- begin
- dxBarSeparator := TdxBarSeparator.Create(Self);
- dxBarSeparator.ShowCaption := False;
- dxBarItemLink := dxBarSubItem.ItemLinks.Add;
- dxBarItemLink.Item := dxBarSeparator;
- end;
- end;
- //创建一个dxBarButton,相当于创建一个菜单项
- dxBarButton := TdxBarButton.Create(Self);//内存资源由Self负责管理
- dxBarButton.Caption := sMenu;
- dxBarButton.Action := TAction(ActionManger1.Actions[iAction]);
- dxBarButton.Category := 0;
- dxBarButton.Tag := TAction(ActionManger1.Actions[iAction]).Tag;
- //dxBarButton.Name := TAction(ActionManger1.Actions[iAction]).Name;//Format('dxBarButton_%-2d',[ii]);
-
- dxBarItemLink := dxBarSubItem.ItemLinks.Add;
- dxBarItemLink.Item := dxBarButton;
- end;
- cds_Temp.Next;
- end; //end while ...
- cds_Master.Next;
- end;
- finally
- cds_Temp.Free;
- cds_Master.Free;
- end;
- end;
四、在实际项目中的一个截图:

五、那么能否从dxBarManager中导入内容到dxNavBar中呢?可以:
- procedure TForm1.dxBarManagerTodxNavBar;
- var
- i, j: Integer;
- item: TdxBarSubItem;
- group: TdxNavBarGroup;
- bar: TdxNavBarItem;
- begin
- dxNavBar1.Groups.Clear;
- for i := 0 to dxBarManager1Bar1.ItemLinks.Count - 1 do
- begin
- item := TdxBarSubItem(dxBarManager1Bar1.ItemLinks[i].Control.Item);
- group := dxNavBar1.Groups.Add;
- group.Caption := item.Caption;
- for j := 0 to item.ItemLinks.Count - 1 do
- begin
- bar := dxNavBar1.Items.Add;
- bar.Caption := item.ItemLinks.Items[j].Caption;
- bar.OnClick := dxNavBarItemClick;
- bar.SmallImageIndex := 0;
- group.CreateLink(bar);
- end;
- end;
- end;
|