使用dxNavBar动态创建应用程序菜单
一、如何动态创建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菜单例子:
procedure TMain.InitMenuItem(dxNavBar1:TdxNavBar);
var
iAction: Integer;
aTag:string;
sMenu:string; dxNavBarGroup:TdxNavBarGroup;
dxNavBarItem:TdxNavBarItem;
dxNavBarLink:TdxNavBarItemLink;
dxNavBarSeparator:TdxNavBarSeparator;
cds_Master,cds_Delta:TClientDataSet; procedure InitdxNavBar;
begin
dxNavBar1.Groups.Clear;
with dxNavBar1.DefaultStyles do
begin
GroupHeader.Font.Name := '微软雅黑';
GroupHeader.Font.Style := [fsBold];
GroupHeader.Font.Size := 9;
GroupHeader.Font.Color := clBlack; Item.Font.Name := '微软雅黑';
Item.Font.Style := [];
Item.Font.Size := 9;
Item.Font.Color := clBlack; ItemHotTracked.Font.Color := clBlue;
ItemHotTracked.Font.Style := [fsUnderline]; ItemPressed.Font.Color := clBlue;
ItemPressed.Font.Style := [];
end;
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_Delta.XMLData := dm.OpenData(sqlstr);
end;
begin
cds_Master := TClientDataSet.Create(nil);
cds_Delta := TClientDataSet.Create(nil);
try
InitdxNavBar;//设置一些格式,清除设计期的数据等
OpenMaster;
while not cds_Master.Eof do
begin
dxNavBarGroup := dxNavBar1.Groups.Add;
dxNavBar1.Hint := cds_Master.FieldByName('项目名称').AsString;
dxNavBarGroup.Caption := Copy(dxNavBar1.Hint,4,100);
dxNavBarGroup.Visible := True;
dxNavBarGroup.Expandable := True;
dxNavBarGroup.Expanded := dxNavBarGroup.Index < 3;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// OpenDelta(cds_Master.FieldByName('id').AsInteger); cds_Delta.First;
aTag := cds_Delta.FieldByName('Tag').AsString;
while not cds_Delta.Eof do
begin
sMenu := cds_Delta.FieldByName('项目名称').AsString;
iAction := GetAcitonByCaption(cds_Master.FieldByName('项目名称').AsString,sMenu); if iAction<>-1 then
begin //创建一个dxBarButton,相当于创建一个菜单项
dxNavBarItem := dxNavBar1.Items.Add;
dxNavBarItem.Action := TAction(ActionManger1.Actions[iAction]); dxNavBarGroup := TdxNavBarGroup(dxNavBar1.Groups.ItemByCaption(Copy(ActionManger1.Actions[iAction].Category,4,100)));
dxNavBarLink := dxNavBarGroup.CreateLink(dxNavBarItem);
dxNavBarGroup.LinksUseSmallImages := True;
//==================加分隔线,但是不成功,不知道为何?==============//
if (cds_Delta.FieldByName('Tag').AsString<>aTag) then
begin
aTag := cds_Delta.FieldByName('Tag').AsString;
if (cds_Delta.RecNo<cds_Delta.RecordCount) then
begin
//dxNavBarSeparator := TdxNavBarSeparator(dxNavBar1.Items.Add);//
//dxNavBarSeparator.Name := 'dxNavBarSeparator1';
//dxNavBarLink := dxNavBarGroup.CreateLink(dxNavBarSeparator);
//dxNavBarLink.DisplayName := '';//
end;
end;
//==================================================================//
end;
cds_Delta.Next;
end; //end while ...
cds_Master.Next;
end;
finally
cds_Delta.Free;
cds_Master.Free;
end;
end;
三、动态生成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;
版权声明:本文为博主原创文章,未经博主允许不得转载。
使用dxNavBar动态创建应用程序菜单的更多相关文章
- MFC 对话框中动态创建N级菜单以及响应事件
创建一个基于对话框的工程,工程名为CreateMenu 为该对话框增加一个文件菜单项和测试菜单项,如下图所示 测试菜单项至少要有一个子菜单项 在对话框属性中关联该菜单 在resource.h中增加 ...
- Delphi动态创建菜单
在程序运行中动态创建菜单,主要使用TMeunItem类,所有菜单的条目都是TMenuItem的一个实例. 打开Delphi7集成开发环境,在默认新建工程里,放置一个Button1按钮和MainMenu ...
- EasyUI创建异步树形菜单和动态添加标签页tab
创建异步树形菜单 创建树形菜单的ul标签 <ul class="easyui-tree" id="treeMenu"> </ul> 写j ...
- tp根据数据库动态创建微信菜单
喻可伟的博客 tp根据数据库动态创建微信菜单 $button = array();$class = M('ucenter_menu')->limit(3)->select();//取出 ...
- Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单
{================================================================= 功 能: 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单 ...
- .NET使用Task动态创建多任务多线程并行程序计算Redis集群keys计算
Task是一个很好用的多任务处理类,并且通过Task可以对任务进行很好的控制. 下面将通过代码实现Redis集群在使用IServer.keys时通过多任务对多个服务器示例进行并行计算,并对返回key做 ...
- VC++ 创建一个动态增长的层叠菜单
工作中需要创建一个动态增长的层叠菜单,类似于动态增长的多语言切换菜单,也是废了好大劲哪,分享一下,请交流参考. 类似效果图: 弹出子菜单各菜单项的意义一致,用ON_COMMAND_RANGE宏来统一实 ...
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)
对Qt5稍有熟悉的童鞋都知道信号.槽的自动连接机制.该机制使得qt designer 设计的UI中包含的控件,可以不通过显式connect,直接和cpp中的相应槽相关联.该机制的详细文章见 http: ...
随机推荐
- ZBarSDK扫描二维码
1:如果报引用文件错误的话需要在设置一下:project->Build settings->build active architecture only选项设置为No.Valid Arch ...
- putty ssh login linux
(1) in linux $ ssh-keygen -t dsa $ cd .ssh $ cat id_dsa.pub > authorized_keys $ chmod 600 authori ...
- IDE改为AHCI后系统无法启动的解决办法
1.intel CPU 一.找到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msahci,“Start”项值改为“0”. 二.重启,进入b ...
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
执行远程shell,启动远程机器的tomat时遇到次错误.后来发现原来是远程机器的.profile被人改掉了! 在.profile里加入 export JAVA_HOME=/home/evans/jd ...
- UML类图中的六大关系:泛化、实现、依赖、关联、聚合、组合关系
UML定义的关系主要有:泛化.实现.依赖.关联.聚合.组合,这六种关系紧密程度依次加强,分别看一下 1.泛化 概念:泛化是一种一般与特殊.一般与具体之间关系的描述,具体描述建立在一般描述的基础之上,并 ...
- codeforces 590B B. Chip 'n Dale Rescue Rangers(二分+计算几何)
题目链接: B. Chip 'n Dale Rescue Rangers time limit per test 1 second memory limit per test 256 megabyte ...
- CentOS6.5下用yum安装 git
cd /etc/yum.repos.d/ wget http://geekery.altervista.org/geekery-el6-x86_64.repo 2. 到http://packages. ...
- 关于cornerstone无法上传library文件的问题
在CornerStone中先选中左边的项目: 然后在菜单栏里面选择View->ShowIgnoreItems, 再选择项目中的library文件,点击Add按钮即可上传到服务器:
- 自定义View(一)-ViewGroup实现优酷菜单
自定义View的第一个学习案例 ViewGroup是自动以View中比较常用也比较简单的一种方式,通过组合现有的UI控件,绘制出一个全新的View 效果如下: 主类实现如下: package com. ...
- 各个手机APP客户端内置浏览器useragent
手机QQ Mozilla/5.0 (Linux; Android 4.4.2; GT-I9500 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko ...