線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1689
推到 Plurk!
推到 Facebook!

關於PopUp menu 的問題

答題得分者是:william
dirboy
一般會員


發表:7
回覆:16
積分:9
註冊:2002-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-08 09:23:53 IP:202.175.xxx.xxx 未訂閱
情況如下: 有一個Form1, 有一個Edit1 和一個Popup1; edit1 在 form1中, form1 的POPup menu 是 popup1. 測試中Form1 的任何地方按右鍵都會出現Popup1, 但在Highlight 了Edit1中的string 時, 按右鍵時仍是出現那個POPUP1, 郤不出現那個 cut,paste... 的標準Popup menu, 請問各位前輩有何方法解決此問題. 我可以用Handled := True 解決EDit1 中不出現那個popup1, 但郤連那個標準Popup menu都不見了.
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-08 09:39:04 IP:147.8.xxx.xxx 未訂閱
Could it be easier in manually popping up the menu instead of the default one  < class="code">procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var APoint: TPoint; begin if Button=mbRight then begin APoint := ClientToScreen(Point(X,Y)); PopupMenu1.Popup(APoint.X,APoint.Y); end; end;
dirboy
一般會員


發表:7
回覆:16
積分:9
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-08 10:14:00 IP:202.175.xxx.xxx 未訂閱
william 兄, 謝謝回答, 但好像不行, 原因是 FormMouseDown 並不會只由 Form 所引發, 在Form 中的所有componnet 都會向parent 引發此event, 所以問題又出來了, 任何地方(包括那個edit1) 按右鍵都會出現這個popup1.
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-08 10:21:40 IP:147.8.xxx.xxx 未訂閱
>>
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-08 10:31:27 IP:61.218.xxx.xxx 未訂閱
你這麼做吧,測試ok 沒問題    
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
        if Button=mbRight then
            self.PopupMenu :=PopupMenu1;
end;    procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
        if Button=mbRight then
            edit1.PopupMenu :=PopupMenu2;    end;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-08 10:40:16 IP:218.16.xxx.xxx 未訂閱
這個也可以 :
procedure TForm1.FormContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
var    APoint: TPoint;
begin
   APoint := ClientToScreen(Point(MousePos.X,MousePos.Y));
   if ChildWindowFromPoint(handle,Point(MousePos.X,MousePos.Y)) = handle then
     PopupMenu1.Popup(APoint.X,APoint.Y);
end;
這是判別若 Mouse 指著的地方是 Form 本身而不是子元件時才 popup,其他的子元件就讓Delphi 作預設處理。 Form 的 PopupMenu 可如常設 PopupMenu1, 但 PopupMenu1.AutoPopup 要設 False。
dirboy
一般會員


發表:7
回覆:16
積分:9
註冊:2002-07-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-08 11:18:49 IP:202.175.xxx.xxx 未訂閱
謝謝各大版主的解答, 本人不勝榮興. >I have tried and it worked on a simple project using D7... maybe you have the property PopupMenu being set on the form? Yes, 不好意思, OK 了. 謝謝ddy 兄回答, 再請問一下ddy, 如果我沒有popupmenu2, 那麼如何可以show那個default popupmenu? 謝謝Justmade 兄, 昨天我玩了FormContextPopup一個多小時, 最後沒結果, 今天給你點了一下, 原來要如此玩! 哈!
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-08 12:55:29 IP:61.218.xxx.xxx 未訂閱
這麼做吧    
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
        if button=mbRight then
            self.PopupMenu :=PopupMenu1; //Form 載入我們指定的popupmenu
end;    procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
        self.PopupMenu :=nil;   //讓Form所指向的Popupmenu =Nil (清掉)
                                //讓原先系統預定的顯示
end;
發表人 - ddy 於 2003/04/08 13:01:44
dirboy
一般會員


發表:7
回覆:16
積分:9
註冊:2002-07-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-08 16:34:02 IP:202.175.xxx.xxx 未訂閱
謝謝 ddy 兄回答, 另外前面打錯字, 應是 不勝榮幸
系統時間:2024-11-23 2:50:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!