2009-10-25 2 views
0

최근 델파이 (버전 2009)로 작성된 대형 응용 프로그램에 기능을 추가하여 사용자가 Windows 탐색기에서 파일을 드래그하여 TcxGrid 컨트롤 . 나는 WM_DROPFILES 메시지를 그리드에 내 자신의 창 시저를 부착하고 차단의 일반적인 방법을 통해이를 달성 :Windows 탐색기에서 파일을 드래그 할 때 TcxGrid에서 마우스 움직임을 감지 할 때 문제가 발생했습니다.

originalGridWindowProc := cxGrid.WindowProc; // remember the old one 
cxGrid.WindowProc := GridWindowProc; // assign the new one 
DragAcceptFiles(cxGrid.Handle, LongBool(True)); // setup to accept dropped files 

지금은 사용자가 기존 행에에있는 파일을 삭제하면 감지이 기능을 향상시키기 위해 노력하고 있어요 그리드는 기존 파일을 새 버전으로 덮어 쓰는 과정을 시작합니다.

내 첫 번째 생각은 그리드 컨트롤의 mouseover 이벤트가 작동하는지 확인하는 것이 었습니다. 드래그 작업 중에는 나타나지 않지만 않습니다.

그런 다음 Winspector라는 프로그램을 사용하여 마우스를 그리드 위로 옮길 때 어떤 메시지가 그리드 컨트롤로 전송되는지 확인하고 마우스가 끝난 행을 찾아 강조 표시 할 수 있습니다. 메시지가 Winspector에 따라가는 것으로 나타 곳이기 때문에, 나는 위와 같은 기술을 사용하고 있지만,이 경우에 나는 GridSite 아니라 그리드 자체의 창 시저를 무시하고 :

originalGridSiteWindowProc := cxGrid.ActiveView.Site.WindowProc; 
    cxGrid.ActiveView.Site.WindowProc := GridSiteWindowProc; 

당신이 볼 수 있듯이, 내가 이것을 달성하기 위해 WM_NCHITTEST 메시지를 트래핑하고있어

procedure Tfrm.GridSiteWindowProc(var message: TMessage); 
var 
    hitTest: TcxCustomGridHitTest; 
    gridRecord: TcxCustomGridRecord; 
begin 
    //Log(IntToStr(message.Msg)); 
    case message.Msg of 
    WM_NCHITTEST: begin 
     hitTest := cxGrid.ActiveView.GetHitTest(cxGrid.ScreenToClient(Mouse.CursorPos)); 
     if hitTest is TcxGridRecordCellHitTest then begin 
     gridRecord := TcxGridRecordCellHitTest(HitTest).GridRecord; 
     if Not gridRecord.Focused then 
      gridRecord.Focused := True; 
     end; 
     originalGridSiteWindowProc(message); 
    end 
    else 
     originalGridSiteWindowProc(message); 
    end; 
end; 

: 여기 GridSiteWindowProc의 몸입니다. Winspector에 따르면,이 메시지는 드래그 작업 중에도 그리드 사이트 창으로 보내지 만, 문자열 값 목록에 메시지 값을 출력하는 Log() 문을 주석 처리하지 않으면 수동으로 메모 필드로 덤프합니다. 필자는 어떤 이유로 파일을 그리드 위로 드래그 할 때 이러한 메시지 중 하나 또는 두 개만 가져옵니다.

이제 재미있는 부분이 있습니다. Winspector를 실행하고 해당 메시지를 모니터링하는 경우 파일 드래그 작업 중 모든 WM_NCHITTEST 메시지가 갑자기 시작됩니다. 이것은 또한 문자열 목록 버퍼가 아닌 별도의 로그 창에 직접 창 proc에 오는 모든 메시지의 정수 값을 출력하는 경우에도 해당됩니다. 나는 왜 이것이 일어나고 있는지 또는 이것이 작동하게하는 방법에 관해 누군가가 약간의 단서를 제공 할 수 있기를 바라고있다.

답변

3

WM_DROPFILES 메시지를 사용하는 대신 OLE Drag'n'Drop을 사용해야합니다. RegisterDropTarget API를 살펴보십시오. 에 대한 자세한 내용을 보려면 끌어서 놓기가 발생하고 있습니다. 더 많은 종류의 드래그 객체를 사용할 수도 있습니다.

+0

감사합니다. Outlook에서 전자 메일을 삭제할 수 있도록 OLE D & D를 이미 사용하고 있었기 때문에 Explorer에서 삭제하는 코드를 향상시킬 수 있었으며 완벽하게 작동 할 것입니다. 이것에 대한 훌륭한 정보가 여기에 있습니다 : http://msdn.microsoft.com/en-us/library/bb776904(VS.85).aspx 나는 OLE 방식으로 1 위를 갈 것입니다. WM_DROPFILES 메서드는 구현하기가 훨씬 쉬워 보였습니다. – PBenz

관련 문제