Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

Интернет. Процесс передачи данных.   Найти похожие ветки 

 
XRed ©   (2005-11-14 23:25) [0]

Уважаемые любители своего дела!!!
Появилась маленькая проблема.
Необходимо чтобы при скачивание файла по HTTP в ProgressBar - е показывался процесс скачивания.
Я нашел код

while (ReadLen <> 0) and (stop = false) do
begin
//читаем в буфер
InternetReadFile(hURL, @fBuf, SizeOf(fBuf), ReadLen);
//смотрим ск-ко осталось докачать
InternetQueryDataAvailable(hURL, fSize, 0, 0);
ProgressBar1.Position := ProgressBar1.Max - fSize;
BlockWrite(f, fBuf, ReadLen); //<-пишем в файл
Application.ProcessMessages;
end;

но что-то он не работает как этого хотелось бы.
fSize - сколько осталось докачать.
У меня получается, что во время скачивания ProgresBar не заполняется равномерно, а скачет. То целиком заполнится, то вообще пустой.
Я вроде все перерыл не могу больше других примеров найти. Может можно через function HttpQueryInfo , пробал тоже бред какойто возвращает. Может это связанно с настройками интернета моего.
А еще по поводу подвисания формы во время открытия URL. Все пишут используй Application.ProcessMessages, но в функцию я же ее не вставлю  т.е. сама функция глючит  или это возможно как-то?
Помогите пожалуйста!!!

Один мозг хорошо. а много лучше!!!


 
Digitman ©   (2005-11-15 09:26) [1]

http://forum.sources.ru/index.php?s=cb2010641b907c31c86d9420a337759a&showtopic=55534


 
denissoft ©   (2005-11-15 22:31) [2]

Использую вот такой код, вроде все нормально работает. Скачивание с докачкой…


procedure DownloadFile(URL,Filename:string);
type
HINTERNET = Pointer;
PHINTERNET = ^HINTERNET;

var hInet, //<-переменная сод. указатель на сессию
     hURL:HINTERNET; //<-указатель на URL
     fSize, //<-размер файла
     ReadLen, //<-количество реально прочитанных байт
     RestartPos:DWORD;//<-|позиция с которой начинается
                      // |докачка
     fBuf:array[1..1024]of byte;//<-буфер куда качаем
     f:file; //<-файл куда качаем
     Header:string;//<-|дополнительная переменная в HTTP
                 // |заголовок
 begin
 try
  RestartPos:=0; //<- |инициализация
  fSize:=0; //<- |переменных

  //Если на винте есть файл то считаем, что нужно докачивать
  if FileExists(Filename) then
                              begin
                               AssignFile(f,Filename);
                               Reset(f,1);
                               RestartPos:=FileSize(F);
                               application.ProcessMessages;
                               Seek(F, FileSize(F));
                              end else
                              begin
                               //иначе с начала
                               AssignFile(f,Filename);
                               application.ProcessMessages;
                               ReWrite(f,1);
                              end;
  //открываем сессию
  hInet := InternetOpen("Mozilla",
                        PRE_CONFIG_INTERNET_ACCESS,
                        nil,
                        nil,
                        0);
  //Пишем дополнительную строку для заголовка
  Header:="Accept: */*";
  //открываем URL
  hURL := InternetOpenURL(hInet,
                          PChar(URL),
                          pchar(Header),
                          StrLen(pchar(Header)),
                          0,
                          0);
  //устанавливаем позицию в файле для докачки
  if RestartPos>0 then InternetSetFilePointer(hURL,
                                              RestartPos,
                                              nil,
                                              0,
                                              0);
  //смотрим ск-ко надо скачать
  InternetQueryDataAvailable(hURL, fSize,0,0);
  if RestartPos>0 then
                  begin
                   form1.ProgressBar1.MinValue:=0;
                   form1.ProgressBar1.MaxValue:=fSize+RestartPos;
                   form1.ProgressBar1.Progress:=RestartPos;
                   application.ProcessMessages;
                  end else
                  begin
                   form1.ProgressBar1.MinValue:=0;
                   form1.ProgressBar1.MaxValue:=fSize+RestartPos;
                  end;
  //качаем до тех пор пока реально прочитаное число байт не
  //будет равно нулю или не стор
  while (ReadLen<>0) and (stop=false) do
   begin
    //читаем в буфер
    try
    application.ProcessMessages;
    InternetReadFile(hURL, @fBuf, SizeOf(fBuf), ReadLen);
    //смотрим ск-ко осталось докачать
    InternetQueryDataAvailable(hURL, fSize,0,0);
    form1.ProgressBar1.Progress:=form1.ProgressBar1.maxValue-fSize;
    BlockWrite(f, fBuf, ReadLen);//<-пишем в файл

    finally
    Application.ProcessMessages;
    end;
   end;
  stop:=false;
  application.ProcessMessages;
  InternetCloseHandle(hURL); //<-|закрываем
  InternetCloseHandle(hInet);//<-|сесcии
  CloseFile(f); //<-|и файл
  finally
  end;
 end;


 
XRed ©   (2005-11-16 00:32) [3]

Спасибо за ответ!!!
Я сделал, но получается тоже самое. PorgressBar скачет, то есть то нет, т.е. заполняется не равномерно как должен, а бред какой-то.
form1.ProgressBar1.MinValue:=0;
form1.ProgressBar1.MaxValue:=fSize+RestartPos;
form1.ProgressBar1.Progress:=RestartPos
И не понятно Progress это Position что-ли?
Или я туплю!!! Я всю фигню пробую(скачку) URL:= http://www.mp3real.ru/mp3/chig_i_so/perekrestok/sen_similya/03_perekrestok_sen_similya.mp3
Может там сервак тупит, не те значения выдает?
Если не трудно попробуете!!!



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
15-1138859280
konda
2006-02-02 08:48
2006.02.26
Вопрос по проводнику виндовс.


15-1138713104
kozhanov
2006-01-31 16:11
2006.02.26
"резиновая" линия...


15-1138871099
КаПиБаРа
2006-02-02 12:04
2006.02.26
Посоветуйте стоит ли реализовывать требование заказчика?


1-1138270310
Nait
2006-01-26 13:11
2006.02.26
Как сделать процедуру OnButtonClick на клонированную кнопку


15-1139239108
DillerXX
2006-02-06 18:18
2006.02.26
Нравится ли вам Дельфин?