10.12.2018, 22:18
|
Прохожий
|
|
Регистрация: 10.12.2018
Сообщения: 2
Версия Delphi: 10.3 CE
Репутация: 10
|
|
Цитата:
Сообщение от Aqel
Файл (по пути) должен сохраняться вместе с программой.
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP;
const
MY_MESS = WM_USER + 100;
type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
SaveDialog1: TSaveDialog;
Button2: TButton;
IdHTTP1: TIdHTTP;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure thrTerminate(Sender: TObject);
procedure MyProgress(var msg: TMessage); message MY_MESS;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TDownLoader = class(TThread)
private
FToFolder: string;
FURL: string;
protected
procedure Execute; override;
public
property URL: string read FURL write FURL;
property ToFolder: string read FToFolder write FToFolder;
procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog1.FileName := copy(Edit1.Text, LastDelimiter('\/', Edit1.Text) +
1, maxint);
if SaveDialog1.Execute then
Edit2.Text := SaveDialog1.FileName;
end;
{ TDownLoader }
procedure TDownLoader.Execute;
var
http: TIdHTTP;
str: TFileStream;
begin
// Создим класс для закачки
http := TIdHTTP.Create(nil);
http.OnWork := IdHTTP1Work;
http.OnWorkBegin := IdHTTP1WorkBegin;
http.OnWorkEnd := IdHTTP1WorkEnd;
// каталог, куда файл положить
ForceDirectories(ExtractFileDir(ToFolder));
// Поток для сохранения
str := TFileStream.Create(ToFolder, fmCreate);
try
// Качаем
http.Get(URL, str);
finally
// Нас учили чистить за собой
http.Free;
str.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
d: TDownLoader;
begin
// Создадим класс потока.
// Поток для начала будет остановлен
d := TDownLoader.Create(true);
// Передадим параметры потоку
d.URL := Edit1.Text;
d.ToFolder := Edit2.Text;
// Поток должен удалить себя по завершению своей работы
d.FreeOnTerminate := true;
d.OnTerminate := thrTerminate;
// И запустим его на закачку.
d.Start;
// Теперь с процедуры мы выйдем, но поток работает
// и живёт своей жизней
end;
procedure TForm1.MyProgress(var msg: TMessage);
begin
case msg.WParam of
0:
begin
ProgressBar1.Max := msg.LParam;
ProgressBar1.Position := 0;
end;
1:
ProgressBar1.Position := msg.LParam;
end;
end;
procedure TForm1.thrTerminate(Sender: TObject);
begin
ShowMessage('Готово');
end;
procedure TDownLoader.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
PostMessage(Application.MainForm.Handle, MY_MESS, 1, AWorkCount);
end;
procedure TDownLoader.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
PostMessage(Application.MainForm.Handle, MY_MESS, 0, AWorkCountMax);
end;
procedure TDownLoader.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
//
end;
end.
Поправил, все норм сохраняет туды куды в диалоге выбрал!
линк должен быть http:// онли!
|