Domanda

Ho form con MainMenu e voglio intercettare quando l'utente seleziona una voce di comando da un menu. Questo funziona in Delphi:

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 quelle voci dal menu, quindi il mio Memo1 è riempito con:

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

ho portato questa applicazione per FPC / Lazarus, ma sembra che WM_COMMAND gestore non si chiama! Quando ho impostato punto di interruzione in TForm1.WMCommand in Delphi, allora Delphi fermato molte volte prima che apparisse modulo principale. Lazzaro non ha mai smesso su questo punto di interruzione. Credo che qualcosa si è rotto con WM_COMMAND a Lazzaro, ma forse non lo so qualcosa. Qualche idea?

Io 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

Credo 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

È stato utile?

Soluzione

In un'applicazione LCL si hanno i seguenti livelli:

  • Application
  • LCL
  • Widget impostato interfaccia (ad esempio Win32 / Win64, qt, gtk2, carbonio)
  • Widget set

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

Se si desidera catturare il messaggio, allora è necessario scrivere non portabile codice specifico widgetset (codice WinAPI in questo caso). È possibile ignorare il WindowProc con SetWindowLong. Vedere la Lazzaro wiki per un esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top