我用MainMenu动态创建了一个菜单,在每级菜单里有个MainMenu.Items.OnClick对象但它只能复一个事件的名称,而我需要的是在这个属性里动用我自己定义的Dllfrmshow(1,'prjDLL.dll')这个函数(里面有两个要传的参数,一个是序号一个是dll名称),但我不知道如何将Dllfrmshow(1,'prjDLL.dll')这个函数复给MainMenu.Items.OnClick对象!请各位大哥告知谢谢!
调试欢乐多
能不能给个完整的例子呢?关键在于一定要传两个参数而事件里书不许传的!麻烦这位大哥给个例子吧谢谢
Protected
procedure MenuItemClickHandle(Sender: TObject);
..........procedure 类名.MenuItemClickHandle(Sender: TObject);
begin
DLLFrmShow(TMenuItem(Sender).Tag, 'prjDLL.dll');
end;//动态创建菜单项的代码中添加如下代码
//假设AItem是新创建的TMenuItem类型变量
AItem.OnClick := MenuItemClickHandle;哪果你每次使用的是不同的DLL,那么你还需要使用一个数组或是TStringList对象来存储相应的DLL文件名称,在事件处理函数中利用Tag或是菜单名做为索引检索相应的DLL文件名称,然后再调用你的DLLFrmShow函数。
两位大哥,这不是固定的!因为菜单是从数据库里读出来的,每条菜单记录都有一个对应的字段存放dll的文件名的,麻烦两位大哥再帮想想办法,谢谢!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Button1: TButton;
fdsafdsa2: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
m_StrList:TStringList;
procedure MiClick(Sender: TObject);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
m_StrList:= TStringList.Create;
end;procedure TForm1.Button1Click(Sender: TObject);
var
mi:TMenuItem;
I:Integer;
Index:Integer;
begin
for i:=0 to 10 do
begin
mi:= TMenuItem.Create( Owner );
mi.Caption:='mi'+IntToStr( I );
mi.Name:='mi'+IntToStr( I );
Index:=m_StrList.Add(IntToStr(I)+';aa.dll');//保存菜单信息
mi.Tag:=Index;
mi.OnClick:=MiClick;
MainMenu1.Items[0].Add( mi );
end;
end;procedure TForm1.MiClick(Sender: TObject);
var
Index,i:Integer;
temp,DLL:String;
begin
temp:=m_strList.Strings[TMenuItem(Sender).Tag];
I:=Pos(';',temp);
Index:=StrToInt(copy(temp,1,i-1));
DLL:=copy(temp,I+1,length(temp)-I);
showmessage(inttostr(i));
showmessage( dll );
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m_StrList.Free;
end;end.
比如说建个Tag跟Dll的对照表,或TMenuItem名称跟Dll对照表,就可以处理了吧.
这位大哥,你给的代码编译是通过了,可是在点Button1Click的时候程序就报错了,麻烦您再帮看看,万分感谢!
点按纽时候这句抱错麻烦您再看看 Index:=m_StrList.Add(IntToStr(I)+';aa.dll');//保存菜单信息 谢谢
你需要注意的是这里,两个参数使用分号来隔开,然后在点击的时候通过分号在分开
Index:=m_StrList.Add(数据库取出的第一个参数+';'+数据库取回的第二个参数);//保存菜单信息
mi.Tag:=Index;
for i:=0 to 10 do
begin
mi:= TMenuItem.Create(Owner);
mi.Caption:='mi'+IntToStr(I);
mi.Name:='mi'+IntToStr(I);
Index:=m_StrList.Add(IntToStr(I)+'aa.dll');//保存菜单信息
// mi.Tag:=Index;
// mi.OnClick:=MiClick;
// MainMenu1.Items[0].Add(mi);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
m_StrList:= TStringList.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m_StrList.Free;
end;
非常感谢,谢谢