11
Vizuális és eseményvezérelt programozás 2006–2007, II. félév BMF NIK © Miklós Árpád, BMF NIK, 2006–2007 [email protected] Eseménykezelés A képviselő („delegate”) Képviselők C# nyelvi megvalósítása Metódushívás képviselőn keresztül Az esemény („event”) Esemény közzététele Eseménykezelő létrehozása Feliratkozás eseményre

Csharp Events

Embed Size (px)

DESCRIPTION

some words about csharp event handling

Citation preview

  • Vizulis s esemnyvezrelt programozs 20062007, II. flvBMF NIK

    Mikls rpd, BMF NIK, [email protected]

    Esemnykezels

    A kpvisel (delegate)Kpviselk C# nyelvi megvalstsaMetdushvs kpviseln keresztlAz esemny (event)Esemny kzztteleEsemnykezel ltrehozsaFeliratkozs esemnyre

  • 2007. mrcius 21. 2V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    Hallgati tjkoztat

    A jelen bemutatban tallhat adatok, tudnivalk s informcik a szmonkrend anyag vzlatt kpezik. Ismeretk szksges, de nem elgsges felttele a sikeres zrthelyinek, illetve vizsgnak.

    Sikeres zrthelyihez, illetve vizsghoz a jelen bemutat tartalmn fell a ktelez irodalomknt megjellt anyag, a gyakorlatokon szban, illetve a tbln tadott tudnivalk ismerete, valamint a gyakorlatokon megoldott pldk s az otthoni feldolgozs cljbl kiadott feladatok nll megoldsnak kpessge is szksges.

  • 2007. mrcius 21. 3V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    A kpvisel (delegate)

    A kpvisel egy specilis nyelvi elem, melynek segtsgvel egy osztlyhoz kls osztlyok kapcsoldhatnak

    A kpvisel (ms kifejezssel metdusreferencia vagy deleglt) elrja az osztlyok kztti zenetek formtumt. Ez a formtum tulajdonkppen az zenetvltshoz hvand metdus szignatrja, mivel az zenetvlts OOP rendszerekben ltalban metdushvsknt valsul meg.

    Tetszleges kls osztly kapcsoldhat kpviseln keresztl egy msik osztlyhoz, ennek egyetlen felttele az elrt formtum betartsa.

    Kpviselk segtsgvel egy osztly metdusai kls osztlyok metdusait ismeretlenl is meg tudjk hvni

    A kpviselk teht kzvettenek a hv s a hvott osztly kztt. Fbb felhasznlsi terleteik:

    zenetkldsi lehetsg kls osztlyok rszre

    Mg nem is ltez osztlyok metdusainak hvsa (univerzlis visszahvsi funkci, rtestsi funkci)

  • 2007. mrcius 21. 4V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    Maguk a kpviselk specilis (idegen metdusok trolsra alkalmas) osztlyok

    Kpviselk a delegate kulcssz segtsgvel, sajt nvvel s az ltaluk kpviselhet metdusok szignatrjval deklarlhatk.

    A kpvisel osztly pldnyostsa gy trtnik, hogy konstruktornak t kell adni paramterl egy, a kpviselnek megfelel szignatrj metdust. (!)

    Kpviselk C# nyelvi megvalstsa

    public delegate void EventHandler(object sender, EventArgs e);

    Visszatrsi rtk tpusa

    Paramterlista tpusokkal

    Az EventHandler tpus pldnyai ltal kpviselhet metdusok szignatrja (a paramterek neve nem lnyeges)

    public EventHandler EH = new EventHandler(eventHandlerMethod); E metdus szignatrja azonos vagy kompatibilis kell, hogy legyen

    a fent megadott szignatrval*

    * Az tadott metdus visszatrsi rtknek tpusa a kpviselnl megadott tpus vagy annak brmely leszrmazottja lehet (kovariancia), paramtereinek tpusa pedig a kpviselnl megadott tpus vagy annak brmely se lehet (kontravariancia).

  • 2007. mrcius 21. 5V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    delegate double Kzvett(double d);

    static class Mveletek{

    public static double Ktszerezs(double szm){ return szm + szm; }

    public static double NgyzetreEmels(double szm){ return szm * szm; }

    }

    class Program{

    static void Main(){

    Kzvett[] mveletek = new Kzvett[] { new Kzvett(Mveletek.Ktszerezs), new Kzvett(Mveletek.NgyzetreEmels) };

    foreach (Kzvett k in mveletek)System.Console.WriteLine( k(2.5) );

    }}

    delegate double Kzvett(double d);

    static class Mveletek{

    public static double Ktszerezs(double szm){ return szm + szm; }

    public static double NgyzetreEmels(double szm){ return szm * szm; }

    }

    class Program{

    static void Main(){

    Kzvett[] mveletek = new Kzvett[] { Mveletek.Ktszerezs, Mveletek.NgyzetreEmels };

    foreach (Kzvett k in mveletek)System.Console.WriteLine( k(2.5) );

    }}

    Metdushvs kpviseln keresztl (1)Egyszer metdushvs

  • 2007. mrcius 21. 6V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    A kpvisel ltrehozsakor paramterknt tadott metdus s az utlag a += opertorral tadott metdus hvsa egyms utn

    Metdushvs kpviseln keresztl (2)Tbb metdus felfzse (multicast)

    delegate void Feldolgoz(string szveg);

    class Program{

    static void KirsNagybetkkel(string s){ System.Console.WriteLine( s.ToUpper() ); }static void KirsKisbetkkel(string s){ System.Console.WriteLine( s.ToLower() ); }static void Main(){

    Feldolgoz f = new Feldolgoz(KirsNagybetkkel);f += new Feldolgoz(KirsKisbetkkel);

    f("A kpviseln keresztl futottam le.");System.Console.WriteLine();KirsNagybetkkel("Egyszer metdushvssal futottam le.");

    }}

    Feldolgoz f = new Feldolgoz(KirsNagybetkkel);f += new Feldolgoz(KirsKisbetkkel);

  • 2007. mrcius 21. 7V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    Metdushvs kpviseln keresztl (3)Kpvisel tpus paramterek

    delegate bool sszehasonlt(object bal, object jobb);

    class EgyszerCsersRendez{

    public static void Rendez(object[] rendezendTmb, sszehasonlt nagyobb){

    for (int i = 0; i < rendezendTmb.Length; i++)for (int j = i + 1; j < rendezendTmb.Length; j++)

    if ( nagyobb(rendezendTmb[j], rendezendTmb[i]) ){

    object ideiglenes = rendezendTmb[i];rendezendTmb[i] = rendezendTmb[j];rendezendTmb[j] = ideiglenes;

    }}

    }

  • 2007. mrcius 21. 8V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    Az esemny (event)

    Az esemny egy kifejezetten rtestsi cl nyelvi elem (valjban egy korltozott, biztonsgosabb tett kpvisel)

    Az esemnyek segtsgvel valsul meg a kls osztlyok rtestse.

    Az rtestsi folyamat ltalnos menete:1. Az esemnyt rtestsi cllal felknl osztly kzzteszi az esemnyt

    A kzztev osztly erre a clra egy megfelel kpvisel tpus nyilvnos mezt deklarl.

    2. Az esemny irnt rdekld osztlyok egy sajt metdus tadsval feliratkoznak az esemnyt kzztev osztlynl

    A feliratkozs sorn az osztlyok egy-egy elre elksztett, meghatrozott szignatrjmetdust (n. esemnykezelt) adnak t paramterknt a kzztev osztlynak.

    A feliratkozs az esemny += opertornak segtsgvel trtnik, emellett utlagos leiratkozsra is van lehetsg a -= opertorral.

    Az esemny alapjul szolgl kpvisel sajt listban tartja nyilvn a feliratkozsok sorn a += s a -= opertorokkal fel-, illetve leiratkozott metdusokat.

    3. A kzztev osztly valamely metdusban kivltdik az esemnyA bekvetkezett esemnyrl a kzztev osztly (a kpvisel segtsgvel) a feliratkozs sorn megadott esemnykezel metdusok hvsval rtesti a feliratkozott osztlyokat.

  • 2007. mrcius 21. 9V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    A kzztett esemnyek specilis mezk*, amelyek az event kulcssz segtsgvel, sajt nvvel s a megfelel kpvisel (mint

    alaptpus) megnevezsvel adhatk meg

    Az esemnymezk rtke az alaptpusukknt szolgl kpvisel egy pldnya, amelyek a megfelel szignatrj metdusok tadsval jn ltre. A kpvisel ltrehozshoz feliratkozskor a += opertorral, leiratkozskor a -= opertorral kell a kvnt metdust a mez rtkl megadni.

    A kls felhasznl osztlyok szmra kzztett esemnyek ltalban nyilvnos (public), a leszrmazottak szmra ksztett bels esemnyek ltalban vdett (protected) lthatsgak.

    Esemny kzzttele

    public event EventHandler Load;

    Az esemny alaptpusul szolgl kpvisel

    * Valjban az esemnyekhez sajt fel- s leiratkozsi (add, illetve remove) metdusok is kszthetk egyni trolsi megoldssal, teht az esemnyek szemantikja a mezk helyett inkbb a tulajdonsgokhoz hasonlt, melyek szintn sajt elrsi metdusprral rendelkeznek. A fenti lers az egyszerbb, a gyakorlatban jellemzen hasznlt esetet veszi alapul.

  • 2007. mrcius 21. 10V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    using System;using System.Windows.Forms;

    namespace WindowsApplication1{

    public partial class Form1 : Form{

    public Form1(){

    InitializeComponent();}

    }}

    Esemnykezel ltrehozsa

    Form1.cs

    private void Form1_Load(object sender, EventArgs e){

    this.Text = "Hello, C# World";}

  • 2007. mrcius 21. 11V1.2 Mikls rpd, BMF NIK, 20062007

    [email protected]

    #region Windows Form Designer generated code

    /// /// Required method for Designer support - do not modify/// the contents of this method with the code editor./// private void InitializeComponent(){

    this.SuspendLayout();//// Form1//this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 14F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(292, 272);this.Name = "Form1";this.Text = "Form1";

    this.ResumeLayout(false);}#endregion

    Feliratkozs esemnyre

    Form1.Designer.cs

    this.Load += new System.EventHandler(this.Form1_Load);