如何把FTP上传这个事件写在线程里?如果一次传多个文件怎么办?这个上传用的是WIN32 INTERNET API
procedure TForm1.btnUploadClick(Sender: TObject);
var
RemoteFile: String ;
LocalFile: String ;
sFile: String ;
FTPPath: String ;
i: integer ;
blnReturn: boolean ;
dwInternetFlags: DWORD ;
begin
if (hConnect <> nil) then
begin
FTPPath := GetFTPDirectory(hConnect) ;
SFILE(要上传的文件名)
LocalFile := localDir + sFile ;
RemoteFile := FTPPath + sFile ;
StatusBar1.Panels[0].Text := 'Uploading' ;
blnReturn := FtpPutFile(hConnect,
pchar(LocalFile),
pchar(RemoteFile),
dwInternetFlags,
$0) ;
end ;
end ;
end;
procedure TForm1.btnUploadClick(Sender: TObject);
var
RemoteFile: String ;
LocalFile: String ;
sFile: String ;
FTPPath: String ;
i: integer ;
blnReturn: boolean ;
dwInternetFlags: DWORD ;
begin
if (hConnect <> nil) then
begin
FTPPath := GetFTPDirectory(hConnect) ;
SFILE(要上传的文件名)
LocalFile := localDir + sFile ;
RemoteFile := FTPPath + sFile ;
StatusBar1.Panels[0].Text := 'Uploading' ;
blnReturn := FtpPutFile(hConnect,
pchar(LocalFile),
pchar(RemoteFile),
dwInternetFlags,
$0) ;
end ;
end ;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdFTP, FileCtrl,IdFTPCommon, ExtCtrls, ComCtrls,IdFTPList,
ImgList,IdGlobal,StrUtils, ShellCtrls, Buttons, xmldom, XMLIntf,
msxmldom, XMLDoc,comobj,activex;type
TMyFirstThread = class(TThread)
private protected
procedure Execute;override;
procedure fail;
procedure succeed;
end;type
TForm1 = class(TForm)
IdFTP1: TIdFTP;
ImageList1: TImageList;
ImageList2: TImageList;
Panel4: TPanel;
ListBox1: TListBox;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Button2: TButton;
Button1: TButton;
Panel2: TPanel;
ProgressBar2: TProgressBar;
Panel5: TPanel;
ProgressBar1: TProgressBar;
Label1: TLabel;
Label2: TLabel;
XMLDocument1: TXMLDocument;
procedure Button2Click(Sender: TObject);
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
procedure FormCreate(Sender: TObject);
procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
ByteCount:Integer;
YUpLoadByte:integer;
FileSize:Integer;
vsFileName:string;
j:integer;
procedure Update(Sender:TObject);
procedure NewXML(xmlfilename:string);
public
Thread1:TMyFirstThread;
end;var
Form1: TForm1;implementationuses U_ModalDialog;{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
Button1.Enabled:=False;
Button2.Enabled:=False;
for i:=0 to ListBox1.Items.Count-1 do
begin
ProgressBar2.Max:=ProgressBar2.Max+FileSizeByName(ListBox1.Items[i]);
end;
if not Assigned(Form2) then
Form2:=TForm2.Create(Application);
Form2.Show;
Thread1:=TMyFirstThread.Create(False);
Thread1.Priority:=tpNormal;
Thread1.OnTerminate:=Update;
Thread1.FreeOnTerminate:=True;
end;
procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ProgressBar1.Position:=AWorkCount;
ProgressBar2.Position:=AWorkCount+YUpLoadByte;
end;procedure TForm1.FormCreate(Sender: TObject);
var Ls:TStringList;
begin
ByteCount:=0;
YUpLoadByte:=0;
IdFTP1.Host:='220.192.76.64';
IdFTP1.Port:=2020;
IdFTP1.Username:='aa';
IdFTP1.Password:='123';
try
IdFTP1.Connect;
except
Application.MessageBox('连接服务器失败,请检查与服务器的连接','提示',64);
Close;
end;
Ls:=TStringList.Create;
IdFTP1.List(Ls);
Ls.Free;
end;{ TMyFirstThread }procedure TMyFirstThread.Execute;
var i:integer;
vsStr:string;
begin
for i:=0 to Form1.ListBox1.Items.Count-1 do
begin
Form1.ProgressBar1.Position:=0;
Form1.ByteCount:=FileSizeByName(Form1.ListBox1.Items[i]);
Form1.ProgressBar1.Max:=Form1.ByteCount;
try
Form1.IdFTP1.Put(Form1.ListBox1.Items[i],Form1.IdFTP1.RetrieveCurrentDir+'/UpLoad/'+ExtractFileName(Form1.ListBox1.Items[i]));
Form1.vsFileName:=ExtractFileName(Form1.ListBox1.Items[i]);
vsStr:=Copy(Form1.vsFileName,1,LastDelimiter('.',Form1.vsFileName)-1);
Form1.NewXML(vsStr);
Form1.IdFTP1.Put(ExtractFilePath(Application.Exename)+'XML\'+vsStr+'.xml',Form1.IdFTP1.RetrieveCurrentDir+'/UpLOad/'+vsStr+'.xml');
Form1.IdFTP1.Quote('ExecXML');
Form1.j:=i;
Synchronize(succeed);
except
Synchronize(fail);
end;
Sleep(1);
end;
end;procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
FileSize:=AWorkCountMax;
end;procedure TForm1.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
YUpLoadByte:=YUpLoadByte+FileSize;
end;procedure TMyFirstThread.succeed;
begin
Form1.ListBox1.Items[Form1.j]:='@_@ '+Form1.vsFileName+'上传成功!';
end;procedure TMyFirstThread.fail;
begin
Form1.ListBox1.Items[Form1.j]:=':o '+Form1.vsFileName+'上传失败!';
end;procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
if OpenDialog1.Execute then
begin
for i:=0 to OpenDialog1.Files.Count-1 do
begin
ListBox1.Items.Add(OpenDialog1.Files[i]);
end;
Button2.Enabled:=True;
end
else
begin
Application.MessageBox('请选择要上传的文件','提示',64);
Exit;
end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Form2<>nil then
begin
if Application.MessageBox('正在上传文件,是否要终止上传?','提示',MB_OkCancel+MB_IconQuestion)=ID_CANCEL then
Action:=caNone
else
Action:=caFree;
end;
end;procedure TForm1.Update(Sender: TObject);
begin
Form2.Close;
Form1.Button1.Enabled:=True;
Form1.Button2.Enabled:=True;
end;procedure TForm1.NewXML(xmlfilename:string);
var i:integer;
node:IXMLNode;
begin
CoInitialize(nil);
XMLDocument1.Active:=True;
node:=XMLDocument1.DocumentElement;
if node.NodeName='File' then
begin
for i:=0 to node.ChildNodes.Count-1 do
begin
node.ChildNodes[i].Text:='ssss';
end;
end;
XMLDocument1.SaveToFile(ExtractFilePath(Application.Exename)+'XML\'+xmlfilename+'.xml');
CoUnInitialize;
end;end.楼主,这是我写的上传的代码,把上传文件写到线程里了.