9.2 드래그 앤 드롭 함수를 개발하기위한 일반 단계
드래그 앤 드롭은 Windows에서 제공하는 객체의 작동을 용이하게하고 Delphi에서 쉽게 개발할 수있는 기능입니다.
나와. 드래그 앤 드롭 작동 프로세스에 따르면 개발 단계는 4 단계로 나눌 수 있습니다.
● 드래그 작업을 시작하십시오
● 드래그 항목을받습니다
● 드래그 항목을 떨어 뜨립니다
● 드래그 작업을 중지하십시오
소개 과정에서 탭 세트 (태그 세트) 드래그 앤 드롭 작업 예제를 결합합니다. 인터페이스 디자인은 그림에 나와 있습니다.
사용자가 런타임에 태그를 다른 태그 위치로 드래그하면 태그가 해당 위치로 이동하여 원인이됩니다.
태그 세트의 재 배열.
9.2.1 드래그 시작
드래그 모드가 dmautomatic으로 설정되면 사용자가 소스 컨트롤에서 마우스를 누르면 자동으로 드래그합니다.
시작할 때 DMManual로 설정할 때 마우스 이벤트를 처리하여 드래그를 시작하는지 결정하십시오. 드래그를 시작하려면
BEGINDRAG 메소드를 사용하십시오.
Tabset Drag and Drop에서 아래의 Mousedown 이벤트 처리를 사용하여 태그를 드래그하기 시작합니다.
먼저, 누른 왼쪽 버튼이 왼쪽 버튼인지 확인한 다음 항목이 합법적인지 확인하십시오.
절차 tform1.tabset1mousedown (sender : tobject; button : tmousebutton;
Shift : TshiftState; X, Y : Integer);
var
Dragitem : 정수;
시작하다
if button = mbleft라면
시작하다
dragitem : = tabset1.itematpos (point (x, y));
if (dragitem> -1) 및 (dragitem <tabset1.tabs.count)
tabset1.begindrag (false);
끝;
끝;
9.2.2 드래그 된 항목을받습니다
컨트롤이 드래그 항목을받을 수 있는지 여부는 제어의 ondragover 이벤트에 의해 결정됩니다. 탭 세트 드래그에서 가장 중요한 것은 마우스 위치를 사용하여 판단하는 것입니다.
절차 tform1.tabset1dragover (sender, 출처 : tobject; x, y : integer;
상태 : TDRAGSTATE; VAR 수락 : 부울);
var
드롭 포스 : 정수;
시작하다
소스 = tabset1 인 경우
시작하다
droppos : = tabset1.itematpos (point (x, y));
수락 : = (droppos> -1) 및 (Droppos <> tabset1.tabindex) 및
(droppos <tabset1.tabs.count);
끝;
또 다른
수락 : = 거짓;
끝;
9.2.3 드래그 항목을 내려 놓습니다
OnDragover 이벤트 처리가 수락되고 항목이 삭제되면 OndragDrop 이벤트가 삭제됩니다.
응답을 드래그하고 삭제하는 과정. Tabset 드래그 앤 드롭 인스턴스에서 태그의 위치를 변경하는 것입니다.
절차 tform1.tabset1dragdrop (sender, 출처 : tobject; x, y : integer);
var
Oldpos : 정수;
Newpos : 정수;
시작하다
소스 = tabset1 인 경우
시작하다
Oldpos : = tabset1.tabindex;
newpos : = tabset1.itematpos (point (x, y));
if (newpos> -1) 및 (NewPos <> Oldpos)
tabset1.tabs.move (Oldpos, Newpos);
끝;
끝;
9.2.4 엔드 드래그 작동
드래그 작업을 종료하는 두 가지 방법이 있습니다. 사용자가 마우스 키를 출시하거나 프로그램이 enddrag 메소드를 사용합니다.
강제 중단 드래그. 드래그 작업을 종료하면 두 가지 결과가 있습니다. 드롭이 허용되거나 드롭이 무시됩니다.
드래그 작업이 완료되면 소스 컨트롤은 드래그 엔드 이벤트 OnendDrag에 응답하는 메시지를받습니다.
9.3 드래그 앤 드롭 애플리케이션 예제 : 파일 관리자에 대한 드래그 앤 드롭 지원
6 장에서 개발 된 파일 관리자 애플리케이션 예제는 기능이 형성되기 시작했지만 작동 중입니다.
Windows의 파일 관리자와 비교할 때 여전히 많은 단점이 있습니다. 가장 큰 단점은 파일의 드래그 앤 드롭 이동을 지원하지 않는다는 것입니다.
그리고 드래그 앤 드롭 사본. 이 장의 끝에서 우리는이 결함을 보충 할 수 있습니다.
파일 드래그 앤 드롭 이동은 사용자가 파일을 디렉토리 트리 아래 디렉토리로 드래그하고 드롭 할 때 파일을 나타냅니다.
이 디렉토리로 자동으로 이동합니다. 파일의 드래그 앤 드롭 사본은 파일을 드라이브 레이블로 드래그 할 때입니다.
당신이 그것을 켜고 떨어 뜨리면, 파일은 드라이브의 현재 디렉토리에 자동으로 복사됩니다. 소스 컨트롤로서 파일 목록 상자
대상 컨트롤의 디렉토리 트리 및 드라이브 레이블은 다른 하위 바람에 위치 할 수 있습니다. 드라이브의 현재 디렉토리는 모든 서브입니다
이 하위 창이 드래그 소스 및 드래그 대상과 관계가 있는지 여부에 관계없이 창의 최신 작업 결과.
위의 기능을 구현하기 위해 먼저 해결 해야하는 두 가지 문제가 있습니다.
1. 각 드라이브의 현재 디렉토리를 기록하는 방법은 무엇입니까?
이를 위해 우리는 글로벌 변수를 정의합니다.
var currentDirlist : 배열 [0 ... 25]의 문자열 [70];
DirectoryOutline의 OnChange 이벤트에서 :
절차 tfmform.DirectoryOutlineChange (sender : tobject);
시작하다
생성물;
filelist.clear;
FilElist.directory : = directoryOutline.Directory;
filelist.update;
CurrentDirlist [driveTabset.tabindex] : = directoryOutline.Directory;
filemanager.directoryPanel.caption : = directoryOutline.Directory;
끝;
DriveTabset이 OnDragDrop 이벤트에 응답하기 전에 OnClick 이벤트에 응답하고 이벤트에서 활성화되기 때문에
Onchange 이벤트의 DirectoryOutline 이벤트를 보내면 언제든지 OnDragDrop 이벤트에서 사용할 수 있습니다.
CurrentDirlist 배열 항목은 빈 문자열이 아닙니다.
2. 움직임의 무관심과 하위 창과 복사하는 방법은 무엇입니까?
여기서 중요한 문제는 소스 컨트롤을 판단 할 때 IS 연산자를 사용하여 유형 확인을 수행한다는 것입니다.
소스가 tfilelist라면…
다음 진술을 사용하는 경우 :
경우 소스 = FILELIST라면
…
그런 다음 이동 및 복사 작업은이 하위 창의 범위로 제한됩니다.
우리가 위의 질문을 해결했을 때, 우리의 작업은 드래그 앤 드래그의 일반적인 개발 단계를 따르고 있었고, 단계별로 완료했습니다.
1. Filelist는 작동을 드래그하기 시작합니다
절차 tfmform.filelistmousedown (sender : tobject; button : tmousebutton;
Shift : TshiftState; X, Y : Integer);
시작하다
if button = mbleft라면
tfilelistbox와 같이 발신자가 있습니다
시작하다
itemAtpos (point (x, y), true)라면> = 0이면
begindrag (false);
끝;
끝;
ItemAtpos는 현재 파일이 있는지 확인하는 데 사용됩니다. BEGINDRAG 메소드는 파라미터 False를 전달하여 FilEList가 드래그를 시작하지 않고 마우스 이벤트를 개별적으로 처리 할 수 있습니다. 실제로이 상황은 대량으로 존재합니다.
2. DirectoryOutline 및 DriveTabset은 드래그를 수락할지 여부를 결정하고 그 자리에 내려 놓을 것인지 결정합니다.
절차 tfmform.directoryOutlinedRagover (sender, 출처 : Tobject; x,
Y : 정수; 상태 : tdragstate;
시작하다
소스가 tfilelistbox 인 경우
수락 : = 참;
끝;
프로 시저 tfmform.drivetabsetDragover (sender, 출처 : tobject; x,
Y : 정수; 상태 : tdragstate;
var
Proppos : 정수;
시작하다
소스가 tfilelistbox 인 경우
DriveTabset과 함께
시작하다
proppos : = itemAtpos (point (x, y));
수락 : = (proppos> -1) 및 (proppos <tabs.count);
끝;
끝;
DirectoryOutline은 무조건 수락이며 DriveTabset은 법적 태그인지 확인해야합니다.
3. 드래그 앤 드롭 응답
DirectoryOutline 드래그 앤 드롭은 파일 이동 기능을 구현하는 데 사용됩니다. 프로그램에서 확인 확인 이벤트 호출
처리 프로세스 중에, 대상 경로는 directoryOutline.Items [getItem (x, y)]. fullPath에 의해 얻어진다.
절차 tfmform.directoryOutlinedRagdrop (sender, 출처 : Tobject; x,
Y : 정수);
시작하다
소스가 tfilelistbox 인 경우
DirectoryOutline과 함께
시작하다
quicinechange ( 'move', filelist.filename, 항목 [getitem (x, y)]. fullpath);
끝;
끝;
DriveTabset 드래그 앤 드롭은 파일 복사 함수를 구현하는 데 사용됩니다. 현재 위치를 프로그램의 해당 드라이버로 변환
액추에이터 문자, 대상 경로는 CurrentDirlist [driveTabset.tabindex]에 의해 얻어집니다.
프로 시저 tfmform.drivetabsetdragdrop (sender, 출처 : tobject; x, y : integer);
var
apoint : tpoint;
시작하다
apoint.x : = x;
driveTabset.tabindex : = driveTabset.Itematpos (apoint);
소스가 tfilelistbox 인 경우
DriveTabset과 함께
시작하다
CurrentDirlist [tabindex] <> ''인 경우
quicinechange ( 'copy', thefilename, currentdirlist [tabindex]);
끝;
끝;
4. 파일 목록을 드래그하고 업데이트하는 데 대한 Filelist 응답
절차 tfmform.filelistendDrag (발신자, 대상 : Tobject; x, y : Integer);
시작하다
target <> nil이면 filelist.update;
끝;