procedure form1.CreateMenu();
var
qryTree,qryICON : TADOQuery ;
MODID , ParentID : integer ;
MODNAME , MODTYPE , MODSOURCE : string ;
mnuItem,mnuParent : TMenuItem;
i : integer ;
ds : TADOBlobStream ;
begin
Screen.Cursor := crHourGlass;
try
// 清除所有动态节点 Tag=节点代表的MODID;
while MainMenu.Items.Count > 0 do
MainMenu.Items[1].Free();
// Add begin
qryICON := TADOQuery.Create(Application);
qryICON.Connection := FSysConnection ;
qryICON.CacheSize := 1000 ; qryTree := TADOQuery.Create(Application);
qryTree.CacheSize := 1000 ;
try
qryTree.Connection := FSysConnection ;
qryTree.SQL.Add('取数据库中的菜单,我删除了SQL语句');
qryTree.Open ; qryICON.SQL.Add('图标') ;
qryICON.Open ;
while not qryTree.Eof do
begin
MODID := qryTree.FieldByName('MODID').AsInteger ;
PARENTID := qryTree.FieldByName('MODPARENTID').AsInteger ;
MODNAME := trim(qryTree.FieldByName('MODNAME').AsString) ;
mnuItem := TMenuItem.Create(Self);
mnuItem.Tag := MODID ;
mnuItem.Caption := MODName;
if ParentID=0 then
MainMenu.Items.Insert(MainMenu.Items.Count-max(INT_MAINMENUITEM-1,0),mnuItem)
else
begin
mnuParent := nil ;
for i := 1 to MainMenu.Items.Count - INT_MAINMENUITEM + 1 do
begin
mnuParent := FindMenuByID(MainMenu.Items[i],ParentID);
if mnuParent <> nil then
break ;
end;
if mnuParent = nil then
//如果没有找到上级节点而该节点又不是顶级节点,则不加入。
//MainMenu.Items.Insert(MainMenu.Items.Count-2,mnuItem)
else
mnuParent.Add(mnuItem);
end;
mnuItem.OnClick := VirtualMenuClick ;//Click事件
// 设置图标
if qryICON.Locate('ICONID',qryTree.FieldByName('MODID').AsInteger,[])
and (not qryICON.FieldByName('ICONIMAGE').IsNull) then
begin
try
ds := TADOBlobStream.Create(qryICON.FieldByName('ICONIMAGE') as TBlobField,bmRead);
mnuItem.ImageIndex := -1 ;
mnuItem.Bitmap.LoadFromStream(ds);
ds.Free ;
except end;
end
else
mnuItem.ImageIndex := INT_DEFAULTIMAGEINDEX ;
end;
end;
// Add End
qryTree.Next ;
end; except
qryTree.Close ;
qryTree.Free ;
Exit ;
end ;
qryICON.Close ;
qryICON.Free ; qryTree.Close ;
qryTree.Free ;
// Add End
finally
Screen.Cursor := crDefault;
end;
end;function form1.FindMenuByID(mnuItem: TMenuItem;
ID: integer): TMenuItem;
var
i : integer ;
begin
Result := nil ;
if mnuItem = nil then
Exit ;
if mnuItem.Tag = ID then
Result := mnuItem
else
begin
for i:=0 to mnuItem.Count-1 do
begin
if mnuItem.Items[i].Tag=ID then
begin
Result := mnuItem.Items[i] ;
break;
end
else
if mnuItem.Items[i].Count>0 then
Result := FindMenuByID(mnuItem.Items[i],ID);
end;
end;
end;
var
qryTree,qryICON : TADOQuery ;
MODID , ParentID : integer ;
MODNAME , MODTYPE , MODSOURCE : string ;
mnuItem,mnuParent : TMenuItem;
i : integer ;
ds : TADOBlobStream ;
begin
Screen.Cursor := crHourGlass;
try
// 清除所有动态节点 Tag=节点代表的MODID;
while MainMenu.Items.Count > 0 do
MainMenu.Items[1].Free();
// Add begin
qryICON := TADOQuery.Create(Application);
qryICON.Connection := FSysConnection ;
qryICON.CacheSize := 1000 ; qryTree := TADOQuery.Create(Application);
qryTree.CacheSize := 1000 ;
try
qryTree.Connection := FSysConnection ;
qryTree.SQL.Add('取数据库中的菜单,我删除了SQL语句');
qryTree.Open ; qryICON.SQL.Add('图标') ;
qryICON.Open ;
while not qryTree.Eof do
begin
MODID := qryTree.FieldByName('MODID').AsInteger ;
PARENTID := qryTree.FieldByName('MODPARENTID').AsInteger ;
MODNAME := trim(qryTree.FieldByName('MODNAME').AsString) ;
mnuItem := TMenuItem.Create(Self);
mnuItem.Tag := MODID ;
mnuItem.Caption := MODName;
if ParentID=0 then
MainMenu.Items.Insert(MainMenu.Items.Count-max(INT_MAINMENUITEM-1,0),mnuItem)
else
begin
mnuParent := nil ;
for i := 1 to MainMenu.Items.Count - INT_MAINMENUITEM + 1 do
begin
mnuParent := FindMenuByID(MainMenu.Items[i],ParentID);
if mnuParent <> nil then
break ;
end;
if mnuParent = nil then
//如果没有找到上级节点而该节点又不是顶级节点,则不加入。
//MainMenu.Items.Insert(MainMenu.Items.Count-2,mnuItem)
else
mnuParent.Add(mnuItem);
end;
mnuItem.OnClick := VirtualMenuClick ;//Click事件
// 设置图标
if qryICON.Locate('ICONID',qryTree.FieldByName('MODID').AsInteger,[])
and (not qryICON.FieldByName('ICONIMAGE').IsNull) then
begin
try
ds := TADOBlobStream.Create(qryICON.FieldByName('ICONIMAGE') as TBlobField,bmRead);
mnuItem.ImageIndex := -1 ;
mnuItem.Bitmap.LoadFromStream(ds);
ds.Free ;
except end;
end
else
mnuItem.ImageIndex := INT_DEFAULTIMAGEINDEX ;
end;
end;
// Add End
qryTree.Next ;
end; except
qryTree.Close ;
qryTree.Free ;
Exit ;
end ;
qryICON.Close ;
qryICON.Free ; qryTree.Close ;
qryTree.Free ;
// Add End
finally
Screen.Cursor := crDefault;
end;
end;function form1.FindMenuByID(mnuItem: TMenuItem;
ID: integer): TMenuItem;
var
i : integer ;
begin
Result := nil ;
if mnuItem = nil then
Exit ;
if mnuItem.Tag = ID then
Result := mnuItem
else
begin
for i:=0 to mnuItem.Count-1 do
begin
if mnuItem.Items[i].Tag=ID then
begin
Result := mnuItem.Items[i] ;
break;
end
else
if mnuItem.Items[i].Count>0 then
Result := FindMenuByID(mnuItem.Items[i],ID);
end;
end;
end;
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus;type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure MyClick(Sender:TObject);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
MM:TMenuItem;
begin
MM:=TMenuItem.Create(Self);
MM.Caption:='&shenqw';
// MM.OnClick:=MyClick;
MainMenu1.Items.Add(MM);
MM:=TMenuItem.Create(Self);
MM.Caption:='&shenqw2';
MM.OnClick:=MyClick;
MainMenu1.Items[0].Add(MM);
end;procedure TForm1.MyClick(Sender: TObject);
begin
ShowMessage('OK');
end;end.