Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2015, 11:49   #1
HenryTeylor
Новичок
Джуниор
 
Регистрация: 22.04.2015
Сообщений: 1
Вопрос Скачать файл в потоке

Здравствуйте уважаемые форумчане. Появился такой вопрос. Как сделать так что бы при нажатии на кнопку скачивался один файл. Соответственно при нажатии на второй кнопку скачивается второй файл. Вот код того, как я реализовал на одну кнопку. Просьба помочь со второй и т.д

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, IdAntiFreezeBase, IdAntiFreeze,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    IdAntiFreeze1: TIdAntiFreeze;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
  TDownload = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  Down: TDownload;

implementation

{$R *.dfm}

{ TDownload }

procedure TDownload.Execute;
var
Stream: TMemoryStream;
begin
Stream:= TMemoryStream.Create;
  try
  Form1.IdHTTP1.Get('Ссылка на файл', stream);
  stream.SaveToFile('Название');
  finally
  stream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Down:=Tdownload.Create(false);
end;

procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
ProgressBar1.Position:=AworkCount;
end;

procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
ProgressBar1.Position:=0;
ProgressBar1.Max:=AworkCountMax;
end;

procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position:=0;
end;

end.
HenryTeylor вне форума Ответить с цитированием
Старый 10.06.2015, 23:44   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Примерно так.

Код:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    IdHTTP1: TIdHTTP;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    Link: string;
    SaveFiles: String;
    procedure IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
  procedure IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function DownloadThead(Param: Pointer): Integer;
var
Stream: TMemoryStream;
IdHTTP: TIdHTTP;
begin
Stream:= TMemoryStream.Create;
IdHTTP:= TIdHTTP.Create(nil);
IdHTTP.OnWork:= TForm1(Param).IdHTTPWork;
IdHTTP.OnWorkBegin:= TForm1(Param).IdHTTPWorkBegin;
  try
  IdHTTP.Get(TForm1(Param).Link, stream);
  stream.SaveToFile(TForm1(Param).SaveFiles);
  finally
  stream.Free;
  IdHTTP.free;
  endthread(0);
  end;
end;

procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
ProgressBar1.Position:=AworkCount;
end;

procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
ProgressBar1.Position:=0;
ProgressBar1.Max:=AworkCountMax;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
hDownloadThead, ThId: Dword;
begin
Link:= 'http://img.imgsmail.ru/r/agent/favicon.ico';
SaveFiles:= 'C:\11111.jpg';
hDownloadThead:= BeginThread(nil, 0, @DownloadThead, Self, 0, ThId);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
hDownloadThead, ThId: Dword;
begin
Link:= 'http://img.imgsmail.ru/ru/images/agent/nv/logo_green_big_no_text.jpg';
SaveFiles:= 'C:\2222.jpg';
hDownloadThead:= BeginThread(nil, 0, @DownloadThead, Self, 0, ThId);
end;

Последний раз редактировалось Aliens_wolfs; 11.06.2015 в 00:05.
Aliens_wolfs вне форума Ответить с цитированием
Старый 11.06.2015, 11:07   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я предпочитаю:
Код:
procedure TDownload.Execute;
var
Stream: TMemoryStream;
begin
Stream:= TMemoryStream.Create;
With TIDHTTP.Create do begin
  try
    Get('Ссылка на файл', stream);
    stream.SaveToFile('Название');
  Except
   on e:Exception do ShowMessage(e.Message);
  end;
 free;
end;
   stream.Free;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2015, 11:27   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

а я предпочитаю юзать TIdThreadComponent
и к примеру код Stilet'a вставить в OnRun
ZuBy вне форума Ответить с цитированием
Старый 14.06.2015, 22:02   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Либо с классом потока в чем вы и делаете
Код:
TDownload = class(TThread)
  private
     FFileDownload: string; 
     FFileSave: string;
     constructor Create(FileDownload, FileSave: string); virtual;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TDownload }

constructor TDownload.Create(FileDownload, FileSave: string);
begin
  FFileDownload:= FileDownload;
  FFileSave:= FileSave;
  FreeOnTerminate := True; // это нужно чтобы поток после завершения уничтожался сам
  inherited Create(false);
end;

//Код что выше написал Stilet ну можно и мой, единственно в моем нет обработки ошибки
procedure TDownload.Execute;
var
Stream: TMemoryStream;
begin
Stream:= TMemoryStream.Create;
With TIDHTTP.Create(nil) do 
begin
  try
    Get(FFileDownload, stream);
    stream.SaveToFile(FFileSave);
  Except
   on e:Exception do ShowMessage(e.Message);
  end;
 free;
end;
   stream.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TDownload.Create('http://img.imgsmail.ru/r/agent/favicon.ico', 'C:\11111.jpg');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TDownload.Create('http://img.imgsmail.ru/ru/images/agent/nv/logo_green_big_no_text.jpg', 'C:\222.jpg');
end;
И так далее сколько нужно файлов качать столько потоков и будет

Последний раз редактировалось Aliens_wolfs; 14.06.2015 в 23:03.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать файл KaDima28 JavaScript, Ajax 1 29.12.2014 07:41
Возможно ли, передать по сети (в потоке), и не сохраняя в файл (длл), использовать исполняемый код? alextrof94 Общие вопросы Delphi 3 30.10.2013 18:33
Как из метода X в потоке А, вызвать метод Y и чтобы он работал в потоке B ? lawliet93 C# (си шарп) 0 09.03.2013 18:16
curl: скачать файл WebbMan C/C++ Сетевое программирование 2 23.04.2011 15:21
Скачать файл... Romix Работа с сетью в Delphi 1 28.07.2010 09:37