2010-01-12 9 views
5

Ho una forma con MainMenu e voglio intercettare quando l'utente seleziona una voce di comando da un menu. questo funziona a Delfi:Problema con WM_COMMAND su 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; 

In MainMenu ho aggiunto alcuni elementi e quando seleziono tali invii dal menu, quindi mia Memo1 è pieno di:

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

ho portato questa applicazione per FPC/Lazarus , ma sembra che il gestore WM_COMMAND non venga chiamato! Quando ho impostato il punto di interruzione in TForm1.WMCommand in Delphi, Delphi si è fermato molte volte prima della comparsa del modulo principale. Lazarus non ha mai fermato su questo punto di interruzione. Penso che qualcosa sia rotto con WM_COMMAND a Lazzaro, ma forse non so qualcosa. Qualche idea?

Uso Lazarus 0.9.28.2 beta con FPC 2.2.4 su WinXP.

EDIT:

Utilizzando Winspector ho controllato che MainMenu genera WM_COMMAND:

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

Penso che ci sia bug in Lazarus/FPC in WM_COMMAND movimentazione metodo messaggio e mi ha riferito che: http://bugs.freepascal.org/view.php?id=15521

risposta

2

In un'applicazione LCL hai i seguenti livelli:

  • Applicazione
  • LCL
  • Insieme di widget Interfaccia (ad es. Win32/Win64, qt, gtk2, carbonio)
  • Widget impostato

WM_COMMAND è un messaggio WinAPI dallo strato widgetset allo strato di interfaccia Widget Set. Questi messaggi non vengono passati agli strati superiori, avendo in mente la portabilità, altri set di widget non producono tali messaggi.

Se si desidera acquisire il messaggio, è necessario scrivere codice specifico del widget widgetset portatile (codice winapi in questo caso). È possibile ignorare il windowproc con setwindowlong. Vedere lo Lazarus wiki per un esempio.

+0

Non è forse un bug/funzionalità mancante che LM_COMMAND e CN_COMMAND non funzionano, non è possibile nemmeno catturare sul livello portatile dell'evento? –