Witam wszystkich ponownie. Jeśli przeszedłeś kurs Visual Basic by SLASH na poziomie podstawowym bez problemów, to czas na bardziej zaawansowane funkcje.

Mam nadzieję, że ten język przypadł Ci do gustu i masz zamiar w nim programować.


Nie będę się dużo rozpisywał – zaczynamy więc:


KURS VISUAL BASIC

POZIOM ZAAWANSOWANY

BY SLASH




Funkcja With


Zamiast pisać:


Label1.Caption = „Tekst”

Label1.Size = 16

Label1.Bold = True

Label1.Underline = False


Możemy napisać:


With Label1

.Caption = „Tekst”

.Size = 16

.Bold = True

.Underline = False

End With



Schowek Windows


Visual Basic potrafi obsługiwać schowek Windows. Możemy na nim wykonać działania:


Składnia:


Zmienna = Clipboard.Mode


Mode:


Clear

Czyści zawartość schowka

GetData

Pobiera ze schowka grafikę

GetText

Pobiera ze schowka tekst

SetData

Kopiuje do schowka grafikę

SetText

Kopiuje do schowka tekst




Zastępowanie błędów i funkcja Goto


Bardzo często w aplikacjach VB będziesz używał funkcję zastępującą błędy. Po co ? Np., gdy w okienko przeznaczone na liczbę wpiszesz jakieś litery – wyskakuje błąd. Czy nie lepiej by było, abyśmy sami zdecydowali o komunikacie błędu. Oto przykład pokazujący zdefiniowany przez nas komunikat o błędzie:


On Error Resume Next ‘Jeśli błąd to go nie wyświetlaj tylko kontynuuj...

Nn = 4 / 0 ‘Przykładowe spowodowanie błędu

If err.number <> 0 then ‘Jeśli są błędy (czyli wynik err.number nie jest równy 0)

Goto line1 ‘ Idź do linii oznaczonej „Line1”

Else ‘W przeciwnym przypadku (czyli jeśli nie ma błędów)

Goto line2 ‘Idź do linii oznaczonej “Line2”

End if ‘Koniec założeń


Line1: ‘Deklaracja linii “Line1”

If err.number = 11 then ‘Jeśli wystąpił błąd 11 (czyli dzielenie przez 0)

X = MsgBox(“Cholero! Nie dzieli się przez 0 !!!”) ‘Odpowiedni komunikat

Exit Sub ‘Zakańczamy procedurę

ElseIf err.number <> 11 then ‘Jeśli inny błąd to

X = MsgBox(“Jakiś inny błąd”) ‘Odpowiedni komunikat

Exit Sub ‘Zakańczamy procedurę

End if ‘Zakańczamy założenia


Line2: ‘Deklaracja linii 2

X = MsgBox(„Bez błędów”) ‘ Jeśli program dotarł tutaj to znaczy że brak błędów




Funkcja InStr


Przeszukuje stringi i zwraca pozycję danej litery np.


String = „XXpXXpXXPXXP”

Szukane = „P”


Wynik = InStr(String, Szukane) ‘Funkcja zwróci 9

Wynik = InStr(4, String, Szukane) ‘Funkcja zaczyna szukać dopiero od 4 znaku, czyli

‘ 4 znak to pierwszy znak i zwróci 6


Wynik = InStr(String, „W”) ‘Funkcja zwróci 0, gdyż dana litera nie występuje w stringu



Funkcja Line


Rysuje linię prostą od punktu (x1, y1) do (x2,y2) w wybranym kolorze:


Line(100,200) – (3000,4552), RGB(200,12,12)




Keyboard, czyli jaki klawisz nacisnąłem ?



Kliknij dwukrotnie na formie, teraz wybierz zdarzenie KeyDown. Oznacza to reakcję na wciśnięcie jakiegoś klawisza. Teraz dodaj kod:


Dim ShiftDown, AltDown, CtrlDown, Txt

ShiftDown = (Shift And vbShiftMask) > 0

AltDown = (Shift And vbAltMask) > 0

CtrlDown = (Shift And vbCtrlMask) > 0

If KeyCode = vbKeyF2 Then ' Jeśli nacisnęliśmy F2 to próbujemy kombinacji.


If ShiftDown And CtrlDown And AltDown Then

Txt = "SHIFT+CTRL+ALT+F2."

ElseIf ShiftDown And AltDown Then

Txt = "SHIFT+ALT+F2."

ElseIf ShiftDown And CtrlDown Then

Txt = "SHIFT+CTRL+F2."

ElseIf CtrlDown And AltDown Then

Txt = "CTRL+ALT+F2."

ElseIf ShiftDown Then

Txt = "SHIFT+F2."

ElseIf CtrlDown Then

Txt = "CTRL+F2."

ElseIf AltDown Then

Txt = "ALT+F2."

ElseIf Shift = 0 Then

Txt = "F2."

End If


MsgBox ("Nacisnąłeś " & Txt)

End If


C ała tablica kodów znajduje się tu – kliknij po prostu dwukrotnie na ikonie:



Keyboard 2 – czyli co wpisałem ?


Nieraz jednak zachodzi potrzeba sprawdzenia czy wpisałem coś dużą litero czy małą. Poprzednia funkcja reaguje tylko na wciśnięcie klawisza – nie sprawdza jednak co wyskakuje nam na ekranie. Owszem – można sprawdzić czy piszemy dużą literą – bo to w końcu wciśnięte dwa klawisze Shift + Litera. A jeśli mamy włączonego Caps Lock-a ? Program wykryje tylko naciśnięcie litery – więc stwierdzi że mała...


Można się z tym dogadać za pomocą funkcji Chr. Funkcję zastosujmy np. do okienka tekstowego. Zmieńmy więc zdarzenie na KeyPress (Czyli naciśnięcie). Pewnie spytasz dlaczego nie KeyDown. KeyDown zwraca tylko wciśnięty klawisz, a KeyPress zwraca kod Ascii wpisanego znaku.

Dodajmy kod:


Dim znak

Znak = Chr(KeyAscii)

MsgBox(„Wpisałeś : ” & znak)



Funkcja Circle:


Rysuje ona okręgi.


Dim CX, CY, Promien

ScaleMode = 3 ‘Tutaj odstęp promieni (5 – sama obręcz)

CX = ScaleWidth / 2 ‘Wyznaczenie współrzędnej x środka formy

CY = ScaleHeight / 2 ‘Wyznaczenie współrzędnej y środka formy

If CX > CY Then

Limit = CY ‘Ustalenie o którą krawędź ma się opierać ostatni promień

Else

Limit = CX
End If

For Promien = 0 to limit

Circle(CX,CY), Promien, RGB(Rnd * 255, RND * 255, RND * 255)

N ext Promien




Operator Like


Przeszukuje stringi w poszukiwaniu znaków (nie pojedyńczego znaku jak to było w przypadku funkcji InStr). Funkcja zwraca True (czyli prawda) lub False.


yCheck = "aBBBa" Like "a*a" ' Zwraca True.

MyCheck = "F" Like "[A-Z]" ' Zwraca True.

MyCheck = "F" Like "[!A-Z]" ' Zwraca False.

MyCheck = "a2a" Like "a#a" ' Zwraca True.

MyCheck = "aM5b" Like "a[L-P]#[!c-e]" ' Zwraca True.

MyCheck = "BAT123khg" Like "B?T*" ' Zwraca True.

M yCheck = "CAT123khg" Like "B?T*" ' Zwraca False.



Jak rysować na formie za pomocą myszy:


Proces rysowania jest bardziej złożony i składa się z trzech kroków :


  1. Klikamy dwukrotnie na formie i zmieniamy zdarzenie z Load na MousMove. Teraz dodajemy następujący kod:


If Button = vbKeyLButton Then ‘Jeśli wciśnięty lewy klawisz myszy

PSet (X, Y) ‘ Narysuj punkt o współrzędnych myszy (x,y)

End If

Po uruchomieniu aplikacji, zobaczymy, że faktycznie możemy rysować, ale tylko wtedy gdy wolno poruszamy myszką. Dlaczego tak się dzieje ? Otóż procesor nie nadąża z rysowaniem punktów. No więc jak robią to inne programy. Otóż stosują one prostą sztuczkę – rysują prostą między dwoma punktami, za którymi nadążył procesor. Pewnie zauważyłeś w aplikacjach, że zamiast ładnego odręcznego okręgu wychodzi iluśtamkąt.


  1. Tworzymy moduł (Project-Add module) i dopisujemy do niego:


Global ostX, ostY ‘Ostatnie współrzędne



Teraz wracamy do Form1_MousMove i zmieniamy wszystko na:


If Button = vbKeyLButton Then ‘Jeśli wciśnięty lewy klawisz myszki

Line (ostX, ostY)-(X, Y) ‘Rysuj prostą od ostatniego punktu do aktualnego

ostX = X ‘Zapisanie aktualnej pozycji myszy jako ostatniej

ostY = Y ‘ j.w

End If


Po uruchomieniu zauważymy znaczną różnicę – da się rysować płynnie. Jest jednak mały problem, nie da się narysować dwóch krzywych i rysowanie zawsze zaczyna się z lewego górnego rogu. Aby to skorygować:


  1. W zdarzeniu MouseDown dopisujemy:


ostX = X

ostY = Y


I wszystko powinno działać jak trzeba. Do formularza możemy także dodać przycisk który będzie czyścił zawartość ekranu – wystarczy dodać do niego :


CLS


Możemy także pokusić się o zmianę koloru pędzla i jego grubość.

W sekcji Form1_Load dopisz:


DrawWidth = 10 ‘Grubość pędzla

F oreColor = RGB(0, 0, 255) ‘Kolor pędzla (niebieski)




Obiecałem już w kursie podstawowym, że wyjaśnię jak ListBox ma rozpoznawać wybrany element:


Cała funkcja powinna wyglądać tak: (Zakładam, że stworzyłeś ListBox i nie zmieniałeś jego domyślej nazwy – czyli zostało List1


Tworzymy mduł i deklarujemy dwie tablice:


Global tytul(10)

Global opis(10)




W sekcji Form_Load dopisujemy:


Dim i


tytul(1) = "Jeden"

tytul(2) = "Dwa"

tytul(3) = "Trzy"

opis(1) = "Opis do jeden"

opis(2) = "Opis do dwa"

opis(3) = "Opis do trzy"


For i = 1 To 10

If tytul(i) = "" Then Exit For

List1.AddItem tytul(i)

List1.ItemData(List1.NewIndex) = i

Next i



A w procedurze kliknięcia na listBox:


im wynik

wynik = opis(List1.ItemData(List1.ListIndex))

MsgBox (wynik)


I teraz czy lista posortowana, czy też nie program zawsze prawidłowo będzie rozróżniał dane



Teraz zajmiemy się plikami na naszym twardzielu-


Kopiowanie pliku:


FileCopy „C:\plik.dat”,”D:\backupplik.dat”


Przenoszenie i zmiana nazwy:


Aby tylko zmienić nazwę:


Name "C:\ptik.htm" As "C:\index.htm"


Aby przenieść plik:


Name "C:\ptik.htm" As "D:\HTML\ptik.htm"


Aby przenieść i zmienić nazwę:


Name "C:\ptik.htm" As "D:\HTML\PTiK\index.htm"


Aby pobrać wielkość pliku (w bajtach):


Wielkosc = FileLen(„C:\ptik.htm”)



Teraz jedna z ciekawszych funkcji : Stymulowanie naciskaniem klawiszy


Do jakiegoś przycisku dodaj kod:


x = Shell("c:\windows\Calc.exe", 1) ‘Uruchom kalkulator

SendKeys "10{+}50", True ‘Prześlij klawisze 10 + 50, Poczekaj na reakcję

SendKeys "=", True ‘Prześlij klawisz =, poczekaj na reakcję



W ten sposób kalkulator powinien wyświetlić liczbę 60


Po co to True na końcu każdej instrukcji SendKeys ?

Jest to instrukcja dla naszej aplikacji, że ma zaczekać, aż uruchomiony program odpowie.

Np.,gdybyśmy nie napisali True pierwsza linijka została by przesłana, ale zaraz pojawiło by się =. Program mógłby nie zdążyć pobrać całego 10+50 i wyświetlił by nam albo błędną odpowiedź, albo by w ogóle nie zareagował (przy szybkich procesorach). Tak więc zawsze stosuj funkcję TRUE !!!


Więcej o tej funkcji znajdziesz w Helpie.




I to by było na tyle jeśli chodzi o funkcje zaawansowane. Sorki, że obiecałem, że będzie jeszcze o API i Bazach danych. Miało tak być, ale postanowiłem się uczyć innego języka Visual C++ - VB zostawiłem w spokoju.

Ale dla pocieszenia powiem Wam, że jak dojdę do wprawy w VC++ to zaraz wezmę się za pisanie kursu – także tak prostego w zrozumieniu jak VB.

Trzeba patrzeć w przyszłość – wiele osób powie, że VB to bardziej język skryptowy. Jego wadami jest powolność i małe możliwości. Nie chcę Wam wmówić, że niepotrzebnie uczyliście się tego języka – jeśli Wam wystarcza to kontynuujcie naukę – kupcie sobie jakąś dobrą książkę (oczywiście nie dla początkujących). Jeśli jednak nie widzisz przyszłości z tym językiem, to przystąp do nauki C++. Na pewno będzie Ci dużo łatwiej znając już VB. Wiele funkcji jest podobnie zbudowanych w C++. No a znać dwa języki programowania to już coś – tylko najlepsi to potrafią :)))


Kiedy będzie kurs VC++-a , tego jeszcze nie wiem. To zależy od tego jak szybko się go nauczę. Zaglądaj na www.ptik.prv.pl .