穷啊,请大家帮忙,把文件拖到自的程序中!(30分)

  • 主题发起人 主题发起人 flycity
  • 开始时间 开始时间
F

flycity

Unregistered / Unconfirmed
GUEST, unregistred user!
我要把一个文件拖到自己的程序中再对他进行处理,其实只要得到文件的文件名就行了,应该怎么做?我试过dragacceptfiles等API函数,
但是系统都不认识dragacceptfiles函数这是为什么?
 
你要先 uses ShellAPI;
:)
 
穷吧:哪来看看我的问题,挣点分啊。
 
能写源码给我吗?我不会用那几个API[:)]
 
倒~你查帮助不就行了?你这样是很难提高的,就算你英语差,
你开着金山词霸慢慢看,收获也要大得多,不管是英语还是程序
 
举个例子:
procedure TMyBook.FormShow(Sender: TObject);
begin

DragAcceptFiles(Handle, True);
if (ParamCount > 0) and FileExists(ParamStr(1)) then

begin

caption:=caption+' '+paramstr(1);
Openf(ParamStr(1));
end;

end;
 
procedure TForm1.BitBtn4Click(Sender: TObject);
const b:boolean=true;
begin


if b then

begin

b:=false;
DragAcceptFiles(self.memo1.Handle,true);
TbitBtn(sender).Caption :='拖动有效';
hand:=getwindowlong(self.Memo1.Handle,gwl_wndproc);
setwindowlong(self.Memo1.Handle,gwl_wndproc,longint(@Nwndproc));
end
else

begin

b:=true;
dragacceptfiles(self.Memo1.Handle,false);
TbitBtn(sender).Caption :='拖动无效';
setwindowlong(self.Memo1.Handle ,gwl_wndproc,hand);
end;

// application.OnMessage :=appmessage;
end;

 
得到文件名的过程:
var hand:longint;
function Nwndproc(handle,msg,wparam,lparam:longint):Longint;stdcall;
var i,len:integer;
fname:string;
begin

if msg=wm_dropfiles then

begin

for i:=0 to dragqueryfile(wparam,dword(-1),nil,0)-1do
//当第二个
//参数为$FFFFFFFF,时返回拖动文件数。
begin

len:=dragqueryfile(wparam,i,nil,0)+1;//当第三个参数为nil时返回文件名的长度
setlength(fname,len);
dragqueryfile(wparam,i,pchar(fname),len);//当第三个参数不为nil时,返回拖动
//的文件中第i 个的文件的文件名。
form1.Memo1.Lines.Add(fname);
shellexecute(form1.Memo1.Handle ,'',pchar(fname),'','',sw_show);

end;

dragfinish(wparam);
end;

result:=callwindowproc(pointer(hand),handle,msg,wparam,lparam);
end;

呵,又要改了。
 
谢谢大家的关注,我不是不想看帮助只是有些帮助没有例子,所以不知如果写中间的参数。比如说
dragqueryfile中的第一个说是文件的句柄,第二个是文件索引号,。。我不知道要写什么参数。[:(][:(]
 
照下面的例子做就可以了,已经非常详细了,除了支持拖动文件到窗口,还支持拖动文件到程序的图标。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
procedure WMDropFiles(var Msg: TWMDropFiles);
message WM_DROPFILES;
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation
uses ShellApi;
{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
begin

DragAcceptFiles(Handle, True);
if (ParamCount > 0) and FileExists(ParamStr(1)) then

begin

caption:=caption+' '+paramstr(1);
Memo1.Lines.LoadFromFile(ParamStr(1));
end;

end;


procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
CFileName: array[0..MAX_PATH] of Char;
begin

try
if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then

begin

caption:=cfilename;
Memo1.Lines.LoadFromFile(CFileName);
Msg.Result := 0;
end;

finally
DragFinish(Msg.Drop);
end;

end;


end.

 
多人接受答案了。
 
//不知如果写中间的参数。比如说dragqueryfile中的第一个说是文件的句柄,第二个是文件索引号
那你直接这样问,不是也好的多吗?:)
 
后退
顶部