You are on page 1of 504

sAMS

Visual
hasznlatt
JamasFoxa/1

24 ra alan

Jamss Foxa/1

Tanulilk meg a

Visual C# 2008
hasznlatl 24 ra alan

A fordts a

kvetkez

angol eredeti alapjn kszlt:

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

ISBN: 978 963 9637 55 9


Kszlt a debreceni Kinizsi Nyomdban Felels vezet: B6rds jnos

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

2. ra Navigls a Visual C# 2008-ban . . . . . . . . . . . . . . . 29


A Visual C# 2008 kezdlapjnak hasznlata ....................... 30 A Visual C# krnyezet elemeinek elrse s testreszabsa . ... . ....... 32 Az eszkztrak hasznlata ............................ . .. . .... 37 Vezrlk hozzadsa az ablakokhoz az eszkzkszlet seg)tsgvel ....................... . ....... 39 Objektumtulajdonsgok belltsa a Properties ablakban .. . .......... 40 Projektkezels ....................... . .. . .......... . ........ 46 Programozsi gyorstalpal .......... .. .. . .. . .................. 52 Segtsgkrs ........................... . ................ . . 55 sszefoglals .. . ......... . ........ . .. . .. . ................ . . 55 Ismtls ....... . ............ . ........ . .. . ................ . . 56 Gyakorlatok ................... . .. . ................ . ....... 57

vi Tanuljuk meg a Visual C# 2008 hasznlatt 24 ra alatt

3. ra Objektumok s gyjtemnyek ..... . ............ 59


Objektumok ............................................... 60 Tulajdonsgok ................................. . ........... 61 Tagfggvnyek ............................................. 67 Egyszer, objektumokra pl projekt felptse ................... 68 Gy1Ijtemnyek .............................................. 73 Az Object Browser hasznlata ................ . ................. 76 sszefoglals .............................................. 77 Ismtls ........... . ....................................... 78 Gyakorlatok ............. .. ........................... . .... 79

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 ............. ................. ....... . ..... ..

102 103 112 120 121

6. ra Ablakok pftse - haladknak . . .. . . . . . .. . . .. . 123


hasznlata ............ ...... ................ ... ... . 124 A vezrlk kezelse ........................................ 126 Vezrlk rtegzse (z-sorrend) ........................... . .... 140 Grgethet ablakok ................................... . .... 141 Tbbdokumentumcs ablakok ltrehozsa ....................... 142 sszefoglals ............................................. 146 Krdezz-felelek ............................................ 146 Ismtls . . . . . . . . . . . . . . . . . . . . . ............................. 147
Vezrlk

TanuJjuk meg a Visual C# 2008 hasmJatt 24 ra alatt vii

7. ra Hagyomnyos vezrtk . . . . . . . . . . . . . . . . . . . . . . 149


Statikus szveg megjelemtse a Label vezrlvel Szvegbevitel szvegmezk hasznlatval Tbbsoros szvegmezk Jelszmezk ltrehozsa Gombok ltrehozsa Igen-nem vlasztsi lehetsgek jellngyzetekkel Trolk s vlasztgomb-csoportok ltrehozsa Listk megjelentse Iistamezk segtsgvel Kombinlt listk 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 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 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

o.

o.

150 151 152 156 157 159 160 164 170 172 172 173

8. ra Fejlett vezrtk hasznlata ................... 175


Idztk
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

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.

176 178 181 183 192 192 192

9. ra Menk s eszkztrak az ablakokon . . . . . . . . . . . . 195


Menk felptse A TooiSttip vezrl hasznlata llapotsor ltrehozsa 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 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

196 207 212 214 214 214

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

220 222 233

viii Tanuljuk meg a VISual C# 2008 hasznlatt 24 ra alatt


Statikus tagfggvnyek ltrehozsa ................... . ......... 234 A vgtelen n hvs elkerlse .......................... ....... 235 sszefoglals ............................................. 236 Krdezz-felelek ............................................ 236 Ismtls . . ................................................ 237

110 ra llandk, adattpusok, vltozk s tmbk hasznlata 239


Adattpusok ............................................... 240 llandk meghatrozsa s hasznlata ....... . .................. 244 Vltozk bevezetse s hasznlata ................ . ............ 246 Tmbk hasznlata ......................................... 249 Tbbdimenzis tmbk ltrehozsa .... . ..... . ..... . ........... 250 Hatkrk meghatrozsa . . ........................... . ..... 252 Nvadsi szablyok ........ . ................................ 255 Adattpust jell eltagok .................................... 255 A Picture Viewer program vltozi ............................. 257 sszefoglals . . . . . . . . . . . . . . . .......... . ................... 260 Krdezz-felelek ........................... . ..... . .. . .. . .... 261 Ismtls .................................................. 261

120 ra Mveletek szmokkal, karaktertncokkal, dtumokkal


s id6pontokkal
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

13. ra Dntshozatal Visual C# kd segftsgvel ...... 283


Dntshozatal if... else utastsokkal ....... . .................... 284 if...else utastsok egymsba gyazsa ........... . .............. 288 Tbb lehetsg vizsglata a switch utastssal ........... . ........ 288 sszefoglals . . . . . . . . . . . . . . . ........................... . .. 292 Krdezz-felelek . . . . . . . . . . . . . . .......... . ................... 293 Ismtls ........................... . ...................... 293 Gyakorlatok .............................................. 294

Tanuljuk meg a Visual C# 2008 hasznlatt 24 ra alatt ix

14. ra A hatkonysg nvelse: ciklusok . .... . . . ... . 295


Vgrehajts adott szm ismtlse a for ciklus segtsgvel .............................. . ... Hatrozatlan szm vgrehajts: a white s a do...while ciklusok ..................................... sszefoglals . . . . . . . . . . . . . . . . . ............................ Krdezz-felelek . . . . . . . . . . . . . . . . . . ............... . .......... Ismtls ..................................................

296 301 305 305 306

15. ra Hibakeress ..... . .. .. ....... .. .. . ....... 307


Megjegyzs hozzfzse a kdhoz .......................... . .. 309 A kt alapvet hiba azonostsa ................ . .............. 310 A Visual C# hibakeres eszkzeinek hasznlata ................... 313 Hibakezel ltrehozsa a Try...Catch...Finally segtsgvel ........ . .. 320 sszefoglals . . . . . . . . . . . . . . . . . ............................ 326 Krdezz-felelek ........... ... .............................. 327 Ismtls . . . . . . . . . . . . . . . . . . . . . . .... . ........ . .............. 327

16. ra Objektumok tervezse osztlyok segftsgvel .. . . 329


Osztlyok .................................. : .......... . .. Objektumok pldnyostsa osztlyokbl .... ...... ........... . .. sszefoglals ............................................. Krdezz-felelek ........................... . ................ Ismtls ................................. . ................

330 340 345 346 346

17. ra Kapcsolat a felhasznlkkal . . . . . . . . . . . . . . . . . . 349


zenetek megjelentse a MessageBox.ShowO fggvnnyel ......... Egyni prbeszdablakok ltrehozsa .......................... A billenty\zet kezelse . . . . . . . . . . .. . ... .. .......... . ... . ..... Egresemnyek kezelse .......... . ............... ....... ... sszefoglals ............................................. Krdezz-felelek . . . . . . . . . . . . . . . . ............................ Ismtls ..................................................

350 355 358 361 364 365 365

x Tanuljuk meg a VISU8I C# 2008 hasznlatt 24 ra alatt

18. ra Grafikus lehet6sgek . . . . . . . . . . . . . . . . . . . . . . 367


A Graphics objektum ....................................... 368 Tollak hasznlata ............................ ....... ....... 371 Rendszersznek hasznlata ..................... ... ........... 372 A tglalapok kezelse ....................................... 375 Alakzatok rajzolsa ......................................... 376 Szvegrajzols ............................................. 377 Graftkus pldaprogram ksztse .............................. 379 sszefoglals ............................................. 384 Krdezz-felelek ....... . .................................... 385 Ismtls ........................... . ...................... 385

IV. rsz Adatkezels ....................... . ... . . 387


19. ra Fjlmfiveletek vgrehajtsa ......... . ....... . 389
Az OpenFileDialog s a SaveFileDialog vezrl hasznlata .......... 390

Fjlkezels a File objektum segtsgvel ............... .. ........ 396 sszefoglals ......................... . ......... .. ........ 405 Krdezz-felelek .. . .................................... . .... 406 Ismtls .................. . ....................... . ....... 406

20. ra Szvegfjlok s a rendszertefr adatbzis hasznlata 409


A rendszerler adatbzis hasznlata ............................ 410 Szvegfjlok olvassa s rsa ................................. 422 sszefoglals ............................................. 430 Krdezz-felelek ............................................ 431 Ismtls ...................... .. .......................... 431 Ismtl krdsek .......... .. . .. ............................ 431 Vlaszok ........................... . ..................... 432 Gyakorlatok . . . . . . . . . . . . . . . . . ............. . ............... 432

21. ra Adatbzisok hasznlata ................... . 433


Az ADO.NET ........................................... . .. 434

Adatok kezelse ........................................... 437 sszefoglals . . . . . . . . . . . . . . . . ..... . .................... . .. 447 Krdezz-felelek .............. . .. . .. . ..... . ................. 448 Ismtls . . . . . . . . . . . . . . . . . . . . . .. . .. . ........ . ........ . .. . .. 448

Tanuljuk meg a Visual C# 2008 hasznlatt 24 6nt alatt xi


lsmd krdsek ........................................... 448 Vlaszok ................................ . ................ 448 Gyakorlatok . . . . . . . . . . . . . . . . . . . . . .. . .. . ................... 449

22. ra Alkalmazsok irnytsa automatizlssal . . . . . . . 451


Automatizlsi knyvtrra mutat hivatkozs ltrehozsa ............ 452 Az automatizlsi kiszolgl pldnynak ltrehozsa .............. 453 A kiszolgl irnytsa ...................................... 454 A Microsoft Word automatizlsa .............................. 458 sszefoglals ............................................. 462 Krdezz-felelek .. . ......................................... 462 Ismtls ......................... . ........................ 462

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

24. ra A .NET madrtvlatbl ................. .. .. 477


A .NET-keretrendszer . . . . . . . . . . . . ........................... 478 A kzs futsidejG krnyezet mkdse ......................... 478 A Microsoft kztes nyelvnek hasznlata a Visual C# 2008-ban ....... 480 Nvterek ................................................. 482 A kzs tpusrendszer .... . .................................. 484 SzemtgyGjts ............................................. 484 Tovbbi olvasmnyok ....................................... 485 sszefoglals . . . . . . . . . . . . . . . . . . .................... . ...... 487

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.

xiv Tanuljuk meg a Visual C# 2008 hasznlatt 24 6ra alatt

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.

Tanuljuk meg a Visual C# 2008 hasznlatt 24 6ra alatt

}(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

A knyv clkznsge s szerkezete


Ezt a knyvet azoknak szntuk, akik alig vagy mg soha nem programoztak, illetve azoknak, akik esetleg msodik nyelvknt hasznlnk a Visual C#-et. A ktetet megrsakor s megszerkesztsekor vilgos cllebegett a szemnk eltt: az, hogy a lehet leggyorsabban termkeny programozt faragjunk az OlvasbL A Visual C# nyelven rt alkalmazsok fejlesztse s a nyelv oktatsa tern szerzett tapasztalataimat felhasznlva olyan knyvet igyekeztem rni, amely remnyeim szerint eloszlatja a kdt, s azt tantja meg, amire szksgnk van. A szerzk gyakran esnek abba a hibba, hogy a technolgira sszpontostanak annak gyakorlati alkalmazsa helyett. n komoly erfesztseket tettem annak rdekben, hogy ebben a ktetben a gyakorlati kszsgekre helyezzem a hangslyt, amelyeknek rgtn hasznt vehetjk egy program fejlesztse sorn. A javaslatokat s sikertrtneteket szvesen vrom a www.jamesfoxall.com/forums cmre. A knyvet t rszre osztottuk, amelyek mindegyike a Visual C# 2008 nyelv alkalmazsfejleszts ms-ms terletre sszpontost. A rszek ltalnossgban azokat a feladatkat s abban a sorrendben kvetik, amelyekkel s ahogyan tallkozni fogunk, amikor elkezdnk sajt programokat rni a Visual C# 2008 segtsgve!, ezrt sorrendben clszer elolvasni ket.

xviii Tanuljuk meg a Visual C# 2008 hasznlatt 24 6ra alatt


l. rsz: A Visual C# 2008 krnyezet- Ebben a rszben a Visual C# krnyezettel ismerkednk meg, belertve azt is, hogy miknt mozoghatunk a Visual C# szmtalan

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 Visual C# 2008 hasznlatt 24 ra alatt xix

A knyvben hasznlt jellsek


Az ismeretek rendszerezst a knyvben hasznlt albbi jellsek teszik egyszerub:

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

A Visual C# 2008 krnyezet


1. ra 2. ra 3. ra 4. ra Programozs a Visual C# 2008-ban: teljes gzzel elre! Navigls a Visual C# 2008-ban Objektumok s gyjtemnyek Esemnyek

1.

RA

Programozs a Visual C# 2008-ban: teljes gzzel elre!


A lecke tartalmbl:

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.

411. rsz A Visual C# 2008 krnyezet


A nagy kereskedelmi alkalmazsok elksztse is kis lpsek sorozatbl ll. Miutn ezen az rn ltrehoztuk az els programunkat, ltalnos kpnk lesz a fejleszts folyamatrl, s elmondhar:juk, hogy megtettk az els lpst afel, hogy profi programoz vljon bel61nk. A kvetkez fejezetekben egybknt ugyancsak az ezen az rn elksztend Picture Viewer programra fogunk pter, s mire befejeZZk a knyvet, egy kzztehet alkalmazs lesz a keznkben, tmretezhet kpemyvel, menket s eszkztrakat tartalmaz, egyszeren hasznlhat fellettel, s megbzhat, professzionlis hibakezelssei elltott kddal. De ne szaladjunk elre! Ezen az rn egy gyorstalpal tanfolyamon vesznk rszt, amelynek sorn lpsr61 lpsre elksztnk egy teljes (br kis mretll) Visual C#-programot. A legtbb bevezet szint programozsi knyv azzal kezddik, hogy az olvas megrja a ltez legegyszerbb (Hello World) programot. Mg nem lttam olyan Hello World programot, aminek brmilyen haszna lett volna (a hello world szveg kir"asa a kpernyre nem tl izgalmas), ezrt mi inkbb egy kpnzeget alkalmazst fogunk kszteni, amellyel Windowsbitkpeket s -ikonokat tekinthetnk meg a szmtgpnkn. Megtanuljuk, hogyan tehetjk lehetv a felhasznlnak, hogy tallzssal fjlokat vlasszon ki, s hogyan jeletthetjk meg a kivlasztott kpfjlokat a kpernyn. Az ezen az rn bemutatott eljrsoknak szmos vals alkalmazsban hasznt vehetjk, de az ra clja csupn annyi, hogy rbresszen minket, milyen szrakoztat programozni a Visual C# segtsgve!.

A Visual C# 2008 elindtsa


Mieltt nekillhatnnk programokat rni a Visual C# 2008-ban, meg kell Lanulnunk az albbi kifejezsek jelentst:

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 l. rsz A Visual C# 2008 krnyezet

PCWorM.-e:r..,.,.....,t~~e..,.2S --~ ".._

l<\liiDK1/S11-GNT..,."lo...
~ . . fotPopfllf.o:ount~

,..,w'"'l'_.. _ _._..........,.godgelr......-po,.. ......, ~


'~""'

,.

fWioatsS.....T.t.W

hi Det'ZISJ ~ Ghl1 lei!M how to ....... IAallot.,..

_ _ ,.......,.'lllwlcor.-

c-top-.

Studi. Shtl ~ I!Mt.Atyovto eteitt IOmC JIMt1 tet twtom mt:'s1 C'Mdc:CKatMAddOnSNdioforWoftdofWwo.t\flft
,.,.,..,tr0114.1t11..-..~--.wrF

AMJ.5....,._WoddotW.a.tt . . ~ F~liO.Ciii#JlW<l!GNTSo,l'>nco- ...............

1.1. bra
A Visu<Jl Studio
kezdlapjrl

~.!.<::s.:;:~w::.~"::.O::: l
Ulll'\g Wllldowt PtiHI!tJM Foutldation (WPF) tfl4 Y'IWIICA

megnyithatunk meglev projekteket, de .f projekteket is indthatunk

1.2. bra
A New Project prbeszdablak klnb6z tpus .NET-projektek Mtrehozst teszi
lehetv

j Windows-alkalmazst a kvetkez lpseket kvetve hozhatunk ltre:


1. Gyzdjnk meg rla, hogy a Windows Application (Windows-alkalmazs) ikon

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-

alkalmazsok egy res ablakkal indulnak- a mka mg csak most


kezddik

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.

air. rsz A Visual C# 2008 krnyezet

A Visual Studio .NET krnyezet


Amikor elszr futtatjuk a Visual Studio 2008-at, szrevehetjk, hogy az IDE szmos ablakot tartalmaz, pldul a Solution Explore r (Megoldstallz) ablakot a jobb oldalon, am elyet a projektet alkot fjlok megtekintsre hasznlun k. Ezeken az ablakokon kivl a fejleszt6kmyezetben fles lapokat is tallunk, pldul a fgg61egesen elhelyezked Toolbox (Eszkzkszlet) panelt az IDE bal szln (lsd az 1.3. brt). Prbljuk ki: kattintsunk a Toolbox flre a Toolbox ablak megjelentshez (ha egy flre kaltinlunk, azzal m indig egy hozz ~rstott ablakot jelertnk meg). Ha az egrmutatt nhny msodpercig egy f l felett tartjuk, azzal ugyancsak megjelenthetjk az ablakot. Az ablak elrejtshez egyszeruen vigyk arrbb az egrmutat t az ablakr l (ha gy jelertettk meg, hogy a fl fl vittk az egeret), vagy kattintsunk egy msik ablakra. Ahhoz, hogy egy ablakot teljesen bezrjunk, az ablak cimsorban tallhat bezr gombr-a 00 ke ll kattintanunk.

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.

1. ra Programozs a Visual C# 2()()8.ban:

Az objektumok jellemz6inek mdosftsa


Szinte minden, amivel a Visual C#-ban dolgozunk, objektum, gy az ablakok s az ablakokra helyezhet elemek, pldul Iistamezk s gombok is, amelyekbl felptjk a felletet. Nagyon sokfle objektum ltezik, s az objektumokat a tpusuk szerint csoportostjuk. Az ablaksablonok pldul Form, mg a rajtuk elhelyezhet elemek Control (vezrl) objektumok. (A 3. rn rszletesen foglalkozunk az objektumokkaU Egyes objektumok csak a kdban lteznek, fizikai megjelensk nincs -. ezekrl az objektumrl a ksbbi rk sorn szlunk.
Mr szrevehettk, hogy a knyv sokszor hivatkozik olyan anyagra, ami csak ksbbi fejezetekben bukkan fel. (Ezeket hvjuk mi elre mutat hivatkozsoknak.) Valamilyen okbl kifolylag az ilyen hivatkozsok sokakat idegesitenek, pedig csak arra szolglnak, hogy megmutassk, hogy amikor elszr tallkozunk egy tmval, nem kell mindent megtanulnunk rla, mert a tudnivalkat ksbb rszletesebben is kifejtjk. Igyekeztnk a lehet legkevesebb elre mutat hivatkozst hasznlni, de a programozsi ismeretek tantsa sajnos nem tkletesen lineris folyamat, ezrt idnknt elfordul, hogy rintennk kell olyan tmkat is, amelyeknek a mlyebb trgyalsra mg nem llunk kszen. Ilyen esetben egy elre mutat hivatkozssal jelezzk, hogy a tmt ksbb rszletesen is trgyaljuk.

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.

10 11. rsz A VISUal C# 2008 krnyezet

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.

Az ablak Text tulajdonsgnak belltsa


Figyeljk meg, hogy az ablak cmsorban a Forml szveg lthat. A Visual C# az ablakok cmsort az ablak nevre lltja, amikor ltrehozzuk az ablakot, de ha az ablaknevet mdostjuk, a cmsor nem vltozik vele egytt. A cmsorban megjelen feliratot az ablak Text tulajdonsgnak rtke hatrozza meg. Vltoztassuk most meg ezt a feliratot az albbi mveletek vgrehajtsval: 1. Kattintsunk egyszer az ablakra, hogy a tulajdonsgai megjelenjenek a Properties ablakban. 2. A Properties ablak grdtsvjnak segtsgvel keressk meg a Text tulajdonsgot. 3. Mdostsuk a szveget Picture Viewer-re, majd nyomjuk le az ENTER billentyt, vagy kattintsunk egy msik tulajdonsgra. Lthatjuk, hogy az ablak cmsorban lev szveg megvltozik.

12 11 . rsz AVISUal C# 2008 krnyezet

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.

~'\ H!tl~h.!:, . . er~ :lUHG==~-- LDQorf!(~ t:rt~ ~Usm\Hmts\Docurntrlb\~ ~~"1<.-+<.WHH


<,

--- ..,., .,

SakAToj>~ : ~-i-

:l!J~-..,.,

.._

1.5. bra
Amikor mentnk egy projektet, meg kell adnunk a projekt nevt s a projekt fjljainak helyt

Ikon hozzadsa az ablakokhoz


Mindenki, aki hasznlt mr Windowst, ismeri az ikonokat - azokat a kis kpeket, amelyek a programokat jelkpezik. Ikonokat tallunk pldul a Start menben a prograrnek neve mellett. A Visual C#-ban nem csak hogy meghatrozhatjuk a programfjljaink ikonjt, hanem az egyes programokban minden ablakhoz sajt ikont rendelhetnk, ha gy tartja kedvnk.

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.

Az ablak mretnek mdostsa


Kvetkez lpsknt az ablak Width (Szlessg) s Height (Magassg) tulajdonsgait fogjuk mdostani. Mindkt tulajdonsg rt@kt a Size (Mret) tulajdonsg tartalmazza: a szlessg a vesszt6l balra, a magassg a vessztl jobbra tallhat. A 'i<>lidth s a Height tulajdonsg rtknek mdostshoz teht a Size tulajdonsgban kell megvltoztatnunk a megfelel szmot. Mindkt rtk kppontban (pixel) rtend, vagyis ha egy ablak Size tulajdonsgnak rtke 200, 350, akkor az ablak 200 kppont szles s 350 kppont magas. Ha a Width s Height tulajdonsgokat kln-kln szerelnnk mdostani, kattintsunk a Si ze tulajdonsg mellett tallhat pluszjelre C+), amelynek hatsra az 1.6. brn lthat mdon megjelenik a kt rsztulajdonsg.

1.6. bra
Egyes tulajdonsgokat kibontva

tovbbi tulajdonsgokhoz jutunk

14 11. rsz A VISUal C# 2008 kmyazet


A kppont a szmtgp-kpernyk mrtkegysge, amely a legkisebb lthat "pttyt" jelenti a kpernyn . A megjelentk felbontst mindig kppontban adjk meg (pldul 800x600 vagy l 024x768). Ha egy tulajdonsg rtkt egyetlen kpponttal nveljk vagy cskkentjk, a lehet legkisebb kpi vltoztatst eszkzljk a tulajdonsgon.

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).

Vezr16k hozzadsa az ablakokhoz


Most, hogy belltottuk az ablakunk kezdeti tulajdonsgait, ideje, hogy objektumokat adjunk az ablakhoz, hogy ltrehozzunk egy felhasznli felletet. Az ablakokra helyezhet objektumokat vezrlo7mek lvjuk. Egyes vezrlk lthat fellettel rendelkeznek, amellyel a felhasznl kapcsolatba lphet, mg msok mindig lthatatlanok maradnak a felhasznl szmra. A pldban mindkt vezrlfajtt hasznlni fogjuk. Ahogy korbban mr emlitettk, a kperny bal oldaln egy fgg6leges panelt tallunk, amely a Toolbox nvre hallgat. Kattintsunk most a Toolbox flre, hogy megjelentsk az eszkzkszlet ablakt, majd kattintsunk a Common Controls (ltalnos vezrl6k) elem mellett pluszjelre, hogy megtekinthessk a leggyakrabban hasznlatos vezrlket (lsd az 1.8. brt). Az eszkzkszlet tartalmazza mndazokat a vezrlket, amelyeket a projeklben hasznlhatunk, pldul a szvegcmkket s szwegmez6ket.

le c.-;;;~
.. Point"' (i) Button
E)Chod:Ba.

JP ~~r....

~=

:
l

.r. !:li..

ll~

A Combob 'ill Dotelim<l'klcrr


A
Labtl

1 : !!;J Mlob:dlatlloc 11!1 MonthCal........ :al Notifyleon !ID NumaklipDown

: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):

16 11 . rsz AV1SU81 C# 2008 krnyezet


Kt Button vezrl- Ezek ugyanazt aszerepet fogjk betlteni, mint a lnyegben rninden Windows-programban megtallhat szabvnyos gombok. Egy PictureBox vezrl- Ezzel a vezrlvel jelentjk meg a kpeket a felhasznl szmra. Egy OpenFileDialog vezrl - Ez egy rejtett vezrl, amely a Windows fjlmegnyit prbeszdablaknak elrst teszi lehetv.

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.

Lthat vezr16 hozzadsa egy ablakhoz


Kezdjk azzal, hogy egy Button (gomb) vezrlt adunk az ablakhoz. Ehhez kattintsunk dupln a Button elemre az eszkzkszletben-a Visual C# ltrehoz egy j gombot, s elhelyezi az ablaksablon bal fels sarkban Osd az 1.9. brt).

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

Tulajdonsg Name Location

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:

Tulajdonsg Name BorderStyle Location Size

rtk picShowPicture FixedSingle


8, 8 282, 275

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.

18 11. rsz A Visual C# 2008 krnyezet

------------~~

;!.u:_~u~-~~:2~ x

UO.bra
Egy alkalmazs felletnek nem kell bonyolultnak lennie ahhoz, hogy hasznos legyen

Lthatattan vezr16 hozzadsa egy ablakhoz


Az eddig felvett vezrlink az ablakon lnek, s fizikailag is megjelennek, amikor

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

Jelljk ki az OpenFileDia log vezrlt, s mdostsuk a tulajdonsgait az albbiak szerint:


Tulajdonsg Name Filename Filter Tit le
rtk ofdSelectPicture
Hagyjuk resen

Windows Bitmaps 1.BMP ljPEG Fi les 1 JPG Select Picture

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

It rsz A Visual C# 2008 krnyezet


A fellet mgtti kd megrsa
Ahhoz, hogy a program kpes legyen feladatokat vgrehajtam s reaglni a felhasznl mveleteire, kdot kell rnunk hozz. A Visual C# esemnyvezrelt nyelv, ami azt jelenti, hogy a kd esemnyek hatsra fut le. Az esemnyeket elidzheti a felhasznl pldul ha egy gomb ra kattint, s ezzel elindtja a gomb c l i c k (kattints) esemnyt -, de maga a Windows is. (Az esemnyek rszletes magyarzatt a 4. rn vesszk.) Az alkalmazsunk ebben a pillanatban csinosan fest, de az gvilgon semmit nem csinl. A feU1asznlk addig kattintgathatnak a Select Picture gombra, amg nhvelygyulladst nem kapnak, s rokkantsgi seglyrt nem folyamodhatnak, de akkor sem trtnik semmi, mivel mg nem mondtuk meg a programnak, hogy mit tegyen, amikor egy felhasznl a gombra a kattint. Magunk is lthatjuk ezt, ha most lenyomjuk az F5 billentyt a projekt futtatshoz: nyugodtan kattintgassunk a gombokra, nem fognak csinlni semmit. Ha kiszrakoztuk magunkat, zrjuk be az ltalunk ltrehozott ablakot, s t~nk vissza tervez mdba. Kt feladat elvgzshez fogunk most kdot rni. Elszr megrjuk azt a kdot, ami lehetv teszi a felhasznlknak, hogy tallzzanak a merevlemezen, s kijelljenek egy kpfjlt, amit aztn megjelenilenek a kpmezben (ez egyltaln nem lesz olyan nehz, mint ahogy hangzik), majd ezt kveten kdot adunk a Quit (Kilps) gombhoz, amely lellrja a programot, amikor a felhasznl erre a gombra kattint.

Fjl kivlasztsnak engedlyezse a felhasznl szmra


Az els kdrszlet, amelyet megrunk, arra szolgl, hogy lehetv tegye a felhasznlnak, hogy tallzzon a merevlemezen, kijelljn egy kpfjlt, majd megjelentse a kpet a PictureBox vezrlben. A program akkor hajtja majd vgre ezt a kdot, ha a felllasznl a Select Picture gombra kattint, ezrt a kdot ennek a gombnak a C li c k esemnyhez kell adnunk. Amikor dupln kattintunk egy ablaksablonon elhelyezett vezrlre a terveznzetben, az adott vezrl> alaprtelmezett esemnye jelenik meg a kdablakban. A Button vczrl5k alaprtelmezett esemnye a Cl ick, ami logikus is, hiszen a kattints a leggyakoribb mO'velet, amit a felhasznlk vgrehajtanak egy gombon. Kattintsunk teht most dupln a Select Picture gombra, hogy a kdablakban hozzf~nk a Click esemnyhez (lsd az 1.12. brt). Amikor megnyitunk egy esemnyt a kdab lakban, a Visual C# egy esemnykezelt hoz ltre, ami lnyegben egy eljrssablon, amelybe belerhatjuk azt a kdot, amelyet vgre szeretnnk hajtatni az esemny bekvetkeztekor. A kurzor rgtn az eljrs kdjba ugrik, ezrt nincs ms dolgunk, mint berr a kdot. Elsre lehet, hogy ijeszt feladat,

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

A kvetkez utasts lesz az a kdsor, amely tnylegesen megjelenti a kpet a kpmezben:

picShowPicture.Image

= Image.FromFile(ofdSelectPicture.FileName);

A kivlasztott kp megjelentsn kvl a programunk a kp fjlnevt s elrsi tjt is

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:
}

Miutn minden kdot bertunk, a

szerkesztben

azt kell ltnunk, mint az 1.13. brn.

$ 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

fUe <1.1&1011 tto. (OtdlelectP.l.c;t-srt.Sho\fDUJ.og() CIJ')lm

Dulcqu'Ul"C.Oit)

c
ll Load ll
~he.

pi<:tU% Ul'tO Cl'le l)t.ct"art


~ oL ~

~a.SbCNPi.ctV%c. :t...a

bo. t-ve . h~Ue (o.f4:Jl.cc.h~ rueae..) 1

now u.._

t t-lt

1.ft e-he fo .za~

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

A program lelltsa kd segftsgvel


Az utols kdrszlet, amelyet meg kell rnunk, lell~a az alkalmazst, amikor a felhasznl a Quit gombra kattint. Ehhez a btnQuit gomb Click esemnykezeljhez kell

hozzfrnnk. A kdablak tetejn kt flet lthatunk. A jelenleg kivlasztott fln


a ViewerForm . cs* szveg lthat; az ehhez a flhz tartozlap teht a ViewerForm.cs fjlnew ablak kdablakt tartalmazza. A msik fl felirata ViewerForm.cs [Design].

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.

26 IJ. lisz A Visual C# 2008 krnyezet

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


A lecke tartalmbl:

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

It rsz A Visual C# 2008 krnyezet


Ezen az rn azt tanuljuk meg, hogy tniknt szabhatjuk testre a fejlesztkrnyezetet a tervez6ablakok mozgatsval, rgztsvel, lebegv ttelvel, elrejtsvel s megjelentsvel, illetve hogyan alakthatjuk az ignyeinkhez a menket s az eszkztrakat Mg egy j eszkztrat is ltre fogunk hozni a "semmibl". Miutn megismerkedtnk a krnyezettel, a projektekrl s az azokat alkot fjlokrl ejtnk nhny szt (rszletesebben, mint ahogy az l. rn tettk), majd szemgyre vesszk azokat a tervezab lakokat, amelyeket a legtbbszr fogunk hasznlni, vgl pedig megtudjuk, hogyan krhetnk segtsget, ha elakadtunk

A Visual C# 2008 kezd61apjnak hasmlata


Alaprtelmezs szerint a Visual C# 2008 kezdlapja (Start Page), amelyet a 2.1. brn lthatunk, az els, amit ltunk, amikor elindtjuk a Visual C# krnyezetet (ha mg nem futna, indtsuk elmost). A Visual C# 2008 kezdelapja az a hely, ahol megadhatjuk, hogy rnilyen feladatot szeretnnk elvgezni a Visual C# segtsgveL Errl a laprl megnyithatunk korbban szerkesztett projekteket, j projekteket hozhatunk ltre, s segtsget is krhetnk.

PCWoow-.. ~.._....,,.,.,,_, _ _ _ ~

:~.~o:== ;!."~!;.=;;::::;z~., ._~f


~,s.....,l-.tMW

....

,.~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

fol. OoclllG7ll<d:l3 GMT

::!::=":::::~m.~~.::'c~"""'

---1'0"

howteout<)"OW

2.1. bra
A Start Page minden

.NET-nyelv alaprtelmezett kezdpontja

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 c.AppiieJtion APIJ(....., Apt>llutloo

WPf-

Em,Jty Pojoct

Sl
.."

2.2. bra
Az j Visual C# projektele ltrehozsra a New Project prbeszdablakot hasznlhatjuk

........tf.......,.... " . . _ . _ . _ _ , _ _ _ _ ( . N [ I _ I S )___ - - -

,.._,.._. ---,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

32 11. rsz A Visual C# 2008 krnyezet


j projektet brmikor ltrehozhatunk (nem csak amikor elindtjuk a Visual C#-ot) ehhez a File, New Project (Fjl, j projekt) menpontot kell vlasztanunk. Amikor azonban ltrehozunk vagy megnyitunk egy projektet, az aktv projekt bezrul; igaz, a Visual C# elbb megkrdezi, hogy szerelnnk-e menteni a mdostsainkat.
Miutn bertuk a projekt nevt, s az OK gombra kattintottunk, a Visual C# ltrehozza a projektet. Ne feledjk, a merevlemezre semmi nem kerl addig, amg az eszkztron a Save vagy a Save Ali gombra (vagy ezek megfelelire a menben) nem kattintottunk.

Ltez6 projekt megnyitsa


Idvel

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.

A Visual C# krnyezet elemeinek elrse s testreszabsa


A Visual C# felletnek szmos elemt, gy az ablakokat s az eszkztrakat is testreszabhatjuk, ami hatkonyabb teheti a mun.k.nkat. Nyissunk most egy j Windows-alkalmazst a File, New Project menponttal, adjuk neki az Environment Tutarial (Krnyezeti tmutat) nevet, majd az OK gombbal hozzunk ltre a projektet. (Ebben a gyakorlatban nem ksztnk semmilyen jrahasznosthat elemet; a projekt csak azt fogja szernlltetni, hogy

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.

34 II. rsz A Visual C# 2008 krnyezet


A tervez6ablakok megjelenftse s elrejtsa
Amikor egy te!Vez6ablakot bezrunk, sehol nem lesz lthat, ugyanakkor (ahogy hamarosan megtanuljuk) klnbsg van akztt, hogy egy ablak bezrt llapotban van, vagy automatikusan elrejtette magt. A bezrt vagy elrejtett ablakokat a View (Nzet) men megfelel pontjra kattintva hvhatjuk el. Pldul ha a Properties ablak nem lthat a fejleszt6krnyezetben, a View, Properties Window menponttal (vagy ezeknek a billent}'\Jparancsval, a CTRL+W, majd a P billent:y{lkkel) jelenthetjk meg. Ha teht szksgnk van egy te1Vez6ablakra, de nem talljuk a felleten, hvjuk segtsgl a View ment. Ha egy teiVezablakot be szeretnnk zrni, kattintsunk a bezr gombjra (a cmsor jobb szln tallhat X gombra), ugyangy, ahogy egy szokvnyos ablak esetben tennnk.

A tervez6ablakok lebeg6v ttele


A lebeg teiVezablakok olyan lthat ablakok, amelyek a munkaterlet felett lebegnek, ahogy a 2.4. br-a is mutatja. A lebeg ablakok a szokvnyos alkalmazsablakokhoz hasonltanak, mert tetszsszerint megragadhatjuk s thelyezhetjk ket az egrrel, akr egy msik monitorra is, ha a kpernyt tbb megjelentre terjesztettk ki. A lebeg6 ablakokat nem csak mozgathatjuk, hanem a keretket hzva t is mretezhetjk. Ha egy rgztett ablakot lebeg6v szeretnnk tenni, kattintsunk a crnsorra, s az egrgombot lenyomva tartva vlasszuk le a fejlesztkrnyezetnek arrl a szlr6l, ahov tapad.

,_,. ......
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

tervezkrnyezet felett jelennek

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.

36 I J. rsz A Visual C# 2008 krnyezet

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.

A tervez6ablakok automatikus elrejtsa


A Visual C# ablakai kpesek automatikusan elrejteni nmagukat, ha ppen nem hasznljuk 6ket. Ezt elsre zavarnak tallhatjuk, de ha hozzszoktunk, hatkony munkt tesz lehetv, mert a munkaterlet felszabadul, mikzben a tervezabl akokat tovbbra is egyszelilen elrhetjk, csak mozgatnunk kell az egeret. Az automatikus elrejtsre lltott ablakok mindig rgztettek; a lebeg ablakokat nem llthatjuk be ilyen viselkedsre. Amikor egy ablak rejtett llapotban van, fggleges flknt jelenik meg a tervezkrnyezetnek azon a szln, amelyikhez rgztettk - hasonlan ahhoz, ahogy a kis mretre lltott alkalmazsok lnek ikonknt a Windows Tlcjn. Ha a tevezkrnyezet bal oldalra pillantunk, szrevehetjk a Toolbox (Eszkzkszlet) felirat flet, amely szintn egy automarikusan elrejtett ablakot jell. Ha meg szeretnnk jelenteni egy ilyen ablakot, vigyk az egrmutatt az ablakot jelkpez fl fl. Amint a mutat a fl fl r, a Visual C# megjelerti az ablakot, hogy elrhesstik annak szolgltatsait. Ha az egrmutatt elvisszk az ablak fll, az ablak nmkden elrejti magt - innen ered az ilyen ablakok neve. Ha egy ablakot automatikus elrejtsv szecetnnk tenni, kattintsunk az egr jobb gombjval a cmsorra, s vlasszuk a megjelen helyi

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.

Az eszkztrak megjelenttse s elrejtsa


A Visual C# szmos beptett eszkztrat tartalmaz, amelyeket a projektek ltrehozsa sorn hasznlhatunk. Ezek egyike az rn eddig ltott brk tbbsgn szerepelt: a Standard (Szoksos) eszkztrrl van sz, amelyet rdemes mindig megjelentett llapotban tartani.
Kezd Visual C#-programozknt a leggyakrabban a Standard, a Text Editor (Szvegszerkeszts) s a Debug (Hibakeress) eszkztrakat fogjuk hasznlni; ezek mindegyikrl szt ejtnk ebben a fejezetben. A szksgesnek gondolt szolgltatsokhoz ezenkvl sajt eszkztrakat is ltrehozhatunk

38 II. rsz A Visual C# 2008 krnyezet


Ha egy eszkztrat el szecetnnk rejteni vagy meg szecetnnk jelenteni, nyissuk meg a View (Nzet) ment, s a Toolbars (Eszkztrak) pontra kattintva jelentsk meg a rendelkezsre ll eszkztrak listjt. A jelenleg lthat eszkztrak neve mellett egy pipt lthatunk Osd a 2.6. brt). Ha be vagy ki szecetnnk kapcsoini egy eszkztr lthatsgt, az eszkztr nevre kell kattintanunk.
A rendelkezsre ll eszkztrak listjt gy is gyorsan elrhetjk, ha az egr jobb gombjval valamelyik lthat esz:kztrra kattintunk.

Qt r,,.,t._
'li !Iti Out,..t

<(i SoliAionlloplom (lll T..l.t..o

""''-*-

-w.r
b<W,l

2.6. bra
A munkaterletet az eszkztrak elrejtsvel s megjelentsvel
fs

szablyozhatjuk

Az eszkztrak rgzftse s tmretezse


Ugyangy, ahogy rgzthetjk s lebegv tehetjk a Visual C# tervezablakait, az eszkztrakat is rgzthetjk, illetve levlaszthatjuk. A tervezablakokkal ellenttben azonban a Visual C# eszkztrainak nincs cmsora, amelyet az egrrel megragadhatnnk, amikor az eszkztr rgztett llapotban van. A rgztett eszkztrak ehelyett egy hzfogantyval rendelkeznek (ami egy fggleges pontsor az eszkztr bal szln). Haleszeretnnk vlasztani (vagyis lebegv szerelnnk tenni) egy eszkztrat, a hzfogantyjnl fogva hzhatjuk el a helyrl. A lebeg eszkztrakon azonban mr lthat a cmsor, gy ha jra rgzteni szeretnnk ket, a cmsoruknl fogva hzhatjuk a tervezkrnyezet kvnt szlhez, ugyanazt a mdszert alkalmazva, mint a tervezablakok esetben.

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.

Vezr16k hozzadsa az ablakokhoz az eszkzkszlet segftsgvel


Az egyestett fejlesztkrnyezet nagyszen eszkzket biztost az alkalmazsaink grafikus felhasznli felletnek (GUI) felptshez. A legtbb GUI egy vagy tbb ablakbl ll, amelyeken klnfle elemek, pldul szveg- s Iistamezk tallhatk. Ezeket a vezrl ket az eszkzkszlet segtsgvel helyezhetjk el az ablakokon. Az eszkzkszlet alaprtelmezett kinzett, amelyet a Visual C#-projektek ltrehozsakor, illetve megnyitsakor ltunk, a 2.7. brn lthatjuk. Az itt tallhat vezrlket rszletesen a 7. s 8. rn trgyaljuk majd.

2.7. bra
Az eszkzkszlet szmos hasznos vezrlt tartalmaz, amelyek segtsgvel hatkony felleteket

pthetnk

40 11 . rz A Visual C# 2008 krnyezet


A vezrlket ngyflekppen adhatjuk az ablakokhoz:
Az eszkztron arra az eszkzre kattintunk, amelyik az ablakr-a helyezni kvnt vezrlt jelkpezi, majd az egrrel lnyegben felrajzoljuk a vezrl kerett az ablaksablon kvnt helyre. Ahol az egeret hzni kezdjk, ott lesz a vezrl bal fels sarka, ahol pedig felengedjk az egrgombot, oda kerl a jobb als sarok. Az eszkztron dupln kattintunk a kvnt vezrltpusra. Ha dupln kattintunk egy vezrlre az eszkztron, a kijellt tpusnak megfelel j vezrl az ablak::;ablon bal fels sarkba kerl, amennyiben az ablak van kijellve. Ha a mvelet eltt egy vezrlt jelltnk ki, az j vezrl attl kiss jobbra lefel jelenik meg. A vezrl a kijellt vezrltpus alaprtelmezett magassgval s szlessgvel jn ltre. Amennyiben csak futsidben hasznlatos vezrlt vlasztottunk, pldul az l. rn ltott OpenFileDialog vezrlt, az az ablaksablon alatt jelenik meg. A vezrlt az egrrel lehzzuk az eszkzkszletrl , s az ablaksablonra ejtjk. Ha az egrmutatt egy ideig az ablak felett tartjuk, az eszkzkszlet eltnik, s a vezrl6t az ablak tetszleges helyre ejthetjk Az egr jobb gombjval egy meglev vezrlre kattintunk, s a Copy (Msols) menpontot vlasztjuk, majd ugyancsak a jobb gombbal az ablakra kattintunk, s a Paste (Beilleszts) parancsot vlasztva msolatot hozunk ltre a vezrl6rl.

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.

Objektumtulajdonsgok bel1ftsa a Properties ablakban


Egy progr-am felletnek kialaktsakor jelents idt tltnk az objektumok tulajdonsgainak megtekintsvel s belltsval a Properties ablakban (amelyet a 2.8. brn lthatunk). A Properties ablak ngy rszbl ll: az objektumok lenyl listjbl, a tulajdonsgok listjbl, a tulajdonsgrcs megjelensnek szablyozsra szolgl gombokbl, s a kijellt tulajdonsg lerst mutat6 rszbL

2. ra

a Visual C# 2008-ban 41

2.8. bra
Az ablakok s vezrlo'"k tulajdonsgait a Properties ablakban tekinthetjk meg s mdosthatjuk

Objektum kijellse s tulajdonsgainak megtekintse


A Properties ablak tetejn tallhat lenyl lista annak az ablaknak a nevt mutatja, amelyiken ppen dolgozunk, illetve az ablakon tallhat sszes objektumot (vagyis az ablak vezrlit). Ha meg szecetnnk tekinteni egy vezrl tulajdonsgait, vlasszuk ki a lenyl listbl, vagy keressk meg az ablakon, s kattintsunk r. Ne feledjk, hogy ahhoz, hogy kattintssal kijellhessnk egy objektumot, az eszkzkszletben a mutat eszkznek kell kivlasztva lennie.

Tulajdonsgok megtekintse s mdosftsa


A Properties ablak els kt gombja- a Categorized (Csoportonknt) s az AJphabetic (bcsorrendben) - lehetv teszi, hogy kivlasszuk, milyen formban szecetnnk ltni a tulajdonsgokat. Ha az AJphabetic gombot vlasztjuk, a kijellt objektum' tulajdonsgai bcsorrendben jelennek meg a Properties ablakban, mg ha a Categorized gombra kattintunk, a tulajdonsgokat csoportostva lthatjuk. Az Appearance (Megjelens) csoport pldul olyan tulajdonsgokat tartalmaz, mint a BackColor (httrszn) vagy a BorderStyle (keretstlus). A tulajdonsgokkal val munkhoz vlasszuk azt a nzetet, amelyik a legknyelmesebb a szmunkra, s szksg szerint vltsunk a nzetek kztt. A tulajdonsgok megtekintsre s belltsra a Properties ablak Properties ablaktblja szolgl. Egy tulajdonsgot a kvetkez mdszerek egyikvel llthatunk be: Berunk egy rtket. Kivlasztjuk a kvnt rtket egy lenyl listbL Egy hrom pontot brzol gombra kattintunk, hogy elrjk a tulajdonsghoz tartoz lehetsgeket.

42 11. rsz AVISUBI C# 2008 krnyezet


Sok tulajdonsg tbbflekppen is bellfthat; a szfntulajdonsgok esetben pldul a sznt kivlaszthatjuk egy lenyl listbl, de berhatunk egy sznrtket is.

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

szvegnek megjelenst szablyozhatjuk

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.)

44 11 . rsz A V1SU81 C# 2008 k.my8Z8t


A Properties ablakban minden szntulajdonsg mellett egy sznngyszget lthatunk, amely a tulajdonsg vlasztott sznt mutatja, a sznngyszg mellett pedig egy szveg ll, ami vagy a szn neve, vagy a sznt meghatroz RGB rtk. Ha egy szntulajdonsgra kattintunk, a korbban ltottakhoz hasonl mdon egy lefel mutat nyl jelenik meg, de rkattintva nem egy szakvnyes lenyllistt nyitunk meg. A 2.10. brn lthatjuk, hogy miknt fest egy szntulajdonsg lenyl listja.

HolTrock INc~

!:::IINctiveCoptlo
Dtnlo - lnloTewt
0Monu

- ~-~Teoct

DMonulla< MonuHigNight MonuTert III!Scroftlot

Fi<rd3D

C.US<5Vofd<on h~ ChatactuCsJnv ><; Cont~nuStrlp t-. Cursot !lod:

TlU O Normal (none) l!e.m

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

46 II. rsz A Visual C# 2008 krnyezet


A tulajdonsglefrsok megtekintse
Nem l'lllndig teljesen nyilvnval, hogy egy adon tulajdonsg mire szolgl, klnsen a Visual C# kezd felhasznli szmra. A Properties ablak aljn tallhat Description (Lers) rsz szerencsre megmutatja a kijellt tulajdonsg egyszer lerst; ha meg szereLnnk egyet tekinteni, kattintsunk a kvnt tulajdonsgra vagy a hozz tartoz rtkmezre. Ha egy tulajdonsgrl teljesebb lerst szeretnnk kapru, kanintsunk r egyszer, hogy kijelljk, majd nyomjuk le az Fl billentyt a sg megjelertshez. A Properties ablak Description rszt brmikor elrejthetjk vagy jra megjelenithetjk, ha az egr jobb gombjval a Properties ablak tetszleges rszre kattintunk (az rtkoszlopot, illetve a cmsort kivve), s a helyi menbl a Description pontot vlasztjuk. Ezzel a mvelettel vlthatunk a ler rsz rejten s lthat llapota kztt. Ha vltoztatru szecetnnk a Description mez mretn, fogjuk meg az egrrel a szeglyt, amely elvlasztja a tulajdonsgok mezjtl, s hzzuk a kvnt mretre.

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.

Projektfjlok kezelse a Solution Explorer segftsgvel


A fejlesztett projektjeink egyre sszetenebbek lesznek, s sok-sok objektumot -pldul ablakokat s modulokat (csoportba szervezen kdrszeket) -tartalmaznak majd. Minden objektumot egy vagy tbb fjl hatroz meg a merevlemezen, s emellett tbb projektbl sszetett megoldsokat is felpthetnk. A 2.13. brn lthat Solution Explorer ablak az az eszkz, amellyel az egyszer vagy sszeten megoldsok sszes fjljt kezelhetjk. A Solution Explorer segtsgvel projektfjlokat vehetnk fel, nevezhetnk t s tvolthatunk el, valamint objektumokat jelllietnk ki, hogy megtekintsk a tulajdonsgaikat. Ha a Solution Explorer ablak jelenleg nem lthat a kpernynkn, jelentsk meg a View, Solution Explorer menponttal.

Envir

!;l Solution 'ErMroMI<nt Tlriol' (l proje<l)

E.. QJ f rvtrOtfllNII t "torWI

+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.

[;;

n 'Picbn Vi"_. 11 proje<l)

r;r: fi{S~MwtAUrJb W Picp


t- Cili ~ttoncos ij}.. r::J bin
~

liJ D obj f... il Progr&m.a

lll Viowaform.a
"

~ V'~Form.Otsigner.a

~rfofm.roa

2.14. bra
A Solution Explorerben megfigyelhctjk, hogy az ltalunk ltrehozott ablak kt fjlbl ll

48 II. rsz A Visual C# 2008 krnyezet


A Solution Explorer ablaknak most gy kell festenie, mint a 2.14. brn. lltsuk szlesebbre az ablakot, hogy minden elem olvashat legyen benne.
Egyes ablakok s ms objektumok egynl tbb fjlbl llhatnak, a Visual C# azonban alaprtelmezs szerint elrejti azokat a projektfjlokat, amelyeket nem kzvetlenl szerkesztnk. Ha a ViewerForm.cs elem melletti pluszjelre kattintunk, lthatjuk, hogy ez az elem a ViewerForm.resx s a ViewerForm.Designer.cs rszelemekbl ll. Ezekrl a fjlokrl az 5. rn tanulunk majd; most azonban kattintsunk ismt a Show Ali Files gombra, hogy errejtsk a kapcsolt fjlokat

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/>.

50 11. rsz A Visual C# 2008 krnyezet


A projektjeinkben tbbek kztt az albbi tpus

sszetevket

hasznlhatjuk:

Oszttymodulok -Az osztlymodulok olyan klnleges modulok, amelyek objek-

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.

Projektfjlok hozzadsa s eltvoltsa


Amikor elindtjuk a Visual C# 2008-at, s ltrehozunk egy j Windows Application projektet, a Visual C# egyetlen ablakkal hozza ltre azt. Mindazonltal nem kell egyetlen ablakra szortkoznunk - a projektekben tetszleges szm ablakot hozhatunk ltre, s mr meglev6 ablakokat is hozzjuk adhatunk. (Elg ersnek rezzk mr magunkat?) Ezenkvl osztlymodulokat s ms tpus objektumokat is ltrehozhatunk s felvehetnk. Egy j vagy mr meglev objektumot hromflekppen adhatunk egy projekthez: A Project menbl a megfelel menpontot vlasztjuk A Standard eszkztron az Add New Item (j elem hozzadsa) gombhoz tartoz kis lefel mutat nylra kattintunk, s a megjelen lenyil listbl vlasztjuk ki a kvnt objektumtpust (lsd a 2.16. brt). Az egr jobb gombjval a projekt nevre kattintunk a Solution Explorer ablakban, s a megjelen helyi men Add (Hozzads) almenjb61 kivlasztjuk az objektumtpust.

2.16. bra
Hromflekppen adhatunk objektumokat egy projekthez- az egyik md.szer, hogy az objektumot ennek az eszk6ztrgombnak a len)111 listjbl vJasztjuk ki

52 ( 1. rsz A Visual C# 2008 krnyezet


A fenti menkbl valamelyik Add objektumtpus menpontot vlasztva egy prbeszdablak jelenik meg, amely a projekthez adhat objektumtipusokat mutatja, s alaprtelmezs szerint kijelli a vlasztott elemtipust (lsd a 2.17. brt). A vlasztott tipus j objektum ltrehozshoz csak nevet kell adnunk az objektumnak, majd az Open gombra kattintanunk. Ha msfajta objektumot szeretnnk ltrehozni, kattintssal jelljk ki a kvnt tipust, nevezzk el az objektumot, majd ez utn kattintsunk az Open gombra.

-... ...
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.

~rtkek trolsa vltozkban


A vltozk olyan elemek a kdban, amelyek rtkeket trolnak Ltrehozhatunk pldul egy olyan vltozt, amely egy felhasznl nevt trolja, vagy egy olyat, amely az letkort. Minden vltozt (trolegyedet) ltre kell hoznunk, mieltt hasznlatba vehetnnk A vltozk ltrehozst a vltozk bevezetsnek (deklarci) nevezzk. Amikor bevezetnk egy vltozt, meg kell adnunk azt is, hogy milyen tpus adatot fog trolni - ez egy szemly nevnek az esetben pldul szveg (string, karakterlnc) lehet, mg az letkor esetben szm. Lssunk egy pldt a vltozk bevezetsre:
string strF irstName ;

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

Mllkdsi egysgek kialaktsa a kdban eljrsok segftsgvel


Amikor Visual C# kdot runk, a kdot egy eljrsban helyezzk el. Az eljrs kdutastsok egy olyan csoportja, amely egy bizonyos feladatot hajt vgre. Az eljrsok egyms kdjbl hvhatk meg; ltrehozhatunk pldul egy olyan eljrst, amely kiszmrja egy rendels vgsszegt, illetve egy msikat, amely hozzadja az ft. Kle eljrs ltezik: vannak olyanok, amelyek nem adnak vissza rtket, s vannak olyanok, amelyek igen. Ezenklvl egyes eljrsoknak adatokat is tadhatunk, pldul az imm emltett faszmt eljrs megengedheti a hv utastsnak, hogy tadjon egy sszeget az eljrsnak, amelyb61 az kiszrntja a forgalmi adt. Az adatokat, amelyeket a hv kd tad az eljrsnak, paramtereknek hvjuk. Nem minden eljrsnak muszj paramtereket elfogadnia. Azokat az eljrsokat, amelyek nem adnak vissza rtket, a void kulcsszval vezetjk be, s gy nznek ki:
public void MyProcedure()
{

l l Ide jn az

eljrs kdja

54 l. rsz A VJSUal C# 2008 krnyezet


Figyeljk meg a nyit s zr kapcsos zrjeleket -ezek veszik krbe a Visual C# minden eljrsnak kdjt.
Az rtket visszaad eljrsokat gy kell bevezetnnk, hogy megadjuk a visszaadott

rtk tpust az eljrs neve eltt:


public string AuthorNarne()
{

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)
{

l l Ide jn az eljrs kdja

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

56 II. rsz A VISual C# 2008 krnyezet


most megtanuljuk, miknt hajthatk vgre. Vgl azt is megnztk, hogyan rhetjk el a Visual C# sgjt- garantlom, hogy ezt a Visual C# tanulsa sorn igen fontosnak fogjuk tallni. A Visual C# 2008 hatalmas mret s nagy tuds fejleszteszkz - sokkal nagyobb tuds, mint a Visual C# brmelyik korbbi vltozata. Ne vrjuk, hogy egyik naprl a msikra a szakrtjv vlunk, mert ez egyszeren lehetetlen, de az ezen az rn megismert eszkzk s eljrsok segtenek, hogy megtegyk az els lpseket az ton. Ne feledjk: az ezen az rn tanultak nagy rszt minden alkalommal hasznostani fogjuk, amikor Visual C#-alkalmazst ksztnk. Gyakoroljuk szorgalmasan az itt trgyalt alapmGveleteket, s gyorsan kpess vlunk arra, hogy hasznos programokat rjunk.

Krdezz-felelek
K: l/ogyan tudhatunk meg t6bbet egyszeren egy tulajdonsgr/, ha a Properties

ablak leir rsze nem ad elg informcit?


V: Kattintsunk a krdses tulajdonsgra, hogy kijelljk, majd nyomjUk le az Fl billentyt - a krnyezetrzkeny sg a Properties ablakban lthat tulajdonsgok esetben is mGkdik. K: Sok teroezab/akot kellene ltnom egyszerre, de nem tallom az "igazi" elrendezst. Mit tehetek? V: Ilyen esetben clszer a rendszert magasabb kpernyfelbontssal futtatni. Jmagam nemigen hasznlok a fejleszts sorn 1024x768 kppontosnl alacsonyabb felbontst, st valjban minden szmtgphez, amelyen programokat rok, kt monitort kapcsolok, amelyek 1152x864-es felbontssal makdnek. A nagyobb kpernyfellet mindig j befektetsnek bizonyul.

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 Object Browser hasznlata

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

60 11 . rsz A VISUal C# 2008 krnyezet


(objektumorientlt) nyelv. Magval az objektumkzpont programozssal ezen az rn nem foglalkozunk, mert rendkivl sszetett tma, s messze meghaladja knyvnk kereteit- ehelyett ltalnos rtelemben trgyaljuk az objektumokat. Minden, amit a Visual C#-ban hasznlunk, objektum, ezrt ahhoz, hogy sikeres Visual C#-programozv vljunk, ltfontossg, hogy alaposan megtanuljuk ennek az rnak az anyagt. Objektumok pldul az ablakok, illetve a rajtuk elhelyezhet vezrlk, s lnyegben minden ms elem, amibl a Visual C#-projektek felplnek, s ezek az objektumok objektumgyjtemnyek rszt kpezik. Minden objektumnak vannak jellemzi (ezeket tulajdonsgoknak hivjuk), ezenkvl a legtbb objektum rendelkezik tagfggvnyekkel s esemnyekkeL Akr egyszer, akr nagy mret, zleti alkalmazst ksztnk, rtennk kell az objektumok mibenltt s mkdst, mskpp nem lehetnk sikeresek. Ezen az rn teht megtanuljuk, mi teszi az objektumokat objektumm, s megismerkednk a gyjtemnyekkel is.
Ha olvassuk a programozknak szl rsokat a sajtban, valsznleg mr tallkoztunk az objektumkzpont kifejezssel, s taln az olyan szavakkal is, mint a tbbalaksg (polimorfizmus), az egysgbe zrs (enkapszulci, betokozs) vagy az rkls. A Visual C# ezen objektumkzpont lehetsgei nagyon izgalmasak, de a trgyalsuk messze meghaladja a 3. ra (st mind a 24 ra) kereteit. A knyv sorn persze megtanulunk ezt-azt az objektumkzpont programozsrl (object-oriented programming, OOP), de ha a programozi tudsunkat valban magasabb szintre szeretnnk emelni, rdemes beszereznnk egy kifejezetten ezzel a tmval foglalkoz knyvet, miutn ezt a ktetet elolvastuk.

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

Tulajdonsgok kiolvassa s bellftsa


Mr lttuk, hogyan tekinthetnk meg s mdosthatun.k tulajdonsgokat a Properties ablakban, de ez az ablak csak tervezskor rhet el, s csak az ablakok s vezrlk tulajdonsgait vltoztathatjuk meg rajta. A tulajdonsgok kiolvasst s mdostst tbbnyire Visual C# kddal fogjuk elvgezni, nem a Properties ablakban. A kdban gy hivatkozhatunk egy tulajdonsgra, hogy elszr megadjuk az objektum nevt, majd egy pontot tesznk utna, s ezt kveten lerjuk a tulajdonsg nevt:
{Objektumnv} . {TUlajdonsg}

Teht ha van pldul egy btnClickMe nev gomb objektumunk, gy hivatkozhatunk a gomb Te x t tulajdonsgra:
btnClickMe . Text

62 II. rsz A Visual C# 2008 krnyezet


Ez a kdsor visszaadja a btnClickMe nev gomb objektum Text tulajdonsgnak rtkt, brmi is legyen az. Ha egy tulajdonsgnak valamilyen rtket szeretnnk adni, egy egyenlsgjelet (=) kell hasznlnunk; a fenti gomb Left tulajdonsgt pldul egy az albbihoz hasonl kdsorral mdosthatjuk: btnClickMe.Left = 90; A kvetkez kdsor a btnClickMe nev gomb objektum Text tulajdonsgnak rtkt egy ideiglenes vltozha (strText) helyezi. Az utasts azrt a Text tulajdonsg rtkt adja vissza, mert az egyenlsgjel jobb oldaln erre hivatkozunk: strText

= 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.

Mllveletek objektumokkal s objektumtulajdonsgokkal


Most, hogy tudjuk, mik azok a tulajdonsgok, s hogyan tekinthetk meg s mdosthatk, ksrletezznk egy kicsit velk! Az l. rn elksztett Picture Viewer projekt objektumainak tulajdonsgait fogjuk mdostani. Emlkezhetnk r, hogy az 1. rn megtanultuk, hogyan llthatjuk be egy ablak Height s Width tulajdonsgait a Properties ablakban - most ugyanezt fogjuk elvgezni, de Visual C# kddal.

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

Bellitand rtk btnEnlarge

Location
Size
Text

338, 261
21 , 23

" (Ezt angol billentykiosztsnl a SHJFT+6 billentykkel rhetjk el)

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:

Tulajdonsg Name Location Size


Text

Bellitand rtk btnShrink


365, 261 21, 23

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

64 It. rsz AVisual C# 2008 krnyezet

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?

listi (amelyeket automatikus kiegsztsi szolgltat.snak is hvnak) jelentsen megk6nnytik a kdolst

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

az adott kd tartozik (ami esetnkben az ablak). A this egy gynevezett foglalt


sz, ami azt jelenti, hogy nem adhat nvknt objektumoknak s vltozknak,

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
=

- 20; this.Height - 20;

pri.qve.
l

't'01d ln~~_CUek(obJ~

end&' tve..nu.:ro )
~

ll Clo. . t;he v.1.0dow t'd x.u.


u.t.CloM ();

-ppl1c.atu:.n.

pft.n.t~ .OUt bt.n.l:tll~-Cl1Ckfobiect. ~neke-. 't.-cDtlu'4;1!1 e)

l
~h.t:t.tl14~

Cble.IU.cltb 20:

dU..ItJtbt - Us.U.k10E + 20:

prl'Vttte voi.CI btn.!bu.ok_CU.Ck(db'~ fl)4e:r. t"1U\t.lr0 e )

'

tU. Vl.dU t:hie,

"J.d t#

lal 114:1thc. -

tltJ.. IUCk~

... 20; - 20;

3.4. bra
Az ltalunk befrt

....

O.

kdnak pontosan gy kell kinznie

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.

&a l t. rsz A Visual C# 2008 krnyezst


A tagfggvnyeket ltalban arra hasznljuk, hogy egy objektummal vgrehajtassunk valamilyen mveletet, pldul mentsnk vagy trljnk egy rekordot egy adatbzisbL A tulajdonsgok ezzel szemben az objektumok jellemzinek belltsra s kiolvassra szolglnak. Az egyik mdja annak, hogy megllaptsuk, hogy egy adott kdban szerepl utasts tulajdonsghivatkozs vagy tagfggvnyhvs-e, hogy megnzzk, van-e utna zrjel. Ha igen, mint pldul az AlbumForm. ShowDialog () ; utastsban, akkor tagfggvnyhvsrl van sz.
A tagfggvnyek meghvsa egyszer; a kihvst az jelenti, hogy rudjuk, rnilyen

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

Egyszen1, objektumokra pl projekt felpftse


Az objektumok mibenltt s mkdst csak akkor rthetjk meg igazn, ha hasznljuk

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.

A rajzolprogram felletnek ltrehozsa


A fejezetben eddig hasznlt Picture Viewer projektet folytatva adjunk egy j gombot

a program ablakhoz, s lltsuk be a tulajdonsgait a

kvetkez

tblzat szerint:

Tulajdonsg Name Location Size Text

rtk
btnDrawBorder
295 , 69 85, 23

Draw Border

3. 6ra.

Az objektum alap kd megrsa


Most kdunk adunk az imnt ltrehozott gomb Click esemnyhez. Minden utastst elmagyarzunk majd, s a lpsek vgn a teljes kdot is bemutatjuk
1. Kattintsunk dupln az imnt ltrehozott Draw Border (Keret rajzolsa) gombra a Click esemnynek az elrshez. 2. rjuk be az els kdsort, amely a kvetkez utastst tartalmazza (ne felejtsk cl

lenyornni az ENI'ER-t az utastssor vgn):


Graphics objGrapbics

= 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.

70 11 . rsz A Visual C# 2008 krnyezet


rjuk be most a harmadik kdsort is, az albbiaknak megfelel6en:
objGraphics.Clear(SystemColors.Control);

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.

12 11 . rsz A Visual C# 2008 krnyezst


Utols lpsknt a
kvetkez

utastst berva ki kell takartanunk magunk utn:

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

tovbblpnnk, mentsk a mlinknkat az eszkztr Save Ali gombjra kattintva.

Az objektumokra pl6 pldaprojekt tesztelse


Most jn a knny(I rsz: futtassuk a projektet az F5 billentyl11enyornsval vagy az eszkztr Start gombjra kattintva. Az ablakunk lnyegben gy kell fessen, mint ahogy tervezskor lttuk. Ha a Draw Border gombra kattintunk, a kpmez krl egy kk keret jelenik meg (lsd a 3.7. brt).
Ha hibazenetet kapunk, amikor megksreljk futtatni a programot, trjnk vissza a tervezhz, s ellenrizzk, hogy pontosan gy rtunk-e be minden kdot, ahogy a knyvben szerepel.

3. ra

3.7. bra
Egyszer vonalakat

s bonyolult rajzokat egyarnt objektumokkal hozhatunk ltre

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-

74 11. mz A VJSUal C# 2008 krnyezet


sga, amely a gyjtemnyben tallhat objektumok szmt adja vissza. A gy\1jtemnyeknek ezenkvllehetnek tagfggvnyeik is, pldul egy Delete () nev, amellyel objektumokat trlhetnk a gyjtemnyb61, vagy egy Add () nev, amellyel j objektumokat adhatunk a gy\1jtemnyhez.

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

Show Control Names

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;

intindex < this.Controls.Count; intindex++)

MessageBox.Show("Control #" + intindex.ToString() + "has the name" + thia.Controls[intindex].Name);


}

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-

76 11 . rsz A Visual C# 2008 krnyezet


l zenetablakot jelent meg (a ciklusban lev utastsnak megfelelen). Amikor a program befejezte a vezrl6k nevnek kirst, lltsuk le a programot a Debug men Stop Debugging parancsval, s mentsk a projektet. Mivel a Visual C# 2008-ban minden objektum, a programjaink rsa sorn szmos gyjte mnyt fogunk hasznlni. A gyjtemnyek igen hatkony eszkzk, s minl gyorsabban elsajt~uk a hasznlatuk mdjt, annl termkenyebb programozk lesznk.

Az Object Browser hasznlata


A Visual C# 2008-nak rsze egy hasznos eszkz, amelynek segtsgvel egyszeruen megtekinthetjk egy projekt sszes objektumnak tagjait (tulajdonsgait, tagfggvnyeit s esemnyeit). Ez az eszkz az Object Browser (Objektumtallz), amelyet a 3.10. brn lthatunk. A hinyos lerssal rendelkez objektumok hasznlathoz nagy segtsget nyjthat, mivel az ablakban az sszes tagot lthatjuk, amelyet az adott objektum tmogat. Az Object Browsert a View, Other Windows, Object Browser (Nzet, Tovbbi ablakok, Objektumtallz) menponttal jelenthetjk meg.

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

78 11. rsz A Visual C# 2008 krnyezet


elmondhatunk, miutn vgigolvastuk a knyv rinak anyagt-, mr j ton fogunk haladni, hogy valban tlssuk a hatkony Visual C# 2008 alkalmazsok ksztsnek az sszetettsgt.

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

vannak tulajdonsgai s tagfggvnyei.

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.

8. Az Objecl Browser segtsgveL

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.

82 II. rsz A Visual C# 2008 kmy828t


A 3. rn az objektumokrl s azok tagjairl, a tulajdonsgokrl s a tagfggvnyekrl tanultunk. Ezen az rn az objektumok esemnyei s az esemnyvezrelt programozs keruinek tetkre, s megtanuljuk, hogyan tehetjk az esemnyek segtsgvel az alkalmazsainkat vlaszkpess.

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.

Felhasznli mOveletek ltal kivltott esemnyek


Az esemnyeket egy programban a leggyakrabban a felhasznli mveletek vltjk ki.

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-

84 II. rsz A VISual C# 2008 kmy828t


lyozzuk: fontos, hogy ismerjk az ltalunk hasznlt esemnyek finomsgait s pontos viselkedst, mert ha anlkl vesszk ignybe ket, hogy teljes mrtkben tisztban lennnk a mkdskkel, a programunk szakatlan (ez ltalban nemkvnatost jelent) eredmnyeket adhat.

Azt, hogy miknt vlthatunk ki esemnyeket (amelyek csupn egyfajta eljrsokj


Visual C# kd segitsgvel, a 1O. rn trgyaljuk rszletesen.

Objektum ttal kivttott esemnyek


Nha elfordul, hogy egy objektum maga indtja el a sajt esemnyeit. Ennek legkznsgesebb pldja a Timer vezrl Tick esemnye. A Timer a szokvnyos fjlmegnyit prbeszdablakhoz hasonlan nem ltl1at vezrl, teht nem jelenik meg egyetlen ablakon sem a program futsa kzben, csak tervezskor lthat a nem vizulis vezrlk szmra fenntartott helyen. A Timer vezrl egyetlen clja, hogy az Interval (Idkz) tulajdonsgban megadon idkznknt elindtsa a Tick esemnyt. A Timer vezrl Interval tulajdonsgnak belltsval a Ti ck esemny elindulsnak idkzt szablyozzuk (ezredmsodperces lpsekben). A Ti ck esemny kivltsa utn a Timer vezrl visszalltja nmagt, s amint a belltott idkz ismt letelt, jra elindtja a Tick esemnyt. Ezt mindaddig ismtli, amg az idkzt meg nem vltoztatjuk, a Timer vezrlt ki nem kapcsoljuk, vagy el nem tvoltjuk azt az ablakot, amelyiken a 'l'ime r vezrlt elhelyeztk. Az idztket a leggyakrabban arra hasznljuk, hogy egy rt hozzunk ltre egy ablakon. Az idt megjelentiletjk egy szvegdmkben, s szablyos idkznknt frissthetjk, ha elhelyezzk az aktulis idt megjelent kdot a Timer esemnyben. A 8. rn majd runk is egy programot, amely a Timer vezrl6t hasznlja.

Az opercis rendszer ttal kivttott esemnyek


Az esemnyek elindtsnak harmadik mdja, hogy az esemnyt maga a Wmdows

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

Az nhfv esemnyek elkerlse


gyelnnk kell r, hogy soha ne rjunk olyan kdot, amelyben egy esemny vg nlkl meghvhatja nmagt. Az ilyen esemnyeket nhv (rekurzv) esemnyeknek hvjk. Szernlltetskppen lssunk egy olyan helyzetet, ami nhv esemnyt okozhat! Gondoljunk a TextBox vezrl korbban ismertetett TextChanged esemnyre: ez az esemny minden alkalonunal bekvetkezik, amikor a szvegmezben tallhat szveg megvltozik Ha olyan kdot helyeznk el a TextChanged esemnyben, amely megvltoztatja a szvegmez szvegt, az esemny ismt el fog indulni, ami vgl vgtelen ciklust eredmnyez. Az nhv esemnyek csak akkor szakadnak meg, amikor a Windows StackOverflow kivtelt ad vissza (lsd a 4.1. brt), ami azt jelzi, hogy a Windows mr nem rendelkezik elg erforrssal ahhoz, hogy folytassa az nhvst.

4.1. bra
Ha

StackOverjlow kivtelt kapunk,


egy6nhfv6

esemny lehet a bn6s

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.

86 IJ. rsz A VISual C# 2008 krnyezet


Az objektumok esemnyeinek elrse
Az objektumok esemnyeinek elrse egyszerG, s ha kvettk a knyv eddigi pldit, tbb objektumnak mr hasznltuk is az alaprtelmezett esemnyt Ha el szecetnnk rni egy objektum esemnyeit, kattintsunk dupln az objekturnra az ablaktervez nzetben.

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:

u incr Syat-ta.I.laq; \l.ti1DO Sycea.T~atl

p u.bUc p&n1 &1 clua VtC":\\'XTe:Duror.


f

!'OTlli

p.:rl.ne-e w.n4

P1Ctu"t_!tt:I<Ua.Dawa (o-.l ~ ~""

,..... ...!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!

sa ll. rsz A Visual C# 2008 krnyezet


Esemnyparamterek hasznlata
Ahogy korbban emltettk, az esemnydeklarcik zrjelein bell ll elemeket esemnyparamtereknek lvjuk. Az esemnyparamterek olyan vltozk, amelyeket a Visual C# hoz ltre, s amelyekhez szintn a Visual C# rendel rtket. Ezeket a vltozkat az esemnyre vonatkoz lnyeges adatok kiolvassra s idnknt belltsra hasznljuk. Az adat lehet szveg, szm, objektum - szinte brmi. Ha egy esemnyeljrsnak tbb paramtere is van, azokat minclig vesszk vlasztjk el egymstl. Amint fentebb lthattuk, a M ouseDown (Egrgomb lenyomsa) esemny kt paramterrel rendelkezik. Amikor az esemnyeljrst elindtjk, a Visual C# nmkden ltrehozza az esemnyparamtereket, s az eljrs adott vgrehajtsnak idejre rtket rendel hozzjuk. Amikor az esemnyeljrs legkzelebb lefut, a paramterek rtke mdosul. A paramterek rtkeit arra hasznljuk, hogy a kdunkban dntseket hozzunk vagy mveleteket hajtsunk vgre. Az ablakok MouseDown esemnynek a paramterei teht a
object sender
kvetkezk:,

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.

90 11 . rsz A Visual C# 2008 krnyezet

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-

leken bell ll kd mellett magukat a kapcsos zrjeleket is trlnnk kell):


private void picTest_MouseDown(object sender, MouseEventArgs e)
{

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.

puUc p.ut.lel clu Vtni!:vart11Jcna : tom

'

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.

Egy esemnyeket hasznl pldaprojekt felpftse


Most a MouseMove (Egrmozgats) esemny hasznlatt fogjuk megtanulni a Picture Viewer projektnk 3. rabeli llapotnak mdostsn keresztl. El fogjuk rni, hogy amikor a felhasznl a kp felett mozgatja az egeret, a mutat X s Y koordinti megjelenjenek az ablakon. Az egrmutat helyzett az e paramter segtsgvel fogjuk kiolvasni.

A felhasznli fellet elksztse


Kiindulpontknt hasznljuk a Picture Viewer projektet abban a formban, amelyben a 3. ra vgn hagytuk Ha nem ksztettk el a projektet, a szerz webhelyrl is letlthetjk.
Az ablakon kt szvegcmkre lesz szksgnk: egyre az X, egyre pedig az Y koorcti-

nthoz. A szvegcmkk (Label vezrl) statikus szveg megjelentsre valk, teht a felhasznJk nem rhatnak beljk szveget. Kvessk az albbi lpseket:

92 It. rsz AVisual C# 2008 krnyezet


1. Kattintsunk dupln a ViewerForm. cs elemre a Solution Explorerben, hogy megnyissuk az ablakot a teJVez6nzetben. 2. Adjunk egy Label vezrl6t az ablakhoz, dupln kattintva a Label eszkzre az eszkzkszletben, s lltsuk be a tulajdonsgait a kvetkez6k szerint:
Tulajdonsg
Name

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.

,'.;. ~.. : . ''"'"fth~~.~ x

- ---- - ---

~-

.. ----

, ''

;;

~~
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.

94 II. rsz A VISual C# 2008 krnyezat


A msodik utasts ugyanezt vgzi el, csak ppen az Y rtkkel.
Az objektumokban az a szp, hogy nem kell velk kapcsolatban minden rszletet meg-

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?

96 It rsz A Visual C# 2008 krnyezet

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?

V: Igen, ltrehozhatunk egyni esemnyeket a sajt objektumainkhoz (az egyni

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

Felhasznli fellet ptse


5. ra 6. ra 7. ra 8. ra 9. ra Ablakok ksztse - az alapok Ablakok ptse - haladknak Hagyomnyos vezrlk Fejlett vezrlk hasznlata Menk s eszkztrak az ablakokon

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

to2 f n. rsz Felhasznli teltilet pftse


ugyanennek a tervezs kzben ltott alakjra utal. Az ablakok lehetv teszik a felhasznlknak, hogy adatokat cserljenek a programmal (j pldt ad erre az l. rn elksztett Picture Viewer nev programunk ablaka). Lehet sz szveg, kpek, graftkonok tadsrl- szinte brmin~!, ami egyltaln megjelerthet a kpernyn. gy, ha elsajttjuk az ablakok tervezsnek tudomnyt, programjaink fellett szilrd alapokra pthetjk. Az ablaksablonra gy tekinthetnk, mint egy festvszonra, amelyre felfesthetjk a programunk fellett Elhelyezhetnk rajta szveget, alakzatokat, st vezrlket is, amelyekkel a felhasznlk kapcsolatba lphetnek. A Visual C# ablaksablonjainak nagyszer tulajdonsga, hogy egyfajta dinamikus vszonknt viselkednek: a megjelensket nem csak azzal befolysolhatjuk, hogy mit helyeznk el rajtuk, .de kzvetlenl az ablak tulajdonsgait is meghatrozhatjuk. Az eddigiekben mr mdostottuk ablaksablonjaink nhny alapvet jellemzjt - most azonban lthatjuk majd, hogy a lehetsgeknek csak a tredkt ismertk meg. A Wmdows-ablaksablonok tmakre olyannyira terjedelmes, hogy a trgyalst kt rra kellett bontanunk. A kvetkezkben az alapokkal ismerkednk meg- megtanuljuk, hogyan helyezzk el az ablaksablonokat a projektjeinkben, miknt mdstsuk a tulajdonsgaikat, tovbb hogyan rejtsk el, illetve jelentsk meg ket VISUal C# kd segtsgveL Mindezekr61 mr szrvnyosan olvashattunk a korbbiakban, most azonban rszletesen trgyaljuk e mveletek httert is, a kvetkez{) rban pedig az ablakok kezelsnek halad mdszereit mutatjuk be.

Az ablakok nevnek megvltoztatsa


Amikor j objektumot hozunk ltre, az els teendnk, hogy valamilyen beszdes nevet adjunk neki, gy ht kzenfekv, hogy ezzel a tmakrrel kezdjk a trgyalst. Nyissuk meg a 4. rn elksztett Picture Viewer projektet - amennyiben nem kvettk a knyv lpseit, a ksz projektfjlt letlthetjk a szerz webhelyr61. Picture Viewer programunk rendelkezik nhny hasznos kpessggel, de rugalmasnak nemigen nevezhetjk. Ezen az rn egy bellt prbeszdablak (Options) ksztsbe kezdnk. Helyezznk is el nyomban egy j ablaksablont a prbeszdablak szmra a programban az albbi lpsekkel: 1. Vlasszuk a Project, Add Windows Form (Projekt, Ablaksablon hozzadsa) menpontot, gy az Add New Item (j elem hozzadsa) prbeszdabiakba jutunk. 2. Adjuk meg a Name (Nv) szvegmez6ben az OptionsForm.cs nevet. Ez lesz az j ablakunk s egyttal az ablaksablont tartalmaz fjl neve is. 3. Kattintsunk az Add (Hozzads) gombra (vagy kattintsunk dupln a Windows Form ikonra), gy bezrjuk az Add New Item prbeszdablakot, s elhelyezzk az ablaksablont a projektben (lsd az 5.1. brt).

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.

Az ablakok megjelensnek mdosftsa


A Properties ablak valjban az ablaksablonok tulajdonsgainak ktfle csoportjt is k-

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.

104 111. rsz Felhasznli feiOiet pftse

Cvttom l ool NoiYI


filoNomt Nil Plh
~

5.2. bra
A fjltulajdonsgok hasznosak lehetnek, de nem sokat segtenek az ablak megjelensnek szablyozsban

Szveg megjelenftse az ablakok cfmsorban


Fontos, hogy az ablak cmsorban mindig valamilyen rtelmes szveget runtessnk fel. (Mindazonltal, amint azt az ra ksbbi rszben ltni fogjuk, nem minden ablak rendelkezik cmsorral.) A cmsorban megjelen szveg megegyezik az ablak Text (Szveg) tulajdonsgnak rtkveL Itt ltalban a kvetkezk valamelyikt szoktuk feltntetni:

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 5.3. bra mutatja.

Az ablakok legtbb tulajdonsghoz hasonlan a Text rtkt is brmikor megvltoztathatjuk a Visual C# kdban.

5. ra Ablakok kszftse - az

5.3. bra A cmsor szve8nek me8vlasztsni


hagyatko=unk a jzan esz ankre

Az ablakok httrsznnek megvltoztatsa


Jllehet az ablakok tbbsge szrke httrrel jelenik meg (ez a Windows 3D sznsmjnak alapbelltsa), lehetsgnk van tetszleges ms httrszn hasznlatra is, mghozz a BackColo r tulajdonsg rvn, amelynek klnlegessge, hogy a kvnt sznt egyarnt megadhatjuk a nevvel s az RGB (vrs-zld-kk) kdjval is. Alaprtelmezs szerint a BackColor tulajdonsg rtke a c ontrol (vezrl()) nev rendszerszn, ami azonban nem felttlenl szrke. A Windows teleptsekor a rendszer egy alaprtelmezett sznsmt alkalmaz, amelyben - az XP s a Vista rendszerek kivme az uns ig ismert .csatahajszrke". telvel - minden objektum s ablak alapsz Az XP s a Vista esetben ez a szn a vilgos cser, ami a legtbb manitoron szintn szrknek ltszik. Windows-felhasznlknt azonban semmi sem tiltja, hogy kedvnk szerint mdostsunk brmely rendszersznt. A szntvesztknek pldul kifejezetten szksgk van ilyesfajta mdostsokra, hogy az alaprtelmezettnl kontrasztosabb sznek hasznlatval elklnthessenek olyan rszleteket, amelyek egybknt sszemosdnnak a szmukra. Ha rendszersznt rendelnk egy ablakhoz vagy vezrlhz, az objektum megjelense igazodik a felhasznl sznsmjhoz, radsul a hats azonnali - ha megvltoztatunk egy rendszersznt, ezt rgtn szlelhetjk minden olyan objektumon , amelyet a mdosts rint.
Ahol csak lehet, prbljunk rendszerszneket hasznlni, gy az alkalmazsunk megjelense megfelel majd a felhasznl elvrsainak - nem fordulhat el, hogy bizonyos rszletek rtelmezhetetlenn vlnak a szntvesztk szmra, s ms hasonl gondoknak is elejt vehetjk.

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.

106 111. rsz Felhasznli fellet pftse


Ezt kveten lthatjuk, hogy a szmkd helyen megjelenik a Blue (Kk) felirata Visual C# ugyanis, amennyiben tall az RGB kdnak megfelel, nvvel rendelkez szint, azonnal tvlt erre.
Az ablakunk httrszne kkre vltozott, hiszen az RGB sznkdban O rtket kapott a vrs s a zld sszetev, a kk rtke pedig 255, vagyis a lehet legnagyobb szmrtk. A mindennapi munka sorn persze ritkn adjuk meg a szineket az RGB-rtkeikkel, inkbb palettkat hasznlunk erre a clra. Ahhoz, hogy ezt megtegyk, kattintsunk a Properties ablakban a BackColor tulajdonsg mellen tallhat nylra (5.4. brd).

.~

A rendszersznekrl

bvebben a

18. fejezetben olvashatunk.

....,._,..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

Httrkp hozzadsa az ablakokhoz


Az ablakok httrsznnek mdostsa mellett httrkpeket is elhelyezhetnk rajtuk erre szolgl a Backgroundimage tulajdonsg. A kpet voltakppen ,.rfestjk" az ablak htterre, gy a ksbbiekben elhelyezett vezrlk a kp eltt tnnek fel. Helyezznk el egy kpet az ablaksablonunk htterben az albbiak szerint:

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

1os l iL rsz Felhasznli feiWet pftse


Amennyiben a vlasztott kp mrete kisebb az ablaknl, a Visual C# tbb pldnyban jelenti meg, mintha csak egyforma mozaik.lapok lennnek. Jelen esetben azonban nem kell emiatt aggdnunk, ugyanis pontosan az ablak mretnek megfelel kpet hasznltunk fel. Vegyk szre, hogy a Properties ablakban a Backgroundimage tulajdonsg mellett lthat egy apr pluszjel. Ez arra hvja fel a figyelmet, hogy tovbbi kapcsold tulajdonsgokra - rsztulajdonsgokra - szmthatunk A listjukhoz gy juthatunk hozz, ha a pluszjelre kattintunk (lsd az 5.7. brt). A Backgroundimcty~ tulajdonsg esetben a kivlasztott kphez ktd tulajdonsgokat tallhatunk ill - kztk a kp mrett s formtumt rdemes megjegyeznnk, hogy ezek a rsztulajdonsgok jelen esetben a Tag (Cmke) kivtelvel -csak olvashatk, ez azonban ltalnossgban nem mondhat el rluk.

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

Pt lforrnot bo\fC1r1'1\01 IB Sct Tag


Vtlbetlllesol~

Bmp
41l0.JOO
9~.!M659Sl

~llj<>UI

Tilo
(nGM)

Cancellutton c..-Yolldton ContatMonuStnp Control8ooc Cuisor

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

Ikon hozzrendelse az ablakokhoz


Az ablakhoz rendelt ikon egyrszrl megjelenik az ablak cnsornak bal szln, de felbukkan a Tlcn is, amikor az ablakot lekicsinytjk, a Feladatkezelben, ha lenyomjuk az ALT+TAB billentyu"Ket, s szmos ms helyen. Az ikon gyakran magt az alkalmazst kpviseli, gy minden olyan ablak esetben fontos meghatroznunk, amelyet a felhasznl lekicsinythet. Persze ilyen esetben valarnilyen ikon mindenkppen tartozik az ablakhoz - ha mi nem adunk meg ilyet, a Visual C# az alaprtelmezett belltst hasznlja. Az gy kapott ikon meglehetsen ltalnos, szrke, s nem igazn jelent meg semmit: jobb ht, ha elkerljk az alkalmazst. Korbban az volt a szoks, hogy minden ablakhoz tartozott egy ikon, amely valamikppen utalt az ablak rendeltetsre. Ez a megkzelts azonban meglehetsen nehzkess vlik az olyan alkalmazsok esetben, amelyek tbb tucat vagy akr tbb szz ablakot tartalmaznak, ezrt jobb, ha egyetlen ikont vlasztunk, amely jl kpviseli az alkalmazsunkat, s ezt adjuk meg az sszes ablak Icon tulajdonsgnL
Az ikon hozzrendelse nagyjbl ugyangy trtnik, mint ahogy egy kpet adunk

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.

Kicsinyft6, nagyft s vezrt gomb hozzadsa az ablakokhoz


Ha rpillantunk az imnt elksztett Picture Viewer Options ablak cnsorra, hrom gombot tallunk rajta (lsd az 5.8. brt). Az ablak cmsorban a
kvetkez

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

ln. rsz Felhasznli fellet pftse


kell rnunk ennek a mkdsnek a megvalst.sra, hiszen a Windows mindent automatikusan elvgez. Az Options ablak esetben a tartalom nem mcetezhet t, gy Maximize gombra nincs szksg. Radsul azt szeretnnk, hogy a felhasznl hasznlat utn zrja be az ablakot, gy a Minirnize gomb jelenlte is felesleges. A kt gomb eltvoltshoz az ablak albbi tulajdonsgait kell belltanunk:
Tulajdonsg MinimizeBox Maxi mi zeBox rtk False False

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.

Az ablakkeret megjelensnek s viselkedsnek m6dosftsa


A klnfle Windows-programok hasznlata sorn megfigyelhettk, hogy az ablakok kerete nem viselkedik egyformn. Egyeseket megragadhatunk, s tmretezhetjk az ablakot, msok rgztett kerenel rendelkeznek, megint msoknak pedig egyltaln nincs is keretk. Ezt a viselkedst az ablak FormBorderSty le tulajdonsga szablyoz-

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

112 111. rsz Felhasznli feiOiet pftse


A keret nlkli ablakoknak nincs cmsoruk

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,

hogy a cfmsoruk tartalma a legszkebbre szabott

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.

Az ablak legkisebb s legnagyobb mretnek meghatrozsa


Ha egy ablak mretezhet, ltalban teljes kpernyss tehetjk, vagy gombb kicsinythetjk a Tlcn. Elfordulhat azonban, hogy meg kell hatroznunk az ablak legkisebb s legnagyobb mrett- ezt a MinimumSize, illetve a MaximumSize tulajdonsgokkal tehetjk meg. Ez ltalban kerlend, de olykor hasznos lehetsgnek bizonyulhat. Fontos tudnunk, hogy a M inimumSize bellts megadsamellett az ablak tovbbra is a Tlcra zsugothat, amennyiben szerepel rajta a Minimize gomb.

Az ablakok megjelenftse s elrejtse


A programozs titkaival knyvnk Ill. rsze foglalkozik, gy ezen az rn nem kvnunk mlyebb programozstechnikai trgyalsba bocstkozni, mindssze a fogalmak ismenetsre szortkozunk. Mindazonltal, azzal, hogy megismertk az ablakok ltrehozsnak mdjt, mg semmit nem tudtunk meg a megjelentskrl s elrejtskrL A Visual C#

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()} ;

A fenti meghatrozs rszei a

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.

114 111. rsz Felhasmli fellet pftse


2. Kattintsunk dupln az eszkzkszlet Button (Gomb) elemre, gy egy j gombot helyeznk el a viewerForm ablakon. A gomb tulajdonsgait az albbiak szerint hatrozzuk meg:
Tulajdonsg Name Location Size Text rtk btnOptions
295, 15 5 85, 23

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-

5. 6ra Ablakok kszftse- az alapok 115


kot egy msik mddal rendelkez ablak jelentette meg, a bezrsakor a szlje veszi az irnytst, s gy tovbb. A mddal rendelkez ablakok gyakran tnnek fel prbeszdablakok alakjban, amelyeken a feU1asznlnak meghatrozott adatokat s vezrlket kell belltania, mieltt tovbblphetne. J plda minderre a Microsoft Word Print (Nyomtats) prbeszdablaka - ha megjelenik a kpernyn, a bezrsig nem dolgozhatunk a Word dokumentumablakban. A prograrnek msodiagos ablakai legtbbszr modlisak.
Mddal rendelkez ablakokbl megjelenthetnk jabb madlis ablakokat, md nlkli ablakok megjelentsre azonban nincs lehetsgnk.

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.

Az ablakok modalitsrl a kdbanaModal tulajdonsg lekrdezsvel tjkozdhatunk.

Az ablakok kezd6helynek meghatrozsa


Az ablakok a megjelentskkor korntsem vletlenszeru helyre kerlnek a kpernyn

116 f ll. rsz Felhasmli fellet pftse


- az elhelyezsr61 a StartPos i tion tulajdonsg gondoskodik, amelynek lehetsges rtkeit az 5.1. tblzatban soroltuk fel.

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

Az ablakok megjelenftse nonnl, teljes kpemy6s s kis mretben


Az ablakok Size (Mret) s Location (Hely) tulajdonsgai a StartPosition-nel

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

118 111. rsz FelhaszMii feiOiet pftse


A teljes kpernys ablakok kitltik a kperny teljes terlett, fggetlenl az alkalmazott felbontstL

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.

Az ablakok megjelensnek megakadlyozsa a Tlcn


Nagyszer

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.

Ablakok trtse a mamribl


Miutn egy ablakunk betlttte a rendeltetst, nyilvn meg szecetnnk szabadulni tle. A "megszabaduls" kt dolgot jelenthet. Egyrszt kvnhatjuk azt, hogy eltnjn anlkl, hogy bezrnnk, vagy felszabadtannk az erforrsait (ezt nevezzk elrejtsnek): ehhez nem kell mst tennnk, mint az ablak Visible tulajdonsgnak a false rtket adni, vagy meghvni a Hide tagfggvnyt. gy az ablak lthat rsze eltnik, maga az objektum azonban a memriban marad, s a kdbl tovbbra is hozzf rhe-

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.

120 ll. rsz Felhasznli fellet


Amennyiben csak el szeretnnk rejteni egy ablakot, a Hide< l tagfggvnyt kell meghvnunk, vagy a visihle tulajdonsgt false rtkre lltanunk. Az ablak gy megrzi az eredeti llapott, amg jra meg nem jelentjk (a Visihle tulajdonsg t ru e rtkvel vagy egy megjelent tagfggvny meghvsval).

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

Ablakok ptse - haladknak


A lecke tartalmbl:

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

124 ll. rsz Felhasznli fefOlet


alkalmazsban tallhatunk, gy a Photoshopban is, hogy csak egyet emltsnk. Az ra anyagnak elsajttsa utn kszen llunk majd ahhoz, hogy elmlyedjnk a Visual C# vezrlinek rszleteiben.

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.

Vezrt6k elhelyezse az ablakokon


Minden vezrl, amelyet elhelyezhetnk egy ablakon, megtallhat az cszkzkszletben, amely alapllapotban a tervezkrnyezet bal oldalhoz rgztett ablakknt jelenik meg. Ez az elhelyezkeds jl hasznlhat, ha csak olykor-olykor szrunk be egy-egy vezrlt az ablakokra, ha azonban komoly tervezmunka eltt llunk, rdemesebb ttennnk a jobb oldalra, gy ugyanis az eszkzkszlet kisebb mctkben (vagy egyltaln nem) takarja el az ablakot.
Fontos, hogy az thelyezs sorn, mieltt levlasztannk az eszkzkszletet, gyzdjnk meg rla, hogy biztosan nem Auto Hide (Automatikus elrejts) mdban van.
Az eszkzkszletben vezrlcsoportokat tallunk, amelyeket a fejlckre kattintva

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

beszrsa dupla kattintssal

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.

Vezrlk beszrsa thzssal


Amennyiben pontosabban szeretnnk szablyozni az j vezrl helyt, az ablakra is hzhatjuk az eszkzkszletb61. Prbljuk ki a kvetkez6t: jelentsk meg az eszkzkszletet, kattintsunk a Button vezrlre, majd hzzuk az ablakra. Ha az egrmutatval nagyjbl elrtk a kvnt helyet, engedjk fel az egrgombot

Vezrlk beszrsa rajzolssal


A vezrlk elhelyezsnek legpontosabb m6dszere, ha az ablak felletre rajzoljuk azokat. Ehhez vgezZk el az albbi lpseket: 1. Jelentsk meg az eszkzkszletet, s kattintsunk egyszer a ListBox vezrl ikonjra. 2. Vigyk oda az egrmuratt, ahol a listamez bal fels sarkt szeretnnk luti. Nyomjuk le az egrgombol, s tartsuk gy. 3. Hzzuk az egrmutatt a vezrl leend jobb als sarkhoz, s engedjk fel az egrgombot Ekkor a listamez az ltalunk rajzolt tglalap mreteivel jn ltre- ez a vezrlk elhelyezsnek Jegpontosabb m6dja. Amennyiben az itt bemutatott mdszert rszestjk elnyben, rdemes lebegv tenni az eszkzkszletet, illetve a tervezablak jobb oldalhoz vagy aljhoz rgzteni. A bal oldalra rgztett, automatikus elrejts eszkzkszlet ugyanis zavarhatja a szerkesztst, hiszen az ablak j rszt eltakarja.

126 111. rsz Felhasznli feHllet pftse


Fontos megjegyeznnk, hogy az eszkzcsoportok els eleme minden esetben a Pointer (Mutat), amely egyltaln nem vezrl. Ha rkattintunk, a tervezkrnyezet kijell mdba kerl, gy nem helyezhetnk el jabb vezrlt a tervezablakban-ugyanakkor az ablakunkon tallhat vezrlkre kattintva tjkozdhatunk a tulajdonsgaikrL A tervezkrnyezetben ez a viselkeds az alaprtelmezett.

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.

,_s.o...,. ~-] ...,...._ um_..., ,_.,..c....,


~ttal

ei;,;i;~,_".
Op<lml;od Cod< GM.<otion

~-

AutoiCIYII

Do< FIM tnd ._,~.

B IBGtlciSia

...

......
s..pl;".,.

-~
_..,""-:"'

True

HtJ,

~T-

rr.rr ....
'

..,_..
-

.,

. ...)omon4~

t O......foeh

l ., . -.
su....
~

M4 """"s.ur.,. ............ s.ns..

B OOjoct . _ s.-t fit Sot1llop

113 --.,
BT-

-."'"'

..

-Ooolpo<o

-l-- ..,__. . ____ r=


~~

Aut......ac.oyo,_s-..r 091

_ . . ,_

_,T.,.

6.1. bra
A rcsbelltsok

~~

ltalnos rvnyek a VJSUal Ot 2008-ban

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.

128 ll. rsz Felhasznli fellet


Mozgassuk a vezrlinket az ablakon, illetve mretezzk t ket a szleiket hzva (az OK gombhoz ne nyljunk). Lthatjuk, hogy a finomabb rcs pontosabb elhelyezst lesz lehetv. Ksrktezznk a GridSize nagyobb (pldul 25,25-s) rtkvel, s figyeljk meg, mi trtnik. Ha meguntuk a jtszadozst, adjuk a GridSize tulajdonsgnak a 4,4 rtket. Amennyiben az ablakon listamez is szerepel, megfigyelhetjk, hogy mretezskor nem tkletesen igazodik a rcshoz. Ennek az az oka, hogy csak olyan mreteket vehet fel , amelyek teljes sorok megjelentsre alkalmasak, gy a szlei megkzeltik a rcsot, de tbbnyire nem rik el.

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

1. Vlasszuk a Tools, Options menpontot az Options prbeszdablak

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

szleinek egymshoz igaztst

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

ln .rsz Fellasznli fellet pftse


Vezrl6k csoportjnak kijellse
Ahogy a tudsunk gyarapszik, gy vlnak az ablakaink egyre bonyolultabb. Esetenknt tbb tuc-at vagy akr tbb szz vezrl is sszezsfoldhat rajtuk. Kezelskben s elrendezskben segtenek a Visual C# albb bemutatott eszkzei, amelyekkel csoportokba rendezhetjk a vezrlkeL Alaprtelmezs szerint ha egy ablakra kattintunk, ezzel prhuzamosan minden vezrl kijellst megszntetjk. Ahhoz azonban, hogy tbb vezrln vgezhessnk egyszene mveleteket, vezrlk egsz csoportjt kellene kijellnnk. Ezt ktflekppen is megtehetjk -az els m6dszer a lasszzs. Ehhez kattintsunk valahol az ablakra, majd az egrgomb nyomva tartsa mellett hzzuk az egeret - lthatjuk, hogy egy tglalap jelenik meg a tervezablakban. Ha ezutn felengedjk az egrgombot, a rendszer minden olyan vezrlt kijell, amely beleesik a tglalapba. Fontos, hogy a kijellshez elg, ha a vezrlt csak rszben fedi a tglalap (amit kije/6/keretnek neveznek). Prbljuk ki a kvetkezt: kattintsunk egy tetszleges helyre az ablak bal als sarkban, majd hzzuk az egrmutatt a jobb fels sarok fel. Kertsnk be, illetve metssznk el minden vezrlt az OK gomb kivtelvel (6.5. bra). Ha ezutn felengedjk az egrgombot, lthatjuk, hogy az OK gombon kvt'U minden vezrlt kijelltnk az ablakon (a 6.6. bra).

6.5. bra
Kattintsunk az egrrel az ablakra,

s hzzunk kijellkeretet a kvnt


elenzek k6r

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.

132 ll. rsz Felhasmli felJet

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

6. ra Ablakok pftse- haladknak 133

Azonos mrettl vezr16k


A vezrlk egymshoz igaztsa mellett a mreteiket - a szlessgket, a magass gu kat, vagy mindkett6t- is azonoss tehetjk, mghozz a Make the Same Size (Azonos mretre llts) gombbal. Tegyk is meg ezt most, s lthatjuk, hogy minden vezrl6nk felveszi a listamez6 mrett (ami meglehd6sen nagy). Prbljuk ki a kvetkezt: adjuk a Properties (Tulajdonsgok) ablakban a Si ze tulajdonsgnak a 7 5. 7 5 rtket, s rgztsk a belltst a TAB billenty lenyomsval. A mvelet az sszes kijellt vezrlre hatssal van, ami leheteSv teszi, hogy egyszerre tbb vezrlnek adjunk azonos belltsokat.

A vezr16csoportok vezr16inek egyenletes elosztsa


Ahogy a reklmokban mondani szektk: "... s ez mg nem minden!" A l.ayout eszkztr leheteSv teszi azt is, hogy kiegyenltsk a vezrlk kztti trkzket Prbljuk csak ki: kattintsunk a Make Horizental Spacing Equal (Egyenl vzszintes trkzk) gombra, s lthatjuk, hogy a vezrlk vzszintes trkzei egyenlv vlnak. Ez utn a Decrease Horizental Spacing (Vzszintes trkzk cskkentse) gombbal folyamatosan cskkenthetjk a trkzket - a vezrlk minden kattintssal egy kicsit kzelebb kerlnek egymshoz. Lehetsgnk van ugyanakkor a vzszinles s fggleges trkzk nvelsre, st akr a trkzk eltvoltsra is. Most mentsk a projektet az eszkzkszlet Save Ali (Mindent ment) gombjra kattintva.

A vezr16csoportok tulajdonsgrtkeinek bel1ftsa


A kvetkezkben bemutatunk egy igen hasznos mdszert, amelyrl mg a tapasztalt Visual C#-fejleszt6k is gyakran megfeledkeznek. A Properties ablakban akkor is mdosthatjuk a tulajdonsgokat, ha tbb vezrleSt jelltnk ki - ilyenkor a szban forg tulajdonsg minden kijellt vezrlben megvltozik Gyzdjnk meg rla, hogy tovbbra ismindhrom vezrl ki van jellve, s nyissuk meg a Properties ablakot (mr amennyiben nincs jelen a kpernyn). Amikor vezrlk csoportjt jelljk ki, a Properties ablak kiss mshogy fest, mint ltalban (6.9. bra): A Name tulajdonsg nem jelenik meg. Ennek az a magyarzata, hogy kt vezrl neve nem egyezhet meg, gy a Visual C# lehetsget sem ad arra, hogy elkvessk ezt a hibt. Csak azokat a tulajdonsgokat lthatjuk, amelyek minden kijellt vezrlben jelen vannak. Mivel jelen esetben meglehetsen klnbz vezrlket jelltnk ki, kevs kzs tulajdonsguk ltezik. rtelemszeren, ha azonos tpus vezrlket jelltnk volna ki, a tulajdonsgok kre jval bvebb lenne. Azoknak a tulajdonsgoknak az esetben, amelyeknek az rtke az egyes vezrlknl eltr (pldul a Location), az rtk mezje resen marad a Properties ablakban.

134 ll. rsz Felhasznli feiOiet

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

a projektnkben, gy ht szabaduljunk meg tlk a

DELETE

billenty lenyomsval.

Vezr16k lehorgonyzsa s automatikus mretezse


A Visual C# ablakkezel rendszernek szmomra egyik Jegkedvesebb jdonsga, hogy a vezrlket immr lehorgonyozhatjuk az ablak egy vagy tbb oldaln, s a mretk is kvetheti az ablak mretvltozsait. Korbban ugyanezt a viselkedst egy (tbbnyire bonyolult) kls sszetev segtsgvel valsthattuk meg, vagy az ablak Re size esemnynek kdjt kellett trnunk - most azonban a Visual C# 2008 mindent elvgez helyettnk. Az j vezrlk alaprtelmezs szerint a troljuk bal s fels oldalhoz rgzlnek - mi a helyzet azonban akkor, ha mindig a jobb fels vagy a bal als sarokban szecetnnk ltni ket? Nos, hamarosan megtanuljuk, hogy mit tehetnk, ha azt szeretnnk, hogy a vezrlk kvessk az ablak mretvltozsait. A kvetkezket kell tennnk: 1. Kattintsunk dupln a ViewerForm. cs fjtra a Solution Explorerben. Ezt az ablakot mdostjuk a tovbbiakban. 2. Futtassuk a projektet az F5 lenyomsval. 3. Nagytsuk fel kiss az ablakot a bal als sarknak elhzsval - lthatjuk, hogy a vezrlk nem kvetik az ablak szlt (lsd a 6.10. brt).

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.

136 111. rsz Felhasznli fellet pftse


Hajtsuk vgre az albbi
mveleteket,

hogy lssuk az Anchor tulajdonsg mkdsl:

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

Az Itt lthat belltssal a vezrft az ablak fels s jobb szlhez rogztettk

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

mind a ngy oldalt az ablak oldalaihoz rogzftJk

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

gyes hasznlatval rogalmas ablakokat kszthatnk

138 111. rsz Felhasznli fellet pftse


Az Anchor tulajdonsg ismeretben knnyedn kszthetnk olyan ablakokat, amelyeket a felhasznJk mindenfle kd nlkl tmretezhetnek. Egy aprsgra azonban vigyzzunk: ha az ablakot tlsgosan Jekicsinytjk, elfordulhat, hogy a vezrl az Anchor tulajdonsgnak rtktl fggen eltnile

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

ln. rsz Felhasznl6i fetOlet pftse


Ha egy vezrlt ki szeretnnk hagyni a tabultorsorrendbl, adjuk a TabStop tulajdonsgnak a False rtket. A felhasznJk ilyenkor az egrrel tovbbra is kivlaszthatjk a vezrlt, dc a TAB billenty lenyomsval nem juthatnak el hozz. Mindazonltal a Tabindex tulajdonsgnak gy is rdemes logikus rtket adnunk, hogy ha a vezrl fkuszba kerl (rkattintanak), a TAB billenty lenyomsa rtelmes helyre vigyen.

Vezrt6k rtegzse (z-sorrend)


A tabultorsorrend s a kpi igazts alapvet fontossg a jl hasznlhat felletek kialaktsban. Mindeddig azonban csak kt dimenziban mozogtunk - az x s az y tengely mentn. Ritkn fordul el, hogy ki kelllpnnk a skbl, de a vezrlk olykor tfedik egymst, ilyenkor pedig dntennk kell, hogy melyik legyen fell. Alaprtelmezs szerint a legutbb beszrt vezrl kerl legfellre, de a Layout eszkztr jobb oldaln tallhat Bring to Front (Elrehozs) s Send to Back (Htraklds) gombokkal vltoziathatunk ezen a helyzeten.

A vezrlket a kdban is elrehozhatjuk, illetve htrakldhetjk az adott vezrl BringToFront (l s SendToBack () tagfggvnyeiveL

Legfels6 md nlkli ablakok ltrehozsa


Amjnt azt bizonyra mr tapasztaltuk, ha egy ablakra kattintunk, az jobbra fellre kerl, a tbbi ablak pedig mgtte hzdik meg (kivve, ha modlis ablakrl van sz). Addhatnak azonban helyzetek, amikor azt szeretnnk, hogy az adon ablak mindig a tbbi felett legyen - fggetlenl attl, hogy ppen fkuszban van-e. J plda erre a Visual C#, a Word s ms hasonl prograrnek Keress ablaka: brmelyik ablak kap fkuszt, a Keress ablak mindig a tbbi felett lebeg. Amennyiben ilyen hatst szeretnnk elrni, lltsuk az ablak TopMost tulajdonsgt True rtkre- sokszor egy egyszer tulajdonsg mdostsa vagy egyetlen tagfggvny meghvsa elg ahhoz, hogy elvgezznk egy egybknt bonyolultnak tn feladatot.

ttetsz6 ablakok ltrehozsa


Az ablakok Opac i ty (tltszatlansg) tulajdonsga igen hasznos jdonsg, amelynek

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.

142 JI. rsz F elhasmli fellet


Futtassuk a projektet az F5 lenyomsval, s cskkentsk az ablak mrett gy, hogy a jobb als sarkt a bal fels fel hzzuk. A vezrl6k mindent megtesznek azrt, hogy lthatak maradjanak, de ahogy az ablak egyre kisebb lesz, nhny okvetlenl eltnik. Ezeket csak akkor rhetjk el, ha jra felnagytjuk az ablakot- vagy ha grgethetv tesszk. Ehhez hajtsuk vgre a kvetkez lpseket: 1. 2. 3. 4. Ha a projekt mg fut, lltsuk le. Adjuk a ViewerForm . cs ablak AutoScr oll tulajdonsgnak a True rtket. Futtassuk a projektet az F5 billentyl!lenyomsval. Hzzuk a jobb als sarkot a bal fels fel az ablak mretnek cskkentshez. Lthatjuk, hogy a mvelet kzben grdtsvok jelennek meg az ablak szln (lsd a 6.18. brt), amelyekkel az ablak rejtett tartalmt is napvilgra hozhatjuk

6.18. bra
Grdtsvok

nlkl egyes tiZrlk rejtve maradhatnak a szemnk ell

lltsuk le a projekt futst, s mentsk a munknkat.

Tbbdokumentumos ablakok ltrehozsa


Projektjeink az eddigiekben egydokumentumos felletekre (SDI, Single Document lnterface) pltek - itt az ablakok egyenrangak, semmifle hierarchia nem ll fenn kzttk A Visual C# ugyanakkor lehetv teszi tbbdokumenrumos felletek (MDI, Multiple Document Interface) ksztst is, amelyekben mr jelen van a hierarchia: egyetlen szl6ablak (vagy trol) ltezik, s ebben kapnak helyet a gyermekablakok Nagyszeru pldt ad minderre a Photoshop - a program indtsakor a szlablak jelenik meg, ezen bell pedig akrhny dokumentumot megnyithatunk, amelyek gyermekablakknt jelennek meg. Az MDI programokban a gyermekablakok ugyanazon az eszkztron s mensoron osztoznak, amelyek viszont a szl6ablakhoz tartoznak. A gyermekablakok viselkedst egyetlen dolog korltozza: a sz016ablak hatrain bell kell maradniuk A 6.19. brn a Photoshop fellett lthatjuk tbb gyermekablakkaL Az MDI alkalmazsok a gyermekablakok mellett rendelkezhetnek egyb hagyomnyos ablakokkal is (ilyenek pldul a prbeszdablak.ok).

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{);

= new ChildlForm{); = thist

144 111. rsz Felhasznli fellet pftse


Az els s az utols utasts jelentsvel mr bizonyra tisztban vagyunk: az els sor egy ChildlForm tpus objektumot hoz ltre, az utols pedig md nlkliknt megjeleniti azt. Minket azonban most leginkbb a msodik utasts rdekel, amely az aktulis ablakot rendeli az ablak MdiParent tulajdonsghoz (a this kulcssz mindig az aktulis objektumra utal)- ez pedig egy MDI szlablak, hiszen az IsMdiContainer tulajdonsgnak az rtke True. Az j ablak ennek gyermekeknt jelenik meg a kpernyn.

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

3. Kattintsunk dupln a gombra a Click esemnynek az elrshez, s rjuk be a kvetkez kdot:


Child2Form objChild =new Child2Form(); objChild.MdiParent this.MdiParent; objChild. Show();

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.

146 ll. rsz FelhaszMii fellet


J, ha az emlkezetnkbe vssk, hogy egy adott ablakbl annyi pldnyt hozhatunk ltre, amennyit csak akarunk. Ezeknek a pldnyoknak az egyidej kezelse azonban bonyolultt vlhat, a knyvnkben azonban nincs mdunk kitrni e tmakr rszleteire. Ha az MDI ablakok vilga tovbbra is ijesztnek tanik, ne aggdjunk - kezd Visual C#-programozknt jobbra egydokumentumcs programokat ksztnk majd. Ahogy azonban egyre magabiztosabban mozgunk a Visual C# projektek krben, elkezdhetnk lassacskn ksrletezni az MDI programokkal is. Mindazonltal, sose feledjk, hogy csak azrt nem rdemes MDI programot ksztennk, men kpesek vagyunk r akkor dntsnk e megolds mellett, ha a cljaink megkvetelik.

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

Az elz kt rn meglehetsen rszletes betekintst nyerhettnk az ablakok hasznlat-

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

150 ll. rsz Felhasznli fellet

Statikus szveg megjelenftse a Label vezr16vel


A Label (cmke) vezrlk segtsgvel statikus szvegeket jelenthetnk meg a felhasznJk szmra. A statikus sz itt azt jelenti, hogy a szveget a felhasznJk nem mdosthatjk (persze a kdban magunk nyugodtan megvltoztathatjuk). A Label az egyik leggyakrabban hasznlt vezrltpus - szerencsre egyttal az egyik legknnyebben kezelhet6 is. A cmkket leggyakrabban arra hasznljk, hogy ms vezrl6k, pldul szvegmez6k szerept rjk le a felleten. Nagyszeren alkalmazhatk emellett llapotadatok megjelentsre is, valamint arra, hogy ltalnos tmutatst adjunk egy ablak hasznlathoz. A kvetkezkben javarszt a 6. rn elksztett Picture Viewer projekt ablakra ptnk. Szmos vezrlt helyeznk el rajta, amelyeknek a valdi hasznlatra azonban a III. rszig vrnunk kell. Elszr hajtsuk vgre az albbi lpseket: 1. Nyissuk meg a Picture Viewer projektet, amellyellegutbb a 6. rn foglalkoztunk. 2. Kattintsunk dupln az Options Form. cs fjlnvre a Solution Explorer ablakban az Options ablak megjelentshez. 3. Helyezznk el egy Label vezrlt az ablakon, dupln kattintva az eszkztr Label elemre. A vezrllegfontosabb tulajdonsga a Text (szveg), amely a felhasznJk szmra megjelentett szveget hatrozza meg. Amikor a Label vezrlt elhelyezzk az ablakon, a Text tulajdonsg a vezrl nevt veszi fel. Ez nem igazn hasznos a szmunkra, ezrt rdemes inkbb az albbi belltsokat hasznlnunk:
Tulajdonsg Name Location Text

rtk lbl UserNam e


4 0 , 41

User Name:

~ ......"\:.}-~- -~--~~".,~

<

...~_;_.

,_ .. ,- .... . .

lblJserfbme Systtm.Win<fOM.forms.l C o

l..;;:r.;n;r:=Jl' ' i..j ;.,


Iif Padding
User Nomel

.:

"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.

Szvegbevitel szvegmez6k hasznlatval


A Label vezrl nagyszer' mdot ad egy olyan szveg megjelentsre, amelyet a felhasznJk nem mdosthatnak, de ha lehetv szecetnnk tenni a felhasznlknak , hogy szveget vigyenek be, vagy szerkeszthessk azt, a szvegmezk (Tex t Box) jelentik a megoldst. Ezeket a vezrlket mindenki ismeri, aki valaha is rt be adatokat egy elektronikus rlapon. Helyezznk is el egyet az ablakunkon, dupln kattintva az eszkztr TextBox elemre. A vezrl tulajdonsgait az albbiak szerint lltsuk be:
Tulajdonsg
Name Location Size

rtk
txtUserName 1 05 , 38 1 39 , 20

Ha rnindent jl vgeztnk, az ablakunk a 7.2. brnak megfelelen alakul.

7.2. bra
A cmkk s a sz6vegmezk nagyszeren hasznlhatk egytt

152 ll. rsz Felhasznli fellet


Jllehet az esetek 990/crban resen hagyjuk a szvegmez Text tulajdonsgt, mgis addhat gy, hogy egy kezdeti felirat megknnyti a vezrl szerepnek megrtst a felhasznl szmra. Most helyezzk el itt a This is a sample text feliratot, majd az ENTER, illetve a TAB billentyvel vglegestsk a belltst.

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

meg, ahogy a szveg jobbra igazo<Hk.


2. Most adjuk a tulajdonsgnak a Center rtket- az eredmny nem szolgl

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).

154 ll. rsz Felhasmli fellet


lltsuk Je a projekt futst a Debug, Stop Debugging (Hibakeress, Hibakeress lelltsa) menponttal, s lltsuk vissza az Enabled rtkt True-ra.

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.

A befrhat karakterek szmnak kor1tozsa


A MaxLength tulajdonsggal meghatrozhatjuk, hogy a felhasznl legfeljebb hny karaktert rhat be a szvegmezbe. A tulajdonsg alaprtelmezett rtke 32767, de ezt

tetszs szerinl megvltoztathatjuk. ppen ezt tesszk az albbiakban:


1. Mdostsuk a szvegmez tulajdonsgait az albbiak szerint:

Tulajdonsg Text M axLength Mu l t il ine ScrollBars

rtk Ures (Trljk az itt ll rtket.)


10

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).

156 ll. rsz Felhasznli feiQiet

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.

A szvegmez6k fontosabb esemnyei


A cmkk esetben ritkn van szksgnk esemnyek hasznlatra, a szvegmezkkel azonban egsz ms a helyzet. A 7.1. tblzatban azokat az esemnyeket mutatjuk be, amelyekkel gyakrabban tallkozhatunk a munknk sorn.

7.1. tbllat A SZvegme:tk gyakrabban haSznlt esemnyei


Esemny Lers TextChanged Minden alkalommal bekvetkezik, ha a felhasznl karaktert r be, vagy szvegrszletet illeszt a szvegmezbe. Akkor rdemes hasznlnunk, ha bizonyos billentyletseket szeretnnk kezelni, illetve ha reaglni kvnunk a tartalom vltozsra. Click Akkor kvetkezik be, amikor a felha.')znl a szvegmezre kattint. Olyankor rdemes hasznlnunk, ha reaglni szeretnnk az egrkattintsra, de annak pontos helye nem rdekel minket. ouseoown Akkor kvetkezik be, amikor a felhasznl lenyomja az egrgombot M a szvegmez felett. Rendszerint a MouseUp esemnnyel egytt hasznlatos. ouseUp Akkor kvetkezik be, amikor a felhasznl felengedi az egrgombot M ouseDown s a MouseUp hasznlatra akkor van a szvegmez felett. A M sZksg, ha a eli ck esemny nyjtotta lehetsgeknl tbbre vgyunk. MouseMove Akkor kvetkezik be, ha a felhasznl elmozd~a az egrmutatt a szvegmez felett. Segtsgvel az egrmutat mozgsra reaglhatunk.

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();

158 111. rsz FelhasznMi fellet pftse


Ha visszaemlksZnk az 5. rn tanultakra, tudhatjuk, hogy ez az utasts bezrja az aktulis ablakot. Jelen pillanatban a Cancel gomb pontosan azt teszi, rnint az OK, ez a helyzet azonban hamarosan megvltozik
Programozottan is kivlthatjuk a Click esemnyt, ppgy, mintha a felhasznl kattintott volna, csak hvjuk meg a gomb Performeli ck tagfggvnyt.

Accept s Cancel gombok


Amikor prbeszdablakokat hozunk ltre, gyakran kijellnk egy alaprtelmezett gombot (ezt nevezzk Accept, vagyis jvhagy gombnak). Amennyiben az ablakunk rendelkezik ilyennel, az ENTER lenyomst"'.a bekvetkezik a gomb Click esemnye, fggetlenl attl, hogy melyik vezrl van ppen fkuszban. Mindez nagyszeren m1.1kdik az olyan ablakoknl, ahol a felhasznlnak valarnilyen szveget kell bernia, amelyet az ENTER lenyomsval jvhagy, s egyttal be is zrja az ablakot. Az OK gombunkat a kvetkez lpsekkel jellhetjk ki Accept gombknt: 1. Kattintsunk dupln a Solution Explorerben az Options form. cs fjlnvre, gy megjelentjk az ablakot a terveznzetben. 2. Kattintsunk az ablakra, hogy megjelentsk a tulajdonsgait a Properties ablakban. 3. Kattintsunk a Properties ablakban az AcceptButton tulajdonsgra, s egy nyilacskt kapunk, amelyre kattintva egy listhoz jutunk. A listbl vlasszuk a btnOK lehetsget. Az ablakunkon a gomb krl kk keret tl.1nik fel, ami azt jelzi, hogy alaprtelmezett gombrl van sz (lsd a 7.8. br[). 4. Futtassuk a projektet az F5 billenry(]lenyomsval, majd kattintsunk az Options gombra az Options ablak megjelentshez.

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.

2. Adjuk az ablak caneelEutton tulajdonsgnak a btnCancel rtket.


Az Accept s a Cancel gombok kijellsnl rdemes megfontolnunk a
kvetkezket:

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:

Tulajdonsg Name Location Text

rtk
chkPrornptOnExit
105, 79

Prompt to confirm on exit

160 ll. rsz FellaszMI6i fellet


A jel616ngyzet CheckState tulajdonsga hatrozza meg, hogy a vezrl ki- vagy bekapcsoh llapotb:.m legyen. Mdostsuk a tulajdonsg rtkt, s figyeljk l vltozst <iZ ablakon. \'egyk szre. hogy vlasllhatjuk az Indetenni nil t~ (nem meghatrozott) lehet6sget is - Ilyenkor egy ngyzet jelenik meg a vez~rl helsejben Rillcin ksz sn1ks&J\lnk erre, dc j rudru, hogy a rendelkezsnkre ll. ~iel6tt tovbblpnnk. adjuk a CheckState tulajdonsgnak az UncheckP l (kikapcsolt) rtket. Az abl.1kunk most <1 7.9. brn lathat kpet mutatja.

7.9. 6bra
A jc/6/ri~'ZCiteiiRaz-hamls, illett'<' igen-ttem t'Ctlasztsr lehcts[l.ct }eletlllhcttltlk 111(!8

Trol6k s vlasztgomb-csoportok ltrehozsa


s7.iTra:

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:

Tulajdonsg Name Location Size Tex t

rtk
grpDefaul tBackco l o r
105, 112 200 , 72

Default Picture Background Color

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

162 ll. rsz Felhasznli feiOlet


trolban, ezzel automatikusan kikapcsoljuk a mellettc tallhal tbbi vlasztgomb mindegyikt. Mindez akkor vlhat hasznunkra, ha azt szeretnnk, hogy a felhasznl tbb lehetsg kzl vlasszon. A klcsns kizrs szemlltetshez hozzunk ltre egy apr csokornyi vlasztgombot az Options ablakon.
A csoportmez6kben az albbi m11veletekkel helyezhetnk el vezrl6ket:

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

bell. gyeljnk arra, hogy ne hagyjuk el a trol hatrait, ez esetben ugyanis

a vezrl az egrgomb felengedsekor egy msik trolha vagy ablakra kerl.


lltsuk be a vlasztgomb tulajdonsgait az albbiak szerint:
Tulajdonsg Name Location Text

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:

Tulajdonsg Name Checked Location Text

rtk optBackgroundWhite True


14, 42

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-

kezik- futtassuk ht a projektet az F5 billentyveL


Kattintsunk az Options gombra az Options ablak megjelentshez, s pillantsunk a vlasztgombokra. Jelenleg a msodik van kijellve, ezrt kanintsunk az elsre (Default Gray). A mt1velet hatsra a program megsrunteti a msodik vlasztgomb kijellst (teht a Checked tulajdonsgnak a Fal se rtket adja). Kt vlasztgombbaltkletesen bemutathat a klcsns kizrs jelensge, de n e feledkezznk meg arrl, hogy annyi vlasztgombot helyezhetnk el egy csoportmezn bell, amennyit csak szerelnnk-a viselkeds azonos marad. A lnyeg az, hogy a klcsns kizrs egyazon troln bell rvnyesl. Ha teht olyan vlasztgombokat szecetnnk ltrehozni, amelyek az eddigiekt61 fggetlenl mOkdnek, ltre kell hoznunk egy msik csoportot egy j trolban. Mindez nem jelenthet gondot, lszen knnyedn ltrehozhatunk egy j csoportmezt (vagy panelt), s ebben elhelyezhetjk a tovbbi vlasztgombokat A kt csoport egymstl fggetlenl mkdik, a klcsns kizrs azonban tovbbra is fennll az egyes trolkan bell. lltsuk le a projekt futst, s adjuk az optBackgroundDefault vlasztgomb Checked tulajdonsgnak a True rtket, vgl pedig mentsk a munknkat.

164 ( 11. rsz Felhasznli fellet pftse

Listk megjelenftse Iistamezk segftsgvel


Jellemzjk,

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 Text tulajdonsgnak pedig adjuk a List s Example rtket.


3. Helyezznk el egy j List Box vezrlt az ablakon, dupln kattintva az eszkz-

kszlet ListBox elemre, a tulajdonsgait pedig lltsuk be az albbiak szerint:

Tulajdonsg Name Location


Si z e

rtk lst PinkFloydAlbums


64' 32 160 , 121

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.

listaelemek mdosftsa tervezsi id6ben


Az Items
gyjtemny a listamez tulajdonsgaknt rhet el, gy megtallhatjuk a Properties ablakban is. Ha rkattintunk, megjelenik az ismers hrom pontos gomb, ami arra utal, hogy itt egyedi szerkesztsi lehetsgeket kapunk. Kattintsunk erre a gombra, gy a String Collection Editor (Karakterlncgyjtemny-szerkeszt) abiakba jutunk.

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

AtomHurtMott.1r Wllh You Wtre ~e

D u\SidcolthcMoon

7.12. bra
Az /tems gyjtemny kezelsre

tervezskor ez a prbeszdablak
szolgl

Listaelemek mdosftsa futsid6ben


A 3. rn sokat tanultunk az objektumokrl, a tulajdonsgokrl, a tagfggvnyekrl s a gyl1jtemnyekrl, s ennek a tudsnak minden morzsjra szksgnk is lesz, ha a listkat futsidben szeretnnk mdostani. A gyjtemnyek sok szempontbl gy viselkednek, mint az objektumok, hiszen rendelkeznek tulajdonsgokkal s tagfggvnyekkel, a listk kezelshez pedig az Items gyjtemnyen t vezet az t. A listk tartalmazhatnak egyforma rtkeket is, amint azt a pldnkban is lthatjuk majd, ezrt szksg van valamilyen mdszerre, amellyel a Visual C# ilyenkor is meg tudja klnbztetni a listaelemeket Erre szolgl az elemek sorszmozsa (indexelse). A lista els eleme a Osorszmot (indexet) kapja, a msodik az l-et, s gy tovbb. A sorszm az I t ems gyjtemny els elemtl mrt tvolsgot mutatja, ami nem felttlenl egyezik meg a listban megjelen els elemmel.

166 ll. rsz Felhasznli fellet

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

Kattintsunk dupln a gombra a Click esemnynek az elrshez, s rjuk be az albbit:


ls t Pi n kFloydAlbums . ILeros . Add ("The Divi sion Bell " ) ;

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:

Tulajdonsg Name Location Size Text

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.

168 ll. rsz Felhasznli fellet

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

100, 23 Clear List

Kattintsunk dupln a gombra a Click esemnynek az elrshez, s rjuk be az albbi utastst:


lstPinkFloydAl o ums.Items. Clear ();

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.

Adatok kinyerse a lista kivlasztott elemr61


A lista kivlasztott elemr61 kt tulajdonsg - a Selecteditem s a Se leetedindex- is

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.

Szrjunk be egy j gombot, a tulajdonsgait pedig lltsuk be az albbiak szerint:

Tulajdonsg Name Location Size Text

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 M es sageBox. Show () a Visual C# fggvnye, amellyel zeneteket jelenthetnk meg

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 Selecteditem s a Selectedlndex tulajdonsgok segftenek a kivlasztott listaelem azonostsban

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.

170 ll. rsz Felhasznli feiWet


Pontos megrtennk, hogy a Sorted tulajdonsg, nem pedig tagfggvny. Ez azt jelenti, hogy nem kell meghvnunk a rendezshez - a Visual C# mindaddig fenntartja a lista rendezst, ang a tulajdonsg rtke True. Ez azt jelenti, hogy akr az Add ( l , akr az Insert () tagfggvnnyel helyerunk el j elemet a listn, az mindig az bcrendben elfoglalt helyre kerl, nem pedig a lista vgre vagy a megadott helyre. lltsuk le a projekt futst, s mentsk a munknkat.

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:

Tulajdonsg Name Location Si ze Text

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.

172 ll. rsz Felhasznli fellet

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.

174 ll. rsz

Felh~i

fellet

5. Accept vagy jvhagy gomb.


6. A jellngyzetteL

7. Helyezzk a vlasztgombokat kt nll trolvezrlbe. 8. Az Items gyjtemnyen keresztl. 9. Az Insert (l tagfggvnnyeL

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

Az ra szmos pldjban elfordul majd, hogy a tervezs sorn elemeket adunk


gyjtemnyekhez. Ne feledjk azonban, hogy amit tervezsi idben megtehetnk,

azt ugyangy megvalsthatjuk Visual C# kddal is.

176 ll. rsz Felhasznli fellet

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

vezrl6k hasznlata 177

8.1. bra
A futsidben lthatatlan vezrlk a tervez aljn jelennek meg, nem pedg az ablaksablonon

HelyezZnk el egy j cmkt az ablakon, a tulajdonsgait pedig lltsuk be az albbiak szerint:


Tulajdonsg Name Au t oSi ze BorderStyle Locat ion Size Text TextAl ign

rtk
lbl Clock False FixedSing le
95 , 120 100 , 23

Ores (trljk a tulajdonsg tartalmr) MiddleCenter

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 ;

178 111. rsz Felhasznli fellet pftse


A .NET-krnyezet dtum- s idszolgltatsait a Sys tem nvtr tartalmazza, a DateTime osztly Now tulajdonsga pedig az aktulis idt adja vissza. A kapott rtket a ToLongTimeString tagfggvnnyel :pp:mm tpusv alaktjuk, gy a cmke Text tulajdonsgban a pontos id jelenik meg, msodpercenknt frisstve. Futtassuk a projektet az F5 billentyveL Lthatjuk, hogy a Label vezrl gy viselkedik, mint egy ra, amely msodperc pontossggal mutatja az idt Osd a 8.2. brt).

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).

Fles prbeszdablakok ltrehozsa


A flekkel elltott lapokbl (tab) ll felletek a Windows 95 nagy jdonsgaknt jelentek meg elszr a sznen, s azta teljesen elfogadott s szles krben hasznlt tagjai lettek a felleti elemek csaldjnak. Alkalmazsuk kt elnnyel is jr: egyrszt logikai csoportokba gyjtik a vezrlket, msrszt pedig gy kisebb helyre van szksg a kpernyn. Els pillantsra azt gondolhatnnk, hogy nem a legegyszerbb felleti elemmel llunk szemben, de ltni fogjuk, hogy a kezelse knnyebb a vrtnL A kvetkezkben hozzadunk nhny fles lapot a Picture Viewer programunk Options ablakhoz. Mondhatni gyvallvnk verbre, hiszen a lapok tartalma meglehetsen szegnyes lesz, de a tanuls cljra tkletesen megfelelnek. Lssuk ht, mire jutunk velk:

8. 6ra
1.
Elszr

vezr16k hasznlata 179

nyissuk meg a Picture Viewer projektet, amit a 7. rn szerkesztettnk.

2. Kattintsunk dupln a Solution Explorerben az OptionsForm.cs fjlnvre

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

ln. rsz Felhasznli felDlet pftse


A Tab vezrleink immr megfelelelen meghatrozott flekkel (lapokkal) rendelkezik, amint az a 8.4. brn is lthat.

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.

vezrl6k hasznlatB 181

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-

Kpek trolsa kplistkban


Az ezen az rn bemutatott vezrlk nagy rszben kpeket is csatolhatunk a fellet klnbz elemeihez. Az Intzbl ismers Treeview (fanzet) vezrl esetben pldul a mappk ikonjait hatrozhatjuk meg, radsul ezek a kpeknek nem kell felttlenl egyformnak lennik, gy nmi tjkoztatst adhatnak a hozzjuk tartoz mappkrl. A Microsoft persze felptbette volna gy a vezrlit, hogy mindegyik trolja a sajt kpeit, de ez nem lett volna tl hatkony mdszer, hiszen gy nem oszthatnnk meg a kpeket a vezrlk kztt, s a program karbantartsa is nehzkesebb lenne. Mirt is? Nos, tegyk fel, hogy van 10 Treeview vezrlnk, amelyek mindegyike egy apr mappaikont jelent meg a mappknL Egyszer csak elrkezik a frissts ideje, s szecetnnk

182 ll. rsz Felhasznli fellet


ezt az ikont valami tetszetsebbre cserlni. Ha a kpeket kzvedenl a TreeView vezrlkben trolnnk, mind a tzet egyenknt frissteni kellene, gy knnyen elfordul hatna, hogy valamelyikrl megfeledkeznk. Ennek elkerlsre hvta letrt! a Microsoft az ImageList (kplista) vezrlt, amelynek az a rendeltetse, hogy trolja s tadja a kvnt kpeket a tbbi vezrlnek Ha ebben a vezrlben helyezzk el a kpeinket, knnyedn megoszthatjuk azokat a klnfle egyb vezrlk kztt. A kvetkezkben flretesszk a Picrure Viewer projektet, s egy jat hozunk ltre a kisrletezshez:
1. Hozzunk ltre egy j Windows Application projektet Lis ts and Trees nven. 2. Kattintsunk a Form2 . cs fjlnvre a Solution Explorerben, s rjuk a helyre a ListsAndTreesForm.cs nevet. A Text tulajdonsgnak adjuk a Lists and Trees rtket. 3. Helyezznk el egy j ImageLis t vezrleit az ablakon, dupln kattintva az eszkzkszlet ImageList elemre (a Components csoportban). A Timer vezrlhz hasonlan az ImageList is llhatadan futsidben, gy nem az ablakon, hanem alatta jelenik meg. Adjuk az j vezrleinknek az imgMyimages nevet. 4. Az ImageList vezrl egyedli rendeltetse, hogy kpeket troljon, s elrhetv tegye ezeket ms vezrlk szmra. A kpek a vezrl lmages gyljtemnybe kerlnek. Kattintsunk erre a rulajdonsgra, majd a mellette megjelen kis gombra a Properties ablakban. Ekkor az Image Collection Editor (Kpgy(ijtemnyszerkeszt)) abiakba jutunk, amely meglehetsen hasonlt a tbbi szerkesztre, amellyel ezen az rn tallkoztunk. 5. Kattintsunk az Add (Hozzads) gombra, gy megnylik az Open (Megnyits) prbeszdablak. Vlasszunk ki itt egy 16x16 kppontos ikont. Amennyiben nem rendelkeznk ilyennel, a Microsoft Paintben kszthetnk egy alkalmas BMP fjlt, de vlogatharunk a knyvhz mellkelt mintk kztt is a h t tp: l /www. samspublishing. com/, illetve a h t tp: l /www. j ames foxall . com/ cmen. A kp beszrsa utn kattintsunk az OK gombra a prbeszdablak bezrshoz.

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,

8. ra Fejlett vezrt6k haszn~ 183


s ezek a fjlok kpesek kezelni az netszsget, nem kell bajldnunk ezzel a belltssaL Ha azonban BMP fjlt vagy ms olyan kpformtumot alkalmazunk, amely nem kpes az netszsg megvalstsra, ezzel a tulajdonsggal kijellhetnk egy sznt, amely ttetszknt viselkedik, ha a kpet a vezrlre helyezzk. Mindssze ennyit kell tuununk ahhoz, hogy az ImageList vezrlt hasznlatba vehessk. Ez persze nem meglep, hiszen a vezrl erejt nem a tulajdonsgai vagy a tagfggvnyei adjk, hanem az, hogy ms vezrlkhz kapcsolhat, amelyek felhasznlhatjk a benne trolt kpeket. Pomosan ezt tesszk a kvetkezkben.

G azdagabb listk a ListView vezrivel


A Lis tView Clistanzet) vezrl6 olyan, mint egy klnleges kpessgekkel felruhzott listamez. Kszthetnk vele egyszen.1listkat, tbbhasbos rcsokat, vagy ppen ikonokat tartalmaz tlckat. Listanzet pldul a Windows lntz6 jobb oldali svja, amelyben a lista elemeit az lcons, List, Details s Tiles (Ikonok, Lista, Rszletek s Mozaik) belltsokkal jelenithetjk meg - s lss csodt: ppen ezeket az rtkeket adhatjuk a listanzet View tulajdonsgnak. (J, ha tudunk rla, hogy az Intz listanzetnek megjelenst mdosthatjuk gy is, ha az egr jobb gombjval rkanintunk, majd a helyi men View almenjnek valamelyik pontjt vlasztjuk.) A kvetkezkben ltrehozunk egy ListVi ew vezrlt nhny elemmel, s eljtszadozunk a klnbz nzetekkel - tbbek kztt kpeket is megjelenitnk az egyes elemek helyn az el6z ekben megismert ImageList vezrl segtsgveL

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:

Tulajdonsg Na m e Locati on Size Smallimage List View

rtk
lstMyListView
8, 8

266 , 97 imgMyimages Details

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

184 111. rsz Felhasznli fellet pftse


dolgunk van. A ListView vezrl valjban kt kplista csatelst is lehetv teszi: egyet a nagy (32x32 kppontos) ikonok szmra, egyet pedig a kicsiknek. Amennyiben nagy kpekre is szksgnk van, ezeknek a kplistjt a LargeimageList tulajdonsggal adhatjuk meg.

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.

vezrt6k hasznlata 185

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.

186 111. rsz Felhasznli fellet pftse


8. Ha elkszltnk, kattintsunk az OK gombra a ListViewltem Collection Editor ablak bezrshoz. listanzetnk most kt elemet tartalmaz, hasonlan a 8.8. ~brhoz. 9. Ksrletezznk a Listview vezrl View tulajdonsg~val - figyeljk meg, miknt mdostjk a klnfle belltsok a vezrl megjelenst A Large Icons (Nagy ikonok) belltsa esetn nem kapunk ikonokat, hiszen a LargeimageList tulajdonsgban nem csatoltunk kplistt a vezrlhz. Mieltt tovbblpnnk, adjuk ismt a Details rtket a View tulajdonsgnak. 10. Futtassuk a projektet az F5 billentyvel, s prbljuk kijellni a nevnket az orszgunkra kattintva. Nem fog menni, a ListView vezrl ugyanis alaprtelmezs szerint csak akkor vlasztja ki a kvnt elemet, ha az els6 oszlopra kattintunk.

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.

Listanzetek kezelse a kdban


Megismerkedtnk hl a ListView vezrl kezelsnek alapjaival, de eddig csak a terveznzetben tevkenykedtnk, jllehet nem mindig tudjuk elre, hogy mi jelenik meg a listban -ezrt szksgnk lesz nmi kdolsra is. Errl szlunk a kvetkezkben.

Ustaelemek besz6rsa kd segftsgvel


A mllvelet rendkvl egyszer - mr amennyiben maga a beszrni kvnt listaelem egyszer. Nem kell mst tennnk, mint hasznlatba venni az I t ems gy<Ijtemny Add ( ) tagfggvnyt:
lvwMyListView.Items .Add( "Monty Sothmann);

8. ra

vazrt6k. hasznlata 187

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 " ) ;

A kijellt listaelem meghatrozsa kd segftsgvel


A ListView vezrl Selecteditems gyijtemnye tartalmazza a listaminden kijellt

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.

listaelemek eltvolftsa kd segftsgvel


A listaelemek eltvoltsra az I t ems gyijtemny Rem ove {) tagfggvnyt hasznlhatjuk, amely egy megadott listaelemre mutat hivatkozst vr paramterknt. Az ppen

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.

188 111. rsz Felhasmli fellet pftse

Az sszes listaelem eltvolftsa


Amennyiben pusztn kddal szeretnnk feltlteni egy Listanzetet, elszr rdemes eltvoltanunk az sszes elemt. gy ha msodszor is meghvjuk a feltlts kdjt, nem kapunk ismtld elemeket. Ezt a mveletet az It ems gy11jtemny Clear () tagfggvnyvel hajthatjuk vgre, valahogy gy: lvwMyListView.Iterns .Clcar() ; A ListVi ew vezrl hihetetlenl sokoldal lehetsgeket knl (pldul a csatolt kt:pek megjelertst) -olyannyira, hogy jmagam meglehetsen ritkn hasznlok egyszer listamezket. Ez a pr oldal csak a vezrl felletes bemutatsra volt elegend, de mr ezzel a tudssal is sikerrel hasznlhatjuk a projektjeinkben.

Hierarchikus listk ltrehozsa a TreeView vezrlval


A Treeview vezrl lehetv teszi, hogy hierarchikus adatokat jelertsnk meg egy program felletn. A legismertebb alkalmazst taln a Windows Intzben tallhatjuk, ahol ennek a vezrlnek a segtsgvel mozoghatunk a szmtgpnk mappi s fjljai kztt. A TreeView nagyszeren alkalmas mindenfle hierarchikus adat megjelertsre - ilyen lehet pldul egy cg dolgozinak szetvezeti beosztsa. A kvetkezkben megismerkedhetnk a vezrl hasznlatnak alapjaival, gy magunk is hasznlatba vehetjk a felleteinken. A TreeView vezrl elemei a Nodes (csompontok) gyjtemnyben kapnak helyet, amely azt aszerepet tlti be, mint a Listview Iterns gyl1jtemnye. Ha teht elemeket szeretnnk elhelyezni a fban, a Nodes gyjtemnybe kell azokat beszrnunk Mostanra mr vilgos lehet, hogy amit az objektumokrl s a gyjtemnyekrl ltalnossgban megtanultunk, azt szinte mindentt alkalmazhatjuk a Visual C#-ban. gy a ListView vezrl Items gyjtemnynl tanultak igen jl hasznlhatk a TreeView Nodes gyjtemnye esetben, de hasonlkppen kell eljrnunk a listamezkkel s a kombinlt listkkal is.

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

rtk tvwLanguages irngMyimages


8. 128
266, 97

8. ra

vezt1k hasznlata 189

Csompontok hozzadsa a fhoz


A csompontok kezelse a tervezs sorn hasonl ahhoz, mint amit a List View Items gy{jtemnynllthattunk, gy most rgtn rtrnk a kdra. j csompont hozzadshoz egyszen1en hvjuk meg a Nod es gyjternny Add ( ) tagfggvnyt (ppen ezt tesszk a pldnkban). Helyezznk most el egy gombot az ablakon, s lltsuk be a tulajdonsgait a kvetkezk szerint:

Tulajdonsg Name Locat i on Si ze Text

rtk btnAddNode 8 , 231 75 , 23 Add Node

Kattintsunk dupln a gombra a Cli c k esemny elrshez, s rjuk be az albbi kdot:


tvwLanguages.Nodes.Add("James"); tvwLanguages.Nodes.Add("Visual Ci");

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

ln. rsz Felhasznli feiOiet pftse


hivalkozhatunk.) Mindez gy val.sulhat meg, hogy minden csomponthoz tartozik egy sajt Nodes h'Yiljtcmny. Gondoljunk csak bele: a gyGjte::mnyben szcrepl6 gyermekek egy kzs szlcsomponthoz tartoznak.
A
kvetkezkben egy olyan gombot hozunk ltre, amely ismt az elz kt csompontot helyezi el a fban , de ezttal az egyik a msik gyermekv vlik. Trjnk vissza az ablaktervezhz, adjunk egy gombot az ablakhoz, s llitsuk be a tulajdonsgait az albbiak szerint:

Tulajdonsg Nam e Locat ion Size Tex L

rtk btnCreateChild
89' 231 80' 23

Create Child

Kattintsunk dupln a gombra a Click esemnynek az elrshez, s rjuk be az albbi kdot:


TreeNode obj Nod e; objNode "' t vwLanguages . Nodes .Add ( "Mat t objNode.Nodes.Add("Vieua l C# "); Pe r ry" );

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.

..... '-G ~~a-:

~~ou~~ 01

WddNodo ~ ~ a-<Md ll

l
mlysg hierarchit

8.10. bra
A TreeView vezrlveltetszsszerinti kszthetnk

8. ra

vezrteSk hasmlata 191

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 szlcsom6pont eltvoltsa maga utn vonja a gyennekeinek a trlst is.

Az sszes csompont trtse


Egy TreeView vezrl sszes csompontjnak eltvoltshoz a Nodes Clear () tagfggvnyt kell meghvnunk:
tvwLanguages . Nodes.Clear();
gyjtemny

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!

192 ll. rsz Felhasznli fellet

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

vezrl6k hasznlata 193

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

Menk s eszkztrak az ablakokon


A lecke tartalmbl:

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,

196 111. rsz Felhasznli fellet pftse


ami annl is rmtelibb, mivel ezeknek a felleti elemeknek a ltrehozsa a Visual C# 2008-ban minden eddiginl knnyebb vlt. A kvetkezkben megtanuljuk, hogyan hozhatunk ltre menket az ablakokon, s hogyan kezelhetjk, illetve programozhatjuk azokat, valamint megismerkednk a ToolStrip vezrlvel, amellyel eszkztrakat helyezhetnk el a prograrnek felletn, vgl pedig szt ejtnk arrl is, hogy miknt lthatunk d egy alkalmazst llapotsorraL

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

megtanuljk a program hasznlatt

Legfels6 szinttl menpontok ltrehozsa


A menk beszrsra egy MenuStrip nevezet vezrl ll a rendelkezsnkre, amely kiss furcsn viselkedik, hiszen tudomsom szerint az egyetlen olyan vezrl (nem szmtva a ContextMenuStrip vezrlt, amelyrl hamarosan szlunk), amely a fellet nlkli vezrlk szmra fenntartott helyre, az ablaksablon al kerl (ahogy a Timer), s mgis megjelenik az ablak felletn. Kezdjk a munknkat az albbi lpsekkel: 1. A kvetkezkben a Picture Viewer projekttel dolgozunk majd, amelyet legutbb a 8. rn szerkesztetlnk, ezrt most nyissuk meg ezt a programot. 2. Kattintsunk a ViewerForm. cs fjlnvre a Solution Explorerben, gy megjelentjk a program fablakt a tervezben. 3. Szksgnk lesz nmi helyre az ablak tetejn, ezrt adjuk a Size. Height tulajdonsgnak a 3 7 5 rtket. 4. lltsuk a PictureBox Location tulajdonsgt 8, 52, a Size tulajdonsgt pedig a 282, 279 rtkre. 5. A SHlFr billenty lenyomsa mellett kattintva vagy lasszzssal jelljk ki az ablak sszes vezrljt a kpmez kivtelvel. Ne hagyjuk ki az x s Y cmkket sem! Ha ezzel elkszltnk, kattintsunk a Select Picture gombra, s hzzuk felfel

9. 6ra Menk s eszkztrak az ablakokon 197


addig, amg a teteje egy vonalba nem esik a kpmez tetejvel (ha mindent jl vgeztnk, a gombbal egytt a tbbi vezrl is elmozdul). Az ablak jelenlegi llapott a 9.1. bra mutatja. 6. Helyezznk el egy j M enuStrip vezrlt, dupln kattintva az eszkzkszlet enuStrip elemre (a Menus & Toolbars, vagyis Menk s eszkztrak csoportM ban), s adjuk neki az mnu~ainMenu nevet. Amint azt a 9.2. brn is lthatjuk, a vezrl az ablaktervez als rszre kerl, de ha az ablak tetejre pillantunk, ott is tallunk egy jdonsgot: a Type Here feliratot

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).

198 111. rsz Felhasznli fellet pftse

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.

9. ra Menk s eszkztrak az ablakokon 199


Amennyiben egy mr ltez menpont alatti Type Here mezre kattintunk, az j menpontot a felette llval azonos menben helyezzk el. Ha ugyanakkor a menponttl jobbra ll Type Here feliratra kattintunk, egy almen pontjait adhatjuk meg, amelyet az eredeti menponttal rhetnk el. Vgezetl, ha a mensor tetejn elhelyezked Type Here mezkre kattintunk, a legfels szint menpontokat hatrozhatjuk meg.

A fels6 szintll menk feltltse


Annyi fels szint:\1 ment kszthetnk, amennyi csak elfr az ablakon, a Picrure Viewer projekt esetben azonban a File (Fjl) s a Tools (Eszkzk) tkletesen elegend. A kvetkez teendnk, hogy menpontokkal tltsk fel ezt a kt ment. Lssunk neki:

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

ln. rsz Felhasznli fellet pftse


6. A Separator lehetsg vlasztst kveten egy vonal tnik fel a Draw Border alatt, s egy jabb Type Here mez jelenik meg. Kattintsunk is r, s rjuk be az &Options ... szveget, majd nyomjunk ENTER-t a menpont ltrehozshoz. Ezt kveten adjuk neki az mnuOptions nevet. 7. Kattintsunk a kpmezre vagy egy msik vezrlre a men szerkesztsnek befejezshez.

Menpontok thelyezse s tr1se


Ezek a mO'veletek mg az j menpontok hozzadsnl is egyszerO'bbek. Ha trlni kvnjuk valamelyik menpontot, kattintsunk r az egr jobb gombjval, s vlasszuk a helyi men Delete (Trls) pontjt. Menpont thelyezshez egyszeruen ragadjuk meg a menpontot, s hzzuk t a kvnt helyre.

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. ra Menk s eszkztrak az ablakokon 201

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

202 111. rsz Felhasznli felillet pftse


A menkdok megrshoz kvessk az albbi lpseket:
1. Kattintsunk a File menre, hogy megnyissuk. 2. Kattintsunk dupln az Open Picture menpontra, gy -a vezrlkhz hasonlan -a menpont alaprtelmezett esemnyt kapjuk a kdszerkeszt6ben. Esetnkben ez a Click esemny. 3. rjuk be az albbi kdot:
l l Megjelentjk a fjlmegnyit prbeszdablakot

if (ofdSelec tPicture . ShowDialog()


{

==

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:

9. ra Menk s eszkztrak az ablakokon 203


Graphics objGraphics = null ; objGraphics = this . CreateGraphics(); objGraphics.Clear(SystemColors . Control) ; objGraphics . DrawRectangle(Pens.Blue, picShowPicture .Left - 1, picShowPicture.Top - l , picShowPicture .Width + l, picShowPicture.Height +l ) ; objGraphics.Dispose() ;

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.

204 111. rsz Felhasznli felDlet pftse

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. ra Menk s eszkztrak az ablakokon 205


4. Kattintsunk dupln az j menpontra a Cl i ck esemny szerkesztshez, s rjuk be a kvetkez kdot: Graphics objGraphics = null ; objGraphics = this.CreateGraphics(); objGraphics .Clcar(SystemColors.Control) ; objGraphics . DrawRectangle(Pens .Blue, picShowPicture . Left - l, picShowPicture.Top - l, picShowPicture.Width + l, picShowPicture . Height +ll; objGraphics . Dispose() ; Valban, ez ugyanaz a kd, mint amit a Draw Border gombnl s a Draw Border menpontnl is hasznltunk. Nyilvn rezzk, hogy felesleges hrom helyen ugyanazt a kdot megadnunk, de a helyzeten hamarosan gykeresen vltoztatunk, hiszen a 10. rn megtanuljuk, hogyan osszunk meg kdrszleteket, amelyeket gy elg egy helyen megadnunk. 5. Kattintsunk dupln a ViewerForm . cs fjlnvre a Solution Explorerben, gy visszatrnk a Picture Viewer ablakhoz a tervezben. 6. A helyi ment egy tulajdonsg rvn rendelhetjk hozz a kvnt vezrlhz. Jelljk ki a kpmezt az ablakon, s adjuk a ContextMenuStrip tulajdonsgnak az mnuPictureContext rtket. A helyimennk ettl fogva a kpmez6hz tartozik. 7. Futtassuk a projektet az FS billentyvel, s kattintsunk az egr jobb gombjval a kpmezre, hogy megjelentsk a 9.9. brn lthat helyi ment. Vlasszuk a Dr.aw Border pontot, s lss csodt: a szegly annak rendje s mdja szerint
el6t'nk.

8. lltsuk le a projekt futst, s mentsk a munknkat.

9.9. bra
A helyi menk gyors hozzfrst adnak egyes lehetsgekhez

206 ll. rsz Felhasznli fellet

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.

lltsuk le a projekt futst, s mentsk a munknkat.

9. 6ra Menllk s emztrak az ablakokon 207

A TooiStrip vezrl6 hasznlata


Ha egy program rendelkezik menvel (mrpedig az esetek tbbsgben gy ll a helyzet), jobbra eszkztrra is futja. A Too1St r ip vezrl hasznlatval igen egyszeren mdot teremthetnk egy program lehetsgeinek elrsre. A menpontoktl eltren az eszkztrak elemei mindig ltszanak a felleten, gy azonnal elrhetk, radsullebeg eszkzlersok is tartoznak hozzjuk, amelyek lehetv teszik, hogy a felhasznl pusztn felettk tartva az egrmutatt nmi tjkoztatst kapjon a rendeltetskrL
Az eszkztrelemek valjban menpontok gyors elrst szolgljk, ennek megfelel en egy eszkztr minden elemhez tartoznia kell egy menpontnak. Ne feledjk, hogy vannak felhasznlk, akik a billentyzetrl kezelik az alkalmazsunkat Szmukra a menpontok jelentik a hozzfrsi utat a kvnt mveletekhez.

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

208 11. rsz Felhasznli fellet


3. Figyeljk meg, hogy eszkztr a men felett kap helyet. Aki csak egyszer is hasznlt valamilyen Windows-alkalmazst, tudhatja, hogy az eszkztr coindig a mensor alatt ll. Kattintsunk ht az egr jobb gombjval az eszkztrra, s vlasszuk a helyi men Being to Front (Elrehozs) pontjt. Az eszkztr gy a mcn al kerl, amint azt a 9.11. brn is lthatjuk.

Eszkztrgombok beszrsa az ltems gyt1jtemny segftsgvel


Szmos korbban megismert vezrlhz hasonlan a ToolStrip is alkalmaz egy gytijtemnyt - ez az I t ems nvre hallgat, s az eszkztr gombjait tartalmazza. Vlasszuk ht az It ems tulajdonsgot a Properties ablakban, majd kattintsunk a mellette megjelen apr gombra, gy az Items Collection Editor abiakba jutunk. A lista pontosan tkrzi az eszkztr tartalmt, de gombok mg nincsenek rajta, hiszen az j eszkztrak egyet sem tartalmaznak.
Hrom kis kpet helyeznk el az eszkztron: egyet az Open, egyet a Draw Border, s egyet az Options szmra. Ezek fellelhetk a szerz webhelyn, a htlp : l /www. james foxall.com/books .aspx cmen.

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:

9. ra Menk s eszkztrak az ablakokon 209


1. Miutn kivlasztottuk a lenyl lista Button elemt, az Add gombra kattintva

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

rtk tbbOpenPicture Open Pictur e Open Picture

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

rtk t bbDrawBorder Draw Border Draw Border

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

rtk tbbOptions Options Options

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

ln. rsz Felhasznli fekllet pftse


2. Szrjunk be eh'Y ja bb elvlasztt az Add gombbal, s ezttal egyszer kattintsunk a felfel mutat nylra, hogy az elvlasztt a Draw Border s az Options gomb kz helyezzk. 3. Az eszkztr szerkezelnek mentshez nyomjuk meg az OK gombot, majd kattintsunk az ablakra, hogy megszntessk az eszkztr kijellst. Mveleteink vgeredmnye a 9.13. brn lthat.

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.

9. 6ra Menk s eszkztrak az ablakokon 211


A kvetkez lpsekkel letet lehelnk az eszkztrunkba: 1. Kattintsuk az ablak alatt lthat tbrMainToolbar vezrlre, hogy kijelljk. 2. Kattintsunk dupln az Open gombra a gomb Click esemnynek elrshez (fontos, hogy a gombra kattintsunk, s ne az eszkztrra). rjuk be a lenti kdot:
ll
{

Megjelentjk a fjlmegnyit prbeszdablakot. if {ofdSelectPicture . ShowDialog() == DialogResult . OK}


l l Betltjk a kpet a kpmez6be. picShowPicture.Image = Image .FromFile(ofdSelectPicture .FileName) ; l l Megjelentjk a fjl nevt az ablak cimsorban . this .Text = string.Concat("Picture Viewer( + ofdSelectPicture . FileName + ")"};

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.

Lenyfl6 menk ltrehozsa eszkztrgombokhoz


Projektnkben ugyan nem lnk ezzel a lehetsggel, de rdemes tudnunk, hogy az eszkztrakhoz lenyl menket is adhatunk, amint az a 9.14. brn is lthat. Maga a Visual C# is szmos helyen alkalmazza ezeket a menket. A hasznlatukhoz mindssze arra van szksg, hogy a hagyomnyos gombok helyett DropDownBut ton upus elemeket helyezznk el az eszkztron. gy ugyanolyan alment kapunk, mint amilyet korbban, a menk trgyalsnl mr lthattunk.

212 ll. rsz Felhasznli feiQiet

9.14. bra

nyen s ehlwz hasonl le7zyil menkel iS kszthetnk

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. 6ra Menk s eszkztrak az ablakokon 213

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.

214 ll. rsz Felhasznli faJOlet

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.

9. ra MenOk s eszkztrak az ablakokon 215

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.

4. Kattintsunk dupln a menpontra. 5. Az Items gyGjtemny. 6. Igaz. 7. A Statusstrip vezrlveL

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

Hozzuk mkdsbe a dolgokat: , programozas


1O . ra 11 . ra
12. ra 13. ra 14. ra 15. ra 16. ra Tagfggvnyek ltrehozsa s meghvsa llandk, adattpusok, vltozk s tmbk hasznlata Mveletek szmokkal, karakter1ncokkal, dtumokkal s id-pontokkal Dntshozatal Visual C# kd segtsgvel A hatkonysg nvelse: ciklusok Hibakeress Objektumok tervezse osztlyok segtsgvel Kapcsolat a felhasznlkkal Grafikus lehetsgek

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

220 lm . rsz Hozzuk mt1kdsbe a dolgokat programozs


az alkalmazsaink feladatokat hajtsanak vgre. Ezen az rn megtanuljuk, hogyan hozzunk ltre programkdok csoportjait, illetve kln eljrsokat ( tagfggvnyeket), s hogyan hvjuk meg a ltrehozott tagfggvnyeket

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.

l~ VIIiDG Syatca. ltf wiJI.g; ~~ utno 3ys t.s. t.tnq;


~:

1 tUinQ' Syst.t!ll.J)et.a ;

l~g

Srua:t e:w:t ; u.tno Syn . v~ . r"Cl:U :

po.b.l.l C parual. ClU W Vtf:'t.l9!1:fot:ll! ~ !O.r:t'J

Pllblic Vicvwzlom()
(

pr:t. Y~

Toad.

b t.nSclccct-ic-t~_Cl:a.ck (obj~ ~ccde.r~

~ntAtgs

e:-)

ll
U l

5111~ th~~ !ile d.ial--og boa.

(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

222 1111. rsz Hozzuk mdkdsbe a dolgokat: programozs

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.

Visszatrsi rtk nlkli tagfggvny bevezetse


Amikor ltrehozunk egy tagfggvnyt, elszr be kell vezetnnk azt egy osztlyon bell. A ViewerForm . cs osztlyban helyezzk oda a kurzort, ahol 10.1. brn a nyl lthat (lltsuk kzvetlenl a kapcsos zrjel mell, a jobb oldalra), majd nyomjuk meg az Etm:R billentyt, amivel j sort nyitunk, s rjuk be a kvetkezket:
p rivate void Op enPicture{)
{ }

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

publio p&x-thl c.lau Va.t:"A"i't'om : fol'Jl


l

pt-i" 'VOid OpenP1ct:oreU


l

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.

224 1111. rsz Hozzuk mllkdsbe a dolgokat programozs


Akkor is meg kell adnunk a zrjeleket, ha a tagfggvny nem fogad paramtereket.

Adjuk a kvetkez6 programkdot az OpenPicture () tagfggvnyhez (a kdot a nyit s zr kapcsos zrjelek kz tegyk):
l l Megjelentjk a fjlmegnyits prbeszdablakt.

if (ofdSel ectPicture . ShowDialog ()


{

==

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

private void DrawBorder(PictureBox objPicLurebox)


{

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();

public pru'{.tl. olue

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

ot the tll!: lA th tata,.- i;>e,r .7oc - ot'd5lacc.P1cc.u.re.!'il.e.Ra.el

: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.

226 1111. rsz Howk mt1kdsbe a dolgokat programozs

Kfl~~----~ .~rt~ ~,. -.~ ~~~~~~~ ~1~ 1l

~~ --------=---------~-11
JHlOQJleS"Ult-.Cil)

ll ShtiV

~be

ope.ca filc: 4.1eloo lW>w..

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~)

G.r:..pu.cs cj~ a1LU1 objSrPb.l.C. t::b.U.Ct'MWG%-pJn.c-a {):


Objar~s.Cle;u(Syataltolon .coat.rol), ObjGrii,Pll.1ca.Dz'a~UlQl.efPt:U.IltM, objP.Ot"'OUbox.IAf~ - 1, ob;lPict\l.ftbox.Tap - 1, ob:)Ple1;.1U'ehoa,Widt.b + 1, objPicturellox.HeJ.uht. + l); Olt)Graplli,.c::~.Di.-poatt):

10.4. bra
Az esemnykeze-

ltJkhz hasonlan a tagfggvnyek is


Nl

nll egyedek

Visszatrsi rtkkel rendelkez6 tagfggvny bevezetse


Az imnt ltrehozott tagfggvny nem adott vissza rtket, most azonban visszatrsi rtkkel rendelkez tagfggvnyt fogunk bevezetni. A visszatrsi rtkkel rendelkez6 tagfggvnyek bevezetsnek ltalnos utastsformja a kvetkez6:
hatkr adattpus fggvnynv(paramterek)

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)
{

return strText . Length;

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() ;

228 l ilL rsz Hozzuk mllkdsbe a dolgokat programozs

prinn old. b&.:nSUe.c1:.PJ.ctuA Cltclr(ob:lecc eHLd. e r,

<
)

ll $Mv t.b.tt ~ .t1le d1do; bo~~:. ~t (Otll5tlee"CP1CCI.I% Ib~&lOO()


J l :.0.0
t~C' an~tat o~

Ee~tt.Al"Q l

C11tlOOR.~iiJIJ.lt.QK)
Dox .

lato r.be

p..1~c~~

pt~u.re . x..v

....,... rzo.n~e(o.t:d.Se.l~P.1~-.a.n. r1l..._);


Ute tHe iD '!ho!. toz:r e capu or..
+
ofclh.l e~P~ . P:i-1.:

ll S'bcw die naac


t.~. T~

~1.BG.eo.cat.( "' P1.ct.ure V~ l"'

pn.,;~

'9'0icJ tltnQu.lt....,Cllcll(obju:t aRllGcr, r..rlt.'lY.r3' e)


ta1~

ll Clolll~ tb.e wt.Mow &d tJU.:..Clonu:

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
=

this . AddTwoNumbers(l, 5);

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)~

H.Ddtr. E"fen~ e.)

ll ShG'It tb4t. ope,a file <11al.OG bo.


1t
(ctdSe.l.Htt.Pi~u.re .SbcWOtloq()

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.

<!<h.T_" otruo.Conaoaf"tlc .,."..,. + ofdSoleo<""'"'"'U. 1


IU'1ftU TOld l!UIQQJ.C_CllC); (obji!CC
Cbdc t'~ C-.rtft~A.ro

.)

l l Clc:~e ~h~ v~ a.ad cua.CloaeU;

u...1~

tbc

~hc:a'!.l.oa

Amikor trlnk egy eljrst, trlnnk kell a deklarcit s a zr zrjelet is

230

lm. rsz Hoz. mllk6dsbe a dolgokat programozs


ha most prbljuk lefuttatni a programot, fordtsi hibt kapunk. rdemes is lehet most elindtani a programot, hogy lssuk a fordtsi hibt. Arra a krdsre, hogy az utols fordtst akarjuk-e futtatni, vlaszoljunk a No (Nem) gombbal. Ez utn visszatrnk a tervezhz, ahol az Error List (IJibalista) egyetlen zenetet fog tartalmazru. Kattintsunk dupln a hibazenetre a krdses kdrszlet megtekintshez. Figyeljk meg, hogy mg egy programkd hivatkozik az ppen trlt eljrsra Osd a 10.7. brt). Ez az az utasts, amelyik a gombra kattintst sszekapcsolja az imnt trlt esemnykezelveL Ha trljk az esemnykezelt, a Visual C# nem trli automatikusan ezt a hivatkozst. Ahhoz, hogy ezt kijavtsuk, trljk az egsz utastst, amely a trlt eljrsra hivatkozik. gy mr futtathat lesz a programunk. Trjnk vissza az ablaktervezhz, s az ablakban kattintsunk a Select Picture gombra, hogy az eltrbe kerljn, majd nyomjuk meg a DELETE billenty(It, hogy trljk a gombot. Valjban cgyszerub, ha nem prbljuk meg lefuttatru a programot. Trljk a Quit (IGJps), a Draw Border (Szegly rajzolsa) s az Options (Belltsok) gombok eljrsait is, ahogy azt a Select Picture gombnl tettk. Ez utn azonban trlnnk kell magukat a gombokat is, rnieltt futtatnnk a programot. Gyzd jnk meg rla, hogy mindegyiknl trltk az eljrsokat! A Visual C# elg okos ahhoz, hogy trlje a kapcsold k6dsorokat, s ne hagyja benne a programban. Az ablakunknak most a 10.8. brhoz hasonlan kell kinznie. Folytassuk az ablak tisztzst. llitsuk az X cmke Location (Hely) tulajdonsgt 336,256-ra, az Y cmkt pedig 336,269-re, majd a kpmez Size (Mret) tulajdonsgnak adjuk a 322,257 rtket. Az ablakunknak most a 10.9. brhoz hasonlnak kell kinznie.

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~

.btft3e.lect P1ot.v.ra. Tu~ sele.c10

.tttoSdcc;tfictv.z:.UaV~ua~S..:yl.ekelrCctlor t:rwt; ~-----~~ .btft5ellt~1ecllft .Cl1t:k .- MV Spt.a.t'9tmt.ftand.tet(~bJ.a.

-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,

owv Syn.or.n.ao.stu(l6, :U):

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.

232 1111. rsz Hozzuk makdsbe a dolgokat programozs


Egy eljrs szmra vesszvel elvlasztva tbb paramtert is megadhatunk:
private void MyProcedure(string strMyStringParameter, string strMyintegerParameterl

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 ;

Az eljrson bell a paramter egy kznsges vltozhoz hasonl mdon viselkedik.

Emlkezznk r, hogy a vltozk rtkeket trolnak, amelyeket meg lehet vltoztatoL


Az elzleg bemutatott paranccsal egy konkrt rtket adrunk t az eljrsnak, de

a kvetkez mdon vltozk rtkeit is tadhattuk volna:


MyProcedure(strAString, intAninteger};

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

lpseket, amelyekkel mkdsre brjuk az eljrst:

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

lltsuk le a fut alkalmazst, s mentsk a munknkat.

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

234 1111. rsz Hozzuk mllkdsbe a dolgokat programozs

Statikus tagfggvnyek ltrehozsa


Az ra korbbi rszben emltettk, hogy ktfle tagfggvnyt hozhatunk ltre.

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)
(

return strText .Length ;

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

A vgtelen nhfvs elkerlse


Lehetsges gy meghvni az eljrsokat, hogy azok vgtelen ciklusba vezetnek. Figyeljk meg a kvetkez kt eljrst:
public s tatic void DoSomething()
{

DoSomethingElse(); public static void DoSomethingElse()


{

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.

236 1111. rsz Hozzuk mllkdsbe a dolgokat: programozs

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

ltrehozsa s meghfvsa 237

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

Allandk, adattpusok, vltozk s tmbk hasznlata


A lecke tartalmbl:

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.

240 lm. rsz HolZUk mllkdsbe a dolgokat: programozs


Pldul nyomon akarjuk kveLni azt, hogy egy eljrst hnyszor hvtunk meg, vagy egy rulajdonsg rtkt akarjuk trolni s ksbb felhasznlni. Az ilyen adatokat llandknt, vltozknt s tmbknt trolhatjuk Az lklndk nevestett rtkek, amelyeket a program rsa kzben hatrozunk meg. Nem vltoztathatjuk meg 6ket, de igny szerint hivatkozhatunk rjuk. Ezzel szemben a vltozk olyanok, mint egy trolrekesz: a bennk trolt adatokat olyan gyakran olvashatjuk ki s cserlhetjk le, amilyen gyakran szeretnnk. A tmbk csoportostott vltozknt viselkednek, amelyek lehet6v teszik, hogy tbb rtket troljunk egyetlen trnbvltozban. Amikor ilyen trolkat hozunk ltre, el kell dntennk, hogy milyen tpus adatokat fognak tartalmazni. Az j vltoznk pldul karakterlncot (szveget) vagy szmot fog tartalmazni? Ha szmot, akkor az egsz szm lesz vagy valami teljesen ms? Miutn megadtuk a trolni kvnt adat tpust, a lthatsg szintjt kell kivlasztanunk, amellyel egy prograrnon bell az adatok hozzfrhetsgt adjuk meg ms eljrsok szmra (a lthatsgot hatkrnek nevezik). Ezen az rn mindent megtanulunk a Visual C# adattpusairl, valamint arrl, hogy miknt lehet ezeket a trolkat ltrehozni s felhasznlni, illetve a hatkr szktsvel kikszblnia problmk nagy rszt.

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,

vltozk s tmbk hasznlata 241

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.

Adattpus/rtk bool byte char DateTime decimal


double int
long

sbyte short float u int u long u short


string

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.

242 1111. rsz Hozzuk mllkdsbe a dolgokat: programozs


A

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).

Tancsak a megfelel6 adattfpus kivlasztshoz


Az adattpusok listja elsre ijesztnek hathat, de kvethetnk nhny ltalnos irnyelvet, hogy vlasztani tudjunk kzlk. Ahogy kezdjk megszokni a klnbz tpusokat, gy finomthatjuk az adattpus kivlasztst. me nhny hasznos irnyelv az adattpusok hasznlathoz: Haszveget akarunk trolni, hasznljuk a string adattpust, amely brmilyen rvnyes billentykaraktert kpes trolni (belertve a szmokat s az bcben nem szerepl karaktereket is). A true s false rtkek trolshoz hasznljuk a bool tpust. A- 32768 s 32767 kztti, tizedesjegy nlkli szmok trolshoz hasznljuk a short adattpust. Ha olyan tizedesjegy nlkli szmot akarunk trolni, amely a short tpus ltal megengedettnl nagyobb vagy kisebb, hasznljuk az int vagy a long (ez a ..long integer" rvidtse) adattpusokat Ha tizedesjeggyal rendelkez szmokat kell trolnunk, hasznljuk a floa t tpust. Ez szinte minden tizedesjegyet tartalmaz szmnak megfelel, hacsak nem akarunk hihetetlenl bonyolult matematikai alkalmazsokat Imi, vagy nem kell nagyon nagy szmokat trolnunk. Ilyen esetekben hasznljuk a double-t. A pnzsszegeket troljuk a decimal adattpussaL Ha dtumot vagy idpontot kell trolnunk, hasznljuk a DateTime tpust. A Visual C# felismeri az ltalnosan hasznlt dtum- s idformtumokat, pldul, ha a 7/22/2008 rtket szeretnnk trolni, a Visual C# nem egyszer karakterlncknt kezeli azt, hanem tudja, hogy 2008. jlius 22-t jelent. A klnbz adattpusok eltr mennyisg memrit ignyelnek. Hogy vdjk a rendszer erforrsait, olyan adattpust rdemes hasznlnunk, amely a legkevesebb memrit foglalja el, de mg a lehetsges rtkek teljes tartomnyt lefedi. Pldul ha egy 1 s 1Okztti szmot akarunk trolni, hasznljuk az in t tlpust a long helyett. Az Object adattpus klnleges figyelmet rdemel. Ha Object-knt adunk meg egy vltozt vagy egy tmbt, szinte brmilyen adatot trolhatunk benne. A Visual C# akkor hatrozza meg, hogy milyen adattpust kell hasznlnia, amikor belltjuk a vltoz rtkt

11. 6ra llandk.

vltozk s tmbk hasznlata 243

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

Tpus byte short int long float double

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);

244 1111. rsz Hozzuk ml'ikdsbe a dolgokat: programozs

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

llandk meghatrozsa s hasznlata


Amikor "bedrtozunk" egy szmot egy eljrsban (pldul intVetingAge = 18), millinyi dolog thet ki balul. A bedrtozott szmokat gyakran mgikus szmoknak is nevezik, mert gyakran rejtlyes a szerepk. A jelentsk azrt homlyos, mert maguk a szmjegyek nem mutatjk, hogy a szm mire vonatkozik. Arra, hogy a mgikus szmokbl fakad problmkat kikszbljk, llandkat (konstansokat) hasznlunk. Az llandkat a program rsakor adon rtkkel vezetjk be, ami nem vltozik a program lete sorn. Az llandk a kvetkez elnykkel rendelkeznek: Kikszblik vagy cskkentik az adatbevitelbl szrmaz problmkat. - Sokkal egyszerbb egy c_pi neVI1 llandra emlkezni s azt hasznlni, mint minden alkalommal berni, hogy 3,14159265358979, ha szksgnk van a pi szmra. A fordt elfogja a rosszullert vagy rtk nlkli llandkat (meg tudja mondani, ha az lland, amit begpehnk, nem egyezik azzal, amit bevezettnk), de nem trdik azzal, hogy milyen rtket adunk nekik. A kdot knnyebb frissteni. -Ha egy jelzloghitel kamatlbt 8,785 o/o-on rgztettk, de az 9,00-ra emelkedik, a 8,785 minden elfordulst ki kellene javtanunk a kdban. Az adatbevitel sorn vtett hibk lehetsgn kvl lehet, hogy egy olyan 8,785-es rtket is megvltoztatunk, aminek semmi kze a kamatlbhozpldul egy megtakartsi ktvny hozamt Ha viszont llandt hasznlunk, csak egyszer kell megvltoztatnunk a bevezetsekor megadon rtket, s minden olyan kdrszlet, amely az llandra hivatkozik, rgtn a helyes rtket fogja hasznlni.

11. ra llandk,

vltozk s tmbk hasznlata 245

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

((decLoanAmount * 0,075M) * 12;

vagy
decintcrestArnount ((decLoanArnount * c _ fltinterestRate) * c_intMonthsinTerm);

Az llandk meghatrozsa sorn a kvetkez utastsformt kell kvetnnk


cons~

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 ) ;

Egy lland alkalmazsa sokkal knnyebb s kevsb a kvetkez parancsot:


Console.WriteLine(3,14159265358979 *2);

knny

elrontani, mint

Az llandkra csak azon a hatkrn bell hivatkozhatunk, amelyben ltrehoztuk


ket.

A hatkrket az ra

ksbbi,

Hatkr meghatrozsa cm rszben trgyaljuk.

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.

246 lll. rsz Hozzuk mllkdsbe a


A kvetkez lpsek sorn ltrehozunk egy llandt a Prompt on Exit (Kilpsnl figyelmeztets) bellts alaprtelmezen rtke szmra. Nyissuk meg a Picrure Viewer programunkat, s kvessk a kvetkez lpseket:
1. Kaltintssal vlasszuk ki a ViewerForm . cs-t a Solution Explorerben. 2. Kattintsunk a Solution Explorer tetejn lv View Code (Kdnzet) gombra, hogy megjelenjen a Viewe rFor m. cs kdja. 3. Az llandk, amelyeket ltre fogunk hozni, osztlyszint\1 llandk lesznek,

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.

p\dt11c p&rtiel. c.lu


(

\"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

n.-c af" t.lHI tth i n ~b ~~ M.t . bdtY'StawSt.dp.Ju.e(OJ .'%ue ct<LS"e.~l't.ct-ure.Ff.ldf..-e ~

t~

Vltozk bevezetse s hasznlata


A vltozk annyiban hasonltanak az llandkra, hogy ha egy vltoz nevre hivatkozunk a kdban, a kd vgrehajtsa alan a Visual C# kicserli a vltoz nevt az rtkre. Ez azonban az llandkkal ellenttben nem fordts kzben trtnik, hanem futskor, amikor a vltozra hivatkazunk Ennek az az oka, hogy az llandktl eltren a vltozknak bnnikor megvltozhat az rtkk.

11. ra llandk,

vltozk s tmbk haSZJilata 247

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

A vltozknak nem mindig ktelez kezdrtket adnunk, de rnindenkppen rdemes.

Egy karakterlnc tpus vltoz ltrehozshoz s hasznlhatunk kt utastst is:


string strName ;

megadshoz pldul

strName

"Matt Perry ";

Ha azonban mr a vltoz ltrehozsakor tudjuk a kezdrtket, a bevezetsben is megadhatjuk:


sLring strName = "Matt Perry;
J~.:gyezzk

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

248 lll. rsz Hozzuk mllkdsbe a


esetben pedig a fordt jelezni fogja, ha valamelyik fenntartott szt hasznltuk. Ha a vltozink elnevezsekor olyan nvadsi szablyokhoz tartjuk magunkat, mint hogy egy vltoz nevnek elejn pldul eltagknt szerapelnie kell a vltoz tpusnak, nagyban cskkentheijk annak az eslyt, hogy fenntartott szavakat hasznljunk.

Literlis rtkek tadsa vltozknak


Az, hogy egy vltozhoz hogyan rendelhetnk liter/is rtketCvagyis olyan bedrtozott rtket, mint a 6 vagy a "gitr"), a vltoz adattpustl fgg. Karakterlncok esetn az rtket idzjelek kztt kell megadnunk:
strCollegeName

"Bel l evue University;

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' ;

Szmrtkek esetn nem kell kzrefognunk az rtket:


intAnswerToEverything - 42;

Vltozk hasznlata kifejezsekben


Vltozkat brhollehet hasznlni, ahol kifejezst hasznlhatunk; pldul a matematikai fggvnyek is kifejezsekkel dolgoznak. sszeadhatunk kt literlis rtket, s az eredmnyt egy vltozban trolhatjuk
intMyVariable

=2

5;

Ezen kvl az albb bemutatott mdon kicserlhetjk az egyik vagy rnindkt szmot szm tpus vltozra vagy llandra:
intMyVariable intMyVariable intMyVariable

= intFirstValue

+ 5; 2 + intSecondVariable ; intFirstVariable + intSecondVariable;

11. ra llandk,

vltozk s tmbk hasznlata 249

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

Az adattpus-objektumok hasznlatt nhny

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 -

egy figyelemre mlt klnbsget leszmtva. Figyeljk meg a kvetkez6 utastsokat:


string(] strMyArray; strMyArray =new stri ng(lO];
Az els6 utasts az strMyArray-t tmbknt vezeti be (amit a szgletes zrjel jell), a msodik utasts pedig tz karakterlnc tpus elemet hatroz meg. A zrjelben lv6 szm azt hatrozza meg, hogy a tmb hny "levelesldt" fog tartalmazni. Ez lehet literlis rtk, lland vagy egy msik vltoz rtke.

ltrehozhatunk olyan tmbket is, amelyeknek a mrete futskor vltozik. ez a tma azonban meghaladja a knyvnk kereteit.

250 lll. rsz Hozzuk mtlkdsbe a

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.

Ahhoz, hogy a tmbvltoz knt hasznlnunk:

els

elemben ell1elyezznk egy rtket, a O-t kell index-

strMyArray[OJ = "Ez az rtk lesz az els6 elem ;

A msodik elem rtknek megadshoz a kvetkez() parancsot hasznlhatjuk:


strMyArray[l)

= 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.

Tbbdimenzis tmbk ltrehozsa


A tmbvltozkat csak egyszer kell bevezetni, mgis szmos adatot kpesek trolni, ezrt idelisak, ha egymssal sszefgg adatokat akarunk trolni. Az imnt bemutatott pld-

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-

vltozk s tmbk hasznlata 251


ternk, s a kt index egyttesen hatroz meg egy elemet, a torpedjtk koordintihoz hasonlan, amelyek a tbln kitntetett helyeket jellnek. Az sszetartoz elemeket a 11.2. bra szemllteti.
Egydimenzis tmb
EIIY dimenzi ------~
3
4

Ktdimenzis tmb
El$6 dimenzi
------i~

0,0 0, 1

1,0 1,1 1,2 1,3

2,0 2,1 2,2 2,3

3,0 3,1 3,2 3,3

4,0 4,1 4,2 4,3

5,0 5,1 5,2 5,3

6,0 6,1 6,2 6.3

7,0 7,1 7,2 7,3

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

A msodik s harmadik szemly magassgt s testslyt a


intMeasurernents[l,c_Height) intMeasurernents[l,c_Weight ) intMeasurements[2,c_Height] intMeasurernents[2,c_Weight)

mdon trolhatjuk:

MsodikSzemlyMagassga; M sodikSzemlySlya; Harmadi kSzemlyMagassga ; HarmadikSzemlySlya;

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-

252 1111. rsz Hozzuk maltdsbe a dolgokat programozs


zijnak msodik helyt hasznltuk, ezekkel az adatokkal knnyen dolgozhatunk Pldul egy ember magassgt s testslyt addig tudjuk lekrdezni, amg tudjuk, hogy az els dimenzi indext hasznltuk az adat trolsra. A hrom szemly ssztmegt a kvetkez kddal rathatjuk ki:
Console.WriteLine(intMeasurements[O , c_Weight] + intMeasurements[l,c_Weight] + intMeasurements[2,c_Weight));

Amikor tmbkkel dolgozunk, tartsuk szem eltt a

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

vltozk s tmbk hasznlata 253


A hatkrnek ugyanaz a hatsa a tmbvltozkra, mint a hagyomnyos vltozkra. Az rthetsg kedvrt a hatkrk trgyalsa sorn vltozkra hivatkozunk, de tisztban kelllennnk vele, hogy mindez ugyangy igaz a tmbkre (s ami azt illeti, az llandkral is.

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 ciklu sban vgrehajtand utas tsok while (i <10)

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++)
{

<a kifejezs true rtke esetn vgrehaj tand utasitsok

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)
{

int intecunter ; for (intCounter=l ; intCounter<= l OO ; intCounter++l


{

l l Valamilyen mvelet

254 1111. rsz Hozzuk mllkdsbe a dolgokat programozs


Azzal, hogy a vltoz bevezetst az i f szerkezeten bell helyezzlik el, biztostjuk, hogy csak akkor jn ltre, amikor szksg van r. Valjban egy blokkot gy lehet ltrehozni, hogy az utastsokat egyszeren nyit s zr kapcsos zrjelek kz fogjuk. A klnbz vezrlsi szerkezeteket, pldul a ciklusokat s az elgazsokat ksbbi rkon trgyaljuk rszletesen.

Tagfggvnyszintt1 hatkr (helyi hatkr)


Amikor egy llandt vagy vltoztegy tagfggvnyen (eljrson) bell vezetnk be, az lland vagy vltoz tag[ggvnyszint hatkrrel, ms nven eljrsszint hatkrrel vagy helyi hatkrrel rendelkezik. A legtbb ltalunk ltrehozott vltoz hatkre tagfggvnyszint11lesz. Tulajdonkppen az eddigi rkon ltrehozott vltozk kzl is majdnem mindegyik tagfggvnyszint\1 hatkrrel rendelkezett. A helyi llandkra s vltozkra csak az adott tagfggvnyen bell hivatkozhatunk, ms tagfggvnyek szmra azonban nem lthatk. Ha egy helyi llandra vagy vltozra nem abban a tagfggvnyben prblunk meg hivatkozni, mint amelyikben ltrehoztuk ket, a Vtsual Ot forditsi hibazenetet Cnem ltez vltoz vagy lland") ad arra a tagfggvnyre, amelyik hivatkozik. A Visual C#-nak mindegy, hogy a deklardt hol helyezzk el a tagfggvnyen bell, de ltalban az a legjobb, ha a helyi vltozkat a tagfggvny elejn vezetjk be. Jegyezzk meg azonban, hogy ha a deklarci egy vezrlsi szerkezeten bell szerepel, a vltoz blokkszint hatkrrel s nem helyi hatkrrel jn ltre.

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,

vltozk s tmbk hasmlata 255

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.

Adattfpust jell6 el6tagok


A leggyakrabban hasznlt adattpusok eltagjait a 11.4. tblzatban soroltuk fel. Br nem muszj hasznlnunk ket, az alkalmazsuknak tbb elnye is van.

Adattipus bo ol byte char decimal doubl e fl oat

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

256 1111. rsz Hozzuk mllkdsbe a dolgokat: programozs

Adattpus int long object short string

EUitag
int lng obj sho st r

Plda vltozra intLoopCounter l ngCustomeriD objWord shoTotalParts strFirstName

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

Hatkrt jell6 vttoz6el6tagok


Eltagokkal nem csak az adattpust, hanem a hatkrt is rdemes jellni Osd a 11.5. tblzatot). Klnsen nagy alkalmazsoknl a hatkr jellse szinte szksgszen1. Ki kell hangslyozni, hogy a Visual C# nem trdik azzal, hogy hasznlunk-e eltagokat, de a kvetkezetes alkalmazsuk nemcsak neknk, hanem azoknak is elnys, akik a programkdunkat tnzik.

Eltag

g
m

(nincs eltag)

Hatkr lersa Globlis Privttl az osztlyszintig Nem statikus vltozk a helyitl a tagfggvnyszintig

Plda g_strSavePath b_blnDataChanged fl t InterestRate

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.

vltozk s tmbk hasznlata 257

A Pictura Viewer program vltozi


Az ra korbbi rszben a Picture Viewer programunkhoz hozzadtunk egy modulszint

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.

Vltozk ltrehozsa a bellftsok szmra


Korbban hrom belltst hatroztunk meg a Picture Viewer programunk szmra . Most nzzk meg ket kzelebbrl:
User Name (A felhasznl neve) -A fclhasznlk itt adhatjk meg a nevket.

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;;

ll Show t.he OS'4tft Oh d.La.loq l:loa. i1 (ofdS4l.C.Ct.P1.C'CUe . SitOtiiOialoQC) -

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~-

t:.l'lq.C:ooet ( J J.C't!U'e Tl.WI!'( t

o.tdSe.l.~tict.v.n..rl....._

+ t ) ,
t~

11 shCY the..._. o.t r:lle.

a deklarcik kz,

az eljrsok al
kerlnek

258 1111. rsz Hozzuk ml1kdsbe a dolgokat programozs


A vltozk ltrehozshoz kvessk a
kvetkez

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 kdunknak a 11.4. brn lthathoz hasonlnak kell lennie:

A bellftsok vltozinak elksztse s alkalmazsa


Most, hogy ltrehoztuk a vltozkat, kezdrtket kell adnunk nekik. Ez valjban mr megtrtnt, amikor bevezettk ket, de meg kell vltoztatnunk az rtkket, amikor a programunk elindul, ezrt egy olyan kddal kell bvtennk a programot, amely ezt lehetv teszi. Ehhez hajtsuk vgre a kvetkez lpseket:
1. Az ablak elksztshez ltalban a Load esemny a legmegfelel6bb.

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.

vftoz6k s tmbk hasznlata 259

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)

260 Jlll. rsz Hozzuk mt1kdsbe a dolgokat programozs

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).

Clou l~ Pi<ture v;_, progrm1

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.

vltozk s tmbk hasznlata 261


Fontos szempont, hogy olyan kdot rjunk, amelyet azok is tisztn rtenek, akik nem vettek rszt a program megalkotsban. Az eltagok nagyban hozzjrulnak ennek a clnak az elrshez. Az rn tanultunk az adattipusok neve eltt szerepl eltagokrl, valamint megtanultuk a hatkrt jell eltagok hasznlatt Vgl felhasznltuk ezeket a fogalmakat, s ltrehoztunk egy llandt, illetve nhny vltozt, hogy a Picture Viewer program belltsait kezelhessk. Olyan kdot is rtunk, amellyel sikerlt ezeket mkdsre brni. Az Options ablak mg nincs ksz teljesen, de a 16. rn be fogjuk fejezni .

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?

262 1111. rsz Hozzuk mtlkdsbe a dolgokat: programozs


4. Melyik az a kdban ltrehozhat adatelem, amelynek tetsz61eges alkalommal mdosthat az rtke? 5. Melyek a string_strMyArray l 51 utastssalltrehozott tmb els s utols indexei? 6. Mivel jellemezhetjk egy lland vagy vltoz lthatsg~ 7. ltalban rdemeskorltoznia vltozk hatkrt, vagy hasznljuk a lehet Jegszlesebb hatk~

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-

264 1111. rsz HOZZIJk makdsbe a dolgokat: programozs


nnk. Ezen az rn megtanuljuk, hogyan hajthatunk vgre matematikai mveleteket a kdjainkban, valamint megismerkednk a mveletek vgrehajtsi sorrendjvel, amely megszabja, hogy a Visual C# hogyan rtkeli ki az sszetett kifejezseket (egyenls geket). Miucn megrtettk a mveletek kirtkdsi sorrendjt, megtanuljuk, hogyan vgezhetnk egyenlsgvizsglatot -ami olyasmi, amire rnindig szksgnk lesz. A dntsi szerkezetekben a Visual C# az gynevezett Boole-fle logika szerint rtkeli ki a kifejezseket. Ha korbban mg sohasem programoztunk, a Boole-fle logika valsznCleg j fogalom a szmunkra. Ezen az rn elmondjuk, hogy mit kell tudni a Boole-fle logikrl ahhoz, hogy az elvrsaink szerint mkd, hatkony kdot rhassunk, vgl pedig megmutatjuk, hogy mik nt vgezhetnk mveleteket karakterlncokkal, illetve dtumokkal s idpontokkaL

Matematikai alapmt1veletek a Visual C#-ban


A programozshoz biztos matematikai tuds szksgeltetik. A Visual C#-alkalrnazsok rsakor sokszor kell matematikai alapmveleteket vgeznnk, s egy adott szmts sorn csak akkor kapjuk meg a vrt eredmnyt, ha tudjuk, hogy melyik mveleti jelet kell hasznlnunk az adott mvelethez, s rtjk s helyesen alkalmazzuk a mveletek kirtkdsi sorrendjt.

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);

Ez a kd a c_FirstValue s a c_SecondValue lland sszegt rja ki, ami esetnkben 9.

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);

266 1111. rsz HOllUk mllkdsbe a dolgokat: programozs

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

Eredmny: Eredmny : Eredmny: Eredmny :

O l 3.4 3.6

Az els kt utasts viszonylag knnyen

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.

A mllveletek k.irtkelsi sorrendjnek meghatrozsa


Amikor egy egyenieten bell tbb matematikai mvelet szerepel (ezt kifejezsnek hvjuk), a Visual C#-nek fel kell oldania a kifejezs rszeit. A kirtkels vagy vgrehajts sorrendjt a mtveletek elsbbsgi sorrendjnek is nevezzk. Ahhoz, hogy teljesen megrtsk a mtveletek elsobsgi sorrendjt, nmileg fel kell frisstennk az algebrai ismereteinket. (A programokban a legtbb matematikai mvelet algebrai jelleg).

Vegyk az albbi kifejezst:


Debug .WriteLine(6 + 4 * 5);

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

A megjelentett vgeredmny gy 50 lenne. Most lssuk ugyanezt az egyenletet gy,

hogy a szorzst az sszeads eltt hajtjuk vgre:


Els lps: 4 5 = 20 Msodik lps: 20 + 6 26

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.

268 1111. rsz Hozzuk mt1kdsbe a dolgokat programozs


Minden sszehasonlt m"velet, mint a> (nagyobb, mint), a< (kisebb, mint) s az == (amelyeket a kvetkez rszben trgyalunk) egyenrang. Az egyenrang mveletek kirtkelse balrl jobbra trtnik. Vegytik szre, hogy a szorzs s az oszts szintn egyenrang, teht az olyan kifejezsek, amelyekben mindkett6 szerepel, szintn balrl jobbra rtkel6dnek ki. Ugyanez igaz az sszeadsra s a kivonsra is. Ha egy kifejezs tbb kategriba tartoz (szmtani, sszehasonlt vagy logikai) mveleteket is tartalmaz, el6szr a szmtani mt1veletekre, majd az sszehasonlt mveletekre, vgl pedig a logikai mveletekre kerl sor.
A paprra felrt egyenletekhez hasonlan a mt1veletek sorrendje zrjelezssei fellb-

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

rtkeli ki ezt az egyenletet:


Debug .Wri teLine((6 * 5) +4) ;
Elszr a szorzs, majd az sszeads vgrehajtsra kerl sor. Ha az sszeadst a szorzs eltt szecetnnk elvgezni, akkor az utastst gy kell felrnunk

Debug .WriteLine(6 * (5 + 4));

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!)

12. 6ra Mllveletek szmokkal, karakterincokkal, dtumokkal s


Ha ez Visual C# kd lenne, a Visual C# kirtkeln az if felttelt, ami jelen esetben a dogs bark, s amennyiben az llts igaznak bizonyul, vgrehajtan a kifejezst kvet kdot. Mivel a Irutyk ugatnak, mosolyognunk kell. Figyeljk meg, hogy a kt dolog (a Irutyk ugatsa s a mosolygsunk) lnyegben fggetlen egymstl, de ez nem szrnt - a lnyeg az, hogy ha a felttel kirtkelse t ru e rtket ad, bizonyos mveletek (utastsok) vgrehajtdnak. A dntsi elgazsokban gyakran hasonltjuk egy vltoz rtkt egy msik vltozhoz vagy egy meghatrozott rtkhez. Az albbiakban nhny egyszer< sszehasonltst lthatunk, valamint azt, hogy a Visual C# hogyan rtkeli ki azokat: Debug . 'flri teLine (6 Debug .WriteLine{3 Debug.WriteLine(3 Debug.WriteLine(S
>

3);
4);

>= 3) ; < = 4) ;

ll ll ll ll

Eredmny : Eredmny : Eredmny : Eredmny :

true false true false

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:

If black is a color and wood comes from

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:

If (black is a color) and ( wood comes from trees)

then print "ice erearn ".

A ktrtkG logika szerint minden kifejezs kirtkelse true vagy false rtket ad, ezrt ha behelyettestjk a kapott rtkeket a kifejezsek helyre, a kvetkezt kapjuk:

If (True) and (True) then print " ice erearn ".

270 lll. rsz Hozzuk makdsbe a


A vilgossg kedvrt lssuk ugyanezt a mondatot gy is, hogy a vgs kirtkelend kifejezst zrjelek kz tesszk:

If (True And True) then print "iee erearn ".


Itt kapnakszerepeta logikai mGveletek. Az And(&) mGvelet akkor ad vissza true rtket, ha a mveleti jel kt oldaln tallhat kifejezsek egyarnt igaznak bizonyulnak (a logikai mGveletek teljes Hstjt a 12.2. tblzatban lthatjuk). A fenti mondatban az And miveleti jel mindkt oldaln igazat eredmnyez a kifejezs, ezrt az eredmny true lesz. Ha ezt a true rtket behelyettestjk a kifejezsbe, a kvetkezt kapjuk:

If True then print " iee erearn ".


Ez azt eredmnyezi, hogy az iee erearn szavak kirdnak a kpernyre. Ha a kifejezs kirtkelse false rtket adna, semmi nem jelenne meg. Amint azt a 13. rn ltni fogjuk, a dntsi szerkezetekben szerepl kifejezsek mindig vagy true, vagy false rtket eredmnyeznek, s ennek fggvnyben hajtjk vgre a megadott utastsokat.

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

Az And (&) mvelet hasznlata


Az And(&) mivelet segtsgvellogikai sszeadst hajthatunk vgre (logikai ,.s"). Ha a miveleti jel kt oldaln szerepl mindkt kifejezs true, az And(&) mGvelet true rtket ad vissza, ha viszont valamelyik kifejezs hamis, akkor az And mGvelet eredmnye is false lesz, amint azt az albbi pldk is szemlltetik:
Debug .WriteLine(true & true); Debug.WriteLine(true & false); Debug.WriteLine(false & true) ; Debug.WriteLine(false & false); Debug.WriteLine((32 > 4) & (6

--

6));

ll ll ll ll ll

Eredmny: Eredmny : Eredmny : Eredmny : Eredmny :

true false false false true

dtumokkal s

A Not (l) mfivelet hasznlata


A Not C!) mvelet Jogikai tagadst hajt vgre, vagyis a megadott kifejezssel ellenttes rtkkel tr vissza. Figyeljk meg az albbi pldkat:
Debug.WriteLine(! Debug.WriteLine(! Debug.WriteLine(! Debug.WriteLine(! (true) l; (false)); (5 -- 5)); (4 < 2) l:

ll Eredmny: false ll Eredmny: true


l l Eredmny: false l l Eredmny : true

Az els kt utasts egyszer: a true rtk ellentettje a false, s fordtva. A harmadik

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

az albbi pldk szemlltetik:


Debug.WriteLine(true l true); Debug.WriteLine(true l false); Debug.WriteLine(false l true); Debug.WriteLine(false l false) ; Debug.WriteLine((32 <4) l (6:= 6));

ll ll ll ll ll

Eredmny: Eredmny: Eredmny: Eredmny: Eredmny:

true true true false true

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,

hogy megfigyeljk, hogyan mkdik mindez:

212 1111. rsz HOllUk mrutdsbe a dolgokat programozs


Debug . \-Iri teLine (true " true); Debug . \-Iri teLine (true " false) ; Debug. viriteLine (false " true) ; Debug.WriteLine(false " false) ; Debug.WriteLine((32 < 4) " (6

6));

ll ll ll ll ll

Eredmny : Eredmny: Eredmny: Eredmny: Eredmny:

false true true false true

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. ");

Ez az utasts az albbi szveget rja ki:


This isa test.

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!

Az alapvet6 karakter1nc-kezel6 tagfggvnyek s karakterlnc-tulajdonsgok hasznlata


A Visual C# szmos olyan fggvnyt tartalmaz, amelyek jelentsen megknnytik a karakterlncokkal val munkt. Ezek a fggvnyek lehetv teszik, hogy egyszeren kiolvassunk egy szvegrszletet egy karakterlncbl, megszmoljuk, hogy egy karakterlnc hny karakterbl ll, st akr azt is, hogy megllaptsuk, hogy egy karakterlnc tartalmaz-e egy msikat. Az albbiakban sszefoglaljuk az alapvet karakterlnc-kezel fggvnyeket.

A karakterek szmnak meghatrozsa a Length tulajdonsg segftsgvel


A karakterlnc-objektumok Length tulajdonsga a vltoz hosszt adja meg. Az albbi utasts 2 6-ot r ki, ami a "Pink Floyd reigns supreme. " karakterlnc teljes karakterszma. Emlkezznk vissza, hogy a karakterlncokat krlvev idzjelek azt jelentik a Visual C# szmra, hogy literlrl van sz, az idzjelek teht nem rszei a karaktertncnak. Debug.WriteLi ne(("Pink Floyd reigns supreme . ").Length); //Eredmny : 26

Szvegrsz kiolvassa karaktertncbl a Substring() tagfggvny segftsgvel


A Substring (l tagfggvny egy karakterlnc egy rszlett adja vissza. A tagfggvnyt a kvetkez paramterekkel hasznlhatjuk: public string Substring(kezdet ,karakterek_ szma) ; A kvetkez utasts pldul a Queen szt rja a kpemyre, vagyis a karakterlnc els t karaktert: Debug .Writ eLine ( ( "Queen to Queen ' s Level Three . "). Substring (O , 5});

274 1111. rsz Hozzuk ndtdsbe 8 dolgokat: programozs


A pldban a Substring () -nek a O s az 5 argumentumokat adtuk t. A O azt mondja, hogy a Itiolvasst a karakterlnc O. karaktertl (azaz a karakterlnc elejtl) szeretnnk kezdeni, az 5 pedig a hosszt, vagyis azt adja meg, hogy hny karaktert szeretnnk kiolvasni. A Substring () tagfggvnyt gyakran hasznljk egytt az IndexOf () tagfggvnnyel (amelyet hamarosan rszletesebben is trgyalunk), hogy kinyerjenek egy elrsi utat egy olyan vltozbl, amely egy fjlnv s egy tvonal egyttest tartalmazza (pldul c : \Myfile . txt). Ha tudjuk, hogy hol tallhat a \ karakter, a Substring () segtsgvel megkaphatjuk az elrsi utat. Ha a kiolvasand karakterek szma nagyobb annl, mint ahny karakter a karakterlncban tallhat, kivtel (hiba) lp feL Ha nem ismerjk pontosan a karakterlncban tallhat karakterek szmt, hasznljuk a Length tulajdonsgot ennek kidertsre. (A kivtelkezelssei a 15. rn foglalkozunk rszletesebben.)

Karakterlnc el6fordulsnak vizsglata msik karakterlncban az lndexOf() tagfggvny segftsgvel


Idnknt szksgnk van r, hogy megvizsgljuk, hogy egy karakterlnc tartalmaz-e egy msikat. Tegyk fel pldul, hogy a felhasznlinknak lehetv tettk, hogy egy szvegmezben a teljes nevket adjk meg, de a nevet szt szeretnnk vlasztani kereszt- s vezetknvre, mieltt egy adatbzis egyes mezibe mentennk azokat. Ezt a legegyszerubben gy tehetjk meg, hogy a karakterlncban megkeressk azt a szkzt, amely a keresztnevet s a vezetknevet elvlasztja egymstl. Egy ciklus segtsgvel egyesvel is megvizsglhatnnk a karakterlnc elemeit, amg meg nem talljuk a szkzt, de a Visual C# tartalmaz egy karakterlnc-kezel tagfggvnyt, amellyel ez gyorsabban s egyszeruben elvgezhet, mintha magunk csinlnnk: ez az IndexOf () tagfggvny, amelynek utastsformja alapesetben a kvetkez:

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) ;

12. 6ra Mtlveletek szmokkal, karalcter1ncokkal, dtumokkal s


Az albbi kd egy a "Monte Sothinann szveget tartalmaz vltozban keres. Meghatrozzaaszkz helyt, majd a Substring () tagfggvny s a Length tulajdonsg segtsgvel a keresztnevet s a vezetknevet nll vltozkba helyezi: s tri ng strFullNarne - "Monte Sothmann "; s t ring strFirstNarne, strLas t Narne ; int int Location, i ntLength ; intLength = strFullName . Length; intLocation = strFullName .IndexOf( " " ) ; s trFirstN arne = str FullN arne .Substring (O, in tLocat ion); st r Las t Name = strFu l lNarne . Substring(intLocation + l ) ; A fenti kd felttelezi, hogy a szvegben van szkz, s az nem az els vagy az utols karakter a karakterlncban. Az alkalmazsainkban azonban ennl megbzhatbb kdokat kell hasznlnunk, pldul ellenriznnk kell, hogy az Indexof ( ) ltal visszaadott rtk nem -l, ami azt jelenten, hogy az adott karakterlncban nem tallhat szkz. A fenti kd lefutsakor az IndexOf (l 5-t ad vissza az els szkz helyeknt (ne feledjk, hogy az els karaktert a O s nem az l jelenti). Figyeljk meg, a Substring (l hasznlatakor egy karaktert levontunk, amikor belltottuk a s trLastNarne kezd6rtkt, hogy figyelembe vegyk a szkzt.

Sz6kzk eltvolftsa karakterlncok elejr61 s vgr61


Amikor karakterlncokkal dolgozunk, gyakran tallkozunk olyan helyzenel, arnikor egy karakterlnc elejn vagy vgn szkz tallhat. A .NET-keretrendszer az albbi ngy tagfggvnyt biztostja az ilyen szkzk automatikus eltvoltsra:
Tagfggvny String . Tr im () String. TrimEnd {) String. TrirnStart (} String. Rernove ( ) Lers Aszkzket a karakterlnc elejrl s vgrl is eltvoltja. Aszkzket a karakterlnc vgrl tvoltja el. Aszkzket a karakterlnc elejrl tvoltja el. Megadon szm karaktert tvolt el a karakterlnc adott pozcijtl szmtva.

Szvegrszletek cserje karaktertncokban


Nem ritka, hogy egy karakterlncban egy szvegrszt egy msik szvegre kell kicserlnnk. Vannak pldul, akik mg mindig kt szkzt tesznek a mondatok vgre, pedig ez a mcetezhet bettpusok miatt tbb mr nem szksges. A ketts szkzket egy ciklus s az eddig megismert karakterlnc-kezel fggvnyek segtsgvel is egyetlen

276 1111. rsz Homlk rnt1kdsbe a dolgokat: programozs


szkzre cserlhetjk, de ltezik egyszerbb mdszer is: a String osztly Replace () tagfggvnynek hasznlata. A Replace () tagfggvny meghvsnak utastsformja alapesetben a kvetkez:
Karakterlnc_objektum.Replace(keresett_sz6veg, csereszveg);

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.

Dtumok s id6pontok kezelse


A dtumok klns szerzetek: bizonyos szempontbl karakterlncknt viselkednek, pldul amikor sszefa'zzk vagy rszekre bontjuk ket, mskor azonban inkbb szmnak tnnek, amelyeket sszeadhatunk vagy kivonhatunk egymsbl. Gyakran hajtunk vgre rajtuk matematikai jelleg mO'veleteket (pldul bizonyos szm napot adunk egy dtumhoz, vagy meghatrozzuk, hogy hny hnap telt el kt dtum kztt) - de erre nem a megszekott matematikai mO'veleteket hasznljuk, hanem kifejezetten a dtumok kezelshez kifejlesztett fggvnyeket alkalmazunk.

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);

Debug.WriteLine(dteMyBirthday.ToSLring()); Ez az albbi kimenetet eredmnyezi:


7/22/1969 12 : 00 : 00 AM

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.

Dtumok s id6pontok sszeadsa s Icivonsa


Ahhoz, hogy egy meghatrozott idtartamor (pldul egy. napot vagy hrom hnapot) hozzadjunk egy bizonyos dtumhoz vagy idponthoz, a DateTime osztly tagfggvnyeit hasznljuk. Ezeket a tagfggvnyeket a 12.3. lblzatban soroltuk fel, az MSDN-en lertaknak megfelelen. Ezek a tagfggvnyek nem vltoztatjk meg az adott DateTime vltoz rtkt, hanem egy j DateTime-pldnyt adnak vissza, amelynek rtke a mvelet vgeredmnye.

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.

278 1111. rsz Hozzuk mt1kdsbe a dolgokat: programozs

~t1F

HF

:~;<; ~AP.""'!.;~~,+t?""?-<:~"';:~,~~:':1-ti~~~

..

. ~~~-, ., ,;- "._.".;;~.~.~~o;.

~,

.~

x., . ;;v:';""

'' ,

~.,~-:;
;,J .. ,'.,

...::~"~~~
'-~~~

ii,i;~-t;3_S:~a:~ :i'Q:{J':~-l-4i:J:l.,~,.,hi~~ t~

!):

...,~,:~U:W~.":6<f.tlt:f{~~~ ,;~:u.-."' ._.,,~.,L"-:ko;.;.'~

iJ ~";

,., ,.~,. ;:; ~YL,1,.~L.,'.~;

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

Hat hnapot pldul a dtumhoz:

utastsokkal adhatunk hozz az 7 122!1969

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

tagfggvnyekre s az ltaluk visszaadott dtumo kra


l l Eredmny: 7/2211971

dteMyBirthday . AddYears (2); dteMyBirthday .AddMonths(S) ;

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

Dtumok elemeinek kiolvassa


Nha rendkvl hasznos lehet, ha egy dtumnak csak egy bizonyos elemt ismerjk. Elfordulhat pldul, hogy a felhasznlink megadhatjk a szletsi dtumukat, s mi a szletsi hnap alapjn szeretnnk valamilyen m(veletet vgrehajtani. A dtumok elemeinek kinyersre a DateTime osztly olyan tulajdonsgokat bocst a rendelkezinute, a Second, s gy tovbb. snkre, m int a Month, a Day, a Year, az Hour , a M Az albbikdoka DateTime osztly egyes tulajdo nsgainak kiolvasst szemllte tik (a pldnyhoz rendelt dtum a 7/22/ 1969): intResult = dteMyBirthday .Month ; i ntResu1 t = dteMyBirthday.Day ; i nt Resu1t = dteMyBirthday .DayOfWeek;
l l Eredmny : 7 l l Eredmny : 22 l l Eredmny: Tuesday

Az Hour tulajdonsg az rt katonai formtumban adja meg. Arra is gyeljnk, hogy a D ayofweek () tagfggvny egy felsorolt rtket ad vissza.

Dtumok s id6pontok fonnlsa


Ahogy korbban emltettk, a DateTime vltozk rtkb61 nha csak a dtumra, mskor pedig csak az idpontra van szksgnk. Ezen kvl valsznleg meg szecetnnk hatrozni a dtumok s idpontok megjelensi formjt is. Az ilyen s ehhez hasonl roaveleteket a DateTime osztlyban az albbiak szerint valsthatjuk meg: A DateTim e tagfggvnyeinek segtsgvel formzott karakterlncokat lltunk el. Szabvnyosan formzott karakterlncokat hasznlunk. Egyedi formzs karakterlncokat hasznlunk. Kptelensg itt bemutatni minden lehetsget, ami a Dat eTime rtkek formzshoz kapcsoldik, de azt fontos tudnunk, hogy miknt formzhatjuk a kimenetet gy, hogy egy Dat eTime vltoznak csak a dtum vagy csak az idpont rszt kapjuk meg.
Az albbikdoka Dat eTime osztlyban elrhet alapsziuta formzsi tagfggvnyeket mutatjk be (a pldny dtuma tovbbra is 7/ 22/1969 12:00:00 AM.):

dteMyBirthday. ToLongDateString(); dteMyBirthday . ToShortDateString(); dteM yBirthday.ToLongTimeString () ; dteMyBirthday.ToShortTi m eString();

ll ll ll ll

Eredmny : Eredmny : Eredmny: Eredmny:

Tuesday , July 22 , 1969


712211969 12 : 00 : 00 AM 12 :0 0 AM

A rendszerdtum s a rendszerid6 kiolvassa


A Visual C# lehet6v teszi az aktulis rendszerdtum s rendszerid lekrdezst is. Ezt szintn a DateTime osztly segtsgvel tehetjk meg; a Today tulajdonsg pldul e az aktulis rendszerdtumot adja vissza. Ha a rendszerdtumot egy j DateTi m vltozba szerelnnk helyezni, ezt az albbihoz hasonl utastssal tehetjk meg: DateTime dteToday

= 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.

280 lm. rsz Hozzuk mllkdsbe a dolgokat ~

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.

12. ra Mt1veletek szmokkal, knkter1ncokkal, dtumokkal s

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(!).

4. sszefzs (idegen szval "konkatenci").


5. Month.

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.

284 1111. rsz Hozzuk m llk.dsbe a dolgokat programozs


Ezen az rn megtanuljuk ezeknek az elemeknek a hasznlatt, amelyek lehetv teszik, hogy rugalmas, ugyanakkor hatkony dntshozatali kdot ksztsnk. Hasznlatukra j esllyel minden alkalmazs programozsnl szksg lesz, gy mindenkppen rdemes mlyebben megismerni a mtkdsket.

Dntshozatal if...else utastsokkal


A programozs vilgban az egyik legeltetjedtebb dntsi szerkezet az if ... t::hst::, amelynek legegyszenlbb alakja gy fest:
if (kifejezs)

... 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)
{

1 . utasts, amelyet a rendszer akkor hajt vgre,


2.

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:

13. 6ra Dntshozatat VISUal C# kd


Tulajdonsg Name Locat ion rtk txt input
44, 44

3. Helyezznk el az ablakon egy j gombot, dupln kattintva az eszkzkszlet Button ikonjra, s a tulajdonsgait lltsuk be az albbiak szerint:

Tulajdonsg Name Location Size Text

rtk btnlsLessThanHundrcd
156, 42

100, 23 Is text < 100?

Ablakunk tartalma most a 13.1. bra szerint alakul.

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;

Az ltalunk bert kdban a kifejezs helyn ez ll:


int.Parse(txtlnput . Text) < 100

286 1111. rsz Hozzuk mOkdsbe a dolgokat programozs


Ezzel nem tesznk mst, mint megkrdezzk, hogy a szvegmez tartalmnak rtelmezse utn kapott egsz s:cim kisebb-e 100-nl. A Parse az int (egsz s:cim) osztly tagfggvnye, amely a megadott karakterlncot egsz s:cimm alaktja - ezt azutn mr alkalmazhatjuk a szntsainkban. A szvegmez tartalmt teht egsz szmm alaktjuk, majd megvizsgljuk, hogy kisebb-e 100-nl. Ha nagyobb vagy egyenl ezzel az rtkkel, a kifejezs eredmnye fa l se lesz, ha azonban a kapott rtk true, a rendszer tovbblp az i f utn ll utastsra, s kir egy zenetet a kpemyre, mg false eredmnyesetn a program egyszertlen tugorja az if utn kvetkez utastst vagy kdblokkot, kvetkezskppen nem kapunk zenetet Amennyiben a felhasznl resen hagyja a szvegmezt, vagy olyasvalamit fr be, ami nem felel meg egyetlen egsz szmnak sem, a program kivtelt vlt ki. Az ilyesfajta kdokat teht rdemes egy hibakezelbe gyaznunk, vagy - ami taln mg jobb - eleve megakadlyozni, hogy a felhasznl szmokon kvl brmi mst berhasson. A kivtelkezelsrl bvebben a 15. ra anyagban olvashatunk.

Kd vgrehajtsa a kifejezs false rtke esetn


Ha abban az esetben is meg szeretnnk hatrozni, hogy milyen kdot hajtson vgre a programunk, ha a kifejezs rtke false, az else kulcsszval rhetnk clt, valahogy gy: if (kifejezs) utasits, amelyet ha a kifejezs else utasits , amelyet ha a kifejezs a rendszer akkor hajt vgre , rtke true; a rendszer akkor hajt vgre, rtke false ;

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;

13. ra D6ntshozatal Visual C# kd


Nzzk, mi trtnik a fenti kd futtatsakor! Ha a felhasznl egy l~nl kisebb egsz szmot ad meg, a kpernyn a The text entered is less than 100 (A bert szm 100nl kisebb) zenet jelenik meg, semmi tbb. Amikor ugyanis a Visual C# az e l se lrulcsszval tallkozik, tudomst sem vesz a hozz tartoz utastsokrl - ezek csak akkor lpnek mkdsbe, ha a kifejezs rtke false . Msrszrl, ha a felhasznl egy 100-nl nagyobb vagy azzal egyenl szmot r be, a The text cntered is greaterthan or equal to 100 (A bert szm 100 vagy annl nagyob b) zenetet kapja, semmi mst. Amikor ugyanis a kifejezs rtke false, a program nyomban az else utastsra ugrik. Tegyk most a kvetkezket:

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

nagyobb-e 100-nl (lsd a 13.2. brt).

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.

288 1111. rsz Hozzuk rm1kdsbe a dolgokat: programozs

if. ..else utastsok egymsba gyazsa


Amint a korbbiakban emltettk, az if ... else utastsok egymsba is gyazhatk, gy tovbb finomthatjuk a dntsi gakat. Ha erre van szksgnk, gy jrhatunk el:
i f (kifejezsi) i f ( kifeje z s2 )

else else

Tbb lehet6sg vizsglata a switch utastssal


Elfordulhat, hogy a dntsi helyzet csak igen krlmnyesen kezelhet az if segtsgveL Ilyen helyzet ll el pldul akkor, ha a kifejezsnknek szmos lehetsges eredmnye lehet, nem csak true vagy false. Tegyk fel pldul, hogy a felhasznl foglalkozsa (Prof es r:;i on) szeri nt kvnunk vlasztani bizonyos lehetsgek kzl. Az albbiakban bemutatjuk, hogyan oldhatnnk meg a feladatot az if segtsgvel:

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

13. ra Dntshozatat VISUal C# kd


A det au l t tmb akkor fut le, ha a kifejezs egyik megadott rtket sem veszi fel. A hasznlata nem ktelez.

Lssuk az elz pldnkat ezttal a switch utastssal:


switch (strProfession)
{

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.

Pldaprogram a switch hasznlatra


A kvetkezkben egy pldaprogramot ksztnk, amelyben sszetett kjfejezseket rtkelnk ki egy switch utastsan bell. A programban llatokat jelentnk meg egy kombmlt listban. Ha a felhasznl egy gombra kattillt, az alkalmazs megjelenti a listbl kivlasztott llat (amennyiben van ilyen) lbainak szmt. Hozzunk ltre egy j Windows Application projektet switch Example nven, s tegyk a kvetkezket:
1. Kattintsunk a Forml . cs fjlnvre a Solution Explorerben, majd vlasszuk a helyi

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

lm. rsz Hozzuk mtlkdsbe a dolgokat programozs


2. Helyezznk el egy j kombinlt listt az ablakon, dupln kattintva az eszkzkszlet ComboBox elemre, s a tulajdonsgait lltsuk be az albbiak szerint: Tulajdonsg
Name

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 ~

elem lesz a kombinltlistban

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

kombinlt listt s egy gombot hasznlunk

13. ra Dntshozatal Visual C# kd


Tulajdonsg Name Location Text rtk btnShowLegs
102 , 130

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-

292 1111. rsz HOllUk mt1kdsbe a dolgokat: programozs


hetnk A pldnkban gy jutunk a helyes eredmnyhez. Mi trtnik azonban akkor, ha a Snake (Kgy) blokkjt a Ca t el helyezzk? Nos, gy a felhasznl azt a meglep6 tjkoztatst kapja, hogy a kutynak (Dog) egyetlen lba sincs. A tanulsg az, hogy e mdszer hasznlatnl mg a szoksosnl is kriiltekintbbnek kell lennnk, hogy minden esetben a vrt eredmnyt kapjuk. A program a tovbbi case blokkokat hasonlkppen rtkeli ki. Ha egynl sem tall egyezst, a default rsz MessageBox. Show () hvsa kvetkezik be. Ha nincs egyezs, s a default rszben nem adunk meg semmit, a switch utasts lnyegi kd vgrehajtsa nlkllezruL Lthat, hogy ha j llattal szeretnnk kiegszteni a listt, mindssze egy tovbbi case utastst kell elhelyeznnk a sorban. Futtassuk a programot az F5 billentycrvel, s prbljuk ki az albbiak szerint: 1. Vlasszunk egy llatot a listrl, s kattintsunk a gombra. 2. Szntessk meg a listaelemek kijellst, s kattintsunk ismt a gombra. 3. Ha elkszltnk, vlasszuk a Debug, Stop Debugging menpontot a projekt leJltshoz, majd kattintsunk az eszkzkszlet Save Ali gombjra.

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.

13. ra Dntshozatal Vasual C# kd

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?

294 1111. rsz Hozzuk mOkdsbe a dolgokat: programozs

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.

296 1111. rsz Homdt rm1kdsbe a dolgokat: programozs

Vgrehajts adott szm ismtlsa a for ciklus segtsgvel


A ciklusok legegyszerbb tpusa a for ciklus, amely mr a BASIC nyelv legkorbbi vltozataiban is jelen volt. A for arra utastja a Visual C#-ot, hogy kezdjen el egy ciklust, amelyben egy adott rtknl elindt egy szmllt, majd vgrehajtja a ciklus belsejben lv kdot, a megadott rtkkel nvelve a szmllt, t::s addig folytatva a ciklust, amg el nem ri az ltalunk megadott fels hatrt. Az elemi for ciklusok utastsformja a kvetkez:
for ([e16kszts);
[feltteles_ kifejezs); [mvelet]) utasts

A for ciklus el6ksztse


A for utasts elkszti s el is indtja a ciklust. Az utasts sszetevit a 14.1. tblzatban lthatjuk.

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

nvelse: cildusok 297

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.

A Debug objektum hasznlathoz szksgnk lesz a System. Diagnostics

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;

intecunter <= 100; intCounter ++)

D ebug.WriteLine(inteounter) ; Debug .WriteLine(intCounter-1) ;

Elfordulhat, hogy meg kell szaktanunk a for ciklust, mieltt a felttel hamiss vlna. Ilyenkor a break utastssallphetnk ki a ciklusbL

Pldaprogram for ciklussal


Egy olyan eljrst fogu nk kszteni a for ciklus segtsgve!, amely 100-tl O-ig szmol visszafel, s az ablak tltszsgt a ciklusvltoz rtkre lltja (teht az ablak el fog halvnyul ni).

298 1111. rsz HOllUk mtlkdsbe a dolgokat programozs


Hozzunk ltre egy j, Fading Fonn new Windows-alkalmazst, majd kvessk a lpseket:
kvetkez

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:

Tulajdonsg Name Location Size Text

rtk
btnFadeForm 105 , 113 75 , 23 Fade Form

Az ablaknak most a 14.1. brn lthat mdon kell kinznie.

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.

this . Refresh () ; ll Allitsunk be ks leltetst . System . Threading .Thread . Sleep(200) ;


}

ll Jelenitsk meg ismt az ablakot . this.Opacity = l;

A dblOpacity +-= -o. os kdot a kvetkezkppen is rhattuk volna: dblOpacity -= O. 05.

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

lm . rsz Hozzuk mt1kdsbe a dolgokat programozs

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.

Hatrozatlan szm vgrehajts: a while s a do...while ciklusok


Bizonyos helyzetekben nem tudjuk, hogy egy ciklust hnyszor kell vgrehajtani, mg akkor sem, amikor a ciklus elindul. Megolds lehetne, hogy egy olyan fels hatrral indtunk el egy for ciklust, amelyrl biztosan tudjuk, hogy nagyobb, mint ahnyszor a ciklusnak le kell futnia, majd a ciklusen bell megadunk egy kilpsi felttelt. Ha a felttel igazz vlik, a break utasts segtsgvel kilphetnk a ciklusbL Ez a megkzets azonban nem hatkony, s ltalban nem is kivitelezhet. Amikor ilyen ciklusra van szksgnk, a do ... while ciklust kell alkalmaznunk.

A do...while ciklus ltrehozsa


A do ... while ciklus alapformja a
kvetkez:

do utastts whll e ( felt teles_kifejezs);

Ha tbb utastst kell vgrehajtanunk, a kvetkez utastsformt kell kvetnnk:


do
{

[Utastsok]

while Cfeltteles_ kifejezs);

A do ...while ciklus befejezse


A do ... while vgtelen ciklus, ha nincs valamifle kilpsi pont vagy meghatrozott felttel. A legelemibb formjban nincs semmi jelen, ami megmondan a ciklusnak, hogy a program vgrehajtst hnyszor kell ismtelni. Idnknt sZksgnk lehet vgtelen ciklusra (pldul jtkprogramozsnl), de legtbbszr ki kell lpnnk, ha bizonyos felttelek teljeslnek. A for ciklushoz hasonlan a do ... while ciklusbl is brmikor kilphetnk a break utasts segtsgve!. A do ... whi le ciklust pldul a kvetkezkppen bvthetjk ki a break utastssal:
do
{

Utastsok if (feltteles_kifejezs)
break;

whi le (x==x);

302 1111. rsz HOlZUk mllkdsbe a dolgokat: programozs


Ebben a kdrszletben a ciklus addig hajtdik vgre, amig a feltteles_kifejezs igaz. ltalnossgban a feltteles_ kifejezs egy a ciklusen bell mdosul vltozn alapul. Nyilvnval mdon, ha a fel tteles_kifejezs soha nem vltozik, a ciklus soha nem r vget. A while ciklus msik fajtja a while ... do ciklus. A kvetkez egy egyszer wh ile ... do ciklus:
while (feltteles_kifejezs) utasits

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.

Pldaprogram do...while ciklussat


A kvetkezkben ltni fogunk egy pldt a do ... while ciklusra. Ezzel a programmal az els610 darab, 3-mal oszthat szmot fogjuk megkeresni. Br tudjuk, hogy 10 szmot keresnk, nem tudjuk, hogy hnyszor kell a felttelt kirtkelnnk, ezrt a do ... while a legjobb vlaszts. Hozzunk ltre egy j, No Remainders nev Windows-alkalmazst, majd kvessk a kvetkez lpseket:
1. Az egr jobb gombjval kattintsunk a Forml. cs elemre a Solution Explorerben, majd vltoztassuk az alaprtelmezett nevet NoRemaindersform.cs-re. Ezt kveten lltsuk a Text tulajdonsgot No Remainders rtkre. 2. Adjunk egy gombot az ablakhoz, s adjuk a tulajdonsgainak a kvetkez rtkeket:

Tulajdonsg
Name Location Size Text

rtk
btnFind.Numbers
82' 39 120, 23

Find Numbers

3. Adjunk egy ListBox vezrlt is az ablakhoz s lltsuk a kvetkez{) rtkekre a tulajdonsgait:


Tulajdonsg
Name Location Size

rtk
lstResults
82, 68 120, 160

Az ablakunknak most a 14.3. brn lthat mdon kell kinznie.

14.3. bra
Ltezhet egy listameznl jobb vezrl az eredmnyek listjnak rnegjelentshez?

Kattintsunk dupln az j gombunkra, hogy hozzfrjnk a Cl i ck esemnyhez, s rjuk be a kvetkez kdrszletet:


int intSeek = l; int intFound = O; do
{

if ((intSeek% 3) ==0)
{

lstResults.Items.Add( intSeek.ToString()); intFound++; intSeek++; while (intFound


<

10);

304 (111. rsz HOlllik mQkdsbe a dolgokat: programozs


Ezt a kdot is knnyebben megrthetjk, ha a rszeire bontjuk:
Az els kt utasts csak egy pr egsz szm tpus vltozt hoz ltre.
Az intSeek vltoz az a szm, amelyikrl eldntjk, hogy maradk nlkl

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

nvelse: ciklusok 305

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

feladatra tbb megolds is ltezhet. Gyakran az egyik megkzelts fellmlja az sszes


tbbit, csak lehet, hogy nem mindig talljuk meg a legalkalmasabbat Mskor az egyik megkzelts csak kevssel jobb a tbbin!, vagy tbb megolds akr egyformn is alkalmas lehet. A gyakorlott programozk brmely problmra kpesek kvetkezetesen a legjobb megoldst megtallni. Idvel mi is kpesek lesznk erre.

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.

306 1111. rsz HOlllik IT141kdsbe a dolgokat: programozs

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.

308 1111. rsz Hozzuk mllkdsbe a dolgokat: programozs


Mieltt

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

3. Kattintsunk dupln az eszkztr Button elemre, amivel j gombot adunk

az ablakhoz, s lltsuk a tulajdonsgait a


Tulajdonsg

kvetkez

rtkekre:

Name
Location Size Text

rtk btnPerformDivision
79' 139 120 ' 23

Perform Division

Az ablakunknak most a 15.1. brhoz hasonlnak kell kinznie.

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.

------------------------~

15. ra Hibakeress 309

Megjegyzs hozzffizse a kdhoz


Az egyik legegyszeru"bb mdja annak, hogy mr rgtn az elejtl cskkentsk a hibk szmt, s knnyebben meg tudjuk keresni a hibkat, ha megjegyzseket fznk a kdhoz. A kdban elhelyezett megjegyzs egy egyszer egysoros szveg, amirl a Visual C# tudja, hogy nem valdi programkd, ezrt figyelmen kvl hagyja. Amikor a programot lefordtjuk, hogy hordozhat sszetevv alaktsuk, a megjegyzsek elklnlnek a kdtl, gy nem befolysoljk a teljestmnyt. A megjegyzsek a Visual Ctt kdablakban zld sznnel jelennek meg, ami olvashatbb s knnyebben megrthetv teszi az eljrsokat. rdemes az eljrsok elejn olyan megjegyzseket elhelyezni, amelyek lerjk az eljrs rendeltetst. Ezen kvl az eljrsokon bell sem kell a megjegyzsekkel fukarkodnunk, amelyekben rszletesen szerepel, hogy mi trtnik a programkdban.
A megjegyzseket emberek s nem szmtgpek olvassk, ezrt trekedjnk arra, hogy a megjegyzseink rthetek legyenek. Jegyezzk meg, hogy egy nehezen rthet megjegyzs nem sokkal jobb, mintha egyltaln nem is lenne. Arra is emlkezznk, hogy a megjegyzsek a dokumentls egyik formjt kpviselik. Mint ahogyan egy alkalmazshoz ksztett dokumentcinak is vilgosnak kell lennie, gy a megjegyzseknek is a helyes dokumentlsi elveket kell kvetnik.

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 .

Megjegyzseket a kdsor vgre is tehetnk:


i nt intAge ;
l l

A fe lhas znl letkort trolja.

Minden, ami a

perjelektl

jobbra tallhat, megjegyzs (belertve a perjeleket is).

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

lm. rsz Hozzuk mt1kdsbe a dolgokat: programozs


Kattintsunk dupln a Perform Division (Oszts vgrehajtsa) gombra, hogy hozzfrjnk a Cl i c k esemnyhez, s rjuk be a kvetkez kt sornyi kdot (valjban megjegyzst):
l l Ez a z el jrs a t xtinput szvegrnezbe bert l l szmmal el os ztj a a 100- at .

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-

mv alaktja azt. Az ilyen tpus megjegyzseket gyakran hasznljk a program


dokumentcijnak elksztsre. A megjegyzsek XML fjll alaktsa meghaladja knyvnk kereteit, de ha felkeltette az rdekldsnket, malegen ajnlott, hogy belekstoljunk ebbe a tmba.

A kt alapvet6 hiba azonosftsa


A kdban ktfajta hiba fordulhat el: fordtsi hiba s futsidej hiba. A fordtsi hiba a programrs kzben elkvetett hibt jelenti, ami miatt a Visual C# nem tudja feldolgozni a kdot. A Visual C# nem fordtja le a fordtsi hibt tartalmaz kdot. Pldul egy olyan utasts, amely helytelen paramterekkel hv meg egy eljrst, fordtsi hibt eredmnyez. A futsidej hibk nem fordts kzben jelentkeznek, hanem amikor a programot elindtjuk. Az ilyen tpus hibk akkor fordulnak el, ha egy vltozn rvnytelen mveletet akarunk vgrehajtani. Ennek szemlltetsre nzzk meg a eredmnyezni: i ntResu1t = 10
l
kvetkez

kdot, amely nem fog fordtsi hibt

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

15. ra Hibakeress 311


Integer tpus vltoz). Ha az intDenorninator rtke nulla, s gy prbljuk meg a programot lefuttatni, a Visual C# futsidej hibt fog jelezni. A futsidej hibkat kivte/nek is nevezzk, s ilyen esetekben azt mondjuk, hogy a program kivtelt vlt ki (vagyis a Visual C# kivtelt vlt ki, amikor futsideji hibt szlel). Amikor egy program kivtelt vlt ki (.kivtelt dob"), a kd vgrehajtsa lell a hibs utastsnl, s a Visual C# hibazenetet ad. A kivteleket kln kddal kezdhetjk, s gy megelzhetjk, hogy a Visual C# lelltsa a program vgrehajtst, amikor kivtellp fel. Errl az ra ksbbi rszben lesz sz. rjuk a kvetkez parancsokat a Click esemnykezelbe, kzvetlenl a megjegyzs kt sora al:
long lngAnswer; lngAnswer = (100 l ConverL.Toint64(txtlnput.Text); M essageBox .Show ("lOO/" + t xtinput . Text + " is " + lngAnswer}

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

312 1111. rsz Hozzuk mt1kdsbe a dolgokat: programozs


Nyomjuk le az F5 billentyt a program futtatshoz. Amikor elindtjuk, a Visual C# egy zenetet jelent meg, hogy fordtsi hiba trtnt, s megkrdezi, hogy akarjuk-e folytatni az utols sikeresen lefordtott vltozat futtatsvaL Mivel a program nem futna gy, ahogyan kell, nincs rtelme folytatnunk. A kdszerkeszthz val visszatrshez kattintsunk a No (Nem) gombra. A fordtsi hibk nagyon slyosak, mert megakadlyozzk a fordtst s gy a futtatst is. Az ilyen hibkat ki kell javtanunk, mieltt a programot futtathatnnk. A hibalista zenetre dupln kattintva menjnk kzvetlenl a hibs rszhez, s a MessageBox . Show () vghez bert pontosvesszvel javtsuk ki a hibt. Miutn vgrehajtottuk ezt a mdostst, nyomjuk meg az F5-t a program futtatshoz. A Visual C# gy mr nem ad fordtsi hibval kapcsolatos zenetet Megkerestnk s kijaVitotrunk egy hibt! Ha most a Perform Division gombra kattintunk, mg egy hibazenetet kapunk (lsd a 15.3. brt).

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.

15. ra Hibakeress 313

A Visual C# hibakeres6 eszkzeinek hasmlata


A Visual C# egy sor hibakeres6 eszkzt tartalmaz, amelyek segtenek megkeresni s kikszblni a hibkat. A kvetkez6kben megtanuljuk, hogyan kell a trspontokat, az Jmrnediate ablakot s az Error List ablakot hasznlni, vagyis azt a hrom els6dleges eszkzt, amelyek a hibakeress arzenljnak alapjait kpezik. Vannak persze tovbbi eszkzk is, pldul a Watch (Figyel6) s a Loeals (Helyi vltozk) ablak. Ahogy egyre rszletesebben megismerkednk a fejlesztsi lehetsgekkel, fel kell fedeznnk eze::ke::t az eszkzket is.

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):

prlate vo14 btnPctlOt:IIIID.tY11oo CUc k C<*j t cc DCScc,

'

ll n.u
/J
th~

poeote~Ure

4i<w14to too Y

hr~:n:.~t:.g-#1

t)

~c

ftlae e.nt.e red 1.c

'te-lrt boa ";JGlapu~.

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

314 1111. rsz Hom* mtlkdsbe a dolgokat prowamozs


A trspontokat a programmal egytt menthetjk; nem kell minden alkalommal jra belirtani azokat, amikor megnyitjuk a projektet.

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

bt.ntc~foJ:IIDi.rt-.t.OD_Cl io)( oltj tcR

aMckt,. Event:Arg e)

ll Ttu. proeed\6.1'-e. dJ.yidc 100 // ttle Ulrt IICIC tJr1;Jnpc;st..


~ --:

11;1oy

tbe dw.! e n.t:u e;d J.n

l#OiPiitK 100 .l c:ca"~en .'tOZ.U.Mir;nl.!paC".Ten) ~


tM:n-.ot~ .Sbow t tO"O/

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.

15. 6ra Hibakeress 315

Mvelet Billenty Continue Code Execution F5 (Vgrehajts folytatsa) Step lnto (Belps) Fl l

Lers Az adott trsponttl folytatja a vgrehajtst.

Step Over (Atlps)

Step Out (Kilps)

Stop Debugging CHibakeress lellitsa)

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.

Az lmmediate ablak hasznlata


A trspontok nmagukban ltalban nem elgsgesek ahhoz, hogy egy eljrsban minden hibt megkeressnk. Rajtuk kvl a kdban lv hibk feldertsre gyakran fogjuk hasznlni az Immediate ("Azonnali") ablakot is,.amely a Visual Studio egyestett fejlesztkrnyezetnek egyik ablaka, s ltalban egy program futtatsa kzben lthat. Ha nem ltjuk az Immediate ablakot, a megjelentshez vlasszuk a Debug, Windows, Immediate menpontot. Ebbe az abiakba olyan utastsokat rhatunk, amelyeket a Visual C# azonnal rtelmez- innen az elnevezs. Most az lmmediate ablakot alkalmazva fogjuk megkeresni a pldaprogramban szerepl hibt. rjuk be a kvetkezket az Immediate ablakba, majd nyomjuk meg az ENTER billentyt:
? txtinput.Text

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

316 1111. rsz HOllUk rm1kdsbe a dolgokat: programozs


tpus vltozv alaktsa (ami egy 64 bites egsz szm tpus). A Convert . Toint64 () tagfggvny adat tadst vrja, de a szvegmezben nincs semmilyen adat (a Text tulajdonsg csak egy res karakterlncot tartalmaz). Ennek megfelelen formtumkivtel trtnik, mert a Convert . To Int 64<) nem tudja, hogyan alaktson t egy res karakterlncot szmm. A hiba megelzse rdekben tehetnk nhny lpst. A legnyilvnvalbb, hogy biztostjuk, hogy a szvegmez tartalmazzon valamilyen rtket, illieltt a Convert . Toint64 () tagfggvnyt megprbljuk alkalmazni Most ezt fogjuk megvalstani. A Visual C# most mr tmogatja, hogy menet kzben szerkesszk a kdot (ez olyasmi, ami a .NET korbbi vltozataibl nagyon hinyzott), ami azt jelenti, hogy a kdot hibakeress kzben is mdosthatjuk. Most mr nem sZksges a programot lelltani, hogy a vltoztatsokat vgrehajtsuk, s utna jra elindtani, hogy a vltoztatsokat
ellenrizZk.

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

15. ra Hibakeress 317


Emlksznk mg a srga nylra, ami a kvetkezknt vgrehajtand utastst mutatja? Most azt mutatja, hogy ha folytatjuk a vgrehajtst, akkor az a parancs, amelyik a kivtelt kivltotta, mg egyszer lefut Mi azonban az j utastst akarjuk vgrehajtani, ezrt hajtsuk vgre a kvetkez lpseket, hogy az j kdrszlet legyen a kvetkezknt vgrehajtand parancs:
1. Kattintsunk a srga nylra, s tartsuk lenyomva az egr gombjt. 2. Hzzuk a nyilat az i t utas~shoz.

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.
'

318 1111. rsz Hozzuk rnQkdsbe a dolgokat programozs

.. l~.,.O...I ' l!lo.u

. .....
~

St.dilreu llll"9ff> ..

-
.

..... .....

........ *"" ..

I'IOt 11"1. COftd: forrrwt..

".....-.-,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

Az Output ablak hasznlata


A Visual C# az Output (Kimenet) ablakot h asznlja az llapotzenetek s a fordtsi

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.

15. ra Hibakeress 319

~ov ~

a....u.,b ....had .... ' tKt.N4111dJ: t..o.M.cf 'C:\Wl.Gdow\. . a. . .l)'\CiiC_U\a.c:orUh\J.O.O.O_W''t.&Dt

l..,..b,..,..bon , .,.. ,,_....,...., : Loect.d.


tlk69Ml: t.oaM4
t~; ttk~:

'C :\lJt.OOOU\u..-lV\.Q.C_NJU.\Kltl-o...". . VU\lau~ c:"'.t..daw\..,l)'\tl.tJIIU\8,..~ ~~-rou.\2.,

~ l.a~.wbO*R . e.u ~ ~ . ...- . . . . . . 'o.toa9~ l.a.upl& .~-. .._ ~ ~ ~18f'

~ 'C:\Wlactlow\-...-.l.y\Uoe_an.\.lru~2.o . o.o_~,7h&

......,_.,: ~ 'C;\U.....\u..-ly'\liiiC_-:tt.~.._ ~~-O.o o_

. ...-n ....

t.o..M4

'C;~......WY\Ga.e_..O.\I.e'a~-'"--&l.SfUill1o.t

~.t.. &a-.,1& ..-...aM' t ~ : ~ 'C:\U..OW.~y\t;X--a.\M::l.tn"~.~...U...S'

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.

O.~i.... 1---.J.e,-nbon,eH' tllla-..cU: t.oacJ.H c:\JIJ.odou~..-lr\c:AI!:}.an.""._ *l .J.J..etW\a.s:O oj.,..

"'"''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) ;

Akrmit is helyeznk a WriteLine () tagfggvny zrjelei kz, az megjelenik

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);

A WriteLine () tagfggvnnyel ellenrzpontokat is ltrehozhatunk a kdban:

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

lm .rsz Hozzuk mkdsbe a dolgokat programozs

Hibakezel6 ltrehozsa a Try...Catch...Finally segtsgvel


Hasznos lehet, hogy a Visual C# meglltja a vgrehajtst, amikor kivtellp fel. Ha a program a fejlesztkrnyezeten bell fut, s hiba miatt lell, egy hibazenetet kapunk, s megtekinthetjk a hibs kdsort. Ezzel szemben ha a programot mr lefordtottuk, s gy futtatjuk, a nem kezelt kivtel eiuatt a program lell (kilp). Ez a legkevsb kvnatos dolgok egyike, amit egy program mllvelhet. Szerencsre megelzhetjk a kivteleket, amelyek meglltjk a kd vgrehajtst (s lelltjk a lefordtott programot), ha a kdot kifejezetten gy tervezzk meg, hogy kpes legyen kezelni azokat. A kdban elhelyezett kivtelkezels tba igaztja a Visual C#-ot, hogy mit kezdjen egy kivtellel ahelyett, hogy a Visual C# alaprtelmezen viselkedsre hagyatkoznnk, ami a program azonnali lellst jelenti. A Visual C# t ry blokkok formjban tmogatja a strukturlt kivte/kezelst, ami a hibakezels formlis mdja. A strukturlt hibakezel kdok megrsa eleime bonyolultnak tllnhet, de mint a legtbb programozsi eljrst, ezt is akkor rtjk meg, ha alkalmazzuk. Hozzunk ltre egy j, Structured Exception Handling az albbi lpseket a program felptshez:
nev

Windows-alkalmazst, s kvessk

1. Az egr jobb gombjval kattintsunk a Forml . cs-re a Solution Explorerben, majd

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

3. Kattintsunk dupln a gombra, s rjuk a Cl i ck () esemnybe a kvetkez6 kdot:


try
{

De bug. W riteLine ( "Try); catch (Exception ex)


{

Debug. WriteLine ("Catch" ) ; finally


{

15. ra Hibakeress 321

Debug . Write~ine(" F inally" ) ;

Debug. W r i t eLine (" Done Try i ng );

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

A try s.zcrleezet reszei

lefrs
A try szakaszba azt a kdrszletet tesszk, amely kivtelt vlthat ki. A try szakaszban az eljrs egszt, de nhny sort is elhelyezhetnk.

catch fina lly

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.

A try utasitsnak hrom formja lehetsges:


A t ry blokk utn egy vagy tbb cat ch blokk kvetkezik. A try blokk utn a finally blokk kvetkezik. A t ry blokk utn egy vagy tbb catch blokk, vgl a fi nally blokk
kvetkemek.

A program futtatshoz nyomjuk meg az FS-t, majd kattintsunk a gombra. Ez utn


nzzk meg az Output ablakot, amelynek tbbek kztt a kvetkez sorokat kell tartalmaznia:
Try

Finally
D one Tryi ng

322 1111. rsz HolZUk mt1kdsbe a dolgokat programozs


A futs sorn ez trtnik:

1. Elindul a try blokk, s vgrehajtdik a try szakaszban lv kd.


2. A catch szakaszok a kivtelek elfogsra hivatottak. Mivel nem trtnik kivtel,

3. Amikor a try szakaszban

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.

A Debug menbl vlasszuk a Stop Debugging pontot, s lltsuk le a programot.

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:

long logNumerator = 10; long lngDenominator = O; long lngResult; try


{

Debug.WriteLine( "Try ") ; lngResult = logNumerator catch


{

lngDenominator ;

Debug .WriteLine("Catch"); finally


{

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

15. 6ra Hibakeress 323


Vegyk szre, hogy ez alkalommal a catch szakaszon belli kd hajtdik vgre. Ennek az az oka, hogy az az utasts, amelyik az lngResult vltozt belltja, DivideByZero kivtelt okoz. Ha ezt az utastst nem tettk volna try blokkba, a ViSual C# kivtelt vltott volna ki, s egy hibazenet jelent volna meg. Mivel azonban az utastst egy try blokkban helyeztk el, a kivtelt elfogtu.k Az elfogs vagy eikaps azt jelenti, hogy amikor kivtellp fel, a Visual C# a catch szakaszhoz irnytja a vgrehajtst. (Nem kell felttlenl catch szakaszt hasznlnunk; ha kihagyjuk, az elfogott kivteleket a program egyszertlen figyelmen kvl hagyja.) Figyeljk meg azt is, hogy a f inally szakaszon belli kd a catch szakaszban lv utn hajtdik vgre, s jegyezzk meg, hogy a finally szakaszban lv kd mindig vgrehajtdik, fggetlenl attl, hogy fellpett-e kivtel.

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 )
(

Debug . WriteLine ("Catch ); MessageBox.Show("An error has occurred :

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

324 lll. rsz HOllUk mtlkdsbe a

A vrhat kivtelek kezelse


Vannak olyan esetek, amikor szmthatunk bizonyos kivtelekre. Pldul lehet, hogy egy olyan programrszletet runk, amely akkor is megksrel megnyitni egy fjlt, ha az nem ltezik. Ilyen esetben valsznleg azt szeretnnk, hogy a program bizonyos m(iveleteket hajtson vgre, amikor ilyen kivtelt kapunk. Ha szmthatunk egy bizonyos kivtelre, kln arra ltrehozhatunk egy catch szakaszt, hogy a kivtelt kezelje. Emlkezznk vissza a korbbiakra, hogy az aktulis kivtelrl a catch utastssal szerezhetnk informcit: catch (Exception objException) Ha a fentihez hasonl, ltalnos Exception vltozt hozunk ltre, a catch az sszes olyan kivtelt elkapja, amelyet a try szakaszban lv utastsok vltottak ki. Ahhoz, hogy egy adott kivtelt el tudjunk kapni, az Exception vltoz adattpust egy meghatrozott kivtelpusra kell vltoztatnunk. Emlksznk mg arra a korbban rt kdunkra, amelyik formtumkivtelt okozott, ha res karakterlncot prbltunk tadni a Convert . Toint64 () tagfggvnynek? Hasznlhattuk volna a try szerkezelet is a kivtel kezelsre, pldul ilyen mdon: long lngAnswer; try
{

lngAnswer - 100 l long. Parse(txt lnput .Text); MessageBox.Show("lOO/" + txtinput.Text + is " + lngAnswer); catch (Systcm.FormatException)
{

MessageBox. Show ("You must enter a number in the text box. ) ;


}

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. ra Hibakeress 325


1. Nyomjuk meg az F5 billentyt a program futtatshoz. 2. Kattintsunk az eszkztr Open Picture gombjra, hogy megjelenjen a Select Picture prbeszdablak. 3. A File Name mezbe rjuk be, hogy ., s nyomjuk le az ENTER billentyt. Ez megvltoztatja a szGrnket, hogy olyan fjlokat is ki tudjunk vlasztani, amelyek nem kpek. Keressnk egy fjlt a merevlemezen, amelyrl tudjuk, hogy nem kp. A . t xt, . i n i vagy . p df kiterjesztssei rendelkez fjlok tkletesek lesznek. 4. Miutn megtalltuk a nem kpi fjlt, egy kan:intssal jelljk ki, majd kattintsunk az Open (Megnyits) gombra. Ezzel egy a 15.10. brn lthat Out of Memory (Nincs elegend memria) kivtelt idznk el. Ezt a kivtelt a kpmez vltja ki, amikor nem kpfjlt prblunk betlteni. Az els gondolatunk persze ez lehet: "Mirt kellene emiatt aggdnom? Senki sem csinlna ilyet!" Nos, Isten hozta a programozs vilgban, kedves Olvas! Rengeteg idt fogunk azzal eltlteni, hogy a felhasznlt megvdjk sajt magtl. Ez nem igazsgos, s nem is szrakoztat, de ez a valsg.

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:

32& 11 11. rsz Hozzuk rmlkdsbe a dolgokat: programozs


try
{

l l A fjlmegnyit prbeszdablak megjelenitse

if (ofdSelcctPicture . ShowOialog()
{

= = DialogResult . OK)

l l Kp betltse a kpmezbe
picShow~icture .Image

= Image . FromFile(ofdSelectPic ture.FileName );

l l Fjlnv megjelenitse az ablak fejlcben

this . Text - string.Concat("Picture Viewer( ofdSelectPicture.FileName + ")"): catch (System.OutOfMemoryException)


{

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.

15. ra Hibakeress 327


Megismerkedtnk a hibk kt alapvet tpusval, a fordtsi s futsidejti hibkkal (kivtelekkel). A fordtsi hibkat knnyebb elhrtani, mert a fordt pontosan megmondja, hogy melyik sor tartalmazza a fordtsi hibt, s ltalban a javtsra vonatkoz hasznos informcikkal is ellt minket. Msrszt viszont a kivtelek miatt sszeomolhat az alkalmazs, ha azokat nem kezeljk megfelel mdon. Megtanultuk, hogy a trspontok s az Immediate ablak segtsgvel hogyan derthetjk fel a kivteleket, valamint lttuk, hogyan lehet az Output ablakban a program futsa kzben szveget kiratni. Vgl azt is megtanultuk, hogy az alkalmazsainkat hogyan tehetjk ellenllv a try szerkezetet alkalmaz strukturlt hibakezelk segtsgve!. Nincs olyan knyv, amely mindent megtantana arrl, hogy miknt lehet hibamentes kdot rni, ez az ra azonban segtett elsajttani azokat az alapvet kszsgeket, amelyek a programokban elfordul klnfle hibk megkeresshez s elhrtshoz szksgesek. Ahogy a programozi tudsunk n, gy fognak a hibakeresshez szksges kpessgeink is fejldni.

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

330 lll. rsz Hozzuk makdsbe a


Nem lehetnk az osztlyok programozsnak mesterei egyetlen ra alatt, de miutn tvettk ezt a leckt, a gyakorlatban is kpesek lesznk osztlyokat ltrehozni s ezekbl az osztlyokbl egyedi objektumokat szrmaztatni. Tekintsk ezt az rt az objektumkzpont programozs eljtknak. Miutn elsajttottuk a knyv anyagt, ersen ajnlott egyb objektumkzpont programozssal foglalkoz rsok utn nzni.

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

Az osztlyokkal trtn programozs filozfija jelentsen eltr a hagyomnyos progra-

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.

. Adatok s programkd egysgbe zrsa osztlyok segftsgvel


Az osztlyokbl szrmaztatott obje~tumok adatokat s programkdot zrnak egysgbe, vagyis az objektumok az ltaluk hasznlt sszes programkdot s adatot magukban foglaljk. Tegyk fel pldul, hogy egy szervezet alkalmazottait kell nyomon kvetnnk, s minden alkalmazottrl sokfle adatot kell trolnunk, pldul a nevet, a munkba lls dtumt, illetve a beosztst. Tegyk fel tovbb, hogy az alkalmazottak felvtelhez s trlshez szksgnk van mg tagfi.iggvnyekre, valamint hogy mindezt a sok adatot s szolgltatst az alkalmazson bell sok eljrs szmra elrhetv akarjuk tenni. Hasznlhatnnk hagyomnyos modulokat is az adatok kezelshez, de valsznleg sok vltoztmbre s hossz programkdra lenne szksgnk ahhoz, hogy kezelni tudjuk ezeket a tmbket.

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.

Pldnytagok s statikus tagok


A 10. rn megtanultuk, hogy a Visual C# csak az osztlyszint tagfggvnyeket tmogatja, az ltalnos (globlis) tagfggvnyeket nem. Statikus tagfggvnyek ltrehozsval olyan tagfggvnyeket alkotunk, amelyekhez magn az osztlyon keresztl, a prograrnon bell brhonnan hozz lehet frni, anlkl, hogy egy objektumot pldnyostanunk kellene az osztlybl. A pldnytagfggvnyek a statikus tagfggvnyekhez hasonlan jelennek meg a Visual C# tervezkmyezetben, s a kdjukat is hasonlan kell megrnunk, az osztlyok viselkedse azonban a futsi id alatt nagyban klnbzik a statikus tagoktL Statikus tagok hasznlata esetn mjnden statikus adatot megosztunk az osztly sszes tagjval, ezen kvl egy statikus osztly adatainak soha nem ltezik tbb pldnya. Ezzel szemben a pldnytagokkal rendelkez osztlyok esetben az objektumokat az osztly pldnyo-

332 1111. rsz Hozzuk mllkdsbe a dolgokat: programozs


stsval hozzuk ltre, s minden objektum sajt adathalmazt kap. A statikus tagfggvnyekhez az osztlyon keresztl, mg a nem statikus tagfggvnyekhez (ezeket lvjuk ms nven pldnytagfggvnyeknek) az osztly pldnyain keresztl frhetnk hozz. A pldnytagfggvnyek nem csak abban klnbznek a statikus tagfggvnyektl, ahogy az adataik visclkednek. Amikor statikus tagfggvnyt hatrozunk meg, az a tbbi osztly szmra azonnal hozzfrhetv vlik az alkalmazson bell, a pldnytagfggvnyek azonban nem rhetk el azonnal a kcion bell. Az osztlyok az objektumok sablonjai. Futs kzben a kdunk nem magval az osztllyai lp kapcsolatba, hanem objektumpldnyokat hoz ltre, amelyeket az osztlybl szrmaztat. Minden objektum gy viselkedik, mint a sajt "osztlymodulja", s gy sajt adathalmazzal rendelkezik. Amikor egy osztlyt kvlrl hozzfrhetv tesznk ms alkalmazsok szmra, az osztly kdjt tartalmaz alkalmazst kiszolglnak hvjuk, azok az alkalmazsok pedig, amelyek az objektumok pldnyait ltrehozzk s hasznljk, az gyfelek. Ha egy osztly pldnyait ugyanabban az alkalmazsban hasznljuk, mint amelyik a kdot tartalmazza, az alkalmazs maga kiszolglknt s gyflknt is viselkedik. Az olyan prograrnkdokra, amelyek egy osztlybl szrmaztatou objektumot pldnyostanak, ezen az rn gyflkd nven hivatkozunk. Kezdjk azzal, hogy ltrehozunk egy j, Class Programming Example nev Windows-alkalmazst, majd kvessk a kvetkez lpseket:
1. Mdostsuk az alaprtelmezett ablak nevt ClassExampleForm.cs-re, s lltsuk a Text tulajdonsgt a kvetkezre: Class Programming Example.

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.

l Vitu..l St\ldo Mt4111td t.,.,.lttn

'

-'"ul""

Apjilkiilon Applicotklft

l1

~
AoMmWy
A......:os

COfl(!p.t... Mlnifhl 1"111 Irlonmli...

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

""'eo'""" u..eo ...ot (WJifJ

il

-...
~

.."!."".....

16.1. bra
Az osztlyokat

~...ii,q..~ ~----------------------~----~

a tbbi objektumfjlhoz hasonlan adjuk a programokhoz

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.

Az objektumok ignybe veszik a rendszer erforrsait. A .NEl-keretrendszer, amelyrl


a 24. rn lesz bvebben sz, egy beptett eljrssal rendelkezik, amelynek a segtsgvel az objektumok ltal lefoglalt erforrsokat fel lehet szabadtani. Ezt a rendszert szemtgyjtnek nevezzk, s szintn a 24. rn trgyaljuk bvebben. Lnyegben a szemtgyjt semmisiti meg az objektumokat, amikor azok mr nincsenek hasznlatban. Amikor a szemtgyjt megsemmist egy objektumot, az objektum destruktor, ms nven megsemmist tagfggvnyt hlvja meg. Ha nem vagyunk elg vatosak a destruktor tagfggvny megvalstsa sorn, problmkat okozhatunk.

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.

334 1111. rsz HOlZlik mclkdsbe a dolgokat programozs


A tulajdonsgokon kvl olyan fggvnyeket is elrhetv tehetnk, mint a Delete (trls) vagy az AddNew (j hozzadsa). A fggvnyek lehetnek egyszetil'ek vagy sszetettek Az Employee objektum Delete fggvnye pldul sszetett lenne, mert mindazokat a miveleteket vgre kell rucinia hajtani, amelyek egy alkalmazott trlshez szksgesek. Ebbe olyan dolgok tartozhatnak bele, mint pldul az alkalmazott trtse abbl a rszlegbl, amelyikbe beosztottk, a knyvelsi osztly rtestse, hogy trljk az alkalmazottat a brlistrl, a biztonsgi osztly rtestse, hogy vonjk vissza az alkalmazott biztonsgi hozzfrst, s gy tovbb. Ahogy a 3. rrl bizonyra emlksznk r, az objektumok nyilvnosan hozzfrhet fggvnyeit tagfggvnyeknek hvjuk. A leggyakrabban hasznlt felleti tagok a tulajdonsgok s a tagfggvnyek. Br a tulajdonsgok s tagfggvnyek tervezse jdonsg lehet a szmunkra, az alkalmazsukkal mr megismerkedtnk, mivel eddig szinte minden rn hasznltuk ket. Most a sajt objektumaink rulajdonsgainak s tagfggvnyeinek ltrehozshoz szksges mdszereket fogjuk elsajttani.
Az gyfl s az objektum kztt kapcsolat elsegtse rdekben egyedi esemnyeket

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.

Tuljdonsgknt elrflet6 objektumjellemz6k


A tulajdonsgok az objektumok jellernzi. A tulajdonsgok lehetnek rsvdettek, de engedlyezhetjk az rtkk olvasst s rst is. Pldul megengedhetjk egy gyflnek, hogy kiolvassa egy tulajdonsg rtkr, amely az sszetev elrsi tjt tartalmazza, de megtilthatjuk neki, hogy megvltoztassa azt, mivel egy fut sszetev elrsi tjt nem lehet mdostani. Ktfle mdon adhatunk tulajdonsgokat egy osztlyhoz. Az egyik lehetsg, hogy nyilvnos vltozkat vezetnk be. Minden nyilvnosknt bevezetett vltoz azonnal az osztly tulajdonsgv is vlik (tulajdonkppen csak tulajdonsgknt viselkedik, de valjban nem az). Pldul tegyk fel, hogy a kvetkez utasts egy osztly deklarcis rszben szerepel:
public int Quantity;

Az gyfelek a kvetkezhz hasonl kd segtsgvel olvashatjk s rhatjk a tulajdonsg rtkr:


objMyObject.Quantity

= 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.

336 1111. rsz Hozzuk mt1kdsbe a dolgotat programozs


A tulajdonsgeljrsok lehetv teszik, hogy utastsokat hajtsunk vgre, ha egy tulajdonsg rtke megvltozik, hogy ellenrizzk egy tulajdonsg rtkr, illetve hogy meghatrozzuk, hogy egy tulajdonsg csak olvashat vagy csak rhat legyen, vagy olvashat s rhat is. A tulajdonsgeljrsokat a hagyomnyos tagfggvnyekhez hasonlan vezetjk be -nhny lnyeges klnbsget leszmtva. A tulajdonsgeljrsok alapvet szerkezete a kvetkezkppen nz ki: private int privt_rtk public int tulajdonsgnv
{

get
{

return privt_rtk; set


{

l l A tulajdonsg rtkt visszaad kd

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;

public int Height get


{
}

set
{
}

Miutn bertuk az utastsokat, az (lsd a 16.3. brt).

ENTER

billenty(i lenyomsval vglegestsk azokat

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.

338 1111. rsz Hozzuk m4kd6sbe a dolgokat ~


frhat tulajdonsgok ltrehozsa a set szarkezettel A set szerkezetben helyezzk el azt a kdot, amely j rtket fogad az gyflkdtL
~uk a kvetkez utastst a tulajdonsg set rsznek zrjelei kz:
m_intHcight

= 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 <

U tvlu.e >- 10) _lneJttebt ftlue:

16.4. bra
Adateilenrzssel kregszftett tulajdonsgeljrs

Csak olvashat vagy csak rhat tulajdonsgok ltrehozsa

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

lm. rsz Hozzuk mtlkdsbe a dolgokat programozs


Tagfggvnyknt elmet6 fggvnyek
A tulajdonsgoktl eltr mdon, amelyek egy objektum jellemziknt viselkednek,

a tagfggvnyek az objektum ltal elrhetv tett fggvnyek (a 10. rn megtanultuk,


hogyan hozhatunk ltre tagfggvnyeket). Most hozzuk ltre az osztlyunkban az albbi tagfggvnyt; helyezzk cl a kvetkez kdot az osztly rn_intHeight vltozjnak bevezetse alatt:
public long AddTwoNurnbers(int intNurnberl, int intNurnber2)
{

return intNurnberl + intNurnber2;

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.

Objektumok pldnyostsa osztlyokbl


Ha kinyertnk egy objektumhivatkozst, s hozzrendeljk azt egy vltozhoz, egy objektumvltoz segtsgvel kezelhetjk az objektumot. Most ezt fogjuk kzelebbrl megnzni.
Kattintsunk a tervez ClassE:xampleForm.cs flre, s az ablaktervezben adjunk egy gombot az ablakhoz. Ehhez kattintsunk dupln az eszkztr Button elemre, s a kvetkezkppen lltsuk be a gomb tulajdonsgait:

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.

Objektumhivatkozs vttozhoz ktse


Egy objektum tbb tulajdonsgot, tagfggvnyt s esemnyt tartalmazhat, gy minden objektum ms s ms. Amikor valamilyen objektumkezel kdot runk, a Visual C#-nak meg kell rtenie az objektum fellett, klnben nem fog mkdni a programunk. A Visual C# akkor hatrozza meg a felleti tagokat (az objektum tulajdonsgait, tagfggvnyeit s esemnyeit), amikor egy objektumvltozt az objektumhoz kapcsolunk. A kapcsolsnak, vagy ms nven ktsnek ktfle formja ltezik: a korai kts, amely fordtskor megy vgbe, s a ksi kts, amely a futsi id alatt valsul meg. Fontos, hogy legalbb a kts alapjaival tisztban legynk, ha osztlyokon alapul kdot akarunk rni. Br nem tudjuk a korai s a ksi kts bonyolultsgt bemutatni s minden technikai rs:z.letet megbeszlni ezen az rn, meg fogjuk tanulni, hogy mi kell az egyes ktstpusok kivitelezshez.
Mindkt ktstpusnak vannak elnyei, de a korai kts ltalban jobb a ksi ktsnl. A ksi kts objektumokat hasznl kdok tbb munkt ignyelnek a Visual C#-tl, mint azok, amelyek korai kts objektumokat hasznlnak.

Objektumvltoz ks6i ktse


Ha egy vltozt Object adattpusknt hozunk ltre, mint ahogy az az albbi pldban is lthat, akkor az objektumra ksi ktst alkalmazunk:
object obj ; obj =ne w clsMyClass ( ); MessageBox. Show(obj . AddTwoNumbe rs(l , 2) .ToString()) ;

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.

342 1111. rsz Hozzuk mQkdsbe a dolgokat programozs


Amikor egy objektumvltozt ksi ktssel alkalmazunk, vagyis Ob j ee t tpusknt hozzuk ltre, a kvetkez lpsek mennek vgbe a sznfalak mgtt: 1. A Visual C# megkapja a meghvni kvnt tulajdonsg, tagfggvny vagy esemny egyedi azonostjt (Dispatch ID), ami id- s erforrsignyes folyamat. 2. Ha a tagnak van paramtere, ltrejn a paramterekettartalmaz bels tmb. 3. Az els lpsben kapott azonost alapjn sor kerl a tag meghvsra. Az elz lpsek jelents mennyisg tbbletrfordtst ignyelnek, s htrnyos mclon rintik az alkalmazs sebessgt. Emiatt nem a ksi kts az elnyben rszestett ktsi mdszer. A ksi kts rendelkezik nhny vonz felhasznlsi lehetsggel, de ezek kzl a legtbb az objektumoknak az alkalmazsunkon kvli felhasznlshoz kapcsoldik, nem pedig a prograrnon belli osztlyokbl szrmaztatott objektumok hasznlathoz. A ksi kts egyik legfbb htultje, hogy a fordt nem tudja ellenrizni az objektumot kezel kd helyessgt. Mivel a tag azonostja s az ltala hasznlt paramterek a futsig nem meghatrozottak, a fordt nem tudhatja, hogy egy tagot megfelelen hasznlunk-e, vagy hogy az ltalunk hivatkozott tag egyltaln ltezik-e, ami futsi idej(} kivtelhez vagy egyb vratlan viselkedshez vezethet.

Objektumvltoz korai ktse


Ha a Visual C# a fordts sorn meg tudja hatrozni egy tag azonostjt, nincs szksg arra, hogy az azonostt akkor keresse ki, amikor a futsi id alatt hivatkoznak r. Ennek eredmnye az objektumtagok jelentsen gyorsabb lvsa. A Visual C# nem csak ezt, de a tagfggvnyhvsr is kpes ellenrizni a fordts alatt, ami cskkenti annak az eslyt, hogy hibk legyenek a kdban. Korai kts akkor trtnik, amikor a vltozt valamilyen meghatrozon tpus objektumknt vezetjk be, s nem az Ob j ee t tpust hasznljuk. Ha egy vltozt korai ktssel vezetnk be, a Visual C# nem a futsi id alatt, hanem fordtskor keresi ki az objektum tagjainak azonostlt. A korai kts hasznlata mellen a kvetkez fontos rvek szlnak: Nagyobb sebessg. Mg nagyobb sebessg. Az objektumok s azok tulajdonsgai, valamint tagfggvnyei megjelennek az IntelliSense lenyl listjban. A fordt kpes ellenrizni a nyelvtan s a hivatkozsok helyessgt a kdban, ezrt sok hibt mr fordtskor megtallhatunk Ahhoz, hogy korai ktst hasznlhassunk, az objektumvltozt meghatrozott objektumtpusknt (teht nem Ob j ee t-knt) kell bevezetnnk.

j objektum ltrehozsa vltoz bevezetsekor


j objektumot a bevezet6 utastsban megadott new kulcsszval is pldnyosthatunk, ahogy azt a korbbi pldnkban is tettk. Ez a megkzelts szksgtelenn teszi, hogy egy msodik utastst hasznljunk az objektum j pldnynak ltrehozshoz, de ha gy tesznk, a vltoz mindig tartalmazni fog egy hivatkozst az objektumra. Ha fennll a lehetsge, hogy nem lesz szksgnk az objektumra, el kell kerlnnk a new kulcssz hasznlatt a bevezetsben. Figyeljk meg a kvetkezket:
clsMyClass ob j ;
i f (fel t tel l
{

obj =new c l s MyClass(); l l Ide kerl az egyedi objektumot hasznl kd

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-

344 1111. rsz Hozzuk mc1kdsbe a dolgokat: programozs


knt ellenrzi a hasznlaton lvli objektumokat, s felszabadtja az ltaluk felhasznlt erforrsokat, ez azonban jelents idt vehet ignybe, Iniutn az objektumot mr nem hasznljuk, ezrt a Dispose (l tagfggvnyt minden osztlyunkhoz hozz kell adnunk. A takart kdot a Di spose () tagfggvnyen bell kell elhelyeznnk, amit mindig meghvunk, ha nincs mr tbb dolgunk az objektummaL Egy dolgot rdemes szben tartanunk: egy objektumra egynl tbb vltozval is hivatkozhatunk. A Dispos e () meghvsa a takart kd lefutst eredmnyezi, ezrt problmk lphetnek fel abban a kdban, amelyik a msodik objektumvltozt hasznlja. Mint ltjuk, sok dologra oda kell figyelnnk, amikor objektumokat programozunk

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

Az objektumok lettartamnak megrtse lnyeges. Most lttuk, hogyan s mikor jn

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.

346 lll. rsz Hozzuk mOkdsbe a

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

lm. rsz HolZUk mOkdsbe a dolgokat: programozs

zenetek megjelenftse a MessageBox.Show() fggvnnyel


Az zenetablakok - ha esetleg nem lenne nyilvnval- kis prbeszdablakok, amelyekkel zeneteket jelenthetnk meg a felhasznJk szmra. A szerepk gyakran abban ll, hogy kzlik egy mvelet eredmnyt, pldul hogy "A fjl msolsa megtrtnt" vagy "A fjl nem tallhat". Az ilyen ablakok jellernzje, hogy eltnnek a kpernyrl, ha valamelyik gombukra kattintunk. A legtbb alkalmazsban rengeteg zenetablakkal tallkozhatunk, de ez nem jelenti azt, hogy a tartalmuk minden esetben megfelel a cljuknak Fontos, hogy felismerjk: az zenetablakok tjn szemlyesen a felhasznlval rintkeznk. Ezrt a kvetkez6kben a Messag eBox. Show ( ) fggvny bemutatsa mellett arrl is szt ejtnk, mire kell gyelnnk az ablakok tartalmnak sszelltsnL
A MessageBo x . Show () fggvnnyel tjkoztatst adhatunk a felhasznlnak, de krdst is feltehetnk neki. A szveg megjelentse mellett - hiszen ez az elsdleges cl egy ikont is feltntethetnk, valamint gombokat, amelyek Jehetv teszik a felhasznli visszajelzst. A szveg megadsban szabad kezet kapunk, de az ikont s a gombokat csak egy meghatrozott listbl vlaszthatjuk ki. A MessageBox. Show ()

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.

A gombok s az ikon meghatrozsa


Ha magunk szecetnnk meghatrozni az zenetablakban megjelen gombokat, adjuk meg a Gombok paramtert. A paramter tipusa MessageBoxButtons, a lehetsges rtkeit pedig a 17.1. tblzatban soroltuk fel.

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.

352 1111. rsz Hozzuk mtlkdsbe a dolgokat programozs

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);

Somdlling .,.d hu hljlp<Mdl

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

~te ta fariNI yaur hard d~ now?


17.5. bra
Egy zenetablakban krdst is feltehettink

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.

354 1111. rsz Hozzuk mt1kdsbe a dolgokat: programozs

Melyik gombra kattintott a felhasznl?


Lthatjuk, hogy a legtbb zenetablak rnindssze egy OK gombot tartalmaz. Vannak azonban olyanok is, amelyeken tbb gomb szerepel - itt viszont valahogy meg kell tudnunk, hogy melyikre kattintott a felhasznl, klnben feleslegesen adtunk neki vlasztsi lehetsget. AMes sageBox. Show() tagfggvny a Di a l ogResul t felsorol tpus rtkkel tudatja, hogy melyik gombra kattintottak. A Di alogResul t lehetsges rtkeit a 17.3. tblzat mutatja:

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

Milyen a "j" zenet?


AMessageBox. Show () tagfggvny hasznlata gyerekjtk, Irulnsen ha hozzvesszk azt is, hogy mennyifle zenetet jelenthetnk meg vele. Az igazi feladat abban rejlik, hogy a megfelel pillanatban a megfelel zenetet adjuk. Az ikonok s a gombok helyes megvlasztsa mellett rdemes pr alapelvet betartanunk az zenetek szvegnek sszelltsnl is: Hasznljunk formlis hangnemet, kerljk a hossz szavakat s a rvidtseket Trekedjnk arra, hogy az zenet knnyen rthet legyen, s tartzkodjunk a stlusbravroktl- nem ez az a hely, ahol az ri vnnkra szksg van. Szortkozzunk kt-hrom soros zenetekre. A hossz szvegek megrtse nehezebb, radsul nyomasztan hatnak. Ha egy zenetablakban krdst tesznk fel, legynk lnyegretrek. Soha ne reztessk a felhasznlval, hogy valamit elrontott. Mindenki kvet el hibkat; az zenettel tlkezs helyett prbljuk kihzni a helyzet mregfogt. Ellenrizzk az zenet helyesirst. A Visual C# szerkesztje nem teszi meg ezt a slivessget neknk, ezrt a szveget be kell msolnunk egy szvegszerkesztbe, pldul a Microsoft Wordbe, s ott kell ellenriznnk, mieltt beptennk a programba. A helyesrsi hibk soka[ rontanak az alkalmazsunkrl alkotott kpen. Kerljk a szakzsargont. Ne feledjk: attl, hogy a felhasznJk hasznljk a programunkat, mg nem felttlenl mozognak otthonosan a szaknyelv terletn. Fejezzk ki magunkat kzrtheten, htkznapi nyelven. Gyzdjnk meg rla, hogy a gombok megfelelnek a szvegnek. Igen rosszul veszi ki magt, ha Igen/Nem gombokat jelentnk meg, mikzben nem is tesznk fel krdst.

Egyni prbeszdablakok ltrehozsa


AM essageBox . Show ( ) tagfggvny a legtbbszr tkletesen megfelel az zenetek megjelentsre, de akadhatnak olyan esetek, amikor ennl tbbre van szksg. J plda erre, amikor sok szveget - pldul egy naplfjl tartalmt - szeretnnk megjelenteni, amihez tmretezhet prbeszdablakra van szksg. Az egyni prbeszdablakok nem egyebek szabvnyos mddal rendelkez (modlis) ablakoknl - egy lnyeges klnbsggel: ki kell jellnnk egy vagy tbb gombot, amelyek - a MessageBox. Show ( l tagfggvnyhez hasonlan - valamilyen eredmnyt adnak vissza. A kvetkezkben elksztnk egy egyni prbeszdablakot Ehhez elszr hozzunk ltre egy j Windows Application projektet c u stom Dialog Example nven, majd kvessk az albbi lpseket:

356 1111. rsz HOlllik mt1kdsbe a dolgokat: programozs


1. Adjuk az alaprtelmezett ablaknak a MainForm . cs nevet, a Text tulajdonsgnak pedig a Custom Dialog Box Example rtket. 2. Helyezznk el egy gombot az ablakon, s lltsuk be a tulajdonsgait az albbiak szerint:

Tulajdonsg Name Location Size Text

rtk btnShowCustomDialogBox 67' 180


152, 23

Show Custom Dialog Box

3. Most hozzuk ltre az egyni prbeszdablakot. A Project, Add Windows Form

(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

Ide jn az egyni zenet

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.

Tulajdonsg Name DialogResult Location Size Text

rtk btnCance l Cancel 201 , 234 75 , 23 Cancel

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.

358 1111. rsz HOZ2Uk ml1kdsbe a dolgokat: programozs

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.

Esemny neve KeyDown

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.

Az esemnyek a tblzatbeli felsorolsuk sorrendjben kvetkeznek be. A szemlltets

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

rtk txtlnput 25, 56


True

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.

p.abla.c parUU C.l.u

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

nagyszen1en kezelhetjk a KeyPress esemnyben

360 1111. rsz HolZUk mllkdsbe a dolgokat: programozs


4. Keressk meg a Key Press esemnyt, s kattintsunk r dupln egy j esemny-

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

362 lll. rsz HolZUk mtlkdsbe a

17.5. tillllllt Az esriJemenetet llezel esemnyek


Esemny neve Leirs MauseLeave Akkor kvetkezik be, amikor az egrmutat elhagyja a vezrl terlett. Mouseelick A HouseDown s a MouseUp esemny kztt, a elick esemny utn kvetkezik be. elick A HouseDown s a MouseUp esemny kztt kvetkezik be.
rjunk egy programot az egr kezelsnek a bemutatsra! A programban a fszerepet a MouseMove esemny kapja, amellyellehetv tehetjk, hogy a felhasznl rajzoljon az ablakra, mintha csak egy igazi rajzolprogramot hasznlna. Hozzunk ltre egy Mouse Paint nev Windows Application projektet, s tegyk a kvetkezket: 1. Kattintsunk az egr jobb gombjval a Forml. cs fjlnvre a Solution Explorerben, vlasszuk a helyi men Rename pontjt, s adjuk az alaprtelmezell ablaknak a MainForm.cs nevet, a Text tulajdonsgnak pedig a Paint wi th the Mouse rtket. 2. Kattintsunk dupln az ablakra az alaprtelmezett Load esemnynek a betltshez, s rjuk be az albbi kdsort: m_objGraphics: this .CreateGraphics() ; A korbbiakban is hasznltunk mr nhny alkalommal grafikus objektumokat. lu egyszeruen arrl van sz, hogy egy grafikus objektumot rendelnk az ablak gyflterlethez - gy minden, amit erre az objektumra rajzolunk, egyttal megjelenik az ablakon is. Mivel az egr minden mozdulatnl rajzolunk erre az objektumra, semmi rtelme minden alkalommal j objektumot ltrehoznunk, ezrt az m_objGraphics vltozt modulszintv tessZk, gy egyellen alkalommal kell csak pldnyostanunk - az ablak Load esemnyben. 3. rjuk be az albbi utastst a public partial class MainForm : Form osztlymeghatrozs nyit kapcsos zrjele utn: private Graphics m_objGraphics; Amint a korbbiakban mr emltettk, az objektumokat meg kell semmistennk, ha mr nincs szksgnk rjuk. Esetnkben a grafikus objektum szolglatait az ablak teljes lettartama alatt ignybe vesszk, gy a megsemmistst a Formelosed esemnyben kell vgrehajtanunk, amely az ablak bezrsakor kvetkezik be. 4. Trjnk vissza a MainForm.cs [Designllapra, nyissuk meg az esemnyek listjt a Properties ablakban, majd kattintsunk dupln a Formelosed esemnyre- gy ltrehozzuk, majd meg is nyitjuk az esemny kdvzt a szerkeszt6ben. rjuk be az albbi sort: m_objGraphics .Dispose() ;

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};

364 1111. rsz Hozzuk mkdsbe a dolgokat programozs


A korbban ltottakhoz hasonlan az e objektum ezttal is az esemnyhez ktd adatokat trol. Jelen esetben az x s Y tulajdonsgaira lesz szksgnk, amelyek megadjk az egrmutat koordintit az esemny bekvetkeztnek pillanatban. Emellett meg kell vizsglnunk a Button tulajdonsgot is, gy megtudhatjuk, hogy lenyomta-e a felhasznl a bal gombot. A projekt ezzel elksZlt. Mentsk a munknkat az eszkztr Save All (Mindent ment) gombjval, majd futtassuk a programot az F5 billenty\Ivel. Vigyk az egrroutatt az ablak fl - nem trtnik semmi. Most nyomjuk le a bal egrgombot, s mozdtsuk meg jra az egeret. Ezttal mr rajzolhatunk: az eredmny a 17.11. brn lthat .

.. ............. ~ ( ) .. \ \ J l

..

...............,-~~

"--"" l

17.11. bra Az egresemnyek elfogsa izgalmas


lehetsgeket

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 ra msodik rszben megtanultuk, miknt rhetjk el kzvetlenl a billenty\Izet s

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.

366 1111. rsz Hozzuk mclkdsbe a dolgokat programozs

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.

368 1111. rsz Hozzuk mllkdsbe a dolgokat programozs

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

Graphics objektum ltrehozsa ablakokhoz s vezr16khz


Ha kzvetlenl egy ablak vagy vezrl felletre szeretnnk rajzolni, knnyedn hozzjuthatunk a megfelel rajzfellet hivatkozshoz az adott objektum CreateGraphics () tagfggvnyveL Ha egy olyan Graphics objektumra van szksgnk, amellyel egy szvegmezre rajzolhatunk, az albbihoz hasonl kdot hasznlhatunk:
System.Orawing . Graphics objGraphics; objGraphics = this . textBoxl . CreateGraphics();

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

Graphics objektum ltrehozsa egy j bitkp szmra


A Graphics objektumokat nem kell felttlenl egy ablak vagy vezrl gyflterlethez rendelnnk - lehetsgnk van arra is, hogy egy csak a memriban ltez bitkpet troljunk benne. Mindez lehet6v teszi, hogy ideiglenesen troljunk egyes bitkpeket a programunk hatkonyabb mkdse rdekben, vagy bonyolultabb graftkkat lltsunk ssze, miel6n megjelentennk azokat valamilyen lthat helyen (pldul egy ablakon vagy vezrln). Ehhez persze elszr egy j bitkp ltrehozsra van sZksg.
A bitkp trolshoz egy megfelel mcetekkel rendelkez vltozt kellltrehoznunk:

Bitkpvl toz =new BiLmap(szlessg, magassg , kppontformtum);

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

lm .rsz Hozzuk !OOkdsbe a dolgokat ~


Az albbi kdrszlettel pldul egy olyan j bitkpet hozhatunk ltre, amelynek a szlessge 640, a magassga 480 kppont, a sznmlysge pedig 24 bit (felttelezzk,

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.

A felesleges objektumok eltvolftsa


Ha nincs szksgnk a tovbbiakban egy Graphics objektumra, mindenkppen hvjuk

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

me egy aprcska plda: using (MyClass objClass


{

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) ;

Miutn ltrehoztunk egy tollat, a tulajdonsgainak a belJtsval mdosthatjuk

a megjelenst. Mindenkppen meg kell emltennk a DashStyle tulajdonsgot,


amellyel a tollal rajzolt vonal stlust adhatjuk meg. A tulajdonsg lehetsges rtkeit a 18.2. tblzatban mutatjuk be.

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.

372 1111. rsz HOlllik mtkdsbe a dolgokat programozs


A Visual C# szmos elre meghatrozott tollat tesz elrhetv a System. Drawing. Pens osztlyban, amelyekhez az albbihoz hasonlan frhetnk hozz:
objPen = System.Drawing.Pens.DarkBlue;

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

18. 6ra Grafikus


a kdot, bizony komoly munknak nznnk elbe, olyannyira, hogy minden valszn sg szerint inkbb lemondannk err61 a lehet6sgr61. Szerencsre az alkalmazsok oldalrl nzve sem bonyolultabb a helyzet- knnyedn elrhetjk, hogy a programunk sznei alkalmazkodjanak a felhasznl belltsaihoz, gy ht minden amellett szl, hogy valban gy is tegynk. A folyamat az ablakon elhelyezett vezrlk esetben javarszt automatikus. Ha azt szeretnnk, hogy a felletnk valamelyik szne kvesse a felhasznl sznbelltsait, nem kell mst tennnk, mint egy rendszersznt rendelni a megfelel szntulajdonsghoz, amint azt a 18.2. brn is lthatjuk. gy ha pldul azt szeretnnk, hogy egy gomb szne megfeleljen a felhasznl belltsainak, adjuk a But ton vezrl Color tulajdonsgnak a Control rtket. A 18.3. tblzatban a gyakrabban elfordul rendszerszneket soroltuk fel - a teljes listt a sgban tallhatjuk meg.

373

18.2. bra
A rendszerszfneket a System palettn

vlaszthatjuk ki

rtk ActiveCaption ActiveCaptionText Control ControlDark ControlLight ControlText Desktop

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.

374 1111. rsz HollUk mOkdsbe a dolgokat programozs

rtk
GrayText Highlight HighlightText Inac t iveBorder InactiveCapt ion InactivecaptionText Menu MenuText Window

Lers A felleti elemek kiszrktett, illetve letiltott szvegeinek


betszne.

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.

18. 6ra Grafikus

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);

376 1111. rsz HOllUk m fikdsbe a dolgokat: programozs


Ezzel a tglalap bal s fels oldala a helyn marad, a szlessge s a magassga pedig a megadott rtkkel vltozik. Ha nveini szeretnnk a szlessget, illetve a magassgot, adjunk meg pozitv rtkeket, a O-val helyben hagyhatjuk az eredeti belltst, a negatv paramterrtkek pedig zsugortjk a tglalap oldalait. Ha gyakran lnk a Visual C# rajzolsi lehetsgeivel, ajnlatos minl kzelebbi ismeretsget ktni a Rcctangle objektumokkal, hiszen rengetegszer hasznljuk majd ket.

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);

18. 6ra Grafikus lehet6sgek 377

Krk s ellipszisek rajzolsa


A krk s ellipszisek rajzolsr.a a DrawEll ipse () tagfggvny hasznlatos. Ha egy kicsit is jratosak vagyunk a geometriban, tudhatjuk, hogy a kr valjban ellipszis, csak ugyanolyan "szles", mint amilyen "magas". Ez az oka annak, hogy nem ltezik kifejezetten a krk rajzolsra alkalmas tagfggvny: a DrawEll ipse () tkletesen megfelel erre a clra is. A DrawRectangle () tagfggvnyhez hasonlan a DrawEllipse () is egy tollat s egy tglalapot vr- ez utbbi szolg1 az ellipszis hatrol tglalapjaknt, a szlessge az ellipszis szlessge, a magassga pedig az ellipszis magassga lesz. A tagfggvnyt a kvetkez alakban hasznlhatjuk objektum .DrawEllipse(to11, X, Y, szlessg, magassg) ; Amennyiben nem rendelkeZnk Rectangle objektummal (s nem is szndkozunk ltrehozni egyet), gy is meghvhatjuk a tagfggvnyt: objektum.DrawEllipse(to11, x ,
Y,

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

378 1111. rsz HOlZUk rntlkdsbe a dolgokat programozs


A paramterek sorban szerepel nhny jdonsg. A karakterlnc jelentse magtl rtetd: ez az a szveg, amelyet fel szeretnnk rajzolni a Graphics objektum felletre. A fels6X s a bal Y a rajzols helyt, egszen pontosan a felirat bal fels sarknak koordintit adjk meg (lsd a 18.4. brt). paramterek jelentse azonban mr nem biztos, hogy vilgos. Mindenekeltt tudnunk kell, hogy ezekben a paramterekben egy-egy objektumot kell tadnunk. Az ecset hasonl a tollhoz, de mg az utbbi egy vonal tulajdonsgait adja meg, az elbbi a kitltsrl rendelkezik. Mind a toll, mind az ecset objektumok rendelkeznek sznnel, de mg a tollak esetben a vonal stlust (folytonos, szaggatott s hasonlk) adhatjuk meg, az ecseteknl a kitlts mintzatrl (egyenletes, vonalas, sztt, rcsos) dnthetnk. Szvegek rajzolsakor az egyenletes kitlts ecset tbbnyire tkletesen megfelel. Mindazonltal, ha kedvnk tartja, a toUakhoz hasonlan magunk is ltrehozhatunk ecseteket, de vlogathatunk a rendszer elre meghatrozott lehersgei kztt is a Syst em. Drawing . Brushes osztlyban. A betform tum egy Font objektum, amely a megjelentett szveg formzst adja meg, gy a bettpusr (Times New Roman, Courier stb.), a betmretet, valamint a stlust (flkvr, dlt, norml, alhzott, s gy tovbb). j Font objektumot az albbiak szerint hozhatunk ltre: Font objFont; objFont = new Systern . Drawing .Font ("Arial", 30) ;
Az Arial itt egy a szmtgpre teleptett bettpusr azonost, amely egyike azoknak a bettpusoknak, amelyek rninden Windows rendszer gpen jelen vannak. Ha olyan bettpus nevt adjuk meg, amely futsidben nem rhet el a felhasznl gpn, a Visual C# az alaprtelmezett bettpusok kzl kivlasztja azt, amelyik szerinte a legjobban hasonlt a hinyzra. A msodik paramter a szvegben alkalmazott betmret. Ha a szveget nem norml stlusban szeretnnk megjelenteni, ezt a belltst is megadhatjuk egy harmadik paramterrel (lssuk a logikai VAGY mO'veletet, amelyrl a 12. rn tanultunk): Az ecset s a
betformtum

objFont = new System.Drawing.Font("Arial Black, FontStyle .Bold l FontStyle . Italic);

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);

Grafikus tartalom meg6rzse az ablakokon


Az ablakok felletre az elzekben megismert mdszerekkel rajzolhatunk Mindazonltal a korbbi rkon mr tapasztalhattuk, h ogy amit gy rajzolunk az ablakra (vagyis az ablakra hivatkoz Graphics objektumra), az tvolrl sem maradand. Olyannyira nem, hogy amint az ablak legkzelebb felfesti magt, minden, amit rrajzoltunk, egy

18. 6ra Grafikus


csapsra elr<Inik. Mindez azt jelenti, hogy ha a felhasznl kis mrer<Iv zsugorrja vagy elfedi az ablakot, a legkzelebbi megjelentsekor a rajz takacisban lev rszei elr<Innek. A helyzet megoldsra kt t is knlkozik: Helyezznk el minden olyan kdot az ablak Pa i n t esemnyben, amely az ablak felletre rajzol. Rajzoljunk egy a memriban trolt bitkpre, s ennek tartalmt msoljuk az ablakra annak Paint esemnyben. Arnennyiben csak pr dolgot rajzolunk az ablakra, az els megkzelts is tkletesen megfelel, de ha a rajzol kd kiterjedt, egszen ms a helyzet. Elfordulhat az is, hogy az ablakra rajzolt elemek a felhasznl tevkenysge szerint alakulnak, gy nyilvnvalan nem tudjuk ket egyszerre visszaidzni. Ilyen esetekben nyilvnvalak a msodik megkzelts elnyei.

379

G rafikus pldaprogram ksztse


Ennyi elmlet utn vgre prbljuk ki a gyakorlatban is, amit az ablakokra rajzolsrl tanultunk. A kvetkez projektben egy a memriban trolt bitkpet hasznlunk a rajzok megrzsre, s ezt jelentjk meg, amikor az ablak felfesti magt.
A kvetkezkben eddigi tanulmnyaink taln legsszetettebb projektjt ksztjk el. Minden lpst megmagyarzunk, de nem tltnk feleslegesen idt a mr ismert objektumok s tagfggvnyek bemutatsval.

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:

380 J m .rsz HOlZUk mtlkdsbe a dolgokat programozs


Tulajdonsg Name Location Size

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):

pn.._w ?Gld Ka.1Arom_r.o.c&tob1&01:. HII:kt,.

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()
{

Graphics obiGraphics ; Rectangle rcctBounds ;

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);

ll Felszabadtjuk az er6forrsokat. objGraphics.Dispose();

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.

382 1111. rsz HOllUk mtlkdsbe a dolgokat: programozs


Erre az ablak Paint esemnyben kerl sor, gy az ablak nnden felfestsekor elhelyezzk rajta a bitkp tartalmt, vagyis biztostjuk, hogy amit felrajzoltunk, az mindig lthat legyen az ablakon.

Grph,~oc:s

objGrpbi.c.s;

Attct:4J\Q'lt' RC~;

ll

C'n-.t;~

G~aphic:J

:!cet tb&o; Ychre.a.na tbe bl.taaD anu c l ru: it. .

~.lGZ-l U Gl"6Jlti.1C&, !"rc:antaoe(la_Cibj DravingiS UZf -.ce:) :

Jlcreu, rec:t-.:sgh.
r~d

the:

.slllJIC'

ln-u: -e:~ ~ bi~p.

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,

hogy pontosan a megadott kdot irtuk-e be

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.

18. 6ra Grafikus


1O. Utols feladatunk, hogy megirjuk azt a kdot, amelyik a szvegmez6ben megadott feliratot megjelenti az ablakon, mghozz vletlenszerii helyen s mretben. Trjnk vissza az ablaktervez6hz, s kattintsunk dupln a gombra a Click esemny elrshez. rjuk be az albbi kdot: Graphics objGraphics ; Font objFont ; int intFontSize, intTextX, intTextY; Random randomGenerator = new Random();

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.

384 1111. rsz Hol2llk mOkdsbe a dolgokat programozs


Utolslpsknt fel kell szabadtanunk a modulszint1i Graphics objektum ltallefoglalt erforrsokat. A Properties ablak segtsgvel hozzunk ltre egy esemnykezelt az ablak Formelosed esemnyhez, s rjuk be az albbi utastst:
m_objDrawingSurface . Dispose();

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?

386 1111. rsz Hozzuk mQkdsbe 8 dolgokat: programozs

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

lrv. rsz Adatkazsls

Az OpenfileDialog s a SavefileDialog vezrt haSllllata


Az els rn az OpenFileDialog vezrlvel tettk lehetv a felhasznlnak, hogy a Picture Viewer programunkban megjelentend kpeket keressen. Ebben a rszben tllpnk az alapokon, s fontos rszleteket tanulunk meg az OpenFileDialog vezrlrl s testvrobjektumrl, a SaveFileDialog vezrlrL Egy olyan programot fogunk elkszteni, amellyel a leckben trgyalt fjlkezelsi elvek javt szernlltetjk. Kezdjk egy j Windows-alkalmazs ltrt:hozsval, amelynek a neve legyt:n Manipulating FHes, s tegyk a kvetkezket: 1. Kattintsunk az egr jobb gombjval a Forrnl. cs fjira a Solution Explorer ablakban, vlasszuk a Rename (tnevezs) parancsot, s vltoztassuk az alaprtelmezett nevet a Mainform.cs nvre. Utna lltsuk az ablak Text tulajdonsgt a Manipulating Files rtkre. 2. Adjunk az ablakhoz egy j szvegmezt, s az albbiak szerint lltsuk be a tulajdonsgait:
Tulajdonsg Name Location Size

rtk txtSource
95, 8 184, 20

Az OpenFileDialog vezr16 hasznlata


Az OpenFileDia log vezrlvel egy olyan prbeszdablakot jelenthetnk meg, amelyben a felhasznl megkereshet s kijellhet egy fjlt, ahogy a 19.1. brn lthat. Jegyezzk meg jl, hogy ltalban maga az Open FileDialog nem nyitja meg a fjlt, csak lehetv teszi a felhasznlnak, hogy kijelljn egyet, amelyet aztn az alkalmazs fog megnyitni. Az eszkztron az OpenFileDialog elemre dupln kattintva adjunk egy OpenFi leDialog vezrlt a projektnkhz. Az OpenFileDial cg vezrlnek nincs kezelfellete, gy nem az ablaksablonon, hanem alatta jelenik meg, ahogy a 19.2. brn lthat. A fjlok tallzshoz be kell lltanunk s meg kell hvnunk az OpenFileDialog vezrlt, arnihez a tulajdonsgait s tagfggvnyeit hasznlhatjuk. Most egy nyomgombot adunk az ablakhoz, amelyre kattintva a felhasznl megkereshet s kijellhet egy fjlt. Ha a felhasznl kijell egy fjlt, akkor annak a fjlneve kerljn be a korbban ltrehozott szvegmez6be.

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

1. Adjunk az ablakhoz egy gombot, s lltsuk be a tulajdonsgait az albbiak szerint:

Tulajdonsg Name Location Size Text

rtk
btnOpenFile
9, 6 80, 23

Source :

392 IlV. rsz Adatkezels


2. Kattintsunk dupln a gombra, s a Click esemnyhez rjuk be a kdot:
openFile Dialogl.IniL i a lDirectory =@ "C : \ "; openFileDialogl .Title = se lect a File"; openFileDialogl . Fi leName = "";
kvetkez

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

= "Windows-bitkpek l *. bmp ";

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.

Az Open File prbeszdablak megjelenftse


Vgl meg kell jelentennk az Open File prbeszdablakot, s ha a felhasznl kijellt egy fjlt, akkor intzkednnk kell a tovbbi teendkrl. Az OpenFileDi.alog vezrl ShowDialog (l tagfggvnye az ablakok azonos nev1l tagfggvnyhez hasonlan mkdik , a visszatrsi rtke pedig a felhasznl ltal a prbeszdablakban kijellt fjlt tkrzi. rjuk be a kvetkez utastsokat az eljrsba:
if (openFileOialogl . ShowDialog()
txtSource . Text e lse t x tSource .Text - " " ;
!~ DialogResult . Cancel) openFileDialogl . FileName;

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

IlV. rsz Adatkezels


Az OpenFileDialog nagyon egyszeren teszi lehetv a felhasznlnak a fjlok megkeresst s kijellst. Ezen sszetev nlkl igen hossz s bonyolult kdot kellene rnunk, s valsznilleg a kzelbe se kerlnnk ennek a vezrlnek s az ltala megvalstott szolgltatsoknak

A SavefileDialog vezrl hasznlata


A SaveFileDialog vezrl hasonl az OpenFileDialog vezrlhz, de megnyits helyett azt teszi lehetv a felhasznlnak, hogy ments cljbl tallzzon a knyvtrak kztt, s megadja egy fjl mentsnek helyr. Itt is fontos megjegyezni, hogy a SaveFileDialog vezrl nem menti a f-jlt, csak lehetv teszi, hogy a felhasznl meghatrozzon egy fjlnevet a ments cljaknt Neknk kell megrni a kdot, amely intzkedik a vezrl ltal visszaadott fjlnv alapjn. A saveFileDialog vezrlt most arra hasznljuk, hogy a felhasznl megadhasson egy fjlnevet Ez a fjlnv lesz a clpontja az ra sorn ksbb elfordul klnfle fjlmveleteknek. A File Save (Fjl mentse) prbeszdablak ltrehozshoz kvessk az albbi lpseket: 1. Hozzunk ltre egy j szvegmezt az ablaksablonon, s az albbiak szerint lltsuk be a tulajdonsgait:
Tulajdonsg Name Location Size

rtk txtDes t ination


95, 34 184, 20

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

IlV. rsz Adatkezels

Fjlkezels a File objektum segtsgvel


A Visual C#-nak rsze az erteljes Sy stem. ro nvtr (az ro objektum gy viselkedik, mintha a System nvtr egy objektumtulajdonsga lenne). A System . ro k\ilnfle tulajdonsgait, tagfggvnyeit s objektumtulajdonsgait felhasznlva brmilyen elkpzelhet dolgot megtehetnk a fjlrendszerreL A System. ro . File s a System . ro. Directory objektumok kiterjedt fjl- s knyvtrkezelsi (mappakezelsi) kpessgekkel rendelkeznek. A kvetkezkben folytatjuk az elkezdett projektnk bvtst, s kijellt fjlnevek kezelsre runk kdot az OpenFileDialog s a SaveFilcDial cg vezrleS segtsgvd.
A kvetkezkben megrt program ..valdi" lesz; pldul ha a kdban trlnk egy fjlt, akkor az tnyleg trldni fog. Ezt ne felejtsk el, amikor teszteljk a projektet, mert a forrsknt s clknt kijellt fjlokra valban hatssal lesznk. Felajnljuk a nagygyt, de a mi felelssgnk, hogy ne forditsuk magunk ellen.

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

if ( !System.IO. File . Exists(txtSource.Text))


(

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

2. Kattintsunk dupln a Copy gombra, s adjuk hozz a

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.

398 1rv. rsz Adatkezels

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.

1. Adjunk az ablakhoz egy j gombot, s lltsuk be a tulajdonsgait az albbiak szerint:


Tulajdonsg Name Location Size Text rtk btnMove
95, 100 75, 23

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

2. Kattintsunk dupln a gombra, s adjuk a if (!SourceFileExists()) return ;

kdot a Click esemnyhez:

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

......., 2.92118 0.067.:1001>1*)

"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.

Fjlok dtum- s id6adatai


A fjlltrehozsi idejt, utols hozzfrsnek idpontjt s az utols mdosts idejt knny kiolvasni. A System . IO . Fi le objektum az emltett idpontok rnindegyikhez rendelkezik egy tagfggvnnyeL A hasznlhat tagfggvnyeket s visszatrsi rtkeiket a 19.1. tblzatban lthatjuk.

19. ra

t9,1. tlzat A Pl/e objekmm dtum- ~ ld1Jlekr6 lag{t18[1.tlb?vei


Tulajdonsg
GetCreationTime GetLastAccessTime GetLastWriteTime

Lers A fjl ltrehozsnak idpontjt adja vissza. A fjl utols hozzfrsnek idpontjt adja vissza. A fjl utols mdostsnak idpontjt adja vissza.

Fjl jellemz6inek kiolvassa


A fjlok jellemzi (amelyek a 19.4. brn lthat prbeszdablak aljn tallhatk) nem rhetk el a System . ro . File objektum tulajdonsgaiknt Egy jellemz megllaptsa sszetett dolog. A System. IO . File GetAttributes (J tagfggvnye egy FileAttri butes felsorolst ad vissza, amely a klnfle jellemzk jelzinek halmazbl ll. A jellemzk megllaptsnak els lpse a Fi leAttributes kiolvassa, amely tartalmazza a fjl jellemzinek a jelzit. Ehhez ltre kell hozni egy Fi leAttri butes vltozt, s meghvni a GetAttributes {J tagfggvnyt, pldul gy:
System.IO.FileAttributes ob jFi leAttributes ; objFileAttributes = System.IO . File . GetAttributes{txtSource . Tex t);

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.

19.2. tjblzat llaMnos fjljellemz6 flzk


Jellemz

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.

402 1JV. rsz Adatkezels

Kd frsa egy fjl tulajdonsgainak kiolvasshoz


Most, hogy tudjuk, hogyan lehet egy objektum tulajdonsgait kiolvasni, mdost.ani fogjuk a Piccure Viewer programunkat, hogy a felhasznlk megtekinthessk a megjelentett kp tulajdonsgait. Kezdjk a Picturc Viewer projekt megnyitsva!, amelyet utoljra a lS. rn mdostottunk, s kvessk az albbi lpseket, hogy megjelenthessk a fjlok jellemz6it:
1. Adjunk egy j eszkzgombot a ViewerForm. cs ablak eszkztrhoz, s adjuk

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)
(

== "")

MessageBox.Show("There is no file open " ) ; return;

System . Text . StringBuilder stbProperties = new _System.Text . StringBuilder("") ; System.IO . FileAttributes fileAttributes;

ll Ltrehozzuk a karakterlncot felpt6 objektumot ll a karakterlncok ssz efzshez

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.

404 IlV. rsz Adatkezels


Az els utasts stbProperties nven meghatroz egy res StringBuilder tpus vltozt. A stringBuilder objektumot karakterlncok sszefzsre terveztk, s javarszt csupn erre hasznlatos. Mi a stringBuilder osztly Append (hozzfazs) tagfggvnyt hasznljuk a fjltulajdonsgok szvegnek ellltshoz (rninden hozzfazs j szvegrszl ad a meglv6 karakterlnchoz). Az utastsok msodik rsze meghvja a GetCreateTime (), a GetLastAccessTime () s a GetLastWriteTime () tagfggvnyeket az idpontot meghatroz tulajdonsgok kiolvasshoz. Ezek a tagfggvnyek nem ignyelnek tovbbi magyarzatot. A kvetkez lpsben kiolvassuk a jellemzket a GetAttributes (l tagfggvny s a FileAttributes segtsgveL Amikor a jellemzket hozzfzzk a vgs karakterlnchoz, a Convert . Boolean (l tagfggvnyt hasznljuk, gy a karakterlncban a True s a Fal se szavak jelennek 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

RuOnly:fliso Syslm:f'oloo T<mflOtal)' Ftle fal>e


Alchive:T~

19.5. bra
l

A System.IO.File objektum lehetv teszi, hogy megtekintsk egy fjl tu/ajdonsgat

Knyvtrak kezelse a Directory objektummal


A knyvtrak (mappk) kezelse hasonl a fjlok kezelshez, de ezek esetben a System. 10. File helyett a System . IO.Directory objektumot hasznljuk. Ha a tagfggvnyhvsokkal kapcsolatban krdseink merlnnek fel, olvassuk el jra az el6z6 rszben a System. ro . File objektumrl rottakat A tagfggvnyhvsok a kvetkezk: Knyvtr ltrehozshoz hvjuk meg a System . IO . Directory CreateDirectory () tagfggvnyt, s adjuk meg neki az j mappa nevt a kvetkez mdon: System.IO.Directory.CreateDirectory(@"c:\az j
mappa") ;

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

mdjt az albbi plda szemllteti:


System.IO.Directory .Oelete(@ "c:\temp ", true) ;

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!

406 IlV. rsz Adatkezels

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

IlV. rsz Adatkezels


Ennek a knyvnek az els kiadsban elhanyagoltam a szvegfjlokkal trtn munkt, mivel azt hittem, hogy a legtbb felhasznl mr adatbzisokat hasznl. Az olvasktl kapott rengeteg elektronikus levl azonban rbresztett, hogy a szvegfjlokat mg mindig rendszeresen hasznljk, s vrhatan nem is fognak eltnni egyhamar. Ezen az rn megtanuljuk a szvegfjlok ltrehozsnak, megnyitsnak, olvassnak s szerkesztsnek az alapjait.
Az adatok - fleg a felhasznli s programbelltsok - trolsnak egy msik szoksos mdja a Wmdows Rendszerler adatbzisnak (j nevn a Bellitsjegyzknek) a hasznlata. A rendszerler adatbzis egy adatbzis-szer trolhely a Windowsban, amelyben a kulcsok egy faszerkezetet alkotnak. A rendszerler adatbzis gyorsan elrhet, a kezelse egysges felleten keresztl trtnik, s gyakran rszestik elnyben a szveges INI fjlok hasznlatval szemben. Ezen az rn megtanuljuk, hogyan trolhatunk adatokat a rendszerler adatbzisban, s hogyan olvashatunk ki onnan adatokat.

A rendszer1efr6 adatbzis hasmlata


A Windows rendszerler adatbzisa az alkalmazsok, a felhasznlk s a szmtgp jellemzinek trhelye. Tkletes hely olyan adatok trolsra, mint a felhasznli belltsok, az adatbzisok kapcsolati karakterlncai, a fjlok helye, s gy tovbb. Mieltt azonban elkezdennk a rendszerler adatbzisban turklni, tudnunk kell, hogy a rendszerler adatbzis mdostsai megbnthatnak egy alkalmazst, de akr a Windows teljes sszeomlshoz is vezethetnek. Mindig tudnunk kell, hogy mit vltoztatunk meg, s rni lesz a mdostsaink hatsa, rnieltt mdostjuk a Windows rendszerler adatbzist.
Ne szemeteljnk a rendsterfelr adatbzisba! Mindig meglepdm, hogy a prograrnak mennyi felesleges adatot trolnak a rendszerlefr adatbzisban. Tartsuk szben, hogy a rendszerlefr adatbzis nem a szemlyes adatbzisunk. Ha egy alkalmazs adatbzist hasznl, clszer inkbb abban trolni az informcikat

A rendszertefr adatbzis szerkezete


A rendszerler adatbzis hierarchikus szerkezet - olyan, mint egy fa. A fban a legfels kulcsok vagy csompontok (fgak, "kapt rak") elre meghatrozottak: nem lehet ket ltrehozni, mdostani vagy trlni. A rendszerler adatbzis' legfels kulcsainak listjt a 20.1. tblzatban lthatjuk.

20. ra

s a rendszerlefr adatbzis hasznlata 411

Kulcs HKEY_CLASSES_ROOT
HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS

Lers
A fjltpusok s programok ~rs~sait, illetve a COMsszetevk

belltsait trolja.

A Windowsba ppen bejelentkezett felhasznl adatait

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.

412 IlV. rsz Adatkezels

Adattpus
REG_sz

REG_EXPAND_sz REG_MULTI_sz REG_BINARY

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 rendszerler adatbzis elrse . a Registry s


RegistryKey objektumokkal
A Visual C#-ben a Registry objektum nyjtja a legegyszerbb hozzfrst a rendszerler adatbzishoz. Ez az objektum a Mi c rosoft . Wi n 32 nvtr rsze. Az objektum hasznlata kt mdon trtnhet. Az egyik, hogy az egyes objektumhivatkozsok el a Mi c r oso f t. Wi n32 szveget rjuk:
Mic r o s o f t .Win32 . Reg istryKey k ey Microsoft . Win 32 . Regi s try. LocalMach i ne . OpenSubKey (" Software", t rue ) ;

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.

20. 6ra Szvegfjlok 6s a rendszerlefr adatbzis hasznlata 413

Rendszertarr adatbzisbeli kulcsok ltrehozsa


A Registry objektumnak szmos tulajdonsga van. Ezek kztt szerepeinek olyan

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.

20.3. tblzat A Regwry objektumnak a k'8fids kulcsoArra t1Q1latkoz szokflSOS tulajdo,ISdgat


Tulajdonsg ClassesRoot CurrentConfig Current U ser Local M achine Users
A Jegfelsli kulcs, amelyhez houfrst nyjt HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURREN T_USER HKEY_LOCAL_MACHINE HKEY_USERS

A rendszerler adatbzisbeli kulcsok ltrehozsa a Registry objektummal semmisg.


Elszr meg kell hatroznunk, hogy melyik legfels kulcs alatt szeretnnk ltrehozni a kulcsot. Ha mr tudjuk, csak meghvjuk az adott fgnak megfelel objektumtulajdonsg Crea t eSubKey () tagfggvnyt, amelynek tadjuk a ltrehozand Irules nevt. Pldul nzzk az albbi utastst:

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

IlV. rsz Adatkezels


A Visual C# ezt az utastst gy dolgozza fel, hogy elszr megkeresi a HKEY_CURRENT_USER fgat, majd megnzi a \Softwar e kulcsot. Meg is tallja, mivel ez minden Windows rendszet gpen ltezik - de nem rja fell. Ez utn a Visual C# a CleverSoftware kulcsot keresi. Tegyk fel, hogy nem tallja, ezrt ltrehozza azt s a megadott alkulcsait. JegyezZk meg, hogy ha a Visual C# ltez alkulesokat (minden aikuicsot egy perjel(\ ) vlaszt el a tbbitl) tall az utastsunkban, azokat nem rja fell.

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.

Rendszertarr adatbzisbeli kulcsok trtse


Rendszerler adatbzisbeli kulcsok trlsre kt tagfggvnyt hasznlhatunk: a Del eteSubKey () s a De l e t eSubKeyTree ( ) tagfggvnyt. A Del eteSubKey (} a megadott kulcsot s annak minden rtkbejegyzst trli, de csak akkor, ha az nem e l e t e SubKeyTree () a megadott kulcsot, annak minden tartalmaz alkulcsokat. A D rtkbejegyzst, s a benne lv alkulesokat s azok rtkbejegyzseit is trli, ezrt vatosan hasznljuk! me egy utasts, amellyel az elz mintakddalltrehozott kulcsot trlhetjk: Regi s try. CurrentUser.DeleteSubKey ( @ "Softwa r e\Cl ever Software\PictureViewer" ) ;

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.

Kulcsok rtkeinek kiolvassa s belirtsa


A kulcsok ltrehozsnak s trlsnek lehetsge hasznos, de csak azrt, mert a kulcsok alkotjk az igazn fontos adatok, az rtkbejegyzsek szerkezett. Mr megtanultuk, hogy egy kulcsnak egy vagy tbb rtkbejegyzse lehet, s ezek egyedi adattpussal rendelkeznek. Ezek utn mr csak annyi maradt, hogy megismerjk a rendszerler adatbzis rtkbejegyzseit kezel kdot.

20. ra Szvegfjlok s a rendszel1err6 adatbzis hasznlata 415


Sajnos a kulcsok rtkbejegyzseinek kiolvassa s belltsa nem olyan egyszerti, mint a kuJcsok meghatrozsa. Amikor IruJesokat hatrozunk meg, a Registry objektum megknnyti a legfels kulcsok elrst, miveJ mindegyikhez tartozik egy objektumtulajdonsg. Lteznek tulajdonsgok az egyes legfels Irulesokhoz tartoz rtkbejegyzsek kiolvassra s belltsra is, de ezek nem gy makdnek, minl azt vrnnk. Egy j rtkbejegyzs ltrehozshoz vagy egy meglv rtkbejegyzs mdostshoz a Registry . SetValue () tagfggvnyt hasznlhatjuk A SetValue () tagfggvny utastsformja a kvetkez: SetValue(kulcstvonal, bejegyzsnv, rtk) Sajnos meg kell adnunk a legfels kulcs nevt a kulcstvonal argumentumban, amit mindjrt ltni is fogunk. Figyeljk meg, hogy nem hatrozzuk meg az adattpust: ezt a Visual C# lltja be a tagfggvnynek tadon rtk alapjn. Egy Registra t ionName nev rtkbejegyzs ltrehozshoz az elz rszben trgyalt Irulesban pldul a kvetkez utastst hasznlhatjuk Registry . SetValue(@"HKEY_CURRENT_USER\Software\CleverSoftware\ PictureViewer\ , "RegistrationNarne, James); Ez az utasts ltrehozza az rtkbejegyzst, ahogy a 20.2. brn lthat.

,.._
!

l' i ll . :l
l
l

___
s,-1>

<!! ~ . J ..~~ ...... ~ ~ i'

......._

. Type

~--.;ro_sz lof-IEG.,SZ

l . l
!

... .......
.

..~~

. . . VOilopms . .. ~
~

~~:l:.

w"

__ _

(........ M(I

. w ..
~ w~

l ll- a-.-..
~~~w

WincttlwsNT ~ _"_ i ' l 1 Jo W-Sidelo

' 'l ,.,jj -~ wo.-....J -- 4\


'

-"-

JI ......

c~.~~~,~-

l ' ... ~ . .
ct,!!~

t.;: itJ.

. ~"'9 !1'
"!!~JI~

-,
,,

20.2. bra
Az rtkek a kulcsokhoz

kapcsoldva jelennek meg

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)

416 I lV. rsz Adatkezels


A kulcstvonal s a bejegyzsnv paramterek azonosak a SetValue (l tagfggvnyben hasznltakkat Nha, amikor egy rtkbejegyzst prblunk kiolvasni a rendszerler adatbzisbl, az rtkbejegyzs s taln maga a kulcs sem ltezik. Ennek szmosoka lehet: egy msik alkalmazs vagy egy felhasznl trlte az rtkbejegyzst, vagy a felhasznl a rendszerler adatbzist egy olyan korbbi llapotba lltotta vissza, amikor az rtkbejegyzs mg nem ltezett. Az alaprtelme z e tt_rtk paramtert arra hasznlhatjuk, hogy meghatrozzuk, hogy milyen rtkkel trjen vissza a GetValue (l tagfggvny, ha nem tallja a krt rtkbejegyzst Ezzel megszntethetjk az rtkbejegyzsek hinyakor fellp kivtelek elfogsnak sZksgessgt. A kvetkez6 utasts az elz pldban ltrehozott Registra tionName bejegyzs rtkt jelenti meg: string strRegName ; strRegName = Convert.ToString( Regist ry. GetVa l ue(@ "HKEY_CURRENT_USER\ Softw are\ CleverSoftw are\ Pict ureViewer\", "RegistrationName ", ""J); M essageBox. Show(strRegName) ;

A Picture Viewer projekt m6dosftsa a rendszerler adatbzis hasznlathoz


Ebben a rszben gy mdostjuk a Picture Viewer programunkat, hogy az Options prbeszdablakban megadott felhasznli belltsok a rendszerler adatbzisba kerljenek, s amikor a felhasznl elszr indtja el a Picture Viewert, a program a rendszerler adatbzisbl tltse be a belltsokat. Kezdjk a Picture Viewer projektnk megnyitsva!, amellyel utoljra a 19. rn dolgoztunk.
Az albbi lpseket kvetve hozzunk ltre egy us ing utastst, hogy ne kelljen minden

Registry objektum el odarni a Microsoft . Win32

eltagot:

1. Kattintsunk dupln az Op t i ensForm ablakra az ablak Load esemnynek

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;

Belltsok megjelenftse a rendszertefr adatbzisbl


Kvetkez

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:

20. ra Szvegfjlok s a randszertefr adatbzis hasznlata 417


txtUserName . Text = Convert .ToString(Registry.GetValue( @"HKEY_CURRENT_USER\Software\CleverSoftware\PictureViewer\", "UserNa me", )); chkPromptOnExi t . Checked - Convert . ToBoolean(Registry.GetValue( @"HKEY_CURRENT_USER\Software\CleverSoftware\PictureViewer\", "PromptOnExi L", "false ) ) ; if (Convert . ToString(Registry . GetValue( @"HKEY_CURRENT_USER\Software\CleverSoft wa re\PictureV.iewcr\", "BackColor", "Gray ) l == "Gray ) optBackgroundDefault.Checked = true; el se optBackgroundWhite . Checked = true; A fenti kdnak mr minden rsze ismers kell legyen. Az els utastssal a txtuserName szvegmez rtkt lltjuk a re ndszerler adatbzisban trolt felhasznlnvre. Az Options ablak els betltsekor mg nincs ilyen bejegyzs a rendszerler adatbzisban, ezrt kezdetben egy res karakterlncot hasznlunk. Figyeljk meg, hogy a hvst egy Convert. ToS t ring {) tagfggvnybe tettk bele, teht brmilyen rtket is kapunk a rendszerler adatbzisbl, karakterlncc alaktjuk t, amit a szvegmero mr elfogad. A msodik utasts belltja a Prompt on Exit jellngyzet rtkt a rendszerler adatbzis alapjn. Ha nem tall ilye n rtket, ami az Options ablak els betltsekor fordulhat el, a Checked tulajdonsg fa lse rtiru lesz. A GetValue {J lvs eredmnyt itt is egy talakt fggvnynek kell tadnunk- ebben az esetben a Convert . ToBool ean (J tagfggvnynek -, amely a kapott rtket logikai tipusv alaktja. A kvetkez utasts egy if ... e l se szerkezettel kezddik, amely egy szn nevt keresi a rendszerler adatbzisban, s a megfelel bellts gombjnak Checked rtkt true rtkre lltja. Mivel a lvs eredmnyt egy karakterlnccal vetjk ssze, az eredmnyt egy Convert. ToString () fggvnybe burkoljuk, hogy karakterlncc alaktsuk.

Bellftsok mentse a rendszertefr6 adatbzisba


Most, hogy az Options ablak mr kpes megjelenteni a rendszerler adatbzisban trolt jelenlegi rtkeket, hozzadhatjuk azt a kdot, amely a felhasznl ltal megvltoztatott belltsokat menti. Kvessk az albbi lpseket 1. Grgetssei keressk meg a btnOK_C l i c k eljrst. 2. Adjuk hozz a kvetkez kdot a btnOK_Click esemnyhez. gyeljnk r, hogy a kdot a mr ltez thi s . Close (l utasts el rjuk. Registry. SetValue { HKEY_CURRENT_USER\Software \CleverSoftware \ Pict.ureViewer\ , @ "UserName, txtUserName. Text) ;

418 1rv. rsz Adatkezels


Registry.SetValue( @"HKEY_CURRENT_USER\Software\CleverSoftware\PictureViewer\", "PromptOnExit", chkPromptOnExit.Checked); if (optBackgroundDefault.Checked) Registry.SetValue( @"HKEY_CURRENT_USER\Software\CleverSoftware\PictureViewer\", "BackColor" "Gray" J; else Registry.SetValue( @"HKEY_CURRENT_USER\Software\CleverSoftware\PictureViewer\" "BackColor" "White);
l
1

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.

A rendszer1efr6 adatbzisban trolt belUtsok hasznlata


Az imnt lehetv tettk a felhasznlnak, hogy megtekintse s megvltoztassa a rendszerler adatbzisban trolt belltsokat, de valjban mg nem a felhasznl belltsait hasznljuk. A rendszerler adatbzisban trolt rtkek hasznlathoz kvessk az albbi lpseket: 1. Kattintsunk dupln a ViewerForm. cs elemre a Solution Explorer ablakban, hogy a terveznzetben megnyissuk a Picture Viewer fablakt. 2. Kattintsunk dupln az ablakra a Load esemny megnyitshoz. 3. Grgessnk az eljrs elejre, s adjuk hozz a kvetkez utastst a us ing blokk utn: using Microsoft.Win32; 4. Grgessnk le a ViewerForm. Load esemnyig. Ez az esemny jelenleg 6 sornyi kdot tartalmaz. Nzzk elszr az albbi utastsokat: m_blnPromptOnExit = c_defPromptOnExit; mnuConfirmOnExit.Checked = m_blnPromptOnExit; Emlkezznk vissza, hogy a Prompt On Exit jelzt modulvltozknt tartjuk nyilvn. Az els utasts ezt a jelzt lltja be az alaprtelmezettknt megadott lland rtkre. A msodik utasts a menelem bejellsi llapott lltja be a vltoznak megfelelen. 5. Trljk a m_blnPromptOnExi t =c_defPromptOnExi t; utastst, s rjuk be helyette ezt: m_blnPromptOnExit = Convert.ToBoolean(Registry.GetValue( @"HKEY_CURRENT_USER\Software\CleverSoftware\PictureViewer\" "PromptOnExit"~ "false"));

20. ra

s a rendszertefr6 adatbzis hasznlata 419

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 ;

A Pictura Viewer program tesztellisa lis hibamentesftse


Az F5 billentyti lenyomsval futtassuk a projektet, majd kattintsunk az eszkztron az Options gombra az Options ablak megjelettshez. Semmi sem vltozott rajta. Az j kdunk hatsnak megtekintshez hajtsuk vgre az albbi lpseket: 1. A User Name (Felhasznlnv) szvegmezbe rjuk be a nevnket. 2. jelljk be a Prompt to Confirm Exit jellngyzetet 3. Kattintsunk az Appearance (Megjelens) flre, majd jelljk be a White (Fehr)
lehetsget.

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.

420 tv. rsz Adatkezels

'

Ft;~_,.,. _~rio.

"''
.....

:a ~
p : . ".. -

:'"!!rt! ; "1'11.!:1:.
'"'!'!
r.
"!" -~-~-'

. ~"

.. , ~\.1&1>

:..
...... ,. .....

f'

r '
'

"':l~

'"t

:,,c. .. . )r.,_"._r,::J

Joe.:.. , .

t , ..

" r:

&EifH'A R i 94'** eegay;eag+s&i'M''*i*A ,,~

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();

5. Lpjnk a kurzorral a ViewerForm_Load esemny zr kapcsos zrjele utn,

s az ENTER billentyvel nyissunk j sort.


6. rjuk be a kvetkez utastsokat, majd ssnk ENTER-t:

private void LoadDefaults()


{

7. A Cnu.+V billentyk lenyomsval illessZk be a Form_Load esemnybl trlt

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

s a rendszel1efr6 adatbzis hasznlata 421

pri~

YOid

Lo~O.hulU ()

~Oft!xit-

IIXIY caaa~ OSU\5or~w.re\C:l"*--'Soltwa.r.\".1~Vi ..... r\ ... ~tOn.llrt~ "' ! &lee")):

Coout..foiOoJ.en(Ar,iat:ry. GetVbs(

CC:' ~rt. ToSUl.noCRequuy.c;;etV&11i1&c ID&Y c:t"IUI%.8Y us:ER\SOlcv.r\Chnrsot:.va.re\Pl.cLu.evlttnr\",


a_otJ,hC~:utkckeolot

~.l.cu:", -inr"'))- "Guy) svn.Da-WJ.OOSy.s~ow;.s.QJu;r-ol~


.. Spt-.Dr.V1DQ1. Color.llbi.U.l

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!

422 IlV. rsz Adatkezels

Szvegfjlok olvassa s frsa


A rendszerler adatbzis knyelmes hely a felhasznli s programbelltsok trolsra, sok adatot, pldul szveges dokumentumokat viszont nem clszeru trolni benne. Ha sok szveges adatot kell trolnunk s kiolvasnunk, akkor valsznleg egy rgimdi szvegfjl a legjobb vlaszts (feltve, hogy nem ll rendelkezsre egy olyan valdi adatbzis, mint a Microsoft SQL). A Visual C# kt osztllyai teszi viszonylag knnyv aszvegfjlok kezelst: a Streamwriter s StrearnReader osztlyokkaL Vegyk szre, hogy a szvegfjlok olvasst s r'st kt klnbz objektum hajtja vgre, s egyszerre csak az egyikk frhet hozz egy fjlhoz. Ha egyszerre szeretnnk olvasni s rni egy fjlt, akkor jobban tesszk, ha valdi adatbzist hasznlunk.

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();

Ez a rszlet az albbi adatokat hozza ltre a szvegfjlban:


text l text 2 text 3

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.

Most nzzk meg ugyanazt a kdrszletet, de writeLine () helyett Write () tagfggvnyekkel:


System . IO . StreamWriter objFile = new System . IO . StreamWriter(@"C : \test.txt " ); objFile .Write (" textl" ) ; objFile .Write("text2") ; objFi le.Write("text3"); objFile.Close(); obj File.Dispose();

Ezzel egy olyan szvegfjl jn ltre, amely az albbi szveget tartalmazza:


textltext2text3

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

424 IlV. rsz Adattezals


hasznljk tbbszr. Az albbi kd szernllteti, hogyan hasznlhatjuk a Wri teLine () tagfggvnyt albumok listjnak trolsra (feltesszk, hogy a listnk egy lstAlbums nev listamez6ben tallhat): System.IO . StreamWriter objFile = new System.IO.StreamWriter(@ "C:\albums.txt"); for (int intCounter = O; intecunter intCounter++)
<~

lstAlbums . Items .Count -l ;

obj File.WriteT.ine(Convert .ToString(lstAlbums.ILems[intcounter l>J; objFile . Close(); objFile . Dispose() ;

Olvass szvegfjlbl
A szvegfjlokbl trtn olvasst a StreamReader osztly kezeli, amely

a StreamWri ter osztlyhoz hasonlan viselkedik. StreamReader tpus objektumot, pldul gy:

Elszr

meg kell hatroznunk egy

System .IO.StreamReader objFile = new System.IO.StreamReader(@"C : \test . txt");


A lnyeges klnbsg a StreamReader s a StreamWriter objektumok meghatroz-

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.

A Pictura Viewer program mdosftsa szvegfjlok hasznlathoz


Ebben a rszben a Picture Viewer projektnket gy mdostjuk, hogy kpes legyen szvegfjlok hasznlatra. A clunk az, hogy minden alkalommal, amikor a felhasznl megtekint egy kpet, akkor a Picture Viewer frisstsen egy naplfjlt (vagyis egy szvegfjlt). Utna ltrehozunk egy egyszeru prbeszdablakot, amelyet megnyitva a felhasznl megtekintheti a naplfjlt Ha a Picture Viewer projekt korbbrl nem lenne megnyitva, akkor most nyissuk meg.

426 IlV. rsz. Adatkezsls

A Picture Viewer naplfjljnak ltrehozsa


Ebben a rszben gy mdostjuk a Picture Viewer programunkat, hogy ltre tudjon hozni egy naplfjlt A naplzsi lehetsgek megvalstsa cljbl kvessk az albbi lpseket: 1. Kattintsunk dupln a ViewerForm.cs elemre a Solution Explorer ablakban, hogy az ablaksablont terveznzetben lssuk. 2. Emlkezhetnk r, hogy a kp megnyitshoz egy olyan, nll eljrst irtunk, amelyet vagy a menbl , vagy az eszkztrrl hvhatunk meg. Ez megknnyti a dolgunkat, rnivel gy csak egy helyen kell a naplzsi kdot hozzadnunk. Kattintsunk dupln az eszkztron az Open Picture gombra a click esemny megnyitshoz. 3. Most meg kell keresnnk az OpenPicture () fggvnyt. Ennek a legegyszelilbb mdja a kvetkez: kattintsunk az egr jobb gombjval a this .OpenPicture (} kdra, majd vlasszuk a Go To Definition (Ugrs a meghatrozshoz) parancsot a helyi menbl, ahogy a 20.5. brn lthat. Valahnyszor gy tesznk, a Visual C# megmutatja a hivatkozott eljrs kdjt.

.F-ri-t.e 1"0id t..tlbD&'WIIOt&r_Cl..1ek(otJ3ect

~-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

s a rendszerlerr6 adatbzis hasznlata 427

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() ;

A kd nagy rsze knnyen rthet, de nzzk ezt a rszletet:


System.AppDomain.CurrentDomain.BaseDirectory
+

@"\PictureLog . txt "

prl . .t.tl cU.d. ape.a.t:tv't U

..... c
(

11 m.o- t:bll

Ol)a'ft Uh du\oo bo-.. 2.1: totcs.l~tn:ore.SbCW011Av O -

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.

428 IlV. lisz Adatkezels


Amikor a Visual C# fejlesztkrnyezetben hibamentestjk az alkalmazsunkat az alkalmazs elrsi tja nem biztos, hogy az lesz, amire szmtunk. Amikor lefordt juk s teszteljk az alkalmazst, a Visual C# ltrehoz egy b in \Debug mappt a projekt mappjban. Ide helyezi el a hibakeress cljra az ideiglenesen ltrehozott . exe fjlt, s ez lesz az alkalmazs elrsi tja. Ha teht a projektnk mappjban keressk a naplfjlt, nem fogjuk megtallni - le kell mannnk egszen a b in \Debug mappig, hogy megtalljuk.

A Pictura Viewer naplfjljnak megjelenttse


Ebben a rszben gy mdostjuk a Picturc Viewer programot, hogy tartalmazzon egy prbeszdablakot, amelyet a felhasznl megjelenthet a naplfjl megtekintshez. A naplfjl megtekintst lehet6v tev kd ltrehozshoz kvessk az albbi lpseket 1. Vlasszuk a Project men Add Windows Form parancst az Add New ltem prbeszdablak megjelen.tshez. rjuk be a LogViewerForm.cs nevet az j ablaksablon neveknt, s kattintsunk az Add gombra az ablaksablon ltrehozshoz. 2. lltsuk be az j ablak tulajdonsgait az albbiak szerint: Tulajdonsg MaximizeBox MinimizeBox Size Text rtk False False
520, 344

Picture Viewer History Log

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
=

"The log fil e could not be found. ";

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();

430 IlV. rsz Adatbzels

A Pictura Viewer napljnak tesztelse


Mentsk a projektet, s futtassuk az F5 lenyomsval. Kvessk az albbi lpseket a program tesztelshez: 1. Kattintsunk a View Picture Log gombra az eszkztron a Picture Viewer History Log megjelentshez. A szvegmezben ekkor a The log file could not be found zenet jelenik meg, ami azt jelenti, hogy a try blokk mkdtt. 2. Az OK gombra kattintva zrjuk be az ablakot. 3. Kattintsunk az Open Picture gombra az eszkztron, keressnk egy kpfjlt, s nyissuk meg. 4. Kattintsunk jra a View Picture Log gombra. Lthatjuk, hogy a napl most egy naplbejegyzst tartalmaz, ahogy a 20.7. brn lthat.

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?

432 1IV. rsz Adatkezels

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

IlV. rsz Adatkezels


rbb megtanulni a hasznlatr, ezrt egy Jet adatbzist felhasznlva fogunk pldaprogramokat kszteni. Viszont ne felejtsk el azt sem, hogy amit itt megtanulunk, annak a 990 /o-a kzvetlenl felhasznlhat az SQL Serverben is.

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.

21. ra Adatbzisok hasznlata 435

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.

Paramter Provider Data Source User ID

Lers
A hasznlni kvnt adatszolgltat neve (Jet, SQL stb.). Az adatforrs (adatbzis) neve, amelyhez csatlakozni szeretnnk.

Password DRIVER SERVER

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

IlV. rsz Adatkezels


Neknk most a Prov ider= paramter az egyik legfontosabb, amely a hasznlt adatbzistl fgg. Pldul ha egy SQL Server adatbzishoz szeretnnk hozzfrni, akkor a szolgltat adatait az SQL Server szerint adjuk meg, ha pedig egy Jet adatbzishoz, akkor a Jet szerint. Ebben a pldban egy Jet (Microsoft Access) adatbzist hasznlunk, teht hasznljuk a Jet szolgltati adatait. A szolgltatn kvl meg kell adnunk az adatbzist is. A knyv honlapjn hozzfrhetv tettem egy mntaadatbzst. A kdunk felttelezi, hogy az adatbzist a c : \ Temp nev mappban helyeztk el. Ha msik mappt hasznlunk, akkor annak megfelelen mdostsuk a kdot. Kvessk az albbi lpseket: 1. Adjuk meg az ADO.NET-kapcsolat Connectionstring rulajdonsgt, azaz rjuk be a kvetkez utastst az ablakunk Load esemnykezeljbe:
m_cnADONetConnect i on.Connect i onString
Source~C : \temp\c ontac t s . mdb ";

@" 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 () ;

A Jeten kvli tovbbi szolgltatk kapcsolati karakterlnct megtallhatjuk a sgban.

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.

Adatforrs kapcsolatnak bontsa


Az adatforrsokkal val kapcsolatot mndig rdemes kln paranccsal bontani. Ez azt jelenti, hogy nem ajnlott egy hasznlaton kvli vltozra bzni a kapcsolat bontst, hanem a kdban rdemes kifejezetten lezrni a csatlakozst. Ezt a kapcsolatobjektum Close () tagfggvnyvel tehetjk meg. Ahhoz, hogy olyan kdot rjunk, amely az ablak bezrsakor bontja a kapcsolatot, kvessk az albbi lpseket:

21. 6ra Adatbzisok hasmlata


1. Kattintsunk a MainForm.cs (Design) flre az ablaktetVezhz val visszatrshez. 2. Kattintsunk az Events gombra (villm ikon) a Properties ablakban, hogy hozzjussunk az ablak esemnyeinek listjhoz. 3. Kattintsunk dupln a Formelosing esemnyre egy j esemnykezel ltrehozshoz. rjuk be a kvetkez utastsokat az esemnybe:
m_cnADONetConnection . Close() ; m_cnADONetConnection.Dispose();

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.

A DataTabla objektumok mOkdse


A DataTable objektumok az adatforrs adatainak pillanatkpt tartalmazzk. ltalban
azzal kezdnk, hogy feltltnk egy DataTable objektumot, dolgozunk az eredmnyvel, majd visszakldjk a mdostsokat az adatforrsnak A DataTable objektumokban a DataAdapter objektum Fill () tagfggvnyvel helyezhetnk el adatokat, a vltoztatsokat pedig a DataAdapter Update () tagfggvnyvel tudjuk visszakldeni az adatbzisnak. A DataTabi e objektumon vgzett minden mdosts addig csak a helyi msolatban lesz jelen, amg meg nem hvjuk az Update (l tagfggvnyt A helyi msolat hasznlatval cskkenthet az adatbzisrt vvott harc, mivel amg valaki nyitva tartja az adatbzist, addig msok nem frhetnek hozz. Ha ismers neknk az ADO, akkor rjhetnk, hogy ez hasonl az ott tallhat Optimistic Batch Client Cursor lehetsghez.

DataAdapter objektum ltrehozsa


Egy DataTable feltltshez sZksgnk van egy DataAdapter objektum ltrehozsra. A ltrehozand DataAdapter az adatforrshoz korbban meghatrozott kapcsolatot hasznlja, s vgrehajtja a megadon lekrdezst. A lekrdezs eredmnye ezutn bekerl a DataTable objektumba. Korbban emltettk, hogy a .NET keretrendszer tbbfle kapcsolatobjektummal rendelkezik, de ezenfell van szmos ADO.NET DataAdapter-objektuma is. Ezek kZl mi az oleDbDataAdapter objektumot hasznljuk, mert egy Microsoft Access adatbzishoz fogunk csatlakozni.

438 IlV. rsz Adatkezels


A DataAdapter konstruktornak olyan parancsokat adhatunk t, amelyeket egy DataTable vagy Dataset feltltsekor kell vgrehajtania, s megadhat egy kapcsolat is, amellyel az adatforrst adjuk meg (egy projekten bell egyszerre tbb kapcsolatunk is lehet nyitva). A konstruktor utastsformja a kvetkez:
OleDbDataAdapter cnADONetAdapter ~ new OleDbDataAdapter ([Parancs), {Kapcsolat));

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);

21 . 6ra Adatbzisok hasznlata 439


Amikor Jet adatbzist hasznlunk, a ConunandBuilder csak akkor tudja ltrehozni a dinamikus SQL kdot, ha a krdses tbla rendelkezik elsdleges kulccsal.
A kdunknak most gy kell k.inznie, ahogy a 21.1. brn lthat.

C~ei*Co.ao;:t.tGft -~~ MV Olel)t,c:.o:::..rw-=u<;~r.() :

Oltdlbn.talo4.11t'f'

-~'H"I

Ol~~~GQJ.l.;t.~ -~lO.r;

JU'lvn "'Oid Ma..l.o.ro.aa_t.o.dCablecto . .JIIM:r~ Ev'"nt.).rq~S e)


(

c::DADC*etColmect.loa .Comtl!c~r.uq - lbvndC~-.c..iCIN:Kif'\:.Jn.OL&W. t. OIDat ~c~:\tC-'\c;a~tcta.lldb"';


e_~C~ecRtOD.CIIlt!':a(l;

21.1 . bra
Ebben a pldban sok helyen, sokfo/e objektummal dolgozunk. Ogyeljnk r,

..;._" Ol~I*Dn.a~u (se.le:c::t ma eoou~ -~~~:U.an) s


Ob~ndlkn..l.der

~u.AMpte;,-

IIIW

Oh:JI)C~tuld.n (a_ daDU..,.pter):

~lCIU'

hogy pontosan k6vessk a lpsekett

DataTable objektumok ltrehozsa s feltltse


A kvetkez feladat egy modulszinta DataTable objektum ltrehozsa a projektnkben.

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);

440 IlV. rsz. Adatkezels


Mivel a DataTable nem tart fenn kapcsolatot az adatforrssal, gy nem is kell bontanunk azt, ha vgeztnk. Az osztlyunknak most gy kell kinzni, ahogy a 21. 2. brn lthat.

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

Hivatkozs mez6kre egy DataRow objektumban


A DataTable objektumok DataRow (adatsor) objektumok gy(Ijtemnyt tartalmazzk. A DataTabl e objektumon bell egy sor elrshez meg kell adnunk a krdses DataRow objektum sorszmt (indext). Pldul a DataTable objektum els6 sort gy rhetjk el:
DataRow m_ rwContact

= 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.

21. ra Adatbzisok hasznlata 441


Most ltrehozunk egy elj~rst, amelyt arra hasznlunk, hogy megjelentsk az adartbla aktulis rekordjt. Ehhez kvessk az albbi lpseket: 1. Helyezzk a kurzort a M ainForm _FormCl osing esemny zr kapcsos zrjele utn, s nhnyszor ssk le az ENTER-t, hogy nmi res helyhez jussunk. 2. rjuk be a kvetkez eljrst teljes egszben: private void ShowCurrentRecord(}
{

if (m_dtCont acts . Rows . Count ==O)


{

t xtContact Name . Text txtState . Text ""; r eturn;

"";

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):

Tulajdonsg Name Location Size

rtk txtContactName
48, 112 112 ' 20

5. Adjunk egy msodik szvegmezt az ablakhoz s lltsuk be a tulajdonsgait a kvetkez tblzat szerint:

Tulajdonsg Name Locat ion Size

rtk txtState
168 ' 11 2 80, 20

442 tv. rsz Adatkezels


6. Az PS lenyomsval futtassuk a projektet. A Contacts tblban lv els gyfl megjelenik a szvegmezben, ahogy a 21.3. brn lthatjuk.

21.3. bra
Az ada.tok megjelentse nmi elkszletet ignyel

Mozgs a rekordok kztt


Az ADO.NET DataTable objektumaszmos mdszert tmogat, amelyekkel ellehet rni a Dat aRow objektumait A legegyszerbb ezek kzl a sorszm szerinti hozzfrs, ataTable nem amit a ShowCurrentRecord () tagfggvnyben hasznltunk Mivel a D fgg az adaorrstl, ez a lehetsg az adat forrshelytl fggetlenl elrhet. Most olyan gombokat hozunk ltre, amelyekkel a felhasznl a DataTable objektumban mozoghat. Az els gombbal az elsrekordra fogunk lpni a Da t aTabl e objektumban. Kvessk az albbi lpseket: 1. lltsuk le a fut projektet', s nyissuk meg a M a inForm ablakot az ablaktervezben. 2. Adjunk hozz egy j gombot, s lltsuk be a tulajdonsgait a kvetkezk szerint:
Tulajdonsg Name Location Si ze Text

rtk btnMoveFi rs t
12 , 152 32 , 23
<<
kvetkez

3. Kattintsunk dupln a gombra, s adjuk a

kdot a Click esemnyhez:

l l Az e l s sorba l pnk s m eg jel entjk az adatot rn_rowPosition = O; thi s . ShowCur rentRecord() ;

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

5. Kattintsunk dupln a gombra, s adjuk hozz a esemnyhez:

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)

m _ rowPosition this . ShowCurrentRecord ( ) ;

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

7. Kattintsunk dupln a gombra, s adjuk a

kdot a Click esemnyhez:

l l Ha nem az utols sorban vagyunk, akkor lpjnk eggyel tovbb, l l s jelentsk meg a r ekordot

if (m_rowPosit ion < m_dtCon tacts. Rows .Count - 1)


{

m _ rowPosition++; this . ShowCurrentRecord() ;

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:

444 IlV. rsz Adatkezels


Tulajdonsg Name Location Size Text rtk btnMoveLast
124, 152 32, 23

>>
kvetkez

9. Kattintsunk dupln a gombra, s adj1 uk a

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)
{

m _rowPosition = m_dtContacts.Rows.Count -1 ; this.ShowCurrentRecord();

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:

Tulajdonsg Name Location Size Text

rtk btnSave
162, 152 40. 23

Save
kvetkez

2. Kattintsunk dupln a Save gombra, s adjuk a esemnyhez:

kdot a Click

l l Ha az adattbla nem res, akkor frisstsk a rekordot if (m_dtContacts.Rows.Count !=0)


{

m_dtContacts.Rows[m_rowPosition) ["ContactName ")= txtContactName. Text; m_dtContacts.Rows[m_rowPosition] ["State"] = txtState .Text; m _daDataAdapter.Update(m_dtContacts);

21. 6ra Adatbzisok hasznlata 445

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:

Tulajdonsg Name Location

rtk
grpNewRecord
16, 192

Size
Text

256 , 58 New Contact

2. Adjunk egy j szvegmezt a csoportmezhz (ne az ablakhoz!), s lltsuk be a tulajdonsgait a kvetkezk szerint:

Tulajdonsg Name Location Size

rtk
txtNewContactName
8, 2 4

112' 20
csoportmezhz,

3. Adjunk egy msodik szvegmezt a sgait az albbiak szerint:

s lltsuk be a tulajdon-

Tulajdonsg Name Location Size

rtk
txtNewState
126, 24

80 ' 20

4. Vgl adjunk egy gombot a csoportmezhz, s lltsuk be a tulajdonsgait a kvetkezk szerint:

446 IlV. rsz Adatkezels


Tulajdonsg
Name Location S ize Text

rtk
b t nAddNe w

21 0, 22
40, 23 Add
kvetkez

5. Kattintsunk dupln az Add gombra, s adjuk a esemnyhez:

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

2. Kattintsunk dupln a Delete gombra, s adjuk a esemnyhez:


i f (m_d t Contact s . Rows . Count
{

kdot a Cl i c k

l l Ha az adattbla nem re s , a kkor trlj k a jelenlegi sort

!=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. 6ra Adatbzisok hasznlata 447


Az ablakunknak most gy kell kinznie, mint ahogy a 21.4. brn lthat.

21.4. bra
Alapszint adatbeviteli rlap

Az adatbzis-kezel6 pldaprogram futtatsa


A projekt futtatshoz nyomjuk meg F5-l. Ha helyesen rtuk be az sszes kdot, s a Contacts adatbzist a C : \ Temp mappban helyeztk el (vagy mdostottuk az elrsi utat a kdban), akkor az ablaknak hiba nlkl meg kellene jelennie az adatbzis els rekordjval. Kattintsunk a navigcis gombokra a rekordok kztti elre s htra lpkedshez. Nyugodtan megvltoztathatjuk egy gyfl adatait; ha a Save gombra kattintunk, a mdostsok a httradatbzisba is bekerlnek Prbakppen irjuk be a nevnket s a megynket az ablak New Contact rszbe, s kattintsunk az Add gombra. A nevnk ekkor bekerl az adatbzisba s megjelenik a megfelel szvegmezkben. szrevehettk, hogy a ktszer szerepl rekordokkal nem foglalkoztunk a kdban, ezrt ha ugyanazzal a nvvel prblunk msik rekordot ltrehozni, hibt kapunk.

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

IlV. rsz Adatkezels

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-

mot kell hasznlnunk.

21 . 6ra Adatbzisok hasznlata 449


5. A Provider argumentum. 6. Egy commandBuilder objektum. 7. j sort az Add (l tagfggvnnyel hozhatunk ltre, a mdostsokat pedig az Update () tagfggvnnyel menthetjk az j sorba.

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

Alkalmazsok irnytsa automatizlssal


A lecke tarta/mbl:

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.

452 IlV. rsz. Adatkezels


Az objektumait kvlrl elrhetv tev programokat kiszolglknak hvjuk, azokat a programokat pedig, amelyek ezeket felhasznljk, gyfeleknek Az automatizlsi kiszolglk ltrehozshoz komoly tudsr-.a van szksg, ami a programozsi osztlyok rszletes ismerett is magba foglalja. Olyan gyfeleket viszont, amelyek ms alkalmazsok objektumait hasznljk, arnylag knnyen ltrehozhatunk. Ezen az rn megtanuljuk, hogy miknt kszthetnk olyan gyflalkalmazst, amely egy kls kiszolglalkalmazs objektumait hasznlja.

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

az ablaksablonhoz, s lltsuk be a gomb tulajdonsgait a


Tulajdonsg Name Location Size Text

kvetkezk

szerint:

rtk
btnAutomateExcel
90, 128 104, 23

Autornate Excel

Automatizlsi knyvtrra mutat6 hivatkozs ltrehozsa


Egy olyan program objektumainak hasznlathoz, amely tmogatja az automatizlst (kiszolglknt), ltre kell hoznunk egy hivatkozst az adott program tfpusknyvtrra. A prograrnak tpusknyvtra (amelyet objektumknyvtrnak is neveznek) egy fjl, amely a program objektummodelljnek a lerst tartalmazza. Miutn ltrehoztunk egy hlvatkozst az automatizlsi kiszolgl tpusknyvtrra (amelyet sszetevnek vagy komponensnek is neveznek), a kiszolgl objektumait gy rhetjk el, mintha azok a Visual C# bels objektumai lennnek. Egy az Excel automatizlsi knyvtrra mutat hlvatkozst ahhoz hasonlan hozhatunk ltre, rnint ahogy a System. Data hivatkozsthoztuk ltre a 21. rn. Az Excel fggvnyknyvtrra mutat hivatkozs ltrehozshoz kvessk az albbi lpseket:

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.

Az automatizlsi kiszolgl pldnynak ltrehozsa


A tpusknyvtrra val hivatkozs lehet6v teszi a Visual C#-programnak, hogy a sajt bels objektumait a tpusknyvtr elrhet6 objektumaival egytt hasznlja. Miutn ezt a hivatkozst ltrehoztuk, meghatrozhatjuk a tpusknyvtrban tallt objektumtpusokon alapul objektumvltozkat. Az Excelnek van egy Application nevG objektuma, amely az Excel objektummodelljben az elsdleges objektum szerept jtssza. Igazbl minden Offlee-programnak van egy Application objektuma. Honnan tudjuk, hogy egy automatizlsi kiszolgl milyen objektumokat tmogat? Az egyetlen biztos mdszer, ha a krdses program lersban keressk meg a vlaszt, de hasznlhatjuk az objektumtallzt is, amelyrl a 3. rn tanultunk.

454 1 'N. rsz Adatkezels


Ebben a pldban egy Excel-objektum nagyjbl fltucat tagjt hasznljuk. Ezzel az Excel objektummodelljnek a felsznt is alig rintjk, de nem is ez a clunk. Amit ebben a pldban meg szeretnnk mutatni, az az, hogy miknt lehet egy automatizlsi kiszolglval dolgozni. Ha a sajt projektjeinkben egy alkalmazst automatizlni szeretnnk, akkor az alkalmazs fejleszti dokumentcijbl prbljunk minl tbbet megtudni az alkalmazs objektummodelljrl. Meg fogunk lepdni, hogy makkora az elrhet lehetsgek szma.
Az elbb ltrehozott COM-hivatkozs hasznlathoz hozz kell adnunk egy us ing

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.

22. 6nt Alkalmazsok irnyftsa automatizlssal 455

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);

Az Excel-munkafzetben tallhat adatok hasznlata


A munkafzetek alaprtelmezs szerint egyetlen munkalapot tartalmaznak. Ebben a rszben egy munkalapon lv adatokkal fogunk dolgozni. Az albbiak a teendink: 1. 2. 3. 4. rjunk adatokat a munkalap ngy celljba. jelljk ki a ngy cellt. Adjuk ssze a ngy cella tartalmr, s az sszeget helyezzk egy tdik cellba. Mind az t cella formzsa legyen flkv.r.

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

45& 1rv. rsz Adatkezels


objektum Sel ect tagfggvnyvel jellhetnk ki; a Range objektum egy vagy tbb cella kijellsre is hasznlhat . A sel ect tagfggvny argumenrumknt egy kezd oszlopot s sort, valamint egy a kijells vgt jell oszlopot s sort vr. Ha csak egy cellt akarunk kijellni, mint itt, akkor elhagyhatjuk a kijells vgt jell oszlopot s sort. Miutn a tartomnyt kijelltk, az adatot tadjuk az Act i veCell objektum FormulaRlCl rulajdonsgnak (amely a Range objektummal kijellt cellkra hivatkozik). A FormulaRl Cl rulajdonsg belltsnak ugyanaz a hatsa, mintha a cellba rtuk volna az adatokat. Zavarosan hangzik? Lehet, hogy tnyleg az. Az autornatizlst tmogat programok gyakran hatalmasak s sszetettek, s a programozsuk llalban messze nem egyszenl.
Ha az automatizlt programnak van makrszerkesztje (a legtbb Microsofttermknek van), sok idt s fejfjst megsprolhatunk, ha az automatizland feladatokra makrkat hozunk ltre. A makrk lnyegben programkdok a Microsoft-termkek esetben VBA kdok, ezrt hasonlak a Visual Basic 6 kdjhoz. Ugyan nem Irhatk t egy az egyben Visual C# 2008-ba, de ltalban elg knny ket talaktani, s a makrszerkesztvel a szksges objektumok s tagfggvnyek nagy rszt meghatrozhatjuk.
A
kvetkez plda az elbb lert mdszereket hasznlja ahhoz, hogy adatokat jon ngy cellba. Kvessk az albbi lpseket az Excelbe trtn automatikus adatbershoz:

1. rjuk be a kvetkez kdot az eljrsunkba:


Excel . Range objRange ; objRange = objSheet . get_Range("A1 " , Sy stem . Reflection . M i ssing .Value) ; objRange . V a l ue2 = 75 ; objRange = objSheet . get_ Range (" Bl", System . Reflecti on . Missi ng . Value); objRange . Value2 = 125 ; objRange = objSheet.get_ Range ("Cl', System.Reflection .Missing .Value) ; objRange.Value2 = 255; obj Range = objSheet . get_Range ( "Dl', System . Reflection.Missing .Value) ; objRange . Val ue2 = 295 ;

A kvetkez lps, hogy az Excel sszegezze a ngy cellt. Ezt gy tessZk

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)) "
_ ) ;

3. jelljk ki mind az t cellt, s lltsuk ket flkvrre. Ehhez rjuk be a utastsokat:


objRange = objSheet . get_Range ("Al", "El" ); objRange.Font.Bold=true;

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;

458 IlV. rsz Adatkezels


ll Cellk kijellse s sszegzse egy Range objektummal objRange = objSheet.get_ Range( "El" , _Systern.Reflection.Missing.Value); objRange .set _Value(Systern.Reflection.Missing .Value , " =SUM ( RC ( - 4 J : RC ( - l J ) " ) ;

objRange = objSheet .get_Range("Al" , "El " ); objRange.Font.Bold=true; objExcel

= 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

A Microsoft Word automatizlsa


Most egy msik egyszer alkalmazst ksztnk, amely a Microsoft Word 2007-et fogja automatizlni. Kezdjk egy j, Automate Word nev projekt ltrehozsval. Kattintsunk az egr jobb gombjval a Forrnl . cs elemre a Solution Explorer ablakban, vlasszuk a Rename parancsot, majd vltoztassuk az alaprtelmezett ablaknevet MainForm.cs-re, s lltsuk t az ablak Text tulajdonsgt az Automate Word szvegre.

Automatizlsi knyvtrra mutat hivatkozs ltrehozsa


A Microsoft Word automatizlshoz, csakgy Illint az Excel esetben, szksgnk van egy hivatkozsra a Word objektumknyvtrra. Kvessk ezeket a lpseket a knyvtrra mut.at hivatkozs ltrehozs.hoz: 1. A Project men Add Reference parancst vlasztva jelentsk meg az Add Reference prbeszdablakot 2. Kanintsunk a COM flre a szmtgpen elrhet COM-sszetevk (a tpusknyvtrral rendelkez programok) megjelentshez. 3. Grgessnk a listban a Microsoft Word 12.0 Object Library elemhez (lsd a 22.3. brn). Kattintsunk dupln a Word elemre a hivatkozs ltrehozshoz, s zrjuk be a prbeszdablakot.
Ha nem ltjuk a Microsoft Word 12.0 Object Library elemet az elrhet COM-hivatkozsok listjban, akkor valsznleg nincs teleptve a Word 2007. Mint az Excel pldban, itt is hasznlhatjuk a 11.0 Object Library elemet, ha a Word 2003-et teleptettk.

Typd.j>VI!tliob Pa Mla-WrndowsMedloPioye.NdwMSNri... 1.0 Mki'OIOIIW.-ModoPioyorNdwMSNri... 1.D


C:\ C:\

22.3. bra
Mnden COM-k6nyvtrra ebben

a prbeszdablakban hozhatunk ltre hivatkozst

Az automatizlsi kiszolgl pldnynak ltrehozsa


Mint az elz pldban, in is egy gomb Click esemnyben helyezzk el a Word automatizl.si kdjt. Kvessk az albbi lpseket a gomb ltrehozshoz s a Word-objektum pldnyostshoz:

~ l JV. rsz. Adatkezels


1. Az eszkztron dupln a Button elemre kattintva adjunk egy gombot az ablakhoz, s llitsuk be a tulajdonsgait az albbiak szerint:

Tulajdonsg Name Location Size Text

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).

l'* h tertfrom e Ot 2101

22.4. bra
Egyszer,

de hatsos

plda a Word automatizlsra

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.

462 1JV. rsz Adatkezals

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?

22. ra Alkalmazsok irnyftsa automatizlssal i 463


4. Ha egy kiszolgl6t irnytunk automatizlssal, akkor valjban mit is irnytunk? 5. Mit kell tennnk, ha egy sszetev objektumknyvtrrl tbbet szeretnnk megtudni?

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 megoldsok kzzttele - s ami azon tl van


23. ra 24. ra
Az alkalmazsok kzzltele

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.

468 1V. rsz A megoldsok kzzttele- s ami azon t6l van

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.

23. ra Az alkalmazsok kzzttele 469


A ClickOnce-alkalmazsok hromflekppen telepthetk: weboldalrl, megosztott hlzati helyrl, vagy olyan adathordozrl, mint a CD-ROM. A ClickOnce-alkalmazsok a felhasznl szmtgpre teleplnek, teht akkor is futtathatk, ha a felhasznl nem csatlakozik a hlzatra, de hasznlhatk kizrlag hlzati mdban is, mely esetben maradandan nem teleptenek semmit a felhasznl szmtgpre.

ClickOnce-program ksztse a kzztteli varzsl segtsgvel


Ideje, hogy elksztsk a ClickOnce-programunkat, amely a knyv sorn felpten Pictur<:: Viewer programot telepti. Ehhez elszr nyissuk meg a Picturc Viewer projektet abban az llapotban, amelyben a 19. ra vgn volt, majd kvessk az albbi lpseket:
1. Vlasszuk a Build, Publish Picturc Viewer (Felpts, A Picture Viewer kzztte-

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

2. Adjuk meg a ClickOnce-teleptfjlok helyt. gyeljnk r, hogy mr ltez el-

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.

470 V. rsz A megoldsok kzzttele - s ami azom tl van


3. A Publish Wizard kvetkez oldaln, amelyet a 23.2. brn lthatunk, azt a mdszert hatrozhatjuk meg, amellyel a felhasznlk telepthetik a programunkat. Br a teleptst lehetv tehetjk egy webhelyrl vagy egy UNC-tvonallal megadott megosztott mappbl is, a pldnkhoz vlasszuk a From a CD-ROM or DVD-ROM (CD-ROM-rl vagy DVD-ROM-rl) lehetsget. Ha ezzel megvagyunk, lpjnk tovbb a Next gombbal.

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. ra Az alkalmazsok kzzttele 471


szeretnnk. A Picture Viewer egyszetii alkalmazs, amelynek erre a szolgltatsra nincs szksge, ezrt hagyjuk bejellve a The Application Will Not Check for Updates (Az alkalmazs nem keres frisstseket) lehetsget, s kattintsunk a Next gombra. 5. A kzztteli varzsl utols oldala, amelyet a 23.4. bra mutat, csupn egy megerstst kr ablak. Ellenrizzk, hogy minden bellts a kvnsgainknak megfelel-e, s ne trdjnk az elrsi t itt lthat formzsvaL A Visual C# mdostani fogja az tvonalat, hogy rvnyes UNC formtum elrsi tt alaktsa azt. A teleptprogram ltrehozshoz kattintsunk a Finish (Befejezs) gombra.

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

~ .j"" .. .. ..,...._F ... -"-"J.Jl.IU

23.5. bra
A CllckOnceprogramot ennek a mappnak (s az almappinak) a fjljai alkotjk

472 1V. rsz A megoldsok kzzltele - s ami azon t61 van


Amikor a Finish gombra kattintunk, a Publish WJ..Zard ltrehozza a ClickOnce-alkalmazst, s megnyitja a teleptfjlokat tartalmaz mappt Osd a 23.5. brt). A programunk terjesztshez csak hordozhat lemezre (CD-ROM-ra vagy DVD-ROM-ra) kell rnunk ennek a mappnak s almappiinak a tartalmr, s mr kzz is tehetjk a felhasznJk szmra.

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

egy biztonsgi figyelmeztetssei indul

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.

23. ra Az alkalmazsok kzzttele 473

A telepftett alkalmazsok eltvoltsa


Minden Windows-alkalmazsnak lehetsget kell adnia arra, hogy egyszertlen eltvolthassuk a felhasznl szmtgprL A legtbb alkalmazs ezt a szolgltatst az Add/Remave Programs (Programok teleptse/trlse) prbeszdablakon keresztl biztostja - s a mi programunk sem kivtel. Valjban minden ClickOnce-program automatikusan ltrehoz egy bejegyzst az Uninstall or change a program (Program eltvoltsa vagy mdostsa) ablakban. A Picture Viewer programunk eltvolirshoz kvessk a kvetkez lpseket: 1. Vlasszuk a Start, Control Panel (Start, Vezrlpult) menpontot. 2. Keressk meg az Uninstall a program (Program eltvoltsa) hivatkozst, s kattintsunk r. 3. Grgessnk lefel a megjelen prbeszdablakban addig, amg meg nem talljuk a Picture Viewer program nevt, ahogy a 23. 7. brn lthatjuk.

. ____ ___ c---~


23.7. bra

~C0t~

-c..,...-c.,.--~

-c..-~ c..-

lll.,_
~

.MSONUIIwy... --V_. __ ._,.

a .."-ftW.-:IOlloo-oi!Ouolo-~... ._,.
INI

--

-~

lll.,_ lll.,_
~

vun. lilllim

J/1t/IIOI
liUilO

-c..,...o;..

A programunkat az Uninsta/J or change a program prbeszdablakon keresztl tvolthatjuk el


4. Az eltvolirshoz kattintssal jelljk ki a programot, majd kattintsunk

az UninstaiVChange (Eitvolts/ Mdosts) lehetsgre.

474 1V . rsz Amegoldsok kzzttale - s ami azon tl van

A ClickOnce-programok ltrehozsnak halad bellftsai


ClickOnce-programot a legegyszerbben a Publish Wizard segtsgvel hozhatunk ltre, de a varzsln keresztl nem rhetjk el a ClickOnce sszes lehetsgt. Ha m.inden rendelkezsre ll belltst ltni szeretnnk, kattintsunk az egr jobb gombjval a projekt nevre a Solution Explorerben, s a helyi menbl vlasszuk a Properties (Tulajdonsgok) menpontot. Ez utn vltsunk a Publisb (Kzzttel) lapra, ahol megtalljuk a kzztteli belltsokat (lsd a 23.8. brt). Ezen a lapon pldul olyan elfeltteleket hatrozhatunk meg, hogy kell-e telepteni a .NET-keretrendszert, amely m.inden .NETalkalrnazs futtatshoz sZksges. (A Publish Wizard alaprtelmezs szerint gy hozza ltre a ClickOnce-alkalrnazsokat, hogy a Webrl teleptsk a .NET-keretrendszert, amennyiben a teleptst vgrehajt felhasznl szmtgpre nem teleptettk azt.) A kzztteli varzsl vgighalad az itt tallhat belltsok nagy rszn, de a legpontosabban gy szablyozhatjuk a teleptprogram elksztst, ha magunk adjuk meg ezen a lapon a belltsokat, majd a Publish lap jobb als sarkban tallhat Publish Now (Kzzttel most) gombra kattintunk.

23.8. bra
A ClickOrlce halad belltsait a projekt tulajdonsgablaknak Pubfish lapjn adhatjuk meg

23. ra Az alkalmamsok kZlttele 475

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).

K: Hogyan kszthetnk olyan

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?

476 1V . rsz A megoldsok kzztt81e - s ami azon t6l van

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.

478 1V. rsz A megoldsok kZlttele - s ami azon tl van


A knyv sorn a Visual C#-re sszpontostottunk, a Microsoft .NET-keretrendszernek a Visual C# azonban csak az egyik eleme. Ezen az rn ttekintjk a Microsoft .NETkeretrendszert, hogy lssuk, hogyan illeszkedik a Visual C# a .NET egszbe. Az ra befejeztvel rteni fogjuk, hogy milyen rszekbl pl fel a .NET, s hogy az egyes rszek hogyan makdnek egytt. Remnyeim szerint a fejezetben lertak s a sajt szemlyes s szakmai ignyeink alapjn kpesek lesznk meghatrozni, hogy a .NET mely elemeivel rdemes rszletesebben is megismerkednnk

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

A kzs futsidej krnyezet mkdse


A futsidej krnyezet teszi lehetv az alkalmazsoknak, hogy a clszmtgpeken fussanak: olyan kdbl ll, amelyet a tmogatott nyelveken fejlesztett alkalmazsok rnindegyike hasznl. A futsidej krnyezet tartalmazza teht a nyelvi kd "magjt", pldul azt a kdot, amelyik az ablakokat a kpernyre rajzolja, vagy azt, amelyik a felhasznltl rkez bemenetet vagy ppen az adatokat kezeli. A .NET futsidej krnyezett kzs futsidej krnyezetnek (Common Language Runtime, CLR) nevezik. Ms nyelvek futsidej krnyezeteitl eltren a kzs futsidej krnyezetet tbbnyelv krnyezetnek szntk; a C# s a Visual Basic pldul egyarnt erre a krnyezetre tmaszkodik. Jelenleg tbb rnint 15 nyelvi fordtprogramot fejlesztenek a kzs futsidej krnyezet hasznlatra. Mivel a kzs krnyezeten a .NET rninden nyelve osztozik, az egyestett (Integrated Development Environment, IDE), az ablakmotorjuk, a kivtelkezel rendszerk, s tbbek kztt a (hamarosan bemutatand) szemtgyjtjk is azonos. A kzs futsidej krnyezet tbbnyelvsgnek egyik elnye, hogy a programozk az egyik .NET-nyelven megszerzett tudsukat a teljes keretrendszerben kamatoztathatjk.
fejlesztkrnyezetk futsidej

24. ra A .NET madrtvtatbl 479


Lehersges pld1lul, hogy egy fejleszt6csapat egyes tagjai a Visual Basic nyelvben vannak otthon, ng msok jobban ismerik a C#-ot. Mivel mindkt nyelv ugyanazt a fut1lsidejt1 krnyezetet hasznlja, kpesek egyttmt1kdni, gy egyetlt:n megoldsban is egyesthetk. A kzs futsidejt1 krnyezetbe radsul kzs kivtelkezel rendszert ptettek be, ezrt az egyik .NET-nyelven rt kdban kivltott kivteleket e lfoghatjuk egy msik .NET-nyelven rt kddal is. A kzs futsidejt:I krnyezeten bell fut kdokat felgyelt kdoknak hvjk, mivel a kdot s az 1lltala hasznlt en5forrsokat (vltozkat, objektumokat, s gy tovbb) teljesen a kzs futsidejt:I krnyezet felgyeli. A Visual Basicben kizrlag felgyelt kdot rhatunk, egyes nyelvek (pldul a C++) azonban nem felgyelt kdot - vagyis olyan kdot, amelyet nem a kzs futsidej krnyezet kezel - is kpesek ellltani. A kzs futsidej krnyezet msik elnye, hogy az sszes .NET-eszkz ugyanazokon a hibakeres s kdprofllkszt eszkzkn osztozik. Rgebben a Visual Basic csak kevs hibakeres eszkzzel rendelkezett, ng az olyan nyelvekhez, mint a C++, rengeteg kls fejlesztsa hibakeres llt rendelkezsre. Most azonban minden nyelv ugyanazokat az eszkzket hasznlja, ami azt jelenti, hogy az egyes termkek hibakeres eszkzein ek tovbbfejlesztsbl a tbbi termk is hasznot hz, hiszen minden eszkz kzs. Ez nem csak a hibakeres eszkzkre rvnyes: az egyestett fejleszt6kmyezet olyan bvtmnyei, mint pldul a kdkezel6k, ugyangy elrhetk a Visual C#, mint a VIsual Basic - vagy ha mr itt tartunk, brmely ms .NET-nyelv- szmra.

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.

480 V . rsz A megoldsok kzzttele- s ami azon tl van

A Microsoft kztes nyelvnek hasznlata a Visual C# 2008-ban


Ahogy a 24.1. brn lthatjuk, a fordt a nyelvi utastsformtl fggetlenlminden .NET-kdbl kztes nyelv( (IL) kdot llt el. A kzs futsideju krnyezet csak az IL kdot kpes rtelmezni; sem C#, sem Visual Basic, sem brmilyen ms fe~eszti nyelven nem rt. Az IL adja a .NET nyelvi csereszabatossgt: ang az eredeti forrsnyelven rt kd kztes nyelvre fordthat, .NET-program kszthet belle. Egyes fejleszt61c pldul elksztettk a COBOL-nak- a nagygpek egyik hossz mltra visszatekint nyelvnek- a .NET-fordtjt, amdy kpes egy meglv COBOL nyelvCI kdbl IL kdot elllcan i, hogy az a .NET-keretrendszerben futtathat legyen a kzs futsidej krnyezet segtsgve!. Maga a COBOL nem Windows-nyelv, s a valdi Windows-nyelvek (pldul a Windows Forms rtelmezmotor) szmos szolgltatst nem tmogatja, gy aztn magunk el tudjuk kpzelni a COEOL-programozk izgalmt, amikor elszr hallottak rla, hogy a korbban rt kdjaikat s programozi tudsukat hatkony Windows-alkalmazsok ksztsre is felhasznlhatjk.

Az IL egyik htrnya, hogy elmletileg visszafejthet. Ezrt sokan

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.

24. ra A .NET madrtvlatbl 481

Visual Basic .NET forrskd

C# forrskd

XXX nyelv forrskd

t
Visual Basic .NEl-fordtprogram

C#-fordtprogram

*
~

~
XXX nyelvi fordtprogram

Kztes nyelv (IL) kd

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.

482 1V. rsz A megoldsok kZlttele - s ami azon tl van


Ahogy a .NET fejldik, a kzs futsidejG krnyezeten vgrehajtott vltoztatsokbl minden .NET-alkalmazs hasznot hzhat. Ha a Microsoft pldul mdot tallna arra, hogy a kzs futsidejG krnyezet tovbbfejlesztsvel nvelje az ablakok kpernyre rajzolsnak sebessgt, minden .NET-alkalmazs azonnal gyorsabb megjelentsre lenne kpes.
Az egyes nyelvi fordtprogramokon - pldul a Visual C# nyelv() kdbl IL kdot el

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. ra A .NET madrtvlatb61 483

24.1. l6lllat

leggyaiwabban hasznll nVIerek

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.

484 1 V. rsz A megoldsok kzzttele - s ami azon tl van


Minden Microsoft-nvtr neve a Syste m vagy a Microso ft eltaggal kezddik. Ms gyrtk ms nvtereket is meghatrozhatnak., s mi is ltrehozhatjuk a sajt nvtereinket, de ez kvl esik a knyvnk keretein.

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.

24. ra A .NET madrtvlatbl 485


Mindazonltal a 16. rn mr cloztunk r, hogy ezzel mg nem fedtnk fel minden rszletet. A .NET platform ugyanis az objektumok megsemmistsre egy szemtgyjtt hasznl. A .NET ltal megvalstott szemtgyGjts gynevezen htvatkozsszml/6 szemtgyjts, ami lnyegben azt jelenti, hogy a szemtgyjt figyeli a program ltal hasznlt erforrsokat. Affijkor az erforrs-felhasznls elr egy meghatrozott kszbt, a szemtgy\1jt hasznlaton kvli objektumokat kezd keresni, s ha tall ilyet, megsemmisti, s felszabadtja az objektum ltallefoglalt sszes memrit s erforrSt. A szemtgyiljtssel kapcsolatban fontos megjegyezni, hogy ha e!,')' objektum erforrsait az objektumot null-ra lltva vagy az objektumvltozta hatkrbl kiengedve szabadtjuk fel, az nem jelenti az objektum azonnali megsemmistst, az ugyanis addig nem semmisl meg, amg a szemtgyjt el nem indul, hogy hasznlaton kvli objektumokat keressen.

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.

486 1V . rsz Amegoldsok kzzttele - s ami azon ti'JI van


Ha a vlaszok nem egyrtelmek, azt javaslom, hogy mlyedjnk el az adatbzis-prog-

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.

24. ra A .NET madrtvla1b61 487

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

Add Reference 453


AddO 166, 168, 186, 189, 445 Add/Remove Programs 473 AddDays 277 AddExtension 4o6 AddHours 277 AddMilliseconds 277 AddMinutes 278 AddMonths 278 AddSeconds 278 AddYears 278 ADO.NIT 433, 434, 478 adott sorszm listaelem eltvolrsa 167 g 77 alhzs 223 alhzott bet 151 alhzott karakter 198 alakzatok rajzolsa 376 alaprtelmezett esemny 20, 86 alaprtelmezett gomb 158, 352 alaprtelmezett helyi men 204 alaprtelmezett idpont 277 alaprtelmezett nzet 48

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

rekord 443 elrejts 112, 118 else 286


els szr

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

automatikus elrejtse megjelentse 34 rgztse 35

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

kzrthetek, slpsrllpsrevezetnek, hogy azalapoktlkezdve,valsmOszakiszletifeladatokon keresztl sajtfthassuk el a Visual C#-programozsmvszett.

A lpsrl lpsre halad gyakorlatok gondosan


vgigvezetnek bennnketaleggyakrabban felmerl problmkon s feladattipusokon.

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.

You might also like