Temat: Programowanie zdarzeniowe. Zdarzenia: delegacje, wykorzystywanie zdarze. Elementy Windows Application (WPF Windows Presentation Foundation). 1. Programowanie zdarzeniowe Programowanie zdarzeniowe albo sterowane zdarzeniami to paradygmat programowania według którego program jest cały czas bombardowany zdarzeniami (events), na które musi odpowiedzie, i e przepływ sterowania w programie jest całkowicie niemoliwy do przewidzenia z góry. Programowanie zdarzeniowe jest dominujcym typem programowania GUI - zdarzenia to nacinicia myszy, klawiszy, dania odwieenia przez system okienkowy, róne zdarzenia sieciowe i inne. Jest te uywane przez wysoce wydajne serwery sieciowe - zdarzeniami s tu dania połczenia, nadejcie danych do odbioru, zwolnienie si miejsca w buforach wysyłania odbiorów, itd. [http://pl.wikipedia.org/wiki/programowanie_zdarzeniowe] W programowaniu zdarzeniowym wane jest eby nie obsługiwa zbyt długo danego zdarzenia, bo blokuje si w ten sposób obsług innych. W przypadku serwerów obniyło by to znacznie wydajno, w przypadku GUI program zbyt wolno odpowiadałby na akcje uytkownika [http://pl.wikipedia.org/wiki/programowanie_zdarzeniowe]
owe sytuacje, w których generowane s zdarzenia: kliknicie myszk, przesuwanie myszki, koczenia otwierania dokumentu, nacinicie klawisza na klawiaturze, wysunicie kartki w drukarce. Zdarzenia w postaci specjalnych rekordów s przechowywane przez system operacyjny w tzw. kolejkach zdarze (ang. event queues) zbudowanych w oparciu o struktur FIFO. Kade zdarzenie wpada do jednej lub wikszej liczby kolejek. Np. zdarzenia klawiatury wpadaj tylko do kolejki aktywnej aplikacji, a zapytanie o moliwo zamknicia systemu do kolejek wszystkich aplikacji. Aplikacja odczytuje swoj kolejk zdarze i podejmuje odpowiednie akcje okrelone przez programist. 2. Zdarzenia: delegacje, tworzenie zdarze a) Delegacje Gdy projektowana klasa powinna by uniwersalna, elastyczna i odpowiada na potrzeby rónych innych klas, to cz pracy tych klas w postaci realizacji wybranych metod musi by oddelegowana do metod tych innych klas, a klasa musi jedynie widzie, o któr metod chodzi. To zadanie jest moliwe dziki delegacjom, a delegacje z kolei stanowi podstaw mechanizmu zdarze. Załómy, e projektuje klas, która wykonuje operacje na pewnym zbiorze danych. Na zakoczenie pracy mamy umoliwi tej klasie zapisanie danych. Proces zapisu danych z obiektu moe by na tyle zrónicowany, e konieczne jest oddelegowanie pracy do metod innych klas, przygotowanych specjalnie do tego celu.
class Dane int x;. //definicje metod klasy Dane public delegate void Zapisz(int x); // deklaracja delegacji public Zapisz metoda; // deklaracja zmiennej typu delegacji Ogólna deklaracja delegacji: [modyfikator] delegate typ_wyniku_metody nazwa_delegacji(lista parametrów); Ogólna deklaracja zmiennej typu delegacji: [modyfikator] nazwa_delegacji nazwa_zmiennej; metody, która spełnia warunki do tego, aby mogła by ta metoda przechowywana w delegacji typ Zapisz. void Zapis_ tekstowy(int x) // tre metody Powysza metoda powinna by oczywicie zawarta w klasie, która zajmuje si zapisywaniem danych. W klasie takiej powinny by zawarte inne wersje metod zapisujcych dane.
class Zapis_Danych public void Zapis_tekstowy(int x) // tre metody public void Zapis_ binarny(int x) // tre metody Zapis danych Dane public delegate void Zapisz(int x); b) Wykorzystywanie zdarze Prac ze zdarzeniami mona realizowa w postaci: wykorzystania gotowych zdarze, definiowania oryginalnych zdarze. Definiowanie zdarze jest duo bardziej skomplikowane. W niniejszym wykładzie poznamy jedynie sposób wykorzystania zdarze. Zdarzenie jest udostpnione przez klas, dziki czemu mona do niego przypisywa obiekty metod delegowanych. Podstawow delegacj, która jest zwizana wikszoci prostych zdarze jest, EventHandler, która ma nastpujc posta:
public delegate void EventHandler(Object sender, EventArgs e); Argument sender klasy Object przechowuje obiekt, który wygenerował zdarzenie. Klasa Object jest klas bazow wszystkich klas. Klasa zostanie dokładniej omówiona w jednym z kolejnych wykładów. W miejsce parametru sender moe by wstawiony obiekt dowolnej klasy zdefiniowanej w jzyku C#. Drugi argument e klasy EventArgs, jest zaleny od rodzaju zdarzenia. W tym obiekcie s przechowywane dodatkowe informacje na temat zdarzenia. Klasa EventArgs jest równie klas bazow dla wszystkich klas zwizanych z argumentami zdarze. W przypadku zdarze zwizanych z mysz (nacinicie czy zwolnienie przycisku myszy) w miejsce tego obiektu pojawia si obiekt klasy MouseEventArgs, która udostpnia współrzdne myszy. Zdarzenia zwizane z rysowaniem obiektów graficznych dysponuj obiektem klasy PaintEventArgs, za porednictwem którego mona wykonywa samodzielnie operacje graficzne. Dodawanie metody delegowanej do zdarzenia Click obiektu przycisk klasy Button. Button przycisk = new Button(); przycisk.click += new EventHandler(przycisk_Click); odłczenie metody delegowanej do zdarzenia Click obiektu przycisk klasy Button (przycisk). przycisk.click -= przycisk_click;
owa metoda, która spełnia załoenia delegacji EventHandler. public void przycisk_click(object sender, EventArgs e) MessageBox.Show( Kliknito przycisk! ); 3. Elementy Windows Application (WPF Windows Presentation Foundation) Pokaz rodowiska i etapów tworzenia pierwszej aplikacji WPF. Aplikacja wyk31, po podaniu pierwszego wyrazu i ilorazu cigu geometrycznego oblicza sum nieskoczonego cigu geometrycznego, gdy iloraz jest ułamkiem. Gdy iloraz nie jest ułamkiem wywietla si komunikat Podano błdne wartoci