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;

解决方案 »

  1.   

    unit Unit1;interfaceuses
      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.