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
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
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 :
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.
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ć:
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 .