![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите почему не работает? Applet.OnMessage [Delphi, Windows]
APXi © (2003-11-25 02:15:00)Вот код.
При создании приложения как я понимаю должны выдаваться сообщение "WM_Create", соответсвенно при завершении "WM_DESTROY", а ничего нету, почему?
program test;
uses
windows,
messages,
kol;
Var
frmProperties : PControl;
Panel : pControl;
Tray : pTrayIcon;
Menu : pMenu;
// ==============================================================
procedure MyMessageBox(str:String);
begin
MessageBox(applet.Handle, PChar(Str), 'Message', mb_ok);
end;
// ===================================================================
procedure OnClickPopupMenu(Dummy : pointer; Sender : pMenu; Item : Integer);
begin
case Item of
0: Applet.Close();
end;{case}
end;
// ===================================================================
Function OnAppletMessage(Self: PObj; var Msg: TMsg; var Rslt: Integer):Boolean;
begin
case Msg.message of
WM_Create: MyMessageBox('WM_Create');
WM_DESTROY: MyMessageBox('WM_DESTROY');
WM_MOVE: MyMessageBox('WM_MOVE');
end;
Result := true;
end;
// ===================================================================
procedure OnClickTray(dummy:pointer; sender:Tobject; Message:Word);
var P:Tpoint;
begin
if message = WM_LBUTTONUP then
begin
GetCursorPos(p);
Menu.PopUp(p.x,p.y);
end;
end;
begin
Applet := NewApplet('');
frmProperties:=NewForm(Applet, '');
panel := NewPanel(Applet, esNone);
Menu := NewMenu(Panel, 0, ['Выход'], TOnMenuItem(MakeMethod( nil, @OnClickPopupMenu)));
Tray := NewTrayIcon(Panel, frmProperties.Icon);
Tray.OnMouse := TOnTrayIconMouse(Makemethod(nil, @OnClickTray));
Applet.OnMessage := TOnMessage(Makemethod(nil, @OnAppletMessage));
Run(frmProperties);
end.
APXi (2003-11-26 20:52:00) [1]Спасибо. Работает.
Vladimir Kladov (2003-11-25 20:33:00) [2]Run(frmProperties);
почему не Run(Applet); ? Как он будет ловить сообщения вообще?
APXi (2003-11-25 19:10:00) [3]Все равно не идет.
SPeller (2003-11-25 09:17:00) [4]1) В обработчике сообщения должно стоять Result := False; для того чтобы щла дальшейшая обработка этого сообщения. В твоём же случае ты отлавливаешь и не пускаешь дальше всесообщения, которые доходят до AppletOnMessage.
2) WM_CREATE не приходит потому что окно аплета создаётся у тебя раньше назначения обработчика.
3) Вероятно, что из-за того что ты отлавливаешь все сообщения без разбору не приходит и WM_DESTROY. Либо, обработчик сообщений отключается при появлении этого сообщения и вызывается какой-нить OnClose или OnDestroy.
azsd (2003-11-25 06:59:00) [5]yes Result point whether you processed the message,
so I think it is better to add Result:=True; after call each MyMessagebox.
Fktrc (2003-11-25 06:15:00) [6]По-моему функцию обработки сообщений в твоем случае полагается писать так
Function OnAppletMessage(Self: PObj; var Msg: TMsg; var Rslt: Integer):Boolean;
begin
Result := false; // !!!!
case Msg.message of
WM_Create: MyMessageBox('WM_Create');
WM_DESTROY: MyMessageBox('WM_DESTROY');
WM_MOVE: MyMessageBox('WM_MOVE');
end;
end;