Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Узнать когда закроеться TPopupMenu


Автор: spider13 17.2.2009, 12:46
Вообщем сабж. Если кнопка, которая вызывает TPopupMenu, нужно отловть момент когда PopupMenu закроеться

Автор: morpheyushka 17.2.2009, 13:04
А для чего?
Не то, что бы мне так интересно было...просто вдруг альтернативу найдем

Автор: Poseidon 17.2.2009, 13:25
PopupMenu зактроется в двух случаях: потеряет фокус или будет выбран какой-то пункт. Почему бы не отлавливать эти события?

Автор: Snowy 17.2.2009, 13:32
Если меню всплывает автоматом, то, пока оно не закроется, тред будет занят.
А раз тред занят, то Application.OnIdle вызываться не будет.
Значит первый же вызов OnIdle, после OnPopup и будет моментом пропадания меню.
Код
type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    ApplicationEvents1: TApplicationEvents;
    procedure PopupMenu1Popup(Sender: TObject);
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  end;

var  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  PopupMenu1.Tag := 1;
end;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
  if PopupMenu1.Tag = 1 then
  begin
    PopupMenu1.Tag := 0;
    ShowMessage('Меню исчезло');
  end;
end;


Ну а, если вызываем меню вручную, то тут еще проще - пока меню не исчезнет, код дальше вызова не идёт.
То есть 
Код
  PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  ShowMessage('Меню исчезло');

Автор: spider13 17.2.2009, 15:59
Цитата(Snowy @ 17.2.2009,  13:32)
Если меню всплывает автоматом, то, пока оно не закроется, тред будет занят.
А раз тред занят, то Application.OnIdle вызываться не будет.
Значит первый же вызов OnIdle, после OnPopup и будет моментом пропадания меню.
Код
type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    ApplicationEvents1: TApplicationEvents;
    procedure PopupMenu1Popup(Sender: TObject);
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  end;

var  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  PopupMenu1.Tag := 1;
end;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
  if PopupMenu1.Tag = 1 then
  begin
    PopupMenu1.Tag := 0;
    ShowMessage('Меню исчезло');
  end;
end;


Ну а, если вызываем меню вручную, то тут еще проще - пока меню не исчезнет, код дальше вызова не идёт.
То есть 
Код
  PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  ShowMessage('Меню исчезло');

Сенq, помог.

Автор: dmsmeat 16.3.2009, 20:15
окну приходят сообщения

WM_ENTERMENULOOP
WM_EXITMENULOOP

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)