比如菜单插件的click事件

解决方案 »

  1.   

    除了用消息外,
    菜单中的发生某一个click事件
    需要在主程序中响应
      

  2.   

    可以使用属性,定义一属性,FHasClick:Bolean;
    再定义两个私有函数
    GetHasClick 和SetHasClick
    property HasClick:Boolean read GetHasClick write SetHasClick;点击菜单后给HasClick赋值,从而触发SetHasClick,在SetHasClick中处理主窗体消息,GetHasClick 可根据需要决定是否需要
      

  3.   

    菜单在dll中
    hasclick应当在主窗体中
      

  4.   

    使用回调的方法。例如:在DLL中申明如下:
    type
      TEventProc = procedure of object;var
      OnMenuClick : TEventProc;
    DLL中菜单Click的响应代码写成这样:procedure XXXX.File1Click(Sender: TObject);
    begin
      if Assigned(OnMenuClick) then OnMenuClick;
    end;
    主程序的代码如下:procedure TForm1.FormCreate(Sender: TObject);
    begin
      OnMenuClick := MyMenuClick;
    end;Procedure TForm1.MyMenuClick();
    begin
      ShowMessage('MenuClick');
    end;
      

  5.   

     
    library MyMenus;uses
         sharemem,
         SysUtils,
         menus,
         dialogs,
         Classes;
    {$E Men}
    const
         MainCaption: array[0..3] of string =
         ('文件(&Files)',  '工具(&Tools)', '关于(&About)');
         FilesCaption: array[0..3] of string =
         ('打开(&Open)', '保存(&Save)', '关闭(&Clost)', '退出(E&xit)');type
         TEventProc = procedure of object;     MyObject = class(TObject)
         public
              procedure Proc(Sender: TObject);
              constructor create(MyMenu: TMainMenu; var Mode: integer);
         end;
    var
         AObj: MyObject;
        
    constructor MyObject.create(MyMenu: TMainMenu; var Mode: integer);
    var i: integer;
         Item: TMenuItem;
    begin
         MyMenu.AutoHotkeys := maManual;
         for i := 0 to length(MainCaption) - 1 do
         begin
              Item := TMenuItem.Create(MyMenu);
              Item.Caption := MainCaption[i];
              MyMenu.Items.Add(Item);
         end;     for i := 0 to length(FilesCaption) - 1 do
         begin
              Item := TMenuItem.Create(MyMenu);
              Item.Caption := FilesCaption[i];
              MyMenu.Items[0].Add(Item);
              Item.OnClick := Proc;
         end;
         MyMenu.Items[0][0].ShortCut := $4000 + ord('O');
         MyMenu.Items[0][1].ShortCut := $4000 + ord('S');
    end;
    procedure MyObject.Proc(Sender: TObject);
    begin
         if Sender is TMenuItem then ShowMessage(TMenuItem(Sender).Caption);
         procedure DllMenu(MyMenu: TMainMenu; var Mode: integer); stdcallbegin
         case mode of
              -1: AObj.Free;
              0: AObj := MyObject.create(MyMenu, Mode);
              1: ;
              2: ;
         end;
    end;       {$R *.res}
    exports
         DllMenu;
    begin
    end.我是这样搞的,不知道如何加,这样搞好不好?