我在程序中动态生成子菜单:
  主菜单
        子菜单1
        子菜单2
        子菜单3  
怎样实现以下功能:
  当我 点击 子菜单1 时 showmessage('子菜单1')
       点击 子菜单2 时 showmessage('子菜单2') 
... 我动态生成子菜单的代码大致如下:
procedure TForm1.Button3Click(Sender: TObject);
var
  sr : TSearchRec;
  sl : TStringList;
  Dir,ext : String;
  logh:integer;
  retval: Integer;begin...
menuitemc[i].Tag := J;
menuitemc[i].OnClick :=XX;
n.Add(menuitemc[i]);
...
end;应该怎样写XX 的代码?
谢谢!

解决方案 »

  1.   

    procedure menuClick;//此处为声明procedure TForm1.menuClick;
    begin
      ShowMessage('菜单被击');
    end;然后把这个过程赋值给onClick;
    menuitemc[i].OnClick := menuClick; //XX;
      

  2.   

    for i:=0 to menuitem.count-1 do
      begin 
       with menuitem[i].tag do
           case 1:begin end;
          .................//反正你写上相对应的处理语句就可以了..
      with 
    end;
      

  3.   

    type
      TForm1 = class(TForm)
        ...
      published
        procedure MyMenuOnClick(Sender: TObject);
      end;...procedure TForm1.MyMenuOnClick(Sender: TObject);
    begin
      //你的代码
    end;...
    menuitemc[i].Tag := J;
    menuitemc[i].OnClick := MyMenuOnClick;
    n.Add(menuitemc[i]);
    ...
      

  4.   

    如何处理动态添加的子菜单项的事件?  
    ---------------------------------------------------------------  
     
    动态创建菜单全接触  
                             高红岩  
     
    基本认识:  
    在Delphi的程序开发环境中,封装的VCL减化了我们许多的开发工作,由在界面的设计上使开发的进度很快,但在很多的时候,我们需要自己来设计可视化的用户界面,而且是在程序的运行中,这时我们就得利用Delphi给我们提供的类来完成我们需要的工作了,下面笔者就和朋友们浅入的讨论一下动态创建"菜单"的基本知识,希望本文给那些刚入门的朋友来个抛砖引玉的作用。  
    在delphi的菜单设计中,有两个Delphi的菜单控件:  
    1:Tmainmenu;  
    2:Tpopupmenu;  
    前者是创建窗口的菜单,后者是创建右键弹出式菜单的控件,但在Delphi庞大的类库中有一个类与这两个控件密切相关,它就是:TMenuItem,窗口的菜单和右键弹出式菜单的每个条目都是TMenuItem类的一个对象。此TMenuItem类不出现在控件板上,在程序中用代码可创建其实例。    
    基本知识:  
    在tmainmenu,tpopupmenu控件中有一个属性是items,此属性是数组型,里面的参数为菜单项的索引值。  
    文件 编辑 查看 插入 格式 帮助  
    ----  ----  ----  ----  ----  ----  
    新建 撤消 标尺 对象 字体 关于  
    打开 拷贝 源码 公式 颜色   
     
    相信您看过上面的菜单简单表示之后是非常熟悉的,在此菜单中菜单头的索引值代表如下:  
    "文件"的菜单的items值为0;  
    "编辑"的菜单的items值为1;以此类推。  
    items属性是tmenuitem类型,而在此类型中还有一个属性,是items,如果您略懂"类"的关系,您就不难明白此类似"嵌套"的关系。"新建"菜单选项是"文件"菜单选项的子类,用代码表示为tmainmenu.items[0].items[0],"打开"菜单选项为tmainmenu.items[0].items[1],以此类推,而代表"编辑"菜单中的"拷贝"菜单选项的代码为tmainmenu.items[1].items[1],其它菜单代码表示以此类推。  
     
    基本实例:  
    知道了菜单的items结构之后,我们就可以进一步大胆的创建自己有序的菜单了。  
    上面讨论到窗口的菜单和右键弹出式菜单的每个条目都是TMenuItem类的一个对象。那么我们就可以create它的一个实例,来添加自己想要的菜单了。  
    示例过程:  
    1:新建一个工程。  
    2:添加一个tmainmenu控件。  
    3:添加一个button控件,并在button的onclick事件中写入如下代码:  
    procedure  TForm1.Button1Click(Sender:  TObject);  
    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;    
    运行后,出现如上面例举的菜单的部分结构,如此看来动态创建菜单项的方法是非常简单的,这无疑于Delphi把系统的函数进行了封装。菜单头我们创建完了,接下来就该创建菜单里的菜单项了,由"items属性是tmenuitem类型,而在此类型中还有一个属性,是items"此句话的意思我们可以创建菜单项,代码如下:  
    1:新建一个工程。  
    2:添加一个tmainmenu控件。  
    3:添加一个button控件,并在button的onclick事件中写入如下代码:  
    procedure  TForm1.Button1Click(Sender:  TObject);  
    var  
    files,edit:tmenuitem;  
    new,copy: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);  
    {上部代码为创建菜单头}  
    new:=tmenuitem.create(self);  
    copy:=tmenuitem.create(self);  
    new.Caption:='新建';  
    copy.caption:='拷贝';  
    files.Add(new);  
    edit.add(copy);  
    {上部代码为创建菜单项}  
    end;  
    运行效果和上面菜单结构表中基本一样,但此时点击菜单项时不出现任何的事件,显然这样的软件出售量不算理想,我们可以略改代码加个事件上去。  
    代码如下:  
    1:新建一个工程。  
    2:添加一个tmainmenu控件。  
    3:  
    private  
    procedure  abc(sender:tobject);  
    {  Private  declarations  }  
    var  
    Form1:  TForm1;  
     
    implementation  
     
    {$R  *.DFM}  
     
    procedure  tform1.abc(sender:tobject);  
    begin  
    showmessage('welcome  you  click  me!!  :)  xixi');  
    end;  
    procedure  TForm1.Button1Click(Sender:  TObject);  
    var  
    files,edit:tmenuitem;  
    new,copy: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);  
    {上部代码为创建菜单头}  
    new:=tmenuitem.create(self);  
    copy:=tmenuitem.create(self);  
    new.Caption:='新建';  
    copy.caption:='拷贝';  
    copy.OnClick:=abc;  
    new.OnClick:=abc;  
    files.Add(new);  
    edit.add(copy);  
    {上部代码为创建菜单项}  
    end;  
    这时这个软件就有了交互的功能。  
    有时菜单项中出现一个横的条线和出现一个子的菜单,那么这样的效果怎么用代码实现的呢,下面就是此效果的代码示例:  
    1:新建一个工程。  
    2:添加一个tmainmenu控件。  
    3:  
    procedure  TForm1.Button1Click(Sender:  TObject);  
    var  
    files,edit:tmenuitem;  
    new,copy:tmenuitem;  
    sub1,sub2,sub3,lines: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);  
    {上部代码为创建菜单头}  
    new:=tmenuitem.create(self);  
    copy:=tmenuitem.create(self);  
    new.Caption:='新建';  
    copy.caption:='拷贝';  
    files.Add(new);  
    edit.add(copy);  
    {上部代码为创建菜单项}  
    sub1:=tmenuitem.create(self);  
    sub2:=tmenuitem.create(self);  
    sub3:=tmenuitem.create(self);  
    lines:=tmenuitem.create(self);  
    lines.caption:='-';  
    sub1.caption:='子菜单1';  
    sub2.caption:='子菜单2';  
    sub3.caption:='子菜单3';  
    new.Add(sub1);  
    new.add(lines);  
    new.add(sub3);  
    copy.Add(sub2);  
    {上面代码出现多项子菜单和横线的效果}  
    end;  
    到此讨论的内容就要结束,菜单的创建在Delphi中是非常简单的事,在tmenuitem类中还有许多的事件和方法及属性,如Add,Clear,Click,Create,Delete,Destroy,Find,IndexOf,Insert,Remove等方法的使用都是非常简单的,后祝所有的朋友身体健康。  
      

  5.   

    for  ff:= 0 to 主菜单.Count-1 dobegin
    Sender = _Main.Items[0].items[FF]
    showmessage('FF')
    end;