Fájlok letöltése az internetről - Cikk

Töltse le a fájlokat az internetről

Célkitűzés: A fájl letöltéséhez keresztül http megadott mappába fluxus.

Dobd formájában két tSzerkesztés, TProgressBar egy gombot, és TSaveDialog.

Fájlok letöltése az internetről - Cikk

Írni egy kis gomb felvezető:

Most, a forma és a hozzá IdHTTP gomb (Button2) a felirat: „A letöltés elindításához.”

A processzor, hogy várjon egy kicsit, és írni a legnehezebb - az osztály az áramlás.

Az első két sor készülnek annak érdekében, hogy világossá tegye, ahol a kódot. És nyomjuk meg a Ctrl + Shift + C Delphi ad egy kis kódot. Ő most így néz ki:

típus
TDownLoader = osztály (TThread)
magán
FToFolder: string;
Furl: string;
védett
eljárás végrehajtása; felülbírálhatja;
közzétett
nyilvános
ingatlan URL: string olvasni Beteker írási Beteker;
ingatlan ToFolder: string olvasni FToFolder levelet FToFolder;
végén;

idHTTP komponenst öntött formában csak egyetlen célja van - hozzá az összes Delphi header fájlokat használ. Ezután el lehet távolítani. De akkor meg magát a felhasználási fájlba idHTTP.

A fő stream kód

Így a felvezető kód:

eljárás TDownLoader.Execute;
var
http: TIdHTTP;
str: TFileStream;
kezdődik
// hozzon létre egy osztályt letöltésére
http: = TIdHTTP.Create (nulla);
// könyvtárat, ahová a fájlt
ForceDirectories (ExtractFileDir (ToFolder));
// Áramlat menteni
str: = TFileStream.Create (ToFolder, fmCreate);
megpróbál
// letöltése
http.Get (url, str);
végül
// Azt tanították, hogy ecsettel egy
http.Free;
str.Free;
végén;

Tartsuk szem előtt, hogy ez az eljárás nem tud közvetlenül hozzáférni a komponensek a forma és a többi szálat. Ez úgy történik, különleges módon, amely az úgynevezett szinkronizálást.

Végül a felvezető a gomb:

eljárás TForm1.Button2Click (Sender: TObject);
var d: TDownLoader;
kezdődik
// Létrehozunk egy patak osztályban.
// Áramlat kezdeni leáll
d: = TDownLoader.Create (true);
// érdemes utalni áramlási paraméterek
d.URL: = Edit1.Text;
d.ToFolder: = Edit2.Text;
// áramot kell távolítani magát befejezésekor munkájuk
d.FreeOnTerminate: = true;
// és fuss ez a letöltés.
d.Resume;
// Most hagyjuk az eljárással, de a munkafolyamat
// és élik az életüket
végén;

Most, a kód kell swing, de nincs folyamatban van, egy letöltés befejezése észre.

Add, hogy az elején a közlemény a letöltés. Add a közvélemény egy részében az űrlap a következő sort:

és kattintson a tovább a Ctrl + Shift + C

Ez lesz az új processzor, amelyhez kiegészítik egy sort. Hozok egy üzenetet a készenlét. Ne felejtsük el, ezt az eljárást nevezik, amikor a menet végrehajt minden munkád (befejezett Execute eljárás). Csak ebben az eljárásban egyidejűleg is hozzáférhet az alkatrészek és adatáramlás formákat.

És ez lesz hozzá híváskezelő start gombot:

// áramot kell távolítani magát befejezésekor munkájuk
d.FreeOnTerminate: = true;
d.OnTerminate: = thrTerminate;

Most mi marad egy másik probléma - újraéleszteni az állapotjelző sáv. De itt rejlik vár ránk egy dolog: az áramlás nem csak nézze meg a komponensei formájában. Pontosabban, a szabály a következő: egycsatornás nem tud hozzáférni az adatokat egy másik patak (változó, kód) anélkül, hogy speciális technikákat. Ezek a módszerek két. Az első - megállunk egy szál, a második alkalommal, hogy eljusson a változókat. Vagy a második áramlás először megkérdezi teljesítette néhány kódot, és az idő megy aludni.

Második módszer, amit használni - egy közvetítő. Küldünk egy üzenetet közvetítő, hogy azt mondta, hogy egy másik szál (vagy akár csoport), így ő valami. Ez a módszer azért jó, mert tudja kezelni az üzenetek áramlását nem kényszerülnek, de amennyire csak lehetséges. Azaz, üzeneteket fog olvadni a helyén. Mint közvetítő kiválasztjuk a Windows környezetben is.

Tehát, a Windows, amikor üzenetet küld lehetővé teszi, hogy küldjön a két egész paramétert. Először fogjuk használni, mint egy azonosító fellépés, a második - ha további paraméterként.

Menjünk tovább. Miután használ beszúrni egy string típus:

const
MY_MESS = WM_USER + 100;

eljárás MyProgress (var msg: TMessage) üzenet MY_MESS;

És dédelgetett Ctrl + Shift + C

Az újonnan létrehozott felvezető, írd meg:

Azaz, ha átmennek a művelet típusát: 0 - azt jelenti, hogy szükség van elindítani a haladást. Beküldte 1 - be kell állítani a helyzetét. Hogy pontosan - nyilatkozta a többi paramétert (msg.LParam).

És most térjünk vissza a rakodók IdHTTP, akkor nem marad végrehajtását. Ott meg kell adnia az összes sort. Az alábbiakban bemutatjuk a végrehajtás.

eljárás TDownLoader.IdHTTP1Work (ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Egész szám);
kezdődik
PostMessage (Application.MainForm.Handle, MY_MESS, 1, AWorkCount);
végén;

eljárás TDownLoader.IdHTTP1WorkBegin (ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Egész szám);
kezdődik
PostMessage (Application.MainForm.Handle, MY_MESS, 0, AWorkCountMax);
végén;

Természetesen számos módon szinkronizálni mindent. De ez a módszer úgy tűnik, nagyon egyszerű és megbízható, mert nem lesz blokkoló üzenetek kerülnek feldolgozásra, amennyire csak lehetséges (a legjobb :-)).

Beszúrni egy hivatkozást ezt a cikket egy másik oldalon, az alábbi HTML-kód:

SEGÍTSÉG ÉS HOGYAN észre, hogy amikor az áramlás teljesítette kódot minden egyes letöltött fájlt. Sem általánosságban, CIKK tett (az eljárás TForm1.thrTerminate (Sender: TObject);
kezdődik
ShowMessage ( 'Kész');
végén;