2009-08-18 2 views
4

'표준'VCL 끌어서 놓기 이벤트 OnDragOver 및 OnDragDrop을 사용하면 어떻게 "복사"작업과 "이동"작업을 구별 할 수 있습니까?Delphi에서 복사 및 이동 확인 드래그 앤 드롭

사용할 수있는 TDragType이없는 것 같으며 키보드 Shift 상태가 이러한 이벤트에 전달되지 않습니다.

답변

8

이벤트가 응용 프로그램의 요구 사항이나 기능에 대한 가정을하지 않기 때문에 이벤트에서 확인할 수있는 것은 아닙니다.

특정 의미를 갖는 것으로 특정 끌어다 놓기를 해석하는 것은 응용 프로그램 자체의 책임입니다. OS는 응용 프로그램이 파일 삭제에 어떻게 반응 할지를 알 수 없으므로 끌기 조작이 의미하는 바가 무엇인지에 대한 가정을 할 수 없습니다 사용자를위한

많은 응용 프로그램에서 복사/이동간에 구분이 없으며 끌어서 놓기 만 가능합니다.

복사/이동 구분은 입니다. Windows 탐색기은 파일 작업에 적용됩니다. "바닐라"드래그/드롭의 경우 원래 및 대상 드라이브 볼륨을 기반으로 규칙을 적용합니다. 볼륨에서 파일을 드래그/드롭하면 으로 이동합니다 (기본값 :). 볼륨에 드래그/드롭하는 것은 기본적으로 복사본입니다.

그러나 이는 응용 프로그램 (Windows 탐색기)에서 결정한 기본 규칙 일뿐입니다. 사용자는 드래그하는 동안 키보드 단축키를 사용하여 이러한 기본값을 무시할 수 있으며, 드롭 할 때 (가장 중요한 것은) 삭제할 수 있습니다. 그러나 이는 특정 응용 프로그램 (OS가 아닌 Windows 탐색기)에 의해 정의되고 해석됩니다.

그래서, 당신은 응용 프로그램이 있다면 Windows 탐색기에서 드래그 할 수있는 파일에 대한 드롭 대상이며, 그것을 복사 및 이동 구별하는 응용 프로그램에 대한 의미가 있다면, 당신은 같은를 지원해야 키보드 수정 자 Windows 탐색기을 지원합니다. 나는이 (나는이 확인이 좋을 걸 있지만) 수정할 수 있습니다 생각하지 않는다, 그래서 당신은 단순히 Ctrl 키의 상태를 테스트하거나 드래그 이벤트에 Shift 키를 수 :

Ctrl   = COPY 
Shift  = MOVE 
Ctrl + Shift = MAKE SHORTCUT (if this is applicable to your application) 

GetKeyState()이 직접 할 수 있습니다 특정 시점에서 특정 키의 상태를 조사합니다. 변화하는 "기본"동작은 다음 원하는 경우

당신이 기본이 가장 적합한 결정하기 위해 소스 정보에 자신의 시험을 적용 할 것 (예는 Windows 탐색기 "볼륨 경계"기본 규칙을 모방하기) 또는 응용 프로그램에 가장 적합하거나 직관적 인 기본 동작을 선택하기 만하면됩니다.

+0

+1 GetKeyState() -하지만 이동 대 복사 개념이 VCL에 하드 코딩되지 않은 경우 컨트롤 키를 누르면 끌기 커서가 "+"기호 (복사를 나타냄)를 얻는 이유는 무엇입니까? – Roddy

+0

글쎄, VCL은 내부의 VCL 기반 끌어서 놓기 작업에 대해이 "복사"커서를 설정하지 않으므로이 커서는 VCL * 설정 *이 아닙니다. 커서를 설정하지 않는 VCL *이라고 생각합니다. 즉, 사용자가 드래그하는 동안 Ctrl 키를 누르면 Windows 탐색기가 커서를 설정합니다. 드롭 대상이 커서를 명확하게 덮어 쓰지 않으면 메모장과 PaintShop Pro는 복사 커서를 부적절하게 "보관"합니다 (예 :). 드롭 대상 응용 프로그램이 끌기 소스가 "소유"할 수있는 커서도 변경할 수없는 경우 일 수도 있습니다. 확인해야 겠어. – Deltics

+0

DragAcceptFiles()를 사용하여 Windows 탐색기에서 파일을받을 때 (내가 "복사"끌기 커서를 얻을 수있는 유일한 방법), 대상 응용 프로그램이 * 끌기 * 커서를 변경할 기회를 얻는 것처럼 보이지 않습니다. Windows 파일 끌어서 놓기 시스템은 * 드롭 * 알림 만 보냅니다. 그리고이 메커니즘은 어쨌든 VCL 드래그 이벤트를 포함하지 않습니다. 특정 구현에 대한 자세한 정보가 도움이 될 수 있습니다. 예를 들어 파일 드롭을 지원하기 위해 타사 끌어서 놓기 컨트롤을 사용하고 있습니까? – Deltics

0

델파이에 대해서는 확실하지 않지만 C#에서는 이벤트 매개 변수의 AllowedEffect 속성을 확인합니다. 그들은 둘 다 Win32에 다시 연결되기 때문에 많은 차이가 있다는 것을 상상할 수 없습니다.

http://msdn.microsoft.com/en-us/library/system.windows.forms.drageventargs.aspx이 좋은 예입니다. 희망이 도움이!

+0

슬프게도 도움이되지 않습니다. 델파이 VCL은 '내부'드래그 앤 드롭 AFAIK를 위해 Win32 호출을 사용하지 않습니다. – Roddy

+0

아직도 .. downvote 필요가 없습니다. 나는 그것이 도움이되는 것을 알았다. +1 –

4

짧은 대답은 - 그렇지 않습니다. VCL에 내장 된 드래그 앤 드롭 시스템은이 둘을 구별하지 않습니다. 그러나 자신의 TDragObject/Ex 클래스를 파생시켜 실제로 어떤 종류의 데이터가 드래그되는지 제어 할 수 있습니다.

4

응용 프로그램과 다른 Windows 응용 프로그램간에 Drag'n'Drop을 사용하려면 Anders Melander의 Drag and Drop Component Suite for Delphi을 살펴볼 가치가 있습니다.
최신 코드는 here입니다.

+1

사실, 이미 사용하고 있습니다 ;-) – Roddy