Показать сообщение отдельно
  #7  
Старый 10.12.2018, 22:18
slaidouh77 slaidouh77 вне форума
Прохожий
 
Регистрация: 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:// онли!
Ответить с цитированием