2010-01-12 16 views
5

Tengo formulario con MainMenu y quiero interceptar cuando el usuario selecciona un elemento de comando de un menú. Esto funciona en Delphi:Problema con WM_COMMAND en 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; 

En MainMenu he añadido algunos elementos y cuando selecciono los elementos de menú y luego mi Memo1 está lleno de:

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

porté esta aplicación para FPC/Lázaro , pero parece que el manejador WM_COMMAND no se llama! Cuando establecí el punto de interrupción en TForm1.WMCommand en Delphi, Delphi se detuvo varias veces antes de que apareciera el formulario principal. Lazarus nunca detuvo el en este punto de interrupción. Creo que algo está roto con WM_COMMAND en Lazarus, pero tal vez no sé algo. ¿Alguna idea?

Uso Lazarus 0.9.28.2 beta con FPC 2.2.4 en WinXP.

EDIT:

Usando Winspector I comprobado que MainMenu genera WM_COMMAND:

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

Creo que hay error en Lázaro/FPC en WM_COMMAND manejo método de mensaje y me informó que: http://bugs.freepascal.org/view.php?id=15521

Respuesta

2

En una aplicación LCL, tiene las siguientes capas:

  • Aplicación
  • LCL
  • Interfaz de conjunto de widgets (p. Win32/Win64, qt, gtk2, carbono)
  • Widget establece

WM_COMMAND es un mensaje winapi de la capa widgetset a la capa de interfaz Widget Set. Estos mensajes no se pasan a las capas superiores, teniendo en cuenta la portabilidad, otros conjuntos de widgets no producen dichos mensajes.

Si desea capturar el mensaje, debe escribir código específico de widgetset no portátil (código winapi en este caso). Puede anular el proceso de ventana con setwindowlong. Vea el Lazarus wiki para un ejemplo.

+0

¿No es posiblemente una característica de error/falta que LM_COMMAND y CN_COMMAND tampoco funcionen, no obstante, no es posible capturar en el nivel portátil del evento? –