Ć wiczenie VB5.4_film_jpg
Danych jest 8 zdjęć pokladkowych o nazwach kolejno ren50.jpg, ren51.jpg do ren57.jpg.
Wykonać aplikację wyświetlającą te zdjęcia kolejno, posługując się obiektem Timer, imitując film. Polecenia wybierać za pomocą menu.. Propozycję formularza przedstawia rys. 1.
Rys. 1. Aplikacja w działaniu
Wykonanie
Obiekt menu rozwijalnego pobieramy z paska Toolbox, z grupy Menus & Toolbars, gdzie nazywa się MenuStrip. Jeśli przeniesiemy obiekt MenuStrip na formularz – efekt będzie jak na rys. 2.
Rys. 2. Rozpoczynamy tworzenie menu
Copyright © 2009, Janusz Bonarowski 2 (1) W oknie formularza, ale poza samym formularzem, dodany zostanie obiekt MenuStrip
o domyślnej nazwie MenuStrip1,
(2) Na formularzu dodany zostanie szablon menu rozwijalnego, do którego możemy wpisywać pozycje menu poziomów głównych i pozycje podmenu.
Dodawanie pozycji menu rozpoczynamy wpisując ich nazwy w okno z napisem Type Here (wpisz tutaj). Po kliknięciu tego okna – rozwinie się ono w dół i w prawo pozwalając wpisywać pozycje menu na tym samym poziomie jak i pozycje podmenu.
Proszę utworzyć menu jak na rys. 3.
Start Stop Ustawienia Koniec
Interval = 2000 Interval = 1000 Interval = 200 Rys. 3. Propozycja menu
Zmieńmy domyślne nazwy pozycji menu w sposób zaproponowany w tabeli 1.
Tabela 1.
Pozycja menu Nazwa
Start mnuStart
Stop mnuStop
Ustawienia mnuUstawienia Interval = 2000 mnuInterval2000 Interval = 1000 mnuInterval1000 Interval = 200 mnuInterval200 Koniec mnuKoniec
Obiekt Timer pobieramy z paska Toolbox, z grupy Components. Obiekt ten nie ma
właściwości „widoczny”, nie pojawi się zatem na formularzu lecz w zasobniku formularza u dołu ekranu.
Obiektem przeznaczonym do wyświetlania rysunków map bitowych, różnych typów, jest obiekt PictureBox, znajdujący się w Toolbox’ie, w grupie Common Controls. Pozostawmy nazwy obiektów takie jakie proponuje Visual Basic.
Tworzenie kodu aplikacji
Instrukcja wyświetlająca rysunek o nazwie np. ren50.jpg, znajdujący się w katalogu:
C:\tkm\gr1.01\VB5.4_film\rysunki\ ren50.jpg ma postać:
PictureBox1.Image = _
System.Drawing.Image.FromFile("C:\tkm\VB5.4_film\rysunki\ren50.jpg")
Planujemy wyświetlanie kolejno rysunków: ren50.jpg, ren51.jpg itf do ren57.jpg.
Podzielmy ścieżkę do pliku następująco:
• cześć początkowa ścieżki: "C:\tkm\VB5.4_film\rysunki\ren5"
• i jej końcow część ".jpg”.
Pomiędzy tymi częściami ma się zmieniać jedna cyfra przyjmując kolejno wartości 0, 1, … 7.
Część początkową ścieżki nazwiemy poczatek, zmieniający się numer rysunku nazwiemy nr i wtedy polecenie wyświetlania kolejnego rysunku w obiekcie PictureBox1 przyjmie postać:
PictureBox1.Image = _
System.Drawing.Image.FromFile(poczatek & "ren5" & _ nr.ToString & ".jpg")
Przy każdym zdarzeniu Tick Timera zmienna nr będzie zwiękaszła swoją wartość o 1 i kolejne zdjęcie zostanie wyświetlone w PictureBox1.
Procedura obsługi zdarzenia Tick dla Timera będzie miała postać:
Private Sub Timer1_Tick(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Timer1.Tick Try
nr = nr + 1
If nr = 8 Then nr = 0 PictureBox1.Image = _
System.Drawing.Image.FromFile(poczatek & _ "ren5" & nr.ToString & ".jpg") Catch ex As Exception
Timer1.Stop()
mnuStop.Enabled = False mnuStart.Enabled = True If Err.Number = 53 Then
MsgBox("Na wskazanej ścieżce: " & vbCrLf & _ poczatek & vbCrLf & _
"brak odpowiednich zdjęć.") Else
MsgBox("Błąd nr: " & Err.Number & vbCrLf & _ "Opis: " & Err.Description)
End If End Try End Sub
Ponieważ może się zdarzyć, że aplikacja nie odnajdzie rysunku i może ulec awarii z powodu nie obsłużonego błędu – wykonajmy własną obsługę błędów posługując się obiektem Err, którego właściwość Number zwraca numer błędu, a właściwość Description jego opis, patrz kod powyżej.
Jeśli dojdzie do błędu należy ponownie udostępnić menu Start i „wyszarzyć” menu Stop.
Copyright © 2009, Janusz Bonarowski 4 Pełny kod aplikacji
Dim nr As Integer = 0
Dim poczatek As String = "C:\tkm\gr1.01\VB5.4_film\rysunki\"
Private Sub mnuStart_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuStart.Click mnuStart.Enabled = False
mnuStop.Enabled = True Timer1.Enabled = True End Sub
Private Sub mnuStop_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuStop.Click mnuStop.Enabled = False
mnuStart.Enabled = True Timer1.Enabled = False End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Timer1.Tick ' Proszę zadeklarować zmienną nr w tym miejscu
' i sprawdzić jak zachowa się aplikacja.
' Które zdjęcia zostaną wyświetlone i dlaczego o takim numerze?
'Dim nr As Integer Try
nr = nr + 1
If nr = 8 Then nr = 0 PictureBox1.Image = _
System.Drawing.Image.FromFile(poczatek & "ren5" & _ nr.ToString & ".jpg") Catch ex As Exception
Timer1.Stop()
mnuStop.Enabled = False mnuStart.Enabled = True If Err.Number = 53 Then
MsgBox("Na wskazanej ścieżce: " & vbCrLf & poczatek & _ vbCrLf & "brak odpowiednich zdjęć.")
Else
MsgBox("Błąd nr: " & Err.Number & vbCrLf & _ "Opis: " & Err.Description)
End If End Try End Sub
Private Sub mnuInterval1000_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuInterval1000.Click Timer1.Interval = 1000
End Sub
Private Sub mnuInterval200_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuInterval200.Click Timer1.Interval = 200
End Sub
Private Sub mnuInterval2000_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuInterval2000.Click Timer1.Interval = 2000
End Sub
Private Sub mnuKoniec_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuKoniec.Click Dim Odp As Integer
Odp = MsgBox("Czy rzeczywiście zamknmąć aplikację", _ MsgBoxStyle.Question + MsgBoxStyle.YesNo, _ "Zamknięcie aplikacji")
If Odp = vbYes Then Application.Exit() End If
End Sub
Proszę zwrócić uwagę na dwie pierwsze linijki kodu. Znajdują się one poza wszystkimi procedurami i deklarują dwie zmienne: nr i poczatek.
Fakt deklarowania tych zmiennych w tym miejscu związany jest z zagadnieniem tzw.
„okresu życia zmiennej” czyli jej dostępności przez inne procedury formularza czy szerzej aplikacji i stanu wartość w niej przechowywanej.
Mówimy, że zmienna, np. Odp w procedurze zamykającej aplikację, „żyje” tak długo jak długo trwa (działa, wykonuje się) procedura, w której została zadeklarowana. Oznacza to, że gdy rozpocznie działanie procedura Private Sub mnuKoniec_Click – zmienna Odp w tej procedurze ma określoną wartość i można tę wartość zmieniać lub testować, np.
instrukcją warunkową. Lecz gdy procedura ta zostanie ukończona (osiągnie instrukcję End Sub) - zmienna Odp przestaje istnieć i nie znana będzie zatem jej wartość, którą przechowywała jeszcze przed chwilą.
Gdyby taka sytuacja zaistniała dla zmiennej nr (tzn. gdyby zmienna nr była zadeklarowana w procedurze Private Sub Timer1_Tick (tak jak to wpisano w zakomentowanym kodzie) to po wykonaniu instrukcji
nr = nr + 1
zmienna nr (z wartości 0, jaką mają w VB wszystkie zmienne po zadeklarowaniu)
osiągnęłaby wartość 1, zdjęcie ren51.jpg umieszczone zostałoby w PictureBox1 i procedura zakończyłaby pracę. Przy następnym jej wywołaniu ponownie zmienna z zera zmieniłaby wartość na 1 i ponownie wyświetlone zostałoby zdjęcie ren51.jpg.
Aby przechować wartość w zmiennej, a także by udostępnić tę wartość innym procedurom, deklarujemy zmienne w pierwszych instrukcjach kodu poza wszystkimi procedurami.