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