본문 바로가기

운동하는 개발자/Delphi

델파이 폼에서 파일 드래그앤드롭 / delphi Drag and Drop

728x90

요즘 이메일 보낼때나 구글 드라이브를 사용하여 웹 브라우저에서 파일을 업로드 할 때
파일을 간단히 끌어서 놓기만 하면 첨부가 된다 
이와 같은 기능을 델파이 윈도우 폼에서 구현해보자 한다


메인 폼 화면

메인폼 화면에서 파일을 해당 폼에 끌어놓으면 에디터에 경로가 찍히게 만들어보려고 한다 

1. 메인 폼에서 OnCreate 이벤트에   DragAcceptFiles(Handle, True);
OnClose 이벤트에  DragAcceptFiles(Handle, False); 를 각각 추가하여 드래그 허용을 해준다
(이 허용을 하고 실행시 파일을 끌어서 폼 위에 올리면 마우스포인터에 +모양이 추가로 보인다)

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DragAcceptFiles(Handle, False);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;

 

 

2. 폼의 private 혹은 public부분에 파일 드롭 윈도우 메세지를 수신할 수 있는 함수를 추가한다 

    procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;

 

3. 드롭파일 메세지를 처리할 함수(WMDropFiles)를 구현한다

procedure TfrmMain.WMDropFiles(var Msg: TMessage);
var
  i, NumFiles, NameLength: Integer;
  hDrop: THandle;
  tmpFile: array [0..MAX_PATH] of Char;
begin
  hDrop := Msg.WParam;

  try
    NumFiles := DragQueryFile(hDrop, $FFFFFFFF, nil, 0);

    for i:=0 to NumFiles-1 do begin
      NameLength:=DragQueryFile(hDrop, i, nil, 0);

      DragQueryFile(hDrop, i, tmpFile, NameLength+1);

      edtAddPath.Text := tmpFile; 
    end;

  finally
    DragFinish(hDrop);
    SetForegroundWindow(Handle);

  end;
end;

 

※주의점 윈도우10 델파이 2010에서 해본 결과 관리자 권한이 들어가면 해당 기능이 동작하지 않습니다
IDE를 관리자권한으로 실행하면 디버깅시 해당기능이 동작하지 않습니다
파일에 관리자권한이 필요할때가 많을텐데 내부에서 따로 처리를 해줘야 할듯 합니다...ㅠ


 

728x90