2010-01-12 19 views
5

Mam formularz z MainMenu i chcę przechwycić, gdy użytkownik wybierze element polecenia z menu. Działa to w Delphi:Problem z WM_COMMAND na 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; 

W mainmenu dodałem kilka elementów i kiedy wybrać te pozycje z menu następnie mój Memo1 jest wypełniona:

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

I przeniósł tę aplikację do FPC/Lazarus , ale wygląda na to, że obsługa WM_COMMAND nie jest wywoływana! Kiedy ustawiłem breakpoint w TForm1.WMCommand w Delphi, to Delphi zatrzymał się wiele razy przed pojawieniem się głównej formy. Lazarus nigdy nie zatrzymywał się na tym punkcie przerwania . Myślę, że coś jest zepsute przez WM_COMMAND w Łazarzu, ale może nie wiem czegoś. Dowolny pomysł?

Używam Lazarus 0.9.28.2 beta z FPC 2.2.4 na WinXP.

EDIT:

Korzystanie Winspector sprawdziłem że mainmenu generuje WM_COMMAND:

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

myślę, że jest błąd w Lazarus/FPC w WM_COMMAND obchodzenia metoda wiadomość i zgłosiłem go: http://bugs.freepascal.org/view.php?id=15521

Odpowiedz

2

W aplikacji LCL masz następujące warstwy:

  • Aplikacja
  • LCL
  • Interfejs zestawu widżetów (np. Win32/Win64 Qt gtk2 węgiel)
  • widget ustawione

WM_COMMAND winapi jest komunikat z warstwy widgetset do warstwy pośredniej widget zestaw. Te wiadomości nie są przekazywane do wyższych warstw, mając na uwadze przenośność, inne zestawy widgetów nie generują takich wiadomości.

Jeśli chcesz przechwycić wiadomość, musisz napisać nieprzenośny kod specyficzny dla zestawu widgetów (w tym przypadku kod winapi). Możesz zastąpić windowproc przez setwindowlong. Zobacz przykład Lazarus wiki.

+0

Czy nie jest to prawdopodobnie błąd/brakująca funkcja, że ​​LM_COMMAND i CN_COMMAND również nie działają, nie można również przechwycić na przenośnym poziomie zdarzenia? –