我程序中的一部份:一、创建菜单(用数据库) procedure TMainForm.MyMenu; var x, y, n: Integer; tex, qxx, getqx: string; MyItem: array of array of TMenuItem; begin if Dm.atuser.Locate('编码', func.User_id, []) then begin getqx := Dm.ATuser.fieldbyname('权限').AsString; end; try MMenu.Free; MMenu := TMainMenu.Create(self); except MMenu := TMainMenu.Create(self); end; Menu := nil; Dm.AQBM.Close; Dm.AQBM.SQL.Clear; Dm.AQBM.SQL.Add('select * from 菜单 where ((Len(编码)=2)) ORDER BY 编码'); Dm.AQBM.Open; DM.AQBM.First; X := DM.AQBM.RecordCount; setlength(MyItem, x); for x := 0 to Dm.AQBM.RecordCount - 1 do begin tex := copy(Dm.AQBM.fieldbyname('编码').AsString, 1, 2); tex := 'select * from 菜单 where (编码 like ''' + tex + '%'') ORDER BY 编码'; Dm.AQmenu.Close; Dm.AQmenu.SQL.Clear; Dm.AQmenu.SQL.Add(tex); Dm.AQmenu.Open; Dm.AQmenu.First; y := Dm.AQmenu.RecordCount; setlength(MyItem[x], y); for y := 0 to Dm.AQmenu.RecordCount - 1 do begin MyItem[x, y] := TMenuItem.Create(Self); MyItem[x, y].Name := Dm.AQmenu.fieldbyname('模块').AsString; MyItem[x, y].Caption := Dm.AQmenu.fieldbyname('菜单').AsString; qxx := '"' + Dm.AQmenu.fieldbyname('模块').AsString + '"'; n := Pos(qxx, getqx); if n = 0 then if Dm.AQmenu.fieldbyname('权限').AsBoolean then MyItem[x, y].Enabled := false else MyItem[x, y].Enabled := true else MyItem[x, y].Enabled := not Dm.AQmenu.fieldbyname('禁用').AsBoolean; if Dm.AQmenu.fieldbyname('模块').AsString = 'getid' then MyItem[x, y].Visible := func.getzc else MyItem[x, y].Visible := not Dm.AQmenu.fieldbyname('隐藏').AsBoolean; if Dm.AQmenu.fieldbyname('模块').AsString = 'Menu' then MyItem[x, y].Visible := ShowMenu; if y = 0 then MMenu.Items.Add(MyItem[x, y]) else begin MyItem[x, y].OnClick := MyPopupHandler; MyItem[x, 0].Add(MyItem[x, y]); end; Dm.AQmenu.Next; end; Dm.AQBM.Next; end; ToolBar1.Menu := MMenu; end;
三、click处理 procedure TMainForm.MyPopupHandler(Sender: TObject); var mk: string; begin Dm.AQmenu.Close; Dm.AQmenu.SQL.Clear; Dm.AQmenu.SQL.Add('select * from 菜单 ORDER BY 编码'); Dm.AQmenu.Open; Dm.AQmenu.First; with Sender as TMenuItem do begin mk := trim(name); if Dm.AqMenu.Locate('模块', MK, []) then begin mk := trim(Dm.AQmenu.fieldbyname('模块').AsString); menuren(mk); //执行菜单命令 end else MsgBox('没有这个模块' + Caption, '注意', MB_OK); //MsgBox是我自己的提示窗口 end; end;
上面是二,这个才是三 三、procedure menuren(mk:string); begin if mk = 'exit' then MainForm.Close;//退出 if mk = 'myhelp' then MainForm.myhelp;//帮助 if mk = 'about' then myabout; //关于 if mk = 'webup' then webupd; //在线升级 if mk = 'cllb' then menuexe('材料类别', false);//这块是用一个窗口做的编码管理 if mk = 'bzbm' then menuexe('班组', false); if mk = 'bmwf' then menuexe('部门', false); if mk = 'gzlb' then menuexe('工资类别', false); if mk = 'htlb' then menuexe('合同类别', false); if mk = 'mzlb' then menuexe('民族', false); if mk = 'qymc' then menuexe('区域名称', false); if mk = 'whcd' then menuexe('文化程度', false); if mk = 'zzlb' then menuexe('暂住证类别', false); if mk = 'zclb' then menuexe('职称', false); if mk = 'yglb' then menuexe('职工类别', false); if mk = 'zwlb' then menuexe('职务', false); if mk = 'zzmm' then menuexe('政治面貌', false); if mk = 'fyzq' then menuexe('婚姻状况', false); if mk = 'rkyy' then menuexe('入库原因', false); if mk = 'ckyy' then menuexe('出库原因', false);//编码管理完成 if mk = 'opendata' then dateopen; //重新联接数据库 if mk = 'Menu' then menue; //菜单编辑 if mk = 'ygzl' then ygzl; //员工资料 if mk = 'clrk' then clrkd; //材料入库 ................... end; 三部份完成,其他的我不多说了,自己看看,这个菜单管理把权限管理也综合在一起了,
对了,上面菜单创建里有些功能是不一定要的, if Dm.AQmenu.fieldbyname('模块').AsString = 'getid' then MyItem[x, y].Visible := func.getzc //如果已注册成功,就不显示注册菜单 else MyItem[x, y].Visible := not Dm.AQmenu.fieldbyname('隐藏').AsBoolean; if Dm.AQmenu.fieldbyname('模块').AsString = 'Menu' then MyItem[x, y].Visible := ShowMenu; //要用特殊命令才能看到菜单编辑菜单的数据库中主要有,编码:用定级编码的方式,我只用了两级,可以再加的,如01 0101 02 0201等 菜单名,就是菜单显示出来的名字,“-”是菜单分隔,模块名用于程序调用相应菜单模块。
TForm2 = class(TForm)
MainMenu1: TMainMenu;
procedure MenuItemClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form2: TForm2;implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
var
mi, mi2: TMenuItem;
begin
mi := MainMenu1.CreateMenuItem;
mi.Caption := 'abc';
MainMenu1.Items.Add(mi); mi2 := MainMenu1.CreateMenuItem;
with mi2 do
begin
Caption := '&def';
OnClick := MenuItemClick;
mi.Add(mi2);
end; mi2 := MainMenu1.CreateMenuItem;
with mi2 do
begin
Caption := '&ghi';
OnClick := MenuItemClick;
mi.Add(mi2);
end;
end;procedure TForm2.MenuItemClick(Sender: TObject);
begin
ShowMessage(TMenuItem(Sender).Caption);
end;
[email protected]
我想这想能好好的研究研究。
谢了。
里面写得很全,
可以看看。
procedure TMainForm.MyMenu;
var
x, y, n: Integer;
tex, qxx, getqx: string;
MyItem: array of array of TMenuItem;
begin
if Dm.atuser.Locate('编码', func.User_id, []) then
begin
getqx := Dm.ATuser.fieldbyname('权限').AsString;
end;
try
MMenu.Free;
MMenu := TMainMenu.Create(self);
except
MMenu := TMainMenu.Create(self);
end;
Menu := nil;
Dm.AQBM.Close;
Dm.AQBM.SQL.Clear;
Dm.AQBM.SQL.Add('select * from 菜单 where ((Len(编码)=2)) ORDER BY 编码');
Dm.AQBM.Open;
DM.AQBM.First;
X := DM.AQBM.RecordCount;
setlength(MyItem, x);
for x := 0 to Dm.AQBM.RecordCount - 1 do
begin
tex := copy(Dm.AQBM.fieldbyname('编码').AsString, 1, 2);
tex := 'select * from 菜单 where (编码 like ''' + tex + '%'') ORDER BY 编码';
Dm.AQmenu.Close;
Dm.AQmenu.SQL.Clear;
Dm.AQmenu.SQL.Add(tex);
Dm.AQmenu.Open;
Dm.AQmenu.First;
y := Dm.AQmenu.RecordCount;
setlength(MyItem[x], y);
for y := 0 to Dm.AQmenu.RecordCount - 1 do
begin
MyItem[x, y] := TMenuItem.Create(Self);
MyItem[x, y].Name := Dm.AQmenu.fieldbyname('模块').AsString;
MyItem[x, y].Caption := Dm.AQmenu.fieldbyname('菜单').AsString;
qxx := '"' + Dm.AQmenu.fieldbyname('模块').AsString + '"';
n := Pos(qxx, getqx);
if n = 0 then
if Dm.AQmenu.fieldbyname('权限').AsBoolean then
MyItem[x, y].Enabled := false
else
MyItem[x, y].Enabled := true
else
MyItem[x, y].Enabled := not Dm.AQmenu.fieldbyname('禁用').AsBoolean;
if Dm.AQmenu.fieldbyname('模块').AsString = 'getid' then
MyItem[x, y].Visible := func.getzc
else
MyItem[x, y].Visible := not Dm.AQmenu.fieldbyname('隐藏').AsBoolean;
if Dm.AQmenu.fieldbyname('模块').AsString = 'Menu' then
MyItem[x, y].Visible := ShowMenu;
if y = 0 then
MMenu.Items.Add(MyItem[x, y])
else
begin
MyItem[x, y].OnClick := MyPopupHandler;
MyItem[x, 0].Add(MyItem[x, y]);
end;
Dm.AQmenu.Next;
end;
Dm.AQBM.Next;
end;
ToolBar1.Menu := MMenu;
end;
procedure TMainForm.MyPopupHandler(Sender: TObject);
var mk: string;
begin
Dm.AQmenu.Close;
Dm.AQmenu.SQL.Clear;
Dm.AQmenu.SQL.Add('select * from 菜单 ORDER BY 编码');
Dm.AQmenu.Open;
Dm.AQmenu.First;
with Sender as TMenuItem do
begin
mk := trim(name);
if Dm.AqMenu.Locate('模块', MK, []) then
begin
mk := trim(Dm.AQmenu.fieldbyname('模块').AsString);
menuren(mk); //执行菜单命令
end
else
MsgBox('没有这个模块' + Caption, '注意', MB_OK); //MsgBox是我自己的提示窗口
end;
end;
三、procedure menuren(mk:string);
begin
if mk = 'exit' then MainForm.Close;//退出
if mk = 'myhelp' then MainForm.myhelp;//帮助
if mk = 'about' then myabout; //关于
if mk = 'webup' then webupd; //在线升级
if mk = 'cllb' then menuexe('材料类别', false);//这块是用一个窗口做的编码管理
if mk = 'bzbm' then menuexe('班组', false);
if mk = 'bmwf' then menuexe('部门', false);
if mk = 'gzlb' then menuexe('工资类别', false);
if mk = 'htlb' then menuexe('合同类别', false);
if mk = 'mzlb' then menuexe('民族', false);
if mk = 'qymc' then menuexe('区域名称', false);
if mk = 'whcd' then menuexe('文化程度', false);
if mk = 'zzlb' then menuexe('暂住证类别', false);
if mk = 'zclb' then menuexe('职称', false);
if mk = 'yglb' then menuexe('职工类别', false);
if mk = 'zwlb' then menuexe('职务', false);
if mk = 'zzmm' then menuexe('政治面貌', false);
if mk = 'fyzq' then menuexe('婚姻状况', false);
if mk = 'rkyy' then menuexe('入库原因', false);
if mk = 'ckyy' then menuexe('出库原因', false);//编码管理完成
if mk = 'opendata' then dateopen; //重新联接数据库
if mk = 'Menu' then menue; //菜单编辑
if mk = 'ygzl' then ygzl; //员工资料
if mk = 'clrk' then clrkd; //材料入库
...................
end;
三部份完成,其他的我不多说了,自己看看,这个菜单管理把权限管理也综合在一起了,
if Dm.AQmenu.fieldbyname('模块').AsString = 'getid' then
MyItem[x, y].Visible := func.getzc //如果已注册成功,就不显示注册菜单
else
MyItem[x, y].Visible := not Dm.AQmenu.fieldbyname('隐藏').AsBoolean;
if Dm.AQmenu.fieldbyname('模块').AsString = 'Menu' then
MyItem[x, y].Visible := ShowMenu; //要用特殊命令才能看到菜单编辑菜单的数据库中主要有,编码:用定级编码的方式,我只用了两级,可以再加的,如01 0101 02 0201等
菜单名,就是菜单显示出来的名字,“-”是菜单分隔,模块名用于程序调用相应菜单模块。
我回头就去试试看。