文件拖放
Use shellapi;
public
{ Public declarations }
procedure TFfile(var Msg:TMessage);message WM_DROPFILES;
单文件拖拽到某个控件上:
public
{ Public declarations }
procedure TFfile(var Message:TMessage);
var
Form1: TForm1;
implementation
{$R *.dfm}
var
OLDWndProc: TWndMethod;
procedure TForm1.TFfile(var Message:TMessage);
var
buffer:array[0..1024] of Char;
begin
if Message.Msg = WM_DropFiles then
begin
inherited;
buffer[0]:=#0;
DragQueryFile(Message.WParam,0,buffer,sizeof(buffer)); //获取拖入文件名称
label1.Caption:=PChar(@buffer); //字符数组转换成字符串
end
else // 其他消息,调用原来的处理程序
OLDWndProc(Message);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(panel1.Handle,true);
OLDWndProc := panel1.WindowProc;
panel1.WindowProc := Self.TFfile;
end;
单文件拖拽到窗体上:
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(form1.Handle,true);
end;
procedure TForm1.TFfile(var Msg:TMessage);
var
buffer:array[0..1024] of Char;
mouse:TPoint;
mouse_in:Boolean;
begin
GetCursorPos(mouse);
mouse:=ScreenToClient(mouse);//把文件拖到指定的区域,这里是拖到一个Tshape上
if (mouse.Y <= (shape1.Top+shape1.Height))and(mouse.Y >= shape1.Top)and(mouse.x <= (shape1.left+shape1.width))and(mouse.x>= shape1.left) then
mouse_in:=true
else
mouse_in:=false;
if mouse_in=true then
begin //不指定区域,代码从这里开始就可以了
buffer[0]:=#0;
DragQueryFile(Msg.WParam,0,buffer,sizeof(buffer)); //获取拖入文件名称
label1.Caption:=PChar(@buffer);//字符数组转换成字符串
edit1.Text:=PChar(@buffer);
end;
end;
多文件拖拽:
procedure TForm1.TFfile(var Msg: TMessage);
var
FilesCount: Integer;// 文件总数
i: Integer;
buffer:array[0..1024] of Char;
begin
try
buffer[0]:=#0;
FilesCount:=DragQueryFile(Msg.WParam, $FFFFFFFF,nil,0); //获取文件个数
Memo1.Lines.Add('文件总数为:'+IntToStr(FilesCount));
// 循环获取文件名
for i:=0 to FilesCount-1 do
begin
DragQueryFile(Msg.WParam, i, buffer,256); //获取拖拽文件路径名称
Memo1.Lines.Add(buffer);
end;
finally
DragFinish(Msg.WParam);
end;
end;