2010-01-12 1 views
5

У меня есть форма с MainMenu, и я хочу перехватить, когда пользователь выбирает элемент команды из меню. Это работает в Delphi:Проблема с WM_COMMAND на Lazarus/FPC

type 
    TForm1 = class(TForm) 
    ... // Memo and MainMenu created 
    protected 
    procedure WMCommand(var Info: TWMCommand); message WM_COMMAND; 
    end; 


procedure TForm1.WMCommand(var Info: TWMCommand); 
begin 
    if (Info.ItemID < 10) then 
    Memo1.Lines.Add('WMCommand ' + IntToStr(Info.ItemID)); 
end; 

В MainMenu я добавил некоторые детали, и когда я выбираю те пункты из меню, а затем мой Memo1 заполнен:

WMCommand 2 
WMCommand 3 
WMCommand 3 
WMCommand 2 
WMCommand 5 
... 

я портировал это приложение для FPC/Lazarus , но кажется, что обработчик WM_COMMAND не называется! Когда я установил точку останова в TForm1.WMCommand в Delphi, Delphi остановился много раз, прежде чем появилась основная форма. Лазарус никогда не останавливался на этой точке останова. Я думаю, что что-то нарушено с WM_COMMAND в Лазаресе, но, может быть, я ничего не знаю. Есть идеи?

Я использую Lazarus 0.9.28.2 beta с FPC 2.2.4 на WinXP.

EDIT:

Использование Winspector Я проверил, что MainMenu генерирует WM_COMMAND:

WM_COMMAND 
    Code: 0 
    Control ID: 2 
    Control HWND: 0x00000000 
    Message Posted 
    Time: 09:37:14.0968 

Я думаю, что есть ошибка в Lazarus/FPC в WM_COMMAND обработке методом сообщения, и я сообщил об этом: http://bugs.freepascal.org/view.php?id=15521

ответ

2

В приложении LCL у вас есть следующие уровни:

  • Приложение
  • LCL
  • Интерфейс виджета Интерфейс (напр. Win32/Win64, кварты, GTK2, углерод)
  • Втулка установлена ​​

WM_COMMAND является WinAPI сообщение от widgetset слоя к слою интерфейса набор виджетов. Эти сообщения не передаются на более высокие уровни, имея в виду мобильность, другие наборы виджетов не создают таких сообщений.

Если вы хотите захватить сообщение, тогда вы должны написать непереносный код виджетов (в этом случае код winapi). Вы можете переопределить windowproc с помощью setwindowlong. См. Пример Lazarus wiki.

+0

Не может ли быть ошибка/отсутствует функция, которую LM_COMMAND и CN_COMMAND тоже не работают, невозможно ли захватить на переносном уровне событие? –