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
Časopis
Hlavní stránka
Assembler
C,C++
Delphi
DOTNET
Flash
HTML
Java
JavaScript
Knihy
O Internetu
Pascal
PHP
Pro. programátor
Programy
Python
Tiskové zprávy

Projekty

JScript Planet
ProProjekty

Služby

Monitoring

Informace
Redakce
O časopisu
Odkazy
Nový redaktor


ISSN 1213-7359

Šéfredaktor:
Jan Sova

Zástupci šéfredaktora
Frerenzy Dawid
Krásenský David

Šéfredaktoři rubrik
Michal Chalupník
Formánek Jiří
Pavel Aleš
Sojka Zdeněk
Petr Rympler

Administrátor
Jan Sova

Naše ikonka
MinaSite
Komplikátorovy Stránky
TOPlist
GALACTICA

Časopis používá redakční systém Sova-Press.



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:

1.                          Deklarace zástupce, který určuje typ události a parametry metody obsluhující událost. Např. delegate void D(string s); Obslužná metoda události je typu void a má jeden parametr typu string.

2.                          Deklarace události. Např. public event D E;

3.                          Tvorba příkazu ke spuštění události např. E(s). Událost může být spouštěna pouze ve třídě, v níž je deklarována. Nejdříve je však třeba zkontrolovat, zda je událost obsluhována. V události musí být před jejím spuštěním reference na metodu, která bude obsluhu dělat. Je-li spouštěna událost, která není obsloužena, tj. není v ní žádná reference,  hlásí program v C# chybu (System.NullReferenceException). Příklad kontroly a spuštění: if(E!=null)E(s);.

4.                          Tvorba obslužné metody pro událost. Její hlavička je určena datovým typem události, tj. příslušným zástupcem. Např. static void Obsluha(string s)

5.                          Vložení reference na obslužnou metodu do události, např. obj.E+=new D(Obsluha);. Událost je ve své podstatě vícečetný delegát a proto může obsahovat více referencí. V tom případě bude po spuštění události vyvoláno více obslužných metod (všechny, na které jsou v události odkazy). Reference do události dáváme operátorem +=, odkazy lze z události i odstranit. K tomu použijeme operátor  -=.

6.                          Nastartujeme náš program. Dojde-li ke spuštění události, jsou volány všechny obslužné metody v události referencované.

 

Poznámka: zatím jsme předpokládali, že události jsou vázány na konkrétní objekt – instanci třídy. Události mohou být i statické. V tom případě jsou událostmi třídy. Deklarace takové události Es je např. public static event D Es;Vložení reference do události je potom příkaz C.Es+=new D(Obsluha);, kde C je třída, v níž je statická událost deklarována.

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
Událost nastala 19.3.2004 9:51:48
Toto jsou data poslaná do obslužné procedury události:Nazdar metodo!

Autor: Jiří Makovička e-mail: jmakov@natur.cuni.cz web:

Příspěvky ke článku

Ke článku nejsou komentáře
Přidat komentář

Poslední ze stejné rubriky

Práce v .NET Framework - Zástupci
Práce s XML v C# (5.) - ověřování dokumentu pomocí třídy XmlValidatingReader
Práce s XML v C# (4.) - třídy XmlDocument a dotazy jazyka XPath
Práce s XML v C# (3.) - třída XmlTextWriter
Práce s XML v C# (2.) - třída XmlTextReader

Funkce ke článku
Přidat komentář

Nejnovější články
Práce s událostmi v .NET Framework. [18095]
Nová soutěž na 3D Contestu CZ [13684]
Práce v .NET Framework - Zástupci [15998]
Práce s XML v C# (5.) - ověřování dokumentu pomocí třídy XmlValidatingReader [14049]
Práce s XML v C# (4.) - třídy XmlDocument a dotazy jazyka XPath [19472]


O článku
Datum: 20.03.2004
Rubrika: DOTNET
Čtenářů: 18095
Autor: Jiří Makovička

Hodnocení článku:
Znamka: 2.82
Počet známek: 3128
[1] [2] [3] [4] [5]

 


(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