Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Событие на закрытие Popup   Найти похожие ветки 

 
Дмитрий_05   (2005-06-06 17:59) [0]

Как мне отловить событие, что PopupMenu было закрыто любым спосом?


 
Дмитрий_05   (2005-06-06 18:16) [1]

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


 
Дмитрий_05   (2005-06-06 18:25) [2]

по идее надо отлавливать какоенибудь сообщение... какое?


 
Юрий Зотов ©   (2005-06-06 18:30) [3]

Посмотрите WM_EXITMENULOOP.


 
Дмитрий_05   (2005-06-06 18:41) [4]


procedure WMEXITMENULOOP(var msg: TWMEXITMENULOOP); message WM_EXITMENULOOP;

неа, не ловится...:(


 
Дмитрий_05   (2005-06-06 19:23) [5]

Я правильно ловлю? или надо хуком?


 
TUser ©   (2005-06-06 20:35) [6]

Возможно дело в том, что
The WM_EXITMENULOOP message informs an application"s main window procedure that a menu modal loop has been exited.


 
Дмитрий_05   (2005-06-06 21:30) [7]

А что тогда делать???


 
TUser ©   (2005-06-06 22:00) [8]

Не знаю. Ловить у главного окна, наверное.


 
Дмитрий_05   (2005-06-06 22:02) [9]

Так и есть...

type
 TForm1 = class(TForm)
 ...
private
 procedure WMEXITMENULOOP(var msg: TWMEXITMENULOOP); message WM_EXITMENULOOP;


 
jack128 ©   (2005-06-06 22:05) [10]

TUser ©   (06.06.05 22:00) [8]
Ловить у главного окна, наверное.

А что такое главное окно?


 
Дмитрий_05   (2005-06-06 22:41) [11]

Нашел тут код:

type
 TForm1 = class(TForm)
...
private
   procedure WMInitMenu(var msg: TMessage); message WM_INITMENU;
   procedure WMMenuSelect(var msg: TMessage); message WM_MENUSELECT;

...

procedure TForm1.WMInitMenu;
begin
Form1.Color:=clBlack;
end;

procedure TForm1.WMMenuSelect;
begin
if (HiWord(msg.WParam)=$FFFF) and (msg.LParam = 0) then
Form1.Color:=clWhite;
end;

Чтобы было наглядней цвет формы меняется... Но он работает с MainMenu... с PopupMenu не работает почему-то...:-( А мне какраз это и нужно


 
Abessalom   (2005-06-06 23:18) [12]

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 P: TPoint;
begin
 if Button = mbRight then
 begin
   PopupMenu1.PopupComponent := Self;
   P := ClientToScreen(Point(X, Y));
   with P do
     PopupMenu1.Popup(X, Y);
   ShowMessage("Popupmenu exit loop");
 end;
end;


 
Abessalom   (2005-06-06 23:23) [13]


> Abessalom   (06.06.05 23:18) [12]

Хотя это не обязательно: PopupMenu1.PopupComponent := Self; Просто если в разделяемом обработчике OnClick нужно разобраться с кого меню всплыло, тогда пригодится


 
Дмитрий_05   (2005-06-06 23:28) [14]

Abessalom спасибо тебе, но это не совсем то что я хотел... Тут после расскрытия меню(а если оно расскрывается, то программа на этом как бы останавливается) идет ShowMessage("Popupmenu exit loop"); это не совсем так как мне нужно...


 
Abessalom   (2005-06-07 00:03) [15]

Программа в любом случае "останавливается". Метод Popup вызывает функцию WinAPI TrackPopupMenu - модальный цикл для контекстного меню. При клике правой кнопкой на элементе управления, для которого установлено свойство PopupMenu очередность вызова аналогична приведенной в примере. Только Popup вызывается за кадром. А вместо ShowMessage тебе единственное что нужно сделать - это вызвать свой обработчик уведомления о том что меню PopupMenu было закрыто любым спосом. Всего и делов. Думать нужно или на второй год оставаться. По другому не получится, это просто не предусмотрено в API


 
Юрий Зотов ©   (2005-06-07 01:40) [16]

Вот решение задачи в общем виде, независимо от того, какое меню, какого контрола и каким образом закрылось.

var
 Hook: HHOOK;

function CallWndRetProc(Code, Flag, PData: integer): integer; stdcall;
begin
 if PCWPRetStruct(PData)^.message = WM_EXITMENULOOP then
   MessageBox(0, "Menu closed", PChar(Application.Title), MB_OK or MB_TASKMODAL or MB_TOPMOST);
 Result := CallNextHookEx(Hook, Code, Flag, PData)
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 Hook := SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc, 0, GetCurrentThreadId)
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnhookWindowsHookEx(Hook)
end;


 
Abessalom   (2005-06-07 02:13) [17]


> Юрий Зотов ©   (07.06.05 01:40) [16]

Хороший пример. Широкий. Беру последние слова об АПИ назад;) отчего-то подзабыл об установке ловушек. Я думаю, в любом сл-е вопрос исчерпан)


 
Дмитрий_05   (2005-06-07 12:55) [18]

А можно ли сделать чтобы работало только с определенными PopupMenu? А MainMenu и другие PopupMenu не отслеживались..


 
Дмитрий_05   (2005-06-07 14:09) [19]

И еще один маленький вопросик. Будет ли разумным организовать эту ловушку в DLL-библиотеке или оставить в самой программе?


 
Abessalom   (2005-06-07 16:04) [20]


> Дмитрий_05   (07.06.05 14:09) [19]

Неразумно. Если она тебе не нужна в другой программе, тем более.

> А можно ли сделать чтобы работало только с определенными
> PopupMenu?

А это тебе что любое РopupMenu?

> Abessalom   (06.06.05 23:18) [12]


> PopupMenu1.Popup(X, Y);


Как слоненок в мультфильме. Вот тебе первая выгода.. вот тебе вторая выгода.. Применять различные приемы нужно разумно в пределах задачи,


 
KosilkA ©   (2005-06-25 13:27) [21]


> Юрий Зотов ©   (07.06.05 01:40) [16]
> Вот решение задачи в общем виде, независимо от того, какое
> меню, какого контрола и каким образом закрылось.


а в блокноте (и подобных ему "эдитах") не работает , меню которое по правой кнопке мыши вызывается (копировать-вставить- выделисть все)


 
KosilkA ©   (2005-06-25 13:56) [22]


> KosilkA ©   (25.06.05 13:27) [21]
>
> > Юрий Зотов ©   (07.06.05 01:40) [16]
> > Вот решение задачи в общем виде, независимо от того, какое
>
> > меню, какого контрола и каким образом закрылось.
>
>
> а в блокноте (и подобных ему "эдитах") не работает , меню
> которое по правой кнопке мыши вызывается (копировать-вставить-
> выделисть все)

ааа... дико извиняюсь, работает-))



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
3-1117813075
Som
2005-06-03 19:37
2005.07.18
отчёт в MS Word (Запись в ячейки таблицы )


4-1116535364
NikNet
2005-05-20 00:42
2005.07.18
Как разархивировать RAR архив с паралем?


14-1119955038
Ega23
2005-06-28 14:37
2005.07.18
Задачка для мозгов


3-1118135822
-=snoop=-
2005-06-07 13:17
2005.07.18
ADOConnect просит авторизации


4-1116510712
ATarget
2005-05-19 17:51
2005.07.18
Сохранить процесс