2010-01-12 8 views
5

Ich habe Formular mit MainMenu und ich möchte abfangen, wenn der Benutzer einen Befehl aus einem Menü auswählt. Dies funktioniert in Delphi:Problem mit WM_COMMAND auf 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 ich einige Elemente hinzugefügt und wenn ich diese Elemente aus dem Menü wählen Sie dann meine Memo1 ist gefüllt mit:

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

ich portiert diese Anwendung zu FPC/Lazarus , aber es scheint, dass WM_COMMAND Handler nicht aufgerufen wird! Als ich den Haltepunkt in TForm1.WMCommand in Delphi setzte, dann wurde Delphi viele Male gestoppt, bevor das Hauptformular erschien. Lazarus stoppte niemals an diesem Haltepunkt. Ich denke, etwas ist mit WM_COMMAND in Lazarus gebrochen, aber vielleicht weiß ich nichts. Irgendeine Idee?

Ich benutze Lazarus 0.9.28.2 Beta mit FPC 2.2.4 auf WinXP.

EDIT:

Winspector Mit überprüfte ich, dass MainMenu WM_COMMAND erzeugt:

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

Ich denke, es gibt Fehler in Lazarus/FPC in WM_COMMAND Nachricht Verfahren Handhabung und ich berichtete sie: http://bugs.freepascal.org/view.php?id=15521

Antwort

2

In einer LCL-Anwendung haben Sie die folgenden Schichten:

  • Anwendung
  • LCL
  • Widget-Set-Schnittstelle (z.B. Win32/Win64, qt, gtk2, Kohlenstoff)
  • Widgetset

WM_COMMAND ist eine winapi Nachricht von der Schicht auf die Widgetset Widget Set-Schnittstellenschicht. Diese Nachrichten werden unter Berücksichtigung der Portabilität nicht an die höheren Schichten weitergegeben, andere Widget-Sätze erzeugen solche Nachrichten nicht.

Wenn Sie die Nachricht erfassen möchten, müssen Sie nichttragbaren Widgetset-spezifischen Code (in diesem Fall WinAPI-Code) schreiben. Sie können den Windowproc mit setwindowlong überschreiben. Ein Beispiel finden Sie in der Lazarus wiki.

+0

Ist es nicht vielleicht ein Fehler/fehlende Funktion, dass LM_COMMAND und CN_COMMAND auch nicht funktionieren, ist das Capturen auf der portablen Ebene des Ereignisses auch nicht möglich? –