2011-12-14 11 views
5

In un gestore di eventi TDbGrid.OnColumnMoved, ho regolato alcuni colori delle intestazioni di colonna.Come scartare il clic del mouse in TDbGrid.OnColumnMoved

Uso anche l'evento della griglia OnTitleClicked per visualizzare un menu (colonna di ordinamento).

Sfortunatamente, dopo che l'utente trascina una colonna e OnColumnMoved è terminata, la VCL chiama OnTitleClicked. Ciò significa che il mio pop-up di ordinamento appare dopo il trascinamento della colonna.

C'è un modo in OnColumnMoved Posso cancellare la coda degli eventi del mouse in modo che non venga chiamato il numero OnTitleClicked?

This thread ha questo codice, ma non ho un Msg in OnTitleClicked.

while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, 
    PM_REMOVE or PM_NOYIELD) do; 

(Se non c'è modo per fare questo, non è un grosso problema. Posso impostare un flag in OnColumnMoved modo che OnTitleClick ignora la chiamata accanto ad essa.)

+2

Si sa che è possibile dichiarare la propria variabile 'Msg: tagMsg' (o' TMsg ') e utilizzarla nella chiamata a 'PeekMessage'? Non pensare che sia la risposta qui, ma solo FYI ... –

+0

Hmmmm - non tutti gli eventi OnColumnMoved attivano anche un evento OnTitleClick per me (Delphi 10.1), quindi il flag non è affidabile. Potrei usare un timer, quindi se OnTitleClick si verifica entro (diciamo) 0,25 secondi di OnColumnMoved, viene ignorato. Ma è come usare un martello per uccidere una pulce. Qualche altra riflessione su questo? – DaveBoltman

risposta

5

Come accennato nei commenti alla domanda , si fornisce il 'messaggio' per PeekMessage (var Msg: TMsg). Ma scartare il messaggio che attiva lo OnTitleClick non è possibile perché è lo stesso messaggio che attiva entrambi gli eventi. VCL esegue lo spostamento di colonne in risposta a un messaggio WM_LBUTTONUP se una colonna è stata trascinata. Più tardi durante la gestione dello stesso messaggio viene chiamato OnTitleClick.

IOW, mentre è possibile rimuovere i messaggi dalla coda dei messaggi con PeekMessage, il messaggio che innesca OnTitleClick è già spedito dal momento che siamo in un OnColumnMoved gestore.

L'approccio più semplice sembra impostare la bandiera come hai detto.

Problemi correlati