2017-02-22 7 views
-2

На бланке у меня есть компоненты TrayIcon и PopupMenu.Delphi 10, Berlin, всплывающее меню и скрытое шоу

  • PopupMenu присваивается форме и TrayIcon.
  • в событии TraiIcon OnClick, я показываю форму.
  • PopupMenu имеет 2 объекта, чтобы показать/скрыть форму.

Когда я запускаю проект, форма отображается нормально. Щелкните правой кнопкой мыши по форме, появится PopupMenu.

На TrayIcon щелкните левой кнопкой мыши форму формы ok.

На TrayIcon щелкните правой кнопкой мыши PopupMenu. Выберите пункт «ПОКАЗАТЬ», форма отображается в порядке.

Но после этого PopupMenu больше не включен. Щелчок правой кнопкой мыши не работает!

+0

Что такое 'c) nom. а) 'означает? –

+0

sor., Bad en .: = repeat a) step on top list –

+0

если кто-то из старших сбрасывает исправление текста - я не буду возражать. полное описание в рубе 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 свойство ложным и затем вызвать 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 с теми же обработчиками событий, назначить первый форма, а вторая - значок в трее, и она будет работать.

редактировать

Sertaç Akyuz спасибо за обратите внимание, Popupmenu.AutoPopup становится ложной, когда скрытие формы и не form.popupmenu становится нулевым

+0

Это не тот случай. –

+0

исправьте меня, если я ошибаюсь, он запускает приложение, правой кнопкой мыши скрывает форму (отсюда отображается значок в трее) щелкните правой кнопкой мыши на значке в трее, покажите форму, затем щелкните правой кнопкой мыши на форме, и ничего не происходит (следовательно, нет всплывающего окна). –

+0

В этом нет ничего, что * form.popupmenu становится nil *, это не тот случай. То есть он не становится ничем –

2

Я наблюдал имущество 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, это - легкий конфликт кода, для просто D пользователей. на этом - как ошибка D10.1? –

Смежные вопросы