![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Событие на закрытие Popup [D7, WinXP]
Дмитрий_05 © (2005-06-06 17:59:00)Как мне отловить событие, что PopupMenu было закрыто любым спосом?
KosilkA (2005-06-25 13:56:00) [1]
> KosilkA © (25.06.05 13:27) [21]
>
> > Юрий Зотов © (07.06.05 01:40) [16]
> > Вот решение задачи в общем виде, независимо от того, какое
>
> > меню, какого контрола и каким образом закрылось.
>
>
> а в блокноте (и подобных ему "эдитах") не работает , меню
> которое по правой кнопке мыши вызывается (копировать-вставить-
> выделисть все)
ааа... дико извиняюсь, работает-))
KosilkA (2005-06-25 13:27:00) [2]
> Юрий Зотов © (07.06.05 01:40) [16]
> Вот решение задачи в общем виде, независимо от того, какое
> меню, какого контрола и каким образом закрылось.
а в блокноте (и подобных ему "эдитах") не работает , меню которое по правой кнопке мыши вызывается (копировать-вставить- выделисть все)
Abessalom (2005-06-07 16:04:00) [3]
> Дмитрий_05 (07.06.05 14:09) [19]
Неразумно. Если она тебе не нужна в другой программе, тем более.
> А можно ли сделать чтобы работало только с определенными
> PopupMenu?
А это тебе что любое РopupMenu?
> Abessalom (06.06.05 23:18) [12]
> PopupMenu1.Popup(X, Y);
Как слоненок в мультфильме. Вот тебе первая выгода.. вот тебе вторая выгода.. Применять различные приемы нужно разумно в пределах задачи,
Дмитрий_05 (2005-06-07 14:09:00) [4]И еще один маленький вопросик. Будет ли разумным организовать эту ловушку в DLL-библиотеке или оставить в самой программе?
Дмитрий_05 (2005-06-07 12:55:00) [5]А можно ли сделать чтобы работало только с определенными PopupMenu? А MainMenu и другие PopupMenu не отслеживались..
Abessalom (2005-06-07 02:13:00) [6]
> Юрий Зотов © (07.06.05 01:40) [16]
Хороший пример. Широкий. Беру последние слова об АПИ назад;) отчего-то подзабыл об установке ловушек. Я думаю, в любом сл-е вопрос исчерпан)
Юрий Зотов (2005-06-07 01:40:00) [7]Вот решение задачи в общем виде, независимо от того, какое меню, какого контрола и каким образом закрылось.
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 00:03:00) [8]Программа в любом случае "останавливается". Метод Popup вызывает функцию WinAPI TrackPopupMenu - модальный цикл для контекстного меню. При клике правой кнопкой на элементе управления, для которого установлено свойство PopupMenu очередность вызова аналогична приведенной в примере. Только Popup вызывается за кадром. А вместо ShowMessage тебе единственное что нужно сделать - это вызвать свой обработчик уведомления о том что меню PopupMenu было закрыто любым спосом. Всего и делов. Думать нужно или на второй год оставаться. По другому не получится, это просто не предусмотрено в API
Дмитрий_05 (2005-06-06 23:28:00) [9]Abessalom спасибо тебе, но это не совсем то что я хотел... Тут после расскрытия меню(а если оно расскрывается, то программа на этом как бы останавливается) идет ShowMessage('Popupmenu exit loop'); это не совсем так как мне нужно...
Abessalom (2005-06-06 23:23:00) [10]
> Abessalom (06.06.05 23:18) [12]
Хотя это не обязательно: PopupMenu1.PopupComponent := Self; Просто если в разделяемом обработчике OnClick нужно разобраться с кого меню всплыло, тогда пригодится
Abessalom (2005-06-06 23:18:00) [11]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;
Дмитрий_05 (2005-06-06 22:41:00) [12]Нашел тут код:
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 не работает почему-то...:-( А мне какраз это и нужно
jack128 (2005-06-06 22:05:00) [13]TUser © (06.06.05 22:00) [8]
Ловить у главного окна, наверное.
А что такое главное окно?
Дмитрий_05 (2005-06-06 22:02:00) [14]Так и есть...
type
TForm1 = class(TForm)
...
private
procedure WMEXITMENULOOP(var msg: TWMEXITMENULOOP); message WM_EXITMENULOOP;
TUser (2005-06-06 22:00:00) [15]Не знаю. Ловить у главного окна, наверное.
Дмитрий_05 (2005-06-06 21:30:00) [16]А что тогда делать???
TUser (2005-06-06 20:35:00) [17]Возможно дело в том, что
The WM_EXITMENULOOP message informs an application's main window procedurethat a menu modal loop has been exited.
Дмитрий_05 (2005-06-06 19:23:00) [18]Я правильно ловлю? или надо хуком?
Дмитрий_05 (2005-06-06 18:41:00) [19]
procedure WMEXITMENULOOP(var msg: TWMEXITMENULOOP); message WM_EXITMENULOOP;
неа, не ловится...:(
Юрий Зотов (2005-06-06 18:30:00) [20]Посмотрите WM_EXITMENULOOP.