在DLL中定义的一个类
……
type
  TIMMenu = class
  public
    procedure IMClick(Sender: TObject);
  end;
……
procedure TIMMenu.IMClick(Sender: TObject);
begin
  ShowMessage('Hello, world');
end;
……
//FormatIMMenu过程将下列两个子菜单添加到itmMenu上
procedure FormatIMMenu(AOwner: TComponent;var itmMenu: TMenuItem); stdcall;
……
  mnuItem := TIMMenu.Create;
  subMnu[0] := TMenuItem.Create(AOwner);
  subMnu[0].Caption := 'A';
  subMnu[0].OnClick := mnuItem.IMClick;
  itmMenu.Add(subMnu[0]);  subMnu[1] := TMenuItem.Create(AOwner);
  subMnu[1].Caption := 'B';
  subMnu[1].OnClick := mnuItem.IMClick;
  itmMenu.Add(subMnu[1]);
……
第一个子菜单A的单击事件有效,会ShowMessage,第二个子菜单B的单击事件死活就是无效。怎么回事啊?在主程序中把子菜单B的单击事件赋给随便一个按钮的OnClick事件,就可以ShowMessage出来!

解决方案 »

  1.   

    在给菜单B的OnClick 事件赋值前你需要重新创建TIMMenu 的一个实例
      

  2.   

    试试:
      mnuItem := TIMMenu.Create;
      subMnu[0] := TMenuItem.Create(AOwner);
      subMnu[0].Caption := 'A';
      subMnu[0].OnClick := mnuItem.IMClick;  subMnu[1] := TMenuItem.Create(AOwner);
      subMnu[1].Caption := 'B';
      subMnu[1].OnClick := mnuItem.IMClick;
      itmMenu.Add(subMnu);
      

  3.   

    将你的程序稍作改变,用在一个Form中,编译成exe文件,完全正常~
      

  4.   

    是啊,在如果把代码放到项目中就可以,但如果是使用DLL技术加载的话就是会出错!
      

  5.   

    在使用一个类的方法时,是可以不创建对象的,可以直接用该类的方法,也就是:
    subMnu[0].OnClick := TIMMenu.IMClick;
    subMnu[1].OnClick := TIMMenu.IMClick;
      

  6.   

    俺有类似的代码在WinXP下有类似错误,在Win98和Win2K下就一切正常。是否同病?
      

  7.   

    还有,你的过程声明中“var itmMenu: TMenuItem”中的var完全是多余的。当然这与你的问题可能根本无关。