2017-02-22 71 views
-2

上的表單,我有任務欄圖標和PopupMenu的組件。德爾福10,柏林,彈出菜單和隱藏秀

  • PopupMenu被分配給Form和TrayIcon。
  • 在任務欄圖標的OnClick事件,我展現形式。
  • PopupMenu有2項顯示/隱藏窗體。

當我運行該項目,該表顯示正常。右鍵單擊表單,出現PopupMenu。

在任務欄圖標,左鍵單擊顯示的形式確定。

在任務欄圖標,右鍵單擊顯示彈出菜單。選擇「顯示」項目,表格顯示確定。

但是,在此之後,的彈出菜單不再被啓用。右鍵點擊不起作用!

+0

什麼'c)nom。 a)'意思? –

+0

sor。,bad en .: =重複a)頂部列表 –

+0

如果任何人的高級重置爲正確的文字 - 我不介意。 在ru線程中的完整描述http://delphimaster.ru/cgi-bin/forum.pl?id=1487777210&n=18 但是,在那裏,答案是否 –

回答

3

從托盤圖標顯示PopupMenu有點棘手。其實有一個在Windows本身引起的問題一個衆所周知的問題,它甚至在MSDN文檔:

TrackPopupMenu function

要顯示通知圖標上下文菜單,當前窗口必須是應用程序調用TrackPopupMenu或TrackPopupMenuEx之前的前景窗口。否則,當用戶單擊菜單外部或創建菜單的窗口(如果可見)時,菜單不會消失。如果當前窗口是子窗口,則必須將(頂層)父窗口設置爲前景窗口。

然而,在當前的窗口是前臺窗口,顯示該菜單中的第二次,它出現,然後立即消失。若要更正此問題,您必須強制任務切換到名爲TrackPopupMenu的應用程序。這是通過張貼良性的消息窗口或線程中完成的,如下面的代碼示例:

SetForegroundWindow(hDlg); 

// Display the menu 
TrackPopupMenu( hSubMenu, 
        TPM_RIGHTBUTTON, 
        pt.x, 
        pt.y, 
        0, 
        hDlg, 
        NULL); 

PostMessage(hDlg, WM_NULL, 0, 0); 

考慮到這一點在Delphi中,可以將PopupMenu.AutoPopup屬性設置爲false,然後調用PopupMenu.Popup()方法需要時,例如:

procedure TForm1.FormContextPopup(Sender: TObject); 
begin 
    ShowPopup; 
end; 

procedure TForm1.TrayIcon1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    if Button = mbRight then ShowPopup; 
end; 

procedure TForm1.ShowPopup; 
begin 
    BringToFront; 
    with Mouse.CursorPos do 
    PopupMenu1.Popup(X, Y); 
    PostMessage(Handle, WM_NULL, 0, 0); 
end; 
1

我在嘗試你所做的時遇到了同樣的問題,看起來form.popupmenu的值在你隱藏表單時變爲零,我的解決方案是用相同的事件處理程序添加另一個popupmenu,將第一個分配給表單和第二個托盤圖標,它會工作。

編輯

Sertac Akyuz感謝便條隱藏表單時,不form.popupmenu變爲零

+0

事實並非如此 –

+0

糾正我,如果我錯了,他運行應用程序,右鍵單擊隱藏表單(因此顯示托盤圖標),右鍵單擊托盤圖標顯示錶單然後右鍵單擊表單沒有任何反應(因此沒有彈出窗口) –

+0

什麼不是這種情況是* form.popupmenu變成零*,事實並非如此,即它不會變爲零 –

2

我看到的彈出菜單的「AutoPopup」屬性是假的Popupmenu.AutoPopup爲假在展會上;設置它恢復預期的行爲:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ExtCtrls; 

type 
    TForm1 = class(TForm) 
    PopupMenu1: TPopupMenu; 
    Show1: TMenuItem; 
    Hide1: TMenuItem; 
    TrayIcon1: TTrayIcon; 
    procedure Show1Click(Sender: TObject); 
    procedure Hide1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Hide1Click(Sender: TObject); 

begin 
    Hide; 
    TrayIcon1.Visible := true; 
end; 

procedure TForm1.Show1Click(Sender: TObject); 

begin 
    /////////////////// 
    // 
    // Comment out this line and app will have OP's observed behavior 
    Popupmenu.AutoPopup := true; 
    /////////////////// 

    Show; 
end; 

end. 
+0

這是WM_RBUTTONUP處理程序。在它之前有一個很好的ProcessMessages。非常好的代碼! –

+0

我添加了「Popupmenu.AutoPopup:= true;」和form1.popupmenu:= popupmenu1,以OnShow,OnClik顯示,不工作:( –

+0

main。我工作D7-Xe-10,它 - 易於代碼衝突,for簡單的D用戶。在這 - ??? D10.1的bug如何? –