var
  MM:TMenuItem;
100分我要了
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);procedure TForm1.MyClick(Sender: TObject);
begin
  ShowMessage('OK');
end;

解决方案 »

  1.   

    动态建立的菜单响应事件?动态建立菜单?动态地创建菜单需要做以下工作:
    • 创建子菜单。
    • 为每个子菜单创建菜单项。
    • 设置菜单项的属性。
    • 定义菜单命令的事件处理过程。
    例程S4_2 该例程不仅对以上内容进行了说明,而且还包含了以下内容:
    • 在菜单中设置竖向分隔条。
    • 通过按钮激活弹出式菜单。
    具体实现过程如下:
    1) 通过菜单File | New Application创建一个新的工程。
    2) 在窗体中添加三个B u t t o n组件,C a p t i o n属性分别设置为“创建主菜单( & M )”、“创建弹
    出式菜单( & P )”和“显示弹出式菜单( & S )”。
    3) 在U s e s语句中增加下面的代码:
    . . .
    u s e s
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ExtCtrls,Menus;
    . . .
    4) 在U n i t 1 . p a s文件中定义下面的变量:
    . . .
    v a r
    Form1: TForm1;
    MyMainMenu: TMainMenu;
    MyPopUpMenu: TPopUpMenu;
    MySubItems: array[0..3] of TMenuItem;
    MyPopUpItems: array[0..3] of TMenuItem;
    i: Integer;
    i m p l e m e n t a t i o n
    . . .
    5) 定义菜单命令的事件处理过程。
    首先在U n i t 1 . p a s文件的T F o r m 1的定义代码中添加如下代码:
    t y p e
    TForm1 = class(TForm)
    . . .
    // 定义菜单命令的事件处理过程
    procedure MyPopupHandler(Sender: TObject);
    p r i v a t e然后手工在U n i t 1 . p a s文件的最后一条e n d语句的前面定义过程体如下:
    // 菜单命令的事件处理过程
    procedure TForm1.MyPopupHandler(Sender: TO b j e c t ) ;
    b e g i n
    with Sender as TMenuItem do
    b e g i n
    // 在信息对话框中显示选中菜单项的C a p t i o n属性
    ShowMessage(Caption);
    e n d ;
    e n d ;
    6) 添加B u t t o n 1组件、B u t t o n 2组件和B u t t o n 3组件的O n C l i c k事件的处理过程如下:
    procedure TForm1.Button1Click(Sender: TO b j e c t ) ;
    v a r
    MyItem: array[0..2] of TMenuItem;
    b e g i n
    MyMainMenu:= TMainMenu.Create(Self);
    // 创建三个子菜单
    for i := 0 to 2 do begin
    MyItem[i] := TMenuItem.Create(Self);
    MyItem[i].Caption := '子菜单' + I n t To S t r ( i ) + ' ( & ' + I n t To S t r ( i ) + ' ) ' ;
    M y M a i n M e n u . I t e m s . A d d ( M y I t e m [ i ] ) ;
    e n d ;
    for i := 0 to 3 do begin
    MySubItems[i] := TMenuItem.Create(Self);
    MySubItems[i].Caption := '主菜单项' + I n t To S t r ( i ) + ' ( & ' + I n t To S t r ( i + 1 ) + ' ) ' ;
    M y M a i n M e n u . I t e m s [ 0 ] . A d d ( M y S u b I t e m s [ i ] ) ;
    // 指定菜单项的O n C l i c k事件的处理过程
    MySubItems[i].OnClick := MyPopUpHandler;
    e n d ;
    // 将第2个菜单项设置为分隔条
    MySubItems[1].Caption :='-';
    // 设置竖向分隔条
    MySubItems[3].Break := mbBarBreak;
    e n d ;
    procedure TForm1.Button2Click(Sender: TO b j e c t ) ;
    b e g i n
    MyPopUpMenu := TPopUpMenu.Create(self);
    for i := 0 to 3 do
    b e g i n
    MyPopUpItems[i] := TMenuItem.Create(Self);
    // 设置菜单项的C a p t i o n属性
    MyPopUpItems[i].Caption := '弹出菜单项' + I n t ToStr(i)+ '(&'+ IntToStr(i+1)+ ')';
    M y P o p U p M e n u . I t e m s . A d d ( M y P o p U p I t e m s [ i ] ) ;
    // 指定菜单项的O n C l i c k事件的处理过程
    MyPopUpItems[i].OnClick := MyPopupHandler;
    e n d ;
      

  2.   

    但是,我并不知道我要加多少项菜单呀,
    请: hammer_shi
    再费些神
    对不起,网络有点问题,
      

  3.   

    是不是可以用tag处理过程名字要怎么写?
      

  4.   

    你必须先定义事件
    unit main_frm;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Menus, ExtCtrls,fun_unit, DB, DBTables, Buttons;const
       N = 36;type
    Tmain_fm = class(TForm)
        MainMenu1: TMainMenu;
        Panel1: TPanel;
        procedure FormShow(Sender: TObject);
    private
        { Private declarations }
      public
         { Public declarations }
      procedure p_new(Sender: TObject);
      procedure p_open(Sender: TObject);
      procedure p_save(Sender: TObject);
      procedure p_application(Sender: TObject);
      procedure p_from(Sender: TObject);
      procedure p_other(Sender: TObject);
      procedure p_undo(Sender: TObject);
      procedure p_cut(Sender: TObject);
      procedure p_copy(Sender: TObject);
      procedure p_find(Sender: TObject);
      procedure p_findinfile(Sender: TObject);
      procedure p_browers(Sender: TObject);
      procedure p_tooler(Sender: TObject);
      procedure p_options(Sender: TObject);
      procedure p_viewsourse(Sender: TObject);
      procedure p_run(Sender: TObject);
      procedure p_stepover(Sender: TObject);
      procedure p_staseinto(Sender: TObject);
      procedure p_new1(Sender: TObject);
      procedure p_old(Sender: TObject);
      procedure p_sql(Sender: TObject);
      procedure p_insert(Sender: TObject);
      procedure p_delete(Sender: TObject);
      procedure p_cb(Sender: TObject);
      procedure p_delphi(Sender: TObject);
      procedure p_vc(Sender: TObject);
      procedure p_pb(Sender: TObject);end;var
      main_fm: Tmain_fm;
      menu_collect:array[0..N] of menus_p;   //菜单集
      assign_menu :array[0..N] of  TMenuItem;
    implementation{$R *.dfm}procedure Tmain_fm.p_new(Sender: TObject);
    begin
    end;
    procedure Tmain_fm.p_open(Sender: TObject);
    begin
        showmessage('打开成功!');
    end;procedure Tmain_fm.p_save(Sender: TObject);
    beginend;procedure Tmain_fm.p_application(Sender: TObject);
    beginend;procedure Tmain_fm.p_from(Sender: TObject);
    beginend;procedure Tmain_fm.p_other(Sender: TObject);
    beginend;procedure Tmain_fm.p_undo(Sender: TObject);
    beginend;procedure Tmain_fm.p_cut(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_copy(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_find(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_findinfile(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_browers(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_tooler(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_options(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_viewsourse(Sender: TObject);
    begin
    end;procedure Tmain_fm.p_run(Sender: TObject);
    beginend;procedure Tmain_fm.p_stepover(Sender: TObject);
    beginend;procedure Tmain_fm.p_staseinto(Sender: TObject);
    beginend;procedure Tmain_fm.p_new1(Sender: TObject);
    beginend;procedure Tmain_fm.p_old(Sender: TObject);
    beginend;procedure Tmain_fm.p_sql(Sender: TObject);
    beginend;procedure Tmain_fm.p_insert(Sender: TObject);
    beginend;procedure Tmain_fm.p_delete(Sender: TObject);
    begin
      showmessage('删除成功!');end;procedure Tmain_fm.p_cb(Sender: TObject);
    beginend;procedure Tmain_fm.p_delphi(Sender: TObject);
    beginend;procedure Tmain_fm.p_vc(Sender: TObject);
    beginend;procedure Tmain_fm.p_pb(Sender: TObject);
    beginend;
    procedure Tmain_fm.FormShow(Sender: TObject);
    begin
      get_mani_menu(menu_collect);
      get_assign_mean(assign_menu,MainMenu1,menu_collect);
      if copy(gs_user_no,1,3) = '001' then
       create_mean(menu_collect,assign_menu,MainMenu1)
       else
        create_mean_user(menu_collect,assign_menu,MainMenu1);
    end;end.
      

  5.   

    继上 ////////////////////////////数据维护窗口//////////////////////////
    //***************************** 函数 *****************************************//
    //************ get_mani_menu 得取菜单的名称与编号***************************//
    //************ get_assign_mean 初始化菜单***********************************//
    //************ create_mean 创建菜单 ****************************************//unit fun_unit;interfaceuses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Menus, ExtCtrls, DB, DBTables;const
      TM = 'U';type
        menus_p =^menus_str;
        menus_str = record
          menu_item:TMenuItem;   //菜单名称
          menu_no  :string;      //菜单编号
          Menu_mc   :string;      //函数名称
          sf_privew: integer;     //判断是否有权限  0:没有权限,1:有权限
    end;var
        gs_user_no,gs_user_name:string;
        login_sucess:boolean;
        Query_menu: TQuery;
        // menu_collect:array[0..36] of menus_p;procedure get_mani_menu(var menu_collect:array of menus_p);procedure get_assign_mean(var assign_menu:array of TMenuItem;var MainMenu1: TMainMenu;menu_collect:array of menus_p);procedure create_mean(menu_collect:array of menus_p;assign_menu:array of TMenuItem;var MainMenu1:TMainMenu);procedure create_mean_user(menu_collect:array of menus_p;assign_menu:array of TMenuItem;var MainMenu1:TMainMenu);implementationuses
      dm_frm,main_frm;//建立基它用户组的
    procedure create_mean_user(menu_collect:array of menus_p;assign_menu:array of TMenuItem;var MainMenu1:TMainMenu);
    var
      query_user:Tquery;
      sql_str :string;
      tab_str: string;
      menu_item_no,men_sub_no,i,j:integer;
      menu_item_str,men_sub_str:string;
      menu_last:integer;
    begin
      i :=0;
      tab_str := copy(gs_user_no,4,3);
      sql_str :='select * from ' + TM + tab_str;
      query_user :=TQuery.Create(application);
      query_user.DatabaseName := dm.db_menu.DatabaseName;
      if query_user.Active then
      query_user.Close;
      query_user.SQL.Clear;
      query_user.SQL.Add(sql_str);
      query_user.Prepare;
      query_user.Open;
      query_user.First;
     while i < N do
      begin
        menu_item_str := copy(menu_collect[i].menu_no,1,2);
        menu_item_no := strToInt(menu_item_str);
        men_sub_str := copy(menu_collect[i].menu_no,3,2);
        men_sub_no := strToInt(men_sub_str);
        menu_last := strToInt(copy(menu_collect[i].menu_no,5,2));
                                         //生成第一个菜单
            if men_sub_no = 0 then
             if menu_last = 0 then
                MainMenu1.Items.Add(assign_menu[i])
               else
               MainMenu1.Items[menu_item_no - 1].Add(assign_menu[i])
            else
           begin
             if  menu_last = 0 then
             begin
               MainMenu1.Items[menu_item_no -1].Add(assign_menu[i]);
               j :=i;
             end
               else
               assign_menu[j].Add(assign_menu[i]);
           end;
           assign_menu[i].Visible := false;
           query_user.First;
      while not query_user.Eof do
          begin
        if  query_user.FieldByName('user_mean_no').Value = trim(menu_collect[i].menu_no) then
          begin
          assign_menu[i].Visible := true;
          break;
          end;
          query_user.Next;
          end;
         i :=i+1;
       end;
    end;//系统管理员组的建立
    procedure create_mean(menu_collect:array of menus_p;assign_menu:array of TMenuItem;var MainMenu1:TMainMenu);
    var
      menu_item_no,men_sub_no,i,j:integer;
      menu_item_str,men_sub_str:string;
      menu_last:integer;
    begin
      i :=0;
      while i < N do
      begin
        menu_item_str := copy(menu_collect[i].menu_no,1,2);
        menu_item_no := strToInt(menu_item_str);
        men_sub_str := copy(menu_collect[i].menu_no,3,2);
        men_sub_no := strToInt(men_sub_str);
        menu_last := strToInt(copy(menu_collect[i].menu_no,5,2));
                                           //生成第一个菜单
            if men_sub_no = 0 then
             if menu_last = 0 then
                MainMenu1.Items.Add(assign_menu[i])
               else
               MainMenu1.Items[menu_item_no - 1].Add(assign_menu[i])
            else
           begin
             if  menu_last = 0 then
             begin
               MainMenu1.Items[menu_item_no -1].Add(assign_menu[i]);
               j :=i;
             end
               else
               assign_menu[j].Add(assign_menu[i]);
           end;
         i :=i+1;  end;
    end;
      

  6.   

    继上
     
    procedure get_assign_mean(var assign_menu:array of TMenuItem;var MainMenu1: TMainMenu;menu_collect:array of menus_p);
    var
      i:integer;
    begin
        i :=0;
       while  i < N  do
       begin
       assign_menu[i] := TMenuItem.Create(application);
        if trim(menu_collect[i].Menu_mc) = trim('open') then
        begin
          assign_menu[i].Caption := 'open';
          assign_menu[i].OnClick := main_fm.p_open;
        end
        else if trim(menu_collect[i].Menu_mc) = 'save' then
        begin
          assign_menu[i].Caption :='save';
          assign_menu[i].OnClick :=main_fm.p_save;
        end
        else if  trim(menu_collect[i].Menu_mc) = 'applicaton' then
        begin
          assign_menu[i].Caption :='applicaton';
          assign_menu[i].OnClick :=main_fm.p_application;
        end
        else if  trim(menu_collect[i].Menu_mc) = 'from' then
        begin
          assign_menu[i].Caption :='from';
          assign_menu[i].OnClick :=main_fm.p_from;
        end
        else if trim(menu_collect[i].Menu_mc) = 'other' then
        begin
           assign_menu[i].Caption :='other';
          assign_menu[i].OnClick :=main_fm.p_other;
        end
        else if trim(menu_collect[i].Menu_mc) = 'undo' then
        begin
          assign_menu[i].Caption :='undo';
          assign_menu[i].OnClick :=main_fm.p_undo;
        end
        else if trim(menu_collect[i].Menu_mc) = 'cut' then
         begin
          assign_menu[i].Caption :='cut';
          assign_menu[i].OnClick :=main_fm.p_cut;
          end
        else if trim(menu_collect[i].Menu_mc) = 'copy' then
        begin
          assign_menu[i].Caption :='copy';
          assign_menu[i].OnClick :=main_fm.p_copy;
        end
        else if trim(menu_collect[i].Menu_mc) = 'find' then
        begin
          assign_menu[i].Caption :='find';
          assign_menu[i].OnClick := main_fm.p_find;
        end
        else if trim(menu_collect[i].Menu_mc) = 'findinfile' then
        begin
           assign_menu[i].Caption :='findinfile';
           assign_menu[i].OnClick := main_fm.p_findinfile;
        end
        else if trim(menu_collect[i].Menu_mc) = 'browers' then
         begin
           assign_menu[i].Caption :='browers';
           assign_menu[i].OnClick := main_fm.p_browers;
         end
        else if trim(menu_collect[i].Menu_mc) = 'tooler' then
         begin
           assign_menu[i].Caption :='tooler';
           assign_menu[i].OnClick := main_fm.p_tooler;
         end
        else if trim(menu_collect[i].Menu_mc) = 'options' then
        begin
           assign_menu[i].Caption :='options';
           assign_menu[i].OnClick :=main_fm.p_options;
        end
        else if trim(menu_collect[i].Menu_mc) = 'viewsourse' then
        begin
           assign_menu[i].Caption :='viewsourse';
           assign_menu[i].OnClick :=main_fm.p_viewsourse;
        end
        else if  trim(menu_collect[i].Menu_mc) = 'run' then
        begin
            assign_menu[i].Caption :='run';
            assign_menu[i].OnClick :=main_fm.p_run;
        end
        else if  trim(menu_collect[i].Menu_mc) = 'stepover' then
        begin
            assign_menu[i].Caption :='stepover';
            assign_menu[i].OnClick :=main_fm.p_stepover;
        end
        else if trim(menu_collect[i].Menu_mc) = 'staseinto' then
        begin
            assign_menu[i].Caption :='staseinto';
            assign_menu[i].OnClick :=main_fm.p_staseinto;
        end
        else if trim(menu_collect[i].Menu_mc) = 'new1' then
        begin
            assign_menu[i].Caption :='new1';
            assign_menu[i].OnClick :=main_fm.p_new1;
        end
        else if trim(menu_collect[i].Menu_mc) = 'old' then
        begin
           assign_menu[i].Caption :='old';
           assign_menu[i].OnClick :=main_fm.p_old;
        end
        else if trim(menu_collect[i].Menu_mc) = 'sql' then
        begin
           assign_menu[i].Caption :='sql';
           assign_menu[i].OnClick := main_fm.p_sql;
        end
        else if trim(menu_collect[i].Menu_mc) = 'insert' then
        begin
            assign_menu[i].Caption :='insert';
           assign_menu[i].OnClick := main_fm.p_insert;
        end
         else if  trim(menu_collect[i].Menu_mc) = 'delete' then
         begin
            assign_menu[i].Caption :='delete';
            assign_menu[i].OnClick := main_fm.p_delete;
         end
         else if  trim(menu_collect[i].Menu_mc) = 'cb' then
         begin
            assign_menu[i].Caption :='cb';
            assign_menu[i].OnClick := main_fm.p_cb;
          end
         else if trim(menu_collect[i].Menu_mc) = 'delphi' then
         begin
            assign_menu[i].Caption :='delphi';
            assign_menu[i].OnClick := main_fm.p_delphi;
         end
         else if trim(menu_collect[i].Menu_mc) = 'vc' then
         begin
           assign_menu[i].Caption :='vc';
           assign_menu[i].OnClick := main_fm.p_vc;
         end
         else if  trim(menu_collect[i].Menu_mc) = 'pb' then
         begin
           assign_menu[i].Caption :='pb';
           assign_menu[i].OnClick := main_fm.p_pb;
         end
         else if trim(menu_collect[i].Menu_mc) = 'file' then
           assign_menu[i].Caption :='file'
         else if trim(menu_collect[i].Menu_mc) = 'new' then
           assign_menu[i].Caption :='new'
         else if trim(menu_collect[i].Menu_mc) = 'edit' then
           assign_menu[i].Caption :='edit'
         else if trim(menu_collect[i].Menu_mc) = 'serch' then
           assign_menu[i].Caption := 'serch'
         else if trim(menu_collect[i].Menu_mc) = trim('view') then
           assign_menu[i].Caption := 'veiw'
         else if trim(menu_collect[i].Menu_mc) = 'project' then
           assign_menu[i].Caption := 'project'
         else if trim(menu_collect[i].Menu_mc) = 'run' then
           assign_menu[i].Caption := 'run'
         else if trim(menu_collect[i].Menu_mc) =  'compont' then
           assign_menu[i].Caption := 'compont'
         else if trim(menu_collect[i].Menu_mc) =  'database' then
           assign_menu[i].Caption := 'database'
         else if trim(menu_collect[i].Menu_mc) = 'tools' then
           assign_menu[i].Caption := 'tools';
            i:= i + 1;
       end;
    end;procedure get_mani_menu(var menu_collect:array of menus_p);
    var
      i :integer;
    begin
        i :=0;
        Query_menu := TQuery.Create(application);
    with query_menu do
    begin
       DatabaseName := dm.db_menu.DatabaseName;
       SQL.Clear;
       SQL.Add('SELECT menu_no,menu_name FROM mis_menu');
       Prepare;
       Query_menu.Open;
       if RecordCount < 1 then   //没有记录
          exit;    while not Eof do
         begin
          menu_collect[i] :=new(menus_p);
          menu_collect[i].menu_no :=FieldByName('menu_no').AsString;
          menu_collect[i].Menu_mc:=fieldbyName('menu_name').AsString;
          menu_collect[i].sf_privew :=0;
          Next;
          i := i +1;       //数组也加一
         end;
    end;
    end;
    end.
      

  7.   

    是的,以前是有一个这样的贴子,但那是一个label的,要上面的caption我从数据库中取中String,或者是从文件中取出String我的菜单连名字都不知道,我怎么事先定义事件呀??bo_zhb(大海波浪) (  ) 你必须先定义事件
    你这招我行不通呀大家再帮帮
      

  8.   

    分高??我还有一个问题,200分的,但人气好低http://www.csdn.net/expert/topic/724/724921.xml?temp=.4861566有兴趣的看一看,
      

  9.   

    谢谢bo_zhb(大海波浪) 了,可以了