2011-12-14 17 views
5

W procedurze obsługi zdarzeń TDbGrid.OnColumnMoved dostosowuję kolory niektórych nagłówków kolumn.Odrzucanie kliknięcia myszą w TDbGrid.OnColumnMoved

Używam również zdarzenia siatki OnTitleClicked do wyskakiwania menu (kolumna sortowania).

Niestety, po tym, jak użytkownik przeciągnie kolumnę i zakończy się OnColumnMoved, VCL wywołuje OnTitleClicked. Oznacza to, że moje okno pop-up sortowania pojawia się po przeciągnięciu kolumny.

Czy jest jakiś sposób w OnColumnMoved Czy mogę wyczyścić kolejkę zdarzeń myszy, aby OnTitleClicked nie został wywołany?

This thread ma ten kod, ale nie mam Msg w OnTitleClicked.

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

(Jeśli nie ma sposobu, aby to zrobić, to nie jest wielka sprawa. Mogę ustawić flagę w OnColumnMoved tak że OnTitleClick ignoruje następną rozmowę z nim.)

+2

Czy wiesz, że możesz zadeklarować własną zmienną 'Msg: tagMsg' (lub' TMsg ') i użyć jej w wywołaniu 'PeekMessage'? Nie sądzę, że jest to odpowiedź tutaj, ale po prostu FYI ... –

+0

Hmmmm - nie każde zdarzenie OnColumnMoved wyzwala również dla mnie zdarzenie OnTitleClick (Delphi 10.1), więc flaga nie jest wiarygodna. Mógłbym użyć timera, więc jeśli OnTitleClick wystąpi w ciągu (powiedzmy) 0.25 sekund od OnColumnMoved, zostanie zignorowany. Ale to jak użycie młota do zabicia pchły. Jakieś dalsze przemyślenia na ten temat? – DaveBoltman

Odpowiedz

5

Jak wspomniano w komentarzach na pytanie , możesz samemu dostarczyć "Msg" dla PeekMessage (var Msg: TMsg). Ale odrzucenie komunikatu, który wyzwala OnTitleClick, nie jest możliwe, ponieważ jest to ta sama wiadomość, która uruchamia oba zdarzenia. VCL wykonuje ruch kolumny w odpowiedzi na komunikat WM_LBUTTONUP, jeśli kolumna została przeciągnięta. Później podczas obsługi tej samej wiadomości jest wywoływana OnTitleClick.

IOW, podczas gdy można usuwać wiadomości z kolejki komunikatów za pomocą PeekMessage, komunikat, który wyzwala OnTitleClick jest już wysłany, ponieważ jesteśmy w procedurze obsługi OnColumnMoved.

Najprostszym sposobem jest ustawienie flagi tak, jak powiedziałeś.

Powiązane problemy