1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| unit filedownload;
{$mode objfpc}{$H+}
{
Download file via indy.
Copyright Marty ( neodivx@neodivx.be )
2008/01/28
}
interface
uses
Classes, SysUtils,Forms,idHTTP,IdComponent;
type
TFileDownloadEvent=procedure(Sender:TObject;_position,_min,_max:Double) of object;
TFileDownload=class(TComponent)
private
FFileDownloadEvent:TFileDownloadEvent;
FMax:Double;
FRunning:Boolean;
FHTTP:TidHTTP;
FStream:TFileStream;
FFileFrom,FFileTo:string;
private
procedure CmMessage(_position,_min,_max:Double);
procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64);
procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;AWorkCount: Int64);
procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
function Run:Boolean;
public
property OnFileDownload:TFileDownloadEvent read FFileDownloadEvent write FFileDownloadEvent;
property Running:Boolean read FRunning;
property FileFrom:string read FFileFrom write FFileFrom;
property FileTo:string read FFileTo write FFileTo;
end;
implementation
constructor TFileDownload.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
FRunning:=False;
FHTTP := TIdHTTP.create(nil);
FHTTP.OnWork:=@idHTTP1Work;
FHTTP.OnWorkBegin:=@idHTTP1WorkBegin;
FHTTP.OnWorkEnd:=@idHTTP1WorkEnd;
end;
destructor TFileDownload.Destroy;
begin
try
FHTTP.Free;
except
end;
inherited Destroy;
end;
procedure TFileDownload.CmMessage(_position,_min,_max:Double);
begin
if Assigned(FFileDownloadEvent) then begin
FFileDownloadEvent(Self,_position,_min,_max);
end;
Application.ProcessMessages;
end;
procedure TFileDownload.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64);
begin
FRunning:=True;
if AWorkMode = wmRead then begin
FMax:=AWorkCountMax;
CmMessage(0,0,AWorkCountMax);
end;
end;
procedure TFileDownload.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;AWorkCount: Int64);
begin
if AWorkMode = wmRead then begin
CmMessage(AWorkCount,0,FMax);
end;
end;
procedure TFileDownload.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
FRunning:=False;
if AWorkMode = wmRead then begin
CmMessage(FMax,0,FMax);
end;
end;
function TFileDownload.Run:Boolean;
begin
FStream:=TFileStream.Create(FFileTo,fmCreate or fmShareDenyNone);
FHTTP.Get(FFileFrom,FStream);
// correction 1
try
FStream.Free;
except
end;
Result:=True;
end;
end. |
Partager