Microsoft Visual Basic 2008 Express Edition, r. ak. 2013/2014
Transkrypt
Microsoft Visual Basic 2008 Express Edition, r. ak. 2013/2014
Microsoft Visual Basic 2008 Express Edition, r. ak. 2013/2014 Zajęcia 7: Formant ListBox. Instrukcje cyklu. Pasek menu formularza Projekt formularza po lewej, po prawej – wykonane obliczenie średniej i włączone sortowanie): Struktura menu: Kod w module formularza Public Class frmLista ' ' Formant listy, ' kolekcja Items i instrukcje cyklu. Rok ak. 2013/2014, 16.12.2013 ' Private Sub mnuZakoncz_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuZakoncz.Click ' ' Koniec pracy programu ' End End Sub Private Sub WyczyscWynik() ' ' Usuwanie zawartości etykiety i pola tekstowego wyniku analizy listy ' txtWynik.Text = "" lblTytul.Text = "" End Sub Private Sub mnuDodaj_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuDodaj.Click ' ' Dodawanie zawartości pola tekstowego "txtNowy” ' jako nowego elementu do listy ' lstLista.Items.Add(txtNowy.Text) ' ' Jeżeli poprzednio był wyświetlany wynik analizy zawartości listy, ' to trzeba go usunąć, bo może być nieaktualny Call WyczyscWynik() End Sub Witold Marowski, 2013 1 Private Sub mnuUsun_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuUsun.Click ' ' Usuwanie zaznaczonego elementu listy ' Dim strKom, strTyt As String ' ' Sprawdzenie, czy zaznaczono któryś z elementów listy. ' Jeżeli tak, to jest on usuwany i czyszczone są wyniki analizy ' zawartości listy (pole tekstowe "txtWynik” i jego etykieta) If lstLista.SelectedIndex <> -1 Then lstLista.Items.RemoveAt(lstLista.SelectedIndex) Call WyczyscWynik() Else ' SelectedIndex = -1, tzn. nic nie zaznaczono strKom = "Nie zaznaczono elementu do usunięcia" strTyt = "Usuwanie elementu listy" MessageBox.Show(strKom, strTyt, _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If End Sub Private Sub lstLista_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles lstLista.SelectedIndexChanged ' ' Zmiana zaznaczonego elementu listy. ' Jeżeli któryś element został zaznaczony, zostaje wpisany ' do pola tekstowego "txtZaznaczony", jeżeli po zmianie nic ' nie jest zaznaczone – pole to jest czyszczone (rozpoznanie ' właściwego przypadku umożliwia wartość właściwości ' "SelectedIndex" pola listy). If lstLista.SelectedIndex >= 0 Then txtZaznaczony.Text = lstLista.SelectedItem Else txtZaznaczony.Text = "" End If End Sub Private Sub mnuWyczysc_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuWyczysc.Click ' ' Czyszczenie wszystkich formantów formularza ' (metody "Clear" można użyć zarówno do opróżnienia listy, ' jak i do usunięcia zawartości pola tekstowego). Call WyczyscWynik() txtNowy.Clear() txtZaznaczony.Clear() lstLista.Items.Clear() End Sub Private Sub mnuSortuj_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuSortuj.Click ' ' Włączenie lub wyłączenie sortowania listy, zależnie od opcji ' wybranej w pozycji "Sortuj" menu rozwijalnego (zarówno ' właściwość "Sorted" pola listy, jak i właściwość "Checked" ' pozycji "mnuSortuj" paska menu są typu logicznego [True/False], ' więc wartość właściwości "Sorted" pola listy musi być taka ' sama, jak aktualna wartość właściwości "Checked" tej pozycji menu. ' lstLista.Sorted = mnuSortuj.Checked ' ' Dla odróżnienia aktualnego ustawienia opcji sortowania listy ' tło listy posortowanej jest jasnoniebieskie, a tło listy ' nieposortowanej – białe. Zmiany koloru dokonuje się przy Witold Marowski, 2013 2 ' każdej zmianie ustawienia opcji sortowania w menu. If lstLista.Sorted Then lstLista.BackColor = Color.LightBlue Else lstLista.BackColor = Color.White End If End Sub Private Sub mnuMax_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuMax.Click ' ' Poszukiwanie największego elementu listy. Nie musi to być ' liczba – elementy są porównywane według reguł porównywania ' ciągów znakowych. ' Dim strMax As String ' największy znaleziony element Dim i As Integer ' licznik wykonań instrukcji cyklu Dim strKom, strTyt As String ' ' Poszukiwanie ma sens tylko wówczas, gdy lista nie jest pusta If lstLista.Items.Count > 0 Then ' ' Na początku zakładamy, że pierwszy element listy jest największy strMax = lstLista.Items(0) ' ' Badanie reszty listy zaczynamy od DRUGIEGO elementu ' i korzystamy z instrukcji cyklu "For ... Next" For i = 1 To lstLista.Items.Count - 1 If lstLista.Items(i) > strMax Then ' ' Jeżeli aktualnie badany element jest większy ' od uprzednio znalezionego największego elementu, ' zostaje zamiast niego wpisany do zmiennej "strMax" strMax = lstLista.Items(i) End If Next ' ' Po przeszukaniu całej listy w zmiennej "strMax" ' jest zapisany jej największy element lblTytul.Text = "Największy element listy" txtWynik.Text = strMax Else strKom = "Lista jest pusta" strTyt = "Brak danych" MessageBox.Show(strKom, strTyt, _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If End Sub Private Sub mnuSrednia_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuSrednia.Click ' ' Wyznaczanie wartości średniej numerycznych elementów listy ' Dim sngSuma As Single ' dla sumy elementów numerycznych Dim intLNum As Integer ' dla liczby elementów numerycznych Dim strElement As String ' dla aktualnie sprawdzanego elementu Dim strKom, strTyt As String ' Try ' ' Zerowanie licznika numerycznych elementów listy ' i sumy wartości znalezionych elementów numerycznych intLNum = 0 sngSuma = 0.0 ' Witold Marowski, 2013 3 ' Kolekcja "Items" (kolekcja elementów listy) jest przeszukiwana ' przy użyciu instrukcji udostępniającej kolejno wszystkie ' elementy kolekcji (instrukcja "For Each ... In ... Next") For Each strElement In lstLista.Items ' ' Jeżeli aktualnie sprawdzany element jest liczbą, ' jego wartość jest dodawana do sumy bieżącej, a liczba ' znalezionych elementów numerycznych zwiększa się o 1 If IsNumeric(strElement) Then sngSuma = sngSuma + CSng(strElement) intLNum = intLNum + 1 End If Next ' ' Jeżeli na liście jest przynajmniej jeden element numeryczny, ' wyświetlana jest wartość średniej arytmetycznej takich ' elementów. W przeciwnym wypadku wyświetlany jest komunikat If intLNum > 0 Then lblTytul.Text = "Wartość średnia elementów numerycznych:" txtWynik.Text = sngSuma / intLNum.ToString Else strKom = "Na liście brak elementów numerycznych" strTyt = "Obliczanie wartości średniej" MessageBox.Show(strKom, strTyt, _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If Catch ex As Exception ' ' Obsługa błędu wykonania programu strKom = ex.Message strTyt = "Obliczanie wartości średniej" MessageBox.Show(strKom, strTyt, _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub End Class Witold Marowski, 2013 4