문제

최근에 Delphi (버전 2009)로 작성된 대규모 응용 프로그램에 기능을 추가하여 사용자가 Windows 탐색기에서 파일을 드래그하여 TCXGRID 컨트롤에 떨어 뜨릴 수 있습니다. 나는 내 자신의 Window Proc를 그리드에 첨부하고 WM_DROPFILES 메시지를 가로 채는 일반적인 방법을 통해 이것을 달성했습니다.

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

이제 사용자가 그리드의 기존 행에 파일을 삭제하는 시점을 감지하기 위해이 기능을 향상 시키려고 노력하고 있으며, 이는 새 버전으로 기존 파일을 덮어 쓰는 프로세스를 시작합니다.

첫 번째 생각은 그리드 컨트롤의 마우스 오버 이벤트가 작동하는지 확인하는 것이 었습니다. 드래그 작업 중에는 그렇지 않습니다.

그런 다음 Winspector라는 프로그램을 사용하여 마우스가 그리드 위로 이동함에 따라 그리드 컨트롤로 전송되는 메시지를 확인했으며 이제 마우스가 끝나는 행을 감지하고 강조 표시 할 수 있습니다. 위와 동일한 기술을 사용하고 있지만이 경우 그리드 자체가 아닌 그리드 사이트의 Window Proc를 무시하고 있습니다. 왜냐하면 WinSpector에 따라 메시지가 진행되는 것처럼 보이기 때문입니다.

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

GridSiteWindowProc의 본문은 다음과 같습니다.

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;

보시다시피, 나는 이것을 달성하기 위해 WM_NCHITTEST 메시지를 갇히고 있습니다. WinSpector에 따르면,이 메시지는 드래그 작업 중에 그리드 사이트 창으로 전송되지만 Log () 명령문이 무관하면 메시지 값을 문자열 목록에 출력 할 수 있습니다 (나중에 메모 필드에 수동으로 덤프). 어떤 이유로 든 그리드 위로 파일을 드래그 할 때이 메시지 중 하나 또는 두 개만 얻을 수 있다고 결정했습니다.

이제 흥미로운 부분이 있습니다. WinSpector가 해당 창으로 이동하는 메시지를 실행하고 모니터링하는 경우 파일 드래그 작업 중에 갑자기 WM_NCHITTEST 메시지를 갑자기 받기 시작합니다. 또한 Window Proc에 오는 모든 메시지의 정수 값을 먼저 문자열 목록 버퍼 대신 별도의 로그 창으로 직접 출력하는 경우에도 마찬가지입니다. 나는 누군가가 왜 이런 일이 일어나고 있는지 또는 이것이 어떻게 작동하는지에 대한 단서를 제공 할 수 있기를 바라고 있습니다.

도움이 되었습니까?

해결책

wm_dropfiles 메시지를 사용하는 대신 Ole Drag'n'Drop을 사용해야합니다. RegisterDropTarget API를보십시오. 더 자세한 정보를 얻을 수 있습니다 어디 드래그 또는 드롭이 발생합니다. 더 많은 종류의 드래그 객체를 수용 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top