Delphi如何动态加载菜单用Delphi作一个小程序,如何在程序启动时动态的从数据库中(SQL Server)加载菜单?比方说 数据库中存在一张 菜单表,如何将这个表中的字段自动加载到Delphi程序启动时的菜单项?
解决方案 »
- delphi 如何 MySQL Data Access Components (MyDAC) v5.10
- 亲爱的DELPHI,暂别一阵子。。。。。
- 怎么操作才能让&显示出来~~
- 请教高手-关于mediaplayer?
- RXLib中的memorytable怎么用
- RichEdit中全部内容的高度如何求得?
- 求助!!
- 安装问题
- Query或ADODataSet对数据表赋值的讨论。
- 使用QuickRep时,如果报表多于一页,如何在报表的前一页加上"接后页",后一页加上"承前页"? 或者谁能发给我份QuickRep的帮助?
- HTMLInputElement.form.submit 报错 access violation
- 在客户端, 如何得知服务器端的一个程式是否已运行?
下面是我从程序中给你粘贴的比较重要的一段代码
procedure Tform_Main.menuFlash;
var
i,j,k:integer;
menuitem:Tmenuitem;
imageIndex:integer;
begin
for i:=menu_Main.Items.Count-1 downto 0 do
begin
menuitem:=Menu_Main.Items[i];
menuitem.Free;
end;
if bMainShow then getRootMenu('gnmc','gnbh','gnState','gnmenu',sUserNo,'sys_Function',menu_Main,form_Main.sta_Progress)
else getRootMenu('gnmc','gnbh','gnState','gnmenu',sUserNo,'sys_Function',menu_Main,form_Splash.Progress,true);
for i:=0 to menu_Main.Items.Count-1 do
begin
if menu_Main.Items[i].Count>0 then
for j:=0 to menu_Main.Items[i].Count-1 do
if menu_Main.Items[i].Items[j].Count>0 then
for k:=0 to menu_Main.Items[i].Items[j].Count-1 do
begin
menu_Main.Items[i].Items[j].Items[k].OnClick:=MenuClick;
menu_Main.Items[i].Items[j].Items[k].ImageIndex:=strtoint(trim(changefield('gnmc','menuImage','sys_Function',trim(menu_Main.Items[i].Items[j].Items[k].caption))));
end
else
begin
menu_Main.Items[i].Items[j].OnClick:=MenuClick;
menu_Main.Items[i].Items[j].ImageIndex:=strtoint(trim(changefield('gnmc','menuImage','sys_Function',trim(menu_Main.Items[i].Items[j].caption))));
end
else
begin
menu_Main.Items[i].OnClick:=MenuClick;
menu_Main.Items[i].ImageIndex:=strtoint(trim(changefield('gnmc','menuImage','sys_Function',trim(menu_Main.Items[i].caption))));
end;
end;
end;
var
files,edit:tmenuitem;{要有实例的声明}
begin
files:=tmenuitem.Create(self);
edit:=tmenuitem.create(self);
files.Caption:='文件';
edit.caption:='编辑';
mainmenu1.AutoHotkeys:=mamanual;{此句代码为不让系统自动设置快捷键}
form1.MainMenu1.Items.Add(files);
form1.mainmenu1.items.add(edit);
end;
方法大概就是这样的。
type
//菜单类继承自object
TGDynamicMenu=class
private
//指定的窗体类实例
FForm:TForm;
//指定的菜单类实例
FMainMenu:TMainMenu;
//指定系统权限表连接数据库字符串
FConStr:String;
//登陆用户名
FUserName:String;
//登录用户密码
FPassWord:string;
//清除原有项
FFirstClear:Boolean;
public
//动态创建菜单
procedure CreateMenu;
//动态菜单项的单击事件
procedure MenuItemOnClick(Sender:TObject);
//清楚菜单子项
procedure Clear;
//指定窗体实例属性
property aForm:TForm read FForm write FForm default nil ;
//指定菜单实例属性
property MainMenu:TMainMenu read FMainMenu write FMainMenu default nil;
//指定连接字符串属性
property ConnectionString:String read FConStr write FConStr;
//指定用户帐号属性
property UserName:String read FUserName write FUserName;
//指定用户密码属性
property PassWord:String read FPassWord write FPassWord;
//是否清除原指定对象原有的内容
property FirstClear:Boolean read FFirstClear write FFirstClear default True;
end;//******************************************************************************
// 类模块功能: 创建菜单
// 类模块名称: TGDynamicMenu.CreateMenu
// 类模块方法: CreateMenu:建立菜单
// 类模块属性:
// 返回值: 无
//******************************************************************************
procedure TGDynamicMenu.CreateMenu;
var
objMenuItem, objPMenuItem: TMenuItem;
objADOQuery:TADOQuery;
strSQL:String;
begin
if (FForm=nil) or (not Assigned(FForm)) or (FMainMenu=nil) or (Not Assigned(FMainMenu)) or (Trim(FUserName)='') or (Trim(FConstr)='') then
begin
gcf_MsgBox('获取不到用户帐号!请检查是否给模块类赋值用户帐号!',0,FForm.Handle);
Abort;
Exit;
end; //检测用户帐号合法性
if Not gcf_DBCheckUserLogin(FConStr,FUserName,FPassWord,FForm.Handle) then
begin
gcf_MsgBox('对不起,非法的登录用户!',0,FForm.Handle);
Abort;
Exit;
end; try
if FFirstClear then
FMainMenu.Items.Clear;
//建立数据查询实例
objADOQuery:=TADOQuery.Create(nil);
objADOQuery.ConnectionString:=FConstr;
objADOQuery.SQL.Clear;
strSQL:='SELECT u.UserID, u.UserPassword, m.*, u.UserStatus, g.GroupID, g.GroupStatus ' +
' FROM Sys_GroupModule gm INNER JOIN ' +
' Sys_Module m ON gm.ModuleID = m.ModuleID INNER JOIN ' +
' Sys_Group g ON gm.GroupID = g.GroupID INNER JOIN ' +
' Sys_User u ON g.GroupID = u.GroupID Where UserID=' + quotedstr(FUserName) +
' and u.UserStatus=1 and g.GroupStatus=1 ' +
' Order By m.ModuleAssNo ';
objADOQuery.SQL.Add(strSQL);
objADOQuery.Open;
if (Not objADOQuery.IsEmpty) or (objADOQuery.RecordCount>0) then
begin
objADOQuery.First;
if FFirstClear then FMainMenu.Items.Clear;
while not objADOQuery.Eof do
begin
objMenuItem := TMenuItem.Create(FForm);
objMenuItem.Name:='MIT' +objADOQuery.FieldByName('ModuleID').asString;
//分隔线
if objADOQuery.FieldByName('ModuleType').AsInteger=4 then
begin
objMenuItem.Caption:='-';
end else
//模块名称
objMenuItem.Caption:=objADOQuery.FieldByName('ModuleCName').AsString;
//保存ID号值
objMenuItem.Tag:=StrToIntDef(objADOQuery.FieldByName('ModuleID').asString,0);
objMenuItem.ImageIndex:=StrToIntDef(objADOQuery.FieldByName('ModuleImageIndex').asString,-1);
//父菜单
if objADOQuery.FieldByName('ModulePID').AsString='0' then
begin
FMainMenu.Items.Add(objMenuItem);
end else begin
//子菜单项
objPMenuItem:=gcf_FindMenuItem('MIT'+objADOQuery.FieldByName('ModulePID').asString ,FForm);
if objPMenuItem<>nil then
objPMenuItem.Add(objMenuItem)
else
//单击事件else
FMainMenu.Items.Add(objMenuItem);
objMenuItem.OnClick:=MenuItemOnClick;
end;
objADOQuery.Next;
end;
end;
finally
objADOQuery.Free;
end;
end;
//******************************************************************************
// 类模块功能: 创建菜单
// 类模块名称: TGDynamicMenu.MenuItemOnClick
// 类模块方法: 动态赋值菜单子项按钮单击事件.
// 类模块属性:
// 返回值: 无
//******************************************************************************
procedure TGDynamicMenu.MenuItemOnClick(Sender: TObject);
var
strSQL,sMenuID:String;
objADOQuery:TADOQuery;
begin
//菜单ID号
sMenuID:=Copy(TMenuItem(Sender).Name,Length('MIT')+1,Length(TMenuItem(Sender).Name)); if sMenuID='' then
begin
Exit;
Abort;
end;
objADOQuery:=TADOQuery.Create(nil);
try
objADOQuery.ConnectionString:=FConstr;
objADOQuery.SQL.Clear;
strSQL:='Select ModuleClassFrm from Sys_Module Where ModuleID=' + sMenuID;
objADOQuery.SQL.Add(strSQL);
objADOQuery.Open;
if (Not objADOQuery.IsEmpty) or (objADOQuery.RecordCount>0) then
begin
objADOQuery.First;
gcf_StrShowFormClass(objADOQuery.FieldByName('ModuleClassFrm').AsString,'-1');
end;
finally
objADOQuery.Free;
end;
end;