Problema con WM_COMMAND su Lazarus / FPC
-
20-09-2019 - |
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
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.