2011-12-14 5 views
5

TDbGrid.OnColumnMoved 이벤트 처리기에서 일부 열 머리글 색을 조정합니다.TDbGrid.OnColumnMoved에서 마우스 클릭을 버리는 방법

또한 격자의 OnTitleClicked 이벤트를 사용하여 (정렬 열) 메뉴를 팝업합니다.

불행히도 사용자가 열을 드래그하고 OnColumnMoved이 끝나면 VCL은 OnTitleClicked을 호출합니다. 즉, 열 정렬 후에 내 정렬 순서 팝업이 나타납니다.

방법이 있습니까 OnTitleClicked가 호출되지 않도록 마우스 이벤트 큐를 지울 수 있습니까?

This thread에는이 코드가 있지만 OnTitleClicked에는 Msg이 없습니다.

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

(이 작업을 수행 할 수있는 방법이 없다면, 그것은 큰 문제가. 내가 OnTitleClick 그것에 다음 호출을 무시 너무 OnColumnMoved에 플래그를 설정할 수 없습니다.)

+2

'Msg : tagMsg' (또는'TMsg ') 변수를 선언하고'PeekMessage'를 호출 할 때 사용할 수 있다는 것을 알고 있습니까? 그 대답은 여기 있다고 생각하지 말고 단지 FYI ... –

+0

흠 - 모든 OnColumnMoved 이벤트가 나를 위해 OnTitleClick 이벤트 (Delphi 10.1)를 트리거하지는 않으므로 플래그가 신뢰할 수 없습니다. 타이머를 사용할 수 있으므로 OnTitleClick이 OnColumnMoved에서 0.25 초 이내에 발생하면 무시됩니다. 그러나 그것은 벼룩을 죽이기 위해 쇠 망치를 사용하는 것과 같습니다. 이것에 대한 더 이상의 생각? – DaveBoltman

답변

5

질문에 대한 의견에서 언급 한 바와 같이 PeekMessage ('')의'Msg '를 입력해야합니다. 그러나 두 이벤트를 발생시키는 동일한 메시지이기 때문에 OnTitleClick을 트리거하는 메시지를 삭제할 수 없습니다. VCL은 열이 드래그 된 경우 WM_LBUTTONUP 메시지에 대한 응답으로 열을 이동합니다. 나중에 동일한 메시지를 처리하는 동안 OnTitleClick이 호출됩니다.

메시지 대기열에서 PeekMessage으로 메시지를 제거 할 수 있지만 OnColumnMoved 처리기에 있기 때문에 OnTitleClick을 트리거하는 메시지가 이미 전달됩니다.

가장 쉬운 방법은 신고하신 플래그를 설정하는 것입니다.

관련 문제