Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Visual Basic 6 Tutorijali

[es] :: Visual Basic 6 :: Visual Basic 6 Tutorijali
(TOP topic, by Aleksandar Ružičić)

[ Pregleda: 23209 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Visual Basic 6 Tutorijali07.12.2007. u 04:44 - pre 198 meseci
Visual Basic 6 Tutorijali

Ova tema namenjena je tutorijalima za Visual Basic 6. Tutorijale mogu postavljati svi korisnici, i poželjno je da što više korisnika učestvuje u ovom poduhvatu.
Ne morate pisati opširno o nekoj temi, možete npr. napisati 5-6 linija koda (korisnog) i objasniti ga sa par rečenica i to će biti dovoljno.

VAŽNO:
● Nemojte postavljati pitanja u vezi tutorijala u ovoj temi. Pokrenite novu (ako već nije pokrenuta).
● Ukoliko mislite da ima grešaka u tutorijalu obratite se autoru ili nekome od moderatora, nemojte to pisati u ovoj temi!


Tutorijali:
Deklaracija promenljivih (nivo znanja: Beginner, autor: BinLaden)
Win API - Windows Application Programming Interface (nivo znanja: Beginner - Intermediate, autor: Aleksandar Ružičić)
Citanje sadrzaja neke web stranice (nivo znanja: Intermediate - Advanced, autor: batalule)
Regularni izrazi u VB6 (nivo znanja: Beginner - Intermediate, autor: Aleksandar Ružičić)
Windows hooks VB 6 tutorijal (nivo znanja: Intermediate - Advanced, autor: Eurora3D Team)


Kako postaviti tutorijal?
Evo šta bi valjalo da ispoštujete kada postavljate tutorijal (da vam ne bi moderatori sredjivali temu):
● Promenite ime teme (nemojte da vam ostane Re: Visual Basic 6 tutorijali)
● Navedite ime tutorijala i u poruci (boldovano)
● Navedite potreban nivo znanja da bi se razumeo tutorijal (Beginner, Intermediate, Advanced) - po vašoj proceni
● U dve-tri rečenice objasnite zašto ste se odlučili za taj tutorijal, tj za šta je koristan
Obavezno koristite code tagove kada stavljate kod!
● Komentarišite kod što više (ne bukvalno svaku liniju!)
● Okačite projekat (u zip formatu) uz poruku
















[Ovu poruku je menjao Aleksandar Ružičić dana 21.04.2008. u 20:58 GMT+1]

[Ovu poruku je menjao Aleksandar Ružičić dana 21.04.2008. u 20:59 GMT+1]
 
Odgovor na temu

BinLaden
Ni na nebu ni na zemlji

Član broj: 147476
Poruke: 102
*.teol.net.

Sajt: www.sove-soft.rs.ba


Profil

icon Deklaracija promenljivih10.12.2007. u 22:08 - pre 198 meseci
Deklaracija promjenjivih

Nivo znanja: Beginner

Posto sam vidio da dosta programera grijesi pri deklaraciji promjenjivih, a vidjeli smo da cak i u knjigama
iz kojih se uci VB ima istih gresaka koje kasnije izazovu problem u izvrsenju koda, rijesio sam da napisem
ovaj tutorijal koji ce pokazati kako pravilno deklarisati promjenjive.

Sada necu objasnjavati sustinu promjenjivih i tipova podataka, nego samo pravilno koristenje.
Posto nema gotovo niti jedne aplikacije koja ne koristi promjenjive, prije njihovog koristenja potrebno je
UVIJEK deklarisati istu. Najbolji nacin da se izbjegne koristenje promjenjivih koje nisu deklarisane je tako
sto ce na vrhu svakog Modula, Forme (u General sekciji)... stajati Option Explicit
Promjenjive mozemo deklarisati na dva nacina: u nizu ili jednu ispod druge
Code:
Dim a As String, b As String    'Deklarisanje u nizu

Dim c As Integer                'Deklarisanje jedne idspod druge
Dim d As Long
Najcesce greske nastaju pri deklaraciji vise promjenjivih u nizu kada se redaju promjenjive
i samo na kraju odredi tip promjenjive.
Code:
Dim a, b, c, d As String   'Nepravilan nacin
U ovom slucaju
smo je zadnja promjenjiva "d" odredjenog tipa podataka (String) dok su promjenjive "a, b, c" neodredjenog
tipa odnosno Variant.
Pravilan nacin deklarisanja promjenjivih u nizu je taj da nakon svakog naziva promjenjive odredimo i njen
odgovarajuci tip.
Code:
Dim a As Integer, b As Long, c As Double, d As String   'Pravilan nacin


Evo jedan mali primjer gdje cemo vidjeti kako dva potpuno ista koda, sa razlicitom deklaracijom promjenjivih
daju dva potpuno razlicita rezultata:
Code:
Private Sub Command1_Click()
Dim a, b, c As String
    
    a = 1
    b = 2
    c = a + b

    Text1.Text = c 'Rezultat ce biti: 3

End Sub

Private Sub Command2_Click()
Dim a As String, b As String, c As String
    
    a = 1
    b = 2
    c = a + b

    Text1.Text = c 'Rezultat ce biti: 12

End Sub




[Ovu poruku je menjao Aleksandar Ružičić dana 17.12.2007. u 01:42 GMT+1]
Ero S Onoga Sveta
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Win API - Windows Application Programming Interface16.12.2007. u 03:34 - pre 198 meseci
Win API - Windows Application Programming Interface

Nivo znanja: Beginner - Intermediate


VB6 zaista ima dosta stvari ugradjenih u sebe i u ActiveX kontrole/biblioteke ali neke stvari ipak nisu implementirane ili jesu ali zahtevaju da uz program distrubirate neki dll ili ocx. Tu na scenu stupa API. API prestavlja skup funkcija koje operativni sistem (u ovom slučaju Windows) ili neka biblioteka "exportuje" tj to je skup funkcija koje ostali programi mogu pozivati. Windows je organizovan tako da svaki program mora da koristi API, da bi prikazao prozor, message box, da bi pristupio fajlovima, registry bazi, internetu i td. Svaki VB program koristi API funkcije, samo što su one "upakovane" u sam jezik .
Recimo, kada postavite dugme na formu, kada se vaš program pokrene on će pozvati odredjenu API funkciju (CreateWindow u ovom slučaju) sa odredjenim parametrima (tip prozora - CommandButton u ovom slučaju, njegov izgled, pozicije i ostala svojstva) da bi prikazao to dugme, i kada kliknete na njega opet je pozvan niz API funkcija (prvo za iscrtavanje pressed stanja dugmeta, pa za obradu poruka koje Windows šalje prozoru i td...) koje na kraju pozivaju kod koji ste napisali u Click event handleru.

Znači vi već koristite API, super! Sad ćemo da vidimo kako iz VB-a možemo direktno da pozivamo API funkcije (to je brže nego da ih pozivamo preko VB-ovih komandi/funkcija a i VB ne nudi svoje funkcije za svaku API funkciju, zapravo veoma mali deo funkcionalnosti koje nudi Windows kroz svoj API je dostupno preko VB-ovih funkcija).

Prvo ćemo da vidimo kako da koristimo API kroz jednostavan primer. Pokrenite VB i izaberite novi projekat, pređite u Code View i prekopirajte sledeći kod:
Code:

Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()

Const WM_NCLBUTTONDOWN  As Long = &HA1
Const HTCAPTION         As Long = 2

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    Dim lngReturnValue As Long
    
    If Button = vbLeftButton Then
        
        ReleaseCapture
        
        lngReturnValue = SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)

    End If
    
End Sub

pokrenite projekat i kada vam se pojavi forma "uhvatite" je (bilo gde, samo ne za titlebar) i pomerajte je. Zanimljivo zar ne?

Sad ćemo da objasnimo šta smo to uradili:

● Prvo smo deklarisali API funkcije koje želimo da pozivamo.
Deklaracija funkcija uvek ide u Declarations deo (General sekcija) modula, forme, klase ili user controle, tj "na vrh".
Funkcije deklarišemo pomoću Declare naredbe, ispred Declare možemo staviti Private ili Public (isto kao kod globalnih promenljivih)
Nakon Declare ide Sub ili Function, pa zatim naziv funkcije koji ćemo da koristimo u kodu (ovo može da bude bilo koji validan naziv), zatim ide Lib praćen nazivom biblioteke (pod navodnicima) pa onda Alias pa pod znacima navoda pravo ime funkcije ("SendMessageA" u prvoj deklaraciji) i zatim idu parametri funkcije (navodimo ih kao kod običnih funkcija) i tip koji funkcija vraća (ako nije u pitanju Sub) koji je u 90% slučajeva Long.

● Zatim smo deklarisali neke konstante koje ćemo koristiti kao argumente funkcije (ove konstante su navedene u opisu funkcija, više o tome kasnije)

● i na kraju smo pozvali funkcije koje smo deklarisali kao da su u pitanju obične VB funkcije.


Verovatno se pitate kako da znate koja je biblioteka u pitanju, koji je tačan naziv funkcije, koji su parametri, koje su povratne vrednosti i šta uopšte funkcija radi?
Odgovor je jednostavan: MSDN. Svaka funkcija/tip/konstanta je detaljno objašnjena u MSDN-u. Problem za VB programere može predstavljati to što su deklaracije i primeri dati za C/C++, ali ima spasa. To su dva programčića: API-Guide i API VIewer 2004. Prvi je veoma koristan ako ste početnik u svetu API programiranja, API-Guide ima veliki broj funkcija koje su objašnjenje i za svaku funkciju postoji bar po jedan primer korišćenja te funkcije. Za ostale funkcije koje nisu navedene u API-Guide-u tu je MSDN, kada u MSDN-u nadjete funkciju koja radi to što vam treba pokrenete API Viewer i pronadjete deklaraciju te funkcije u VB formatu. Nakon nekog vremena, kada se upoznate sa API-jem i MSDN-om API Viewer vam i neće biti potreban, moćićete direktno da navedete VB deklaraciju čitajući deklaraciju funkcije u C/C++u.



[Ovu poruku je menjao Aleksandar Ružičić dana 17.12.2007. u 01:42 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

batalule

Član broj: 39086
Poruke: 105
194.106.178.*



Profil

icon Citanje sadrzaja neke web stranice16.12.2007. u 21:14 - pre 198 meseci
Citanje sadrzaja neke web stranice

Nivo znanja: Intermediate - Advanced

Cesto se u poslovnim primenama javlja potreba da programski ocitate neku web stranicu i da sa nje izvucete neke podatke.
Obicno je rec o podacima koji se periodicno menjaju npr. kursna lista ili nesto slicno. Microsoft nudi HTML Object library koja je zapravo Microsoftova implementacija DOM (Document Object Model) standarda koji u praksi znatno olaksava parsiranje elemenata HTML stranice.
Bitno je napomenuti i sledece: u situacijama kada imate HTML stranicu koja prikazuje neke, uslovno receno, dinamicke podatke, ta stranica se obicno generise u nekom server side skriptu sto ce reci da joj je struktura uvek ista. Na primer, ako je u pitanju kursna lista NBS, HTML stranica ce uvek sadrzati tabelu (omiljen nacin formatiranja sadrzaja) koja ce biti popunjena kursevima. U ovom primeru, dovoljno je hardkodirati indeks tabele i preko tog indeksa "dohvatiti" konkretnu tabelu u okviru HTML strane (moguce je da strana ima vise tabela) i onda jednostavno u nekoj petlji proleteti kroz kolekciju rows i kolekciju cells i preko njihovih svojstava ocitati tekst (innerText svojstvo). U primeru ce takodje biti pokazano kako se upisuje sadrzaj u form objekat HTML strane kako bi se serveru poslao zahtev za nekim konkretnim sadrzajem.
Primer sam bazirao na kursnoj listi Narodne Banke Srbije (http://www.nbs.yu) odnosno konkretno na http://www.nbs.yu/internet/latinica/scripts/ondate.html strani na kojoj je potrebno uneti datum za zeljeni dan kursne liste i poslati zahtev serveru pritiskom na dugme.
Ideja nije da uradim potpuno funkcionalni primer iako to on skoro jeste vec da citaoca potaknem na interes za ovakav nacin dobijanja podataka i da ga navedem da samostalno dalje istrazuje. Sam primer obiluje komentarima koji doticu problematiku tek toliko da objasne osnovne principe i za jedan tutorijal su nacelno dovoljni. Ostatak znanja koji je potreban za neke zahtevnije primene se moze naci u MSDN.

Za ovaj primer potrebna je internet konekcija, VB standard exe projekat sa jednom formom koja ima dodatu webbrowser kontrolu (Components -> Microsoft Internet Controls) i referencu na MS HTML Object Library(References-> Microsoft HTML Object Library) koje su ujedno u standardnom setu kontrola i referenci koje dolaze uz VB6.

Forma ima i komandno dugme odakle ce se pozivati odgovarajuca HTML strana.
Code:

    Private Sub Command1_Click()
            WebBrowser1.Navigate "http://www.nbs.yu/internet/latinica/scripts/ondate.html"
        End Sub

U kodu za komandno dugme jednostavno se poziva Navigate metoda WebBrowser kontrole koja za parametar ima URL strane sa koje se zele ocitati podaci. Zgodna stvar je sto cemo iskoristiti DocumentComplete dogadjaj te kontrole tako da sam Internet Explorer hendluje dogadjaj i potencijalne greske koje bi inace morali da obradjujemo da koristimo WinSock ili Internet Transfer kontrolu.
Takodje cemo deklarisati jednu objektnu promenjljivu po imenu Dom i to tako da mozemo da dohvatimo njene dogadjaje.
Code:

    Public WithEvents DOM As HTMLDocument

Ovo nije nuzno ako znamo sourceIndex svojstvo elementa na HTML strani (ono nam je u vecini slucajeva jedini nacin da identifikujemo i adresiramo konkretan element na HTML stranici obzirom da vecina strana nema popunjene name i id atribute HTML elemenata) ali kako ga neznamo iskoristicemo onclick event hendler kako bi preko activeElement objekta dobili sourceIndex. Internet Explorer svim HTML elementima sam dodeljuje ovo svojstvo i to kao numericku vrednost koja pocinje od nule i svaki pot se uvecava za 1 kada IE renderuje element.

Kao sto je vec pomenuto po pozivanju Command1_Click() cekamo da se desi WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant) dogadjaj.
Prvo sto cemo u njemu uraditi je da cemo ispitati da li je svojstvo ReadyState webbrowser1 kontrole = READYSTATE_COMPLETE i jos jednu bitnu stvar a to je da li je webbrwoser kontrola na odgovarajucoj lokaciji:
Code:

    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
            If WebBrowser1.ReadyState = READYSTATE_COMPLETE And URL = "http://www.nbs.yu/internet/latinica/scripts/ondate.html" Then
            Set DOM = WebBrowser1.Document
            End If
    End Sub


Ako, na primer, imate kao Home Page u Internet Exploreru nasetovan "about:blank" onda ce se DocumentComplete desiti odmah cim pokrenete primer a lokacija ce biti "about:blank" tako da moramo proveriti i URL. Ako su oba uslova ispunjena onda onda setujemo DOM promenljivu na dokument webbrowser kontrole. U ovom trenutku imamo HTML dokument na raspolaganju ali neznamo id njegovih elemenata tako uvodimo jedan pomocni kod koji ce nam sluziti samo da ga saznamo
Code:

Private Function DOM_onclick() As Boolean
    Debug.Print "--->" & DOM.activeElement.sourceIndex & "<---"
    Stop
End Function


Ovaj kod je jasan; u Immediate prozoru ispisuje sourceIndex svojstvo a direktiva Stop sluzi da privremeno zaustavi izvrsavanje koda kako bi mogli da dodate Watch DOM promenljive. Watch ce vam prikazati DOM kao hijerarhijski objekat gde cete moci da vidite sve kolekcije i njihova svojstva.
Ova funkcija je event hendler za onclick metodu sto znaci da ce se dogoditi tek kada kliknete na neki od HTML elemenata.
Konkretno za dati primer interesuje nas INPUT element tipa text u koju upisujemo datum za koji zelimo kursnu listu i INPUT element tipa SUBMIT koje je komandno dugme na HTML strani kojim saljemo podatke serveru. SourceIndex svojstva su 135 za datum i 158 za dugme.

Kada smo saznali koja su sourceIndex svojstva onda nam kod za DocumentComplete vise ne odgovara jer ne dopusta IE da posalje podatke. Zato ga menjamo u ovaj kod:
Code:

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
            If WebBrowser1.ReadyState = READYSTATE_COMPLETE And URL = "http://www.nbs.yu/internet/latinica/scripts/ondate.html" Then
                WebBrowser1.Document.All.Item(135).Value = "14.12.2007" 'upisujemo datum
                WebBrowser1.Document.All.Item(158).Click 'saljemo podatke serveru odnosno pozivamo njegov click dogadjaj 
            End If
    End Sub


Za ovakve aplikacije je uvek zgodno imati dva programa; jedan koji ce sluziti samo da se iscitavaju sourceIndex-i i ostala potrebna svojstva elemenata ili kolekcija koji sluzi kao alat pri razvoju a drugi je konkretan program koji radi sa HTML dokumentom.

Da rezimiramo, do sada smo ucitali HTML stranu, upisali joj podatke i poslali zahtev serveru za novom stranom koja ce sadrzavati kursnu listu za 14.12.2007 godine.

Kada pogledate HTML source stranice videcete jedan tag;
Code:

<FORM name="Forma" method="post" action="/internet/latinica/scripts/kl.htm" onsubmit="openOutputInNewWin(this)">

sto ce reci da se podaci salju na "http://www.nbs.yu/internet/latinica/scripts/kl.html" a da se pre slanja podataka poziva javascript funkcija "openOutputInNewWin()" koja se opet nalazi u source-u stranice a koja od zavisnosti od onoga sto je odabrano kao prikaz u SELECT elementu podatke prikazuje ili u istom prozoru ili otvara nov prozor. U slucaju kada se otvara novi prozor da bi se prikazali rezultati potrebno je koristiti i WebBrowser1_NewWindow2 event. U ovom primeru to nije slucal ali ako imate takvo resenje u Knowledge Base MSDN ima objasnjen primer (http://support.microsoft.com/kb/184876)

Znaci, do sada smo, ponavljam upisali datum kursne liste i poslali zahtev. Rezultate opet ocekujemo u DocumentComplete eventu pa ga prosirujemo tako da izgleda ovako:

Code:

    If WebBrowser1.ReadyState = READYSTATE_COMPLETE And URL = "http://www.nbs.yu/internet/latinica/scripts/ondate.html" Then
            WebBrowser1.Document.All.Item(135).Value = "14.12.2007" 'upisujemo datum
            WebBrowser1.Document.All.Item(158).Click 'saljemo podatke serveru odnosno pozivamo njegov click dogadjaj 
        End If
    
    If URL = "http://www.nbs.yu/internet/latinica/scripts/kl.html" And WebBrowser1.ReadyState = READYSTATE_COMPLETE Then
        
            ObradiKursnuListu WebBrowser1.Document 'pozivamo ObradiKursnuListu proceduru i prosledjujemo joj HTML dokument kao parametar
        End If


Cim server obradi podatke preusmerice webbrowser kontrolu na novi URL i u DocumentComplete dogadjaju ce pozvati proceduru ObradiKursnuListu() gde mozemo lako parsirati podatke;

Code:

Private Sub ObradiKursnuListu(ByVal Doc As HTMLDocument)
    Dim DomDoc As New HTMLDocument 'HTML DOM dokument
    Dim Tabele As IHTMLElementCollection 'kolekcija svih tabela na HTML strani
    Dim Tabela As HTMLTable ' TABLE element u HTML strani
    'promenljive koje sadrze podatke
    Dim BrojListe As String
    Dim DatumListe As String
    Dim Valuta As String
    Dim Faktor As String
    Dim Kupovni As String
    Dim Prodajni As String
    Set DomDoc = Doc
    '
    Set Tabele = DomDoc.getElementsByTagName("table")
    Set Tabela = Tabele.Item(3)
    BrojListe = Tabela.rows.Item(0).cells(1).childNodes(1).innerText
    BrojListe = Replace(BrojListe, "KURSNA LISTA BR. ", "")
    BrojListe = Trim(Left(Replace(BrojListe, "ZA DEVIZE", ""), 3))
    DatumListe = Tabela.rows.Item(0).cells(1).childNodes(3).innerText
    DatumListe = Replace(DatumListe, "FORMIRANA NA DAN ", "")
    DatumListe = Trim(Replace(DatumListe, ". GODINE", ""))
    DatumListe = Trim(Replace(DatumListe, " ", ""))
    Set Tabela = Tabele.Item(4)
        For i = 1 To Tabela.rows.length - 1
            Valuta = Trim(Tabela.rows.Item(i).cells(2).innerText)
            Faktor = Trim(Tabela.rows.Item(i).cells(3).innerText)
            Kupovni = Trim(Tabela.rows.Item(i).cells(4).innerText)
            Prodajni = Trim(Tabela.rows.Item(i).cells(5).innerText)
            'ovde debug print podataka
            Debug.Print Kupovni
                
        Next
        
End Sub


Sta se dogadja u ObradiKursnuListu(ByVal Doc As HTMLDocument)?
Na strani gde se prikazuje kursna lista postoji vise tabela kojima su formatirani podaci. Te tabele kao i svi ostali elementi su indeksirani. Tabelama se moze pristupiti i kao elementu koleckije IHTMLElementCollection koji ima svoj indeks. Ovde je citav posao provaliti indekse tabela. U primeru su oni hardkodirani(3 i 4) ali pomocu namenske alatke (opet napisane u VB na veoma slican nacin) se moze provaliti koja tabela sadrzi koje podatke. Drugi nacin je da se pogleda HTML source i da se redom prebroje tabele (prva tabela ima indeks 0) i da im se tako odredi indeks. Ovde necu ulaziti u detalje jer bi se prica skrenula na nesto sto ce vremenom doci kao normalno saznanje onoga kako IE renderuje HTML elemente.

Prvo u tabeli 3 iscitavamo broj kursne liste. On je obzirom da godina ima trocifren broj dana isto tako trocifren broj. U toj celiji tabele je upisan i tekst "KURSNA LISTA BR. " koji replace metodom menjamo u prazan string i zatim radimo nesto tipa
Code:

BrojListe = Trim(Left(Replace(BrojListe, "ZA DEVIZE", ""), 3))

gde u stvari radimo prvo replace "ZA DEVIZE" sa praznim stringom i iz ostatka uzimamo tri leva karaktera. Ovo je osnovna manipulacija stringovima, moze se uraditi na vise nacina izmedju ostalog i sa Regular Expression - za diskusiju je apsolutno nebitno.
Ono sto je bitno je
Code:

BrojListe = Tabela.rows.Item(0).cells(1).childNodes(1).innerText

sto ce reci da iz Tabela objekta odnosno njegove kolekcije rows, iz prvog elementa kolekcije(Tabela.rows.Item(0)) pa iz njegove kolekcije cells odnosno njegovog drugog elementa (Tabela.rows.Item(0).cells(1).childNodes(1).innerText) uzimamo innerText svojstvo. Konkretna celija sadrzi vise HTML elemenata
Code:

<br>
<p style="text-align:center;" class="bold">
                KURSNA LISTA BR. 243<br>
                ZA DEVIZE
              </p>

Pa konkretnom <p> elementu pristupamo preko childNodes kolekcije odnosno preko njenog drugog elementa obzirom da je prvi element <br> element.
Zatim prelazimo na drugu tabelu koja sadrzi konkretne kurseve valuta gde u petlji cije granice su 1 i Tabela.rows.length - 1

iscitavamo pojedinacne celije odnosno njihova innerText svojstva.

Code:

    For i = 1 To Tabela.rows.length - 1
            Valuta = Trim(Tabela.rows.Item(i).cells(2).innerText)
            Faktor = Trim(Tabela.rows.Item(i).cells(3).innerText)
            Kupovni = Trim(Tabela.rows.Item(i).cells(4).innerText)
            Prodajni = Trim(Tabela.rows.Item(i).cells(5).innerText)
            'ovde debug print podataka
            Debug.Print Kupovni
                
        Next


Ovaj primer nema garbage collection odnosno objektne promenljive nisu nakon upotrebe postavljene na Nothing sto je dobra praksa.
Sledeca stvar je da uvek treba voditi racuna posebno prilikom pisanja ovakvih podataka u neku lokalnu bazu na format brojeva i datuma.
Masa izvora informacija na internetu nema RSS feedove tako da uvek ima potrebe da se neki podatak ocita direkno sa weba odnosno iz neke HTML strane. Neki web administratori se stite od ovakvih alata tako sto u serverskom skriptu "gledaju" referrer odnosno URL sa koga se pristupa konkretnoj strani tako da ovakav alat moze lako da se prepravi da nekoj strani pristupa preko neke druge zahtevane strane. Pokusaj zastite sadrzaja sa dinamickim linkovima koji se menjaju opet ne predstavlja problem ovakvom pristupu jer se uvek moze nekom archor elementu programski iscitati href svojstvo i iskoristiti se kao link za pristup.
Nadalje, webbrowser kontrola se na serveru prijavljuje kao pravi Internet Explorer tako da je sve u svemu na ovaj nacin moguce na prilicno jednostavan nacin pristupiti podacima, popunjavati programski <form> elemente i prakticno raditi sve kao kada bi to bio slucaj da direkno radite iz internet explorera.

[Ovu poruku je menjao Aleksandar Ružičić dana 17.12.2007. u 01:37 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Regularni izrazi u VB615.02.2008. u 05:05 - pre 196 meseci
Regularni izrazi u VB6

Nivo znanja: Beginner - Intermediate

U ovom tutorijalu ću objasniti kako da koristite regularne izraze (regular expressions) u VB6.
Ukoliko ne znate šta su to regularni izrazi možete pogledati na wikipediji Regular expression; ukratko rečeno regularni izrazi nam omogućavaju lako i brzo manipulisanje tekstom, bilo da zahtevamo da string bude u odredjenoj formi (recimo da proveravamo validnost email adrese), ili da želimo da "iscupamo" odredjene delove teksta, ili da ih zamenimo sa nečim drugim, regularni izrazi su najbolji način (i najbrži) da to učinimo.

Visual Basic 6 nažalost nema ugradjenu podršku za regularne izraze (za razliku od VB.NET-a) ali ništa nas ne sprečava da koristimo VBScript Regular Expressions biblioteku. Ova biblioteka je deo Internet Explorera i postoji u dve verzije 1.0 (korišćena u IE4) i 5.5 (koristi se u IE 5.5 i nadalje), i kako je Internet Explorer 5.5 uključen u instalaciju Windows-a 98 sasvim je sigurno koristiti ovu biblioteku jer nema instalacije Windowsa koji ne sadrži pomenuti dll (čak i Windows XP koji dolazi bez IE-a ima tu biblioteku).

Dakle, da pređemo na stvar. Pokrenite VB6 i izaberite Standard EXE projekat, u meniju Project izaberite References i u dobijenoj listi pronađite i čekirajte Microsoft VBScript Regular Expressions 5.5, pritisnite OK i to je to, sada imate podršku za regularne izraze u VB6!

Sledi ukratko objašnjenje objekata koji se nalaze u VBScript Regular Expressions biblioteci:
Code:

RegExp Class:
+=============================================================================+
|                                 Properties                                  |
+=============================================================================+
|  Property Pattern As String                                                 |
|   - najvažnije svojstvo RegExp objekta, ovde podešavamo regularni izraz koji|
|     će biti korišćen u Execute, Replace i Test procedurama                  |
+-----------------------------------------------------------------------------+
|  Property Global As Boolean  (podrazumevana vrednost je False)              |
|   - ukoliko je ovo svojstvo True regularni izraz će biti izvršen na celom   |
|     sourceString-u, tj biće pronadjeni svi delovi stringa koji odgovaraju   |
|     regularnom izrazu, ukoliko je ovo svojstvo False onda će RegExp objekat |
|     stati na prvom "pogotku" (Match)                                        |
+-----------------------------------------------------------------------------+
|  Property Multiline As Boolean (podrazumevana vrednost je False)            |
|   - slično kao kod Global svojstva, ukoliko je True regularni izraz će biti |
|     izvršen na svim linijama teksta, a ukoliko je False onda samo na jednoj |
+-----------------------------------------------------------------------------+
|  Property IgnoreCase As Boolean (podrazumevana vrednost je False)           |
|   - ukoliko je ovo svojstvo True pretraga će biti case-insensitive, tj mala |
|     i velika slova su ista, a ako je False onda će pretraga razlikovati mala|
|     slova od velikih.                                                       |
+=============================================================================+

+=============================================================================+
|                                   Methods                                   |
+=============================================================================+
| Function Execute(sourceString As String) As MatchCollection                 |
|  - izvršava regularni izraz (podešen u Pattern svojstvu) na sourceString    |
|    tekstu i vraća MatchCollection objekat                                   |
+-----------------------------------------------------------------------------+
| Function Replace(sourceString As String, replaceString As String) As String |
|  - isvršava regularni izraz (podešen u Pattern svojstvu) na sourceString    |
|    tekstu i menja sve delove teksta koji odgovaraju reguloarnom izrazu sa   |
|    replaceString tekstom (koji može da sadrži tzv backreferences)           |
+-----------------------------------------------------------------------------+
| Function Test(sourceString As String) As Boolean                            |
|  - izvršava regularni izraz (podešen u Pattern svojstvu) na sourceString    |
|    tekstu i vraća True ukoliko sourceString odgovara izrazu ili False ako   |
|    ne odgovara                                                              | 
+=============================================================================+


MatchCollection Class: 
+=============================================================================+
|                                 Properties                                  |
+=============================================================================+
| Default Property Item(Index As Long) As Match (Read Only)                   |
|  - vraća Match objekat iz kolekcije                                         |
+-----------------------------------------------------------------------------+
| Property Count As Long (Read Only)                                          |
|  - vraća broj Match objekata u kolekciji                                    |
+=============================================================================+


Match Class:
+=============================================================================+
|                                 Properties                                  |
+=============================================================================+
| Default Property Value As String (Read Only)                                |
|  - vraća tekst koji odgovara regularnom izrazu                              |
+-----------------------------------------------------------------------------+
| Property FristIndex As Long (Read Only)                                     |
|  - vraća poziciju u stringu na kojoj je ovaj Match objekat definisan, ovo   |
|    svojstvo je 0-based, tj prvi karakter u stringu je na poziciji 0, za     |
|    razliku od ugradjenih VB6 funkcija u kojima je prvi karakter na poziciji |
|    1                                                                        |
+-----------------------------------------------------------------------------+
| Propety Length As Long (Read Only)                                          |
|  - vraća dužinu prodnadjenog teksta                                         |
+-----------------------------------------------------------------------------+
| Property SubMatches As SubMatches (Read Only)                               |
|  - vraća kolekciju stringova koji predstavljaju tzv podpogotke, tj ako je   |
|    izraz sadržao podizraze (subexpressions) koji se definišu pomoću zagrada |
|    onda SubMatches sadrži po jedan string za svaki podizraz                 |
+=============================================================================+

SubMatches Class: 
+=============================================================================+
|                                 Properties                                  |
+=============================================================================+
| Default Property Item(Index As Long) As String (Read Only)                  |
|  - vraća string iz kolekcije                                                |
+-----------------------------------------------------------------------------+
| Property Count As Long (Read Only)                                          |
|  - vraća broj stringova u kolekciji                                         |
+=============================================================================+


Sada ćemo napraviti aplikaciju pomoću koje možemo da testiramo regularne izraze.
Kao dodatak tutorijalu biće objašnjena i upotreba RichTextBox kontrole, nju ćemo koristiti da prikažemo rezultate u lepo formatiranom obliku (sa raznim stilovima fonta i bojama)

Pokrenite VB6 i izaberite Standard EXE projekat, dodajte podršku sa regularne izraze (ovo je objašnjeno gore) i dodajte RichTextBox kontrolu (ovo ćete uraditi tako što u Project meniju izaberete Components, pronadjite i čekirajte Microsoft Rich TextBox Control 6.0 i pritisnike OK).

Na formu dodajte sledeće:

- TextBox (Name = txtExpression, Text = (prazno), Font = Courier New 9)
- TextBox (Name = txtSourceString, Text = (prazno))
- TextBox (Name = txtReplaceWith, Text = (prazno))
- CheckBox (Name = chbGlobal, Caption = Global)
- CheckBox (Name = chbMultiline, Caption = Multiline)
- CheckBox (Name = chbIgnoreCase, Caption = IgnoreCas)
- CommandButton (Name = cmdExecute, Caption = &Execute)
- CommandButton (Name = cmdReplace, Caption = &Replace)
- CommandButton (Name = cmdTest, Caption = &Test)
- CommandButton (Name = cmdClear, Caption = &Clear)
- RichTextBox (Name = rtbResults, ScrollBars = 2 - rtfVertical, Text = (prazno))

kontrole možete pozicionirati kako hoćete, ja sam sve složio ovako (dodao sam dva frejma i par labela, i TextBox-ovima sam podesio Alignment na 1 - Right Justify):


kada ste složili kontrole kako hoćete možemo preći na kod, evo prvo koda za cmdExecute_Click
Code:

' Execute metoda
Private Sub cmdExecute_Click()

    On Error GoTo hell
    
    Dim oRegExp     As RegExp
    Dim oMatches    As MatchCollection
    Dim oMatch      As Match
    Dim oSubMatches As SubMatches
    
    Dim lIndex      As Long
    
    ' prvo da proverimo da li su uneti potrebni podaci
    If LenB(txtExpression) = 0 Then
        MsgBox "You must enter regular expression.", vbExclamation, "Error"
        txtExpression.SetFocus
        Exit Sub
    End If
    
    If LenB(txtSourceString) = 0 Then
        MsgBox "You must enter source string.", vbExclamation, "Error"
        txtSourceString.SetFocus
        Exit Sub
    End If
    
    ' kreiramo novi RegExp objekat
    Set oRegExp = New RegExp
    
    ' podesavamo regularni izraz
    oRegExp.Pattern = txtExpression.Text
    
    ' podesavamo opcije
    oRegExp.Global = chbGlobal.Value
    oRegExp.MultiLine = chbMultiline.Value
    oRegExp.IgnoreCase = chbIgnoreCase.Value
    
    ' izrsavamo regularni izraz
    Set oMatches = oRegExp.Execute(txtSourceString.Text)
    
    ' upisujemo regularni izraz u rich text box
    AppendRichText vbNewLine & "Expression: "
    AppendRichTextLn txtExpression.Text & vbNewLine, vbBlue, Monospace Or Italic
    
    ' upisujemo source string
    AppendRichText "Source string: "
    AppendRichTextLn txtSourceString.Text & vbNewLine, RGB(64, 0, 0), Bold
    
    If oMatches.Count = 0 Then
    
        AppendRichTextLn " - No matches found."
    
    Else
        
        AppendRichText " Found "
        AppendRichText oMatches.Count, , Bold
        AppendRichTextLn " match(es):"
        
        For Each oMatch In oMatches
            With oMatch
                
                ' Value
                AppendRichTextLn "    " & .Value, RGB(0, 128, 0), Monospace Or Italic
                
                ' FirstIndex
                AppendRichText "    " & " FirstIndex: "
                AppendRichTextLn .FirstIndex, RGB(128, 0, 0), Bold Or Monospace
                
                ' Length
                AppendRichText "    " & " Length: "
                AppendRichTextLn .Length, RGB(128, 0, 0), Bold Or Monospace
                
                'SubMatches
                Set oSubMatches = .SubMatches
                
                AppendRichText "    " & " SubMatches: "
                AppendRichTextLn oSubMatches.Count, RGB(128, 0, 0), Bold Or Monospace
                
                For lIndex = 0 To oSubMatches.Count - 1
                    AppendRichText "        " & lIndex, RGB(128, 0, 0), Bold Or Monospace
                    AppendRichTextLn " " & oSubMatches(lIndex), RGB(0, 128, 0), Monospace
                Next
            
            End With
            
            AppendRichTextLn " " & String(80, "-") ' separator
            
        Next
        
        AppendRichTextLn " " & String(80, "-") ' separator
    
    End If
    
    Exit Sub
hell:
    MsgBox Err.Description, vbCritical, "Error [" & Err.Source & ": " & Err.Number & "]"
    Err.Clear
End Sub


kada proverimo da su uneti potrebni podaci (regularni izraz i source string) onda kreiramo novi RegExp objekat i izvršavamo regularni izraz:
Code:

' kreiramo novi RegExp objekat
Set oRegExp = New RegExp

' podesavamo regularni izraz
oRegExp.Pattern = txtExpression.Text

' podesavamo opcije
oRegExp.Global = chbGlobal.Value
oRegExp.MultiLine = chbMultiline.Value
oRegExp.IgnoreCase = chbIgnoreCase.Value

' izrsavamo regularni izraz
Set oMatches = oRegExp.Execute(txtSourceString.Text)

sada oMatches sadrži 0 ili više Match objekata.

Ukoliko je broj Match objekata 0 štampamo " - No matches found." a ukoliko je taj broj veći od nula onda za svaki oMatch objekat u oMatches kolekciji štampamo podatke (svojstva Match objekta).

Za štampanje smo koristili AppendRichText i AppendRichTextLn funkcije, sledi njihov kod:
Code:

' dodaje text u richtextbox i formatira ga
Private Sub AppendRichText(sText As String, _
                            Optional color As Long = vbBlack, _
                            Optional style As RichStyles = Normal)
    
    Dim iStart  As Long
    
    With rtbResults
        
        iStart = Len(.Text) + 1
        
        .SelStart = iStart
        .SelLength = Len(sText)
        .SelColor = color
        .SelBold = style And Bold
        .SelItalic = style And Italic
        .SelUnderline = style And Underline
        .SelFontName = IIf(style And Monospace, "Courier New", "Arial")
        .SelText = sText
        
    End With
    
End Sub
'

Private Sub AppendRichTextLn(sText As String, _
                            Optional color As Long = vbBlack, _
                            Optional style As RichStyles = Normal)
                            
    AppendRichText sText & vbNewLine, color, style
    
End Sub

i još na vrh forme dodajte deklaraciju za RichStyle:
Code:

Enum RichStyles
    Normal = 0
    Italic = 1
    Bold = 2
    Underline = 4
    Monospace = 8
End Enum


AppendRichText dodajte text u richtextbox i formatira ga na sledeći način:
prvo zapamtimo dužinu teksta koji je trenutno u rtbResults i dodamo 1 (ova vrednost će da bude početna pozicija string koji dodajemo - SelStart)
zatim podesimo dužinu teksta koji unosimo (SelLength), boju (SelColor), stil (SelBold, SelItalic, SelUnderline), font (SelFontName)
i na kraju dodamo tekst (SelText) koji će biti formatiran

AppendRichTextLn radi to isto (poziva AppendRichText) samo što na kraj stringa dodaje vbNewLine (prelaz u novi red)

Sada možete pokrenuti program da isprobamo da li Execute metoda radi. Unesite neki regularni izraz i source string i pritisnite Execute. Evo mog rezultata:


sada sledi kod za cmdReplace_Click:
Code:

' Replace metoda
Private Sub cmdReplace_Click()
    On Error GoTo hell
    
    Dim oRegExp     As RegExp
    Dim sResult     As String
    
    ' prvo da proverimo da li su uneti potrebni podaci
    If LenB(txtExpression) = 0 Then
        MsgBox "You must enter regular expression.", vbExclamation, "Error"
        txtExpression.SetFocus
        Exit Sub
    End If
    
    If LenB(txtSourceString) = 0 Then
        MsgBox "You must enter source string.", vbExclamation, "Error"
        txtSourceString.SetFocus
        Exit Sub
    End If
    
    ' kreiramo novi RegExp objekat
    Set oRegExp = New RegExp
    
    ' podesavamo regularni izraz
    oRegExp.Pattern = txtExpression.Text
    
    ' podesavamo opcije
    oRegExp.Global = chbGlobal.Value
    oRegExp.MultiLine = chbMultiline.Value
    oRegExp.IgnoreCase = chbIgnoreCase.Value
    
    ' izvrsavamo regexp replace
    sResult = oRegExp.Replace(txtSourceString.Text, txtReplaceWith.Text)
    
    ' upisujemo regularni izraz u rich text box
    AppendRichText vbNewLine & "Expression: "
    AppendRichTextLn txtExpression.Text & vbNewLine, vbBlue, Monospace Or Italic
    
    ' upisujemo source string
    AppendRichText "Source string: "
    AppendRichTextLn txtSourceString.Text & vbNewLine, RGB(64, 0, 0), Bold
    
    ' upisujemo replace with string
    AppendRichText "Replace with: "
    AppendRichTextLn txtReplaceWith.Text & vbNewLine, RGB(0, 128, 0), Bold
    
    ' upisujemo rezultat
    AppendRichText "Result: "
    AppendRichTextLn sResult & vbNewLine, RGB(128, 0, 0), Italic Or Monospace
    
    AppendRichTextLn " " & String(80, "-") ' separator
    
    Exit Sub
hell:
    MsgBox Err.Description, vbCritical, "Error [" & Err.Source & ": " & Err.Number & "]"
    Err.Clear
End Sub

Priča je ista kao kod Execute samo što sad izvršavamo Replace metodu RegExp objekta i prosledjujemo joj dva parametra, source string i string kojim će svaki Match biti zamenjen.
U replace with stringu je moguće koristiti tzv backreferences, tj ako se u replace with nalazi $1 to će biti zamenjeno sa prvim podizrazom u regularnom izrazu (tj ono što se nalazi u prvoj zagradi), $2 odgovara drugom podizrazu itd.

Evo mog rezultata:


od RegExp metoda nam je ostala još Test metoda, evo koda za cmdTest_Click:
Code:

' Test metoda
Private Sub cmdTest_Click()
    
    On Error GoTo hell
    
    Dim oRegExp     As RegExp
    Dim bResult     As Boolean
    
    ' prvo da proverimo da li su uneti potrebni podaci
    If LenB(txtExpression) = 0 Then
        MsgBox "You must enter regular expression.", vbExclamation, "Error"
        txtExpression.SetFocus
        Exit Sub
    End If
    
    If LenB(txtSourceString) = 0 Then
        MsgBox "You must enter source string.", vbExclamation, "Error"
        txtSourceString.SetFocus
        Exit Sub
    End If
    
    ' kreiramo novi RegExp objekat
    Set oRegExp = New RegExp
    
    ' podesavamo regularni izraz
    oRegExp.Pattern = txtExpression.Text
    
    ' podesavamo opcije
    oRegExp.Global = chbGlobal.Value
    oRegExp.MultiLine = chbMultiline.Value
    oRegExp.IgnoreCase = chbIgnoreCase.Value
    
    ' izvrsavamo test
    bResult = oRegExp.Test(txtSourceString.Text)
    
    ' upisujemo regularni izraz u rich text box
    AppendRichText vbNewLine & "Expression: "
    AppendRichTextLn txtExpression.Text & vbNewLine, vbBlue, Monospace Or Italic
    
    ' upisujemo source string
    AppendRichText "Source string: "
    AppendRichTextLn txtSourceString.Text & vbNewLine, RGB(64, 0, 0), Bold

    ' upisujemo rezultat
    AppendRichText "Test: "
    If bResult Then
        AppendRichTextLn "Success" & vbNewLine, RGB(0, 128, 0), Monospace Or Italic
    Else
        AppendRichTextLn "Failed" & vbNewLine, RGB(255, 0, 0), Monospace Or Italic Or Bold
    End If
    
    AppendRichTextLn " " & String(80, "-") ' separator
    
    Exit Sub
hell:
    MsgBox Err.Description, vbCritical, "Error [" & Err.Source & ": " & Err.Number & "]"
    Err.Clear
End Sub


pokrenite program i isprobajte test metodu, prvo u source string unesite string za koji znate da će odgovara regularnom izrazu a onda string koji ne odgovara izrau (da bi dobili i Success i Failed), evo mog rezultata:


i ostao nam je još kod za cmdClear_Click - jednostavno brišemo sadržaj rtbResult:
Code:

Private Sub cmdClear_Click()
    
    rtbResults.Text = vbNullString
    
End Sub


i to je to. Uz poruku sam okačio ceo projekat, a u zipu se nalazi i exe verzija programa.

[Ovu poruku je menjao Aleksandar Ružičić dana 15.02.2008. u 13:06 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.112.*



+7 Profil

icon Windows hooks VB 6 tutorijal21.04.2008. u 19:46 - pre 194 meseci
Windows hooks VB 6 tutorijal

Nivo znanja: Intermediate - Advanced

Windows hooks su mehanizmi na windows Os-u sa pristup nekim globalnim podatcima operativnog sistema.
U ovom programu koriscene su hooks za pracenje pozicije misa (postoje i druge). Vise o teoretskom delu pronadjite u MSDN-u ili na http://www.google.com/search?q=Windows+hooks
Programom moze da se vide neki podatci o prozorima na ekranu i da se napravi providnost prozora (Win 2000 i vise verzije).
Ovaj kod je preveden is jednog mog free asm programa u VB6 i koriscene su neke tehnike koje se bas ne vidjaju cesto u VB6.
U kodu su i opsirnija objasnjenja ...
Download fajla
http://www.eurora3d.com/files/VBWindows.zip
 
Odgovor na temu

[es] :: Visual Basic 6 :: Visual Basic 6 Tutorijali
(TOP topic, by Aleksandar Ružičić)

[ Pregleda: 23209 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.