Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/68: Рейтинг темы: голосов - 68, средняя оценка - 4.90
26 / 26 / 24
Регистрация: 08.07.2013
Сообщений: 125
1

Скачивание файлов из интернета с прогресс-баром при использовании indy

08.07.2013, 10:59. Показов 14231. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, участники и гости форума.
В моей программе мне нужно реализовать скачивание файлов с прогресс-баром. Использую indy. Маленькие файлы (1-2мб) скачиваются хорошо, а вот если я хочу загрузить большой файл (допустим, 15 мб), то при нажатии на кнопку "Скачать" Delphi выдает мне ошибку, мол я делю на ноль (EDivByZero), хотя никакого деления конкретно в моей программе нет. И главное, что не указывает ни на какую строку с ошибкой.
Вот кусок кода:
Delphi
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
procedure TForm1.Button1Click(Sender: TObject);
var LoadStream: TMemoryStream;
begin
 Button1.Visible:=False;
 LoadStream := TMemoryStream.Create;
 idHTTP1.Get('ссылочка моя', LoadStream);
 LoadStream.SaveToFile('куда сохраняем');
 LoadStream.Free;
end;
 
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
AdvancedProgressBar1.Position:=AWorkCount;
end;
 
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
AdvancedProgressBar1.Max:=AWorkCountMax;
end;
 
procedure TForm1.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
Button2.Visible:=True;
end;
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2013, 10:59
Ответы с готовыми решениями:

Скачивание файлов по очереди с прогресс баром
У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но...

WebClient скачивание нескольких файлов с общим прогресс баром
Ребят, использую WebClient, нужно реализовать скачивание двух-трёх файлов и сделать вывод процесса...

Переименование файлов с прогресс баром
Есть код, который переименовывает файлы находящиеся в папке любых расширений в порядке возрастания...

Отправка/получение файлов на FTP с прогресс баром
Добрый день всем! перерыл кучу ресурсов (в том числе) и этот. Но ничего (рабоающего) не нашел....

36
Эксперт Pascal/Delphi
4913 / 2782 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
08.07.2013, 11:04 2
Цитата Сообщение от StafordDev Посмотреть сообщение
хотя никакого деления конкретно в моей программе нет
с чего Вы так решили?
0
26 / 26 / 24
Регистрация: 08.07.2013
Сообщений: 125
08.07.2013, 11:05  [ТС] 3
Цитата Сообщение от droider Посмотреть сообщение
с чего Вы так решили?
С того, что в приведенном мною куске нету математических функций (вроде бы).
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
08.07.2013, 11:18 4
Свойство max установите на кол-во всех байт в файле, свойство position на прогресс скачивания.
0
26 / 26 / 24
Регистрация: 08.07.2013
Сообщений: 125
08.07.2013, 11:27  [ТС] 5
Цитата Сообщение от саша40 Посмотреть сообщение
Свойство max установите на кол-во всех байт в файле, свойство position на прогресс скачивания.
Вы хотите сказать, что у меня это не установлено?
Код
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
AdvancedProgressBar1.Position:=AWorkCount;
end;
 
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
AdvancedProgressBar1.Max:=AWorkCountMax;
end;
0
Заблокирован
08.07.2013, 12:48 6
Сдаётся мне, там тупо слишком большие числа для position и max, кривые прогрессбары этим страдают. Сведи всё к 0:100.
0
26 / 26 / 24
Регистрация: 08.07.2013
Сообщений: 125
08.07.2013, 13:08  [ТС] 7
Цитата Сообщение от Dr_Quake Посмотреть сообщение
Сведи всё к 0:100.
Не подскажете, как лучше сделать? Я пробовал делить AWorkCount и AWorkCountMax на некое число, но увы, проблема осталасью
0
134 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
08.07.2013, 13:35 8
примерно так
Delphi
1
2
AdvancedProgressBar1.Max:=100;
AdvancedProgressBar1.Position:=round(AWorkCount/(AWorkCountMax/AdvancedProgressBar1.Max));
Добавлено через 14 минут
только вот у вас переменные локальные, это выражение нужно присвоить какой-нибудь глобальной переменной:
Delphi
1
i:=round(AWorkCountMax/AdvancedProgressBar1.Max);
ну и соответственно итоговое будет примерно таким:
Delphi
1
AdvancedProgressBar1.Position:=round(AWorkCount/i);
0
26 / 26 / 24
Регистрация: 08.07.2013
Сообщений: 125
08.07.2013, 16:47  [ТС] 9
Цитата Сообщение от Ev1l Посмотреть сообщение
примерно так
Delphi
1
2
AdvancedProgressBar1.Max:=100;
AdvancedProgressBar1.Position:=round(AWorkCount/(AWorkCountMax/AdvancedProgressBar1.Max));
Добавлено через 14 минут
только вот у вас переменные локальные, это выражение нужно присвоить какой-нибудь глобальной переменной:
Delphi
1
i:=round(AWorkCountMax/AdvancedProgressBar1.Max);
ну и соответственно итоговое будет примерно таким:
Delphi
1
AdvancedProgressBar1.Position:=round(AWorkCount/i);
Объявил глобальную переменную i с типом int64, присвоил ей значение в процедуре OnWorkBegin, подставил последнюю строчку в OnWork. Теперь немного другая ошибка: EZeroDivide. И еще теперь дебаггер указывает на процедуру TIdComponent.DoWork в IdComponent.pas, конкретно - на последний end.
0
Заблокирован
08.07.2013, 16:50 10
Выложи наконец полный код, а лучше проект. Косяк то явно не в этом.
0
134 / 133 / 22
Регистрация: 29.08.2012
Сообщений: 353
08.07.2013, 17:02 11
Цитата Сообщение от StafordDev Посмотреть сообщение
И еще теперь дебаггер указывает на процедуру
а какое значение дебагер вам показывает у переменной i за шаг до ошибки? пологаю что у вас значение AWorkCountMax местами равно 0, тогда i=0 / 100, ну и соответственно в DoWork выпадает i=0; и сразу станет ясно почему у вас раньше возникала проблеммма с делением...
0
Заблокирован
08.07.2013, 17:06 12
Тогда бы у него изначальный код работал. Хотя если и то, и то...
0
Ev1l
08.07.2013, 17:09
  #13

Не по теме:

Цитата Сообщение от Dr_Quake Посмотреть сообщение
Тогда бы у него изначальный код работал. Хотя если и то, и то...
разве что AWorkCount>0, и он пытается в пб 0..0 присвоить позицию >0(это про изначальный код)

0
Заблокирован
08.07.2013, 17:11 14
Вообще говоря, никто не мешает пройти цикл руками в дебаггере если неохота выкладывать код, не вижу никаких проблем посмотреть глазами что там не так.
0
26 / 26 / 24
Регистрация: 08.07.2013
Сообщений: 125
08.07.2013, 20:42  [ТС] 15
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AdvancedProgressBar, StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, IdAntiFreezeBase, IdAntiFreeze;
 
type
  TForm1 = class(TForm)
    AdvancedProgressBar1: TAdvancedProgressBar;
    Button1: TButton;
    Label1: TLabel;
    IdHTTP1: TIdHTTP;
    IdAntiFreeze1: TIdAntiFreeze;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  i:Int64;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage('Я вас обманул, вы не поиграете!');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var LoadStream: TMemoryStream;
begin
 Button1.Visible:=False;
 LoadStream := TMemoryStream.Create;
 idHTTP1.Get('http://filebeam.com/download2.php?a=b2701b7c92f209bf1a3bc865bd31ee26&b=e940ce17343ab0b12fd605e040a3d715', LoadStream);
 LoadStream.SaveToFile('C:\YTDB_0.14.3_R600_MaNGOS_R11581_SD2_R2151_ACID_R308_RuDB_R39.7z');
 LoadStream.Free;
end;
 
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
AdvancedProgressBar1.Position:=round(AWorkCount/i);
end;
 
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
AdvancedProgressBar1.Max:=100;
i:=round(AWorkCountMax/AdvancedProgressBar1.Max);
end;
 
procedure TForm1.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
Label1.Caption:='Загрузка завершена, теперь вы можете войти в игру';
Button2.Visible:=True;
end;
 
end.
Вот весь код.
p.s. возможно ли менять цвет полоски progressbar не используя новые компоненты?
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
08.07.2013, 21:37 16
Цитата Сообщение от StafordDev Посмотреть сообщение
Не подскажете, как лучше сделать? Я пробовал делить AWorkCount и AWorkCountMax на некое число, но увы, проблема осталасью
Вычисляй это в процентах. AWorkCountMax за 100%
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
08.07.2013, 21:40 17
Цитата Сообщение от StafordDev Посмотреть сообщение
возможно ли менять цвет полоски progressbar не используя новые компоненты?
Delphi
1
  PostMessage(ProgressBar1.Handle, $0409, 0, clGreen);
1
26 / 26 / 24
Регистрация: 08.07.2013
Сообщений: 125
09.07.2013, 09:34  [ТС] 18
Цитата Сообщение от FIL Посмотреть сообщение
Delphi
1
  PostMessage(ProgressBar1.Handle, $0409, 0, clGreen);
Спасибо, а цвет заднего фона прогресс-бара?

Добавлено через 2 минуты
Цитата Сообщение от саша40 Посмотреть сообщение
Вычисляй это в процентах. AWorkCountMax за 100%
Опять же, как это сделать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32850 / 21185 / 8150
Регистрация: 22.10.2011
Сообщений: 36,437
Записей в блоге: 8
09.07.2013, 09:39 19
Delphi
1
2
PostMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clGreen); // Цвет прогресса
PostMessage(ProgressBar1.Handle, PBM_SETBKCOLOR, 0, clYellow); // Цвет фона
, отучайтесь использовать "магические числа"... Ни к чему хорошему их использование не приведет.

Кстати, если разрешены темы оформления - это всё не будет работать, плевать Windows хотела на все эти PBM_SETBARCOLOR и PBM_SETBKCOLOR:
When visual styles are enabled, this message has no effect.
1
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
09.07.2013, 10:17 20
Если что, константы описаны в модуле CommCtrl.
Но установка цвета фона у меня не работает в Д7.
0
09.07.2013, 10:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2013, 10:17
Помогаю со студенческими работами здесь

Скачивание файла из интернета: отобразить прогресс
Sub DownloadFile(dfn As String) 'dfn - Dolwnload File Name wc.DownloadFileAsync(New...

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

Вывести скачивание файлов в отдельный поток и отобразить прогресс в ProgressBar'е
Добрый всем день. Хочу вывести скачивание файлов в отдельный поток и отобразить прогресс в...

Проблемы со прогресс баром
Нашел в интернете вот такой скрипт прогресс бар. При нажатие на кнопку появляется вверху бар...

Ребят подскажите с прогресс баром
Мне нужно чтобы при полном запонении прогресс бара вылетало сообщение и прогресс бар обнулялся. И...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru