MainMenu1的部分item的caption 需要从数据库里读取,所以,刚开始这些item是没有 onclick事件的,但是读取结束后,怎样给他添加onclick事件呢?请多多指点呀

解决方案 »

  1.   

    在Form单元中添加一个菜单项点击处理函数:
    procedure MyMenuItemClick(Sender: TObject);动态生成MenuItem的时候,将MenuItem的OnClick指向这个函数,并赋一个不同的Tag值,作为区别。
    mi.OnClick := MyMenuItemClick;
    mi.Tag := i;最后MyMenuItemClick函数中根据Sender转化成TMenuItem的Tag,分别作不同的操作处理。以上是伪代码,我只讲了讲思路。具体代码自己写吧。
      

  2.   


    即然會寫動態創建了,其它底下就是一個指針的問題了。var
      item : TMenuItem;  Item := TmeunItem.create(Menu);
      Item.onclick := myclick;
      procedure TForm1.MyClick(Sender:Tobject);
      begin
       ShowMessage('click');
      end;上面是直接手寫的偽代碼,應該能看懂吧?
      

  3.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Menus;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure MyClick(Sender:TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      item,subitem : TMenuItem;
    begin
      item := TMenuItem.Create(nil);
      item.Caption := '文件';
      MainMenu1.Items.Add(item);
      subitem := TMenuItem.Create(nil);
      subitem.Caption := '下级菜单1';
      subitem.OnClick := MyClick;
      item.Add(subitem);
    end;procedure TForm1.MyClick(Sender: TObject);
    begin
      ShowMessage(TMenuItem(Sender).Caption);
    end;end.
      

  4.   

     將所有的子菜單的ONCLICK都指向他。 Item  := TMenuItem.create(...
     Item.tag := ?  // 模塊通過一個MODULEID來區分。 procedure TForm1.MyClick(Sender:Tobject);
      begin
        TMenuItem(Sender).tag ; //來獲得窗體,調出
      end;
      

  5.   

    但是这样也不能让item对应的窗体show出来呀!因为你item.caption是用户定义的,怎么能让用户在点击 自己定义的item的显示与其对应的 form窗体呢?
      

  6.   

    呵呵,delhpi是刚开始,希望不吝赐教呀 
      

  7.   


    为什么不自己去揣摩一下呢,看到这句了吗
    TMenuItem(Sender).tag ,sender表示你所点击的那个菜单,TMenuItem(Sender).tag就是你所点击的那个菜单的tag属性,你只要为每个菜单设置不同的tag,那么根据TMenuItem(Sender).tag来判断,去执行哪个具体的显示窗体的代码
      

  8.   

    恩,是这样的,但是既然动态定义的item,我想要实现的而是动态的调用窗体,你怎么知道 哪个tag的值对应那个窗体呢?
      

  9.   

     在 MyClick事件中
    if  TMenuItem(Sender).Tag  = 1 then
            begin
                   Form8.show;
            end;
         {if TMenuItem(Sender).Tag = 2 then
            begin
                  Form9.show;
            end;
                    }但是1和Form8对应关系,是否也要预先存在一个表里!
      

  10.   

    给你我写过的代码看看吧,注意看注释procedure TForm1.ShowConnMenu(  );
    var
      i: Integer;
      AItem: TMenuItem;
    begin
      for i := 0 to lstConn.Count - 1 do
      begin
        ConnInfo := TConnInfo(lstConn[i]);
        AItem := TMenuItem.Create( nil );
        AItem.Caption := ConnInfo.Name;
        AItem.Tag := i;           //这里给tag赋值,调用时要用
        AItem.OnClick := SubMenuClick; 
        
        mnDataBase.Add( AItem );  //mnDataBase是这些子菜单的父菜单
      end;
    end;procedure TForm1.SubMenuClick( ASender: TObject );
    var
      i: Integer;
      AItem: TMenuItem;
    begin
      AItem := ASender as TMenuItem;
      AItem.Checked := True;
      sConnName :=  TConnInfo(lstConn[AItem.Tag]).Name; //只要灵活运用这个Tag的值就行了
    end;
      

  11.   


    这些就完全通过代码实现,你写的思路是对的,就是判断tag,然后去调用不同的窗体
      

  12.   

    我没刷新帖子,你们就回复了这么多了
    你的思路是对的,就是要把Tag和Form建立一个关联关系
      

  13.   

     sConnName :=  TConnInfo(lstConn[AItem.Tag]).Name; //只要灵活运用这个Tag的值就行了
    这个是获的窗体的Name 吗?
      

  14.   

    不是
    你要问具体的实现,就先说说你那些Form和菜单是什么联系
      

  15.   

    可户可以自己定义需要显示的窗体,定义后就会在MainMenu1加入一个子菜单,然后当用户点击此item的时候,对应的Form就会出现.此Form也是动态生成的
      

  16.   

    可以这样,创建一个列表List,这个列表的每个元素是一个对象,这个对象的属性包括菜单名、窗体名
    你把菜单的Tag的值设置为List的Index不就可以了吗?procedure TForm1.LoadFormMenu( );
    var
      AFormInfo: TFormInfo;
    begin
      for i := 0 to lstFormInfo.count - 1 do
      begin
        AFormInfo := TFormInfo(lstFormInfo[i]);
        AItem := TMenuItem.Create( self );
        AItem.Caption := AFormInfo.MenuCaption;
        AItem.Tag := i;
        AItem.OnClick := SubMenuClick; 
        
        mnParent.Add( AItem );  
      end;
    end;procedure TForm1.SubMenuClick( ASender: TObject );
    var
      i: Integer;
      AItem: TMenuItem;
      AForm: TForm;
      sFormName: string;
    begin
      AItem := ASender as TMenuItem;
      sFormName := TFormInfo(lstFormInfo[AItem.Tag]).FormName; 
      //根据sFormName创建Form
    end;
      

  17.   

    加个Action,指定Action,根据数据库里菜单A和ID,对接Action里的id
      

  18.   

    26楼写错,是ActionList加个ActionList,指定ActionList,根据数据库里菜单A和ID,对接ActionList里的id