我用MainMenu动态创建了一个菜单,在每级菜单里有个MainMenu.Items.OnClick对象但它只能复一个事件的名称,而我需要的是在这个属性里动用我自己定义的Dllfrmshow(1,'prjDLL.dll')这个函数(里面有两个要传的参数,一个是序号一个是dll名称),但我不知道如何将Dllfrmshow(1,'prjDLL.dll')这个函数复给MainMenu.Items.OnClick对象!请各位大哥告知谢谢!

解决方案 »

  1.   

    你可以定义一个TList与你的TMenuItem进行关联,TMenuItem onclick的时候去list里找到相关联的信息,然后再执行你的方法。
      

  2.   

    to hongqi162 
    能不能给个完整的例子呢?关键在于一定要传两个参数而事件里书不许传的!麻烦这位大哥给个例子吧谢谢
      

  3.   

    如果你定义的DllFrmShow函数中的第二个参数是固定的,即你使用相同的DLL,那么你可以将第一个参数存储在MenuItem对象的Tag属性中。然后再编写一个事件处理函数,用来调用你的自定义函数。示例代码如下:
    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函数。
      

  4.   

    (1,'prjDLL.dll')这两个参数第二个参数是固定的吗?如果是固定的,你在TMenuItem的tag里保存第一个参数就可以了
      

  5.   

    to chris_mao,chris_mao 
    两位大哥,这不是固定的!因为菜单是从数据库里读出来的,每条菜单记录都有一个对应的字段存放dll的文件名的,麻烦两位大哥再帮想想办法,谢谢!
      

  6.   

    unit Unit1;interfaceuses
      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.
      

  7.   

    我跟你有过类似的问题,就算不固定,也可处理啊!
    比如说建个Tag跟Dll的对照表,或TMenuItem名称跟Dll对照表,就可以处理了吧.
      

  8.   

    to hongqi162
    这位大哥,你给的代码编译是通过了,可是在点Button1Click的时候程序就报错了,麻烦您再帮看看,万分感谢!
      

  9.   

    to hongqi162 
    点按纽时候这句抱错麻烦您再看看  Index:=m_StrList.Add(IntToStr(I)+';aa.dll');//保存菜单信息 谢谢
      

  10.   

    MainMenu1.Items[0].Add( mi );//问题应该出现在这里,我不知道你创建菜单是怎样的一个过程,我这里只是简单得写写,
    你需要注意的是这里,两个参数使用分号来隔开,然后在点击的时候通过分号在分开
    Index:=m_StrList.Add(数据库取出的第一个参数+';'+数据库取回的第二个参数);//保存菜单信息
    mi.Tag:=Index;
      

  11.   

    to hongqi162 我把最后三句都屏蔽掉了他还抱错,而且错误停在    Index:=m_StrList.Add(IntToStr(I)+'aa.dll');//保存菜单信息 这句里,麻烦您帮测测,谢谢
      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;
      

  12.   

    这里没有问题,是不是对象没有被实例化啊,你看看你有下面的代码吗?
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      m_StrList:= TStringList.Create;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      m_StrList.Free;
    end;
      

  13.   

    to hongqi162
    非常感谢,谢谢