Instrukcje warunkowe W tej cz�ci kursu opisze jak wykorzystywa� instrukcje warunkowe. W naszej ostatniej aplikacji, po naci�ni�ciu przycisku zosta�y podliczone pola TextBox i zosta� podany wynik. Zauwa� jednak, �e je�eli wpisaliby�my zamiast liczby, jak�� inn� warto�� np. tekst, liczby i tekst, lub w og�le pozostawiliby�my pole puste, raczej trudno by�oby przeprowadzi� operacje matematyczn�. Gdyby taka sytuacja zaistnia�a program zakomunikowa�by b��d i wy��czy�by si�. 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.
Badwoolf