Copyright © 2019,mgr inż. Janusz Bonarowski 1
Instrukcja cyklu For Each … Next
Wcześniej poznaliśmy już instrukcje cyklu, For … Next, Do Until … Loop, Do While … Loop – patrz materiał Ćwiczenie VB6.0_Instrukcja cyklu tzw. pętla1
Gdy chcemy odwołać się do grupy obiektów tego samego typu w celu wykonania na nich takiej samej operacji – możemy posłużyć się jeszcze jedną instrukcją cyklu For Each … Next.
Przykładem takiej sytuacji jest procedura Narysuj, w zadaniu budowania programu do projektowania wału.
W procedurze tej, w celu odświeżenia rysunku wału – który wcześniej jest skasowany - rysujemy od nowa cały wał, stopień po stopniu, pobierając średnicę i długość kolejnego stopnia z kolekcji stopni walu.
Private Sub Narysuj()
Dim wsk_kolekcji As Stopien_walu x_pocz = X_osi
For Each wsk_kolekcji In Kolekcja_stopni_walu
objRys.DrawRectangle(objPiorWal,x_pocz,Y_osi-wsk_kolekcji.Srednica_stopnia/2, wsk_kolekcji.Dlugosc_stopnia, wsk_kolekcji.Srednica_stopnia) x_pocz = x_pocz + wsk_kolekcji.Dlugosc_stopnia
Next End Sub
Procedura ta została omówiona w materiale dotyczącym projektowania walu.
Zadanie
Aby dodatkowo przećwiczyć instrukcję For Each wykonajmy program, który obsługuje wszystkie 8 obiektów TextBox. Aplikacja posiada 3 przyciski, rys. 1.
Rysunek 1
Przycisk [Wstaw dane] wstawia kolejno do wszystkich TextBox-ów liczby od 1 do 8, przycisk [Kasuj] – kasuje zawartość wszystkich TextBox-ów.
Przycisk [Test] zmienia kolor tła TextBox-ów na czerwono, jeśli TextBox zawiera wartość większą od 4.
W tej procedurze instrukcję For Each umieszczono dodatkowo w strukturze obsługi błędów Try … Catch, aby uniknąć błędu wtedy, gdy funkcja konwersji CSng(Element.Text) będzie próbowała przekonwertować zawartość TextBox-u na liczbę rzeczywistą, a zawartość ta będzie pusta lub będzie tekstem, co jest błędem.
Private Sub ButtonKasuj_Click(sender As Object, e As EventArgs) _
Handles ButtonKasuj.Click 'Kasowanie zawartości WSZYSTKICH TextBox-ów na formularzu
'i ustawianie koloru tła na biały.
Dim Element As Control
For Each Element In Me.Controls.OfType(Of TextBox) Element.Text = ""
Element.BackColor = Color.White Next
End Sub
1 https://poczta.simr.pw.edu.pl/~jbo/vb/vb_express2008/vb6.0_instrukcje_cyklu_opis.pdf
Copyright © 2019,mgr inż. Janusz Bonarowski 2 Private Sub ButtonWstawDane_Click(sender As Object, e As EventArgs) _
Handles ButtonWstawDane.Click 'Zapełnianie WSZYSTKICH TextBox-ów na formularzu
'kolejnymi liczbami całkowitymi Dim Element As Control
Dim Liczba As Integer = 1
For Each Element In Me.Controls.OfType(Of TextBox) Element.Text = CStr(Liczba)
Liczba = Liczba + 1 Next
End Sub
Private Sub ButtonTest_Click(sender As Object, e As EventArgs) _
Handles ButtonTest.Click 'Ustawianie koloru tła TextBox-ów na czerwono
'jeśli wartość w TextBox-sie jest większa o 4 Dim Element As Control
Try
For Each Element In Me.Controls.OfType(Of TextBox) If CSng(Element.Text) > 4 Then
Element.BackColor = Color.Red Else
Element.BackColor = Color.White End If
Next
Catch ex As Exception
MsgBox("W TextBox-ach muszą znajdować się liczby.") End Try
End Sub