2010-01-12 31 views
5

J'ai un formulaire avec MainMenu et je veux intercepter lorsque l'utilisateur sélectionne un élément de commande à partir d'un menu. Cela fonctionne dans Delphi:Problème avec WM_COMMAND sur 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; 

mainMenu J'ai ajouté quelques articles et lorsque je sélectionne les éléments de menu, puis mon Memo1 est rempli:

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

Je Ported cette application à CCPF/Lazarus , mais il semble que le gestionnaire WM_COMMAND n'est pas appelé! Lorsque j'ai défini le point d'arrêt dans TForm1.WMCommand dans Delphi puis Delphi arrêté plusieurs fois avant la forme principale est apparue. Lazarus n'a jamais arrêté sur ce point d'arrêt. Je pense que quelque chose est cassé avec WM_COMMAND dans Lazarus, mais peut-être que je ne sais pas quelque chose. Une idée? J'utilise Lazarus 0.9.28.2 beta avec FPC 2.2.4 sous WinXP.

EDIT:

En utilisant Winspector j'ai vérifié que MainMenu génère WM_COMMAND:

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

Je pense qu'il ya bogue dans Lazarus/FPC dans la manipulation de la méthode des messages WM_COMMAND et je l'ai signalé: http://bugs.freepascal.org/view.php?id=15521

Répondre

2

Dans une application LCL, vous disposez des couches suivantes:

  • Application
  • LCL
  • Jeu de widgets Interface (par ex. Win32/Win64, qt, gtk2, carbone)
  • Widget défini

WM_COMMAND est un message de winapi de la couche d'widgetset à la couche d'interface Set Widget. Ces messages ne sont pas transmis aux couches supérieures, compte tenu de la portabilité, d'autres ensembles de widgets ne produisent pas de tels messages.

Si vous souhaitez capturer le message, vous devez écrire un code spécifique pour un ensemble de widgets non portable (code winapi dans ce cas). Vous pouvez remplacer le windowproc avec setwindowlong. Voir le Lazarus wiki pour un exemple.

+0

N'est-ce pas un bug/une fonctionnalité manquante que LM_COMMAND et CN_COMMAND ne fonctionnent pas non plus, alors que la capture au niveau portable de l'événement n'est pas possible non plus? –