使用回调的方法。例如:在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;
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.我是这样搞的,不知道如何加,这样搞好不好?
菜单中的发生某一个click事件
需要在主程序中响应
再定义两个私有函数
GetHasClick 和SetHasClick
property HasClick:Boolean read GetHasClick write SetHasClick;点击菜单后给HasClick赋值,从而触发SetHasClick,在SetHasClick中处理主窗体消息,GetHasClick 可根据需要决定是否需要
hasclick应当在主窗体中
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;
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.我是这样搞的,不知道如何加,这样搞好不好?