Pętlowe pobieranie pliku wraz z przedstawieniem postępowania

0

Używam lekko zmodyfikowanego kodu Cyrkla do pobierania pliku z internetu oraz wyświetlenia paska postępowania na Gauge'u.

uses WinInet;

const
  addedNo = 1024;
var
  h,
  f :       pointer;
  r :       cardinal;
  buf :     array[0..(addedNo-1)]of char;
  size_ :   dword;
  plik :    file;
  dwBufLen,
  dwIndex:  DWORD;
  buff :    pointer;
  fil_,
  url_ :    string;
  j :       integer;
begin
  //pseudo-czyszczenie zmiennych
  buf:='';
  for j:=low(buf) to high(buf) do buf[j]:=#0;
  r:=0;
  //end w/w

  fil_ := 'C:\pkgirl.wmv';
  url_ := 'http://djprog.ovh.org/liv.wmv';

  AssignFile(plik, fil_);
  Rewrite(plik, 1);

  h:=InternetOpen(nil,INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);
  f:=InternetOpenUrl(h,PAnsiChar(url_),nil,0,0,0);

  dwBufLen := 1024;
  dwIndex := 0;
  GetMem(Buff, dwBufLen);
  HttpQueryInfo(f, HTTP_QUERY_CONTENT_LENGTH, buff, dwBufLen, dwIndex);
  size_ := StrToInt(StrPas(Buff));
  FreeMem(Buff, dwBufLen);

  Gauge1.MaxValue := size_;
  repeat
    InternetReadFile(f,@buf,addedNo,r);
    BlockWrite(plik, buf, sizeof(buf));
    Gauge1.Progress:=Gauge1.Progress+addedNo;
    Application.ProcessMessages;
  until Gauge1.Progress=Gauge1.MaxValue;
  Seek(plik, size_);
  Truncate(plik);
  CloseFile(plik);

  InternetCloseHandle(f);
  InternetCloseHandle(h);
end;

Wszystko jest pięknie i ładnie, no problems.

Ale gdy w/w kod włożę w pętlę (zmieniając jedynie URL i nazwę pliku docelowego), to pierwszy plik z listy zostanie ściągnięty poprawnie, ale już następne nie. Ich rozmiar jest prawidłowy (zapewne przez wycięcie właściwego rozmiaru :P) lecz struktura nie - zostają zapisane złe bloki. Nie mam pojęcia dlaczego, i właśnie liczę na Waszą pomoc.

Temat stworzony również na Forum KŚE.

0

Wiesz co? Może popatrz do źródła komponentu HTTPGet. Tam jest ściąganie z procentowym postępem ;)
//o co chodzi? w temacie jest 0 odpowiedzi a ja przecież napisałem odpowiedź :>

0

Znając życie, w tym komponencie tworzone są elementy dynamicznie, więc opróżnianie ich odbywa się dynamicznie.
A jakoś nie mam pomysłu na zastosowanie tego w w/w kodzie, a nie chciałbym używać zewnętrznych komponentów :/

Może ktoś jednak pomoże :) ?

@down:
omg zwykła for, bazująca na liście linijke w memo - każda linijka to plik http://..., a w pętelce podmieniane zostały tylko zmienne zawierające ścieżki do plików...

0

no to może byś pokazał jak go w pętle włożyłeś :>

0

kolega juz chyba sobie poradzil z problemem.... ale tak jak napisal sasiad wyzej... wazne jest w jaki sposob umiesiles to w petli... no i czy przywrociles domyslne wartosci danych, ktore modyfikowales... ;-)

0

Niestety, nie poradziłem sobie :/

  1. jak chcecie, proszę:
  for i:=0 to Memo1.Lines.count-1 do
  begin
    if (Copy(LowerCase(Memo1.Lines.Strings[i]),0,7)='http://') then
    begin
      //tutaj wyżej wymieniony kod, jedyne co to zmieniają się wartości fil_ i url_
    end;
  end;
  • Mówiłem, zwyczajne FOR.
  1. A jak mam przywrócić domyślne wartości ? Jedyne na co miałem pomysł to
  //pseudo-czyszczenie zmiennych
  buf:='';
  for j:=low(buf) to high(buf) do buf[j]:=#0;
  r:=0;
  //end w/w

ale i tak, to nic nie daje :/

@down:
Też tak próbowałem, ale to na nic :/
Gdyby to było takie proste, bym nie pisał na forum, tylko dałbym sobie radę... :/

0

zrób z tamtego kodu procedurę i w pętli ją wywołuj po prostu

1 użytkowników online, w tym zalogowanych: 0, gości: 1