数据库表MENU_LIST
MNBH     MNNAME  EVENT       TYPE
M0001    日报表   kqrb.show   子窗体
M0002    汇总表   kqhz.show   子窗体
M0003    计算器   calc.exe    外部程序
我现在的做法是这样子的: 
在主窗体onshow时     qryM.First; 
    for I:=0 to qryM.RecordCount-1 do 
    begin 
      MM:=TMenuItem.Create(Self); 
      MM.Name := qryMMNBH.Value; 
      MM.Caption := '['+qryMMNNAME.Value+']';
      MM.OnClick := ???????????????????????      //这里怎么写啊?写成:MM.OnClick := qryMTYPE.Value????? 不可能吧。。
      Main_Menu.Items.Add(MM);       ADOQM.Next; 
    end; 以上红色部份不会做啊,菜单项是出来了,可是菜单项的单击事件却没有。要怎么做呢。

解决方案 »

  1.   

    首先在你的Form定义并实现过程
    type
      TForm1 = class(TForm)
      ...
      private
        { Private declarations }
        procedure OnMMClick(Sender: TObject);//定义菜单事件
      public
        { Public declarations }
      end;
    implementation  procedure TForm1.OnMMClick(Sender: TObject);
      begin
        ...你的代码
      end;然后
    MM.OnClick:=OnMMClick;
      

  2.   

    这很难啊,哥们儿,首先就是如何把“kqrb.show”字符串赋值给OnClick,另外,你的数据库结构少一个字段,应该加一个“父菜单名称”,否则你的这个菜单只能加到一个菜单下面了
      

  3.   

    1.资料表应该重新设计,EVENT/TYPE放在数据库里没什么意义2.还有你的代码只能添加同级菜单,要添加下一级菜单就要修改了3.下面是随手写的,对你有用的就参考试试吧,像一楼的先定义好触发事件,把你的代码变一下数据库表MENU_LIST 
    MNBH    MNNAME  mtag 
    M0001    日报表  100
    M0002    汇总表  200  
    M0003    计算器  300      qryM.First; 
        for I:=0 to qryM.RecordCount-1 do 
        begin 
          MM:=TMenuItem.Create(Self); 
          MM.Caption :=qryMMNNAME.Value; 
          MM.tag:=qrymtag.Value;
          MM.OnClick:=OnMMClick;
           Main_Menu.Items.Add(MM); 
          ADOQM.Next; 
        end;   procedure TForm1.OnMMClick(Sender: TObject); 
      begin 
       case TMenuItem(Sender).tag of
         100:Form1.show;
         200:Form1.show;
         300:Form3.show;
         ...
       end;
      end; 
      

  4.   

     private
        { Private declarations }
      public
        { Public declarations }
      published
        procedure MyClick(Sender:TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
        @Button2.OnClick  := self.MethodAddress('MyClick');
    end;procedure TForm1.MyClick(Sender: TObject);
    begin
       ShowMessage('fsdaf');
    end;这样应该是可以的了,相当于在一个类里把你的事件都写好,然后直接在类里用方法名字去找就可以了,方法名字放在数据库里  
      

  5.   


    向gwhdaxia学习
      

  6.   

    自己维护一个方法名称(methodname)和方法地址(methodpointer)的map.
    去map里找.
      

  7.   

    这还看不懂?@Button2.OnClick  := self.MethodAddress('MyClick'); 就是把名称为“MyClick”的方法地址传给Button2作为点击事件
      

  8.   

    @Button2.OnClick  := self.MethodAddress('MyClick'); 
      

  9.   

    参考1楼OnClick我不解释了。    qryM.First; 
        for I:=0 to qryM.RecordCount-1 do 
        begin 
          MM:=TMenuItem.Create(Self); 
          MM.Name := qryMMNBH.Value; 
          MM.Caption := '['+qryMMNNAME.Value+']'; 
          MM.OnClick := ???????????????????????      //这里怎么写啊?写成:MM.OnClick :=   
          MM.Hint:='藏一个什么,比如主键';
          MM.Tag:=123;//藏一个什么,比如数字类型。      Main_Menu.Items.Add(MM);       ADOQM.Next; 
        end; 
      procedure TForm1.OnMMClick(Sender: TObject); 
    var s:String;i:Integer;
      begin 
        s:=(Sender as TMenuItem).Hint;
        i:=(Sender as TMenuItem).Tag;    ...你的代码 至少可以对应到数据库里去了。
      end;