| ProgramatorCZ | Diskusní fórum | ASMDprojekt | Vtipy | JavaScript |
| Spolupracujeme: WebGuru | Komplikátor | MinaSite | Přidat k oblíbeným položkám | Nastavit jako výchozí stránku |
|
|
Práce s událostmi v .NET Framework. v rubrice DOTNET V článku se dozvíte, jak lze pro .NET objekt definovat a obsloužit události a jaký standard nabízí pro práci s událostmi knihovna Microsoft .NET Framework.
Událost je způsob, kterým objekt signalizuje svému okolí, že v něm došlo ke změně stavu. V .NETu jsou události implementovány pomocí zástupců. V C# je událost vždy typu definovaného určitým zástupcem. Signál, který objekt prostřednictvím události vysílá navenek, obsluhujeme speciální metodou. Parametry této metody určuje datový typ události. Metod obsluhujících události může být i více. Jejich návratový typ je však ze zásady void. Objekt při spuštění události totiž neočekává, že mu její obsluha vrátí nějakou hodnotu. Příklad (současně s čtením textu můžete sledovat jeho kódování v následujícím programu): Je deklarován typ zástupce D. Ve třídě C je deklarována událost E: public event D E. V metodě M třídy C se nejprve testuje, zda je událost obsluhována (test podmínky E!=null). Pokud ano, událost je spuštěna(if(E!=null)E(s);). V metodě Main nejdříve vytvoříme objekt obj ze třídy C. Potom do jeho události dáme referenci na metodu událost obsluhující (obj.E+=new D(Obsluha);). Dále voláme metodu M objektu, v níž nastane událost. Po spuštění události je ihned volána metoda Obsluha. using System;
namespace UdalostiDemo { delegate void D(string s); class C { public event D E; public void M(string s) { Console.WriteLine("Jsem metoda M a spustím událost E"); if(E!=null)E(s); } } class Class1 {
static void Main(string[] args) { C obj=new C(); obj.E+=new D(Obsluha); obj.M("Nazdar metodo");
} static void Obsluha(string s) { Console.WriteLine("Jsem obsluha události E a od ní jsem dostala tato data:" +s); } } } Shrňme ještě kroky potřebné pro tvorbu, spouštění a obsluhu události:
Nástroje pro tvorbu událostí podle standardu .Net.V .NET je pro práci s událostmi definován zástupce EventHandler a třída EventArgs (můžeme se o tom přesvědčit ve Windows a Web formulářích). [Serializable]public delegate void EventHandler(object sender,EventArgs e);
V parametru sender je předáván odkaz na objekt, v němž událost nastala. Parametr e obsahuje data, která událost dodává obslužné proceduře. Připomeňme, že EventHandler je vícečetný zástupce, z čehož plyne, že jednu událost lze obsloužit více metodami. Podívejme se na reprezentativní vzorek, na programové zabezpečení události Click (klepnutí na tlačítko) v okně aplikace pro Windows. Příkaz pro naplnění události ukazatelem na obslužnou proceduru je this.button1.Click += new System.EventHandler(this.button1_Click); Kde this je odkaz na formulář s tlačítkem button1. Obslužná metoda události má hlavičku private void button1_Click(object sender, System.EventArgs e) Chceme-li výše uvedené schéma používat v programech, máme ušetřenou práci s deklarací zástupce (použijeme totiž již deklarovaný EventHandler). Informace potřebné ke zpracování události můžeme do obslužných procedur dodávat jako objekty udělané ze třídy odvozené z třídy EventArgs. Využití popsaných nástrojů demonstruje následující program using System; namespace MicrosoftRecomendations { class EData : EventArgs // Třída pro objekty v nichž dodáváme data do obsluhy události. { public DateTime CasUd; // Čas vzniku. public string DataUd; // Další data. } class C // Třída s událostí typu EventHandler. { public event EventHandler E; public void M(string s) { Console.WriteLine("Jsem metoda M a spustím událost E"); if(E!=null) {// Je-li událost obsluhována, děláme datový objekt D a spouštíme událost. EData D=new EData(); D.CasUd=DateTime.Now; D.DataUd="Toto jsou data poslaná do obslužné procedury události:" + s; E(this,D); } } }
class Class1 { static void Main(string[] args) { C obj=new C(); obj.E+=new EventHandler(Obsluha); obj.M("Nazdar metodo!"); } static void Obsluha(object sender, EventArgs e) { EData D=(EData)e; // Pro získání dat musíme e přetypovat. Console.WriteLine("Událost nastala " + D.CasUd.ToString()); Console.WriteLine(D.DataUd); } } } Výstup programu:
Jsem metoda M a spustím událost E Autor: Jiří Makovička e-mail: jmakov@natur.cuni.cz web:
|
|
|
 
(c) Systém Jan Sova, Design David Krásenský a Jan Sova
Se svými dotazy či problémy se obracejte na diskusní
fórum.
Časopis je součástí projektu Programator