Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.048 c
1-1119963027
harisma
2005-06-28 16:50
2005.07.18
Как сделать хинты для TTreeNode в TTreeView


14-1119942299
Ш-К
2005-06-28 11:04
2005.07.18
Не получается отладка.


1-1120107589
Тучудище
2005-06-30 08:59
2005.07.18
Подскажите плиз каким образом можно вернуть значение в переменную


3-1117603114
Bagdat
2005-06-01 09:18
2005.07.18
Как сохранить в Firebird 1.5 xls файл?


14-1119449626
Cosinus
2005-06-22 18:13
2005.07.18
Господа, кто рботал или работает админом... Подскажите по VPN...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский