Professional Documents
Culture Documents
Visual
hasznlatt
JamasFoxa/1
24 ra alan
Jamss Foxa/1
Tanulilk meg a
Visual C# 2008
hasznlatl 24 ra alan
A fordts a
kvetkez
James Foxall: Sams Teach Visual C# 2008 in 24 Hours: Complete Starter Kit
Copyright C> 2008 by Pearson Education, Inc. Authorized translation from the English language edition, entitJed SAMS TEACH YOURSELF VISUAL C# 2008 IN 24 HO URS, First Edition, ISBN 0672329905, by FOXALL, JAMES, published by Pearson Education, Inc, publishing as Sams. Translation and Hungaria n edition 2009 Kiskapu Kft. Ali rights reserved!
Ali rights reserved. No pa n of this book, induding interior design, cover design, a nd icons, may be
reproduced or transmitted in a ny form, by any means (electronic, photocopying, recording, or otherwise) without the prior written permission of the publisher. Trademarked names appear throughout this book. Rather than list the names and entities that own the tr..tdemarks o r insert a trademark symbo! with each mention of the trademarked name, the publisher states that it is using the names for editorial purposes only and to the benefit of the trademark owner, with no intention of infringing u pon that trademark Fordts s magyar vltozat 2009 Kiskapu Kft. Minden jog fenntartva! A knyv egyetlen rsze sem sokszorosthat semmilyen mdszerrel a Kiad elzetes rsos engedlye n lkl. Ez a korltozs kiterjed a bels tervezsre, a bortra s az ikonokra is. A knyvben bejegyzett vdjegyek s mrkanevek is felbukkanhatnak Ahelyett, hogy ezt minden egyes helyen kln jeleznnk, a Kiad ezennel kijelenti, hogy a mtben elfordul valamennyi vdett nevet s jelzst szerkesztsi clokra, jhiszemen, a nv tulajdonosnak rdekeit szem eltt tartva hasznlja, s nem ll szndkban az azokkal kapcsolatos jogokat megszegni, vagy ktsgbe vonni. A szerzk s a kiad a lehet legnagyobb kriiltek.intssel jrt el e kiadvny elksztseko r. Sem a szerz, sem a kiad nem vllal semminem felel6ssget vagy garancit a knyv tartalmval, teljessgvel kapcsolatban. Sem a szerz, sem a kiad nem vonhat felelssgre brmilyen baleset vagy kresemny miatt, mely kzvetve vagy kzvetlenl kapcsolatba hozhat e kiadvnnyal.
Fordfts: Cspny Gergely, Fodor Dniel, Gilicze Blint, lektorls: Rzmves Lszl Mszaki szerkeszts: Csutak Hoffmann Levente Trdels: Kis Pter
Felels kiad a Kiskapu Kft. gyvezet igazgatja 2009 Kiskapu Kft. 1134 Budapest, Csng u. 8. Fax: (+36-1) 303-1619 http://www.kiskaptlkiado.hu/ e-mail: kiado@kiskapu.hu
Rzmves
Lszl
Tartalomjegyzk
l. rsz A Visual C# 2008 krnyezet . . . . . . . . . . . . . . . . . . . 1 1. ra Programozs a Visual C# 2008-ban: teljes g6zzel el6re! 3
A Visual C# 2008 elindtsa . . . . . . .......................... . .... 4 j projekt ltrehozsa ........... . ............................. 5 A VtSual Studio .NET krnyezet ................................. 8 Az objektumok jellemzinek mdostsa .......................... 9 Vezrlk hozzadsa az ablakokhoz ............................. 15 A fellet megtervezse ........................................ 16 A projekt futtatsa ..................... . ..................... 24 sszefoglals ........................ .. .................... 26 Ismtls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Gyakorlatok ..... . ..................................... . ... 27
4. ra Esemnyek ............................... 81
Az esemnyvezrelt programozs ................. ........ . ..... 82
Egy esemnyeket hasznl pldaprojekt felptse ................. 91 sszefoglals .............................................. 96 Ismtls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Gyakorlatok ........................................... . ... 97
ll. rsz Felhasml6i fellet pftse ... . ..... . ...... . . . 99 5. ra Ablakok kszftse- az alapok . ........ . ....... 101
Az ablakok nevnek megvltoztatsa ........................... Az ablakok megjelensnek mdostsa ......................... Az ablakok megjelentse s elrejtse ........ .... . ........... . .. sszefoglals ............. ........ . ................. . .. . .. Gyakorlatok ............. ................. ....... . ..... ..
o.
o.
150 151 152 156 157 159 160 164 170 172 172 173
Fles prbeszdablakok ltrehozsa Kpek trolsa kplistkban Gazdagabb listk a ListView vezrlvel sszefoglals Krdezz-felelek Ismtls
o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o
o.
lll. rsz Hozzuk mkdsbe a dolgokat: programozs ..... 217 1O. ra Tagfggvnyek ltrehozsa s meghfvsa ....... 219
Osztlytagsg Tagfggvnyek ltrehozsa Kilpsa tagfggvnyekbl
o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o
263
Matematikai alapmveletek a Visual C#-ban .... . ........ . ........ 264 sszehasonlts . . . . . . . . . . . . . . .............................. 268 Logikai mveletek ............. . ............................ 269 Dtumok s idpontok kezelse ........ . ...................... 276 sszefoglals ............................... . ............. 280 Krdezz-felelek ............................................ 280 Ismtls .................................................. 281
Fjlkezels a File objektum segtsgvel ............... .. ........ 396 sszefoglals ......................... . ......... .. ........ 405 Krdezz-felelek .. . .................................... . .... 406 Ismtls .................. . ....................... . ....... 406
Adatok kezelse ........................................... 437 sszefoglals . . . . . . . . . . . . . . . . ..... . .................... . .. 447 Krdezz-felelek .............. . .. . .. . ..... . ................. 448 Ismtls . . . . . . . . . . . . . . . . . . . . . .. . .. . ........ . ........ . .. . .. 448
V. rsz A megoldsok kzzttele - s ami azon tl van .. 465 23. ra Az alkalmazsok kzzttele ....... . .. . . . .... 467
................................ . ... 468 Clicknce-program ksztse a kzztteli vacizsl segtsgvel ...... 469 A Clicknce-teleptprogramok tesztelse ....................... 472 A teleptett alkalmazsok eltvoltsa ........................... 473 A Clicknce-programok ltrehozsnak halad belltsai ........... 474 sszefoglals ............................................. 475 Krdezz-felelek ............................... . .. . ..... . ... 475 Ismtls .................................. . ............... 475
A Clicknce technolgia
Trgymut:at6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Ajnls
Ezt a k6nyvet gyermekeimnek, Ethannek s Tessnek ajnlom, akik mindig emlkeztetnek r, hogy az a lnyeg, hogy jl szrakozzunk.
Ksznetnyilvnfts
Szeretnk ksznetet mondani Neilnek, Brooknak s a Sams tbbi kivl munkatrsnak, valamint a korbbi angol kiadsok minden olyan olvasjnak, aki visszajelzseivd segten, hogy ez az j kiads mg jobb legyen.
A szerz6r61
James Foxall a Nebraska llambeli Bellevue-ben szkel, Microsoft Certified Partner mi-
nstssel rendelkez , kereskedelmi adatbzis-kezel alkalmazsokra szakosodott Tigerpaw Software, Inc. (www.tigerpawsoftware.com) alelnke. felgyeli a djnyertes CRM-termk, a kapcsolatkezelst, a piaci s szervizszolgltatsokat, az ajnlatttelt, a raktrkszlet-kezelst s a vsrlst automatizl Tigerpaw CRM+ fejlesztst, tmogatst s oktatst. 2008 elejn a Tigerpaw CRM+ le::gjabb vltozatnak tbb mint 16 OOO bejegyzett felhasznlja volt. Foxall a minstett Office-megfelel prograrnek fejlesztse tern szerzett tapasztalatnak ksznheten igazi szaktekintlye a Microsoft Windows s Microsoft Office krnyezetekhez ksztett alkalmazsok alkalmazsfelleti s viselkedsi szabvnyainak. Foxall tbb mint 14 ve r kdot kereskedelmi temkekhez, nll programozknt, ille::tve tbbfejleszrs krnyezetben egyarnt. Szmtalan knyvet rt, tbbek kztt 6 a szerzje a Practical Standards for Microsoft Visual Basic s a MCSD in a Nutshell: The Visttal Basic Exams cm kteteknek, ezen kvl rendszeresen jelennek meg cikkei az Access-Office-VBA Advisors a VtSual Basic Programmer's journal folyiratokban. Foxall az informcis rendszerek kezelse (MIS) teriiietn szerezte a diplomjt, emellett Microsoft Certified Solution Developer minstssel rendelkezik, s nemzetkzi frumokon tart eladsokat a Microsoft Visual BasicrL Amikor nem programozssal vagy programozsi tmj knyvek rsval foglalkozik, a csaldja krben tlti az idejt, gitrozik, olyan nagyszer zenekarok zenjt hallgatja, mint a Pink Floyd vagy az OSI, vagy szmtgpes jtkokkal szrakozik. Ha kapcsolatba szeretnnk lpni vele, keressk fel a wwwjamesfoxall.com/foro.ms internetcmet.
}(Y
Mondja el a vlemnyti
Az olvas a legfontosabb kritikus, akinek a vlemnye nekem s a kiadnak is roppant rtkes. Szeretnnk tudni, rnit csinlunk jl, rni az, amin javthatnnk, rnilyen knyveket kellene megjelentetnnk s gy tovbb. Felhvjuk a figyelmet, hogy a knyv tmjval kapcsolatos szakmai krdsekben nem tudunk segteni, s a nagy szmban berkez levelek rniatt nem biztos, hogy rninden zenetre vlaszolunk.
Krjk, ha r, tntesse fel a knyv szerz6jt s cmt, valarnint a sajt nevt, telefonszmt vagy e~rnail crnt. Megjegyzseit alaposan ttanulmnyozzuk, s tovbbtjuk a knyv szenjnek s szerkeszt6inek. E-mail: feedback@samspublishing.com Levl: Neil Rowe Executive Editor Sams Publishing 800 East 96th Street Indianapolis, IN 46240 USA
Olvasszaiglat
A webhelynket megltogatva a www.informtt.com/tttle/9780672329906 cmen lehet bejegyeztetni a knyvet, ezltal knnyen hozzfrhetnk a knyvvel kapcsolatos frisstsekhez, let ltsekhez, illetve hibajegyzkekhez.
Bevezets
Arnikor a Microsoft bevezette a .NET platformot, egy j, izgalmas programozsi nyelv szletett. A Visual C# ma mr a .NET krnyezetre fejlesztk els szm vlasztott nyelNET keretrendszer nagy rszt. ve, s maga a Microsoft is Visual C# nyelven rta a .: A Visual C# egy modem, objektumkzpontO nyelv, amelyet kezdettl fogva a helyes hozzllssal terveztek s alkottak meg, s a ms nyelvekben fellelhet leghasznosabb szolgltatsokat valstottk meg s fejlesztettk tovbb benne, a Visual C# 2008 pedig a C++ erejt s rugalmassgt tvzi a Visual C# egyszersgveL
eszkze kztt, ezen kvl pedig az olyan Irulesfontossg programozsi fogalmakat is megtanuljuk, mint az objektum, a gyjtemny vagy az esemny. ll. rsz: Felhasznli fellet ptse -Ebben a rszben azt mutatom meg, hogy miknt pthetnk vonz s egyben makdkpes felhasznli felleteket Megtanuljuk, mik azok az ablaksablonok, illetve a vezrli<, vagyis a felhasznli fellet olyan elemei, mint a szveg- s listamezk. lll. rsz: Hozzuk mkdsbe a dolgokat: programozs - Ebben a rszben a Visual C# 2008 nyelv' progmmozs alapjait sajtrjuk el - s nem kevs tanulnivalnk lesz. Felfedezzk, hogyan rhatunk osztlyokat s eljrsokat, valamint hogy miknt trolhatunk adatokat, hajthatunk vgre ciklusokat, s valsthatunk meg dntsi gakat a kdban. Miutn elsajttottuk az alapvet programozsi kszsgeket, megismerkednk az objekturnkzpont programozssal s az alkalmazsokban trtn hibakeresssel is. IV. rsz: Adatkezels - Ebben a rszben a grafikk s szvegfjlok kezelsvel, valamint az adatbzisok programozsval ismerkednk meg, s azt is ltni fogjuk, hogy miknt automatizlhatunk olyan kls alkalmazsokat, mint a Word vagy az Excel. Ezen kvl ez a rsz megmutatja, hogyan mdosthatjuk a felhasznl fjlrendszert, illetve a Windows Belltsjegyzkt (rgi nevn a Rendszerler adatbzist). V. rsz: A megoldsok kzzttele - s ami azon tl van - Ebben a rszben azt tanuljuk meg, hogy miknt telepthetjk az ltalunk ksztett alkalmazsokat a vgfelhasznlk szmtgpre, az utols rn pedig magasabb, kevsb technikai nzpontbl vesszk szemgyre a Microsoft .NET kezdemnyezst.
A korbbi angol kiadsok szmos olvasja vette a fradsgot, s rta le javaslatait azzal kapcsolatban, hogy miknt tehetnnk jobb a knyvet. Az elspr tbbsg azt krte,
hogy olyan pldkat mutassunk be, amelyek a megelz fejezetek pldira plnek, ezrt ebben a ktetben igyekeztnk eleget tenni ennek a kvnsgnak. A fogalmakat teht most nem egymstl elszigetelt rszekben tanuljuk majd, hanem a fejezetek sorn egy szolgltatsokban gazdag kpnzeget programot fogunk felpteni. Az alkalmazs alapszint vzval kezdjk, majd ahogy haladunk elre, menket s eszkztrakat ad1mk hozz, elksztnk egy bellt prbeszdablakot, gy mdostjuk a programot, hogy a Windows Belltsjegyzkre, valamint egy szvegfjlra tmaszkodjon, st mg egy teleptprogramot is ltrehozunk, hogy kzztehessk az alkalmazst ms felhasznlk szmra. Remljk, hogy ez a megkzelts a segtsgre lesz az Olvasnak abban, hogy az anyagot egy valdi program felptsnek sszefggsben sajtithassa el.
A megjegyzsek bvebb informcikat nyjtanak az adott tmrl, amelyeket azonnal is elolvashatunk, de ksbb is visszatrhetnk hozzjuk, ha nem szerelnnk elveszteni a fonalat. A tippek olyan tancsokat adnak, amelyeket megfogadva hatkonyabb Visual C# programokat frhatunk.
A figyelmeztetsek a lehetsges problmkkal s mellkhatsokkal kapcsolatban intenek vatossgra, s arrl tjkoztatnak, hogy miknt kerlhetjk el, illetve hozhatjuk helyre ezeket.
A fentiek mellen knyvnk klnbz bettpusokat hasznl a kdrszletek s a fejczetek szvegnek elvlasztsra. A kdokat azonos szlessg karakterek jelzik. A helykitirk - olyan szavak, illetve karakterek, amelyek helyre ksbb mst kell ununk- azonos szlessg dl t betilkkel jelennek meg. Ha pedig szveget kell valahova beununk, erre a flkvr betuK hvjk fel a figyelmet.
Kalandra fell
Manapsg igazn izgalmas idket lnk ahhoz, hogy megtanuljunk programozni. szintn kvnom, hogy az Olvas a ktet elolvassa utn kpesnek rezze magt arra, hogy szernyVisual C# programokat rjon, hibamentestsen s tegyen kzz a Visual C# szmos eszkznek segtsgveL Profiv nem vlunk ugyan, de meg fogunk lepdni, hogy mennyi mindent tanultunk meg, s a knyv remlhetleg a jvnket is formlja majd, ahogy tovbb haladunk az ton afel, hogy a Visual C# mesterei legynk.
l.
RSZ
1.
RA
Egyszeru (de m\1kd6kpes) Visual C#-alkalmazs ptse Tallzs engedlyezse a merevlemezen a felhasznlnak Kp megjelentse lemezen tallhat fjlbl Prograr.nozsiszakszavak A Visual Studio .NET fejlesztkrnyezet
Egy j prograr.nozsi nyelvet megtanulni nem mindig knny(i. Ha korbban mg soha nem prograr.noztunk, fekete mginak tanhet ltszlag rtelmetlen utastsokat berni ahhoz, hogy elegns s hatkony alkalmazsokat lltsunk el, s elfordulhat, hogy tprengeni kezdnk, hogy miknt fogjuk r.negtanulni mindazt, ami szksges. A vlasz termszetesen az, hogy lpsenknt. Az els lps, amely egy nyelv megtanulsa fel vezet, ugyanaz, mint brmely ms kszsg elsajttsakor: az 6nbizalom felptse. A programozs rszben m\1vszet, rszben tudomny. Varzslatnak tanhet, pedig sokkal inkbb illzi: ha mr tudjuk, hogyan mkdnek a dolgok, a varzs rszben eltanik, s szabadon sszpontosthatunk azokra az eljrsokra, amelyeknek az ismerete szksges ahhoz, hogy elrjk a kvnt eredmnyt.
program vgs, lefordtott vltozata. Az sszetevk kzztehetk ms szemlyek s szmtgpek szmra, s a futsukhoz nem ignylik a Visual C# 2008 fejlesztkrnyezet (a .NET-programok ksztshez hasznlt eszkzk) jelenttt (br a .NET futsidejl1 krnyczett, az gynevezett .NET-keretrendszert igen- a keretrendszerrl a 23. rn lesz sz bvebben). A terjeszthet sszetevket gyakran programoknak hvjk. A 23. rn megtanuljuk, hogyan tehetjk kzz ms szmtgpeken a knyvben felptett Picture Viewer programunkat. Projek t- Fjlok gyGjtemnye, amelynek a lefordtsval terjeszthet sszetevt (programot) llthatunk el. Sokfle projekt ltezik, az sszetett alkalmazsok pedig tbb projektbl is llhatnak, pldul tartalmazhatnak egy Windows-alkalmazs, valamint tbb dinamikus csatols knyvtr (DLL) tpus projektet. Megolds - Az alkalmazsokat, illetve sszetevket alkot projektek s fjlok gytjtemnye.
Terjeszthet sszetev-A
A Visual C# a .NET-keretrendszer (.NET Framework) nven ismert nagyobb egysg rsze. A .NEl-keretrendszer a teljes .NEl-technolgit magba foglalja, belertve a Visual Studio .NET fejleszteszkz- gyjtemnyt s a kzs futsi dej nyelvi krnyezetet (Common Language Runtime, CLR ), amely azoknak a fjloknak a halmaza, amelyek minden .NEl-alkalmazs magjt alkotjk. Mindezekrl bvebben is tanulunk, ahogy haladunk majd a knyvben. Most csak annyit kell tudnunk, hogy a Visual C# a .NET-csald sok-sok nyelvnek az egyike, amelyek - pldul a Visual Basic - a CLRre tmaszkodnak, s a Visual Studio .NET-ben programokat fejleszthetnk velk. A Visual Studio 2008 egy teljes fejlesztkrnyezet (gynevezett integrated development environment, rviden IDE, vagyis egyestett fejlesztkmyezet). Az IDE az a tervezsi keretrendszer, amelyben felptjk az alkalmazsainkat - rninden eszkzt, arnire szksgnk van a Visual C#-projektek ltrehozshoz, a Visual C# fejlesztkmyezetb61 rjk el. A Visual Studio 2008 a fejlesztst tbb klnbz6 nyelven is lehetv teszi; ezek kzl a Visual C# az egyik legnpszerbb. Maga a krnyezet nem Visual C# nyelvl, a nyelv, amelyet a VtsuaJ Studio 2008-ban hasznlunk, azonban az. Ahhoz, hogy Visual C#-programokat fejlessznk, elszr a Visual Studio 2008 fejlesztkrnyezetet kell elindtanunk. Indtsuk is eJ most a Vtsual Studio 2008-at a Start, Programs, Microsoft Visual C# 2008 Express Edition (Start, Programok, Microsoft Visual C# 2008 Express Edition) menponttal. Ha a .NET teljes vltozatt futtatjuk, a menpont neve ms is lehet; ebben az esetben keressk meg a megfelel pontot a Start menben, s kattintsunk r a Vtsual Studio .NET IDE elindtshoz.
l
Uj projekt ltrehozsa
Amikor elsZr indtjuk el a Visual Studio .NET-et, a fejlesztkrnyezetben a Start Page (Kezdlap) neva lapot lthatjuk. Innen megnyithatunk korbban ltrehozott projekteket, de j projekteket is indthatunk (lsd az 1.1. brt). Gyorstalpal tanfolyamunk sorn egy j Windows-alkalmazst fogunk kszteni, ezrt nyissuk meg a File (Fjl) ment, s a New Project (j projekt) menpontra kattintva jelentsk meg a hasonl nev prbeszdablakot, amelyet az 1.2. bra mutat. Ha a kezdlap mskpp nz ki, mint az 1.1 . brn, akkor lehetsges, hogy megvltoztattuk az alaprtelmezett belltsokat. A 2. rn megmutatjuk, hogyan lehet visszalltani ket. A New Project prbeszdablakban adhatjuk meg, hogy rnilyen tpus Visual Ot-projektet szeretnnk ltrehozni. (A Visual C# a .NET-keretrendszer ms tmogatott nyelveihez hasonlan tbbfle projekt ltrehozst is lehetv teszi.) Az 1.2. brn lthatlehetsgek szak knek, mivel a knyv pldihoz a Visual C# Express Edition vltozatt hasznljuk. Ha a Visual C# teljes vltozatval rendelkeznk, sokkal tbb lehetsget kapunk.
l<\liiDK1/S11-GNT..,."lo...
~ . . fotPopfllf.o:ount~
,.
fWioatsS.....T.t.W
_ _ ,.......,.'lllwlcor.-
c-top-.
Studi. Shtl ~ I!Mt.Atyovto eteitt IOmC JIMt1 tet twtom mt:'s1 C'Mdc:CKatMAddOnSNdioforWoftdofWwo.t\flft
,.,.,..,tr0114.1t11..-..~--.wrF
1.1. bra
A Visu<Jl Studio
kezdlapjrl
~.!.<::s.:;:~w::.~"::.O::: l
Ulll'\g Wllldowt PtiHI!tJM Foutldation (WPF) tfl4 Y'IWIICA
1.2. bra
A New Project prbeszdablak klnb6z tpus .NET-projektek Mtrehozst teszi
lehetv
van kivlasztva (ha nem, akkor kattintsunk r egyszer, hogy kijelljk). 2. A New Project prbeszdablak aljn tallunk egy Name (Nv) felirat szvegmez6t. Itt adhatjuk meg - min furcsasg - a ltrehozand projekt nevt. rjuk be ebbe a mezbe a Picture Viewer nevet. 3. A projekt ltrehozshoz kattintsunk az OK gombra.
Mieltt ltrehoznnk egy projektet, mindig valamilyen rtelmes nevet adjunk meg a szmra, klnben ksbb tbbet kell dolgoznunk, ha t szeretnnk helyezni vagy t szeretnnk nevezni a projektet.
Amikor a Visual C# ltrehozza egy j Windows-alkalmazs projektjt, egy res ablakot, ms nven ablaksablont (form; lsd az 1.3. brt) jelent meg, amelyen elkezdhetjk felpteni az alkalmazs felalett, vagyis azokat a grafikus ablakokat, amelyekkel a felhasznJk majd kapcsolatba lpnek.
1.3. bra
Az j Windows-
A Visual Studio 2008-ban a felhasznl szmra megjelentett ablakok tervezsi idej nzett ,.form"-nak (ablaksablon) hvjk.
A mi Visual Studio 2008 krnyezetnk kinzete eltrhet az ra britl, attl fggen, hogy a Visual Studio 2008-nak melyik vltozatt hasznljuk, hogy korbban mr dolgoztunk-e a fejlesztkrnyezettel, illetve ms tnyezk, pldul a kperny felbontsa fggvnyben. Az ezen az rn trgyalt elemek ugyanakkor a Visual Studio 2008 minden vltozatban megtallhatk (Ha valamelyik brn mutatott ablak nem lthat a fejlesztkrnyezetnkben, a View men segtsgvel jelenthetjk meg.)
.~
Ahhoz, hogy egy msik szmftgpen futtathat programot lltsunk el. elszr ltre kell hoznunk egy projektet, majd le kell fordtanunk azt egy sszetevv: vgrehajthat fjl/ (vagyis programm, amelyet a felhasrnlk futtathatnaki vagy DLL-l (vagyis olyan sszetevv, amelyet ms programok. s sszetevk hasznlhatnak). A fordts folyamatt a 23. rn trgyaljuk rszletesen; most csak annyit kell megjegyeznnk, hogy amikor egy program - esetnkben a Pictura Viewer (Kpnzeget) programltrehozsrl vagy rsrl beszlnk, ebbe az sszes lpst belertjk (a projekt lefordtsval egytt), ami egy terjeszthet fjl elksztshez vezet.
Ha az eszkzkszretet nem az egeret a fl telett tartva, hanem a flre kattintva nyitottuk meg, az eszkzkszlet nem tnik el automatikusan, hanem mindaddig nyitva marad, amg egy msik ablakra nem kattintunk.
Az emltett ablakok mindegyiknek szablyozhat a mrete s az elhelyezkedse, s igny szerint e l is rejthetjk, illetve megjelerthetjk ket. A tervez6krnyezet testreszabst a 2. rn tanuljuk majd meg.
Hacsak kifejezetten erre nem kapunk utasitst, nem kattintsunk dupln semmire a Visual Studio 2008 tervezkmyezetben, mert a legtbb objektumra dupln kattintva teljesen ms lesz az eredmny, mint az egyszeres kattintsra. Ha vletlenl mgis dupln kattintannk egy elemre egy ablaksablonon (errl hamarosan szt is ejtnk), egy kdablak jelenik meg. A kdablak tetejn kt flet lthatunk: az egyik az ablaktervez laphoz, a msik pedig a programkd ablakhoz tartozik. A kdablak elrejtshez s az ablaksablonhoz val visszatrshez kattintsunk az ablaktervez (..form design") flre.
A tervezkrnyezet jobb o lda ln tallhat Properties (Thlajdonsgok) ablak taln az IDE legfontosabb ablaka, s eit hasznljuk majd a leggyakr-abban. Ha a kpernynket 800x600-as felbontsra llto ttuk, valszn(iJ.eg csak nhny tulajdonsgot lthatunk itt, ami a projektek ltrehozsa sorn megnehezti a tulajdonsgok megtekintst s belltst. A knyv mretkorltai miatt az brko n szerepl kpernykpek 800x600-as felbonts mellett kszltek, de ha tehetjk, hasznljunk ennl nagyobb felbontst. A Visual C#alkalmazsok fejlesztshez melegen ajnlott legalbb 1024.x768-os kpernyfelbontst hasznlni, mert gy bsges munkaterlethez jutunk. Tartsuk szben ugyanakkor, hogy a vgfeU1asznlk esetleg alacsonyabb felbontst hasznlnak, mint mi a fejlesztskor. Ha mdostani szeretnnk a kperny belltsait, kattintsunk az egr jobb gombjval az Asztalra, s vlasszuk a Personalize (Testreszabs) lehetsget.
Minden objektum sajtos jellemz6kkel, gynevezett tulajdonsgokkal rendelkezik (fggetlenl attl, hogy az adott objektumnak van-e fizikai megjelense). Neknk is vannak ilyen jellemzink, pldul a magassgunk vagy a hajunk szne. A Visual C#' objektumai szintn rendelkeznek ehhez hasonl tulajdonsgokkal; ilyen pldul a Height (Magassg) vagy a BackColor (Httrszn). Az objektumokjellemzita tulajdonsgaik hatrozzk meg. Amikor ltrehozunk egy j objektumot, az els dolog, amit el kell vgeznnk, hogy belltjuk a tulajdonsgait, hogy az objektum gy jelenjen, meg s viselkedjen, ahogy szeretnnk. Az objektumok tulajdonsgait gy jelenthetjk meg, hogy a tervezben (a fejlesztkrnyezet kzponti munkaterletn) a kvnt objektumra kanintunk.
Elszr is gondoskodjunk rla, hogy a Properties ablak lthat legyen: ehhez nyissuk meg a View (Nzet) ment, s vlasszuk a Properties Window menpontot. Ezt kveten kattintsunk az alaprtelmezett ablaksablonra (amelynek a cmsorban a Forml felirat szerepel) egy tetszleges helyen, s lthatjuk, hogy a tulajdonsgai megjelennek a Properties ablakban. Onnan tudjuk, hogy valb an ennek az objektumnak a tulajdonsgait ltjuk, hogy a tulajdonsgablak tetejn tallhat lenyl lista az ablak nevt (Forml System.Windows.Forms.Form) mutatja. A Forml az objektum neve, a System.Windows.Forms.Form pedig az objektum tpusa.
Az objektumok elnevezse
Minden j objektum esetben az els tulajdonsg, amelyet be kell lltanunk, a Name (Nv). Grgessnk felfel a tulajdonsgok listjban addig, arrg meg nem talljuk a (Name) tulajdonsgot (lsd az 1.4. brt). Ha a Name tulajdonsg nem az elsknt felsorolt tulajdonsgok kztt tallhat, a tulajdonsgablak nem bcsorrendben, hanem csoportonknt mutatja a tulajdonsgokat. Ezt a belltst gy mdosthatjuk bcsorrend megjelentsre, hogy a kzvetlenl a tulajdonsgrcs felett lthat Alphabetical (bcsorrend) gombra kattintunk.
A Properties ablakot clszer gy belltani, hogy a tulajdonsgokat mindig bcsorrendben mutassa, mart gy knnyebben megtallhatjuk a knyv szvegben hivatkozott tulajdonsgokat. Megjegyzend, hogy ilyenkor a Name tulajdonsg mindig a lista eleje fel tallhat, s (Name) formban jelenik meg. A zrjelek arra szolglnak, hogy a tulajdonsg a lista elejre kerljn, mivel az Irsjelek az bcsorrend rendezsben mindig a betk el kerlnek.
Amikor mentnk egy projektet, meg kell hatroznunk a nevt s a projekt fjljainak helyt. Amikor ltrehozunk egy objektumot, a Visual C# egy ltalnos egyedi nevet ad neki az objektum tpusa alapjn. Br ezek a nevek is m\!kdnek, nem elg ler6 jellegek ahhoz, hogy a gyakorlatban hasznukat vegyk. A Visual C# az els6 ablakot pldul Forml-nek nevezi el, egy projektben azonban ablakok tucatjai lehetnek, s a projekt knnyen kezelhetetlenn vlhat, ha az ablakok neveit csupn egy szm (Form2, Porm3 stb.) klnbzteti meg egymstl.
1.4. bra
Amkor egy p rojekthez j objektumot adunk, az els tulajdonsg, amit ctszet megvltoztatnurzk, a Name
Amivel dolgozunk, az valjban egy ablakosztly vagy sablon, amelynek alapjn futskor ltrejnnek s megjelennek az ablakok (bvebben lsd az 5. fejezetben), de a gyorstalpal tanfolyamunk cljainak megfelel, ha most csak egyszeren ablakokra hivatkozunk.
Ahhoz, hogy az ablakaink kezelhetbbek legyenek, adjunk mindegyiknek beszdes nevet. A Visual C# lehetsget ad r, hogy az j ablakoknak a ltrehozsukkor nevet adjunk, de mivel az alaprtelmezett ablakot a fejlesztkrnyezet hozza ltre, ennek esetben az elnevezsre ltrehozskor nincs lehetsgnk. Fontos, hogy az ablaknak ne csak az ablaknevt, hanem a fjlnevt is megvltoztassuk; ezt egyidejleg az albbi lpseket kvetve tehetjk meg: 1. Kattintsunk a Name tulajdonsgra, s mdostsuk a nevet Forml-rl ViewerFormra. Figyeljk meg, hogy az ablak fjlnevt ez nem vltoztatja meg a Properties ablak felett tallhat Solution Explorer ablakban. 2. Kattintsunk az egr jobb gombjval a Forml . cs fjlnvre a Solution Explorer ablakban (a Properties ablak felett). 3. A megjelen helyi menbl vlasszuk a Rename (tnevezs) lehetsget. 4. Mdostsuk a nevet Forml. cs-rl ViewerForm. cs-re.
A Form uttagot azrt hasznljuk, hogy jelezzk, hogy a fjl egy ablakosztlyt tartalmaz. Az uttagok hasznlata nem ktelez, de segti a rendszerezst.
Az ablak Name tulajdonsga valjban automatikusan mdosul, amikor a fjlt tnevezzk. A tulajdonsgot korbban csak azrt mdostottuk: kifejezetten, mert ezt a mveletet sokszor fogjuk elvgezni- a legklnflbb objektumok esetben.
A projekt mentse
Az eddig vgrehajtott vltoztatsok csak a memriban lteznek- ha most kikapcsolnnk a szmtgpet, minden eddigi munknkat elvesztennk. Szokjunk r, hogy srn mentsk a munknkat, mert ezzel rhatjuk lemezre vglegesen a vltoztatsokat. Kattintsunk is most az eszkztr Save Ali (Mindent ment) gombjra (amelyen egymsra pakolt lemezek lthatk), hogy mentsk az eddigi roaveletek eredmnyt. A Visual C# ekkor az 1.5. brn lthat Save Project (Projekt mentse) prbeszdablakot jelenti meg. szrevehetjk, hogy a Name tulajdonsg rtkt a fejlesztkrnyezet mr berta, mivel a projektnek mr nevet adtunk, amikor ltrehoztuk azt. A Location (Hely) szvegmez az a hely, ahol megadhatjuk , hogy a Visual C# hov mentse a projektet. A Visual C# a megadott helyen egy almappt hoz ltre, amelynek a neve a Name szvegmezben szerepl rtk lesz (ami esetnkben a Picture Viewer). Elfogadhatjuk ezt az alaprtelmezett helyet, de igny szerint mdosthatjuk is. A Visual C# fejlesztkr nyezettel ltrehozathatunk pldul egy megoldsknyvtrat, s a projekt mappjt elhelyezhetjk abban, ami a nagyobb projekteknl igen hasznos lehetsg. Ez azonban most szksgtelen lps, ezrt szntessk meg a Create directory for solution (Knyvtr ltrehozsa a megolds szmra) jellngyzet kijellst, s a Save (Ments) gombra kattintva mentsk a projektet.
--- ..,., .,
SakAToj>~ : ~-i-
:l!J~-..,.,
.._
1.5. bra
Amikor mentnk egy projektet, meg kell adnunk a projekt nevt s a projekt fjljainak helyt
Az albbi utasltsok felttelezik, hogy rendelkeznk a knyv pldinak forrsfjljaival, amelyek a www. samspublishing. com elmen, illetve a szerz webhelyn, a h t tp: //www. jamesfoxall . com/books. aspx elmen rhetk el (ez utbbi helyen eszmecsert is folytathatunk a knyvrl) . Amikor kibontjuk a csomagot,
minden rhoz ltrejn egy mappa, a pldaprojekteket pedig az ezekben tallhat al mappk tartalmazzk. Az albbiakban hasznlt ikont teht az Hour 1\ficture Viewer mappban tallhatjuk meg. Nem muszj a pldhoz mallkelt ikont hasznlnunk; brmilyen ikonfjlt vlaszthatunk. Ha nincs megfelel ikonunk (vagy ha rebellisek akarunk lenni), tugorhatjuk ezt a rszt - ez nem befolysolja a plda vgeredmnyt.
A kvetkez lpseket kvetve rendelhetnk ikont az ablakunkhoz: 1. A Properties ablakban kattintsunk az leon tulajdonsgra, hogy kijelljk 2. Amikor az Icon tulajdonsgra kattintunk, a tulajdonsg nevtl jobbra egy apr gomb jelenik meg, amelyen hrom pont lthat. Kattintsunk erre a gombra. 3. A megjelen Open (Megnyits) prbeszdablak segtsgvel keressk meg a Pictureviewer. i co fjlt vagy egy msik, tetsz6leges ikonfjlt Ha megtalltuk, kattintsunk dupln a nevre, vagy kattintsunk r egyszer, hogy kijelljk, majd kattintsunk az Open gombra. Miutn kivlasztottuk az ikont, az megjelenik az 1 con tulajdonsgban az "Icon" szval egytt, s az ikon kis mret vltozata is lthatv vlik az ablaksablon bal fels sarkban. Ha az ablakot lekicsinytjk, ez az ikon fog majd megjelenni a Windows Tlcjn.
1.6. bra
Egyes tulajdonsgokat kibontva
Mdostsuk most a Width tulajdonsg rtkt 400-ra, a Height tulajdonsgt pedig 325-re az egyes tulajdonsgok neve meUetti megfelel6 mezben. Ahhoz, hogy egy tulajdonsg rtknek megvltoztatst vglegestsk (jvhagyjuk), le kell nyomnunk a TAB vagy ENTER billentyllt, vagy egy msik tulajdonsgra, illetve ablakra kell kattintanunk. A kperny6nknek most az 1.7. brhoz hasonlan kell kinznie.
1.7. bra
A Properties ablakban vgrehajtott vltoztatsok a vglegestsk utn azonTUll tkrzdnek a felleten
Egy ablakot gy is tmretezhetnk, hogy a kerett megfelel mretre hzzuk az egrrel (errl a 2. rn tanulunk bvebben). A tulajdonsgokat emellett programkddal is mdosthatjuk; ennek mdjt az 5. rn mutatjuk be.
Mentsk most a projektet a File, Save AJ! paranccsal vagy az eszkztr Save AlJ gombjval (tudjuk, amelyiken egymsra pakolt lemezek lthatk).
le c.-;;;~
.. Point"' (i) Button
E)Chod:Ba.
JP ~~r....
~=
:
l
.r. !:li..
ll~
:r ltVII!W
A Liilitlabel !J llllllox
... ll Jlidurdool
0
ll (il Tilllllos
l> -.m.
.
~
I!!D Ptogtasaor
?JI RciiTetlllolt
lbdioButton
1.8. bra
A jelhasznli felletet felpt vezrlket az eszkzkszletbl vlaszthatjuk ki Az eszkzkszlet bezrul, amint hozzadunk egy vezrlt egy ablaksablonhoz, vagy
ha az egrmulat mr nem az eszkzkszlet felett tartzkodik. Ha azt szeretnnk, hogy az eszkzkszlet mindig lthat maradjon, kattintsunk a cmsorban lthat kis gombosrt ikonra. A Picture Viewer fellete a kvetkez vezrlkbl fog llni (most mg nem kell hozzadnunk ezeket a projekthez):
A fellet megtervezse
ltalban clszer elbb megtervezni az ablakok fellett, s csak ezt kveten megrni az ablak m<kdst biztost kdot. Mi is gy tesznk, s a felletet lpsenknt ptjk fel - ezeket a lpseket mutatjk be a kvetkez rszek.
1.9. bra
Amikor dupln kattintunk egy fels sarkba kenU
vezrlre
az eszkzkszletbert, a
vezrl az
ablaksablon bal
A Properties ablak segtsgvel lltsuk be az albbiaknak megfelelen a gomb tulajdonsgait. Ne feledjk, hogy ha a tulajdonsgokat bcsorrendben tekin~k meg, a Name tulajdonsg a lista elejn szerepel, teht ne a lista vge fel keressk, mert ezzel csak az idnket vesztegetjk
rtk btnSelectPicture
295, 10 (Megjegyzs: a 295 az x-koordinta, mg a l O%az y-koordinta) 85, 23
Size Text
Select Picture
Most egy olyan gombot fogunk ltrehozni, amelyre kattintva a felhasznl bezrhatja a Picture Viewer programot. Br gy is jabb gombot adhatnnk az ablakhoz, hogy ismt dupln kattintunk a Button vezrlre az eszkzkszletben, ezttal gy vesszk fel a gombot az ablakra, hogy lemsoljuk a mr meglev gombot. Ezzel a mdszerrel egyszeren kszthetnk olyan gombokat, amelyek megtartjk a lemsolt eredeti gomb mreteit s ms stlusjellemz6it. Ehhez kattintsunk az egr jobb gombjval a Select Picture (Kp kivlasztsa) gombunkra, s a helyi menb61 vlasszuk a Copy (Msols) menpontot. Ezt kveten kattintsunk szintn a jobb gombbal az ablak egy tetszleges helyre, s vlasszuk az ablak helyi menjnek Paste (Beilleszts) parancst. (A msolshoz s beillesztshez a Cnu.+C, illetve CTRL+V billentytkombincikat is hasznlhatjuk.) Az j gomb az ablak kzepre igaztva jelenik meg, alaprtelmezs szerint kijellt llapotban. Figyeljk meg, hogy az eredeti gombnak szinte minden tulajdonsgt megtartja, a nevt azonban nem. M6dostsuk az j gomb tulajdonsgait az albbiak szerint:
Tulajdonsg Name Location Text
rtk btnQuit
295' 4 o
Qui t
Az utols lthat elem, amelyet hozz kell adnunk az ablakhoz, egy PictureBox (kpmez) vezrl. A Pietureaox-nak szmos kpessge van, de az elsdleges szerepe az, hogy kpeket jelentsen meg - s mi pontosan ezt is fogjuk tenni a pldnkban. Adjunk teht egy PictureBox vezrl6t az ablakhoz, dupln kattintva a PictureBox elemre az eszkzkszletben, s lltsuk be a tulajdonsgait az albbiak szerint:
Miutn a fentiek szerint mdostottuk a tulajdonsgokat, az ablakunk gy fog festeni , mint az 1.10. brn lthat. Kattintsunk az eszkztr Save All gombjra, hogy mentsk az eddigi munknkat.
------------~~
;!.u:_~u~-~~:2~ x
UO.bra
Egy alkalmazs felletnek nem kell bonyolultnak lennie ahhoz, hogy hasznos legyen
a felhasznl futtatja az alkalmazst. Ugyanakkor nem minden vezrlnek van fizikai megjelense. Az ilyen vezrlket nem vizulis vezrlknek, vagy futsidben lthatatlan vezrlknek hvjuk, s nem arra szntk ket, hogy a felhasznl kzvetlenl kapcsolatba lpjen velk, hanem arra szolglnak, hogy a programoz a Visual C# szokvnyos lehetsgein fell tovbbi kpessgekkel ruhzhassa fel a programokat Ahhoz, hogy a felhasznl kivlaszthasson egy megjelentend kpet, lehetv kell tennnk neki, hogy megkeressen egy fjlt a merevlemezen. Bizonyra szrevettk, hogy amikor egy Windows-alkalmazsban meg szeretnnk nyitni egy fjlt, szinte mindig ugyanaz a prbeszdablak jelenik meg. Semmi rtelme a fejlesztket arra knyszerteni, hogy sajt kdot rjanak a szokvnyos fjlm11veletek vgrehajtshoz, ezrt a Microsoft ezeket a lehetsgeket egy kzs vezrln keresztl biztostja, amelyet felhasznlhatunk a projektjeinkben. Ez a fjlmegnyit vezrl az OpenFileDia log nvre hallgat, s sok-sok rnyi munkt takart meg neknk, amire egybknt sruksgnk lenne, ha utnozni szeretnnk ezt az ltalnos szolgltatst.
Az OpenFileDialog mellett ms vezrlk is lteznek, amelyek fjlmvel eteket tesznek lehetv. A saveFileDialog vezrl pldul arra ad lehetsget, hogy a felhasznl megadjon egy fjlnevet s elrsi utat egy fj l mentshez.
jelertsk meg most az eszkzkszletet, s (az eszkzkszlet als rszn tallhat, lefel mutat6 nyl segtsgveD grgessnk lefel addig, amg meg nem ltjuk az OpenFileDialog vezrlt (a Dialogs, vagyis Prbeszdablakok csoportban), majd kattintsunk r dupln, hogy az ablakhoz adjuk. Figyeljk meg, hogy a vezrl nem az ablaksablonra kerl, hanem az alatt jelenik meg (lsd az 1.11. brt). Ennek az az oka, hogy az OpenFileDia log vezrlnek nincs olyan fellete, amelyet megjelenthetne
az ablakon a felhasznl szmra. Termszetesen tartozik hozz egy fellet (egy prbeszdablak), amelyet szksg esetn megjelenthetnk, de a vezrl kzvetlenl az ablakon nem lthat.
1.11.bra
A fellettel nem
rendelkez vezrlk
teroezben
az ablaksablon alatt
jeknnek meg
A Hagyjuk resen szveget nem kell bernunk a fjlnv mezjbe; az utasts arra vonatkozik, hogy trljk az alaprtelmezett rtket, s hagyjuk resen a tulajdonsg rtkt
A Fil ter (szr) tulajdonsg a fjlmegnyit prbeszdablakban megjelen fjltpusok meghatrozsra szolgl, a szrt pedig a lers l szr formban kell megadnunk. Az els cs karakter eltt ll szveg a fjltpus lersa, mg az utna kvetkez szveg a fjlok szarsre hasznlt minta. Tbb tpust is megadhatunk; ilyenkor a lers l szr rtkeket egy jabb cs karakterrel kell elvlasztanunk egymstl. A Title (cm) tulajdonsgba rt szveg a fjlmegnyit prbeszdablak cmsorban fog megjelenni. A Picture Viewer program grafikus felletvel ezzel elksZitnk. Ha az eszkzksztetet nyitva tartottuk, most kattintsunk ismt a gombost ikonra a cmsorban, hogy bezrjuk.
20
de mire vgznk a knyvvel, mr vadul kattintgatni s kdoini fogunk, hogy az alkalmazsaink pontosan azt csinljk, amit szecetnnk (na j, legtbbszr). Most azonban elg, ha csak berjuk a kdot gy, ahogy itt ll.
1.12. bra
Mnden kdrsz letet egy ehhez hasonl ablakban fogunk megrn
Fontos, hogy kialaktsuk azt a szokst, hogy a kdot megjegyzsekkelltjuk el, ezrt az els utasts, amelyet be fogunk rni, egy megjegyzs lesz. Ha egy utastst kt perjellel kezdnk, akkor azt mondjuk, hogy egy megjegyzs kvetkezik. Az ilyen utastsokat a fordt figyelmen kvl hagyja, vagyis a kt perjel utn tetszleges szveget berhatunk rjuk be a kvetkez utastst pontosan gy, ahogy itt szerepel, s a sor vgn nyomjunk
ENTER-t:
l l A fjlmegnyit prbeszdablak megjelenitse
A kvetkez utastsunk az ablakhoz adott OpenFileDialog vezrl egy tagfggvnyt fogja elindtani. A tagfggvnyekrl mindent megtudunk majd a 3. rn; most elg annyit tudnunk, hogy a tagfggvnyek brjk r a vezrlket arra, hogy csinljanak valamit. A ShowDialog l) tagfggvny arra utastja a vezrlt, hogy jelentse meg az Open (Megnyits) prbeszdablakot, hogy a felhasznl kivlaszthasson egy fjlt. A ShowDialog () egy rtket is visszaad, amely jelzi, hogy a mvelet sikeres vagy sikertelen volt-e, amit aztn sszevetnk egy elre meghatrozott eredmnnyel (DialogResul t. OK). Ne tprengjnk tl sokat rajta, hogy mit is jelent mindez - minden rszletet meg fogunk tudni a ks6bbi rk sorn; ennek az rnak csupn annyit a clja, hogy benedvestsk a lbunkat, rnieltt elmerlnnk a mlyvzben. Dihjban teht annyi trtnik, hogy meghvjuk a ShowDialog () tagfggvnyt, hogy a felhasznl tallzssal kivlaszthasson egy fjlt, s
ha a felhasznl kivlasztott egy fjlt, egy jabb kdrszletet hajtunk vgre. Az OpenFileDia l og vezrlvel termszetesen nem csak annyit csinlhatunk, mint amit ebben az egyszer pldban bemutatunk, de az ignyeinknek most egy ilyen egyszer utasts is megfelel. rjuk be a kvetkez kt utastst, s mindkt sor vgn nyomjuk le az ENrER billentyt: if (ofdSelectPi cture . ShowDial og ()
(
== DialogResult. OK)
A kis- s nagybetk megklnbztetse fontos, mert a Visual C# betlls-rzkeny nyelv, ami azt jelenti, hogy a showDialog () utasts nem ugyanaz, mint a showdialog <l . Ha csak egyetlen bett is elfrunk, a Visual C# nem ismeri fel a szt, s a kdunk nem fog mkdni, ezrt mindig pontosan gy rjuk be a kdokat, ahogy a knyvben szerepelnek! A nyit kapcsos zrjel (a { karakter) azrt szksges a fenti i f (ha) utastshoz, mert ez jelzi, hogy az if szerkezet ezttal tbb sorbl fog llni. Ideje elhelyeznnk egy jabb megjegyzst. A kurzor pillanatnyilag az imnt bert { alatti sor elejn tartzkodik; rjuk be ide az albbi utastst, s ne felejtsk el, hogy a kdsor vgn le kell nyomnunk az ENTIR-t:
ll A kp betltse a
kpmezbe
picShowPicture.Image
= Image.FromFile(ofdSelectPicture.FileName);
meg fogja mutatni az ablak cunsorban. Amikor ltrehoztuk az ablakot, a Text tulajdonsgt a Properties ablakban mdostottuk. Ahhoz, hogy egy alkalmazs dinamikusan tudjon alkalmazkodni, a tulajdonsgokat futs kzben folyamatosan mdostanunk kell, s ezt kddal rjk el. Szrjuk be a kvetkez kt utastst (s minden sor vgn nyomjunk ENTER-t):
l l A fjl nevnek mutatsa az ablak eimsorban this.Tex t string.Concat("Picture Viewer(" + ofdSelectPicture.FileName + ")");
Az utols utasts, amelyet be kell rnunk, a zr kapcsos zrjel (vagyis a } karakter). Ha bertunk egy nyit kapcsos zr6jelet, minden esetben tartoznia kell hozz egy zr kapcsos zrjelnek is - a Visual C# gy csoportostja az utastsokat. Gpeljk be teht az utols karaktert:
}
szerkesztben
$ IN&ll.lc ViwrfODt()
l
l
lnlCla.U-=~Ui:
bat.Sel~ltctun:
pun'tt 'fOld
Clto.lr(oltjectc Cl')t.r,
ln~o
e)
ll !bOtt Che
U
Dulcqu'Ul"C.Oit)
c
ll Load ll
~he.
~a.SbCNPi.ctV%c. :t...a
now u.._
t t-lt
catJ.cm.
oi4Select.Pi.C'1;1lft.FU~
Ua~.rtn
tr.i.l:loq.CQII-cac.cte-t::-u:r~
Vtewll'l'C
"')~
Gola
1.13. bra
Gyzdjnk
meg rla, hogy az ltalunk befrt kd pontosan megegyezik az itt lthat kddal
Kattintsunk most erre a flre, hogy a kdablakrl az ablaktervezre vltsunk. Ha a flre kattintskor hibazenetet kapunk, a bert kd hibt tartalmaz, ezrt vissza kell trnnk hozz, s ki kell javitanunk, hogy pontosan megegyezzen az 1.13. brn lthat kddal. Miutn megjelent az ablaktervez, kattintsunk dupln a Quit gombra a Click esemnynek az elrshez. rjuk be a kvetkez kdot a Quit gomb Click esemnykezeljbe, s az egyes utastssorok utn nyomjuk le az ENTER billentyt:
l l Az ablak bezrsa this.Cloae();
~s
kilps az alkaLm4zsb61
A this. Close () ; utasts az aktv ablak bezrsra szolgl. Amint bezrjuk egy program utols betlttt ablakt, maga az alkalmazs is bezrdik, mgpedig teljesen. Ha nagyobb alkalmazst pitnk, a lelltsa eltt valsznleg clszeni mindenfle takart eljrst lefuttatnunk, de ebben a pldban csak annyit kell tennnk, hogy bezrjuk az ablakot.
A projekt futtatsa
A:z. alkalmazsunk ezzel kszen is ll. Kattintsunk az eszkztr Save All gombjra (tud-
juk, amelyiken egymsra pakolt lemezek lthatk), majd futtassuk a programot az FS billenty\I lenyomsval. A programot gy is elindthatjuk, hogy az eszkztron arra a gombra kattintunk, amelyik gy nz ki, mint egy jobbra mutat hromszg vagy a DVD-lejtszk Play (Lejtszs) gombja. (A gomb neve Start, vagyis Indts, s a De bug menben is megtallhat menpontknt.) A billenty\Iparancsokat mindazonltal rdemes megtanulni, mert a hasznlatuk felgyorstja a fejlesztst, ezrt alkalmazzuk ket, amikor csak lehet. Amikor a program elindul, a Visual C# fellete megvltozik, s az ltalunk tervezett ablak (lsd az 1.14. brt) megjelenik a fej lesztkrnyezet ablaka felett.
P "- .. . . . ". ..... * ... ,_ .:\ ."
~
--
--
e-~~~-~---- -
~-:g:- ) t - .
1.14. bra
Futtatsi mdban a programur~k pontosari gy mkdik, ahogy majd a felhasznlimi
A programot most gy futtatjuk, mintha nll alkalmazs lenne egy msik felhasznl szrntgpn, teht amit ltunk, az pontosan ugyanaz, mint amit a felhasznJk ltnnak, ha futtatnnk a programot (persze a httrben a Visual Studio 2008 fejlesztkr nyezet nlkl). Kattintsunk a Select Picture gombra a hasonl nevt prbeszdablak megjelentshez (lsd az 1.15. brt), s a prbeszdablak segtsgvel keressnk egy kpfjlt Ha talltunk egyet, kattintsunk r dupln, vagy kattintsunk r egyszer, hogy kijelljk, s vlasszuk az Open gombot. A kivlasztott kp ekkor megjelenik a kpmezben, ahogy az 1.16. bra is mutatja.
Amikor a Select Pictura gombra kattintunk, a mutatott alaprtelmezett elrsi t attl fgg, hogy a Windowsban mi volt az utols aktv elrsi t, ezrt a mi gpnkn eltrhet az 1.15. brn lthattl.
o..u..,
'l. ............. " ,_ a:.-. . .....
~o..v..-.
Iri""""""""''" .s.... . .
"""""
1.15. bra
A fjlok tallzsnak minden rszletro--z az OpenFileDialog vezrl gondoskodik. Ht nem nagyszer?
1.16. bra
l khetne szebb, mtnt egy 1964-es Fender Super Reverb erst?
Ha digitlis fnykpezgprl szrmaz kpet szeretnnk kivlasztani s megjelenteni, a kp valszinaleg JPEG formtum lesz, ezrt a Files of Type (Fjltfpus) lenyl6 listbl ezt a tfpust kell vlasztanunk. Ezenkvl ha a kp nagyon nagy mret, csak a bal fels sarkt fogjuk ltni (mert a kpmezbe csak az fr bele). A ksbbi rk sorn megtanuljuk majd, hogy miknt mretezhetjk t a kpeket, hogy belefrjenek egy kpmezbe, illetve mretezhetjk t az ablakot, hogy egy nagyobb kpet teljes mretben lssunk.
sszefoglals
Ha vgeztnk a jrszadozssal, kattintsunk a program Quit gombjra, hogy visszatrjnk a terveznzetbe. Ennyi az egsz! Az imnt elksztettnk egy valdi Visual C#-programot. Az eszkzkszlet segrsgvel felptettnk egy felletet, amelyen keresztl a felhasznJk mGveleteket vgezhetnek a programunkkal, s megrtuk a kulcsfontossg esemnykezelk kdjt, hogy a programunkat mkdsre brjuk. Ezek a lpsek jelentik az alkalmazsfejleszts alapjait a Visual C#-ban. Lnyegben ugyanezzel a megkzeltssel ptjk fel a legsszetettebb programokat is: elksztjk a felletet, majd kdot adunk hozz, hogy az alkalmazs feladatokat tudjon vgrehajtani. A dolog termszetesen akkor kezd bonyolultt vlni, amikor meg kell rnunk azt a kdot, ami pontosan azt csinlja, amit szerelnnk - de az ton megtettk az els lpst a helyes irnyba. Ha kzelebbrl szemgyre vesszk a knyv felptst, lthatjuk, hogy az els rkon a Visual C# (Visual Studio 2008) krnyezet mGkdst ismerjk meg, ezt kveten foglalkozunk a felletek felptsvel, s csak ez utn tanulunk meg rnindent a kdolsrl. Ez a rendszerezs szndkos. Bizonyra trelmetlenl vrjuk, hogy fejest ugorjunk a komolyabb kdok rsba, de a kdols csak az egyik rsze a folyamatnak - ne feledjk a Visual szt a Visual C# nevben. De ne aggdjunk - ahogy elre haladunk a knyvben, biztos alapokra helyezzk a programfejlesztsi kszsgeinket, s hamarosan mr nem fog rdekeini rninket, hogy mit csinlnak azok a titokzatos emberek a sznfalak mgtt, mert m magunk lesznk azok!
Krdezz-felelek
K: Ms tpus kpfjlokat is megjelenithetnk a BMP-n s a ]PG-n kvl? V: Igen. A PictureBox vezrl a kvetkez kiterjesztsa kpek megjelentst
tmogatja: BMP, JPG, ICO, EMF, WMF, GIF. A vezrl emellett az emltett fjltpusokba menteni is kpes a kpeket. K: Ms vezrlkben is megjelenthetnk kpeket? V: Ha csak kpeket szecetnnk megjelenteni, a PictureBox vezrlt clszeru hasznlnunk, de sok ms vezrl is lehetv teszi, hogy a vezrl rszeknt kpeket jelenrsnk meg; pldul egy gombon is elhelyezhetnk egy kpet, ha a gomb Image (kp) tulajdonsgt egy rvnyes kpfjira lltjuk
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmU6 krdsek
1. A Visual C# melyik projekttpusa hoz ltre egy szabvnyos Windows-programot? 2. A fejlesztkrnyezet melyik ablakban mdosthatjuk egy ablak vagy vezrl jellemzit (a helyt, a mrert, s gy tovbb)? 3. Hogyan rhetjk el egy vezrl alaprtelmezett esemnynek kdjt? 4. A kpmezknek melyik tulajdonsgt kell bellitanunk ahhoz, hogy megjelentsnk bennk egy kpet? 5. A Butto n (gomb) vezrlnek melyik az alaprtelmezett esemnye?
Vlaszok
1. 2. 3. 4. 5. A Windows Forms Application. A Properties ablakban. Kattintsunk dupln a vezrlre a tervez6ben. Az Image tulajdonsgot. A Click esemny.
Gyakortatok
1. Mdostsuk gy a Picture Viewer programot, hogy a felhasznl GIF fjlokat is megkereshessen s kivlaszthasson. (Tipp: mdostsuk az OpenFileDia l og vezrl Fi l t er tulajdonsgt.) 2. Hozzunk ltre egy j projektet egy ablakkal. Adjunk kt, egyms felett elhelyezked gombot az ablakhoz, majd vltoztassuk meg a helyzetket gy, hogy egyms mellett legyenek.
2.
RA
Navigls a Visual C# 2008-ban Projektek megnyitsa s ltrehozsa a Visual Studio 2008 kezdlapjnak segtsgvel A tervezablakok megjelentse, elrejtse, rgztse s lebegvttele Menk s eszkztrak testreszabsa Vezrlk hozzadsa az ablakokhoz az eszkzkszlet segtsgvel Objektumjellemzk megtekintse s mdostsa a Properties ablakban A projekteket alkot klnfle fjlok kezelse Segtsgkrs Ahhoz, hogy bvthessk az ismereteinket a Visual C#-rl, kulcsfontossg, hogy- a lehet leghamarabb - a lehet Jegotthonosabban rezZk magunkat a Visual C# tervez6krnyezetben. Ahogy az cs sem gondolkodik azon, hogyan verjen be egy szget egy deszkba, gy neknk is a vrnkk kell vljon, hogy miknt menthetnk egy projektet, hozhatunk ltre j ablakokat, illetve llthatjuk be az objektumok tulajdonsgait. Minl magabiztosabban bnunk a Visual C# eszkzeivel, annl jobban sszpontosthatunk arra, amit ezekkel az eszkzkkel ksztnk.
30
PCWoow-.. ~.._....,,.,.,,_, _ _ _ ~
....
,.~lt(OUf'lltodfttt
-.......
Fli,lt0.lf11Illll6(:13Gflo\Tlartttt..tah-=t_,..._~
_ _ _....,.._..c.,_
MIIOI.S .... twW.W.r~__......._, Ff\JIO.li71Uol!IJGWT S.. C'sMt~ . . IN ......... Sl'IICIII Shll-...-.,.usoc-._...,...,coa~CIIIIIIIIInmFtf eMet
NhUdOrft.-.forWadddiW~~~trtftenc...._ MW.
l4WII to
o--,""**..,..wrr
::!::=":::::~m.~~.::'c~"""'
---1'0"
howteout<)"OW
2.1. bra
A Start Page minden
j projektek ltrehozsa
A Start Page hrom kategrit tartalmaz. A Recent Projects (A legutbbi projektek) ablak a bal fels sarokban az j projektek ltrehozsra s a mr ltrehozott projektek megnyitsra szolgl. Ha j projektet szeretnnk ltrehozni, kattintsunk itt a Create: Project (Ltrehozs: Projekt) hivatkozsra. Ez a New Project (j projekt) prbeszdab-
2. ra
a Visual C# 2008-ban 31
lakot nyitja meg, amelyet a 2.2. brn lthatunk. Az in tallhat Tempiates (Sablonok) lista szmtgprl szmtgpre vltozik, attl fgg6en, hogy a Visual Studio .NET csald mely termkeit teleptettk. Termszetesen ebben a knyvben minket csak a Visual C# projekttpusok rdekelnek.
., ,,...,.
W-
CloKUM!y
~llt-'--ONNTo..
WPf-
Em,Jty Pojoct
Sl
.."
2.2. bra
Az j Visual C# projektele ltrehozsra a New Project prbeszdablakot hasznlhatjuk
,.._,.._. ---,j_..,...,",. _
~-;;._
..:'"': - ,
~ '~"'''""''''ff;;~~7.-i'='".-t~fr;:~;:;:~~s
A Visual C# segtsgvel sokfle projektet ltrehozhatunk, de a knyvben fknt a Windows Forms Application {Windows-ablakos alkalmazs) tpusra sszpontostunk, vagyis a leggyakoribb projekttpusra, amely egyben a Visual C# 2008 Express Edition elsdleges alkalmazstrpusa. A tbbi projekttpusrl is szt ejtnk majd, de amikor azt mondjuk, hogy hozzunk ltre egy j projektet, a Windows Forms Application ikont kell vlasztanunk, hacsak nem kapunk kifejezetten ms utastst.
Amikor j projektet hozunk ltre, ne felejtsnk el berni egy nevet a szmra a Name (Nv) szvegmez6be, rnieltt az OK gombra kattintannk, vagy dupln a megfelel sablon ikonjra. Ez biztostja, hogy a projekt a megfelel fjlnvvel s elrsi ton jjjn ltre, s ne kelljen ksoob kln foglalkoznunk ezeknek az rtkeknek a mdostsval. Miutn megadtunk egy nevet, az j projektet gy hozhatjuk ltre, hogy dupln kattintunk a ltrehozni kvnt projekt tpust jelkpez sablonikonra, vagy egyszer rkattintva kijelljk, majd az OK gombot vlasztjuk Ha e kt mOVelet valamelyikt vgrehajtottuk, a New Project prbeszdablak bezrul, s ltrejn a kivlasztott tpus j projekt. A projekt ltrehozsakor a projekt fjljai mg csak virtulis formban lteznek, hiszen nem mentettk azokat a merevlemezre. Amikor elszr kattintunk a Save (Ments) vagy a Save Ali (Mindent ment) gombra, meg kell adnunk egy elrsi utat a projekt szmra. A fejlesztkrnyezet alaprtelmezs szerint azt a nevet adja a projekt mappjnak, amelyet a projekthez rendeltnk, de az elrsi t attl fgg, hogy hol hoztuk ltre a legutbbi projektnket Ha egy fejlesztcsapat tagjaknt dolgozunk, a projektjeinket egy megosztott meghajtra rdemes mentennk, hogy a tbbiek is elrjk a forrsfjlokat
megltjuk majd, hogy gyakrabban nyitunk meg mr ltez projekteket, minthogy jakat hoznnk ltre. A Visual Studio kezdlapjrl lnyegben ktflekppen nyithatunk meg projekteket: Ha olyan projektrl van sz, amelyen nemrgiben dolgoztunk, a projekt neve megjelenik a Start Page Recent Projects ablakban, a bal fels sarokban (ahogy a Picture Viewer esetben is lttuk a 2.1. brn). Mivel a projekt neveknt az a nv jelenik meg, amelyet akkor adtunk neki, amikor ltrehoztuk, fontos, hogy a projektjeinknek kellen ler neveket adjunk. Ha egy projekt nevre kattintunk, azzal megnyitjuk a projektet- fogadni mernk r, hogy az esetek 95o/o-ban ezt a mdszert fogjuk alkalmazni. Ha egy projektet els alkalommal nyitunk meg (pldul amikor pldaprojekteket tekintnk meg), a Visual C# 2008 kezdlapjn az Open Project (Projekt megnyitsa) hivatkozsra kell kattintanunk. Ez egy szabvnyos prbeszdablakot jelent meg, amelyben megkereshetjk s kivlaszthatjuk a kvnt projektfjlt
Az j projektek ltrehozshoz hasonlan a meglev projekteket is brmikor megnyithatjuk a File, Open menponttal, nem csak akkor, amikor elindtjuk a Visual C# krnyezetet, de ne feledjk, hogy tla megnyitunk egy projektet, az ppen nyitva lev projekt bezrul. Amennyiben az aktv projekten mdostsokat hajtottunk vgre, ebben az esetben is lehetsget kapunk r, hogy mentsk a vltoztatsokat, mieltt a projekt bezrulna.
miknt igazthatjuk az ignyeinkhez a tervezkmyezetet, s segt, hogy knnyebben eligazcxljunk benne.) A kpernynknek valahogy gy kell festenie, mint ahogy a 2.3. brn lthat.
2.3. bra
A Vrsual C# teleptse utn lnyegben gy fest az egyestett fejksztk6rnyczet (IDE)
Lehet, hogy a sajt kpernynkn nem pontosan ugyanazt ltjuk, mint a 2.3. brn, csak valami nagyon hasonlt, de mire ennek az rnak a vgre rnk, kpesek lesznk gy megvltoztatni a tervezkrnyezet megjelenst, hogy pontosan megfeleljen az brnak - vagy brmilyen ms, ltalunk elnyben rszestett elrendezsnek.
A tervez6ablakok hasznlata
A tervezablakok - pldul a 2.3. brn is lthat Properties (Tulajdonsgok) ablak vagy a Solution Explorer (Megoldstallz) - biztos~k azokat a szolgltatsokat, amelyek segtik az sszetett alkalmazsok felptst. Ahogy azonban az asztalunkon sem pontosan ugyangy helyeznk el mindent, mint a munkatrsaink, a tervezkr nyezetnknek sem kell ugyanolyannak lennie, mint msok szmtgpn. A tervezablakokat ngy llapotba llthatjuk:
Bezrt - Az ablak nem lthat. Lebeg - Az ablak a fejlesztkrnyezet felett lebegve jelenik meg. Rgztett- Az ablak a fejlesztkrnyezet valamelyik szlhez tapad. Automatikus elrejts -Az ablak rgztett, de ha nem hasznljuk, elrejti nmagt.
,_,. ......
loeked
ll>ob"l F ..
o. o
Flbc
Tn~e
Mt~oMon.so.;p(nonc)
M.tmiuBcEB~umSim
0.0
2.4. bra
A
lebes ablakok
mes
2. ra
a Visual C# 2008-ban 35
A tervez6ablakok rgztse
A lthat ablakok alaprtelmezs szerint rgztve jelennek meg. A rgztett ("dokkolt") ablakok a munkaterlet vagy egy msik ablak oldalhoz, tetejhez vagy aljhoz kapcsoldnak; a Properties ablak a 2.3. brn pldul a tervez6krnyezet jobb szlhez tapad. (Vessk ssze ezt a 2.4. brval, ahol ugyanez az ablak lebeg.) Ha egy lebeg ablakot rgztett kvnunk tennni, hzzuk a cmsornl fogva a tervez6krnyezet azon szle fel, amelyikhez rgzteni szeretnnk. Ahogy hzzuk az ablakot, a kpernyn segdelemek jelennek meg (lsd a 2.5. brt). Ha az egrmutatt valamelyik segdikon fl visszk, a Visual C# egy kk ngyszget jelent meg ott, ahov az ablak kerlne, ha felengednnk az egrgombot. Egy ablakot gy rgzthetnk a leggyorsabban s legknnyebben. A kk ngyszg akkor is megjelenik, ha az ablakot a tervezkrnyezet valamelyik szlhez hzzuk, s a mutatott helyzetben rgzl. Ha ilyenkor felengedjk az egrgombot, rgztjk az ablakot. Elmagyarzni kicsit bonyolult, de vgrehajtani nagyon knny.
Egy rgztett ablakot gy mretezhetnk t, hogy a szlt a szemben lev oldal fel hzzuk. Ha ugyanahhoz az oldalhoz kt ablak is tapad, a kzttk lev szeglyt hzva az egyiket megnagyobbtjuk, mfg a msikat kisebbre vesszk.
Ahhoz, hogy a fentieket kiprbljuk, elbb lebegv kell tennnk egy rgztett ablakot. Ezt gy rjk el, hogy ablakot a cmsornl fogva levlasztjuk (.letpjk") a tervez6krnyezetnek acrl az oldalrl, amelyikhez tapad. Megjegyzend, hogy ez a mdszer nem mkdik, ha az ablakot automatikus eleejtsknt (Auto Hide) lltottuk be (hamarosan ezt az llapotot is elmagyarzzuk). Kvessk az albbi lpseket a rgzts s a levlaszts kiprblshoz: 1. Gondoskodjunk rla, hogy a Properties ablak lthat legyen. (Ha nem ltszik, jelentsk meg a View men Properties Window menpontja segtsgve!.) Kattintsunk az egr jobb gombjval a Properties ablak cmsorra, s ha a helyi menben az Auto Hide menpont be van kapcsolva, kapcsoljuk ki, hogy az ablak biztosan ne automatikus elrejtsli legyen. 2. A cmsort megragadva hzzuk el a Properties ablakot a tervezkrnyezetnek attl az oldaltl, amelyikhez tapad (vagyis hzzuk az ablakot balra), s ha levlt onnan, engedjk fel az egrgombot A Properties ablaknak most lebegnie kell. 3. Rgztsk jra az ablakot: ragadjuk meg ismt a msoct, s hzzuk a tervez krnyezet jobb szle fel. Amikor a segdek megjelennek, vigyk az egrmutatt az als ikon fl (lsd a 2.5. brt). Ekkor megjelenik a kk ngyszg, amely mutatja, hogy a Properties ablak hol fog rgzlni. Engedjk fel az egrgombot az ablak rgztshez.
2.5. bra
A segdikonokkal
egyszeren
rgzthetjk az ablakokat
Ha nem szeretnnk, hogy egy lebeg ablak rgzljn, brhov is hzzuk, akkor kattintsunk az egr jobb gombjval az ablak cmsorra, s kapcsoljuk be a Floating (Lebeg) lehetsget a helyi menben. Ha az ablakot ismt rgzthetv szeretnnk tenni, ismteljk meg ugyanezt a mveletet, de ezttal vlasszuk a Oockable (Rgzthet) menpontot.
2. 6ra
a Vtsual C# 2008-ban 37
men Auto Hide (Automatikus elrejts) pontjt. Ebbe az llapotba gy is tkapcsolhatjuk az ablakokat, ha a cmsorukon a bezr gomb mellett tallhat gombosur ikonra kattintunk.
Az eddig megismert mdszerekkel a legklnbzbb mdokon testreszabhatjuk a tervezkrnyezet
megjelenst. Nincs egyetlen idelis elrendezs: a klnbz projektekhez s fejlesztsi fzisokhoz ms-ms belltsok felelnek meg a legjobban. n pldul amikor egy ablak fellett tervezem, nha azt szeretem, ha az eszkzkszlet nyitva marad, de nem akadlyoz, ezrt lebegv teszem az ablakot, vagy kikapcsolom az automatikus elrejtst, s a tervezkrnyezet bal oldalhoz rgztem. Miutn azonban a felleti elemek tbbsgt felvettem az ablaksablonra, a kdra szecetnnk sszpontostani, ezrt rgztern az eszkzkszlelet (ha addig mg nem tettem meg), s automatikus elrejtsre lltom, hogy szksg esetn elrhessem, de ne zavarjon, ha nem kell hozznylnom. Nyugodtan ksrletezznk a tervezablakok elrendezsvel, s ne habozzunk vltoztatui rajta, hogy a krnyezetet az ignyeinkhez szabjuk.
Az eszkztrak hasznlata
Az eszkztrak szinte minden Windows-programban jelen vannak, s arra szolglnak, hogy gyorsan elvgezhessnk bizonyos feladatokat. (ValsznGleg a sajt programjainkban is szksgnk lesz eszkztrakra, ezrt a 9. rn azt is megtanuljuk majd, hogyan adhatjuk ket a projektjeink.hez.) Minden eszkztrhoz tartozik egy men, az eszkztrakon lev gombok pedig lnyegben parancsikonok a megfelel menelemekhez. Ahhoz, hogy a lehet leghatkonyabban tudjunk programokat fejleszteni a Visual C# 2008-ban, meg kell ismerkednnk a rendelkezsre ll eszkztrakkaL Ahogy aztn a tudsunk gyarapszik, az eszkztrakat testreszabhatjuk, st sajt eszkztrakat is ltrehozhatunk, hogy a krnyezet jobban illeszkedjen az ignyeinkhez.
Qt r,,.,t._
'li !Iti Out,..t
""''-*-
-w.r
b<W,l
2.6. bra
A munkaterletet az eszkztrak elrejtsvel s megjelentsvel
fs
szablyozhatjuk
2. 6ra .
a Visual C# 2008-ban 39
Egy lebeg eszkztrat, illetve brmilyen ms lebeg ablakot gyorsabban is rgzthetnk, ha dupln a cmsorra kattintunk.
A rgzlett eszkztrak mrete nem mdosthat, a lebeg eszkztrak azonban tmretezhetk (Inivel azok ugyangy viselkednek, mint a szokvnyos ablakok). Ha t szeretnnk mretezni egy lebeg eszkzlrat, vigyk az egrmutatt ahhoz az oldalhoz, amelyet ki szeretnnk nyjtani, majd fogjuk meg a kerett, s hzzuk a kvnt mretre.
2.7. bra
Az eszkzkszlet szmos hasznos vezrlt tartalmaz, amelyek segtsgvel hatkony felleteket
pthetnk
Ha amellett dntnk, hogy a vezrlket felrajzoljuk az ablakokra, melegen ajnlott az eszkzksztetet a tervezkrnyezet jobb szlhez vagy az aljhoz rgziteni, vagy lebegv tenni, mart a bal oldalol'l rgztett eszkzkszlet rszben eltakarja az ablaksablont, gy zavarhatja a rajzolst.
Az eszkzkszlet minden csoportjban a Pointer (Mutat) elem az els, ami valjban nem vezrl. Ha ezt az eszkzt vlasztjuk, a tervezkrnyezet kijell mdra vlt az j vezrlk ltrehozsra szolgl6 md helyett. Ha a mutatt vlasztottuk, s egy vezrlre kattintunk az ablaksablonon, a vezrl tulajdonsgait megtekinthetjk a Properties ablakban.
2. ra
a Visual C# 2008-ban 41
2.8. bra
Az ablakok s vezrlo'"k tulajdonsgait a Properties ablakban tekinthetjk meg s mdosthatjuk
Kvessk az albbi lpseket, hogy jobb an lssuk, hogyan makdik a tulajdonsgok belltsa: 1. Adjunk egy j szvegmezt az ablaksablonhoz, dupln kattintva a TextBox dernre az eszkzkszletben. Ennek az j szvegmeznek nhny tulajdonsgt fogjuk most mdostani. 2. Rkattintva vlasszuk ki a (Name) tulajdonsgot a Properties ablakban. (Ha a tulajdonsgokat bcsorrendben jelenitettk meg, a tulajdonsgot a lista elejn talljuk, nem az N betnl.) rjunk be egy nevet a szvegmez szmra; legyen a nv mondjuk t xtComments. 3. Kattintsunk a BorderStyle tulajdonsgra, s prbljuk berni a Big szt. Nem fog sikerulni, mert a BorderStyle tulajdonsg csak azokat a tulajdonsgrtkeket tmogatja, amelyeket egy listbl vlaszrunk ki (br azokat az rtkeket berhatjuk, amelyek megtallhatk a listban). Amikor a BorderStyle tulajdonsgot vlasztjuk, a lefel mutat nyl jelenik meg az rtkek oszlopban. Kattintsunk most erre a nylra, hogy megjelentsk azokat a tulajdonsgrtkeket, amelyeket a Border Style tulajdonsg elfogad. Vlasszuk a Fi xedSingle rtket, s figyeljk meg, hogyan vltozik a szvegmez kinzete. Ha a szvegmezt ismt trbeliv szeretnnk alaktani, nyissuk meg a lenyl listt, s vlasszuk a Fixed3D rtket. Ha Vista vagy XP rendszert hasznlunk, s a kpernyn a Windows XP tmt hasznljuk, a vezrlk nem trben jelennek meg, hanem sk elemekknt, vilgoskk kerettel. Nekem nagyon tetszik ez az j fellet, ezrt a knyv kpernykpeit is Vistn, a kpernytmk bekapcsalsval ksztettk el. 4. Vlasszuk a BackColor tulajdonsgot, rjuk be a guitar szt, s nyomjuk le a TAB billentyt, hogy vglegestsk a bert rtket. A Visual C# ekkor egy zenetben kzli, hogy a bert rtk n em rvnyes. Az zenet azrt jelenik meg, mert br tetszleges szveget berhatunk, a szerkeszt csak adott rtkeket fogad el. A BackColor esetben az rtknek egy sznnvnek vagy egy RGB (Red , Green, Blue, vagyis vrs, zld, kk) sznhrmast ler szmnak kell lennie. Ha a httrsznt pldul kkre szeretnnk lltani, a 0,0,255 (semmi vrs, semmi zld, a lehet legtbb kk) rtket hasznlhatjuk Trljk teht az imnt bert szveget, majd kattintsunk a BackCol or tulajdonsghoz tartoz lefel mutat nylra, s vlasszunk egy sznt a lenyl listbL (Az rn ksbb azt is megnzzk, hogyan vlaszthatunk sznt egy sznpalettrl, a sznek hasznllatt pedig a 18. rn mutatjuk be rszletesen .)
5. Vlasszuk a Font (Bettitpus) tulajdonsgot. szrevehetjk, hogy megjelenik egy kis gomb, rajta hrom ponttal. Ha erre a gombra kattintunk, a kijellt tulajdonsghoz tartoz prbeszdablak jelenik meg; ebben az esetben teht egy olyan prbeszdablak, amelyben a szvegmez bettpusra vonatkoz belltsokat adhatjuk meg Osd a 2.9. brt). A klnbz tulajdonsgok teht ms-ms prbeszdablakot jelentenek meg, ha a hozzjuk tartoz, hrom pontot brzol gombra kattintunk. Mdostsuk tetszs szerint a betbelltsokat, majd zrjuk be a prbeszdablakot
2.9. bra
A Font prbeszdablakban a
vezrlk
6. Grgessnk lefel a Size (Mret) tulajdonsgig, amely mellett egy pluszjelet lthatunk. Ez azt jelzi, hogy a tulajdonsg egy vagy tbb rsztulajdonsgbl ll. A pluszjelre kattintva bontsuk ki a tulajdonsgot, s ltha~uk, hogy a Si z e tulajdonsg a Width (Szlessg) s He ight (Magassg) rsztulajdonsgokbl ll. Egyszen1en megmondhatjuk, hogy egy adott tulajdonsg milyen tpus rtket vr; ehhez csak a tulajdonsgra kell kattintanunk a Properties ablakban.
A szfntulajdonsgok hasznlata
A szntulajdonsgok egyedi formtum rtkeket vrnak, de minden sznnel kapcsolatos
tulajdonsg ugyangy viselkedik. A Visual C#-ban a szneket egy szmhrmassal fejezzk ki, amelyben minden szm egy Os 255 kztti rtk lehet. A hrom szm a szn vrs, zld s kk (RGB- red, green blue) sszetevit jelkpezi, a 0,255,0 rtk pldul tiszta zld sznt, a 0,0,0 rtk fekett, mg a 255,255,255 fehret jelent. Egyes esetekben a sznek nevt is hasznlhatjuk (A sznek hasznlatrl rszletesebben a 18. rn tanulunk majd.)
HolTrock INc~
!:::IINctiveCoptlo
Dtnlo - lnloTewt
0Monu
- ~-~Teoct
Fi<rd3D
2.10. bra
A szinek lenyl listjban hromfile szncsoportbl vlaszthatunk
A SZnek lenyl listja hrom lapbl ll, amelyek a Custom (Egyni sznek), Web (Websznek) s System (Rendszersznek) nvre hallgatnak. A legtbb szntulajdonsg rtke alaprtelmezs szerint egy rendszers.zln. A rendszersznekrl rszletesen az 5. rn tanulunk, ezrt itt csak annyit emltnk meg, hogy a rendszersznek szmtgprl szmtgpre vltoznak, mert a felhasznl hatrozza meg ket, amikor az egr jobb gombjval az Asztalra kattint, s a helyi menbl a Properties menpontot vlasztja. Rendszersznt akkor hasznljunk, ha azt szeretnnk, hogy az adott elem szne a felhasznl ltal vlasztott rendszersznek kzl kerljn ki. Ha egy szntulajdonsg rtkeknt rendszersznt vlasztunk, a tulajdonsgablakban annak neve jelenik meg.
2.11. bra
A szfnek lenyl listjnak Custom lapja minden elkpzelhet szn megadst lehetv teszi
2. ra
a Visual C# 200S-ban 45
A 2.11. brn lthat Custom lap konkrt sznek megadsra szolgl, amelyek fggetlenek a felhasznl rendszerszn-bellitsaitl, teht a rendszersznek mdostsa nem lesz hatssal az adon tulajdonsgra. A Custom lap palettjn a leggyakra.bban hasznlatos sznek lthatk, de tetszleges sznt meghatrozhatunk
A klnbz palettkon lthat szinek szmt a videkrtya kpessgei korltozzk. Ha a videkrtynk nem tmogat elegend szm sznt, egyes sznek raszteres rnyalssal jelennek meg, vagyis nem valdi, egysges sznknt, hanem sznpttyk formjban. Az alkalmazsok fejlesztse kzben teht ne felejtsk el: ami jl nz ki a szmtgpnkn, az nem biztos, hogy ugyanolyan szp lesz a felhasznl kpernyjn is, ha annak lehetsgei korltozottak.
A Custom sznpalena als kt sora a sajt sznek kikeversre szolgl. Ha sznt szeretnnk rendelni egy res sznngyzethez, kattintsunk az egr jobb gombjval a kt sor valamelyik ngyzetre, hogy megnyissuk a Define Color (Szn meghatrozsa) prbeszdablakot Osd a 2.12. brt). A prbeszdablak vezrlinek segtsgvel hatrozzuk meg a kvnt sznt, majd kattintsunk az Add Color (Szn hozzadsa) gombra, hogy a sznt a sznpalena vlaszton sznngyzethez adjuk. A Visual C# ezenkvl automatikusan hozzrendeli az egyni sznt a kijellt tulajdonsghoz. A Web lapot a webalkalmazsokban hasznljuk, s a listja bngszbiztos sznek kivlasztsra szolgl. Ezeket a szneket persze akkor is hasznlhatjuk, ha nem webalkalmazst ksztnk.
2.12. bra
Egyni szneket a Define Color prbeszdablakban hatrozhatunk meg
Projektkezels
Mieln tnylegesen felpthetnnk egy felletet s kdot rhatnnk, meg kell rtennk, hogyan plnek fel a projektek a Visual C# 2008-ban, hogyan adhatunk hozzjuk sszetevket, s hogyan tvolthatunk el bellk egyes elemeket. Ebben a rszben megismerkednk a Solution Explorer (Megoldstallz) ablakkal, s megnzzk, hogyan hasznlliaLjuk a projektfjlok kezelsre, illetve megtanuljuk a projektek s a projektfjlok hasznlatr, belertve azt is, hogy miknt mdosthatjuk egy projekt tulajdonsgait.
Envir
+l.iiP.."...ti..
lll iJIFormt.a
$ 1i1Wmnas
l
Progr.m.cs
2.13. bra
A projekteket alkot fjlokat a Solution Explorer ablakban kezelhetjak
A Solution Explorer ablak mkdsnek jobb megrtse rdekben hajtsuk vgre a kvetkez lpseket: 1. Keressk meg a gyorstalpal tanfolyam sorn elksztett Picture Viewer programot a File, Open Project (F~, Projekt megnyitsa) menpont segtsgve!. 2. Nyissuk meg a Picture Viewer projektet. A fjl, amelyet ki kell jellnnk, a Picture Viewer mappban tallhat, amelyet a Visual C# a projekt ltrehozsakor hozott ltre. A fjlt az . sln (Visual C# Solution) kiterjesztsrl ismerhetjk fel. Ha a Visual C# megkrdezi, hogy menteni kvnjuk-e az aktv projektet, vlaszoljunk nemmel (No). 3. Jelljk ki a Picture Viewer projektet a Solution Explorerben. Ekkor egy gomb jelenik meg az ablak fels rszn, amelyen paprlapok lthatk, s az eszkzlersa a Show Ali Files (Minden fjl megjelentse) szveget tartalmazza (lsd a 2.14. brt). Kattintsunk erre a gombra, s a Solution Explorer a projekt sszes fjljt megjelenti.
[;;
lll Viowaform.a
"
~ V'~Form.Otsigner.a
~rfofm.roa
2.14. bra
A Solution Explorerben megfigyelhctjk, hogy az ltalunk ltrehozott ablak kt fjlbl ll
A Solution Explorer ablakban felsorolt objektumok brmelyikt megtekinthetjk az objektum alaprtelmezett nzetben, ha dupln kattintunk r. Minden objektumhoz tartozik alaprtelmezett nzet, de egy adott objektumnak tbb nzete is lehet. Az ablakokat pldul megnzhetjk ablaktervez (Form Design) nzetben s kdnzetben (Code) is. Ha dupln kattintunk egy ablakra a Solution Explorerben, az ablak alaprtelmezs szerint az ablaktervezben nylik meg, ahol az ablak fellett mdosthatjuk. Mr tanultunk egy mdszert arra, hogy elrjk a kdot, ami egy ablak htterben meghzdik: tudjuk, hogy ha dupln kattintunk egy objektumra, akkor az alaprtelmezett esemnykezeljhez kerlnk. Az ablakok kdjhoz azonban gyakran kell olyankor is hozzfrnnk, amikor nem j esemnykezelt vesziink fel. A kd elrsnek egyik mdja a Solution Explorer hasznlata. Amikor kijellnk egy ablakot a Solution Explorerben, elrhetv vlnak az ablak tetejn tallhat gombok, amelyekkel a kdszerkeszt s az ablaktervez kztt vlthatunk. A Solution Explorer ablakot olyan gyakran fogjuk hasznlni, hogy valsznO'leg rdemes a fejlesztkrnyezet egyik oldalhoz rgzteni, s automatikus elrejtsv tenni, vagy akr folyamatosan lthat llapotban a kpernyn tartani. A Solution Explorer ablakon keresztl rezhetnk r a legjobban a Visual C# mkdsre, s hamarabb hozzszokunk majd a hasznlathoz, mint hogy szrevennnk.
Megoldsok hasznlata
A Visual C#-ban projekteket hozunk ltre. A projekt s a program szt gyakran egyms szinonimiknt hasznljk, de ez nem jelenthet gondot, ha tisztban vagyunk nhny fontos klnbsggel. A projekt a programot vagy sszetevt alkot forrsfjlok gyjte mnye, mg a program az a binris fjl, amelyet akkor kapunk, amikor a forrsfjlokat lefordtjuk, pldul Windows rendszer vgrehajthat fjll (. exe). Egy projektben mindig tallunk egy f projektfjlt, de ezen kvl a projekt tetszleges szm fjlbl llhat, pldul ablakok s osztlymodulok fjljaibL A f projektfjl a projekt adatait trolja - pldul azt, hogy milyen fjlokbl ll a projekt-, illetve a projekt bizonyos meghatroz tulajdonsgait, pldul hogy milyen paramtereket kell hasznlni, amikor a projektet programm fordtjuk le.
2. ra
a Visual C# 2008-ban 49
De mi az a megolds (solution)? Ahogy a kpessgeink gyarapodnak, az alkalmazsaink pedig egyre sszetettebbekk vlnak, szrevehetjk, hogy a cljaink elrshez sokszor tbb egyttmkd projektet rdemes felptennk Elfordulhat pldul, hogy egy olyan egyni felhasznli vezrlt, pldul egy egyni adatrcsot ksztnk, amelyet ms, ltalunk tervezett projektekben is felhasznlunk, vagy egy sszetett alkalmazs zleti szablyait nll sszetevkbe klntjk el, hogy egymstl elszigetelt kiszolglkon futhassanak A:z ezeknek a cloknak az elrshez egyttesen felhasznlt projekteknek a halmazt hvjuk megoldsnak. A megolds teht (a legegyszerbben meghatrozva) nem ms, mint pusztn projektek egy csoportja. Arnikor mentnk egy projektet, a Visual C# alaprtelmezs szerint ltrehoz hozz egy megoldst is, amikor pedig megnyitunk egy megoldsfjlt, ahogy a fenti pldban is tettk, a megoldsban tallhat sszes projekt betltdik. Ha a megolds csak egyetlen projektet tartalmaz, a megnyitsa lnyegben ugyanazt eredmnyezi, mintha egy nll projektet nyitottunk volna meg.
A projekteket csak akkor rdemes egy megoldsba szerveznnk, ha azok kapcsoldnak egymshoz. Ha egyszerre tbb projekten dolgozunk, de azok nllak, tegyk mindegyiket kln-kln megoldsba.
A projektsszetevk szerepe
Ahogy korbban emltettk, egy projektben mindig tallunk egy f projektfjlt, valamint lehet benne egy vagy tbb msodiagos fjl, amelyek ablakokat vagy kdmodulokat ptenek fel. Amikor a projektben objektumokat hozunk ltre vagy mentnk, egy vagy tbb megfelel fjl jn ltre a merevlemezen. A Visual C# minden forrsobjektumnak fjlja a . c s kiterjesztst kapja; ez a kiterjeszts jelzi, hogy a fjl egy Visual C#-objektumot hatroz meg. Az objektumainkat mindig rtelmes nven mentsk, klnben a projekt mretnek nvekedsvel kosz alakulhat ki. A projekteket felpt valamennyi fjl szveges llomny, egyes objektumoknak azonban bizonyos informcikat binris forrnban kell trolniuk - ilyenek pldul az ablakok Backgroundimage (Httrkp) tulajdonsghoz rendelt kpek. A binris adatokat XML fjlok troljk (amelyek azonban tovbbra is szvegfjlok). Tegyk fel pldul, hogy van egy ablakunk, rajta egy ikonnaL Ebben az esetben az ablakot (az ablak mrett, a rajta tallhat vezrlket s az ablak mgtt meghzd kdot) egy szvegfjl rja le, amelyhez egy erforrsfjl kapcsoldik az ablak fjljnak nevvel megegyez nven, de . res x kiterjesztsset Ez a msodiagos fjl XML formtum, s minden olyan binris adatot tartalmaz, ami az ablak ltrehozshoz szksges.
Ha ltni szeretnnk, hogyan fest egy ablak forrsfjlja, nyissunk meg egyet a szmtgpnkn a Notepad (Jegyzettmb) segftsgvel. gyeljnk r azonban, hogy ne vltoztassunk meg benne semmit, klnben elfordulhat, hogy tbb nem fog mkdni (</a gonosz kacaj helye/>.
sszetevket
hasznlhatjuk:
tumkzpont alkalmazsok ksztst teszik lehetv. A knyv folyamn ugyan egy objektumkzpont nyelven tanulunk meg programozni, de elssorban a Visual C# beptett objektumait hasznljuk. A 16. rn trnk ki r, hogy rniknt hozhatunk ltre sajt objektumokat osztlymodulok segtsgveL Ablakok- Az ablakok (form) azok a lthat ablakelemek, amelyekbl az alkalmazsainak fellete felpl. Az ablakokat klnleges tpus osztlymodulok hatrozzk meg. Felhasznli vezr1k - A felhasznli vezrlk (korbbi nevkn ActiveX vezrl k, mg korbbi nevkn OLE vezrlk) olyan vezrlk, amelyeket ms projektek ablakain hasznlhatunk. Kszthetnk pldul olyan felhasznli vezrlt, amely egy kapcsolatkezel alkalmazs naptrnak felletl szolglhal. A felhasznli vezrlk ltrehozsa komoly programozi tapasztalatot ignyel, ezrt ebben a knyvben ezt a tmt nem trgyaljuk
A projekttulajdonsgok belirtsa
A. Visual C#-projekteknek ugyangy vannak tulajdonsgaik, mint minden ms objektumnak, pldul a vezrlknek A projektek szmos tulajdonsggal rendelkeznek, amelyek kzl jnhny olyan halad szolgltatsokhoz kapcsoldik, amelyekkel ebben a ktetben nem foglalkozunk. Ugyanakkor tisztban kelllennnk vele, hogy rnikm rhetjk el egy projekt tulajdonsgait, illetve hogy miknt mdosthatjuk a gyakrabban hasznlt tulajdonsgokat.
2.15. bra
A projekt tulajdonsgablakn keresztl a projekt egszt szablyozitatjuk
Ha el szeretnnk rni egy projekt tulajdonsgait, kattintsunk az egr jobb gombjval a projekt nevre (ez esetnkben a Picture Viewer) a Solution Explorer ablakban, s vlasszuk a helyi men Properties (Tulajdonsgok) pontjt, vagy kattintsunk dupln a projekt nevre a Solution Explorerben. Hajtsuk is vgre most valamelyik mveletet a kett kzl. A projekt tulajdonsgai fgglegesen egyms alatt elhelyezked flek formjban jelennek meg (lsd a 2.15. brt). Ahogy haladunk elre a knyvben, szksg szerint hivatkazunk majd a Project Properties (Projekt tulajdonsgai) ablakra, s az adott anyaggal sszefggsben trgyaljuk annak lapjait s elemeit. Nyugodtan bngszhetnk most a Picture Viewer tulajdonsgai kzn, de egyelre ne vltoztassunk meg semmit. A projekt tulajdonsgablakt a fejlesztkrnyezet megfelel flnek jobb fels sarkban tallhat kis X gombra kattintva zrhatjuk be, de azt is megtehetjk, hogy egyszeruen egy msik flre kattintunk.
2.16. bra
Hromflekppen adhatunk objektumokat egy projekthez- az egyik md.szer, hogy az objektumot ennek az eszk6ztrgombnak a len)111 listjbl vJasztjuk ki
-... ...
UNQIOSQL
c..,r,,...._
1.o<M
O~abtUJ
Apploaotlon
ti
a-..
....,l..eF.~o
Ap,.._
!il
-I r _ ._
,....
s.mc........ o-
Cocklio
..........
lettfift:
D<louggor
w ......
MOIP""" ,o,m
~r<..
~
r..
St!linglflt
URIC..-U..C.......
(WPF)
m ri
)(Mt,:.~
2.17. bra
A vlasztott menponttl fggetlenl ezen a prbeszdablakon keresztl brmilyen tpus objektumot a projekthez adhatunk
j ablakok s modulok hozzadsa a projekthez knny(i, s annyit vehetnk fel bellk, amennyit csak akarunk. Ahogy a projektjeink egyre sszetettebbekk vlnak, egyre gyakrabban fogunk a Solution Explorerre tmaszkodni az objektumok kezelse sorn. Br nem olyan gyakori mvelet, mint a p rojektfjlok hozzadsa, idnknt szksg lehet r, hogy egy objektumot eltvoltsunk egy projektbl. Az objektumok trlse mg a hozzadsuknl is egyszerlbb: kattintsunk az egr jobb gombjval az objektumra a Solution Explorer ablakban, s vlasszuk a Delete (Trls) parancsot. Ne feledjk, hogy ezzel nem csak az objektumot trljk a projektbl, hanem a forrsfjlt is a lemezrl.
Programozsi gyorstalpal
A programozs bonyolult. Minden olyannyira sszefgg mindennel, hogy nehz -ha nem lehetetlen -sorban egyms utn, egymstl fggetlenl bemutatni az egyes programozsi elveket. Egy tmakr trgyalsa sorn gyakran kell rinteni m:is, olyan tmkat is, amelyek mg nem kerlhettek szba. Mindent elkvettem, hogy elkerljem az ilyen elre mutat hivatkozsokat, de van nhny fogalom, amellyel legalbb nagy
2. ra
a Visual C# 2008-ban 53
vonalakban tisztban kell lennnk, enieltt tovbbhaladhatnnk Az rintett tmakrkrl a megfelel fejezetekben rszletesen tanulunk majd, de mieltt fejest ugorhatnnk a mlyvzbe, bizonyos dolgokat szba kell hoznunk.
Ez az utasts egy strFirstName nevti vltozt hoz ltre, amelynek a tpusa string, ami azt jelenti, hogy valamilyen szveget tartalmazhat. A vltozk tartalma tetszleges alkalommal mdosthat. A lnyeg, amire emlkeznnk kell, teht a kvetkez: a vltozk olyan trolk, amelyeket hasznlat eltt be kell vezetnnk, s adott tpus rtkeket trolnak
l l Ide jn az
eljrs kdja
return "James";
Ebben a kdban a string sz egy adattpus neve, s azt jelzi, hogy az eljrs egy karakterlncot (a James nevet), vagyis szveget ad vissza. Amennyiben egy eljrs valamilyen paramtert vr, azt zrjelben kell megadnunk, a kvetkez formban:
public string AuthorName(string BookNarne)
{
A MessageBox.Show() utasfts
A Windows zenetablakait bizonyra jl ismerjk - azokrl a kis prbeszdablakokrl van sz, amelyek valamilyen szveget jelenitenek meg a felhasznlnak (lsd a 2.18. brt). A Visual C# 2008-ban az ilyen zenetek megjelertshez egyetlen kdsor elegend: a MessageBox . Show () utasts. Az utasts a legegyszen1bb formjban gy fest:
MessageBox . Show("Ide jn a megj elentend6 szveg");
---
~... -:..-.i.-~-~
--J
2.18. bra
A Visual C#-ban nagyon k6nnyi ehhez hasonl egyszer zenetablakokat megjelenteni
zenetablakokat a knyvben tbbszr is hasznlni fogunk, rszletesen pedig a 17. rn beszlnk rluk.
Segtsgkrs
Br a Visual C#-ot gy terveztk, hogy egyszeren hasznlhat legyen, alkalmanknt segtsgre lehet szksgnk egy adott feladat elvgzshez. szintn szlva a Visual C# mkdse nem lthat t sztnsen - a hatkonysg s rugalmassg ra a program bonyolultsga. Nem szmt, mennyit tudunk, a Visual C# annyira sszetett, s oly sok szolgltatst nyjt, hogy nha muszj a Sghoz fordulnunk. Ez klnsen igaz, amikor Visual C# kdot runk, mert nem emlkezhetnk minden szksges parancsra vagy utastsformra. Szerencsre a Visual C#-ot rszletes sgvallttk el - mg ha a sg nem is annyira teljes, amennyire lehetne.
A tervezkrnyezetben a sgt az Fl billenty lenyomsval rhetjk el. Amikor lenyomjuk az Fl-et, a Visual C# sgja ltalban kzvetlenl az ppen vgrehajtott feladathoz
kapcsold sgtmakrre ugrik. Ezt a szolgltatst kc5rnyezetrzkeny sgnak vagy dinamikus sgnak hvjk, s amikor mkdik, akkor nagyon hasznos. A Visual C# utastsaihoz s kulcsszavaihoz (a fggvnyekhez, az objektumokhoz, a tagfgggvnyekhez, a tulajdonsgokhoz, s gy tovbb) pldul kivtel nlkl rendelkezsre ll ilyen sg, ezrt ha berjuk az adott szt a Visual C# kdba, s a kurzort valahov a sz belsejbe helyezzk (st akrasz els betje el vagy az utols betje utn), az Fl-et lenyomva megjelerthetjk a kapcsold sgtmakrt. A sgt ezen kvl a mensor Help (Sg) menjbl is elrhetjk.
A projekt futtatsakor nem a Visual C# sgja jelenik meg az F1 lenyomsra, hanem az alkalmazs - amennyiben ksztettnk hozz ilyet.
sszefoglals
Ezen az rn megtanultuk, hogyan hasznlhatjuk a Visual C# kezdlapjt (Start Page), amely a Visual C# 2008 kapuja. Lttuk, hogyan hozhatunk ltre j projekteket, illetve hogyan nyithatunk meg mr meglevket. Megtanultuk, hogyan mozoghatunk a Visual C# krnyezetben - a munkaterleten, az eszkzkszletben, s gy tovbb -, s hogy miknt hasznlhatjuk (jelenthetjk meg, rejthetjk el, rgzthetjk, illetve tehetjk lebegv) a tervezablakokat. A Visual C# szmos klnbz tervezablakkal rendelkezik, s ezen az rn nhnyat rszletesen is megvizsgltunk Megtanultuk, hogyan tekinthetnk meg s llthatunk be tulajdonsgokat a Properties ablakban, hogyan kezelhetnk projekteket a Solution Explorerben, s hogyan adhatunk vezrlket az ablakokhoz az eszkzkszlet segtsgveL Ezekre a mveletekre gyakran lesz szksgnk, ezrt fontos volt, hogy mr
Krdezz-felelek
K: l/ogyan tudhatunk meg t6bbet egyszeren egy tulajdonsgr/, ha a Properties
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. Milyen tpus projektet kellltrehoznunk a knyv pldinak felptshez
(hacsak nem kapunk ms utastst)? 2. Ha azt szeretnnk, hogy egy rgztett tervezablak megjelenjen, amikor az egrmutatt a fle fl visszk, s eltnjn , ha az egeret arrbb hzzuk, az ablak melyik belltst kell bekapcsolnunk? 3. Melyik tervezablakot hasznljuk arra, hogy vezrlket adjunk egy ablakhoz?
2. ra
a Visual C# 2008-ban 57
4. Melyik tervez6ablak szalgJ az objektumok jellemz6inek mdostsra? 5. Ha mdostani szeretnnk egy projekt tulajdonsgait, melyik tervez6ablakban kell kijellnnk a projektet? 6. Hogy hvjk azt a sgszolgltatst, amelyik a megjelenitett hivatkozsokat az ltalunk vgrehajtott mvelethez igaztja?
Vlaszok
Windows Forms Application. Az Auto Hide (Automatikus elrejts) belltst. Az eszkzkszletet. A Properties ablak. A Solution Explorer ablakban. 6. Krnyezetrzkeny vagy dinamikus sg. 1. 2. 3. 4. 5.
Gyakor1atok
1. A sznbellt prbeszdablak Custom lapjnak segtsgvel hatrozzunk meg egy egyni sznt, s rendeljk azt egy ablak BackColor tulajdonsghoz. 2. Hzzuk az eszkzksztetet az egyestett fejlesztkrnyezet jobb oldalra, rgztsk ott, s tegyk automatikus elrejtsv. Ha ezzel kszen vagyunk, tegyk vissza az eredeti helyre.
3.
RA
Objektumok s gyjtemnyek
A lecke tartalmbl:
Objektumok Tulajdonsgok kiolvassa s belltsa Tagfggvnyek indtsa A tagfggvnyek dinamikja Objektumkzpont kdols
Gyjtemnyek
A2 l. rn egy kpnzeget program felptsn keresztl ismerkedtnk a Visual C# nyelv programozssal, a 2. rn pedig az egyestett fejlesztkrnyezet (IDE) titkait frksztk, s elsajttottuk azokat a kszsgeket, amelyek kulcsfontossgak ahhoz, hogy sikerrel hasznlhassuk a Visual C#-ot. Ezen az rn egy fontos progamozsi fogalmat jrunk krl: az objektumokat. A programozsi rtelemben hasznlt objektum kifejezst nem biztos, hogy mr ismerjk, de ahogy egyre mlyebbre merlnk a Visual C# vilgban, egyre tbbet fogunk hallani objektumokrL A Visual C# 2008 az eldeivel ellenttben valdi objektumkzpont
Objektumok
Az objektumkzpont programozs mr j ideje npszer: akrhov nzi.ink - a Weben,
az informatikai sajtban s knyvekben-, mindenhol objektumokrl olvashatunk. De mi is pontosan az objektum? Nos, szigoran vve az objektum egy programozsi szerkezct, amely adatokat s mveleteket zr egyetlen egysgbe, s amelyhez csak az objektum felletei (tulajdonsgai, tagfggvnyei s esemnyei) nyjtanak nyilvnos hozzfrst. A valsgban persze mr nem ilyen egyszer megvlaszolni ezt a krdst, mert rengeteg fle objektum ltezik, s a szmuk szinte naprl napra n. Ugyanakkor minden objektumnak vannak kzs jellemzi, pldul tulajdonsgai s tagfggvnyei. A Visual C# leggyakrabban hasznlt objektumai az ablakok s a vezrlk. A korbbi rkon mr lttuk, hogyan hasznlhatjuk ezeket, st azt is bemutattuk, hogy miknt llthatjuk be a tulajdonsgaikat. Az l. rn elksztett Picture Viewer projektben pldul egy kpmezt ( PictureBox) s kt gombot (But ton) adtunk egy ablakhoz. Mind a Pi c tureBox, mind a Button vezrlobjektum, de annak kt klnbz tpust jelentik. Lssunk egy kevsb mszaki jelleg pldt is: a Kutya s a Macska egyrtelmen klnbz6 "egyed" (objektum), de mindkett besorolhat a Hzillat objektumok
3. ra
kategrijba. A szvegmezk s a gombok ugyangy nll objektumtpusok, de mindkett vezrlobjektumnak szmt. Jegyezzk meg ezt a kis klnbsget, mert fontos.
61
Tulajdonsgok
Minden objektumnak vannak jellemzi, amelyek segtsgvel meghatrozhatjuk vagy visszaadhatjuk az objektum llapott. Ezek a jellemzk a tulajdonsgok, s nmelyikket mr hasznltuk is a Properties (Tulajdonsgok) ablakban a korbbi rkon. Minden objektum adott tulajdonsghalmazzal br, de ezek a tulajdonsgok nem minden objektum esetben azonosak. Ezt szernlltetend folytassuk a hzillatok pldjt, s tegyk fel, hogy van egy Kutya objektumunk Ennek bizonyos tulajdonsgaival- pldul a kutya nevvel vagy a szrzet sznvel - minden kutya rendelkezik, de az emltett tulajdonsgok rtke nnden kutya esetben ms s ms. A Kutya objektumot s annak tulajdonsgait a 3.1. brn lthatjuk.
Kutya objektum
3.1. bra
A tulajdonsgok azok a jellemzk, amelyek lefrnak egy adott objektumot
Teht ha van pldul egy btnClickMe nev gomb objektumunk, gy hivatkozhatunk a gomb Te x t tulajdonsgra:
btnClickMe . Text
= btnClickMe.Text;
A vltozkkal a ll. rn foglalkozunk rszletesen; most elg annyit tudnunk, hogy a vltozk egyfajta trolk. Amikor a processzor vgrehajtja a fenti utastst, kiolvassa a gomb objektum Text tulajdonsgnak rtkt, s a s trText neV\! vltozha (trolba) rja. Ha feltessZk, hogy a gomb Text tulajdonsgban a "Click M e " szveg tallhat, a szmtgp gy dolgozza fel a fenti kdutastst:
strText = "Click Me" Ahogy a valsgban, gy a programozsban is rvnyes, hogy egyes tulajdonsgokat csak olvashatunk, de nem vltoztathatunk meg. Gondoljunk csak a kpzeletbeli hzillatunkra, s tegyk fel, hogy a Kutya objektumnemta Nem tulajdonsg jelli. A kutyt nem vltoztathatjuk fiblinny s fordtva (legalbbis normlis esetben), teht a Nem tulajdonsgot csak olvashatjuk, de nem mdosthatjuk. Az ilyen tulajdonsgokat hvjuk csak olvashat tulajdonsgoknak vagy rsvdett tulajdonsgoknak Gyakran tallkozunk majd olyan tulajdonsgokkal, amelyek tervezskor bellthatk, de a program futsakor csak olvashatv vlnak. A csak olvashat tulajdonsgok egyik pldja a kombinlt lista vezrl Height (Magassg) tulajdonsga. Ennek a tulajdonsgnak az rtkt megtekinthetjk a Properties ablakban, de egyltaln nem mdosthatjuk, brhogy is prbljuk Ha Visual C# kddal ksreljk meg megvltoztatni a Height tulajdonsgot, a Visual C# krnyezet egyszeruen visszalltja az rtket az alaprtelmezettre. (, azok a frnya kis mank!)
A leg egyszerbben gy llapthatjuk meg, hogy egy objektum mely tulajdonsgai frsvdettek, hogy megnzzk a krdses objektum sg6jt.
3. 6ra.
Kt gombot fogunk adni a kpnzeget programhoz: az egyik felnagyHja az ablakot, ha rkattinrunk, ng a msik cskkenti az ablak mrett. Ez egy egyszer plda, de jl szemllteti, hogyan mdostharunk objekrumtulajdonsgokat Visual C# kd segtsgve!. Kezdjk azzal, hogy megnyitjuk az l. ra Picture Viewer projektjt (a projektet vagy a megoldsfjlt). Ha a szerz webhelyr6lletlttt pldakdokkal dolgozunk, akkor az l. ra vgn kapott projektre lesz szksgnk. Amikor elindtjuk a programot, az ablak a Properties ablakban megadott szlessggel s magassggal jelenik meg. Kvessk az albbi lpseket, hogy az ablakhoz adjuk azokat a gombokat, amelyekre kattintva a felhasznl futs kzben felnagythatja vagy Jekicsinytheti az ablakot:
1. Kattintsunk dupln a ViewerForm. cs elemre a Solution Explorer ablakban,
63
hogy megjelentsk az ablaktervezt 2. Adjunk egy j gombot az ablakhoz, dupln kattintva a Button eszkzre az eszkzkszletben, s lltsuk be a rulajdonsgait az albbiak szerint:
Tulajdonsg
Name
Location
Size
Text
338, 261
21 , 23
3. Most kvetkezik a kicsinyt gomb. Kattintsunk ismt dupln a Button eszkzre az eszkzkszletben, hogy ltrehozzuk ezt a gombot is az ablakon. A gomb tulajdonsgai legyenek a kvetkezk:
Az ablaknak most gy kell kinznie, mint a 3.2. brn. A program teljess ttelhez rnunk kell nmi Visual C# kdot, ami az ablak Height s Width tulajdonsgainak mdostshoz szksges, amit akkor kell vgrehajtani, amikor a felhasznl valamelyik gombra kattint. 4. Kattintsunk dupln a " felirat nagyt gombra, hogy hozzfrjnk a kdjhoz, s rjuk be az albbi utastst pontosan gy, ahogy itt szerepel. Miutn berruk az utastst, ne nyomjuk Je az ENTER billentyt, s ne tegynk szkzt sem az utasts vgre.
this Width
3.2. bra
A gombok, akrcsak az ablak, amelyen e/helyezkednek, objektumok
Amint berjuk a pontot, egy kis lenyu lista jelenik meg, ami valahogy gy fest, mint a 3.3. brn lthat. A Visual C# elg okos ahhoz, hogy felismerje, hogy a this az aktulis ablakot jelenti (errl hamarosan bvebben is szlunk), s hogy segtsen az objektum kdjnak megrsban, egy listban megmutatja az ablak sszes tulajdonsgt s tagfggvnyt. Ennek a szolgltatsnak /ntel/iSense a neve. Amikor megjelenik az IntelliSense lenyl listja, a FEL s LE nylbillentyu'"kkel mozoghatunk a listban, s a TAB billentytvel vlaszthatjuk ki az ppen kijellt listaelemct gy nem fogjuk elirni a tagok nevt, ami cskkenti a fordtsi hibk eslyt. Mivel a Visual C# teljes mrtkben objektumkzpont, az IntelliSense lenyl listira gyakran fogunk tmaszkodni - jmagam inkbb vgnk ft, mintsem hogy nlklk programozzak
Pt"hu 't'Oi.cl b'UlQQic_C:Udi:(Objeet. e:octt.r, t:Ye-n.r<J' e) l /J Cloe ~~~ V1AdOV and UJ.t t::be' a.ppllc-4tl:.10ft thh.Cl-o .. ()J
3.3. bra
*'-J
''""""""""'
l!!!~~-=-_:__
0 11 __:;___:.:..__:__;_~....::...-....:::.:=---"-.::::o.w=---=--= :=::...__..:_..:...:._; I:.::...J NI
'v.-., '[1-. ~-
.. v~'"' v.w...
Az lntelliSense lenyt?
3. ra
5. A BACKSPACE billentyvel trljk teljes egszben az imnt bert kdot, s cserljk a kvetkezeSre (a sorok vgn ENrER-t nyomva):
this.Width this.Width + 20; this.Height = this.Height + 20;
Figyeljk meg, hogy a Visual C# utastsai mindig pontosvesszre vgzdnek. A pontosvessz ktelez, mert ebbl tudja a Visual C# fordtprogramja, hogy az utasts vgre rt.
Az elbb azt mondtuk, hogy a this arra az objektumra mutat, amelyikhez
mert a Visual C#-ban klnleges jelentssei br. Amikor egy ablakmodul belsejben runk kdot, ahogy most is tessZk, mindig a this-t rdemes hasznlnunk az ablak neve helyett, mert egyrszt jval rvidebb, mint az ablaknv, msrszt hordozhatbb teszi a kdot, hiszen a kdot gy lemsolhatjuk s beilleszthetjk egy msik ablakmodulba, anlkl, hogy meg kellene vltoztatnunk benne az ablak nevt, hogy a kd mkdjn. Ezenkvl, ha a jvben megvltoztatjuk az ablak nevt, nem kell mdostanunk az ablakra mutat hivatkozsokat Az imnt bert kd semmi mst nem csinl, mint hogy az ablak wid th s Height tulajdonsgait a jelenleginl 20 kpponttal nagyobb rtkre lltja. 6. A tervezablak tetejn lthat ViewerForm.cs[Designl felirat flre kattintva vltsunk vissza az ablaktervez6re, majd kattintsunk dupln a v felirat gombra, hogy elrjk a kicsinyt gomb eli ck esemnyt, s rjuk be az albbi kdot:
this.Width this.Height
= this.Width
=
pri.qve.
l
't'01d ln~~_CUek(obJ~
end&' tve..nu.:ro )
~
-ppl1c.atu:.n.
l
~h.t:t.tl14~
Cble.IU.cltb 20:
'
"J.d t#
lal 114:1thc. -
tltJ.. IUCk~
3.4. bra
Az ltalunk befrt
....
O.
Ez a kd hasonlt a btnEnlarge_Click esemny kdjra; a klnbsg csupn annyi, hogy ez 20 kpponttal cskkenti az ablak Wdth s Heght tulajdonsgainak rtkt A kpernyn most valami olyasmit kell ltnunk, mint a 3.4. brn.
A projekteken vgzett munka sorn clszer gyakran menteni. Ha egy csillagot ltunk egy fl feliratnak jobb szln, az azt jelenti, hogy a flhz tartoz lapon szerkesztett fjl megvltozott, de a vltozst mg nem mentettk. Mentsk most a projektnket az eszkztr Save Ali (Mindent ment) gombjra kattintva.
Jelentsk meg ismt az ablaktervezt a ViewerForm.cs[DesignJ flre kattintva, s tulajdonkppen kszen is llunk a tulajdonsgok mdostst szernlltet pldaprogram futtatsra. Kapcsoljunk futtat mdba az FS billenty lenyomsval, de mieltt kiprblnnk az j gombjainkat, kattintsunk a Select Picture (Kp kivlasztsa) gombra, s keressnk egy kpet a merevlemeznkn. Ha ez megvan, kattintsunk a " gombra nhnyszor, s figyeljk meg, ahogy az ablak mrete nvekszik (lsd a 3.5. brt).
~!:!...i~.:::.-~1-~l~~-:.._~~
., ~
3.5. bra
Azt kapjuk, amt ltunk- az ablakunknak pontosan gy kell megjelennie, ahogy megterveztak
Most kattintsunk a v gombra, hogy kisebbre vegyk az ablakot. Ha elegend alkalommal kattintottunk a gombokra ahhoz, hogy kielgtsk a kvncsisgunkat (vagy hogy elunjuk magunkat), zrjuk be a fut programot, s trjnk vissza tervez mdba az eszkztr Stop Debugging CHibakeress lellitsa) gombjvaL szrevettk, hogy a gombok s az ablakon megjelentett kp mrete nem vltozott, amikor tmrereztk az ablakot? A 6. rn megtanuljuk majd, hogyan rhetjk el, hogy az ablakok a tartalmukat is tmretezzk
3. ra
Tagfggvnyek
A tulajdonsgokon kvl a legtbb objektumnak tagfaggvnyei (metdusai) is vannak. A tagfggvnyek az objektumot ler jellemzkkel szemben olyan mveletek, amelyeket az adott objektum kpes vgrehajtani. A klnbsg szemlltetshez vegyk el ismt a hzillatos pldnkat. A Kutya objektumokhoz adott mvelethalmaz tartozik, mely mveleteket az objektum vgre tud hajtani. A kutyk esetben ezek a mveletek (a Visual C# nyelvben tagfggvnyek) az ugats, a farokcsvls s a sz6nyeg rgcslsa. A Kutya objektum tagfggvnyeit a 3.6. bra szemllteti.
Kutya objektum
3.6. bra
A tagfaggvnyeket meghfvva mveleteket hajtatunk vgre az objektummal
Ta~ggvnyekindftsa
A tagfggvnyeket fggvnyeknek tekinthe~k - hiszen valban azok. Amikor meglvunk egy tagfggvnyt, lefut a hozz tartoz kd. A tagfggvnyeknek adatokat is tadhatunk, s rtket adhatnak vissza, ugyanakkor sem a paramterek (a lv kd ltal tadott adatok) fogadsa, sem egy rtk visszaadsa nem ktelez a tagfggvnyekben - sok tagfggvny egyszeruen csak vgrehajt egy mveletet. A tagfggvnyek meghvsa hasonl formban trtnik, mint ahogy egy tulajdonsg rtkre hivatkozunk: ell ll az objektum neve, amit egy pont kvet, majd a tagfggvny neve kvetkezik:
{Objektumnv} . (Tagfggvny}
Ahhoz pldul, hogy kpzeletbeli, Bruno nev Kutya objektumunkat Visual C# kd segtsgvel ugatsra brjuk, az albbi kdsort kell bernunk:
Bruno.Ugat();
A Visual C#-ban minden tagfggvnyhvs vgre zrjelet kell tennnk. A zrjel lehet res is, de sokszor adatokat tartalmaz, amelyeket tadunk a tagfggvnynek.
tagfggvnyeket tmogat egy adott objektum, s hogy melyiket mikor kell hasznlni.
A tagfggvnyek dinamikja
A rulajdonsgok s a tagfggvnyek kz a kzben jrnak, ezrt elfordulhat, hogy egy adott tagfggvny egy vagy tbb tulajdonsg rtke mian nem rhet el. Ha a Bruno nev Kutya objektumunk LbakSzma tulajdonsgt pldul 0-ra lltjuk, a stl (} s a Visszahoz () tagfggvnyek nyilvnvalan alkalmazhatatlanokk vlnak. Ha viszont az emlten tulajdonsgot visszalltjuk 4-re, jra meghvhatjuk a kt tagfggvnyt
Minden projekt, amelyet eddig felptettnk, hasznlt objektumokat, de most egy olyan pldaprogramot fogunk elkszteni, amely kifejezetten az objektumok hasznlatt szemllteti. Ha korbban mg nem programoztunk objektumokkal, lehet, hogy nem lesz minden vilgos, de ne aggdjunk: lpsrllpsre fogunk haladni, s mindent rszletesen elmagyarzunk.
A Piet u re Viewer projektnket fogjuk mdostani, mgpedig gy, hogy hozzadunk egy gombot, amely kanintsra sznes keretet rajzol a kp kr.
ket.
kvetkez
tblzat szerint:
rtk
btnDrawBorder
295 , 69 85, 23
Draw Border
3. 6ra.
= null;
Itt egy vltozt hoztunk ltre, amely egy objektum egy pldnyt fogja trolni. Az objektumok nem csak gy elbukkannak a semmibl, hanem ltre kell hoznunk ket. Amikor egy ablakot betltnk a memriba, annak sszes vezrlje is betltdik (vagyis az ablak ltrehozza a vezrlobjektumait), de nem minden objektum jn ltre ilyen automatikus mdon. Az objektumok egy-egy pldnynak ltrehozst pldnyostsnak nevezzk, gy teht amikor betltnk egy ablakot, azt mondjuk, hogy pldnyostjuk az ablakobjektumot, az pedig pldnyosrja a vezrlobjektumait Az ablakbl egy msodik pldnyt is betlthetnnk, amely szintn pldnyostan az ablakot, s j pldnyokat hozna ltre a vezrlkb61 is, ekkor teht kl ablakunk s minden vezrl bl kt pldnyunk lenne a memriban. Kddal gy pldnyostunk egy objektumot, hogy ltrehozunk egy vltozt, amely egy hivatkozst trol a pldnyostott objektumra, s ezt a vltozt objektumknt kezeljk. A vltozt bevezet utasts, amelyet a 2. lpsben megadtunk, egy objGraphics neVI1 vltozt hoz ltre, amely egy Graphics tpus objektumra mutat hivatkozst trol (a tpus ll ell, s ezt kveti a vltoz neve). Most rjuk be a msodik kdsort, pontosan gy, ahogy itt ll:
objGraphics
= this.CreateGraphics();
A CreateGraphics () az ablak egyik tagfggvnye (emlkezznk vissza, hogy a this kulcssz az aktulis ablakra val hivatkozs rvid formja). A sznfalak mgtt a CreateGraphics () tagfggvny meglehetsen bonyolult, ezrt csak a 18. rn trgyaljuk rszletesen. Most elg annyit tudnunk, hogy a CreateGraphics (l egy olyan j objektumot pldnyost, amely az aktulis ablak gyflterlett - az ablak keret s cmsor nlkl rtett szrke terlett- jelkpezi. Minden, amit az objGraphics objektumra rajzolunk, megjelenik az ablakon. Itt annyit tettnk, hogy az objGraphics vltoznak egy a CreateGraphics () tagfggvny ltal visszaadott objektumot adtunk rtkL Vegyk szre, hogy a tulajdonsgok s a tagfggvnyek nem felttlenl hagyomnyos rtkeket (pldul szmot vagy szveget) adnak vissza; a visszaadott rtk egy objektum is lehet.
Ez az utasts trli az ablak httert, mgpedig azzal a sznnel, amelyet a felhasznl a Windows vezrlinek a szneknt megadott (a Windows ezzel a sznnel jelenti meg az ablakokat). Hogyan megy mindez vgbe? Miutn bevezettk az objGraphics objektumot, az ablak CreateGraphics (} tagfggvnyvel pldnyostottunk egy j grafikus objektumot az objGraphics vltozban, az imnt bert utastssal pedig meghvtuk az objGraphics objektum Clear () tagfggvnyt. A Clear () a Graphics objektumok kzs tagfggvnye, amely arra szolgl, hogy trljnk egy grafikus felletet. A Clear () tagfggvnynek egyetlen paramtert kell tadnunk: a fellet letrlshez hasznlni kvnt sznt. A paramternek tadott rtk kicsit furcsnak Unhet. Emlkezznk vissza, hogy a pont karakter arra szolgl, hogy az objektumokat elvlassza a tulajdonsgaiktl s tagfggvnyeiktl (a tulajdonsgokat, tagfggvnyeket s esemnyeket tagoknak is hvjk). Ennek alapjn kikvetkeztethetjk, hogy a Systemcolors egy objektum, mivel a pont utna ll. Az objektumhivatkozsok jnhny szintbl llhatnak, gy a kdjainkban sok-sok pontot kelllemunk. A lnyeg, amire emlkeznnk kell, a kvetkez: A ponttl balra tallhat szveg mindig egy objektumot (vagy nvteret) jell. A ponttl jobbra tallhat szveg egy tulajdonsghivatkozs vagy egy tagfggvnyhvs lehet. Ha a nevet zrjelek kvetik, tagfggvnyhvsrl, ha nem, nagy valsznsggel tulajdonsgrl van sz. A tagfggvnyek a tulajdonsgokhoz hasonlan visszaadhatnak objektumokat, ezrt egy kt pont kztt ll nvr61 csak gy dnthetjk el biztosan, hogy tulajdonsg vagy tagfggvny, hogy megnzzk az adott tag ikonjt az IntelliSense lenyl listban, vagy kikeressk a lerst az objektumhoz tartoz dokumentcibL A fenti utasts utols szava a Control. Mivel ezt nem kveti pont, tudhatjuk, hogy nem objektumrl van sz - vagyis tulajdonsgnak vagy tagfggvnynek kelllennie. Mivel a teljes objektumhivatkozstl azt vrjuk, hogy egy sznrtket adjon vissza, amelyet a grafikus objektum letrlshez hasznlhatunk, azt is tudjuk, hogy a control ebben az esetben olyan tulajdonsg vagy tagfggvny, amelyet rtket ad vissza (ezt a visszakapott rtket hasznljuk aztn arra, hogy belltsuk a Clear () tagfggvnyt). Ha gyorsan belepllantunk a dokumentciba, meggyz6dhetnk rla, hogy a Control valban tulajdonsg, de erre nincs is szksg -lthatjuk, hogy a vgn nem ll zrjel, teht nem lehettagfggvny, vagyis tulajdonsgnak kell lennie. A control rtke minclig annak a sznnek felel meg, amelyet a felhasznl szmtgpn az ablakok s gombok felleteknt belltottak. Ez alaprtelmezs szerint egy vilgosszrke szn (angolul gyakran "battleship gray" nven hivatkoznak r), de a felhasznJk tetszs szerint mdosthatjk.
3. ra
Azzal, hogy ezt a tulajdonsgot s nem konkrtan a "szrke" rtket hasznljuk a szn megadsra, biztostjuk, hogy a kdunk a szmtgpen hasznlt sznsmtl fggetlenl a megfelel rendszersznnel trlje le az ablakot. Most rjuk be a kvetkez utastst, s nyomjunk Ei'T'rnR-t nnden sor vgn. Emlkezznk vissza, hogy a Visual C#-ban a pontosvessz jelli az utastsok vgt, gy ez a hrom sor egyetlen utastsnak szrnt:
objGraphics. DrawRecta.n gle (Pena . Blue, picShowPicture.Left - l, picShowPicture.Top - l, picShowPicture.Width + l, picShowPicture.Height + l) ;
71
Ez az utasts egy ngyszgletes kk keretet rajzol az ablakon lev kp kr. Az utastsen bell egyetlen tagfggvnyhvst tallunk s t tulajdonsghivatkozst. Meg tudjuk mondani, melyik melyik? Az objGraphics (s egy pont) utn kzvetlenl a DrawRectangle sz ll. Mivel egyenh~sgjelet nem ltunk, kikvetkeztethetjk, hogy ez egy tagfggvnyhvs. Ahogy a Clear () esetben, itt is zrjeleket hasznlunk azoknak az rtkeknek a befoglalsra, amelyeket t akarunk adni a DrawRectangle () tagfggvnynek A DrawRectangle () tagfggvny a kvetkez paramtereket vrja, az itt feltntetett sorrendben: egy tollat, a bal fels sarok X rtkt, a bal fels sarok Y rtkt, a ngyszg szlessgt, s a ngyszg magassgt.
A DrawRectangle () tagfggvny a neki tadott x, Y, Wid th s Height rtkek alapjn egy tkletes ngyszget rajzol. A vonal jellernzit (a szmt, a vastagsgt, s gy tovbb) a Pen (Toll) paramterben tadott toll hatrozza meg. A tollakkal most nem foglalkozunk rszletesen; ezt a 18. rn tesszk meg. Ha jra megnzzk a pontokat, szrevehetjk, hogy a Pens (Tollak) objektum Blue (Kk) tulajdonsgt adjuk t. A Blue egy objektumtulajdonsg, amely egy elre meghatrozott Pen objektumot ad vissza, amelynek a vastagsga 1 kppont, s kk szn. A kvetkez kt paramterben tulajdonsgrtkeket adunk t: a kp bal fels sarknak (Top s Left) helyt, pontosabban abbl mindkt irnyban 1-et kivonva. Ha a pontos Top s Left rtkeket adnnk t, a program a ngyszget pontosan a PictureBox vezrl szeglyre rajzoln, s mivel a vezrlk alaprtelmezs szerint mindent eltakarnak, amit egy ablakra rajzolunk, a kk keretet nem ltnnk. Az utols kt tulajdonsghlvatkozs a PictureBox Height s Width tulajdonsgainak rtkhez ad 1-et, s ezeket az rtkeket adja t, hogy a ngyszg a PictureBox terletn kvlre kerljn.
objGraphics.Dispose{);
Az objektumok gyakran hasznlnak ms objektumokat s erforrsokat. A makdsk nem ppen egyszer, ezrt egy ilyen belp szint knyvben szinte lehetetlen rszletesen trgyalni; a lnyeg az, hogy a legtbb objektumot hasznlat utn kifejezetten meg kell semmistennk Ha egy objektumot nem semmistnk meg, a memriban marad, s tovbbra is hivatkozhat az ott tallhat ms objektumokra s erforrsokra, ami vgl ahhoz vezet, hogy az alkalmazs lassan (vagy inkbb gyorsan) felemszti a rend'izer memrijt s erforrsait. Ezt hvjk memriaszivrgsnak, ami az egyik olyan ltfontossg dolog a Windows-programozsban, amit hatrozottan el kell kerlnnk Az erforrsok hasznlatnak termszete, valamint az a tny, hogy mi felelnk azrt, hogy az objektumainkat felszltsuk, hogy takaritsanak ki maguk utn, szerencsre egyszerv teszi ezt. Ha az alkalmazsunk memriaszivrgst okoz, a felhasznlk nem vzvezetkszerelt hlvnak, hanem egyszeren fogjk a csavarkulcsot, s a fejnkre sznak vele. Azok az objektumok, amelyeket kifejezetten fel kell szltanunk, hogy takartsanak ki maguk utn, ltalban rendelkezsre bocstanak egy Dispos e (l nev tagfggvnyt Ha befejeztk egy ilyen objektum hasznlatt, hvjuk meg a Di spo se ()-t az objektuffi!".t, hogy gondoskodjunk a felhasznlt erforrasok felszabadtsrl. Lssuk most az sszes kdsort, hogy knyelmesebben ttek.inlhessk, hogy mit vgeztnk:
Graph ics obj Graphics = null; objGraphics = this .CreateGraphics(J; objGraphics . Clear(SystemColors . Control); objGraphics . DrawRectangle(Pens .Blue, p icShowPicture .Le ft l , picShowPicture.Top - l, picShowPicture.Width + l, picShowPicture.Height +l); objGraphics.Dispose() ;
Mieltt
3. ra
3.7. bra
Egyszer vonalakat
Ha a kk ngyszg kirajzolsa utn az ALT+ TAB billentykkel egy msik alkalmazsra vltunk, a keret eltnik, amikor visszavltunk a Picture Viewer ablakra. Ez minden olyan esetben bekvetkezik, amikor egy grafikt elfednk egy msik ablakkal, de a 18. rn megtanuljuk majd, hogy mi ennek az oka, s hogy miknt kerlhetjk meg
ezt a viselkedst.
lltsuk most le a projektet a Visual C# eszkztrnak Stop Debugging gombjval. Remnyeim szerint ebbl a pldbl nem csak annyit tanultunk, hogy mknt rajzolhatunk ngyszget (am persze klassz), hanem azt is megrtettk, hogy miknt hasznljuk az objektumokat a programozs sorn. Persze mint minden ms esetben, amikor tanulunk valamt, most is rvnyes, hogy "az ismtls a tuds anyja" - az ismtlsre pedig lesz is alkalmunk, mvel a knyvben nagyon sokszor fogunk objektumokkal dolgozni.
Gytljtemnyek
A gyjtemny nem ms, mint amit a neve sugall: objektumok gyl!jtemnye. A gyl!jtemnyek rvn egyszerGen kezelhetnk nagy szm hasonl objektumot, mert olyan kdot rhatunk, amely ismtld mveletek segtsgvel jrja be a gyjtemny elemeit. Az ismtldfeldolgozs sorn egy ciklust hasznlva tbb objektumon hajtunk vgre mveleteket, nem pedig kln kdot runk minden egyes objekrumhoz. Azon kvl, hogy a gyl!jtemnyek objektumok indexelt (sorszmozott) halmazr troljk, tulajdonsgaik is vannak, s tagfggvnyeket is tartalmazhatnak A gyjtemnyek felptst a 3.8. bra szemllteti. A hzillatos pldnkat folytatva gondoljuk vgig, hogy miknt nzhetneki egy llatok nev gyjtemny: lehetne benne egy vagy tbb Hzillat objektum, de lehetne res is (teht nem tartalmazna objektumokat). Minden gyjtemnynek van egy Count tulajdon-
Gyjternny
3.8. bra
A gyjtemnyek hasonl objektumok hatmazt troljk, s sajt tulajdonsgaik s tagfggvnyeik vannak
Hogy jobban megrtsk a gy\1jtemnyek mkdst, most egy olyan, kis mret\1 Visual
C# projektet fogunk ltrehozni, amely egy ablak Cont ro ls gyjtemnyn vgighaladva
kirja minden vezrl Name tulajdonsgnak az rtkt. A pldaprojekt ltrehozshoz kvessk az albbi lpseket:
1. Indtsuk el a Visual C#-ot (amennyiben mg nem tettk meg), s hozzunk ltre egy j Windows Application projektet Collections Example nven. 2. Nevezzk t a Forml . cs-t Collect ionsExampleForm . cs-re a Solution Explorer segtsgveL Ha a program megkrdezi, hogy szecetnnk-e minden kdhivatkozst frissteni, hogy az j nevet hasznljk, vlaszoljunk igennel (Yes). Ez utn lltsuk az ablak Text tulajdonsgt Collections Example-re (a tulajdonsgok megjelentshez kattintsunk egyszer az ablakra). 3. Kattintsunk dupln az eszkzkszlet Button elemre, hogy egy j gombot adjunk az ablakhoz, s lltsuk be a gomb tulajdonsgait a kvetkezk szerint:
Tulajdonsg Name Location Size Text
rtk btnShowNames
83' 112 120, 23
4.
Kvetkez lpsknt adjunk nhny szvegmez6t s tovbbi gombot az ablakhoz. Mikzben felvesszk a vezrlket az ablakra, rendeljnk mindegyikhez egyedi nevet. Tetsz6leges neveket adhatunk, de ne felejtsk el, hogy a vezrlk nevben nem lehetnek szkzk. Esetleg arra is szksg lehet, hogy egyes vezrlket arrb hzzunk az egrrel, hogy a vezrlk ne takarjk el egymst.
3. ra
5. Ha befejeztk a vezrlk felvtelt az ablakra, kattintsunk dupln a Show Control Names (Vezrlk nevnek megjelentse) gombra, hogy elrjk annak Click esemnyt, s rjuk be a kvetkez kdot:
for (int intindex
{
= O;
vezrlket
Minden ablaknak van Cont ro ls gyjtemnye, de az nem felttlenl tartalmaz Mg ha egyetlen vezrtt sem helyeztnk az ablakra, akkor is ltrejn a Controls gyjtemny.
Az els utasts (amelyik a for kulcsszval kezddik) tbb feladatot is elvgez. Elszr is a O kezd6rtket adja az intindex vltoznak, majd megvizsglja a vltoz rtkt, s elindt egy ciklust, amely egy utaststmbt hajt vgre. (A ciklusokrl a 14. rn beszlnk rszletesebben.) A ciklus sorn az intindex rtke mindig eggyel n, amg el nem ri az ablakon tallhat vezrlk szmamnusz egy rtket. Az intindex rtknek azrt kell kisebbnek lennie a Count tulajdonsg rtknl, mert amikor egy gyjtemny elemeire hivatkozunk, az els elem mindig a nulladik, ugyanis a gyjtemnyek elemeinek sorszmozsa O-tl indul. Az els elem teht a nulladik helyen ll, a msodik az els5n, s gy tovbb. Ha egy olyan rtkre prblnnk hivatkozni, amelynek a sorszma a count tulajdonsg rtke, hibt kapnnk, mert olyan sorszm elemet prblnnk elrni, amelynl a gyjtemnyben kevesebb elem tallhat. A MessageBox. Show (} tagfggvny (amellyel rszletesen a 17. rn foglalkozunk majd) a .NET-keretrendszer egyik osztlyhoz tartozik, amelyet arra hasznlhatunk, hogy megjelentsnk egy egyszerii szveges prbeszdablakot A MessageBox. Show () tagfggvnnyel megjelentett szveg, amelyet a zrjelben tadunk a tagfggvnynek, tbb karakterlnc sszefiJzsbl ll el. (Az sszefzs karakterlncok sszeadst jelenti, s a 12. rn trgyaljuk.)
[.,Pf
3.9. bra
A Controls gyjtemny segtsgvet egy ablak valamennyi vezrljt elrhetjak
Futtassuk most a projektet az F5 billentyti lenyomsval vagy az eszkztr Start gombjra kattintva. Hagyjuk figyelmen kvl az ablakra helyezett tbbi vezrlt, s kattintsunk a Show Control Names gombra. A programunk ekkor egy a 3.9. brn lthathoz hason-
3.10. bra
Az Object Browser lehetv teszi, hogy megtekintsk egy objektum sszes tulajdonsgt s
tagfggvnyt
Az Object Browser bal fels sarkban tallhat Browse (Tallzs itt) lenyl lista a tallzs hatkrnek meghatrozsra sz:olgl. A My Solution lehetsget vlasztva csak az aktv megoldsban hivatkozott objektumokat fogjuk ltni, de ha az sszes
3. ra
lehetsges objektumot ltni szeretnnk, vlaszthatjuk az All Components (Minden sszetev) lehetsget is. Ha a Browse lenyl lista jobb szln lev Object Browser Settings (Az objektumtallz belltsai) gomb lefel mutat nyilra kattintunk, testre is szabhatjuk az objektumhalmazt, de addig nem javasolt egyni belltsokat megadni, amg kell tapasztalatot nem szerznk a Visual C# objektumainak, illetve az objektumtallznak a hasznlatban.
Az Objects (Objektumok) fa legfelsszint csompontjaivagy gai(a fban minden elemet gy hvnak) programknyvtrak A programknyvtrak ltalban olyan DLL vagy EXE fjlok a szmtgpnkn, amelyek egy vagy tbb objektumot tartalmaznak. Ha ltni szeretnnk egy programknyvtr objektumait, egyszeren bontsuk ki a programknyvtr gt. Ha kijellnk egy objektumot a programknyvtron bell, az Objects ftl jobbr-.a tallhat listban megjelenik a kijellt objektum tagjainak a neve Osd a 3.10. brt). Ha ennl rszletesebb adatokat szeretnnk, kattintsunk egy tagr-.t a jobb oldali listban, s az Object Browser megjelenti a lnyeges informcikat az adott tagrl a kt lista alatt tallhat terleten.
sszefoglals
Ezen az rn sokat megtudrunk az objektumokrL Megtanultuk, hogy az objektumoknak tulajdonsgaik vannak, amelyek az objektumot ler jellemzk. Egyes tulajdonsgok tervezskor bellthatk a Properties ablakban, s a legtbb tulajdonsg mdosthat futsidben, Visual C# kd segtsgveL Megtanultuk, hogy ha egy tulajdonsgra egy egyenlsgjel bal oldaln hivatkozunk, akkor mdostjuk a tulajdonsgot, mg ha a jobb oldalon, akkor kiolvassuk a tulajdonsg rtkt A tulajdonsgok mellett az objektumok vgrehajthat fggvnyekkel, gynevezett tagfggvnyekkel is rendelkeznek. A tulajdonsgokhoz hasonlan a tagfggvnyekre is gy hivatkozunk, hogy pontot tesznk a nevk s az objektum neve kz. Egy objektumnak szmos tulajdonsga s tagfggvnye lehet, s egyes tulajdonsgok maguk is lehetnek objektumok. gy aztn meglehetsen hossz objektumhivatkozsokat is kaphatunk, de megtanul tuk, hogyan rtelmezhetjk ezeket "a pontokat kvetve".
Az objektumokat gyakran csoportostva, gyjtemny formjban hasznljuk. Megtanultuk, hogy ltalban a gyjtemnyeknek is vannak tulajdonsgaik s tagfggvnyeik, s a hason1 objektumok halrnazt egyszerilen bejrhatjuk, az r-.t vgn pedig megismerkedtnk az Object Browserrel, amelynek segtsgvel egy projekt objektumainak sszes tagjt megtekinthetjk Az ezen az rn elsajttott ismeretek Jtfontossgak ahhoz, hogy kpesek legynk
Visual C# nyelven programozni, rnivel minden felptett alkalmazs alapjt az objektumok s a gyjtemnyek jelentik. Ha megrtettk ezeknek a mkdst - amit biztosan
Krdezz-felelek
K:
Van valamilyen egyszer mdja annak, hogy informcikat szerezznk egy objektum tagjairl? V: Termszetesen. A Visual C# krnyezetrzkeny sgja nem csak a lthat objektumokra, hanem a kdelemekre is kiterjed. Ha egy objektumtaggal kapcsolatban szeretnnk segtsget krni, rjuk be a tagot tartalmaz kdutastst (nem kell teljes utastsnak lennie), helyezzk a kurzort a tag nevn bellre, s nyomjuk le az Fl billenty(lt. Pldul ha az int adattpusrl szecetnnk informcikhoz jutni, rjuk be, hogy int, helyezzk az int szba a kurzort, s nyomjuk le az Fl-et. K: A tulajdonsgokon s tagfggvnyeken kvl vannak msfajta objektumtagok
is? V: Igen. Az esemnyek is objektumtagok, br nem mindig kezelik ket gy. Az esemnyeket nem minden objektum tmogatja, de a legtbb objektumnak
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. Igaz vagy hamis? "A Visual C# 2008 valdi objektumkzpont nyelv." 2. Hogy hvjuk azokat a jellernz6ket, amelyek egy objektum llapott rjk le? 3. Ha mdostani szeretnnk egy tulajdonsg rtkr, az egyenlsgjel melyik oldaln kell hivatkoznunk r? 4. Hogy hvjuk azt a mGveletet, amelynek a sorn egy sablonbl j objektumot hozunk ltre? 5. Hogy hvjuk az objektumok kvlrl elrhet fggvnyeit (vagyis azokat a fggvnyeket, amelyeket az objektumot hasznl kd meghvhat)? 6. Igaz vagy hamis? "Egy objektum adott tulajdonsga maga is lehet objektum." 7. Hogy hvjuk a hasonl objektumok csoportjait? 8. Melyik eszkz segtsgvel tekinthetjk meg egy objektum tagjait?
3. ra
Vlaszok
1. Igaz. 2. Tulajdonsgoknak. 3. A bal oldalon. 4. Pldnyosts. 5. Tagfggvnyeknek. 6. Igaz.
7.
Gyjtemnyeknek.
Gyakariatok
1. Hozzunk ltre egy j projektet, s adjunk az ablakhoz kt szvegmez6t s egy
gombot. rjunk olyan kdot, amely az els szvegmezben tallhat szveget a msodik szvegmezbe helyezi, ha a gombra kattintunk. (Tipp: haszhljuk a TextBox vezrl6k Text tulajdonsgt.) 2. Mdostsuk az ezen az rn bemutatott gyjtemnyes pldaprogramot gy, hogy ne a vezrlk nevt, hanem a magassgukat ja ki.
4. RA
Esemnyek
A lecke tartalmbl: Az esemnyvezrelt programozs Esemnyek kivltsa Az nhv esemnyek elkerlse Az objektumok esemnyeinek elrse Esemnyparamterek hasznlata Esemnykezelk ltrehozsa Az esemnynevek frissen tartsa
A Visual C# beptett tervezeszkzeivel knny tetszets felletet kszteni egy alkalmazshoz: gynyn1 ablakokat llthatunk el, amelyeken gombok vannak, amelyekre kattinthatunk, szvegmezk, amelyekbe informcit rhatunk be, kpmezk, amelyek kpeket jelentenek meg, s mg sok ms kreatv s vonz elemmel llhatunk el, amellyel a felhasznlk kapcsolatba lphetnek. Egy VISual C#-program fejlesztsnek azonban rnindez csak a kezdete - a fellet megtervezsn kvl fel kell vrteznnk azzal a kpessggel is a programunkat, hogy rnind a felhasznl, rnind a Windows tevkenysgre vlaszolva mGveleteket tudjon vgrehajtani. Ezt esemnyek segtsgvel rjk el.
Az esemnyvezrelt programozs
A hagyomnyos programozsi nyelveken (amelyekre gyakran eljrskzpont nyelvekknt hivatkoznak) rt prograrnek maguk szabjk meg, hogy melyik kdrsz vgrehajtsra mikor kerl sor. Amikor elindtunk egy ilyen programot, elszr a program els kdsora fut le, majd a kd vgrehajtsa teljes mrtkben elre meghatrozott mdon folytatdik. A kd ugyan idnknt gakra vlhat szt, vagy ciklusokat indthat, de a vgrehajts menett teljesen a program hatrozza meg. Ez gyakran azzal jr, hogy az ilyen program csak korltozottan kpes a felhasznl ml1veleteire vlaszolni, pldul elvrhatja, hogy a kpernyn megjelen vezrlkbe adott sorrendben rjunk be szveget. Ez szges ellenttben ll a Wmdows-programok viselkedsvel, amelyekben a felhasznl a fellet klnbz elemeivellphet kapcsolatba- gyakran teljesen tetszleges sorrendben. A Visual C# az esemnyvezrelt programozsi modellre pl. Az esemnyvezrelt alkalmazsokat nem ktik gzsba az eljrskzpont prograrnek korltai, mert az eljrskzpont nyelvek fellrllefel halad megkzeltse helyett a kd logikailag sszetartoz rszeit esemnyekben fogjk ssze. Az esemnyek bekvetkeztnek nincs elre megszabott sorrendje; az esemnyvezrelt programokban a felhasznl adott esemnyek interaktiv elindtsval - pldul egy gombra kattintssal - gyakran teljesen maga szabhatja meg, hogy melyik kdrsz hajtdjon vgre. Az esemnyeket a hozzjuk tartoz kddal egytt esemnykezelknek vagy esemnyeljrsoknak hvjuk.
Esemnyek kivltsa
A 3. rn megtanultuk, hogy a tagfggvnyek nem msok, rnint az objektumok fggv-
nyei. Bizonyos rtelemben az esemnyek is egyfajta klnleges tagfggvnyek, amelyekkel egy objektum az llapotvltozsait jelezheti az gyfelek (az objektumot hasznl kdok) szmra. A Visual C# 2008 lersa valjban igen gyakran tagfggvnyekknt hivatkozik az esemnyekre (ami a kezd programozkat ktsgkvl sszezavarhatja). Az esemnyek teht olyan tagfggvnyek, amelyeknek a meghvsa klnleges mdon trtnik- ltalban egy ml1veleten keresztl, amelyet a felhasznl egy ablakon vgrehajt, vagy maga a Wmdows ltal -, nem pedig egy kdutastssaL
Az esemnyeknek szmos tpusa ltezik, s az elindtsuk (kivltsuk) is sokflekppen
trtnhet. Mr lttuk, hogyan vlthatja ki a felhasznl egy gomb esemnyt azzal, hogy a gombr-a kattint. Az esemnyek kivltsra azonban nem csak a felhasznli mveletek alkalmasak; esemny az albbi ngy mdon indthat el:
4. 6ra Esemnyek 83
A felhasznl valamilyen mveletet hajt vgre a programban. Ha egy gombra kattint, akkor pldul a gomb Click esemnyt vltja ki. SzDksg szelint az objektumok is kivlthatjk a sajt esemnyeiket A Timer (Idzt) vezrl pldul szablyos idkznknt elindthatja a sajt Timer esemnyt. Az opercis rendszer (a felhasznl ltal futtatott Windows-vltozaltl fggetlenl) szintn kivlthat esemnyeket. Meghvssal a programoz is elindthat esemnyeket, ugyangy, ahogy egy Visual C# kdban egy tagfggvnyt hv meg.
Minden ablak s szinte minden vezrl, amelyet egy ablakra helyezhetnk, az objektum tpusra jellemz esemnyhalmazzal rendelkezik. A Butt on (Gomb) vezrlnek pldul szmos esemnye van, kztk a Click (Kattints) esemny, amellyel a korbbi rkon mr tallkoztunk. Amikor a felhasznl egy gombra kattint, a gomb Cl i ck esemnye indul el, s vgrehajtdik a Click esemnyben tallhat kd. A TextBox (Szvegmez) vezrl, amely lehetv teszi, hogy a felhasznl adatokat vigyen be a billentyzet segtsgve!, szintn rendelkezik esemnyekkeL A TextBox egyes esemnytpusai megegyeznek a Button vezrl6vel, pldul ennek a vezrlnek is van Cl i ck esemnye, de a TextBox-hoz olyan esemnyek is tartoznak, amelyeket a Button vezrl nem tmogat; ilyen pldul a MultilineChanged esemny, amelyre akkor kerl sor, amikor a szvegmez Mult i line (Tbbsoros) tulajdonsga megvltozik Mivel a felhasznl nem rhat szveget egy Button vezrl6be, a gomboknak nincs Multiline tulajdonsguk, gy MultilineChanged esemnyk sem. Minden objektum, amely tmogatja az esemnyeket, egyedi esemnyhalmazzal br. Minden esemnytpusnak megvan a sajt viselkedse, ezrt lnyeges, hogy rtsk az esemnyeket, amelyeket hasznlunk. A TextChanged esemny viselkedst pldul a kezd fejlesztk nem biztos, hogy magtl rtetdnek talljk, mert ez az esemny rninden alkalommal elindul, amikor a szvegmez tartalma megvltozik. Kpzeljk el, mi trtnne, ha bernnk a kvetkez szveget egy ltalunk ltrehozott projekt egy res szvegmez6jbe:
Ozric Tentacles!
Knnyen azt hihetnnk, hogy a TextChanged esemny csak akkor indul el, amikor vglegestjk a bertakat, pldul elhagyjuk a szvegmezt, vagy lenyomjuk az ENTER-t, de ez az esemny nem gy mkdik. Ehelyett tizenhattszar kerl sor a TextChanged esemny bekvetkezsre, mikzben berjuk a fenti szveget, rnivel a szvegmez minden alkalommal megvltozik, amikor berunk egy j karaktert. Mg egyszer hangs-
vltja ki. Ezeknek az esemnyeknek gyakran a ltezsrl sem tudunk. Amikor egy ablakot pldul rszben vagy teljes egszben eltakar egy msik ablak, a programnak rteslnie kell rla, arnikor a fell lev ablakot tmretezik vagy thelyezik, hogy jrarajzolhassa a rejtett ablak terlett A Windows s a Visual C# ennek rdekben egyttm kdik: amikor az elfed ablakot thelyezik vagy tmretezik, a Windows az ablak jrarajzolsra utastja a Visual C#-ot, amelyet az meg is tesz, ezen kvl pedig kivltja az ablak Paint esemnyt. A Paint esemnyben elhelyezett kddal egyni megjelentst is meghatrozhatunk az ablak szmra, pldul alakzatokat rajzolhatunk r egy Graphics objektummaL Az egyni rajzolkdunk gy minden alkalommal vgrehajtdik, amikor az ablak jrarajzolja nmagt.
85
4.1. bra
Ha
nhv viselkedst nem csak egy esemny okozhat egy ciklusban. Pldul ha egy "A" esemny elindt egy "B" esemnyt, amely viszont ismt az "A" esemnyt vltja ki, a kt esemny egyttesen eredmnyez vgtelen ciklust. nhv viselkedst ezenkvl esemnyek lncolata is elidzhet, nem csak egy vagy kt esemny.
Az nhv eljrsoknak is lehet haszna, pldul amikor sszetett matematikai fggvnyeket runk. nhv esemnyeket gyakran hasznlnak pldul faktorilisszmtsra. Mindazonltal ha szndkosan hozunk ltre nhv esemnyt, gondoskodnunk kell rla, hogy az nhvs ne ismtldhessen vg nlkl.
Most egy olyan projektet fogunk megalkotni, amely segt, hogy rrezzUnk az esemnyek mkdsre. Indtsuk el a Visual C# 2008-at, hozzunk ltre egy j Windows Application projektet View Events nven, majd kvessk az albbi lpseket: 1. Kattintsunk az egr jobb gombjval a Forml. cs fjlnvre a Solution Explorerben, vlasszuk a Rename (tnevezs) parancsot, s mdostsuk az ablak nevt ViewEventsForm.cs-re. Ha a program rkrdez, hogy szecetnnk-e frissteni az sszes hivatkozst a kdban, ezttal is feleljnk igennel (Yes). 2. Kattintsunk egyszer az ablakra, hogy megjelentsk a tulajdonsgait, majd vltoztassuk a Text tulajdonsg rtkt View Events Example-re. 3. Az eszkzkszlet segtsgvel adjunk egy kpmezt az ablakhoz, s vltoztassuk a nevt picTes t-re. Mr tudjuk, hogy egy vezrl alaprtelmezett esemnyhez gy frhetnk hozz, ha dupln kattintunk a vezrlre az ablaktervezben. A vezrlk azonban gyakran esemnyek tucatjaival rendelkeznek. Az esemnyek listjt a Properties ablak Evems (Esemnyek) gombjra kattintva rhetjk el. (Az Events gomb az, amelyiken egy villm rajza lthat.) 4. Kattintsunk most az Events gombra a Properties ablakban, hogy megtekintsk a PictureBox vezrl ltal tmogatott esemnyek listjt (lsd a 4.2. brt).
4.2. bra
Az egyes vezrlk ltal tmogatott esemnyeket a Properties ablakban rhetjak el
87
5. Grgessnk lefel a listban a HouseDown esemnyig, s kanintsunk r dupln. Ezzel megnyitjuk a k6dszerkeszt6t, amely kszen ll r, hogy berjuk a HouseDown esemny kdjt (lsd a 4.3. brt).
Ui.Ot !"pedi.Dh:V1aQ:
1
l u.~.ncr Sya'ttndow.ror-.s:
!'OTlli
p.:rl.ne-e w.n4
,..... ...!ft-r.:.A't:qs e )
l
CMl
4.3. bra
Amikor elszr jel/jt1k ki egy objektum valameiyk esemnyt, a Visual C# egy res esemnyeljrst hoz ltre
Jelenleg a picTest objektum HouseDown esemnyt ltjuk. A kurzor a MouseDown esemnyeljrs belsejben tartzkodik, vrva, hogy b erjuk a kvnt kdot. A kurzor felett lthat kd az esemnyt bevezet> utasts, ms nven esemnydeklarci. Az esemnydeklarci olyan utasts, amely az adott esemny szerkezett hatrozza meg. Figyeljk meg, hogy az esemnydeklarci az objektum nevb!, egy alhzsjelbl U s az esemny nevbl ll, az esemny nevt pedig egy zrjelpr kveti. A zrjelek kztt ll elemek az esemnyparamterek, amelyekr61 hamarosan szt ejtnk. Az esemnyeljrsok bevezetsnek ez a szabvnyos szerkezete. Amikor dupln kattintunk egy esemnyre az Events listban, a Visual C# egy j esemnyeljrst hoz ltre az adott esemny szmra. A teljes esemnydeklarci s az esemny szerkezete gy fest:
private void picTest_MouseDown (objec t sender , MouseEventArgs e)
{
A kapcsos zrjelek az eljrs kezdett s vgt jellik; az eljrs teljes kdjnak e kt kapcsos zrjel kztt kell llnia. gyeljnk r, hogy ne trljk sem a nyit, sem a zr zrjelet!
s
MouseEventArgs e
A paramterek els eleme a paramterben trolt adat tpust jelzi, mg a msodik az adatot trol vltoz nevt. A MouseDown els paramtere, a Sender (Kld), egy ltalnos objektumot tartalmaz. Az objektumparamterek brmilyen tpus objektumok lehetnek, amelyeket a Visual C# tmogat. Mg nem muszj ismernnk az adattpusoka t; elg annyival tisztban lennnk, hogy a klnbz paramtervltozk klnbz tpus informcikat hordozhatnak Egyesekben szveget, msokban szmokat tallunk, megint msok pedig (igen gyakran) egy objektumot trolnak. A Sender paramter mindig egy hivatkozst tartalmaz, amely arra a vezrlre mutat, amelyik kivltotta az esemnyt. A MouseDown esemny e paramtere ezzel szemben az a hely, ahol a tnyleges mvelet vgbemegy. Az e paramter szintn egy objektumot trol, de ennek az objektumnak ouseDown a tpusa MouseEventArgs, s olyan tulajdonsgai vannak, amelyek a M esemnyhez kapcsoldnak. Ha ltni szecetnnk ezeket a tulajdonsgokat, rjuk be a kvetkez kdot, de a pont karakter bersa utn ne nyomjunk le semmilyen billentyt:
e.
Amint berjuk a pontot, egy lenyl lista jelenik meg, amely az e objektum tagjait (tulajdonsgait s tagfggvnyeit) mutatja (lsd a 4.4. brt). Az e objektum segtsgvel szmos dolgot megllapthatunk a MouseDown esemny bekvetkezsnek krlmnyeirl. Az rdekesebb informcikat a 4.1. tblzat sorolja fel.
89
Clicks
Tulajdonsg L ers Azt adja vissza, hogy a felhasznl hnyszor kattintott az egr gombjval. Azt adja vissza, hogy melyik egrgombot nyomtk le (left, mjddle s Button right, vagyis bal, kzps vagy jobb). Azt a vzszintes koordintt adja vissza, ahol az egrmutat tartzkodott, x amikor a felhasznl kattintott. y Azt a fggleges koordintt adja vissza, ahol az egrmutat tartzkodott, amikor a felhasznl kattintott.
Minden alkalommal, amikor egy esemny bekvetkezik, a Visual C# olyan rtket ad a paramtereknek, amelyek mindig az esemny adott bekvetkezsnek krlmnyeit tkrzik.
p:ub.l.lc l
l
P.t~.Ul
clu
'Vt~wi:Yemrom
: l'ol'B
p;a.ltJ.tc Y lClllib-ut.d'cu.()
p.xi . .'tt YO.id p1C'Jeft_ IICJU. .0owa ('bj ~tn ....:IH, Kuwtdon:;n'CNp .,
INS
4.4. bra
Az IntellSense lenyl listi szksgtelenn teszik, hogy objektumok szzatt jegyezzk meg
Minden esemnyhez sajtos paramterek tartoznak. A Te xtChange d esemny pldul ms paramtereket ad vissza, llnt a M ouseDown. Esemnyekkel nagyon gyakran fogunk dolgozni, gyhogy gyo rsan megtanuljuk majd az e gyes esemnytpusok paramte reit. Azt, hogy a sajt fggvnyeinkhez s eljrsainkhoz hogyan hozhatunk ltre paramtereket, a 10. rn tanuljuk.
Esemnykezel6 trlsa
Egy esemnykezel trlse nem csak annyibl ll, hogy trljk az esemnyeljrst Amikor j esemnykezelt adunk egy osztlyhoz, a Visual C# automatikusan ltrehozza szmunkra az esemnyeljrst, s a kurzort annak belsejbe helyezi, hogy berhassuk a kvnt kdot. A Visual C# ugyanakkor a "sznfalak mgtt" ennl kicsit tbbet is tesz, mert az esemnyeljrst a vezrlhz kell kapcsolnia. Ezt gy ri el, hogy az osztly rejten kdjban elhelyez egy kdutastst Ezzel az utastssal ltalban nem kell trd nnk, de amikor trlnk egy esemnyeljrst, a Visual C# a rejtett kdot nem trli automatikusan, ezrt a fordts meghisuL A hibt gy kszblhetjk ki a legegyszeruben, hogy futlatjuk a projektet, s amikor a Visual C# szembetallkozik a hibval, megmula~a a problmt okoz utastst, amelyet gy mr trlhetnk. Prbljuk is ki most:
1. Trljk az albb lthat teljes MouseDown eljrskdot (ehhez a kapcsos zrje-
e.
2. Futtassuk a projektet az FS billenty(i lenyomsval. Egy zenet fogunk kapni, miszerint fordtsi hiba lpett fel. Kattintsunk a No (Nem) gombra, hogy visszatrjnk a kdszerkeszthz.
'
pua.11c ViewC.anufoDICl
'
ln.itL&l:ueec.pon..ntc):
4.5. bra
A VISUal 01 az Error List ablakban megmutalja a fordtst (a kdunkban tallhat) hibkat
4. ra
3. Megjelenik az Error List (Hibalista) ablak, amely rszletezi az imnt bekvetkezelt hibt (lsd a 4.5. brt). Kattintsunk dupln a hibra, s a Visual C# a problmt okoz utastsra ugrik, amely gy fest (terjedelmi okok miatt kt sorra trdelve): this . picTest.MouseDown += new System .Windows . Forms .MouseEventHandler(this . picTest_MouseDown) ;
4. Vegyk szre, hogy az eljrsok bal fels sarokban tallhat lenyl listja
91
az Ini tiali zeComponent () elemet mutatja. Ez az ablak egyik esemnye (amint lthatjuk, baloldalt, az objektumok lenyl listjnak mezjben az ablak neve ll). Ne vltoztassunk meg semmit ebben az eljrsban, hacsak nem tudjuk pontosan, mit csinlunk! Mi most egy hivatkozst szeretnnk trlni, amely egy mr nem ltez esemnyeijrsra mutat, ezrt trljk a teljes utastst. A kdunkat most mr le lehet fordtani s futtatni. Amikor trlnk egy esemnyeljrst, mindig trlnnk kell az eljrst az objektumhoz kapcsol utastst, mieltt futtathatnnk a kdot.
Most, hogy mr tudjuk, hogyan kell trlni egy esemnykezel6t, lssuk a leggyorsabb s legknnyebb mdszert: tekintsk meg az objektumot terveznzetben, s kattintsunk a Properties ablak Events gombjra, hogy lssuk az objektum esemnyeit. Ezt kveten jelljk ki az esemny nevt a Properties ablakban, s nyomjuk le a DELETE billentyOt. Ez meghagyja az esemny kdjt az osztlyban, amg nem trljk, de hasznlaton kvl helyezi.
nthoz. A szvegcmkk (Label vezrl) statikus szveg megjelentsre valk, teht a felhasznJk nem rhatnak beljk szveget. Kvessk az albbi lpseket:
rtk
lblX 300, llO
X:
Location Text
3. Az eszkzkszlet segtsgvel adjunk mg egy szvegcmkt az ablakhoz. Ennek tulajdonsgrtkei legyenek a kvetkez6k:
Tulajdonsg
Name
rtk
lblY 300, 125 Y:
Location Text
Az ablakunknak most gy kell kinznie, mint a 4.6. brn. Clszer gyakran menteni a munknkat, ezrt most mentsk is a projektet az eszkztr Save Ali (Mindent ment) gombjra kattintva.
- ---- - ---
~-
.. ----
, ''
;;
~~
Esemnykezel6k ltrehozsa
4.6. bra
A Label vezrlkben statikus szveget jelenthetnk meg a Jelhasznlk szmra
Pldaprogramunk fellete ezzel kszen is van - most jn az izgalmas rsz. Ltrehozzuk azokat az esemnyeljrsokat, amelyek lehet6v teszik a programnak, hogy csinljon is valamit. Az els6 esemny, amellyel kezdennk kell valamit, a MouseMove. A kd elksztshez kvessk a kvetkez6 lpseket
-93
1. Kattintsunk az ablakra helyezett kpmezre, hogy kijelljk, majd kattintsunk a Properties ablak Events gombjra (arra, amelyiken egy villm lthat), hogy lssuk a kpmez ltal tmogatott esemnyek listjt. 2. Grgessnk lefel a listban, arrg meg nem talljuk a MouseMove esemnyt, s kattintsunk r dupln, hogy ltrehozzunk egy j MouseMove esemnykezelt Osd a 4.7. brt). 3. rjuk be az albbi kdot a MouseMove esemnyeljrsba:
lblX.Text lblY . Text "X: " + e . X.ToString(); "Y: " + e.Y.ToString();
4.7. bra
Minden alkalommal, amkor kije/6/unk egy j esemnyt, a VtSual C1F egy t"ires esemnyeljrst hoz ltre, amennyiben J...>orbban nem hoztunk ltre egyet a vezrl szmra
Ez a kd meglehetsen egyszer, s lehet, hogy mr rtjk is. Ha mg mindig nem lenne vilgos, hamarosan az lesz. Vegyk az els sort (vagyis az els utastst): az lblx . Text az egyenlsgjel bal oldaln ll, teht a Text a szvegcmke egy tulajdonsga, amelynek valamilyen rtket adunk. Az "X: "szveg egy literlis rtk, amelyet a Label vezrl Text tulajdonsgba helyeZnk. Erre azrt van sZksg, mert arnikor belltjuk a Text tulajdonsgot, teljesen fellrjuk annak jelenlegi rtkr. A Properties ablakban az x : rtket adtuk a tulajdonsgnak, ezrt a tulajdonsg belltsakor ezt is meg kell adnunk. A belltsnak persze csak akkor vesszk hasznt, ha az x pillanatnyi rtkt is kirjuk, amelyet az e objektum x tulajdonsga tartalmaz. Az "X: " litcrlis rtket sszefzzk az e . x-ben trolt rtkkel; a kt karakterlnc sszefzsre a + jel szolgl. Figyeljk meg az x tulajdonsg ToS t ring () tagfggvnynek hasznlatt: erre azrt van sZksg, mert a Visual C# csak szveget (karakterlncot) tud sszefzni, az x s az Y tulajdonsg azonban szmokat trol. A ToString () fggvny a szmok karakterlncc alaktsra szolgl.
jegyeznnk. Nem kell pldul memorizlnunk minden gombtpus visszatrsi rtkeit. (Egybknt is, ki akarna emlkezni olyasmikre, hogy e . x, e . Y vagy e . Bu t ton?) Csak annyit kell tudnunk, hogy az esemnnyel kapcsolatos informcikat az e paramter hordozza. Ha berjuk az e bett, majd egy pontot, megjelenik az lntelliSense lenyl listja, s megmutatja az e tagjait. Ne ijedjnk meg a knyv sorn felbukkan objektumllivatkozsoktl! Fogadjuk el, hogy lehetetlen valamennyit megjegyezni, s nincs is r szksg. A fontosakat meg fogjuk tanulni, ha pedig elakadnnk, a Sghoz is fordulhatunk. Ezenkvl ha egy adott esetben ismerjk a szl6objektumot (a pldnkban ez az e), knnyen meghatrozhatjuk a hozz tartoz objektumokat s tagokat az IntelliSense lenyl listinak segtsgve!. Kattintsunk most az eszkztr Save All gombjra a munknk mentshez (nyilvn nem szeretnnk elveszteni), majd az FS billenty lenyomsval futtassuk a projektet, s mozgassuk az egeret a kpmez felett. Lthatjuk, hogy az ltalunk ltrehozott kt szvegcrnkben megjelennek az egrmutat koordinti (a kpmezhz viszonytva; lsd a 4.8. brt).
X:l42
Y: IO
4.8. bra
A MouseMove esemny segtsgvel knnyen nyomon kvethetjak a mutat mozgst a vezrlk felett
Most mozgassuk az egrmutatt a kpmez terletn kvlre. Figyeljk meg, hogy a cmkk azt az utols koordintt mutatjk, amelyen a mutat a kpmez felett tartzouseM ove esemny ugyanis csak akkor indul el, ha az egeret az esemnyhez kodott, a M kapcsolt vezrl (esetnkben teht a kpmez) felett mozgatjuk. Az immr rtelmetlen szmokat viszont nem hagyhatjuk ott, nem igaz?
95
A PictureBox-nak trtnetesen van egy msik esemnye, amellyel kikszblhetjk ezt a problmt: a M ouseLeave . Klns mdon M ouseLeave esemnyre akkor kerl sor, ha az egrmutat elhagyja egy vezrl terlett (vgl is, ki lehetett tallni). Ahhoz, hogy trljk a koordintkat, amikor a mutat elhagyja a kpmezt, kvessk az albbi lpseket: 1. lltsuk le a projektet, ha mg mindig futna, a Picture Viewer ablak bezrsval. 2. Kattintsunk a ViewerForm.cs[Design] flre, hogy visszatrjnk az ablaktervezhz. 3. Kattintsunk a kpmeze>re (ha mg nem lenne kijellve), hogy megtekintsk az esemnyeit. Keressk meg a M ouseMov e esemnyt az esemnyek listjban, s kattintsunk r dupln, hogy ltrehozzunk egy j esemnyeljrst 4. rjuk be az albbi kdot a MauseLeave esemnybe:
lblX.Text lblY.Text
~
="
";
"1
Futtassuk jra a projektet az F5 billentyG lenyomsval, s vigyk az egrmutatt a kpmez fl, majd hzzuk el onnan - megfigyelhetjk, hogy a koordintk eltnnek. Mozgassuk jra a mutatt a kpmez fl, s ismt megjelennek- tkletes! Ha kigynyrkdtk magunkat, llitsuk le a fut projektet. Mr csak egy tennivalnk maradt. szrevettk, hogy amikor elindtjuk a programot, a cmkkben az X: s Y: szveg Lthat? Nem lenne jobb, ha ezek sem jelennnek meg addig, amg a felhasznl a kpmez fl nem viszi az egeret? Megtehetnnk, hogy a szvegcmkk Text tulajdonsgait resen hagyjuk a Properties ablakban, de ha gy tesznk, a tervezben nem fogjuk ltni a cmkket az ablakon, s vletlenl eltakarhatjuk ket ms vezrlkkeL Jobb megolds, ha akkor adunk nekik kezdrtket, amikor az ablak betltdik. Ezt a kvetkez m(iveletek elvgzsvel rhetjk el: 1. Kattintsunk ismt a ViewerForm.cs[Designl flre, hogy visszatrjnk az ablaktervezhz.
2. Kattintsunk az ablakra, hogy kijelljk s megtekinthessk az esemnyeit. 3. Az ablak esemnylistjban keressk meg a Load (Betlts) esemnyt, s kattintsunk r dupln egy j esemnykezel ltrehozshoz. A Load esemny automatikusan bekvetkezik, amikor az ablak betltdik, ami tkletes alkalom a Label vezrlk elksztshez. 4. rjuk be az albbi kt kdutastst:
lblX.Text lblY.Text " "1
= " ";
Ennyi az egsz. Az F5 billentyG lenyomsval futtassuk a projektet, s prbljuk ki a program mt!kdst. Amikor a program ablaka betltdik, a koordintacmkknek resnek kell lennik (vagyis lthatatlanok lesznek), de amikor az egeret a kpmez fl visszk, megjelennek, ha pedig elhagyjuk a kpmez terlett, ismt eltnnek. Ugye hogy mennyi mindent ellehet rni egy kis kddal s a megfelel esemnyekkel?
sszefoglals
Ezen az rn az esemnyvezrelt programozsrl tanultunk: megtudtuk, mik azok az esemnyek, hogyan lehet elindtani ket, s hogyan kerlhetjk el az nhv esemnyeket. Ezenkvl lttuk, hogyan rhetjk el egy objektum esemnyeit, s hogyan hasznlhatjuk az esemnyparamtereket. Programjaink kdjnak nagy rsze valamilyen esemny hatsra fog lefutni, s gyakran elfordul majd az is, hogy egy vezrl tbb esemnyhez is kdot kell rnunk. Ha megrtettk, hogyan m01<dnek az esemnyek, s tisztban vagyunk vele, hogy milyen esemnyek s esemnyparamterek llnak a rendelkezsnkre, kpesek lesznk olyan sszetett Visual C#-programokat rni, amelyek szmos felhasznli s rendszermveletre vlaszolni tudnak.
Krdezz-felelek
K: Lehet egyni esemnyeket ltrehozni egy objektumhoz?
objektumokrl a 16. rn tanulunk) s a meglev objektumokhoz is. Az egyni esemnyek ltrehozsa azonban tlmutat knyvnk keretein. K: A fe/a/ette/ nem rendelkez objektumok is tmogathatnak esemnyeket? V: Igen, de ha egy ilyen objektum esemnyeit szeretnnk hasznlni, az objektumvltozt klnleges mdon kell bellitanunk, klnben az esemnyek nem lesznek hozzfrhetk. A milvelet nem egyszeru, ezrt az ismertetse meghaladja ennek a knyvnek a kereteit.
Ismtts
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. Nevezznk meg hrom dolgot, ami esemnyt vlthat ki!
2. Igaz vagy hamis? "Minden objektum ugyanazt az esemnyhalmazt tmogatja." 3. Mi a gombok alaprtelmezett esemnytpusa? 4. Hogy hvjk azt, amikor egy esemnyhez olyan kdot runk, amely ugyanazt az esemnyt vltja ki, s gy lncreakciszerilen jra s jra elindtja az esemnyt? 5. Mi a legegyszerubb mdja annak, hogy elrjk egy vezrl alaprtelmezett
esemnykezeljt?
6. Minden vezrlesemny egy hivatkozst- ad t az esemnyt kivlt vezrlnek. Mi a neve annak a paramtemek, amelyik ezt a hivatkozst tartalmazza?
Vlaszok
1. 2. 3. 4. 5. 6. Felhasznli m\1velet, rendszerbemenet, egyb kd. Hamis. A Click, vagyis a kattints. nlvs. Kattintsunk dupln a vezrlre az ablaktervezben. Sender, vagyis kld.
Gyakorlatok
1. Az eddig megszerzett tudsunkra alapozva hozzunk ltre egy j projektet, amelynek az ablaka tervezskor szrke, de futtatskor kk sznnel jelenik meg. 2. Hozzunk ltre egy projektet, amelyben egy ablak s egy szvegmez tallhat. rjunk olyan kdot a TextChanged esemnyhez, amely nhvst eredmnyez, ha a felhasznl szveget r be. (Tipp: fzznk egy karaktert a felhasznl ltal bert karakterlnc vghez egy az albbihoz hasonl utastssal:
txtMyTextBox.Text
= txtMyTextBox .Text
"a";
A pluszjel arra utastja a Visual C#-ot, hogy egy a berut fUzzn a szvegmez tartalmhoz. Figyeljk meg, hogy vgl StackOverFlow hibazenetet kapunkami sohasem j jel.)
ll.
RSZ
5. RA
Ablakok ksztse - az alapok
A lecke tartalmbl:
Az. ablakok nevnek megvltoztatsa
Az ablakok megjelensnek mdostsa Szveg megjelentse az ablakok cmsorban Kpek elhelyezse az ablakok htterben Ikonok hozzrendelse az ablakokhoz Az ablakok megjelensnek megakadlyozsa a Tlcn Az ablakok kezdhelynek meghatrozsa Az ablakok megjelentse norml, teljes kperny6s, illetve kicsinytett llapotban Az egrmutat alakjnak mdostsa Az ablakok elrejtse s megjelemtse
Az ablaksablonok - nhny kivtelt61 eltekintve - alapvet szerepet kapnak a Windowsalkalmazsfelletek mllkdsben. Maga az ablaksablon (form, res ablak) lnyegben ugyanaz, rnint az ablak (window) - a kt elnevezst gyakran egyms szinonimjaknt is hasznljk. Ha azonban pontosan szeretnnk fogalmazni, az ablak azt az egysget jelenti, amelyet a felhasznl a kpernyn lt, s amellyel kapcsolatba lp, mg az ablaksablon
5. ra Ablakok kS2ftsa - az
5.1. bra
Minden j ablak res "vszonknt" kezdi
Az ablaksablon nevt a ksbbiekben brmikor megvltoztathatjuk a Properties (Tulajdonsgok) ablak (Name) tulajdonsga rvn, amely az ablaksablon name tulajdonsgt mdostja, a megfelel fjlnevet azonban nem. Ahol csak lehet, trekedjnk arra, hogy mr ltrehozskor vgleges nevet adjunk az ablaksablonjainknak.
pes megjelenteni. Jelen pillanatban minden valszm1sg szelint az ablaksablon fjljnak mutatja (amelyek lerjk a lemezen tallhat fizikai fjlt; lsd az 5.2. brt). Amennyiben gy ll a helyzet, kattintsunk a tervezablakban az ablaksablonra, gy megjelennek a fejlesztsi tulajdonsgai. Ha teht magra az ablaksablonra kattintunk, a fejlesztsi tulajdonsgokhoz jutunk, mg ha a nevre a Solution Explorerben, akkor az ablaksablont trol fizikai fjl jellemzit kapjuk meg. Ez az oka annak, hogy az ablak tulajdonsgainak belltst megelzen tbbnyire arra krjk az olvast, hogy kattintson az ablaksablonra.
jellemzit
Sznjunk egy kis idt az ablaksablon tulajdonsgainak tanulmnyozsra a Properties ablakban. A kvetkezkben bemutatjuk, miknt hasznlhatjuk nhnyukat az ablak megjelensnek alaktsra.
5.2. bra
A fjltulajdonsgok hasznosak lehetnek, de nem sokat segtenek az ablak megjelensnek szablyozsban
A program neve - Ez a legalkalmasabb vlaszts, ha az ablak a program f- vagy egyedli ablaka. Az ablak meghatrozsnl az els rn ezt a lehetsget vlasztottuk. Az ablak rendeltetse-Mind kzl taln ez a leggyakoribb cmsortpus. gy, ha az ablak a nyomtat Itivlasztsra szolgl, a Text tulajdonsgnak rdemes a Nyomtat kivlasztsa rtket adnunk. Az ablak neve - Amennyiben gy dn tnk, hogy magt az ablak nevt jelentjk meg a cmsorban, hasznljuk a htkznapi elnevezst, ne pedig a kdban szereplt. gy, ha az ablakunkra a LoginForm (bejelentkezsi ablak) nven hivatkozunk, a cmsorban jobb, ha a Login (Bejelentkezs) vagy a Login User (Felhasznl bejelentkezse) felirat ll.
Az ablak Text tulajdonsgnak rtke legyen Picture Viewer Options. Az eredmnyt
Az ablakok legtbb tulajdonsghoz hasonlan a Text rtkt is brmikor megvltoztathatjuk a Visual C# kdban.
5. ra Ablakok kszftse - az
A kvetkezkben kkre vltoztatjuk az ablakunk hnrszmt. Ehhez elszr trljk a Properties ablakban a BackColor tulajdonsg Con t rol rtkt, rjuk a helybe a 0,0,255 kdot, majd a vglegestshez nyomjuk le az ENrER vagy a TAB billenty11t.
.~
A rendszersznekrl
bvebben a
....,._,..o_ .......-...lll
~ ~TNt-
~-
.. -
5.4. bra
A szntulajdonsgok mindegyike rendelkezik palettval, szint
amelyrl
kivlaszthaljuk a kvnt
A lenyu lista megjelensekor lthatjuk, hogy a rendszer kivlasztotta a kk sznt a Web lapon. Ezt ismt annak ksznhetjk, hogy a 0,0,255 RGB-rtk megfelel egy nvvel rendelkez szinnek, s a Visual C# meg is tallja ezt. A sznpalettkrl mr szltunk a 2. rn, gy in nem foglalkozunk velk rszletesebben. Most mindenesetre vltsunk a System (Rendszer) lapra, s on vlasszuk a rendelkezsre ll rendszersznek kzl a Control nevezett, visszalltva az ablak BackColor tulajdonsgt az alaprtelmezett rtkre.
5. ra Ablakok ksztse - az
1. 2. 3. 4.
A kijellshez kattintsunk az ablaksablonra. Adjuk az ablak Size (Mret) tulajdonsgnak a 400,300 rtket. Kattintsunk a Properties ablakban a Backgroundimage tulajdonsgra. Kattintsunk a tulajdonsg mellett tallhat Build (Felpts) gombra (apr gomb hrom ponttal). 5. Ekkor a Select Resource (Erforrs kivlasztsa) prbeszdabiakba jutunk (5.5. bra). Itt jelljk be a Local Resource (Helyi erforrs) vlasztgombot 6. Nyomjuk meg az Import (Betlts) gombot, s keressk meg az Options . bmp fjlt, amelyet a pldafjlok kztt megtallhatunk a szerz webhelyn. 7. Ekkor visszajutunk a Select Resource prbeszdablakba. Kattintsunk az OK gombra, gy betltjk a kpet, amely mris megjelenik az ablak htterben (5.6. bra).
5.5. bra
A merevlemezen tallhat kpek helyi erforrsnak minslnek
5.6. bra
Az ablakok a kpmezkh6z hasonlan kpeket is megjelenthetnek
Gr-<l~ Aub>Vt~t
Enlbld'~"!!"
BockColor
e
Hor-.mcoo!won IB
l'hy>o<~on
or-rol
Os,.t~ 95.9865951
41l0. 300 FO<YM!IIbpplndm!d
Bmp
41l0.JOO
9~.!M659Sl
~llj<>UI
Tilo
(nGM)
Trv
(nono)
Trv
OtftU~
5.7. bra
A rsztulajdonsgok a kp jellemziro1 rulkodnak
A httrtpek szfnestik a felletet, de elfordulhat az is, hogy a zsfoltsg rzett keltik a felhasznlban. Kvetkezskppen nem rdemes ton-tflen lni ezzel a lehetsggel - csak akkor tegyk, ha a kp valban javt az sszhatson.
A httrkpek eltvoltsa ppolyan egyszeru, mint a beillesztsk. Az elzekben beillesztett httrkp eltvoltshoz kattintsunk az egr jobb gombjval a Backgroundimage tulajdonsg nevre, s vlasszuk a megjelen helyi men Reset (Visszallts) pontjt. Nyugodtan prbljuk ki ezt a mveletet, de rnieltt tovbblpnnk, tltsk be ismt a httrkpet
Fontos, hogy a tulajdonsg Name oszlopra vagy a Build gombra kattintsunk a jobb gombbal, ha ugyanis a Value (rtk) oszlopra, vagyis a tulajdonsg rtkre kattintunk, ms helyi ment kapunk, amelyben nem szerepel a Reset pont.
5. ra Ablakok kszftse - az
a Backgroundirnage tulajdonsg rtkL Tegyk is ezt meg az ablakunkkal- kattintsunk a Properties ablakban az Icon tulajdonsgra, majd a mellette megjelen Build gombra, s vlasszunk egy ikont a merevlemezrl (legyen az, amelyet az l. rn hasznltunk). Amint ez megtrtnt, az ikon megjelenik az ablak cmsornak bal szln.
gombok szerepeinek
Minimize (Kis mret) Maximize (Teljes mret) Close (Bezrs) Fontos szrevennnk, hogy az ablak ikonja is gombknt viselkedik, jllehet csak az alkalmazs futsa kzben - tervezskor nem. Amennyiben a felhasznl az ikonra kattint, egy leny ment kap nhny egyszenllehetsggel. A Minimize s Maximize gombok lehetv teszik, hogy a felhasznl egyetlen kattintssal elrejtse, vagy teljes kpernyss nagytsa az ablakot- de ezzel nyilvn magunk is tisztban vagyunk. Az rmteli meglepets abban ll, hogy egyetlen sornyi kdot sem
110
5.8. bra
Magunk hatrozhatjuk meg, hogy melyeket jelentjk meg e hrom gomb kzl
Ha azt sem szeretnnk, hogy az ablakot a Close gombbal (az X-et brzol gomb jobbra fent) be lehessen zrni, a controlBox tulajdonsgnak is a False rtket kell adnunk. Fontos tudnunk, hogy ha ezt megtesszk, a rendszer automatikusan elrejti a Minimize s a Maximize gombokat is. Ha teht ezek valamelyikt meg szeretnnk jelenteni, erre csak a ControlBox tulajdonsg True rtkemellett van l ehetsgnk.
5. ra Ablakok kszftse - az
za. A ForrnBorderStyle tulajdonsg rtke az albbiak kzl kerlhet ki: None FixedSingle Fixed3D FixedD ialog Sizable FixedToolWindow SizableToolWndow
Futtassuk a projektnket az F5 lenyomsval, s helyezzk az egrmutatt a Piccure Viewer program fablaknak kerete fl. Az ablakunk mcetezhet kerettel rendelkezik, vagyis a keretet hzva tmretezhet. Figyeljk meg, hogy miknt vltozik meg az egrmutat alakja, ahogy a keret fl visszk- kezdetben nyl alak, majd a keretnl egy vonall alakul t, amely mindkt vgn nylban vgzdik, jelezve, hogy merre hzhatjuk a keretet Ha egy sarokhoz helyezzk az egrmutatt, a ktvg1l nyl tls irnyba mutat, utalva arra, hogy ilyenkor a kt szomszdos oldal egyszerre mozdul el. A keretre kattintva, majd az egeret hzva mdosthatjuk az ablak rnrett. lltsuk le a projekt futst a Debug, Stop Debugging (Hibakeress, Hibakeress lelltsa) menponttal (vagy kattintsunk az ablak Ciose gombjra), s adjuk az OptionsForm ablak ForrnBorderStyle tulajdonsgnak a None rtket (ahhoz, hogy ablakunkat viszontlssuk a tervezablakban, dupln kell kattintani az OptionsForm.cs fjira a Solution Explorerben). Vegyk szre, hogy a cmsor is eltnt- vele egytt a cmsor szvege, a vezrlgomb, valamint a Minimize s a Maximize gomb is. Radsul ezutn nincs mdunk az ablak tmrerezsre sem. A FormBorderStyle None rtkre ritkn van szksgnk, ha azonban mgis ezt szeretnnk hasznlni (pldul egy nyitkperny esetben), a Visual C# 2008 megadja szmunkra a lehetsget.
5.9. bra
Most adjuk az OptionsForm F'ormBorderStyl e tulajdonsgnak a FixedToolWindow rtket. gy a cmsor kisebb lesz a megszokottnl, s a benne szerepl szveg betrnre le is cskken (lsd az 5.10. brt). AZt is lthatjuk, hogy aszveg mellen mindssze a Close gomb jelenik meg. Ezt a belltst lthatjuk a Visual C# szmos tervezablakban, pldul a Properties ablak vagy az eszkzkszlet esetben - az ilyen ablakokat lvjuk eszkzablakoknak
5.10. bra
Az eszkzablakok jellemzje,
lehet
A FormBorderStyle tulajdonsg nagyszeren pldzza, hogy mjknt befolysolhatja egyetlen tulajdonsg rtke jelentsen egy objektum Itinzett s viselkedst. Mieltt tovbblpnnk, adjuk az ablak F'ormBorderStyle tulajdonsgnak a FixedSi ngle rtket.
5. ra Ablakok ks2ftsa - az
2008 a program indtsakor egyetlen ablakot kpes automatikusan megjelenteni a tbbirl neknk kell gondoskodnunk, ehhez pedig szksg lesz nmi kdra.
113
Az ablakok megjelentsa
A Visual C# 2008-ban minden, ami l s mozog, objektum- az objektumok pedig osztlyokra plnek. Mivel egy ablak meghatrozsa maga is osztly, j Form objektumunkat a Form osztlyra, mint sablonra kell ptennk. A 3. rn szt ejtt:ttnk az objektumokrl s az objektumvltozkrl - az on elmondonak alkalmazhatk az ablaksablonokra is. Amint a 3. rn elhangzott, amikor egy objektumot egy osztly (sablon) alapjn elksztnk, pldnyostsrl beszlnk. Az ablakok pldnyostshoz a leggyakrabban a kvetkez alakot hasznljuk:
{ ablakosztlynv } {objektumvlto z }
new (ablakosztlynv()} ;
kvetkezk:
ablakosztlynv-az ablaksablont meghatroz osztly neve. objektumvltoz-az ablaksablonnak a kdban hasznlatos neve. A new kulcssz - ezzel jelezzk, hogy j objektumot szeretnnk ltrehozni a vltoz szmra.
Vgezetl, meg kell adnunk, hogy melyik osztlybl szeretnnk szrmaztatni az objektumunkat- ez lesz az ablakosztly. Tegyk fel pldul, hogy rendelkeznk egy LoginDialogForm nev osztllyal. Ez esetben az albbi kddal hozhatunk ltre j Form objektumot:
LoginDialogForm frmLogin =new LoginDialogForm();
Miutn az ablakot pldnyostottuk, a kapott Form objektumhoz az objektumvltozn keresztl frhetnk hozz. Az ablak megjelentshez az osztly Show ( l nevU' tagfggvnyt hvjuk meg, de gy is clt rhetnk, ha a visible vltozjnak a true rtket adjuk:
ErmLogin . Show();
Vagy:
frmLogin . Visible = true;
Picture Viewer projektnkben az albbi lpsekkel jelenthetjk meg az Options ablakot: 1. Jelentsk meg a fablakot dupln kattintva a ViewerForm. cs elemre a Solution Explorerben.
Options
3. Kattintsunk dupln a gombra a gomb Click esemnynek elrshez, majd rjuk be az albbi kdot: OptionsForm frrnOptions Dialog frrnOptions Dialog . Show (); new OptionsForm() ;
Az els utasts egy j frrnOptionsD ialog nevti objektumvltozt hoz ltre, s ltre-
hozza az OptionsForm ablak egy pldnyt. Ezt kveten a msodik utastsban az objektumvltoz segtsgvel (amely most mr egy Form objektum hivatkozsr trolja) megjelentjk az ablakot. Futtassuk a projektet az PS billenty lenyomsval, s kattintsunk az Options gombra. (Ha nem talljuk a gombot, lehet, hogy vletlenl nem a megfelel ablakon helyeztk el.) A mvelet hatsra a program ltrehozza a msik ablakot, s megjelenti a kpernyn. Helyezzk t a kapott ablakot, s kattintsunk ismt a gombra - egy jabb ablakot kapunk. Ezt a mveletet akrhnyszor megismtelhetjk. lltsuk le a projekt futst, s kattintsunk az eszkzkszlet Save Ali (Mindent ment) gombjra.
Ablakrnd ok
A felhasznlknak ktfle - mddal rendelkez (modlis) s md nlkli (nem modJis) - ablakot jelenthetnk meg. A md nlkli ablakok jellemzje, hogy mkdni engedik a program egyb ablakait. (Amikor az Options ablakot a Show () segtsgvel jelentettk meg, md nlkli alakban kerlt a kpernyre, vagyis tovbbra is hasznlhattuk a PictureViewer ablakot, mikzben az Options is a kpernyn maradt.) A md nlkli ablakok nagyszen1 mintapldja a Word (s a Visual C#) Find and Repiace (Keress s csere) ablaka, amelynek a mkdse alatt a felhasznl tovbbra is elrheti a rendszer tbbi ablakt. Ms rszr61, arnikor egy ablakot mddal rendelkez ablakknt jelentnk meg, az alkalmazs rninden egyb ablaka elrhetetlenn vlik, amg a mddal rendelkez ablakot be nem zrjuk - vagyis a tbbi ablak nem fogadhat bemenetet sem az egrtl , sem a billentyzetrl, gy a felhasznlnak muszj a modlis ablakkal foglalkoznia. Ha ott vgzett, a modlis ablakot bezrva visszatrhet a program tbbi ablakhoz. Amennyiben az abla-
Azt, hogy egy ablak mddal rendelkez vagy md nlkli (vagyis az ablak "modalit-
st"), a megjelentsi mdja hatrozza meg, nem pedig az, ahogyan ltrehozzuk (amodlis s md nlkli ablakok ltrehozsa azonos mdon trtnik). Azt mr megtanultuk, hogy ha egy ablakot md nlkliknt szeretnnk megjelenteni, a Show ( l tagfggvnyt kell hasznlnunk. Most elruljuk azt is, hogy a md nlkli megjelenshez a ShowDia log (l tagfggvny alkalmazsa vezet. Jelentsk meg az ablakunkat a tervez ablakban, majd a Click esemnynek az elrshez kattintsunk dupln az Options gombra. Mdostsuk a Click esemny kdjt az albbiak szerint:
Opti onsForm frm Op tion sDialog- new OptionsForrn (); f rrnOptionsDialog . ShowDia l og() ;
Ha elvgeztk a mdostst, futtassuk a projektet az F5 lenyomsval, majd kattintsunk az Options gombra az Options prbeszdablak megjelentshez. Hzzuk el kiss az j ablakunkat a fablak ell, s prbljunk ez utbbi terletre, illetve valamelyik vezrljre kattintani - lthatjuk, hogy nem jrunk sikerrel. Zrjuk most be a modlis ablakot a cmsornak Close gombjra kattintva. A Picture Viewer fablaka ezzel ismt elrhetv vlik, gy jfent az Options gombra kattinthatunk (de ms gombot is vlaszthatunk). Ha meguntuk a ksrletezst, lltsuk le a projekt futst.
Lers Az ablak megjelenst a Locat i on tulajdonsgnak a tervezs sorn megadott rtke szablyozza. CenterScreen Az ablak a kperny6 kzepn jelenik meg. indowsDefaultLocat ion Az ablak kezd6helye a Windows alaprtelmezseszerint W alakul, vagyis a kperny6 jobb fels6 sarka krnykre kerl. W i ndowsDefaultBounds Az ablak helyt ! mrett is a Windows alaprtelmezse hatrozza meg. Az ablak a sZl6ablaknak (ahonnan megjelentettk CenterParent a szban forg ablakot) kzepre igaztva jelenik meg. rdemes a StartPosition tulajdonsgot minden ablak esetben a cent erParent rtkre lltanunk, hacsak nincs r nyoms okunk, hogy mskpp cselekedjnk. Az elsknt megjelen ablaknl j vlaszts lehet a Windows Defaul tLocat ion (jmagam ltalban a CenterScr een bellftst hasznlom) . Nzztik meg, miknt is hat ez a tulajdonsg az ablakokra: 1. Futtassuk a projektet az F5 billenty lenyomsval. 2. Helyezzk t a Picture Viewer ablakot, s kattintsunk az Options gombra. Figyeljk meg, hol tnik most fel az Options ablak. 3. Zrjuk be az Options ablakot. 4. Helyezzk a Picture Viewer ablakot a jobb fels6 sarokba, s nyomjuk meg ismt az Options gombot. Megfigyeltk, hogy az Options ablak minden esetben ugyanott jelenik meg, akrhov is helyezzk a Picture Viewer ablakot? Nos, jmagam nem lelkesedern az ilyesfajta viselkedsrt. lltsuk Ie a projekt futst, s adjuk az Options ablak s t artPosition tulajdonsgnak a CenterParent rtket. Hajtsuk most vgre ismt a fenti lpseket, s lthatjuk, hogy az Options ablak mindig a Picture Viewer ablak kzepn jelenik meg, fggetlenl attl, hogy hov helyeztk ez utbbit a kperny6n.
rtk Manual
egytt lehet6v teszik, hogy tetsz6leges helyen s mretben jelentsOk meg 6ket a kp-
5. ra Ablakok kszftse az
ernyn. Mindemellett hatrozhatunk afell is, hogy az ablak kezdetben kis mretben vagy teljes kpernys alakban jelenjen meg - errl, vagyis az ablak llapotrl a Windowstate tulajdonsg segtsgvel dnthetnk
Kattintsunk az OptionsForm.cs LDesignl flre, gy az ablaktervezhz jutunk. Tekintsk meg az ablakunk WindowState tulajdonsgt a Properties ablakban. Egy j ablak esetben az rtk alaprtelmezs szerint Norma!. Ha gy futtatjuk a projektet- ahogy azt mr j prszor megtertk -,az ablak a tervezablakban ltottal megegyez mretben jelenik meg a Location tulajdonsggal meghatrozott helyen. Adjuk most a WindowSt.at.e tulajdonsgnak a Minimized rtket. Az ablak terveznzetben semmilyen vltozst nem tapasztalunk, a klnbsg azonban nyomban lthat, amint futtatjuk a projektet az F5 billenty lenyomsval, s az Options gombra kattintunk. Els pillantsra gy tnik, mintha nem jelent volna meg a kvnt ablak, pedig valjban jelen van - a Tlcn! lltsuk le a projekt futst, s adjuk a Windowstate tulajdonsgnak a Maximized rtket- az ablak terveznzetben most sem trtnik semmi. Futtassuk ismt a projektet az F5 lenyomsval, s kattintsunk az Options gombra - az Options ablak ekkor betlti a teljes kpernyt. Figyeljk meg, ahogy a httrkp mozaikszeren kitlti a rendelkezsre ll helyet - errl a jelensgrl mr szt ejtettnk a kp beillesztse kapcsn (lsd az 5.11. brt).
5.11. bra
Az ablakok htterben elhelyezett kpek mozakosan rendezdnek, amennyiben a Backgroundlmagel.ayout tulajdonsgnak a Ti/ed rtket adtuk
lltsuk le a projekt futst, s adjuk a Wind.owState tulajdonsgnak ismt a Normal rtket. A tetvezs sorn ritkn fordul el, hogy hasznlnunk kell a Minimize rtket (a Maximize bellitsra esetleg szksg lehet), de tallkozhatunk olyan helyzettel, amikor a WindowState tulajdonsgot futsidben kell megvltoztatnunk. A legtbb tulajdonsghoz hasonlan a mdosts in is megoldhat a kdban. Az albbi urasts.5al pldul lekicsinytjk az Options ablakot (fontos, hogy a kd az ablak osztlyban szerepeljen):
this . Windowstate
= FormWindowState.Minimized;
A 3. rn megtanultuk, hogy a this lrulcssz az aktulis Form objektumra utal, kvetkezskppen ezen keresztl rhetjk el s mdosthatjuk az ablak tulajdonsgait (pldul gy: thi s .Visible =false ;). A kd bersakor nem kell fejbl tudnunk az rtkek nevt, hiszen az egyenlsgjel bersa utn az IntelliSense lenyl listja felknlja az sszes vlasztsi lehetsget.
dolog, hogy ikonokat rendelhetnk az ablakok kis mret vltozathoz, de addhatnak olyan helyzetek is, amikor meg kell akadlyoznunk, hogy egy adott ablak megjelenjen a Tlcn. gy ha pldul az alkalmazsunkban tbb ablak lebeg a fablak felett - ilyen a Visual C# 2008 fejlesztkrnyezetben a Solution Explorer, illetve az eszkzkszlet -, nem valszn, hogy a fablak ikonjn kvl ms egyebet is ltni szeretnnk a Tlcn. Szerencsre az ablakainkat leparancsolhatjuk a Tlcrl, ha a ShowinTaskbar tulajdonsguknak a False rtket adjuk. Ez esetben a felhasznl tovbbra is elrheti a programot az ALT+TAB billenty(Ikkel, jllehet az ikonja eltnik a Tkrl - a Visual C# teht nem teszi lehetv, hogy egy alkalmazs teljesen elrhetetlenn vljon a felhasznJk szmra.
5. ra Ablakok kszftse- az
tnk, radsul a vltozi s vezrli megrzik az rtkket, gy ha jra megjelentjk az ablakot, pontosan ugyanazt a kpet kapjuk, mint amikor a Visible tulajdonsgnak a fal se rtket adtuk. Egy ablaktl ugyanakkor gy is megszabadulhatu nk, ha teljesen bezrjuk, s felszabadtjuk az ltala hasznlt erforrsokat. Mindezt akkor kell megtennnk, ha az ablakra tbb rncs sZksg, gy a Windows jra szabadon rendelkezhet az addig lefoglalt erforrsokkaL A m1lvelet egyltaln nem bonyolult- mindssze az ablak Close (l tagfggvnyt kell meghvnunk, az albbiak szerint:
this . Cl o se(}
119
A Close (l tagfggvny hatsra a Visual C# nem egyszecaen elrejti, hanem teljesen megsemmisti az ablakot. Az albbi lpsekkel egy j gombot helyeznk el az Options ablak bezrsra: 1. Az OptionsForm.cs (Design] lapra vltva jelentsk meg az Options ablakot a tervezablakban. 2. Kattintsunk dupln az eszkzkszlet Button elemre, hogy beszrjunk egy j gombot, a tulajdonsgait pedig lltsuk be a kvetkezkppen:
Tulajdonsg Name Location Text
rtk btnOK
305, 12
OK
3. Most kattintsunk dupln a tervezben frissen ltrehozott OK gombra a Click esemny elrshez, s adjuk meg az albbi kdot:
this . Close(};
4. Vgl futtassuk a projektet az F5 billentyalenyomsval. Kattintsunk az Options gombra az Options ablak megjelentshez, majd zrjuk be az ablakot az OK gombbal. Fontos megismtelnnk: az ablakot ezttal nemcsak elrejtettk, hanem teljesen trltk a memribl, gy a tovbbiakban nem ltezik.
sszefoglals
Ezen az rn az ablakok ltrehozsnak alapjaival ismerkedtnk mt:g. Megtanultuk, hogy miknt illeszthetnk be ablakokat egy projektbe, hogyan llthatjuk be a megjelensk alaptulajdonsgait, tovbb miknt jelenthetjk meg s rejthetjk el ket Visual C# kd segtsgve!. Az itt megtanultak, valamint a kvetkez ra anyaga birtokban mr elmlyedhetnk a Visual C# vezrlinek vilgban- a fellet itt kezd majd vgre erre kapni.
Krdezz-felelek
K: Az ablakoknak hny tulajdonsgt rdemes teroezskor s hnyat futsidben
meghatroznunk?
V: lltsunk be annyi tulajdonsgot tervezs kzben, ahnyat csak tudunk.
gy egyrszt knnyebb az ablakkal dolgozni, hiszen ugyanazt ltjuk, mint a felhasznlk, msrszt a hibakeress is egyszelibb vlik, hiszen kevesebb lesz az tvizsgland kd. K: Tegyk-e /ehetv a felhasznlknak az ablakok /ekicsinytst s teljes kpernyss alaktst? V: Ha csak lehet, ne! Mindenekeln, semmi rtelme lehetv tenni a teljes kpernys mdot, ha a vezrlket nem ksztettk fel arra, hogy alkalmazkodjanak a nagyobb mrethez. A nvjegyablakok, a nyomtatsi prbeszdablakok vagy a helyesrs-ellenrz ablakok nagyszeruen mutatjk, hogy melyek azok az esetek, amikor semmikppen sem szabad lehetv tennnk az tmretezst.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
l. Igaz vagy hamis? "Az ablakok cmsorban szerepl szveget a TitleBarText tulajdonsg rtke adja meg. n
5. ra Ablakok kszftse- az
Milyen tpus szn a Control? Soroljunk fel hrom helyet, ahol egy ablak ikonja megjelenik! Hogyan nevezik a szoksosnl kisebb cmsorral rendelkez ablakokat? Milyen egyb elemnek kell szerepelnie az ablakon ahhoz, hogy a Minimize, illetve a Maximize gomb lthat lehessen? 6. Milyen rtket rdemes hasznlni egy ablak s tartPos i tion tulajdonsgnak belltsnl? 7. Melyik tulajdonsgot llthatjuk be a kdban egy ablak kis mretre vagy teljes mretre lltsa, illetve az eredeti ablakmret visszalltsa rdekben? 8. Melyik tulajdonsg segtsgvel jelenthetnk meg egy rejtett ablakot? 2. 3. 4. 5.
Vlaszok
1. Hamis. Az ablakok cmsorban megjelen szveget a Text tulajdonsg rtke adja meg. 2. Rendszerszn. 3. A cmsorban, a Tlcn, valamint akkor, amikor a felhasznl lenyomja az Ar:r+TAB billenty(iket. 4. Eszkzablakok. 5. A vezrl6gombnak, vagyis az ablak ControlBox tulajdonsgnak a true rtket kell adnunk. 6. A fablak esetben a center Scr een rtket, a tbbi ablak esetben pedig a CenterParent belltst. 7. Az ablak W indowState tulajdonsgt. 8. Visible: lltsuk az ablak Visi ble tulajdonsgt a true rtkre.
Gyakorlatok
1. Hozzunk ltre egy Windows Application projektet egyetlen ablakkal, amely kt gombot tartalmaz. Ha rjuk kattintunk, az egyik tolja az ablakot 2 kpponttal balra, a msik pedig 2 kpponttal jobbra. Tipp: hasznljuk az ablak L eft tulajdonsgt. 2. Hozzunk ltre egy Windows Application projektet hrom ablakkal. A kezdablakban helyezznk el kt gombot, a msik kt ablak pedig legyen eszkzablak, amelyeket az egyes gombokra kattintva jelenthetnk meg.
6.
RA
elhelyezse az ablakokon A vezrlk elhelyezse, igaztsa, mretezse, elosztsa s lehorgonyzsa Intelligens tabultorsorrend meghatrozsa A vezrlk z-sorrendjnek mdostsa ttetsz ablakok ltrehozsa Ms ablakok felett sz ablakok ltrehozsa Tbbdokumentumcs felletek ltrehozsa
Vezrlk
Az ablakok mindssze a vszon szerept tltik be az alkalmazsainkban, amelyek tulajdonsgainak testreszabsa hatssal van a felletre, a mlkds alapjait azonban a vezrlk adjk. Az elz rn megtanultuk, hogy miknt helyezznk el ablakokat egy projektben, hogyan lltsuk be az alaptulajdonsgaikat, tovbb miknt jelentsk meg, illetve rejtsk el ket. A kvetkezkben tovbblpnk, s megtudjuk azt is, hogyan npesthetjk be az ablakokat vezrlkkel, s miknt rendezhetjk el s igazthatjuk egymshoz azokat a tetszets sszhats rdekben. Megismerkednk a fejlett, tbbdokumentumos felletek (MDI, Multiple Document Interface) ltrehozsnak fortlyaival is- ilyetszmos
Vezr16k hasmlata
A vezrlk olyan objektumok, amelyekkel a felhasznl kapcsolatba lphet az ablakok felletn. Ha kvettk az elz rk pldit, tbb vezrlt is hasznlatba kellett vennnk - mivel azonban a Visual C# hasznlata sorn a vezrlk beszrsa gyakori s alapvet fontossg mvelet, fontos, hogy a legaprbb rszletekig megismerkedjnk vele. Ezen az rn teht az ablakok oldalrl kzeltjk meg ezt a tmakrt, a kvetkez kt fejezetet pedig a vezrlk rszletes bemutatsnak szenteljk.
nyithatunk ki, illetve zrhatunk be. Munknk sorn tlnyomrszt a Common Controls (ltalnos vezrlk) csoporttal dolgozunk, de ahogy a tudsuk gyarapszik, egyre gyakrabban kukkantunk bele ms, kifinomultabb s klnlegesebb rendeltets vezrlket tartalmaz csoportokba is.
Az ablakokon ngyflekppen helyezhetnk el vezrlket, s a kvetkezkben a hrom
leggyakrabban hasznlt mdszer mindegyikt megismerjk (a negyediket, a kivgs s msols mdszert mr elsajttottuk). Nyissuk meg az elz rn elksztett Picture Viewer projektnket (vagy a szerz webhelyrlletlttt kiindulsi projektet), majd kattintsunk dupln a Solution Explorerben a OptionsFo rm. cs fjlnvre, gy megnyitjuk az Options ablakot a tervezablakban.
6. ra Ablakok.
Vezrl
Egy ablakon a legegyszerbben gy helyezhetnk el egy vezrlt, ha dupln kattintunk az ikonjra az eszkzkszletben. .Jelentsk ht meg az eszkzkszletet, s kattintsunk dupln a TextBox vezrlre. A mllvelet eredmnyeknt a Visual C# ltrehoz egy j szvegmezt az ablak bal fels sarkban (ahhoz, hogy mindezt lssuk, hzzuk el az egrmutat6t az eszkzkszlet fll, amely nyomban el is tllnik). Amikor dupln kattintunk egy vezrlre az eszkzkszletben (eltekintve a futsidben lthatatlan vezrlktl), a Visual C# az ppen fkuszban lev vezrl felett hoz ltre egy jat, az j vezrl alaprtelmezett mreteit alkalmazva. Ha egyetlen ms vezrl sincs az ablakon, az j jvevny a bal fels sarokba kerl, amint azt az el6bbiekben is lthattuk. A beszrs utn a szvegmezt tetszs szerint thelyezhetjk s mretezhetjk. Fontos tudnunk, hogy a szvegmez fggleges irnyban csak akkor mretezhet, ha a Multiline tulajdonsgnak rtke True. Alkalmazzuk most ezt a belltst.
A vezrt6k kezelse
A vezrlk elhelyezse az ablakokon gyerekjtk -az igazi feladat abban ll, hogy jl hasznlhat felletet lltsunk ssze bellk. A lehetsgek szinte korltlanok, gy ht nem adhatunk rszletes tmutatst az egyes felletek tervezshez (annyit mindenesetre tancsolharunk, hogy rdemes a piacon fellelhet alkalmazsok felleteit alapul vennnk), azt azonban lerhatjuk, hogy tniknt mozgathatjuk, mretezheqk s rendezhetjk el a vezrlket gy, hogy az eredmny megfeleljen az ignyeinknek. Ezeknek a mdszereknek az elsajttsa utn a felletek tervezse nem okoz majd gondot, gy knnyebben sszpontosthatunk a mkdst megvalst kdra.
A rcs hasznlata
A korbbiakban az ablakok szerkesztsnl bizonyra szrevettk, hogy a vezrlk mintha egy lthatatlan rcshoz igazednnak Nos, nem rltnk meg - ez a rcs valban ltezik. Amikor felrajzolunk, illetve thelyeznk egy vezrlt, enikzben a rcs mkdik (a Visual C#-ban ez az alaprtelmezett bellts), a vezrl koordinti automatikusan a legkzelebbi rcspont koordintihoz igazodnak Mindez nmikpp nveli a vezrlk elhelyezsnek s mretezsnek pontossgt. Jmagam csak bizonyos mrtkig tallom hasznosnak a rcsot, ugyars gyakran tallkozhatunk olyan helyzettel, amikor a rcspontok nem illeszkednek a terveinkhez. Mindazonltal a rcs srsgt, st a lthatsgt is bellthaquk - rdemes is lnnk ezekkel a lehetsgekkel.
ei;,;i;~,_".
Op<lml;od Cod< GM.<otion
~-
AutoiCIYII
B IBGtlciSia
...
......
s..pl;".,.
-~
_..,""-:"'
True
HtJ,
~T-
rr.rr ....
'
..,_..
-
.,
. ...)omon4~
t O......foeh
l ., . -.
su....
~
113 --.,
BT-
-."'"'
..
-Ooolpo<o
Aut......ac.oyo,_s-..r 091
_ . . ,_
_,T.,.
6.1. bra
A rcsbelltsok
~~
6. ra Ablakok
A rcsbelltsok ltalnos rvnyek a Visual C# 2008-ban - nem adhatjuk meg ket kln az egyes ablakokhoz s projektekhez. A megjelentskhz vlasszuk a Tools, Options (Eszkzk, Belltsok) menpontot, gy az Options prbeszdabiakba jurunk. Ez utn jelljk be a Show Ali Settings (Minden bellts megjelentse) jellngyzetet, s a balra lthat fbl vlasszuk a Windows Form Designer (Windows-ablaktc::rvez) lehetsget, gy az ablaktervez belltsaihoz jutunk (lsd a 6.1. brt). Az albbi belltsok tarthatnak szmot az rdekldsnkre: GridSize - A rcspontok vzszintes s fggleges irny srsgt hatrozza meg. Minl kisebbre lltjuk, annl pontosabban meghatrozhatjuk a vezrlk helyzett. ShowGrid - Ezzel a belltssal dnthetnk arrl, hogy megjelenjenek-e a rcspontok az ablakok felett a tervezben. SnapTcGrid- Ezzel a belltssal dnthetnk a rcs hasznlatrl. Amennyiben a bellts rtke false, a rendszer nem foglalkozik a rcsmret belltsval, s egyetlen elem sem igazodik a rcshoz. Layout~Iode -A rendszer ennek a belltsnak az rtke alapjn dnt arrl, hogy az elmozdtott vezrlt ms vezrlkhz vagy a rcshoz igaztsa. Ebben a pillanatban nem hasznljuk a rcsot a vezrlk rajzolshoz - mivel a LayoutMode rtke SnapLines, a mozgatsban a vezetvonalak segtenek. Err61 egy kicsit ksbb beszlnk, most azonban a rcs mkdst szecetnnk jobban megismerni, gy lltsuk a LayoutMode rulajdonsgot a SnapToGrid.(rcshoz igazts) rtkre. A kvetkezkben nmikpp nagyobbra lltjuk a rcs srsgt (vagyis a rcspontok kztti tvolsg kisebb lesz), ami a tapasztalataim szerint segt a tervezsben, mert a szlek nem ugranak olyan knnyen tvoli rcspontokhoz. A rcsmret belltsra a GridSize tulajdonsg szolgl. A kisebb szlessg (Width) s magassg (Height) sl!rbb rcsot s ezzel pontosabb elhelyezst nyjt, mg a nagyobb rtkek ritkbb rcsot eredmnyeznek. Ez esetben azt tapasztalhatjuk, hogy a szlek knnyebben odaugranak a rcsvonalakhoz, amelyek radsul messzebb vannak egymstl, gy nehezebb pontosan elhelyezni a vezrlket Kvessk ht az albbi lpseket: l. Adjuk a GridSize tulajdonsgnak a 6,6 rtket. 2. lltsuk a ShowGrid tulajdonsgot True rtkre. 3. Az OK gombr-a kattintva mentsk a mdostsokat, s trjnk vissza az ablaktervezhz. A rcspontok mris megjelennek (lsd a 6.2. brt). Tudnunk kell, hogy a Visual C# 2008 hibja eniatt a rcs nem rnindig jelenik meg. Ha ezt tapasztaljuk, zrjuk be a programot, majd indtsuk jra - a rcsnak ekkor meg kell jelennie. A Microsoft rteslt errl a jelensgrl, de mg nem jelezte, hogy brmifle megoldst adna r.
6.2. bra
A rcs mk6dsnek a lthatsg
nem felltele
A sr rcs htultje, hogy megnehezti a tervezablak ttekintst. A rcs hasznlatrl magunknak kell dntennk - jmagam a "nem" vlaszra szavazok. A segtsg persze jl jn, de inkbb az j Snap to Lines (Vonalakhoz igazts) lehetsget rdemes hasznlni, amelyrl a kvetkezkben szlunk.
A Show Grid tulajdonsg kizrlag a rcs lthatsgrt felel, a mkdsre nincs hatssal- ez utbbirl a snapToGrid segitsgvel dnthetnk.
Vezet6vonalak haSllllata
A Visual C# 2008 hasznos jdonsga a Snap to Lines lpsek adnak mdot:
lehetsg.
Hasznlatra az albbi
megjelentshez. 2. Az elrendezsi belltsok megjelentshez kattintsunk a Wmdows Form Designer lehetsgre. 3. Adjuk a LayoutMode tulajdonsgnak a SnapLines rtket. 4. A ShowGrid tulajdonsg Fal se-ra lltsval kapcsoljuk ki a rcs megjelentst. 5. Az OK gombra kanntva mentsk a belltsainkat.
6. ra Ablakok
A vezetvonalak nagyszer eszkzt adnak a keznkbe a rendezettebb felletek sszelltshoz, hiszen segtenek abban, hogy a vezrlk szleit egymshoz igaztsuk. A mkdsket gy rthetjk meg a legegyszerbben, ha tesZnk egy prbt. Kvessk az albbi lpseket:
1. Rendezzk el a vezrlinket gy, hogy az ablak a 6.3. bra kpt mutassa. 2. Kattintssal jelljk ki a ListBox vezrlt. 3. Kattintsunk a vezrl bal szln megjelen fehr ngyzetre, s hzzuk balra. Amint a vezrl szle nagyjbl egy vonalba kerl a felette tallhat gomb bal szlvel, megjelenik egy vezetvonal, s a vezrl szle hozzugrik (lsd a 6.4. brt). Ha a rendszer nem gy viselkedik, a Visual Studio hibjval llunk szemben - indtsuk jra a Visual C#-ot, s tltsk be ismt a projektet.
6.3. bra
Induljunk ki ebbl az elrendezsboi
6.4. bra
A
vezetvonalak
megknnyttk a
vezrlk
Nyugodtan ksrletezZnk tovbb - lthatjuk, hogy a program a fggleges szlek egyttllsnl jabb s jabb vezetvonalakat jelent meg. Termszetesen v'IZSzintes vezetvonalakat is kapunk, radsul a vezetvonalak akkor is feltnnek, amikor hzssal thelyezzk a vezrlket Mindez ebben a pillanatban aprsgnak tanhet, de ksbb majd megltjuk, hogy enicsoda nagyszer lehetsgrl is van sz, amely rkat takarthar meg az egyszeri programoznak.
130
6.5. bra
Kattintsunk az egrrel az ablakra,
6.6. bra
A kijellt vezrlk szaggatott vonal kerettel s mretezfogamykkal (apr ngyzetekkel) jelennek meg
6. ra Ablakok
A kijellt vezrlk szaggatott vonal keretet s mretezfogantykat kapnak (ezek kis ngyzetek a sarkokon s az oldalak kzepn). Ez utbbiakat rdemes tzetesebben is megnznnk: a fehr mretezfogantykkal elltott vezrl a kijellt csoport aktv tagja. Amikor a Visual C# eszkzeivel kijellt vezrlk csoportjval dolgozunk (ilyenek az igazts s a formzs eszkzei), az aktv vezrl belltsai rvnyeslnek az egsz csoportra. gy ha p6ldul a 6.6. brn lthat kijellt vezrlk bal oldalait szeretnnk egymshoz igaztani, mindegyikk az aktv (fehr ngyzetekkel elltott) vezrl Left tulajdonsgnak rtkt veszi fel. Amikor lasszzssal jellnk ki egy csoportot, nem igazn tudjuk befolysolni, hogy melyik vezrl lesz kzlk az aktv. A pldnkban minden vezrlt a gombhoz szeretnnk igaztani, gy ht ms mdszerre lesz szksgnk. Kattintsunk valahol az ablakra (a vezrlkn kvli terleten), gy megszntetjk a kijellst.
Nem minden mretezfoganty mozdthat el. J plda erre a szvegmezk esete, amelyeknek a magassga mindaddig nem vltoztathat meg, amg a Multiline tulajdonsguknak a Tr ue rtket nem adjuk - amennyiben nem tesznk gy, a vezrlt kijellve csak a bal s a jobb oldali fogantyk vlnak elrhetv.
A tbbelem kijells msik mdszere a SHlFf, illetve a CTRL billentyk hasznlatn alapul (mindkett ugyangy alkalmazhat). A mvelet hasonl ahhoz, mint amikor az Intzben tbb fjlt jellnk ki. Lssuk most, Iniknt is jrhatunk el: 1. Kattintsunk a legals vezrlre (a listamezre), hogy kijelljk. (Ha egyetlen vezrlt jellnk ki, ez egyttal az aktv vezrl szerept is betlti.) 2. Nyomjuk le a SHIFI' billentyt, s kattintsunk a bal fels sarokban tallhat szvegmezre - gy most mr a szvegmez s a listamez is a kijells rsze lesz. Az aktv vezrl tovbbra is a listamez, hiszen a csoport kijellse sorn ez volt az els elem. Ne feledjk, az aktv vezrl a fehr mretezfogantyirl ismerhet fel. 3. Vgezetl - a SHwr billentyt tovbbra is nyomva tartva -jelljk ki a gombot is (nem az OK gombot). Ha mindent jl vgeztnk, ezzel kijelltk mindhrom vezrlt, amelyek kzl a listamez az aktv.
Amennyiben a SHIFT lenyomsa kzben kattintunk egy kijellt vezrlre, megszntetjk a kijellst.
A kt kijellsi mdszer egytt is hasznlhat - kijellhetjk pldullasszzssal az sszes vezrlt, majd a SHIFT lenyomsa mellett kattintva eltvolthatjuk a csoportbl a felesleges elemeket.
Ha egyms utn ktszer kell kattintanunk egy vezrtre (pldul azrt, hogy megszntessk a kijellst, majd jra kijelljk), mindenkppen lassan tegyk. Ha ugyanis elsietjk a mveletet, a rendszer dupla kattintsnak hiszi, s j esemnykezelt hoz ltre a vezrl szmra.
Vezr16k igaztsa
A Visual C# szmos eszkzt knl a tetszets felletek kialaktshoz - tbbsgket a Layout (Elrendezs) eszkztron rhetjk el. Nyissuk ht meg ezt az eszkztrat. Ehhez kattintsunk az egr jobb gombjval valamelyik eszkztrca a Visual C# ablaknak tetejn, s vlasszuk a helyi men Layout pontjt. (Ha kipiplva talljuk, az eszkztr mr jelen van valahol a kperny6n.) A Layout eszkztron szmos ikont tallhatunk, amelyekkel a vezrlket vzszintes s fggleges irnyban egyms szleihez, illetve kzppontjhoz igazthatjuk (lsd a 6.7. brt).
6.7. bra
A Layout eszkztr segitsgvel gyerekjtk a
vezrlk
igazitsa
Hzzuk az egrmutatt lassan az eszkztr ikonjai fl, hogy megjelentsk a lebeg eszkzlersokat, s haladjunk balrl jobbra. Az eszkzlersok tansga szerint az eszkztrral az albbi feladatokat vgezhetjk el:
Egymshoz igazthatjuk a kijellt vezrlk bal s jobb szlt, illetve kzept Egymshoz igazthatjuk a kijellt vezrlk als s fels szlt, illetve kzept Azonoss tehetjk a kijellt vezrlk szlessgt, magassgt, vagy mindkettt. Kiegyenlthetjk a vezrlk kztti vzszintes s fggleges trkzket Elre-htra mozgathatjuk a kijellt vezrlk rtegeit. Tabultorsorrendet Hthatunk fel a vezrlk szmra.
Az els elem egyszeren a rcshoz igaztja a kijdlt vezrlket - nos, ez nem valami nagy dolog, a tbbi gomb awnban igencsak hasznos lehet Ne feledjk, hogy a Visual C# kiindulsi pontknt mindig az aktv vezrlt hasznlja. Ezt az alapelvet fontos szben tartanunk. Kattintsunk most az Align Tops (Igazts fell) gombra, s figyeljk meg, hogyan igazodnak a trsai az aktv vezrlhz (lsd a 6.8. brt).
6.8. bra
A csoport igazitsnl a kijellt vezrl
adja a vfszony{tsi pontot
fllse
3,3,3,3 0,0 0,0 Private
Tog
U..Wo~Cursor
Fa!so
6.9. bra
Egyszerre t6bb vezrl tulajdonsgrtkett is megnzhetjk - bizonyos kivtelekkel
Visibie
Tru.
Ha megadjuk valamelyik tulajdonsg rtkt, az sszes kijellt vezrl felveszi ezt a belltst. Ksrletkppen lltsuk a BackColor tulajdonsgot srgra (ye llow), s figyeljk meg, hogy a tbbi vezrl is ezt a httrsznt veszi fel.
Az eddigiekben reflektorfnybe kerlt hrom vezrl semmilyen szerepet nem kap
DELETE
billenty lenyomsval.
6. ra Ablakok
6.10. bra
Alaprtelmezs szerlnt a vezrlk az ablak bal fels sarkhoz rt.igzllnek
4. Az ablak bezrsval vagy a Debug, Stop Debugging (Hibakeress, Hibakeress lelltsa) menpont vlasztsval lltsuk le a projekt futst. 5. A Select Picture gombbal jelljk ki a kpet, s- ami mg fontosabb - szntessk meg az ablak kijellst. 6. Nyomjuk Je a SHliT billenty(t, s jelljk ki a kvetkez gombokat: Quit, Draw Border, Options, 1\ s v. 7. Ezt kvet6en kattintsunk a Properties ablakban az Anchor (horgony) tulajdonsgra, majd a mellette megjelen nylra. Egy lenyl mezt kapunk, amely kizrlag az Anchor tulajdonsgra jellemz (lsd a 6.11. brt).
6.11. bra
Az Anchor tulajdonsg rtkt ezzel
a klnleges leny/6 mezvel adhatjuk meg A lenyu mez kzepn lthat szi.irke tglalap testesti meg azt a vezrlt, amelyiknek a tulajdonsgt belltjuk A fent, lent, valamint a bal s jobb oldalon tallhat keskeny tglalapok azokat a szleket jellik, amelyekhez a vezrlt rgzthetjk - amennyiben egy tglalap kitltve jelenik meg, a vezrlt az ablaknak ahhoz az oldalhoz rgztettk.
1. Kattintsunk a vezrl6 bal oldaln tallhat tglalapra, hogy ress vljon, majd a t6le jobb oldalra llra, amely gy kitltst kap (lsd a 6.12. brt). 2. A lenyl mez6 bezrshoz kattintsunk egy msik tulajdonsgra. Az Anchor rtke most Top, Right. 3. Futtassuk a projektet az PS lenyomsval, s valamelyik oldalt hzva nagytsuk fel az ablakot.
Bad:Color Badc
6.12. bra
Tole
Izgalmas, nem igaz? A Visual C# itt egyszeren rgztette a gombok jobb oldalt az ablak jobb oldalhoz (Jsd a 6.13. brt). A rgzts sorn valjban nem tesznk mst, mint meghatrozunk egy lland tvalsgat az ablak adott oldaltl - ez az egyszer mdszer azonban hihetetlen el6nykkel jr.
6.13. bra
A lehorgonyzs segftsgvel knnyedn hozhatunk ltre rugalmas ablakokat
Vegyk szre, hogy az tmrerezs sorn a kpmez6 s a koordintk cmki a helykn maradnak. Mindez azonban nem jelenthet gondot, hiszen az Anchor tulajdonsg ezt a helyzetet is kpes kezelni. Elszr vltoztassuk meg az X s Y cmkk horgonyzst:
6. ra Ablakok
1. llitsuk le a ful projektet, s kanintsunk az ablakon az X cmkre, hogy kijelljk. 2. Nyomjuk le a SHTFT billentyt, s jelljk ki az Y cmkt is. 3. lltsuk be az Anchor tulajdonsgot gy, ahogy a gomboknl is tettk- szntessk meg a bal oldal kijellst, s jelljk ki a jobb oldalt (lsd a 6.12. brt). 4. Az Anchor lenyil mezjnek bezrshoz kattintsunk egy msik tulajdonsgr.a.
A kpmez nmikpp eltr az eddigiektl, hiszen a fels s a bal oldalt ugyangy keU
rgztennk, mint eddig, ugyanakkor azt szeretnnk, hogy a jobb s az als oldal egytt mozogjon az ablak tmretezsvel. Ezt knnyen elrhetjk, csak kvessk az albbi lpseket: 1. Jelljk ki a kpmezt. 2. Nyissuk meg az Anchor tulajdonsgot, s jelljk ki mind a ngy horgonypontot (a tglalapok ilyenkor szrke kitltst kapnak; lsd a 6.14. brt).
6.14. bra
Az itt lthat belltssal a vezrl
Futtassuk a projektet az F5 lenyomsval, s nagytsuk fel az ablakot a bal als sarkt hzva. Figyeljk meg, miknt kveti a kpmez mrete az ablak vltozst (a 6.15. bra). Ez a mdszer igen hasznosnak bizonyulhat nagyobb kpek megjelentsnL
6.15. bra
Az Anchor tulajdonsg
Tabultorsorrend felliftsa
A tabultorsorrend olyasvalami, amir61 mg a legtapasztaltabb programozk is gyakran (igen-igen gyakran) elfeledkeznek. Magval a fogalommal felhasznlknt minden bizonnyal tallkoztunk, Jegfeljebb a nevt nem ismertk. Egyszeruen arrl van sz, hogy ha egy ablak felett lenyomjuk a TAB billenty(t, az ppen kijellt vezrlr61 a kvetkezre ugrunk - a tabultorsorrend azt adja meg, hogy melyik a ,.kvetkez". Mindez lehetv teszi, hogy az ablakban a billenty(zet segtsgvel mozogjunk. A vezrlknek a tabultorsorrendben elfoglalt helyt a Tabindex tulajdonsg hatrozza meg. Egy ablak megnyitsakor elsknt az a vezrl kapja meg a fkuszt, amelyiknek a Tabindex-rtke O. Ha ekkor lenyomjuk a TAB billenty(t, arra a vezrlre jutunk, amelyiknek a Tabindex tulajdonsga l , s gy tovbb. Amikor j vezrlt helyeznk el egy ablakon, a Visual C# a kvetkez rendelkezsre ll Tabindex-rtket rendeli hozz (vagyis ez lesz az utols a tabultorsorrendben). Minden vezrl egyedi Tabindex-rtkkel rendelkezik, s ezek nvekv sorrendben kvetik egymst.
Ha a tabultorsorrendet nem megfelelen hatrozzuk meg, a TAB lenyomsval rendszertelenl ugrlunk a vezrlk kztt, ami nagyszeru mdszer a felhasznlk idegestsre. Korbban a tabultorsorrend megvltoztatsnak egyetlen mdja az volt, ha sajt keZ()leg trtuk a Tabindex-rtkeket a Properties ablakban. gy ha valamelyik vezrlt az els helyre akartuk tenni, a Tabindex-rtkt 0-ra kellett lltanunk - a tbbi vezrl belltsrl maga a Visual C# gondoskodott. Higgyk el, ez mg gy is hihetetlenl krlmnyes mdszer. A Tabindex tulajdonsg kzi belltsa olykor jl jhet ugyan (pldul ha j vezrlt szrunk be egy mr ltez tabultorsorrendbe), de ltalban van ennl knyelmesebb mdszer is.
Futtassuk a projektnket az F5 lenyomsval, s vegyk szre, hogy a fkusz most a Select Picture gombon van (amit egy kk tglalap jell). Ha most lenyomjuk az ENTER billentyt, a gombra .kattintunk", hiszen ez a vezrl van fkuszban. Nyomjuk le a TAB billenty(t, gy a Quit gomb kapja meg a fkuszt. Ennek az az oka, hogy a Quit gombot kzvetlenl a Select Picture utn helyeztk el az ablakon. Nyomjuk le ismt a TAB-ot. Ugye azt vrnnk, hogy most a Draw Border gomb kvetkezik? Nos, a felhasznl is erre szmt! Vrakozsainkkal ellenttben azonban a 1\ gomb a kvetkez a sorban, hiszen ezt helyeztk el a Quit utn az ablakon. Ezzel kezdennk kell valamit, gy ht lltsuk le a projekt futst, s cselekedjnk.
6. 6ra Ablakok
A kvetkezkben a .NET vizulis mdszervel v ltozta~uk meg a tabultorsorrendet:
1. A Layout eszkztr utols gombja a Tab Order (Tabultorsorrend) nvre hallgat.
2.
3.
4.
5.
6.
7.
Kattintsunk r, s figyeljk meg, hogy a vezrlk felett szmok jelennek meg a Tabindex tulajdonsg rtkei (lsd a 6.16. brt). Azonnal lthatjuk, hogy a tabultorsorrend nem megfelel . Kattintsunk a Select Picture gombra. A szm httere kkrl fehrre vltozik, azt mutatva, hogy a vezrlt kijelltk Ha Tabindex rtke nem O lett volna, a rendszer most ezt az rtket adn neki a kattints pillanatban. Kattintsunk most a Quit gombra, hogy a vezrlt a tabultorsorrend kvetkez elemeknt jelljk ki. A Draw Border gomb jelenleg az tdik a sorrendben. Kattintsunk r, gy Tabindex rtke 2-re vltozik. Kattintsunk a tbbi vezrlre a kvetkez sorrendben: X mke, Y cmke, Options gomb, A gomb s v gomb. Ha az utols gombra is rkattintottunk, a szmok httere kkre vltozik, ami azt jelzi, hogy az j tabultorsorrend ltrejtt. Kattintsunk jfent a Layout eszkztr Tab Order gombjra, hogy elhagyjuk ezt a szerkesztsi mdot. Futtassuk a projektet az F5 billentyvel, s figyeljk meg, hogy a TAB billenty lenyomsa ezttallogikusabb sorrendben visz vgig a vezrlkn.
6.16. bra
A vezrl6k felett lthat szmok a Tabindex rtkeit jelzik
A kdban is lpkedhetnk a vezrlk kztt a tabultorsorrendet kvetve, csak hvjuk meg az aktv vezrl vagy ablak SelectNextControl <l tagfggvnyt.
140
A vezrlket a kdban is elrehozhatjuk, illetve htrakldhetjk az adott vezrl BringToFront (l s SendToBack () tagfggvnyeiveL
a segtsgvel szablyozhatjuk az ablak, valamint a rajta elhelyezett vezrlk ttetszs gt. A tulajdonsg alaprtelmezett rtke l OOOAl; ilyenkor az ablak teljesen tltszatlan, mfg a O% tltsz (vagyis ltl1atatlan) ablakot eredmnyez. Ha 500 /o-ot adunk meg, ttetsz ablakot kapunk (lsd a 6.17. brt). A Microsoft Outlock 2003 s utdai kihasznljk ezt a tulajdonsgot a levelek berkeztrl tjkoztat elugr ablak megjelentsekor.
6. ra Ablakok
A figyelmeztet ablak ttetszsge-QO /o-rllOO%-ra n, ott megll pr pillanatra, majd jra QO;-ra cskken, vagyis eltanik. Egy egyszer ciklussal magunk is elrhetji.lk ugyanezt a hatst, amint azt a 14. rn lthatjuk majd.
6.17. bra
Szellemablakoki
Grgethet
ablakok
A grgethet ablakok jellemzje, hogy grdtsvok jelennek meg rajtuk, ha a tartalmuk nagyobb a fizikai mreti.lknl. Ez a lehetsg - brmilyen meglep- a Visual C# korbbi vltozataiban nem volt elrhet, ezrt a megjelense annl nagyobb rmet okoz, Irulnsen annak fnyben, hogy a hasznlata gyerekjtk az alkalmazsokban.
A grgets viselkedst hrom tulajdonsg befolysolja:
Tulajdonsg
AutcSerol l AutoScrollMinSize
AutoScrollMargin
l eirs Ez a tulajdonsg hatroz arrl, hogy megjelenjenek-e egyltaln a grdtsvok A grgetett terlet minimlis mrett adja meg. Amennyiben az ablak mrete olyannyira lecskken, hogy az gyflterlet (vagyis az ablak terlete a kerete s a cmsora nlkl) kisebb lesz, mint az AutoScrollMinSize rtke, megjelennek a grdtsvok. Ezzel a tulajdonsggal hatrozhatjuk meg a grgetett terlet margit. Ezzel lnyegben azt mondjuk meg, hogy mennyivel grgethetjk tl a tartalmat a legkls vezrl6kn.
6.18. bra
Grdtsvok
6. ra Ablakok
6.1 9. bra
Kollzs- az MD! alkalmazsok f elalete egy szlablakra pl, amely tbb gyermekablakot tartalmazhat
A kvetkezkben egy egyszer MDI programot ksztnk: 1. Vlasszuk a File, New Project menpontot a New Project prbeszdablak megjelentshez (vegyk szre, hogy egy modlis ablakot kaptunk). 2. Adjuk a projektnek az MDI Example nevet, majd kattintsunk az OK gombra. 3. Kattintsunk az egr jobb gombjval a Solution Explorerben a Forml . cs fjlra, s vlasszuk a helyi men Rename (tnevezs) pontjt. Adjuk az ablaknak az MDIParentPorm. cs nevet. Az ablak Text tulajdonsga legyen MDI Parent, az I s Md iCon t ainer tulajdonsgnak pedig adjuk a True rtket. (Ez utbbi bellils nlkl a pldnk egyltaln nem rnkdne.) Azonnal feltnhet, hogy a Visual C# sttsZrkre vltoztatja az gyflterlet sznt, s nmikpp "besllyeszti" azt. Ez az MDI szlablakok alaprtelmezett megjelense - itt tnnek majd fel a gyermekablakok. 4. Hozzunk most ltre egy j ablakot a Project, Add Windows Form (Projekt, Windows-ablak hozzadsa) menpont vlasztsval. Az ablak neve legyen ChildlForm.cs, a Text tulajdonsgnak rtke pedig Child l. 5. Helyezznk el a projektben egy harmadik ablakot is az elzek szerint. A neve legyen Child2Porm.cs, a Tex t tulajdonsgnak az rtke pedig Child 2. 6. Kattintsunk a Save Ali gombra az eszkztron. 7. Kattintsunk dupln a Solution Explorerben az MDIParent Fo rm . cs fjlnt:vre, ezzel megjelentjk a szl ablakot a tervezben . 8. Most kattintsunk dupln az ablakra, gy annak alaprtelmezett esemnyhez, a Load esemnyhez jutunk. rjuk be az albbi kdot:
ChildlForm objChild objChild.MdiParent objChild.Show{);
Futtassuk a projektet az F5 lenyomsval, s figyeljk meg, hogy a gyermekablak a szlablak gyflterletn jelenik meg. Ha tmrerezzk a szlablakot, s egy gyermekablak nem fr el a felletn, grdtsvok jelennek meg a szlein (lsd a 6.20. brt). Ha eltvoltannk az MdiParent tulajdonsgot bellt utastst, az ablak egyszeren lebegne a szlablak felett, gy nem knyszerlne a szl hatrai kz.
6.20. bra
A gyermekablakok a szljk hatrain bell jelenrwk meg
A Debug, Stop Debugging menponttal lltsuk le a projekt futst, s tegyk a kvetkezket:
1. Nyissuk meg a Solution Explorert, s kattintsunk dupln a ChildlForm ablakra, hogy megjelentsk a tervez6ben. 2. Helyezznk el egy gombot az ablakon, a tulajdonsgait pedig lltsuk be az albbiak szerint:
Tulajdonsg
Name Location Size
Text
rtk btnShowChild2
105, 100
85, 23
Show Child 2
6. ra Ablakok
Ez a kd a msodik gyermekablakot jelerti meg. Figyeljk meg, hogy milyen klnbsgek mutatkoznak az elz kdrszlethez kpest. Az MdiParent tulajdonsg rtke ezttal nem lehet a this, hiszen ez a kulcssz az aktulis ablakra utal (esetnkben a ChildlForm ablakra, amely nem MDI trol). Tudjuk azonban, hogy a this .Ndi Parent a gyermekszlablakr adja meg, hiszen ppen ennek a tulajdonsgnak a megadsval tetti.ik gyermekablakk. Ezzel egyszeren tadhatjuk az els gyermekablak szljr a msodiknak, gy vgeredmnyben mindketten ugyanannak az ablaknak a gyermekei lesznek.
Brmelyik ablak lehet gyermekablak (kivve az MDI szlablakokat) - ehhez mindssze meg kell adnunk a kvnt MDI trolt az Mdi Parent tulajdonsgban.
4. Futtassuk a projektet az F5 billenty(I lenyomsval. A gyermekablakon egy gombot tallunk- kattintsunk is r. (Ha nem ltjuk a gombot, j esllyel tvedsbl
a msik gyermekablakon helyeztk el.) A gombra kattintva egy msodik gyermekablak tnik fel , amely szintn a szlablak hatrai kz knyszerl (lsd a 6.21. brt).
6.21. bra
A gyermekablakok egyenrang trsknt viselkednek a sZlablakon
be/tl[
Az MDI szlablak rendelkezik egy Acti veMdiChild nev tulajdonsggal. amely megadja, hogy melyik gyermekablaka aktv.
Ha azt szeretnnk, hogy a szlablak indulskor nagyobb legyen, llitsuk be a Size . W idth s Size. H eight tulajdonsgait a tervezs sorn vagy futsid ben az ablak Load esemnyben.
sszefoglals
Az ablakok mkdsnek megrtse alapvet fontossg, hiszen ezek azok a "dinamikus vsznak'', amelyekre ,,felfesthetjk" a felhasznli felletet. Ha nem vagyunk tisztban a hasznlatuk alapjaival, ezt egsz projektnk megsnyli. Tapasztalhattuk, hogy az ablakok kezelse sokszor tlmutat a tulajdonsgok puszta belltsn, klnsen akkor, ha a felhasznJk ignyeit prbljuk szem eltt tartani. Tudsunk gyarapodsval egyre jobban belejvnk majd az ablakok ksztsbe, s a helyes tervezs alapelvei termszetess vlnak a szmunkra.
Ezen az rn szmos izgalmas dolgot tanultunk az ablakokrl, pldul megtudtuk, hogy miknt tehetjk ket ttetszv, s hogy miknt kezelhetnk tbbdokumentumcs felletekeL Megismerkedtnk a grgethet ablakok ltrehozsnak mdjval, s rengeteget tanultunk a vezrlk kezelsrl, ami annl is fontosabb, mivel az ablakok igazi clja voltakppen a vezrlk trolsa. A kvetkez kt rn a vezrlk vilgnak rejtelmeibe nyerhetnk bepillantst, fontos elemekkel gyaraptva programozi fegyvertrunkat
Krdezz-felelek
K: Minden ablaknl oda kell figyelnnk a
rogztsre s a g6rdtsvokra? V: Egyltaln nem. A legtbb alkalmazsban az ablakok tlnyom tbbsge prbeszdablak, vagyis adatok beolvassra szolgl modlis ablak. A prbeszdablakok mrete ltalban rgztett, vagyis a keretk nem mozgathat, ez esetben pedig a rgzts s a grdtsvok hasznlata teljesen felesleges. K: Honnan tudhatjuk, hogy egy programban MDI felletre van szksg? V: Amennyiben egy programunkban egyazon ablakbl j esllyel tbb pldnyt is megnyitnak a felhasznlk, akkor rdemes megfontolnunk a tbbdokumentumcs fellet hasznlatt Ez a helyzet ll el pldul akkor, ha egy kpszerkeszt6 programot ksztnk, amelyben a felhasznl egyszerre tbb kpet is megnyithat Az MDI alkalmazsa akkor is felmerlhet, ha tbb olyan ablakot jelentnk meg, amelyek kzs eszkztrat s mensort hasznlnak.
vezrlk
6. ra Ablakok
Ismtts
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is karna toztathassuk.
Ismtl
1. 2. 3. 4. 5. 6. 7.
krdsek
Igaz vagy hamis? .A sorban mindig az elsknt kijellt vezrl az aktv." Hnyflekppen helyezhetnk el vezrlket egy ablakon? Hov kerl a vezrl az ablakon, ha dupln kattintunk az ikonjra az eszkztron? Melyik tulajdonsggal rgzthetjk egy vezrl oldalt az ablakhoz? Mit kell megvltoztatnunk ahhoz, hogy elrejtsk a rcsot az ablaksablonon? Melyik eszkztr tartalmazza a trkzket s az igazrst szablyoz eszkzket? Melyik tulajdonsggal tehetnk egy ablakot MDI szlv?
Vlaszok
1. Igaz. 2. Ngy alapvet mdszer Itezil{: dupln kattinthatunk a vezrlre az eszkztron, thzhatjuk az eszkztrrl az ablakra, a vezrl ikonjra kattinthatunk az eszkztron, majd felrajzolhatjuk a vezrlt az ablakra, vgl pedig lemsolhatjuk s beilleszthetjk a vezrlt 3. A vezrl az ppen kijellt vezrl fl kerl, illetve - amennyiben nincs ilyen az ablak bal fels sarkba. 4. Az Anchor tulajdonsggaL 5. Az Options prbeszdablakban tallhat ShowGr id tulajdonsgot. 6. A Layout eszkztr. 7. Egy ablakot az IsMdiContainer tulajdonsg Tr ue rtkre lltsval tehetjk MDI szlablakk .
Gyakortatok
1. Hozzunk ltre egy j Windows-alkalmazst, s helyezznk el az alaprtelmezett ablak kzepn egy gombot. KsrletezZnk az Anchor tulajdonsg klnbz rtkeivel, minden mdosts utn jra futtatva a projektet. 2. Mdostsuk az eddigiekben vizsglt MD1 Example projektet gy, hogy ezttal elsknt a Child2Form jelenjen meg, majd ez hozza el a ChildlForm ablakot.
7.
RA
Hagyomnyos vezrlk
A lecke tartalmb61:
Statikus szveg megjelentse a Label vezrl segtsgvel Szvegbevitel engedlyezse szvegmezk segtsgvel Jelszmezk ltrehozsa Gombok hasznlata Panelek, csoportmezk, jellngyzetek s vlasztgombok hasznlata Listk megjelentse listamezkkel s kombinlt listkkal
ba. Mindez rendjn is van, hiszen az ablakok fontos rszt adjk a felhasznli felleteknek, nmagukban azonban m sem rnek. Ahhoz, hogy mkd felletet ksztsnk, hasznlatba kell vennnk a vezrlket, hiszen ezek azok az elemek, amelyekkel a felhasznJk kapcsolatba lphetnek. Szmos klnbz tpusuk ltezik az egszen egyszer Label vezrltl, amely mindssze statikus szveg megjelentsre kpes, a Tree View vezrlig, amely az Intzben lthat faszerkezetet varzsolja a kpernyre. Ezen az rn a legismertebb (s legegyszen1bb) vezrlket mutatjuk be, amelyeket sszefoglal nven hagyomnyos vezrlo7mek neveznk. Persze a bonyolultabb trsaikra sem kell sokig vrnunk, hiszen a 8. rn velk foglalkozunk, s megtanuljuk, hogy miknt kszthetnk professzionlis megjelens felleteket
User Name:
~ ......"\:.}-~- -~--~~".,~
<
...~_;_.
,_ .. ,- .... . .
lblJserfbme Systtm.Win<fOM.forms.l C o
.:
"sa.
~]T~
fi ~tToloft
<!Ll ablnder
:f~
u-NMu
Topleft
W u..;c.,.,;~>IT fak
it TedASgn
~~
1...
7.1. bra
A tbbsoros cmkket ezzel a szvegszerkesztvel kszthetjk el
Vegyk szre, hogy a cmke automatikusan igazodik a szveg mrethez. Ha tbbsor~s szveget szecetnnk feltntetni, kattintsunk a Text tulajdonsgra, majd a lefel mutat nylra, gy a 7.1. brn lthat apr szvegszerkeszthz jutunk. Itt berhatjuk a kvnt szveget, s a sorokat az Er-m:R lenyomsval vlaszthatjuk el egymstl. Az esetek tbbsgben az egysoros cmkk tkletes megoldst jelentenek, de j tudni, hogy ez a lehetsg is a rendelkezsnkre ll. A cmkk tovbbi jellemzje , hogy gyorsbillentyt rendelhetnk hozzjuk - ez alhzott betknt jelenik meg a cmke szvegben, pldul gy: First Name. Ha a felhasznl lenyomja az ALT billentyt, valamint ezt az alhzott bett (esetnkben ez az ALT+F billentykombincit jelenti), a fkusz a tabultorsorrendben a cmke utn ll vezrl6re ugrik. A gyorsbillenty hozzrendelshez helyezznk el egy & jelet a kvnt bet eltt. Ahhoz teht, hogy az F gyorsbillentyt hozzrendeljk a First Name cmkhez, a Text tulajdonsgnak az &First Name: rtket kell adnunk.
rtk
txtUserName 1 05 , 38 1 39 , 20
7.2. bra
A cmkk s a sz6vegmezk nagyszeren hasznlhatk egytt
A szveg igazftsa
Mind a Label, mind a TextBox vezrl (s mg sok ms trsuk) rendelkezik a TextAlign tulajdonsggal, amellyel meghatrozhatjuk, hogy hov igazedjon a szveg a vezrln bell, a szvegszerkesztkben megszakonakhoz hasonlan. A bellts lehetsges rtkei: Left (balra), Center (kzpre) s Right (jobbra).
Az albbi lpseket kvetve megfigyelhetjk a TextAlign tulajdonsg mkdst: 1. lltsuk a szvegmez TextAlign tulajdonsgt a Right rtkre, s figyeljk
3.
semmilyen meglepetssel. Mieltt tovbblpnnk, lltsuk vissza a TextAlign tulajdonsgot az eredeti Left rtkre.
Tbbsoros szvegmez6k
A
6. rn mr szt ejtettnk a kijellt vezrlk mretezfogantyirl. Megtanultuk, hogy a fehr sznek elhzhatk, rng azok, amelyeknek a belseje szrke, nem mozdthatk. Figyeljk meg, hogy szvegmeznk csak a jobb s a bal oldaln rendelkezik fehr mretezfogantykkal, vagyis csak a szlessgt mdosthatjuk, a magassgt nem. A szvegmez egysoros, vagyis mindssze egyetlen sornyi szveget jelenthetnk meg benne. A korltozs gy mr knnyebben rthet, hiszen mirt volna szksgnk egy magasabb szvegmezre, amely ugyanakkor egyetlen sor szveget tartalmaz.
Ha azt szeretnnk, hogy egy szvegmez tbb sort is megjelenthessen, lltsuk
a Multiline (tbbsoros) tulajdonsgt True rtkre. Tegyk is ezt meg a szvegmeznkkel, s lthatjuk, hogy a mretezfogantyi fehrr vlnak. Mindezt knnyedn elrhetnnk a Properties ablakban, de van egy gyes rvidtsi lehetsg. Jelljk ki a szvegmezt, majd kattintsunk a szvegmez felett megjelen apr ngyzetre, amelyben egy kis nyilat tallunk Osd a 7.2. brt). Ekkor egy egyszen1 helyi menhz jutunk, amelyben megtallhatjuk a Mul t i l ine tulajdonsg rtkt Kattintsunk az rtk mellett ll jellngyzetre , majd kattintsunk valahol a menn kvl A legtbb vezrl rendelkezik helyi menvel, de ezek tartalma esetenknt eltr. Ha feltnik a kis ngyzet a nyilacskval, rdemes megnyitni a helyi ment, gy lassan megtanuljuk, rnilyen tulajdonsgokat tesznek elrhetv itt az egyes vezrlk
Legyen a szvegmez Text tulajdonsgnak rtke This is sarnple text. Arnultiline text box will wrap i ts contentsas necessary. (Ez egy mintaszveg. A tbbsoros szvegmez gondoskodik a sarok trdelsrl.) Az Ef\ITER vagy a TAB billentyl!lenyomsval hagyjuk jv a mdostsL A 7.3. brn lthat, hogy csak a tartalom egy rsze jelenik meg, ugyanis a vezrl egyszeren nem elg nagy a befogadshoz. lltsuk t a Size tulajdonsgot a 139, 52 rtkre, gy mr feltnik a teljes szveg Osd a 7.4. brt).
7.3. bra
A szvegmezk tartalma nagyobb lehet annl, mitzt amit kpesek megjelenteni
7.4. bra
A tbbsoros sz6vegmezket igny szerlnt mretezhetjk
Addhatnak helyzetek, amikor nem szecetnnk lehetv tenni a felhasznlknak, hogy kapcsolatba lpjenek egy adott vezrlvel. gy ha pldul egy biztonsgi modellt rvnyestnk az alkalmazsunkban, s a felhasznl nem rendelkezik a megfelel jogosultsgokkal, megtilthatjuk neki az adatok mdostst. Ebben segt az Enabled tulajdonsg, amellyel meghatrozhatjuk, hogy a vezrl elrhet6 legyen-e. Az rtkt lltsuk most False-ra, majd futtassuk a projektet az FS lenyomsval, s az Options gombra kattintva nyissuk meg az Options ablakot. Terveznzetben semmifle vltozs nem ltszik a vezrln, futs kzben azonban annl szembetnbb a klnbsg. Aszveg szne ezttal fekete helyett szrke, a szvegmez pedig nem fogadja a flruszt, illetve nem teszi lehetv, hogy megvltoztassuk a tartalmt (lsd a 7.5. brt).
7.5. bra
Az Enabled tulajdonsg False rtke me/lett a sz6vegmez tartalma nem rhet el
Grdft6svok hozzadsa
A tbbsoros szvegmez6ket tetszs szerint mretezhetjk, de gy is elfordulhat, hogy a tartalmuk mrete meghaladja a rendelkezsre ll helyet. Amennyiben gy vljk, hogy ez a helyzet elllhat, adjuk a szvegmez6 Scro llBars (grdt6svok) tulajdonsgnak a None (nincs) helyett a Vertical (fgg6leges), a Horizental (vzszintes) vagy a Both (mindkett6) rtket
Ha azt szeretnnk, hogy egy szvegmezn feltnjenek a grdtsvok, a szvegmez Mult i l i ne tulajdonsgt felttlenl True rtkre kell lltanunk. Mindemellett, mg ha a scrollBars tulajdonsg rtke Both is, a vzszintes grditsv csak akkor jelenik meg, ha a wordwrap rtke False, egybknt ugyanis a program a rendelkezsre ll helynek megfelelen trdeli a sorokat. gy nem fordulhat el, hogy a szveg oldalt kilgjon a rendelkezsre ll terleten kvlre, kvetkezskppen a grdtsvra sem lesz szksg.
Adjuk a szvegmez6nk ScrollBars tulajdonsgnak a Vertical rtket, s figyeljk meg, holjelenik meg a grdt6sv (lsd a 7.6. brt).
7.6. bra
Ha egy sz6vegmez elrelthatan sok sz6veget tanalmaz majd, lssuk et
grdtswal
Ha egy szvegmez Accept Return tulajdonsgt True rtkre llitjuk, az ENTER lenyomsval j sort hozhatunk ltre a bert szvegben, az AcceptTab bellts True rtke esetn pedig a TAB lenyomsval j hasbot hozhatunk ltre aszvegen bell, gy a program nem ugrik a kvetkez vezr1hz.
Fa l se None
2. Futtassuk a projektet az FS billentyvel. 3. Az Options gombra kattintva jelentsk meg az Options ablakot. 4. rjuk be a kvetkezt a szvegmez6be: So you run and you run. Nyilvn szrevesszk, hogy mindssze 10 karaktert rhatunk be, vagyis csak a So you run rszletig jutunk el. A szvegmez szigoran 10 karaktert engedlyez- sem a billentyzetrl, sem beillesztssei nem tudjuk tlpni ezt a hatrt. A MaxLength tulajdonsgot a leggyakrabban akkor hasznljuk, ha a szvegmez tartalma egy adatbzisba kerl, a mezk mrete ugyanis ltalban korltozott. 5. lltsuk le a projekt futst, s adjuk a MaxLength tulajdonsgnak a O rtket - ez a gyakorlatban azt jelenti, hogy nem hatrozunk meg korltot a karakterszmra nzve. (ezen a ponton rdemes menteni az eddigi munknk eredmnyt).
Jelsz6mez6k ltrehozsa
Bizonyra tallkoztunk mr jelszbeviteli mezvel - ez egy olyan szvegmez, amely a bertszveg karakterei helyett csillagokat jelent meg. rdemes tudnunk, hogy tetsz6leges szvegmez6b6l ltrehozhatunk jelszmezt, csak rendeljnk valamilyen karaktert a PasswordCha r tulajdonsghoz. Vlasszuk ht ki ezt a tulajdonsgot, s adjuk meg a csillag () karaktert. Futtassuk a projektet, s jelentsk meg az Options ablakot, majd rjunk be valamit a szvegmezbe. Aszveg karakterei helyett csillagok jelennek meg, amint azt a 7.7. brn is lthatjuk. A felhasznl teht nem ltja a bertakat-ha azonban a kdban hivatkezunk a Text tulajdonsgra, hozzjuthatunk a szveghez.
7.7.bra
A jelszmezk az ltalunk megadott karaktert jelentik meg a bert sz6veg karakterei helyett
Egy szvegmez csak akkor kpes egy jelsz karaktereinek a megjelentsre, ha a Multiline tulajdonsgnak az rtke False.
llitsuk le a projekt futst a Debug, Stop Debugging menponttal. Trljk a Passwor dChar mez6 tartalmt, s mentsk a projektet az eszkztr Save All (Mindent ment) gombjra kattintva.
Gombok ltrehozsa
A Windows minden prbeszdablaka rendelkezik legalbb egy gombbal, ennek
a vezrlnek a fontossga teht nem lehet vits, rnivellehetv teszi, hogy a felhasznl kattintsa nyomn valarnilyen mveletet vgeZZnk.
Az ablakunkon eleve szerepel egy OK gomb. Az OK gomb szerepe ltalban annyiban ll, hogy jvhagyja a felhasznl bellitsait, s bezrja az ablakot. A gombunk nemsokra valban el is ltja ezt a feladatot. Ha azonban van egy OK gombunk, rdemes lehet egy Cancel (Mgse) gombot is [elvennnk, amely gy zrja be az ablakot, hogy elveti a bevitt adatokat. Helyezznk ht el egy j gombot az ablakon, dupln kattintva az eszkzkszlet But ton elemre, s a tulajdonsgait lltsuk be az albbiak szeriot: Tulajdonsg Name Location Text
rtk btnCancel
304, 38
Cance l
Semmi rtelme olyan gombot megjelentennk, amelynek nincs feladata, ezrt kattintsunk dupln a Cancel gombra a Click esemnynek azelrshez, s rjuk be az albbi utastst: this.Close();
7.8. bra
Egy ablak Accept gombjaknt csak egyetlen gombot jel6/hetunk meg
5. Kattintsunk a szvegmezre, hogy biztosan fkuszban legyen, majd nyomjuk le az ENTER-t, s az ablak bezrul. Ez nem meglep, hiszen amint azt az elzekben elmondtuk, ha egy ablak rendelkezik kijellt Accept gombbal, az EI'TfER lenyornsa attl fggetlenl kivltja a gomb Cl i ck esemnyt, hogy melyik vezrl van ppen fkuszban. Nos, az igazat megvallva van egy kivtel. Ha egy tbbsoros szvegmez van a fkuszban, az ENTER j sort hoz ltre benne, s nem vltja ki az Accept gomb Cl i ck esemnyt. Ha az ablakunk rendelke::zik Accept gombbal, ltalban rdemes egy Cancel gombot is kijellnnk. Ennek Click esemnye akkor lp mt1kdsbe, ha a felhasznl az Esc billenty\It nyomja le (szemben az Accept gombhoz tartoz ENTER billenty\Ivel), fggetlenl attl, hogy melyk vezrl van ppen fkuszban. A Cancel gombhoz rendszerint olyan kdot renclelnk, amely bezrja az ablakot a felhasznl mdostsainak rvnyestse nlkl. Canct!l nev gombunkat az albbiak szerint tehetjk Cancel gombb:
1. lltsuk le a proje::kt futst.
Amennyiben az ablak rendelkezik OK vagy Close gombbal, rdemes ezt kijellni Accept gombknt Ha az ablakon szerepel egy OK s egy Cancel gomb, rdemes az elbbit Accept, az utbbit pedig Cancel gombknt megjellnnk (elg egyrtelma vlaszts, sokan azonban mgis elfeledkeznek rla). Ha az ablak egyetlen Close vagy OK gombbal rendelkezik, rendeljk hozz mnd az AcceptEutton, mind a caneelEutton tulajdonsghoz. Amennyiben az ablakon szerepel Cancel gomb, legyen ez a caneelEutton tulajdonsg rtke.
Igen-nem vlasztsi
lehetsgek jellngyzetekkel
A jellngyzetek (CheckEox) segtsgvel igen-nem, illetve igaz-hamis vlasztsi lehetsgeket jelenthetnk meg az ablakokon. Ezzel a vezrlvel nyilvn rengetegszer tallkoztunk mr a Windows-alkalmazsok hasznlata sorn, gy tudhatjuk, hogy rkattintva vlthatunk a ki- s a bekapcsolt llapot (igaz-hamis, igen-nem stb.) kztt. HelyezZnk el egy jellngyzete::l az Options ablakunkon, a tulajdonsgait pedig lltsuk be az albbiak szerint:
rtk
chkPrornptOnExit
105, 79
7.9. 6bra
A jc/6/ri~'ZCiteiiRaz-hamls, illett'<' igen-ttem t'Ctlasztsr lehcts[l.ct }eletlllhcttltlk 111(!8
A kvetkezkben megtanuljuk. miknt hozharunk ltre trolkat vezrl6k csoportjai megi.,merkcdilnk a panelekkel s a csoportmez6kkcl. Mindemellell arrl is .,zt e1tnk, hog)ft.tn hasznlharjuk ezeker a trolkat az Option Button vezrl6vel cgyutt arra, hogy thb vlasztst lebersger knljunk fel.
Panelek s csoportmez6k
A vczrl5kct azrt helyezhetjk el az ablakon, mcrt az ablak trolobjektttm vagyis egy olyan objektum, umcly kpes vezrlk befogadsra. Mlndazonltal uz ablak nem az egyetlen troltipus, hiszen ms vezrlk is viselkedhetnek trolknt, r:iac.hsul a trolk tovbbi t3rolbjekrumokat is tartalmazhatnak. A kvetkezkben l>mutatoll Ptm l (panel) s \re upBox (csoportmez) trol egyarnt vczrl6k trolsra szolgl, dc a hslnlatuk mdja cltr6. A GroupBox ot}~.ln Lrol6vezrl6. amelynek a tulajdon.s:.ga1 lehelv tesZik. hogy szeglyt: valamm t cmfeliratot hatrozzunk meg a sznra. l lelyezzunk hat el egy j pldnyt az ablakunkon ebbl a vezrlbl, dupln lwnin!V"d az t.>szkzkcc;zlct GroupBox elemrc <a Containcrs, vam1s Trolk csoportban kcn:,:.uk>. Az j csoportmezk alaprtelmezs szenot kerettel rendelkeznek, a cmtehratukban pedig a vczrl6 nev~: ali.
( keretct).
Kattintsunk a csoporunez kzepre, s prbljuk elmozdtani, ahogy ms vezrlkkel tennnk. Nos, ezttal nem jrunk sikerrel. A csoportmezre gy gondolhatunk, rnint egy apr ablakra -egy ablakot pedig nem lehet ilyen egyszeren elmozdtani. Ha a csoportmezre kattintunk, s elhzzuk az egrmutatt, a benne tallhat vezrlket jellhetjk ki az ablakoknl megismert lasszzs mdszervel. Ha t szeretnnk helyezni a csoportmezt, kattintsunk inkbb a ngy nyilacskt tartalmaz ikonra, s ennl fogva hzzuk el (lsd a 7.10. brt).
7.10. bra
Erre a ngyzetre kattintva elhzhatjuk a csoportmezt A csoportmez tulajdonsgait lltsuk be az albbiak szerint:
rtk
grpDefaul tBackco l o r
105, 112 200 , 72
A csoportmez most gy fest, mint a 7.10. brn. A GroupBox meglehetsen egyszerGen hasznlhat vezrl. Feladata a keret s a cmfelirat megjelentsn tl mindssze annyi, hogy ms vezrlket troljon. Ez azonban arnint a kvetkezkben ltni fogjuk - igen hasznoss teszi. A Panel jobbra a GroupBox egyszerstett vltozatnak tekinthet, gy itt nem trgyaljuk rszletesebben. Olyankor rdemes hasznlnunk, ha trolra van szksgnk, de feleslegesek a csoportmez kiegszt lehetsgei (vagyis a keret s a cimfelirat). Az egyetlen igazn lnyeges klnbsg, hogy a Panel vezrl az ablakokhoz hasonlan lehetv teszi a grdtsvok hasznlatt, mg a csoportmezkben ez a lehetsg nem ll rendelkezsre.
Vlasztgombok hasznlata
A jellngyzetek nagyszer szolglatot tesznek az igen-nem vagy igaz-harnis rtkek beolvassnl, de fontos jellemzjk, hogy egymstl teljesen fggetlenl mkdnek. Ha teht t jellngyzetnk van egy ablakon, mindegyikk felveheti a ki- vagy bekapcsoltllapotot-tetszleges kombinciban. A vlasztgombok (RadioButton) ugyanakkor klcsnsen kizrjk egymst egy troJn bell, vagyis egy adott trolban csak egy vlasztgombot kapcsolhatunk be. Ha teht egy vlasztgombra kattintunk egy
Kzvetlenl rrajzolhatjuk a kvnt vezrlt a csoportmez felletre. Rhzhatjuk a vezrlt a csoportmezre. Ell1elyezhetjk a kvnt vezrlt az ablakon, majd kivghatjuk s beilleszthetjk a csoportmezbe.
A kvetkezkben a msodik mdszert alkalmazzuk, vagyis rhzzuk a vezrlt a csoportmez felletre. Lssuk, hogyan:
1. Kattintsunk az eszkzkszlet RadioButton elemre, s hzzuk t a csoportmezre.
2. Ha a csoportmez6 fl rtnk, engedjk fel az egrgombot 3. A vezrlre kattintva a vgleges helyre hzhatjuk a vezrlt a csoportmezn
rtk optBackgroundDefault
14, 19
Default Gray
Fontos megjegyeznnk, hogy a Location (hely) tulajdonsg mindig az aktulis trolobjektumhoz viszonyul. Amennyiben a vezrl egy ablakon tallhat, a viszonytsi pontot az ablak bal fels sarka jelenti, ha pedig egy csoportmez tartalmazza, a csoportmez bal fels sarka. Msoljuk le a frissen beillesztett vlasztgombunkat, s illesszk be egy jabb pldnyt a csoportmezbe:
1. Kattintsunk az egr jobb gombjval a vlasztgombra, s vlasszuk a helyi men
Copy pontjt. 2. Kattintsunk a csoportmezre, hogy kijelljk 3. Kattintsunk az egr jobb gombjval a csoportmezre, s vlasszuk a helyi men Paste pontjt, gy ltrehozunk egy j pldnyt a vlasztgombbL A tulajdonsgait lltsuk be az albbiak szerint:
White
7.11. bra
A vklsztgombok k6Zt11 csak egyet
jellhetnk meg
Az ablakunk, amint azt a 7.11. brn is lthatjuk, immr kt vlasztgombbal rendel-
A listamez6k (ListBox) lehetv teszik, hogy elemek listjt trjuk a felhasznlk el. hogy az j elemek beillesztse, illetve a meglevk trlse igen egyszen1 Visual C# kddal megvalsthat, radsul mg arrl is dnthetnk, hogy a felhasznlk egyetlen elemet vagy elemek csoportjt jellhessk ki. Amennyiben egy listamez tbb elemet tartalmaz, mint amennyit egyszerre meg tud jelenteni a kpernyn, automatikusan megjelenik egy grdtsv.
A listamez ,.unokatestvre" a kombinlt lista (ComboBox), amely gy fest, mint egy szvegmez egy kis nyilacskval, amelyre kattintva egy lenyl listamezhz jutunk. Az gy kapott lista kezelse nagyban hasonlt a listamezknlltottakhoz, ezrt ht itt a listk trnakrt trgyaljuk, a kvetkez rszben, a kombinlt listk bemutatsakor pedig csak az egyedi lehetsgeikre trnk ki.
A Pietore Viewer projektnkben ebben a pillanatban semmi szksg nincs listamezre vagy kombinlt listra, ezrt inkbb ltrehozunk egy j projektet a ksrletezshez:
1. Hozzunk ltre egy j Windows Forros Application projektet, s adjuk neki
a Lists nevet. 2. Mdostsuk az alaprtelmezett ablak (Forml. cs) nevt Li st sForm. cs-re,
A list.amez6k minden eleme a vezrl Items gyjtemnyhez tartozik, gy a kezelsk, a beszrsuk s a trlsk is ezen keresztl mehet vgbe. Az I t ems gyjtemnyt leggyakrabban kdbl rjk majd el (erre hamarosan pldt is lthatunk), a tartalma azonban a Properties ablakban is mdosthat.
A gyjtemnyben knnyedn elhelyezhetjk a kvnt elemeket, csak juk be 6ket a szvegmezhe - minden sorba egyet. Adjuk meg a kvetkez elemeket: Atom Heart Mother Wish You Were Here Animals &hoes Meddle Dark Side of the Moon
Ha elkszltnk, a kpernyn a 7.12. bra tartalmt lthatjuk. Az OK gombra kattintva jvhagyjuk az elemeket, s bezrjuk az ablakot. Figyeljk meg, hogy a listamez6ben feltnnek a megadott elemek.
."_
Ed>oes
D u\SidcolthcMoon
7.12. bra
Az /tems gyjtemny kezelsre
tervezskor ez a prbeszdablak
szolgl
Listaelemek hozzadsa
j elemeket az It ems gyO'jtemny Add () tagfggvnyvel illeszthetnk be egy listba. A kvetkezkben egy gombot hozunk ltre, amely egy j albumot helyez el a listban. Szrjunk be egy j gombot az ablakra, s a tulajdonsgait llitsuk be az albbiak szerint:
Tulajdonsg
Name Location Size Text
rtk
btnAdd i tem 96, 159
100, 23
Add an Item
Figyeljk meg, hogy az Add ( ) tagfggvny paramterknt egy karakterlncot vr - ez lesz az j listaelem.
A tervezskor megadott listaelemekkel ellenttben a kddal beszrt elemeket nem rzi meg a program, miutn befejeztk a futtatst.
Futtassuk a projektet az F5 billentyvel, s kattintsunk az j gombra. Lthatjuk, hogy az j album megjelenik a lista aljn. Ha most jra megnyomjuk a gombot, az album mg egy pldnyban rkerl a listra, s ezt a vgtelensgig folytathatjuk. A program nem trdik az elemek azonossgval: az Add ( ) tagfggvny minden hvsval elhelyez egy j elemet a listban.
Az I t ems gyjtemny Add ( ) tagfggvnye fggvnykm is meghvhat; ilyenkor
a visszatrsi rtke az j listaelemnek a gyjtemnyben kaporr sorszma lesz. Ezt mutatjuk be az albbi kdrszletben:
int i nt i ndex; intindex = lst PinkFloydAlbum s . Items . Add( "The Division Be ll" ) ;
Olykor igen jl jhet a listaelemek sorszmnak ismerete, gy ht ne feledkezznk meg errl a lehetsgrL lltsuk le a projekt futst, s mentsk a munknkat, mieltt tovbblpnnk.
Az Insert ( ) tagfggvnnyel
lehetsgnk van arra is, hogy az rtems gyOjtemny meghatrozott helyre szrjuk be az j listaelemet. a tagfggvnynek ugyanis az elem szvege mallett egy sorszmot is tadhatunk. Ne feledjk, hogy az els elem sorszma a O, gy ha az j listaelemet a lista elejre szeretnnk beszrni, a lstPinkFloy dAlbums . I t e ms . I n s ert (O, "The Division Bell";) kddal rhetnk clt.
7. 6ra
staelemek eltvolftsa
A listaelemek eltvoltsa ppen olyan egyszer, mint a beszrsuk. Egyetlen tagfggvnyt kell meghvnunk, mgpedig az I t ems gyjtemny Remove (l tagfggvnyt, amely paramterknt az eltvoltand listaelem szvegt vrja. A kvetkezkben ltrehozunk egy gombot, amely eltvolt egy elemet a listnkrL Jelentsk meg az ablaktervezt, s hozzunk ltre egy j gombot, a tulajdonsgait pedig lltsuk be az albbiak szerint:
rtk btnRemoveitem
96, 188 106, 23
Remove an Item
KattinL<runk dupln a gombra a Click esemnynek az elrshez, s rjuk be az albbit: lstPinkFloydAlbums . Items . Remove{"The Division Bell"); A Remove () tagfggvny az els elemtl (amelynek a sorszma O) kezdve vgighalad a listn, s eltvoltja az els olyan elemet, amelynek a szvege megegyezik a paramterben tadott rtkkel. Ne feledjk, hogy tbb azonos szveg listaelemnk is lehet. A Re:nove (l eltvoltja az els lallatot, majd megszaktja a keresst. Futtassuk a projektet ismt az FS billenty\1vel, majd nyomjuk meg prszor az Add an Item gombot, hogy elhelyezZk a listn a The Division Bell album nhny pldnyt (lsd a 7.13. brt). Ezt kveten kattintsunk a Remove anItem gombra, s figyeljk meg, ahogy a program eltvoltja a listaelem egy pldnyt a listrl.
7.1 3. bra
A listamez tartalmazhat ismtld elemeket, az Items gyjtemnyben azonban mtnden elem egyedi
Egy adott sorszm listaelem eltvoltshoz a RemoveAt <l tagfggvnyt hasznlhatjuk. A lista els elemnek eltvoltshoz pldul ezt rhatjuk: lstPinkFloydAlbums . I t ems. RemoveAt (O l ; . Fontos tudnunk, hogy az utasts kivtelt (hibt) vlt ki, ha a meghvsakor a lista res.
Usta kirtse
A listamezk tartalmnak trlsre a Clear () tagfggvny szolgl. A kvetkezkben el is helyeznk egy gombot az ablakunkon, amely trli a listt A tulajdonsgai legyenek a kvetkezk:
Tulajdonsg Name Location Size Text
rtk
btnClearLi st
96 , 217
Futtassuk a projektet az F5 billenty lenyomsval, majd kattintsunk a Clear Ust (lista kirtse) gombra. A Clear ( > tagfggvny nem foglalkozik azzal, hogy az elemeket tervezskor vagy futsidben helyeztk el a listban - egyszeren trl mindent. lltsuk le a projekt futst, s mentsk a munknkat.
Ne feledkezznk meg arrl, hogy az Add () , az Insert ( ) , a Remove ( l , a RemoveAt () s a Clear () tagfggvnyek az I t ems gyjtemnyhez tartoznak, nem pedig maghoz a l istamezhz. Ha nem figyelnk oda erre, nem rtjk majd, mirt nem jelennek meg az elrhet tagfggvnyek sorban, amikor egy listamez neve utn egy pontot runk a kdban.
kpes adatokat szolgltatni. Fontos megjegyeznnk, hogy ezek a listamez6, nem pedig a hozz tartoz rtems gyO'jtemny tulajdonsgai. A Selecteditem tagfggvny az ppen kivlasztott elem feliratt adja vissza. Ha nincs kivlasztott elem, a visszatrsi rtk egy res karakterlnc lesz. Amennyiben a kivlasztott listaelem sorszmra vagyunk kvncsiak, a Selectedindex tagfggvny siet a segtsgnkre. Emlkezznk vissza, hogy az els6 elem sorszma a O. Ha nincs a listban kivlasztott elem, a Selectedindex visszatrsi rtke -l, ami nem lehet egyetlen elem sorszma sem.
A
kvetkezkben elhelyeznk egy gombot az ablakon, amely egy zenetablakban tjkoztat a lista kivlasztott elemr61 s annak sorszmrL Mindenekel6tt lltsuk le a projekt futst, s adjuk az ablak Si ze . He ight tulajdonsgnak a 320 rtket, hogy kpes legyen befogadni az j gombot. Ilyen apr mdostsokra mindig szmtanunk kell a fejleszts sorn, hiszen mindent nem lthatunk el6re.
rtk
btnShowitern
96, 246 100' 23
Show Selected
Kattintsunk dupln a gombra a Click esemnynek az elrshez, s :juk be az albbi utastst (nyomjunk ENTER-t az els6 sor vgn):
MessageBox.Show("You selected " + lstPinkFloydAlbums.Selecteditem + which has an index of " + lstPinkPloydAlbums.Selectedindex);
a felhasznlk szmra. A hasznlatrl rszletesebben a 17. rn szlunk. Futtassuk a projektet az F5 billentytivel, s kattintsunk a Show Selected gombra. Mivel a listban egyetlen elemet sem vlasztottunk ki, az zenetablak szvege elg rtelmetlennek tnik, a kapott sorszm pedig a -1 (ez jelzi, hogy nincs kivlasztott elem). Vlasszuk most ki a lista egyik elemt, s kattintsunk jra a Show Selected gombra. Az zenetablakban megjelenik a listaelem felirata s sorszma (lsd a 7.14. brt). lltsuk le a projekt futst, s mentsk a a munknkat.
7.14. bra
OK
~ .
L:;.;.;..::;..._..:-.:....;..;;;.....;__ _ _- - '
A Iistamezk lehetv teszik tbb elem kijellst is - amennyiben erre van szksgnk, adjuk a SelectionMode (kijellsi rnd) tulajdonsgnak a MultiSirnple vagy a MultiExtended rtket. Az elbbi esetben a listaelemekre kattintva mdosthatjuk a kijellsk llapott, mg az utbbiban a CTRL vagy a SHIFT billentyt kell hasznlnunk a csoportos kijellshez. A kijellt elemekrl a Selecteditems gyjtemny ad tjkoztatst.
Listk rendezse
A listamez6k s a kombinlt listk rendelkeznek egy Sorted nev tulajdonsggal, amely a vezrlltrehozsakor a False rtket kapja. Amennyiben True-ra lltjuk, a Visual 0~ bcsorrendbe lltja a lista elemeit. A rendezs sorn megvltozik az elemeknek a rt ems gyjtemnyben rvnyes sorszma, gy a Sorted tulajdonsg tlltsa eltti sorszmok nem hasznlhatk a tovbbiakban.
Kombinlt listk
A Iistamezk nagyszer vezrl k, de van kt gyenge pontjuk. Elszr is, meglehetsen sok helyet foglalnak el, msodszor pedig a felhasznlk nem adhatnak meg egyni rtkeket, kizrlag a lista elemei krul vlaszthatnak. Ha takarkeskedni szeretnnk a hellyel, illetve nagyobb szabadsgot szeretnnk adni a felhasznlknak, hasznljuk a ComboBox (kombinlt lista) vezrlt
A kombinlt listk is rendelkeznek Iterns gyjtemnnyel, amely pontosan gy viselkedik, mint a listamezknlltott trsa (a kezelst az elbbiekben rszletesen trgyaltuk). Ismerkedjnk most meg a kombinlt listk mkdsnek alapjaival, s helyezrunk el egy kombinlt listt az ablakunkon, dupln kattintva az eszkzkszlet ComboBox neV\1 elemre. A kombinlt lista tulajdonsgait lltsuk be az albbiak szerint:
rtk cboColors
64, 5
160, 21
Hagyjuk resen
Nyomban feltnhet, hogy a kombinlt lista a listameztl eltren rendelkezik Text tulajdonsggal, amely hasonlan viselkedik, mint a szvegmezk Text tulajdonsga. Ha a felhasznl kivlasztja a lenyi lista valamelyik elemt, az belekerl a szvegmez Text tulajdonsgba. A kombinlt lista alaprtelmezs szerint lehetv teszi azt is, hogy tetszleges szveget adjunk meg a szvegmezjben - akr olyat is, ami nem tnik fel a listaelemek sorban. Hamarosan megtanuljuk, hogyan vltoztathatunk ezen a viselkedsen. Vlasszuk a kombinlt lista Items tulajdonsgt a Properties ablakban, s kattintsunk a megjelen gornbra. A megjelen String Collection Editor ablakban rjuk be a kvetkez listaelemeket, majd kattintsunk az OK gombra: Black Blue Gold
7. ra
Green Red Yellow
vezrt6k 171
Futtassuk a projektet az FS billentyvel, s kattintsunk a kombinlt lista jobb oldaln megjelen nyHra, gy a 7.15. brn lthat lenyl listhoz jutunk. rjuk most be a szvegmezbe a Magenta szt. A Visual C# nem tiltakozik, st valjban akrmilyen szveget berhatunk Elkpzelhet, hogy ppen erre a viselkedsre vgytunk, de az esetek tbbsgben a lehetsgeket a lista elemeire szeretnnk korltozni. Erre szolgl a kombinlt lista DropDownstyle (lenyl lista stlusa) tulajdonsga. Zrjuk be az ablakot, s adjuk a DropDownStyle tulajdonsgnak a DropDownList (lenyl lista) rtket. Futtassuk a projektet az FS billentyvel, s prbljunk berni valamit a szvegmez6be - nem fog siketlni. A kombinlt lista ezttal nem teszi Jehetv a szveg bevitelt, gy csak a lista elemei kzi.il vlaszthatunk St, ha a szvegmezre kattintunk, ugyanazt a lenyl listt kapjuk, mint amikor a kis nyilat nyomtuk meg a vezrl jobb oldaln. lltsuk le a projekt futst, s adjuk a DropoownStyle tulajdonsgnak ismt a DropDown rtket. Prblkozzunk ismt a futtatssal, ezttal azonban adjuk az AutoCompleteSource (automatikus kiegszts forrsa) tulajdonsgnak a Listitems (listaelemek) az AutoCompleteMethod (automatikus kiegsztsi mdszer) tulajdonsgnak pedig a Suggest (javaslat) rtket. ~unk be egy B bett a szvegmezbe- s lss csodt: elnk trul a lista, s a program megjelenti a B-vel kezdd listaelemeket Futtassuk ezutn a programot az AutoCompleteMode Append (hozzfazs) rtkvel is. Ezttal a rendszer a bert szvegrszlettel legjobb egyezst mutat listaelemet jeleniti meg a szvegrnez6ben, ami valban komoly segtsg lehet a felhasznlknak.
7.15. bra
A kombinlt listk erssge a helytakarkossg
Lthatjuk, hogy a Iistamezk s a kombinlt listk hasonl kpessgekkel brnak olyannyira, hogy a listaelemeik trolsa azonos mdon trtnik. A kt vezrl rendeltetse azonban kiss eltr. Vajon melyiket rdemes hasznlnunk? Nos, ez mindig az adott helyzettl fgg. rdemes megfigyelnnk a mindennapokban hasznlt kereskedelmi alkalmazsok felleteinek felptst - elbb-utbb rezzk majd, m.it kell tennnk.
sszefoglals
Ezen az rn megtanulruk, hogy miknt jelentsnk meg szvegeket a felhasznlk szmra. Megismerkedtnk a Label vezrlvel, amely nagyszerGen alkalmas statikus szvegek megjelentsre (amelyeket a felhasznl nem mdosthat), valamint a TextBox vezrlvel, amely lehetvteszi a szvegbevitelt. Megtanultuk, hogyan hozzunk ltre tbbsoros szvegmez6ket, s miknt jelentsk meg a grdtsvokat, ha a szvegmez mrete nem elegend a tartalma megjelentst:hez. Aligha ltezik olyan ablak, amely ne tartalmazna legalbb egy gombot. Megtanulruk ht, hogyan helyezznk el mi is gombokat az ablakokon, radsul- hogy kiss rdekesebb tegyk a felletet- kpekkel is sznesthetjk ket. A gombok kezelse tbbnyire egyszer: nem kell mst tennnk, mint beilleszteni ket az ablakra, megadni a Name s a Text rulajdonsgukat, no meg elhelyezni nmi kdot a Cl i c k esemnykben - szmunkra ez mr mind-mind gyerekjtk. A jellngyzetekkel s a vlasztgombokkal igen-nem, illetve egymst klcsnsen kizr vlasztsi lehetsgeket knlhatunk fel. Ezen az rn megismerkedtnk a hasznlatukkal, s megtanultuk azt is, hogy miknt rendezhetjk ket logikai csoportokba a csoportmezk segtsgveL Vgezetl kzelebbi ismeretsget ktttnk a listamezkkel s a kombinlt listkkal, amelyekkel elemek Hstit trhatjuk a felhasznlk el. Sz esen a listaelemek beszrsrl tervezs kzben s futsid6ben , s megtanultuk azt is, hogy miknt rendezzk a listinkat. A ListBox s a comboBox vezrlk rengeteg lehetsget tartogatnak, rdemes ht mlyebben megismerkedni velk. A vezrlk nlkl a felhasznlk nem tudnnak kapcsolatba lpni az ablakainkkaL Az elzekben megismerkedtnk azokkal az alapvet vezrlkkel, amelyekre a felleteinket pthetjk. Fontos tudnunk, hogy itt csak zeltt kaptunk a lehetsgekbla vezrlk a lertaknl ltalban jval tbbre kpesek. Mindazonltal, mivel rengeteget hasznljuk majd ket, hamar beletanulunk a kezelskbe, s a knyv tovbbi rszben lassan felptjk a ml1kdsket biztost kdot is.
Krdezz-felelek
K: Kzvetlenl az ablakokon is elhelyezhetnk vlasztgombokat? V: Igen. Mivel az ablak maga is trol, a rajta elhelyezett vlasztgombok klcs-
nsen kizr viszonyba kerlnek egymssal. Amennyiben egy msik vlasztgombcsoportot is hasznlatba szecetnnk venni, jabb trolra lesz szksgnk. Jllehet semmi sem tiltja, hogy kzvetlenl az ablakra helyezzk
a vlasztgombokat, mgis jobb, ha egy csoportinezbe gyazzuk 6ket, mert gy cmfeliratot s keretet is kapnak, radsul az ablak tervezse sorn knnyebb egyszerre mozgatni a csoportot (csak t kell hznunk a csoportmez5t). K: Egyes alkalmazsokban tallkozhatunk olyan listamezkkel, amelyeknek az eleme me/lett jel616ngyzetek llnak. Ltezik ilyen vezrl? V: Igen, a Visual C# 2008 egy egyedi vezrl5t knl erre a clra, amelynek a neve CheckedListBox.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
l. Mdyik vezrl5vel jelenthetnk meg olyan szvegeket, amelyeket a felhasznl nem szerkeszthet? 2. Mdyik az a tulajdonsg, amely egyarnt megtallhat a cnkkben s a szvegmez6kben, s amelynek az a szerepe, hogy meghatrozza, hogy mi jelenjen meg a vezrl) felletn? 3. Melyik tulajdonsgnak kell True rtket adnunk ahhoz, hogy mdosthassuk a szvegmez5 magassgt? 4. Mi a But ton vezrl alaprtelmezett esemnye? 5. Hogy hvjk azt a gombot, amelyiknek a Click esemnye akkor is bekvetkezik az ENTER lenyomsra, ha ms vezrl van fkuszban? 6. Melyik vezrl6vel rdemes igen-nem vlasztsi lehetsget adnunk a felhasznlnak? 7. Hogyan kszthetnk kt vlasztgomb-csoportot, amelyeknek az elemei az egyes csoportokon bell klcsnsen kizrjk egymst? 8. Melyik gyjtemnyen keresztl kezelhetjk a listk elemeit? 9. Melyik tagfggvnnyel helyezhetnk el egy listaelemet a lista meghatrozott helyn?
Vlaszok
1. 2. 3. 4. A Label vezrlveL A Text tulajdonsg. A Mult i line tulajdonsgnak. A Click esemny.
Felh~i
fellet
Gyakorlatok
1. Az elz rkon tanultak alapjn lltsuk ssze az Options ablak tabultorsorrendjt A sor els eleme legyen a felhasznlnevet tartalmaz szvegmez. Mindenkppen jelljnk ki egy elemet, miel6tt a gombra kattintannk 2. Hozzunk ltre egy ablakot kt listamezvel, s az egyiket tltsk fel pr elemmel a tervezs sorn a Properties ablakban. Hozzunk ltre egy gombot, amelyre kattintva a felhasznl eltvolthatja az els lista kivlasztott elemt, hogy az a msik listban jelenjen meg.
8. RA
Fejlett vezrlk hasznlata
A lecke tartalmb61:
Idzt6k ltrehozsa Fles prbeszdablakok ltrehozsa Kpek trolsa az ImageList vezrlben Hierarchikus listk ltrehozsa a Tre eView vezrl segtsgvel A 7. rn bemutatott hagyomnyos vezrlk lehetv teszik, hogy igen hasznos felleteket ksztsnk, de a valban rugalmas s interaktv alkalmazsok tovbbi, fejlettebb vezrlket ignyelnek. Windows-felhasznlknt bizonyra sokukkal tallkoztunk gy a Tab vezrlvel, amellyel az adatokat lapokbl ll ablakokon jelenthetjk meg, vagy a TreeView vezrlvel, amely az Intzben lthat faszerkezeret biztostja. Ezen az rn ezekkel a vezrlkkel foglalkozunk, gy megtudhatjuk, hogy mit kell tennnk ahhoz, hogy az alkalmazsaink fellere egy szintre kerljn az ismert s npszeri programokvaL
ldztk
A 7. rn megismert vezrlk kzs jellemzje, hogy a felhasznlk kapcsolatba lphetnek velk. Mindazonltal nem minden vezrl rendelkezik ezzel a lehetsggel vagy korlttal, ha gy jobban tetszik. Egyeseket kizrlag a program fejlesztje rhet el. ilyen pldul az OpenFileDialog vezrl, amelyet az l. rn, a Picture Viewer prograrn ltrehozshoz hasznltunk. E vezrlk kz tartozik a Timer (idzt) is, amellyel egy meghatrozott idtartam letelte utn valamilyen esemnyt vlthatunk ki. e r hasznlathoz az albbiak szerint: rjunk is egy rvid pldaprogramot a Tim
1. Hozzunk ltre egy j Windows Application projektet, s adjuk neki a Timer
Examp le nevet. 2. Kattintsunk az egr jobb gombjval a Forml . cs feliratra a Solution Explorerben, vlasszuk a helyi men Rename (tnevezs) pontjt, s adjuk az ablaknak a TimerExampleForm.cs nevet. 3. Legyen az ablak Text tulajdonsgnak rtke Tim er Exam ple. (Kattintsunk az ablakra, hogy elrjk a tulajdonsgait.) 4. Helyezznk el az ablakon egy Timer vezrlt, dupln kattintva az eszkzkszlet Timer elemre (amelyet a Coi'l\ponents, vagyis sszetevk csoportban tallhatunk meg). A Time r vezrl futsidben lthatatlan, gy a kperny aljn rallhat szrke terletre kerl, nem pedig magra az ablakra (lsd a 8.1. brt). A tulajdonsgait lltsuk be az albbiak szerint:
Tulajdonsg Name Enabled I nterva l
rtk tmrClock Tr ue
l OO O
Taln szrevettk, hogy a Timer vezrl a trsaihoz kpest meglehetsen kevs tulajdonsggal rendelkezik - igazndibl nincs is sokra szksge. E kevs kzl is a legfontosabb az Int erval (idkz) nevezet, amely azt hatrozza meg, hogy rnilyen gyakran vltsa ki a vezrl a Ti ck esemnyt (ebben helyezhetjk el azt a kdot, amely a megadott idkz lejrta utn valarnilyen rnveletet vgez). Az I nterval tulajdonsg rtkt ezredmsodpercben adhatjuk meg, vagyis az 1000 rtk l msodpercnek felel meg - ezt a belltst alkalmazzuk a pldnkban is. Ms vezrlkhz hasonlan a Timer mkd st is gy rthetjk meg a legknnyebben, ha kiprbljuk, ezrt egy egyszer rt ksztnk egy Timer s egy Label vezrl segtsgveL Az ra rnkdsnek alapjt az adja, hogy a Ti mer vezrl minden msodpercben kivltja a Ti ck .esemnyt (ezrt lltottuk az Interval tulajdonsgot 1000 ezredrnsodpercre), az esemnyben pedig elhelyezzk a cmkn a pontos id rtkt
8. ra
8.1. bra
A futsidben lthatatlan vezrlk a tervez aljn jelennek meg, nem pedg az ablaksablonon
rtk
lbl Clock False FixedSing le
95 , 120 100 , 23
A cmke AutoSize tulajdonsga hatrozza meg, hogy a vezrl mrete alkalmazkodik-e a Text tulajdonsg vltozsaihoz. Mivel most a szveg a vezrl kzephez igazodik, nincs SZksgnk az automatikus mretezsre. Ez utn kattintsunk dupln a Timer vezrlre a Tick esemnynek az elrshez. Az idzt az els bekapcsolsakor O ezredmsodpercrl indul, majd amikor elri az Interval rtkt, kivltja a Tic k esemnyt, majd ismt 0-rl kezdi a szmolst. Ez a ciklus mindaddig folytatdik, amig az idztt ki nem kapcsoljuk (az Enabled tulajdonsgnak a Fal se rtket adva). Mivel ezt a tulajdonsgot tervezskor True rtkre lltottuk, az idzt azonnal megkezdi a mffi<:dst, amint a rendszer betlti az t tartalmaz ablakot. Helyezzk el az albbi utastst a Ti ck esemnyben:
lbl Clock. Text = Oat eTime .Now.ToLongTimeStri ng(l ;
8.2. bra
Idztk segtsgvel knnyen elrhetjk, hogy egy adott kd meghatrozott idkznknt lefusson
lltsuk le a projekt futst, s mentsk a munknkat. Az idztk nagyszer eszkzk, de jobb, ha csak mctkkel hasznljuk ket. Ahhoz ugyanis, hogy az idzt mkdjn, a Windowsnak folyamatosan figyelnie kell r, s ssze kell vetnie a bels rjnak az llst a megadott idkzzel, enlkl ugyanis nem tudn jelezni a megfelel idben, hogy a Ti c k esemnynek be kell kvetkeznie. Rviden szlva teht az idztk rendszererforrsokat emsztenek fel. Egy-kt idzt persze mg nem jelenthet gondot, de ha tucatnyira lenne szksg, jmagam bizony ms megolds utn nznk (s szinte mindig van ms megolds).
8. 6ra
1.
Elszr
az Options ablak megnyitshoz. 3. Helyezznk el egy j Tab vezrlt az ablakon, dupln kattintva az eszkzkszlet TabControl elemre (a containers, vagyis Trolk csoportban). A Tab vezrl alaprtelmezs szerint kt lapbl ll, s neknk nem is kell ennl tbb. lltsuk be a vezrl tulajdonsgait az albbiak szerint:
Tulajdonsg Name Location Size
rtk tabOptions
2' 2 202, 94
4. A Tab vezrln megjelen fleket a TabPanel tulajdonsg hatrozza meg. Jelljk ki ezt a tulajdonsgot a Properties ablakban, s kattintsunk a neve mellett megjelen nyilacskra, amely megnyitja a TabPage Collection Editor ablakot. A prbeszdablakon a kt alaprtelmezett lap jelenik meg (lsd a 8.3. brt) .
....-,
r-
~== ...,._..
Ac<~
N'd
OT_...
~Der-o~
~r;J
8o<deSiylt
cFGMCRlghtTol... fal
----a;
.....
c...tM!Tcoi
-.J
No
8.3. bra
A lapok belltsra a TabPage
Collection Editor szolgl
5. A gyjtemnyben szerepl lapoknak a Visual C# TabPageX alakban ad nevet, ahol az x laponknt eltr szm. Elmletileg helyben is hagyhatjuk ezeket, de jobban jrunk, ha olyan beszdes neveket vlasztunk, mint a pgeGeneralPage, a pgePreferencesPage s hasonlk. A rendszer alaprtelmezs szerint a TabPage l lapot vlasztja ki, amelynek a tulajdonsgait a jobb oldalon lthatjuk. Legyen a lap j neve pgeGeneral, a Text tulajdonsgnak pedig adjuk a General rtket (ez jelenik meg magn a fln). J tudni, hogy a tulajdonsgokat bcsorrendben is megjelenithetjk, ami jelentsen megknnyti az letnket. 6. Kattintsunk a listban a TabPage2 elemre. A Name tulajdonsgnak adjuk a pgeAppearance, a Text tulajdonsgnak pedig az Appearance rtket. 7. Az OK gombra kattintva mentsk a mdostsokat.
180
8.4. bra
rdemes a fleknek beszdes nevet adnunk
A lapok gyors beszrsra s eltvoltsra nagyszer lehetsget adnak a Properties ablak aljn tallhat ler ablaktbla ikonjai.
A 'rab vezrlel minden lapja trolknt viselkedik, a Panel vagy a GroupBox vezrlhz hasonlan. Ez magyarzza azt is, hogy mirt nem hzhatjuk el a Tab vezrlelt a kzepre kattintva. Az elmozdtshoz a ngy nyilat tartalmaz apr ikont kell megragadnunk, amelyet a 8.4. brn a General fl felett lthatunk. A kvetkezkben az Options ablak korbban elhelyezett vezrlelit a Tab vezrlel lapjaira teleptjk t: 1. Kauintsunk a csoportmez6re, hogy kijelljk (vigyzzunk, nehogy valamelyik vlasztgombjt talljuk el), kattintsunk r az egr jobb gombjval, majd vlasszuk a helyi men Cut (Kivgs) pontjt. 2. Kattintsunk a Tab vezrl6re. 3. A Tab vezrl kijellse utn kattintsunk az Appearance flre, gy a msodik lapra kerlnk. Kattintsunk az Appearance lap kzepre. 4. Kattintsunk az egr jobb gombjval az Appearance lapra, s vlasszuk a helyi men Paste (Beilleszts) pontjt. 5. Most kattintsunk a General flre, gy visszatrnk az els6 lapra. 6. Vigyk el a Tab vezrlelt az tbl a mozgat ikon (apr ngyzet ngy nyilacskval) elhzsvaL Hzzuk a fleket az ablak aljra. 7. Kattintsunk a User Name cmkre, nyomjuk le a SmPT billent:y(t, s jelljk ki a User Name szvegmez6t s a jellelngyzetet is. 8. Vgjuk ki a kijellt vezrlket a CTRL+X billent:y(kkel. 9. Kattintsunk a Tab vezrl6re. 10. Kattintsunk az egr jobb gombjval a General lap kzepre, s vlasszuk a helyi men Paste pontjt. 11. Adjuk a Tab vezrlel Location tulajdonsgnak a 12, 12 , a Size tulajdonsgnak pedig a 287, 145 rtket. 12. Rendezzk nagyjbl kzpre az Appearance lapon tallhat vezrlelket (lsd a 8.5. brt).
8. 6ra.
8.5. bra
A fillekkel knnyedn csoportosthatjuk az sszetartoz vezrlket
Utols lpsknt kattintsunk az Appearance flre, s hzzuk a lap kzepre a csoportmezt. Ha elgedettek vagyunk az eredmnnyel, vltsunk a General lapra. Kt egyszer programozsi ismeret birtokban a Tab vezrl lehetsgeinek 990/o-l elrhetjk. Elszr is, futsidben meg kell tudnunk llaptani, hogy a felhasznl melyik flet jellte ki. Erre szolgl a Selectedindex (vigyzat, nem a Tabindex) tulajdonsg, amely a kivlasztott fl sorszmt adja vissza: az els esetben O-t, a msodiknl l-et, s gy tovbb. Msodszor, valahogy rteslnnk kell arrl, ha a felhasznl vlt a lapok kztt - pontosan ezt jelzi a SelectedindexChanged esemny, amelynek kdjban a Selectedindex rvn megtudhatjuk, hogy melyik az jonnan kivlasztott fl. A Tab vezrl klnlegessge, hogy minden lapja kln esemnykszlettel rendelkezik. Ha magukra a flekre kattintunk dupln, a Tab vezrl globlis esemnyeihez jutunk hozz (itt tallhatjuk meg a SelectedindexChanged esemnyt is), ha azonban az egyes lapokra kattintunk dupln, a lapok sajt esemnykszlethez jutunk. Futtassuk a projektet, s figyeljk meg a flek zssel, mentsk a munknkat.
mkdst.
Ha vgeztnk a ksrlete-
Pillantsunk most az ImageList vezrl ImageSize (kpmret) tulajdonsgra. Ha mindent jl csinltunk, az rtke 16, 16. Ellenkez esetben elkpzelhet, hogy nem 16x16 kppontos ikont vlasztottunk. A tulajdonsg elvileg automatikusan az ImageList vezrlbe elsknt beszrt kp mreteit veszi fel, de tallkeztam mr olyan helyzettel is, arnikor ez nem trtnt meg. Amennyiben ms mret kpekkel dolgozunk, elfordulhat, hogy magunknak kell belltanunk ezt az rtket Soha nem lehetnk biztosak abban, hogy a kp fehr - vagy brmilyen ms rgztett szn - httr eltt jelenik majd meg. A vradan helyzetek megoldsra szaigl az ImageList vezrl TransparentColor (tltsz szm) tulajdonsga, amelynek az rtke alaprtelmezs szerint Transparent (tltsz). Mivel ikonfjlt hasznltunk,
Ezen az rn mindssze belekstolunk a ListView vezrl lehetsgeibe. Az alapok elsajttsa utn rdemes mlyebben is megismerkednnk ennek a nagyszer eszkznek a hasznlatval, a sg, illetve ms segdanyagok segtsgveL A befektetett id mindenkppen megtrl, hiszen listk megjelentsre lpten-nyomon szksgnk lesz.
Helyezznk el egy ListView vezrlt az ablakunkon, dupln kanintva az eszkzkszlet Lis t view elemre, s a tulajdonsgait lltsuk be az albbiak szerint:
rtk
lstMyListView
8, 8
Lthat, hogy a Properties ablakban hozzrendelhetnk egy I mageList vezrlt a listanzethez- persze ugyanezt a kdban is megtehetjk Nem minden vezrl tmogatja a kplistk hasznlatt, amelyek azonban igen, azoknak az esetben ilyen egyszer
Oszlopok ltrehozsa
Amikor a View tulajdonsgnak a Details rtket adtuk, a vezrl fejlceket prblt megjelenteni az oszlopok tetejn. Mivel azonban mg nem hatroztunk meg oszlopokat, a fejlcek sem jelentek meg. Ennek tartalmt a Colurnns (oszlopok) gyjtemnyben meghatrozott oszlopok adjk meg.
A kvetkezkben oszlopokat adunk a ListView vezrlhz:
1. Jelljk ki a Properties ablakban a Columns tulajdonsgot, s kattintsunk a neve mellett megjelen kis gombra, gy a ColumnHeader Collection Editor abiakba jutunk. 2. Az Add gombbal szrjunk be egy j fejlcet, a Text tulajdonsgnak adjuk a Name rtket, a Width tulajdonsgt pedig lltsuk 120-ra. 3. Kattinlc;unk ismt az Add gombra, hogy jabb oszlopot hozzunk ltre, a Text tulajdonsgnak pedig adjuk a State rtket. Az oszlopok nevt nem kell mdostanunk, mivel nem hivatkezunk rjuk ezen a tulajdonsgon keresztl. 4. Kattintsunk az OK gombra, gy rgztjk a belltsokat, s bezrjuk az ablakot. Listanzetnk gy kt oszloppal rendelkezik, amelyeknek immr nevk is van (Jsd a 6.6. brt).
6.6. bra
A ListVew vezrlvel tbboszlopos listkat is megjelenfthetnk
8. 6ra.
listaelemek beszt'lrsa
Kvessk az albbi lpseket, hogy kt listaelemet helyezznk el a ListView vezrl6ben: 1. Jelljk ki a Properties ablakban az Items tulajdonsgot, s kattintsunk a neve mellett megjelen kis gombra, gy a ListViewHem Collection Editor abiakba jutunk. 2. Az Add gombbal hozzunk ltre egy j listaelemet, a Text tulajdonsgnak pedig adjuk a James Foxall rtket. 3. Jelentsk meg az Imageindex tulajdonsg lenyl listjt, amelyben megtallhatjuk a csatolt ImageList vezrl kpeit (lsd a 8.7. brt). Vlasszunk egyet kzlk.
8.7. bra
A csatolt kplista tartalma k6nnyedn elrhet a ListView vezrlben
4.
5.
6. 7.
A listaelem Text tulajdonsga hatrozza meg, hogy milyen szveggel jelenjen meg a ListView vezrl6ben. Amennyiben a View tulajdonsgnak a Details rtket adtuk, s tbb oszlopot is meghatroztunk, a Text tulajdonsg rtke az elsben jelenik meg, mg a tbbi tartalmt a Subitems (rszelemek) gyjtemny adja meg. Kattintsunk ht a Subitems tulajdonsgra (amelyet a ListViewitems tulajdonsgainak Data csoportjban lelhetnk meg), majd a nevemellett megjelen kis gombra, gy a ListViewSubltem Collection Editor abiakba jutunk. Az Add gombra kattintva szrjunk be egy j rszelemet, a Text tulajdonsgnak pedig adjuk a Nebraska rtket. Az OK gombra kattintva trjnk vissza a ListViewltem Collection Edilor ablakba. Kattintsunk ismt az Add gombra egy j elem ltrehoz'.ishoz. A 'l'ext tulajdonsg rtke ezttallegyen a sajt nevnk, s adjunk hozz a fentiek szerint egy j rszelemet is. Ezttal a Text tulajdonsgnl tntessk fel a sajt orszgunk nevt. Mellkeljnk kpet is a nevnkhz, ahogy a szerz6 is tette.
8.8. bra
A ListView vezrl szmottevcn gazdagabb lehetsgeket knl az egyszem listamezknl
11. lltsuk le a projekt futst, majd adjuk a listanzet FullRowSelect tulajdonsgnak a True rtket, s futtassuk jra a programot. 12. Kattintsunk ismt az orszgra. Ezttal a program kijelli a nevnket- st voltakppen az egsz sort. Jmagam ezt a belltst jobban kedvelem, de ez mr inkbb egyni zls krdse. lltsuk le a projekt futst, s mentsk a munknkat.
8. ra
Amennyiben az elemhez kp is tartozik, msodik paramterknt ennek sorszmt is tadhatjuk: lvwMyListView.It ems . Add( "Mike Cook",
0) ;
Ha az elem rszelemekkel is rendelkezik, a dolog kezd bonyolultt vlni, az Add () tagfggvnyben ugyanis csak szvcgel s egy sorszmot adhatunk meg. A listaelem tovbbi tulajdonsgainak elrshez hozz kell jutnunk a hivatkozshoz. Ne feledjk, az j elemek alaprtelmezs szerint egyetlen rszelemmel rendelkeznek, a tbbit magunknak kellltrehoznunk. Az I t ems gy1Ijtemny Add (l tagfggvnye nagyszera szalglatot tesz neknk, hiszen a visszatrsi rtke ppen az j elemre mutat hivatkozs. Ezt trolhatjuk egy vltozban, s ezen a vltozn keresztl tetszs szerinti miveleteket vgezhetnk az elemen. (A vltozk hasznlatrl bvebben a 11. rn tanulunk.) Az albbi kdban ltrehozunk egy j elemet, s elhelyeznk egy rszelemet s gyijtemnyben: a Subitem ListViewi Lem obj Listitem; objListitem -= lvwMyListView. Items . Add ( "Mike Sakl ar", 0) ; obj Li stitem .Sublt ems . Add( "N ebr aska " ) ;
elemnek hivatkozst. Amennyiben a listanzet MultiSelect tulajdonsgnak rtke True (ez az alaprtelmezs) a felhasznl a CTRL, illetve a SHIFf billentyi lenyomsa mellett tbb listaelemet is kijellhet Ez az oka annak, hogy a vezrl a Selecteditems gyjtemnyt teszi elrhetv, nem pedig egy egyszera Sel ecteditem tulajdonsgot. Az albbi kddal pldul megjelenthetjk az els (vagy egyetlen) kijellt elem feliratt:
if (lvwMyListView. Selecteditems .Count
> 0) MessageBox.Show(lvwMyListView. Selectedi tem s [O) .Text);
Fontos, hogy ellenrizzk a Sel ec t editems gy"jtemny c ount tulajdonsgt, ha ugyanis egyetlen elem sincs kijellve, a rendszer hibazenetet ad, amennyiben a gyjtemny o sorszm elemre hivatkozunk.
kijellt elemet pldul az albbi kdsorral tvolthatjuk el: lvwMyListView. I t ems . Remove (lvwMyListView. Selecteditems(O)l ; Ezttal is fontos megvizsglnunk, hogy valban ltezik-e kijellt elem.
Helyezznk ht el egy j Treeview vezrlt az ablakunkon, dupln kattintva az eszkzkszlet Treeview elemre, a tulajdonsgait pedig lltsuk be az albbiak szerint:
Tulajdonsg Name ImageList Location Size
8. ra
Futtassuk a projektet az FS billenty'vel, s kattintsunk a gombra. A fban kt csompont jelenik meg - mindkt Add ( ) hvshoz egy (lsd a 8.9. brt).
,;j} [;. INI t.=,
I'Dii<@JI!Ill!j
' !bill
t
" ' ' '
a..;.. r-~ a
,..
Hatne
Jam~
Ileinoka
CllrGtr
lcl::"
t M!.. lj
-
..
8.9. bra
Aja elemei a csompontok
Vegyk szre, hogy a kt csompont a hierarchia azonos szintjn jelenik meg, egyik sem gyermeke vagy szlje a msiknak. Amennyiben az sszes csompontunkat ugyanazon a szinten szeretnnk megjelenteni, valjban egy egyszen1lstt kapunk, gy rdemesebb a ListView vezrlt hasznlnunk. lltsuk le a projekt futst, s trjnk vissza a gomb Click esemnyhez. A csompontokrl rdemes tudnunk, hogy mindegyikknek tbb gyermeke lehet, de csak egyeden szlcsomponttal rendelkezhetnek. (Ez utbbira a csompont Parent tulajdonsgval
190
rtk btnCreateChild
89' 231 80' 23
Create Child
Ez a kd hasonlt a List Vi ew-pldban ltottakhoz. A Nodes gyGjtemny Add () tagfggvnye egy hivatkozst ad vissza a frissen ltrehozott csompontra. A kdunk teht bevezet egy TreeNode tpus vltozt, ltrehoz egy j csompontot, amelynek a hivatkozsr elhelyezi ebben a vltozban, majd beszrja az j csompontot az els csompont Nodes gy(jtemnybe. Az eredmny megtekintshez futtassuk a projektet az F5 billentyGvel, s kattintsunk az j gombra. A kapott listban egyetlen elemet tallhatunk, amely mellett azonban egy pluszjel ll, amely gyermekcsompontok jelenltre utal. Kattintsunk erre a pluszjelre, s mris megjelennek a gyermekek (Jsd a 8.10. brt).
~~.T,_
- - i l==!Uo
c.r..r.
~~ou~~ 01
WddNodo ~ ~ a-<Md ll
l
mlysg hierarchit
8.10. bra
A TreeView vezrlveltetszsszerinti kszthetnk
8. ra
A plda igen egyszer(), hiszen mindssze egyetlen szlcsompontot s egy gyermeket tartalmaz, az itt tanultak alapjn azonban ugyanilyen knnyedn sokkal sszetettebb fkat is kszthetnk, tbb tucat vagy akr tbb szz csomponttaL
Csompontok ettvolftsa
Ha el szeretnnk tvoltani egy csompontot, a Nodes gyjtemny Remove () tagfgg-
vnyt hivhatjuk segtsgl. A Remove () paramterknt egy ltez csompontot vr, ezrt pontosan tudnunk kell, hogy rnit is akarunk eltvoltani. A Nodes gyjtemny ez esetben is hasonlan viselkedik a ListView vezrl Items gyjtemnyhez, gy alapveten ugyanazok a tennivalink. Az ppen kijellt csompontot pldul a TreeView vezrl SelecteNode tulajdonsga adja meg, gy ennek az eltvoltshoz az albbi kdot hasznlhatjuk
tvwLanguages .Nodes.Remove(t.vwLanguages .SelectedNode);
Amennyiben ezt a kdot olyankor hvjuk meg, amikor nincs kijellt csompont, hibt kapunk. Az adattpusokrl s az egyenletekrl a 11. rn tanuJunk majd, elljrban azonban annyit elmondhatunk, hogy ha egy objektumvltoz nem hivatkozik semmilyen objektumra, akkor egyenrtktl a Visual C# null kulcsszavval. Ennek ismeretben vintzkedseket tehetnk a fent emlitett hiba kikerlsre (fontos megjegyeznnk, hogy a ListView vezrlnl ltottakkal szemben itt egyszerre csak egy csompontot jellhetnk ki):
if (! (tvwLanguages.SelectedNode ==null)); tvwLanguages .Nodes.Remove(tvwLanguages .SelectedNode);
A ListView vezrlhz hasonlan ezttal is csak felletes trgyalsba bocstkozhattunk, gy mindenkinek csak azt tancsolhatom, hogy mlyedjen el a TreeView tovbbi lehet6sgeinek megismersben- higgyk el, rdemes!
sszefoglals
A Visual O; szmos vezrljnek lehet6sgei messze tlmutatnak a 7. rn megismert hagyomnyos trsaikn. Ezen az rn a legismertebbekrl szltunk nhny szt. Meglanultuk, hogy miknt vlthatunk ki egy esemnyt meghatrozott id6kznknt a Timer vezrlvel, ezt kveten pedig megismertk a Tab vezrlt, amely nagyszer lehetsget ad a fellet hatkony elrendezsre a jl ismert fles lapok rvn. Az ra sorn a hasznos ImageList vezrlrl is tanultunk, amely kpek trolst s ms vezrlkkel trtn egyszer megosztst teszi lehetv. Vgezetl szt ejtettnk a ListView s a TreeView vezrlkrl is, amelyek sokoldal felletet biztostanak a strukturlt adatok megjelentshez. rdemes prblgatnunk ezeknek a vezrlknek a kpessgeit, hiszen minl jobban megismerjk 6ket, annl knnyebben kszthetnk hatkony felleteket az alkalmazsaink szmra.
Krdezz-felelek
K: Mt tegynk, ha tbb
idztre van szksgnk, de takarkoskodni szeretnnk a rendszer erforrsaivall V: Ahol csak leheLsges, hasznljunk egy idztt tbb feladatra. Ez igen egyszer, ha kt esemny azonos idkznknt kvetkezik be: ilyenkor felesleges kt idztt hasznlnunk. Akkor sincs azonban veszve minden, ha nem gy ll a helyzet - statikus vltozkkal s nmi logikval (lsd a 11. rn) gy is lehet sgnk van a Timer-esemnyek megosztsra. K: Mire hasznlhatjuk a lertakon fell az ImageList vezrlt? V: Pldul kpet rendelhetnk a Treeview vezrl kijellt csompontjhoz vagy a Tab vezrl egyes fleihez, hogy csak kettt emltsnk a rengeteg lehetsg kzl. A kplistk sokoldalan alkalmazhatk - a ksbbiekben megismert fejlettebb vezrlk pedig jabb s jabb pldkat adnak majd erre.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
8. ra
lsmtl6 krdsek
1. 2. 3. 4. 5.
6.
7. 8. 9.
Milyen egysgben mrjk a Timer vezrl Interval tulajdonsgnak rtkr? Milyen gyjtemnnyel adhatunk j lapokat (fleket) a Tab vezrlhz? Melyik tulajdonsg adja vissza az ppen kijellt fl sorszmt? Igaz vagy hamis? "A klnbz mret kpek trolshoz klnbz ImageList vezrlket kell hasznlnunk." Milyen rtket kell adnunk a View tulajdonsgnak ahhoz, hogy oszlopokat kapjunk a TreeView vezrl6ben? Milyen gyjtemnybe kerlnek a ListView egy-egy elemhez csatolt rszelemek? Melyik objektum melyik tulajdonsga adja meg, hogy hny elem tallhat a ListView vezrl6ben? Hogy hvjk a TreeView elemeit? Hogyan rhetjk el, hogy egy csompont egy msik csompont gyermeke legyen?
Vlaszok
1. 2. 3. 4. 5.
6.
7. 8. 9.
Ezredmsodpcrcben. A TabPages gy\Ijtemnnyel. A Selectedindex tulajdonsg. Igaz. Details. A Subitems gyjtemnybe. A Selecteditems gyjtemny Count tulajdonsga. Csompontoknak (node). Adjuk hozz a szlcsompont Nodes 8)'\jtemnyhez.
Gyakorlatok
1. Helyezznk el egy msodik ImageList vezrlt a ListView-projektnkben. Adjunk egy ikont (32x32 kppontos mretekkel) ehhez a kplisthoz, az ImageSi ze tulajdonsgt lltsuk a 32,32 rtkre, majd csatoljuk az ImageList vezrlt a ListView LargeimageList tulajdonsghoz. Mdostsuk a View rulajdonsgot Large Icons, illetveTile rtkre, s figyeljk meg a felleten megjelen nagy ikonokat. 2. Hozzunk ltre egy j projektet, majd helyezznk el az alaprtelmezett ablakon egy ListView vezrlt, egy gombot, valamint egy szvegmez6t. rjk el, hogy ha a felhasznl a gombra kattint, a program j elemet hozzon ltre a ListView vezrl6ben a szvegmez tartalmval.
9.
RA
Menelemek hozzadsa, thelyezse s trlse Bekapcsolhat menelemek ltrehozsa A menk programozsa Krnyezeti menk ltrehozsa Gyorsbillenty(Ik hozzrendelse Eszkztrelemek ltrehozsa Vltgombok s elvlasztk meghatrozsa llapotsor ltrehozsa
A Windows egyik legnagyobb vonzerejt a grafikus felhasznli fellet (Graphical User Interface, GUI) adja, ugyanakkor nem kevs olyan felhasznl van, aki els6sorban a billenty(Izetre tmaszkodik, s csak akkor nyl az egrhez, ha az felttlenl sruksges. Nagyszer plda erre az adatbevitel terlete - az itt dolgozk egy pillanatra sem veszik Ie a kezket a billenty(Izetr61. Ezrt a programfejleszt cgek termktmogatsi osztlyn gyakoriak a dhs telefonhvsok, amelyekben a felhasznlk tiltakoznak amiatt, hogy egyes gyakran hasznlt Iehet6sgek kizrlag az egrrel rhet6k el. A billenty(Izethez ragaszkod felhasznJk szmra a menk jelentik a navigci legegyszerub mdjt,
Menk felpftse
Amikor azt mondtuk, hogy a Visual C# 2008-ban a menk felptse minden eddiginl egyszerub, egyltaln nem tloztunk -a kezelsk magtl rtetd, s az eredmnyt azonnal mcgszemllhetjk a kpernyn. Nem lehet elgg hangslyozni a j menrendszer fontossgt, s mosl, hogy az elksztse ilyen egyszerv vlt, semmi sem ll az utunkba a megvalstsa fd. A felhasznlk az alkalmazsok els futtatsnl gyakran elbb a mensort tekintik t, s csak azutn nylnak a hasznlati tmutatrt. (Ez olyannyira igaz, hogy a legtbb felhasznl ez utbbi lpst gyakran ki is hagyja.) Egy jl felptett menrendszer sokat segt abban, hogy a felhasznlk knnyebben megrtsk s
9.1. bra
Szaksgnk lesz nmi helyre az ablak tetejn a menk s az eszk6ztrak szmra
9.2. bra
Amkor men.t helyeznk egy ablakra, mg nem szerepel benne egyetlen menpont sem
7. Kattintsunk a Type Here feliratra, rjuk be a &File szveget, majd nyomjunk ENTER-t. Ahogy gpelni kezdnk, a Visual C# jabb kt Type Here felirat mezt jelent meg (lsd a 9.3. brt).
9.3. bra
Amint ltrehozunk egy menpontot, a rendszer azonnal kszen ll tovbbiak hozzadsra
Pillantsunk mosl a Properties ablakra (ha nem ltjuk, az F4 billentyvel megjelenthetjk). Ahogy bertuk a szveget, ltrehoztunk egy j menpontot. A menpontok objektumok, gy rendelkeznek tulajdonsgokkaL A Visual C# alaprtelmezs szerint a FileToolStripMenuitem nevet adja az j menpontururnak (a tulajdonsgai megjelentshez elfordulhat, hogy az elemre kell kanintanunk). Meglehetsen hossz nv, de pillanatnyilag tkletesen megteszi. Gondolkodba eshetnk, hogy vajon mirl ll a File sz eltt egy & jel? Nos, ha a menre pillantunk, sehol sem talljuk, viszont szrevehe~k, hogy a program alhzza az F betilt. Ez nem vletlen, ugyanis a menpontok Text tulajdonsgban hasznlt & jel az utna kvetkez beta alhzsra utastja a rendszert. Ezt az alhzott karaktert gyorsbllentynek hvjk, ugyanis az ALT mellett ezt a billentyt lenyomva a ment ppgy megnyithatjuk, mintha rkattintottunk volna. Az tkzsek elkerlse vgett tartzkodjunk attl, hogy kt felsei szintcr menponthoz ugyanazt a gyorsbillentyt rendeljk. Ennek elkerlsben segt az a lehetsg, hogy brmely karaktert megjellhetjk gyorsbillentyknt, nem csak az elst (gy pldul a F&ile esetben a program a File sz "i" betiljt hzza al). (A legfels szintll menpontok- mint az elzekben ltrehozott File - esetben az alhzott betilt angolul acee/erator key-nek, mg ha a menpont egy lenyl menben jelenik meg (vagyis nem a legfels szinten), akkor hotkey-nek hvjk. A megfelelei menpont elrshez egyszeruen csak le kell nyomnunk ezt a billentyt, amikor a men nyitva van, de ezttal is fontos, hogy ne hasznljunk egy menben tbb azonos hotkey-t.) 8. Kattintsunk a File men mellett kzvetlenl jobbra megjelen Type Here feliratra, s rjuk be az &Tools szt, majd nyomjunk ENTER-t. A Visual C# az elzekhez hasonlan kt jabb Type Here feliratot jelent meg, az j menpontok beszrshoz teht nem kell mst tennnk, mint a megfelel Type Here feliratra kattintani, s berni a menpont nevt.
1. Kattintsunk a File elemre, gy megjelenik alatta egy Type Here felirat mez. Kattintsunk r, rjuk be az &Open Picture... szveget, majd nyomjunk ENTER-t. 2. Kattintsunk most az j menpontra, s adjuk neki az nmuopenPicture nevet. 3. Kattintsunk az Open Picture menpont alatti Type Here mezre , s rjuk be az &Uuit szveget, majd nyomjunk ENnR-t. Az j menpont neve legyen nmu Qui t . Ezen a ponton mentsk a munknkat az eszkztr Save Ali (Mindent ment) gombjvaL 4. Kattintsunk a Tools menre, gy mellette s alatta is kapunk egy-egy Type Here mezt. Vlasszuk az alatta levt, rjuk be az &Draw Border szveget, nyomjunk EN'ffiR-t, s adjuk a menpontnak az nmuDrawBorder nevet. 5. Most jn az izgalmas rsz! Tartsuk az egrmutat6t egy kis ideig a Draw Border menpont alatti Type Here mez fltt, amg meg nem jelenik egy kis nyilacska. Kattintsunk a nylra, s vlasszuk a Separator (Elvlaszt) lehetsget (lsd a 9.4. brt). Ezzel a lenyl6 menvel adhatjuk meg, hogy rnilyen tpus menpontot szeretnnk beilleszteni. Ltrehozhatunk kombinlt listt, szvegmezt vagy egy egyszen1 elvlasztt, amely a menpontok csoportjainak elvlasztsra szolgl.
9.4. bra
A hagyomnyos menpontok me/lett sz6vegmezket, kombinlt lisfkat s elvlasztkat ts elhelyezhetnk a menben
200
Bekapcsolhat menpontok
Azon menpontok mellett, amelyekkel nem jelentnk meg alment, feltntethetnk egy jellngyzetet, gy llapotot rendelhetnk a menponthoz. A kvetkezkben ppen ezt tesszk. Emlkezznk csak vissza a 7. ra sorn az Options ablakon elhelyezett jellngyzetre, amelynek a szerepe az volt, hogy vele hatrozhattuk meg, hogy rtestsk-e a felhasznlt, mieltt a Picture Viewer ablak bezrulna. Most ugyanerre a clra egy menpontot is ltrehozunk 1. Kattintsunk a File menre a megnyitshoz. 2. Kattintsunk a Quit menpont alatti Type Here feliratra, rjuk be a Confirm on Exit (Kilpskor megersts) szveget, majd nyomjunk ENTER-t. Az j menpontnak adjuk az mnuConfirmOnExi t nevet. 3. Kattintsunk az egr jobb gombjval a frissen ltrehozott menpontra, s vlasszuk a helyi men Checked (Bejellt) pontjt Osd a 9.5. brt). Amennyiben a kapott men eltr a 9.5. brn lthattl, kattintsunk egy msik menpontra, majd kattintsunk az egr jobb gombjval a Confirm on Exit feliratra. Ugyanezt az eredmnyt rjk el akkor is, ha kivlasztjuk a menpontot, majd a Properties ablakban mdostjuk a Checked tulajdonsgt. 4. Kattintsunk a Confum on Exit menpontra, majd hzzuk a Quit-re, gy ez utbbi fl kerl a menben. Az eredmny a 9.6. bra szerint alakul. Futtassuk a projektet az F5 billentyO' lenyomsval. A men megjelenik az ablakon, pontosan gy, ahogy megterveztk (lsd a 9.7. brt). Kattintsunk a File menre, s vlasszuk a Quit menpontot- semmi sem trtnik, st a Confum on Exit menpont llapott sem tudjuk megvltoztatni. Ideje ht, hogy valamit tegynk a menk mO'kdse rdekben (gy vgre az llapotvltozsokat is kezdhetjk). lltsuk le a projekt futst, s mentsk a munknkat.
9.5. bra
A menelemeket llapotjelzsre is hasznlhatjuk
QpmPidUfe-
[3
Cooflrm On &It
gy&
CrreH.".
9.6. bra
A menket interaktvan llithatjuk ssze
A menk programozsa
Minden menpont nll objektum - a kivlasztsukhoz csak rjuk kell kattintanunk, s mris szerkeszthetjk a tulajdonsgaikat a Properties ablakban. Jllehet a menpontok nmagukban nem tekinthetk vezrlnek, a mkdsket biztost kdot a vezrlkhz hasonlan kszthetjk el. A kvetkezkben bemutatjuk, miknt tehetjk ezt meg a sajt menpontjainkkal.
9.7. bra
A menk futsidoen pontosatz gy jelennek meg, ahogy azt a tervezs sorn lthattuk
==
DialogResult . OK)
l l Betltjk a kpet a kprnez6be picShowPicture.Image = Image .FromFile(ofdSelectPicture .Fi leName ) ; l l Megjelentjk a fjl nevt az ablak cmsorban this. Text = s tring.Conc.at(" Picture Viewer(" + ofdSelectPicture.FileName + ")");
Pontosan ezt a kdot rtuk be az L fejezetben a Select Picture gomb Click esemnynek trzsbe, gy itt nem elemezzk bvebben. 4. Kattintsunk dupln a ViewerForrn . cs fjlnvre a Solution Explorer ablakban, gy a Picture Viewer ablakhoz jutunk a terveznzetben. 5. Kattintsunk dupln a Confirrn on Exit menpontra a Click esemnynek az elrshez, majd itt rjuk be az albbi utastst:
mnuConfirmOnExit .Checked
! (
mnuConfirmOnExit.Checked) ;
Ha a felhasznl a Confirm on Exit menpontra kattint, a fenti kd tkapcsalja annak Checked tulajdonsgt. A ! () fggvny a logikai (igaz vagy hamis) rtkek tagadsra szolgl. Ha ez knaiul hangzik, ne aggdjunk-a 12. rn bveb ben szlunk minderrl. Most elg annyit megrtennk, hogy ha a Checked tulajdonsg rtke True, a 1 (l vagy Not() fggvny a False rtket adja vissza, rrg a Checked tulajdonsg False rtke esetn az eredmny True lesz, kvetkezskppen minden kattintssal vltunk a True s a False rtkek kztt. 6. Kattintsunk dupln a ViewerForm. cs fjlnvre a Solution Explorerben (vagy kattintsunk a ViewerForm.cs [~esign) flre), gy visszajutunk a Picture Viewer ablakhoz a tervezben. 7. Kattintsunk dupln a Quit menpontra a Click esemny elrshez, majd rjuk be a kvetkez kdsort:
this. Close();
Ha emlkezetnkbe idzzk az l. rn tanultakat, tudhatjuk, hogy ezzel bezrjuk az ablakot, s egyttal az alkalmazst is, hiszen ez az egyetlen betlttt ablak. B. Trjnk vissza ismt az ablaktervezhz, s most vlasszuk a Tools ment. Kattintsunk dupln a Draw Border menpontra a Click esemnynek az elrshez, s rjuk be a kvetkez kdot:
Ezzel a kddal is tallkozhattunk az l. rn, gy az rtelmezstl ehelyt eltekintnk 9. Ismt az ablaktervezre vltva kattintsunk dupln az Options menpontra, s helyezzk el az albbi kdot a Click esemnyben:
OptionsForm frmOptionsDialog =new OptionsForm(); frmOp tionsDialog .ShowDialog() ;
Ezzel cl is kszltnk a men ml'kdst biztost kddal. Munknk eredmnynek ellenrzshez tegyk a kvetkezket: 1. Futtassuk a projektet az FS billentyl'vel, majd nyissuk meg a File ment az AJ.T+F billentyl'kombincival (emlkezznk vissza, hogy az F-et jelltk ki gyorsbillentyl'knt). Z. Kattintsunk a Confirm on Exit gombra. A men bezrul, de ha ismt megnyitjuk, lthatjuk, hogy a menpontot kikapcsoltuk- jfent rkattintva pedig jra bekapcsolhatjuk 3. Kanintsunk a Quit kivtelvelminden menpontra, hogy lssuk, valban megfelelen mkdnek-e. Ha ezzel elkszltnk, a File, Quit menponttal lltsuk le a projekt futst. Ha vgl bekapcsoltuk a Conflfm on Exit menpontot, szrevehettk, hogy a program ennek ellenre nem krdezte meg, hogy valban ki akarunk-e lpni. Ennek az az oka, hogy mg nem rtuk meg azt a kdot, amelyik vizsgln a menpont llapott. Sebaj, a ll. rn egyebek mellen ezt a hinyt is ptoljuk. A mentervezs sorn rdemes szemgyre vennnk nhny ismertebb Windowsalkalmazs menszerkezett, s sszevetni azokat a sajt meninkkel. Jllehet az alkalmazsaink j esllyel egyedi menket tartalmaznak majd, lehetnek hasonl elemeik is (pldul a Kivgs, a Msols, a Beilleszts, a Megnyits s egyb gyakran elfordul menpontok). Ahol csak lehet, kvessk az ismert alkalmazsok meninek szarkezett s megjelenst, gy a felhasmlk knnyebben elsajtfthatjk a fellet kezelst, radsul magunk is idt takarfthatunk meg.
Helyi menk
Helyi mennek vagy k6rnyezeti mennek nevezzk azt a ment, amely akkor jelenik meg, ha az ablak valamelyik objektumra az egr jobb gombjval kattintunk. A nv onnan ered, hogy ezek a menk mindig a helyi viszonyoknak megfelel menpontokat tanalmaznak - olyanokat, amelyek valamikppen a szban forg objektumhoz kthet6k. A Visual C# legtbb vezrlje rendelkezik alaprtelmezett helyi menvel, de magunk is ltrehozharunk egyni helyi menket. Mindehhez szinte ugyangy kell eljrnunk, m.i.nt a hagyomnyos menk esetben - azzal a klnbsggel, hogy ezttal enuStrip vezrlt hasznljuk. a Context M
Az albbi lpsck~t kvetve hozhatunk ltre egy egyni helyi mcnt a projektnkben:
1. JelentsOk meg a viewerForm. cs fj lt az ablaktervezben. 2. Szrjunk be egy j contextMenuStrip vezrlt az ablakra, dupln kattintva
az eszkzkszlet hasonl neV\1 elemre. A M enuStr ip vezrlhz hasonlan enuStrip is az ablak alatt jelenik meg. Adjuk neki a Con tex t M az m nuPj ctu r eContext nevet. 3. A Contex t M cnuSt rip kivlasztsakor az ablak tetejnl megjelenik maga a helyi men, amelyet szerkeszthetnk. Kattintsunk a Type Here mezre, s rjuk be a Draw Border szveget (lsd a 9.8. brt), majd nyomjunk ENTER-t a menpont ltrehozshoz. Mris van egy helyi mennk egyetlen menponttal!
9.8. bra
A helyt menket a hagyomnyos trsaikhoz hasonlan szerkeszthetjk
9.9. bra
A helyi menk gyors hozzfrst adnak egyes lehetsgekhez
Menpontok billentykombincikkal
Ha valaha is szksgnk volt arra, hogy kzelebbrl megismerkedjnk egy Microsoftalkalmazssal, bizonyra elsajttottuk nhny billenty(ikombinci hasznlatt. gy pldul az ALT+P lenyomsaminden olyan programban, amely kpes a nyomtatsra, egyenrtk a File, Print menpont vlasztsval. Sajt menpontjainkat a
elrhetv: kvetkezkppen
teheljk billenlyu"""kombincikkal is
1. Vlasszuk ki az ablak tetejn tallhat File ment, majd kattintsunk az Open Picture menpontra. 2. A Properties ablakban vlasszuk a ShortcutKeys tulajdonsgot, s kattintsunk a megjelen apr nylra. A 9. 10. brn lthat lenyl menl kapjuk, amelyben ' Kombincit. megadhatjuk a kvnt billentyu
lo
9.10. bra
A menllpontokhoz a ShortcutKeys tulajdonsggal rendelhetnk bllentykomblnclt
3. Kapcsoljuk be a Ctrl jellngyzetet, majd vlasszuk a Key men O lehetsgt (O mint Open), majd a Jenyl men bezrshoz kattintsunk egy msik tulajdonsgra. 4. Futtassuk a projektet ismt az F5 billentyvel, s nyomjuk Je a CTRL+O billentykombincit. Az alkalmazsunk gy viselkedik, mintha megnyitottuk volna a File ment, majd itt az Open Picture pontra kattintottunk volna.
Amikor csak lehet, prbljunk minllogikusabb billentyakombincikat kitlni. Az F6 vlasztsa pldul nem valszna, hogy osztatlan sikert arat a felhasznlink krben. Szarencsre rendelkezsnkre llnak a mdosftbillentyak, pldul a C m, amelyek nmi rugalmassgot adnak. Itt mr van mrlegelsi lehetsgnk, fgy rezzk, hogy a Quit menpont esetben a Cm+ Qalkalmasabb vlaszts, mint mondjuk a C m+ T. Itt is rvnyes a korbbi megjegyzsnk, miszerint ha egy menpont megegyezik az ismert alkalmazsok valamelyik menpontjval, vagy hasonl ahhoz, rdemes az ott hasznlt billentyakombincit tvennnk.
Az eszkztron elhelyezett elemek az alkalmazs jellegtl fgg6en klnbz6ek lehetnek, az eszkztrak s elemeik ltrehozsa azonban minden esetben azonos mdon trtnik. Eszkztrakat a Too1St ri p vezrlvel kszthetnk.
A kvetkezkben elhelyeznk egy eszkztrat a Picturc Viewer program fablakn:
1. Jelentsk meg a ViewerForrn. cs fjlt az ablaktervezben (ha ezt korbban nem tettk meg). 2. Helyezznk el egy j ToolStrip vezrlt, dupln kattintva az eszkzkszlet hasonl nev elemre. Az ablak tetejn megjelenik az eszkztr - adjuk neki a tbrMainToolbar nevet.
9.11 . bra
Az j eszkztrakon
nincsenek gombok
Jelentsk meg a bal fels sarokban tallhat lenyl Hstt, s sznjunk pr pillanatot a tanulmnyozsra (lsd a 9.12. brt). Itt lthatjuk azokat az elemtpusokat, amelyeket elhelyezhetnk az eszkztrakon.
A~
IB lll
1
s,~o~~.-.
0..,00...S.,.,.tor
l!lc...J;iiT-
., ,, ,...,
9.12. bra
Az eszk6ztrak klnf/e tpus elemeket tartalmazhatnak
A pldnkban gombokat s elvlasztkat hozunk ltre, de rdemes egy msik projektben a tbbi lehet6sggel is ksrletezni. Most tegyk a kvetkezket:
hozzunk ltre egy j gombot, s a tulajdonsgait lltsuk be az albbiak szelint (a knnyebb tjkozds vgett rdemes bcsorrendben megjelenteni a tulajdonsgokat):
Tulajdonsg Name Text ToolTipTex t
2. Kattintsunk a gomb Image tulajdonsgra, majd a mellette megjelen6 Build (Felpts) gombra. Nyomjuk meg az Import (Betlts) gombot, majd vlasszuk ki az Open gombhoz tartoz kpet. 3. Rgztsk a belltst az OK gombra kattintva. 4. Hozzunk ltre egy jabb gombot az Add-ra kattintva, a tulajdonsgait pedig llitsuk be gy:
Tulajdonsg Name Text ToolTipText
5. Adjunk meg egy kpet a Draw Border gomb Image tulajdonsga szmra. 6. Az Add-ra kattintva hozzuk ltre az utols gombot is, s a tulajdonsgai legyenek
a kvetkez6k:
Tulajdonsg Name Text ToolTipText
7. Rendeljnk egy kpet az Options gomb Image tulajdonsghoz is. Ezzel elkszltnk az eszkztr gombjaival, egy aprsg azonban mg htra van. Az igazn profi fejleszt6k elvlasztkat, vagyis rvid, fggleges vonalakat tesznek az eszkztrgombok sszetartoz csoportjai kz. A fentiekben ltrehozott hrom gomb szerepe teljesen eltr6, gy mindegyikket kln kell vlasztanunk. Lssuk, miknt tehetjk ezt meg:
1. Vlasszuk a lenyl lista Separator (Elvlaszt) pontjt, s kattintsunk az Add
gombra, gy az j elvlaszt a lista aljra kerl. Most nyomjuk meg ktszer a lista mellett jobb oldalon tallhat, felfel mutat nyilat, gy az elvlasztt az Open s a Draw Border gomb kz helyezzk t.
210
9.13. bra
Az eszk6ztrunk mr kszen ll, csak nmi kdra van szaksg a
mkdshez
A menpontok beszrsnl ltottakhoz hasonlan a ToolSt rip vezrln is lehetsgnk van a gombok dinamikus elhelyezsre (csak kattintsunk az alaprtelmezett gombra). Azrt dntttem mgis az ltems Collection Editor hasznlata mellett, hogy ezzel is nyomatkostsam: egy feladatra gyakran tbb megolds is knlkozik.
Az eszkztrak programozsa
Az eszkztrak programozsa igencsak hasonl a menknl ltottakhoz - ltni fogjuk, hogy a Microsoft mindent megtett a minl szlesebb kn1 szabvnyosts rdekben. A .NET korai vltozataiban az eszkztrakat egy Toolbar nevezet vezrl jelentette meg, amely a But tons gyOjtemnyben troita az elemeit. 2005-ben a Toolbar helyett megjelent a ToolStrip vezrl, amelyben mr a szabvnyos Ite ms gyjtemny szerepel, ugyanaz az Items, amelyik a Li stView s a Treeview vezrlkben is felbukkan. rzkelhet a vltozs irnya? Ha megtanultuk, hogy miknt kezeljk az Items gyjte mnyt az egyik vezrl6ben, msutt mr kitaposott ton jrhatunk.
3. A ViewerForm.cs (Design) flre kattintva trjnk vissza az ablaktervezhz. 4. Kattintsunk dupln a Draw Border gombra a Click esemnynek az elrshez, s rjuk be az albbi kdot: Graphics objGraphics ::: null; objGraphics = this.CreateGraphics(); objGraphics .Clear(SystemColors .Control) ; objGraphics . DrawRectangle(Pens .Blue, picShowPicture.Left - l , picShowPicture .Top - l, picShowPicture .Width + l , picShowPicture.Height +l); objGraphics.Dispose() ; 5. A ViewerForm.cs [Design] flre kattintva trjnk vissza az ablaktervezhz. 6. Kattintsunk dupln az Options gombra a Click esemny elrshez, s rjuk be az albbi kdot: OptionsForm frmOptionsDialog = new OptionsForm() ; frmOptionsDialog.ShowDialog(); Mentsk a munknkat, majd futtassuk a projektet az F5 billentyveL Ha mindent jl vgeztnk, az eszkztrgombokra kattintva ugyanazt az eredmnyt kapjuk, mintha a megfelel menpontokat vlasztannk. A 10. rn azt is lthatjuk majd, hogy miknt osztozhatnak a vezrlk a kzs kdon.
9.14. bra
llapotsor ltrehozsa
Utolsknt a StatusSt rip vezrlt mutatjuk be, amely nem olyan ltvnyos s nem is olyan hasznos, tnint a Too l Strip vagy a Menustrip, cserbe azonban a kezelse is egyszerub. Az llapotsor azzal gazdagtja az alkalmazsunkat, hogy adatokat jelent meg egy megszokott helyen - olyannyira, hogy a felhasznlk valjban szmtanak is a jelenltre. A legegyszerbb alakjban mindssze egy feliratot s egy mretezfogan tyt tartalmaz. Ez utbbi pr apr pont alakjban jelenik meg, amelyeket a felhasznl megragadhat, s gy tmrerezheti az ablakot. Ha nincs a kpernyn az ablaktervez, jelentsk meg a Vi ewerForm. cs fjlnvre dupln kattintva a Solution Explorerben. A kvetkez lpsben az llapotsor elhelyezshez kattintsunk dupln az eszkztr StatusStrip elemre (a Menus & Toolbars csoportban). Az llapotsort csak gy pillanthatjuk meg, ha a tervezablak jobb oldali grgetsvjval a lttrbe hozzuk az ablak aljt. Adjuk az llapotsornak az sbrMyStatusstrip nevet. Az egyb vezrlk lehorgonyzsa rniatt a statusStrip vezrl fedsbe kerl nhnyukkaL A helyzetet az albbiak szerint kezdhetjk: 1. Kattintsunk a kpmezre, s adjuk a Size tulajdonsgnak a 282 , 256 rtket. 2. Adjuk a kicsinyt6 s nagyt gombok Location . Y tulajdonsgnak a 285 rtket. Az ablak kpemost a 9.15. brnak megfelelen alakul.
9.15. bra
Az lklpotsor mindig az abklk aljn jelenik meg
jelljk ki az llapotsort, s pillantsunk a bal szlre. Ismers, ugye? Ilyesmit lttunk, amikor j menpontokat helyeztnk el a Menustrip s j gombokat a Tool Strip vezrlben. Kattintsunk a kis nylra, s vlasszuk a Stat us Label lehetsget, gy egy j cnke jelenik meg az llapotsoron. A tulajdonsgait lltsuk be az albbiak szerint:
Tulajdonsg Name Text rtk lblStatus No i m age loaded
A cmke ltrehozshoz hasznlt lenyl listban ms tpus elemeket is lthatunk, amelyeket tetszs szerint hasznlhatunk az llapotsoron, pillanatnyilag azonban a cmke tkletesen megfelel a cljainknak. A 10. rn majd elksztjk azt a kdot, amely in tnteti fel a kivlaszton kp nevt Funassuk a projektet az F5 billenty\1 lenyomsval. Helyezzk az egrmutatt az llapotsor jobb als sarkban tallhat apr pontok fl, gy a mutat mreteznyll vltozik. Az llapotsor azonban nmagban nem elg okos ahhoz, hogy felismerje, ha az ablak kerete nem mretezhet6 (a Fi xed vagy a FixedToolWindow bellts ppen ezt eredmnyezi). Ha el szeretnnk rejteni a mretezfogantyt, az llapotsor SizingGr ip tulajdonsgnak a False rtket kell adnunk.
sszefoglals
A menk, az eszkztrak s az llapotsorok jelentsen gazdagtjk az alkalmazsaink fellett, hiszen megknnytik a lehetsgek elrst. Ezen az rn megismerkedtnk enuStrp vezrlvel, amellyel tfog menrendszert kszthetnk az alkalmazsaink aM szmra. Megtanulruk, nknt szrharunk be, helyezhetnk t s trlhetnk menpontokat, valamint hogy miknt rendelhetnk hozzjuk gyorsbillenty(iket s billentyu"Kombincikat. Megrudtuk azt is, hogy az eszkztrak valjban a gyakrabban ha.sznlt menpontok gyors elrst szolgljk. Megismertk a Too1St r ip vezrlt, amellyel az elemeket logikailag csoportost s az eligazodst kpekkel segt eszkztrakat hozharunk ltre, vgezetl pedig szt ejtettnk az llapotsorrl is, amely teljess teszi az alkalmazs fel lett. Az itt megismert vezrlk megvalstsa minden felleten alapvet elvrs- s most mr ezen a tren sem maradunk szgyenben.
Krdezz-felelek
K: Tegyk fel, hogy tbb ablakunk is van, szinte azonos menkkel. Minden esetben
kln kelllttehoznunk ezeket? V: Szerencsre nem: hozzunk ltre egy MenuStrp vezrlt a kzs elemekkel, majd msoljuk Je s il.lessruk be a tbbi ablakra. A menket a tovbbiakban erre az alapra pthetjk, amivel rengeteg idt takartharunk meg. Fontos azonban odafigyelnnk arra, hogy egy vezrl lemsolsval s beillesztsvel a hozz tartoz kd nem jelenik meg az j helyen. K: Lteznek alkalmazsok, ahol a felhasznl testreszabhatja a menk s az eszkztrak tarta/mt. Kpesek erre a VtSual C# meni s eszkztrai? V: Nem. Ennek a viselkedsnek a megvalstshoz kls6 programok segtsgt kell ignybe vennnk, vagy igen-igen sok kdot kell rnunk. Jmagam az elbbi megolds mellett tennm le a voksomat
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtt6 krdsek
1. Igaz vagy hamis? .Az ablakok mensorait a contextMenuBar vezrlvel kszthetjk el." 2. Mit kell egy karakter el rnunk, hogy gyorsbillentyknt hasznlhassuk? 3. Melyik tulajdonsggal kapcsolhatjuk ki-be a menpontokat? 4. Hogyan rendelhetnk kdot a menpontokhoz? 5. Mclyik gy\Ijtemny tartalmazza az eszkztrak elemeit? 6. Igaz vagy hamis? .Az eszkztrak minden gombja sajt Click esemnnyel rendelkezik." 7. Melyik vezrlvel jelenthetnk meg adatokat a felhasznl szmra az ablak aljn?
Vlaszok
1. Hamis. Menson a M enuSlrip 2. Az & jelet. 3. A Checked tulajdonsggaL
vezrlvel
hozhatunk ltre.
Gyakorlatok
1. Hozzunk ltre egy j projektet, s helyezznk el benne egy llapotsort, amely egy lenyl6 ment megjelent gombot tartalmaz. 2. Talljuk ki, hogy miknt jelenthetnk meg a ToolStrip vezrlben a gombok helyett llapotadatokat (Tipp: az Items gyjtemny megfelel tpus eleme adja a megoldst.)
lll.
RSZ
t 7. ra
t 8. ra
10. RA
Tagfggvnyek ltrehozsa s meghvsa
A lecke tartalmbl:
Tagfggvnyek ltrehozsa Tagfggvnyek meghvsa Kilps a tagfggvnyekbl Paramterek tadsa Az nhv tagfggvnyek elkerlse Feladatvgrehajts
Eddig krlbell 9 rt tltttnk azzal, hogy megszerezZk a Visual C# 2008 kezelshez szksges alapvet ismereteket, s hogy ltrehozzunk egy alkalmazsfelletet A j fellet ksztse fontos, de csak egy a sok lps kzl, amelyek egy Windowsen fut program ltrehozshoz sZksgesek. Miutn ltrehoztunk egy alapszint alkalmazsfelletet, mO'kdkpess kell tennnk a programot. A program sajt maga is vgrehajthat egy mveletet, valamint a grafikus fellettel kapcsolatot tart felhasznl utastsa is vgrehajthatja. Akrhogyan is, de Visual Cv programkdot runk, hogy
Osztlytagsg
Az ltalunk rt programkd osztlyokban troldik. Mieltt hozzfognnk Visual C# programkdot rni, ltre kell hoznunk egy osztlyt. Ahogy a korbbi 6rkon l.rgyaltuk, az osztlyokat sablonknt hasznljuk, amikor j objektumot hozunk ltre (amely tulajdonsgokkal s tagfggvnyekkel is rendelkezhet). Az osztlyok tulajdonsgai s tagfggvnyei pldnytagok vagy statikus tagok lehetnek. A pldnytagok az osztly egy pldnyhoz Lartoznak, amely az osztlynak a new kulcsszvalltrehozott objektuma, a statikus tagok ezzel szemben az osztly egszhez, nem pedig az osztly egy bizonyos pldnyhoz. Mr volt dolgunk osztllyal, amikor pldnyostott tagok segtsgvel hoztunk ltre egy ablakot (bvebben lsd az 5. rt). Amikor dupln kattintunk egy ablak valamelyik objektumra, olyan esemnyeket rhetnk el, amelyek az ablak osztlymoduljban tallhatk.
Ms programnyelvek, pldul a Visual Basic, klnbsget tesznek az osztlytagfggvnyek s a nyilvnos tagfggvnyek kztt, amelyek az osztlyon kvlrl is hozzfrhetk. A Visual C# megkveteli, hogy minden tagfggvny egy osztlyon bell legyen, de ltalnos hozzfrst is biztosthatunk, ha az osztlyon bell statikus tagfggvnyeket hatrozunk meg. A statikus tagfggvnyek akkor is elrhetk, ha az osztlynak nem ltezik egyetlen pldnya sem. A statikus tagokhoz valjban nem is frhetnk hozz az osztly pldnyn keresztl, de ha ezt mgis megprblnnk, az kivtelt (hibt) fog eredmnyezni. Br megtehetjk, hogy a teljes programkdot egyetlen osztlymodulban helyezZk el, clravezetbb, ha az sszetartoz kdrszleteket osztlyokba csoportostjuk. Ezen kvl tancsosabb azokat a kdrszleteket, amelyek nem egy ablakhoz tartoznak, nem az ablak osztlymoduljban elhelyezni, hanem egy logikai osztlyba vagy mg inkbb egy nll osztlyba csoportostani az ilyen programkdot
A jelenlegi fejlesztsek az objektumkzpont (objektumorientlt) programozsra sszpontostanak, amelynek a kzppontjban az osztlymodulok llnak. A 16. rn adunk egy kis zeltot az objektumkzpont programozsbl, de ez mr halad tma, ezrt nem trgyaljuk rszletesen. Miutn megbartkoztunk ennek a knyvnek az anyagval, malegen ajnlott egy olyan knyv elolvassa, amely kifejezetten az objektumkzpont programozsrl szl.
10. ra
A tagfggvnyek ltrehozsnak egyik ltalnos rvny szablya, hogy az sszefgg kdrszletek szmra osztlyokat kell alkotnunk. Ez nem azt jelenti, hogy osztlyok tucatjait kellltrehoznunk, hanem azt, hogy az sszefgg tagfggvnyeket alkalmas mret osztlyok halmazba kell sorolnunk. Pldul ltrehozhatunk egy olyan osztlyt, amely a nyomtatshoz szksges eljrsokat tartalmazza, s egy msikat, amely az adatelrs eljrsait foglalja magban. Ezen kvl kszthetnk egy ltalnos cl osztlyt, ahov azokat az eljrsokat soroljuk, amelyek nem illenek szksgszeren egyetlen msik osztlyba sem. Most a 9. ra Picture Viewer alkalmazst fogjuk folytatni, gyhogy nyissuk meg a programot. Ha teljesen j osztlyt akarnnk ltrehozni, a Project (Projekt) men Add Class (Osztly hozzadsa) elemtkellene vlasztanunk, a pldnkban azonban csak az ablakosztlyunkon bell fogunk tagfgf,>vnyeket ltrehozni. Kattintsunk a Solution Explorerben a Vie wer Fo r m. cs fjlra, majd a Solution Explorer tetejn megjelen View Code (Kd megtekintse) gombra. Most mr a ViewerForm . cs osztly programkdjt lthatjuk (10.1. bra). Az bcin lv nyl az osztlymeghatrozs alatti nyit kapcsos zrjelet mutatja. Ez a kapcsos zrjel adja meg az osztly kdjnak kezdett. Van zr kapcsos zrjel is; ez lent tallhat. Jegyezzk meg, hogy minden ltalunk ltrehozott esemnykezel s a tagfggvnyek is az osztly nyit s zr kapcsos zrjele kz kerlnek.
1 tUinQ' Syst.t!ll.J)et.a ;
l~g
Pllblic Vicvwzlom()
(
pr:t. Y~
Toad.
~ntAtgs
e:-)
ll
U l
(ofdSdcct.Pict w.Sl:l.owOidOQt} -
f>t..olOQfte#ult.OC)
//l..e4d ::.be pj.c:-uu.e int-o t.he piet.Ure bo.a:. i.eShowt'ictUt. x-o- beQ<t.l'ta.l'ih (o'fdS lcc:t:He cU%e . U .ld&M) 1
_,......_-_ ,.,.__.,._."_._,.......~~~~~ --
--~;7:;-:H-~"--~r-nT- 'T
10.1. bra
Tagfggvnyek ltrehozsa egy osztlyon bell
Tagtggvnyekltrehozsa
Miutn ltrehoztuk az osztlyokat, amelyekben a programkdot majd elhelyezzk (ebben az esetben egy mr ltez osztlyt hasznlunk), elkezdhetjk megrni a tagfggvnyeket A tagfggvny vagy eljrs olyan nll kdrsz, amelyet ms kdrszek meglvhatnak. A tagfggvnyek hasonltanak az esemnyekhez, de nem a felhasznl indtja el ket ablakok vagy vezrlk segtsgve!, hanem akkor futnak le, amikor egy kdrsz meghvja 6ket. A Visual C#-ben ktfle ~!jrs hasznlhat: Visszatrsi rtket ad tagfggvnyek Visszalrsi rtk nlkli tagfggvnyek Tbb okbllehet szksgnk visszatrsi rtket ad tagfggvnyekre. Pldul egy tagfggvny true vagy fa l se rtkkel trhet vissza attl fggen, hogy sikerlt-e vgrehajtania a feladatot. Olyan tagfggvnyt is rhatunk, amely bizonyos paramtereket vr (olyan adatokat, amelyeket a tagfggvnynek adunk t, szemben a tagfggvny ltal visszaaciott adatokkal), majd ezen paramterek alapjn tr vissza egy rtkkel. Pldul rhatunk egy olyan tagfggvnyr, amelynek egy mondatot adunk t, s az visszatrsi rtkknt megadja a mondatlYan szerepl szkzk szmt. A lehetsgeknek csak a kpzeletnk szabhat hatrt, csak azt tartsuk szben, hogy egy tagfggvnynek nem kell, hogy l<::gyen visszatrsi rtke.
Ezzelltrehoztunk egy j tagfggvnyt (lsd a 10.2. brt). A tagfggvnyek bevezetse (deklarcija -ez a tagfggvny ltrehozsra vonatkoz utasts) tbb rszbl ll. Az els sz, a pr i vate, egy kulcssz, vagyis a Visual C# szmra klns jelentssei br kifejezs. A private kulcssz a tagfggvny hatkrt hatrozza meg (a hatkrkrl a ll. rn tudhatunk meg tbbet), s azt jelli, hogy csak az adott osztlyban lv programkd frhet hozz a tagfggvnyhez. A p r i vat e helyett hasznlhatjuk a public kulcsszt is, amely ms osztlyokban lv tagfggv-
10. ra
nyekhez val hozzfrst is lehet6v tesz. Mivel a fenti kdot csak a Picture Viewer ablakon bell szeretnnk elrni, hasznljuk a private kulcsszt. A void szintn kulcssz a Visual C#-ben; ezzel egy olyan tagfggvnyt vezetnk be, amelynek nincs visszatrsi rtke. Az ra egy ksbbi rszben megtanuljuk, hogyan hozzunk ltre visszatrsi rtkkel rendelkez6 tagfggvnyeket
10.2. bra
A kapcsos zrjelek
Pt::l-.a" <JOS.4 ln"Dkleet.Met.\U'e_c u.Ck (obleC1:. Ulldu:,.
~nn~t:Q
e}
a tagfggvny
kdjnak kezdett
s vgt jellik
A harmadik sz (OpenPict ure) a tagfggvny neve, ami gyakorlatilag brmilyen karakterlnc lehet. Azt azonban jegyezzlik meg, hogy a nv nem lehet kulcssz, s szkzket sem tartalmazhat. A pldban, amelyen dolgozunk, az eljrs ugyanazt a szerepet tlti be, mint az Open Picture (Kp megnyitsa) menpont s az eszkztr Open Picture gombja - innen az elnevezs. A tagfggvnyeknek beszdes neveket kell adnunk, hogy utaljanak a feladatukra. Kt tagfggvnynek csak akkor adhatjuk ugyanazt a nevet, ha a hatkrlik eltr.
Nhny programoz a jobb olvashatsg miatt elnyben rszesti a szkzk hasznlatt a nevekben, de sok esetben, pldul amikor tagfggvnyeket neveznk el, nem hasznlhatjuk ket. Hagyomnyos eljrs, hogy a szkzk helyett alhzst (_)hasznlnak, mint pldul az Open_Picture nvben, de n inkbb a kis- s nagybetk vegyes hasznlatt ajnlom (lsd az elz pldt).
Kzvetlenl a tagfggvny neve utn zrjelek llnak, amelyek kztt a paramtereket (a hv eljrs ltal a tagfggvnynek tadott adatokat) adhatjuk meg. A pldnkban nincs szliksg arra, hogy adatokat adjunk t a tagfggvnynek, gy a zrjel res marad, de ha azt szeretnnk, hogy a hv programrszlet adatokat adjon t ennek az eljrsnak, azt a zrjeleken bell adhatnnk meg. Az ra ksbbi rszben meg fogjuk nzni, hogyan tehetjk meg mindezt.
Adjuk a kvetkez6 programkdot az OpenPicture () tagfggvnyhez (a kdot a nyit s zr kapcsos zrjelek kz tegyk):
l l Megjelentjk a fjlmegnyits prbeszdablakt.
==
DialogResul t.OK)
l l Betltjk a kpet a kpmez6be . picShowPicture . Image = Image .FromFile(ofdSelectPicture . FileName); l l Megjelentj k a fjl nevt az ablak cmsorban. this .Text = string.Concat("Picture Viewer( r ofdSelectPicture . FileName + )); l l Megjelentjk a fj l nevL az llapotsorban . :obrMyStatusStri p . lL ems [ OJ Text = ofdSelect.Pi ct ur e . FileName ;
Figyeljk meg, hogy ez a kdrszlet azonos azzal, amit az el6z6 rkon az Open Picture gombnl s menpontnl, valamint az eszkztr gombjnl hasznltunk Ezt a programkdot (vagy ennek egy vltozatt) mr hrom helyen bertuk- mjnek mg egyszer bevinni? Korbban utaltunk r, hogy egy programrszlet tbbszri szerepeltetse nem a legmegfelelbb mdszer, s hogy mg visszalrnk erre a krdsre. Ha azl vesszk szre, hogy ugyanazt a programkdot juk be ismtelten, a kdot egy kln eljrsban kell elhelyeznnk. gy ahelyett, hogy a programrszlet ktszer szerepelne, ezt az eljrst hvjuk meg igny szerint. Ennek tbb el6nye is van:
A hibalehetsgek szmnak cskkense. Minden alkalommal, amikor kdot runk, fennll annak a kockzata, hogy valamit rosszul csinlunk. Ha egy kdot csak egyszer runk meg, azzal cskkentjk a hibk eslyt. Kvetkezetessg s karbantarts. Amikor ismtelten runk be egy kdot, gyakran elfelejtjk, hogy mely helyeken hasznltuk. Elkpzelhet, hogy egy programruht kijavtunk az egyik helyen, de a msik helyen elfelejtjk, vagy j tulajdonsgokat adunk a kd egyik pldnyhoz, de a msikhoz nem. Egyetlen eljrs alkalmazsval a kdnak csak egy pldnyra kell, hogy gondunk legyen.
Ha odafigyeltnk, bizonyra szrevettk, hogy az OpenPiccure () tagfggvny egy utastst elsumkoltuk (az utolst). A 9. rn grteknek megfelelen ez az utasts a megnyitott kp fjlnevt jelenti meg az llapotsorban. Most mr kszen llunk arra, hogy a kpmez6 kr szeglyt rajzoljunk. lltsuk a kurzort az OpenPicture () tagfggvny zr kapcsos zrjele utn (lsd a 10.3. brt), nyomjuk le az ENTER-t, s rjuk be a kvetkez6 kdot:
10. ra T
Graphics objGraphics = null; objGraphics = this .CreateGraphics() ; objGraphics.Clear(SystemColors . Controll ; objGraphics . DrawRectangle(Pens.Blue, objPicturebox.Lefl l, objPicturebox . Top - l , objPicturebox.Width ~ l, objPicturebox .Height + l); objGraphics .Dispose();
Vu~:t:rt:u::.
ro.o~
<
l .n..". t 1ft ~ tl.le 41-alot boa. u - coN.s.h~C"Ulrt. 90fi!DiaJ.ov l) -
~a.ele~J:enl:t. .Cit)
<
ll
z...o..d th.- pJew.re. 1D.t..O the p.1C"t"1Ln Ma. pl(!.lhCNPi.O'nlre. t.&ge - t..>;rc. rrc.ruetotllSelectP'1eturc. fild.-) : fl !lbow t.he - - of the: fJ..le LD uw to~ Q"ap;.i.c:m. t.bU.:rc.lft t.:r1'ftO'.coaoat.("P1ot.'*~ Vi.wr( +
ofdJalect.Picu.n .l.ilel. . 4 ) ) :
ll !lbOW th ...
}
n~
.:brt<Y$c.atuStrtp.l~uaa(OJ
:l-
10.3. bra
Kezdjak on az j eljrst, ahov
a nyl mutat
A fenti eljrsban nhny dolog jnak tllnhet. Az els, hogy szveg tallhat a tagfggvny bevezetsekor hasznlt zrjelben. Korbban emltettk, hogy ez az a hely, ahol paramtereket adhatunk meg. A paramterek olyan adatok, amelyeket az eljrsnak adunkt - szemben azokkal az rtkekkel, amelyekkel az eljrs visszatr. Az imnt egy picture box tpus paramtert hoztunk ltre. A rszleteket a ll. rn magyarzzuk el, most csak azt kell megrtennk, hogy az a programrszlet, amelyik ezt az eljrst meghvja, egy a kpmez6-objektum.t"& vonatkoz hivatkozst ad t. Az eljrs ezutn gy hasznlja a hivatkozst, mintha kzvetlenl az objektummallenne dolga. Mivel ez a tagfggvny az ablakon bell tallhat, valjban nem muszj a kpmezre mutat hivatkozst tadnunk, de szerenern volna bemutatni, hogyan is mkdik mindez. Az eljrsban vgig az obj PiccureBox paramtert hasznljuk, ahelyett, hogy .bedrtoznnk" egy hivatkozst az ablak kpmez6-objektumra. Mivcl ez az j eljrs paramter formjban fogadja a hivatkozst a kpmez6re, az ablak brmelyik kpmezjvel kpes mkdni. A hv kdnak csak a megfelel kpmezre mutat hivatkozst kell tadnia, az eljrs pedig szeglyt rajzol kr. Az ablakosztlyunk a 10.4. brn lthat mdon kell, hogy kinzzen.
~~ --------=---------~-11
JHlOQJleS"Ult-.Cil)
ll ShtiV
~be
it totclSelctl'lctaa.re.Sbold>&alotl) l
l l Load U1.e pieta~ l.n'-0 tbe ote~ bene:. t. ptono.tPL.t:;tu.n . .r..v DDAl ll"' rro.FUtCof"dSeltcdlcture. FU d ....): f~ ll Show ~~ c.- ot the tU e. h ~e fena .se caption . t Ch.U, Yoe et...tig;.Ccaac.-c chcc~ V1~1 + l o.td5d.eet.hc:u.an. ru..-..e + '"} ); ~ l l ~ the n - ot U. t.Lh 1.11 eht: .u~ Nr .
.-bi'!ICJ'SUQUI3't.rip.It.-.IOI.Texto
~C"W.t IU. . .._;
u
l
'4'01d ~ (f-ut.on
abj~)
10.4. bra
Az esemnykeze-
nll egyedek
Vegyk szre, hogy van egy lnyeges klnbsg a visszatrsi rtkkel rendelkez s a visszatrsi rtket nem ad tagfggvnyek bevezetse kztt: a void kulcssz helyett itt egy adattpust adunk meg. Az adattpusokat a ll. rn trgyaljuk, gy most nem fontos, hogy megrtsk 6ket, azzal azonban tisztban kell lennnk, hogy mi trtnik. Az adattpus, amelyet a hatkr utn adunk meg, a tagfggvny visszatrsi rtknek tpust hatrozza meg. A kszl6 programunkban nem lesz szksg tagfggvny ltrehozsra, dc rdemes a kvetkez6 pldt szemgyre vennnk:
private int ComputeLength(string strText)
{
Itt kt dolgot kell megjegyeznnk: A pr i vat e kulcssz utn s a tagfggvny neve eltt az int kulcssz ll, ami azt jelenti, hogy a tagfggvny egy egsz szmmal (integer) fog visszatrni. Ha a tagfggvny karakterlnccal tme vissza, a string kulcsszt hasznlnnk helyette. Fontos, hogy a tagfggvnyeinknek a megfelel6 adattpust adjuk t.
10. ra
A return kulcssz ketts feladatot lt el. Egyrszt azonnali kilpst eredmnye::z a tagfggvnybl, gy a kd tbbi rsznek vgrehajtsra nem kerl sor. Msrszt visszatrsi rtkknt egy olyan tpus rtket ad, mint amilyen tpust megadtunk. A fenti kdban a tagfggvny a megadott karakterlnc hosszval (Length) tr vissza. Azokat a tagfggvnyeket, amelyek rtket adnak vissza, a visszatrsi rtkkel nem rendelkez tagfggvnyekhez hasonlan hatrozzuk meg, azzal a klnbsggel, hogy a void helyett megadjuk a visszatrsi rtk pust. Ezen kvl a return utastst hasznljuk, hogy a tagfggvnyhvs eredmnyekppen egy visszatrsi rtket kapjunk. Ha emlksznk majd ezekre a irulesfontossg klnbsgekre, nem lesz gondunk azzal, hogy adott krlmnyek kztt melyik tpus tagfggvnyt kellltrehoznunk.
Tagfggvnyek meghfvsa
A tagfggvnyek meghvsa knny- knnyebb, mint a ltrehozsuk Eddig kt tagfggvnyt hoztunk ltre. Mindkett olyan kdot tartalmaz, amelyet az ablakban nem kevesebb, mi.nt hrom helyen hasznltunk Most el fogjuk tvoltani a tbbszr szerepl kdrszleteket, s kicserljk az elbb megrt ltalnos tagfggvny hvsaira. Hogy ennek rvnyt szerezZnk, kvessk a kvetkez lpseket: 1. A Solution Explorerben kattintsunk dupln a ViewerForm. c s-re, hogy megtekinthessk az ablakot az ablaktervezben. 2. Az els kdrszlet, amelyet kicserlnk, az eszkztr Open Picture gombja szmra rt kd. Kattintsunk dupln az Open Picture gombra az eszk6ztron, hogy elrjk a eli c k (Kattints) esemnyt, majd trljk a nyit s zr kapcsos zrjel kztti kdot (lsd a 10.5. brt). 3. Ahol trltk a kdot, rjuk be a kvetkez parancsot:
this . OpenPicture() ;
Ennyi. A sajt tagfggvnyeinket ugyangy hvjuk meg, ahogy a Visual C# beptett tagfggvnyeit Ha a tagfggvny egy vagy tbb paramtert vr, a zrjelek kztt adhatjuk meg ket (erre hamarosan sort is kertnk). 4. Mg kt helyen hasznltuk fel az Open Picture kdjt. A Solution Explorerben kattintsunk dupln a ViewerForm . c s-re, hogy visszatrjnk az ablak tervezn zetbe, majd kattintsunk a File menre, hogy ki.nyissuk a ment, majd kattintsunk dupln az Open Picture menpontra. 5. Trljk a Clic k esemnyen belli kdot, s cserljk a kvetkezre:
this . OpenPic t ure() ;
<
)
Ee~tt.Al"Q l
C11tlOOR.~iiJIJ.lt.QK)
Dox .
lato r.be
p..1~c~~
pt~u.re . x..v
pn.,;~
ttte
~l.c:eti..cm
10.5. bra
T6r6/jk ezt a kdrszletet, s cserljk a tagfggvnyhvsra
Most pedig t~nk vissza az ablaktervezhz. Eddig csak olyan tagfggvnyeket hoztunk ltre, amelyeknek nincs visszatrsi rtkk. Mint tudjuk, egy tagfggvny meghvsa csupn annyibl ll, hogy hivatkorunk az osztlynvre, utna pontot tesZnk, majd a tagfggvny neve s vgl egy zrjel kvetkezik. Az olyan tagfggvnyek meghvsa, amelyek visszatrsi rtkkel rendelkeznek, egy kicsit mskpp nz ki. Figyeljk meg a kvetkez rvid tagfggvnyt: private long AddTwoNumbers( int intFirsL , int intSecond)
{
return intFi rst intSecond ; Ez a tagfggvny kt paramtert fogad, ezeket sszeadja, majd visszatr az sszegkkeL Amikor visszatrsi rtkkel rendelkez tagfggvnyt hvunk meg, a visszatrsi rtke alapjn vegyk figyelembe. Pldul ha belltjuk az ablak Height tulajdonsgt, azt a kvetkez mdon tehe~k meg: MyForm.Height
= 200;
Ez az utasts 200-ra lltja az ablak magassgt. Tegyk fel, hogy az AddTwoNumbers (l tagfggvnyt akarjuk hasznlni az ablak magassgnak belltsra. Ha az eljrst a visszatrsi rtke alapjn vesszk figyelembe, az rtket a kvetkez mdon cserlhetjk le a tagfggvnyre: MyForm .Height
=
Ebben a pldban az ablak magassga 6 lenne, mert az l-et s 5-t a tagfggvny paramtereknl adtuk t, amelyeket az sszeadott. A kvetkez rszben rszletesen is megnzzk, hogyan dolgozhatunk paramlerekke l.
Amikor visszatrsi rtkkel rendelkez tagfggvnyeket hvunk meg, gy kell kezelnnk a tagfggvnyhfvst, mint ahogy a tagfggvny ltal visszaadott rtket kezelnnk. Ez gyakran azt jelenti, hogy az egyenlsgjel jobb oldalra kell tennnk a tagfggvnyhvst, vagy be kell gyamunk egy kifejezsbe.
Az imnt ltrehoztunk egy eljrst, s kt helyen is meghvtuk. Az alkalmazsunk gy
mr kezd formt lteni. Most, hogy mr van eszkztrunk s mennk, nincs szksgnk az l. rn elksztett gombokra. A gomboktl a kvetkez lpseket kvetve szabadulhatunk meg:
1. Kattintsunk dupln a Select Picture (Kp kivlasztsa) gombra az ablak jobb oldaln (elszr persze az ablaktervez6hz kell visszatmnk). Trljk az egsz e.semnykezelt, belertVe az eljrs bevezetsben szerepl pr i va te kulcsszl s a zr zrjelet Osd a 10.6. brt).
2. A munkaterlet tetejn tallhat ViewerForm.cs[Design] flre kattintva trjnk vissza az ablaktervez6hz. Az imnt trltk az esemnykezelt, a Visual C# azonban mg mindig rendelkezik egy bels hivatkozssal az esemnyre, ezrt
<
10.6. bra
pdn~
"'CJ..cl
trtDSd.ect.Pictue._C.UcJtlob)~
DU.l09t;t-3Ult,OK')
1 ll L.<.>&d Ue pu:~;ure 1cc.o c.he pi~t."'u boa. p1c.3boWP1ec.u.re .:III.6g. l)r..ltqe, hcaf'ile CotdSlecc.Hcwre.rtld'IUM:): l l ShMr ~be Mllle ot Uic tUt: 1ft tbe !en. ca~c.icn.
.)
u...1~
tbc
~hc:a'!.l.oa
230
3.
4.
5.
6.
7.
.bu.lklett.Pi~He .tf-
""bta5Ueet.P1ct.rr,
fte'W ~H-.0rP1ng. S1U(I5 .~O:
PJ.e1:ue~
.btftSel~c'ttiCt\lrt.SU
1 5);
. btnklect..Pic1;w:a . rQt~
-b~~.&Acba.t" ... t (8V~.hDIOW.roau.~ty1e) c tSnu..W'U~ .Fo~ .A."lCft..r... FbtaQo.it..t.oc.tion- &ev svst... DL._in,. ~utt(z tt:.,. 82l:
. bt;$l.'t.JI- - J:tt.itQu.lt. ;
-b~~.s1~~-
10.7. bra
Amikor az esemnyfigyelt t6r6ljk,
az esemnyekhez
tartoz hivatkozsokat ts el kell
tvo/ftanunk
10. ra
10.8. bra
Most, hogy van mennk s eszk6ztrunk, a gombok mr nem szksgesek
X:
Y:
!iE
10.9. bra
Az ablak gy mr formsabb
Paramterek tadsa
Egy eljrson bell a paramtereket arra hasznljuk, hogy a hv kd az eljrsnak adatokat tudjon tadni. Mr lttuk, hogyan adhatunk meg paramtereket: egy tagfggvny bevezetsekor zrjelben. Egy paramter megadshoz sZksges az adat tpusa s a paramter neve, ahogy az a lenti plda flkvrrel szedett rszben is lthat (a paramtereket mindig zrjelben adjuk meg):
Private void MyProcedure( string strMyStringParameter )
Miutn a 11. rn a vltozkat is megismertk, a fenti szarkezet tbb rtelmet nyer. Most csak ltalnos kpet kell kapnunk arrl, hogy miknt adjuk meg s hasznljuk a paramtereket.
A hv eljrs argumentumokon keresztl adja t az adatokat a msik eljrsnak, de ez inkbb csak jelentstani krds. Amikor egy tagfggvnyt vagy esemnykezelt vezetnk be, akkor paramternek hvjuk az elemet, ha pedig az elem egy parancs rsze, amely egy eljrst hv meg, akkor argumentumnak nevezzk. Az argumentumokat zrjelben adjuk t, ugyangy, ahogy a p-aramtert:kel. Ha egy eljrs argumenrum~ban tbb rtk is szerepel, akkor vesszvel vlasztjuk el ket. Pldul az imnt ltrehozott eljrsnak a kvetkez paranccsal adhatunk t rtket:
MyProcedure ( "Ez egy karakter lnc , l l l ;
A Visual C# paramtertadsval kapcsolatban lnyeges, hogy rtk szerint s nem hivatkozs szerni trtnik. rtk szerinti paramtertadsnl az eljrs egy msolatot kap az adatrl, gy a paramter megvltozsa nem vltoztatja meg az eredeti rtket. Hivatkozs szerinti paramtertadsnl viszont a paramter tulajdonkppen egy mutat az eredeti vltozra, gy az eljrson bell a paramter megvltozsa kihat az eredeti rtkre. Hivatkozs szerinti paramtertadshoz a paramtert a ref kulcsszval kell bevezetnnk, ahogy az a kvetkezkben is lthat:
public void MyMethod(ref string strMyStringParameter, int intMyintegerParameter)
A ref nlkl megadott paramtereket rtk szerint adjuk t; a Visual C# alaprtelmezs szerint gy kezeli a paramtereket. Az elz pldban az els paramtert hivatkozs szerint, a msodikat rtk szerint adtuk t. Mr ltrehoztunk egy eljrst, amely paramtereket fogad. Most vegynk egy msik pldt:
private void DrawBorder(PictureBox objPicturebox)
{
Graphics objGraphics ~ null; objGraphics ~ this.CreateGraphics{); objGraphics . Clear(SystemCGlors . Control); objGraphics.DrawRectangle{Pens . Blue, objPicturebox.Left - l, objPicturebox . Top - l, .objPicturebox .Width +l , objPicturebox.Height + ll; objGraphics.Dispose();
10. ra
Kvessk a
kvetkez
1. Jelcntsk meg a ViewerForm ablakot az ablaktervezben. 2. Kattintsunk dupln az eszkztr Draw Border gombjra, s trljk az eljrs tartalmt. 3. A Cl i ck esemnyhez rjuk be a kvetkez parancsot:
this.DrawBorder(picShowPicLure);
4. Trjnk vissza az ablaktervezhez (mostanra tudnunk kell, hogyan), kattintsunk az ablakon a Tools (Eszkzk) menpontra, majd dupln a Draw Border elemre. 5. Az eljrson belli teljes kdot cserljk ki erre az utastsra:
this.DrawBorder(picShowPicture) ;
Ezzel bezemeltk a menket s az eszkztrat. A program futtatshoz nyomjuk meg az F5 billenty't, s prbljuk ki az sszes menpontot, valamint eszkztrelemet (lsd a 10.10. brt). A Conftrm on Exit (Kilpskor megersts) gomb mg nem mO'kdik, de a kvetkez rn ezt is meg fogjuk oldani.
10.10. bra
A szakszen1en elksztett alkalmazsoknak nem csak a kezelfellete j, hanem az eljrsok is jl tervezettek
Kilps a tagfggvnyekb61
Normlis esetben a tagfggvnyen belli kd az elejtl a vgig vgrehajtdik, de arnikor egy return utasts kvetkezik, a vgrehajts azonnal visszatr ahhoz a parancshoz, amelyik meghlvta a tagfggvnyt A return utastssal vgrehajts kzben brmikor itilphetnk a tagfggvnybL Ha a Visual C# egy return paranccsal tallkozik, a tagfggvny azonnal lezrul, s a vgrehajts visszatr ahhoz a parancshoz, amelyik meghvta a tagfggvnyt
A pldnytagftlggvnyek olyan tagfggvnyek, amelyek egy osztlybl szrmaz objektumhoz tartoznak. Pldul a korbban rt OpenPicture () tagfggvny egy pldnytag, vagyis az osztly egy pldnyhoz tartoz tagfggvny. Ez ebben az esetben az az ablak, amelyik az ablakosztlybl szrmazik. Emiatt kellett a this kulcsszt hasznlnunk a tagfggvny meglvsakor (this . OpenPictur e () ; ). A pldnytagokon kvl statikus tagfggvnyeket is ltrehozhatu nk, amelyek az osztly egszhez tartoznak, nem pedig az osztlybl szrmaztatott objektumhoz. Ezeket akkor clszeni hasznlni, ha olyan kiegszt tagfggvnyekre van szksgnk, amelyek egyik objektumnl sem igazn hasznlhatk. Pldul tegyk fel, hogy ltrehoztunk egy bonyolult matematikai fggvnyt hasznl tagfggvnyt. Ha tbb matematikai fggvnynk lenne, ltrehozhatnnk egy c lsMath . cs osztlyt, s az sszes tagfggvnyt ebben az osztlyban helyezhetnnk el. Ez azonban egy objektum ltrehozst kveteln meg az imnti osztly alapjn, mieltt a tagfggvnyt meghvhatnnk. Ahogy korbban is emltettk, az objektumok ltrehozsa erforrs- s id6ignyes miivelet. Jobb megolds lehet, ha alkotunk egy ltalnos osztlyt, amelyet pldul clsUtility . cs-nek neveznk el, majd a tagfggvnyt statikus tagfggvnyknt hozzuk ltre. Ezt a hatkr utn megadott static kulcsszval tehetjk meg: public static int ComputeLength( string strText)
(
Pldnytagok esetn ltre kell hoznunk egy objektumot, hogy a tagot meghvhassuk Pldul, ha az imnti tagfggvny bevezetsekor nem hasznltuk volna a static kulcsszt, el6szr pldnyostanunk kellett volna egy objektumot, majd utna hvhattuk volna meg a tagfggvnyt A kd ekkor a kvetkez6kppen nzett volna ki (errl rszletesebben a 16. rn lesz sz): c l sUtility obj Uti l ity = new clsUt i l ity(); i nt intResu l t : i ntResult = objUtility. ComputeLength("Sams Publishing "): Ha statikus tagknt vezetjk be a tagfggvnyt, nem kell a pldnyostssal tr6dnnk. Tagfggvnyhvskor csak el kell rnunk az osztly nevt: int intResult ; intResult = clsUtility .Comput eLength ( "Sams Publishing) ; A statikus tagok nagyszeru lehetsget biztostanak, hogy olyan ltalnos fggvnyekhez frjnk how, amelyek nem ignylik az osztly pldnyostst, s gyakran szksgnk van rjuk.
10. 6ra
DoSomethi ng();
Ha meghvjuk az eljrsok brmelyikt, eljrshvsok vgtelen ciklusba kerlnk, amire a 10.11 . brn lthat hibazenelet kapjuk.
10.11 bra
A vgtelen 6nhvs veremt/csordulsi kivtelt (hibt) eredmnyez
Az ilyen vgtelen ciklust 6nhv ciklusnak nevezzk. Anlkl, hogy mlyen belemen-
nnk, rviden arrl van sz, hogy a Visual C# minden eljrshvs szmra kijell egy veremnek nevezett memriaterletet. A verernben vges mennyisg hely ll rendelkezsre, gy a vgtelen nhvs az sszes rendelkezsre ll veremterletet felhasznlja, s kivtellp fel. Ez slyos hiba, s lpseket kell tennnk, hogy az ilyen nhvst elkerljk Az nhvsnak (rekurzinak) vannak megfelel alkalmazsai, elssorban a szmtsokat vgz vagy amerevlemez sszes mappjn ismtld mveleteket vgrehajt algoritmusoknL A szndkosan vgrehajtott, nhvssal jr mdszerek nem felttlenl vgzdnek vgtelen nhvsban, mert rnindig van egy pont, ahol az nhvs megll (remlhetleg rnleltt tlcsorduina a verem). Ha rdekldnk az ilyen algoritmusok irnt, olvasunk el egy ennek a trnnak szentelt knyvet.
sszefoglals
Ezen az rn megtanultuk, hogy a tagfggvny vagy eljrs egy nll kdrszlet, amely egy adon feladatot vagy sszefgg feladatokat hajt vgre. A Visual C# kdot tagfggvnyekben helyezzk el. Egyes tagfggvnyek llhatnak egyetlen kdsorbl, msok tbb oldal hosszsgak Megtanultuk, hogyan vezessk be s hvjuk meg a tagfggvnyeket A tagfggvnyek ltrehozsnak s meghvsnak kpessge alapvet fontossg, ha sikeresen szeretnnk Visual C# programokat rni. Figyeljnk oda, hogy elkerljk az nhv eljrsokat! Mivel gyakran hasznlunk eljrsokat, a hasznlatuk hamarosan temszeres lesz a szmunkra. Az osztlyokat sszefgg eljrsok csoportostsra hasznljuk. Ezen az rn annak az ablakosztlynak a hasznlatra sszpontostonunk, amellyel eddig is dolgoztunk. A 16. rn az osztlyokkal szerzen tapasztalatainkra alapozva j objektumokat hozunk ltre osztlyok segtsgve!, s ez megkveteli a tagfggvnyek pontos elklntst.
Jegyezzk meg, hogy minden tagfggvny egy bizonyos feladatot kell, hogy ellsson, ezrt ne hozzunk ltre olyan tagfggvnyeket, amelyek sok klnbz feladatot vgeznek el. Pldul tegyk fel, hogy olyan kdot akarunk lrni, amely az ablakra egy ellipszist rajzol, s ezen kivl az ablak tartalmt is trlni akarjuk. Ha mindkt mveletet ugyanabban a tagfggvnyben helyeznnk el, miutn megrajzoltuk az ellipszist, rgtn trlnnk is azt. Ha a kt mveletet kln tagfggvnybe helyezzk, az egyik tagfggvny meghvsval megrajzolhatjuk az ellipszist, majd a msik tagfggvny meghvsval trlhetjk azt. Ha ezt a kt tagfggvnyt j osztlyban helyezzk el. ahelyett, hogy egy adott ablakosztlyhoz adnnk ket, brmely ablak szmra elrhetk lesznek, ha szksg lenne rjuk.
Krdezz-felelek
K: Sok figyelmet kell fordtanunk a hatk6rre, amikor meghatrozzuk az eljrsokat? V: Nagy lehet a ksrts, hogy minden tagfggvnynket nyilvnoss tegyk, de ez tbb okbl is rossz programozsi gyakorlat. Elszr is egy nagyobb programban
lehetnek olyan tagfggvnyeink, amelyeknek azonos a nevk, de nmileg eltr feladatot ltnak el. Ezek az alprogramok ltalban csak egy krlhatrolt terleten bell jtszanak szerepet. Ha rninden tagfggvnynk nyilvnos, akkor az ezen a hatkrn bell azonos nvvel elltorr tagfggvnyek sszetkzhetnek. Ha a tagfggvnynek nem kell nyilvnosnak lennie, ne tegyk nyilvnos hozzfrsv. K: Mit jelent az, hogy "sszer" szm osztly? V: Ezt nehz megmondani - tnyleg nincs r helyes vlasz. Ahelyen azonban, hogy a pontos szm rniatt aggdnnk, arra kell trekednnk, hogy az osztlyaink logikusak legyenek, s csak a legszksgesebb tagfggvnyeket s tulajdonsgokat tartalmazzk.
10. ra
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. Milyen nagyobb programszerkezeten bell helyezzk el a tagfggvnyeket? 2. Igaz vagy hamis? "Ahhoz, hogy egy osztlymodulon bell hozzfrjnk a tagfggvnyekhez, elszr ltre kell hoznunk egy objektumot." 3. Hogy hvjk azt az adatot, amelyet egy hv utasts tad egy tagfggvnynek? 4. Mivel kell elvlasztanunk a paramtereket, ha tbb paramtert szeretnnk tadni egytagfggvnynek? 5. Hogyan hvjuk azt a jelensget, amikor egy tagfggvny ismtlden meghvja magt?
Vlaszok
1. Osztlyokon bell. 2. Hamis. Ha statikus tagknt vezetjk be a tagfggvnyt, nem kell objektumot pldnyostanunk ahhoz, hogy a tagot meghvhassuk. 3. Paramter.
4. Vesszvel.
5. nhvs.
Gyakorlatok
1. Egy ablak rszeknt hozzunk ltre egy eljrst, amely egy karakterlncol fogad, s egy etl61 eltr karakterlncot ad vissza. Adjunk olyan kdot egy szvegmez TextChanged escmnyhez, amely meghvja az eljrst, s argumentumknt adjuk t a szvegmez tartalmr. Az eljrs eredmnyeknt adjuk vissza az tadall szveget nagybetGvel rva. (Tipp: hasznljuk a beviteli mez Text tulajdonsgnak ToUpper tagfggvnyt.) 2. rjunk olyan eljr-.1st, amely nmagra hivatkozik, majd hvjuk meg egy gomb Cl i ck esemnyb61, s figyeljk meg a kapott hibt.
11.
,
RA
Adattpusok Adattpusok meghatrozsa Adattpusok talaktsa llandk meghatrozsa s hasznlata Vltozk bevezetse s hasznlata Tmbk hasznlata Hatkr meghatrozsa Statikus vltozk bevezetse Nvadsi szablyok hasznlata
A Visual C#-eljrsok rsa kzben ltalban szksgnk van arra, hogy adatokat troljunk s nyerjnk vissza. Valjban nehz olyan alkalmazst elkpzelni, ahol ne lenne szksg arra, hogy a kd adatokat troljon, vagy hogy abbl adatokat nyerjnk ki.
Ezen az rn ott folytatjuk a Picture Viewer programunk lrst, ahol az elz rn abbahagytuk. Azokat a szolgltatsokat fogjuk fokozatosan megvalsftani, amelyeknek a kezelfellett az Options ablakban mr elksztettk.
Adattpusok
Minden programozsi nyelvnek van egy fordtprogramja. A fordtprogram rsze a Visual Srudio .NET keretrendszemek, amely az ltalunk rt kdot rtelmezi, s a szmtgp ltal rthet nyelvre rja t. A fordtnak ismernie kell a kdban hasznlt adatok tpust. Pldul, ha azt krjk tle, hogy adja ssze a kvetkez kt rtket, akkor sszezavarodik:
"Fender Strat
+
63
Ha a fordt sszezavarodik, akkor vagy nem fordtja le a kdot (ami inkbb kvnatos, mert akkor foglalkozhatunk a problmval., rnieltt a felhasznlk hasznlatba vennk a programot), vagy megll, s kivtelt (hibt) vlt ki, amikor elri a kd krdses rszt. (Errl a ktfajta hibalehetsgrl bvebben a 15. rn lesz sz.) Nyilvnval, hogy nem adhatjuk hozz a "Fender Strat" szavakat a 63-as szmhoz, mert ez a kt rtk ms tpus adatot kpvisel. A Visual C#-ban azt mondjuk, hogy ez a kt rtk eltr adattpusba tartozik. A Visual C#-ban mindig meg kell hatroznunk, hogy az llandk, vltozk s tmbk rnilyen tpus adatokat tartalmazhatnak
11. ra llandk,
Adattfpus meghatrozsa
Az adattpus meghatrozsa, aminek a sorn az llandk, vltozk s tmbk tpust meghatrozzuk, szakatlan lehet, mert: a Visual C# szmra a szmok nem csupn egyszer szmok. Egy tizedesjegyeket tartalmaz szm ms, mint egy olyan szm, amelyiknek nincs tizedesjegye. A Visual C# klnbz tpus6 adatokon kpes matematikai mveleteket vgrehajtani, de egy bizonyos tpus6 adatot ne m trolhatunk egy azzal ssze nem egyeztethet tpussal rendelkez vltozban. Emiatt a korltozs miall az llandk, vltozk s tmbk ltrehozsakor gondosan meg kell gondolnunk, hogy mlyen tpus adatokat akarunk bennk trolni. A Visual C# ltal hasznlt adattpusok s az ltaluk trolt rtk tartomnya a 11.1 tblzatban lthat.
A Visual C# az adattpusok kt csoportjt tmogatja: az rtktpusokat s a hivatkozstpusokat A kt tpus kztt a legfbb klnbsget az jelenti, ahogy az rtkeik a mamriban troldnak. Ahogyan egyre bonyolultabb alkalmazsokat kezdnk rni, ez a klnbsg hatssallehet arra, ahogy a programunkat megszerkesztjk, a jelen knyv szempontjbl viszont a klnbsg elenysz.
Object
rtktartomny Igaz (true) vagy harnis (false). O-tl 255-ig (eljel nlkli). Egyetlen Unicode-karakter. 0001. janur l . 0:00:00-tl (jfl) 9999. december 31. 23:59:59-ig. +l-7,9228162514264337593543950335, a tizedesvessztl jobbra 28 helyirtkkeL Pnzsszegeknl ezt az adattpust kell hasznlnunk. -1,79769313486231570E+308-tl1,79769313486231570E+308-ig. -2147483648-tl2147483647-ig (eljeles). Az Int32 adattpussal azonos. -9223372036854775808-tl 9223372036854775807-ig (eljeles). Az Int64 adattpussal azonos. -128-tl127-ig (eljeles). -32768-tl32767-ig (eljeles). Az Int l 6 adattpussal azonos. -3,4028235E+38-tl 3,4028235E+38-ig. O-tl4294967295 (eljel nlkli). O-tl 18446744073709551615 (1,8...E+ 19)-ig (eljel nlkli). O-tl 65535-ig (eljel nlkli). O-tl krlbell ktmillird Unicode-karakterig. A vltozban brmilyen tpus trolhat.
Visual C# az eljel nlkli short, int s long acialtpusokat is tmogatja (az ilyen tipusok neve eltt u berti ll, pldul uint). Mivel a negativ szmok ilyenkor kiesnek (nincs eljel), az eljel nlkli tipusok ktszer annyi pozitiv rtket kpesek trolni, mint az eljeles short, int s long tpusok Az eljeles tpusokat ajnlott hasznlni, hacsak nincs j okunk msknt dnteni (pldul ha olyan vltozt vezetnk be, amely soha nem vehet fel negatv rtket).
Az Ob j e ct adattpus alkalmazsnak ugyanakkor tbb htultje is van. Elszr is, ez a tpus a tbbinl tbb helyet foglal a memriban. Ezen kivill a Visual C#-nak valamivel tovbb tart az Obj ect tpus adatokon szmtsokat vgezni. Hacsak nincs r klnleges okunk, ne hasznljuk ezt az adattpust (vannak sszer indokok, pldul amikor nem tudjuk elre, hogy milyen adatot akarunk a vltozban trolni). Ehelyett szokjuk meg a konkrt adattpusokat, s hasznljuk azokat megfelelen.
Tipustalakts
A Visual C# a Jegtbb esetben nem engedi, hogy egy bizonyos tpussal rendelkez adatot egy msmilyen tpus vltozha tegynk t. Azt, amikor egy adott rtk adattpust megvltoztatjuk, tipustalaktsnak nevezzk. A Visual C# a rejtett (belertett, implicit) s a kifejezett (konkrt, explicit) tpustalaktst is tmogatja. A rejtett tipustalaktst automatikusan elvgzi a fordt. Pldul egy double tpus vltozt kifejezett tpustalakts nlkl is t tudunk alaktani float tpusv, mert nem ll fenn az adatveszts veszlye. A double adattpus a float -nl tbb helyirtker tartalmaz, gy ez egy bvt tpustalakts. A kifejezett tipustalakts akkor ktelez, ha fennll az adatveszts veszlye, vagy ha egy nagyobb adattpust alaktunk t ltisebb (szkt tpustalakts). Ha olyan rtket prblunk elhelyezni egy vltozban, ami nagyobb, mJnt amekkort a vltoz adattpusa tmogat, akkor adatot vesztnk, ezrt a Visual C# megkveteli, hogy az ilyen jelleg talakts egy mveler segtsgve!, kifejezett mdon trtnjen meg. A 11.2. tblzatban felsoroltunk nhny olyan rejtett tpustalaktst, amelyet adarveszts nlkl elvgezhetnk
Arniv biztonsgosan talakfthatjuk short, int, long. float, double, or decimal int, long , float, double, or decimal long, float, double, or decimal float, double , or decimal double decimal
Ahhoz, hogy egy adat tpust talaktsuk, a Convert osztly egyik tagfggvnyt kell hasznlnunk. Ezeket a tagfggvnyeket a 11.3. tblzatban lthatjuk. Az alkalmazsuk meglehetsen egyszer: paramterknt megadjuk az talaktani kvnt adatot, majd a tagfggvny visszatr a kvnt tpussaL Pldul alaktsunk t egy int tpus adatot egy double-knt bevezetett vltozv- ehhez a kvetkez6 parancsot kell kiadnunk: dblVariable = Convert .ToDouble(intVariable);
Fggvny ToBoolean(kife jezs) ToByte (k ifejezs) ToChar(kifejezs) ToDateTime(kifejezs) ToDecimal(kifejezs) ToDouble(kifejezs) Toint16(kifejezs) Toint32(kifejezs) Toint64(kifejezs) ToSByte(kifejezs) ToSing l e (ki fejez s) ToString (ki fejezs) ToUintl6(kifejezs) ToUint32(kifejezs) ToUint64(kifejezs)
Arniv alakit bool byte char DateTime decimal double 16 bites, eljeles egsz szm integer long sbyte Single string 16 bites, eljel nlkli egsz szm 32 bites, eljel nlkli egsz szm 64 bites, eljel nlkli egsz szm
11. ra llandk,
Egyszerbb a kdot olvasni. - A mgikus szmok jelentse ritkn nyilvnval, a jl elnevezett llandk ezzel szemben tlthatv teszik a kdot. A kvetkez parancsok kzl melyiknek van tbb rtelme?
decinterestAmount
vagy
decintcrestArnount ((decLoanArnount * c _ fltinterestRate) * c_intMonthsinTerm);
adattipus nv
= rtk;
Pldul ha a pi szmot tartalmaz llandt akarjuk ltrehozni, akkor a parancs a kvetkezkppen nz ki:
const double c_pl
= 3,14159265358979;
Figyeljk meg a c_ eltagot az lland neve eltt. Ez azrt fontos, hogy knnyebben meg tudjuk mondani, hogy mi lland s mi vltoz, amikor olvassuk a kdot. (Bvebben lsd az ra ksbbi rszben a nvadsi szablyok hasznlatrl rtakat.) Miutn meghatroztuk az llandt, az rtke helyett a nevt hasznlhatjuk a kdban. Pldul ha ki akarjuk ratni a pi rtknek a ktszerest, a kvetkez parancsot kell kiadnunk (a * karakter aszorzs jele, s a 12. rn trgyaljuk bvebben):
Console .WriteLine(c_pi *2 ) ;
knny
elrontani, mint
A hatkrket az ra
ksbbi,
Ezen az rn a tanultak alapjn mkd6kpess tesszk a 7. rn ltrehozott vezrlket Az els dolog, amit tenni fogunk, nhny lland meghatrozsa, hogy a belltsoknak alaprtelmezett rtket adjunk. Emlkezznk vissza, hogy a 7. rn elksztettnk egy ablakot, ami lehetv tette a felhasznlnak, hogy belltsa a kvetkez dolgokat:
A felhasznl neve - Ez csak az Options ablakban jelenik meg. A kilps megerstsre vonatkoz figyelmeztets - Ez a lehetsg arra szolgl, hogy
a felhasznlt megkrdezzk, hogy valban ki akar-e lpni a Picture Viewer alkalmazsbl. A kpmez alaprtelmezett httrszne - Ezt szrkre (alaprtelmezett) vagy fehrre lehet lltani.
vagyis azon az osztlyon bell brhol felhasznlhatk lesznek, ahol bevezetjk ket. Ez azt jelenti, hogy nem egy adon eljrsba helyezzk ket, hanem az osztly bevezetse (a public partial class o sztlynv kd) utn adjuk meg amodul llandit. lltsuk a kurzort az osztlydeklarci alatti sorban lv kapcsos zrjel utn (lsd a ll. l. brt), az ENTER billenty'vel kezdjnk j sort, majd a kvetkez utastssal vezessk be az llandt:
consL bool c_defPromptOnExit
=
false ;
A kvetkez rszben megtanuljuk, hogyan hasznlhatjuk ezt az llandt arra, hogy belltsuk egy vltoz rtkr.
\"l-~tf
nr : rem
ll Shaw
tt
(
t.be
ooan
Uh dU.1oa tlOx..
lhal~!St~h.CK)
(o tc*Se.llt~~ . S~l.ov ()
t.he Plu.re ball'. :p1c~Cit1lre.DIIa9e l'.cave.rrc.:fUe(ofd.Se:lactPi.c:rtlln . r 1 1AII-.) : ll ~ t.bc ~ ct ~b Uh u eb .ton c.APttOD . t:M .Ytxt. nr16Q.ccmcae("~'P1ct.uno Y'l.eve:r ( ~
Gtd5el.e~P1c:ture.r.n.d.-e
lJ t.o.d ma piet.ll.re
Ul~::.a
~ );.
11 .1. bra
Ez alatt a kapcsos zrjel alatt hozzuk ltre az osztlyszint llandnkat
ll SMtt
t~
11. ra llandk,
Vltozk bevezetse
A vltozk bevezetst deklarcinak nevezzk. (A vltozk helyitl eltr hatkrt kiss eltr mdon kell megadni, amit a hatkrkl szl rszben fogunk trgyalni.) A korbbi rk sorn mr vezettnk be vltozkat, gy az utastsforma ismers kell, hogy legyen:
adat tpu s vltoznv
= kezd6rtk;
kezdrtknek
megadshoz pldul
strName
meg azonban, hogy attl, hogy kezdrtket adtunk neki, ez az elem mg nem lesz lland, csupn egy vltoz, amelynek az rtke brmikor megvltoztathat. A kezdrtk megadsnak ezzel a mdjval megsprolhatunk egy parancsot a kdban, valamint a kdot egy kicsit knnyebben olvashatv tehetjk, rnivel nem kell keresglnnk, hogy a vltozt hol lttuk el kezdrtkkeL Fontos megjegyezni, hogy a Visual C# ersen tpusos nyelv, ezrt a vltoznak mindig meg kell adni az adattpust Ezen kvl a Visual C# megkveteli, hogy minden vltozt ellssunk kezdrtkkel, mi eltt hasznlnnk.
A Visual C#-programozknak meg kell jegyeznik, hogy a Visual C# a szm tipus vltozknak nem adja alaprtelmezett rtkknt a nullt, illetve a karakterlnc tipusaknak az res karakterlncot
Az albbi utastsok pldul a Use of unassigned local variable fl tMyVal u e (Az fltMyValue nevt1 helyi vltoz hozzrendels nlkli alkalmazsa) fordtsi hibt
eredmnyezik a Visual C#-ban: float fltMyValue; System .Diagnosticy.Debug .WriteLine (fltMyValue +2); Fenntartott szavakat nem adhatunk meg llandk vagy vltozk neveknt Pldul a pr i vat e vagy a public szt nem hasznlhatjuk, mint vltoznevet A fenntartott szavaknak van egy trzsjegyzke, s a listban szerepl szavakra a sgban is rkereshetnk. Keressnk r pldul a public kulcsszra! A leggyakoribb kulcsszavakat gyorsan meg fogjuk tanulni, mert folyamatosan hasznljuk azokat, a tbbi
Egy dologra oda kell figyelnnk, amikor egy karakterlnchoz Hterlis rtket rendelnk: a Visual C# a fordtott perjelet (\) klnleges vdkarakterknt rtelmezi. Ha a vltoznak tadand literlls karakterlnc egy vagy tbb fordtott perjelet tartalmaz, hibazenetet kapunk. llyen esetekben a literl el egy @ jelet kell rnunk:
strFilePath
= @"c : \Temp" ;
Ha a Visual C# a @jellel tallkozik, mint az elz pldban, tudja, hogy a fordtott perjelet nem vd6karakterknt kell rtelmeznie. Ha egy karakter tpus vltoznak akarunk literlis rtket tadni, a helyett egyszeres idzjelet (aposztrfot) kell alkalmaznunk:
chrMcCharacter
keus idzjel
'j' ;
=2
5;
Ezen kvl az albb bemutatott mdon kicserlhetjk az egyik vagy rnindkt szmot szm tpus vltozra vagy llandra:
intMyVariable intMyVariable intMyVariable
= intFirstValue
11. ra llandk,
A vltozk nagyszer lehet6sget biztostanak, hogy rtkeket raktrozzunk el a kd vgrehajtsa kzben. Az elgazsoktl a ciklusokig mindenhol fogunk vltozkat hasznlni tmeneti trolhelyknt, ahol bizonyos rtkeket rgztnk. Ugyanakkor emlkezznk vissza: ha a program rsa kzben mr tudjuk az rtket, ami nem fog megvltozni, akkor llandt rdemes hasznlnunk. Ha az rtket nem tudjuk el6re, vagy vltozhat, hasznljunk olyan adattpussal elltott vltozt, amely megfelel a vltoz szerepnek.
A Visual C# 2008-ban a vltozk objektumokknt jnnek ltre. Prbljunk meg ltrehozni egy vltozt s megismerni a tagjait (teht a tulajdonsgait s tagfggvnyeit). Ezt gy tehetjk meg, hogy berjuk a vltoz nevt, majd utna pontot tesznk (ez csak azutn fog mkdni, hogy a vttozt bevezettk). Pldul egy karakterlnc tpus vltozban lv szveg hossznak meghatrozshoz a Length tulajdonsgot hasznlhatjuk:
strMyVariable.Length
nagyszer
szaigitats segti.
Tmbk hasznlata
A tmb a vltozk egy klnleges tJpusa - olyan vltoz, amely tbb dimenzival
rendelkezik. Gondoljunk a vltozra gy, mint egy levelesldra, amelynek akkor kaphatjuk vissza vagy vltoztathatjuk meg a tartalmt, ha hivatkezunk r. A tmb viszont olyan, rnint egy egsz sor leveleslda (amelyeket elemeknek hvunk); a tmbvltozra hivatkozva brmelyik leveleslda tartalmt brmikor kinyerhetjk vagy megvltoztathatjuk. Ezt egy sorszm (index) segtsgvel tehetjk meg, amely a megfelel6 levelesldra mutat.
Tmbk bevezetse
A tmbket gyakorlatilag ugyangy vezethetjk be, ahogy a hagyomnyos vltozkat -
ltrehozhatunk olyan tmbket is, amelyeknek a mrete futskor vltozik. ez a tma azonban meghaladja a knyvnk kereteit.
Hivatkozs tmbvltozkra
Ahhoz, hogy egy rtket elhelyezznk a tmbindexben, meg kell adnunk az indexszmot, amikor a vltozra hivatkozunk. A legtbb szmtgpes mGvelet a O-t tekinti egy sorozat els tagjnak s nem az l-et, mint ahogy azt vrnnk. A tmbk indexelse is gy mkdik. Pldul egy a [9) megadsval bevezetett 10 elemb61 ll tmb egymst kvet elemeire a O, l , 2, 3, 4, 5, 6, 7, 8 s 9 indexek alkalmazsval hivatkozhatunk.
Figyeljk meg, hogy az utols index az a szm, amelyet a tmb bevezetsekor megadtunk. Mivel a Orvnyes elem, eggyel tbb elemnk lesz, mint amennyi a tmb bevezetsben szerepel, ami zavar lehet. Hogy egyszersftsk a programfejlesztst, rdemes megfontolnunk, hogy figyelmen kvl hagyjuk a O. elemet s az csak az 1., valamint a bevezetskor megadott utols rtk kztti elemeket hasznljuk.
els
= strMyArray[O];
A tmbvltoz szmra meghatrozott adattpus a tmb sszes elemre vonatkozik. Ha azt szeretnnk, hogy minden elem brmilyen tpus vltozt trolhasson, az Object tpust hasznlhatjuk, de ez a korbban trgyalt okok miatt nem ajnlott.
ban egy egydimenzis tmbt lttunk, de a tmbk sszetettebbek is lehetnek, pldul ltrehozhatunk egyetlen tmbvltozt klnbz szemlyek adatainak trolsra. A tbbdimenzis tmbket tbb paramterrel vezetjk be, mint a kvetkez pldban:
int[,] intMeasurements; intMeasurements =new int(3,2];
Ezek az utastsok egy ktdimenzis tmbt hoznak ltre. Az els dimenzi (amelyet gy hatroztunk meg, hogy hrom elemmel rendelkezzen: O, l , 2) a msodik dimenzi indexeknt szolgl (amelyet hromelemknt hatroztunk meg). Tegyk fel, hogy ngy ember magassgt s testslyt akarjuk ebben a tmbben trolni. A tmbre ugyangy hivatkozhatunk, mint az egydimenzis tmbkre, de van mg egy tovbbi indexparam-
Ktdimenzis tmb
El$6 dimenzi
------i~
0,0 0, 1
0,2 0,3
11.2. bra
A ktdimenzis tmbk
levelesldkbl ll jalhoz hason1ftanak
Az elemek csoportostsa az els index ltal meghatrozort mdon trtnik. Gondoljunk az indexek els halmazra gy, mintha egydimenzis tmbk lennnek. Pldul ha egy szemly magassgt s testslyt a tmb els dimenzijban szecetnnk trolni (ne feledjk, hogy a szmozs O-nl kezddik), a kvetkez kdot hasznlhatjuk:
intMeasurements[O ,O ] intMeasurernents[O ,l ]
= Els6SzemlyMagassga ;
= Els6SzemlyS lya;
Hasznos, ha a tmb elemei szmra llandkat hozunk ltre, amelyek rthetbb teszik a hivatkozsokat Figyeljk meg a kvetkez kdot:
const int c_Height = O; const int c_Weight = l; intMeasurernents[O,c_Height) intMeasurernents[O ,c_Weight]
Els6SzemlyMagassga; Els6SzemlySlya ;
kvetkez
mdon trolhatjuk:
Ebben a tmbben az els dimenzit arra hasznltuk, hogy klnbsget tegynk az emberek kztt, a msodik dimenzit pedig arra, hogy az els dimenzi minden elemnek troljuk a magassgt s testslyt. Mivel a magassg trolsra kvetkezetesen a tmb msodik dimenzijnak els helyt, a testsly trolsra pedig a tmb msodik dimen-
kvetkezket:
Egy tmb brmely dimenzjjnak els elemr a O index jelli. A tmbket mretezznk akkorra, amennyi adatot el szecetnnk helyezni bennk. A tmbket olyan adattpussal hozzuk ltre, ami megfelel a tmb elemeiben elhelyezend rtkeknek A tmbk remek lehetsget biztostanak, hogy a Visual C# kdban egymssal sszefgg adathalmazokkal dolgozzunk. Lehetv teszik, hogy sokkal nagyobb adathalmazokat sokkal egyszerunben s hatkonyabban kezdjnk, mintha ms mdszert alkalmaznnk. Ha a tmbket a lehet leghatkonyabban szecetnnk kezelni, tanulmnyozzuk a 14. rn trgyalt for ciklust. Ennek segtsgvel gyorsan vgighaladhatunk a tmb egymst kvet elemein.
Ebben a rszben a Visual C# szablyos tmbjeivel (.ngyszgletes tmbn foglalkozunk. A Visual C# azonban msmilyen tlpus tmbket is tmogat. amelyeket nem szablyos tmbknek (,.csipkzett tmbk") neveznek. A nem szablyos tmbk egydimenzis tmbkbl llnak, amelyek kzl mindegyik eltr hosszsg lehet (innen a .,csipkzett" nv), ez a tmbfajta azonban kvl esik a knyvnk keretein.
Hat6krk meghatrozsa
Az llandk, vltozk s tmbk hasznosak, ha a Visual C# kdban adatot akarunk
trolni vagy visszakapoL Aligha rdott olyan program, amely ne hasznlta volna ezeknek legalbb az egyikt. Ha azonban megfelelen akarjuk ket hasznlni, meg kell rtennk a hatkr fogalmt A 10. rn a pr i vat e s public kulcsszavak kapcsn tallkoztunk elszr a hatkrrel. Megtanultuk, hogy a kdot eljrsokba (tagfggvnyekbe) helyezzk, az eljrsokat pedig modulokban troljuk. A hatkrarra vonatkozik, hogy az llandk, vltozk s tmbk milyen mctkben .lthatk" a kdban. Egy lland vagy vltoz szmra a hatkr a kvetkezk egyike lehet: Blokkszint Tagfggvnyszint (helyi) Privt
A blokkszinttl hatkr
Blokksznt hatk6rrel vagy vezrlsiszerkezet-szint hatk6rrel egy vez rlsi szerkezeten, pldul ciklusen vagy felttelen bell bevezetett vltoz rendelkezik.
A vezrlsi szerkezetek olyan programozsi elemek, amelyek egy helyett kt utastsbl llnak. Pldul a szoksos do vezrlsi szerkezetet ciklus ltrehozsra hasznljk:
do
{
A Visual C# structure (szerkezet) alatt a felhasznl ltal meghatrozott tipusokat rti, de ha programkdrl beszlnk, a (vezrlsi) szarkezet egy kezdettel s vggel rendelkez blokkot jelent. A knyv htralev rszben a H(vezrlsi) szerkezet" kifejezs ez utbbira fog vonatkozni.
me egy plda a for ciklusra:
for (int i = l; i<lO ; i++)
{
Ha egy vltozt egy vezrlsi szerkezeten bell vezetnk be, a vltoz hatkre arra a vezrlsi szerkezetre korltozdik. A vltoz a bevezetsig nem jn ltre, s trldik, mihelyt vge a vezrlsi szerkezetnek. Ha a vltozra egy ilyen vezrlsi szerkezeten bell van csak szksg, hozzuk ltre a vezrlsi szerkezeten bell, hogy blokkszint hatkrrel rendelkezzen. Figyeljk meg a kvetkez pldt:
if (blnCreateLoop)
{
l l Valamilyen mvelet
Privt hatkr
Amikor egy lland vagy vltoz privt hatkrrel rendelkezik, a bevezetst tartalmaz osztly sszes tagfggvnye lthatja, a tbbi osztly tagfggvnyei szmra azonban nem ltezik. Ha privt hatkr llandt vagy vltozt szeretnnk ltrehozni, a bevezetst az osztlyon bell, de a tagfggvnyeken kvl kell elhelyeznnk. Osztlytagokat ltalban az osztly elejn szoktunk bevezetni, rgtn a nyit kapcsos zrjel utn. A privt hatkrt akkor hasznljuk, ha sok tagfggvnynek kell osztoznia ugyanazon a vltozn, vagy ha az rtkek paramterknt trtn tadsa nem megoldhat. Ahhoz, hogy az ablakok ltrehozsra hasznlt modulokon kvl a tbbi is elrje az adott kdot, a bevezetsben meg kell adnunk azokat. Csak rjuk az utastsokat az osztlydeklarci sora utn s a tagfggvnyek bevezetse el, ahogy az a 11.3. brn is lthat. ltalban minl kisebb (korltozottabb) a hatkr, annl jobb. Hacsak lehetsges, a vltozink blokk- vagy helyi szintek legyenek. Nyilvnos vltozkat csak akkor hasznljunk, ha felttlenl szksges. Minl nagyobb a hatkr, annl nagyobb a felmerl problmk eslye, s annl nehezebb azok elhrtsa.
11. ra llandk,
Plilbl..lc . .n.,&l
(
cu.... vuw.,.
f,. : rota
falw:
oocr.n
bool
o_.u-~aa.
ll .Sbov uu:. opu t'Ue d.u l09 tlmr. U to.tdSe:lectRi.C'ton.ao.nJ.a.loot) - DJ.uoolcJUl.t. .OIQ l 1/ l.oN "M .iCMH Ut.O thtr P lct.-.rt! MJI. JU.c9oVP1ec.u.t'e .t.&Qe laaQ~ '"-'1 blo t43U~-.n . l'U.-l1 fl nt)w 't:be c... ot ~.,_ t:il.e- ia t.b caaa c:~ioo . u..t-.T~ fi ri.a9, ec.oa~ ( P1~ Vi~wrt + otdSeJ.acrt.toaare.nl~ ) )J ll Sls<:rw ~e ~ o.C 'the f :a.le .i.n ~. Ut.U. tRir. brtlySueuScn,p.ltt'IIUI(OJ. Text; o:tcLSel"P1C'CU.l'e.JleJIMII:
11 .3. bra
A deklarcik a tagfaggvnyek eltt he(yezkednek el
Nvadsi szablyok
Ahhoz, hogy nmagt kellen ler kdot rjunk (ami mindig fontos szempont) s cskkentsk a programozsi hibk eslyt, egyszer utat kell tallnunk, hogy meghatrozzuk a Visual C# kdban szerepl vltozk, illetve hivatkozott vezrl6k tpust.
Eltag
Plda vltozra
blnLoggedin by tAg e chrQuantity de c Salary dblCa lculatedResult flt InterestRate
b ln by t c hr dec db l
fl t
EUitag
int lng obj sho st r
Az obj eltagot tartagassuk arra az esetre, amikor egyetlen alkalmas eltag sem ll mr rendelkezsre. ltalban akkor hasznljuk, amikor ms programokra vagy automatizlsi knyvtrakra hivatkozunk.
Ha az egrmutatt egy vltoz fl visszk a kdban, megjelenik egy eszkzlers, amelyben megtekinthetjk a vltoz deklarcijt
Eltag
g
m
(nincs eltag)
Hatkr lersa Globlis Privttl az osztlyszintig Nem statikus vltozk a helyitl a tagfggvnyszintig
Eltagokat nem csak a vltozk esetben hasznlhatunk. Minden szabvnyos objektumnl (belertve az ablakokat s a vezrl6ket) alkalmazhatunk hrombets eltagokat Tl sok vezrl s objektum van ahhoz, hogy az sszes eltagot felsoroljuk, de majd ltni fogjuk, hogy a knyvben a vezrlk neve eltt nndenhol eltag szerepel. Ha a nvadsi szablyokrl s ltalnossgban a programozsban hasznlt szabvnyokrl tbbet szeretnnk tudni, rdemes elolvasnunk a kvetkez knyvet: Practical Standards for Microsoft Vtsual Basic .NEf, msodik kiads, Microsoft Press, 2002.
11 . ra llandk.
llandt, most pedig vltozkat hozunk ltre, hogy az Options ablak vezrli szmra rtkeket troljunk A program belltsi lehetsgeinek kdolst a 16. rn fejezzk majd be.
Gondolkozzuk el egy pillanatra azon, hogy ennek a belltsi lehetsgnek milyen tpus adatot kell trolnia. Ha a vlasz s tri n g (karakterlnc) volt, akkor helyesen vlaszoltunk. Prompt to confirm on exit (Figyelmeztets kilpskor) - Ennek a belltsnak kt lehetsges rtke van, az igaz s a hamis, ezrt egy bool tpus vltozt kell ltrehoznunk a szmra. Default picture background color (A kp alaprtelmezett httrszne) - Ez tulajdonkppen klnleges eset. Korbban a szokvnyos adattpusokrl volt sz, de ezeken kvl mg tbb tucat ltezik, amelyek kzl az egyik a Color. Itt egy Color tpus vltozt kell alkalmaznunk, hogy troljuk a felhasznl sznbelltst.
pUbl.i<:
~J.al el~~
Vlt:ftYCO:t:a l
Y~nn
ta~:
c
conat bOol c_ae.rPra.pU)nb.te
:ttlliag crV!u!~ J bool -ie~~&a.lt. - c dcth:~tODEt.J t::::ol.O~ ;;_ob)ll~lo;;
Ui.lllQillU.Ut .OIQ
c
ll t.o.d Che ot.et.a.re into ttl.c p1erare ..-.. pJ.cSaowP1cn re. t.. wc ... l.Mte-. had'i..lt (o f41ela~Pictun . FJ.l . ._
);
11 .4. bra
Az osztly vltozi
ll
SbOIII
me a-.. cr
Ql.e
ru u
.ru~
~--
rom cape.i.on.
t..tu bu.
Ql..s.tu~-
o.tdSe.l.~tict.v.n..rl....._
+ t ) ,
t~
a deklarcik kz,
az eljrsok al
kerlnek
lpseket:
1. jelentsk meg a ViewerForm . cs (s ne az OptionsForm . cs) ablak kdjt. 2. Keressk meg azt a rszt, ahol a deklarcik szerepeinek Itt hoztuk ltre a c_defPromptOnExit llandt. 3. Az llandk bevezetst kvet sor elejre rjuk be a hrom vltoz ltrehozsra vonatkoz utastsokat:
string m_strUserName = "; bool m_blnPromptOnExit = c_de f Pr omptOnExit ; Color m_objPi c tureBackColor;
A Solution Explorerben kattintsunk dupln a ViewerForm . cs-re, hogy megjelentsk az ablakot az ablaktervezben, majd kattintsunk az ablakban valahov (csak ne kattintsunk dupln valamelyik vezrlre). 2. A betltsi esemny mr tartalmaz egy ktsoros kdot: azt a kt utastst, amelyekkel az X s Y cmkk rtkeit lltjuk be. Adjuk a mr meglev kdhoz a kvetkez utastsokat:
m_blnPromptOnExit = c_de f PromptOnExit; m_objPictureBackCol or = System.Dr awing . SystemColors . Control ; Az els utasts belltja a modul vltozjt, amely a felhasznlnak a Prompt on Exit lehetsgre vonatkoz belltst trolja. Az utastsnak azt az rtket adjuk
t, amelyet a korbban ltrehozott llandnak adtunk. A pldn keresztl lthatjuk, hogy az llandk s a vltozk hogyan mkdnek egytt. Ha meg szeretnnk vltoztatni a Prompt on Exit lehetsgre vonatkoz belltsunkat, pusztn annyit kell tennnk, hogy mdostjuk az lland rtkt ott, ahol bevezettk A msodik utastssal az alaprtelmezett httrsznnek azt az rtket adjuk, amely a rendszer vezrlinek az alaprtelmezett szne. Korbban mr vilgoss vlt, hogy ez hogyan mkdik, gy erre most nem trnk ki. Figyeljk meg, hogy az m_strUserName vltoznak nem adtunk kezdrtket, mert a bevezetsekor mr belertunk egy karakterlncot. Lthatjuk, hogy egy feladatot szmos mdon meg lehet oldani.
11. ra llandk.
3. Eddig a belltsok szmra ltrehoztuk a vltozkat, amelyeket a kdban kezd6rtkkellttunk el, de a vltozk rtkeit mg nem hasznltuk a programban. A Prompt on Exit belltst az ablak bezrsakor ellen6rzi a program, de a kpmez6 httrsznt az ablak megjelense el6tt kell bellitani. A kvetkez6 utastst rjuk az el6bbi ketl6 al: picShowPicture .BackColor
~
m _objPictureBackColor ;
Erre az rra annyi maradt, hogy a Prompt on Exit szolgltatst mkdsre brjuk. Ez nem sok munkval fog jrni, mert ltrehoztunk egy menpontot, amely nyomon kveti, hogy bejelltk-e a Prompt on Exit belltst Az els6 dolog, amit meg fogunk tenni, hogy ellen6rizZk, hogy a menpont sszhangban van-e a vltozval. Nem szeretnnk, ha pipa lenne a menpont mellett, ha a vltoz fal se-r-.a van lltva, mert ez ellentles lenne a felhasznl ltal vrt eredmnnyel. Kvessk a tovbbi utastsokat, hogy mllkdkpess tegyk a Prompt on Exit vltozjt. 4. rjuk a kvetkez6 utastst a Form_Load esemnyen bell az al az utasts al, amelyikben megadtuk a kpmez6 httrsznt. Ez az utasts biztostja, hogy amikor az ablak betlt6dik, a menpont kijellt llapota megegyezzen a vltoz llapotvaL Mivel az m_blnPromptOnExit ktrtka vltoz kezdrtkt fa l se-ra lltottuk, a menpont mellell nem jelenik meg pipa. mnuConfirmOnExit
= m_blnPromptOnEx it;
5. Mr ltrehoztunk egy eljrst a menpont szmra, gy ha a felhasznl rkattint, megvltozik az llapota. Grgessnk lefel a programkd ablakban, s keressk meg az mnuConfirmOnExit_Click eljrst, vagy vltsunk tervez6nzetre, s kattintsunk dupln a menpontra. Ne feledjk, hogy a Visual C#-ban egy krdst tbbflekppen is megkzelthetnk Miutn megtalltuk az eljrst, rjuk a kvetkez6 utastst a mr meglv6 kd al: m _blnPromptOnExit
= mnuConfirmOnExit .Checked ;
szrevettk, hogy ez az utasts ppen az ellenkez6je annak, mint amit a 4. lpsben bertunk? Most azt adtuk meg a Visual C#-nak, hogy a vltoz llapota akkor vltozzon a menpont kijellt llapotra, miutn a Click esemnyen bell kijellt llapotra frisstettnk 6. Most, hogy a vltoz sszhangba kerlt a menponttal, meg kell rnunk a Prompt on Exit tnyleges kdjt. A Solution Explorerben kattintsunk dupln a Viewe r Form. cs-re az ablaktervez6 megjelentshez, majd kattintsunk a Properties (Tulajdonsgok) ablak Events (Esemnyek) gombjra (az a gomb, amelyiken egy villm lthat). Ez utn keressk meg a Formelosing esemnyt, s gpeljk be pontosan a kvetkezket:
if (m_blnPromptOnExit)
{
i f (M essageBox. Show("Cl ose the Picture View er progr am?", "Confirm Exit , MessageBoxBut tons .YesNo , MessageBoxicon .Question) ~= D i alogResul t .No)
e.Cancel
=:.
true;
AMessageBox (l fggvnyrl mr volt sz (s mg tovbb rszletezzk a 17. rn); mosl csak annyit kell megrtennk, hogy ha a felhasznl bezrja a Picture Viewer programot, s az m_bl nPromptOnExi t vltoz rtke true, akkor aMessageBox . Show() fggvny megkrdezi, hogy a felhasznl valban ki akar-e lpni. Ha a nemet vlasztja, akkor az e. Cancel tulajdonsg rtke igazz vlik, ami megakadlyozza az ablak bezrst. A Formelosing esemny e objektumrl bvebben a sgbl tjkozdhatunk. Nyomjuk le az F5 billentyt, s prbljuk meg fun.alrti a programot. Amikor elszr indtjuk el az alkalmazst, a vltoz rtke false , s a menpont mellert nincs pipa. Ha a Close (Bezrs) gombra kattintunk az ablak jobb fels sarkban, a Picture Viewer bezrdik. Indtsuk el ismt a programot, de ezttal tegynk pipt a Confirm on Exit menpont mell, mieltl bezrnnk az ablakoL Ez alkalommal, amikor kilpnk, a mveletet meg kell erstennk (lsd a 11.5. brt).
11.5. bra
ha a Jelhasznlk felgyelhetik az esemnyeket
Elnys,
sszefoglals
Ezen az rn megtanultuk, hogy llandk ltrehozsval hogyan kszblhetjk ki a mgikus szmokat. Ha literlis rtkek helyett llandkat hasznlunk, olvashatbb tesszk a kdot, cskkentjk a programozsi hibk eslyt, s ksbb knnyebben meg tudjuk vltoztatni az rtkeket. Ezen kvl megtanultuk, hogyan hozzunk ltre vltozkat olyan adatelemek szmra, amelyeknek a kezdrtkt nem ismerjk a program rsa kzben, valamint olyanok szmra is, amelyeknek az rtke vltozik a futs sorn. Megtanultuk, hogy a vltozk hogyan foghatk ssze tmbk segtsgve!, s hogyan kell bevezetnnk ket vagy hivatkeznunk rjuk a programkdban. A Visual Ot szigoran tpusos nyelv. Ebben a leckben sokat olvastunk a klnbz adattpusokrl s azok alk.alrnazsrl. Tancsokat kaptunk az adattpus kivlasztshoz, s lttunk pldt a tpustalakt fggvnyekre is, s megismerkedtnk egy fontos programozsi fogalommal, a hatkrrel s hogy miknt hasznlhatjuk azt a programjainkban.
Krdezz-felelek
K: Van valamilyen fortlya annak, hogy az adattpusokkal befolysoljuk a teljest-
mnyt?
V: Az egyik fogs , hogy egsz szmok (tizedesjegy nlkli rtkek) esetn a pro-
cesszorunknak megfelel adattpust kell alkalmaznunk. Pldul a mai otthoni s irodai szmtgpek tbbsge 32 bites processzorral rendelkezik. A Visual C# Integer adattpusa 32 bitbl ll. Akr elhisszk, akr nem, a Visual C# egy int tpus szmot gyorsabban fel tud dolgozni, mint egy short tpust, annak ellenre, hogy a short vltoz kisebb. Ez a processzor, a memria s a rendszecsn felptsvel ll kapcsolatban. A magyarzat bonyolult, de az eredmny az, hogy ltalban inkbb az int, mint a short tpust kell hasznlnunk mg akkor is, ha olyan vltozkkal dolgozunk, amelyeknek nincs szksgk az int mretre. K: A tmbk kt dimenzira korltozdnak? V: Br csak kt dimenzirl volt sz ( intMeasurements [3, ll), a tmbk sok dimenzival is rendelkezhetnek, pldul: intMeasurements (3 , 3, 3, 41. Az elvi hatr 6o dimenzinl van, de valsznleg nem lesz szksgnk hromnl tbbre.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gy~korlatban is kamatoztathassuk.
lsm1t6 krdsek
1. Melyik adartpussal troljuk a pnzsszegeket? 2. Melyik adattpust hasznlhatjuk tetszleges adat trolsra, amelyik egyben az adattpusok ltalnos csoportja? 3. Mit hasznlhatunk a mgikus szmok kikszblsre, ami csak egy helyen hatrozza meg a konkrt rtket?
Vlaszok
1. A Dec imal adattpussaL 2. Az Object adattpust. 3. A mgikus szmokat llandkkallehet kikszblni. 4. A vltozk azok az elemek, amelyeknek az rtkt a hatkrkn bell olyan gyakran vltoztathatjuk meg, arnilyen gyakran szksges. 5. Az els index a O, az utols a 4. 6. Egy lland, vltoz vagy eljrs lthatsgt a hatkr jellemzi 7. Mindig a lehetlegszu'Kebb hatkrt rdemes hasznlni.
Gyakortatok
1. Ksztsnk egy szvegmezvel, egy gombbal s egy cmke vezrlvel rendelkez programot. Amikor a felhasznl a gombra kattint, a szvegmez tartalmt rjuk egy vltozba, majd a vltoz tartalmt adjuk t a cmke Text tulajdonsgnak. (Tipp: String tpus vltozt rdemes hasznlnunk.) 2. rjuk t az albbi kdot gy, hogy kt vltoz helyett egyetlen tmbvltozt hasznljon. (Tipp: ne tbbdimenzis tmbt alkalmazzunk.)
string strGameTitleOne ; string strGameTitleTwo; strGameTitleOne "Battlfield 2"; strGameTitleTwo = "The Orange Box";
12. RA
szmokkal, karakterlncokkal, dtumokkal s
idpontokkal
A lecke tartalmbl:
Mveletek
Matematikai m'veletek A m'veletek kirtkelsi sorrendje Egyenl6sgvizsglat Logikai roaveletek Karakterlncok kezelse Dtumok s id6pontok kezelse
A matematika nem csak a mindennapi letnk rsze, hanem a Windows-prograrnak fejlesztshez is elengedhetetlen. Valsznleg soha nem fogunk olyan alkalmazst rni, amelyben nem kell nhny szmmmal sszeadst, kivonst, szorzst vagy osztst vgez-
A megfelel mveleti jel kivlasztsa egyszer. A legtbbjket knny megjegyezni, s brmikor utnanzhetnk, ha valamelyikre nem emlksznk. A matematikai fggvnyekkel itt nem foglalkozunk rszletekbe menen (biztos vagyok benne, hogy ha idig eljutottunk, akkor tisztban vagyunk az alapvet matematikai mveletekkel), de mindr6l szt fogunk ejteni.
A System . Diagnostics. Debug . writeLine () tagfggvnnyel, amely szveget r a kimenetablakba, s amelyet az ra sorn a pldkban vgig hasznlni fogunk, a 15. rn foglalkozunk rszletesebben. Ebben a fejezetben nem hozunk ltre projektet, de ha szeretnnk, kiprblhatjuk a pldkat egy tesztprogramban. Mivel tbb hibakeressi utastst is hasznlunk majd, clszer az osztlyunk fejrszben bevezetni a Sys tem. Diagnostics nvteret, ami lehetv teszi, hogy a nvtr tagfggvnyeit anlkl hasznljuk, hogy rnindig ki kellene irnunk a nvtr teljes, minstett nevt. Ehhez az osztly elejre az albbi sort kell irnunk (tegyk a Visual C# ltal automatikusan ltrehozott tbbi us ing utasts kz):
using System . Diagnostics;
dtumokkal s
sszeads
Egyszer sszeadst a szabvnyos sszeadsjel, azaz a + karakter hasznlatval vgezhetnk. Az albbi sor a 4, az 5 s a 6 sszegt rja ki:
Debug.WriteLine(4 + 5+ 6);
A m\1veleteket nem csak bedrtozott rtkekkel hasznlhatjuk, hanem szmrtk vltozkkal s llandkkal is:
const int c_FirstValue = 4; const int c_SecondValue = 5; Debug.WriteLine(c_FirstValue + c_SecondValue);
Kivons s tagads
A kivons mG'veleti jelt az sszeads jelhez hasonlan bizonyra ismersnek talljuk, mivel megegyezik azzal a.- karakterrel, amely a zsebszmolgpeken jelli a mveletet, illetve amelyet egyenletek felrsakor hasznlunk. Az albbi kdsor a 2-es szmot (a 6 - 4 mG'velet eredmnyt) jelerti meg:
Debug.WriteLine(6 - 4);
Akrcsak az rott matematikban, a - karakter a negatv szmok jellsre is hasznlatos. A -6 rtk kiratshoz pldul az albbihoz hasonl utastst hasznlhatunk:
Debug.WriteLine(-6);
Szorzs
Ha mr dolgoztunk szmolgppel, akkor a szorzs m\1veleti jeit, a * karaktert is ismerjk. Ezt a karaktert a SHIFT+8 billentyG'k vagy a szmbillentyG'zet fels sorban tallhat billenty\1 lenyomsval vihetjk be. Br papron gyakran az "x" jelet hasznljuk (pldul 3 x 2 = 6) a szorzs jelzsre egy egyenletben, ha egy kdban prbljuk gy felrni a mveletet, hibazenetet kapunk- mindenkppen a * karaktert kell hasznlnunk. Az albbi utasts a 20-as szmot (5 szorozva 4-gye!) rja ki:
Debug . WriteLine(5 * 4);
Oszts
Az osztst a 1 mtveleti jel segtsgvel hajtjuk vgre. A jelet knnyen megjegyezhetjk csak gondoljunk gy az osztsra, mint a trtszmokra. Az egy nyolcad pldul 1/8 formban rhat fel, ami gyakorlatilag azt jelenti, hogy negy osztva nyolccal n. Az albbi utasts a 8-as szmot (32 osztva 4-gyel) rja ki:
Debug .WriteLine(32 l 4);
A Visual C# tlterheU az osztsi mtveletet, ami azt jelenti, hogy a bemen argumentumoktl fggcSen az eredmny vltozhat: pldul ha egsz szmokat osztunk egymssal, akkor egsz szmot kapunk, de ha float, double vagy decimal tpusrtket hasznlunk, akkor a mtvelet trt szmot ad vissza. A 3 215 teht 6-ot ad vissza, s a mtvelet eldobja a maradkot (ami ebben az esetben 2). Ha azt szeretnnk, hogy a 3 215 mllvelet pontos rtket adjon vissza, a szmokat tizedesjeggye! egytt kell megadnunk ( 32 . Ol 5. o).
Maradkkpzs
A maradkkpzs az a mvelet, amelynek a sorn kt szmot elosztunk egymssal, de az eredmnybl csak a maradkot tartjuk meg. A maradkkpzst a l jel helyett a Mod kulcsszval vagy a % jellel jelljk. lssunk nhny pldt a maradkkpzsre s a kapott rtkekre:
Debug .WriteLine(lO% 5) ; Debug .WriteLine(lO% 3); Debug .WriteLine(12% 4 . 3) ; Debug . WriteLine(13.6% 5) ;
ll ll ll ll
O l 3.4 3.6
rtelmezhet: az 5 a 10-ben ktszer van meg maradk nlkl, a 3 a 10-bep pedig hromszor, 1 maradkkal. A Visual C#-ben a harmadik utasts eredmnye 3.4 lesz, mert a 4.3 ktszer van meg a 12-ben, s 3.4. marad; az utols utasts Mod mvelete pedig 3.6 eredmnyt ad, mert az 5 ktszer van meg a 13.6-ban, a maradk pedig 3.6.
Ebben a kifejezsben kt matematikai maveletet tallunk. Ahhoz teht, hogy kirtkelje a kifejezst, a Visual C#-nek ktfle maveletet kell elvgeznie: sszeadst s szorzst. Melyik mvelet vgrehajtsra kerl sor elszr? Szmit egyltaln a sorrend? Nagyon is szmt! Ha a Visual C# az sszeadst a szorzs eltt vgezn el, az albbi eredmnyt kapnnk:
Els lps: 6+ 4"' 10 Msodik lps: 10 5 50
Ebben az esetben a Visual C# 26-ot r ki, azaz teljesen ms eredmnyt kapunk, mintha az sszeadst vgeznnk el elszr. Az ilyen problmkat megelzend a Visual C# mindig ugyanabban a meghatrozott sorrendben - az elsbbsgi sorrend szerint - hajtja vgre a matematikai maveleteket. A matematikai s logikai (Boole-fle) maveletek kirtkdsi sorrendjt a 12.1. tblzatban lthatjuk. (A logikai maveletekrl az ra ksbbi rszben ejtnk szt.) Ha jratosak vagyunk az algebrban, akkor szrevehetjk, hogy Visual C#-ban a mveleti jelek sorrendje megegyezik az algebrban megszokottal.
Mveletcsoport
Mveleti
jel
Tbbszrzs Osszegzs
Egyenlsg
* l %
+ == (egyenl), ! = (nem egyenl)
Logikai AND CnES") Logikai XOR (,:XVAGY'') Logikai OR CVAGY'') Feltteles AND Feltteles OR Felttel
&
&&
ll
? :
Figyeljk meg, hogy az egyenlsg kifejezsre kt egyenlsgjelet hasznlunk, nem pedig egyet, ahogy vrnnk.
rlhat. A zrjelek kz helyezett mveletek mindig els6bbsget lveznek. Vegyk az albbi pldt:
Debug.WriteLine(6 * 5+ 4);
A mt1vcletek vgrehajtsi sorrendjt figyelembe vve a Visual C# a kvetkez6kppen
sszetett kifejezsek rsakor biztosnak kelllennnk benne, hogy a mveletek a megfelel sorrendben hajtdnak vgre, s szksg esetn zrjelezssei fell kell brlnunk az alaprtelmezett kirtkelsi sorrendet. n mindig igyekszem zrjeleket hasznlni, mert gy pontosan tudni fogom, hogy mi trtnik, s a kd is knnyebben olvashatv vlik.
sszehasonlfts
rtkeket - fknt vltozkt - mg a matematikai m"veletek vgrehajtsnl is gyakrabban hasonltunk ssze. Ahhoz azonban, hogy megrtsk, hogy miknt trtnik az sszehasonltsok kirtkelse, ismernnk kell a Visual C# matematikjnak mkdst. Ahogy a kvetkez rn majd elmagyarzzuk, sszehasonlt mveleteket a leggyakrabban dntshozatali szerkezetekben (elgazsokban) hasznlunk. Ezeknek a mt1veleteknek a mkdst egyszeru if elgazsokon keresztl rthetjk meg a legjobban. Az if szerkezetekben a Visual C# elszr az if utastsban szerepi kifejezst rtkeli ki, s ha a kifejezs igaz (true), akkor vgrehajtja a megadott utastsokat. Az albbi mondat pldul tulajdonkppen egy if mvelet (mg ha elg bugyuta is), csak ppen Visual C# kd helyett angol nyelven kifejezve:
IF DOGS SARK, THEN SMILE . (Ha a ku tyk ugatnak, mosolyogj!)
3);
4);
>= 3) ; < = 4) ;
ll ll ll ll
sszehasonltst vgrehajtan viszonylag egyszer<. Ha egy adott felttel felrsa sorn elakadnnk, prbljuk meg htkznapi nyelven megfogalmazni, mieltt kdot rnnk
belle.
Logikai mlveletek
A Boole-fle vagy ktltka logika a matematikai mveletek, illetve az sszehasonltsok klnleges fajtja: az eszerint szerint kirtkelt kifejezsek true (igaz) vagy fal se (hamis) rtket adnak. Nem kell aggdnunk, ha mindez jdonsg a szmunkra - a logikai mveleteket nem nehz megrteni. A ktltkalogikai mveleteket logikai mveleti jelekkel jelljk. Vegyk pldul a kvetkez mondatot:
trees then print "ce erearn ". (Ha a fekete egy szn, s a faanyagot fkbl nyerik, akkor rd ki, hogy "jgkrm".)
A fenti mondat els pillantsra teljesen rtelmetlennek tnik, a Visual C# azonban a ktrtkG logika segtsgvel kpes rtelmezni. Elszr is figyeljk meg, hogy ebben az egyetlen maodatban hrom kifejezs kirtkelsre kerl sor. Ha zrjelezzk a mondatot, a kt legnyilvnvalbb kifejezs vilgoss vlik:
A ktrtkG logika szerint minden kifejezs kirtkelse true vagy false rtket ad, ezrt ha behelyettestjk a kapott rtkeket a kifejezsek helyre, a kvetkezt kapjuk:
And(&&)
jel Lers A kirtkelse true-t eredmnyez, ha a kt oldaln szerepl kifejezsek egyarnt true rtkiek. Not C!) A kirtkelse true-t eredmnyez, ha a kifejezs rtke false, ellenkez esetben pedig false-t (vagyis a kifejezs true/false rtknek ellentettt vagy tagadst kapjuk). or C1) A kirtkelse true-t eredmnyez, ha a kt oldaln szerepl kifejezsek brmelyike true rtk. xor (") A kirtkelse csak akkor eredmnyez true-t, ha kizrlag az egyik oldaln ll kifejezs true.
Mveleti
--
6));
ll ll ll ll ll
dtumokkal s
utasts esetben emlkezZnk vissza, hogy a Visual C#-ban a mO'veletek kirtkelsi sorrendje szerint a matematikai mveletek rtkeldnek ki elszr (akkor is, ha nem hasznlunk zrjelezst), teht a kirtkels els lpse gy fest:
Debug.WriteLine( ! (true));
A true ellentte a false, ezrt a Visual C# a false rtket rja ki. A negyedik utasts kirtkelse gy trtnik:
Debug.WriteLine( ! (false));
Ez azrt trtnik gy, mert a 4 nem kisebb, mint a 2, s a Visual C# elszr ezt a kifejezst rtkeli ki, s mivel a false ellentettje a true, a vgeredmny true lesz.
Az Or ( l) mfivelet hasznlata
Az Or Cl) a logikai "vagy'' (logikai diszjunkd) mveleti jele. Ha az Or ( 1) mO'veleti jel bal vagy jobb oldaln szerepl kifejezsek valamelyike true, akkor az Or Cl) mvelet kirtkelse is true rtket ad. Az or ( 1) mO'velet hasznlatt s a kapott eredmnyeket
ll ll ll ll ll
Az Xor (
mfivelet hasznlata
Az xo r (") hasznos kis mvelet. n nem hasznlom tl gyakran, de nagyon hasznos tud lenni, ha mgis szksg van r. Ha az x or (" l mveleti jel valamelyik oldaln az egyik- s csak az egyik- kifejezs kirtkelse true rtket ad, akkor az Xor (A l m'velet is true-t ad vissza. Vegyk szemgyre kzelebbrl az albbi utastsokat,
6));
ll ll ll ll ll
Karakterlncok kezelse
A ll. rn megtanultuk, hogy a karakterlncok valjban szvegek. A Visual CH a karakterlncok kezelshez szmos fggvnyt biztost. Br a karakterlncokkal vgzeu mveletek nem matematikai mveletek, hasonl dolgokat hajthatunk vgre velk, .rnint a szmokkal - pldul sszeadhatunk kt karakterlncot A Visual C# szmos fggvnyt tartalmaz a karakterlncok kezelsre, amelyekkel olyan feladatokat hajthatunk vgre, mint egy karakterlnc egy rsznek kiolvassa, vagy egy karakterlnc megkeresse egy msik karakterlncban. A kvetkezkben a karakterlncok kezelsnek alapjait tanuljuk meg.
Karakterlncok sszefizse
A Visual C# lehet6v teszi kt karakterlnc .sszeadst", amivel egyetlen karakterlncban egyesthetjk azokat. A szigoru elveket vallk ugyan azt mondhatjk, hogy ez nem igazn matematikai mvelet, de az sszefzs mgis nagyon hasonlt arra, mintha matematikai mveletet hajtannk vgre karakterlncokon, ezrt ez a tmakr logikusan ehhez az rhoz tartozik. Azt a mveletet, amikor sszeadunk kt karakterlncot, sszefzsnek (idegen szval konkatencinak) nevezzk, s nagyon gyakori feladat. Elfordulhat pldul, hogy vltozk rtkeit meghatrozott karakterlncokkal kell sszefznnk, hogy a kvetkezhz hasonl rtelmes zeneteket kldhessnk a felhasznlnak: Biztos benne, hogy trlni akarja az albbi felhasznlt: XXX? (ahol az XXX egy vltoz tartalma). Kt karakterlnc sszefazshez a + mveleti jelet hasznlhatjuk, ahogy az albbi kdsor mutatja:
Debug .WriteLine("This is " + a t est. ");
szeren
Figyeljk meg, hogy az is s az a sz kztt nincs szkz, de a hinyz szkzt egyptolhatjuk, ha megadunk egyet az is utn az els, vagy az a eltt a msodik karakterlncban, vagy kln karakterlncknt, az albbiak szerint fazzk hozz a szveghez:
Debug .WriteLine( "This is "+ "+"a test.");
A kzvetlenl idzjelek kztt megadott szvegeket literl1Uik nevezzk. A vltozkat ugyangy fzzk ssze, mint a literlokat, s a kett egymssal is sszefzhet6. Az albbi kd kt vltozt hoz ltre, majd az elsnek a "Mike" rtket adja, a msodiknak pedig az els vltoz rtkt egy szkzzel s a "Saklar" literllal sszefzve: string strFullName; string strFirstName = "Mike "; strFullName = strFirs tName +
"Saklar ";
Vgeredmnyknt az strFullName vltozaMike Saklar karakterlncot fogja tartalmazni. Gyakoroljuk a karakterlncok sszefzst, mert gyakran lesz szksgnk r!
MyString.IndexOf(keresett_karakterlnc); Az I ndexof () tagfggvny a karakterlncban, amelyre meghvtuk, megkeresi az argumentumknt tadon karakterlncot, s ha megtallja, annak kezdpozcijval tr vissza (ha a kezdet az els karakter, akkor o-val, ha a msodik, akkor 1-gyel, s gy tovbb). Ha a keresett karakterlnc nem tallhat meg a msik karakterlncban, a tagfggvny - 1-gyet ad vissza. Az IndexOf () tagfggvnyt az albbi argumentumokkal hasznlhatjuk (de lteznek tovbbi lehetsgek is, amelyeket megtallunk a sgban): public int IndexOf (keresett_ karakterlnc); public int IndexOf (keresett_ka:rakterlnc , kezdet); public int IndexOf (keres ett_ka:rakte:rlnc , kezdet,
keresett_karakte:rek_szma) ;
Azt a szveget, amelyet a kifejezsben (a Karakterlnc_objektum-ban) meg szecetnnk tallni, a keresett_szveg argumentumban adhatjuk meg, a csereszveg argumentumban pedig azt a karakterlncot hatrozhatjuk meg, amelyre a keresett_szvcg-et le szecetnnk cserlni. Vegyk az albbi kdot:
string strText = "Give a mana fish"; strText = strText. Replace ("fish", sandwich"); Miutn ez a kd lefutott, az strText vltoz a "Give a mana sandwich" karakterlncot fogja tartalmazoL A Replace () nagyon hatkony tagfggvny, amellyel sok sornyi kdot takarthatunk meg, ezrt amikor csak lehet, ezt hasznljuk a "hzi ksztsO'" cserefggvnyek helyett.
A DateTime adattipus
Gyakran dolgozunk dtumokkaL Az alkalmazs jellegt61 fggetlenl valsznleg szksgnk lesz olyan vltozkra, amelyek a DateTime adattpus segtsgvel dtumokat trolnak Dtumot tbbflekppen is rhatunk egy DateTime tpus vltozba. Emlkezznk vissza, hogy amikor egy karakterlnc tpus vltoznak !iterlt adtunk rtk!, a !iterlt idzjelek kz kellett zrnunk - amikor azonban egy szm tpus vltoznak adunk rtkl egy szmliterlt, a szmot nem zrjuk idzjelek kz: string strMyString = "This is a string literal"; int intMylnteger = 69; A DateTime tpus vltozkat ltalban gy lltjuk egy konkrt Oiterlis) dtumra, hogy a vltozt a dtum elemeit (v, hnap, nap) paramterknt tadva pldnyostjuk: DateTime dteMyBirthday =new DateTime( 2008 ,7, 22) ;
A DateTime tpus vltozknak nem adhatunk t kzvetlenl karakterlncokat. Ha a felhasznl a dtumot egy szvegmezbe rhatja be, s az rtket egy DateTime vltozba szeretnnk helyezni, fel kell bontanunk a karakterlncot, hogy megfeleljen valamelyik engedlyezen DateTime konstruktornak. A DateTime az sszetettebb adattpusok kz tartozik. Ebben a fejezetben elegend6 informcit kapunk ahhoz, hogy elinduljunk, de az itt trgyaltak csak a jghegy cscst jelentik. Javasolt ttekinteni a Microsoft Developers Network (MSDN) dokumentcijt, hogy tbbet tudjunk meg errl a klnleges adalupusrL Fontos megjegyeznnk, hogy a DateTime tpus vltozk mindig egy dtumot s egy idpontot trolnak Figyeljk meg pldul az albbi kdot:
DateTime dteMyBirthday =new DateTime(1969,7,22);
Lthatjuk, hogy a plda a 12 : 00 : oo AM idpontot is kirja, annak ellenre, hogy idpontot nem adtunk meg a vltoz szmra. Ez ugyanis a Dat eTime tpus vltozk alaprtelmezett idponlja, amelyet a Visual C# akkor helyez el a vltozban, ha csak a dtumot adjuk meg. Br a DateTime vltozk mindig tartalmazzk a dtumot s az idpontot is, gyakran csak az egyikkel foglalkozunk.
12.3. tblat
Tagfggvny
AddDays AddHours Addl-li l l i seconds
Lers A megadort szm napot adja hozz az objektumpldny rtkhez. A megadott szm rt adja hozz az objektumpldny rtkhez. A megadott szm ezredmsodpercet adja hozz az objektumpldny rtkhez.
~t1F
HF
:~;<; ~AP.""'!.;~~,+t?""?-<:~"';:~,~~:':1-ti~~~
..
~,
.~
x., . ;;v:';""
'' ,
~.,~-:;
;,J .. ,'.,
...::~"~~~
'-~~~
ii,i;~-t;3_S:~a:~ :i'Q:{J':~-l-4i:J:l.,~,.,hi~~ t~
!):
iJ ~";
Tagfggvny
AddMinutes AddMonths AddSeconds AddYears
Lers
A megadott szm percet adja hozz az objektumpldny rtkhez. A megadott szm hnapot adja hozz az objektumpldny rt khez. A megadon szm msodpercet adja hozz az objektumpldny rtkhez. A megadott szm vet adja hozz az objektumpldny rt khez.
kvetkez
DateTi me d t eMyBirthday = new OateTime( 1969,7,22} ; DateTime dteNewDate = dteMyBirthday. AddMonths(6); Miutn a msodik utastts vgrehajtdott, a dteNewDate az 112211970 12 : 00 : 00 AM rtket fogja tartalmazni. Az albbi kdok a adnak pldkat: dteNewDate teNewDate dteNewDate dteNewDate
dtumsszegz
12 : 00 : 00 AM l l Eredmny : 121 221 1969 12 : 00 : 00 AM dteMyBirthday .AddMonths(-1) ; ll Eredmny : 612211969 12 :00 : 00 AM dteMyBirthday . AddHour s (7);
l l Eredmny : 712211969 7 : 00 : 00 AM
Az Hour tulajdonsg az rt katonai formtumban adja meg. Arra is gyeljnk, hogy a D ayofweek () tagfggvny egy felsorolt rtket ad vissza.
ll ll ll ll
= DateTime .Today;
Ha az aktulis rendszerdtumot s a rendszeridt is ki szeretnnk olvasni, a DateTime osztly Now tulajdonsgt hasznlhatjuk: DateTi me dteToday
= DateTime.Now;
rjuk a DateTime. Today s a DateTime . Now rtkt a memriba. Ha egy alkalmazsban a rendszerdtumra vagy a rendszeridre van szksgnk, messze gy frhetnk hozz a legknnyebben ezekhez az adatokhoz.
sszefoglals
A sikeres Visual C#-fejlesztv vlshoz ltfontossg, hogy mlndenfle adattal kpesek legynk bnni. Ugyangy, ahogy egy kzssgben sem boldogulhatunk alapvet matematikai ismeretek nlkl, a programjainkban is kpesnek kelllennnk alapvet matematikai mveletek elvgzsre, mg a legegyszenThb alkalmazsok elksztshez is. A matematikai mveletek ismerete s a mveletek kirtkelsi vagy vgrehajtsi sorrendjnek megrtse komoly segtsget nyjt ahhoz, hogy a VISual C# kdjainkban matematikai roaveleteket vgezhessnk
A Boole-fle vagy ktrtkG logika a kirtkels klnleges fajtja a Visual C#-ban, amellyel egyszerG s sszetett kifejezseket rtkelhetnk ki true (igaz) vagy false (hamis) rtkre. A kvetkez rkon megtanuljuk, hogyan hozhatunk ltre ciklusokat s dntsi gakat a kdjainkban- az ezen az rn a logikai mveletekrl tanultak elengedhetetlenek almoz, hogy ezeket a szerkezeteket sikeresen hasznljuk. Az alkalmazsainkban logikai m'veleteket taln mg a szmtani mveleteknl is gyakrabban fogunk hasznlni. A karakterlncok s a dtumok kezelsre kln figyelmet kell fordtanunk. Ezen az rn megtanultuk, hogyan hasznlhatjuk ezt a kt adattpust, hogyan olvashatjuk ki bizonyos rszeiket, illetve hogyan fzhetnk ssze rszeket egy j egszet alkotva. A karakterlncok kezelse egyszeru: hamar belejvnk, arnint hasznlni kezdnk nhnyat a karakterlnc-kezel fggvnyek kzl. A dtumok kezelse ugyanakkor mr bonyolultabb; mg a tapasztalt fejlesztknek is bele kell nznik idnknt a sgba. Ezen az rn megtanultuk az alapokat, de ne fljnk nllan ksrletezni.
Krdezz-felelek
K: Mindig hasznljunk zrjeleket, hogy biztostsuk, hogy a mveletek olyan sorrendben rtkeldjenek ki, ahogy szeretnnk? V: A Visual C# mindig a m'veletek elsbbsgi sorrendje szerint rtkeli ki a kifeje-
zseket, gy nem szksges zrjeleket hasznlnunk, ha egy adott kifejezsben helyes a roaveletek vgrehajtsi sorrendje. A zrjelek hasznlata ugyanakkor neknk biztostja, hogy a kifejezs gy rtkeldik ki, ahogy szeretnnk, s msoknak is megknnytheti a kifejezs rtelmezst. A dnts rajtunk ll. K: Szeretnk tbbet tudni a DateTime szerkezetben elrhet tagfggvnyekrl s tulajdonsgokrl. Van valamilyen forrs, amely Jelsorolja az sszes 6sszetevt? F: Nzzk meg a DateTime tagjainak lerst a .NET-keretrendszer dokumentcijban, amelyet megtallhatunk az MSDN webhelyn, s amelynek a teleptst a Visual C# teleptje is felknlja lehetsgknt.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
l. Melyik mveleti jelet hasznljuk, ha egy osztsnak csak a maradkt szeretnnk megkapni? 2. Melyik mvelet - az sszeads vagy a szorzs - vgrehajtsra kerl sor elszr az albbi kifejezsben?
3. Melyik ktrtk mvelet vgez logikai tagadst? 4. Hogy hvjk azt a mveletet, amelynek a sorn egy karakterlncot egy msikhoz adunk? 5. Melyik tulajdonsg adja vissza egy adott dtum hnap rszt?
Vlaszok
1. AMod(%) mveleti jelet. 2. Elszr az 5* 4 vgrehajtsra kerl sor.
3. A Not(!).
Gyakor1atok
l. Hozzunk ltre egy projektet, amelyben egy ablakra egyetlen szvegmez6t helyeZnk. Tegyk fel, hogy a felhasznl berja a keresztnevt, a kzps6 nevnek a kezdbetjt s az utnevt a mez6be. Bontsuk szt a mez tartalmt hrom vltozba, amelyek a nv egyes rszeit troljk. 2. Hozzunk ltre egy projektet, amelyben egy ablakra egyetlen szvegmez6t helyeZnk. Tegyk fel, hogy a felhasznl egy rvnyes sZletsi dtumot r a mez6be. A cltumfggvnyek segtsgvel rjuk ki a felhasznl szmra, hogy a sZletsnapja a ht melyik napjra esett.
13. RA
Dntshozatal Visual C# kd segtsgvel
A lecke tartalmbl:
Dntshozatal if utastsokkal Az i f utastsok lehetsgeinek bvtse az else segtsgvel Kifejezs tbb lehetsges rtknek vizsglata a switch utastssal A 10. rn megtanultuk, eniknt bonthatjuk a kdunkat klnll eljrsokra, amelyeket szksg szerint brmikor meghvhatunk Ez jelents lps a kd rendezett ttelben, de olykor gy is szksg van arra, hogy dntsnk, melyik eljrst szecetnnk vgrehajtani, illetve az eljrson bell melyik kdrszletre van szksgnk. Ebben segtenek a Visual C# dntshozatali elemei, amelyekkel valamilyen felttel - pldul egy vltoz - rtktl fggen dnthetnk arrl, hogy vgrehajtjuk vagy kihagyjuk az adott kdrszletet Erre a clra kt nyelvi eszkz is a rendelkezsnkre ll: az if ... else, valamint a switch utasts.
... utasts, amelyet a rendszer akkor hajt vgre, ha a kifejezs rtke true ;
Az if Boole-fle logikval (lsd a 12. rt) dnti el, hogy a megadott kifejezs rtke true vagy false. Legyen sz akr egyszer (if (x == 6)}, akr sszetett (if (x==6 && y> 1 o)) kifejezsrl , ha a kirtkels utn az rtke t ru e, a rendszer vgrehajtja a megadott utastst, illetve utastshalmazt (ennek elemeit kapcsos zrjelek kztt kell elhelyeznnk). Ugyanakkor ha a kifejezs rtke false, a rendszer kihagyja a megadott utastst vagy utastsokat.
Ne feledjk, hogy sszetett utastsokat - ms nven blokkutastsokat (kdblokkokat) vagy tmbutasftsokat - mindentt hasznlhatunk, ahol egyszer utastsok is hasznlhatk. Az sszetett utastsok ismrve, hogy kapcsos zrjelek veszik krl ket. Az i t utastsnl a kvetkezkppen lhetnk ezzel a lehetsggel: if(kifejezs)
{
ha a kifejezs rtke true; utasts, amelyet a rendszer akkor hajt vgre, ha a kifejezs rtke true; ... n. utasts, amelyet a rendszer akkor hajt vgre, ha a kifejezs rtke true;
A kvetkezkben egy egyszeru pldn keresztl mutatjuk be az if hasznlatt Hozzunk ltre egy j Windows Application projektet Decisiens Example nven, s tegyk a kvetkezket: 1. Kattintsunk az egr jobb gombjval a Forml.cs fjlnvre a Solution Explorerben, vlasszuk a helyi men Rename (tnevezs) pontjt, s adjuk a fablaknak a DecisionsForm. cs nevet, majd a Text tulajdonsgnak a Decisiens Example rtket. 2. Helyezznk el az ablakon egy j szvegmezt, dupln kattintva az eszkzkszlet TextBox ikonjra, s a tulajdonsgait lltsuk be az albbiak szerint:
3. Helyezznk el az ablakon egy j gombot, dupln kattintva az eszkzkszlet Button ikonjra, s a tulajdonsgait lltsuk be az albbiak szerint:
rtk btnlsLessThanHundrcd
156, 42
13.1. bra
Az if utastssal azt d6ntjk el, hogy
a szvegmezbe rt rtk kisebb-e 100-nl
Most pedig trjnk a lnyegre- rjuk meg a gomb Cl i ck esemnynek a kdjt. Az if utasts me llett az int . Parse () tagfggvnyre is szksgnk lesz, amellyel egy szveget alakithatunk szmrtkk-ezzel hozunk ltre egy egsz szmot a txtinput mezbe rt szvegbl. Az i f utasts feladata ezek utn az lesz, hogy megllaptsa, hogy a kapott szm kisebb-e 100-nl. Kattintsunk dupln a gombra a Click esemnynek az elrshez, s rjuk be a kvetkez kdot: (int .Parse(txtinput.Text}< 100 } MessageBox.Show("The textentered is 1ess than 100."); A fentiek megrtse nem nehz, ha egyenknt sorra vesszk az utastsokat. Kezdjk az elsvel, s idzzk fel az if korbban bemutatott alakjt:
i f (kifejezs) utasts;
Ha kizrlag akkor szeretnnk valamilyen kdot vgrehajtani, ha a kifejezs rtke false, hasznljuk az egyenl helyett a nem egyenl (! =l mveletet. Minderrl a logikai mveletek trgyalsa kapcsn a 12. rn beszltnk bvebben. Az else zradkkal elrhetjk, hogy a program meghatrozott utastsokat hajtson vgre akkor is, ha a kifejezs rtke true, s akkor is, ha false. Eddigi pldnkban a felhasznl egy zenetben rteslt arrl, ha a megadott rtk kisebb volt 100-nl, de ha nem ez volt a helyzet, semmifle visszajelzst nem kapott. Mdostsuk most a kdot az albbiak szerint, gy az zenet semmikppen nem marad el: if (int.Parse(txtlnput . Text)< 100 l MessageBox.Show("The textentered is less than 100.") ; else MessageBox.Show("The textentered is greaterthan or equal to 100 . "1;
1. Mentsk a munknkat az eszkzkszlet Save Ali (Mindent ment) gombjra kattintva. 2. Futtassuk a projektet az FS billentyveL 3. rjunk egy egsz szmot a szvegmezbe, s nyomjuk meg a gombot.
Egy zenetablakot kapunk, amely tjkoztat arrl, hogy a bert szm kisebb vagy
13.2. bra
Amint ez az zenetablak is mutatja, az if utasts komoly segtsget nyjt
a d61Ushozatalban
Prblgassuk a program mtlkdst tetszleges egsz szmokkal. Ha vgeztnk, lltsuk le a projekt futst a Debug, Stop Debugging (Hibakeress, Hibakeress lelltsa) menponttal.
Bartkozzunk meg az if utastssal, hiszen j esllyel minden projektnkben felbukkan majd valahol.
else else
i f (str Pro fession == "progr arnrner" ) e l s e if (strProfession == " teacher") e lse i f (str Profession == "accountant") e l se
Nos, ez a szerkezet bizony igen nehezen tlthat, radsul ahogy a szba jv foglalkozsok szma n, gy vlik egyre kezelhetetlenebb a kd. Mindemellett a rengeteg i f utasts vgrehajtsa a rendszer erforrsait is tlzott mrtkben ignybeveszi. A lnyeg az, hogy az egymst kvet e l se ... if tmbk mind-mind ugyanazt a kifejezst (strPro f ession) rtkelik ki, csak ppen ms-ms rtkekkel vetik ssze. A Visual C# tartogat szmunkra egy eszkzt, amely sokkal alkalmasabb erre a clra: ez a s witch utasts. A s witch legegyszeriibb alakjban gy fest:
swi t ch ( kifejezs)
{
case rt kl :
ugrutasfts defaul t : ugrutasits
case "teacher": MessageBox .Show("You educate our young); break ; case "programmer: MessageBox .Show ("You are most likely a geek"); break; case "accountant" : MessageBox. Show ("You are a bean counter"): break; default. : MessageBox.Show("Profession not found in switch statement") ; break;
A switch utastsok vgrehajtsa a kvetkezkppen zajlik: ha valamelyik case utasts rtke megfelel a kifejezs tartalmnak, a program vgrehajtja a hozz tartoz kdtmbt Ez utn egy ugrutastsnak (nnt a break) kell llnia, amely kivezet a switch
trzsbl.
Ha egy case tmb vgn nem helyeznk el ugrutastst, a program tovbblp a kvetkez case tmbre, mg akkor is, ha a kifejezs nem egyezik az ott megadott rtkkel.
A switch segtsgvel knnyebben kvethetjk a dntsi folyamatot. Fontos elismtelnnk: ezzel az utastssal egy kifejezst tbb lehetsges rtkkel vetnk ssze.
men Rename pontjt, s adjuk az ablaknak a SwitchExamplePo:r:m. cs nevet. lltsuk az ablak Text tulajdonsgt a Switch Example rtkre (a tervezsi tulajdonsgok megjelentshez kattintsunk az ablakra).
290
rtk cboAnimals
80, 100
Location
3. Most helyezznk el pr elemet a listban. Kattintsunk a kombinlt lista Iterns tulajdonsgra, majd a mellerte megjelen, hrom pontot brzol gornbra, gy a String Collection Editor (Karakterlnc-gyjtemny szerkeszt) abiakba jutunk. rjuk be a 13.3. brn lthat listaelemeket, mindegyikk utn ENTER-t nyomva, hogy kln sorba kerljenek.
_",..,.iflthoco41tdioo(-pcrJnelo
........
lod
llo9
Col
c.....,..
13.3. bra
Az itt megadott sorokbl ~
4. Helyezznk el az ablakon egy gombot is. Ha a felhasznl erre kattint, a program a switch utastssal meghatrozza, hogy melyik llatot vlasztotta korbban, s kirja a lbai szmt. Szrjuk be a gombot, dupln kattintva az eszkzkszlet Button elemre, majd lltsuk be a tulajdonsgait az albbiak szerint:
y :::......._- ---~---
'
~~~h-......:
-~>.l~~~~ !_g~
)o'
1i
13.4. bra
Ebben a pldban mindssze egy
Show Legs
Az ablakot a jelenlegi llapotban a 13.4. brn lthatjuk. Mieltt tovbblpnnk, mentsk a munknkat az eszkzkszlet Save Ali gombjra kattintva.
Nincs ms htra, mint maga a kd. Kattintsunk dupln a Bu tton gombra a Click esemny elrshez, s rjuk be az albbi kdot: switch (cboAnimals.Text)
(
case "Brd: M essageBox . Show ("The animal has 2 legs. l ; break ; case "Dog" : l l Vegyk szre, hogy itt semmilyen kdot nem hajtunk vgre case "Horse : l l Vegyk szre, hogy itt semmilyen kdot nem hajtunk vgre case "Cat" : M essageBox .Show( "The animal has 4 l egs ." ) ; break; case "Snake": MessaqeBox.Show("The animal has no legs."); break; case "Centipede": MessageBox.Show("The animal has 100 legs.); break; default: MessageBox. Show("You did not select from the list!"); break; Lssuk, mi is trtnik itt! A switch utasts sszehasonltja a ebeAnimals kombinlt lista tartalmt nhny elre meghatrozott rtkkel. A program a case tmbket a megjelensk sorrendjben rtkeli ki, ezrt a kifejezst elszr a "B i r d" (Madr) karakterlnccal veti ssze. Ha egyezst tall, meghvja a rgtn alatta ll MessageBox. Show (l tagfggvnyt, majd tovbblp a break utastsra, s elhagyja a switch terlett Ha a kifejezs rtke nem B i r d , a program a Dog (Kutya) karakterlnccal prblkozik, s gy tovbb. Figyeljk meg, hogy a Dog blokkja egyltaln nem tartalmaz kdot. llyen esetekben a program nyomban tovbblp a kvetkez case tmbre. Esetnkben ez a Horse (L) rtkhez tartozik, s szintn res. A Visual C# mindaddig halad tovbb, amg vgl kdra nem akad. Ezttal a vgllomst a Ca t (Macska) rtk kdblokkja jelenti. Ezt a viselkedst lvjk a vgrehajts tovbbadsnak, s az alkalmazsval egyetlen kdtmbbel tbb esetet is kezel-
sszefoglals
Ezen az rn megtanultuk, hogy miknt hozhatunk dntseket a kdban a Visual C# erre a clra szolgl utastsaivaL Megismerkedtnk az if utastssal, amellyel egy kifejezs true rtke esetn futtathatjuk a kvnt kdot, valamint h trsval, az else utastssal, amely a false rtk esett kezeli. Megtanultuk azt is, hogy a bonyolultabb dntsekhez az i f ... else tmbket egymsba is gyazhatjuk.
Az i f mellett sz esett a switch utastsrl is, amellyel egy kifejezst tbb rtkkel
vethetnk ssze. Vgezetl megtudtuk azt is, hogy thaladhatunk a case utastsokon a vgrehajts tovbbadsval, gy egyszerre tbb lehetsges rtket is kezdhetnk. A dntsi szerkezetek gyakran alkotjk egy alkalmazs gerinct Ha nem lenne lehet6sgnk a helyzetnek megfelelen dnteni adott kdrszletek funatsrl, a programjaink meglehetsen egyhangakk vlnnak, ezrt rdemes mlyebben megismerkednnk ezekkel az utastsokkal, s minclig arra trekednnk, hogy a megfelel mdszert vlasszuk a dntshozatalhoz. A j dntshozatali kd nagy lps a stabil s tlthat programszerkezet fel vezet ton.
Krdezz-felelek
if utasts kifejezsnek rtke false? Helyezzk a kdot az else utn, s az if blokkjt hagyjuk resen? V: llyen esetekben a logikai mG'veletek sietnek a segtsgnkre. Nem kell mst tennnk, rnint elrni, hogy a kirtkelt kifejezs t rue legyen, amikor a kdot futtatni szeretnnk. Erre szolgl a tagads mG'velete (! ) , amelyet gy hasznlhatunk:
K: Mit tegynk, ha akkor szerelnnk vgrehajtani egy kdrszletet, ha az
i f ( ! kifejezs)
K: Mennyire fontos a case utastsok sorrendje? V: A helyzetteil fgg. A pldnkban, ahol a kivlasztott llat lbait szmoltuk meg, a Dog s a Snake sorrendje lnyeges volt, de ha nnden case utasts tartalmaz kdot, a sorrend nem szmt.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtt6 krdsek
1. Melyik dntsi szerkezetet hasznljuk annak meghatrozsra, hogy egy kifejezs rtke true vagy false? 2. Milyen logika szerint trtnik a true s false rtkek kirtkelse a megismert kt dntsi szerkezetben? 3. Melyik utastst hasznlhatjuk, ha akkor is vgre szeretnnk hajtani valamilyen kdot, ha az i f kifejezsnek rtke false? 4. Melyik dntsi szerkezetet hasznlhatjuk, ha egy kifejezs tbb lehetsges rtkt szecetnnk vizsglni? 5. Elfordulhat, hogy egy program tbb case blokkot is vgrehajt egy swi tc h utastsan bell?
Vlaszok
2. 3. 4. 5.
1. Az i f utastst. A Boole-fle (vagy ktrtk) logika szerint. Az else utastst. A switch utastst. Nem, soha.
Gyakorlatok
1. Hozzunk ltre egy projektet, amely lehetv teszi a felhasznlnak, hogy szveget rjon egy szvegmezbe. Vizsgljuk meg egy if szerkezettel, hogy a bertszveg a circle (kr), a triangle (hromszg), a square (ngyzet) vagy a pentagon (tszg), s jelentsk meg az alakzat oldalainak a szmt. Ha a szveg ezek egyikvel sem egyezik, kzljk a felhasznlval, hogy csak ezeket az alakzatokat fogadjuk el. 2. rjuk t gy az l. gyakorlat programjt, hogymost az i f helyett a switch utastst hasznljuk.
14. RA
A hatkonysg nvelse: ciklusok
A lecke tartalmbl:
Vgrehajts adott szm ismtlse a for ciklus segtsgvel Vgrehajts felttelhez kttt ismtlse a do ... whi le s a wh ile ciklusok segitsgvel Gyakran fogunk olyan helyzetekkel tallkozni, hogy ugyanazt az utastst vagy utastsok csoportjt kell ismtld6en vgrehajtanunk. Ilyen esetekben bizonyos utastsok a megadott alkalommal hajtdnak vgre, mg ms utastsok addig futnak, amg egy bizonyos felttel teljesl (igaz), vagy nem teljesl (igazz nem vlik). A Visual C#-nak vannak olyan utastsai, amelyekkel knnyen ltrehozhatjuk s vgrehajthatjuk az ismtld6 alprogramokat, a ciklusokat. Ezen az rn megnzZk, hogyan hasznlhatjuk a kt f6 dklusfajtt, hogy kisebb, gyorsabb s hatkonyabb kdot 1rhassunk.
Utastsrsz
e16kszits feltteles_kifejezs
mvelet utasts
Lerrs A ciklusvltozt meghatroz s kezdrtkkel ellt kifejezs. Logikai mveletek segtsgvel kirtkelhet kifejezs, amelyet annak a meghatrozsra hasznlunk, hogy mikor kell a ciklust folytatni s mikor befejezni. Azt adja meg, hogy mennyivel nvekedjen vagy cskkenjen a ciklusvltoz. A vgrehajtsra vr begyazott utastsok.
A mvelettel Copertorral") adhatjuk meg, hogy a ciklusvltoz mennyivel nvekedjen vagy cskkenjen. A Visual C# tbbfle mivelettel is rendelkezik, amelyek els rnzsre idegennek tnhetnek, pedig csak matematikai fOggvnyek rvidtsei. A kvetkez felsorolsban a Visual C#-ban leggyakrabban elfordul mveleteit s azok hatst lthatjuk: A ++ eggyel nveli a vltoz rtkt A -- eggyel cskkenti a vltoz rtkt A + = a mveleti jel jobb oldaln ll rtket hozzadja a bal oldalon ll rtkhez. Pldul az x+= Y kifejezs ugyanazt az eredmnyt adja, mint a kvetkez:
X = X+ Y.
A - = a miveleti jel jobb oldaln ll rtket kivonja a bal oldalon ll rtkbl. Pldul az x -= Y kifejezs ugyanazt az eredmnyt adja, mint a kvetkez:
X= X - Y.
14. 6ra A
A leggyakrabban hasznlt bejr (itertor) a ciklusvltoz++, amely a cikl usvl toz nev vltozt eggyel nveli. A vltoz eggyel trtn cskkentshez a ciklusvltoz-- kifejezst hasznljuk. Ha a ciklusvltozt nem eggyel szeretnnk nvelni, a += (cskkentshez pedig a-=) m1Iveleti jelet kell hasznlnunk, amely utn az az rtk ll, amennyivel a vltozt nveini (vagy cskkenteni) akarjuk. Lssunk erre egy pldt: l oopvariable +- 0.05 Lentebb egy egyszer1I pldt lthatunk a for ciklusra, utna pedig megtalljuk a magyarzatot, hogy mi trtnik a ciklusban pontosan: for (int intecunter = l; intecunter <= 100; inteounter++) Debug . WriteLine(inteounter); Ez a for utasts egy intecunter nev s egsz szm tpus vltozt vezet be l-es kezdrtkkeL Az intecunter <= 100 felttel vizsglata igaznak bizonyul, ezrt a Debug. writeLine ( intecunter l utasts lefut. Miutn az utasts vgrehajtdott, az inteounter rtke eggyel n (inteounter++). A ciklus 100-szor fut le, mikzben a kimeneti hibakeres abiakba l-tl 1 00-ig kirja a szmokat.
nvtrre.
Ha a for ciklusnak tbb utastst kell vgrehajtania, akkor kapcsos zrjelbe ( { }) kell tennnk az utastsokat. Ha csak egyet kell vgrehajtania, nem kell kapcsos zrjelet alkalmaznunk. me az elz for ciklus, amely most kt utastst tartalmaz: for (int intecunter
(
= l;
Elfordulhat, hogy meg kell szaktanunk a for ciklust, mieltt a felttel hamiss vlna. Ilyenkor a break utastssallphetnk ki a ciklusbL
1. Az egr jobb gombjval kattintsunk a Forml. cs-re a Solution Explorerben, vlasszuk a Rename (tnevezs) menpontot, majd rjuk t az alaprtelmezen nevet FadingFormForm . cs-re. Ez utn lltsuk az ablak Text (Szveg) tulajdonsgt a Fading Form rtkre (egyszer az ablakra kell kattintanunk, hogy megjelenjenek a tervezsi tulajdonsgok). 2. Adjunk az ablakhoz egy gombot. Ehhez az eszkztr Button (Gomb) elemre kell dupln kattintanunk A gomb tulajdonsgait a kvetkez mdon lltsuk be:
rtk
btnFadeForm 105 , 113 75 , 23 Fade Form
14.1. bra
Egy egyszer programmal
dolgokat
mvelhetnk
nagyszer
Most mr csak annyit kell tennnk, hogy megrjuk a kdot. Kattintsunk dupln a gombra, hogy a Click esemnyhez be tudjuk rni a kvetkezket: for (double dblOpacity = l; dblOpacity > O; dblOpacity += -0 . 05)
(
this.Opacity = dblOpacity;
l l Frissitsuk az ablakot.
Az eddigiek alapjn a kd nagy rszt mr rtennk kell, de lssuk, hogy mi trtnik: Az els6 utasts elkszti a ciklust: ltrehoz egy double tpus, dblOpacity nev vltozt. A double tpust azrt kell alkalmaznunk, mert az tltszatlansg (opacity) rtke O s l kztt vltozik, s az egsz szmokban nem hasznlhatunk tizedesjegyeket A dblOpacity vltoznak az 1 kezdrtket adtuk, s a ciklusfelttelt a kvetkezkppen hatroztuk meg: dblOpacity >o. Ez azt jelenti, hogy a ciklus addig folytatja a vgrehajtst, amg a dblOpacity nagyobb O-nl. Vgl az utols rsz arra utastja a ciklust, hogy minden alkalommal, amikor vgrehajtdik, 0,05-dal cskkentse a dblOpacity vltoz rtkt (vegyk szre, hogy a kdban negatv eljellel szerepel ez az rtk). Mindez azt jelenti, hogy a ciklusvltoz l-nl kezddik s 0,05-dal cskken mindaddig, amg O nem lesz az rtke. Ezen a ponton a ciklusban lv utasts nem fut le, hanem a vgrehajts a ciklus zr kapcsos zrjele utni els utastsra ugrik. A msodik utasts (a ciklus kdjnak nyit kapcsos zrjele utn) az ablak tltszatlansgt a ciklusvltoz rtkre lltja. A megjegyzs utn kvetkez sor az ablak Refresh () tagfggvnyt hvja meg, amely az ablak elhalvnyulst idzi el. Ha ezt nem alkalmazzuk, a Windows esetleg nem tudja lpsenknt elhalvnytani az ablakot. Miutn sikeresen megoldottuk ezt a pldt, nyugodtan megnzhetjk, hogy mi trtnik, ha a Refresh () utastst megjegyzshe tesszk (tegynk megjegyzsjelet az utasts el, gy a Visual C# megjegyzsknt kezeli, s nem hajtja vgre). A kvetkez utasts, a Sleep (), vrakozsta utastja a VtSUal C#-ot. A zrjelben lv szmok az ezredmsodpercben mrt vrakozsi idt jelentik, ami ebben az esetben 200 rns. gyes kis fggvny, nem? Hasznlhatnnk egy msik for ciklust is a vrakozs elidzsre, de ekkor a vrakozs idtartama a felhasznl szmtgpnek gyorsasgtl fggne. A Sleep p fggvnnyel biztostjuk, hogy a vrakozs minden szmtgpen ugyanannyi ideig tartson, mint azon, amelyiken a program fut. A zr kapcsos zrjel visszaadja a vgrehajtst a for utastsnak, ahol a vltoz cskkentse utn ellenrzi, hogy elrtk-e az als rtket. Mlre a ciklus lefut, az ablak lthatatlann vlik. Az utols utasts az Opacity tulajdonsg rtkt visszalltja l -re, aminek az eredmnyekppen az ablak ismt megjelenik.
Az eszkztron kattintsunk a Save AlJ (Mindent ment) gombra, s a program futtatshoz nyomjuk meg az F5 billentyit. Az ablak elszr teljesen hagyomnyos mdon jelenik meg, de ha a gombra kattintunk, megfigyelhetjk, ahogy az ablak elhalvnyodik (lsd a 14.2. brt).
300
14.2. bra
Ehhez a pldhoz rengeteg utastsra lett volna SZksg, ha t-zem ciklust hasznltunk volna
Ha lemondtunk volna a ciklusrl, az tltszatlansg megvltoztatshoz szksges utastst hszszar kellett volna lernunk Egy egyszer for ciklussal pr sorral meg tudtuk oldani ugyanezt a feladatot. Hasznljunk for ciklust, ha tudjuk, hogy a ciklust hnyszor kell vgrehajtani. Ez nem azt jelenti, hogy programrs kzben mr tudnunk kell, hogy a ciklusnak hnyszor kell lefutnia, hanem egyszeren azt, hogy arnikor el6szr elindtjuk a ciklust, tudjuk, hogy hnyszor kell vgrehajtdnia. Vltozval is megadhatjuk a for ciklus brmelyik paramternek az rtkl, ahogy azt a kvetkez pldban is lthatjuk:
int intUpperLimit=lOO ; for (int intCounter=l ; intCounter< =i ntUpperLimit ; intCounter++) Debug. vir i t e Line ( intCounter ) ;
A hatkony programrs egyik kulcsa, hogy kikszbljk a felesleges rszleteket. Ha azon vesszk szre magunkat, hogy ismtelten ugyanazokat (vagy hasonl) kdsorokat gpelnk be, nagy esllyel van egy j ciklusjelltnk.
[Utastsok]
Utastsok if (feltteles_kifejezs)
break;
whi le (x==x);
Amint ez is:
while (feltte1es_kifejezs)
{
Utasitsok
Amg a feltteles_kifejezs igaz, a ciklus tovbb folytatdik. Amint hamiss vlik, amikor a ciklus elszr elindul, az utastsok tbb nem hajtdnak vgre. A do ... whi le s a while ciklusok kztt annyi a klnbsg, hogy a do ... while szerkezetben az utastsok legalbb egyszer mndig vgrehajtdnak, mivel a feltteles_kifejezs nem rtkeldik ki, arrg a ciklus be nem fejezte az els krt. Emiatt egy ilyen ciklus legalbb egyszer lefut, fggetlenl a felttel rtktL A while ciklus azonban elszr a felttelt rtkeli ki, ezrt a hozz kapcsold utastsok lehet, hogy egyszer sem futnak le.
Tulajdonsg
Name Location Size Text
rtk
btnFind.Numbers
82' 39 120, 23
Find Numbers
rtk
lstResults
82, 68 120, 160
14.3. bra
Ltezhet egy listameznl jobb vezrl az eredmnyek listjnak rnegjelentshez?
if ((intSeek% 3) ==0)
{
10);
oszthat-e hrommal, az intFound vltoz pedig a szmll, amelyet minden alkalommal eggyel nvelnk, amikor tallunk egy hrommal maradk nlkl oszthat szmot. A do utasts indtja el a ciklust. A ciklus kezdetn nincs felttel, mert legalbb egyszer vgre akarjuk hajtani. A while segtsgvel a ciklus vgn vizsgljuk meg a felttelt. A 12. rn emltettk, hogy a % miveleti jelet hasznlhatjuk a maradk meghatrozsra. Itt arra hasznljuk, hogy eldntsk, hogy az intSeek maradk nlkl oszthat-e hrommal. Ezt gy hatrozzuk meg, hogy megnzzk, hogy az intSeek ad-e maradkot, ha hrommal osztjuk. Ha a krdses szm maradk nlkl oszthat hrommal, az intSeekrtkt az eredmnylisthoz adjuk, s az intFound rtkt eggyel nveljk Az if utasts zr zrjele utn az intSeek rtkt nveljk eggyel. Figyeljk meg, hogy az intSeek rtkt a ciklus minden vgrehajtsa kzben nveljk, mert az utasts az if blokkon kvl helyezkedik el. Az utols utasts a ciklust zrja, s egyben az intFound rtkt ellenrzi. Ha 10 szmnl kevesebbet tallt, a ciklus jra vgrehajtdik.
A program mentshez kattintsunk az eszkztr Save Ali gombjra, majd a futtatshoz nyomjuk le az F5 billenty't. Kattintsunk a Find Numbers (Szmok keresse) gombra, s figyeljk meg a megjelen eredmnyt (lsd a 14.4. brt). Gyors mdszer, nem?
14.4. bra
A Vmtal C# gyorsan vgrehajtja a matematikai eljrsokat
A do ... while ciklus volt a legjobb vlaszts, mert nem igazn tudtuk elre, hogy hny szmot kell majd ellenriznnk (teht hnyszor kell a ciklust megismtelni). Ha pldull-tllOO-ig szerettk volna a hrommal oszthat szmokat megkeresni, a for ciklus jobb vlaszts lett volna.
14. ra A
sszefoglals
A ciklusok hatkony eszkzk, amelyek rvn tmrebb kdot rhatunk A tmrebb kd kisebb, hatkonyabb, s ltalban (br nem mindig) jobban olvashat. Ezen az rn megtanultuk, hogyan kell for ciklust rni olyan helyzetekben, amikor pontosan tudjuk, hogy hnyszor akarjuk a ciklust vgrehajtatni. Emlkezznk r, hogy a for ciklus alkalmazshoz nem kell tudnunk mr programrs kzben, hogy hnyszor kell a ciklust megismtelni, de tudnunk kell, hogy a program vgrehajtsa kzben hnyszor kell majd lefutnia. Azt is megtanultuk, hogy ismtlssei hogyan nvelhetjk a for ciklus szmlljt s a break segtsgvel hogyan lphetnk ki belle id eltt. Ezen az rn azt is megtanultuk, hogyan alkalmazhatjuk a do . . . while ciklust, amely lehet6v teszi, hogy rugalmas ciklusokat hozzunk ltre. Ezek szinte az sszes lehetsges esetet tudjk kezelni, ahol ciklust kell alkalmaznunk. Lttuk, hogy a do ... while ciklusban szerepl6 felttel eltr kirtkdsi mdja rniatt a ciklus msknt viselkedik, mint amikor a while ciklus felttelt rtkeljk ki. Ha a for ciklus nem tudja elvgezni a feladatot, a do . .. while vagy a while ciklus valarnilyen formja el fogja tudni. Azon kvl, hogy tanultunk a ciklusok jellemzirl, els kzbl lthattuk, hogy egyetlen
Krdezz-felelek
K: Elfordulhat, hogy vgtelen ciklust kellltrehoznunk? V: Jtkprogramozk gyakran ksztenek egyetlen vgtelen ciklust, s ezen a f cikluson bell helyezik el a logikai s felhasznli bemeneteket Az ilyen kivteles esetektl eltekintve azonban minden ciklus megll egy bizonyos ponton. K: Kell t6rdn6m a ktfajta ciklus teljestmnybeli kl6nbsgeivel? V: A ma kaphat gyors processzorok vilgban a ktfajta ciklus teljestmnybeli klnbsge helyett j esllyel az olvashatsg s az alkalmazhatsg dnti el, hogy melyik ciklust hasznljuk. Ha olyan helyzetbe kerlnk, ahol a teljestmny alapvet fontossg, rjuk meg a ciklust az sszes lehetsges mdon, amit el tudunk kpzelni, mrjk meg az eredmnyeket, s vlasszuk ki a leggyorsabb ciklust.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. Igaz vagy hamis? .Ahhoz, hogy for ciklust alkalmazhassunk, mr programrs
2. 3. 4. 5.
kzben tudnunk kell a ciklus kezd- s vgrtkt" Egymsba lehet gyazni a ciklusokat? Milye n ciklust clszeru alkalrnaznunk, ha nem tudjuk, hogy a ciklusnak hnyszor kelllefutnia? A do .. wh ile ciklus felttelnek kirtkelse sorn lehetsges, hogy a cikluson belli kd egyszer sem fut le? Milyen utastst alkalmazunk a do ... while ciklus befejezshez, ha nem akarjuk a do vagy a wh ile utasts felttelt kirtkelni?
Vlaszok
1. Hamis. A for ciklus kezd- s vgrtknek megadshoz vltozt is
hasznlhatunk. 2. Igen, egymsba gyazhatunk akr klnbz tpus ciklusokat is. 3. Egy do ... while ciklust. 4. Nem, a kd legalbb egyszer vgrehajtdik. 5. A break utastst hasznljuk.
Gyakorlatok
1. Hozzunk ltre egy szvegmezt a No Remaindecs programunk ablakn, ahov
a felhasznl berhat egy szmot. Keressk meg az els 10 szmot, amely a felhasznl ltal begpelt szmmal maradk nlkl oszthat. Hasznljuk az int . Parse ( ) eljrst a bevitt szm egsz tpus szmm alaktshoz. 2. Hasznljunk kt egymsba gyazott ciklust egy cmke mretnek kt irnyban trtn mdostshoz. A kls ciklus vltoztassa 1-t61 100-ig a cmke Width tulajdonsgt, a bels ciklus pedig 1-tllOO-ig a Height tulajdonsgt. Ne lepdjnk meg az eredmnyen, mg ha furcsa is. Miutn belltottuk a cmke magassgt s szlessgt, ne felejtsk el meghvni a cmke Res i ze () tagfggvnyt.
15. RA
Hibakeress
A lecke tartalmbl:
Megjegyzs hozzfzse a kdhoz A kt alapvet6 hiba azonostsa Az Output ablak hasznlata Strukturlt hibakezel6 ltrehozsa
Senki sem r tkletes kdot. Bizonyra ismer6sek azok a problmk, amelyek megakadlyozzk, hogy egy program megfelel6 mdon fusson. Ezeket programhibknak (bug) hvjuk. Mivel most kezdtk a Visual C#-ot tanulni, a kdunk valsznleg tisztessges mennyisg hibt fog tartalmazni. Ahogy egyre jrtasabbak lesznk, a hibk szma cskken, de teljesen soha nem fognak eltnni. Ez a knyv nem tudja megtantani, hogyan keressk meg a fordts vagy futs kzben fellp sszes lehetsges hibt, amelyekkel tallkozhatunk - a hibakeresshez nem csak jrtassg, hanem mvszi rzk is szksges. Ezen az rn azonban elsajttjuk azt az alapvet6 jrtassgot, ami a kdban fellp legtbb hiba megkeresshez s kijavtshoz szksges.
tovbbhaladnnk, hozzunk ltre egy j, Debugging Example nev Windowsalkalmazst, majd a program megrshoz kvessk a kvetkez lpseket: 1. Az egr jobb gombjval kattintsunk a Forml . cs elemre a Solution Explorerben, majd vlasszuk a Rename (tnevezs) menpontot, s vltoztassuk az ablak nevt DebuggingExampleForm . cs-re. Ez utn lltsuk az ablak Text tulajdonsgt is Oebugging Example-re. Egyszer az ablakra kell kattintanunk, hogy a tervezsi tulajdonsgok megjelenjenek. 2. Kattintsunk dupln az eszkztr TextBox elemre, amivel j szvegmczt adunk az ablakhoz, s lltsuk a tulajdonsgait a kvetkez rtkekre:
Tulajdonsg Name Location Size rtk txtinput
79; 113 120 ; 20
kvetkez
rtkekre:
Name
Location Size Text
rtk btnPerformDivision
79' 139 120 ' 23
Perform Division
15.1. bra
Ez az egyszer fellet Sf!Bthet a hibakeresshez szksges mdszereket elsajttani
Ez a kis program a 100-at fogja elosztani a begpelt szmmal. Ahogy rjuk majd a kdot, hogy ezt el tudjuk vgezni, szndkosan hibkat fogunk elkvetni, hogy megtanuljuk, hogyan lehet ket kijavtani. Az eszkztr Save All (Mindent ment) gombjra kattinl,ra mentsk a programot.
------------------------~
Megjegyzs ltrehozshoz a szveg el kt perjelet ( l l ) kell tennnk. Egy egyszer megjegyzs pldul a kvetkezkppen nzhet ki:
ll Ez egy megjegyzs , mert k t perjel ll a s zveg
e l tt .
Minden, ami a
perjelektl
A Visual C# egy msik fajta megjegyzst is tmogat, amely lehetv teszi, hogy a megjegyzs tbb sort fogjon t, anlkl, hogy minden sor elejre ki kellene tennnk a 1 1 karaktereket. A tbbsoros megjegyzsek egy perjellel kezddnek, amelyet egy csillag kvet ( l *), s egy csillaggal, majd egy jabb perjellel (* l ) zrulnak. Egy ilyen megjegyzs pldul a kvetkezkppen nzhet ki:
l* A Sams TY Visual C# 2008 15 . r ja a hibakeressrl sz l, amivel a legtbb fejleszt6 rengeteg id6t tlt . * l
Ha az eljrsokhoz megjegyzseket fznk, nem kell az emlkezetnkre hagyatkoznunk, hogy megfejtsk a cljukat vagy a mkdsket. Ha valaha is vissza kellett trnnk egy korbbi munknkra, amelyet egy ideje mr nem lttunk, vagy valaki ms kdjval kellett dolgoznunk, akkor bizonyra nagyon mltnyoltuk a megjegyzseket.
310
Figyeljk meg, hogy miurn bertuk a msodik perjelet, mindkt perjel zldd vlik. Amikor megjegyzseket runk a kdba, tegynk meg mindent, hogy betartsuk a kvetkezket:
rjuk le a kdrszlet cljt (a mirtets nem a hogyant). Vilgosan jelezzk a kd mgtti logikt. Hvjuk fel a figyelmet a kd kulcsfontossg pontjaira. Cskkentsk annak az ignyt, hogy az olvasnak fejben kelljen lefuttatnia a kdot. A megjegyzseket rs kzben helyezzk el. Ha vrunk, amg a kd elkszl, valsznleg nem fogunk visszatrni, s utlag megjegyzseket hozzfzni.
A Visual C# tmogat mg egy harmadik fle megjegyzst is, amelyet hrom perjellel ( // 1) jellnk. Amikor a Viusal C# fordtja ilyen megjegyzshez r, XML formtu-
intDenominator ;
Ez a kd a legtbb esetben mg csak futsi hibt sem eredmnyez - de mi trtnik, ha az int D enominator nullval egyenl? A tzes szm nullval val osztsa nem meghatrozottnak minsl, ezrt nem fr el az int Result vltozban (az int Result egy
A MessageBox. Show () utn szndkosan nincs pontosvessz: rjuk be a sort pontosan gy, ahogy itt szerepel. Br elmulasztottuk kitenni az utols pontosvesszt, a Visual C# nem ad azonnal hibazenetet, de szrevehetjk, hogy egy piros hullmvonal jelenik meg az utasts vgn. (Elfordulhat, hogy az ENTER lenyomsval a kvetkez sorra kell ugranunk, hogy a hullmvonal lthatv vljk.) Vlasszuk az Error list (Hibalista) pontot a View (Nzet) menb61, s figyeljk meg a Visual C# lerst a hiba termszetrl (lsd a 15.2. brt). A program minden fordtsi hibja megjelenik ebben a hibalistban. Egy adott hibs kdsor megtekintshez kattintsunk dupln a hibalista megfelel elemre.
15.2. bra
A VJSUal Ot hullmvonallal emeli ki a fordtsi hibkat a kdablakban
15.3. bra
A futsidej kivtel a krdses sornl meglltja a kd vgrehajtst
Ezttal futsidej hiba (vagy kivtel) lpett fel. Ha futsidej hibt kapunk, tudjuk, hogy a kdot gond nlkl sikerlt lefordtani, mivel a fordtsi hibk a program lefordtst s futtatst is megakadlyozzk. A kivteleknek ezt a fajtjt formtumkivteleknek nevezzk. Formtumkivtel ltalban akkor lp fel, ha egy vltozval olyan mve letet akarunk vgrehajtani, amely nem fr ssze a vltoz adattpusvaL A Visual C# srga nyllal mutatja a hibs utastst (a nyl az adott parancsra vonatkozik). Ezen a ponton annyit tudunk, hogy a program hibs, s hogy ez az adattpussal fgg ssze. A program lelltshoz vlasszuk a Debug (Hibakeress) menn bell a Stop Debugging CHibakeress befejezse) pontot, s trjnk vissza a kdszerkesztbe.
Trspontok
Ahogy egy kivtel megllitja egy eljrs vgrehajtst, gy mi is megllthatjuk brmely utastsnl egy t6rspont segtsgveL Amikor a Visual C# egy trsponthoz r a program vgrehajtsa kzben, a vgrehajts lell, mieltt a parancs vgrehajtdna. A trspontok lehet6v teszik, hogy lekrdezzk a vltozk rtkt, vagy megvltoztassuk azokat egy bizonyos pillanatban, valarnint hogy a vgrehajtsan soronknt haladjunk vgig. Most teht egy trspontot fogunk ltrehozni, hogy az lngAnswer = utastsnl fellp kivtelt kezelni tudjuk. A kdhoz knnyen hozzadhatunk egy trspontot: csak kattintsunk annak az utastsnak a bal oldaln lv6 szrke svra, ahol a kd vgrehajtst meg akarjuk lltani (a kurzort az utastsra is llthatjuk, majd a trspontot az F9 billentyllvel kapcsolhatjuk be, illetve ki). Amikor bekapcsoljuk a trspontot, a Visual C# egy piros krt jelent meg; ezzel jelzi, hogy az utastsnl trspont tallhat (lsd a 15.4. brt). Ennek trlshez a piros krre kell kattintanunk, de ezt most ne tegyk.
pQbli c o.bvonnoZ.a4aiPlttFOftlC)
(
lo.iU.alh~otC):
'
ll n.u
/J
th~
poeote~Ure
4i<w14to too Y
hr~:n:.~t:.g-#1
t)
~c
l o:rtt~~;
15.4. bra
A kd vgrehajtst
w::;;._...~....!.l.:.:....i!!..>....:..Liill:li='-'----....:.;...;....;;.;.:....~-"'l.o:::.M'---.2c..!. 'P>fo::'-'!:~>:: ' .::.. '" ___::Ch:;;:.U :..____-"'-...J:; !NS ::...J
t rspontokkal felgyelhetjk
A trspont ltrehozshoz kattintsunk az lngAnswer = utasts eltti szrke svra, ahogy az a 15.4. brn is lthat. Miutn belltottuk, nyomjuk le az F5 billentyt a program futtatshoz, s kattintsunk ismt a Perform Division gombra. Amikor a Visual C# a trsponthoz r, a kd vgrehajtsa megll. Kzvetlenl a trspont eltti programrszlet mg lefut, majd megjelenik a trsponttal elltott eljrs, valarnint a knyelmnket szolgland a kurzor erre az utastsra ll. Figyeljk meg a piros krre rajzolt srga nyilat (lsd a 15.5. brt), amely a kvetkez vgrehajtsra vr utastst mutatja. A srga nyl csak azrt keriilt a piros kr fl, mert az utastst trsponttallttuk el. Egybknt nem keru! mindig fl, hanem a kvetkez futtatsra vr parancs sorban lv fggleges szrke svban fog megjelenni.
PZl" te woid
aMckt,. Event:Arg e)
11;1oy
t taU.a p:rt.Jc." + 1* *
l.IUIAII.nlt~,;
15.5. bra
A srga nyl a
kvetkezknt vgrehajtand
utastst mutatja
Amikor a vgrehajts megll a trspontnl, szmos dolgot tehetnk. A 15.1. tblzatban lthatk a leggyakoribb mt1veletek, de most nyomjuk meg az FS-t a program futtatsnak folytatshoz. Ismt egy formtumkivtelt fogunk kapni.
Mvelet Billenty Continue Code Execution F5 (Vgrehajts folytatsa) Step lnto (Belps) Fl l
Vgrehajtja a trspontnllv utastst, s megll a kvetkeznL Ha az adott parancs egy fggvnyhvs, az Fll-gyel belpnk a fggvnybe, s a vgrehajts megll az els parancsnl a fggvnyen bell. Vgrehajtja a trspontnllv utastst, s FlO megll a kvetkeznL Ha az adott parancs egy fggvnyhvs, a fggvny teljesen lefut, s a vgrehajts a fggvnyhvsr kver utastsnl ll meg. SHIFT+Fll Az eljrs sszes utastst vgrehajtja, s az utn a parancs utn ll meg, amelyik meghvta az adott eljrst. SHIIT+F5 Lelltja a hibakeresst a programban, s visszatr tervezmdba.
Br nem teljesen magtl rtetd, a ? karaktert hossz vekig hasznltk programok rsa sorn a print (kir) sz rvidtse knt. A fenti utasts egyszeren a szvegmez Text tulajdonsgnak tartalmt rja ki az Immediate ablakba. Figyeljk mt:g, hogy az Immmediate ablak az ltalunk bert utasts alatti sorban kt idzjelet jelent meg. Ez azt jelenti, hogy a szvegmez res. A kivtelt kivlt utasts megprblja a Convert. To Int 64 () tagfggvnyt hasznlni, hogy a szvegmez tartalmt long
Zrjuk be az Exception (Kivtel) ablakot, s helyezzk a kurzort a deklarci (long l ngAnswer;) s a hibs utasts kz, majd nyomjuk meg az ENTER billentyt, s rjuk be a kvetkez parancsokat:
if (txtinput . Text.Lenth
0) return;
prtau -.oht ..~..,us.._CU.Ok(Qbjac; a~r, ~n..c.'l;.l.r_o e) l / / .I:b.UI p~e CU'Yld:. . 100 by t.he ...-al~ eat.e..---c-4 U ll -r.he- t.~ boa t.aU.apvt,
looo~r:
15.6. bra
A srga nyilat elmozdthatjuk, hogy kijelljk a
kvetkezknt
vgrehajtand utastst
3. Engedjk fel a gombot. A srga nylnak most mr az if parancsot kell jellnie, mint kvetkezknt vgrehajtand utastst, ahogy az a 15.6. brn is lthat. Nyomjuk meg az F5 billentyt a program futtatsnak folytalshoz. Ez alkalommal a Visual C# nem vlt ki kivtelt, s nem ll~a meg a vgrehajtst a trspontnl, mert a bevitel ellenrzse miatt, amit az imnt ptettnk be, a vgrehajts a trsponttal elltott eljrs eltt marad. Ez utn kvessk a
kvetkez
lpseket:
1. 1rjuk be a nevnket a szvegmez6be, s kanintsunk ismt a Perform Division gombra. Most, hogy a mez mr nem res, a vgrehaj~s thalad a bevitel ellenrzsn, s megll a trspontnL 2. Nyomjuk meg az F5-t a vgrehajts folytatshoz. Itt megint kapunk egy kivtelt, de ez alkalommal a kivtel rvnytelen tpustalakrsi hibt jelent. Ez klnbzik attl a kivteltl, amit a progr-am korbban kivltott. 3. Zrjuk be az Exception ablakot (kattintsunk a jobb fels sarokban lv kis x-re), s gpeljk be a kvetkezt az Jmmediate abiakba (ha vgeztnk, nyomjuk meg az ENTER billentyt):
? txt!nput .Text
Az Immediate ablak ekkor kirja a nevnket. Ezzel kikszbltk azt a problmt, ami akkor jelentkezik, ha nem adunk t adatot a Convert . Tolnt64 () tagfggvnynek-de valami mssal van gond. Nyomjuk meg az F5-t a vgrehajts folytatshoz, s vegyk kzelebbrl szemgyre a kivtel lerst. Az Exception ablak aljn tallunk egy View Detail (Rszletek megtekintse) nev hivatkozst. Kattintsunk r, s a Visual C# megjelenti a View Detail ablakot, amely a kivtelrl mr tbb informcit szalgltat (lsd a 15.7. brt). A View Detail ablakban lthat szveg a kvetkez: l "Input string was not in a correct forma t. "} (A bemeneti karakterlnc nem megfelel6 formtum). A program szemmellthatan mg mindig nem szereti, amit a convert . Toint64 l l tagfggvnynek tadtunk.
'
. .....
~
St.dilreu llll"9ff> ..
-
.
..... .....
........ *"" ..
".....-.-,r~..,_
IV... SOMgToN....-cs,Rem.Stnns
15.7. bra
A View Detail ablak rszletes informdkkal szolgl a kivtelrl
Rjhetnk, hogy nem ll a rendelkezsnkre megfelel eszkz, hogy egy betul<bl s szmokbl ll szveget szmm alaktsunk. A Convert. Toint64 (l tagfggvnynek egy szm szksges, amellyel dolgozhat. Ezt knnyen ellenrizhetjk a kvetkez lpsekkel:
1. A View Detail ablak bezrshoz kattintsunk az OK gombra. 2. A Debug menb61 vlasszuk a Stop Debugging pontot. 3. Az F5 lenyomsval futtassuk a programot. 4. rjunk be egy szmot a szvegmezbe, s kattintsunk a gombra. A kd vgrehajtsa megint meg fog llni a trspontnL 5. Nyomjuk le az Fl l billentyt, hogy csak az utastst futtassuk Ezttal nem kapunk hibazenetet! Az F5 lenyomsval folytassuk a vgrehajtst, s amikor a vgn a Visual C# megjelerti az zenetablakot, kattintsunk az OK gombra az zenetablak eltntetshez, majd az ablak bezrsval llitsuk le a programot.
Az lmmediate ablakot egy vltoz rtknek mdostsra is hasznlhatjuk, ha berunk egy olyan parancsot, mint a kvetkez: intAge = 12 .
Mivel a Convert . To I nt 64 (l egy szmot vr, de nincs valdi lehetsg arra, hogy a szvegmezben szm bevitelt rjuk el, a kdban alkalmazkodnunk kell ehhez a helyzethez. Az ra ksbbi rszben megtanuljuk, hogyan kezelhetjk a kivteleket a Catch utasts segtsgveL
hibk megjelentsre (Jsd a 15.8. brt). ltalnos cl felhasznls esetn az Output ablak leghasznosabb tulajdonsga, hogy egy fut alkalmazs zeneteket rhat r. Ez akkor klnsen hasznos, arnikor egy alkalmazsban hibkat keresnk.
~ov ~
~ 'C:\Wlactlow\-...-.l.y\Uoe_an.\.lru~2.o . o.o_~,7h&
. ...-n ....
t.o..M4
'C;~......WY\Ga.e_..O.\I.e'a~-'"--&l.SfUill1o.t
b..Miple,Mos..a.,. oc.~: ~ 'C:\U'. .z:a\.T~a'\.llool.u: UV~\.D.~ Kl ~J.*"fl~ . ............... 1. . . . . . .t: t.owl.d 'C!\WJ.Mow'--....1'1\0AC n.~.--- Con\1.1.0.0 lllli.
"'"''lF' '
"""
"lffi"'T
15.8. bra
Az Output ablak sok hasznos informctt jelen ft meg- de csak ha tudjuk, hogy mit keresank A korbbi rkon mr hasznltuk az Output ablakot, csak esetleg nem kifejezetlen gondoltunk arra, hogy rubakeressre is alkalmazhat. Ahogy a 15.8. brn lthatjuk, a Visual C# ltal az Output ablakra kldtt adatok nem magtl rtetdek - a nagy rszket tulajdonkppen figyelmen kvl is hagyhatjuk. Az ablakot viszont arra szecetnnk hasznlni, hogy rubakeress cljbl rassunk ki adatokat, ahogy azt mr korbban is tettk, s a knyv htralev rszben is tenni fogjuk -nem vletlen teht, hogy a Debug objektum segtsgvel fogunk az Output abiakba mL
Ahhoz, hogy az Output ablakban adatokat jelenthessnk meg, a Debug objektum W ri teLine ( ) tagfggvnyt kell alkalmaznunk, ahogy az a kvetkezkben is lthat: System. Diagnostics . Debug. WriteLine ( "Results =
+
lngResults) ;
az Output ablakban. Jegyezzk meg, hogy szveg- s szmliterlokat, vltozkat s kifejezseket is ki tudunk ratni. A WriteLine () akkor a leghasznosabb, ha egy vltoz rtkt akarjuk megtudni, de nem akarjuk a vgrehajtst egy trsponttal meglltani. Pldul tegyk fel , hogy van egy sor utastsunk, amelyek egy kzs vltozt hasznlnak Ekkor WriteLine () utastsokat hinthetnk el szerte a kdban, hogy a vltoz tartalmt a fontos pontokon megjelentsk Amikor ezt tesszk, szveget is rdemes a vltoz rtkvel egytt kratnunk, hogy rthet kimenet kapjunk. Pldul: System.Diagnostics.Oebug.WriteLine ( "Result of area calculation =
+
sngArea);
System . Diagnostics . Debug.WriteLine("Passed Checkpoint l"); l l Utasts vgrehajtsa System.Diagnostics.Debug.WriteLine("Passed Checkpoint 2"); l l Msik utasts vgrehajtsa System.Diagnostics .Debug .WriteLine('Passed Checkpoint 3");
Az Output ablaknak sok tletes alkalmazsa ltezik, csak azt tartsuk szben, hogy lefordtott programrszeknl nem hasznlhatjuk, a Debug objektum hvsait ugyanis a fordt figyelmen kvl hagyja, amikor hordozhat programsszetevket hozunk ltre.
320
Windows-alkalmazst, s kvessk
vlasszuk a Rename menpontot s vltoztassuk az ablak alaprtelmezett nevt Except ionHandlingExampleForm . cs-re. Ez utn llitsuk az ablak Text tulajdonsgt is a Structured Exception Handling rtkre. 2. Adjunk egy j gombot az ablakhoz, s lltsuk a tulajdonsgait a kvetkez6 rtkekre:
Tulajdonsg Name Location Size Text
rtk btnCatchException
93 ' 128 96, 23
Catch Ex cept i on
4. A kd pillanatnyilag nem mkdik, mert a Debug objektumra nem adtunk meg teljes nvtrhivatkozst Ahogyan azt egy korbbi rn lttuk, a using utastst az osztly elejn hasznlva nem kell a Debug objektum teljes Ininstjt minden alkalommal begpelnnk. Grgessk az ablakot az osztly elejre, s keressk meg a mr meglv using utastsokat tartalmaz szakaszt, majd 1~uk a kvetkez us ing utastst a meglvk al: us ing System . Diagnos t ics ; Mint ltjuk, a ciklusokhoz s az elgazsokhoz hasonlan a try szerkezet is kezd s zr utastsokkal rendelkezik. A try szerkezetbe olyan kdrszletet foglalhatunk bele, amely kivtelt okozhat, s a kivltott kivtelek kezelst teszi lehetv. A szerkezet rszeit a 15.2. tblzat tartalmazza.
1J.2. tblzat
Szakasz
try
lefrs
A try szakaszba azt a kdrszletet tesszk, amely kivtelt vlthat ki. A try szakaszban az eljrs egszt, de nhny sort is elhelyezhetnk.
A catch szakas zban lv kd csak akkor hajtdik vgre, ha kivtel trt nik. Ezt a kdot azrt rjuk, hogy a kivtelt elfogjuk A fina lly szakaszban lv kd akkor fut le, ha a t ry, illetve a catch szakaszok befejezdnek Ez az a hely, ahov a takart kdot helyezzk, vagyis azt a kdot, amelyet mindig le akarunk futtatni , fggetle nl attl, hogy trtnik-e kivtel vagy sem.
Finally
D one Tryi ng
a catch szakaszon belli kdot a program figyelmen kvl hagyja. lv sszes kd lefutott, vgrehajtdik a finally szakaszon belllv kd. 4. Amikor a finally szakaszban lv programkd is lefutott, a vgrehajts kzvetlenl a try, catch s finally utastsok utni parancsra ugrik.
Most, hogy a try, catch s finally szerkezetek alapvet mkdsi elvt megrtettk, olyan utastsokat fogunk a szerkezetben elhelyezni, amelyek miatt kivtellp fel, amelyeket azutn kezelnk.
A kvetkez kdnak megfelelen vltoztassuk meg az eljrst:
lngDenominator ;
Debug .WriteLine("Finally"); Debug. WriteLine ("Done Try ing"); Nyomjuk meg ismt az F5-t a program futtatshoz, majd kattintsunk a gombra, s figyeljk meg az Output ablakot. Ez alkalommal az Output ablak a kvetkezket tartalmazza: Try A first chance exception of type 'System.DivideByZeroException' occurred in Structured Exception Handling . exe Catch Finally Done Trying
A kivtelek kezelse
Ha elfogjuk a kivteleket, hogy megakadlyozzuk egy alkalmazs sszeomlst, nemes dolgot hajtunk vgre, de ez a hibakezels folyamatnak csak egy rsze. ltalban a felhasznlval is tudatni szeretnnk (bartsgos mdon), hogy kivtellpett fel, s valsznleg azt is kzlni akarjuk vele, hogy milyen fajta kivtel trtnt. Ehhez viszont tudnunk kell, hogy milyen kivtelt vltott ki a program. Ez akkor is fontos , ha egyedi kivtelekre szecetnnk kdot rni. A catch utasts Iehetv teszi, hogy megadjunk egy vltozt, amely egyException (kivtel) objektumra hivatkozik, amelynek a segtsgvel informcikat tudhatunk meg a kivte lrL Ahhoz, hogy a kivtelt egy Exception objektumban helyezzk el, a kvetkez utastsformt kell hasznlnunk: catch (Exception vltoznv} A kvetkez kdrszletnek megfelelen mdostsuk a catch szakaszt: catch (Exception objException )
(
objException.Message);
Az Exception objektum Message tulajdonsga tartalmazza azt a szveget, amely lerja az adott kivtelt. Indtsuk el a programot, majd nyomjuk meg a gombot, s a Visual C# megjelenti az egyedi hibazenetnket (lsd a 15.9. brt).
15.9. bra
A strukturlt kivtelkezels lehelv teszi, hogy eldntsk, mit tegynk, ha kivtellp fel
lngAnswer - 100 l long. Parse(txt lnput .Text); MessageBox.Show("lOO/" + txtinput.Text + is " + lngAnswer); catch (Systcm.FormatException)
{
catch
(
MessageBox.Show("Caught an exception that wasn't a forrnat exception."); Figyeljk meg, hogy ennek a szerkezetnek kt catch utastsa van. Az els csak a formtumkivteleket fogja el, de ezen kvl semmilyen ms pust nem. A msodik catch utasts nem trdik a kivtel tpusval: mindet elkapja, a formtumkivteleket leszrrtva, mert a catch szakaszok fellrllefel rtkeldnek ki, a switch szerkezet case utastsaihoz hasonlan. Megadhatunk tbb catch szakaszt is, amelyek tovbbi, meghatrozott kivteleket kapnak el, ha a helyzet gy kvnja. Ebben a pldban az eddig megrt Picture Viewer programunkat folytatjuk , amelyet a ll. rn mdostottunk utoljra. Fogjunk hozz, s nyissuk meg ezt a programot. Elszr ltni akarjuk azt a kivtelt, amit elkapunk. Kvessk a kvetkez lpseket, hogy kivtelt idzznk el:
15.10. bra
Kezeletlen kivtelrzek soha nem szabad fellpnie!
Folytassuk a munkt, s kattintsunk az eszkztr Stop Debugging elemre, hogy meglltsuk a fut programunkat. Ahelyett, hogy lpsrllpsre megnznnk a vltozsokat, a knnyebb utat vlasztjuk, s csak az j OpenPicture (l eljrst fogjuk megnzni. Vltoztassuk meg a kdunkat gy, hogy a kvetkez mdon nzzen ki:
if (ofdSelcctPicture . ShowOialog()
{
= = DialogResult . OK)
l l Kp betltse a kpmezbe
picShow~icture .Image
MessageBox . Show("The file you have chosen is not an image file . , rnvalid File", MessageBoxButtons.OK);
Az imnt annyit tettnk, hogy az eljrst egy hibakezelbe csomagoltuk, amely az Out of Memory kivteleket figyeli, s azokat kezeli. Nyomjuk meg az F5-t, s kvessk azokat a lpseket, amelyekkel korbban egy nem kpi fjlt tltttnk be. Most ahelyett, hogy a fejlesztkrnyezettl kivtelt kapnnk, az alkalmazsunk egy zenetablakot jelent meg, amely sokkal inkbb felhasznlbart, s az alkalmazs nem fejezi be a futst miatta. Br kivdtk annak a lehetsgt, hogy a felhasznl6 egy rvnytelen kpfjl kivlasztsval Out of Memory kivtelt okozzon, a k6don vgrehajtott vltoztatsokat rint kifogsokkal tisztban kell lennnk:
Ha a programkd ms rsze okozna Out of Memory kivtelt, a hibazenettel flrevezetnnk a felhasznlt. Ezt gy kszblhetjk ki, hogy csak a krdses utastst csomagoljuk be a try ... catch szerkezetbe. Ha msmilyen tpus kivtel trtnne az eljrsban, azt a hibt figyelmen kvl hagynnk. Ezt gy akadlyozhatjuk meg, hogy ltrehozunk egy ltalnos catch blokkot, amely elfogja a tovbbi kivteleket. Mint lthatjuk, a try szerkezet hozzadsa, amelynek a segtsgvel kezelhetjk a kivteleket, viszonylag egyszer mvelet. Azt megtudni azonban, hogy mil kell Itiroondottan elkapni, s hogyan kell kezelni a helyzetet, ha kivtel trtnik, kihvsokkal telinek bizonyulhat.
sszefoglals
Ezen az rn az alkalmazsok hibamentestsnek alapjait tanultuk meg. Lttuk, hogyan adhatunk hasznos s bsges megjegyzseket az eljrsainkhoz, amelyek knnyebb teszik a hibakeresst, de brmilyen jk is a megjegyzseink, a programjainkban mindig lesznek hibk.
Krdezz-felelek
K: jelezzak a felhasznllmak, hogy kivtel trtnt, vagy hagyjuk a programot
Jutni?
V: Ha rtunk olyan kdot, amely kezeli a kivtelt, nem szksges, hogy rtestsk
rla a felhasznlkat. Mindazonltal, ha a program nem tudja, hogy mit kezdjen a kivtellel, a felhasznlkat el kellltnunk a kivtelre vonatkoz informcikkal, hogy a hibt jelenteni tudjk, s mi ki tudjuk javtani. K: Minden utasftst el kell ltnunk megjegyzsekkel? V: Valszntileg nem, de rdemes lehet a programban minden elgazst s ciklust megjegyzsekkel elltni. A kdnak ezek a szakaszai dnt fontossgak, hogy egy eljrs jl mtikdjn, s amit csinlnak, az nem mindig nyilvnval.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
Milyen tpus hibk akadlyozzk meg, hogy a Vtsual C# lefordtsa s futtassa a kdot? 2. Mi a futsidejti hiba msik neve?
1.
3. Milyen karakterekkel jelljk az egysoros megjegyzseket? 4. Mit kell belltanunk, hogy meglltsuk a vgrehajtst egy bizonyos ponton? 5. Fejtsk ki, hogy mit jelent a srga nyl s a piros kr a kdszerkeszt szrke svjban! 6. A fejlesztkrnyezet melyik ablakt hasznlhatjuk, hogy egy vltoz tartalmt kiolvassuk a program futsa kzben? 7. Igaz vagy hamis? "A try szerkezeten bellmindig meg kell adnunk egy catch szerkezetet is."
Vlaszok
1. 2. 3. 4. 5. A fordtsi hibk. Kivtel. Kt perjellel (! /). Egy trspontot A srga nyl a hibakeress sorn kvetkezknt vgrehajtand utastst mutatja, a piros kr pedig trspontokat jell, vagyis olyan utastsokat, ahol a vgrehajts lell. 6. Az Immediate ablakot. 7. Hamis. Ha kihagyjuk a catch szakaszt, a program egyszeruen figyelmen kvl hagyja a kivtelt.
Gyakortatok
1. Abban a kdpldban, amelyik az l ngAnswer vltozhoz egy oszts eredmnyt rendelte, vltoztassuk az lngAnswer vltoz long tpust single-re, majd tvoltsuk el az i f utastst, amely az oszts eltt megvizsglja a szveg~r.cz tartalmt Ugyanazt a kt kivtelt kapjuk, amelyeket akkor, amikor a vltoz mg long volt? Mirt? 2. ~uk jra azt a kdrszletet, amelyik az lngAnswer vltoz rtknek az oszts eredmnyt adta, s csomagoljuk a kdot egy try ... catch szerkezetbe. Tvoltsuk el az if utastst, amely az adat ellenrzst vgzi, s hozzunk ltre egy catch szakaszt a lehetsges kivtelek szmra.
16. RA
Objektumok tervezse osztlyok segtsgvel
A lecke tartalmbl:
Adatok s programkd egysgbe zrsa osztlyok segtsgvel Objektumfellet ltrehozsa Objektumok jellemz6inek hozzfrhetv ttele tulajdonsgok formjban Objektumok pldnyostsa osztlyokbl Objektumhivatkozs vltozhoz ktse Az objektumhivatkozsok megszntetse Az objektumok leuartama
A 3. rn megtanultuk, hogy m.it6l objektum az objektum. Azta lnuk, hogyan lehet objektumokat ablakokknt vagy vezrlknt kezelni. Az objektumok igazi el6nye azonban abban a lehet6sgben rejlik, hogy az objektumokat testreszabon m6don tudjuk megtervezni s megvalstani. Ezen az rn megtanuljuk osztlyok alkalmazsvalltrehozni a sajt objektumainkat, s azt is ltni fogjuk, hogyan hatrozhatjuk meg egy objektum sablonjt, s hogyan hozhatunk ltre egyni tulajdonsgokat s tagfggvnyeket
Osztlyok
Az osztlyok teszik
lehetv, hogy objektumkzpont programozsi (objektumorientlt, OOP) mdszerekkel fejlessznk alkalmazsokat (emlkezhetnk, hogy a 3. rn rviden mr volt sz az OOP-rl). Az osztlyok sablonok, amelyek objektumokat hatroznak meg. Br bizonyra nem tudtuk, a knyvben eddig is osztlyok segtsgvel programoztunk. Amikor ltrehozunk egy ablakot egy j Visual C# programban, tulajdonkppen egy olyan osztlyt alkotunk, amelyik egy ablakot hatroz meg, a futsidben pldnyostott ablakokat pedig ebbl az osztlybl szrmaztatjuk Az elre meghatrozott osztlyokbl (amilyen pldul a Visual C# Form osztlya) szrmaztatott objektUmok alkalmazsa az OOP elnyeinek csak a kezdett jelenti. Ahhoz, hogy megismerjk az OOP igazi erejt, ltre kell hoznunk a sajt osztlyainkat
mozstL A helyesen megvlasztott, osztlyokon alapul programozsi mdszerek javtjk a programjaink szerkezett s megbzhatsgt. Az osztlyokon alapul programozs arra knyszert bennnket, hogy alaposabban tgondoljuk a kd s az adatok logikjt. Ennek az lesz a kvetkezmnye, hogy jobban jrahasznosthat s bvthet, objektum alap kdot fogunk rni.
16. ra
Jobb megkzeltst jelent, ha az alkalmazonak adatait s a szolgltatsokat (az alprogramok hozzadst, trlst, s gy tovbb) egyetlen jrahasznosthat objektum segtsgvel egysgbe zrjuk. Az egysgbe zrs (enkapszulci, betokozs) az a folyamat, amelynek sorn az adatokat s a programkdot egy egysgbe, egy objektumba szervezzk. gy az alkalmazsunk s a kls programok is egysges felleten, az Employee (Alkalmazott) objektum felletn keresztl kezelhetik az alkalmazottak adatait. Afellet(interfsz) az elrhet szolgltatsok halmazt jelenti, teht lnyegben azokat az alprogramokat, amelyek tagfggvnyeket, tulajdonsgokat s esemnyeket hatroznak meg.
Az alkalmazsunkon kvl hasznlhat objektumok ltrehozsnak tmja meghaladja ennek a knyvnek a kereteit, de azok a mdszerek, amelyeket ezen az rn megtanulunk, kzvetlenl alkalmazhatk lesznek kvlrlltrehozhat objektumok megalkotsra is.
Az adatok s a programkd egysgbe zrsa kpviselik az osztlyok alapjt. Ha az adatokat s az ezeket kezel alprogramokat egy osztly rvn egyetlen objektumba zrjuk, egyszerbb tesszk az adatok kezelshez szksges programkd szmra az adatok karbantartst. Tegyk fel pldul, hogy a vllalatunk szablyzata megvltozik, s ha j alkalmazottat vesznk fel, ltre kell hoznunk a szmra egy adnyilvntart rekordot, s ki kell nyomtatnunk egy rlapot. Ha az adatok s az alprogramok nem egy kzs objektumban lennnek egysgbe zrva, hanem a kd klnbz rszein helyeznnk el azokat, minden olyan modult mdostanunk kellene, amely tartalmazza az j alkalmazotti bejegyzs ltrehozshoz szk:sges kdot. Ha az objektumot azonban egy osztly segtsgvel hozzuk ltre, a kdot csak egy helyen kell mdostanunk: az osztlyon bell. Amint mdostjuk az objektum fellett (amirl hamarosan szt ejtnk), minden olyan alprogramban, amely ezt az objektumot hasznlja az alkalmazotti bejegyzsek ltrehozshoz, azonnal rvnyre jut a szablyzat vltozsa.
2. Adjunk egy j osztlyt a projekthez a Project, Add Class (Projekt, Osztly hozzadsa) menponttal, s a 16.1. brn lthat mdon mentsk az osztlyt clsMyCiass.cs nven.
'
-'"ul""
Apjilkiilon Applicotklft
l1
~
AoMmWy
A......:os
o- ~ C-Al<
Do.-
~
[i
-."..
V.IISUlb
fi,
UNQI<>SQL
c-
l.ool Dol>bo>
tJ
li]
MOIP!mt: fOfm
li
Fil<
5<Nic........
[[)
F...,.
XMl ~lit
---
ti
s.tttn,sn.
il
l ... File
il
-...
~
.."!."".....
16.1. bra
Az osztlyokat
~...ii,q..~ ~----------------------~----~
16. ra
Konstruktorok s destruktorok
Figyeljk meg, hogy a Vtsual C# berta a class clsMyClass nyilvnos osztlydeklarcit. Minden kd - belertve a tagfggvnyeket, a vltozkat s a tulajdonsgeljrsokat az osztlydeklarci nyit s zr zrjele kz kerl.
Objektumfellet ltrehozsa
A:l. osztly felletnek elrhetnek kelllennie az osztlyblltrehozand objektumok szmra. Mint korbban emltettk, a fellet a hozzfrhetv tett szolgltatsokat (tulajdonsgokat, tagfggvnyeket s esemnyeket) jelenti. A fellet az az eszkz, amelynek a segtsgvel az gyflkd az osztlybl szrmaztatott objektummal kapcsolatot tart. Nhny osztly korltozott fdletet tesz hozzfrhetv, msok sszetettet Az osztly felletnek tartalma s kiterjedse teljes mctkben tlnk fgg.
Egy osztly fellete a kvetkez tagoknak legalbb az egyikt magban foglalja: Tulajdonsgok Tagfggvnyek Esemnyek Tegyk fel, hogy ltrehozunk egy Ernployee objektumot, vagyis egy osztlybl szrmaztaton, "alkalmazott" nev objektumot. Elszr azt kell eldntennk, hogyan akarjuk, hogy az gyflkd az objektummal kapcsolatot tartson. Figyelembe kell vennnk mind az objektumban trolt adatokat, mind a fggvnyeket, amelyeket az objektum vgre tud hajtani. Lehet, hogy azt akarjuk, hogy az gyflkd kpes legyen kikeresni egy alkalmazott nevt vagy egyb olyan adatokat, mint a nem, a kor s a munkba lls idpontja. Ahhoz, hogy az gyflkd meg tudja szerezni ezeket az adatokat az objektumtl, az objektumnak minden elemhez hozzfrhetv kell tennie egy felleti tagot. A 3. rbl emlkezhetnk r, hogy az objektumok ltal hozzfrhetv ten rtkeket tulajdonsgoknak nevezzk, ezrt minden adatot, amirl itt sz van, az Employee objektum tulajdonsgaknt kell hozzfrhetv tennnk.
is hozzfrhetv tehetnk. Az egyedi objektumesemnyek hasonlak az ablakok s a szvegmezk esemnyeihez, de az egyedi esemnyekkel tkletesen kzben tarthatjuk a kvetkez6ket: az esemny nevt, az esemnynek tadott paramtereket, s az esemny bekvetkezsnek idejt.
Az egyedi esemnyek ltrehozsa sszetett feladat, ezrt csak az egyedi tulajdonsgokat s tagfggvnyeket trgyaljuk.
A tulajdonsgok, a tagfggvnyek s az esemnyek egyttesen teszik ki egy objektum fellett, amely kzvettknt viselkedik az gyflalkalmazs s az objekrum kztt. Az gyfl s az alkalmazs kztti teljes kommunikcinak ezen a felleten keresztl kell zajlania, ahogy az a 16.2. brn is lthat.
Az ugyfel cs ll oh1uktum l<~pcsolata
16.2. bra
Az ugyfelek az objektum feltUetn keresztl tartjk a kapcsolatot az objektummal
16. ra
tervezse
Szerencsre a Visual C# az objektumfellet segtsgvel kezeli az gyfl s az objektum kztti kapcsolat technikai rszleteit is. Ami feladatunk annyi, hogy gy hatrozzuk meg egy objektum tulajdonsgait, tagfggvnyeit s esemnyeit, hogy a fellete logikus s kvetkezetes legyen, valamint minden olyan szolgltatst elrhessk, amely szksges ahhoz, hogy az gyfl eredmnyesen hasznlhassa az objektumot.
= 139;
Ez milkdik, de jelents korltozsok lteznek, amelyek eniatt ez a megkzelts nem igazn kvnatos: Nem hajthatunk vgre semmilyen utastst, ha a tulajdonsg rtke vltozik. Mi a helyzet pldul, ha amennyisg (quantity) megvltozst egy adatbzisba szecetnnk bevinni? Mivel az gyflalkalmazs kzvetlenl elrheti a vltozt, nem tudhatjuk, hogy mikor vltozik az rtke. Nem tudjuk megakadlyozni, hogy az gyflkd megvltoztassa a tulajdonsgot, mert az gyflkdnak kzvetlen hozzfrse van a vltozhoz. Taln a kvetkez a legnagyobb problma: hogyan ellenrizzk az adatbevitel helyessgt? Hogyan biztosthatjuk pldul, hogy a Quant i ty vltoz soha nem vesz fel negatv rtket?
Ezeket a problmkat nem lehet egyszertien kikerlni, ha nyilvnos vltozt hasznlunk. Ezrt ahelyett, hogy nyilvnos vltozkat tennnk elrhetv, inkbb tulajdonsgeljrsok segtsgvel osztlytulajdonsgokat hozzunk ltre.
get
{
privt_ rtk
value;
ll j rtket fogad kd
A tulajdonsg bevezetsnek els sora csak a hatkrt jelli ki (ez ltalban public vagy private). A public mdostval bevezetett vltozk az osztlyon kivli kdok szmra
is hozzfrhetk, vagyis az gyflkd elrheti ket. Ha az alkalmazs elrhetv teszi az objektumait ms alkalmazsok szmra, a public eljrsok az alkalmazson kivlrl is lthatk lesznek. A pr i vate-knt bevezetett tulajdonsgok csak az osztlyon belli kd szmra hozzfrhetk. A hatkr azonostjt a tulajdonsg adattpusa, majd a tulajdonsg neve kveti.
rjuk be a kvetkez kt utastst az osztlyunkba (a class clsMyClass kt kapcsos zrjele kz): private int
{
~intHeight;
set
{
}
ENTER
16. 6ra.
16.3. bra
A tulajdonsgeljrsok egyedi formtummal rendelkeznek
Taln csodlkozhatunk, hogy a tulajdonsgeljrssal egytt mirt hoztunk ltre egy modulszinn: vltozt is, mivel ppen most olvashattunk iVeket az ellen, hogy modulszinn: vltozkat tulajdonsgknt hasznljunk. Ennek az az oka, hogy a tulajdonsgnak valahonnan rtket kell kapnia, s az rtk trolsra ltalban egy modulszint vltoz a legjobb hely. A tulajdonsgeljrs ennek a vltoznak a burkoljaknt viselkedik. Vegyk szre, hogy a vltozt privtknt s nem nyilvnosknt vezettk be, ami azt jelenti, h ogy az osztlyon kvli kdok nem lthatjk vagy mdosthatjk a vltoz tartalmt Az gyflkd szmra ez a vltoz nem ltezik. A tulajdonsgdeklarci nyit s zr kapcsos zrjele kztt kt szerkezetet tallhatunk a get s set szerkezeteket. Ezeket trgyaljuk a kvetkezkben.
Olvashat tulajdonsgok ltrehozsa a get szerl<ezettel A get szerkezetre gy gondolhatunk, mint egy fggvnyre (egy olyan tagfggvnyre, amely egy rtkkel tr vissza). Brmivel is tr vissza, a tulajdonsg a fggvny eredmnyt veszi fel rtkknt. rjuk be az albbi utastst a get kapcsos zrjelei kz:
return m _ intHeight;
Ez az utasts annyit tesz, hogy visszaadja az m_intHeight vltoz rtkt, amikor az gyflkd a Height tulajdonsg rtkt kri.
= value;
A set zradk egy klnleges, value nev vltozt hasznl. Errl a Visual C# automatikusan gondoskodik, s mindig azt az rtket tartalmazza, amelyet az gyflkd a tulajdonsgnak tad. Az imnt bert utasts a modulszintG vltozhoz rendeli az j rtket. Mint l~uk, a tulajdonsgeljrs kzrefogja a modulszintl! vltozt. Amikor az gyflkd belltja a tulajdonsgot, a set szerkezet a vltozha ~a az j rtket. Amikor az gyfl kiolvassa a tulajdonsg rtkt, a get szerkezet visszaadja a modulszintG vltoznak az rtket. Eddig a tulajdonsgeljrs a set s get szerkezetekkel egytt semmiben nem tr el attl, mint ha egyszeren egy nyilvnos vltozt vezettnk volna be, azzal a klnbsggel, hogy a tulajdonsgeljrs hosszabb kdot ignyel. Nzzk meg azonban ugyanennek a set szerkezetnek a kvetkez6 vltozatt:
set
{
i f (value >=10)
m_intHeight
= value;
A set szeekezet arra korltozza az gyfelet, hogy a Height tulajdonsgnak legalbb 10es rtket adjon. Ha 10-nl kisebb rtket adunk a tulajdonsgnak, a tulajdonsgeljrs az m_intHeight belltsa nlkl fejezdik be. Nem csak adatellenrzst hajthatunk vgre, hanem tetszsszerint ms kdot is berhatunk, st ms eljrsokat is meghvhatunk Fogjunk hozz, s ~uk az eljrsunkba az ellenrz utastst, hogy a set szeekezet gy nzzen ki, mint a fenti. A kdunknak most a 16.4. brn lthat mdon kell kinznie.
16. ra
tervezse
i <
16.4. bra
Adateilenrzssel kregszftett tulajdonsgeljrs
Nha lehet, hogy olyan tulajdonsgokat akarunk majd ltrehozr, amelyek olvashatk,
de nem mdosthatk. Az ilyen tulajdonsgokat csak olvashat tulajdonsgoknak nevezzk. A 3. rn a kpzeletbeli Dog objektum kapcsn sz volt a NumberOfLegs tulajdonsgrL Egy ilyen objektum esetben ezt a tulajdonsgot valsznilleg csak olvashatknt akarjuk elrhetv tenni. A kdunk kiolvashatja a lbak szmt, de nem vltoztathatja meg azt. Egy csak olvashat tulajdonsg esetben egyszeren ki kell hagynunk a set szerkezetet (a set utastst s a kapcsos zrjeleket), pldul ha az imnt megrt tulajdonsgeljrst csak olvashatknt szecetnnk megadni, a kvetkezkppen kell bevezetnnk:
public int Height
{
get
{
return m_intHeight;
Br sokkal ritkbban szksges, de ltre lehet hozni csak rhat tulajdonsgot is, amelyben a tulajdonsgot frhatjuk, de nem olvashatjuk. Ezt gy rhetjk el, hogy a set szarkezetet megadjuk, de a get szarkezetet kihagyjuk.
340
EmlkezZnk r, hogy az adattpussal ltrehozott tagfggvnyeknek van visszatrsi rtkk, mg a void kulcsszvalltrehozottaknak nincs. Ahhoz, hogy egy tagfggvnyt egy osztly szmra privtt s gy az gyflkd szmra lthatatlann tegynk, public helyett private-knt kell bevezetnnk a tagfggvnyt.
Tulajdonsg
Name
rtk btnCreateObject
100, 120 88, 23
Location Size
Text
Create Object
Ezt kveten kattintsunk dupln a gombra, hogy hozzfrjnk a Click esemnyhez, s rjuk be a kvetkez kdot:
clsMyClass objMyObject =new clsMyClass(); MessageBox.Show(objMyObject.AddTwoNurnbers(l,2) .ToString{)); Az els utastssal egy clsMyClass tpus vltozl hozunk ltre (a vltozk bevezetst a ll. rn trgyaltuk). A new kulcssz Iniatt a Visual C# egy j objektumot hoz ltre,
a new utn kvetkez szveg pedig annak az osztlynak a neve, amelyikbl az objektumot szrmaztatjuk (emlkezznk r, hogy az osztlyok az objektumok sablonjai).
16. ra
tervezse
Az els lpsben teht egy vltozt hozunk ltre, amely a c lsMyClass osztly alapjn jonnan megalkotott objektumra hivatkozik, a msodik pedig meghvja az osztlyunk AddTwo . Numbers ( ) tagfggvnyt, s Iniutn a visszatrsi rtket karakterlncc alaktotta, az eredmnyt megjelenti egy szvegmezben.
Haladjunk tovbb, s nyomjuk le az F5 billentyt a program futtatshoz, majd kattintsunk a gombra, hogy megbizonyosodjunk rla, hogy minden rendben mkdik. Ha kszen vagyunk, lltsuk Ie a programot, s mentsk a munknkat.
Ha egy objektumot ksi ktsselltunk el, a kts a futsi id alatt trtnik, amikor egy vltoz az objektumra hivatkozik. Ahhoz, hogy az objektum egy tagjra hivatkozni lehessen, a Visual C#-nak meg kell hatroznia az adott tag szmra egy bels azonostt, s azt kell alkalmaznia. Mivel azonban a Visual C# az sszes rs:z.letet kezeli, szerencsre nem kell ismernnk a tag azonostjt ahhoz, hogy hasznlni tudjuk.
Emlkezznk r, hogy az objektum pldnyostsa erforrsokat ignyel. Ebben a kdban nem hozunk ltre j objektumot, ha a felttel hamis. Ha a new kulcsszt a bevezet utastsba tennnk, a kd minden lefutsakor j objektumpldnyt hoznnk ltre, fggetlenl a felttel ~rtktl.
Az objektumhivatkozsok megszntetse
Ha egy objektumra mr nincs szksgnk, meg kell semmistennk, hogy az ltala hasznlt erforrsok felszabaduljanak. Az objektumok automatikusan megsemmislnek, amikor az utols hivatkozsukat is megszntetik. Az objektumhivatkozsok megszntetsnek alapveten kt mdja van, amelyek kzl az egyik nyilvnvalan jobb, mint a msik.
lehetsg, hogy a hivatkozssal rendelkez6 objektumvltozval kilpnk a hatkrbL Mint bizonyra emlksznk, a 11. rn trgyaltuk, hogy a vltozk megsrunnek, ha a hatkrn kvlre kerlnek. Ez ugyangy igaz az objektumvltozkra is. Mindazonltal nem lehetnk teljesen bizonyosak afell, hogy az objektum teljesen megsemmisl, s az sszes ltala hasznlt memria felszabadul, amikor az objektumvltozval kilpnk a hatkrbl, ezrt nem tl j tlet az objektumok megsemmistsekor a hatkrre hagyatkozni.
Az egyik
Ha egy objektumot kifejezetten meg akarunk semmisteni, lltsuk az objektumvltoz rtkt null-ra:
objMyObject = nul l ;
Amikor egy objektumvltoznak a null rtket adjuk, biztosak lehetnk benne, hogy az objektumhivatkozs teljesen megszllnik. A hivatkozs megszntetse azonban mg nem jelenti azt, hogy az objektum is megsemmisl. A szemtgyjt bizonyos idkzn-
Az objektumok lettartama
Az osztlyokbl szrmaztatott objektumok addig lteznek, amg egy vltoz hivatkozik rjuk. Szerencsre a Visual C#- pontosabban a .NET-keretrendszer, amelyrl a 24. rn lesz sz -kezeli az objektumhivatkozsok nyomon kvetsvel kapcsolatos rszleteket, ezrt emiatt nem kell aggdnunk, amikor objektumokat hozunk ltre vagy hasznlunk. Ha egy objektum sszes hivatkozsr megszntetjk, az objektumot egyben megjelljk, s a szemtgyjt vgl megsemmisti. Az objektumok lettartamval kapcsolatban az albbi Irulesfontossg dolgokat kell szben tartanunk, valamint tudnunk kell, hogy ezek mit jelentenek az alkalmazsunk szempontjbL
Egy objektumot akkor hozunk ltre (s gy akkor hivatkazunk r), amikor a new kulcssz segtsgvel bevezetnk egy objektumvltozt. Pldul:
clsMyClass objMyObject =new clsMyClass();
Egy objektumot gy is ltrehozhatunk (s gy hivatkozhatunk r), hogy egy objektumvltozhoz hozzrendelnk egy objektumot a new kulcsszval. P ldul:
objMyObject
= new
clsMyClass;
Egy objektumra akkor hivatkozunk, amikor egy objektumvltozhoz hozzrendelnk egy meglv objektumot. Pldul:
objThisObj ect = objThatObj ect;
Egy objektum hivatkozsr akkor szntetjk meg, amikor az objektumvltozt null-ra lltjuk (lsd a fejezetnek Az objektumhivatkozsok megszntetse cm rszt). Miutn az utols hivatkozst is megszntettk, az objektum alkalmass vlik a szemtgyjtsre. Azt, hogy a szemcgyjt mikor fut le legkzelebb, s semmisti meg a hasznlaton kvli objektumokat, tbb tnyez - tbbek kztt a rendelkezsre ll rendszererforrsok llapota - hatrozza meg (a szemtgyjtsrl bvebben a 24. rn tanulunk majd).
16. 6ra.
tervezse
ltre hivatkozs egy objektumra, de azt is tudnunk kell, hogyan szntethetnk meg kifejezetten egy objekn1mhivatkozst. Csak akkor lehet megsemmistsre kijellni egy objektumot, s felszabadtani az ltala hasznlt erforrsokat, ha minden r mutat hivatkozst megszntettnk.
sszefoglals
Az objekturnkzpont programozs (OOP) olyan halad mdszer, amely megbzhatbb alkalmazsok ksztst teszi lehetv, s az osztlyok programozsa az OOP alapjait jelenti. Ezen az rn megtanultuk, hogyan lehet osztlyokat ltrehozni, amelyek az objektumok pldnyostsa sorn sablonknt szolglnak. Ezen kvl azt is megtanultuk, hogyan hozhatunk ltre tulajdonsgokbl s tagfggvnyekbl ll egyedi felletet, s lttuk, hogyan lehet objektumvltozk segtsgvel adott osztlyokat objektumok pldnyostsra s kezelsre hasznlni.
Azt is lttuk, hogyan kell az erforrsokat ignybe vev objektumoknl megvalstanunk a Dispose () tagfggvnyt, s hogy rnilyen fontos meghvnunk azt a tagfggvnyt meg-
valst objektumokra, mivel ezzel biztostjuk, hogy az objektum olyan gyorsan szabadtsa fel az erforrsait, amilyen gyorsan csak lehet. Vgl megtanulruk, hogy az objektumok nem semmislnek meg azonnal, amint nem hasznljuk ket, csupn megjelljk 6ket a szemtgyijtshez, s akkor semmislnek meg, amikor a szemtgyjt legkzelebb takart. Ezen az rn megtanultuk az objektumok osztlyokkal trtn programozsnak alapjait. Az objektumkzpont programozs jelents szakrtelmet ignyel, ezrt el kell sajtitanunk az ebben a knyvben bemutatott elveket, mieltt az OOP ltal knlt lehetsgekbl elnyt tudnnk kovcsolni. Mindazonlta1 amit ezen az rn megtanultunk, az sokkal messzebbre vezet, mint ahogy gondolnnk. Az OOP nem csupn programozsi mdszer, hanem egyszersmind gondolkodsmd is. Gondoljuk vgig, hogy a programjainkban szerepl dolgokat rnilyen objektumok kpviselhemk, s mieltt rjnnnk, osztlyokat fogunk ltrehozni.
Krdell-felelek
K: Statikus osztlyok helyett mndig pldnyosztlyokban rdemes elhelyezni
a programkdot?
V: Nem felttlenl. Mint a legtbb esetben, itt sincs k6be vsett elrs.
A pldnyosztlyok helyes programozshoz szksg van nmi jrtassgra, a statikus osztlyok programozsa viszont knnyebb a kezdknek. Ha ksrletezni akarunk a pldnyosztlyokkal, btran vgjunk bele, de ne rezzk gy, hogy mindent pldnyostott osztlyokban kell elhelyeznnk K: Kl6nb6z tagflJ8vnyekbol ll, ltalnos osztlyt- vagyis egyfajta "mindenes" osztlyt- szeretnk ltrehozni. Ho8Yan rdemes ezt elkszteni? V: Ha egyfajta segdosztlyt (utility) szeretnnk ltrehozni, ajnlott pldul elsOtility-nek elnevezni. Ezutn ezt az osztlyt az egsz programban hasznlhatjuk, hogy elrjk a segdfggvnyeit.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmU6 krdsek
1. Az objektumok ltrehozshoz elszr egy sablonra van szksgnk. Hogy hvjuk ezt a sablont? 2. Az objektumkzpont programozs egyik elsdleges elnye, hogy az objektumok az adatokat s a programkdot is tartalmazzk. Minek nevezzk ezt a jelensget? 3. A statikus osztlyok esetben a nyilvnos vltozk s alprogramok mindig programozhatk ms modulok statikus osztlyain keresztl. Igaz ez a pldnyosztlyok nyilvnos vltozira s alprogramjaira is? 4. Igaz vagy hamis? "Minden, osztlybl szrmaztatott objektum sajt modulszint:a adatokkal rendelkezik." 5. Mit kell tennnk ahhoz, hogy egy olyan tulajdonsgot hozzunk ltre, amely olvashat, de az gyflkd nem tudja megvltoztatni? 6. Mi a Jegjobb mdja annak, hogy egy osztlyon bell egy tulajdonsg bels rtkt troljuk? 7. ltalban melyik a jobb: a korai vagy a ksi kts? 8. Ha egy objektumvltozt Object tpusknt vezetnk be, az korai vagy ksi kts lesz? 9. Mi a legjobb mdja egy objektumhivatkozs megszntetsnek?
16. ra
tervezse
Vlaszok
1. Osztly. 2. Egysgbe zrs. 3. Nem. Az objektumokat elszr pldnyostani kell, mieltt a vltozik s tagfggvnyeik elrhetv vlnnak. 4. Igaz. 5. A tulajdonsgeljrsbl ki kell hagynunk a set szerkezetet. 6. A bels rtket egy privt osztlyszint vltozban rdemes trolni. 7. A korai kts szinte mindig jobb, mint a ksi kts. 8. Az objektum ksi ktsa lesz. 9. lltsuk az objektumvltoz rtkt null-ra.
Gyakorlatok
1. Adjunk egy j, DropsinABucket neva tulajdonsgot az osztlyunkhoz. Legyen
tpus, s llitsuk be gy, hogy az gyflkd olvashassa a tulajdonsgot, de ne vltoztathassa meg. Vgl adjunk egy gombot az ablakhoz, amelyre kattintva az Irnmediate ablakban kirdik a tulajdonsg rtke (az alaprtelmezett rtk O). Ha ez mr mkdik, mdostsuk gy a kdot, hogy a tulajdonsg rrundig az l OOO OOO szmot adja vissza. 2. Adjunk egy gombot az ablakunkhoz, amely kt clsMyClass () tpus objektumvltozt hoz ltre. Az egyik vltozban a new kulcsszval pldnyostsuk az osztlyt, majd lltsuk be a msodik vltozt, hogy ugyanarra az objektumra hivatkozzon, majd rjuk ki a Height tulajdonsg tartalmt a kimenetablakba, vagy jelentsk meg egy szvegmezben.
Long
17. RA
Kapcsolat a felhasznlkkal
A lecke tartalmbl:
zenetek megjelentse a MessageBox . Show () fggvnnyel Egyni prbeszdablakok ltrehozsa Billenty\1mvetelek A szokvnyos egresemnyek hasznlata
A felhasznJk Jeggyakrabban ablakok s vezrlk rvn lpnek kapcsolatba a programjainkkal, s magunk is ezekkel az eszkzkkel .adhatunk nekik tjkoztatst. Mindazonltal a kapcsolat ennl bonyolultabb is lehet- lehetsgnk van testreszabott zenetek megjelentsre, s fogadhatunk billentyUletseket s egresemnyeket is. Ezen az rn megtanuljuk, hogyan hasznlhatjuk ezeket az eszkzket a felhasznl s a program kztti kapcsolat gazdagtsra. Mindekzben megismerkednk a billenty\1zet s az egr esemnyeivel, gy programjaink kpessgeit a ksbbiekben a vezrlk s az ablakok eredeti lehetsgein tl is bvthetjk
350
tlterhelt tagfggvny, ami azt jelenti, hogy rengeteg klnfle alakban hasznlhat. Amikor Visual C# kdot runk, az IntelliSense Jenyl listjban 21 fle hvsi alak jelenik meg, amelyek kzl prat rszletesebben be is mutatunk.
Ha egy zenetablakot egy megadott szveggel, cmfelirattal s egy OK gombbal szecetnnk megjelenteni, a kvetkez utastsformt kell hasznlnunk:
r~essageBox . Show(zenetSzveg,
Cimtelirat) ;
Ha az zenetablakban a megadott szveg s cmfelirat mellett meghatrozott gombokat szecetnnk elllelyezni, a kvetkez alakot kell alkalmaznunk
Mess ageBox. Show (zen etSzveg, Cmfel ira t , Gombok ) ;
Ha az zenetablakot adott sZveggel, cmfelirattal, gombokkal s egy ikonnal szeretnnk megjelenteni, a kvetkez utastsformt kvessk:
M essageBox . Show(ze ne t Szveg, Cmtelirat , Gombok , Ikon) ;
A fentiekben az zenetSz v eg a megjelentend szveget takarja, a Cmfe lirat szvege kerl a cmsorba, a Gombok tartalmazza a felhasznl szmra megjelentett gombokat, az Ikon pedig az zenet mellett esetleg feltntetett ikont. Pldakppen lssuk az albbi utastst, amely a 17.1. brn lthat zenetablakot jelenti meg:
M essa geBo x. Show( "Th is i s a rness a ge . ", " Hell o Ther e " ) ;
17. 6ra
a felhasml6kkal 351
Hello
17.1. bra
Egy egyszer Zenetablak
Lthatjuk, hogy ha elhagyjuk a Gombok paramtert, a Visual C# mindssze egy OK gombot jelert meg. Fontos azonban, hogy a megjelentett gombok mindig igazodjanak az zenet szveghez.
rtk
AbortRetryignore OK OKCa ncel YesNoCancel Yes No Re tryCancel
Lers AzAbort (Kilps), Retry (jra) s lgnore (Kihagys) gombokat jelenti meg. Mindssze az OK gombot jelenti meg. Az OK s a Cancel (Mgse) gombokat jelerti meg. A Yes (Igen), No (Nem) s Cancel gombokat jeleffiti meg. A Yes s No gombokat jelerti meg. A Retry s Cancel gombokat jelenti meg.
Mivel a Gombok paramter felsorol tpus, a Visual C# egy IntelliSense lenyl listval segti a kvnt rtk kivlasztst, teht nem kell gytmnk magunkat a tblzat bemagolsval, hiszen a gyakrabban hasznlt rtkeket gyis megjegyezzk majd. Az Ikon paramterrel az zenetablakban feltntetett jelr61 dnthetnk. Itt ismt egy felsorol tpus, a MessageBoxlcon rtkei kzl kell vlasztanunk, amelyeket a 17.2. tblzatmutat be.
rtk
Exclamation Info rmation None Question Stop Warning
Lers Egy felkiltjelet jelent meg egy hromszg belsejben, srga httrrel. Egy kis i betit jelert meg egy kr belsejben. Nem jelert meg semmilyen jelet. Egy krd6jelet jelert meg egy kr belsejben. Egy fehr x-et jelert meg egy kr belsejben, vrs httrrel. Egy felkiltjelet jelent meg egy hromszg belsejben, srga httrrel.
Az Ikon paramter szintn felsorol tpus, gy a paramter rtknek kivlasztsnl segt az IntelliSense lenyl listja. A 17.2. brn lthat zenetablakot az albbi kddal hoztuk ltre:
MessageBox. Show("I'm about to do s omet hing ... " , "MessageBox sample ", M ess ageBoxButtons .OKCancel ,MessageBoxicon . Informa t i on) ;
~~,~-"-1
-----
fm obout to do somdhng-
17.2. bra
Az Information ikont ltalnos zeneteknl rdemes hasznlnunk
A 17.3. brn lthat zenetablakot az el6z6vel szinte megegyez6 kddal hoztuk ltre, azzal a klnbsggel, hogy ezttal a msodik gombot jelltk meg alaprtelmezenknt vagyis ha a felhasznl leti az ENTER-t, a program gy veszi, mintha erre a gombra kattintott volna. Az alaprtelmezett gomb kivlasztsnl nyilvnval okokbl klns krltekintssel kell eljrnunk Tegyk fel, hogy az alkalmazsunk valami olyat kszl tenni, ami valsznleg nem tetszik majd a felhasznlnak. Ilyenkor rdemes a Cancel gombot megjellnnk alaprtelmezenknt, hogy felkszljnk arra az eshet6sgre, ha a felhasznl keze gyorsabb a kelletnl. Lssuk ht a 17.3. bra zenetablaknak kdjt:
MessageBox. Show( "I ' m about t o do s omething irreversible ... ", "MessageBox sample" , M e ssageBoxButtons . OKCancel,Me ssageBox icon . Information , MessageBoxDefaultButton . Button 2) ;
17. ra
a felhasznlkkal 353
17.3. bra
Az alaprtelmezett gomb s6tt szeglyt s mykolst kap
A 17.4. brn lthat, hibt jelz Error ikont a ritkn bekvetkez slyos helyz~lek jelzsre rdemes hasznlnunk - pldul kivtelek esetn. Ha tl sokszor jelerutjk meg, olyan, mintha farkast k:iltannk: amikor vgl valban komoly gond addik, a felhasznl j esllyel elsiklik felette. Vegyk szre, hogy itt mindssze egy OK gombot lthatunk. Ha mr megtrtnt a baj, s a felhasznl semmit sem tehet, felesleges a Cancel gombbal sszezavarnunk A 17.4. brn lthat zenetablakot az albbi kd jelenti meg:
MessageBox.Show("Something bad has happenedt ","MessageBox sample ", MessageBoxButtons.OK, M essageBoxicon.Error);
Ol(
17.4. bra
Ha a felhasznlnak nincs befolysa az esemnyekre, a Cancel gomb felesleges
A 17.4. bra zenetablakban egy krdst tesZnk fel a felhasznlnak, gy a Question ikon ppen megfelel a cljainknak A program a nemleges vlaszt valsznsti , gy a msodik gomb az alaprtelmezett. A kvetkezkben megtanuljuk, hogyan llaptsuk meg, hogy melyik gombra kattintott a felhasznl. Most azonban lssuk a 17.5. bra zenetablaknak kdjt:
MessageBox.Show("Would you like to forrna t your hard drive now?" , "MessageBox sample ",MessageBoxButtons .YesNo,MessageBoxrcon.Questlon, MessageBoxDefaultButton.Button2);
1'11
Wauld you
Amint az elzekben lthattuk, a gombok s az ikonok megjelentse nem klnsebben nehz. Az igazi feladat annak eldntse, hogy mely gombokat s ikonokat hasznljuk az adott helyzetben.
Lers A visszatrsi rtk Abort, ami tbbnyire egy Abort felirat gomb megnyomsra utal. cancel A visszatrsi rtk Cancel , ami tbbnyire egy Cancel felirat gomb megnyomsra utal. I gnore A visszatrsi rtk Ignore, ami tbbnyire egy Ignore felirat gomb megnyomsra utal. No A visszatrsi rtk N o, ami tbbnyire egy No felirat gomb megnyomsra utal. None Semmilyen rtket nem kapunk vissza - a modlis prbeszdablak folytatja a futst. OK A visszatrsi rtk OK, ami tbbnyire egy OK felirat gomb megnyomsra utal. Ret ry A visszatrsi rtk Retry, ami tbbnyire egyRetry felirat gomb megnyomsra utal. Yes A visszatrsi rtk Yes, ami tbbnyire egy Yes felirat gomb megnyomsra utal.
Fontos hangslyoznunk a lersokban szerepl ,.tbbnyire" szt, ugyanis a sajt prbeszdablakainkban (amelyek ltrehozsrl mg ezen az rn szt ejtnk) tetszl eges gombhoz hozzrendelhetjk a Dial ogResult brmely rtkt
rtk liliort
Ahhoz, hogy a megnyomott gomb alapjn klnfle mveleteket vgezznk, mindssze a dntshozatali utastsok hasznlatra van szksg, valahogy gy:
if (MessageBox. Show ( "W ould you like to do X? , "M ess ageBox sample", MessageBoxBut t ons . Ye sNo , M e ssage Boxi con. Quest ion ) == DialogResult. Yes )
ll
Ide ke r l az X
m~velet
kd ja
AM es sageBox. Show ( ) hasznlata igen egyszer, s- amint lthattuk- jelentsen gazdagthatja az alkalmazsaink fellett
17. 6ra.
a felhasznlkkal 355
(Projekt, Windows-ablak hozzadsa) menponttal szrjunk be egy j ablakot a programba, s mentsk CustomDialogBoxForm . cs nven. 4. Legyen az j ablak Text tulajdonsgnak rtke Thi s is a custom dialog box (Ez egy egyni prbeszdablak), a FormBorderStyle tulajdonsgnak pedig adjuk a FixedDialog rtket. 5. Helyezznk el egy szvegmezt az ablakon, s lltsuk be a tulajdonsgait az albbiak szerint:
Tulajdonsg
Name Location Multiline ReadOnly Size Text
rtk txtCustomMessage
8, 8
True True
268 , 220
Ahhoz, hogy az egyni prbeszdablakunk az zenetablakokhoz hasonlan viselkedjen, ki kell jellnnk rajta azokat a gombokat, amelyek a prbeszdablak eredmnyt adjk vissza. Erre szolgl a gombok DialogResult tulajdonsga, amelyet a 17.6. brn figyelhetnk meg. 6. Helyezznk el egy j gombot az ablakon, a tulajdonsgait pedig lltsuk be az albbi tblzatnak megfelelen. Ez lesz a prbeszdablakunk Cancel gombja.
17. ra
felhasznt6kkal 357
7. Szksgnk lesz egy OK gombra is, ezrt szrjunk be egy jabb gombot az albbi tulajdonsgo kkal: Tulajdonsg Name
DialogResult Location Size Text
rtk btnOK OK
120 ' 234 75 , 23
OK
A visszatrsi rtkek megadsa azonban csak az els lps az egyni prbeszdablak letre keltsben. Ahhoz, hogy valban hasznlhassuk, gondoskodnunk kell a megjelentsrl is. Az 5. rn megtanultuk, hogy az ablakokat az ket tartalmaz objektumvltoz Show () tagfggvnynek meghvsval jelenthetjk meg. Ms a helyzet azonban, ha egy ablakot prbeszdablakknt szeretnnk hasznlni: ez esetben a ShowDialog () tagfggvnyt kell vlasztanunk. Uyenkor a kvetkezk trtnnek:
Az ablak mddal rendelkez ablakknt jelenik meg. Ha a felhasznl valamelyik olyan gombra kattint, amelyet a DialogResult tulajdonsgval rtk visszaadsra jelltnk ki, a prbeszdablak azonnal be:zrdik, s az rtk megjelenik a ShowDialog () tagfggvny eredmnyeknt.
Vegyk szre, hogy az ablak bezrshoz semmifle kdot nem kell rnunk; az eredmnyt ad gombra kattintva ez automatikusan megtrtnik. Mindez jelentsen leegyszetiisti az egyni prbeszdablakok ksztst. 8. A Solution Explorerben a M ainForm.cs fjlnvre dupln kattintva trjnk vissza az els ablakhoz az ablaktervezben. 9. Kattintsunk dupln a korbban ltrehozott gombra, s rjuk be az albbi kdot:
CustomDialogBoxForm frmCustomDialogBox =new CustomDialogBoxForm(); if (frmCustomDialogBox.ShowD]alog() == DiaJogResult.OK) MessageBox . Show ("You cl i c ked OK. ") ; else MessageBox.Show("You clicked CarLcel. " l; frmCustomDialogBox = null;
szrevettk, hogy a ShowDialog () tagfggvny, majd az egyenlsgjel s aszkz bersa utn az lntelliSense lenyl listban megjelentek a lehetsges eredmnyek? Ezeket rendelhetjk ugyanis a gomb DialogResult tulajdonsghoz. FutLassuk a projektet az F5 billentyvel, s kattintsunk a gombra az egyni prbeszdablak megjelentshez (lsd a 17.7.brt), majd itt nyomjuk meg valamelyik gombot. Ha elgedettek vagyunk az eredmnnyel, lltsuk le a program futst, s mentsk a munknkat.
17.7. bra
A ShowDialogO tagfggvnnyel egyni prbeszcklblakokat jelenthetnk meg
Ha az ablak jobb fels sarkban lthat bezr gombra (X) kattintunk, az ablak bezrdik, s a kd gy viselkedik, mintha a Cancel gombra kattintottunk volna, hiszen ilyenkor az else blokk lp letbe.
Az egyni prbeszdablakok ltrehozsnak l ehetsge nagy segtsg lehet. AMessageBox. Show () tagfggvny az esetek tlnyom tbbsgben jl hasznlhat, de ha nagyobb befolyst szeretnnk az zenetablak megjelense s tartalma felett, az egyni prbeszdablakok jelenthetik a megoldst.
A billentyfizet kezelse
Jllehet szinte minden vezrl kpes kezelni a billentyzetrl rkez bemenetel, mgis addhatnak olyan helyzetek, ahol magunk szecetnnk kzbe venni az irnytst. SZksgnk lehet pldul arra, hogy valamilyen mveletet vgeZZnk, amikor a felhasznl lenyom vagy felenged egy billentyt. A legtbb vezrl hromfle billentyzethez kt6d esemnyt tmogat, amelyeket a 17.4. tblzatban mutatunk be.
K eyPress
K eyUp
Lers Akkor kvetkezik be, ha a felhasznl lenyom egy billentyt, mikzben az adott vezrl fkuszban van. Akkor kvetkezik be, ha a felhasznl lenyom egy billentyt, mikzben az adott vezrl fkuszban van. Ha folyamatosan nyomva tartja a billentyt, az esemny tbbszr egyms utn bekvetkezik. Akkor kvetkezik be, ha a felhasznl felenged egy billentyt, mikzben az adott vezrl fkuszban van.
kedvrt tegyk fel , hogy a felhasznl lenyom egy billentyt, mikzben egy szvegmez van fkuszban. A httrben a kvetkezk trtnnek:
17.6ra
a felhasznlkkal 359
1. Amikor a felhasznl lenyomja a billentyt, bekvetkezik a KeyDown esemny. 2. Miutn a billentyO' lenyomsa megtrtnt, a KeyPress esemny is bekvetkezik, s mindaddig ismtldik, amg a felhasznl lenyomva tartja a billentyO't. 3. Amikor a felhasznl vgl felengedi a billentyO't, bekvetkezik a KeyUp esemny, zrva a sort.
A kvetkezkben a billentyO'letsek kezelsnek bemutatsra hozunk ltre egy projektet. A felleten egyetlen szvegmezt helyeznk el, amelynek az a klnlegessge, hogy nem hajland fogadni a k beta:ket. Hozzunk is ltre egy Keyboard Ex ample nev Windows Application projektet, s tegyk a kvetkezket:
1. Kattintsunk az egr jobb gombjval a Form l . cs fjlnvre a Solution
Explorerben, vlasszuk a helyi men Rename pontjt, s adjuk az ablaknak a KeyboardExampleForm. cs nevet, a Text tulajdonsgnak pedig a Keyboard Bxample rtket. 2. Helyezznk el egy j szvegmezt az ablakon, a tulajdonsgait pedig lltsuk be az albbiak szerint:
Tulajdonsg
Name
Location Multiline
Size
235, 120
3. Az albbiakban elhelyeZnk nmi kdot a szvegmez KeyPress esemnyben, hogy ,.megegykn a k betket jelljk ki a szvegmezt az ablakon, s kattintsunk a Properties (Thlajdonsgok) ablak Events (Esemnyek) gombjra, gy hozzjutunk az esemnyeihez.
r.~roo-rdrXU()"lo!'.T:2-ra
: PO:nl
l
pablte K~~Jrom U l XDl.allacec.aoaot. ( ~
17.8. bra
p:rlYat~
Yoid
trtlllP\I~_Il4:yPceu (obj.-ct.
endx,
~vhus.EY~r..Ul'o
a)
l:lillentyzetrl
rkez bemenetet
eljrs ltrehozshoz. Ha mindent jl vgeztnk, a kdszerkeszt tartalma a 17.8. brnak megfelelen alakul. Amint azt a 4. rn megtanultuk, az e paramter az esemny bekvetkeztrill tartalmaz adatokat. A billentyzethez ktd esemnyeknl itt talljuk a lenyomott billenty adatait - neknk pedig ppen erre van sruksgnk. Magt a lenyomott billentyt az e paramter KeyCha r tulajdonsga adja meg. A kvetkezkben megrand kdunk azzal az esettel fog foglalkozni, amikor a lenyomott billenty a k. Helyezzk el az albbi kdot a KeyPress esemnyben.
if (e.KeyChar == ' k 'l e . Handl ed = Lrue ;
Fontos, hogy aposztrfokat (egyszeres idzjeleket), ne pedig sima (ktszeres) idzjeleket rjunk ak bet kr, ugyanis most karakterrl (char l. nem pedig egyelem karaktertncrl (s tring) van sz.
Bizonyra felkeltette az rdekldsnket az e objektum Handled tulajdonsga. Ha ennek rtkt true-ra lltjuk, tudatjuk a rendszerrel, hogy magunk kezeltk a billentyl!letst, vagyis hagyja figyelmen kvl (gy teht a megfelel beta nem kerl a szvegmezbe). A program kiprblshoz nyomjuk le az F5 billentyt, majd rjuk be a kvetkez sort a szvegmezbe:
Heard any good jokes l atel y?
A vgeredmny a 17.9. brn lthat. Vegyk szre, hogy a program nmegette" a kbett.
17.9. bra
A billerztyzet esemnyei khetv teszik, hogy kedvnk szerlnt kezeljk a bilkntyletseket
17. ra
a felhasznlkkal 361
Prbljunk berni egy jabb k bett - nem fog menni. Ez utn prblkozzunk a nagy K betvel. A nagy K megjelenik a szvegmezben, ugyanis a Visual C#-ban a kis- s nagybetk klnbz6 karaktereknek szmtanak. Ha a kis s nagy k betket egyarnt el szecetnnk fogni, knnyen clt rhetnk, csak helyezznk el egy VAGY (l 1) m11veletet a dntsi szerkezetben:
if (e .KeyChar == 'k' l l e .KeyChar == 'K')
e .Handled = true ;
-~
Ha a Vglaprl illesztnk be adatokat a szvegmezbe, a KeyPress esemny nem kvetkezik be minden karakternl, kvetkezskppen a k megjelenhet az eredmnyben. Ha mindenkppen meg szeretnnk szabadulni a k betktl, szksgnk lesz a TextChanged esemnyre is.
Meglehetsen ritkn van szksg arra, hogy elfogjuk a billentyletseket, de olykor mgiscsak elfordul. A 17 .4. tblzatban felsorolt esemnyek ismeretben mindez nem okozhat komolyabb gondot. Egyetlen dologra kell nmikpp odafigyelnnk - arra, hogy melyik esemnyt vlasztjuk (egyarnt lehetnek rveink pldul a KeyPress vagy a K eyup mellett). rdemes a leginkbb logikusnak tartott vlasztssal kezdennk, tesztelni a kdot, s vltoztatni, ha a dolgok nem mkdnek megfelele n.
Egresemnyek kezelse
A legtbb vezrl a billentyzethez hasonlan az egrbemenetet is kpes kezelni, de ha a beptett eljrsoknl tbbre van szksgnk, kzvetlenl is hozzfrhetnk az egresemnyekhez, amelyeket a 17 .5. tblzatban, a bekvetkezsk sorrendjben soroltunk feL
Esemny neve lers MouseEnter Akkor kvetkezik be, amikor az egrmutat belp egy vezrl terletre. ouseMove Akkor kvetkezik be, amikor az egrmutat elmozdul egy vezrl M felett. M ouseH over Akkor kvetkezik be, amikor az egrmutat ll egy vezrl felett. MouseDown Akkor kvetkezik be, amikor az egrmutat egy vezrl felett tartzkodik, s a felhasznl lenyom egy egrgombot MouseUp Akkor kvetkezik be, amikor az egrmutat egy vezrl felett tartzkodik, s a felhasznl felenged egy egrgombot
17. ra
Osztlyunk kdjamost a 17.10. brn lthatak szerint alakul.
a felhasznlkkal 363
17.10. bra
Gyakran megesik, hogy tbb, klnjle helyen tallhat kd egyttmkdse srksges
egy cl elrshez
Vgezetl meg kell rnunk a rajzolshoz szksges kdot, mghozz a MouseMove esemnyben. Mindenekeltt meggyz6dnk arrl, hogy a felhasznl lenyorota a bal egrgombot. Ha nem, eltekintnk a rajzolstL Ez utn az egrmutat koordinti alapjn ltrehozunk egy apr ngyszget, amelyet a grafikus objektum DrawEllipse (} tagfggvnynek adunk t. Vgeredmnyben egy apr krt kapunk az egrmutat aktulis helye krl. 5. Trjnk vissza a MainForm.cs [Design) laphoz, nyissuk meg a Properties ablak esemnylistjt, s kattintsunk dupln a MouseMove elemre az j esemnyeljrs ltrehozshoz. Helyezzk el benne az albbi kdot:
Rec tangle rectEllipse if (e . Button
!=
= new
Rec tangle() ;
MouseButtons.Left) return;
rectEllipse .X = e .X - l; rectEllipse . Y = e.Y - l; rec tEllipse .Width = 2; rectEllipse.Height = 2; m_objGraphics.DrawEllipse(Systern. Drawing.Pens . Blue, rectEllipse};
.. ............. ~ ( ) .. \ \ J l
..
...............,-~~
"--"" l
knl
Vegyk szre, hogy minl gyorsabban mozgatjuk az egeret, annl nagyobb trkzk maradnak a krk kztt. Ez azt mutatja, hogy a felhasznl gyorsabban mozgathatja az egeret a MouseMove esemny reakciidejnl, vagyis nem minden egrmozdulatot tudunk elfogni -ezt fontos, hogy megjegyezZk.
sszefoglals
Az ablakok s a
vezrlk nmagukban is igen rugalmas felletet biztostanak az alkalmazsaink szmra, de amint lthattuk, ennl tovbb is mehetnk. Ezen az rn megtanulessageBox . Show () fggvnnyel, tuk, hogy miknt hozhatunk ltre zenetablakokat a M amelyeken a szveg mellett egy ikont s akr tbb gombot is elhelyezhetnk, st ez utbbiak egyikt alaprtelmezenknt is kijellhetjk. Kaptunk nmi tmutatst arra nzve is, hogyan fogalmazzuk meg az zeneteinket Mindezeket rdemes j mlyen elraktrozni a memrinkban, hiszen zenetablakok hasznlatra lpten-nyomon szksgnk lesz.
az egr esemnyeit. Erre olyankor lehet szksg, amikor egy vezrl ezen a tren mutatott kpessgei kevsnek bizonyulnak a cljaink elrshez. A lertakat elsajttva kpesek lesznk meghaladni a vezrlk eredeti lehetsgeit, gy szmotteven gazdagabb tehetjk a felhasznli lmnyt.
17. ra
a felhasznlkkal 365
Krdezz-felelek
K: Elfoghaljuk a billentykombincikat a vezrlk helyett az ablak szinljn is? V: Igen, de ahhoz, hogy az ablak billentyzethez ktd esemnyei bekvetkezzcnek, amikor valamelyik vezrln van a fkusz, az ablak KeyPreview tulajdons-
gnak a true rtket kell adnunk. Radsul a vezrl megfelel esemnye gy is bekvetkezik, hacsak a KeyPress esemnyben nem adjuk a KeyPressEventArgs. Handled tulajdonsgnak a true rtket. K: A k6nyvben szmos olyan MessageBox.ShowO fggvnyhvs szerepel, amelyben nincs jelen a Gombok paramter. Mi ennek az oka? V: Ha magunk nem jellnk ki kifejezetten gombot vagy gombokat, a Visual C# egyetlen OK gombot jelent meg, ezrt ha csak erre van szksgnk, teljesen felesleges ezt egy paramterrel jeleznnk
Ismtls
Ez a rsz az anyaggal kapcsolaros krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
l. Milyen paramtert kell felttlenl megadnunk aMessageBox. Show () meghvsa kor? 2. Mi jelenik meg az zenetablak cmsorban, ha nem adjuk meg aMessageBox. Show() fggvny Cmfel irat paramtert? 3. Hny ikont jelenthetnk meg egyszerre egy zenetablakban? 4. Melyik esemny kvetkezik be elbb: a Keyup vagy a KeyPress? 5. Hogyan hatrozhatjuk meg egy egresemnyben, hogy melyik gombra kattintott a felhasznl?
Vlaszok
l. Az zenet szvegt s a cmfeliratot Az utbbi elvileg elhagyhat, de nem igazn tartom j tletnek. 2. Semmi; a cmsor res marad. 3. Egyszerre csak egy ikont jelenthetnk meg. 4. A KeyPress esemny a KeyUp eltt kvetkezik be. 5. Az esemnyben az e. Button tulajdonsgot kell megvizsglnunk.
Gyakor1atok
1. Mdostsuk az egyni prbeszdablakot bemutat pldnkat gy, hogy az OK
az ablak elfogad (Accept) gombja legyen, gy a felhasznl az ENTER lenyomsval bezrhatja az ablakot. A kvetkez lpsben nevezzk ki a Cancel gombot az ablak hivatalos Cancel gombjv, gy az ablak mr az Esc billentyavel is el hagyhat. 2. rjuk t a Mouse Paint projektet gy, hogy mindannyiszor trlje az ablak fellett, amikor a felhasznl rajzolni kezd. (Tipp: tltsk ki a grafikus objektumot a MouseDown esemnyben az ablak BackColor tulajdonsgban megadott sznnel.)
18. RA
Grafikus
A lecke tartalmbl:
lehetsgek
A Graphics objektum Tollak hasznlata Rendszersznek hasznlata Ngyszgek rajzolsa Alakzatok rajzolsa Szveg rajzolsa Megmarad grafikk az ablakokon
A Visual C# rendkvl gazdag grafikus lehetsgekkel rendelkezik, az alkalmazsuk azonban korntsem egyszeru. Nem gy van az, hogy csak lelnk a gp el, lapozgatjuk kicsit a sgt, aztn egyszer csak rajzolni kezdnk- de ha elsajttunk nhny alapszablyt, ltjuk majd, hogy a rajzols nem is olyan bonyolult. Ezen az rn megismerkednk azokkal az alapvet tudnivalkkal, amelyek lehetv teszik, hogy egy ablakra vagy ms grafikus felletre rajzoljunk. Megtanuljuk a tollak, a sznek s az ecsetek hasznlatt (ezekkel az objektumokkal hatrozhatjuk meg, hogy valjban rnit is akarunk rajzolni), emellett pedig megtudjuk azt is, hogyan rizhetnk meg egy graftkt az ablakon, s6t olyan bitkpeket is ksztnk, amelyek kizrlag a memriban vannak jelen.
A Graphics objektum
Els pillanatban azt gondolhatnnk, hogy nincs is igazn szksg arra, hogy magunk rajzoljunk a kpernyre, hiszen annyi nagyszera vezrl ll rendelkezsre a Visual C#-ban a fellet felptsre. Ahogy azonban az alkalmazsaink egyre kiterjedtebbek s sszetettebbek lesznek, mind tbb s tbb olyan helyzettel tallkozunk, amikor igencsak jl jnne, ha magunk rajzolhatnnk a fellet egyes elemeit a kpernyre. llyenkor pedig ltalban nincs ms megolds: neklink kell gondoskodnunk a grafikrl. Akr gy is hatrozhatunk, hogy a vezrlket is magunk rajzoljuk meg (a Visual C#-ban ezt is megtehetjk). Ezen az rn elsajttjuk azokat az alapismereteket, amelyek elengedhetetlenek ahhoz, hogy kzvedenl a kpernyre rajzoljunk, illetve rjunk. A tananyag egyszerGnek tnik majd, de az alapjn rszletekig menen kidolgozott felleteket kszthetnk, a melyek pontosan gy festenek, ahogy elkpzeltk
Azt a kdrszt, amely a Windows opercis rendszerben a kpernyre rajzolsrt felel legyen sz6 szvegrl vagy alakzatrl - , grafikus eszk6zjelletnek (Gr-.tphical Device Interface, GDI) nevezik. A GDI fogadja az sszes alkalmazstl s magtl a rendszertl rkez rajzoJsi utastsokat, majd az eredmnyt megjelenti a kpernyn. Mivel a kperny tartalmnak megjelentse teljes egszben a GDI feladata, neki kell bajldnia a kpernymeghajtval s belltsaival, gy pldul a sznmlysggel s a felbontssal. Mindez azt is jelenti, hogy az alkalmazsoknak (s a fejlesztiknek) nem kell foglalkozniuk ezekkel a rszletekkel: elg, ha megadjk, hogy mit jelentsen meg a GDI, s az majd gondoskodik a httrmveletekrl. Ez pedig nem ms, mint az eszkzfggetlensg, hiszen az alkalmazsok csak a GDI-vellpnek kapcsolatba, s az ehhez szksges kd teljesen fggetlen az alkalmazott megjelenteszkztl. Visual C# kdban javarszt a Graphics objektumon keresztl rhetjk el a GDI-t. Ezt az albbiak szerint tehetjk meg: Ltrehozunk egy objektumvltozt, amely majd egy Graphics objektum hivatkozst tartalmazza. Elhelyeznk ebben az objektumvltozban egy (j vagy mr ltez6) Graphics objektumot. A rajzolshoz, illetve a kpernyre rshoz meghvjuk a fenti Graphics objektum tagfggvnyeit
18. 6ra Grafikus A CreateGraphics {) meghvsvaJ az objektumvltozban egy olyan Graphics objektum hivatkozsr helyezZk el, amely a szban forg ablak, illetve vezrl gyflterletre kpes rajzolni. Az gyflterlet az ablakok esetben az ablak kerete s cmsora llal hatrolt sZrke terletet jelenti, mg a vezrlknl rendszerint a teljes felletre kiterjed. A Graphics objektumon vgzett grafikus mveletek eredmnye kzvetlenl erre az gyflterletre kerl. A fenti kdban szerepl Graphics objektum egy szvegmez gyflterlethez tartozik, gy az objektum grafikus mveletei itt fejtik ki a hatsukat.
Ha kzvetlenl egy ablakra vagy vezrtre rajzolunk, az eredmny nem lesz maradand. Ha ugyanis valami - pldul egy msik ablak - eltakarja, vagy lekicsinytik, a legkzelebbi megjelentsekor ismt res fellettel jelenik meg. A ksbbiekben megtanuljuk, hogyan tegyk maradandv a grafikinkat.
369
A szlessg s a magassg paramter jelentse pontosan az, amire gondolunk: a bitkp szlessge s magassga. A kppontformtum azonban mr nem ennyire magtl rtetd . Ezzel a paramterrel hatrozhatjuk meg a bitkp sznmlysgt, s itt adhatjuk meg az esetleges alfa csatornt is (ezzel ttetszv tehetjk a kp egyes rszeit). A 18.1. brn a kppontformtum paramter gyakrabban hasznlatos rtkeit mutatjuk be. (A teljes listt rszletes lersokkal a Visual C# sgjban tallhatjuk meg.)
rtk Lers
Format16bppGrayscale Kppontonknt 16 bites rnyalatterjedelem, vagyis 65 536 Format16bppRgb555
Format2 4bppRgb
szrkernyalattal gazdlkodhatunk. A rendszer ezttal is 16 bitet trol kppontonknt, itt azonban 32 768 sznrnyaJattaJ gazdlkodhatunk, vagyis a vrs, a zld s a kk sznsszetevk egyarnt 5 bitet kapnak. 24 bites sznmlysg, 16 777 216 sznrnyalattaJ, szncsatornnknt 8 biten brzolva.
370
hogy az objMyBitMap vltozt korbban mr meghatroztuk): objMyBitMap = new Bitmap(640, 480, System .Drawing . Imaging . PixelFormat.Format24bppRgb); Ezt kvet6en ltrehozhatunk egy Graphi cs objektumot, s a Fromimage () tagfggvnyvel csatolhatjuk hozz ezt a bitkpet: objGraphics
~
Graphics.Fromimage(objMyBitMap);
Ettl fogva brmit rajzolunk vagy runk ki az objGraphics objektummal, az eredmny a memriban trolt bitkpbe kerL Ahhoz azonban, hogy ezt a bitkpet a felhasznl is megcsodlhassa, t kell adnunk egy ablaknak vagy vezrlnek Ennek mdjrl a ksb biekben mg szt ejtnk a Grafikus tartalom megrzse az ablakokon cmsznl.
meg a Dispos e () tagfggvnyt, hogy felszabadtsuk az ltala lefoglalt erforrsokat Fontos tudnunk, hogy az objektumvltozk megsemmistshez nem elg, hogy a program kilpjen a hatkrkb6L Radsul a Graphics objektumok klnskppen erforrsignyesek, gy ha vgeztnk egy grafikai lehetsgekhez ktd objektum (tolJ vagy ms hasonl) hasznlatval, felttlenl hvjuk meg a Dispos e ( ) tagfggvnyt A Visual C# mindemellett biztost egy m6dszert az erforrsok automatikus felszabadtsra is, mghozz a us ing utasts rvn. Hasznlatval a helyben meghatrozott objektum ltt egy kdblokkra korltozhatjuk, gy a rendszer a blokk vgrehajtsa utn automatikusan felszabadtja a megfelel erforr"<lSOkat. Lssuk, nknt is alkalmazhatjuk a using utastst: using (kifejezs l tipus azonosit
{
= kezd6rtk)
ll
Vgrehajtand utastsok
new MyClass())
objClass .Methodl() ; objClass .Method2(); Fontos hangslyoznunk, hogy ausing utasts egy kdblokkon bell burkolknt viselkedik, gy csak olyan objektumok esetben hasznlhat, amelyeknek a hatkre s felhasznlsa egy tagfggvny belsejre korltozdik (a hatkrr61 bvebben a l L rn szltunk}
18. ra Grafikus
Knyvnk korbbi rszben megtanultuk, miknt vegynk hasznlatba egy nvteret -amilyen pldul a System . Diagnostics- a u sing segftsgvel. Itt a kulcssz szerepe egszen ms, vagyis tbb clra is felhasznlhatjuk.
Tollak hasznlata
A toll olyan objektum, amellyel egy vonal jellemzit hatrozhatjuk meg, pldul megadhatjuk a vonal sz'nt, vastagsgt s stlust (folytonos, szaggaton stb.). A tollak
szerepnek fontossgt mindennl jobban mutatja, hogy a kvetkez61cben bemutatott rajzol tagfggvnyek csaknem mindegyiknl szksgnk lesz rjuk. A Visual C# szmos elre meghatrozott tollal rendelkezik, de magunk is ltrehozhatunk jakat az albbi utastsformt kvetve:
tollvlLoz = new Pen(szin. vastagsg) ;
rtk
Das h DashDot DashDotDot Do t Solid Custom
Lers Szaggatott vonalat rajzol. Pontokbl s szakaszokbl ll vonalat rajzol. Kt pont - egy szakasz tpus vonalat rajzol. Pontokbl ll vonalat rajzol. Folytonos vonalat rajzol. Ezzel a belltssal egyni stlus vonalat hatrozhatunk meg, amelynek a jellemz6it a Pen objektum egyb tulajdonsgaival adhatjuk meg.
A DashStyle felsorol tpus a Drawi ng. Drawing 2o nvtr rsze, ezrt ha egy olyan j tollat szeretnnk ltrehozni, amely sttkk pontozott vonalat hz, a kvetkezket rhatjuk:
Pen objMyPen =new Pen(System . Drawing .Color . DarkBlue , 3) ; objMyPen .DashStyle = System . Drawing .Drawing2D . DashStyle.Dot ;
Amennyiben a System . Drawing nvteret a using kulcsszval vettk hasznlatba, nincs szksg teljesen minstett nevek megadsra.
A msodik paramterben tadott 3 rtk a vonal kppontban mrt vastagsgt adja meg.
A hamarosan bemutatott rajzolsi mdszerek hasznlatakor kedvnk szerint vlaszthatunk sajt vagy a rendszer ltal meghatrozott tollat.
Rendszersznek hasznlata
Bizonyra elfordult mr, hogy megvltoztattuk a Windows tmjt vagy ppen az Asztal httrsznt vagy httrkpt, arrl azonban mr kevesebben tudnak, hogy a Windows szinte minden felleti elemnek meghatrozhatjuk a sznt. Azokat a szneket, amelyeknl erre lehetsgnk van, rendszerszneknek hvjk. A rendszersznek megvltoztatshoz kattintsunk az egr jobb gombjval az Asztalra, s vlasszuk a helyi men Personalize (Testreszabs) pontjt, .gy a kperny s a hangok testreszabsra szolgl Personalize Appearance and Sounds lapra jutunk. Kattintsunk a Window Color and Appearance (Ablakok szne s megjelense) hivatkozsra az Appearance Settings (Megjelensi belltsok) prbeszdablak megjelerutshez, majd on kattintsunk az Advanced (Spedlis) gornbra. Vgl az Advanced Appearance prbeszdabiakba jutunk (lsd a 18.1. brt). In kattintsunk arra az elemre, amelyet mdostani szeretnnk, majd alul vlasszuk ki a kvnt sznt. (Amennyiben nem Windows Vistt hasznlunk, a prbeszdablak s elrsj tja nmikpp eltrhet az ismertelettl, illetve az brn lthattl.)
llen:
lemM#M!;Ji':~"lC .:
Sit'
eGer 1: cdor Z;
rii:il 0
18.1. bra
Az Advanced Appearance prbeszdablakban a Windows legt6bb felleti elemnek a sznl megvltoztathatjuk
Mihelyt megvltoztatunk az Advanced Appearance prbeszdablakban egy sznt, az sszes betlttt alkalmazs igazodik az j krlmnyekhez- nem klnben azok, amelyeket a ksbbiekben tltnk be. Nos, ha mindehhez neknk kellene megrni
373
18.2. bra
A rendszerszfneket a System palettn
vlaszthatjuk ki
Lers
Az aktv cmsor szne.
Az aktv cmsor betszne.
A gombok s ms trhats elemek httrszne. A trhats elemek rnyknak szne. A trhats elemek cscsfnynek szne. A gomboks ms trhats elemek ben1szne. A Windows Asztal szine.
rtk
GrayText Highlight HighlightText Inac t iveBorder InactiveCapt ion InactivecaptionText Menu MenuText Window
A kiemeit szvegek httrszne. Egyarnt vonatkozik a kijellt szvegrszletekre s a kivlasztott menpontokra. A kiemeit szvegek betszne. Egyarnt vonatkozik a kijellt szvegrszletekre s a kivlasztott menpontokra. Az inaktv ablakok keretnek szne. Az inaktv ablakok cmsornak httrszne. Az inaktv ablakok cmsornak betszne. A menk httrszne. A menk betszne. Az ablakok gyflterletnek httrszme.
Amikor a felhasznl az Advanced Appearance prbeszdablakban megvltoztat egy rendszersznt, a Visual C# automatikusan mdost minden olyan objektumot, amelyen ez a szn megjelenik. Mindehhez egyetlen sornyi kdot sem kell rnunk. Szerencsre a Visual C# automatikusan alkalmas rendszerszneket rendel a megfelel tulajdonsgokhoz, gy ltalban ezekkel sem kell foglalkoznunk. rdemes tudnunk, hogy a rendszerszneket nem csak azokhoz a tulajdonsgokhoz rendelhetjk hozz, amelyeknl az elemi logika ezt megkvnja. Tetszleges szntulajdonsgnl vlaszthatunk kzlk, gy rajzolhatunk is a rendszersznekkel, kvetkezskppen magunk is kszthetnk olyan felleti elemeket, amelyek igazodnak a felhasznl sznbelltsaihoz. Ez esetben azonban nem szabad megfeledkeznnk arrl, hogy a Visual C# nem frissti automatikusan a felletet, ha a felhasznl megvltoztatja a rendszersznek belltsait. Ahhoz, hogy rzkelhet legyen a hats, jra fel kell rajzolnunk a felletet. Radsul, ha olyan tulajdonsgokhoz rendelnk rendszerszneket, amelyeknl ez nem megszokott, el6fordulhat, hogy a felhasznl belltsaitl fggen meglep szmsszelltst kapunk (mondjuk fekett a feketn).
A felhasznlk rendszerint nem ri jkedvkben vltoztatjk meg a rendszerszneket. J plda erre egyik programoz munkatrsam, aki szntveszt, ezrt gy lltotta ssze a rendszerszneket, hogy a lehet legjobban lssa a kperny tartalmt Ha nem hagyjuk, hogy a programunk alkalmazkodjon a felhasznli sznbelltsokhoz, elfordulhat, hogy nehzz, esetleg lehetetlenn tesszk a hasznlatt a szntvesztk vagy ms ltsi nehzsgekkel kszkdk szmra.
375
A tglalapok kezelse
Mieltt
hozzkezdennk az alakzatok rctjzolshoz, meg kell rtennk a tglalapok szerept a Visual C# grnflkus rendszerben. A tglalap itt tbb egyszerii skidomnl - olyan adatszerkezet, amely az alakzatok rajzolshoz szksges hatrkoordintkat tartalmazza, vagyis a tglalapot nem csak egyszerii tglalapok rajzolsrn hasznlhatjuk A ngyzet termszetesen begyazhat egy tglalapba, de a kr s az ellipszis is Osd a 18.3. brt).
Ngyzet Tglalap
KOr
EUipszis
18.3. bra
A tglalapok segtsgvel a legtbb alakzat hatrait lerhatjuk
A legtbb alakzat felrajzolshoz a Visual C#-ban mindenekeltt egy tglalap megadsrn van szksg- arra, amelyet hatrol tglalapknt tadhatunk a rnjzolsrt felels tagfggvnynek fgy a kvnt alakzat (kr, ellipszis vagy ms egyb) ennek a tglalapnak a belsejbe kerl. A tglalapok ltrehozsa igen egyszerii: meghatrozunk egy Rectangle tpus vltozt, majd megadjuk az x, az Y, a Width s a Height tulajdonsgainak az rtkt Az elbbi kett a bal fels sarok koordinti, rrg az utbbiak a tglalap szlessgt s magassgt adjk meg. Az albbi kdban ltrehozunk egy tglalapot, amelynek a bal fels sarka a 0,0 pontba esik, a szlessge 100, a magassga pedig 50 kppont. Fontos megjegyeznnk, hogy ezzel mindssze meghatrozzuk a tglalapot a kdban, a kpernyre viszont nem rajzoljuk fel.
Rectangle rectBounding = new Rectangle(); rectBounding .X = O; rectBounding.Y = O; rectBounding.Width = 100; rectBounding .Height = 50;
A Rectangle objektumnak a koordintkat s az oldalak hosszt kezdrtkekknt is tadhatjuk, gy a fenti tglalapot egyetlen kdsorral is ltrehozhatjuk
Rectangle rectBounding =new Rectangle(0,0,100,50};
Miutn meghatroztuk a tglalapot, szmtalan dolgot tehetnk vele. Taln a legrdekesebb mind kzla tglalap nagytsnak s zsugortsnak lehetsge. Ezt az Inflate () tagfggvnnyel rhetjk el, az albbiak szerint:
objektum.InElate{szlessgvltozs, magassgvl tozs);
Alakzatok rajzolsa
A Graphics objektum, a tollak s a tglalapok megismerse utn az alakzatok rajzolsa nem is tiinik majd bonyolult feladatnak. Ahhoz, hogy felrajzoljunk egy alakzatot, a Graphics objektum valamelyik tagfggvnyt kell meghvnunk. Tbbnyire szksg lesz egy hatrol tglalapra, valamint egy tolira is, amellyel a rendszer meghzhatja az alakzat krvonalait. Lssuk most mindezt kiss rszletesebben is!
A kvetkezkben csak a leggyakrabban hasznlt alakzatokat mutatjuk be, de rdemes tudnunk, hogy a Graphics objektum knlata ennl jval gazdagabb.
Vonalak rajzolsa
A vonalak rajzolsra a Graphics objektum DrawLine () tagfggvnye szolgl, amely egyike annak a kevs rajzol fggvnynek, amely nem ignyel hatrol tglalapot a mk.dshez. A hasznlati alakja gy fest:
objektum . DrawLine(to11, xl, yl, x2, y2);
Itt az objekr.:um egy Graphics objektum, a toll a korbban ismertetett Pen osztly egy pldnya, ai xl, yl a vonal kezdpontjnak, mg az x2, y2 a vonal vgpontjnak koordinti. A hvs eredmnyeknt a Visual C# egy vonalat hz a kt pont kztt a megadott tollal.
Tgialapok rajzolsa
Tglalapokat (s persze ngyzeteket) a Graphics objektum DrawRectangle (l tagfggvnyvel rajzolhatunk Amint azt sejthettk, a fggvny egy tollat s egy tglalapot vr paramterknt, vagyis az albbi alakban hvhatjuk meg:
objektum.DrawRectangle(to11, tglalap) ;
Amennyiben nem rendelkeznk Rectangle objektummal (s nem is szndkozunk ltrehozni egyet), gy is meghvhatjuk a tagfggvnyt
objektum. DrawRectangle(to11, x, Y, szlessg, magassJg);
szlessg, magassg);
A rajzfellet trtse
Egy Graphics objektum felletnek trlshez a Clear () tagfggvnyt kell meghvnunk, tadva neki azt a sznt, amellyel a felletet ki szerelnnk tlteni: objGraphics.Clear(Orawing . SystemColors. Control) ; Amennyiben egy ablak Graphics objektumnak fellett trljk, a kvetkez kddal az ablak BackColor tulajdonsgban megadott sznt hasznlhatjuk fel: objGraphics.Clear(this.BackColor);
Szvegrajzols
Egy Graphics objektum felletre ppgy rajzolhatunk szvegrszleteket, ahogy alakzatokat. A hasonlsg olyan nagy, hogy mg a megfelel tagfggvny nevben is Draw (rajzols) sz szerepel Print (kirs) helyett. Taln ki is talltuk, hogy a szban forg tagfggvny a DrawString () nvre hallgat, az utastsformja pedig gy fest: objektum.OrawString(karakterlnc, betformtum, ecset, fels6X, balY) ;
18.4. bra
A DrawStringO tagfilggvnyben megadott koordintk a baJ fels sarkt adjk meg
megjelenszveg
30,
Ltrehozhatunk teht j Font objektumokat, de ez mg nem minden, hiszen lehets gnk van arra is, hogy egy mr ltez objektum, pldul egy ablak bettpust vegyk hasznlatba. Az albbi utasts pldul az aktv ablak bettpusval r egy Graphics objektum felletre: objGraphics.DrawString("This is the text that prints!", this.Font, System.Drawing .Brushes.Blue , 0, 0);
379
Hogy kiss izgalmasabb tegyk a feladatot, vletlenszmokkal hatrozzuk meg a szveg X s Y koordintit, valamint ber<Imrett Az ehhez szksges l-vletlenszmokat a Random osztly, valamint ennek Next () tagfggvnye szolgltatja. Ha olyan vletlenszmot szecetnnk ellltani, amely kt meghatrozott rtk (mondjuk l s 10) kz esik, az albbi utastst alkalmazhatjuk:
randomGenerator. Next(l , 10) ;
Hozzunk ltremost egy j Windows Application projektet Persisting Graphics nven, s tegyk a kvetkezket:
1. Kattintsunk az egr jobb gombjval a Forml . cs fjlnvre a Solution
Explorerben, s vlasszuk a helyi men Rename (tnevezs) pontjt. Adjuk az alaprtelmezett ablaknak a Ma inForm . c s nevet, a Te x t tulajdonsgnak pedig a Pers isti ng Grap h ics Exa.mple rtket. 2. Az ablak fellete egy szvegmezbl s egy gombbl ll majd. Ha a felhasznl a gombra kattint, a program vletlenszer helyen s ber<Imrettel kirja a szvegmez tartalmt az ablakra. Helyezznk ht el egy szvegmezt az ablakon, a tulajdonsgait pedig lltsuk be az albbiak szerint:
rtk
txtinput 56, 184 100 , 20
3. Helyezznk el egy j gombot az ablakon, dupln kattintva az eszkzkszlet But ton elemre, a tulajdonsgait pedig hatrozzuk meg a kvetkezk szerint: Tulajdonsg Name Locati on Text
rtk
btnDrawText 162 , 182 Draw Text
A fellet ezzel el is kszlt- kvetkezhet a kd. Amint a korbbiakban emltettk, egy memriban trolt bitkpre rajzolunk, amelyet azutn az ablakra msolunk Mivel erre a bitkpre sok helyen hivatkozunk, modulszint vltozknt hozzuk ltre. 4. Kattintsunk dupln az ablakra a Load esemnynek az drshez. 5. Keressk meg a public partial class MainForm : Form utastst, s a kurzort helyezzk el a kvetkez sorban kzvetlenl a bal kapcsos zrjel ( {) utn. 6. rjuk be az albbi kdsort~
private Bitmap m_objDrawingSurface ;
7. Ahhoz, hogy hasznlhassuk is a bitkpvltoznkat, egy valdi Bitmap objektumra. kell hivatkoznia. A kezdeti rtkadst legjobb az ablak Load esemnyben e lvgezni, gy ht helyezZk vissza a kurzort a Load esemny trzsbe, s rjuk be az albbi kdot (lsd a 18.5. brt):
r..-~.na.z.q., t)
ll Cru'"e dt'aVln IU'"f'te tn.th the .s-..e ch._a.-l.ocu ~H c11Ut ll ..r9i or c.be tcEa. a dljDretd.D4Stuf - MV B"l.ta.aP( ~.Cl.J.ea_~le.aleft&. - tht-.Cli.nc&te'Ca.gle.l.e.19tt.t, Syn .Onv .liLQ'. :t..viftO.Pu"rlFo19..l;. ro~~,:
ta1.~tauuh%t~u'
18.5. bra
Ellenrizzk,
hogy
a kdunk pontosan
egyezik-e az brn
o..;; l lto,>!ir~,........~,;~~ ': ""' h'""' '' :..:: '.:: .:...::.: "' :.::..._:__..::.....; r "'-- _:_ ~< ~ "' .:...__. _....: "''' :..: ' '-' :~"'""""" ..: "1. "_ ' -=~:o~ :..:..-~---"' :::.:.. --""- - - = "' :=:..:~ '
lthatvat
18. ra Grafikus
ll Ltrehozzuk a rajzfellet et az ablak gyflterletnek mreteivel. m._objUrawingSurtace = new Bitmap(this.ClientRectangle.Width, this.ClicntRectanglc . Height , System . Drawing . Imaging . PixelFormat . Format24bppRgb); Initializesurfacc() ;
Az els utasts egy j bitkpet hoz ltre a memriban. Mivel a tanalmt az ablakon jelentjk meg, logikus, hogy a mreteit is az ablaknak megfelclen Utjuk be - s a kd ppen ezt teszi. Az utols sorban egy eljrst hvunk meg, amelyet azonban mg nem rtunk meg. 8. Helyezzk a kurzort a MainForm_Load esemny zr kapcsos zrjele (}) mg, s hozzunk ltre egy j sort az ENrER lenyomsval. Most ksztjk majd el azt a kdot, amelyik meghatrozza a bitkp kezdeti tartalmt A kd feltlti a control nev rendszersznnel a bitkpet, majd egy ellipszist rajzol, amelynek a hatrol tglalapja azonos mret magval a bitkppeL (A kdban elhelyezell megjegyzsek a tjkozdst segtik, az alkalmazott alapelvekrl pedig mr sz esett a korbbiakban.) rjuk be az albbi kdot teljes egszben:
private void IniLializeSurface()
{
ll Ltrehozunk egy Graphics objektumot , amely a bitkpre hivatkozik, l l s trljOk a felulett. objGraphics = Graphics . Fromimage(m_objDrawingSurface);
objGraphics . Clear(SystcmColors .Control) ;
l l Ltrehozunk egy tglalapot, amelynek a mr etei megegyeznek ll a bitkp mreteivel . rectBounds new Rectangle(~. O, m_obj DrawinqSurface . v/id th, m_obj Drawi nySurface. He i ght) ; l l Kicsit sszezsugortjuk a tglalapot, gy az ellipszis ll nem rinti a bitkp hatrt. rectBounds.Inflate( - 1, -1) ; l l Felrajzoljuk az ablakot kitlt6 ellipszist . objGraphics.DrawEllipse(Pens.Orange , rectBounds);
Ha pontosan kvettk a lertakat, a kdunk pontosan megegyezik a 18.6. brn lthatval. Ha most futtatjuk a projektet, azt tapasztalhatjuk, hogy a program semmit nem rajzol a felletre. Mindez annak ksznhet, hogy mindeddig a bitkpre rajzoltunk, s mg nem rtuk meg azt a kdot, amely ennek tartalmt az ablakra msoln.
Grph,~oc:s
objGrpbi.c.s;
Attct:4J\Q'lt' RC~;
ll
C'n-.t;~
G~aphic:J
Jlcreu, rec:t-.:sgh.
r~d
the:
.slllJIC'
r:ta"W
llt:ctonglt(O., O,
o bj DxawfA9So.rlaoe.Hai.9bt) z /{Red.uoe ~ti~ r;e~l~ aliqht1y so tb~ cWp~~ wt::ront. ~ur on t.1Se reC"C80uda .Jft.fit.e C - 1, -1) ;
objDra~taee. W14th,
l l Drav 4l.ll ~U 'J) ef! that. .!ill" ttl;e f'o~. ob' G%.puo-s . DrawE.Uip#e: (,_~,. .Oz& 'D!Je, ne~);
ll rre.f!
'U'P :teo~rt:1t~.
cbjGr&phico. Di apo5e Cl :
18.6. bra
Ellenrizzk,
9. Hozzunk ltre egy esemnykezelt az ablak Paint esemnyhez. Ehhez trjnk vissza az ablaktervezhz, jelljk ki az ablakot, majd kattintsunk a Properties (Tulajdonsgok) ablak Events (Esemnyek) gombjra, vgl pedig kattintsunk dupln a Paint esemnyre az j esemnyeljrs ltrehozshoz. rjuk be az albb kdot:
l l A b itkp tartalmt megjelen tj k a z ablakon. e .Gr aphi cs . Drawl mage(m_obj DrawingSurface , 0, O, m_objDrawingSurface . Width , m_objDrawingSurface .Height } ; e .Graphics . Di s pose() ;
A Paint esemny e paramtere egy tulajdonsggal rendelkezik, amely az ablak Gr aphics objektumra hivatkozik. Az e paramteren keresztl kzvetlenl nem mdosthatjuk a Graphics objektum tartalmt, ugyanis a paramter csak olvashat. Ezrt hoztunk ltre egy j Graphics objektumot, majd ezzel hivatkoztunk az ablak Graphics objekturnra. A Drawimage ( l tagfggvny megjelenti a bitkp tartalmt a Graphic s objektum felletn, gy az utols utasts egyszeren az ablakra helyezi a memriban mr ltez bitkpet Ha most futtatjuk a projektet, lthatjuk, hogy egy ellipszis jelenik meg az ablakon, radsul ha eltakarjuk valamivel az ablakot, vagy kis mretiv tesszk, jra megjelentve ismt feltinik rajta az ellipszis - vagyis a grafika ezttal maradand.
383
ll Ha nincs beirt szOveg, kilpnk. if (txtinput . Text == "") return ; ll Ltrehozunk egy grafikus objektumot a memriban lev6 bitkppel. objGraphics = Graphics.Fromimage(m_objDrawingSurface); ll Ltrehozunk egy 8 s 48 kztti vletlenszmot a betfrmrethez. intFontSize = randomGenerator.Next(8,48); ll Meghatrozzuk a szOveg vletlenszer X koordintjt. intTextX = randomGenerator.Next(O,this.ClientRectangle.Width); ll Meghatrozzuk a szOveg vletleoszera Y koordintjt. intTextY = randomGenerator.Next(O,this.ClientRectangle.Height); ll Ltrehozunk egy j Font objektumot. objFont = new System.Drawing.Font("Arial", intFontSize, FontStyle.Bold); ll Kirajzoljuk a felhasznl ltal beirtakat . objGraphics.DrawString(txtinput . Text, objFont, System.Drawing.Brushes.Red, intTextX, intTextY) ; ll Felszabadtjuk az er6forrsokat. objGraphics .Dispose(); ll Rvesszk az ablakot, hogy fesse fel magt jra, vagyis ll kivltjuk a Paint esemnyt. this. Invalidate() ;
A megjegyzsek magtl rtetdv teszik a kdot; egyedl az utols utastsrl rdemes pr szt ejtennk Az ablak Iovalidate () tagfggvnye rvnytelenti az ablak gyflterlett. Ezzel azt kzli a Windows rendszerrel, hogy az ablak tartalma tbb nem rvnyes, vagyis jra fel kell festeni. Mindennek hatsra a rendszer kivltja az ablak Paint esemnyt. Aszveg megjelentsnek kdja ebben az esemnyben tallhat, gy a szveg nyomban felt1Inik az ablakon. Ha nem hvnnk meg az Iovalidate <) tagfggvnyt, a szveg nem jelenne meg az ablak felletn (jllehet a bitkpen tovbbra is on lenne).
Amennyiben olyan elemeket rajzolunk a felletre, amelyek az ablak mrettl fggenek, az Iovalidate () tagfggvnyt az ablak Resize esemnyben kell meghlvnunk, ugyanis az ablak tmretezse nmagban nem vltja ki a Paint esemnyt.
Marshall
18.7. bra
Programunk kirajzolja a szveget az ablakra, mintha csak egyszer alakzatrllenne sz6
A projektnk ezzel elkszlt. Mentsk a munknkat az eszkztr Save All (Mindent ment) gombjra kattintva, s futtassuk a programot az F5 billenty lenyomsval. Az ellipszis azonnal megjelenik az ablakon. ~unk valamit a szvegmezbe, s nyomjuk meg a gombot, majd nyomjuk meg ismt. Ahnyszor csak gy tesznk, a program kirajzolja a megadott szveget az ablak felletre - ugyanazzal az ecsettel, de ms helyen s ms mretben (lsd a 18.7. brt).
sszefoglals
A rajzoJsi lehetsgekre nincs rninden programban szksg, ahol azonban igen, ott nem tudunk meglenni nlklk. Ezen az rn megtanultuk, hogy miknt rajzolhatunk grafikus felletekre, legyenek akr ablakok, vezrlk, memriban trolt bitkpek vagy ms felletek. Megismerkedtnk a rajzolst lehetv tev Graphics objektummal, s megtanultuk, hogyan hozzunk ltre ilyen objektumot ablakok, vezrlk vagy akr a memriban trolt bitkpek kezelsre. Szmos rajzolsi eljrshoz szksg van egy toll s egy tglalap megadsra, gy szt ejtettnk ezekrl az objektumokrl is. Ennek a tudsnak a birtokban a rajzol tagfggvnyek hasznlata mr egyszernek bizonyult- mg a szvegek felrajzolsa sem jelentett klnsebb gondot a megfelel Graphics objektum segtsgveL A grafikus tartalom megrzse az ablakokon mr nmikpp bonyolultabb krds, ami gyakran kifog azokon a tapasztalatlan programozkon, akik nerbl prblnak megbirkzni vele. sszelltottunk ht egy pldaprogramot, amely bemutatja a kvetend megoldsi mdokat, amelyeket ezutn a sajt projektjeinkben is sikerrel hasznlhatunk.
18. ra Grafikus
Egy rnyi bevezet utn senkitl sem vrjuk el, hogy rgtn kpes legyen elkszteni egy Photoshop-utnzatot. Mindazonltal ez az egy ra szilrd alapokat ad, amelyekre a ksoobiekben ptkezhetnk Ha olyan projektbe kezdnk, amelyben sok rajzoJsi feladatra szmtunk, rdemes elmlyednnk a Graphics objektum rszleteiben.
385
Krdezz-felelek
K: Mit tegynk, ha tbb, egyms utn ll, vgpontjaikban csatlakoz vonalat
szeretnnk rajzolni? Mindegyikknl kl6n meg kell hvnunk a DrawlineO tagfggvnyt? V: A Graphics objektum rendelkezik egy DrawLines () nevezett! tagfggvnnyel is, amelynek pontok sorozatt adhatjuk t, amelyeket a tagfggvny sszekt. K: Hogyan kszthetnk kitlttt alakzatokat? V: A Graphics objektum rendelkezik olyan, kitlttt alakzatokat rajzol tagfggvnyekkel is, mint a FillEllipse () vagy a FillRectangle ().
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is ka matoztathassuk.
lsmtl6 krdsek
1. Melyik objektummal rajzolhatunk egy felletre? 2. Ha egy Graphics objektummal kzvetlenl egy ablak felletre szecetnnk rajzolni, az objektum melyik tagfggvnyt kell meghvnunk? J. Melyik objektummal adha~uk meg egy vonal, illetve egy kitlts jellemzit? 4. Hogyan rhetjk el, hogy egy szntulajdonsg alkalmazkodjon a Windows rendszer belltsaihoz? 5. Milyen objektummal adhatjuk meg egy alakzat hatrait? 6. Melyik tagfggvnnyel rajzolhatunk ltalnos ellipszist, illetve krt? 7. Melyik tagfggvnnyel rajzolhatunk szveget egy Graphics objektumra? 8. Ha azt szeretnnk, hogy egy grafika megmaradjon egy ablak felletn, az ablak melyik esemnyben kell elhelyeznnk a rajzols kdjt?
Vlaszok
1. 2. 3. 4. 5. A Graphics objektummaL A CreateGraphics (l tagfggvnyt. A Pen, illetve a Br us h objektummaL Hasznljunk rendszerszneket. A Rectangle objektummaL 6. Mindkett6t a DrawEll ipse () tagfggvnnyeL 7. A DrawStr ing () tagfggvnnyeL 8. Az ablak Paint esemnyben.
Gyakorlatok
1. Mdostsuk a pldaprogramunkat gy, hogy ne az Arial bettpusr hasznlja. Amennyiben nem tudjuk biztosan, hogy milyen bettpusok vannak jelen a rendszernkben, kattintsunk a Start menre, s vlasszuk a Control Panel (Vezrl6pult) lehet6sget, majd kattintsunk az Appearance and Personalizalion (Megjelens s szemlyre szabs) hivatkozsra - a megjelen6 ablakbl elrhetjk a rendszerbettpusok listjt. (Ha nem Windows Vistt hasznlunk, az elrsi t nmileg eltrhet ett61.) 2. Hozzunk ltre egy projektet, amely egy az ablakot kitlt6 ellipszist jelent meg, ugyangy, ahogy a pldaprogramunkban lthattuk. Ezttal azonban rajzoljuk az ellipszist kzvetlenl az ablakra a Paint esemnyben. Biztostsuk, hogy az ellipszis kvesse az ablak trnretezst. (Tipp: rvnytelentsk az ablakot az ablak Resize (l esemnyben.)
IV.
RSZ
Adatkezels
19. ra 20. ra 21. ra 22. ra Fjlmveletek vgrehajtsa Szvegfjlok s a rendszerler adatbzis hasznlata Adatbzisok hasznlata Alkalmazsok irnytsa automatizlssal
19.
RA
Fjlmveletek
A lecke tartalmbl:
vgrehajtsa
Az OpenFileDialog s a SaveFileDialog vezrl hasznlata Fjlok kezelse a System . ro . Fil e objektummal Knyvtrak kezelse a System. 10 . Directory objektummal Nehz elkpzelni brmilyen komolyabb alkalmazst, amely nem hasznlja a fjlrendszert. Ezen az rn azoknak a vezrlknek a hasznlatt tanuljuk meg, amelyekkel megknnythetjk a felhasznlknak a fjlok megkeresst s kijellst, valamint megismerkednk a System . IO . File s a System . 10. Directory objektumokkal is, amelyekkel knnyebb kezelni a fjlrendszert, mint kpzelnnk Ezekkel az objektumokkal fjlokat s knyvtrakat trlhetnk, thelyezhetjk s toevezhetjk azokat, s egyb m(iveleteket is vgrehajthatunk Erteljes objektumok, ezrt vatosan kell bnnunk velk.
390
rtk txtSource
95, 8 184, 20
19. 6ra
a Jet'llptacrt
O ....op
.
. ....
Il e...,.... llo.c.-...
-...y CJoooood
,_
Scofthu
19.1. bra
Az OpenFileDialog vezrlfjlok megkeresst s kijellst teszi lehelv a felhasznlnak
19.2. bra
Az Open File prbeszdablak nem az ablaksablonon, hanem alatta tallhat
rtk
btnOpenFile
9, 6 80, 23
Source :
Az els utasts rja el, hogy melyik knyvtr jelenjen meg a prbeszdablak els megnyitsakor. Ha nem adunk rtket az I n itialDirectory tulajdonsgnak, a program az aktv rendszerknyvrat nyitja meg (pldul azt, amelyikben egy msik fjlmegnyit prbeszdablakkal tallztunk).
Az Open FileDialog Ti tle tulajdonsga az Open File prbeszdablak cmsorban megjelentend nevet hatrozza meg. Ha nem adjuk meg a Ti t l e tulajdonsg rtkt, akkor a Visual C# az Open (Megnyits) szt fogja a cmsorban hasznlni.
A FileName tulajdonsggal a kijellt fjl nevt olvashatjuk ki. Ha ezt a tulajdonsgot nem lltjuk egy res karakterlncra az Open File prbeszdablak mcgjelentse eltt, akkor a program alaprtelmezs szerint a vezrl nevt fogja hasznlni, ami nemkvnatos eredmnnyel jrhat.
Fjlszl1r6k ltrehozsa
A klnbz fjltpusoknak klnbz kiterjesztseik vannak. A Filter tulajdonsg hatrozza meg, hogy milyen fjltpusok jelenhetnek meg az Open File prbeszdablakban (lsd a 19.1. brn). Egy szrt a kvetkez formban adhatunk meg:
Leirsl*. kit erjeszts
A cs karakter eltti szveg a szr lerst tartalmazza, a mgtte lev pedig a szrs hez hasznlt mintt. Pldul ha csak a Windows-bitkp tpus fjlokat szecetnnk megjelenteni, akkor egy ilyen szrt hasznlhatunk:
vez r l6 . Filter
Megadhatunk egynl tbb fjlszrt is. Ehhez a szr6k kz tegynk cs karaktereket, ahogy albb lthat:
vezrl. Filter = "Windows - bitkpek l *. bmpiJPEG fjlok l *. jpg" ;
Ebben a pldban az Open File prbeszdablakot csak szvegfjlokra szeretnnk korltozni, teht rjuk be ezt az utastst az eljrsunkba:
openFileDialog l . Filter
= "SzOvegf jlok
(*. t x t) l *. t x t ;
19. 6ra
Ha tbb szGrnk van, a Filterindex tulajdonsggal elirhatjuk, hogy melyik legyen alapllapotban a kivlasztott. Ebben a pldban ugyan csak egy szrt hatroztunk meg, mgis j tlet ezt alaprtelmezettknt belltani, teht adjuk hozz az eljrshoz a kvetkez utastst:
openFileDialogl . FilterTndex
~
l;
A legtbb gyjtemnytl eltren a Filterindex tulajdonsg nem 0-tl, hanem 1-tl szmol, teht az 1 az els szrt jelenti a listban.
Ez a kd a kijellt fjl nevt berja a txtSource nev1l szvegmezbe. Ha a felhasznl a Cancel (Mgse) gombra kattint, akkor a szvegrnez resen marad.
Az FS lenyomsval futtassuk a projektet, s kattintsunk a gombra. Ekkor a 19.1. brn
lthat prbeszdablakhoz hasonl ablakot kapunk (termszetesen ms fjlokkal s knyvtrakkal). Jelljnk ki egy szvegfjlt, s kattintsunk az Open (Megnyits) gombra. A Visual C# berja a fjl nevt a szvegmezbe.
Alaprtelmezs szerint az Open F' i 1 eoial og nem teszi lehetv a felhasznlnak, hogy egy nem ltez fjl nevt rja be. Ezt a bellitst az openF ileDialog CheckFileExist tulajdonsgnak False rtkre lltsval brlhatjuk fell.
Az openFileDialog vezrlvel a felhasml egyszerre tbb fjlt is kijellhet Erre ritkn van szksg (n nem emlkszem arra, hogy brmikor is szksgem lett volna erre a kpessgre a programjaimban), teht nem magynk bele a rszletekbe. Ha rdekel minket, akkor a sgban nzznk utna az OpenF'ileDialog Multiselect tulajdonsgnak.
394
2. Most ltrehozhatunk egy gombot, amelyre kattintva a felhasznl megadhatja a ments helyt egy fjlnv formjban. Adjunk egy j gombot az ablakhoz, s az albbi tblzat alapjn lltsuk be a tulajdonsgait:
Tulajdonsg Name Location Size Text
rtk btnSaveFile
9' 31
80, 23
Destination:
3. Termszetesen ahhoz, hogy ezek a lpsek mkdjenek, kell egy Save File (Fjl mentse) prbeszdablak Kattintsunk dupln a SaveFileDialog elemre az eszkztron, hogy hozzadjuk az j vezrlt a projekthez. 4. Kattintsunk dupln a jonnan ltrehozott gombra (btnSaveFile), s adjuk hozz a kvetkez kdot a Click esemnyhez:
saveFileDialogl.Title = "Specify Destinatien File Name; saveFileDialogl . Filter = "Text Files (*. txtl l*.txt; saveFileDialogl . Filterindex = l; saveFileDialogl.OverwritePrompt
= true ;
Az els hrom utasts az OpenFileDial og objektumnl mr megismert tulajdonsgokat lltja be, az OverwritePrompt tulajdonsg viszont a saveFileDialog klnlegessge. Amikor ez a tulajdonsg true rtk, a Visual C# meger6stst kr a felhasznltl, ha egy mr ltez fjlt jellt ki, ahogy az a 19.3. brn lthat. Az overwritePrompt tulajdonsg true-ra lltsval melegen ajnlott a felhasznlkat rtesteni a fjlok fellrsrl.
19.3. bra
j t/et megerstst krn t fjlok fellrsa esetn
Ha azt szeretnnk, hogy a Save File prbeszdablak akkor krjen megerstst, ha nem ltezik a kivlasztott fjl, llitsuk a saveFileDialog vezrl Creat e Prompt tulajdonsgt true-ra. 5. A kd utols rszlete az, hogy a kivlasztott fjlnevet a txtDes t ination szvegmezbe rjuk. rjuk be az albbi kdot: if (saveFileDialogl . ShowDialog() ! = DialogResult .Cancel) txtDestination.Text = saveFileDialogl. Fil eName ;
Az F5 billentyvel futtassuk a programot, majd kattintsunk valamelyik gombra.
Ha meg vagyunk elgedve azzal, ahogy a kijellt fjlnevek a megfelel szvegmezkbe kerlnek, llitsuk le a projektet, s mentsk a munknkat. Ha a kijellt fjlnevek nem a megfelel szvegmezkbe keri.ilnek, hasonltsuk ssze az ltalunk bert kdot a megadonaL
Az OpenFileDialog s a SaveFileDia log vezrl6k felptsket s megjelensket
tekintve hasonlk, de a kett ms-ms clt szolgl. Az ra sorn vgig a fentiekben ltrehozott felletet fogjuk hasznlni.
396
Fjlltezsnek megllaprtsa
brmilyen maveletet megksrelnnk vgrehajtani egy fjlon, plduilemsolnnk vagy trlnnk, clszem megbizonyosodni arrl, hogy tnyleg ltezik. Pldul ha a felhasznl nem a Source gombra kattintva jel l ki egy fjlt, hanem berja a nevt s az elrsi tjt a szvegmezbe, akkor knnyen rhat oda rvnytelen vagy n em ltez fjlnevet. Egy nem ltez fjl kezelse kivtelt vlthat ki -amit nem szeretnnk. Mivel sok eljrsban a felhasznl ltal kijellt forrsfjllal fogunk dolgozni, egy kzs fggvnyt fogunk rni, amellyel meghatrozhatjuk, hogy a forrsfjl ltezik-e. A fggvny a System . ro . File objektum Exists () tagfggvnyt hasznlja a fjlltezsnek megllaptsl1oz. Adjuk hozz az ablakosztlyunkhoz a kvetkez tagfggvnyt:
bool Sour ceFileExists()
{
Mieltt
M essageBox. Show("The source file does not exist !"); return false; else return true;
A SourceFileExists (l tagfggvny ellenrzi a szvegmezben megadott fjlt. Ha a fjl ltezik, akkor a SourceFileExists () true rtkkel tr vissza, egybknt pedig false rtkkel.
Fjl msolsa
A fjlok msolsa mindennapi feladat. Pldul lehet, hogy egy olyan alkalmazst szerelnnk kszteni, amely a fontos adatokrl biztonsgi msolatot kszt egy msik helyre. A legtbb esetben a fjlok msolsa meglehetsen biztonsgos - amg egy mg nem ltez6 fjlnevet hasznlunk clfjlkn t. Fjlokat a System. ro. Fi le osztly Copy (l tagfggvnyvel msolhatun.k. Most hozzadunk egy gombot az ablakunkhoz. Amikor a felhasznl erre a gombra kattint, a "forrs" mezben megadott fjl a ~cl" mezben megadott fjl helyre msoldik. Ennek megvalstshoz kvessk az albbi lpseket:
1. Adjunk az ablakhoz egy gombot, s az albbi tblzat szerint lltsuk be a tulajdonsgait:
Tulajdonsg Name
Location Si ze
rtk btnCopyFile
95, 71 75 , 23
Text
Copy
kvetkez
kdot:
if (!SourceFileExists()) return ; System . IO . Fi le . Copy( txtsource.Text , Lxt Destination.Text) ; MessageBox.Show(" The f ile has been s uc cessfully copied .");
A Copy (l tagfggvnynek kt argumentuma van. Az els a msoland fjl , a msodik pedig az j fjl elrsi tja s neve. Ebben a pldban a kt szvegmezben megadott fjlnt:veket hasznljuk. Az F5 lenyomsval futtassuk a projektet, s teszteljk a kdunkat a kvetkez lpsekkt:l: 1. Kattintsunk a Source (Forrs) gombra, s jelljnk ki egy szvegfjlt. 2. Kattintsunk a Destinatien (Cl) gombra a Save File prbeszdablak megjelentshez. Ne egy ltez fjlt jelljnk ki, hanem rjunk be egy j fjlnevet a File Name (Fjlnv) szvegmezbe, s kattintsunk a Save gombr.L Ha a rendszer megkrdezi, hogy Je szeretnnk-e cserlni egy fjlt, vlasszuk a No (Nem) lehetsget, s vltoztassuk meg a fjlnevet gy, hogy az egy nem ltez fjl neve legyen. 3. Kattintsunk a Copy gombra a fjl msolshoz. Miutn a program egy zenetablakban visszajelezte a fjl sikeres msolst, az Intzben megkereshetjk s megnyithatjuk az j fjlt. lltsuk le a projektet, s mentsk a munknkat a folytats eltt.
Fjl thelyezse
Amikor egy fjlt thelyeznk, akkor eltvoltjuk a jelenlegi knyvtrbl, s egy jban helyezzk el. A fjlnak adhatunk j nevet, de hasznlhatjuk az eredeti nevt is. Fjlokat a System. ro . File objektum Move () tagfggvnyvel helyezhetnk t. Az albbi lpseket kvetve hozzunk ltre az ablakunkon egy gombot, amely a forrsknt kijellt fjlt thelyezi a clknt kijellt helyre, s elltja a kvnt fjlnvveL
Ajnlott a Notepad (Jegyzettmb) programmalltrehozni egy szvegfjlt, s ezentl azt hasznlni ideiglenes fjlknt a tesztelsekhez. Ez a kd, csakgy mint a ksbbiek ebben a leckben, maradandan megvltoztathat vagy trlhet egy fjlt.
Move
2. Kattintsunk dupln a Move (thelyezs) gombra, s adjuk hozz a kvetkez kdot a Click esemnyhez:
if (!SourceFileExists()) return; System.IO.File.Move(txtSource .Text, txtDestination.Text); MessageBox.Show("The file has been successfully moved.");
A folytatshoz az F5 lenyomsval teszteljk a projektet. Vlasszunk ki egy thelyezend fjlt (ehhez is ajnlott egy prbafjlt ltrehozni a Notepad programmal), s adjuk meg a cl fjlnevt Amikor a Move gombra kattintunk, a fjl az j helyre kerl, s megkapja az j fjlnevt Ne feledjk, hogy ha a clfjlnak nem ugyanazt a nevet adjuk, mint ami a forrs, akkor a program tnevezi a fjlt az thelyezs sorn.
Fjl tnevezse
Amikor toeveznk egy fjlt, akkor az ugyanabban a knyvtrban marad, amelyikben eddig volt, s a tartalmval sem trtnik semmi, csupn a neve vltozik valami msra. Mivel az eredeti fjl nem vltozik meg, egy fjl tnevezse nem olyan kockzatos mvelet, mint pldul a trlse. Ennek ellenre idegest lehet, amikor egy fjl vletlen tnevezse utn megprblunk rjnni, hogy mi trtnt. A fjlokat a System. ro. File objektum Move {) tagfggvnyvel nevezhetjk t, amelynek az j fjlnevet kell megadnunk, de az eredeti elrsi t megtartsa mellett.
399
Fjl trtse
A fjlok trlse kockzatos. A System . IO . File objektum Delet e () tagfggvnye
vgrvnyesen trli a fjl okat, teht nem a Lomtrba helyezi t azokat! Ezrt nagyon vigyzzunk a fjlok trlsvel, ami mindenekeltt a kd tesztelst jelenti. Amikor egy fjl trlsre runk eljrst, prbljuk ki minl tbb felttel mellett. Ha a kdban pldul rossz szvegmezre hivatkozunk, vletlenl rossz fjlt trlhetnk, s a felhasznlk nem bocstjk meg az ilyen hibkat. Az albbi lpseket kvetve adjunk a projekthez egy gombot, amely kattintsra trli a forrsfjlt Ne felejtsk el: vatosan teszteljk ezt a kdot! 1. Adjunk az ablakhoz egy gombot, s lltsuk be a tulajdonsgait az albbiak szerint:
Tulajdonsg Name Location Size
rtk btnDelete
95, 129 75, 23
Text
Delete
kvetkez
if (MessageBox . Show( "Are you sure you want to delete the source fi le?", oelete Verification",MessageBoxButtons.YesNo, MessageBoxicon .Question) == DialogResult . Yes) System.IO.Fi le.Delete(txtSource.Text ); MessageBox . Show ("The file has been successfully deleted. "J ; A kdban megfigyelhetjk, hogy egy zenetablakkal megerstst krnk a felhasznltL J tlet ilyet alkalmazni minden olyan fontos mveletnl, amely visszafordthatatlan kvetkezmnyekkel jr. Valjban Ininl tbb informcival tudunk szolglni a felhasznlnak, annl jobb. Pldul ha ezt a kdot les rendszeren hasznlnnk (azaz vgfelhasznlk szmra kszlne), akkor a trlend fjl nevt bele kellene foglalni a figyelmeztetsbe, gy a felhasznl ktsg kvl tudn, hogy a program mit szereme tenni. Ha btrak vagyunk, nyomjuk le az PS billentyGt a projekt futtatshoz, jelljnk ki egy fjlt, s trljk.
400
IlV.rsz Adatkezels
Fjl tulajdonsgainak kiolvassa
Br sokakban fel sem merl, a fjloknak szmos tulajdonsguk van, pldul az utols mdosts dtuma. A legegyszenbb ezeket az Intz6ben megnzni. A fjlok tulajdonsgainak megtekinteshez kattintsunk az egr jobb gombjval egy tetszleges fjira az Intzoen, s vlasszuk a Properties (Tulajdonsgok) lehetsget. Az Intz ekkor megnyitja a File Properties (Fjl tulajdonsgai) prbeszdablakot a fjl adataival (lsd a 19.4. brn).
--.......,.
.~-o-
l ~ ~:_:~:=-~=-==
C:\Uoon'-'--lllocunoru
s...
c....r.,
2.161411U96-on l$!aJ
"Aoo.22-
19.4. bra
:i .... aE] ~~
A Visual C# egyszer hozzfrst biztost a legtbb fjltu.lajdonsghoz
A System . IO . File objektum a 19.4. brn lthat File Properties prbeszdablak General (ltalnos) lapjn tallhat legtbb informci lekrsre lehetsget ad. Ezek kzl nhny kzvetlenl elrhet a File objektumon keresztl, mg a tbbit a FileAttributes objektum segtsgvel olvashatjuk ki.
19. ra
Lers A fjl ltrehozsnak idpontjt adja vissza. A fjl utols hozzfrsnek idpontjt adja vissza. A fjl utols mdostsnak idpontjt adja vissza.
Miutn az obj FileAt tribu tes vltozba beolvastuk a fjl jellemzit, a FileAttributes felsorols valamelyik tagjt hasznlva megllapthatjuk, hogy az a jellemz be van-e lltva.
Archive (Archv)
Directory (Knyvtr) Hidden (Rejtett) Norma! ReadOnly (iciSVdett) System (Rendszer) Temporary (Ideiglenes)
Jelents A fjl archivltsgi llapota. Az alkalmazsok ezt a jelzt a biztonsgi mentsre kijellt vagy trlend fjlok megjellsre hasznlhatjk. Az llomny egy knyvtr. A fjl rejtett, azaz nem jelenik meg a szoksos knyvtrkirats alkalmval. Az llomny egy szokvnyos fjl, s nincs semmilyen ms jellemzje belltva. A fjl rsvdett. A fjl az opercis rendszer rsze, vagy kizrlag az opercis rendszer hasznlja. Az llomny egy ideiglenes fjl.
neki a tbbGetFileAttributes nevet. 2. Ha letltttk a pldakdot, lltsuk a kpet a Properties.png fjlra, majd a ToolTipText tulajdonsg rtkt a Get File Attributes szvegre. Ennek a gombnak a Cl i ck esemnybe kicsit hosszabb kdot kell rnunk, mint az eddigiek tbbsge, ezrt itt megmutatjuk a teljes kdot, s utna elmagyarzzuk, hogy mit csinl. 3. Kattintsunk dupln az j gombra, s adjuk a kvetkez kdot a gomb Click esemnyhez:
ll Ellen6rizzk, hogy van-e megnyitott fjl
if ((ofdSe lectPicture.FileName)
(
== "")
System . Text . StringBuilder stbProperties = new _System.Text . StringBuilder("") ; System.IO . FileAttributes fileAttributes;
ll Kiolvassuk az id6pontokat stbProperties .Append( "Created: "); stbProperties .Append(System.IO.File.GetCreationTime( ofdSelectPicture .FileName)); stbProperties .Append("\r\n");
s LbProperties .Append("Accessed: "); stbProperties .Append(System.IO.File.GetLastAccessTime ( ofdSelectPic ture.FileName)}; stbProperties .Append("\r\n" l ; stbProperties .Append("Modified: "); stbPropert ies.Append(System.IO.File.GetLast W riteTime( ofdSelectPicture .FileName));
ll Kiolvassuk a fjljellemz6ket
fileAttributes stbProperties .Append("\r\n") ;
= System . IO.File.GetAttributes(
ofdSelectPicture . FileName) ;
19. ra
l l Egy binris AND mvelettel kinyerjk az egyes jellemzket stbProperties .Append("Normal : ); stbProperties.Append( Convert . ToBoolean((fileAttributes & System.IO . FileAttributes.Normal) == System . IO . FileAttributes.Normalll; stbProperties .Append( "\r\n");
stbProperties.Append("Hidden : "); stbProperties.Append( Convert.ToBoolean((fileAttributes & System. IO . FileAttributes.Hidden) == System . IO . FileAttributes.Hidden)) ; stbProperties .Append( "\r\n " ) ; stbPropert i es. Append ( "ReadOnl y : " ) ; stbProperties.Append( Convert .ToBoolean ((fi leAttri butes & _System .IO. FileAttribut es.ReadOnly) == System. IO . FileAttributes.ReadOnlyl) ; stbProperties . Append( "\r\n"); stbProperties .Append ("System : ") ; stbProperties.Append( Convert.ToBoolean((fileAttri butes & System . IO.FileAttributes.System) == System . IO . FileAttributes.System)); stbProperties.Append("\r\n"); stbProperties.Append("Temporary File: "); stbProperties.Append( Convert.ToBoolean((fileAttributes & System.IO . FileAttributes . Temporary) == System . IO . FileAttributes.Temporary)); stbProperties.Append("\r\n") ; stbProperties .Append ("Archive : " ) ; stbProperties.Append( Convert.ToBoolean((fileAttributes & System.IO. FileAttributes . Archive) == System . IO . FileAttributes.Archive)) ; MessageBox . Show(stbProperties . ToString()) ;
A fenti eljrs elszr e llen6rzi, hogy a felhasznl megnyitott-e megtekintsre egy fjlt. Ehhez a kd az OpenFileDial og vez rlt nzi meg, mert ez az a hely, a ho l a felhasznltl megkapjuk a kivlaszto tt f jl nevt. Ha az OpenFileDialog vezrl fjlneve res, akko r a felhasznl mg ne m nze tt meg egyetlen fjlt sem.
A fjl klnfle tulajdonsgait a StringBuilder tpus stbProperties vltozhoz fzzk hozz. Az "\r\n egy kocsivissza s egy so remels karaktert jelent, s a karakterlnchoz fazve biztostja, hogy rnind en tulajdonsg kln sorban jelenjen meg.
Az FS lenyomsval futtassuk a projektet, nyissunk meg egy kpfjlt megtekintsre, majd kattintsunk a Get File Attributes (Fjljellernz6k lekrdezse) gombra az eszkztron. Ha pontosan rtuk be a kdot, akkor a kpfjl jellemzeSi megjelennek a szvegmez6ben, ahogy a 19.5. brn lthat.
....
Cnal'li 6{lti/2fSI1:ll:10 PM Att..,l'li ~10;46:40 AM
~ 6/26I200S 11:11:10 ;
Normo!: Flse
ffoddm: Foko
19.5. bra
l
19. ra
Ha azt szeretnnk megllaptani, hogy egy k nyvtr ltezik-e, hvjuk meg a System. ID .Directory Exists () tagfggvnyt, s adjuk meg neki a krdses knyvtr nevt, mint az albbi pldban (ne feledjk, hogy a @ karakter a C#-ot arra utastja, hogy a perjelet ne vdkarakternek tekintse): MessageBox.Show(Convert . ToString ( System. IO . Directory . Exists(@ "c :\temp "})} ; Knyvtr lhelyezshez hvjuk meg a System . ro . Directory Move () tagfggvnyt. A Move () kt argumentumot vr: az els a knyvtr jelenlegi neve, a msodik pedig az j nv s az elrsi t. Amikor thelyeZnk egy knyvtrat, akkor a tartalmt is thelyezZk Lssunk egy pldt a Move ( ) tagfggvnyre: System.IO.Directory . Move(@"c : \a k6nyvtr jelenlegi neve ,
@"d : \ a knyvtr j neve");
A knyvtrak trlse mg veszlyesebb, rnint a fjlok, rnivel arnikor egy knyvtral trlnk, akkor az sszes benne lv fjlt s alknyvtral is trljk. Knyvtr t rlshez a System. IO . Directory Delete () tagfghiVnyt kell meghvnunk, s a trlend knyvtr nevt kell megadnunk neki. Nem lehet elgg hangslyozni, hogy mennyire vigyznunk kell ennek a tagfggvnynek a meghvsval, mert komoly krokat okozhatunk vele! A knyvtrak trlsnek
sszefoglals
Az OpenFileDialog s a SaveFileDialog vezrl, valarnint a System . IO objektum segtsgvel komoly dolgokat tehetnk meg a felhasznl fjlrendszerben. Ezen az rn megtanultuk, hogyan tehetjk lehetv a felhasznlnak egy fjl kikeresst s kijellst megnyitshoz vagy mentshez. A felhasznl vlasztsnak megllaptsa azonban csak az els rsze a folyamatnak. Ezen kvl megtanultuk a fjlok s knyvtrakke zelsta System . IO o bjektummal, belertve az tnevezst, az thelyezst s a trlst is, vgl pedig megtanultuk, hogyan olvashatjuk ki egy fjl tulajdo nsgait s jellemzit. Az rn bemutalott eljrsokkal a fjlokkal s knyvtrakkal kapcsolatos mveletek nagy rszt vgre tudjuk hajtani. Nem volt nehz anyag, de ne dljnk be az egyszer sgnek: legynk vatosak, amikor a felhasznl fjlrendszerhez nylunk!
Krdezz-felelek
K: Mi a helyzet akkor, ha vgre szeretnnk hajtani egy fjlmveletet, de valami
megakadlyozza azt (pldul a fjl nyitva van, vagy nincs jogom a fjl elrshez)? V: Minden tagfggvnyhvshoz tartozik egy vagy tbb kivtel, amelyek hiba esetn lphetnek fel. Ezeket megtalljuk a sgban. A kivtelek kezelsre a 15. rn tanult mdszereket hasznlhatjuk. K: Mi trtnik, ha a felhasznl bert egy fjlnevet az egyik fjlkezel prbeszdablak szvegmezjbe, de nem rt hozz kiterjesztst? V: Alaprtelmezs szerint mindkt fjlkezelablak-vezrl AddExtension tulajdonsga true rtka, ilyenkor pedig a Visual C# automatikusan hozzfzi a kijellt szr kiterjesztst a fjlhoz.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. Igaz vagy hamis? .Az Open File prbeszdablak automatikusan megnyit egy fjlt."
2. 3. 4. 5. 6.
Milyen jellel vlasztjuk el egy szr lerst a kiterjesztstl? Melyik nvteret hasznljuk a fjlok kezelsre? Milyen argumentumokat fogad a System. IO . File . copy () tagfggvny? Hogyan neveZnk t egy fjlt? Igaz vagy hamis? "A System . ro. File. Delete () tagfggvnnyel trlt fjlok a Lomtrba kerlnek." 7. Melyik objektum szolgl a knyvtrak kezelsre?
Vlaszok
1. Hamis.
2. 3. 4. 5. 6. 7.
A cs karakterrel (l). A System. IO nvtereL A forrsfjl elrsi tjt s nevt, valamint a clfjl elrsi tjt s nevt. A Move ( ) tagfggvnyt hasznljuk, s meghagyjuk az eredeti elrsi utat. Hamis. A fjlok vglegesen trldnek Asystem.IO. Directory.
Gyakortatok
1. Ksztsnk olyan programot, amely lehetv teszi a felhasznlnak egy fjl kijellst az OpenFileDia log vezrlveL A fjlnevet troljuk egy szvegmez6ben, egy msik gombra kanintva pedig kszljn biztonsgi msolat a fjlrl, azaz msoljuk le a fjlt . bak kiterjesztssel. 2. Ksztsnk olyan programot, amelyben egy ablakra egy szvegmezt helyeznk, ahov a felhasznl berhat egy hrombets kiterjesztst. Ezen kvllegyen rajta. egy gomb, amelyre kanintva megnylik az Open File prbeszdablak, a felhasznl ltal bert kiterjeszts szerinti szrssel.
20. RA
Szvegfjlok s a rendszerler adatbzis hasznlata
A lecke tartalmbl:
Rendszerler adatbzisbeli kulcsok s rtkbejegyzsek ltrehozsa s trlse a Registry objektummal Szvegfjlok megnyitsa, olvassa s szerkesztse a StreamWri ter s st reamReader objektumokkal A Picture Viewer program mdostsa egy szvegfjl s a rendszerler adatbzis hasznlathoz Szvegfjlok mr a szmtstechnika hajnaln is lteztek, s mg manapsg is hasznos adattrolsi megoldsnak szmtanak. Egy komoly alkalmazshoz ugyan rdemesebb adatbzist alkalmazni, de az egyszer adatok trolshoz nem sokkal knnyebb megolds, mint egy szvegfjlt hasznlni.
410
20. ra
Kulcs HKEY_CLASSES_ROOT
HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS
Lers
A fjltpusok s programok ~rs~sait, illetve a COMsszetevk
belltsait trolja.
trolja.
A szmtgpre jellemz informcikat trolja, az ppe n
HKEY_CURRENT_CONFIG
bejelentkezett felhasznltl fggetlenl. A szmtgpen tallhat sszes felhasznli proftit tartalmazza. Amikor egy felhasznl bejele ntkezik, akkor a HKEY_CURRENT_USER a HKEY_USERS kulcsban az adott felhasznl kulcsra mutat lnv lesz. A helyi szmtgp indtsakor hasznlt hardverprofilrl trol informcikat
A 20.1. tblzatban lthat legfels6 kulcsok szmos kulcsot tartalmaznak. A 20.1. brn
lthatjuk, hogyan nz ki a rendszerler adatbzis a szerz szmtgpn. Vegyk szre, hogy az Assistance a Microsoft kulcs egy alkulcsa, ami a Software kulcs alkulcsa, ami pedig a HKEY_CURRENT_USER f6g al tartozik.
.. .
~-J!Siflt{l*t~:
T~"Rf.<Ul
0.00 """"""...,
20.1. bra
A rendszerler adatbzis legfels kulcsok, kulcsok s rtkbejegyzsek hierarchikus rendszere
A kulcsok egy vagy tbb rtkbejegyzst tartalmazhatnak A 20.1. brn lthatjuk, hogy
az Assistance kulcsnak csak egy rtkbejegyzse van (am a jobb oldali listban jelenik meg). A kulcsok adjk az adattrols kerett, amelyben a krdses adatokat tnylegesen az rtkbejegyzsek troljk. Minden rtkbejegyzsnek megvan a maga adattpusa, s ezek az adattpusok elt rnek a Visual C#-ban meghatrozott adattpusoktt A rendszerler adatbzis lehetsges adattpusait a 20. 2. tblzat tartalmazza.
Adattpus
REG_sz
Lers A karakterlncok elsdleges adattpusa. Rgztett hosszsg karakterlncok vagy egyb rvid szveges rtkek trolsra hasznlatos. Bvthet karakterlnc, amelyben futsidben megadott rendszervltozk trolhatk. Tbb karakterlncot trol egy tmbben, amelynek minden egyes .elemt" egy null karakter zrja Je. Binris adatokat trol.
A messze legtbbet hasznlt adattpus a REG_s z karakterlnctpus. Egy REG_sz rtkbejegyzsben mindenfle rtket trolhatunk, pldul szveget (nyilvnvalan), True , Fa l se, o, l rtkeket, s egyebeket. n tbbnyire ezt az adattpust hasznlom az alkalmazsaim szmra. Amikor logikai rtkeket kell mentenem, akkor 1 vagy o formban mentem ket.
A msik, hogy ltrehozunk egy us ing utastst a rendszerler adatbzis elrsre hasznlt osztly legfels szintjn, s ilyen rvid hivatkozsokat hasznlunk:
Reg i s tryKey key = Re g istry.LocalMachine. OpenSubKey( "So ftware , true) ;
Mr hoztunk ltre korbban us ing utastsokat. Keressk meg a mr ltez us i ng utastsokat az osztly elejn, s rjuk aljuk az albbi us ing utastst:
using Microso ft. W in32 ;
Ezt fogjuk hasznlni abban a pldban is, amelyet ezen az rn ksztnk el.
objektumtulajdonsgok, amelyek a 20.1. tblzatban tallhat legfels Irulesokhoz kapcsoldnak. A 20.3. tblzatban lthatk azok a tulajdonsgok, amelyek a rendszerler adatbzis legfels kulcsaira hivatkoznak.
Registry . CurrentUser .CreateSubKey( "UserSettings) ; Ez az utasts a UserSet tings kulcsot hozza ltre a HKEY_CURRENT_USER fg alatt.
Az alkalmazsok ugyanakkor igen ritkn hoznak ltre egy kulcsot kzvetlenl egy fg alatt. A fgakban szmos aikuicsot hasznlhatunk, de a legelterjedtebb a \Software kulcs hasznlata. A Jegtbb alkalmazs egy a cg nevvel megegyez nev kulcsot hoz
ltre a \Software kulcs alatt, a termkek Irulesait pedig a cgnv kulcsa alatt hozza ltre. Pldul tegyk fel, hogy a cgnk neve CJeverSoftware, s a Picrure Viewer program kiadst tervezZk, amely nhny belltst a rendszerler adatbzisban troln (s valban gy is fogjuk mdostani a Picture Viewer programot ezen az rn). Egy ilyen kulcsszerkezetet szeretnnk majd hasznlni: HKEY_CURRENT_USER\Sof tware\CleverSoftwar e\ Pic tureViewer Szerencsre a CreateSubKey () tagfggvny egyetlen hvsval tbbszint kuJcsot is megadhatunk. Egy ilyen szerkezet ltrehozshoz az albbi utastst hasznlhatjuk: Registry .Cur rentUser . CreateSubKey( @ "Software \ CleverSoftware\ Pic tureView er ");
Ne feledjk, hogy a Visual C# a perjelet (\ ) vdkarakterknt hasznlja. Ha egy karakterlnc elejre a @ jelet rjuk, arra utastjuk a Visual C#-ot, hogy a karakterlncot literlis rtkknt rtelmeZle.
414
Mirt a HKEY_CURRENT_USER fgba rtunk a HKEY_LOCAL_MACHI NE helyett? Nos, ltalban clszer az alkalmazsok belltsait a HKEY_CURRENT_USER kulcsba menteni, mivel gy az alkalmazs felhasznli egyedi belltsokat hasznlhatnak. Ha a belltsokat a HKEY_LOCAL_MACHI NE gban trolnnk, akkor a bellrtsok az alkalmazs sszes felhasznljra vonatkoznnak, akik az adott gpen futtatjk azt. Ezenfell nhny rendszergazda korltozza a HKEY_ LOCAL_MACHINE elrhet sgt, ezrt az alkalmazs hibba tkzhet, amikor korltozott kulcsokhoz prbl hozzfrni.
A Del eteSub Key ( J hasznlatakor kivtelt kapunk, ha a megadott kulcs nem ltezik. Ha a rendszerler adatbzist hasznl kdot runk, mindig prbljunk meg felkszlni a vratlan helyzetekre is.
,.._
!
l' i ll . :l
l
l
___
s,-1>
......._
. Type
~--.;ro_sz lof-IEG.,SZ
l . l
!
... .......
.
..~~
. . . VOilopms . .. ~
~
~~:l:.
w"
__ _
(........ M(I
. w ..
~ w~
l ll- a-.-..
~~~w
-"-
JI ......
c~.~~~,~-
l ' ... ~ . .
ct,!!~
t.;: itJ.
. ~"'9 !1'
"!!~JI~
-,
,,
20.2. bra
Az rtkek a kulcsokhoz
Az rtk megvltoztatshoz jra meg kelllvnunk a SetValue () tagfggvnyt, ugyanazzal a kulccsal s bejegyzsnvvel, de egy msik rtkkel.
Egy rtkbejegyzs kiolvasshoz a rendszerler adatbzisbl a GetValue () tagfggvnyt hasznljuk. Ennek a tagfggvnynek is a kulcs teljes tvonallit meg kell adnunk. A GetValue () tagfggvny formtuma a kvetkez: GetValue(kulcstvonal, bejegyzsnv, alaprtelmezett_rtk)
eltagot:
megnyitshoz. 2. Grgessnk az osztly elejre, s keressk meg a mr ltez using utastsokat. 3. rjuk az albbi utastst a ltez us i ng utastsok utn:
using Microsoft .Wi n32;
lpsknt meg kell jelentennk a jelenlegi felhasznl bellitsait, amikor megnyitja az Options ablakot. Kvessk ezeket a lpseket a rendszerler adatbzis~ ban trolt belltsok megjelentshez:
1. Grgessnk le az Option s Form_Load eljrsig. 2. Adjuk hozz a kvetkez utastsokat a Load esemny kdjhoz:
Ez a kd lnyegben a Load esemnyhez rt kd ellentte - a vezrlk rtkeit a rendszerler adatbzisba rja. A kdot most mr magunk is rtelmezni tudjuk.
20. ra
Ez majdnem megegyezik az Options ablak Load esemnyhez rt utastssal: kiolvassa a Prompt on Exit jelzt a rendszerler adatbzisbl, de most a modulvltozt ll~a be az ablak jellngyzete helyett. 6. A kvetkez lecserlend utasts ez lesz:
m_objPictur eBackColor- System . Drawing. SysLemCol or s . Control ;
Ez az utasts a kpmez httrsznta control rendszersznre lltja, ami alaprtelmezsben a sZrke egyik rnyalata. Cserljk ki ezt az utastst a kvetkez kddal:
if (Convert.ToString(Registry.Get Va lue( @ "HKEY_CURRENT_USER\So ftware\CleverSoftware \ PictureViewer\ ", sackColor , "Gray)) - = cray) m_objPi ctureBackColor System . Drawing . SystemColors . Control ; e l se m_objPictu reBa ckColor System. Drawing. Color.Whi te ;
4. Kattintsunk az OK gombra az Options ablak bezrshoz. 5. Kattintsunk jra az Options gombra az eszkztron az Options prbeszdablak megjelentshez. Figyeljk meg, hogy a Default Picture Background color (Kp alaprtelmezett httrszne) rtke White lett. 6. Kattintsunk a General (ltalnos) flre. Lthatjuk, hogy a nevnk szerepel a User Name szvegmezben, s a Prompt to Confirm Exit jellngyzet be van jellve. 7. Kattintsunk az OK gombra az Options prbeszdablak bezrshoz. 8. Zrjuk be a Picture Viewer programot.
Feltnhet, hogy nem kaptunk figyelmeztetst kilpskor. Ennek az oka, hogy a Picture Viewer fablaka nem frisslt a rendszerler adatbzis belltsa utn. A tanultak alapjn azonban most mr meg tudjuk rni azokat az eljrsokat, amelyekkel a kdunk megfelelen fog mkdni. Ehhez kvessk az albbi lpseket:
1. Kattintsunk dupln a ViewerForm. cs elemre a Solution Explorer ablakban az ablaksablon terveznzetben val megnyitshoz. 2. Kattintsunk dupln az ablakra a Load esemny megtekintshez.
'
Ft;~_,.,. _~rio.
"''
.....
:a ~
p : . ".. -
:'"!!rt! ; "1'11.!:1:.
'"'!'!
r.
"!" -~-~-'
. ~"
.. , ~\.1&1>
:..
...... ,. .....
f'
r '
'
"':l~
'"t
:,,c. .. . )r.,_"._r,::J
Joe.:.. , .
t , ..
" r:
20.3. bra
Vgjuk ki a kije/6/t kdot
3. Az els kt utasts kivtelvel jelljk ki a kdot, ahogy a 20.3. brn lthat, s nyomjuk le a CTRL+X billenty1lket a kd kivgshoz. 4. rjuk be a kvetkez utastst:
LoadDefauJts();
kdot.
8. rjuk be az albbit, majd nyomjuk le az ENTER-t:
A kdunknak most gy kell kinznie, ahogy a 20. 4. brn lthat. Ezzel van egy eljrsunk, amelyet meghvhatunk, amikor a felhasznl j belltsokat ment a rendszerler adatbzisba. 9. Grgessnk a mnuOptions_Click () eljrshoz, s rjuk be a kvetkez utastst a jelenlegi kt utasts utn:
LoadDefaults ( ); 10. Grgessnk a tbbOptions_click () eljrshoz, s rjuk be a kvetkez utastst a jelenlegi kt utasts utn:
LoadDefaults() ;
20. ra
pri~
YOid
Lo~O.hulU ()
~Oft!xit-
Coout..foiOoJ.en(Ar,iat:ry. GetVbs(
d~ A_ObjM.e"C"IH:~ckColtn
20.4. bra
Az eljrsok lnyege az sszefgg kdrszletek csoportostsa
11. l\yomjuk le megint az F5 billentyt a projekt futtatshoz. 12. Kattintsunk az Options gombra az eszkztron az Options ablak megjelentshez, s vltoztassuk az alaprtelmezett httrsznt Default Gray (Alaprtelmezett szrke) sznre az Appearance la pon. Amikor az OK gombra kattintunk a belltsok mentshez, s bezrjuk az Options ablakot, a kpmez httrszine azonnal.szi.irkre vlt. A rendszerler adatbzis erteljes eszkz - de csak ha megfelelen hasznljuk! Ebben a rszben megtanultuk az sszes szi.iksges mdszert, amellyel az alkalmazsainkban kihasznlhatjuk a rendszerler adatbzis elnyeit
A rendszerler adatbzis megtekintshez tartsuk lenyomva a SHIFT billentyt, s kattintsunk az egr jobb gombjval az Asztalra. Ekkor egy helyi men jelenik meg, amelyben szerepel az Open Command Window Here (Parancssor indtsa ebben a mappban) lehetsg. (Ha nem ltjuk ezt az elemet, akkor valszinleg nem tartottuk lenyomva a SHIFT billentyt.) Ha ezt a menpontot vlasztjuk, megjelenik egy parancsablak. rjuk be a regedit parancsot, s az ENTER t lenyomva futtassuk a rendszerler adatbzis szerkesztjt (A Start men keresmezjbe is berhatjuk a regedit parancsot). Legynk vatosak: ha helytelen vltoztatsokat eszkzlnk a rendszer1er adatbzisban, akkor akr olyan mrtkben is krosthatjuk a szmtgpnket, hogy az el sem fog indulni!
frs szvegfjlba
Szvegfjlokba a StreamWriter osztllyai rhatunk. Ennek az osztlynak a hasznlathoz elsZr meg kell hatroznunk egy objektumot Streamwriter tpusknt, pldul gy:
System .IO.StreamWri ter objFile = new System.IO . StreamWriter(@"C : \test.txt");
Vagy gy:
System.IO . StreamWriter objFile = new System.IO.StreamWriter(@"C : \test.txt", true);
Valjban ht klnfle mdon lehet a StreamWriter osztlyt hasmlni. Itt csak a legelterjedtebb vltozatot mutatjuk meg, de ha komoly munkra szerelnnk hasznlni a szvegfjlokat, rdemes elolvasni a StreamWriter osztly lerst a Microsoft Developer Network (MSDN) oldalain.
Lthatjuk, hogy nem ktelez megadni a msodik paramtert, amely azt hatrozza meg, hogy egy mr ltez szvegfjlhoz szecetnnk-e hozzfzni a szveget. Ha ennek a msodik paramternek nem adunk rtket, vagy a false rtket adjuk neki, akkor j szvegfjl jn ltre. Ha a szvegfjl mr ltezik, akkor azt egy azonos nev\l, de j fjira cserljk le. Ha true rtket adunk meg, mint a msodik pldban, akkor a fjl megnyitsa utn mindenfle rsi mO'veletnl a fjl vghez fogjuk az adatokat hozzfzni.
Ha nem ltez elrsi utat, illetve fjlnevet adunk meg, akkor, amint adatot runk a Streamwriter objektumba, a Visual C# j szvegfjlt hoz ltre. Ha olyan mappt vagy fjlt prblunk meg elrni, amelyhez nincs jogosultsgunk, hibt kapunk. Ha gy dntnk, hogy berjuk ezt a kdot (ami nem ktelez, itt csak szemlltets cljbl tntettk fel), akkor lehet, hogy msik elrsi utat kell hasznlnunk, ha a Vista korltozza a C: meghajtnk elrst.
futsidej
Miutn van egy objektumunk, amely egy StreamWriter objektumra mutat, az albbi kt megolds valamelyikvel trolhatunk adatot a szvegfjlban: A WriteLine () egy sornyi szveget r a fjlba, s automatikusan hozzfz egy soremelst a sor vghez, teht minden WriteLine () hvs j sort hoz ltre. A Write () a fjlba rja az adatokat, de nem fiz hozz automatikusan j sort. Ezt a kt tagfggvnyt a legjobban pldken keresztl rthetjk meg. Nzzk meg figyelmesen az albbi kdrszletet:
System . IO . StreamWriter objFile = new System .IO.StreamWriter(@"C : \test .txt ") ; objFile . WriteLine ("text l " ) ; objFile . WriteLine ( text 2 " ) ; objFile .WriteLine("text3 " ) ; objFile .Close(); objFile .Dispose();
Vegyk szre az utols eltti utastst, az obj File. Close (l hvst. Ltfontossg lezrni egy szvegfjlt, miutn befejeztk a munkt vele, s a close (l tagfggvny ppen erre val. Radsknt rdemes az objFile. Dispose (l tagfggvnyt is meghvni, amivel biztosthatjuk a fjl ltal elfoglalt erforrsok teljes felszabadtst.
Lthatjuk, ahogy a WriteLine (l adatsorokat hoz ltre, mg a Write () egyszerO'en egyms utn rja az adatokat a fjlba. Ez a megklnbztets hihetetlenl fontos, s a klnbsg megrtse lnyeges ahhoz, hogy sikeresen hasznihassunk szvegfjlokat. A vlasztott tagfggvny a cljainktl fgg, de taln a Wri teLine ( l tagfggvnyt
Olvass szvegfjlbl
A szvegfjlokbl trtn olvasst a StreamReader osztly kezeli, amely
a StreamWri ter osztlyhoz hasonlan viselkedik. StreamReader tpus objektumot, pldul gy:
Elszr
snl az, hogy melyik hogyan viselkedik, amikor nem tallja a megadott fjlt. A StreamWriter boldogan ltrehoz egy j fjlt neknk, ha nem tallja a megadott fjlt, ha viszont a StreamReader nem tallja meg az adott fUt, akkor kivtelt kapunk- amit szmtsba kell vennnk a kd rsakor.
A StreamWriter objektumhoz hasonlan, amely tbbflemdon teszi lehetv adatok fjlba rst, a StreamReader is tbb mdszert knl az adatok beolvassra. A kt
Jegtbbszr hasznlt mdszer egyike a ReadTeEnd () tagfggvny hasznlata, amellyel az egsz fjlt beolvassuk, s a tartalmt egy vltozba rjuk. A ReadTeEnd () tagfggvnyt gy hasznlhatjuk System .IO. StreamReader objFile = new System . IO.S treamReader(@ "C:\test.txt" ) ; string strcontents; strContents = objFile.ReadToEnd(); objFile .Close() ; objFile .Dispose() ; essageBox.Show(strCont ent s) ; M
A ReadTeEnd ( l tagfggvnyt knyelmesen lehet hasznlni, de nha csak a szveg egy sorra van szksgnk. Pldul vegyk a korbbi pldban ltrehozott albumok listjt. Tegyk fel, hogy be akarjuk olvasni a szvegfjlt, s az abban tallt minden albumot egy
lstAlbums nev<I listamezben szecetnnk elhelyezni. A ReadTeEnd () tagfggvnnyel beolvashatjuk az adatokat, de akkor neknk kell valahogyan kikeresni bel61e az egyes albumok neveit. Egyszerre egy sor beolvasshoz a megolds a ReadLine () tagfggvny hasznlata. Az albbi kd megmutatja, hogyan tlthetjk be az Albums. txt szvegfjlt soronknt, s hogyan tehetjk az egyes albumok neveit egy listamezbe: System.IO.StreamReader objFile = new System.IO.StreamReader(@"C:\albums.txt"); string strAlbumName; strAlbumName- objFile.ReadLine(); while (strAlbumName
(
!=
null)
lstAlbums.Items .Add(strAlbumNamel; strAlbumName = obiFile .ReadLine() ; objFile.Close(); objFile.Dispose(); Ebben a pldban alkalmaztunk nhny fontos elvet, amelyeket t kell tekintennk. Az els krd~s az, hogy honnan tudjuk, hogy elrtk a szvegfjl vgt? A vlasz: amikor a visszatrsi rtk null. Teht az els6 dolog, amit ez a kd tesz (rniutn ltrehozta a StreamReader objektumot s a karakterlnc vltozt) az, hogy beolvassa az els6 sort a szvegfjlbl. Lehet, hogy aszvegfjl res, ezrt a while ciklus ezt ellenrzi. Ha a karakterlnc null, akkor a fjl res, teht a ciklus nem folytatdik. Ha a karakterlnc nem res, akkor megkezddik a ciklus. A ciklus els utastsa hozzadja a karakterlncot a listamez6hz, a kvetkez utasts pedig beolvassa a kvetkez sort a fjlbL Ez visszaadja a vgrehajtst a while utastsnak, ami pedig ismt ellenrzi, hogy a fjl vgre rtnk-e. Egy dolgot nem ellenriz ez a kd, az pedig a nulla hosszsg karakterlnc ( "). Ha a szvegfjlban res sor tallhat, a karakterlnc vltozban egy nulla hosszsg karakterlnc lesz. Az ilyen esetekre is clszeru felksZlni, arnikor szvegfjlokkal dolgozunk. Ennyi: a szvegfjlok nem adatbzisfjlok, teht sohasem fogjuk szvegfjlokkal elrni azt a teljestmnyt s rugalmassgot, amit egy valdi adatbzissal. A szvegfjlokkal viszont knny dolgozni, s az alkalmas feladatoknllenygz s gyors eredmnyt rhetnk el velk.
~-r.
b-uu:.~.rQ:
eJ
'
pn.._u <tOld "bbOptlon_C.U.olr(Ol::lject nocter.,
~~.-
20.5. bra
A Go To Definition segtsgvel gyorsan megtekinthetjk egy meghvott eljrs kdjt
e)
Caf21
ChZl
4. Vessnk egy pillantst az OpenPiet ur e (J eljrsra. Hov illesztennk be a naplfjlt ltrehoz kdot? Az egsz naplzsi kdot ebben az eljrsban helyeznnk el? Elszr is, a naplfjlt csak akkor kell frissteni, amikor egy kpet sikeresen betltttnk, teht a try blokkban lenne a helye, kzvetlenl a sbrMyStatusStrip vezrlt frisst utasts utn. Msodszor, a kdnak el kell klnlnie ettl az eljrstl, teht itt csak egy sima fggvnyhvsr helyeznk el. Adjuk hozz az albbi utastst a try blokk vghez, de mg a blokkon bell maradva:
20. ra
UpdateLog(ofdSelectPicture.FileNam ) ;
A kdunknak most a 20.6. brn lthathoz hasonlan kell kinznie. 5. Lpjnk a kurzorral az OpenPicture (l eljrs zr kapcsos zrjele utn, az ENTER letsvel nyissunk j sort, majd rjuk be az albbi eljrs kdjt:
private void UpdateLog(string strFileName)
(
System . TO . StreamWriter objFile =new System . IO . StreamWriter( System .AppDomain.CurrentDomain.BaseDirectory + @ "\PictureLog . txt ", true); objFile .WriteLine(DateTime .Now +" " + strFileName) ; objFile . Close() ; objFile .Dispose() ;
..... c
(
11 m.o- t:bll
Dtal~t..OK)
ll Z.O.CS t.be p.i.t;t\lh lRO t;;b.e: pl~utc b-oa-. olo.SbovPicc.un . n.oe ~. fnal'l.lt(oMSe..l~~.rt.~); ll Sho'llf c:H ec ot. filc in tb~ !o!W" s a.P'-ion. ~ilf. Tt. t.l'.t.Q,coacat. tPicttta:c Vl ~crt ot41e1M-P1e-t.cu:e. r.u.d l - "') ");
t...
20.6. bra
Mindi8 j tlet a kdot ssze.f88 eljrsokba e/klnftent
A BaseDirectory () tagfggvny a fut program elrsi tjt adja vissza- ezt rdemes megjegyezni. Itt hozzfirztk az alkalmazs elrsi tjhoz a PictureLog. txt fjlnevet, aminek az eredmnyekppen a naplfjl mindig az alkalmazs elrsi tjn jn ltre, ami megknnyti a felhasznlnak a naplfjl megkeresst. Egy sszetett alkalmazsban megengednnk a felhasznlnak az elrsi t kijellst, amelyet esetleg a rendszerler adatbzisban trolhatnnk, ehhez a pldhoz azonban elg az alkalmazs elrsi tja.
3. Adjunk egy j gombot az ablaksablonhoz, s a tulajdonsgai legyenek az albbiak: Tulajdonsg Name Anchor Location Text rtk btnOK Top, Right
425, 275
OK
4. Adjunk egy j szvegmez6t az ablaksablonhoz, s a tulajdonsgai legyenek az albbiak: Tulajdonsg Name Anchor Location Multiline ReadOnly Size rtk txtLog Top, Bot tom, Left, Right
12, 12
True True
488, 257
5. Kattintsunk dupln az OK gombra a gomb C l i ck esemnynek megjelentshez, majd rjuk be a kvetkez6 utastst:
this. Cl o se() ;
6. Adjuk hozz azt a kdot, amely valjban megjelenti a naplt. Kattintsunk dupln a LogViewerForm. cs elemre a Solution Explorer ablakban, majd kattintsunk dupln az ablaksablonra a Load esemny megnyitshoz. 7. rjuk be a kvetkez6 kdot a Form_Load esemnykezel6be:
try
{
System .IO.S treamReader ob jFile = new System . IO .StreamReader( System.AppOomain.CurrentDomain . BaseDirectory + @"\PictureLog . txt"); txtLog.Text ~ objFi le . ReadToEnd() ; objFile . Close() ; objFile.Dispose(); c atch txtLog .Text
=
Ez a kd olyan, mint a korbban a szvegfjlok olvassnl trgyalt kd. A ReadToEnd ( ) tagfggvnnyel a teljes naplt betlti a szvegmez6be, s az egszet egy Try ... End Try blokkba tettk, hogy felkszljnk arra az esetre is, ha a naplfjl nem ltezne. 8. Annyi teend6nk mar-adt, hogy hozzadjunk egy gombot a Piccure Viewer eszkztrhoz, amely megjelenti a naplt. Kattintsunk dupln a ViewerForm. cs elemre a Solution Explorer ablakban, hogy az ablaksablont terveznzetben lssuk. 9. Kattintsunk az eszkztrra, hogy kijelljk, majd kattintsunk az I t ems tulajdoosgra a Properties ablakban. 10. Kattintsunk a Properties ablakban az Items tulajdonsg Build gombjra az Items Collection Editor megjelentshez, majd az Add gombra egy j gomb ltrehozshoz az eszkztron. lltsuk be az j gomb tulajdonsgait a kvetkezk szerint:
Tulajdonsg
Name Image Text ToolTipText
rtk
tbbShowLog Log. png (pldkkal egytt megtallhat a szerz6 honlapjn) View Picture Log View Pict ure Log
11. Kattintsunk az OK gombra az j gomb mentshez, majd kattintsunk dupln a j gombra az eszkztron, s adjuk hozz a kvetkez6 kdot:
LogViewerForm objLog =new LogViewerForm (); objLog.ShowDialog();
20.7. bra
Sz6vegfjlokkal k6nny naplfjlokat ltrehozn t
sszefoglals
Ezen az rn megtanultuk, hogyan hasznlhatjuk a rendszerler adatbzist felhasznli belltsok trolsra s ltiolvassra. Megismertk a rendszerler adatbzis szerkezett, a legfels kulcsok, a kulcsok s az rtkbejegyzsek hasznlatt A rendszerler adatbzis komoly eszkz, ezrt a hasznlata csak megfelel6 helyzetekben ajnlott. Ne feledjk, hogy a rendszerler adatbzis nem a szemlyes trhelynk - tartsuk teht tiszteletben! A Windows bizonyos adatok teltintetben a rendszerler adatbzisra tmaszkodik, s ha sszeszemeteljk, akkor annyira tnkretehetjk a Windowst, hogy nem lesz kpes a szmtgpnk elindtsra. Ahogy a Picture Viewer projektben els kzbl lthattuk, az adatok mentse s kiolvassa a rendszeder adatbzisbl viszonylag knny\; az igazi kihvst a kiolvasott adalOk kezelse jelenti. Ez utn megismertk a szvegfjlok erejt (s korltait): a szvegfjlok rhatk s olvashatk, de egy fjlon egyszerre csak az egyiket hajthatjuk vgre. Ha rnindkettre szksgnk van, akkor adatbzist rdemes hasznlnunk. Ennek ellenre megtanultuk,
hogy viszonylag knnyen lehet egymst kvet informcikat szvegfjlokba (pldul egy naplfjlba) rni, s visszaolvasni azokat. Vgl a tanultakat felhasznlva megvalstottuk a Picture Viewer projektnkben a naplzst.
Krdezz-felelek
K: Hasznlhatok sz6vegfjlokat belltsi informcik trolsra? V: Igen, csak valamilyen mdon meg kell jellnnk az adatokat. Honnan tudhatjuk
pldul, hogy az els sor a BackColor belltsa volt, s nem az alaprtelmezett elrsi t? Az egyik megolds, hogy az adatot egy cmkhez fzzk, pldul gy: BackCol or=Whi te. Ez utn rtelmeznnk kell a szvegfjlbl beolvasott adatot. A rendszerler adatbzis valsznleg jobb megolds egy ilyen helyzetben, de a szvegfjlok hasznlata is hasznos lehet, ha a belltsokat egy msik szrrtgpre szeretnnk tvinni. K: Sz6veg helyett trolhatok binris adatokat is fj/okban? V: A Visual C# rendelkezik a binris fjlok hasznlathoz szksges osztlyokkal is: ezek a BinaryWri ter s a BinaryReader osztly. Ilyenkor ezekbl az osztlyokblltrehozott objektumokat kell hasznlnunk a StreamWr iter s StreamReader objektumok helyett
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. A rendszerler adatbzis melyik legfels kulcsban ajnion trolni egy felhasznl hitelestsi informci it? 2. Mi annak az objektumnak vagy tagfggvnynek a teljes neve, amellyel a HKEY_CURRENT_USER legfels kulcsban hozhatunk ltre egy kulcsot? 3. Melyik kt tagfggvnnyel trlhetnk egy kulcsot a rendszerler adatbzisbl, s rni a klnbsg a kett kztt? 4. Mely osztlyokat hasznljuk a szvegfjlok rsra s olvassra? 5. A StreamReader osztly melyik tagfggvnyvel olvashatjuk be egyszerre egy szvegfjl teljes tartalmt? 6. Mi trtnik, ha a StreamReader osztllyai nem ltez fjlt prblunk megnyitni?
Vlaszok
1. A felhasznli belltsokat a HKEY_CURRENT_USER legfels Irulesban ajnlott
trolni.
2. Microsoft.Win32.Registry.CurrentUser.CreateSubKey();
3. A Del eteSubKey () trli a kulcsot, de csak ha nincs benne egyetlen alkules sem. A Dt!leteSubKeyTree () trli a kulcsot s annak sszes alkulcst is. 4. Szvegfjlba a streamWri ter osztllyai rhatunk, a szvegfj1okb61 pedig a StreamReader osztllyai olvashatunk. 5. A ReadTeEnd ( ) tagfggvnnyeL 6. Kivtelt kapunk.
Gyakorlatok
1. Minden eszkztrelemhez kellene tartoznia egy megfelel menelemnek. Hozzunk ltre egy menpontot a Tools menben a napl megjelentsre. Ha mr belejttnk, akkor hozzunk ltre egyet a fjltulajdonsgok megjelentshez is, aminek az eszkztrdemt a 19. rn ksztettk el. (A tbbGetFileAttributes_Click kdjt egy kln eljrsba rdemes thelyezni, hogy meghvhatlegyen mind a menbl, mind az eszkztrrl.) Vgl menjnk vissza, s adjunk kpeket a menelemekhez, hogy hasonlan nzzenek ki, rnint az eszkztrelemek 2. Hozzunk ltre egy btnCiearlog nev gombot a Log Viewer ablaksablonon. A gomb felirata legyen Clear. Amikor a felhasznl erre a gombra kattint, trljk a naplfjlt a merevlemezrl, s zrjuk be a Log Viewer ablakot.
21.
RA
Adatbzisok hasznlata
A lecke tartalmbl:
AzADO.NET Csatlakozs adatbzishoz A DataTable objektumok mtkdse DataAdapter objektum ltrehozsa Hivatkozs mezkre egy Data Ro w objektumban Mozgs a rekordok kztt Rekordok hozzadsa, szerkesztse s trlse ADO.NET-plda Tudjuk jl, s hallottuk is sokszor, hogy az informci korban lnk. Az informci adatokat, az informcik kezelse pedig adatbzisokkal trtn munkt jelent. Az adatbzisok megtervezse mr nmagban is kln szaktudst ignyel- az adatbzis-tervezs s -kezels tmakrnek teljes knyveket szentelnek. Ezen az rn megtanuljuk az adatbzis-kezels alapjait, a Microsoft legjabb adatbzis-technolgijnak, az ADO.NET-nek a felhasznlsval. Bramodern megoldsokat olyan fejlett adatbzis-technolgik felhasznlsval dolgozzk ki, mint a Microsoft SQL Server, a Microsoft Access ltal hasznlt Microsoft Jet adatbizis knnyen elrhet , s egysze-
434
Sokat tanulunk majd ezen az rn, de tudnunk kell, hogy az itt bemutatott anyag csak a jghegy cscst jelenti. Az adatbzis-programozs gyakran igen bonyolult. Ennek az rnak az a clja, hogy minl gyorsabban megtanuljunk adatbzis-kezel kdot Imi, de ha komolyan terveznk adatbzisok programozsval foglalkozni, akkor rdemes egy-kt knyvben utnaolvasnunk ennek a tmnak.
Kezdjk egy j, Database Example nev Wmdows-alkalmazs ltrehozsval. Kattintsunk az egr jobb gombjval a Forml. cs elemre a Solution Explorer ablakban, vlasszuk a Rename (tnevezs) parancsot, s vltoztassuk az alaprtelmezett ablaksablon nevt MainForm.cs-re, majd rjuk t az ablaksablon Text tulajdonsgt is a Database Example szvegre. Miutn ltrehoztuk a projektet, kvessk a kvetkez rszben tallhat lpseket az adatbzis-kezel programunk megalkotshoz.
Az ADO.NET
Az ADO.NET a .NliT platform adatbzis-technolgija, amely a rgebbi Active Data Objects (ADO) technolgira pl. Az ADO.NET a DataSet (adathalmaz) s a DataTable (adattbla) objektumokat bocstja a rendelkezsnkre, amelyeket arra terveztek, hogy adatok nll halmazait hatkonyan mozgassk az Interneten s helyi hlzatokon, akr tzfalakon keresztl is. Emellett az ADO.NET tartalmazza a hagyomnyos kapcsolat- s parancsobjektumokat is, csakgymint a DataReader (adatolvas) nev objektumot (amely egy elre halad, rsvdett ADO RecordSet objektumra hasonlt, ha ismerjk az ADO technolgit). Ezek az objektumok egytt nagyon j teljestmnyt s tereszt6kpessget biztostanak, amikor adatokat krnk le egy adatbzisbL
Rviden, az albbi objektumokkal ismerkednk meg ezen az rn:
Az OleDBConnection objektumot egy OLEDB-adatforrshoz trtn kapcsoldsnl hasznljk. Az SqlConnect ion objektumot egy SQL Server-adatforrshoz trtn kapcsoldsnl hasznljk. A DataSet az adatoknak a memriban tallhat brzolsa. Tbbflemdon dolgozhatunk egy Dataset objektummal, pldul elrhetjk azt egy DataTable objektumon keresztl. A DataTable adatok eredmnyhalmazr trolja feldolgozshoz s naviglshoz. A DataAdapter egy DataSet objektum feltltshez hasznlhat.
Csatlakozs adatbzishoz
Ahhoz, hogy hozzfrjnk egy adatbzis adataihoz, elszr ltre kell hoznunk egy kapcsolatot egy ADO.NET-kapcsolatobjektummal. A .NET keretrendszer szmos kapcsolatobjektumot tartalmaz, pldul az OleDBConnection objektumot (amellyel ugyanazzal az OLE DB-adatszolgltatval dolgozhatunk, mint a hagyomnyos ADO esetben) s az SqlConnection objektumot (amelyet a Microsoft SQL Server hatkony elrshez terveztek). Mivel ezekben a pldkban a Microsoft Jet Database-hez csatlakozunk, egy OleDbConnection objektumot fogunk hasznlni. Egy OleDbConnection tipus objektumvltoz ltrehozshoz s a vltoz csatlakozshoz val elkszts hez a kvetkezhz hasonl utastst hasznlhatunk: OleDbConnection cnADONetConnection =new OleDbConnection();
Az ADO.NET hasznlathoz elszr hozz kell adnunk a megfelel<.~ nvteret a projek-
tnkhz. Kattintsunk dupln az ablaksablonra az esemnyei megnyitshoz, grgessnk az osztly elejre, s rjuk az albbi using utastst a tbbi using utasts utn: using System.Data. OleDb;
A kapcsolat trolsra egy modulszintii vltozt hozunk ltre, teht lpjnk a kurzorral
a public partial class MainForm : Form utasts utni nyit kapcsos zrjel(() al,
s az ENTER-t lenyomva nyissunk j sort, majd rjuk be a OleDbConnection m_cnADONetConnection
kvetkez
utastst:
= new
OleDbConnection();
Mieltt hasznlhatnnk ezt a kapcsolatot, meg kell adnunk azt az adatforrst, amelyhez csatlakozni szeretnnk. Ez az ADO.NET-kapcsolatobjektum ConnectionString tulajdonsgt felhasznlva tehet meg. A ConnectionString tartalmazza az olyan informcikat, mint a szolgltat neve, a fellusznlnv s a jelsz. A ConnectionString egyb csatlakozsi paramtereket is tartalmazhat; az elrhet paramterek attl az adatforrstl fggnek, amelyhez csatlakozni szeretnnk. A 21.1. tblzat felsorol nhnyat az OLE DB ConnectionString-paramterei kzl. Ha tbb paramtert szeretnnk megadni, akkor pontosvesszvel kell elvlasztanunk azokat.
Lers
A hasznlni kvnt adatszolgltat neve (Jet, SQL stb.). Az adatforrs (adatbzis) neve, amelyhez csatlakozni szeretnnk.
Ervnyes felhasznlnv, amelyet az adatforrshoz trtn csatlakozskor hasznlunk. Jelsz, amelyet az adatforrshoz trtn csatlakozskor hasznlunk. A hasznland adatbzis-meghajtprogram neve. Nem szksges, ha megadtuk az adatforrs nevt (DSN). Az adatforrs-kiszolgl hlzati neve.
436
@" Provider=Microsoft .J e t. OLEDB . 4 . 0; Data 2. Miutn meghatroztuk a kapcsolati karakterlncot, csatlakozzunk az adatforrshoz a kapcsolatobjektum Open ( l tagfggvnyveL Adjuk hozz a kvetkez utastst a Load esemnyhez, kzvedenl a kapcsolati karakterlncot bellt utasts utn:
m_ cnADONetConnection . Open () ;
Ha nem bztonsgos ]et adatbzishoz csatlakozunk, akkor nincs szksg felhasznlnvre vagy jelszra, ha viszont biztonsgos Jet adatbzishoz kapcsoldunk, akkor meg kell adnunk egy felhasznlnevet s egy jelszt. Ezt gy tehetjk meg, hogy a Connectionstring tulajdonsgban paramterknt tadjuk a felhasznlnevet s a jelszt. A mntaadatbzis nem biztonsgos, teht nincs szksgnk felhasznlnvre vagy jelszra.
Adatok kezelse
Adatokat az ADO.NET rendszerrel gy lehet a legknnyebben kezelni, ha ltrehozunk egy DataTable objektumot, amelybe n trolhatjuk egy tbla, lekrdezs vagy trolt eljrs eredmnyhalmazt. Egy DataTable objektumot hasznlva felvehetnk s trlhetnk rekordokat, s kereshetnk, illetve mozoghatunk kzttk A kvetkez rszben elmagyarzzuk, hogy hasznlhatjuk a DataTable objektumokat.
Kvessk az albbi lpseket egy DataAdapter hozzadshoz a projektnkhz: 1. rjuk a kvetkez utastst kzvetlenl azon utasts al, amellyel ltrehoztuk a m_cnADONewConnect ion objektumot egy modulszint vltoz ltrehozshoz (az osztly fejlcben, nem a Load esemnyben):
OleDbDataAdapter m_daDataAdapter;
2. Adjuk a kvetkez utastst az ablak Load esemnynek a vghez (kzvetlenl a kapcsolatot megnyit utasts utn):
m_daDataAdapter = new OleDbDataAdapter("Select * From Contacts,m_cnADONetConnection) ;
Mivel a DataAdapter objektumot fogjuk hasznlni az eredeti adatforrs frisstsre, meg kell adnunk az ehhez hasznlt beszr, frisst s trl utastsokat, amelyeket a mdostsok elkldshez hasznlunk. Az ADO.NET Jehetv teszi, hogy testreszabjuk a frisstsek elkldst, gy, hogy sajt kezleg meghatrozhatjuk ezeket az utastsokat adatbzis-parancsok vagy trolt eljrsok formjban. Ebben az esetben egy CommandBuilder (parancspt6) objektum ltrehozsval az ADO.NET hozza ltre neknk ezeket a parancsokat. 3. rjuk be a kvetkez utastst az osztly fejlcbe (a msik kett vltoz-meghatrozssal egytt), amellyelltrehozzuk a CommandBuilder modulszint vltozt:
OleDbCommandBuilder m_cbCommandBuilder;
A CommandBuilder abbl a szempontbl rdekes objektum, hogy miutn belltottuk a kezdrtkeit, nem dolgozunk vele kzvetlenl. A sznfalak mgtt m\1kdve kezeli az adatok frisstst, beszrst s trlst. A megfelel m\1kdshez a CommandBuilder objektumot hozz kell ktni egy DataAdapter objektumhoz. Ezt gy tehetjk meg, hogy a CommandBuilder objektumnak tadunk egy DataAdapter objektumot. Ekkor a CommandBuilder belltja magt a DataAdapter frisstsi esemnyeire, s szksg szerint elltja a beszrs, frissts s trls feladatait. 4. rjuk a kvetkez utastst a Form_Load esemny vgre a CommandBuilder objektum kezdeti belltshoz:
OleDbCommandBuilder m_cbCommandBuilder new OleobCommandBuilder(m_daDataAdapter);
Oltdlbn.talo4.11t'f'
-~'H"I
Ol~~~GQJ.l.;t.~ -~lO.r;
21.1 . bra
Ebben a pldban sok helyen, sokfo/e objektummal dolgozunk. Ogyeljnk r,
~u.AMpte;,-
IIIW
~lCIU'
Ehhez kvessk az albbi lpseket: 1. Hozzuk ltre a DataTable vltozt, azaz adjuk hozz a kvetkez utastst az osztly fejlchez egy jabb modulszint vltoz ltrehozshoz: DataTable m_dtContacts =new DataTable() ;
2. Egy egsz rtk vltozval tartjuk nyilvn a felhasznl jelenlegi pozcijt (sort)
a DataTable objektumban. Ehhez be kell rnunk a kvetkez utastst kzvetlenl az elbb bert utasts utn, amellyel az j DataTable objektumot hoztuk ltre: int m_rowPosition
= O;
3. Ezennel van egy DataAdapter objektumunk, amellyel hozzfrhetnk egy adatforrshoz a kapcsolaton keresztl. Meghatroztunk egy DataTable objektumot, amely az adatokra mutat hivatkozsokat fogja trolni. Kvetkez lpsknt adjuk hozz a kvetkez utastst az ablak Load esemnyhez a meglv kd utn, hogy a DataTable-t feltltsk adatokkal: m_daDataAdapter.Fill(m_dtContacts);
acsa.o.~r-
a'N
01..-llbOII~pt~rls..lcrt
h:ca
Caccac;t-~~~:
OlttJ"t<'cee.,.."..,l.ld-r a -+e
nn Ole~G~o~llr Ca,_d,d)ee..w.pcoe.l'):
:ec!ftu Uoez
pdftte .aid
(
Ma.t.aro.ra_roftllCl.o~o(object ~r,
FoQIIIClt~ni\O'I'V'Wat.A.rqa
e)
-....cai.IX*ctiCoa.De~J.oo.CJ.oa (),
-~c.ion.Ds..-po;HI):
21.2. bra
Ez a kd hozzfrst biztost az adatbzishoz, s ltrehoz egy DataTab/e objektumot, amelyet az egsz osztlyban brhol hasznlhatunk
= m_dtContacts . Rows[O);
A DataRow objektumokban az adatelemeket oszlopoknak hvjk. Pldul az ltalam ltrehozott Contacts tblban kt oszlop van: a ContactName s a State. Egy oszlop rtkre gy hivatkozhatunk, hogy tadjuk az oszlop nevt a DataRow objektumnak:
l l Az oszlop rtknek mdostsa m_ rwContact["ContactName] = "Bob Brown;
Vagy gy:
l l Az oszlop rtkne k kiolvassa atrContact Name = m_rwContact ("ContactName " ) ;
Ha elrjuk egy oszlop nevt, akkor futsidben kivtelt kapunk az utasfts vgrehajtsakor, de fordtskor nem kapunk semmilyen hibt.
"";
txtContactName.Text m _dl.Contacts . Rows[m_rowPosition] ["ContactName " ] .ToString() ; txtState . Text = m _dtContacts.Rows[m_rowPosition] ["State"] . ToString() ;
3. Adjuk hozz az albbi utastst a F'orm_Load esemnyhez, a meglv utastsok utn, hogy biztosak legynk abban, hogy az els rekord lesz jelenik meg az ablak
betltsekor: this.ShowCurrentRecord(); Ezzel biztostjuk, hogy az ablak els betltsekor a DataTable els rekordja jelenjen meg. Az adat megjelentshez mg nhny vezrlt hozz kell adnunk az ablakhoz. 4. Vltsunk t az ablaktervezre, hozzunk ltre egy j szvegmezt, s a kvetkezk szerint lltsuk be a tulajdons~gait (lehet, hogy vissza kell vltanunk a tulajdonsgok nzetre, ha az esemnyek mg mindig lthatk):
rtk txtContactName
48, 112 112 ' 20
5. Adjunk egy msodik szvegmezt az ablakhoz s lltsuk be a tulajdonsgait a kvetkez tblzat szerint:
rtk txtState
168 ' 11 2 80, 20
21.3. bra
Az ada.tok megjelentse nmi elkszletet ignyel
rtk btnMoveFi rs t
12 , 152 32 , 23
<<
kvetkez
21. ra Adatbzisok haS2J1lata 4. Egy msodik gombbal az elz rekordra fogunk lpni a DataTable objektumban. Adjunk egy jabb gombot az ablakhoz, s lltsuk be a tulajdonsgait a kvetkez tblzat szerint: Tulajdonsg
Name Location Size Text
rtk
btnMovePrevious 48 , 152 32 , 23
<
kvetkez
kdot a Click
ll Ha nem az els6 sorban vagyunk , a kkor lpjnk vissza egyet ll s j e l ent sk meg a rekordot
i f (m_rowPosit i on
{
!=
0)
6. A kvetkez() rekordra egy harmadik gombbal fogunk lpni a Dat a Table objektumban. Adjunk egy harmadik gombot az ablakhoz, s lltsuk be a tulajdonsgait a kvetkez tblzat szerint: Tulajdonsg
Name Location Size Text
rtk
btnMoveNext 86 , 152 32 , 23
>
kvetkez
l l Ha nem az utols sorban vagyunk, akkor lpjnk eggyel tovbb, l l s jelentsk meg a r ekordot
8. Egy negyedik gombbal az utols rekordra lpnk a DataTable objektumban. Adjunk egy jabb gombot az ablakhoz, s lltsuk be a tulajdonsgait a kvetkez tblzat szerint:
>>
kvetkez
kdot a Cl i ck esemnyhez:
l l Ha az adattbla nem res, akkor lpjnk az utols rekordra l l s jelentsk meg if (m_dtContacts.Rows.Count != 0)
{
Rekordok szerkesztse
Ahhoz, hogy egy DataTable objektumban rekordokat szerkeszthessnk, meg kell vltoztatnunk egy adott oszlop rtkt a kvnt DataRow objektumban. Ne feledjk azonban, hogy az eredeti adatforrsban a mdostsok addig nem rvnyeslnek, amg meg nem hvjuk a DataAdapter Update (l tagfggvnyt, tadva neki a mdostsokat tartalmaz DataTable objektumot. Most adjunk a programunkhoz egy gombot, amelyre kattintva a felhasznl frisstheti a jelenlegi rekordot. Ehhez kvessk a kvetkez lpseket: 1. Adjunk egy j gombot az ablakhoz, s lltsuk be a tulajdonsgait az albbiak szerint:
rtk btnSave
162, 152 40. 23
Save
kvetkez
kdot a Click
m_dtContacts.Rows[m_rowPosition) ["ContactName ")= txtContactName. Text; m_dtContacts.Rows[m_rowPosition] ["State"] = txtState .Text; m _daDataAdapter.Update(m_dtContacts);
j rekordok ltrehozsa
Egy DataTable objektumhoz j rekordokat majdnem ugyangy adunk hozz, rnint ahogy a rekordokat szerkesztjk. Egy j sor ltrehozshoz viszont elszr meg kell hvnunk a NewRow () tagfggvnyt Miutn ltrehoztuk az j sort, bellthatjuk az oszlopai rtkt. A sor tnylegesen nem lesz a DataTable rsze addig, arrug meg nem hvjuk a DataTable RowCollection (sorgyjtemny) objektumnak Add () tagfggvnyt. Most gy mdostjuk a felletet, hogy a felhasznl j rekordokat vehessen fel. Egy szvegmezt hasznlunk az gyfl nevhez s egy msikat az llamhoz. Amikor a felhasznl az ltalunk ltrehozott gombra kattint, akkor a szvegmezkbe rt rtkek j rekordknt bekerlnek a Contacts tblba. Kvessk ezeket a lpseket: 1. Kezdjk egy csoportmez (group box) hozzadsval az ablakhoz, s lltsuk be a tulajdonsgait a kvetkez tblzat alapjn:
rtk
grpNewRecord
16, 192
Size
Text
2. Adjunk egy j szvegmezt a csoportmezhz (ne az ablakhoz!), s lltsuk be a tulajdonsgait a kvetkezk szerint:
rtk
txtNewContactName
8, 2 4
112' 20
csoportmezhz,
s lltsuk be a tulajdon-
rtk
txtNewState
126, 24
80 ' 20
rtk
b t nAddNe w
21 0, 22
40, 23 Add
kvetkez
kdot a Clic k
D ataRow drNewRow = m_dtConta cts.NewRow () ; drNewRow [" ContactName J = txtNewCon tac tName .Text; drNewRow [ "State" ] = txtNewState.Text ; m_dtConta ct s . Rows .Add (drNewRow) ; m_da D ataAdapter . Update (m_dtContac t s) ; m_rowPosition = m_dtContact s . Rows. Count-1; t h i s . ShowCurr entRecord () ;
Figyeljk meg, hogy miutn hozzadjuk az j rekordot, a pozdt az utols sorra lltjuk, s meghvjuk a Sh owCurrentRecor d (} eljrst. Ennek eredmnyekppen az j rekord megjelenik a korbban ltrehozott szvegmezkben.
Rekordok trtse
Ahhoz, hogy egy Dat aTa ble objektumbl trljnk egy rekordot, meg kell hvnunk a trlend DataRow objektum Delet e () tagfggvnyt. Kvessk az albbi lpseket: 1. Adjunk egy j gombot az ablakhoz (ne a csoportmezhz!), s lltsuk be a tulajdonsgait a kvetkez tblzat szerint:
Tulajdonsg
Name Location Si ze Te xt
rtk
b t nDelete 20 6, 152 5 6 , 23 De lete
kvetkez
kdot a Cl i c k
!=0)
m_dtContacts . Rows [m_rowPosition] . Del e te (} ; m_daDat aAdapter .Upda te (m_dt Contact s) ; m_rowPosition =O ; t h is . ShoWCurrentRecord() ;
21.4. bra
Alapszint adatbeviteli rlap
sszefoglals
A legtbb kereskedelmi alkalmazs hasznl valamilyen adatbzist. Ahhoz, hogy j adatbzis-programozv vljunk, nem elg j Windows-programoznak lenni. Az adatbzisok optimalizlsa s kdolsa, a hasznlhat adatbzis-felletek s -szerkezetek kialaktsa stb. igen kiterjedt tmakr, az adatbzis-kezel alkalmazsok rsa viszont azzal az alapvet tudssal kezddik, amit ezen az rn tanultunk. Megtanultuk, hogyan csatlakozhatunk egy adatbzishoz, hogyan hozhatunk ltre s tlthetnk fel egy DataTable objektumot, s hogyan mozoghatunk a rekordjai kztt. Ezenkvl megtanultuk a rekordok szerkesztsnek, hozzadsnak s trlsnek mdjt is. Br az itt tr&>yaltak csak a felsznt rintik az adatbzis-programozsnak, ez is elegend ahhoz, hogy sajt kis adatbzis-kezel alkalmazst rjunk.
448
Krdezz-felelek
K: Ha nem jet tpus adatforrshoz szeretnnk csatlakozni, akkor honnan
tudhatjuk meg, hogy milyen kapcsolati karakterlncot kell hasznlnunk? V: A kapcsolati adatok oemcsak klnbz adatforrsok, hanem az adatforrsok klobz vltozatai kztt is eltrek lehetnek. A kapcsolati karakterlnc meghatrozsnak az a legjobb mdja, ha utnaolvasunk a hasznlni kvnt adatforrs lersban. K: Mit tehetnk, ha nem tudjuk, hogy az adatbzis futsidben hol tallhat? V: Az olyan fjl alap adatforrsok esetben, mint a Jet, hozzadhatunk egy Open File Dialog vezrlt az ablakhoz, s megengedhetjk a felhasz.nlnak, hogy megkeresse s kijellje az adatbzist. Ezutn a fjlnevet sszef(Izhetjk a tovbbi szksges adatokkal (pldul a szolgltati karakterlnccal).
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
Ismtl
krdsek
1. Mi a neve az adatelrsre hasznlt nvtrnek a .NET keretrendszerben? 2. M a neve a DataRow objektumok gyjtemnynek? 3. Hogyan tltnk fel informcival egy DataTable objektumot, s hogyan krdezzk Ie utna? 4. Milyen objektummal csatlakozunk egy adatforrshoz? 5. A kapcsolati karakterlncnak melyik argumentuma tartalmazza a tpust annak az adatnak, amelyhez csatlakozni kvnunk' 6. Milyen objektum kpes frisstsi, trlsi s beszrsi kpessgeket szolgltatni egy DataAdapter objektumnak? 7. A DataTable objektum melyik tagfggvnyvel hozhatunk ltre j sort?
Vlaszok
1. System. Data 2. DataTable 3. Egy DataAdapter objektum segtsgve!. 4. Tbbfle kapcsolatobjektum ltezik. Az adatforrsunkhoz ill kapcsolatobjektu-
Gyakorlatok
1. rjunk egy olyan programot, amely ugyanahhoz az adatbzishoz csatlakozik,
mint amelyiket ebben a pldban hasznltuk. Ahelyett, hogy egyetlen rekordot jelentennk meg a kt szvegmezben, tegynk egy listamezt az ablakra, s tltsk fel azt az adatbzisban szerepl emberek nevvel. 2. Az rn megrt kdunk pillanatnyilag az ,.res" neveket is az adatbzisba menti. Adjunk hozz egy olyan kdot az Add gomb Click esemnyhez, amely ellenrzi, hogy a felhasznl bert-e egy gyflnevet Ha nem, akkor jelezzk a felhasznlnak, hogy mindenkppen be kell rnia egy nevet, majd lpjnk ki az eljrsbL
22.
RA
Automatizlsi knyvtrra mutat hivatkozs ltrehozsa Az automatizlsi kiszolgl pldnynak ltrehozsa Az automatizlisi kiszolgl objektumainak kezelse A Microsoft Word automatizlsa
A 16. rn megtanultuk, hogyan hasznlhatunk osztlyokat objektumok ltrehozshoz. Akkor megemltettk, hogy az objektumokat elrhetv lehet tenni kls alkalmazsok szmra is. Az Excel pldul a legtbb kpessgt hozzfrhetv teszi objektumok egy halmazn keresztl. Azt a folyamatot, amikor egy program egy msik alkalmazs objektumait hasznlja, automatizlsnak hvjuk. Az alkalmazs kvlrl elrhet objektumai az alkalmazs objektummodelljt alkotjk. Egy program objektummodelljt automatizlssal irnytva lehetv vlik, hogy jrahasznostsuk az sszetevit. Az Excelt pldul automatizlssal olyan sszetett matematikai fggvnyek kiszmtsra hasznlhatjuk, amelyeknek a kiprblt kdjt mr beptettk az Excelbe, ahelyett, hogy magunk rnnk meg, s neknk kellene hibamentesteni egy ilyen sszetett kdot.
Az automatizls megismershez kt projektet fogunk kszteni. Az els egy Microsoft Excel-gyflprogram lesz, vagyis egy olyan program, amely az Excelt az Excel objektummodelljn keresztl automatizl ja. A msodikkal a Microsoft Wordt automatizljuk.
Ezeket a pldkat gy terveztem meg, hogy a Microsoft E xcel 2007 s Microsoft Word 2007 programvltozatokkal mkdjenek, ezrt a pldk hasznlathoz ezeket teleptennk kell.
Kezdjk egy j, Automate Excel nev Windows-alkalmazs ltrehozsval. Kattintsunk az egr jobb gombjval a Forml . cs elemre a Solution Explorer ablakban, vlasszuk a Rename (tnevezs) parancsot, s vltoztassuk az alaprtelmezett ablaksablon nevt MainForm.cs-re, majd lltsuk az ablak Text tulajdonsgt az Automata Excel szvegre.
Az eszkztron dupln kattintva a Button gombra adjunk hozz egy gombot
kvetkezk
szerint:
rtk
btnAutomateExcel
90, 128 104, 23
Autornate Excel
22. ra Alkalmamsok
automatimlssal 453
1. Vlasszuk a Project men Add Reference (Hivatkozs hozzadsa) parancst az Add Reference prbeszdablak megjelertshez. 2. Kattintsunk a COM flre a szmtgpen elrhet COM-sszetevk (vagyis a tpusknyvtrral rendelkez6 programok) megjelenitshez. 3. Grgessnk le a listban, s keressk meg a Microsoft Excel 12.0 Object Library elemet (lsd a 22.1. brn). Az Excel elemre dupln kattintva hozzunk ltre egy r mutat hivatkozst, s zrjuk be a prbeszdablakot.
hfoaosoft fillService :tended COM T~ IJbmy 1.0 hfoaosoft FillService Eltended COM T~ lli>'"'Y 1.0
l.D Mmosoft forms 2.0 Objod: Ubwy Mkrosoft forms 2.0 Objut Ubwy
MaD<oft
F-,
-n
1.D
22.1. bra
Egy COM-k6nyvtrra mutat6
2.D
2.0
hivatkozssal lehetv tesszk a Visual C#-programnak, hogy feltsmetje s hasznlja a k6nyvtr objektumait
Ha nem ltjuk az elrhet COM-sszetevk listjban a Microsoft Excel 12.0 Object Library elemet, akkor valsznleg nincs teleptve az Excel 2007~ s ez a plda nem fog mkdni. Ha tallunk egy Microsoft Excel 11.0 Object Library nev elemet, akkor az az Excel 2003 programra hivatkozik. Ebben a fejezetben a kdot hasznlhatjuk az Excel 2003 vltozatval is, de annl korbbival nem.
utastst az osztlyunkhoz. Kattintsunk dupln a gombra, hogy megnyissuk a Click. esemnyt, majd grgessnk az osztly elejre, s a mr meglev us ing utastsok utn rjuk be ezt az utastst: using Excel = Microsoft.Office.Interop.Excel; Ez a using utasts kicsit eltr az eddig hasznltakt l, mivel egy egyenlsgjelet is tartalmaz. Ez a parancs vgrehajtja aszoksos us ing utastst, de egyben ltrehozza az Excel loevet is, teht amikor ezutn az Excel szt rjuk a kdba, akkor a fordt azt Microsoft. Office . Interop.Excel-knt fogja rtelmezni. Ezzel cskkentjk annak a szksgessgt, hogy az Excel automatizlsi knyvtrnak hasznlatakor hossz szvegeket kelljen begpelnnk.
Kvetkez lpsknt rjuk be az albbi kdot, amely ltrehoz egy j Excel Application objektumot a btnAutomaticeExcel_Click esemnyben:
Excel .Application objExcel =new Excel.Application(); Figyeljk meg, hogy a Visual C# intelligens lenyl listjban megjelenik az Excel. Ez azrt lehetsges, mert ltrehoztunk egy hivatkozst az Excel tpusknyvtrra . Az Excel egy hivatkozs a kiszolglra, s az Application egy a kiszolgl ltal tmogatott objektum. Ez az utasts az Exce l objektummodellre alapozva egy j Application objektumot hoz ltre.
A kiszolgl irnyftsa
Miutn ltrehoztunk egy automatizlsi kiszolgl egy objektumbl egy pldnyt, a kiszolglt az objektumon keresztl irnythatjuk (objektumokat hozhatunk ltre, tulajdonsgokat llthatunk be, tagfggvnyeket hvhatunk meg, s gy tovbb). A kvetkezkben az Excel-objektumot tulajdonsgok belltsval s tagfggvnyek meghvsval irnytjuk, arnivel gyakorlatilag magt az Excelt hasznljuk a folyamat sorn.
Az Excellthatv ttele
Amikor az Excelt automatizltan indtjuk el, akkor rejrve tltdik be, gy a felhasznl nem lthatja a grafikus fellett Ha gy rejrve marad, akkor a fejlesztk gy hasznlhatjk ki az Excel lehetsgeit, majd zrhatjk be azt a hasznlat utn, hogy a felhasznl nem is tud rla. Pldul ltrehozunk egy pldnyt egy Excel-objektumbl, vgrehajtunk egy sszetett szmtst vele, bezrjuk az Excelt, s az eredmnyt visszaadjuk a felhasznlnak- minde~t gy, hogy a felhasznl nem is ltta az Excelt mkds kzben. Ebben a pldban azonban ltni szeretnnk az Excelt, hogy kvetni tudjuk a kdunk mkdst. Szerencsre az Excel lthatv ttele igen egyszeru; csak a kvetkez utastst kell megadnunk az Excel megjelentshez:
objExcel .Visible
= true;
Excel-munkafzet ltrehozsa
Az Excelben a munkafzet egy fjlt jelem, amelyben dolgozunk, s amelyben az adatokat troljuk. Munkafzet nlkl nem tudunk dolgozni az ExcelleL Amikor a Start menbl elszr elindtjuk az Excelt, az Excel egy res munkafzetet hoz ltre a szmunkra.
Ankor azonban automatizltan indljuk el az Excelt, nem jn ltre res munkafzet- errl neknk kell gondoskodnunk. j munkafzet ltrehozshoz a workbooks (munkafzetek) gyjternny Add tagfggvnyt hasznljuk. rjuk be a kvetkez utastsokat, hogy j munkafzetet s egy az alaprtelmezett mun.kalapra mutat hivatkozst hozzunk ltre (ez utbbival a kvetkez rszben foglalkozunk):
l l j munkafzet s j munkalap ltrehozsa Excel.Workbook objBook = objExcel.Workbooks.Add(System.Reflection.Missing.Value); Excel.Worksheet objSheet = (Excel.Worksheet)objBook.Worksheets.get_Item(l);
A munkafzetek cellinak kezelshez az ActveCell objektumot hasznlhatjuk, amely az Application objektum egyik objektumtulajdonsga. Ha egy cellba adatot szeretnnk rni, akkor elszr ki kell jellni, majd t kell adni neki az adatot. Cellt a Range
meg, hogy a Range objektummal kijelljk a cellkat, aktivlunk egy j cellt, amelybe az sszeget fogjuk tenni, s megint a FormulaRlCl tulajdonsgot hasznljuk az sszeg kiszmtsra, de most konkrt rtk helyett egy kpietet adu nk t neki. 2. rjuk be az albbi kdot az eljrsunkba:
objRange = objSheet . get_Range( ' E1 ', System . Reflection .Miss ing .Value); objRange.set_Value(System.Reflection.Missing .Value, "=SUM (RC[- 4) : RC[-1)) "
_ ) ;
kvetkez
Az utols teendnk, hogy megszntessk az objektumhivatkozst az objektumvltoz null rtkre lltsval. Az Excel nyitva marad, annak ellenre, hogy
megszntettk az automatizlsi pldnyt (nem minden kiszolgl mO'kdik gy). 3. Adjuk hozz ezt az utols utastst az eljrsunkhoz:
obj Excel=null;
Hogy biztosak legynk abban, hogy mindent jl rtunk be, a 22.1. pldban a teljes eljrst megmutatjuk.
22.1. plda
{
Kd tU Excel automattzd/Asra
private void btnAutomateExcel_Click(object sender, EventArgs e) Excel.Application objExcel =new Excel.Application(); objExcel.Visible = true;
l l j munkafzet s munkalap ltrehozsa Excel.Workbook objBook = objExcel.Workbooks .Add (Systern .Reflection .Missing .Value); Excel.Worksheet objSheet = (Excel.Worksheet)objBook .Worksheets.get_ Item(l); l l Cellk kijellse s az adatok belltsa egy Range l l objektum segtsgvel
Excel.Range objRange; objRange = objSheet.get_Range( "Al" , _System.Reflection.Missing.Value); objRange.Value2 = 75; obj Range = obj Sheet. get_Range ( Bl", _System.Reflection.Missing.Value); objRange .Value2 = 125; objRange = objSheet.get_Range("Cl", _System.Reflection.Missing . Value); objRange.Value2 = 255; objRange = objSheet .get_Range("Dl", _System.Reflection.Missing.Value); objRange.Value2 = 295;
= null;
Az gyflalkalmazs tesztelse
Most, hogy a programunk ksz, futtassuk az F5 billentyl1vel, s kattintsunk a gombra az Excel automalizlshoz. Ha jl rtuk be a kdot, akkor az Excel elindul, az adatok bekerlnek a ngy cellba, az tdik cellban megjelenik az sszegk, s mindegyik flkvr lesz, ahogy a 22.2. brn lthatjuk.
...... ~-
.... :J . . :
l
oo+ ~ l
22.2. bra
Gyakorlatilag az egsz Excelt irnythatjuk az objektummodelljn keresztl
22.3. bra
Mnden COM-k6nyvtrra ebben
rtk
btnAutomateWord
90, 128 104, 23
Automat e Word
2. Kattintsunk dupln a gombra a eli ck esemnynek megnyitshoz. 3. Grgessnk az osztly elejre, s rjuk a meglv us ing utastsok utn ezt
az utastst: us ing Word = M icrosoft.Office.In terop.Word; 4. Ha a Word objektummodelljvel szerelnnk dolgozni, akkor szksgnk van e::gy pldnyra a Word Application objektumbL rjuk be a kvetkez utastst a gomb Cl i ck esemnybe egy olyan vltoz ltrehozshoz, amely tartalmazza a Word Applicat i on objektumnak egy pldnyt (a kd tovbbi rszt is a gomb Click esemnyben helyezZk el): W ord.Application objWord =new Wor d.Application (); 5. Az Excelhez hasonlan a Word is rejtve indul, gy a felhasznl nem tud a futsrL Mivel mi ltni szeretnnk a munknk gymlcst, adjuk hozz ezt az utastst a Word megjelentshez: ob j Word.Visible = t rue; 6. Ltre kell hoznunk egy j dokumentumot a WorddeL Ezt a Doc ument s gyjtemny Add ( ) tagfggvnyvel tehetjk meg. Ennek a tagfggvnynek ngy paramtere van, de mivel nem ktelezek, nem adjuk meg egyiket sem. A tagfggvny meghvsakor azonban az argumentumait meg kell adnunk, de ahelyett, hogy a Sy stem. Reflec t ion .Mi ssing. Value objektumot hasznlnnk minden kihagyhat paramter helyn, ami gyakorlatilag azzal egyezik meg, mintha nem adnnk meg a krdses paramtert, ltrehozunk egy vltozt, amely ezt az rtket trolja, s ezt hasznljuk az Add ( ) tagfggvny meghvsakor. ijuk be ezeket az utastsokat a vltoz meghatrozshoz s az j dokumentum ltrehozshoz: W ord.Document obj D oc ; object ob j Missing = System.Ref lection.Mi ssing.Value ; ob j Doc = objWord. Documents.Add( ref objMissing, re f objMissing, ref objMissing, ref objMissing); 7. Szmos mdon rhatunk szveget a Wordbe. Taln a legegyszerbb a Selection objektum TypeText ( ) tagfggvnyt hasznlni. A Selection objektum az ppen kijellt szvegre hivatkozik a Word-dokumentumban. Amikor j dokumentumot
hozunk ltre, abban mg nincs semmilyen szveg, ezrt a Selection objektum egyszen1en a dokumentum elejn lv kurzorra mutat. A Selection . TypeText () tagfggvnnyel a Wordbert szveget a dokumenn1m elejre szrjuk be. A szvegnek a Wordbe rshoz adjuk me::g ezt az utastst: objWord.Selection.TypeText ("This is text from a CH 2008 application. l ;
8. Az utols berand utasts a Word-objektumot null rtkre lltja a hivatkozs
felszabadtshoz: objWord = null: Most nyomjuk meg az F5-t a program futtatshoz. Ltnunk kell, ahogy a Word elindul,
s ltrejn egy j dokumentum a TypeText (} tagfggvnnyel megadott szveggel (lsd a 22.4. brn).
22.4. bra
Egyszer,
de hatsos
Az alkalmazsok automatizlsa, klnsen az olyan Office-termkek esetben, mint az Excel vagy a Word, sok rendszererforrst ignyel. Ha sok automatizlst terveznk vgrehajtani, akkor a leggyorsabb gpet rdemes hasznlni a lehet legtbb memrival. Ne feledkezznk meg arrl sem, hogy az automatizls mOkdshez az alkalmazsunk mallett a kiszolgl alkalmazsnak (ebben az esetben az Excelnek vagy a Wordneki is teleptve kelllennie a felhasznl szmltgpre.
sszefoglals
Ezen az rn megtanultuk, hogy egy gyflalkalmazs hogyan hasznlhat egy programot az objektummodelljn keresztl, ha a program ezt lehet6v teszi. Megtanultuk, hogy a (kiszolgl) program automatizlsnak els lpse egy hivatkozs ltrehozsa a kiszolgl tpusknyvtrra. A tpusknyvtrra mutat hivatkozs ltrehozsa utn a kiszolgl objektumai gy rhet6k el, mintha a Visual C# sajt objektumai lennnek. Lthattuk, hogy egy program automatizlsa nem is nehz, s a knyvben korbban tanult objektumkzpont programozsi kpessgekre pl. A valdi kihvst az adon kiszolgl objektummodelljnek s az elrhet objektumok leghatkonyabb felhasznlsnak a megismerse jelenti.
Krdezz-felelek
K: Mlyen alkalmazsok tmogatjk az automatzlst? V: Az automatizlst minden Microsoft Office-termk - belertve a Microsoft Visio
programot is- tmogatja. Egy olyan gyflb61, amely tbb autornatizls kiszolglt is hasznl, komoly alkalmazst hozhatunk ltre, pldul szmolhatunk az adatokkal az Excelben, s az eredmnyt megformzhatjuk s kinyomtathatjuk a Wordben. K: Lehetsges automatizlsi kiszolgl6t kszteni, azaz lehetv tenni ms programoknak az alkalmazsarn irnytst? V: Igen, lehet olyan .NET-sszetev6ket ltrehozni, amelyeket ms programok hasznlhatnak Ha ez a tma rdekel minket, akkor rdemes rla egy rszletesebb, komolyabb anyagat is elolvasni.
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
lsmtl6 krdsek
1. Mit kell tennnk, rniel6n egy automatizlsi kiszolgl objektumait hasznl-
hatnnk? 2. Mi a legvalsznabb oka annak, ha egy tpusknyvtrat nem tallunk az Add References prbeszdablakban? 3. Mit kellltrehoznia a Visual C#-programnak egy COM-knyvtr hasznlathoz?
Vlaszok
2. 3. 4. 5.
l. Ltre kell hoznunk egy hivatkozst a kiszolgl tpusknyvtrra. Az alkalmazs nincs teleptve.
Egy burkelt a COM-knyvtrhoz. Egy objektumot, amely a kiszolgl egy pldnyostott vltozatt trolja. Olvassuk el az sszetev sgjnak programozknak sznt rszt.
Gyakorlatok
l. Mdostsuk gy az Excel-pldt, hogy a felhasznltl egy fjlnevet krjen a munkafzet mentshez. (Tipp: Ne feledkezrunk meg az Application
objektum save ( )
tagfggvnyrl.)
Exceltl
2. Mdostsuk gy az Excel-pldt, hogy a ngy cella sszeadsa utn az kapott sszeget egy j Word dokumentumban helyezze el.
V.
RSZ
A .NET madrtvlatbl
23.
RA
Az alkalmazsok kzzttele
A lecke tartalmbl:
A ClickOnce technolgia ClickOnce-program ksztse a kzztteli varzsl segtsgvel A Click0nce-telept6programok tesztelse A teleptett alkalmazsok eltvoltsa A ClickOnce-programok ltrehozsnak halad belltsai
Most, hogy megtanultuk, hogyan kszthetnk alkalmazsokat a Visual C# 2008 segtsgve!, valsznilleg gnk a vgytl, hogy programokat rjunk, s kzztegyk azokat az egsz vilgon. A Visual C# 2008 szerencsre tartalmazza mindazokat az eszkzket, amelyek ahhoz szksgesek, hogy elksztsnk egy telept6programot, amelyet a felhasznl futtathat az ltalunk fejlesztett alkalmazs teleptshez, s ezen az rn el is fogjuk kszteni az l . ra ta ptgetett Picture Viewer alkalmazs telept6jt.
A ClickOnce technolgia
gy tGnik, a Microsoft nem kpes megmaradni egyetlen teleptsi technolgia mellett sem. A .NET eltt a komoly fejlesztk arra knyszerltek, hogy kls alkalmazsokat hasznljanak a teleptprogramok ksztshez, majd a Microsoft bevezette a Windows Installer Technology nev\i megoldst, amelyben a fejleszt6knek MSI fjlokat kellett ltrehozniuk az alkalmazsok teleptshez. Ezt kveten, a Visual C# 2005-ben a Microsoft ismt egy jabb technolgival llt el: ez volt a ClickOnce. A ClickOnce ("egykattintsos telepts") technolginak is megvannak a maga htrnyai, fknt a rugalmatlansga, de a korbbi megoldsokhoz kpest jelents elrelpst jelent, s a Microsoft folyamatosan tovbbfejleszti. A legtbb fejlesztst leginkbb azok a tapasztalt fejleszt61c fogjk rtkelni, akik mr kzdenek egy ideje a teleptsi megoldsokkal. Ezen az rn bemutatjuk a ClickOnce technolgia legfontosabb jellemzit, majd miutn megrtettk, hogy milyen lehetsgeket knl, lpsrl lpsre elksztnk egy ClickOnce-programot, amely a Picture Viewer programunkat telepti a felhasznl szmtgpre.
Az j ClickOnce technolgia
legjelentsebb
vonsai a
kvetkezk:
A ClickOnce-t arra terveztk, hogy az asztali alkalmazsok teleptst a webalkalmazsokhoz hasonlan egyszerilv tegye. Egy asztali alkalmazs terjesztsekor hagyomnyosan rrnden gyflszmtgpen futtatnunk kell a teleptprog ramot, s teleptennk kell a megfelel fjlokat A webalkalmazsokat ezzel szemben csak egy helyen, a webkiszolgln kell frissteni. A ClickOnce az asztali alkalmazsokat a webalkalmazsokhoz hasonl frisstsi kpessgekkel ruhzza fel. A ClickOnce segtsgvel teleptett alkalmazsok kpesek frissteni magukat, j vltozatot keresni a Weben, s nmt!kden telepteni azt. A ClickOnce-programok csak azokat a fjlokat frisstik, amelyeket szksges. A korbbi teleptsi megoldsok esetben a frisstshez a teljes alkalmazst jra kellett telepteni. A ClickOnce lehetv teszi az alkalmazsoknak, hogy az sszeteviket gy teleptsk, hogy az ne zavarjon ms teleptett alkalmazsokat. Ms szavakkal, a ClickOnce-szal teleptett programok fggetlen alkalmazsok. A Windows Installerrel (vagyis a "rgi mdszerrel") teleptett prograrnak kzsen hasznltak bizonyos sszetevket, pldul egyes egyedi vezrlket Ha egy alkalmazs vletlenl egy sszetev rgebbi vagy sszefrhetetlen vltozatt teleptette, az adott megosztott sszetevt hasznl tbbi alkalmazs mkdskptelenn vlhatott. A Windows Installerrel teleptett alkalmazsokkal ellenttben a ClickOnce-programok nem ignylik, hogy a teleptst vgz felhasznJk felgyeleti jogosultsgokkal rendelkezzenek. Nem lehet elgg hangslyozni, hogy ez mennyire komoly elny, s csak rlhetnk, hogy a ClickOnce fejleszti gy dntttek.
le) menpontot, amely elindtja a 23.1. brn lthat kzztteli varzslt (Publish Wizard). A varzsl els oldaln azt hatrozhatjuk meg, hogy hol szecetnnk ltrehozni a ClickOnce-fjlt.
23.1. bra
A ClckOnce-programok ltrehozst segt kzzttel varzsl
rsi utat kell megadnunk, mert a Visual C# nem hozza ltre helyettnk a mappt Ha rvnytelen tvonalat adunk meg, a varzsl futtatsnak vgn felptsi hibt kapunk. Figyeljk meg az brn lthat pldkat: megadhatunk knyvtrelrsi tvonalat, megoszton mappt, FTI>-kiszolglt s webhelyet is. Miutn megadtunk egy rvnyes tvonalat, kattintsunk a Next (Tovbb) gombra.
23.2. bra
A Jelhasznlk hromflekppen telepthetik az alkalmazsunkat
23.3. bra
A ClckOnce-alkalmazsok frissithetik magukat, ha ennek megfelelen tervezzk meg ket
4. A Publish Wizard kvetkez oldala, amelyet a 23.3. brn lthatunk, arra vr vlaszt tlnk, hogy az alkalmazs keres-e majd frisstseket. Amennyiben az alkalmazsunk tmogatja ezt a lehetsget, jelljk be az ennek megfelel vlasztgombot, s adjuk meg a hely~t, ahov a frisstett fjlokat helyezni
23.4. bra
hogy minden bellts helyes-e, mieltt befejeznnk a varzs/6 futtatst
Ellenrizzk,
"'-'.
Foldul
;~~
- -ll
~-~~~
~-ll
Ji
j Hourll Jj Hour17
-ll
......u
,..._n
23.5. bra
A CllckOnceprogramot ennek a mappnak (s az almappinak) a fjljai alkotjk
A Click0nce-telepft6programok tesztelse
A telepts megkezdshez futtassuk a kijellt ClickOnce-mappban tallhat Set up . exe fjlt. Ekkor egy animlt prbeszdablak jelenik meg (s tCinik el gyorsan), amely azt jelzi, hogy a szrrtgp rvnyes intemetkapcsolatot keres. A telept els olyan prbeszdablaka, amellyel kapcsolatba lphetnk, egy biztonsgi figyelmeztets, amelyet a 23.6. brn lthatunk. Ezen az sszetev kzztevje (Publisher) ismeretlenknt (Unknown) jelenik meg, meet a fjl nem rendelkezik digitlis alrssal.
23.6. bra
Minden
ClckOnce-teleptprogram
A fjlok digitlis alfrsnak tmakre kvl esik ennek a knyvnek a keretein, de ha tbbet szeretnnk tudni rla, keressk fel a h t tp : 1 / www. verisign . com/ cmet, s keressnk r a "code s ignirig" kifejezsre.
A Picture Viewer teleptshez kattintsunk az Install (Telepts) gombra. Ennyi az egsz. Egyetlen tovbbi prbeszdablakkal sem kell foglalkoznunk, s a Picture Viewer nmt1kden el is indul, amint a telepts befejezdtt. Most nyissuk meg a Start ment, ahol egy j mappt lthatunk, valsznt1leg annak a cgnek a nevvel, amellyel bejegyeztettk a Visual C# 2008-at. Ebben a mappban (almenben) talljuk meg a Picture Viewer program parancsikonjt, amelyre kattintva a felhasznl elindthatja a programot.
~C0t~
-c..,...-c.,.--~
-c..-~ c..-
lll.,_
~
a .."-ftW.-:IOlloo-oi!Ouolo-~... ._,.
INI
--
-~
lll.,_ lll.,_
~
vun. lilllim
J/1t/IIOI
liUilO
-c..,...o;..
23.8. bra
A ClickOrlce halad belltsait a projekt tulajdonsgablaknak Pubfish lapjn adhatjuk meg
sszefoglals
Ezen az rn a ClickOnce technolgirl tanultunk, illetve arrl, hogy mirt trt t a Microsoft erre a megoldsra a Windows InstallerrL Lthattuk, hogyan kell hasznlni a Publish Wizardot a ClickOnce-teleptprogramok ltrehozsra, ha a Visual C# 2008 segtsgvel ksztett alkalmazsokat szeretnnk kzztenni. A nagyobb alkalmazsok teleptprogramjainak elksztse lnyegesen tbb erfesztst s sok esetben tbb eszkzt is ignyel, de az ezen az rn elsajttott tuds birtokban a Visual C# 2008-ban kezdknt elksztett egyszer programjaink tbbsgt kpesek lesrunk kzztenni.
Krdezz-felelek
tetszets teleptvarzslkat, amilyeneket ms alkalmazsok hasznlnak? V: Ha olyan hatkony teleptprogramokat szeretnnk kszteni, amelyek varzslk segtsgvel adatokat gyjtenek a felhasznlkt61, mdostsokat eszkzlnek a rendszerler adatbzisban, lehetv teszik tovbbi fjlok belefoglalst a teleptsbe, parancsikonokat hoznak ltre, s gy tovbb, egy olyan eszkzre lesz sruksgnk, amely a Windows Installer technolgira tmaszkodik. K: Felttelezhetjk, hogy minden jelhasznlnk szmtgpn megtallhat a .NEr-keretrendszer? V: ltalban nem. Amikor frisstseket tesznk kzz egy programhoz, valsznleg biztonsgos felttelezni, hogy a felhasznl teleptette a .NET-keretrendszert, de ha els teleptsrl van sz, a .NET-keretrendszert elfelttelknt kell meghatroznunk (ne feledjk, hogy ez alaprtelmezs szerint megtrtnik).
Ismtls
Ez a rsz az anyaggal kapcsolatos krdsek felvetsben, valamint a tanultak ttekintsben segt, s hozzjrul ahhoz, hogy az elmleti tudsunkat a gyakorlatban is kamatoztathassuk.
Ismtl
krdsek
1. Hogy hvjk a Microsoft j teleptsi technolgijt? 2. Igaz vagy hamis? "A ClickOnce-programok kpesek frissteni nmagukat." 3. Igaz vagy hamis? "A ClickOnce-programok rugalmasabbak, mint a Windows Installerre tmaszkod alkalmazsok." 4. Milyen hrom mdszerrel telepthetik a felhasznlk a ClickOnce-programokat? 5". Mi a neve a ClickOnce-programok ltrehozst segt varzslnak?
Vlaszok
1. ClickOnce. 2. Igaz. 3. Hamis. A Windows Installer technolgia lnyegesen nagyobb rugalmassgot biztost, mint a ClickOnce. 4. Weboldalrl, megosztott hlzati mappbl vagy egy olyan adathordozrl, rrnt a CD-ROM. 5. Publisb Wizard (Kzztteli varzsl).
Gyakorlatok
1. A Publish Wizard segtsgvel ksztsnk teleptprogramot a 22. rn ltrehozott
Automale Excel projekthez. Prbljuk a ClickOnce-programot egy olyan szmtgpre telepteni, amelyen nem ll rendelkezsre az Excel, s figyeljk meg, hogy rr trtnik, amikor elindtjuk a programot. 2. Ha hozzfrnk egy webkiszolglhoz, a Publish Wizard segtsgvel teleptsk a Picture Viewer programot a kiszolglra, majd teleptsk az alkalmazst egy msik szmtgpre a webkiszolglrl.
24.
RA
A .NET madrtvlatbl
A lecke tarta/mbl:
A .NET-keretrendszer mkdse A kzs futsidej krnyezet mkdse A Microsoft kztes nyelvnek hasznlata a Visual C# 2008-ban A Visual Studio .NET nvtereinek hasznlata A kzs tpusrendszer mkdse A szemtgyjts mkdse
Most mr nagyon sokat tudunk a Visual C# 2008-rl. Kpesek vagyunk projekteket ltrehozni, ablaksablonok s vezrJk segtsgvel felleteket pteni, s tudjuk, hogyan adhatunk menket s eszkztrakat az ablakokhoz. Azt is megtanultuk, hogy tniknt hozhatunk ltre modulokat s eljrsokat, s hogyan rhatunk olyan kdot, amely mveleteket vgez. Tudjuk hasznlni a vltozkat, dntsi elgazsokat tudunk ltrehozni, ciklusokat tudunk vgrehajtani, s kpesek vagyunk megkeresni a hibkat is a kdunkban. Feltehetjk teht a krdst: "Hogyan tovbb?". Ez valjban az els szm krds, amit az olvask fel szoktak tenni nekem az elektronikus leveleikben.
A .NEl-keretrendszer
A Microsoft .NET-et felpt sszetevket s technolgikat egyttesen .NET-keretrendszernek hvjuk. A .NET-keretrendszer (.NET Framework) szmos osztlybl ll, s olyan sszetevket tartalmaz, rnint a kzs futsidej krnyezet vagy futsidej rtelmez (Common Language Runtime, CLR), a Microsoft kztes nyelve (Intermediate Language, IL) s az ADO.NET. A .NET-keretrendszert felpt klnbz elemeket a kvetkezk ben rszletesen is megvizsgljuk
Br a Microsoft hivatalosan nem jelentett be ilyen irny terveket, nem elkpzelhetetlen, hogy a kzs futsidej krnyezetbl olyan vltozatot is kszteni fog, amely ms opercis rendszereken, pldul Macintosh OS-en vagy Linuxon fut. (Valjban mr ma is ltezik egy olyan nyfit forrs eszkz, amely korltozott mrtkig lehetv teszi a .NEl-alkalmazsok futtatst Linuxon.) Ha ez bekvetkezik, a Windowsra rt alkalmazsaink minimlis mdostssal vagy mdosts nlkl kpesek lesznek futni az jonnan tmogatott opercis rendszereken is.
megkrdjelezik
a .NET-kdok s ltalban a .NEl-keretrendszer biztonsgt. Ha a kdjaink biztonsga elsrend szempont a szmunkra, javasolt nllan utnanzni a tmnak.
Az alkalmazs lefordtshoz s futtatshoz szksges lpsek kzl nem az IL kd ellltsa az utols. Ahhoz, hogy egy processzor (CPU) kpes legyen vgrehajtani a beprogamozott utastsokat, a szmtgp nyelvn, gpi utastsokknt kell megkapnia azokat. Amikor egy .NET-alkalmazst futtatunk, egy futsidej fordt (just-in-time, rvidenjiT fordt vagy JITter) alaktja a kztes nyelv( kdot a processzor szmra rtelmezhet gpi utastsokk.
C# forrskd
t
Visual Basic .NEl-fordtprogram
C#-fordtprogram
*
~
~
XXX nyelvi fordtprogram
t
Futsidaja (JIT) fordlt
t
Processzorfgg6, gpszinttl utastsok 24.1. bra
A fejleszti kdbl ezek a lpsek lltanak elJutta that 6sszetev6ket
Az IL kd processzorjggetlen, ami ismt csak azt jelenti, hogy lehetsges olyan futs-
idejO' fordtkat kszteni, amelyek nem Intel-megfelel, hanem ms tgpek szmra lltanak el gpi kdot.
rendszer szm-
Ha a Microsoft gy dnt, hogy a Windowson kvl ms opercis rendszerek szmra is elrhetv teszi a kzs futsidej1I krnyezetet, a klnbsgek nagyrszt arra fognak korltozdni, hogy a futsidej fordt hogyan fordtja le a kztes nyelvO' kdot.
llt fordtn-vgrehajtott optimalizlsok ugyanakkor nyelvfggek, ami azt jelenti, hogy brminden .NET-nyelvG kdbl IL kd jn ltre, s nnden ilyen kd a kzs futsidejG krnyezetre tmaszkodik, elfordulhat, hogy egyes nyelvek nmi elnyre tesznek szert ms nyelvekkel szemben, amiatt, ahogy a fordt az adott nyelv() kdot IL kdra fordtja.
Nvterek
Ahogy a knyvben korbban emltettk, a .NET-keretrendszer osztlyokbl, mgpedig rengeteg osztlybl pl fel. Ezeket az osztlyokat nvterek szervezik hierarchikus szerkezetbe, s a nvterek segtenek megakadlyozni a nvtkzseket is. Nvtkzs akkor kvetkezik be, amikor kt osztlynak azonos a neve. Mlvel azonban a nvterek hierarchiba rendezik az osztlyokat, lehet kt azonos nevG osztlyunk, feltve, hogy a kett ms-ms nvtrben tallhat. A nvterek teht lnyegben hatkrt biztostanak az osztlyoknak. A .NET-keretrendszer alapvet nvtere a System nvtr. A System nvtr tartalmazza a (hamarosan bemutatand) szemtgy()jts, a kivtelkezels s az adattpusok osztlyait, s gy tovbb. A System nvtr azonban csak a jghegy cscsa: nvterek tucatjai lteznek. A leggyakrabban hasznlt nvtereket a 24.1. tblzatban felsorolva lthatjuk - sokat kzlk hasznltunk is a knyv sorn. Minden vezrl, amit elhelyeztnk az ablakokon, s maguk az ablaksablonok is a System. Windows. Forms nvtr tagjai. A 24.1. tblzatot tmutatknt hasznlhatjuk - ha egy adott nvtrre rszletesebben is kvncsiak vagyunk, nzZnk utna a Visual Studio .NET sgjban.
24.1. l6lllat
Nvtr Leirs Microsoft.. VisualBasic A Visual Basic kdokellltst s lefordtst tmogat osztlyokat tartalmazza. System Azokat az alapvet osztlyokat tartalmazza, amelyek a leggyakrabban hasznlt rtktpusokat s hivatkozsi adattlpusokat, esemnykezelket, felleteket, jellemzolcet s kivteleket hatrozzk meg. Ez a .NET alapnvtere. System . Data Az ADO.NET architektrt alkot osztlyokat tartalmazza. Azokat az osztlyokat tartalmazza, amelyek lehetvteszik System . Diagnostics a hibakeresst az alkalmazsokban, illetve a kdok vgrehajtsnak nyomkvetst System. Drawing A grafikus eszkzfellet (GDI+, Graphical Device Interface) alapvet grafikai szolgltatsainak elrst biztost osztlyokat tartalmazza. Azokat az osztlyokat tartalmazza, amelyek lehetvteszik System . ro az adatfolyamokba s fjlokba trtn rst, illetve az onnan trtn olvasst. System . Net Olyan osztlyokat tartalmaz, amelyek egyszeru programozsi felletet nyjtanak a hlzaton tallhat szmos protokollhoz. System. Security A kzs futsidej krnyezet biztonsgi rendszere mgtt meghzd szerkezetet alkot osztlyokat tartalmazza. System . Web A bngsz s a kiszolgl kzlti kommunikcit lehet6v tev felleteket biztost osztlyokat tartalmazza. System . Windows. Fo rrns Olyan Windows ala p alkalmazsok ltrehozshoz tartalmaz osztlyokat, amelyek a Microsoft Windows opercis rendszerben elrhet gazdag felhasznli felleti szolgltatsokat hasznljk. System . Xml Azokat az osztlyokat tartalmazza, amelyek szabvnyokon alapul tmogatst nyjtanak az XML-feldolgozshoz.
A kzs tfpusrendszer
A kzs futsidej\1 krnyezet kzs tpusrendszere az az sszetev, amelyik meghatrozza, hogy az egyes adattpusokat hogyan kelJ bevezetni s hasznlni. A kzs futsidej krnyezet nyelvfggetlensge nagyrszt a kzs tpusrendszemek ksznhet. Rgebben minden nyelv a sajt adattpusait hasznlta, s egyedi mdon kezelte az adatokat, ami megneheztette a klnbz nyelveken rt alkalmazsok egyttmakdst, mivel nem ltezett szabvnyos md az adatok tvitelre kzttk A kzs tpusrendszer biztostja, hogy minden .NET-alkalmazs ugyanazokat az adattpusokat hasznlja, emelJett pedig tmogatja az nler tpusinformcik (az gynevezett metaackltok) hasznlatt, s az adatkezel ml1veletek felgyeletvel gondoskodik rla, hogy az adatok kezelse (vagyis a tralsuk s a feldolgozsuk) minden .NET-alkalmazsban ugyangy trtnjen. Ez lehetv teszi, hogy minden .NET-nyelv azonos mdon kezelje az adatokat (belertve az objektumokat is).
Szemtgyjts
Br mr elg sok sz esett objektumokrl (a .NET-tel kapcsolatban nem igazn lehet semmirl sem beszlni anlkl, hogy szba ne kerlnnek bizonyos objektumok), eddig kerltk annak a technikai rszleteit, hogy a .NET hogyan hozza ltre, kezeli s semmisti meg az objektumokat. Arrl, hogy a .NET-ben hogyan ml1kdik az objektumok kezelse, nem kell tudnunk a bonyolult rszleteket, de azt nagy vonalakban rtennk kell , hogy miknt trtnik az objektumok megsemmistse. Ahogy a korbbi rkon emltettk, ha egy objektumvltoznak a Nothing rtket adjuk, vagy hagyjuk, hogy kikerljn a hatkrb61, azzal megsemmistjk az objektumot.
Tovbbi olvasmnyok
Az olvask gyakran krdezik tlem, hogy milyen knyvek elolvassval rdemes folytatniuk a tanulmnyaikat. Erre a krdsre nem tudok konkrt vlaszt adni, mert a vlasz teljes mrtkben a krdez szemlytl fgg. Nagy valsznGsggel az albbiak egyike miatt tanulunk a .NET-rl:
Iskolai tanulmnyok Szakmai szksgletek Szemlyes rdeklds vagy hobbi
Az, hogy rnirt tanuljuk a Visual C# hasznlatt, szarosan sszefgg azzal, hogy merre
clszeru tovbbhaladnunk Ha csak hobbibl tanulmnyozzuk a Visual C#-ot, vlasszunk olyan tmt, ami rdekel rninket, pldul a web- vagy az adatbzis-fejlesztst. Ha a clunk a szakmai elmenetel, gondoljuk vgig, hogy rnilyen cgnek szecetnnk dolgozni, s mivel foglalkozik a cg: biztonsgi megoldsokkal, adatbzisokkal vagy webfejlesztssel? Azt is vgig kell gondolnunk, hogy miknt tehetjk magunkat rtkesebb az adott cg szmra. Ne csak irnyt vlasszunk, hanem hatrozzuk meg a clt, s haladjunk afel.
ramozsban, s keressnk egy knyvet, amely a kedvenc adatbzis-kezelnkkel foglalkozik (az enym a Microsoft SQL Server). Manapsg a legtbb alkalmazs adatbzisokat hasznl, s az adatbzisok ismerete mindig elnyt jelent. Az adatbzis-programozs s az adatbzis-tervezs valjban kt klnbz tma. Ha tnyleg nlklzhetetlenn szeretnnk tenni magunkat, nem csak azt kell megtanulnunk, hogy miknt programozhatjuk az adatbzisok felhasznli elrst, hanem azt is, hogy miknt kell helyesen megtervezni, normalizlni s optimalizlni az adatbzisokat.
sszefoglals
Most, hogy a knyv vgre rtnk, biztos gyakorlati tudssal kell rendelkeznnk a Visual C# nyelvO' alkalmazsfejlesztsrL Mindazonltal az utunkon csak most indultunk el. A hivatsszen1 alkalmazsfejlesztsben az az egyik legjobb, hogy mindig j dolgokat lehet tanulni, s egy-egy fejlesztsi problmnak mindig ltezik jobb megkzeltse. Ezen az rn a .NET-keretrendszert s annak klnfle sszetevit vettk szemgyre, hogy magasabb nzpontbllssuk a NET platformot. Az ezen az rn tanultakat tekintsk bevezetsnek- az, hogy mit kezdnk az inforrncikkal, s merre folytatjuk az utunkat, csak tlnk fgg. Sok szerencst kvnok a programozs vilgban!
TRGYMUTAT
490 Trgymutat
!O 202
& jel 151, 198
.cs 49 .exe 48 .NET Framework 478 .NET-keretrendszer 475, 478 .resx 49 .sin 47 ? karakter 315 @ jel413 \Software 413
A,
ablak 101 ablak llapota 117 ablak tmretezse lll ablak bezrsa 23 ablak mretnek mdostsa 13 ablak neve 104 ablak rendeltetse 104 ablakkeret 110 ablakrnd 114 ablaknev l l ablakok 50 ablakok cmsora ll ablakok megjelensnek mdosrsa 103 ablakok megjelentse 113 ablakok nevnek megvltoztatsa 102 ablakok trlse a memribl 118 ablakosztly ll, 113 ablaksablon 101 ablaksablonok tulajdonsgai 103 ablaktervez 48 ablaktervez bellrsai 127 AbortRetrylgnore 351 accelerator key 198 Accept 158, 159 AcceptButton 158 AcceptReturn 155 AceepeTab 155 Active Data Objects 434
ActiveCell 455 ActiveMdiChild 145 ActiveX vezrlk 50 adatbzisok 433 adatbzis-programozs 434 adatforrs 435 adatforrs kapcsolatnak bontsa 436 adathalmaz 434 adatok beolvassa 424 adatok kezelse 437 adatsor 440 adatszolgltat 435 adattbla 434 adattpus 240 adattpus meghatrozsa 241 adattpusok 242, 482 adattpusok eltagjai 255 Add Class 332 Add New Item 51
Trgymutat 491
alaprtelmezett sznsma 105 alapmO'veletek 264 alapvet hiba 310 alfa csatorna 369 alkalmazs elrsi tja 428 alkalmazsok automatizlsa 461 All Componems 77 lland 240, 244 llapotsor 213 almen 199 Alphabetic 41 Alt billentyO' 151 ltalnos zenetek 352 ltalnos vezrl<'k 15, 124 l-vletlenszm 379 Anchor 135, 138 And 270 aposztrf 248 Application 453 argumentum 232 tltsz szn 182 tmretezhet prbeszdablak 355 tnevezs ll ttetsz ablakok 140 Auto Hide 35, 37 AutoCompleteMethod 171 AutoCompleteSource 171 automatikus elrejts 35, 37, 124 automatikus elrejtsa eszkzkszlet 125 automatikus felszabadts 370 automatikus kiegszts 64 automatikus kiegszts forrsa 171 automatikus kiegsztsi mdszer 171 automatikus mretezs 134, 177 automatizls 451, 461 automatizlsi kiszolgl pldnya
AutcSeroll 141 AutoScrollMargin 141 AutoScrollMinSize 141 AutoSize 177 azonos mretO' vezr16k 133
B
BackColor 105 Backgroundlmage 107 BackgroundlmageLayout 117 BaseDirectoryO 427 belltsjegyzk 41O belltsok mentse 417 bedrtozott szmok 244 beptett eszkztr 37 beilleszts 17 berhat karakterek szmnak korltozsa 155 bejr 297 bekapcsolhat menpontok 200 betokozs 331 betalls-rzkeny nyelv 22 betatpus 378 bezrs 109 bezr gomb 8, 34 billentyO'bemenet 358 billentyO'kombincik 2o6 billentyO'zet 195 billentyO'zet kezelse 356 bin \ Debug 428 binris fjlok 431 BinaryReader 431 BinaryWriter 431 bitkp ltrehozsa 369 bitkp sznmlysge 369 Bitmap 380 blokk 254 blokkszintO' hatkr 253 blokkutasts 284 bool242 Boole-fle logika 264 b6vt tpustalakts 243 bngszbiztos sznek 45
453
automatizlsi kiszolgl pldnynak ltrehozsa 459 automatizlsi kiszolglk 452 automatizlsi knyvtrra mutat hivatkozs 452, 459
492 1Trgymutat6
break 289, 297, 301 BringToFrontO 140 btnCancel 159 btnOK 158 bug 307 Button 16, 157 Buttons gyjtemny 210 Common Controls 15, 124 Common Language Runtime 5, 478 COM-sszetevk 453 Components 176 ConnectionString 435 const 245 ContextMenuStrip 204 Continue Code Execution 315 Control 9, 70,105,373 ControlBox 110 Controls 74 Convert 243 Convert.BooleanO 404 Convert.ToStringO 417 CopyO 397 Count 73, 187 Create directory for solution 12 CreateDirectoryO 404 CreateGraphicsO 69, 368 CreatePrompt 395 CreateSubKeyO 413 Custom sznpalelta 45 csak rhat tulajdonsgok 339 csak olvashat tulajdonsgok 339 csatlakozs adatbzishoz 435 csatlakozsi paramterek 435 cserefggvny 276 csillag 66 csipkzett tmbk 252 cs6 karakter 19, 392 csompont 77, 188, 189 csompontok eltvoltsa 191 csompontok hozzadsa 189 csoportmez 160, 161 csoportos kijells 169
C,Cs
c_ eltag 245 Cancel 157, 158, 159 CancelButton 159 case 289 catch 321, 323 Categorized 41 CenlerParent 116 CenterScreen 116 char 360 CheckBox 159 Checked 163, 200 CheckedListBox 173 CheckState 160 ciklus 295 ciklusfelttel 299 ciklusvltoz 296 ciklusvltoz-- 297 ciklusvltoz++ 297 cmke 150 cmsor ll, 104, 112 ClearO 70, 168, 188, 191, 377 Click 20, 83, 115, 157, 158, 202, 362 ClickOnce 468 Click0nce-telept6programok tesztelse 472 Close 109 CloseO 119, 423,436 CLR 5, 478 COBOL479 Color 257 ColumnHeader Collection Editor 184 Columns 184 ComboBox 164, 170, 290 CommandBullder 438
D
DashStyle 371 Data Source 435 DataAdapter 434, 437 DataAdapter objektum ltrehozsa 437 DataReader 434
Trgymutat 493
DataRow440 DataSet 434 DataTable 434, 437 DataTable objektumok ltrehozsa 439 DateTime 178, 242, 276, 277, 279 dtum 276 dtum- s id6formtum 242 dtum- s idlekr tagfggvny 401 dtumok s idpontok formzsa 279 dtumok s idpontok sszeadsa 277 dtumsszegz tagfggvnyek 277 DayOIWeek() 279 Debug 297, 319 decimal242 Decrease Horizental Spacing 133 default 289 Detlne Color 45 deklarci 53, 222, 247 DeleteO 399, 405, 446 DeleteSubKeyO 414 DeleteSubKeyTreeO 414 destruktor 333 DialogResult 354, 356 DialogResult.OK 21 Dialogs 18 digitlis alrs 472 dinamikus sg 55 Directory 404 Dispose() 72, 344, 370 DLL 7, 77 do... while 301 do ... while ciklus befejezse 301 do ... while ciklus ltrehozsa 301 Dockable 36 Documents 460 dokumentci 310 double 242, 299 dntshozatal 283 dntshozatali szerkezetek 268 dntsi szerkezet 284 Dr&wEilipseO 363, 377
Drawlmage() 382 Drawing.Drawing2D 371 DrawLineO 376 DrawLinesO 385 DrawRectangleO 376 DrawStringO 377 DRIVER 435 DropDown 171 DropDownBullon 211 DropDownList 171 DropDownStyle 171
E,
e objektum 364 e paramter 88, 91, 360 ecset 378 egrbemenet 361 egresemnyek 361 egresemnyek elfogsa 364 egrgomb lenyomsa 88 egrmozgats 91 egrmutat hdyzete 91 egrmutat koordinti 364 egsz szm 226 egy sor beolvassa 425 egydimenzis tmb 250 egydokumentumcs fellet 142 egyedi esemnyek 334 egyni prbeszdablakok 355 egyni szn 45 egyni sznek 44 egyenletes eloszts 133 egyenlsgjel 62 egyenrang mO"veletek 268 egyestett fejlesztkrnyezet 5, 478 egykattintsos telepts 468 egymsba gyazs 288 egysgbe zrs 60, 330 egyszeres idzjel 248 elgazsok 268 elem hozzadsa 51 elemek 249 elemek sorszmozsa 165
494 1Trgymutat
lettartam 344 elfogs 323 eljrs 252 eljrskzpont nyelv 82 eljrsok 53 eljrssablon 20 eljrsszint hatkr 254 eikaps 323
ellenrzpont
esemnykezelk
319
ellentett 270 ellipszis 377 elfelttel 475 eljel nlkli tpusok 242 eljeles tpusok 242 elre mutat hivatkozs 9
elrehozs eltag elz
140
255
393
trlse 90 ltrehozsa 92 esemnyparamterek 87, 88 esemnyvezrelt nyelv 20 esemnyvezrelt programozs 82 eszkzablak 112 eszkzfggetlensg 368 eszkzkszlet 8, 15, 39, 124 eszkzlers 207 eszkztr 37, 207 eszkztr lthatsga 38 eszkztrak megjelentse 37 eszkztrak programozsa 210 eszkztrak rgztse 38 eszkztrelemek 207 eszkztrgembek 208, 209, 211 Excel 452, 453 Excellthatv ttele 455 Excel-munkafzet 455 Exception 323 Exclamation 352
esemnykezel
elsbbsgi sorrend 266 eltvolts 473 elvlaszt 199, 209 Enabled 153, 177 enkapszulci 331 enkapszulci, betokozs 60 Environment Tutofial 32 erforrsfjl 49 ersen tpusos nyelv 247 Error ikon 353 Error List 91, 311 rtk szerinti paramtertads 232 rtkbejegyzs 411, 414 rtkbejegyzs kiolvassa 415 rtkek trolsa 53 rtket visszaad eljrsok 54 rtktpus 241 Esc 159 esemny 20, 81 esemnydeklarci 87 esemnyek kivltsa 82 esemnyeljrs 82 esemnykezel 20, 82
EXE77
ExistsO 396, 405 explidt 243
F
Fl billenty{i 46 F5 billenty{i 24 fa 410 fjl thelyezse 398 fjl tnevezse 398 fjl jellemzinek kiolvassa 401 fjl ltrehozsi ideje 400 fjl msolsa 397 fjl trlse 399 fjl tulajdonsgainak kiolvassa 400, 402 fjljellemz jelz6k 401 fjlkezels 396 fjlmegnyit prbeszdablak 19 fjlnv l l fjlok digitlis alrsa 472 fjlok fellrsa 395
TIYgymutat 495
fjlszr 392 fjltpusok 392 fjltulajdonsg 400 false 242, 286 fanzet 181 fej lesztsi tulajdonsgok 103 felbonts 8 felesleges objektumok eltvoltsa 370 felhasznli mveletek ltal kivltort esemnyek 83 felhasznli profil411 felhasznli sznbelltsok 374 felhasznli vezrlk 50 felhasznlnv 436 fels szint menk feltltse 199 felsorol tpus 351 feltlts 439 felgyelt kd 479 fellet 7, 331, 333 fenntartott szavak 247 File objektum 396 File Save 394 FileArtributes 400, 401 FillO 437 FillEllipseO 385 FillRectangleO 385 Filter 19 fmally 321 FixedSingle 112 FixedToolWindow 112, 213 float 242 Floating 36 f projektfjl 48 fg 410 foglalt sz 65 Font378 for ciklus 296, 297 for ciklus elksZtse 296 for utasts sszetevi 296 fordtsi hiba 310 fordtprogram 240 fordtott perjel 248 form 7, 9, 50, 101
Form Design 48 Form uttag ll Format16bppGrayScale 369 Format16bppRgb555 369 Format24bppRgb 369 formtumkivtel 312 FormBorderStyle 110, 112 FormCiased 362, 384 FormCiasing 437 FormulaRlCl 456 forrsobjektum 49 FromlmageO 370 FuJlRowSelect 186 futsidej rtelmez 478 futsidej fordt 480 futsidej hiba 310 futsidej krnyezet 478 futsidben lthatatlan vezrlk 18, 177 fggetlen alkalmazs 468 fl180 fles prbeszdablakok 178
G,Gy
GDI368 GDI+ 481 gpi kd 480 gpi utastsok 480 get 337,339 GetAttributesO 401, 404 GetCreateTimeO 404 GetCreationTime 401 GetLa~tAccessTime 401 GetLastAccessTimeO 404 GetLastWriteTime 401 GetLastWriteTimeO 404 GetValueO 415 Go To Definition 426 gomb 16, 157 gombok paramter 351 grdtsvok 141, 154 grgethet ablakok 141 gl".afikus eszkzfellet 368, 481
496 1TWgymutat
grafikus felhasznli fellet 39, 195 grafikus objektum 362 grafikus tartalom megrzse 378 Graphical Device Interface 481 Graphics 368 graphics objektum ltrehozsa 369 GridSize 127 GroupBox 160, 161 GUI 39, 195 gyermekablak 142 gyermekcsompontok 190 gyorsbillenty{ 151, 198 gyjtemny 73, 74, 165 Hide 118 HideO 120 hierarchikus listk 188 hivatkozs mezkre 440 hivatkozs szerinti paramtertads 232 hivatkozs tmbvltozkra 250 hivatkozstpus 241 hivatkozsszmll szemtgy(ijts 483 HKEY_CLASSES_ROOT 411 HKEY_CURREl\l'f_CONFIG 411 HKEY_CURRE1\1_USER 411, 414 HKEY_LOCAL_MACHINE 411, 414 HKEY_USERS 411 hotkey 198 Hour 279 hullmvonal 311 hzfoganty 38
H
hagyomnyos programozsi nyelv 82 hagyomnyos vezrlk 149 Handled 360 hrom perjel 31 O hrom pontot brzol gomb 43 hasznlaton kvli objektumok 344, 483 hatrol tglalap 375 hatrozatlan szm vgrehajts 301 hatkr 222,240,252,254,343,481 hatkrt jell vltozeltagok 256 htraklds 140 httrk p 107 httrkpek eltvoltsa 108 httrszn 105 Height 13 helyesrsi hibk 355 helyi erforrs 107 helyi hatkr 254 helyi msolat 437 helyi menk 204 hibakeress 307 hibakeress lelltsa 315 hibakeres 313 hibakeres eszkzk 479 hibakezel 320 hibalista 311 hibamentests 419
l, {
leon 109 IDE 5, 478
idpont idzt
276
176
if 284 if... else 284, 288 igen-nem vlaszts 159 ikon 12, 109 ikon paramter 351 Il 478, 479 Image 26 Image Collection Editor 182 Imageindex 185 ImageList 182 Images 182 ImageSize 182 Immediate ablak 315 implicit 243 Indeterminate 160 index 249, 250 IndexOfO 274 InflateO 375
Trgymutat 497
Information 352 INI fjl 410 lnsertO 166, 168 int 226, 242 int.ParseO 285 integer 226 Integrated Development Environment 478 lntelliSense 64 interfsz 331 Intermediate Language 478 Interval 84, 176 lnvalidateO 383 rs szvegfjlba 422 rsvdett tulajdonsg 62 rhat tulajdonsgok 338 lsMdiContainer 143 ismtld feldolgozs 73 Items 164, 166, 168, 170, 185, 186, 208 Items Collection Editor 208 itertor 297 tagfggvnyek 273 karakterlncok 272 karakterlncok sszetUzse 272 karakterlnc-tulajdonsgok 273 katonai formtum 279 kattints 20 kpek trolsa 181
kpernyfelbonts
karakterlnc-kezel
kpernyre
kpmez
l".tjzols 368
J
jellngyzet
159
jelsz 436
jelszmezk
156
]et 436
]IT fordt 480 JITter 480 jvhagy gomb 158 just-in-time 480
K
kapcsolati karakterlnc 436 kapcsolatobjektum 435 kapcsos zrjel 22, 54, 87, 221, 223, 254, 284, 297 kaptr 410 karakterek szmnak meghatrozsa 273 karakterlnc 53, 226
kplista 182 17 kppont 13, 14 kppontformtum 369 krds 353 keret 110, 160 keret nlkli ablak 112 ksi kts 341, 342 kt egyenlsgjel 267 kt perjel 21, 309 ktrtk logika 269 ketts idzjel 248 KeyChar360 KeyDown 358 KeyPress 358, 360 KeyPressEventArgs.Handled 365 KeyPreview 365 KeyUp 358 kezdrtk 247 kezdhely 115 kezdlap 30 kirtkdsi sorrend 266 kifejezs 26( 248 kifejezett tpustalakts 243 kijellsi md 169 kijellsi mdszer 131 kijell md 40, 126 kijellkeret 130 kijellt listaelem meghatrozsa 187 kijellt vezrl 131 kilps a tagfggvnyekbl 233 kilpsi pont 301 kimenet318
498 I T~
kis- s nagybetuK. megklnbztetse 22 kis mret 109, 116 kiszolgl 332, 452 kiszolgl irnytsa 454 kiterjeszts 392 kitlttt alakzatok 385 kivlasztott listaelem sorszma 168 kivtel 311, 312 kivtelek kezelse 323 kivtelkezels 320 kivtelkezel rendszer 479 kivons 265 kdablak 8 kdblokk 284 kdnzet 48 kombinlt lista 164, 289 kombinlt listk 170 komponens 452 konkatenci 272 konstans 244 konstruktor 333 korai kts 341 klcsns kizrs 162 knyvtr thelyezse 405 knyvtr ltrehozsa 404 knyvtrak kezelse 404 knyvtrak trlse 405 kr377 krnyezetrzkeny sg 55 krnyezeti men 204 kts 341 kvetkez rekord 443 kvetkezknt vgrehajtand utasts 316 kzs futsidej krnyezet 478 kzs tpusrendszer 482 kztes nyelv 478, 479 kzztteli belltsok 474 kzztteli vacizsl 469 kulcs 411 kulcsok rtkeinek kiolvassa 414 kulcsok trlse 414 kulcssz 222, 266
L
Label 91, 150 lap 179 LargeimageList 184 lassz 130, 161 lthatatlan vezrl hozzadsa 18 lthat vezrl6 hozzadsa 16 lthatsg 240 Layout eszkztr 132 LayoutMode 127 lebeg ablakok 34 lebeg eszkztr 38 lebeg tervezablakok 34 lefoglalt erforcisok 119 legfels kulcs 410 legfels md nlkli ablakok 140 legfels szint menpont 196, 198 legutbbi projektek 30 lehorgonyzs 136 Length tulajdonsg 273 lenyl listamez 164 lenyl menk 211 ltezs 396 ltez aikuicsok 414 ltrehozs 401 levlaszts 35 lista kirtse 168 lista kivlasztott eleme 168 listaelemek beszrsa 185, 186 listaelemek eltvoltsa 167, 187 listaelemek hozzadsa 166 listaelemek mdostsa 165 listk rendezse 169 listamez 164 listanzet 183, 186 ListBox 164 Listitems 171 ListView 183, 186 ListViewltem Collection Editor 185 ListViewSubltem Collection Editor 185 !iterl 273
Trgymutat 499
literlls rtk 248 Load 95, 258 Localion 12, 116, 162 logikai ,s" 270 logikai vagy" 271 logikai diszjunkci 271 logikai mO'veletek 269 logikai sszeads 270 logikai tagads 271 LoginDialogForm 113 long 242
M
magassg 13 mgikus szmok 244 Make Horizantal Spacing Equal133 Make the Same Size 133 makrk 456 makrszerkeszt6 456 Manual116 mappaikon 181 mappk 404 maradk 304 maradkkpzs 266 msodiagos ablak 115 msodiagos fjl 49 msols 17 Maximize l 09 MaximizeBox 110 MaximumSize 112 MaxLength 155 MDI 123, 142 megersts 399 megjegyzsek 21, 309 megjegyzsek XML fjll alaktsa 310 megjelents 112 megolds 4, 48 megoldsknyvtr 12 megoldstallz 8, 46 mgse 157 megsemmist tagfggvny 333 memmban trolt bitkp 370, 379
memriaszivrgs 72 ments 12, 394 Menus & Toolbars 197 MenuStrip 196, 197 men 196 menk programozsa 201 menpont 198, 201 menpontok thelyezse 200 mensor 196 mret 13, 112 mretezfoganty 131, 152, 212 Message 323 MessageBoxO 260 MessageBox.ShowO 54, 169, 350, 354 MessageBoxButtons 351 MessageBoxlcon 351 metaadatok 482 metdus 67 Microsoft Access 436 Microsoft Excel 11.0 Object Library 453 Microsoft Excel12.0 Object Library 453 Microsoft Jet 433 Microsoft Visio 462 Microsoft Word 458 Microsoft Word 12.0 Object Library 459 Microsoft.VisualBasic 481 Microsoft.Win32 412 Minirnize 109 MinirnizeBox llO MinimumSize 112 md nlkli ablak 114 Modal115 madlis 114 madlis ablak 114 roadalits 115 mddal rendelkez ablak 114 mdostbillentyO'k 2o6 modul 46, 252 MouseClick 362 MouseDown 88, 157, 361
500 Trgymutat
MouseEnter 361 MouseEventArgs 88 MouseHover 361 MauseLeave 95, 362 MouseMove 91, 157, 361, 363 MouseUp 157, 361 MoveO 398, 405 mozaik l 08, 117 mozgat ikon 180 MSI fjl468 MultiExtended 169 Multiline 83, 125, 152, 154 MultilineChanged 83 Multiple Document Interface 123, 142 MultiSimple 169 munkafzet 455 munkalap 455 mutat 126 mvelet 296 milveletek kirtkelsi sorrendje 267 My Solution 76 NextO 379 Nodes 188, 189, 191 norml116 Not 270 NotO 202 Nothing 483 Now 178,279 null 191, 343 nulla hosszsg karakterlnc 425 nyl312 nyilvnos tagfggvnyek 220 nyilvnos vltoz 254, 335 nyilvnosan hozzfrhet fggvny 334
O, ,
obj eltag 256 Object242 Object Browser 76 objektum 9, 59, 60, 113 objektum ltal kivltott esemnyek 84 objektum ltrehozsa vltoz bevezetsekor 343 objektum pldnyostsa 343 objektumfellet 333 objektumhivatkozs vltozhoz ktse 341 objektumhivatkozsok megszntetse 343 objektumjellernz6k 335 objektumknyvtr 452 objektumkzpont programozs 60, 330 objektummode11451, 452 objektumok lettartama 344 objektumok elnevezse 10 objektumok esemnyeinek elrse 86 objektumok jellemzinek mdostsa 9 objektumok megsemrnistse 343, 483
N, Ny
Name 10, 103 naplfjl 425, 428 ngyszgletes tmbk 252 nem biztonsgos Jet adatbzis 436 nem egyenl 286 nem felgyelt kd 479 nem ltez fjl 396 nem madlis 114 nem statikus tagfggvnyek 332 nem szablyos tmb 252 nem vizulis vezrl6k 18 NET Framework 5 NET-keretrendszer 5 nvadsi szablyok 255 nvterek 481 nvtkzs 481 new 113, 220, 343, 344 New Project 6, 30 NewRow 445
T6rgymutat6 501 objektumok pldnyostsa 340 objektumok trlse 52 objektumpldny 332 objektumtallz 76, 453 objektumtulajdonsgok belltsa 40 objektumvltoz 113 objektumvltoz ks6i ktse 341 objektumvltoz korai ktse 342 objFile.Close() 423 objFile.Dispose() 423 OLE vezrlk 50 OleDBConnection 434, 435 OleDbDataAd.apter 437 olvass szvegfjlbl 424 o lvashat tulajdonsgok 337 OOP 6o, 330 Opacity 140 Open Command Window Here 421 Open File 392, 393 OpenO 436 OpenFileDialog 18, 176, 390, 394 opercis rendszer ltal kivltott esemnyek 84 opertor 296 Or 270, 271 ra 178 oszlop 440 osztly 113, 220, 330 osztly hozzadsa 332 osztlymeghatrozs 221 osztlymodulok 50 osztlyszint llandk 246 osztlytagfggvny 220 osztlytagsg 220 oszts 266 Out of Memory 326 Output ablak 318 OverwritePrompt 395 nhvs 235 nhv ciklus 235 nhv esemnyek 85 nler tpusinformcik 482 rkls 60 sszeads 265 sszeffizs 75, 93, 272 sszehasonlts 268 sszehasonlt mveletek 268 sszes csompont trlse 191 sszetett kifejezsek 268 sszetett utastsok 284 sszetev 4, 452
Paint 84, 379, 382, 383 paletta 106 panel 160, 161 paramter 53, 222, 223, 225 paramterek tadsa 231 parancspt 438 prbeszdablak 102, 115 prbeszdablakok 18 Parent 189 Parse 286 Password 435 PasswordChar 156 pldnyosts 69, 113 pldnyosztly 346 pldnytag 220 pldnytagfggvny 234 pldnytagfggvnyek 331 pldnytagok 331 PerformCiick 158 perjel413 Picture Viewer 102, 416 PictureBox 17 piros hullmvonal 311 piros kr 313 pixel13 pluszjel 13, 43, 108 Pointer 40, 126 polimorfizmus 60 pontosvessz 65 privt hatkr 254 private 222, 336 program 4, 48 program eltvoltsa 473 program lelltsa 23
5021Trgymutat
program neve 104 programhibk 307 programknyvtr 77 Project Properties 51 projekt 4, 48 projekt futtatsa 24 projekt ltrehozsa 5 projekt megnyitsa 32 projekt mentse 12 projektek ltrehozsa 30 projekjlok hozzadsa 51 projektfjlok kezelse 46 projektkezels 46 projektsszetevk 49 projekttulajdonsgok belltsa 50 Properties 8, 9, 61 Properties ablak 40 Provider 435 public 222, 336 Publisb Wizard 469 Recent Projects 32 Rectangle 375 ref 232 RefreshO 299 REG_BINARY 412 REG_EXPAND_SZ 412 REG_MULTI_SZ 412 REG_SZ 412 Registry 412 Registry.SetValueO 415 RegistryKey 412 rejtett tpustalakts 243 rekordok ltrehozsa 445 rekordok szerkesztse 444 rekordok trtse 446 rekurzi 235 rekurzv esemny 85 RemoveO 167, 168, 187, 191 RemoveAtO 167, 168 Rename l l rendelkezsre ll eszkztrak 38 rendezs 169 rendszerdrum 279 rendszerid 279 rendszerler adatbzis 410, 416 rendszerler adatbzis elrse 412 rendszerler adatbzis szerkezete 410 rendszerler adatbzisbeli kulcs 413, 414 rendszerszn 44, 105, 372, 373 ReplaceO 276 Resize 134, 383 rszelem 185 rszrulajdonsg 43, 108 RetryCancel 351 rerum 227, 233 RGB 105 RowCollection 445 rgzts 35, 136 rgztett eszkztr 38 rugalmas ablakok 136
Q
Question ikon 353
R
rcs 126 rcs lthatsga 128 rcshoz igazts 127 rcsmret 127 RadioButton 162 rajzfellet trlse 377 rajzols 368 rajzolprogram 68 Random 379 Range 455 Range objektummal kijellt cellk 456 raszteres rnyals 45 ReadLineO 425 ReadToEndO 424, 429
Trgymutat 503
S,Sz
sablon ll sablonok 31 sajt szinek 45 srga nyl 312 Save A1112 Save Project 12 SaveFileDialog 18, 390, 394, 395 SercliBars 154 SDI 142 segdikonok 36 segdosztly 346 segtsg 55 Select 456 Selectedlndex 168, 181 SelectedlndexChanged 181 Selecteditem 168 Selecteditems 187
Selection 460
Selection.TypeTextO 461 SelectionMode 169 SelecrNextControlO 139 Send to Back 140 Sender 88 SendToBackO 140 Separator 199, 209 SERVER435 set 337, 339 SetValueO 415 short 242 ShortcutKeys 206 ShowO 113, 115 ShowCurrentRecordO 442 ShowDialogO 21, 115, 357 ShowGrid 127, 128 ShowlnTaskbar 118 Single Document Interface 142 Size 13, 116 SizingGrip 213 Sleep() 299 SmalllmageList 183 Snap to lines 128
SnapTcGrid 127, 128 solution 49 Solution Explorer 8, 46 sor elrse 440 sorgy"jtemny 445 sorszm szerinti hozzfrs 442 Sorted 169 SQL Server 434 SqlConnection 434, 435 StackOverflow 85 Start Page 30 StartPosition 116 static 234 statikus szveg megjelenitse 150 statikus tag 220 statikus tagfggvny 220, 234, 331 statikus tagok 331 StatusLabel 213 StatusStrip 212 Step lnto 315 Step Out 315 Step Over 315 Stop Debugging 315 StreaniReader422, 424 StreamWriter 422 string 53, 226, 242, 360 String Collection Editor 164, 170 String.RemoveO 275 String.TrimO 275 String.TrimEndO 275 String.TrimStartO 275 StringBuilder 403 strukturlt kivtelkezels 320 Subltems 185 SubstringO 273 Suggest 171 sg 46,55 sru rcs 128 switch 288 System 481 System.Data 481 System.Diagnostics 297, 481 System.Drawing 481 System.Drawing.Brushes 378
504 1 T'gymutat6
System.Drawing.Pens 372 System.IO 396, 482 System.IO.Directory 396, 404 System.IO.File 396, 397, 398, 400 System.Net 482 System.Security 482 System.Web 482 System.Windows.Forms 481, 482 System.Xml 482 szablyos tmb 252 szaggatott vonal keret 131 szlessg 13 szemtgyjts 483 szemtgyjt6 333, 343 szerkezet 253 szn meghatrozsa 45 sznek lenyfl listja 44 sznmlysg 370 sznsma 105 szntulajdonsgok 43, 106 szkz 223 szkzk eltvoltsa 275 szeigitat neve 435 szorzs 265 szgletes zrjel 249 szveg 53 szvegbevitel l 5 l szvegcmkk 91 szvegfjlok 409 szvegfjlok olvassa 422 szvegmez 151 szvegrajzols 377 szvegrsz kiolvassa 273 szvegrszletek cserje 275 szkt tpustalakts 243 szr 19, 392 szlablak 142, 145 szlcsompont 189 szlcsompont eltvoltsa 191 szrke sv 313
T, Ty
Tab 179 Tab Order 139 Tabindex 138 TabPage Collection Editor 179 TabPanel 179 TabStop 140 tabultorsorrend 138, 140 tag 70 tagaels 265, 270 tagfggvny 67, 222, 252, 334 tagfggvnyek bevezetse 222 tagfggvnyek dinamikja 68 tagfggvnyek indtsa 67 tagfggvnyek ltrehozsa 221, 222 tagfggvnyek meghvsa 227 tagfggvnyhvs 67, 229 tagfggvnyknt elrhet fggvnyek 340 tagfggvnyszint hatkr 254 takart kd 321 tlca 118 tallzs hatkre 76 trol 142 trolbjektum 16o trolegyed 53 trolk 160 tglalap 375 tglalapok rajzolsa 376 teleptett alkalmazsok eltvoltsa 473 teleptprogramok 468 teljes kperny 109, 116 teljes kpernys ablak 118 teljes mret 109 Tempiates 31 terjeszthet sszetev 4 tervezablakok 33
Trgymutat
tervezablakok
l sos
36
tervezablakok tervezablakok
testreszabs 32 tesztels 419 Text ll , 104, 150 Text tulajdonsg 170 TextAlign 152 TextBox 151 TextChanged 157, 361 this 64, 65, 118 this.CloseO; 23 this.MdiParent 145 Tick 84, 176 Tiled 117 Timer 84, 176 tipustalakts 243 tpusknyvtr 452 tpusrendszer 482
tmbindex 250 tmbk bevezetse 249 tmbk indexelse 250 tmbutasts 284 trspont 313, 314 trspontoknl vgrehajthat mveletek 315 TransparentColor 182 TreeView 181, 188
Title 19 tizedesjegy 242 Today 279 toll 371 ToLongTimeString 178 Toolbar 210 Toolbox 8, 15 ToolStrip 207, 210 TopMost 140 ToStringO 93 tbb lehetsges rtk 289 tbbalaksg 60 tbbdimenzis tmb 250 tbbdokumentumcs ablakok 142 tbbdokumentumos fellet 123, 142 tbbelemil kijells 131 tbboszlopos listk 184 tbbsoros cmkk 150 tbbsoros megjegyzs 309 tbbsoros szveg 151 tbbsoros szvegmez 152, 154 tbbszintll kulcs 413 tmb 240, 249
U, U, U
ugrs a meghatrozshoz 426 ugrutasts 289 j projekt 30 Unchecked 160 UpdateO 437, 444 User ID 435 using 370, 412 utility 346 utols hozzfrs 400 utols mdosts 400 utols rekord 443 gyflalkalmazs tesztelse 458 gyfelek 332, 452 gyflkd 332 gyflterlet 69, 141, 369 res ablak 101 res sor 425 zenetablak 54, 350, 351, 354 zenetek megjelentse 350
242 try 321 Try... Catch... Finally 320 tulajdonsg 9, 60, 61, 333 tulajdonsgeljrsok 336 tulajdonsglers 46 tulajdonsgok 335 tulajdonsgok kiolvassa 61 tulajdonsgok megtekintse 41 Type Here 197 TypeTextO 460
true
..
506 1 Trgymutat6
v
vlasztgomb 161 vlasztgomb-csoport 160 vltoz 53, 240, 246 vltozk bevezetse 53, 246 value 338 vrakozs 299 vrhat kivtelek kezelse 324 VBA456 vdkarakter 248 vgrehajts adott szm ismtlse 296 vgrehajts folytatsa 315 vgrehajts tovbbadsa 291 vgrehajthat fjl 7, 48 vgtelen ciklus 85, 235, 301 vgtelen nhvs 235 vletlen toevezs 398 vletlenszm 379 verem 235 veremtlcsorduls 235 vezrlsi szeekezet 253 vezrlsiszerkezet-szint\1 hatkr 253 vezrl 9 vezrl beszrsa dupla kattintssal 125 vezrlcsoportok tulajdonsgrtkei 133 vezrlk 15, 124 vezrlk beszrsa thzssal 125 vezrlk beszrsa rajzolssal 125 vezrlk csoportjnak kijellse 130 vezrlk egymshoz igaztsa 133 vezrlk elhelyezse 124, 125 vezrlk hozzadsa 39 vezrlk igaztsa 132 vezrlk kezelse 126 vezrlk lehorgonyzsa 134 vezrlk rtegzse 140
vezrlobjektum vezetvonalak
60 127, 129
videkrtya 45 View 183 View Detail 317 Viewmen 34 Visihle 113, 118 Visual C# 2008 elindtsa 4 Visual Studio .NET 5 Visual Studio .NET krnyezet 8 Visual Studio 2008 5 visszatrsi rtk 222, 223, 227 visszatrsi rtk nlkli tagfggvny 222 visszatrsi rtkkel rendelkez tagfggvny 226 vzszintes grdtsv 154 vzszintes trkzk cskkentse 133 void 53, 223, 226, 340 vonal371 vonalak rajzolsa 376
w
Warning 352 websznek 44 while 301, 302 Width 13 window 101 Windows Forms Application 31 Windows lnstaller Technology 468 Windows Intz 188 Windows-ablakos alkalmazs 31 Windows-alkalmazs 6 WindowsDefaultBounds 116 WindowsDefaultLocation 116 WindowState 117 Word 458 WordWrap 154 Workbooks 455 WriteLineO 319, 423, 424
Trgymutat 507
x
X gomb 34 Xor 270, 271
y
YesNo 351 YesNoCancei351
z
zrjelezs 268 zld szn 309 z-sorrend 140
24 egyrs lecke
Csupn24,egy6ravagymgrvidebbidalatt
lecke utn kpesek lesznk a Visual C# 2008 hasznlatra. A leckk egymsra pUinek,
elvgezhet
Alcrdseksvlaszok mindenfejezetvgn
segitenekellenrizni
a tudsunkat.
A megjegyzsek s tippek rvidebb mdszerekre s megoldsokravilgitanak r, illetvesegtenek kikerlnia lehetsgesnehzsgeket James Faxali a Nebraska llambeli Betlevua-ben szkelO, Microsoft Certitled Partner min6stssel rendelkez, kereskedelmi adatbzis-kezelalkal mazsokra szakosodon Tigerpaw Software, Inc. (www.tigerpawsoftware.com) alelnke. 6 felgyeli a kapcsolatkezelst, a piaci sszervizszolgltatsokat,azajnlantelt,araktrkszletkezelstsavsrlst automatizl djnyertes Tigerpaw CRM + alkalmazsfejlesztst,tmogatstsoktatst A Tigerpaw-nak jelenleg tbb mint 20 OOO bejegyzettfelhasznlja van 27 orszgban. Foxallamin6stenotfice-megfelel6programokfejlesztsetern szerzentapasztalatnak ksznhetOen igazi szaktekintlyeazalkalmazsfelletisviselkedsi szabvnyoknak. Amellett, hogy jl ismert szerz, James nemzetkzi frumokon eladsokat is tart a Microsoft-technolgikrl, fiskolai szinten oktat, s szmosfolyiratbanjelennekmegcikkei.