vizuális programozás -...

Download Vizuális programozás - johanyak.hujohanyak.hu/files/u1/segedlet/vizualis_programozas/Vizualis... · Johanyák Zsolt Csaba: Vizuális programozás 14 Hozzuk létre az Ős osztályban

If you can't read please download the document

Upload: trinhtuong

Post on 06-Feb-2018

221 views

Category:

Documents


2 download

TRANSCRIPT

  • Kecskemti Fiskola GAMF Kar

    2016

    VIZULIS PROGRAMOZS Oktatsi segdlet

    Johanyk Zsolt Csaba

  • I. Nyelvi Alapok - I.1. Komplex szmok

    Copyright 2008-2016 Johanyk Zsolt Csaba http://johanyak.hu e-mail: [email protected]

    Ksznetnylvnts

    Ksznettel tartozom Hatvani Tibornak, aki segtsget nyjtott a 2015-s Visual Studio-nak megfelel

    frisstsekhez s Halczman Szilvinak, aki lektorlta a kziratot.

  • I. Nyelvi Alapok - I.1. Komplex szmok

    1

    Tartalomjegyzk

    I. Nyelvi Alapok ................................................................................................................. 4

    I.1. Komplex szmok ................................................................................................................. 4

    I.2. Virtulis metdusok C#-ban .............................................................................................. 11

    I.3. Kivtelkezels ................................................................................................................... 23

    1. Nem kezelt kivtel ..................................................................................................................... 24

    2. Kivtelek kezelse ..................................................................................................................... 26

    3. Kivtelek elidzse .................................................................................................................. 31

    4. Jtancsok ................................................................................................................................. 32

    5. Ellenrz krdsek .................................................................................................................... 32

    I.4. Esemnykezels Lottjtk ............................................................................................. 33

    1. Esemnyek, kzztev-feliratkoz modell ................................................................................ 33

    2. Feladat s fbb lpsek ............................................................................................................. 34

    3. Paramterek tadsa ................................................................................................................ 35

    4. Esemnyek s esemnykezel tpusok ..................................................................................... 37

    5. A lotthzst megvalst osztly (kzztev) ......................................................................... 38

    6. A jtkosokat modellez osztly ............................................................................................... 41

    7. A Program osztly s a Main metdus ...................................................................................... 43

    8. Tovbbi feladatok ...................................................................................................................... 46

    I.5. Sorosts (szrializci) s helyrellts .............................................................................. 47

    1. Binris sorosts s helyrellts ................................................................................................ 47

    2. SOAP-XML sorosts s helyrellts ......................................................................................... 48

    3. XML sorosts s helyrellts ................................................................................................... 49

    4. Plda .......................................................................................................................................... 49

    II. Windows Forms .......................................................................................................... 58

    II.1. Gymlcsraz automata ................................................................................................. 58

    1. A feladat megoldsa .................................................................................................................. 58

    2. A fablak grafikus felletnek ltrehozsa ............................................................................... 58

    3. Esemnykezel a Kilp nyomgombhoz ................................................................................... 59

    4. Asszociatv tmb a szerkesztmez nyomgomb prosokhoz ................................................. 60

    5. Kzs esemnykezel a ngy gymlcs nyomgombhoz ......................................................... 61

    6. Egysgrak megvltoztatsa ..................................................................................................... 62

    7. Hzi feladat ................................................................................................................................ 65

    II.2. Ugrl Gomb ................................................................................................................... 66

    1 Fellet kialaktsa ....................................................................................................................... 66

    2. Adattagok definilsa ................................................................................................................ 67

    3. Kezdrtk ads a konstruktorban. .......................................................................................... 67

    4. Az ablak fejlcben feliratot megjelent metdus definilsa ................................................ 68

    5. A jtkot elindt Start gomb esemnykezeljnek elksztse. .............................................. 68

    6. Esemnykezel ksztse a csszka mozgatshoz................................................................... 68

    7. Esemnykezel ksztse a Kapj El! gombhoz. .......................................................................... 69

    8. Esemnykezel ksztse a mozgsid Tick esemnyhez ....................................................... 69

    9. Esemnykezel ksztse a jtkid idzthz ........................................................................ 69

    10. rvnytelen tallatok kiszrse ............................................................................................... 70

  • 2

    11. Hzi Feladat ............................................................................................................................. 71

    II.3. Kpnzeget Program ...................................................................................................... 72

    1. A feladat megoldsa .................................................................................................................. 72

    2. Grafikus fellet ltrehozsa....................................................................................................... 72

    3. Kpnevek beolvassa a program indulsakor ........................................................................... 73

    4. Kivlasztott kp betltse ......................................................................................................... 74

    5. Kp megjelentse ..................................................................................................................... 74

    6. Kpmegjelnts mr a program indulsakor ............................................................................. 75

    7. Osztlydiagram .......................................................................................................................... 76

    8. Hzi feladat ................................................................................................................................ 76

    II.4. Szveg elhelyezse bittmbbe s kiolvassa program ....................................................... 76

    1. A feladat megoldsa .................................................................................................................. 77

    2. Grafikus fellet ltrehozsa....................................................................................................... 77

    3. Esemnykezel a Kilp nyomgombhoz ................................................................................... 77

    4. Az SzBArray osztly hozzadsa a projekthez s kisebb mdostsa ...................................... 77

    5. SzBArray tpus adattag ltrehozsa az ablak osztlyban ....................................................... 78

    6. Kdols megvalstsa .............................................................................................................. 79

    7. Kiolvass megvalstsa ............................................................................................................ 79

    II.5. Analg ra ....................................................................................................................... 80

    1. Fellet kialaktsa ...................................................................................................................... 80

    2. Idkezels .................................................................................................................................. 81

    3. Rajzols (mutatk) ..................................................................................................................... 81

    4. Esc billenty lenyomsra kilps a programbl ...................................................................... 83

    5. Legyen az ra ablak kr alak.................................................................................................... 83

    6. Legyen mozhathat az ablak az egr segtsgvel .................................................................... 83

    7. Nvjegy panel ksztse ............................................................................................................ 84

    8. Gyorsmen ksztse ................................................................................................................. 84

    9. Esemnykezel ksztse a gyorsmenhz. .............................................................................. 85

    10. Fablak kezdpozcija ............................................................................................................ 85

    11. Hzi feladat .............................................................................................................................. 86

    III. Windows Presentation Foundation ............................................................................ 87

    III.1. Kzdimenzis rajzols WPF-ben ....................................................................................... 87

    1. Feladat ....................................................................................................................................... 89

    2. Megolds ................................................................................................................................... 89

    3. Egynileg megoldand feladat .................................................................................................. 93

    III.2. Ugrl gomb ................................................................................................................... 93

    1. Az alkalmazs vznak automatikus generlsa: ...................................................................... 94

    2. Fellet kialaktsa: ..................................................................................................................... 94

    3. Adattagok definilsa ................................................................................................................ 95

    4. Kezdrtk ads a konstruktorban ........................................................................................... 96

    5. Esemnykezel ksztse a Tick esemnyhez. ........................................................................ 97

    6. Az ablak fejlcben feliratot megjelent metdus definilsa. ............................................... 98

    7. Esemnykezel ksztse a Kapj El! Gombhoz .......................................................................... 98

    8. A jtkot elindt Start gomb esemnykezeljnek elksztse. .............................................. 99

  • I. Nyelvi Alapok - I.1. Komplex szmok

    3

    9. Esemnykezel ksztse a csszka mozgatshoz. ............................................................... 100

    10. Hzi feladat ............................................................................................................................ 100

    III.3. Kpnzeget alkalmazs WPF alap fellettel ................................................................ 100

    1. Megolds ................................................................................................................................. 101

    2. A fellet elksztse ................................................................................................................. 101

    3. A feladatot megvalst kd ................................................................................................... 104

    4. Esemnykezel a mappavlasztshoz. .................................................................................... 108

    5. Hzi feladat .............................................................................................................................. 108

    IV. Adatbziskezels Model First Entity Framework ..................................................... 109

    IV.1. Telefonszmok konzol alkalmazs .................................................................................. 109

    1. Az Entity Framework modell s az adatbzis ltrehozsa ....................................................... 109

    2. Adatfelvitel kzvetlenl az adattblkba ................................................................................ 120

    3. Adatfelvitel programbl .......................................................................................................... 122

    4. Lekrdezsek programbl ....................................................................................................... 126

    IV.2. Telefonszamok WPF alkalmazs ..................................................................................... 127

    1. Projekt s alapbelltsok ........................................................................................................ 127

    2. A fellet elksztse ................................................................................................................. 130

    3. Egyszer lekrdezs................................................................................................................. 133

    4. Komplex lekrdezs ................................................................................................................. 134

    5. Helysgadatok mdostsa ...................................................................................................... 139

    IV.3. Az adatbzisban trolt adatok lementse SQL szkriptbe az adatbzis szerkezettel egytt,

    majd az adatbzis jbli ltrehozsa. ..................................................................................... 142

    V. Windows Forms - Adatkts, Adatbziskezels .......................................................... 149

    V.1. Access adatbzis elrse OLE DB-n keresztl .................................................................... 149

    1. A felhasznli fellet ltrehozsa ............................................................................................ 149

    2. Adatforrs megadsa s a tpusos adatkezel osztlyok legenerlsa ................................... 151

    3. A kd elksztse ..................................................................................................................... 152

    V.2. Adatbziselrs ODBC-n keresztl utastsokkal, C#-ban .................................................. 160

    1. Elkszts Access adatbzis lemsolsa, ODBC DSN ltrehozsa ....................................... 160

    2. Alkalmazs ltrehozsa ........................................................................................................... 164

    3. Hzi Feladat ............................................................................................................................. 170

  • 4

    I. Nyelvi Alapok

    I.1. Komplex szmok

    Clok:

    Ismerkeds a Visual Studio 2015 Professional fejlesztrendszerrel (fordts, konfigurcitpusok, nhny bellts)

    Egyszer konzolalkalmazs ksztse vizulis eszkzkkel

    Vletlenszm generls

    ToString metdus tdefinilsa Ksztsen egy Komplex szmokat reprezentl osztlyt.

    Adattagok: vals, kpzetes.

    Lehessen inicializlni a vals s a kpzetes rsz megadsval egy ktparamteres konstruktor segtsgvel.

    Lehessen sztringben megkapni a komplex szmot vals+kpzetes*i alakban (ToString metdus tdefinilsa).

    Lehessen megnvelni a komplex szmot egy msik komplex szmmal. Lehessen megnvelni a komplex szmot egy vals szmmal.

    Lehessen kt komplex szm klnbsgt kpezni. Lehessen cskkenteni a komplex szmot egy vals szmmal.

    A ffggvnyt tartalmaz osztlyban hozzon ltre kt vletlenszeren generlt vals s kpzetes rsz komplex szmot (objektumot), majd rassa ki a bennk trolt rtkeket, valamint az sszegket s a klnbsgket. rassa ki egy komplex szm s egy vals szm sszegt s klnbsgt.

    Hozzon ltre egy tmbt, amelynek elemei Komplex tpusak, s tltse fel a tmbt vletlenszeren ellltott rtkekkel.

    rassa ki a tmb elemeit.

    Adja ssze a tmb elemeit, s rassa ki az eredmnyt. Minden alkalmazshoz projektet kell kszteni. Ennek menete a kvetkez:

    A mai gyakorlaton konzolalkalmazst ksztnk. Ha a fejlesztkrnyezet gy van belltva, hogy megadhatjuk a projekt helyt, akkor a C:\munka knyvtron bell helyezzk el azt.

  • I. Nyelvi Alapok - I.1. Komplex szmok

    5

    Az UML-szer osztlydiagram elksztse s megjelentse

    Kezdetben egy osztlyunk van, ami a ffggvnyt tartalmazza:

    A Class Details ablakban olvashatjuk el az osztly tagjaira vonatkoz informcikat, illetve itt vehetnk fel jabb elemeket az osztlyba. Elszr vlasszuk ki az osztlyt a diagramon.

  • Johanyk Zsolt Csaba: Vizulis programozs

    6

    j osztly ltrehozsa a komplex szmok szmra:

    Az j osztlyt is az aktulis llomnyba helyezzk el.

    Adattagok ltrehozsa a Fields rszben:

  • I. Nyelvi Alapok - I.1. Komplex szmok

    7

    Konstruktor definilsa:

    ttrs kd nzetbe:

    Az automatikusan ltrehozott metdus vz, ami kezdetben csak egy kivtel elidzst tartalmaz:

    public Komplex(double vals, string kpzetes) {

    throw new System.NotImplementedException(); }

    Utastsok:

    public Komplex(double vals, string kpzetes) {

    this.vals = vals; this.kpzetes = kpzetes;

    } Az object sosztlyban definilt Tostring metdus eredetileg az osztly nevt adja vissza egy sztringben. Ehelyett mi azt szeretnnk, hogy egy olyan sztringet definiljon, ami vals+kpzetes*i alakban tartalmazza az objektumban trolt adatokat. rklt ToString tdefinilsa:

  • Johanyk Zsolt Csaba: Vizulis programozs

    8

  • I. Nyelvi Alapok - I.1. Komplex szmok

    9

    ttrs kd nzetbe:

    Az automatikusan ltrehozott metdus vz:

    public override string ToString(){ throw new System.NotImplementedException();

    } Az j fggvnytrzs:

    public override string ToString(){ return string.Format("{0,8:F4}+i*{1,8:F4}", vals, kpzetes);

    } A komplex szm +/- komplex szm s a komplex szm +/- vals szm sszegek/klnbsgek szmtshoz tdefiniljuk a megfelel opertorokat. Az tdefinilt opertorokat nem lehet vizulisan ltrehozni ezrt az albbiakat teljes egszben be kell gpelni: public static Komplex operator +(Komplex a, Komplex b){

    return new Komplex(a.vals + b.vals, a.kpzetes + b.kpzetes); } public static Komplex operator +(Komplex a, double b){ return new Komplex(a.vals + b, a.kpzetes); } public static Komplex operator -(Komplex a, Komplex b){

    return new Komplex(a.vals - b.vals, a.kpzetes - b.kpzetes); } public static Komplex operator -(Komplex a, double b){ return new Komplex(a.vals - b, a.kpzetes); } Visszatrve az osztlydiagramhoz:

  • Johanyk Zsolt Csaba: Vizulis programozs

    10

    A program osztly tnevezse:

    A ffggvny kdjt kzzel kell berni az automatikusan generlt fggvnyvzba: //Futtat osztly class Futtat{

    static void Main(string[] args){ Console.WriteLine("Komplex szmok kezelse\n"); Random r = new Random(); Komplex a = new Komplex(r.NextDouble(), r.NextDouble()); Komplex b = new Komplex(r.NextDouble(), r.NextDouble()); Console.WriteLine("k\t={0}", a); Console.WriteLine("l\t={0}", b); Console.WriteLine("k+l\t={0}", a + b); Console.WriteLine("k-l\t={0}", a - b); Console.WriteLine("k+{0,-6}={1}", 8, a + 8); Console.WriteLine("k-{0,-6}={1}\n", 10, a + 10); Komplex[] komplexTmb = new Komplex[4]; Komplex sszeg = new Komplex(0, 0); for(int i= 0; i < komplexTmb.Length; i++){

    komplexTmb[i] = new Komplex(r.NextDouble(), r.NextDouble()); Console.WriteLine("komplexTmb[{0,2}]={1}", i, komplexTmb[i]);

    sszeg = sszeg + komplexTmb[i]; }

    Console.WriteLine("\nA tmbben lev rtkek sszege:\n\n{0,27}", sszeg);

    Console.ReadLine();}} A program futsnak eredmnye:

  • I. Nyelvi Alapok - I.2. Virtulis metdusok C#-ban

    11

    Feladat: Tanulmnyozza t a RacionalisSzamok knyvtrban lev projektet. redekesebb elemek:

    Egyik konstruktor meghvja a msikat. Alapelv: egy kdrszlet csak egy pldnyban szerepeljen a kdban.

    Egyenlsgvizsglat rdekben definilni kell az = = opertort, t kell definilni az Equals metdust.

    Relcis opertorok csak prban definilhatk t: = = s !=, < s >

    I.2. Virtulis metdusok C#-ban

    Clok:

    Virtulis metdusok hasznlatnak s ksztsnek gyakorlsa.

    Vletlenszm generls Ksztsnk egy osztlyt (s) az albbi funkcionalitst megvalst metdusokkal:

    Egsz elemekbl ll tmb ltrehozsa s feltltse vletlenszmokkal.

    Adatok kirsa sztringbe gy, hogy az elemek egymstl vesszvel elvlasztva jelenjenek meg.

    Sztring kiratsa a konzolra.

    Kt egsz szm sszeadsa (Mvelet metdus)

    A mvelet vgrehajtsa kt tmb minden elemre (Szmt metdus).

    Ksztsnk egy leszrmazott (Leszrmazott) osztlyt az elz osztlyhoz, amelyben a Mvelet metdus kt szm klnbsgt szmtja.

    Egy konzol alkalmazssal indtunk. Emlkeztetl:

  • Johanyk Zsolt Csaba: Vizulis programozs

    12

    Ltrehozzuk az osztlydiagramot, s elmentjk OsztD nven.

    Ltrehozzuk az s osztlyt az aktulis llomnyban.

  • I. Nyelvi Alapok - I.2. Virtulis metdusok C#-ban

    13

    Az osztlydiagramban vltsunk t a tagok rszletes megjelentsre.

    Igaztsuk az osztlyok szlessgt a tartalomhoz.

  • Johanyk Zsolt Csaba: Vizulis programozs

    14

    Hozzuk ltre az s osztlyban az x nyilvnos adattagot, ami int elemekbl ll tmb referencijnak trolsra szolgl.

    Ksztsnk egy konstruktort, ami paramterknt tveszi a tmb elemszmt, s ltrehozza a tmbt.

    A Class Details ablakban adjuk meg az argumentumot.

    Vltsunk t kdnzetbe, s rjuk meg a fggvnytrzset.

  • I. Nyelvi Alapok - I.2. Virtulis metdusok C#-ban

    15

    /// /// Tmb /// public int[] x; /// /// Inicializlja az adattagot /// /// Tmbelemek szma public s(int Db) { throw new System.NotImplementedException(); }

    Mdostsuk a kdot:

    public s(int Db) { //Tmb ltrehozsa

    x = new int[Db]; }

    Hozzunk ltre egy Feltlt nev metdust, ami feltlti 100 s 999 kztti vletlen szmokkal a tmbt.

    Vltsunk t kdnzetbe, s rjuk meg a fggvnytrzset. Generlt kd:

    /// /// Feltlti 100 s 999 kztti vletlen szmokkal a tmbt /// public void Feltlt() {

    throw new System.NotImplementedException(); }

    trt kd:

    public void Feltlt() { //Vletlen szmokat elllt objektum ltrehozsa

    Random n = new Random(GetHashCode()); //A tmb feltltse adatokkal for(int i = 0; i < x.Length; i++) { x[i] = n.Next(100, 999); }

    } A ToString metdust gy definiljuk t, hogy egy olyan string-et hozzon ltre, ami a tmbben trolt adatokat tartalmazza, egymstl vesszvel elvlasztva.

  • Johanyk Zsolt Csaba: Vizulis programozs

    16

    Adjuk meg a fggvny lerst Class Details nzetben.

  • I. Nyelvi Alapok - I.2. Virtulis metdusok C#-ban

    17

    Vltsunk t kdnzetbe, s rjuk meg a fggvnytrzset.

    /// /// Ltrehoz egy sztringet, ami a tmbben trolt adatokat tartalmazza egymstl vesszvel elvlasztva. /// /// A tmb adatai. public override string ToString() {

    throw new System.NotImplementedException(); }

    trt fggvnytrzs:

    public override string ToString(){ string S = ""; string Z; // Felfzzk egy sztringbe az adatokat egymstl // vesszvel elvlasztva // az utols adat kivtelvel, mert utna nem kell vessz // lljon. for(int i = 0; i < x.Length-1; i++) {

    Z = string.Format("{0,4:D}, ", x[i]); S += Z;

    } // Ha a tmb nem volt res, akkor a sztring vghez //hozztesszk az utols adatot. if(x.Length - 1 >= 0) {

    Z = string.Format("{0,4:D}", x[x.Length - 1]); S += Z;

    } return S;}

  • Johanyk Zsolt Csaba: Vizulis programozs

    18

    Definiljunk egy metdust, ami kirja a kpernyre a paramterknt megkapott szveget s a tmbben trolt adatokat.

    Vltsunk t kdnzetbe s rjuk meg a fggvnytrzset.

    /// /// Kirja a kpernyre a paramterknt megkapott szveget s a /// tmbben trolt adatokat /// public void Kir(string S) { throw new System.NotImplementedException(); }

    trt fggvny trzs:

    public void Kir(string S) {

    Console.WriteLine(S + this); }

    Definiljunk egy Mvelet nev metdust, ami paramterknt tvesz kt egsz rtket s sszeadja ezeket. Az eredmny lesz a visszatrsi rtke.

    Vltsunk t kdnzetbe, s rjuk meg a fggvnytrzset.

    /// /// Kt egsz szm kztt vgrehajt egy sszeadsi mveletet /// public int Mvelet(int A, int B) {

    throw new System.NotImplementedException(); }

    Jelljk meg virtulisknt a metdust (virtual kulcssz hasznlata).

    public virtual int Mvelet(int A, int B) {

    return A + B; }

  • I. Nyelvi Alapok - I.2. Virtulis metdusok C#-ban

    19

    Ksztsnk egy Szmt nev metdust, ami tvesz kt, int elemekbl ll tmbre vonatkoz referencit, majd vgrehajtja a mveletet a kt tmbre, s visszaad egy ugyanilyen tmbre irnyul referencit.

    /// /// Vgrehajt egy mveletet kt tmb minden elemre. /// /// Els tmb /// Msodik tmb /// Az sszegeket tartalmaz tmb. public int[] Szmt(int[] A, int[] B) {

    if(A.Length != B.Length) { throw new Exception("A kt tmb mrete eltr!"); } int[] C = new int[A.Length]; for(int i = 0; i < C.Length; i++) { C[i] = Mvelet(A[i], B[i]); } return C;

    }

    Ksztsnk egy leszrmazottat az s osztlyhoz Leszrmazott nven.

    Ltrehozzuk az j osztlyt a mr ismert mdon az aktulis llomnyban.

  • Johanyk Zsolt Csaba: Vizulis programozs

    20

    Lthatv tesszk a ToolBox eszkztrat a bal oldalon, s megnyitjk a Class Designer

    csoportot.

    Kivlasztjuk az Inheritance-t (rklds) az eszkztron.

    A Leszrmazotton lenyomjuk a bal egrgombot, majd lenyomva tartva az egrgombot az sre hzzuk.

  • I. Nyelvi Alapok - I.2. Virtulis metdusok C#-ban

    21

    A Leszrmazott osztlyban ltrehozunk egy konstruktort, ami egy egsz szmot vesz t (darabszm) s vele az s osztly konstruktornak meghvsa tjn inicializlja az rklt adattagot.

    Trjnk t kdnzetbe, s rjuk meg a metdus trzst.

    /// /// Inicializlja az rklt adattagot /// /// Tmb mrete public Leszrmazott(int Db) : base(Db) { }

    Ksztsk el az rklt Mvelet metdus tdefinilt vltozatt, melyben kivonst hajtunk vgre.

  • Johanyk Zsolt Csaba: Vizulis programozs

    22

    Amennyiben az Override Members alakban nem jelenik meg a Mvelet, akkor az az s osztlyban nem lett virtulisknt megjellve. Trjnk t kdnzetbe, s rjuk meg a metdus trzst.

    public override int Mvelet(int A, int B) {

    throw new System.NotImplementedException(); }

    Az override kulcssz utn tegynk megjegyzsbe egy new kulcsszt.

    /// /// Kt egsz szm kztt vgrehajt egy kivonsi mveletet. /// /// Bal oldali operandus /// Jobb oldali operandus /// A kt szm klnbsge public override /*new*/ int Mvelet(int A, int B){

    return A - B; }

    rjuk meg a Program osztly Main metdusnak (ffggvny) trzst.

  • I. Nyelvi Alapok - I.3. Kivtelkezels

    23

    /// /// Ffggvny. Virtulis fggvnyek meghvsra plda. /// static void Main(string[] args) {//Ltrehozunk kt leszrmazott tpus objektumot

    Leszrmazott L1 = new Leszrmazott(10); Leszrmazott L2 = new Leszrmazott(10); //Feltltjk ket vletlen szmokkal L1.Feltlt(); L2.Feltlt(); //Kirjuk ket a konzolra L1.Kir("Az els tmb: "); L2.Kir("A msodik tmb: "); //Kiszmtjuk kzttk a mveletet Leszrmazott L3 = new Leszrmazott(10); L3.x = L3.Szmt(L1.x, L2.x); //Kiratjuk az eredmnyt L3.Kir("A mvelet eredmnye: "); Console.ReadLine(); }

    Prbljuk ki a programot.

    Tvoltsuk el a megjegyzseket a new ell s mgl, valamint tegyk megjegyzsbe az override-ot. Fordtsuk s futtassuk le jbl az alkalmazst.

    Mi okozza az eredmnyek kztti klnbsget? Az eredeti vltozatban a kt Mvelet metdus ugyanannak a virtulis lncnak voltak az elemei, gy amikor a Leszrmazott osztly objektumra meghvtuk az sben definilt Szmt metdust, a Leszrmazott osztly Mvelet metdusa, azaz a kivons hajtdott vgre. A msodik esetben a new kulcssz alkalmazsval megszaktottuk a virtulis lncot, ezrt az sben definilt Mvelet metdus, azaz az sszeads hajtdott vgre.

    I.3. Kivtelkezels

    A C# nyelvben s ltalban a .NET keretrendszerben a hibajelzs s -kezels szles krben alkalmazott formja a kivtelek elidzse s feldolgozsa. Az albbiakban megismerkednk a nem kezelt kivtel fogalmval, a kivtelek feldolgozsi s tovbbtsi lehetsgeivel, valamint elidzskkel.

  • Johanyk Zsolt Csaba: Vizulis programozs

    24

    Bevezetskppen tekintsnk egy kis programot, amelyben bekrnk kt egsz szmot a konzolrl, majd kiszmtjuk sszegket s megjelentjk az eredmnyt a konzolablakban.

    1. Nem kezelt kivtel

    A feladat els megoldst az albbi kdrszlet tartalmazza. Az egyszersg kedvrt az adatok beolvasst megvalst metdust (Beolvas) statikus osztlytagnak vlasztottuk.

    class Program {

    static void Main(string[] args) { int a = Beolvas("z els"); int b = Beolvas(" msodik"); int c = a + b; Console.WriteLine("A kt szm sszege: {0}", c); } static int Beolvas(string Aktulis) { Console.Write("A"+Aktulis+" szm: "); string s = System.Console.ReadLine(); int a = int.Parse(s); return a; }

    }

    Hibazenet a konzolon nem kezelt kivtel esetn:

  • I. Nyelvi Alapok - I.3. Kivtelkezels

    25

    Kicsit eltr eredmnyt kapunk akkor, ha debug mdban indtjuk (F5) alkalmazsunkat. A hibs adatok megadsa utn a kdszerkesztben az rintett utastst srga httrrel kiemelve jelenik meg az Exception Assistant nem kezelt kivtelre figyelmeztet ablaka:

    Itt is kaphatunk rszletes informcit a hibval kapcsolatosan a View Detail feliratra kattintva. Az egyes vltozk rtkeit ellenrizhetjk a fejlesztrendszer Locals s Watch ablakaiban. Mi is trtnt valjban? A fenti kt esetben az s vltozban karakterlncknt trolt adatot a Parse metdus megprblta egsz szmm alaktani, s a sikertelensget egy kivtel esemny elidzsvel jelezte. Emellett egy objektumot is ltrehozott, aminek tpusa s a benne trolt adatok a hiba jellegrl s rszleteirl adnak felvilgostst. Els prblkozsunknl a hiba bekvetkezse egyben az alkalmazs lellst is jelentette.

  • Johanyk Zsolt Csaba: Vizulis programozs

    26

    2. Kivtelek kezelse

    Programunkat gy szeretnnk tovbbfejleszteni, hogy kpes legyen kezelni a hibs felhasznli adatbevitelt a szm(ok) jbli bekrsvel. Ehhez olyan kdra van szksg, ami az alkalmazs lellsa eltt rzkeli a kivtelt, s gondoskodik a megfelel vezrlstadsrl. A C# nyelvben a try-catch-finally szerkezet segtsgvel oldhatjuk meg a feladatot.

    Ez egy try blokkot, egy vagy tbb catch blokkot s nulla vagy egy finally blokkot tartalmaz.

    A try-catch szerkezet:

    A try blokkban helyezzk el azokat az utastsokat, amelyek vgrehajtsa sorn szmthatunk kivtel keletkezsre. Pldnkban a konverzis utasts kerl ide. A catch blokk(ok)ba helyezzk el azokat az utastsokat, amelyekkel a hibra kvnunk reaglni. Pldnkban

    tvesznk egy FormatException tpus kivtel objektumot, aminek feladata a hibhoz kapcsold informcik hordozsa. Most csak a Message tulajdonsgot hasznljuk fel, ami egy rvid lerst tartalmaz a hibrl. Az jbli adatbekrst a Beolvas metdus rekurzv meghvsval oldjuk meg.

    Try-catch blokk:

    static int Beolvas(string Aktulis) {

    Console.WriteLine("A" + Aktulis + " szm: "); string s = System.Console.ReadLine(); int a = 0; try { a = int.Parse(s); } catch(FormatException e){ Console.WriteLine("Hibsan adta meg a szmot!"); Console.WriteLine(e.Message); a = Beolvas(Aktulis); } return a; }

    Lpsenknt vgrehajtva az alkalmazst, s a mr megszokott asd betsort megadva vgigkvethetjk, hogy a Parse meghvsa utn a kivtel hatsra a vezrls a catch blokk fejlcre ugrik, majd sorban vgrehajtdnak az ott szerepl utastsok. rvnyes rtket megadva a Beolvas metdus jbli meghvsakor a Parse sikeres konverzit hajt vgre, a

    vezrls tugorja a catch blokkot, s a metdus visszaadja return-el az a vltoz rtkt.

    Egy vagy tbb catch blokk

    Sok metdus esetben a futs sorn tbbfle hiba is elfordulhat, amelyekre nha teljesen eltren kell reaglni. A hibatpusok elklntst jl szolgljk a kivtel osztlyok. Ezeket tmakrk szerint rendszereztk egy kln gat kialaktva az osztlyhierarchia System nvterben. Az g cscsn az Exception osztly ll, ami kzvetlen leszrmazottja az Object osztlynak. Az albbi brn a teljessg ignye nlkl nhny gyakran alkalmazott kivtelosztlyt lthatunk jelezve hierarchiabeli elhelyezkedsket is.

  • I. Nyelvi Alapok - I.3. Kivtelkezels

    27

    System.Object

    System.Exception

    System.SystemException

    System.ApplicationException

    System.ArgumentException

    System.ArgumentNullException

    System.ArgumentOutOfRangeException

    System.FormatException

    System.IndexOutOfRangeException

    System.IO.IOException

    System.NotImplementedException

    System.ArithmeticException

    System.DivideByZeroException

    System.OverflowException

    System.NullReferenceException

    Az albbi tblzat rviden ismerteti jellegzetes alkalmazsi terletket: System.Exception az alkalmazs vgrehajtsa sorn elfordul

    hibkhoz trstott kivtelek sosztlya

    System.SystemException a System nvtr elre definilt

    kivteltpusainak sosztlya

    System.ArgumentException egy metdus valamely aktulis paramtere

    rvnytelen

    System.ArgumentNullException null referencia nem megengedett tadsa

    System.ArgumentOutOfRangeException az tadott paramter az rvnyes

    tartomnyon kvlre esik

    System.ArithmeticException aritmetikai mveletek s tpuskonverzi

    sorn elll kivtelek sosztlya

    System.DivideByZeroException nullval trtn oszts

    System.OverflowException tlcsordulsi hiba

    System.FormatException a paramter formtuma nem megfelel

    System.IndexOutOfRangeException tmb tlindexelse

    System.IO.IOException fjlkezelssel kapcsolatos kivtelek

    sosztlya

  • Johanyk Zsolt Csaba: Vizulis programozs

    28

    System.NotImplementedException a meghvott metdus nem rendelkezik

    implementcival; pldul a

    fejlesztrendszer a Class Details ablakban

    vizulisan ltrehozott metdusok vzba egy

    ilyen kivtel elidzst helyezi el

    System.NullReferenceException egy vltozn keresztl hivatkozunk egy

    objektum egy tagjra, s kzben a vltoz

    null rtk

    System.ApplicationException a felhasznl ltal definilt kivteltpusainak

    sosztlya

    Egy alkalmazs fejlesztse sorn tisztban kell lennnk azzal, hogy milyen kivteleket idzhetnek el a futtatkrnyezet (Common Language Runtime - CLR) vagy ms forrsbl szrmaz osztlyok/komponensek metdusai. A CLR esetben a fejlesztrendszer sgjban rszletes informcit tallunk minden metdusrl, tovbb a kdszerkesztben a metdus neve fel helyezve az egrmutatt a felbukkan gyorstippben is informcit kapunk a lehetsges kivtelekrl. Br az utbbi megolds sokkal knyelmesebb, de alkalmazhatsga korltozott olyankor, amikor tbb azonos nev metdus is tallhat az osztlyban/struktrban. gy pldul az int (Int32) struktra Parse tagja esetn a gyorstipp a hrom paramteres vltozatot jelenti meg, amihez ngy kivteltpus tartozik. Az ltalunk alkalmazott egyparamteres tpus azonban hrom fajta kivtelt idzhet el. Ezek az ArgumentNullException, FormatException s az OverflowException. Pldaprogramunk futsa kzben az els tpus gyakorlatilag nem fordulhat el, gy a megkvnt biztonsg elrse rdekben a msik kettre kell felksztennk alkalmazsunkat. Egsz szmknt nem rtelmezhet karaktersor esett eddig is kezelni tudta metdusunk, a tovbbiakban a tlcsorduls, azaz az abszolt rtkben tl nagy szm esetvel kell foglalkoznunk. Ez ktflekppen oldhat meg. Vagy mindkt hibatpushoz kln catch blokkot rendelnk vagy egyetlen kzs catch blokkot alkalmazunk. Amennyiben az els utat vlasztjuk, az albb ismertetett kdrszletet kell elhelyeznnk az eredeti catch blokkot kveten a return el.

    catch(OverflowException e){ Console.WriteLine("Hibsan adta meg a szmot!"); Console.WriteLine(e.Message); a = Beolvas(Aktulis); }

    Lpsenknt vgrehajtva a programot nyomon kvethetjk, hogy a szoksos asd-t megadva az els, mg a 2147483648 rtket megadva a msodik catch blokk hajtdik vgre. A program mkdik, azonban ez a megolds csak olyankor elnys, ha a klnbz hibk eltr reakcit ignyelnek. Pldnkban azonban a msodik blokk az elsvel azonos utastsokat tartalmaz, gy inkbb a msodik megoldst, azaz a kzs catch blokkot alkalmazzuk. Tudva, hogy egy s osztlyhoz ltrehozott referencia vltoz kpes trolni brmely leszrmazott osztlybl pldnyostott objektum referencijt, megkeressk az osztlyhierarchiban a legkzelebbi olyan osztlyt, amely mindkt kivteltpusnak se. Esetnkben a SystemException felel meg e kvetelmnynek. Ezrt ezt az osztlyt adjuk meg a kzs catch blokk fejlcben kivteltpusknt.

    catch(SystemException e){

  • I. Nyelvi Alapok - I.3. Kivtelkezels

    29

    Console.WriteLine("Hibsan adta meg a szmot!"); Console.WriteLine(e.Message); a = Beolvas(Aktulis); }

    ltalnos rvnnyel elmondhat, hogy egy try blokkhoz tbb catch blokk is kapcsolhat. Ezek kzl mindig csak egy hajtdik vgre, spedig az, amelyikre elsknt teljesl fellrl lefele haladva az, hogy formlis paramternek tpusa vagy azonos a kivtel objektum tpusval vagy se annak. Amennyiben olyan kivtel esemny kvetkezik be, amelyikre a fenti kt felttel egyike sem teljesl, akkor az els pldhoz hasonlan nem kezeltnek minsl a kivtel. Amennyiben a catch blokkban nincs ugr utasts (pl. kivtel tovbbadsa, j kivtel elidzse, kilps a programbl, stb.), akkor az alkalmazs vgrehajtsa az utols catch blokkot kvet utastssal folytatdik.

    ltalnos catch blokk Az fent bemutatott kzs kivtelkezelnket elkszthetjk paramter nlkli vltozatban is az albbi kdrszletnek megfelelen. Ez a megolds a vezrlstads szempontjbl egyenrtk azzal, mintha Exception tpus paramtert hasznlnnk, teht brmilyen kivtel esetn vgrehajtdik. Az eltrs csak abban mutatkozik, hogy nem kapunk hozzfrst a kivtel objektumhoz, s nem rendelkeznk pontos informcival az okra vonatkozlag.

    catch{ Console.WriteLine("Hibsan adta meg a szmot!"); a = Beolvas(Aktulis); }

    Kivtel tovbbtsa A C# nyelv lehetsget biztost arra, hogy a kivtelt ne csak annak keletkezsi szintjn rzkeljk, hanem a hvsi lnc magasabb szintjein elhelyezked metdusokban is. Ezt a

    kivtel tovbbadsval rhetjk el a throw kulcssz segtsgvel. Demonstrlsknt szolgljon az albb bemutatott metdus, ami tvesz egy Graphics tpus objektumot valamint kt struktrt, amelyek a szn s a befoglal tglalapra vonatkoz informcit hordozzk, majd rajzol egy kifestett tglalapot.

    void Ellipszis(Graphics gr, Color cSzn, Rectangle rTglalap){ SolidBrush sbEcset = new SolidBrush(cSzn); try{ gr.FillEllipse(sbEcset, rTglalap); } catch (NullReferenceException e){ Console.WriteLine("Nincs hova rajzolni!"+e.Message); throw e; } finally{ sbEcset.Dispose(); }

    } A metdusban ltrehozunk egy egyenletes sznnel kifest ecsetet, majd ksrletet tesznk a rajzolsra. Amennyiben az els paramter null rtk, azaz nem rendelkeznk a

    festvszont megtestest Graphics tpus objektummal, akkor

  • Johanyk Zsolt Csaba: Vizulis programozs

    30

    NullReferenceException tpus kivtel keletkezik, amit a szabvnyos kimenetre

    kldtt hibazenettel jelznk, majd a kivtelt tovbbadjuk az Ellipszis metdus hvjnak. A metdus egy finally blokkot is tartalmaz, amelynek magyarzata az X.2.5. szakaszban olvashat. Az Ellipszis metdus kiprblsa rdekben ksztsnk egy grafikus fellet alkalmazst a Windows Application sablon segtsgvel. Az ablakon helyezznk el egy nyomgombot (btRajzol), s ksztsnk hozz egy a kattintsra reagl esemnykezelt btRajzol_Click nven. Ebben hatrozzuk meg a befoglal tglalapot s hvjuk meg az Ellipszis metdust.

    private void btRajzol_Click(object sender, EventArgs e){ Rectangle rTglalap = new Rectangle(0,0,200,100); try{ Ellipszis(this.CreateGraphics(), Color.Azure, rTglalap); } catch{ MessageBox.Show("Nem sikerlt megrajzolni az ellipszist!",

    "Grafikushiba", MessageBoxButtons.OK, MessageBoxIcon.Error);

    } }

    A kivtelkezels kiprblsa rdekben cserljk le az Ellipszis metdus meghvsnak els aktulis paramtert, azaz a this.CreateGraphics() helyett rjunk null-t. jbl

    lefuttatva a programot a nyomgomb esemnykezeljnek catch blokkjban elrt zenetablak jelenik meg. A fejlesztrendszer Output ablakban a Show output from: listban a Debug-ot kivlasztva lthatjuk, hogy a rendszer ltal generlt hibazenetek kztt megjelent az ltalunk definilt Nincs hova rajzolni! sor is.

    A finally blokk hasznlata Elfordulhat, hogy egy vagy tbb utastst, pldul lefoglalt erforrsok felszabadtst, a kivtel bekvetkezstl fggetlenl mindenkppen vgre kell hajtanunk a try-al vizsglt blokk utn. Ez nem okoz klnsebb gondot, ha egyik catch blokk sem tartalmaz olyan ugr utastst, amelynek hatsra az utols catch blokkot kvet kdsort kihagyva valahol mshol folytatdna az alkalmazs futsa. Amennyiben azonban fennll az tugrs veszlye, akkor a vgrehajtst csak gy biztosthatjuk, ha az emltett utastsokat egy finally blokkban helyezzk el.

    Az fentebb bemutatott Ellipszis metdusban ltrehozunk egy SolidBrush tpus ecset objektumot. Hasznlata utn a Dispose metdus meghvsval fel kell szabadtanunk az ltala lefoglalt erforrsokat attl fggetlenl, hogy a rajzols sikeres volt-e vagy sem. A feladatot megold utastst egy finally blokkba helyezzk el. Lpsenknt vgrehajtva az alkalmazst az Ellipszis metdus fentiekben bemutatott hibs paramterezse mellett, lthatjuk, hogy a throw vgrehajtsakor a metdusbl trtn kilps eltt mg vgrehajtdik a Dispose is.

    Tlcsordulsi kivtel Tlcsordulsrl beszlnk akkor, ha egy adatot a szksgesnl kisebb trolkpessg vltozba kvnunk elhelyezni. Konstans rtkek esetn a fejlesztrendszer ezt mr fordtsi

  • I. Nyelvi Alapok - I.3. Kivtelkezels

    31

    idben jelzi, mg vltozknl csak futsi idben derl ki a problma, amennyiben be van kapcsolva a tlcsorduls figyelse. Prbakpp futtassuk le jbl a kt szm bekrst s sszeadst vgz programunkat els szmknt az int-ben trolhat legnagyobb rtket, azaz 2147483647-et s msodik rtkknt 1-et megadva. Az eredmny -2147483648 lesz, ami egyrtelmen utal a tlcsorduls bekvetkeztre, kivtel azonban nem keletkezett. A tlcsorduls figyelst s bekvetkezsekor a kivtel elidzst ktflekppen rhetjk el. A teljes megoldsra vonatkozan bekapcsolja az ellenrzst a fordt /checked+ parancssori kapcsolja, amit a fejlesztrendszerben gy llthatunk be, hogy kivlasztjuk a Project men Projektnv Properties menpontjt, majd az elbukkan prbeszdpanelen a Build flet vlasztjuk, ezt kveten az Advanced gombon kattintunk, s vgl bekapcsoljuk a Check for arithmetic overflow/underflow jellngyzetet. A bellts elvgzse utn jbl prblkozva

    az alkalmazsunk OverflowException kivtellel lell az sszeadsnl. A fordtprogram kapcsolitl fggetlenl egy kifejezsre (X.17.bra) vagy egy utastscsoportra is szablyozhatjuk a tlcsorduls figyelst a checked s unchecked kulcsszavak alkalmazsval.

    Tlcsorduls figyelse egy kifejezs kirtkelse sorn:

    int c = checked (a + b);

    Utastscsoportra kiterjed tlcsorduls-figyels:

    checked{ a = Beolvas("z els"); b = Beolvas(" msodik"); c = a + b; d = a * b;

    }

    3. Kivtelek elidzse

    Az eddigiekben az ltalunk meghvott metdusokban elidzett kivtelek kezelsvel s tovbbadsval foglalkoztunk. Nzzk most meg, hogyan kszthetnk mi magunk is olyan kdrszletet, ami egy kivtel segtsgvel jelzi a hv szmra egy hiba bekvetkezst. A feladat legyen egy tlagszmt metdus elksztse, amely egy double tpus elemekbl ll tmbre vonatkoz referencit vesz t, s visszaadja az abban trolt adatok tlagt. A lehetsges hibk jelzsre a kvetkez kivtel osztlyokat hasznljuk fel:

    ArgumentNullException a metdust null referencival hvtk meg, azaz nem ltezik a tmb;

    ArgumentException a tmb elemeinek szma nulla vagy a tmb valamely eleme rvnytelen (nem szm vagy vgtelen rtk);

    ArithmeticException a szmok sszege meghaladja a double tpusban maximlisan trolhat rtket (double.MaxValue).

    A kivtelek elidzse a throw kulcssz segtsgvel trtnik, amit egy kivtel objektum ltrehozsa kvet. A kivtelosztly konstruktornak paramterknt tadtunk egy rvid hibazenetet.

    static double tlagSzmt(double[] Tmb) {

    if (Tmb == null)

  • Johanyk Zsolt Csaba: Vizulis programozs

    32

    throw new ArgumentNullException("A tmb nem ltezik!"); int Mret=Tmb.Length; if (Mret == 0)

    throw new ArgumentException("A tmb nem tartalmaz elemeket!");

    double tlag = 0; for (int i = 0; i < Mret; i++) { if (double.IsNaN(Tmb[i]) || double.IsInfinity(Tmb[i]))

    throw new ArgumentException("A tmb " + i.ToString() +". eleme rvnytelen rtket tartalmaz!");

    tlag = tlag + Tmb[i]; if (double.IsInfinity(tlag))

    throw new ArithmeticException("A tmb elemeinek sszege" +" tl nagy rtk!");

    } tlag /= Mret; return tlag;

    }

    4. Jtancsok

    Az albbiakban sszefoglalunk nhny ajnlst a kivtelek alkalmazsval s kezelsvel kapcsolatosan.

    A kivtelek elidzse s kezelse jelents erforrs ignnyel jr s lasstja az alkalmazs vgrehajtst az jabb osztlyok betltse s a veremkezelsi feladatok kvetkeztben. Lehetleg cskkentsk minimlis mrtkre az ltalunk elidzett kivtelek szmt.

    Csak olyan kivteleket dolgozzunk fel, amelyek esetn ismert az ket elidz hiba kezelsi mdja. A tbbi kivtel feldolgozst engedjk t magasabb hvsi szinten elhelyezett kivtelkezelknek.

    Gondoskodjunk mindig azon nem hasznlt erforrsok felszabadtsrl, amelyek nem tartoznak az automatikus szemtgyjt mechanizmus hatlya al.

    Kerljk jabb kivtel elidzst a finally blokkban, ugyanis ha egy kivtelt nem fogunk el egyetlen catch blokkal sem, akkor vgrehajtdnak a finally blokkban elhelyezett utastsok, s az jabb kivtel elidzse kvetkeztben az eredeti elvsz.

    Amennyiben egy programszakaszon bell tbb egyms utni utastsnl is elkpzelhet

    kivtel keletkezse, gy ne ksztsnk ezekhez kln try-catch-finally szerkezeteket, mert nehezen olvashatv tennk a kdot. Helyezzk el inkbb az rintett utastsokat egyetlen try blokkban, s ksztsnk minden kivtel tpushoz catch blokkot.

    Tbb catch blokkot tartalmaz kivtelkezelsnl az egyes blokkokat az osztlyhierarchia figyelembe vtelvel gy kell sorba rendezni, hogy fentrl lefele haladva a specifikusabb osztlyok megelzzk az ltalnosabbakat.

    5. Ellenrz krdsek

    Mikor minsl nem kezeltnek egy kivtel? Ellenrizni tudjuk-e a fejlesztrendszer segtsgvel, hogy egy kivtel bekvetkezsekor az rvnyessgi krkn bell lev vltozk milyen rtkkel rendelkeznek?

  • I. Nyelvi Alapok - I.4. Esemnykezels Lottjtk

    33

    Hogyan tudjuk kiderteni, hogy a .NET osztlyhierarchia egy metdusa milyen kivteleket idzhet el? A kivtel objektum mely tagjbl olvashatjuk ki a hiba rvid szveges lerst? Mikor clszer kzs catch blokkot kszteni tbb kivtel tpushoz? Ha tbb catch blokkot ksztnk egy kivtelkezelshez, akkor brmilyen sorrendben elhelyezhetjk ezeket? Mire szolgl a new kulcssz a kivtelt elidz utastsban? Mindig keletkezik kivtel tlcsordulsi hiba esetn? Megoldhat-e, hogy egy kivtel feldolgozsa ne abban a metdusban trtnjk, ahol azt elfogtuk? Ktelez-e a finally blokk hasznlata?

    I.4. Esemnykezels Lottjtk

    Clok: Esemnyek, esemnykezels htternek, fogalmainak rvid ttekintse. Esemnykezelst megvalst nem grafikus fellet pldaprogram ksztse. Objektum-, statikus- s nem statikus metdusok feliratkoztatsa esemnyre.

    1. Esemnyek, kzztev-feliratkoz modell

    Az asztali alkalmazsok (DesktopApplications) fejlesztsvel kapcsolatos irodalomban gyakran tallkozhatunk az esemnyek s az esemnyvezrelt alkalmazsok/programozs fogalmval. Mindenkinek van valamilyen elkpzelse az esemny sz jelentsrl a mindennapi letben, de vajon mit jelent ez a szoftverfejleszts vilgban? Itt esemny lehet pldul a kattints egy nyomgombon, menponton vagy valami ms vezrl elemen, de ugyangy esemnyt idz el az, ha vltoztatunk valamit az llomnyrendszerben, vagy a felhasznl megprbl bezrni egy fut alkalmazst. Emellett az esemnyek nemcsak kls behatsokhoz kapcsoldhatnak, pldul bellthatunk egy idztt (Timer), ami meghatrozott idkznknt jelez, azaz Tick esemnyt idz el, de akr mi magunk is rhatunk esemnyeket elllt kdot. Szoftverfejlesztsi szempontbl az esemnyt mindig egy objektum idzi el (pl. a kattintsos esetben a nyomgomb, menpont, vagy ms vezrl; az llomnyrendszer esetben egy specilis FileSystemWatcher tpus objektum; az idztsnl egyTimer objektum). Az esemnyt elidz objektumot szerepkre alapjn kzztevnek (Publisher) nevezzk. Az esemnyek nem nclan keletkeznek, mindig kapcsoldik hozzjuk valamilyen feladat, amit vgre kell hajtani a bekvetkezst kveten. Ezen feladat vgrehajtst esemnykezelsnek nevezzk, s a szksges utastsokat egy metdus, az n. esemnykezel segtsgvel hajtjuk vgre. Az esemnykezel megrsa mellett arrl is gondoskodnunk kell, hogy megteremtsk a kapcsolatot kzte s az esemnyt elidz metdus kztt, azaz biztostsuk azt, hogy az esemny bekvetkezsekor vgrehajtdjon a metdus. A kapcsolat ltrehozsa a gyakorlatban azt jelenti, hogy a kzztev objektumban beregisztrljuk metdusunkat. A regisztrcis lpst feliratkozsnak, mg a metdus szerepkrt feliratkoznak nevezzk. A fentiekben megismert kt szerepkrbl szrmazik az esemnykezelsi modell elnevezse, a kzztev-feliratkoz modell is. A ksbbiekben ltni fogjuk, hogy ez a modell egy rugalmas s

  • Johanyk Zsolt Csaba: Vizulis programozs

    34

    knyelmes eszkzt biztost a szmunkra. gy egy esemnyre tbb metdus is feliratkozhat, valamint a metdus lehet az esemnyt elidz objektum osztlynak tagja, egy msik objektum tagja vagy egy msik osztly statikus metdusa. Az esemny elidzsre tnylegesen csak akkor kerl sor, ha van legalbb egy feliratkoz.

    2. Feladat s fbb lpsek

    A feladat egy tslott jtkot szimull alkalmazs fejlesztse, ami megadott szm sorsolst hajt vgre. Kszteni kell jtkos objektumokat, amelyek megadott szmokkal jtszanak, s a jtk sorn kvetni kell a tallatok szmt. A megadott szm sorsolst kveten a jtk vget r, s errl rtesteni kell a jtkosokat. Az alkalmazs fejlesztse sorn az albbi fbb lpsek szksgesek.

    A sorsolsokat kveten a jtkosok szmra tadott paramterek megtervezse s a kapcsold implementcis lpsek.

    Az esemny s esemnykezel tpusok deklarlsa.

    A lotthzst megvalst osztly (kzztev) elksztse.

    A jtkosokat modellez osztly (feliratkoz) elksztse.

    Objektumok ltrehozsa s a Main metdus elksztse. A feladatot egy konzolalkalmazsban oldjuk meg. A projekt s a megolds neve legyen EsemenyKezeles. A tovbbiakban az llomnynevek mindig legyenek kezet nlkliek, az azonostk mindig legyenek kezetesek. Ennek rdekben a New Project ablakban kezet nlkl adjuk meg a projekt nevet.

    Ksztsnk egy osztlydiagramot is a projekthez. Ehhez a Solution Explorerben kattintsunk jobb egrgombbal projekt nevre, s a gyorsmenben vlasszuk ki a View/Class Diagram menpontot. Vlasszuk ki a teljes rszletezettsg megjelentst az eszkztron a Display Full Signature ikonra kattintva.

  • I. Nyelvi Alapok - I.4. Esemnykezels Lottjtk

    35

    3. Paramterek tadsa

    A sorsols vgrehajtst jelz esemny bekvetkezsekor t kell adni paramterknt az esemnykezel metdusnak a hzs sorszmt (egsz szm) s a kihzott szmokat (egsz rtkeket tartalmaz tmb). A paramtereket nem adhatjuk t kzvetlenl, csak egy objektumba csomagolva, amely objektum az EventArgs osztly leszrmazottja kell legyen.

    Ennek rdekben definilunk egy ParamterLista nev osztlyt, ami az EventArgs leszrmazottja lesz. Az osztlydiagram fehr terletn kattintsunk jobb egrgombbal, majd a gyorsmenben vlasszuk az Add/Class menpontot. Az osztly neve legyen ParamterLista(az llomnynv ne legyen kezetes!). A szrmaztatst nem lehet vizulisan megadni, ezrt ttrnk kdnzetbe (jobb egrgomb az osztlynven, majd ViewCode), s begpeljk a megfelel kdot.

    public class Paramterlista : EventArgs { }

    Ezt kveten visszatrnk az osztlydiagramba, kijelljk a ParamterLista osztlyt, majd ltrehozzuk a szksges adattagokat, tulajdonsgokat s a konstruktort az brnak megfelelen a ClassDetails ablakban.

  • Johanyk Zsolt Csaba: Vizulis programozs

    36

    A tulajdonsgok szerepe az lesz, hogy lekrdezhetv teszik a httrben lev korltozott elrhetsg kt adattagot. Az adatagoknak csak egyszer (inicializlskor az objektum ltrehozsakor) kell rtket adni, ezrt set elr nem szksges, a kezdrtk megadsa a konstruktorban trtnik. A get elrk s a konstruktor kdjnak megrsa utn a ParamterLista osztly a kvetkez lesz:

    /// ///Egy egsz rtk s egsz szmokbl ll tmb paramterknt ///trtn tadsra szolgl. /// public class Paramterlista : EventArgs{

    /// /// A hzs sorszma /// private int HSz; /// /// A kihzott szmokat trol tmb /// private int[] Sz; /// /// Inicializlja az adattagokat /// /// A hzs sorszma /// A kihzott szmok public void ParamterLista(int HzsSzm, int[] Szmok){ HSz = HzsSzm; Sz = Szmok; }

    /// /// Tulajdonsg a hzsszm lekrdezsre /// public int HzsSzm{ get { return HSz; } } /// /// Tulajdonsg a kihzott szmok lekrdezsre

  • I. Nyelvi Alapok - I.4. Esemnykezels Lottjtk

    37

    /// public int[] Szmok{ get { return Sz; } } }

    4. Esemnyek s esemnykezel tpusok

    A jtkhoz kt esemnyfajta szksges:

    Minden lotthzst egy LottHzs esemny jelez.

    A jtk vgt Vge esemny jelzi. Az esemnykezel metdusok formlis paramterlistja alapveten ktfle lehet. Mindkt esetben az els (vagy egyetlen) paramter tpusa object kell legyen, s ebben a paramterben meg kell megkapnia az esemnykezelnek az esemnyt elidz objektum referencijt. Amennyiben nem kell kln paramtereket tadnunk az esemnykezelnek, akkor az esemnykezelnk egyparamteres lesz, s ha t kell adnunk paramtert, akkor pedig ktparamteres lesz. A ktparamteres esetben a msodik paramternek az EvenArgs osztly leszrmazottjnak kell lennie. A LottHzs esemnyhez kapcsoldan kell tadnunk a lotthzsra vonatkoz adatokat (sorszm s kihzott szmok). Ezrt itt az esemnykezel ktparamteres less. Az els paramter az esemnyt elidz objektum referencija, mg a msodik egy ParamterLista tpus objektum referencija. Az alkalmazott esemnykezel metdus tpusok kivlasztsa utn metdusreferencia tpusokat deklarlunk alkalmazsunk nvterben a ltez osztlyokon kvl. A metdusreferencia tpust j osztlyhoz hasonlan hozunk ltre, csak most a Delegate menpontot vlasztjuk a gyorsmenben. Neve legyen mrLottHzs. lltsuk be a paramterek nevt s tpust az bra szerint a ClassDetails ablak segtsgvel.

    A Vge esemnynl nem kell kln paramtereket tadni, ezrt az esemnykezel itt egyparamteres lesz. Az elzekhez hasonlan hozzunk ltre egy Delegate komponenst az osztlydiagram fehr terletn, majd definiljuk a metdusreferencia tpust az brnak megfelelen.

  • Johanyk Zsolt Csaba: Vizulis programozs

    38

    5. A lotthzst megvalst osztly (kzztev)

    A lotthzst megvalst osztly ltrehozsa rdekben adjunk hozz egy Class komponenst az osztlydiagram fehr terlethez. Nevezzk el Kzztevnek. Elsknt ksztsk el a trolni kvnt adatokhoz szksges adattagokat.

    Feladatunk megoldshoz trolnunk kell a lotthzsok megengedett szmt (MegengedettHzsSzm) s az aktulis lotthzs sorszmt (HzsSzm). Szksgnk lesz egy vletlenszm genertor objektumra (Vletlen) s egy idzt Timer

    objektumra (Idzt), ugyanis a sorsolsokat meghatrozott idkznknt hajtjuk vgre. A kt esemny elidzshez kt osztlytagra lesz szksgnk, amelyek ltalnos elnevezse event (esemny). A kt esemny (LottHzs s Vge) tpust az elzekben deklarlt metdusreferencik hatrozzk meg. Az osztly kt metdussal fog rendelkezni. A konstruktor biztostja az adattagok inicializlst s az idzts belltst. A msik metdus (IdztsEsemnyKezel) az idzt Tick esemnye ltal aktivizlva vletlenszeren ellltja a lottszmokat.

    Az idztshez alkalmazott DispatcherTimer komponens a System.Windows.Threading nvtrben tallhat. Hasznlathoz azonban nem elegend a nvtr megadsa, mivel az t tartalmaz szerelvny (DLL) nem rsze a konzolalkalmazsokhoz automatikusan sszelltott szerelvny csoportnak, ezrt fel kell vennnk azt a referencik kz. Ehhez a Solution Explorerben kattintsunk a References

  • I. Nyelvi Alapok - I.4. Esemnykezels Lottjtk

    39

    mappn jobb egrgombbal, majd vlasszuk ki az Add Reference menpontot. Kis vrakozs utn megjelenik az Add Reference prbeszdablak. Itt kivlasztjuk az Assemblies menpontot a bal oldalon, s azon bell a Framework-t, majd megkeressk a listban a WindowsBase sort, bejelljk, s kattintunk az OK gombon.

    A referencia kiegsztst kveten ksztsk el a ClassDetails ablak segtsgvel az albbi

    brnak megfelelen az osztlyt az Idzt_Tick esemnykezel kivtelvel. Ezen esemnykezel vzt a Visual Studioval fogjuk generltatni a konstruktor megrsa sorn.

    A konstruktor kdja a kvetkez:

    /// /// Konstruktor. "Feliratkoztatja" Az IdztsEsemnykezel /// fggvnyt a Timer objektum Tick(rats) esemnyre. Indtja az /// idztt. ///

  • Johanyk Zsolt Csaba: Vizulis programozs

    40

    /// A lotthzsok megengedett /// szma. public Kzztev(int MegengedettHzsSzm) {

    this.MegengedettHzsSzm = MegengedettHzsSzm; //Vletlenszmokat generl objektum neve Vletlen = new Random(); //Ltrehozzuk az idzt objektumot Idzt = new DispatcherTimer(); //Az idztst 1 msodpercre lltjuk Idzt.Interval = new TimeSpan(0, 0, 1); //Esemnykezel rendelse az idztshez Idzt.Tick += Idzt_tick; //Idzt indtsa Idzt.Start();

    } A konstruktor megrsa sorn, amikor a Idzt.Tick += rszhez rnk, akkor a Visual Studio felknlja, hogy a TAB billenty ktszeri megnyomsa esetn automatikusan generlja a kapcsold esemnykezel metdus vzt. A Kzztev tpus objektum ltrehozst kveten elre belltott idkznknt meghvdik az Idzt esemnykezelje, s ellltja a lottszmokat. A feladatot megvalst kd a kvetkez:

    /// /// Esemnykezel fggvny a timer objektum idzts esemnyhez. Ha /// mg nem rtk el a maximlis hzsszmot, akkor minden /// "ratskor" lotthzst szimull. A kisorolt t szmot a /// LottHzs esemny paramterknt teszi kzz. Ha elrjk a /// maximlis hzsszmot, akkor Vge esemnyt generl. Ha elrtk a /// maximlis hzsszmot, akkor lelltja a Timer objektumot /// (idztt). /// /// Az esemnyt elidz Timer /// objektum. /// A Paramtereket tartalmaz /// objektum. public void Idzt_tick(object sender, EventArgs paramterek){ //Aktulis hzsszm meghatrozsa. HzsSzm++;

    //Ha a hzsszm meghaladta a megengedett rtket, akkor //vge a jtknak

    if( HzsSzm > MegengedettHzsSzm ){ //Lelltjuk az idztt. Idzt.Stop();

    //Ha van feliratkoz a Vge esemnyre, akkor elidzzk az //esemnyt.

    if (Vge != null) Vge(this); } else{

  • I. Nyelvi Alapok - I.4. Esemnykezels Lottjtk

    41

    //Vgrehajtjuk a sorsolst int[] Szmok = new int[5]; //Beletesszk a 90 szmot egy listba List sszes = new List(); for (int i = 1; i

  • Johanyk Zsolt Csaba: Vizulis programozs

    42

    A kt esemnykezel metdus vzt az elzekben ltottaknak megfelelen automatikusan

    generltassuk a Visual Studioval. A LottHzs esemnyt a Kzztev_LottHzs metdus fogja kezelni. Feladata a tallatok szmnak meghatrozsa s az elrt tallatszm kirsa a konzolra.

    /// /// Esemnykezel a lotthzs esemnyhez. Meghatrozza a tallatok /// szmt. Kirja konzolra az eredmnyt. /// /// Az esemnyt elidz objektum. /// Kisorsolt szmok. private void Kzztev_LottHzs(object sender, Paramterlista pl){

    int Tallatok = 0; //Meghatrozzuk a tallatok szmt. for (int i = 0; i < 5 && Tallatok < 5; i++)

    for (int j = 0; j < 5 && Tallatok < 5; j++) if (pl.Szmok[i] == Szmok[j])

    Tallatok++; //Eredmny kirsa a konzolra. Console.WriteLine(pl.HzsSzm + ". " + Nv + " " + Felirat[Tallatok]);

    } A Vge esemnyt a Kzztev_Vge metdus fogja kezelni. Feladata csupn annyi, hogy

    a Vge esemny bekvetkezsekor kirjon egy zenetet a konzolra.

    /// /// Esemnykezel a lotthzs vgt jelz esemnyhez. Kirja a /// konzolra, a vge esemnyt. /// private void Kzztev_Vge(string sender){

    Console.WriteLine(Nv + " befejezte a jtkot!"); }

    A konstruktorban definiljuk az egyes tallatszmokhoz kapcsold zeneteket, s ugyancsak itt iratkoztatjuk fel a kt esemnykezelt a megfelel esemnyekre. Ehhez a konstruktornak meg kell kapnia a Kzztev tpus objektum referencijt. Emellett mg tveszi a jtkos nevt s kedvenc szmait is. ///

  • I. Nyelvi Alapok - I.4. Esemnykezels Lottjtk

    43

    /// Konstruktor. "Feliratkoztatja" a kt esemnykezel metdust a /// LottHzs s a Vge esemnyre. /// /// A kzztev objektum. /// A jtkos neve. /// A megadott szmok. public Feliratkoz(Kzztev Kzztev, string Nv, int[] Szmok) {

    this.Nv = Nv; this.Szmok = Szmok; //Esemnykezel metdusok feliratkoztatsa.

    Kzztev.LottHzs += new mrLottHzs(Kzztev_LottHzs); Kzztev.Vge += new mrVge(Kzztev_Vge);

    //Az eredmnyekhez kapcsold feliratok definilsa Felirat = new string[6]; Felirat[0] = "Sajnos nem volt tallata!"; Felirat[1] = "Egy tallata volt!"; Felirat[2] = "Kett tallata volt!"; Felirat[3] = "Hrom tallata volt!"; Felirat[4] = "Ngy tallata volt!"; Felirat[5] = "t tallata volt!"; }

    7. A Program osztly s a Main metdus

    Konzol alkalmazsunk automatikusan kapott osztlya aProgram.Feladata az lesz, hogy mkdsbe hozza programunkat, itt hozzuk ltre az egyes objektumokat s indtjuk be a lott jtkot. Mivel a konzolalkalmazsok alapbl nem rendelkeznek esemnykezelssel, ezrt egy

    ciklust ptnk majd a Main metdusba a feladat megoldsra.

    A lellst gy oldjuk meg, hogy a ciklusbl trtn kilpst egy logikai adattag (Kilp) rtkhez ktjk, aminek kiindul rtke hamis, s ksztnk egy metdust (Kt_Vge), amit feliratkoztatunk a Vge esemnyre. Ez az esemnykezel metdus meghvsakor tlltja

    igazra a logikai vltoz rtkt. Mivel a Program osztlybl nem kszl objektum, ezrt gy az adattag, mint az esemnykezel metdus statikus kell legyen. Az elzekhez hasonlan a Kt_Vge metdus vzt generltassuk le automatikusan a Visual Studioval. Az adattagot ksztsk el grafikus eszkzkkel, majd gpeljk be a mg szksges kdrszleteket. Az osztly teljes kdja az albbi:

    class Program{ ///

    /// Kilphetnk e programbl?

  • Johanyk Zsolt Csaba: Vizulis programozs

    44

    /// static bool Kilp = false; /// /// Itt kezddik a program vgrehajtsa /// static void Main(string[] args){

    //Ltrehozzuk a kzztev ( lotthzst szimull) //objektumot. 5 Lotthzst engedlyeznk.

    Kzztev Kt = new Kzztev(5); //Definilunk hrom jtkost

    Feliratkoz J1 = new Feliratkoz(Kt, "Sheldon Cooper ", new int[] { 1, 2, 3, 4, 5 }); Feliratkoz J2 = new Feliratkoz(Kt, "Jon Snow ", new int[] { 12, 13, 14, 15, 16 }); Feliratkoz J3 = new Feliratkoz(Kt, "The Imp", new int[] { 33, 34, 35, 36, 36 });

    //Feliratkoztatjuk esemnykezelnket a Vge esemnyre. Kt.Vge += Kt_Vge;

    //Az esemnykezel mechanizmus mkdtetse a lotthzs //vge esemnyig.

    while (!Kilp){ Application.DoEvents(); } Console.ReadLine(); } /// /// Esemnykezel a lotthzs vgt jelz esemnyhez. /// /// Az esemnyt elidz objektum. static void Kt_Vge(object sender) { Kilp = true; } } Az Application osztly a System.Windows.Forms nvtrben tallhat, ezrt hasznlata rdekben egsztsk ki a using csoportot a Program.cs elejn egy using System.Windows.Forms; utastssal. Ezutn a felhasznlt szerelvnyek listjba (References) vegyk fel a

    System.Windows.Forms szerelvnyt.

  • I. Nyelvi Alapok - I.4. Esemnykezels Lottjtk

    45

    Programkdunk tlthatsgt azzal is nvelhetjk, hogy eltvoltjuk minden forrsllomny elejrl a felesleges using utastsokat. Ezt a legegyszerbben gy tehetjk meg, hogy a kdszerkesztben egyms utn megnyitunk minden C# forrsllomnyt, s a jobb egrgomb kattintsra eljv gyorsmenben az Organize Usings alment, majd azon bell a Remove Unnecessary Usings menpontot vlasztjuk.

    Futtassuk le a programot. A konzolon az albbihoz hasonl eredmny jelenik meg:

  • Johanyk Zsolt Csaba: Vizulis programozs

    46

    8. Tovbbi feladatok

    rjuk t gy a programot, hogy

    a kihzott szmok jelenjenek meg a konzolon,

    a kihzott szmok legyenek nvekv sorba rendezve,

    minden jtkos esetn az eltallt szmok jelenjenek meg a konzolon.

  • I. Nyelvi Alapok - I.5. Sorosts (szrializci) s helyrellts

    47

    I.5. Sorosts (szrializci) s helyrellts

    Cl: a memriban trolt adatok egyszer lemezre mentse s visszatltse. A sorosts sorn ltrehozunk egy llomnyt s egy sorostst kezel objektumot. Ez gondoskodik arrl, hogy az ltalunk kivlasztott objektumban trolt adatok az llomnyba kerljenek sorban egyms utn. Lncolt lista s krkrs hivatkozsok kezelsre is kpes. A helyrellts sorn megnyitjuk a korbban lementett adatokat tartalmaz llomnyt, s ltrehozunk egy sorostst kezel objektumot. Ez gondoskodik a lementett adatok visszatltsrl. Ha a ments ta megvltoztattuk az adatok tpust megad osztlyt, akkor a visszatlts nem lehetsges. Megoldsok:

    Binris

    SOAP-XML

    XML

    1. Binris sorosts s helyrellts

    Szksges nvterek using System.IO; using System.Collection; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary;

    Attribtumok Sorostsra kijells osztly neve eltt:

    [Serializable] Sorostani nem kvnt rszek (adattagok, tulajdonsgok) eltt:

    [NonSerialized]

    Ments Stream st=File.Create("fjlnv"); BinaryFormatter bf=new BinaryFormatter(); bf.Serialize(st,objektum); //ezt az objektumot akarjuk sorostani st.Close();

    Betlts Stream st=File.OpenRead("fjlnv"); BinaryFormatter bf=new BinaryFormatter(); Osztly_Nv objektum=(Osztly_Nv)bf.Deserialize(st); st.Close();

  • Johanyk Zsolt Csaba: Vizulis programozs

    48

    2. SOAP-XML sorosts s helyrellts

    Szksges nvterek using System.IO; using System.Collections; using System.Runtime.Serialization;

    A Soap-ot fel kell venni a hivatkozsok kz. A Solution Explorerben jobb egrgombbal kattintunk a References-en, Add Reference..., Framework fl, System.Runtime.Serialization.Formatters.Soap kivlasztsa, majd kattints az OK gombon.

    using System.Runtime.Serialization.Formatters.Soap;

    Attribtumok Sorostsra kijells osztly neve eltt:

    [Serializable] Sorostani nem kvnt rszek (adattagok, tulajdonsgok) eltt:

    [NonSerialized]

    Ments Stream st=File.Create("fjlnv"); SoapFormatter bf=new SoapFormatter(); bf.Serialize(st,objektum);

  • I. Nyelvi Alapok - I.5. Sorosts (szrializci) s helyrellts

    49

    //ezt az objektumot akarjuk sorostani st.Close();

    Betlts Stream st=File.OpenRead("fjlnv"); SoapFormatter bf=new SoapFormatter(); Osztly_Nv objektum=(Osztly_Nv)bf.Deserialize(st); st.Close();

    3. XML sorosts s helyrellts

    Nem tudja lementeni a korltozott hozzfrs tagokat s a kt- vagy tbbdimenzis tmbket pl. string tmbt vagy ArrayList-et. Csak set elrvel is rendelkez tulajdonsgot ment le.

    Szksges nvtr using System.Xml.Serialization;

    Attribtum Ha valamely adattagok vagy tulajdonsgot nem akarunk sorostani, akkor a defincija el rjuk:

    [XmlIgnore]

    Ments Stream st=File.Create("fjlnv.xml"); XmlSerializer xs=new XmlSerializer(typeof(Osztly_Nv)); xs.Serialize(st,objektum); // Az objektum tpusa Osztly_Nv st.Close();

    Betlts Stream st=File.OpenRead("fjlnv.xml"); XmlSerializer xs=new XmlSerializer(typeof(Osztly_Nv)); objektum=(Osztly_Nv)xs.Deserialize(st); // Az objektum tpusa Osztly_Nv st.Close();

    4. Plda

    Ksztsnk egy alkalmazst a klnbz sorostsi s helyrelltsi mdok bemutatsra. Az alkalmazs tpusa (Templates) legyen Windows Application, a neve: Sorositas. A formot nevezzk t frmSorositas-ra (Name=frmSorositas, Text=Sorosts bemutatsa), az t tartalmaz llomnyt frmSorositas.cs-re.

    Mintaosztly Ksztsnk egy mintaosztlyt. Az ebbl kszlt objektumokat fogjuk lementeni s visszatlteni. Project men, Add Class , name: Szemely.cs, Add.

  • Johanyk Zsolt Csaba: Vizulis programozs

    50

    Az XML tpus sorostshoz helyezzk el a Szemly osztlyt tartalmaz kdllomny elejn az albbi kt sort:

    using System.Xml.Serialization; using System.Xml;

    Az osztly defincijt az albbiak szerint ksztsk el. /// /// A sorosts bemutatshoz ksztett mintaosztly /// /// Az albbi attribtum jelzi, hogy az osztlyt binrisan s SOAP-/// XML sorostssal menthet [Serializable] public class Szemely{ //Ezt a tulajdonsgot nem menti le az XML sorosts a hozzfrs //korltozs miatt

    private string Nv; public string EHA; public int Jegy;

    //Ha az albbi sor nincs megjegyzsben, akkor a tulajdonsgot //nem menti le az XML sorosts

    //[XmlIgnore] public string Teljes{ get{ return Nv + "-" + EHA + "-" + Jegy.ToString(); } set{ ; } }

  • I. Nyelvi Alapok - I.5. Sorosts (szrializci) s helyrellts

    51

    //Paramter nlkli konsktruktor, meghvja a hromparamteres //konstruktort

    public Szemely() : this("", "", 0) { } //Hromparamteres konstruktor

    public Szemely(string Nv, string EHA, int Jegy){ this.Nv = Nv; this.EHA = EHA; this.Jegy = Jegy; } }

    Fellet kialaktsa Nyissuk meg a frmSorosts-t tervezsi nzetben, s helyezzk el rajta az brnak megfelelen az albbi komponenseket:

    Cmke (Label), Text=Eredeti

    Cmke (Label), Text=Betlttt

    Listaablak (ListBox), Name=lbEredeti

    Listaablak (ListBox), Name=lbBetlttt

    Csoportablak (GroupBox), Text=Sorosts tpusa

    Csoportablak (GroupBox), Text=Ments, ezt az els csoportablakra helyezzk el

    Csoportablak (GroupBox), Text=Betlts, ezt az els csoportablakra helyezzk el

    Vlasztgomb (RadioButton), Name=rbBinrisMent, Text=Binris

    Vlasztgomb (RadioButton), Name=rbSOAP_XMLMent, Text=SOAP-XML

    Vlasztgomb (RadioButton), Name=rbXMLMent, Text=XML

    Vlasztgomb (RadioButton), Name=rbBinrisBetlt, Text=Binris

    Vlasztgomb (RadioButton), Name=rbSOAP_XMLBetlt, Text=SOAP-XML

    Vlasztgomb (RadioButton), Name=rbXMLBetlt, Text=XML

  • Johanyk Zsolt Csaba: Vizulis programozs

    52

    Nyomgomb (Button), Name=btMents, Text=Ments

    Nyomgomb (Button), Name=btBetlts, Text=Betlts

    Nyomgomb (Button), Name=btKilps, Text=Kilps

    llomnymentsi prbeszdablak (SaveFileDialog), Name=sfdMents, Title=Ments, InitialDirectory=.

    llomnymegnyitsi prbeszdablak (OpenFileDialog), Name=ofdBetlts, Title=Betlts, InitialDirectory=.

    Szksges nvterek Az frmSorosts kdjban a fejlesztrendszer ltal generlt nvtrhivatkozsok mellett az albbi nvterekre lesz szksg:

    using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.IO; using System.Runtime.Serialization.Formatters.Soap; using System.Xml.Serialization; using System.Xml; using System.Collections;

    A 2. pontban ismertetett mdon vegyk fel a hivatkozsok kz a Soap-ot.

    A feladatot megvalst kd Definiljunk egy felsorols tpust a sorosts tpusok beazonostsra. Ezt a Sorositas nvtren bell, de az osztlydefincikon kvl kell megtennnk.

    public enum SorostsTpus { Binris, SOAP_XML, XML};

    A program mkdshez az albbi adattagok definilsa szksges a frmSorosts osztlyon bell. /// /// Az ablak mentsekor definilt objektumok trolsra szolgl. /// public ArrayList alEredetiAdatok; /// /// Betlttt objektumok trolsra szolgl. /// public ArrayList alBetltttAdatok; /// /// Ments tpusa. /// public SorostsTpus stMentsTpus; /// /// Betlts tpusa. /// public SorostsTpus stBetltsTpus;

    A frmSorosts konstruktorban helyezzk el az albbi kezdrtkadsokat.

    //Sajt inicializls //Kezdeti s betlttt adatok trolsra szolgl objektumok //definilsa alEredetiAdatok = new ArrayList();

  • I. Nyelvi Alapok - I.5. Sorosts (szrializci) s helyrellts

    53

    alBetltttAdatok = new ArrayList(); //Kezdadatok alEredetiAdatok.Add(new Szemely("Kiss Ibolya", "AAA.BBB", 5)); alEredetiAdatok.Add(new Szemely("Nagy Bendegz", "ABC.BBB", 4)); alEredetiAdatok.Add(new Szemely("Nhai Artr", "ACA.BBB", 5)); //Feltlti az els paramterknt megadott listaablakot a msodik //paramterknt megadott ArrayList adataival. Feltlt(lbEredeti, alEredetiAdatok); rbBinarisMent.Checked = true; rbBinarisBetolt.Checked = true;

    A Feltlt metdust meghv utasts kk hullmos vonallal jelenik meg, mivel ilyen nev metdust mg nem definiltunk. A metdushvs neve alatt megjelen jelen kattintva a fejlesztrendszer felknlja a metdus vznak generlst.

    A kapott kd az albbi:

    private void Feltlt(ListBox lbEredeti, ArrayList alEredetiAdatok){ throw new NotImplementedException();

    }

    rjuk meg a Feltlt metdust az frmSorosts osztly defincijban az albbiak szerint:

    /// /// Feltlti az els paramterknt megadott listaablakot a msodik /// paramterknt megadott ArrayList adataival /// /// A feltlteni kvnt listaablak /// A Szemly tpus elemeket tartalmaz /// ArrayList private void Feltlt(ListBox lbEredeti, ArrayList alLista){ for(int i =0; i < alLista.Count; i++){ Szemely sz = (Szemely)(alLista[i]); lbEredeti.Items.Add(sz.Teljes);

    } } Ksztsk el a Kilps gomb esemnykezeljnek (Click esemny) defincijt.

    /// /// Kilps az alkalmazsbl /// private void btKilepes_Click(object sender, EventArgs e){

    Application.Exit(); } Ksztsk el a Mentstpus kivlasztsakor aktivizld esemnykezelt, amelyben belltjuk az stMentsTpus vltoz rtkt a kijellt vlasztgomb fggvnyben. Tervezsi nzetben kivlasztjuk a Ments vlasztgomb csoportbl a Binris vlasztgombot, a Properties

  • Johanyk Zsolt Csaba: Vizulis programozs

    54

    ablakban az Events gombra kattintunk, s a CheckedChanged mezbe berjuk a rbMent_CheckedChanged nevet, majd dupln kattintunk a mezben. A kdszerkesztben automatikusan megjelenik a fggvny vza, ezt az albbiak szerinti kddal tltjk fel. /// /// Ments tpus kivlasztsa a vlasztgombok llapotnak /// fggvnyben /// private void rbMent_CheckedChanged(object sender, EventArgs e){

    if (rbBinarisMent.Checked) stMentsTpus = SorostsTpus.Binris;

    if (rbSoap_XmlMent.Checked) stMentsTpus = SorostsTpus.SOAP_XML;

    if (rbXmlMent.Checked) stMentsTpus = SorostsTpus.XML;

    } lltsuk be a Ments csoport SOAP-XML s XML csoportjainl is CheckedChanged esemnykezelknt a rbMent_CheckedChanged metdust. Ksztsk el a Betltstpus kivlasztsakor aktivizld esemnykezelt, amelyben belltjuk az stBetltsTpus vltoz rtkt a kijellt vlasztgomb fggvnyben. Tervezsi nzetben kivlasztjuk a Betlts vlasztgomb csoportbl a Binris vlasztgombot, a Properties ablakban az Events gombra kattintunk, s a CheckedChanged mezbe berjuk a rbBetlt_CheckedChanged nevet, majd dupln kattintunk a mezben. A kdszerkesztben automatikusan megjelenik a fggvny vza, ezt az albbiak szerinti kddal tltjk fel. /// /// Betlts tpus kivlasztsa a vlasztgombok llapotnak /// fggvnyben /// private void rbBetolt_CheckedChanged(object sender, EventArgs e){

    if (rbBinarisBetolt.Checked) stBetltsTpus = SorostsTpus.Binris; if (rbSoap_XmlBetolt.Checked) stBetltsTpus = SorostsTpus.SOAP_XML; if (rbXmlBetolt.Checked) stBetltsTpus = SorostsTpus.XML; } lltsuk be a Betlts csoport SOAP-XML s XML csoportjainl is CheckedChanged esemnykezelknt a rbBetlt_CheckedChanged metdust. Ksztsk el a mentst megvalst metdust. Ez a btMents nyomgomb Click esemnynek kezelje lesz. A metdust egy switch szerkezettel hrom rszre tagoljuk. A ments tpustl fggen belltjuk a ments prbeszdablak alaprtelmezett llomny kiterjesztst s fjltpusait, megjelentjk a prbeszdablakot, s ha Ments gombbal zrta le a felhasznl, akkor vgrehajtjuk az elzekben megismert mdon a sorostst. Mivel az ArrayList tpus nem sorosthat XML sorostssal, ezrt, ha a felhasznl az XML sorostst vlasztja, akkor ltrehozunk egy Szemly tpus objektumok trolsra alkalmas egydimenzis tmbt, ebbe belemsoljuk az ArrayList-ben trolt Szemly tpus objektumokat, majd a tmbt sorostjuk. A feladatot megold kd a kvetkez:

  • I. Nyelvi Alapok - I.5. Sorosts (szrializci) s helyrellts

    55

    /// /// Az aktulis mentstpusnak megfelelen sorostja az /// alEredetiAdatok ArrayList tartalmt /// private void btMentes_Click(object sender, EventArgs e){ switch (stMentsTpus){ case SorostsTpus.Binris: sfdMentes.DefaultExt = "*.dat";

    sfdMentes.Filter = "Adat llomny (*.dat)|*.dat|" + "Minden llomny(*.*)|*.*";

    if(sfdMentes.ShowDialog() == DialogResult.OK){ Stream st = File.Create(sfdMentes.FileName); BinaryFormatter sf = new BinaryFormatter();

    sf.Serialize(st, alEredetiAdatok); st.Close();

    } break; case SorostsTpus.SOAP_XML: sfdMentes.DefaultExt = "*.xml"; sfdMentes.Filter = "XML llomny (*.xml)|*.xml|" + "Minden llomny (*.*)|*.*"; if (sfdMentes.ShowDialog() == DialogResult.OK){ Stream st = File.Create(sfdMentes.FileName); SoapFormatter sf = new SoapFormatter(); sf.Serialize(st, alEredetiAdatok); st.Close(); } break; case SorostsTpus.XML: sfdMentes.DefaultExt = "*.xml"; sfdMentes.Filter = "XML llomny (*.xml)|*.xml|" + "Minden llomny (*.*)|*.*"; if (sfdMentes.ShowDialog() == DialogResult.OK){ Stream st = File.Create(sfdMentes.FileName); Szemely[] sz = new Szemely[alEredetiAdatok.Count]; for (int i = 0; i < alEredetiAdatok.Count; i++) sz[i] = (Szemely)alEredetiAdatok[i];

    XmlSerializer xs = new XmlSerializer (typeof(Szemely[]));

    xs.Serialize(st, sz); st.Close(); } break;

    } }

  • Johanyk Zsolt Csaba: Vizulis programozs

    56

    Ksztsk el a betltst megvalst metdust. Ez a btBetlts nyomgomb Click esemnynek kezelje lesz. A metdust egy switch szerkezettel hrom rszre tagoljuk. Elszr trljk az lbBetlt listaablak tartalmt, majd betlts tpustl fggen belltjuk a betlts prbeszdablak alaprtelmezett llomny kiterjesztst s fjltpusait, megjelentjk a prbeszdablakot, s ha Megnyits gombbal zrta le a felhasznl, akkor vgrehajtjuk az elzekben megismert mdon a helyrelltst. Mivel az ArrayList tpus nem sorosthat XML sorostssal, ezrt, ha a felhasznl ezt vlasztja, akkor ltrehozunk egy Szemly tpus objektumok trolsra alkalmas egydimenzis tmbt, ebbe olvassuk be az adatokat a lemezrl, majd ennek elemeit elhelyezzk az alBetltttAdatok ArrayList-ben, s a tartalmt megjelentjk az lbBetlttt listaablakban a Feltlt metdus meghvsval. A feladatot megold kd a kvetkez: /// /// Az aktulis betltstpusnak megfelelen beolvassa a lementett /// adatokat az ArrayList tpus alBetltttAdatok objektumba. /// Feltlti az lbBetoltott listaablakot. /// private void btnBetoltes_Click(object sender, EventArgs e){ lbBetlttt.Items.Clear(); switch (stBetltsTpus){ case SorostsTpus.Binris: ofdBetlts.DefaultExt = "*.dat";

    ofdBetlts.Filter = "Adat llomny (*.dat)|*.dat|" +"Minden llomny (*.*)|*.*";

    if (ofdBetlts.ShowDialog() == DialogResult.OK){ Stream st = File.OpenRead(ofdBetlts.FileName);

    BinaryFormatter bf = new BinaryFormatter(); alBetltttAdatok = (ArrayList)bf.Deserialize(st);

    st.Close();

  • I. Nyelvi Alapok - I.5. Sorosts (szrializci) s helyrellts

    57

    } break; case SorostsTpus.SOAP_XML: ofdBetlts.DefaultExt = "*.xml"; ofdBetlts.Filter = "XML llomny (*.xml)|*.xml|" + "Minden llomny (*.*)|*.*"; if (ofdBetlts.ShowDialog() == DialogResult.OK){ Stream st = File.OpenRead(ofdBetlts.FileName); SoapFormatter sf = new SoapFormatter(); alBetltttAdatok = (ArrayList)sf.Deserialize(st); st.Close(); } break;

    case SorostsTpus.XML: ofdBetlts.DefaultExt = "*.xml"; ofdBetlts.Filter = "XML llomny (*.xml)|*.xml|" + "Minden llomny (*.*)|*.*"; if (ofdBetlts.ShowDialog() == DialogResult.OK){ Stream st = File.OpenRead(ofdBetlts.FileName);

    XmlSerializer xs = new XmlSerializer(typeof(Szemely[]));

    Szemely[] sz = new Szemely[1]; sz = (Szemely[])xs.Deserialize(st); for (int i = 0; i < sz.Length; i++) alBetltttAdatok.Add(sz[i]); st.Close(); } break; } Feltlt(lbBetlttt, alBetltttAdatok); }

  • 58

    II. Windows Forms

    II.1. Gymlcsraz automata

    Ksztsnk egy gymlcsraz automatt szimull alkalmazst. A program ngy gymlcst tud kezelni. A bal oldali oszlopban csak olvashat szvegmezkben jelennek meg az egysgrak. A jobb oldali nyomgombokon trtn kattints idzi el az r kiszmtst. A Tmeg felirat melletti szvegmezbe kell bernia a felhasznlnak a mennyisget. Az r felirat melletti szvegmezben jelenik meg a fizetend sszeg. A Bellt gombon trtn kattints hatsra egy jelszbekr ablak jelenik meg. A bla-bla jelsz megadsa utn az egysgrak szerkesztmezi rhatv vlnak. Az j rtkek megadsa utn az Alkalmaz gombon trtn kattintssal rgzthetjk az adatokat. Ennek hatsra az egysgr mezk jra csak olvashatak lesznek.

    1. A feladat megoldsa

    A feladat megoldsnak fontosabb lpsei a kvetkezk.

    A fablak grafikus felletnek ltrehozsa.

    Esemnykezel a Kilp nyomgombhoz.

    Asszociatv tmb a szerkesztmez nyomgomb prosokhoz.

    Kzs esemnykezel a ngy gymlcs nyomgombhoz.

    Egysgrak megvltoztatsi lehetsgnek megvalstsa.

    A teljes osztlydiagram a megolds vgn tallhat.

    2. A fablak grafikus felletnek ltrehozsa

    Hozzunk ltre egy j projektet Gyumolcsarazo nven.

  • II. Windows Forms - II.1. Gymlcsraz automata

    59

    Az ablak objektumot nevezzk t frmGymlcsraz-nak, majd helyezzk el fejlcben a fenti kpen lthat szveget. Ehhez tervezsi nzetben (Design) vlasszuk ki az ablakot (Form), majd nyissuk meg a Properties ablakot, ott vlasszuk ki a (Name) tulajdonsgot, s az eredeti Form1 rtket rjuk t frmGymlcsraz-ra. A feliratot az elzhz hasonl mdon a Text tulajdonsg segtsgvel mdosthatjuk. A Solution Explorerben az ablak llomnyt Form1.cs-rl nevezzk t frmGyumolcsArazo.cs-rek (jobb egrgomb, Rename)

    Kvetkez lpsknt helyezzk el a komponenseket a formon (ablakon). Ehhez nyissuk meg a ToolBox palettt (a fablak keretben bal oldalon jelenik meg), majd kattintsunk a rajzszg gombon. Ebben a gyakorlatban olyan komponenseket hasznlunk, amelyek a Common Controls csoportban vannak. Ms esetekben egyszerbb, ha az All Windows Forms csoportot nyitjuk meg, mert itt minden komponenst megtallunk, neveik szerint sorba rendezve. A hrom hasznlt komponens a nyomgomb (Button), szvegmez (TextBox) s a cmke (Label). Ezeket az egr segtsgvel foghatjuk meg s hzhatjuk az ablak terletre. ltalnos elnevezsi konvenci lesz a tovbbiakban az, hogy egy ablakra helyezett komponens nevt kt rszbl lltjuk ssze: az els rsz kisbets s a tpust tkrzi, a msodik rsz nagy betvel kezddik s a tpuson belli egyedi azonostsra szolgl. Tekintsk t az elnevezst tpusonknt. A nyomgombok neveit gy alaktsuk ki, hogy bt-vel kezddjenek, majd a nv tovbbi rsze legyen azonos a felirattal (pl. btAlma). A szerkesztmezk neve kezddjn tb-vel, majd ezt kveten legyen azonos a jobb oldalukon lev nyomgomb feliratval az els ngy esetben (pl. tbAlma), illetve a bal oldalukon lthat felirattal az utols kt esetben (pl. tbTmeg). Az tdik kivtelvel mindegyik szvegmez legyen csak olvashat (ReadOnly=True). Az Alkalmaz nyomgomb legyen letiltva (Enabled=False).

    3. Esemnykezel a Kilp nyomgombhoz

    Ksztsnk egy esemnykezelt a Kilp nyomgombhoz. Pl. tervezsi nzetben dupln kattintunk a nyomgombon. Alternatv lehetsg az, hogy tervezsi nzetben kijelljk a nyomgombot,

  • Johanyk Zsolt Csaba: Vizulis programozs

    60

    majd a Properties ablakban kivlasztjuk a villmra emlkeztet Events nyomgombot, s a megjelen esemnylistban kivlasztjuk a Click esemnyt. Ezutn dupln kattintunk a mellette lev res mezben. /// /// Kilps a programbl /// /// Az esemnyt elidz nyomgomb /// Esemny paramter. private void btnKilep_Click(object sender, EventArgs e){

    Application.Exit(); }

    4. Asszociatv tmb a szerkesztmez nyomgomb prosokhoz

    A ksbbi knyelmesebb programozs rdekben az sszetartoz szerkesztmez s nyomgomb referencikat egy asszociatv tmbben szeretnnk trolni. Hozzunk ltre egy olyan osztlyt, ami asszociatv tmbt valst meg. Az osztly neve legyen Prosok s szrmazzon a DictionaryBase-bl. A Project menben vlasszuk ki az Add Class pontot, a sablonok kzl az elst (Class) jelljk be, majd llomnynvknt adjuk meg a Prosok.cs-t. A kdszerkesztben az albbi mintnak megfelelen egsztsk ki az osztly kdjt. Az osztly ltrehozsnak alternatv mdja az, hogy a Solution Explorerben kivlasztjuk a projektet, majd kattintunk a View Class Diagram gombon. Az ekkor megjelen osztlydiagramban egy res terleten kattintva jobb egrgombbal a gyorsmenben Add/Add class-t vlasztunk. /// /// Asszociatv tmb megvalstst tmogat osztly /// public class Parosok: DictionaryBase{

    /// /// Indexel: feladata megadhat/lekrdezhet, hogy /// egy adott nyomgombhoz melyik szerkesztmez tartozik.

    /// /// A nyomgomb neve /// A szerkesztmez neve public TextBox this[Button kulcs]{ get{ return ((TextBox)Dictionary[kulcs]); } set{ Dictionary[kulcs] = value; }

    } } Fordtsuk le az alkalmazst (Ctrl+Shift+B). Hrom hibazenetet kapunk. Az els az albbi: The type or namespace name 'DictionaryBase' could not be found (are you missing a using directive or an assembly reference?)

  • II. Windows Forms - II.1. Gymlcsraz automata

    61

    A hiba oka a DictionaryBase neve eltt a nvtr elrsi t megadsnak elmaradsa.

    A kdszerkesztben a DictionaryBase kk hullmos vonallal van alhzva. Kattintsunk jobb egrgombbal rajta, majd a gyorsmenben vlasszuk a Resolve pontot, majd a using -t. Ennek eredmnyekpp az llomny elejre bekerl a megfelel using direktva. A msik kt hibt is hasonl mdon kell megoldani. Mindkett ausing System.Windows.Forms; direktvt hinyolja. Hozzunk ltre egy Prosok tpus adattagot Sztr nven az ablak osztlyban (frmGymlcsraz) az osztlydiagram s a Class Details segtsgvel.

    private Parosok Sztr;

    Az ablakosztly konstruktorban adjunk kezdrtket az egysgraknak, azaz hatrozzuk meg a ngy szvegmez kezdeti tartalmt. Hozzunk ltre egy objektumot a Sztr adattaghoz, majd helyezzk el benne az sszetartoz nyomgomb s szvegmez prosokat.

    public frmGyumolcsArazo(){ InitializeComponent(); tbAlma.Text = "150"; tbBanan.Text = "256"; tbKorte.Text = "190"; tbNarancs.Text = "199"; Szotar = new Parosok(); Szotar[btnAlma] = tbAlma; Szotar[btnBanan] = tbBanan; Szotar[btnKorte] = tbKorte; Szotar[btnNarancs] = tbNarancs; }

    5. Kzs esemnykezel a ngy gymlcs nyomgombhoz

    Ksztsnk egy kzs esemnykezelt a ngy gymlcs nyomgombhoz. Az albbi kdrszletet kzvetlenl be kell gpelni az ablak osztlyba. /// /// A ngy gymlcsnyomgomb kzs esemnykezelje. Kiszmolja a /// fizetend rat, s elhelyezi azt a megfelel szvegmezbe /// /// Az esemnyt elidz nyomgomb /// Esemny paramter. private void btn_Click(object sender, EventArgs e){

    //Meghatrozzuk a gymlcsnek megfelel szvegmezt TextBox tbMunka = Szotar[(Button)sender]; try{

    //Az aktulis egysgr double egysegAr = double.Parse(tbMunka.Text)