Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизСобытие на закрытие 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c