Instrukcja laboratoryjna z języka Visual Basic

Transkrypt

Instrukcja laboratoryjna z języka Visual Basic
Języki programowania na platformie .NET cz.2
2016/17
Instrukcja laboratoryjna nr.4
Język Visual Basic for .NET
Prowadzący: Tomasz Goluch
Wersja: 3.1
I.
Współpraca Visual Basic z C#
Cel: Wykorzystanie w kodzie Visual Basic biblioteki napisanej w C# .
Uruchom Visual Studio 201X i utwórz nowy Class Library projekt (Visual C#).
Stwórz dowolną klasę udostępniającą metodę getWords(). Metoda powinna zwracać przy
pomocy return yield kolekcję stringów. Zwracane słowa pobierane są z pliku
polish.txt reprezentującego słownik wyrazów polskich.
Dodaj do klasy właściwość WordsCount reprezentującą liczbę słów z wczytywanego
słownika. Liczba słów jest adekwatna liczbie linii wczytywanego pliku:
File.ReadLines(path).Count();
W razie problemów z ustaleniem względnej ścieżki dostępu do pliku polish.txt, należy
dodać plik do projektu i zaznaczyć jego właściwość: „Copy to Output Directory” na copy
always. Podczas kompilacji będzie on kopiowany do folderu bin\debug lub
bin\release.
Dodaj do solution nowy WPF Application projekt (Visual Basic).
Stwórz prosty GUI składający się z dwóch przycisków, pola tekstowego i etykiety. Dodaj
obsługę zdarzenia Click pierwszego przycisku wyświetlającą w polu tekstowym kolekcję
słów zwracanych poprzez metodę getWords() biblioteki. Jeżeli program działa zbyt długo
(efekt zamrożenia GUI) można zmniejszyć liczbę wyrazów w słowniku odpowiednio edytując
plik polish.txt.
1
Dla osób biegłych w składni języka C# pomocny może się okazać darmowy konwerter online
firmy Telerik.
II.
Metody rozszerzeń w Visual Basic
Cel: Zapoznanie z implementacją nowych metod dla istniejących typów.
Do projektu VPF VB dodaj moduł StringExtensions rozszerzający typ String o metodę
sprawdzającą czy dane słowo jest palindromem.
Module StringExtensions
<Extension()>
Public Function IsPalindrome(ByVal input As String) As Boolean
…
…
…
IsPalindrome = …
End Function
End Module
Zaktualizuj kod obsługi kliknięcia pierwszego przycisku tak aby w oknie tekstowym
wyświetlane były jedynie palindromy.
2
III.
Asynchronizm w Visual Basic
Cel: Zapoznanie z funkcjonalnością słów kluczowych Async i Await.
Jako obsługę zdarzenia Click drugiego przycisku dodaj identyczną funkcjonalność
(wyświetlanie palindromów) jak przycisku pierwszego ale wykonywaną w trybie
asynchronicznym.
Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles
Button2.Click
Dim wordTab As List(Of String)
…
Dim res As Task(Of List(Of String)) = fillOutputTextBoxAsync()
TextBox1.Text = "czekaj"
wordTab = Await res
…
End Sub
Private Async Function fillOutputTextBoxAsync() As Task(Of List(Of String))
Await Task.Run(Sub1()
…
…
End Sub)
End Function
Aby zaobserwować różnice zachowania się programu w trybie asynchronicznym można
spowolnić dzianie biblioteki przy pomocy metody Sleep().
Thread.Sleep(1);
IV.
Zdarzenia w Visual Basic
Cel: Zapoznanie z funkcjonalnością słów kluczowych WithEvent i Handles.
Dodaj do obiektu słownika biblioteki C# kod generujący zdarzenie wywoływane po
wczytaniu kolejnych stu słów z pliku polish.txt.
W tym celu należy zadeklarować zdarzenie:
public event EventHandler NextHundredWordsLoaded;
które wywołujemy po każdych 100 wczytanych wyrazach:
NextHundredWordsLoaded.Invoke(this, EventArgs.Empty);
Przy pomocy słowa kluczowego WithEvents oznacz, że obiekt słownika2 może generować
zdarzenia.
Dim WithEvents dict As New PlWrdDict
1
2
Jeśli chcemy zwrócić wynik z procedury anonimowej należy zamiast jej wykorzystać funkcję – Function.
W poniższym przykładzie jest to obiekt dict klasy PlWrdDict generujący zdarzenie NextHundredWords.
3
W oknie edytora VS wybierz obsługę tego zdarzenia.
Spowoduje to wygenerowanie pustej procedury obsługi zdarzenia3
Private Sub dict_NextHundredWords(sender As Object, e As EventArgs) Handles
dict.NextHundredWords
licz += 100
Dispatcher.Invoke(New Action(Sub() Label1.Content = … ))
End Sub
Uaktualniaj zawartości etykiety (właściwość Content) zwiększając wyświetlana liczbę
przetworzonych wyrazów ze słownika o 100. W przypadku braku dostępu wątku obsługi
zdarzenia do GUI przydatnym może okazać się skorzystanie z metody Invoke klasy
Dispatcher.
Dispatcher.Invoke(New Action(Sub() Label1.Content = licz.ToString()))
Przykład działającego programu:
V.
Binding danych w Visual Basic
Cel: Zapoznanie z bindingiem danych pomiędzy właściwością i kontrolką ProgressBar.
W projekcie Visual Basic dodaj dwie właściwości. Pierwsza zwraca liczbę wszystkich
wyczytanych słów. Pamiętaj, że ta wartość jest już udostępniana przez właściwość
WordsCount klasy C# z pierwszego punktu.
3
Podobnie jak ma to miejsce w przypadku obsługi zdarzenia kliknięcia przycisku po dwukrotnym kliknięciu
przycisku w GUI.
4
Druga ma przechowywać liczbę czytanych dotychczas wyrazów, będzie aktualizowana
poprzez zdarzenie oprogramowane w pkt. IV zdarzenie.
Dodaj do GUI kontrolkę ProgressBar. W kodzie XAML GUI ustal binding danych pomiędzy
atrybutami Value i Maximum dodanej kontrolki a dodanymi właściwościami.
Przykład:
<ProgressBar Value="{Binding LoadedWordsCount}" Maximum="{Binding TotalWordsCount}"/>
Musimy jeszcze oprogramować odpowiednie zdarzenie informujące o tym, że wartość naszej
właściwości uległa zmianie. Służy do tego interfejs INotifyPropertyChanged, który
powinna implementować nasza klasa MainWindow. Wymaga on dodania do klasy zdarzenia:
Public Event PropertyChanged As PropertyChangedEventHandler Implements
INotifyPropertyChanged.PropertyChanged
Oraz wywołania zdarzenia po każdej zmianie wartości naszej właściwiści:
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("<nazwa property>"))
Przykład działającego programu:
W przypadku problemów z kontekstem danych można ustawić go bezpośrednio w XAML’u:
<Window x:Class="MainWindow"
…
x:Name="Root">
…
<ProgressBar Value="{Binding Proggress, Value="{Binding LoadedWordsCount,
ElementName=Root }" Maximum="{Binding TotalWordsCount, ElementName=Root }"/>
5