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: 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.
![]() |
| 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
- OpenGL (14.) - Ucelený částicový systém
- OpenGL (13.) - Nastavení OpenGL v jazyce C/C++
- 3D Studio MAX (13.) - Popis modifikačních funkcí ve 3D Studiu MAX
- OpenGL (12.) - visualizační plugin pro WinAMP
- Delphi (10.) - knihovna FMOD
- Herní grafické enginy (1.) - MEngine od Mister Group
- Delphi (9.) - Download 2
- Delphi (8.) - Download
- 3D Studio MAX (12.) - Tvorba realistické jeskyně 2
- Jak na tvorbu her - Na co máme myslet při programování hry?
- 3D Studio MAX (10.) - Izometrický pohled ve 3D Studiu MAX
- Adobe Photoshop (4.) - Chromový text
- 3D Studio MAX (11.) - Tvorba realistické jeskyně
- Zoner Callisto (2.) - Export do PDF
- OpenGL (11.) - Nová detekce kolizí

