在 D7 中的主菜单和弹出式菜单是用 TActionMainMenuBar 做的,
用 TActionMainMenuBar 做主菜单好做,但用做弹出式菜单怎么做
才能达到像 D7 一样的效果?
var
 xx : TComustActionPopup;
begin
 xx := TComustActionPopup.create;
 xx.actionclient := ActionMainMenuBar.actionclient.items[0].contentitem ;
 xx.popup(0,0);
 xx.closemenu;
 xx.free;
end;以上代码是我回忆写的,可以有点语法错误,但确实可以弹出菜单,但,效果就没有
D7 中的好,不知为什么?

解决方案 »

  1.   

    在窗体上放一个ActionManager,一个ActionMainMenuBar,然后在ActionManager1中定义三个Category,每个Category中放三个Action,然后将三个Action分别拖到ActionMainMenuBar1上定义一个公共变量
    var
      XPPopupMenu:TCustomActionPopupMenu;然后在Form1的OnCreate中写下列代码
    procedure TForm1.OnCreate(Sender:TObject);
    begin
      MenuPopupClass:=TCustomActionPopupMenu;  //我看到Delphi的帮助说要先定义一个TCustomActionPopupMenu的子类,然后把这个子类作为程序的弹出菜单的模板类
      XPPopupMenu:=TCustomActionPopupMenu.Create(Self);
      //标注一
      with XPPopupMenu do 
      begin
        //标注二
        ActionClient:=ActionManager1.ActionBars[0];
      end;
    end;然后在Form1的OnMouseDown事件中写如下代码
    ...
    begin
      if Button=mbRight then
        XPPopupMenu.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
    end;这样,每次运行程序的时候当在Form1按下鼠标右键的时候就可以弹出一个菜单。但有如下问题:
    1.弹出的菜单的布局居然是横向的,即使我在上面程序的标注二处定义了XPPopupMenu的Orientation属性也一样;
    2.我上面的程序中只是把程序的弹出菜单模板定义为TCustomActionPopupMenu类,并没有设置窗口的PopupMenu属性。但即使我在标注一处设置了这个属性,发现还是需要在窗口的OnMouseDown事件中写代码;你按照我说的方法,看看,我在试验试验!
      

  2.   

    不要用ContextItems属性,这个属性是用来指示在菜单项上反点出现的菜单中的内容的
      

  3.   

    http://expert.csdn.net/Expert/topic/1585/1585135.xml?temp=.9065058我刚写的,你去看看!
      

  4.   

    T0 FrameSniper(框架狙击手) :  ActionMainMenuBar 的几种属性我都试过了,
    我现在碰到的问题不是菜单模着放,因为 ActionClient:=ActionManager1.ActionBars[0] 时,只能取出菜单条上的项目,
      我要达到的目的是像 delphi 7 弹出菜单一样,
      xx.actionclient := ActionMainMenuBar.actionclient.items[0].contentitem
    或者
      xx.actionclient := ActionMainMenuBar.actionclient.items[0].ActionClient[0]
    这样就可以像 D 7 一样弹出菜单,
    但有一点不好的就是,用我的这种方法弹出的菜单有边框,和D 7 的菜单比起来效果差多了.
    不知如何解决
      

  5.   

    我按照你的方法:先在TActionManager中建立三个自定义动作,然后归类为Category,Category的名字是C1,三个动作的名字是A1到3,然后拖动到ActionMainMenuBar1中,可以看到出现主菜单项目C1,下面有三个菜单项A1到A3,然后我点A1,然后在A1对应的ContextItem中添加D1到D4四个Item,最后我选D1,然后在他的Items中添加E1到E5,如果使用代码
    XX.ActionClient:=ActionMainMenuBar.ActionClient.Items[0].ContextItem将显示E1到E5,
    如果使用代码
    XX.ActionClient:=ActionMainMenuBar.ActionClient.Items[0].ActionClient[0]将显示A1到A3不过你这种建立XP Style Popup Menu的方法有点不符合常规,我看到TCustomActionPopupMenu中介绍了制作XP Style Popup Menu的方法,不过我用了以后好象有点问题,因为我弹不出菜单我再看看,正好这几天正在做这个