2010-01-12 21 views
5

Tôi có biểu mẫu với MainMenu và tôi muốn chặn khi người dùng chọn mục lệnh từ menu. này hoạt động trong Delphi:Sự cố với WM_COMMAND trên 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; 

Trong MainMenu tôi đã thêm một số mặt hàng và khi tôi chọn những mặt hàng từ menu sau đó Memo1 tôi được làm đầy với:

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

tôi chuyển ứng dụng này để FPC/Lazarus , nhưng có vẻ như WM_COMMAND không được gọi! Khi tôi đặt điểm ngắt trong TForm1.WMCommand ở Delphi thì Delphi đã dừng nhiều lần trước khi biểu mẫu chính xuất hiện. Lazarus không bao giờ dừng lại trên điểm ngắt này. Tôi nghĩ rằng một cái gì đó bị hỏng với WM_COMMAND ở Lazarus, nhưng có lẽ tôi không biết điều gì đó. Bất kỳ ý tưởng?

Tôi sử dụng Lazarus 0.9.28.2 beta với FPC 2.2.4 trên WinXP.

EDIT:

Sử dụng Winspector Tôi đã kiểm tra rằng MainMenu tạo WM_COMMAND:

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

Tôi nghĩ rằng có lỗi trong Lazarus/FPC trong việc xử lý phương pháp nhắn WM_COMMAND và tôi báo cáo nó: http://bugs.freepascal.org/view.php?id=15521

Trả lời

2

Trong ứng dụng LCL, bạn có các lớp sau:

  • Ứng dụng
  • LCL
  • Bộ tiện ích Giao diện (ví dụ: win32/win64, qt, gtk2, carbon)
  • Widget thiết

WM_COMMAND là một thông điệp WINAPI từ Layer widgetset đến Widget Set lớp giao diện. Các thư này không được chuyển đến các lớp cao hơn, có tính di động trong đầu, các bộ tiện ích con khác không tạo ra các thông báo như vậy.

Nếu bạn muốn chụp thư, thì bạn phải viết mã cụ thể không phải là widget cụ thể (mã winapi trong trường hợp này). Bạn có thể ghi đè lên windowproc với setwindowlong. Xem ví dụ Lazarus wiki.

+0

Nó không phải là một tính năng lỗi/mất tích mà LM_COMMAND và CN_COMMAND cũng không hoạt động, iow chụp ở mức độ di động của sự kiện là không thể? –