본문 바로가기

Delphi/꿀팁

Drag&Drop된 파일정보 가져오기 - 1

1. uses에 ShellAPI를 추가합니다.
uses
  .., ShellAPI;

 

2. 폼의 OnCreate와 OnClose에 파일을 받을 컴포넌트의 핸들을 넘겨 Drag&Drop을 허용/비허용합니다.

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

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

 

3. 폼에 WM_DROPFILES의 윈도우 메시지를 상속받는 함수를 생성합니다. 

type
  TForm1 = class(TForm)
    ..
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    { Public declarations }
  end;

 

4. 가져온 파일 정보로 원하는 다음 프로세스를 진행합니다.

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  DropHandle: HDROP;
  nFileCount: Integer;
  nLength: Integer;
  sFileName: string;
  I: Integer;
begin
  inherited;
  
  DropHandle := Msg.Drop;
  
  try
    nFileCount := DragQueryFile(DropHandle, $FFFFFFFF, nil, 0);
    
    for I := 0 to Pred(nFileCount) do begin
      nLength := DragQueryFile(DropHandle, I, nil, 0);
      SetLength(sFileName, nLength);
      
      DragQueryFile(DropHandle, I, PChar(sFileName), nLength + 1); //참조 -> https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-dragqueryfilea
      ShowMessage(sFileName);
    end;
  finally
    DragFinish(DropHandle);
  end;
  
  Msg.Result := 0;
end;
반응형