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