Citeam citatele cu programul nostru - articole

I. Introducere

Internetul face din ce în ce mai mult parte din viața noastră. Adesea stăm și apăsăm butonul "actualizare", așteptând noi date pe pagina prețuită. Dar, de asemenea, trebuie să lucrăm o singură dată, prin urmare, vom instrui Delphi să monitorizeze pagina de știri, iar noi vom lucra singuri (sau vom face o altă muncă utilă - viața este frumoasă).





Dacă asta - totul va fi descărcat și prezentat într-o formă convenabilă pentru noi.

Ca un "cobai" am ales numeroase citate celebre de la Runet - bash.org.ru. Programul va prelua citările din pagina principală și le va adăuga în baza de date. Și cu citate în baza de date puteți face orice.







II. Note generale

Interfața externă a programului nu se pretinde a fi o recompensă. Nu m-am gândit cu adevărat, deoarece sarcina principală este în cealaltă. Veți face interfața dvs., dacă aveți nevoie de ea.

Această aplicație este construită pe tehnologia modular-obiect (îmi place mai mult numele de "Divide și Conquer"). Adică, pentru fiecare entitate există un obiect și aceste obiecte interacționează unul cu celălalt. Deoarece conexiunile și dependențele dintre acestea sunt minime, le puteți înlocui cu ușurință și le puteți modifica.

Pentru a facilita găsirea unui loc în codul la care mă refer, folosesc marcaje speciale. În textul articolului seamănă astfel. Pentru a găsi codul care corespunde cu acesta, trebuie să faceți următoarele. Du-te la Delphi și selectați View »ToDo List din meniu. Găsiți textul corespunzător și faceți clic de două ori. Și, conform textului programului, le veți vedea .

Prezentarea clasei

Să începem parsarea din clasa care servește bazei de date. Numai obiectele din această clasă au acces la baza de date, doar știu cum să lucreze cu ele. Restul clasei nu ar trebui să știe nimic despre baza de date.

În partea de sus a unității BBSA, clasa abstractă TBBasaCustom B1> este declarată. Această clasă are o singură metodă de adăugare a citatelor în baza de date, și aceasta este una abstractă. Clasa muncitoare va fi moștenită de la ea. Acest lucru se face în mod specific, astfel încât ar fi imposibil să se facă trimitere la alte metode din obiectul care va adăuga date și nu i-ar păsa ce alte metode are clasa. Nu au nevoie de el. Arată minunat, dar mai târziu devine clar.

Clasa TBBasa este declarată în aceeași unitate. Această clasă este moștenită din clasa noastră și implementează toate funcționalitățile necesare, și anume:

Deschide baza de date când îl creați. Dacă fișierul de bază lipsește, îl va crea. B6>

Poate adăuga o cotare, deoarece implementează metoda abstractă Add. B3>

El este capabil să găsească în baza de date un citat pe număr - metoda GetQuotes. B4>

Uită-te atent la metodele publice. Niciuna dintre ele nu vă va spune cum și unde sunt stocate datele. Prin urmare, nimeni nu interferează cu metodele de rescriere și stocarea citatelor într-un fișier text sau în mai multe fișiere. Restul codului nu simte deloc. Simțiți puterea acestei abordări de programare?

Ca bază de date, folosesc SQLite.

Să luăm în considerare câteva metode mai detaliate.

Această metodă B3> primește doi parametri - Număr și Text - respectiv numărul citării și textul acestuia. Înainte de a adăuga la început verificările și dacă există deja citate. Pentru a face acest lucru, face o cerere pentru un eșantion de citate cu un număr dat. Dacă citatul nu este găsit (numărul de rânduri găsit este zero), atunci îl adăugăm în baza de date. Desigur, teoretic, este posibil ca baza de date va fi intrări multiple cu un singur număr (o eroare de programare, de exemplu), dar nu complica. La sfârșitul metodei, există un apel SendCommand. Aceasta este o alertă pentru interfața că există noi citate. Modul în care funcționează va fi descris mai jos.

Metoda GetQuotes

Această metodă B4> prin numărul de citare dat îl găsește și se întoarce, după îndepărtarea simbolurilor speciale. Dacă citatul nu este găsit - returnează un șir gol (este logic). Este, de asemenea, interesant faptul că această metodă se referă la o altă metodă, care cere "text brut" din baza de date.

IV. Clasa de flux

Această clasă este implicată în lucrarea principală - descarcă pagina principală, parsitul și dă o bucată pe bucată obiectului bazei de date. Întreaga implementare este în unitatea BTread.

După cum puteți vedea din cod, această clasă are doar trei metode publice - constructorul, destructorul și cererea de actualizare. Și nu mai are nevoie de el.

Să vedem cum funcționează toate. Prin constructorul T1>, atunci când creăm clasa, îi transmitem o referință la obiectul bazei de date, astfel încât să putem adăuga apoi citate.

După pornirea firului, se execută metoda Execute T2>. Este extrem de simplu - până când terminăm, repetați: descărcați, analizați și așteptați. Toate acțiunile sunt separate separat pentru a fi independente.

Descărcați pagina

Metoda de a descărca pagina GetText returnează pur și simplu conținutul paginii ca un șir. Dacă nu vă plac componentele Indy din motive ideologice, înlocuiți-o cu codul dvs., asta-i tot. Metoda în sine este, de asemenea, bună, deoarece arată cum să creați o componentă în RunTime și să atribuiți metode.

Există o pauză între descărcarea de ghilimele. Din moment ce suntem în flux, putem scrie liber Sleep. Nu va exista "interfațare". Dar această funcție este rău, deoarece debitul este dificil de trezit de la un astfel de vis. Și dacă vrem să închidem programul în acest moment, atunci va trebui să așteptăm până când funcționează funcția.

Din acest motiv folosesc o metodă ușor diferită de T5>. Folosesc funcția WaitForSingleObject, care, spre deosebire de Sleep, se poate termina și în cazul în care evenimentul "declanșat de eveniment" care ia fost transmis a fost anulat. A funcționat - sa mutat cu SetEvent.

Prin urmare, dacă trebuie să actualizați înainte de timp sau să opriți fluxul, vom include evenimentul și metoda Sleep se va termina mai devreme.

V. Principala aplicație

Acum, când ne-am uitat la toate obiectele auxiliare, este timpul să le combinăm și să le facem să lucreze.

Deoarece funcționalitatea principală pe care am implementat-o ​​deja, codul este extrem de simplu. Mai întâi, vom crea două obiecte - una pentru baza de date, una pentru flux. Faceți acest lucru în formularul OnCreate M2>. În OnDestroy, respectiv, distruge. Observați secvența de creare și ștergere. Este important.

Butonul "actualizare" nu ar trebui să provoace complicații. Se numește pur și simplu metoda de actualizare pe obiectul thread.

feedback-ul

Amintiți-vă apelul SendCommand de la un obiect de bază de date? Această funcție este în unitatea BMessage. Este foarte simplu - pur și simplu numește funcția SendMessage WinAPI pentru a trimite mesajul în forma principală, iar mânerul formularului principal este preluat din Application.MainForm.Handle. Forma principală acceptă aceste mesaje și accesează deja în mod independent obiectele necesare.

De exemplu, luați în considerare trimiterea unui mesaj despre o ofertă nouă. După ce citarea a fost salvată, mesajul MY_NEW_QUOTES este trimis și numărul de cotă este trecut ca parametru. Nu avem nevoie de al doilea parametru și scriem acolo 0.

Metoda M7 este declarată în clasa de formate pentru a intercepta acest mesaj. După ce am primit-o, ne adresăm pentru a obiecta un DB, sub numărul primim mesajul și adăugăm în Memo.

VI. constatări

Desigur, acesta este un exemplu foarte brutal și nu este bun la expoziție. Dar este bine că este o pregătire pentru diferite programe de acest tip - pentru a colecta știri, pentru a pompa galerii de imagini, pentru a colecta date.

Și amintiți-vă, în unele cazuri, astfel de programe nu pot fi prieteni cu legea! Fii atent și nu rupe.







Articole similare

Trimiteți-le prietenilor: