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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 16:30   #1
god5
Катков Кирилл:)
Пользователь
 
Аватар для god5
 
Регистрация: 26.06.2012
Сообщений: 48
По умолчанию прогресс бар для функции

нужно сделать прогресс бар в процентах когда идет загрузка файла
вот используемая функция
Код:
function GetInetFiles(URLbase, SaveFolder: string; IDHTP: TIDHTTP): Boolean;
var
  S: string;
  I: Integer;
  L: TStringList;
  M: TMemoryStream;


begin
  Result:= False;
  L:= TStringList.Create;
  M:= TMemoryStream.Create;
 try

  if URLBase = '' then
   ShowMessage('URL база не найдена !')
  else
  L.LoadFromFile(URLBase);

finally
  for I:= 0 to L.Count -1  do 
  begin
   IDHTP.Get(L[i], M); 
   S:= ExtractFileName(StringReplace(L[i],'/','\',[rfReplaceAll])); 
   Form1.Mmo2.Lines.Add(S);
   if not DirectoryExists(SaveFolder) then CreateDir(SaveFolder); 
   M.SaveToFile(SaveFolder +'\'+ S ); 
   Application.ProcessMessages;
   M.Clear;  
  end;
  Result:= True; 
 end;
 end;


if GetInetFiles('URLBase.txt','exe',idhtp1) then

Последний раз редактировалось Stilet; 11.12.2012 в 16:38.
god5 вне форума Ответить с цитированием
Старый 11.12.2012, 17:53   #2
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Код:
  private
    FWorkCount: Integer;
    FWorkCountMax: Integer;
  public
    procedure WorkBegin(ASender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);   
    procedure WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
    procedure Work(ASender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
  end;

function ConvertBytes(Bytes: Integer): String;
begin
  if Bytes div 1024 < 1 then Result := FormatFloat('0.00 "Byte"', Bytes);
  if Bytes div 1024 >= 1 then Result := FormatFloat('0 "KB"', Bytes/1024);
  if Bytes div 1024 >= 1024 then Result := FormatFloat('0.00 "MB"', Bytes/1048576);
  if Bytes div 734003200 >= 1 then Result := FormatFloat('0.00 "GB"', Bytes/1073741824);
end;

procedure TForm1.WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin         
  FWorkCount := 0;
  FWorkCountMax := AWorkCountMax;
  ProgressBar.Position := 0;
  InfoLabel.Caption := Format('Размер: %s/%s',
    [ConvertBytes(FWorkCount), ConvertBytes(FWorkCountMax)]);
end;

procedure TForm1.WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  InfoLabel.Caption := 'Завершение загрузки';
end;

procedure TForm1.Work(ASender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  FWorkCount := AWorkCount;
  ProgressBar.Position := FWorkCount * 100 div FWorkCountMax;
  InfoLabel.Caption := Format('Размер: %s/%s',
    [ConvertBytes(FWorkCount), ConvertBytes(FWorkCountMax)]);
end;
Перед IDHTP.Get(L[i], M); добавить:
Код:
  IDHTP.OnWorkBegin := WorkBegin;
  IDHTP.OnWorkEnd := WorkEnd;
  IDHTP.OnWork := Work;

Последний раз редактировалось Lardes; 11.12.2012 в 18:15.
Lardes вне форума Ответить с цитированием
Старый 11.12.2012, 18:06   #3
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Для отображения прогресса используй TGauge
Lardes вне форума Ответить с цитированием
Старый 11.12.2012, 18:48   #4
god5
Катков Кирилл:)
Пользователь
 
Аватар для god5
 
Регистрация: 26.06.2012
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Lardes Посмотреть сообщение
Код:
  private
    FWorkCount: Integer;
    FWorkCountMax: Integer;
  public
    procedure WorkBegin(ASender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);   
    procedure WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
    procedure Work(ASender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
  end;

function ConvertBytes(Bytes: Integer): String;
begin
  if Bytes div 1024 < 1 then Result := FormatFloat('0.00 "Byte"', Bytes);
  if Bytes div 1024 >= 1 then Result := FormatFloat('0 "KB"', Bytes/1024);
  if Bytes div 1024 >= 1024 then Result := FormatFloat('0.00 "MB"', Bytes/1048576);
  if Bytes div 734003200 >= 1 then Result := FormatFloat('0.00 "GB"', Bytes/1073741824);
end;

procedure TForm1.WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin         
  FWorkCount := 0;
  FWorkCountMax := AWorkCountMax;
  ProgressBar.Position := 0;
  InfoLabel.Caption := Format('Размер: %s/%s',
    [ConvertBytes(FWorkCount), ConvertBytes(FWorkCountMax)]);
end;

procedure TForm1.WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  InfoLabel.Caption := 'Завершение загрузки';
end;

procedure TForm1.Work(ASender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  FWorkCount := AWorkCount;
  ProgressBar.Position := FWorkCount * 100 div FWorkCountMax;
  InfoLabel.Caption := Format('Размер: %s/%s',
    [ConvertBytes(FWorkCount), ConvertBytes(FWorkCountMax)]);
end;
Перед IDHTP.Get(L[i], M); добавить:
Код:
  IDHTP.OnWorkBegin := WorkBegin;
  IDHTP.OnWorkEnd := WorkEnd;
  IDHTP.OnWork := Work;
сделал выдает ошибку на work,end,begin
что не так)? и следующее сообщение ваше не понял) можно поподробнее)

видимо нужно что то прописать в uses или нужен компонент?)

Последний раз редактировалось god5; 11.12.2012 в 19:18.
god5 вне форума Ответить с цитированием
Старый 11.12.2012, 20:31   #5
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Цитата:
Сообщение от god5 Посмотреть сообщение
сделал выдает ошибку на work,end,begin
что не так)?
Тогда обработай события IdHTTP1 OnWorkBegin, OnWorkEnd , OnWork и пропиши в них код, который указан выше. Если не получится, вышлю исходник

Цитата:
Сообщение от god5 Посмотреть сообщение
и следующее сообщение ваше не понял) можно поподробнее)

видимо нужно что то прописать в uses или нужен компонент?)
Да, компонент Gauge, вкладка Samples. По теме: просили выводить в процентах, он для этой задачи и годится
Lardes вне форума Ответить с цитированием
Старый 11.12.2012, 21:17   #6
god5
Катков Кирилл:)
Пользователь
 
Аватар для god5
 
Регистрация: 26.06.2012
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Lardes Посмотреть сообщение
Тогда обработай события IdHTTP1 OnWorkBegin, OnWorkEnd , OnWork и пропиши в них код, который указан выше. Если не получится, вышлю исходник


Да, компонент Gauge, вкладка Samples. По теме: просили выводить в процентах, он для этой задачи и годится
большое тебе спасибо получилось) только 2 маленьких глупых вопроса)
где находится вообще в делфи infolabel))) я использовал обычный label потом что info никогда не пользовался) и с Gauge как % сделать )!!!)
god5 вне форума Ответить с цитированием
Старый 11.12.2012, 21:59   #7
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Цитата:
Сообщение от god5 Посмотреть сообщение
где находится вообще в делфи infolabel))) я использовал обычный label потом что info никогда не пользовался)
Ты всё правильно сделал. =) Это обычный переименованный Label =)

Цитата:
Сообщение от god5 Посмотреть сообщение
и с Gauge как % сделать )!!!)
Код:
procedure TForm1.WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin         
  FWorkCount := 0;
  FWorkCountMax := AWorkCountMax;
  Gauge.Progress := FWorkCount;
  Gauge.MaxValue := FWorkCountMax;
  InfoLabel.Caption := Format('Размер: %s/%s',
    [ConvertBytes(FWorkCount), ConvertBytes(FWorkCountMax)]);
end;

procedure TForm1.WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  InfoLabel.Caption := 'Завершение загрузки';
end;

procedure TForm1.Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  FWorkCount := AWorkCount;
  Gauge.Progress := FWorkCount;
  InfoLabel.Caption := Format('Размер: %s/%s',
    [ConvertBytes(FWorkCount), ConvertBytes(FWorkCountMax)]);
end;
И ещё... Заметил ошибки в своём же коде, а именно:
"выдает ошибку на work,end, begin" - возникает в D2007 и выше. Решение: убрать const то есть:
Код:
  public
    procedure WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);   
    procedure WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
    procedure Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
  end;
P.S. Качать файлы лучше в потоке и пересмотри свой код, в нем есть неккоректности

Последний раз редактировалось Lardes; 11.12.2012 в 22:04.
Lardes вне форума Ответить с цитированием
Старый 11.12.2012, 22:05   #8
god5
Катков Кирилл:)
Пользователь
 
Аватар для god5
 
Регистрация: 26.06.2012
Сообщений: 48
По умолчанию

спасибо большое!)
god5 вне форума Ответить с цитированием
Старый 11.12.2012, 22:08   #9
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Всегда пожалуйста =)
Lardes вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прогресс бар для Three.js dem66 JavaScript, Ajax 3 05.07.2012 15:01
DES, прогресс бар Євгеній Бєлік Общие вопросы Delphi 6 08.11.2011 05:33
Типа Прогресс бар! WizarD.89 Microsoft Office Excel 3 24.04.2011 14:20
Цикл и прогресс-бар А)-(дрей Microsoft Office Excel 4 17.03.2011 18:13