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

Вниз

TPopupMenu   Найти похожие ветки 

 
Azius ©   (2003-09-01 12:10) [0]

Как узнать, открыто ли TPopupMenu или нет?


 
Skier ©   (2003-09-01 12:16) [1]

Вообще-то есть сообщения WM_ENTERMENULOOP и WM_EXITMENULOOP...
А зачем сие нужно ?


 
mrcat ©   (2003-09-01 12:18) [2]

Azius © (01.09.03 12:10)

может обычного OnPopup хватит ?


 
VMcL ©   (2003-09-01 14:13) [3]

>Skier © (01.09.03 12:16) [1]

Для Popup меню, думаю, не сработает.


 
Song ©   (2003-09-01 15:21) [4]

2VMcL © (01.09.03 14:13) [3]
Это почему?


 
VMcL ©   (2003-09-01 15:39) [5]

>Skier © (01.09.03 12:16) [1]
>Song © (01.09.03 15:21) [4]

Oops, отменяется. Я перехватывал WndProc для TPopupMenu.WindowHandle, а надо для PopupList.Window.


 
VMcL ©   (2003-09-01 15:42) [6]

>VMcL © (01.09.03 15:39) [5]

Замечание: поскольку PopupList.Window один для всех TPopupMenu, пока остаётся открытым вопрос в случае с несколькими меню: "которое из них?"


 
Skier ©   (2003-09-01 15:44) [7]


> "которое из них?"

А можно открыть сразу 2 Popup-меню ?


 
VMcL ©   (2003-09-01 15:44) [8]

>"которое из них?"

М-да. Пора с ручника сняться. TPopupMenu.OnPopup никто не отменял :)


 
VMcL ©   (2003-09-01 15:45) [9]

>Skier © (01.09.03 15:44) [7]
>А можно открыть сразу 2 Popup-меню ?

В теории нет, на практике да.


 
Skier ©   (2003-09-01 15:49) [10]

>VMcL © (01.09.03 15:45)
Ужас ! :)


 
VMcL ©   (2003-09-01 15:58) [11]

>Skier © (01.09.03 15:49) [10]

Серьёзно. Могу выложить в инете одну из (относительно:) старых версий моей программы (MacTray), в которой был (а может и сейчас есть, только затаился:) такой глюк.


 
Azius ©   (2003-09-01 19:34) [12]

>Skier © (01.09.03 12:16) [1]
>Вообще-то есть сообщения WM_ENTERMENULOOP и WM_EXITMENULOOP...

Я пробовал так:
Tfrm = class(TForm)
...
procedure OnEnterML(m: TMessage); message WM_ENTERMENULOOP;
procedure OnExitML(m: TMessage); message WM_EXITMENULOOP;
Не работает... Ещё пытался IsWindowVisible(pm.WindowHandle) - результат тот же.


 
Skier ©   (2003-09-01 19:37) [13]

( var m: TMessage); Это как минимум...
А сообщение вообще приходит ?


 
Song ©   (2003-09-01 20:30) [14]


> procedure OnEnterML(m: TMessage); message WM_ENTERMENULOOP;
> procedure OnExitML(m: TMessage); message WM_EXITMENULOOP;


Дак ты их в классе формы что ли описал? :)


 
VMcL ©   (2003-09-01 20:31) [15]

>Azius © (01.09.03 19:34) [12]

Сообщения для TPopupMenu приходят не форме, а окну PopupList.Window, поэтому нужно перехватывать WindowProc именно для него.

P.S.
См. MakeObjectInstance, FreeObjectInstance.


 
Song ©   (2003-09-01 20:35) [16]

Гораздо быстрей этого можно добиться в TApplication.onMessage


 
VMcL ©   (2003-09-01 20:56) [17]

>Song © (01.09.03 20:35) [16]

Так не выйдет.


 
Song ©   (2003-09-01 21:02) [18]

Ты проверял?


 
VMcL ©   (2003-09-01 21:06) [19]

Да.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;

type
TWindowProc = function (Wnd: HWND; Msg: UInt;
wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

TForm1 = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
PopupMenu1: TPopupMenu;
Copy1: TMenuItem;
Paste1: TMenuItem;
Undo1: TMenuItem;
N1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
protected
OldWndProc: TWindowProc;
NewWndProc: Pointer;

procedure WndProc_PM(var Msg: TMessage);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := Application.Title;
Application.OnMessage := ApplicationEvents1Message;

@OldWndProc := @TWindowProc(GetWindowLong(PopupMenu1.WindowHandle, GWL_WNDPROC));
NewWndProc := Classes.MakeObjectInstance(WndProc_PM);
if SetWindowLong(PopupList.Window, GWL_WNDPROC,
LongWord(NewWndProc)) = 0 then RaiseLastOSError;
end;

procedure TForm1.WndProc_PM(var Msg: TMessage);
begin
case Msg.Msg of
WM_ENTERMENULOOP: Memo1.Lines.Add("Enter menu/Pop");
WM_EXITMENULOOP: Memo1.Lines.Add("Exit menu/Pop");
end;

if Assigned(OldWndProc) then
with Msg do
Result := OldWndProc(PopupList.Window, Msg,
WParam, LParam);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(OldWndProc) then
SetWindowLong(PopupList.Window, GWL_WNDPROC,
LongWord(@OldWndProc));

Classes.FreeObjectInstance(NewWndProc);
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
case Msg.message of
WM_ENTERMENULOOP: Memo1.Lines.Add("Enter menu/App");
WM_EXITMENULOOP: Memo1.Lines.Add("Exit menu/App");
end;
end;

end.



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

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

Наверх




Память: 0.51 MB
Время: 0.028 c
14-48692
Grouzd[E]v
2003-08-24 18:38
2003.09.15
Будете смеятся: как работать с архивами??? - я еще новичок :(((


14-48724
jack128
2003-08-28 00:12
2003.09.15
Именинники 28 августа


14-48697
Всеволод Соловьёв
2003-08-24 00:21
2003.09.15
---|Ветка была без названия|---


1-48547
Sam Stone
2003-09-01 18:42
2003.09.15
функции в dll ках


14-48717
Ahmad K
2003-08-26 02:43
2003.09.15
Delphi 7 vs Delphi 3