Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Где грабли?


SPeller ©   (2005-06-29 15:39:00) 

Подскажите, где ошибка? Есть такой код:

program IEImgSwitch;

{$R trayicon.res}

uses
 Windows, KOL, Messages;

var
 Msg: tagMsg;
 ThreadId: THandle;
 ExitFlag: Boolean;
 Tray: PTrayIcon;
 TrayWnd: PControl;
 Menu: PMenu;
 OnMenu: TOnMenuItem;

procedure ShowMenu;
var
 Pt: TPoint;
begin
 GetCursorPos(Pt);
 Menu.PopupEx(Pt.X, Pt.Y);
end;

procedure TrayMouse(Dummy: Pointer; Sender: PObj; Message: Word);
begin
 case Message of
   WM_LBUTTONDOWN, WM_RBUTTONDOWN:
     ShowMenu;
 end;
end;

procedure OnMenuHandler(Dummy: Pointer; Sender: PMenu; Item: Integer);
begin
 ShowMessage('ff');
end;

begin
 ExitFlag := False;

 PeekMessage(Msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
 ThreadId := GetCurrentThreadId;
 PostThreadMessage(ThreadId, WM_NULL, 0, 0);

 TrayWnd := NewPanel(nil, esNone);
 //TrayWnd := NewLabel(nil, '');
 TrayWnd.ExStyle := WS_OVERLAPPED;
 TrayWnd.Style := 0;
 TrayWnd.Menu := 0;
 TrayWnd.CreateWindow;

 if (TrayWnd.Handle = 0) then begin
   ShowMessage(SysErrorMessage(GetLastError));
 end
 else begin
   Tray := NewTrayIcon(TrayWnd, LoadIcon(hInstance, 'TRAYICON'));
   Tray.OnMouse := TOnTrayIconmouse(MakeMethod(nil, @TrayMouse));

   OnMenu := TOnMenuItem(MakeMethod(nil, @OnMenuHandler));
   Menu :=
     NewMenu(
       TrayWnd, 0, ['Enable images', 'Disable images', '-', 'Exit'], nil);
   Menu.AssignEvents(1, [OnMenu]);
   Menu.AssignEvents(2, [OnMenu]);
   Menu.AssignEvents(4, [OnMenu]);

   repeat
     WaitMessage;
     while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
       ExitFlag := (Msg.message = WM_CLOSE);
       if ExitFlag then
         Break;
     end;
   until ExitFlag;
 end;

 Tray.Free;
 TrayWnd.Free;
end.


Проблема в том, что не вызываются обработчики меню. Толи лыжи не едут, толи я туплю, но понять причину не могу.


SPeller   (2005-06-29 17:27:00) [1]

Написал себе простинькую утилитку для включения/отключения отображения рисунков в IE, чтобы каждый раз не лазить в настройки. Программка сидит в трее. Лучше всего ставить ее в автозагрузку. Программка для тех, кто экономит трафик :)

http://speller.narod.ru/files/other/ieimgswitch.rar(15,4 КБ exe + src)


ECM   (2005-06-29 17:27:00) [2]

..я сразу увидел..что нет обработки сообщений...
Жаль что интернет обломился на час...не успел..:)
Пара замечаний - если уж нужен супер-минимальный размер модуля то будет работать (в объеме примера) и без TranslateMessage...
а так ИМХО можно вместо:
repeat
    WaitMessage;
    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
      ExitFlag := (Msg.message = WM_CLOSE);
      if ExitFlag then
        Break;
    end;
  until ExitFlag;


использовать   Run(TrayWnd) - а обработку завершения вынести в
OnMenu (OnMessage)


SPeller   (2005-06-29 17:00:00) [3]

Всё, разобрался, это мой глюк - нужны были строчки
       TranslateMessage(Msg);
       DispatchMessage(Msg);
Из очереди-то я сообщения выбираю, а отправлять окну забыл :)


SPeller   (2005-06-29 16:51:00) [4]

Thaddy   (29.06.05 16:27) [1]
Щас гляну.

Ещё забыл добавить - kol 2.08


Thaddy   (2005-06-29 16:27:00) [5]

Maybe my rataler example will help.


Наверх

Титульная страница Поиск, карта сайта Написать письмо