Visual Basic 6 - Instrukcje sterujące
If...Then...Else |
Select Case |
Do ... Loop |
While...Wend |
For...Next |
For Each...Next |
Exit |
On Error |
Resume |
Stop |
With |
End
Powoduje warunkowe wykonanie grupy instrukcji, zależnie od wartości wyrażenia. Składnia jednowierszowa: If warunek Then [instrukcje] [Else instrukcje_else] Składnia wielowierszowa: If warunek_1 Then [ instrukcje ] [ ElseIf warunek_n Then [instrukcje_elseif_n ] ... [ Else [ instrukcje_else ] ] End IfGdzie:
Użycie: Postać jednowierszową stosuje się w krótkich, prostych testach. Postać wielowierszowa jest bardziej uniwersalna, zgodna z regułami zasad programowania strukturalnego, a także bardziej czytelna i umożliwiająca łatwiejsze wykrywanie błędów. W postaci jednowierszowej można, jako rezultat decyzji If...Then, wykonać kilka instrukcji, ale wszystkie instrukcje muszą zmieścić się w jednym wierszu i muszą być oddzielone dwukropkami, jak w poniższym przykładzie: If A > 10 Then A = A + 1 : B = B + A : C = C + B Instrukcja If w postaci blokowej musi być pierwszą instrukcją w wierszu. Elementy Else, ElseIf i End If instrukcji If równiez muszą rozpoczynac nowy wiersz. Blok If musi kończyć się instrukcją End If. Klauzule Else i ElseIf są nieobowiązkowe. W blokowej składni instrukcji If może wystąpić dowolna ilość klauzul ElseIf, ale żadna z nich jednak nie może się pojawić po klauzuli Else. Blokowa instrukcja If może być zagnieżdżona czyli umieszczona wewnątrz innej instrukcji. W czasie wykonywania blokowej instrukcji If sprawdzany jest warunek. Jeśli jego wartością jest True, wykonywane są instrukcje występujące po słowie Then. Jeśli wartością warunku jest False, obliczane są po kolei warunki ElseIf (jeśli istnieją). Po znalezieniu pierwszego warunku o wartości True wykonywane są instrukcje umieszczone po odpowiadającym temu warunkowi słowie Then. Jeśli żaden z warunków ElseIf nie jest równy True lub jeśli nie ma klauzul ElseIf, wykonywane są instrukcje umieszczone po słowie Else. Po wykonaniu odpowiednich instrukcji występujących po słowie Then lub Else sterowanie przechodzi do instrukcji bezpośrednio następującej po End If. Wskazówka: Jeśli wykonanie pewnych czynności zależy od wartości pojedynczego wyrażenia, wygodniejsza może być instrukcja Select Case. Jednak klauzula TypeOf nazwa_obiektu Is typ_obiektu nie może wystąpić w instrukcji Select Case. Przykład: Poniższy przykłada pokazuje instrukcję If...Then...Else w formie bloku i jednowierszowej.Dim Num As Integer Dim Cyfry As Integer Num = 53 If Num < 10 Then Cyfry = 1 ElseIf Num < 100 Then ' Warunek jest spełniony, więc instrukcja zostanie wykonana. Cyfry = 2 Else Cyfry = 3 End If ' Ustaw wartość ciągu, korzystając ze składni jednowierszowej. If Cyfry = 1 Then Ciąg = "Jeden" Else Ciąg = "Więcej niż jeden" Poniżej wykorzystano konstrukcję If TypeOf...Then...Else do określenia, czy formant przekazany do procedury jest polem tekstowym. Sub TypFormantu(MójFormant As Control) If TypeOf MójFormant Is CommandButton Then Debug.Print "Przekazano " & TypeName(MójFormant) ElseIf TypeOf MójFormant Is CheckBox Then Debug.Print " Przekazano " & TypeName(MójFormant) ElseIf TypeOf MójFormant Is TextBox Then Debug.Print " Przekazano " & TypeName(MójFormant) End If End Sub Powoduje wykonanie jednej z kilku grup instrukcji, zależnie od wartości wyrażenia. Składnia : Select Case wyrażenie_testowe [ Case lista_wyrażeń_n [ instrukcje_n ] ] ... [ Case Else [ instrukcje_else ] ] End SelectGdzie:
Użycie: Jeśli wartość wyrażenia_testowego pasuje do jednej z pozycji listy_wyrażeń klauzuli Case, wówczas wykonywane są instrukcje występujące po tej klauzuli Case, aż do następnej klauzuli Case albo, w przypadku klauzuli ostatniej, aż do instrukcji End Select. Następnie sterowanie jest przekazywane do instrukcji umieszczonej bezpośrednio za End Select. Jeśli wyrażenie_testowe pasuje do listy_wyrażeń w kilku klauzulach Case, wówczas wykonywane są instrukcje tylko z pierwszej w kolejności klauzuli. Klauzula Case Else zawiera instrukcje (instrukcje_else), które zostaną wykonane wówczas, gdy wyrażenie_testowe nie pasuje do żadnej z list_wyrażeń klauzul Case. Klauzula Case Else nie jest obowiązkowa, jednak warto ją umieścić w bloku Select Case, by uwzględnić nie przewidziane w klauzulach Case wartości wyrażenia_testowego. Jeśli wyrażenie_testowe nie pasuje do żadnej listy klauzul Case i nie ma klauzuli Case Else, sterowanie programu przechodzi od razu do instrukcji umieszczonej bezpośrednio za instrukcją End Select. Każda klauzula Case może obejmować wiele wyrażeń i zakresów. Poniższy przykładowy wiersz jest całkowicie poprawny: Case 1 To 4, 7 To 9, 11, 13, Is > MaxLiczba Uwaga W instrukcji Select Case operator porównania Is oznacza coś innego niż słowo kluczowe Is. Zakresy i wyrażenia mogą się także odnosić do ciągów znaków. W następnym przykładzie lista klauzuli Case odpowiada ciągowi znaków równemu dokładnie cokolwiek, ciągom zawartym w porządku alfabetycznym pomiędzy deser a zupa lub ciągowi równemu bieżącej wartości ElemTest: Case "cokolwiek", "deser" To "zupa", ElemTest Instrukcje Select Case można zagnieżdżać. Dla każdej zagnieżdżonej instrukcji Select Case musi istnieć odpowiadająca jej instrukcja End Select. Przykład: Dim Num As Integer Num = 8 Select Case Num Case 1 To 5 ' Num zawiera się między 1 i 5 Debug.Print "W przedziale od 1 do 5" Case 6, 7, 8 ' Num z przedziału od 6 do 8 Debug.Print " W przedziale od 6 do 8" Case Is > 8 And Num < 11 ' przedział od 9 do 10 Debug.Print "Wartość większa niż 8" Case Else ' pozostałe wartości Debug.Print "Poza przedziałem od 1 do 10" End Select Powtarza blok instrukcji tak długo, jak długo warunek ma wartość True lub dopóki warunek nie przyjmie wartości True. Składnia: Do [{While | Until} warunek] [instrukcje] [Exit Do] [instrukcje] Loop lub: Do [instrukcje] [Exit Do] [instrukcje] Loop [{While | Until} warunek Gdzie:
Użycie: Wewnątrz instrukcji Do.Loop można umieścić dowolną liczbę instrukcji Exit Do, które powodują natychmiastowe wyjście z pętli. Instrukcja Exit Do jest często stosowana po sprawdzeniu pewnego warunku, np. w instrukcji If.Then. Jeśli warunek zachodzi, instrukcja Exit Do przekazuje sterowanie do instrukcji następującej bezpośrednio po instrukcji Do...Loop. Zastosowana wewnątrz zagnieżdżonej instrukcji Do.Loop, instrukcja Exit Do przekazuje sterowanie do pętli bezpośrednio obejmującej zagnieżdżoną instrukcję Do.Loop. Przykład: Dim Flaga As Boolean Dim Licznik As Integer Flaga = True Licznik = 0 Do ' Zewnętrzna pętla Do While Licznik < 20 ' Wewnętrzna pętla Licznik = Licznik + 1 If Licznik = 10 Then Flaga = False Exit Do ' Wyjdź z wewnętrznej pętli End If Loop Loop Until Flaga = False Wykonuje ciąg instrukcji tak długo, jak długo warunek ma wartość True. Składnia: While warunek [ instrukcje ] WendGdzie:
Użycie: Jeśli warunek ma wartość True, to wykonywane są wszystkie instrukcje aż do instrukcji Wend. Następnie sterowanie powraca do instrukcji While i warunek jest sprawdzany ponownie. Jeśli warunek ma nadal wartość True, to proces jest powtarzany. Jeśli warunek ma wartość False, to wykonywanie programu jest przenoszone do instrukcji następującej bezpośrednio po instrukcji Wend. Pętle While...Wend mogą być zagnieżdżane do dowolnego poziomu. Każda instrukcja Wend odpowiada ostatniej instrukcji While. Wskazówka Bardziej elastycznym sposobem tworzenia pętli warunkowych jest zastosowanie instrukcji Do...Loop. Przykład: Dim Licznik As Integer Licznik = 0 While Licznik < 20 Licznik = Licznik + 1 Wend Debug.Print Licznik ' Wyświetla liczbę 20Powtarza grupę instrukcji określoną liczbę razy. Składnia: For licznik = początek To koniec [ Step krok ] [ instrukcje ] [ Exit For ] [ instrukcje ] Next [ licznik ]Gdzie:
Użycie: krok może być dodatni lub ujemny. Wartość tego elementu determinuje sposób realizacji pętli, jak widać poniżej:
Po wykonaniu wszystkich instrukcji znajdujących się wewnątrz pętli do licznika dodawany jest krok. Następnie albo instrukcje pętli zostaną wykonane ponownie (jeśli nadal spełniony jest warunek, który implikował pierwsze wykonanie pętli), albo następuje wyjście z pętli, a wykonywanie programu zostaje wznowione od instrukcji następującej bezpośrednio po instrukcji Next. Wskazówka Zmiana wartości licznika przez instrukcje wewnątrz pętli powoduje, iż program traci na czytelności i trudniej wykryć w nim ewentualne błędy. Inną możliwością zakończenia wykonywania pętli jest umieszczenie w niej instrukcji Exit For. Instrukcja Exit For występuje często po sprawdzeniu pewnego warunku, np. w instrukcji If.Then i w przypadku, gdy taki warunek jest spełniony, przekazuje sterowanie do instrukcji bezpośrednio następującej po instrukcji Next. Pętle For...Next mogą być zagnieżdżane przez umieszczenie jednej pętli wewnątrz drugiej. Każda pętla musi jednak mieć własny licznik. Poniżej przedstawiony fragment programu jest poprawny: For i = 1 To 10 For j = 1 To 10 For k = 1 To 10 ... Next k Next j Next i Przykład: Dim Słowo As Integer Dim Znak As Integer Dim Ciąg As String For Słowo = 10 To 1 Step -1 For Znak = 0 To 9 Ciąg = Ciąg & Znak Next Znak Ciąg = Ciąg & " " Next Słowo Powtarza grupę instrukcji dla każdego elementu tablicy lub kolekcji. Składnia: For Each element In grupa [ instrukcje ] [ Exit For ] [ instrukcje ] Next [ element ]gdzie:
Użycie: Sterowanie wchodzi do bloku For Each tylko wtedy, gdy w grupie znajduje się choć jeden element. Wówczas wszystkie instrukcje pętli są wykonywane dla pierwszego elementu grupy. Jeśli w grupie jest więcej elementów, wszystkie instrukcje zawarte w pętli są wykonywane dla każdego elementu. Po wyczerpaniu się elementów grupy pętla kończy się i program przechodzi do instrukcji następującej bezpośrednio po instrukcji Next. Inną możliwością zakończenia wykonywania pętli jest umieszczenie w niej instrukcji Exit For. Instrukcja Exit For występuje często po sprawdzeniu pewnego warunku, np. w instrukcji If.Then w przypadku, gdy warunek jest spełniony, przekazuje sterowanie do instrukcji bezpośrednio następującej po instrukcji Next. Pętle For Each...Next mogą być zagnieżdżane przez umieszczenie jednej pętli wewnątrz drugiej. Każda pętla musi jednak mieć swój własny, "prywatny" element. Uwaga Jeśli w instrukcji Next opuszczono parametr element, pętla jest wykonywana tak, jakby element wystąpił. W przypadku wystąpienia instrukcji Next przed odpowiadającą jej instrukcją For, wystąpi błąd kompilacji. Instrukcji For Each...Next nie można zastosować do tablicy typu zdefiniowanego przez użytkownika, gdyż zmienna typu Variant nie może zawierać wartości typu zdefiniowanego przez użytkownika. Przykład: Poniższy przykład zakłada, że w Formie jest tablica kontrolek TextBox. W tym celu należy umieścić na Formie co najmniej 2 kontrolki TextBox i każdej nadać nazwę txtText oraz ustawić atrybut Index. Dim oObiekt As TextBox, bJest As Boolean For Each oObiekt In Me.txtText If oObiekt.Text = "Szukany tekst" Then bJest = True Exit For End If Next {rzerywa funkcję, procedurę lub blok instrukcji. Składnia:
Przykład: Dim i As Integer, x As Integer Do ' otwarcie nieskończonej pętli Do For i = 1 To 1000 ' pętla For wykonywana 1000 razy x = Int(Rnd * 1000) ' generowanie liczby losowej Select Case x Case 1: Exit For ' jeżeli 1, to przerywamy For Case 10: Exit Do ' jeżeli 10, to przerywamy Do Case 100: Exit Sub ' jeżeli 100, to przerywamy Sub End Select Next Loop Włącza/wyłącza procedurę obsługi błędów i podaje jej lokalizację. Składnia: On Error GoTo etykieta On Error Resume Next On Error GoTo 0Gdzie:
Użycie: Jeżeli ni użyjemy w programie instrukcji On Error, to każdy błąd podczas jego pracy (run-time error) spowoduje wyświetlenie komunikatu o błędzie i przerwie pracę programu. Obsługa błędu jest włączona, po napotkaniu pierwszej instrukcji On Error, ale aktywna jest tylko wtedy, gdy jest przez nią obsługiwany błąd. Jeżeli wystąpi błąd w czasie obsługi błędu (pomiędzy wystąpieniem błędu i instrukcją Resume, Exit Sub, Exit Function lub Exit Property), to aktualna obsługa błędu procedury nie może obsłużyć się sama. Sterowanie powraca do procedury wywołującej. Jeżeli wywołująca procedura posiada włączoną obsługę błędu, to jest ona aktywowana do obsłużenia tego błędu. Jeżeli w wywołującej procedurze obsługa błędu jest także aktywna, sterowanie powraca do poprzednio wywołującej procedury aż do znalezienia włączonej, ale nieaktywnej obsługi błędu. Jeżeli nie zostanie znaleziona włączona ale nieaktywna obsługa błędu, wówczas błąd przerywa pracę programu, praktycznie w momencie w którym wystąpi. Za każdym razem gdy obsługa błędu zwraca sterowanie to procedury która ją wywołała, to staje się ona bieżącą procedurą. Gdy błąd jest obsługiwany przez obsługę błędu w jakiejkolwiek procedurze, wykonanie programu jest kontynuowane w bieżącej procedurze w punkcie wyznaczonym przez instrukcję Resume. Kod obsługi błędu nie jest procedurą Sub ani funkcją Function. Jest to część kodu wyznaczona przez etykietę. W kodzie obsługi błędu przyczyna wystąpienia błędu sprawdzana jest poprzez wartość właściwości Number obiektu Err. Wartości właściwości obiektu Err odzwierciedlają tylko ostatnio wystąpienie błędu. Komunikat błędu odpowiedni do Err.Number znajduje się w Err.Description. Instrukcja On Error Resume Next powoduje przekazanie sterowania do instrukcji, następnej po instrukcji, która spowodowała wystąpienie błędu, i kontynuowanie programu lub do instrukcji następnej po ostatnio wzywanej procedurze zawierającej instrukcję On Error Resume Next. Ta instrukcja pozwala przywrócic wykonywanie programu pomimo wystąpienia błędu w czasie wykonania programu. Można umieścić obsługę błędu tam gdzie błąd może wystąpić, zamiast przenoszenia kontroli w inną lokalizację w procedurze. Instrukcja On Error Resume Next staje się nieaktywana jeżeli inna procedura jest wywołana, więc należy umieszczać tą instrukcję w każdym bloku programu, w którym ma być wykonywana natychmiastowa obsługa błędu. Instrukcja On Error GoTo 0 wyłącza obsługę błędu w bieżącej procedurze. Nie określa ona linii 0 jako początku kodu obsługi błędu, nawet jeżeli procedura zawiera linię o numerze 0. Bez instrukcji On Error GoTo 0, obsługa błędu jest wyłączana kiedy procedura jest opuszczana. Aby zapobiec uruchamianiu procedury obsługi błędu, gdy nie wystąpi żaden błąd, należy bezpośrednio przed tym kodem umieszczać instrukcję Exit Sub, Exit Function lub Exit Property, jak w ponizszym przykładzie: Sub MojaProcedura() On Error GoTo Błąd . . . Exit Sub Błąd: . . . Resume Next End Sub Kod obsługi błędów zaczyna się tu za rozkazem Exit Sub, a kończy przed End Sub, aby oddzielić go od reszty procedury. Blok obsługi błędów może się znajdować w dowolnym miejscu w procedurze. Wznawia działanie programu po wykonaniu procedury obsługi błędu. Składnia: Resume [0] Resume Next Resume etykietaGdzie:
Użycie: Użycie instrukcji Resume poza procedurą obsługi błędów zawsze spowoduje błąd. Przykład: Sub ResumeDemo() On Error GoTo ErrorHandler Open "TESTFILE" For Output As #1 Kill "TESTFILE" ' kasowanie otwartego pliku Exit Sub ' pominięcie obsługi błędu ErrorHandler: ' procedura obsługi błędu Select Case Err.Number Case 55 ' plik jest otwarty Close #1 ' zamknij plik Resume ' powtórz wiersz z błędem Case Else ' obsługa innych błędów.... Resume Next ' pomija wiersz z błędem End Select End Sub Zawiesza wykonywanie programu. Składnia: Stop Użycie: Instrukcje Stop mogą w dowolnym miejscu procedur zawiesić wykonywanie programu. Umieszczenie w programie instrukcji Stop daje efekt podobny do ustawienia w kodzie programu punktu przerwania. Instrukcja Stop zawiesza wykonywanie programu, jednak, w odróżnieniu od instrukcji End, nie zamyka plików i nie czyści zmiennych. Chyba, że znajduje się w skompilowanym pliku wykonywalnym (.EXE). Wykonuje ciąg instrukcji na pojedynczym obiekcie lub na typie zdefiniowanym przez użytkownika. Składnia: With obiekt [ instrukcje ] End WithGdzie:
Użycie: Instrukcja With umożliwia wykonanie ciągu instrukcji na określonym obiekcie bez konieczności wielokrotnego kwalifikowania składowych nazwą obiektu. Na przykład, aby zmienić wartości różnych właściwości pojedynczego obiektu, należy umieścić instrukcje przypisania tych wartości właściwościom wewnątrz struktury With, odwołując się do obiektu tylko raz, a nie tyle razy, ile jest instrukcji przypisania. Przykład poniżej pokazuje użycie instrukcji With do przypisania wartości kilku właściwościom jednego obiektu. With lblEtykieta .AutoSize = True .Border = 0 .Caption = "Tekst etykiety" End With Po wejściu do bloku instrukcji With nie ma możliwości zmiany elementu obiekt. Nie można zatem jedną instrukcją With operować na kilku różnych obiektach. Instrukcje With można zagnieżdżać, umieszczając jeden blok With wewnątrz drugiego. Ponieważ jednak składowe z zewnętrznych bloków With są przesłaniane w blokach wewnętrznych, to aby odwołać się w bloku wewnętrznym do składowej obiektu z bloku zewnętrznego należy w bloku wewnętrznym użyć pełnego, kwalifikowanego odesłania do obiektu z bloku zewnętrznego. Ważne Nie należy wykonywać skoków do wnętrza lub z wnętrza bloków With. Jeśli wykonywane są instrukcje w bloku With, ale nie kończą się one wykonaniem instrukcji With lub End With, mogą wystąpić błędy lub program może zachowywać się w sposób nieprzewidziany. Kończy procedurę lub blok.Składnia: End End Function End If End Property End Select End Sub End Type End Withgdzie:
Użycie: Instrukcja End przywraca stan inicjalny zmiennych na poziomie modułu oraz wszystkich lokalnych zmiennych statycznych we wszystkich modułach. Aby zachować bieżące wartości tych zmiennych, należy zamiast instrukcji End użyć instrukcji Stop. Zostawiamy sobie wówczas możliwość wznowienia programu z zachowaniem wartości tych zmiennych. Instrukcja End natychmiastowo zatrzymuje wykonywanie kodu programu, nie wywołując przy tym zdarzeń Unload, QueryUnload czy Terminate ani żadnego innego kodu Visual Basic. Kod programu umieszczony w zdarzeniach Unload, QueryUnload i Terminate w formularzach i modułach klas nie jest wykonywany. Obiekty utworzone z modułów klasy ulegają zniszczeniu, pliki otwarte za pomocą instrukcji Open są zamykane, a pamięć wykorzystywana przez program zostaje zwolniona. Odwołania do obiektów wykorzystywane przez inne programy zostają unieważnione. Instrukcja End jest sposobem na szybkie zatrzymanie programu. Aby zakończyć pracę w środowisku Visual Basic w sposób normalny, należy rozładować wszystkie formularze. Program zamyka się w chwili, gdy nie ma żadnych innych programów korzystających z odwołań do obiektów utworzonych z publicznych modułów klasy ani nie jest wykonywany żaden kod programu. Przykład: Zobacz przykładay umieszczone w opisie instrukcji na tej stronie.
|