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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2010, 21:03   #1
fezilk24
Заблокирован
 
Регистрация: 16.11.2009
Сообщений: 85
По умолчанию Скачивание файла

Помогите, пожалуйста:
Нужно скачать файл из интернета по прямой ссылке.

При этом: программа не должна "зависать", пока скачивается файл;
Должен корректно отображаться progressbar.

PS. Поиск юзал. Нет, смотрел хорошо. Точно хорошо!
PPS. http://www.delphi.int.ru/articles/39/ <- не работает, писалось для 2006, у меня же 2009.

"Написать за меня" не предлагаю, хотя от кода не откажусь.
fezilk24 вне форума Ответить с цитированием
Старый 14.06.2010, 21:30   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Скачивание в отдельном потоке

ПОлучилось почти как http://www.delphi.int.ru/articles/39/
Просто не открывался сайт =)
Но пусть останется.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    Edit1: TEdit;
    Label1: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TCriricalThread = class(TThread)
  private
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  CriricalThread: TCriricalThread;
begin
  CriricalThread:=TCriricalThread.Create(true);
  CriricalThread.Resume;
end;

{ TCriricalThread }

procedure TCriricalThread.Execute;
var
  fs : TFileStream;
begin
  fs := TFileStream.Create('c:\1.txt',fmCreate or fmOpenReadWrite);
  form1.IdHTTP1.Get(form1.Edit1.Text,fs);
  MessageBox(Application.Handle,'Скачано','Готово',0);
  fs.Free;
end;

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

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

end.

Последний раз редактировалось kangreon; 14.06.2010 в 21:38.
kangreon вне форума Ответить с цитированием
Старый 14.06.2010, 21:56   #3
fezilk24
Заблокирован
 
Регистрация: 16.11.2009
Сообщений: 85
По умолчанию

Спасибо, сейчас попробую.
fezilk24 вне форума Ответить с цитированием
Старый 14.06.2010, 22:30   #4
fezilk24
Заблокирован
 
Регистрация: 16.11.2009
Сообщений: 85
По умолчанию

Код:
TCriricalThread = class(TThread)
  private
  protected
    procedure Execute; override;
  end;
вылетает ошибка, класс этот дельфи вобще не понимает
fezilk24 вне форума Ответить с цитированием
Старый 14.06.2010, 22:36   #5
fezilk24
Заблокирован
 
Регистрация: 16.11.2009
Сообщений: 85
По умолчанию

Вот, что-то наисправлял, заработало. Файл качается, но прогрессбар не показывает ничего.

и еще.. качался файл mp3, сообщение "Скачано" вышло, но windows media не хочет проигрывать, говорит "кодек не знаю"
fezilk24 вне форума Ответить с цитированием
Старый 14.06.2010, 22:39   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

который этот?
код верный.
не забывайте что обьявление класса относится к секции type
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.06.2010, 22:40   #7
fezilk24
Заблокирован
 
Регистрация: 16.11.2009
Сообщений: 85
По умолчанию

Код верный, я в начале удалил лишнее что-то просто, потом заново сделал - работает, но

#5
fezilk24 вне форума Ответить с цитированием
Старый 14.06.2010, 22:56   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, winInet;//вроде тут все.

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TCriricalThread = class(TThread)
  private
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var T:TCriricalThread;

procedure TForm1.Button1Click(Sender: TObject);
begin
  T:=TCriricalThread.Create(false);
end;

{ TCriricalThread }

function GetInetFile(const fileURL, FileName: String): boolean;  
const BufferSize = 1024;  
var hSession, hURL: HInternet;  
Buffer: array[1..BufferSize] of Byte;  
BufferLen: DWORD;  
f: File;  
sAppName: string;  
begin  
  Result:=False;  
  sAppName := ExtractFileName(Application.ExeName);  
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,  
     nil, nil, 0);  
  try  
   hURL := InternetOpenURL(hSession,  
   PChar(fileURL),nil,0,0,0);  
   try  
     AssignFile(f, FileName);  
     Rewrite(f,1);  
     repeat  
      InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);  
      BlockWrite(f, Buffer, BufferLen)  
     until BufferLen = 0;  
     CloseFile(f);  
     Result:=True;  
   finally  
   InternetCloseHandle(hURL)  
   end  
  finally  
  InternetCloseHandle(hSession)  
  end  
end;

procedure TCriricalThread.Execute;
begin
  GetInetFile(form1.Edit1.Text,'c:\1.mp3');
  MessageBox(Application.Handle,'Скачано','Готово',0);
end;

end.
вот еще вариант.

кстати и в первом коде, попробуй заменить

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  CriricalThread: TCriricalThread;
begin
  CriricalThread:=TCriricalThread.Create(true);
  CriricalThread.Resume;
end;
на
Код:
var T:TCriricalThread;

procedure TForm1.Button1Click(Sender: TObject);
begin
  T:=TCriricalThread.Create(false);
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.06.2010, 23:50   #9
fezilk24
Заблокирован
 
Регистрация: 16.11.2009
Сообщений: 85
По умолчанию

Большое спасибо, вопрос решен.
fezilk24 вне форума Ответить с цитированием
Старый 16.06.2010, 17:11   #10
Gumer
Пользователь
 
Регистрация: 16.01.2010
Сообщений: 43
По умолчанию

Если качать через idhttp, то, чтобы программа не зависала, достаточно добавить на форму компонент idantifreeze из вкладки indy misc.
Gumer вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачивание файла из интернета по ссылке smith45 Microsoft Office Excel 24 24.01.2012 13:15
Скачивание файла winsock Horus92 Работа с сетью в Delphi 13 25.02.2011 13:29
Частичное скачивание файла Usov Работа с сетью в Delphi 1 19.10.2009 21:45
Скачивание файла Lemo Помощь студентам 16 28.07.2009 22:54
Скачивание файла с прогрессом CoDeR Работа с сетью в Delphi 2 22.10.2007 09:10