Delphi (8.) - Download

Jelikož se vyskytla potřeba programu pro download souborů z internetu v Delphi a mezi jedním z požadavků na tento program bylo, aby jej bylo možno umístit do systémové lišty (sys tray), rozhodl jsem se, že tento prográmek napíši jako freeware se vším všudy.

Základem takového Download Manageru je komponenta HTTP1, která by měla být ve většině verzí Delphi. Já jsem použil pro naprogramování Delphi3 Client/Server, protože v mých oblíbených Delphi6 Personal se tato komponenta nevyskytuje.

delphi download
Delphi Download: Komponenta HTTP1 (FastNet) je ta ikonka třetí zleva...

Při spuštění se zavolá procedura TForm1.Button1Click, která nastaví všechny potřebné proměnné a která resetuje spojení:

//Reset
procedure TForm1.Button1Click(Sender: TObject);
var i, dummy: integer;
//param: DWord;
begin
  //Možnost vypnutí veškerých klávesových zkratek ve Win9x
  //Param := 0;
  //SystemParametersInfo(SPI_SETFASTTASKSWITCH,UINT(not false),@Param,0);
  // ALT+TAB, CTRL+ESC
  //SystemParametersInfo(SPI_SCREENSAVERRUNNING,UINT(not false),@Param,0);
  // CTRL+ALT+DEL

  //Vlozi zacatek internetove adresy pro rychlejší zápis
  Edit1.text := 'http://';

  //Stornuje možné stahování
  if HTTP1.Busy then HTTP1.Cancel;
  Busy := false;
  Label1.caption := 'Připraven na stahování';

  //Skrytí task baru
  ShowWindow(Application.Handle, SW_HIDE); //schová aplikaci z taskbaru

  //Nacteni hodnot z konfiguracniho souboru
  Settings:=TIniFile.Create((ExtractFilePath(Application.ExeName))
      +'settings.cfg');

  //Nacteni cile ukládání
  Destination := Settings.ReadString('Options','Destination',
      ExtractFilePath(Application.ExeName));

  //Kde se ma zobrazit ikonka
  Zobrazeni := Settings.ReadString('Options','Zobrazeni','TRAY_ICON');
  if Zobrazeni = 'TRAY_ICON' then Trayicon1Click(Sender)
    else if Zobrazeni = 'NONE' then dn1Click(Sender)
      else Trayicon1Click(Sender);

  //Vymazani celeho mema
  for i:=1 to ListBox1.Items.Count do 
      ListBox1.Items.Delete(0);
end;

Důležité v této proceduře je jednak skrytí TASK baru, což byla jedna z podmínek celého programu, vymazání fronty pro stahování a otevření konfiguračního INI souboru, kam budeme ukládat nastavení programu. Načítá se sice jen umístění ikonky (SYSTEM TRAY nebo žádné) a složka, kam se mají ukládat stažené soubory, ale v dalších verzích možností nastavení přibude.

//Stahuj
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
  FileName:string;
begin
if (ListBox1.Items.Count >< 0) then
  if (Busy = false) then begin
    Download_file := ListBox1.Items.Strings[0];

    //Ziskani jmena souboru z internetove adresy
    for i:=0 to Length(Download_file) do
      if (Download_file[i]<>'/') 
        then FileName := FileName + Download_file[i]
        else FileName := '';

    //Stavový label
    Label1.caption:='Stahování souboru: '+Download_file;
    Time := GetTickCount;
    HTTP1.GetDoc(Download_file, '', Destination + FileName);
    Busy := true;
  end;
end;

Na tuto proceduru se podíváme trochu podrobněji, protože je srdce celého programu. Procedura doslova říká: Po kliknutí na tlačítko stahuj pokud existuje v ListBoxu záznam s požadovaným dokumentem a pokud se už něco nestahuje, dělej:
1)Zjistí si z ListBoxu umístění souboru.
2)Zjisti název souboru (Čte znak po znaku a pokud je různý od '/' přidá tento znak do proměnné s názvem souboru. Pokud je znak '/' tak proměnnou s názvem souboru vymaže.).
3)Vypíše text Stahování souboru a jméno souboru.
4)Do proměnné Time uloží čas abychom mohli zjistit, jak dlouho jsme stahovali.
5)Začne stahovat soubor z internetu do adresáře, který je dán v proměnné Destination.
6)Nastaví proměnnou Busy (Oznamuje, že již stahujeme).

//Neco se stalo...
procedure TForm1.HTTP1StateChanged(Sender: TObject; State: Smallint);
begin
  if (State=6) then begin
    Label1.Caption:='Stahování souboru '+Download_file+' dokončeno';
    ListBox1.Items.Delete(0);
    Busy := false;

    Gauge1.Progress := 0;
    StatusBar1.Panels[0].Text := 'Staženo celkem ' 
	  + inttostr(round(HTTP1.DocOutput.BytesTransferred/1024)) 
	  +' kB, '+inttostr(8*round(HTTP1.DocOutput.BytesTransferred
	  / (GetTickCount-Time))) + ' kbps';

    ShowMessage('Požadavek splněn');
  end;
end;

Tato procedura se zavolá při změně stavu při stahování. Je-li proměnná State nastavena na hodnotu 6, oznamuje nám, že je ve stavu Disconnected, tedy stahování dokončeno. Podle toho se zařídíme a nastavíme proměnnou Busy na false, pozici progress baru nastavíme na 0 a do StatusBaru vložíme oznámení, kolik dat jsme celkem stáhli a jaký byl průměrný datový tok. Také ukážeme zprávu s oznámením stahování dokončeno.

//Prace s listboxem
procedure TForm1.ListBox1Click(Sender: TObject);
var i: integer;
begin
  for i:=0 to (ListBox1.Items.Count - 1) do begin
    if ListBox1.Selected[i] then
    begin
      Edit1.Text := ListBox1.Items.Strings[i];
      ListBox1.Items.Delete(i);
    end;
  end;
end;

Další procedura zajišťuje, že když klikneme do ListBoxu, tak se nám vybraná položka přesune k editaci do Edit1

//Po stisknuti enteru se data prenesou z Edit1 do ListBoxu
procedure TForm1.Edit1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
if (key=13) then begin
  ListBox1.Items.Add(Edit1.Text);
  Edit1.Text:='http://';
  end;
end;

Když vyplníme adresu souboru v Edit1 a stiskneme Eneter, tak se nám adresa souboru přenese do ListBoxu (Seznam souborů pro stahování). To znamená, že můžeme vyplnit třeba deset souborů a pak jen postupně dávat Download!!

//Zobrazeni formulare s cestou pro ulozeni souboru
procedure TForm1.AutoSave1Click(Sender: TObject);
begin
  Form1.enabled:=false;
  Form2.visible:=true;
end;

V menu File je položka AutoSave... Po jejím stisknutí by se nám měl objevit formulář se zadaným adresářem, kam se mají ukládat stažené soubory.

Download v delphi v praxi
Delphi download v praxi
procedure TForm1.Timer1Timer(Sender: TObject);
var BytesTransferred: integer;
begin
if busy then begin
  BytesTransferred := HTTP1.DocOutput.BytesTransferred;
  
  //Updatování pozice ukazatele
  Gauge1.MaxValue := HTTP1.DocOutput.BytesTotal;
  Gauge1.Progress := BytesTransferred;

  //Přenosová rychlost B/s
  StatusBar1.Panels[2].text := inttostr(round((
    (BytesTransferred - BytesTransferredLast)
	 / (Timer1.interval/1000))))+' B/s';
  BytesTransferredLast := BytesTransferred;

  //Pocet a procento prenesenych bytu a přenosová rychlost
  if (HTTP1.DocOutput.BytesTotal <> 0) then
  StatusBar1.Panels[0].text := inttostr(round(BytesTransferred/1024))
  +' kB z ' +inttostr(round(HTTP1.DocOutput.BytesTotal/1024))+' kB = '
  + inttostr(round(100*(BytesTransferred/1024)
   / (HTTP1.DocOutput.BytesTotal/1024))) + ' % ='
  + inttostr(8*round(BytesTransferred/(GetTickCount-Time)))+' kbps';

  //doba stahování
  Sekund := round((GetTickCount-Time)/1000);
  StatusBar1.Panels[1].text := inttostr(trunc(sekund/3600))
   +'hodin, '
   +inttostr(trunc(sekund/60-60*trunc(sekund/3600)))
   +'minut, '
   +inttostr(trunc(sekund) 
     - 60*(trunc(sekund/60-60*trunc(sekund/3600))))
   +'sekund';
end;
end;

Tato procedura je velmi důležitá pro zobrazování veškerých údajů o stahování. Pokud se stahuje, zjistíme počet přenesených bytů, updatujeme pozici ukazatele, zobrazíme aktuální přenosovou rychlost od poslední aktivace Timeru, dále počet přenesených kB, celkový počet kB, vypočteme procento stažení souboru a vypočteme průměrnou přenosovou rychlost od začátku stahování. Zobrazíme také celkovou dobu stahování aktuálního souboru.

procedure TForm1.HTTP1Error(Sender: TObject; Number: Smallint;
  var Description: WideString; Scode: Integer; const Source,
  HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool);
begin
  ShowMessage('Vyskytla se chyba: '+Description);
end;

Poslední proceduru, kterou dnes popíšu je procedura, která je vygenerována při jakékoliv chybě. Proměnná Description obsahuje popis chyby, proto zobrazíme dialogové okno s touto proměnnou.

Myslel jsem si, že dnes zvládnu napsat kompletní popis programu. Dnes se mi sem vešel pouze popis základních rutin Download Manageru, který pro alespoń částečné pochopení komponenty HTTP1 snad stačí. Docela jsem se rozepsal, tak popis zbytku čeká v příštím díle, který bych měl napsat tak asi do týdne. Můžete se těšit na procedury pro zobrazení a skrytí icony ze System Tray, přidáme klávesovou zkratku pro zobrazení a skrytí Download Manageru, automatické přidání do menu START a na plochu.

Kompletní zdrojový kód Download Manageru ve verzi 0.0.1.2 si můžete stáhnout zde (20kB). Jedná se o freeware. Jakékoliv další šíření alespoň čiňte s poznámkou o autorovi.

Vyšlo 31.03.2002, v blogu: 0 1 2 3 4 5 6 7 8

Děkuji, že jste se rozhodl(a) přečíst tento článek. Budu rád i za komentář. Pokud Vás tento článek zaujal a rádi byste jej doporučili ostatním, podpořte mně prosím tím, že věnujete minutku svého času a uděláte mi reklamu na linkuj.cz, vybrali.sme.sk či jagg.cz. Přeji příjemné čtení

Poslední články

Diskuse k blogu

komponenta 
nemohl by jste prosím sem dat nějaký odkaz na tu HTTP komponentu, děkuji  
Vložil: MarMar (07.07.2008 18:54:00)
Komponenta 
Taky bych chtěl odkaz na tu komponentu fastnet. Nemůžu jí nikde najit. 
Vložil: patik (01.05.2009 11:28:52)
Komponenta  
Ta komponenta se jmenuje nmhttp nenasel jsem ji ,ale staci kdyz si stahnete delphi 5 a i kdyz mate jinou verzi tak to nevadi je uplne jedno kolik verzi delphi je v pocitaci. 
Vložil: patik (01.05.2009 19:50:49)
Přidání příspěvku
©PC-guru.cz 2000-2008 | Optimalizováno pro 1024*768