在需要弹出菜单的控件的onmousedown事件中加入语句
procedure TFrmprice.Button2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then
     PopupMenu1.Popup((Button2.Left+Button2.Width+Left+8),(Button2.Top+Button2.Height+Panel1.Top+Top+4));
end;

解决方案 »

  1.   

    楼上的只回答对了一半。只要捕捉MOUSEDOWN的事件。然后按鼠标坐标POPUP。就行了。不用什么Button2.有点墨守成规。
      

  2.   

    在任何可视控件的点击事件或鼠标按下键写以下代码
    var
      p: TPoint;
    begin
      GetCursorPos(p);
      PopupMenu1.Popup(p.x ,p.y);想在哪儿弹出来都可以
      

  3.   

    吧hotxu() 和shadow7880(赛都)合起来就非常清楚了
      

  4.   

    to shadow7880(赛都)
    我想让它在BitBtn(或Button)的正上方弹出呢?
    正如,系统的开始菜单。
    一般PopupMenu是在(left,top)弹出的,默认的
      

  5.   

    速达软件下拉按钮的效果
    bitbtn按钮,其余一样。
       popupmenu1.autopopup:=false;
    procedure TForm1.BitBtn1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      pt:tpoint;
    begin
      pt.x:=bitbtn1.Left;
      pt.y:=bitbtn1.top+bitbtn1.Height;
      pt:=clienttoscreen(pt);//坐标转换
      if button=mbleft then
      popupmenu1.popup(pt.x,pt.y);
    end;
      

  6.   

    to ssl2000(大宋)兄弟怎么实现往上弹出么(有时由于界面上的因素,不得不这样作)?
    期待回音...
      

  7.   

    var
      p: TPoint;
    begin
      GetCursorPos(p);
      PopupMenu1.Popup(p.x ,p.y);
      

  8.   

    to  tongdings(痛定) :
       弟兄,我查了资料,但没查到,正在寻求方法。
    用api函数能否实现,我再查查。
      

  9.   

    to  ssl2000(大宋) //写在前面的话://功能我是实现了,不过很麻烦: 通过计算PopupMenu的高度而实现它的具体
    //定位的,并且要二次单击,第一次单击弹出点在BitBtn的(left,top)处,
    //程式还在完善当中。//如果能重载PopupMenu中的方法,实现弹出点在PopupMenu的左下角或者右下
    //角,问题就好办了,期待高手...//以下是我的实现方式,请改善之,谢过了先unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus, StdCtrls, Buttons, fcOutlookList, fcButton, fcImgBtn, fcShapeBtn,
      ExtCtrls, fcClearPanel, fcButtonGroup, fcOutlookBar;type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        BitBtn1: TBitBtn;
        Open: TMenuItem;
        Save: TMenuItem;
        N1: TMenuItem;
        Exit: TMenuItem;
        N2: TMenuItem;
        N21: TMenuItem;
        N51: TMenuItem;
        N61: TMenuItem;
        N3: TMenuItem;
        N71: TMenuItem;
      procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        Function GetPopMenuHeight(Sender: TObject): Integer;
        //获得PopupMenu菜单项的总高度
        { Public declarations }
      end;var
      Form1: TForm1;
      tHeight: Integer;implementation{$R *.DFM}//获得PopupMenu菜单项的总高度
    Function TForm1.GetPopMenuHeight(Sender: TObject): Integer;
    var
      i,mHeight,sHeight: Integer;
      vRect: TRect;
    begin
      sHeight := 0;
      //mHeight := 0;  for i := 0 to PopupMenu1.Items.Count - 1 do
      begin
        GetMenuItemRect(self.Handle, PopupMenu1.Handle, PopupMenu1.Items[i].MenuIndex, vRect);
        mHeight := vRect.Bottom - vRect.Top;    //每个菜单项的高度
        sHeight := sHeight + mHeight;
      end;  result := sHeight;
    end;procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      ScrP: TPoint;
    begin
      tHeight := self.GetPopMenuHeight(self);  x := BitBtn1.Left;
      y := BitBtn1.Top - tHeight;  ScrP := ClientToScreen(point(x,y));
      if Button = mbleft then
        PopupMenu1.Popup(scrp.x,ScrP.y);
    end;end.// end of the Program 
      

  10.   

    //不好意思,以上程式中,use部分太多东东了,由于是测试程式,什么控件
    //都往里边拖,说明:真正用到了一个BitBtn和PopupMenu(不过菜单中适当
    //加点菜单项,测试用。//以下再贴出:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus, StdCtrls, Buttons, ExtCtrls;type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        BitBtn1: TBitBtn;
        Open: TMenuItem;
        Save: TMenuItem;
        N1: TMenuItem;
        Exit: TMenuItem;
        N2: TMenuItem;
        N21: TMenuItem;
        N51: TMenuItem;
        N61: TMenuItem;
        N3: TMenuItem;
        N71: TMenuItem;
      procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        Function GetPopMenuHeight(Sender: TObject): Integer;
        //获得PopupMenu菜单项的总高度
        { Public declarations }
      end;var
      Form1: TForm1;
      tHeight: Integer;implementation
    {$R *.DFM}//获得PopupMenu菜单项的总高度
    Function TForm1.GetPopMenuHeight(Sender: TObject): Integer;
    var
      i,mHeight,sHeight: Integer;
      vRect: TRect;
    begin
      sHeight := 0;
      //mHeight := 0;  for i := 0 to PopupMenu1.Items.Count - 1 do
      begin
        GetMenuItemRect(self.Handle, PopupMenu1.Handle, PopupMenu1.Items[i].MenuIndex, vRect);
        mHeight := vRect.Bottom - vRect.Top;    //每个菜单项的高度
        sHeight := sHeight + mHeight;
      end;  result := sHeight;
    end;procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      ScrP: TPoint;
    begin
      tHeight := GetPopMenuHeight(self);  x := BitBtn1.Left;
      y := BitBtn1.Top - tHeight;  ScrP := ClientToScreen(point(x,y));
      if Button = mbleft then
        PopupMenu1.Popup(scrp.x,ScrP.y);
    end;end.
      

  11.   

    //已实现,通过API调用:TrackPopupMenu(),不过这样很没劲。
    //那位高手救一下,帮我完善楼上的那段代码(要两次单击才能实现,本意
    //是一次单击阿!)unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons, Menus;type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        BitBtn1: TBitBtn;
        Open1: TMenuItem;
        Close1: TMenuItem;
        N1: TMenuItem;
        save1: TMenuItem;
        N2: TMenuItem;
        Exit1: TMenuItem;
        procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      SP: TPoint;
    begin
      x := BitBtn1.Left;
      y := BitBtn1.Top;  sp := clientToscreen(point(x,y));  if button = mbleft then
      TrackPopupMenu(self.PopupMenu1.Handle,TPM_LEFTALIGN or TPM_BOTTOMALIGN,sp.x,sp.y,0,self.Handle,nil);end;end.