很不爽的是,用Delphi封裝在Form里的那些東西是沒辦法接受用戶從我的電腦里拖放到你的Form上的文件的,但在做軟件的時候這又是很必要的,我昨天研究了一晚上終于解決了這個問題。 首先,給你的Project加一個Unit,代碼如下: unit untDrag;
interface
//用來告訴Windows你的Form可以接受文件拖放 {$EXTERNALSYM DragAcceptFiles}procedure DragAcceptFiles(hWnd: Cardinal; fAccept: Boolean); stdcall; //得到拖放文件名和文件個數的API {$EXTERNALSYM DragQueryFile} function DragQueryFile(hDrop: Cardinal; iFile: Cardinal; lpszFile: PChar; cch: Integer): Integer; stdcall; //釋放Windows分配給拖放操作的內存 {$EXTERNALSYM DragFinish} procedure DragFinish(hDrop: Cardinal); stdcall; //得到拖放的文件個數 function GetDragFileCount(hDrop: Cardinal): Integer; //得到拖放的文件名,通過FileIndex來指定文件編號,默認為第一個文件 function GetDragFileName(hDrop: Cardinal; FileIndex: Integer = 1): string;
implementation
procedure DragAcceptFiles; external 'Shell32'; function DragQueryFile; external 'Shell32'; procedure DragFinish; external 'Shell32';
function GetDragFileCount(hDrop: Cardinal): Integer; const DragFileCount=High(Cardinal); begin Result:= DragQueryFile(hDrop, DragFileCount, nil, 0); end;
function GetDragFileName(hDrop: Cardinal; FileIndex: Integer = 1): string; const Size=255; var Len: Integer; FileName: string; begin SetLength (FileName, Size); Len:= DragQueryFile(hDrop, FileIndex-1, PChar(FileName), Size); SetLength (FileName, Len); Result:= FileName; end;
end.
然后,在你需要處理拖放的Form的OnCreate里面加上這么一句: DragAcceptFiles (Handle, True);
在TForm1的public里面加上如下聲明: procedure MyDrag (var Msg: TWMDropFiles); message WM_DropFiles;
下面是此過程的實現: procedure TForm1.MyDrag (var Msg: TWMDropFiles); var hDrop: Cardinal; ... begin hDrop:= Msg.Drop; //這個是拖放句柄 ...(在這里可以用GetDragFileName和GetDragFileCount) //最后記得要用這兩句話: DragFinish (hDrop); Msg.Result:= 0; end;
當然,要在Form的Unit上面加上 uses untDrag;
|