CodeLan
Administrator
Dołączył: 03 Lis 2006
Posty: 171
Przeczytał: 0 tematów
Pomógł: 3 razy Ostrzeżeń: 0/5 Skąd: Z pod skrzydeł Google.pl
|
Wysłany: Nie 6:58, 17 Cze 2007 Temat postu: Instrukcje warunkowe |
|
|
Nie jest to zbytnio elegancji sposób sygnalizowania nieprawidłowości, szczególnie w przypadku większych aplikacji, gdzie np. wypełnia się bardzo wiele pól i później po pokazaniu błędu przez program i wyłączeniu się, użytkownik musiałby robić wszystko od nowa.
Instrukcja warunkowa polega na tym, że porównuje coś np. jakąś wartość ze zmiennej bądź z jakiegoś obiektu, i jeżeli warunek będzie spełniony, czyli porównywana wartość będzie równa założeniu, (lub np., jeżeli chcemy możemy założyć, że wartość ma być nie równa) instrukcja wykona funkcje zagnieżdżone w niej, czyli po spełnieniu warunku zostaną wykonane pożądane operacje. Dodatkowo możemy zrobić, że jeżeli warunek nie zostanie spełniony zostanie wykonana funkcja zapasowa (Else), czyli np. wyświetlenie komunikatu z błędem.
Trzeba się zastanowić jak zastosować instrukcje warunkowe do programu z ostatniej lekcji.
W naszym przypadku trzeba sprawdzić czy w polach TextBox na pewno są liczby.
Do sprawdzenia czy wartość danej zmiennej bądź zawartości obiektu służy porównanie IsNumeric czyli
If IsNumeric(Okres1Stan1.Text) Then
‘tutaj instrukcje liczenia
End If
Teraz omówie składnie.
Pierwsze słowo to if czyli angielskie jeśli i teraz załadamy -> IsNumeric(Okres1Stan1) czyli: jeżeli jest wartość numeryczna (w objekcie Okres1Stan1 w właściwości text) wtedy (Then), zostają wykonane funkcje objęte do End If..
Myślę, że to nawet bez omówienia jest jasne. Jednak powstaje pytanie. Sprawdzenie czy jest liczba musi zostać wykonane na pozostałych obiektach. Nie jest to problemem należy jedynie dodać poprzez operator "And" kolejne założenia, czyli powinno to wyglądać tak:
If IsNumeric(Okres1Stan1.Text) And IsNumeric(Okres1Stan2.Text) And IsNumeric(Okres2Stan1.Text) And IsNumeric(Okres2Stan2.Text) And IsNumeric(Okres3Stan1.Text) And IsNumeric(okres3Stan2.Text) Then
Dim roznica1, roznica2, roznica3
Dim wynik1, wynik2, wynik3, wynikcalkowity
roznica1 = Okres1Stan2.Text - Okres1Stan1.Text
roznica2 = Okres2Stan2.Text - Okres2Stan1.Text
roznica3 = okres3Stan2.Text - Okres3Stan1.Text
wynik1 = roznica1 * cena
wynik2 = roznica2 * cena
wynik3 = roznica3 * cena
wynikcalkowity = wynik1 + wynik2 + wynik3
MsgBox("Wynik to " & wynikcalkowity & " zł")
End if
Teraz został dodane kolejne założenia, czyli jeśli, w choć jednym polu nie będzie wartości numerycznej warunek nie zostanie spełniony. Czyli wszystko działa prawidłowo, aby funkcje przeliczające zostały uruchomione muszą być we wszystkich polach wartości liczbowe. Należy jeszcze jedno zrobić. We wszystkich obiektach TextBox zmienić wartość test na 0.
Teraz możesz przetestować program.
W przypadku kiedy wartość nie była by liczbowa nie zostanie wyrzucony błąd i program nie zostanie automatycznie zamkniety.
Jednak jeżeli chodzi o wyświetlenie błędu,. To chyba lepiej by było gdyby program jednak zakomunikował że nie wykonał operacji ze względu na to że wartości podane są nieprawidłowe. Do tego posłużymy się instrukcją else, służy ona do wykonywania funkcji kiedy instrukcja nie zostanie spełniona.
Teraz kod powinien wyglądać tak:
If IsNumeric(Okres1Stan1.Text) And IsNumeric(Okres1Stan2.Text) And IsNumeric(Okres2Stan1.Text) And IsNumeric(Okres2Stan2.Text) And IsNumeric(Okres3Stan1.Text) And IsNumeric(okres3Stan2.Text) Then
Dim roznica1, roznica2, roznica3
Dim wynik1, wynik2, wynik3, wynikcalkowity
roznica1 = Okres1Stan2.Text - Okres1Stan1.Text
roznica2 = Okres2Stan2.Text - Okres2Stan1.Text
roznica3 = okres3Stan2.Text - Okres3Stan1.Text
wynik1 = roznica1 * cena
wynik2 = roznica2 * cena
wynik3 = roznica3 * cena
wynikcalkowity = wynik1 + wynik2 + wynik3
MsgBox("Wynik to" & wynikcalkowity & "zł")
Else
MsgBox("Wpisane wartości są błedne", vbCritical, "błąd wartości")
End If
Dodaliśmy funkcje, która wykona się w razie niespełnienia warunku. Dokładnie jest to okienko informujące, że wartości są błędne.
* w instrukcji warunkowej użyliśmy operatora And, przeciwieństwem do tego operatora jest Or, czyli lub, jeżeli chcielibyśmy go zastosowali do naszego programu zamiast And odwrócilibyśmy całą sytuację i teraz warunek byłby spełniony gdyby, w choć jednym polu pojawiła się wartość liczbowa, co w naszej sytuacji jest niepożądane.
Jednak to nie wszystko, zauważ że wartości w liczniku nie mogą się cofać (teoretycznie…) dlatego w polu Stan 2 danego okresu nie może być wartość większa niż w stanie 1.
Musimy się zastanowić gdzie tą instrukcje "włożyć". Ma on sprawdzić czy wartość w stanie 2 nie jest większ od wartości w stanie1.
Czy pierwsza instrukcją ma być sprawdzenie "czy liczba" czy sprawdzenie "czy dobra wartość"?
Otóż sprawdzenie "czy liczba" musi być pierwsze, bo jeżeli nawet chcemy sprawdzić czy wartość z danego pola jest odpowiednia z całą resztą to i tak musimy sprawdzić najpierw czy porównujemy liczbę.
Stąd wynika, że instrukcje warunkową sprawdzającą "czy wartość nie jest za mała lub za duża" musimy zagnieździć w instrukcji sprawdzającej "czy liczba"
Funkcja powinna wyglądać tak:
If IsNumeric(Okres1Stan1.Text) And IsNumeric(Okres1Stan2.Text) And IsNumeric(Okres2Stan1.Text) And IsNumeric(Okres2Stan2.Text) And IsNumeric(Okres3Stan1.Text) And IsNumeric(okres3Stan2.Text) Then
If Okres1Stan2.Text > Okres1Stan1.Text And Okres2Stan2.Text > Okres2Stan1.Text And okres3Stan2.Text > Okres3Stan1 Then
Dim roznica1, roznica2, roznica3
Dim wynik1, wynik2, wynik3, wynikcalkowity
roznica1 = Okres1Stan2.Text - Okres1Stan1.Text
roznica2 = Okres2Stan2.Text - Okres2Stan1.Text
roznica3 = okres3Stan2.Text - Okres3Stan1.Text
wynik1 = roznica1 * cena
wynik2 = roznica2 * cena
wynik3 = roznica3 * cena
wynikcalkowity = wynik1 + wynik2 + wynik3
MsgBox("Wynik to" & wynikcalkowity & "zł")
Else
MsgBox("Wpisane wartości nie zgadzają się", vbCritical, "błąd wartości")
End If
Else
MsgBox("Wpisane wartości są błedne", vbCritical, "błąd wartości")
End If
Widzimy tutaj jak jedna instrukcja warunkowa jest wpisana w drugą.
W tej drugiej jest sprawdzenie czy licznik się nie cofa, i jeżeli jest OK. to dopiero wtedy są wykonane kolejne funkcje, a jeżeli nie -> wyświetlany jest błąd.
Takie zagnieżdżanie jest dosyć częste w programach i pokazany tu przykład może być jeszcze bardziej rozbudowany na kolejne poziomy zagnieżdżenia.
Post został pochwalony 0 razy
|
|