2010-01-12 49 views
5

我使用MainMenu創建了窗體,並且當用戶從菜單中選擇一個命令項時我想攔截。 這工作在Delphi:關於Lazarus/FPC上的WM_COMMAND的問題

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 /拉撒路,但似乎沒有調用WM_COMMAND 處理程序!當我在Delphi中設置TForm1.WMCommand斷點時,Delphi 在主窗體出現之前停止了很多次。在這個斷點處,拉撒路從未停止過 。我認爲拉扎魯斯的WM_COMMAND 有問題,但我可能不知道。任何想法?

我在WinXP上使用Lazarus 0.9.28.2 beta和FPC 2.2.4。

編輯:

使用Winspector我檢查的MainMenu產生WM_COMMAND:

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

我認爲這是錯誤的拉撒路/ FPC在WM_COMMAND消息的方法處理我報告說,它:http://bugs.freepascal.org/view.php?id=15521

回答

2

在拼箱應用中,您有以下幾層:

  • 應用程序
  • LCL
  • 控件集接口(例如,的Win32/Win64的,QT,GTK2,碳)
  • 外集件組

WM_COMMAND是從視窗元件層到外集件組界面層一個WINAPI消息。這些消息不會傳遞到更高層,考慮到可移植性,其他小部件集不會產生這樣的消息。

如果要捕獲消息,則必須編寫非便攜式widgetset特定代碼(本例中爲winapi代碼)。你可以用setwindowlong覆蓋windowproc。例如,請參閱Lazarus wiki

+0

是不是可能是一個錯誤/缺少的功能,LM_COMMAND和CN_COMMAND也無法正常工作,便攜式級別的事件捕獲也是不可能的? – 2010-01-16 17:53:06