1 Sipos Marianna fo f KENYELMES, GYORS ES HATEKONY.NET ALKALMAZAsFEJLESZTES, MODERN FEJLESZTOESZKOZ, KOMPONENSALAPU PROGRAMOZAs, EGYSZERUEN FELDOLGOZH...
KENYELMES, GYORS ES HATEKONY .NET ALKALMAZAsFEJLESZTES, MODERN FEJLESZTOESZKOZ, KOMPONENSALAPU PROGRAMOZAs, EGYSZERUEN FELDOLGOZHATO, NAPRAKESZ ISMERETEK
C# NYEL V A C NYEL VCSALAn T AGJA ......................................................................... 13 ......................................................................................................................... 15 /!FO]Rl[)iTAS E8 FUTT AT As ................................................................................................ 18 "..L""L'DOKUMENTAcIO GENERALAsA AZ ALKALMAZAsHOZ •••••••••••••••••••••••••••••••••••••••••• 20
l~iI'i\z OSZT ALY Its AZ OBJEKTUM ............................••••......•......••••.•.......•••.....••....... 21
'1d. 1.2. 1.3. 1.4.
1.5. 1.6. 1.7.
1.8. 1.9.
OSZTALY, OBJEKTUM FOGALMA ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 21 ADATTAGOK •..................•......•••..........•......••••.•.....•••......••••.....•••.....•••••••.....••......• 24 A T A GFU GGvENYEK •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 25 A VALTOZOK .........................•.•.................••.........••......••••••.....•.......••.••......••.....•• 28 A LATHATOsAGOK •••......•......••.••......•••.......•••••......•............................••.......••......• 30 A TULAJDONSAG FOGALMA .....•........•....................••......•••.....•••••........••.......•......• 31 A NEVTEREK ••......•••....••••••......••.....•••••••..•...••........••.•••............•.........••.......••••...... 33 A THIS PARAMETER .....••••..............•.••••..................••......••......•••••......................... 35 TESZT ......•••••••......•......••.••......••..........••..•....••......•••••......••.....••••.......•••.....•••••.....• 36
2. AZ ALKALMAZAs VEZERLESE ............................................................................. 39 2.1. AMAIN ................................................................................................................ 39 2.2. Az ESEMENyKEZELES .......•......•.........•.•..•..•..........••••••..••••....••••••.......•.•...•••••......• 40 2.2.1. Az alapertelmezett esemeny kezelese ............................................................... .41 2.2.2. Az esemenykezel6 kodja .................................................................................. 41 2.3. A PROGRAM SZERKEZETE.•....•••.....••••••••.•...•••.....•••..••......••.....•........•••••...•••••••...•• 42
5
2.4. 'A VEZERLOSZERKEZETEK ............................................................................ ,••••• ,...." 2.4.1. A szekveneia ................................................................................................ . 2.4.2. Az eldgazds .................................................................................................... . 2.4.3. A eiklus ......................................................................................................... . 2.4.3.1. A felteteles ciklusok ............................................................................................. . 2.4.3.2. A leptetos ciklusok ............................................................................................... . 2.4.3.3. A foreach ciklus .................................................................................................... 49
2.4.4. Tovdbbi vezerl6 szerkezetek............................................................................ .49 2.5. A KIVETELKEZELES ................................ ".....•......•.......••.•.................•..•...•...•.•.•..•. 50 2.5.1. A kivetel dobdsa .............................................................................................. 50 2.5.2. A kivetel elkapasa ...................................................... .....................................50 2.6. TESZT ................................................................................................................... 52 3. A VEZERLOK, TULAJDONSAGOK, ESEMENYEK, ABLAKOK ......................... 55 3.1. A PROPERTIES ABLAK ES KEZELESE .................................................................... 55 3.2. A VEZERLOK ..•.•..............................•.•••...........•...............•.................................... 56 3.2.1. A Label es a LinkLabel .................................................................................... 56 3.2.2. A Button, a RadioButton, a GroupBox es a CheekBox ...................................... 57 3.2.3. A TextBox, a ListBox, a CheekedListBox es a ComboBox ................................. 58 3.2.4. A ProgressBar es a TraekBar .......................................................................... 59 3.2.5. A TabControl es a Panel ................................................................................ .59 3.2.6. A tovabbi elemek ............................................................................................. 60 3.3. Az ABLAKOK MEGJELENiTESE ............................................................................ 60 3.3.1. A modalis ablak ............................................................................................ .. 60 3.3.2. A nem modalis ablak ....................................................................................... 60 3.3.3. A Form tulajdonsagai ...................................................... ............................... 60 3.3.4. A NET osztalykonyvtar pdrbeszedablakai ....................................................... 61 3.3.4.1. ColorDialog........................................................................................................... 62
4. ELEMI PROGRAMOZASI TETELEK...................................................................... 65 4.1. A MEGSzAMLALAs ES AZ OSSZEGZES ................................................................... 66 4.1.1. A megszamlalas .............................................................................................. 66 4.1.2. Az osszegzes.................................................................................................... 67 4.1.3. Afelteteles osszegzes ....................................................................................... 67 4.2. A KERESES ......•.••••••.•....•..•.•.........•.•.......•.•.•.•.........................•..........•.................. 67 4.2 .1. A linearis kereses es az eldontes ...................................................................... 67 4.2.2. A linedris kereses es a kivalasztas ................................................................... 68 4.2.3. Abinaris vagy logaritmikus kereses ................................................................. 69 4.2.4. A minimum kereses ...................................................... ................................... 70 4.3. A RENDEZES •.•.•..••...•.......•....................•.•.............•.•.•...•••••••••.•.•...•.....•.•.•...•........ 70 4.3.1. Rendezes minimum kivalasztdssal .................................................................... 70 4.4. TESZT •.•....••.•.•.•...•.•.•..••................•..••.......•...•...............•...................................... 71 5. AZ OROKLES ES A .NET OSZTALYKONYVTAR ................................................. 73 5.1.
Az OROKLES ........................................................................................................74
5.1.1. Specializacio is absztrakeio ............................................................................ 74 5.1.2. Az oroklesfogalma .......................................................................................... 74
6
Az eddig hasznalt orokles ................................................................................ 76 A protected hozza/eres .................................................................................... 77 · Az asoszt6ly tagjainak elrejtese ...................................................................... .78
Az Object osztaly ............................................................................................. 81 A String osztaly ............................................................................................... 81 A datum es az ida kezelese ............................................................................... 83 A/ajlba iras - olvasas ..................................................................................... 84 .5. A Control osztaly es ut6dai.............................................................................. 85 Az ERTEKAD As .....................................................................................................87 · Az engedelyezett es a nem engedelyezett ertekadas .......................................... 87 .2. Az explicit tipuskonverzi6 ................................................................................ 88 5.3.3. Az 'is' operator ..............................,................................................................. 89 5.3.4. Az 'as' operator .............................................................................................. 91 TESZT ..•........•.......•..........................•............•.....•................................•............... 91 i'TC""""T
T KOD ES A TOOLBOX KOMPONENSEK ..................................... 93
A FELUGYELT KOD .........................................................................................,.... ;94
6.1.1. A CLR, a CLS es aCTS ................................................................................... 94 6.1.2. Az automatikus szemetgyiijtes .......................................................................... 94 6.1.3. A nevterek ....................................................................................................... 96 A TOOLBox ALTAL FELKINALT KOMPONENSEK ..................................•............... 98 6.2.1. A menu ........................................................................................................... 98
6.2.2. A TooITip ............................................... ......................................................... 99 6.2.3. A Timer ........................................................................................................... 99 6.2.4. A Process ..................................................................................................... . 100 TESZT ................................................................................................................ 102 DLL ES A SZEREL VENY ..................................................................................... 103 7.1. ADLL ..................................................................... ,......................................... 103 7.1.1. Az eddig /ejlesztett alkalmazasok komponensei ........................................ ...... 104 7.1.2. A keresett osztaly osztalykonyvtara ................................................................ 105 7.1.3. OJ osztalykonyvtar-hivatkozas az alkalmazasban ........................................... 106 7.1.4. A hagyomanyos dU ........................................................................................ 107 7.2. A SZEREL vENY ......................................................•.............................•............. 108 7.2.1. Az internallathat6sag ............................................................... .................... 108 7.2.2. A managed k6d ........................................................ ..................................... 108 7.2.3. A maniJeszt ...................................................... ............................................. 109 7.2.4. Privat es osztott szerelveny ............................................................................ 110 7.2.5. Verzi6 szam .................................................................................................. 111 7.3. TESZT ................................................................................................................ 112
8. OSZT ALYKONYVT AR KESZiTESE. ..................................................................... 115 8.1. A CLASS LIBRARY FOG ALMA ••••••••••••••••••••••••••••••••••••••••••••••••............................. 115 8.1.1. Az osztalyok lathat6saga ............................................................................... 116 8.1.2. Elnevezesi konvenci6k ................................................................................... 116 8.1.2.1. A kis- es nagybetiik: haszmilata ............................................................................. 116
7
8.1.2.2. Azonosit6 kezdetek es vegz6desek ....................................................................... 117
8.2.
CLASS LIBRARY KESZITESE ..•....••.........•..•..........•..••..•....•.................•.......•........ 117
8.2.1. Osztalykonyvtar letrehozasa ..... ..................................................................... 11 8.2.2. Egy solution tobb project .............................................................................. 120 8.2.3. Az osztalykonyvtar hasznalata ....................................................................... 120
WEB ALKALMAZAS FEJLESZTESE................................................................. 149
11.1. ELOFELTETELEK ............................................................................................... 149 11.2. A WEB FORM .......................•......•..................................................................... 149 11.2.1 A Web Form szerkesztese .............................................................................. 151 11.3. A SERVER CONTROL ......................................................................................... 152 11.3.1 Az allapot megorzese .................................................................................... 153 11.3.2 A bevitt ertekek ellen6rzese ........................................................................... 153 11.4. Az ADATBAZIS ADATAINAK MEGJELENITESE ..................................................... 155 11.5. TESZT .............................•......••.•..••......•....•.•...................................................... 155
. Elokeszftes .................................................................................................... 161 .2. Uj projekt ..................................................................................................... 162 .1.3. Kezdeti beallftasok ........................................................................................ 164 1.1.3.1. A this es a nevterhivatkozasok elhagyhatoak......................................................... 165 A gombon kattintas kezelese .......................................................................... 166 A hatterkep beallftasa ................................................................................... 166 Az alkalmazas ikonjanak madosftasa ................................ ............................. 169 Az ERTEK TIPUSU ES A REFERENCIA TIPUSU vALTOZOK OSSZEHASONLIT ASA ••• 170
Az ertek tfpusu valtozak ................................................................................. 170 A hivatkozas tfpusu valtozak .......................................................................... 172 FELADATOK .•••.•..••••••••••••••••••••...•••••••••••.••...•...................................••.....•••••••.•••• 173 MEGOLDASOTLETEK ••••••••••••••...••.••••.......................................••••..•••.•.•••••.........1174
n""'-'''~' T. JELSZOBEKERO ABLAK................................................................ 175
'CZt1.
Az EGYSZERU JELSZOBEKERO ABLAK ............................................................... 175
1 GYAKORLAT. A VEZERLOK HASZNALATA ........................................................ 189
:\"3..1.
Az ABLAK MINT ALLATORVOSI LO ........................................••.....•..........•....•.•..• 189
3.1.1. 3.1.2. 3.1.3. 3.1.4. 3.1.5.
A Mtterszfn beallftasa futasidoben ............................................................... .190 A cfmsor szovegenek madosftasa ................................................................... 190 Az ablak bizonyos szfnek mogott legyen atlatsza! ........................................... 191 Az ablak attetszosege .................................................................................... 191 A tulajdonsagok ki-be kapcsolasajelOlOnegyzettel ......................................... 192
3.1.5.1. 3.1.5.2. 3.1.5.3. 3.1.5.4.
Az ablak formajanak modositasa ................... ,...................................................... 193 A TopMost tulajdonsag ........................................................................................ 197 A meretezhetoseg illftasa ..................................................................................... 198 A gorgethetoseg aIlitasa ....................................................................................... 198
9•.1.- DIGITALIS mOKIJELZO VEZERLO KESZITESE .................................................... 301 9.1.1. Afelhasznal6i interJesz elkeszftese ................................................................ .301 9.1.2. Afunkci6k megval6sftasa ..................................................................... ......... 302 9.1.2.1. Hozzuk letre a time tagvaJtoz6t! ........................................................................... 303 9.1.2.2. A timer novelje masodpercenkent a time erteket! .................................................. 303
9.1.3. 9.1.4. ·9;],5. 9.1.6. 9~2r-
9.3.
A tesztelesehez keszftsiink egy alkalmazast, mely hasznalja ezt a vezerlOt! ...... 304 irjunk az 6ra vezeriohoz indft6 es megallft6 met6dust! ................................... 305 A vezeriohOz tulajdonsag,keszftese ............................................................... .305 Legyen az 6ra kezdoertekenekbeallftasat lehetove tevo tulajdonsag! ............ .307 FELADATOK ......................•..•........•.•••••••..........••.......................................• ! ....... 310 MEGOLDASOTLETEK ........••..........••••••............•.............•••.........••••..•............•..... 311
10. GYAKORLAT. ADATBAzIS-ELERES...............•••..••.........•••...........•......•.........•........ 315 10.1. Az ADATBAZIS LETREHozAsA ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 315 10.1.I.SQL Server adatbtizis letrehozasa ................................................................ .315 ']O.I.2Access adatbtizis letrehozasa ......................................................................... 317 10;2. Az ADATBAzIS ADATAINAK MEGJELENITESE AZ ALKALMAZASBAN ••••••••••••••••••• 318 10.2.1 Az adatbtizis-adatok hozzafereset tamogat6 objektumok ................................ .318 10.2.2AjelszoSet es a userBoxfeltoltese adatokkal... ............................................... 319 10.2.3Ajelsz6 bekerese, ellenorzese ........................................................................ 320 10~3. 10-~4.
TARGYMUT ATO .....................................................................................................
"! •••
343
11
jt/szamit6gep merev, a gymas utan mar nem valtoztathat6 elemeit nevezik ha.fdvernek, mig a rugalmas, m6dosfthat6, tovabbfejlesztheto reszek a szoftver el~mek. A szabvanyok a szoftvert mint programok, adatok es dokumentaci6k -€gyutteset definialjak. Az alkalmazasok olyan szoftverek, melyek nem a szamit6gep miikOdeset biztosftjak, hanem valamely cel erdekeben annak felhasznalasat (fllkalmazasat) tamogatjak. Alkalrnazas a gepen fut6 szovegszerkeszto, az internetes q(jI,1geszest tamogat6 szoftver, de az altala elert szerveren fut6, valamilyen szolgaltatast nyu.jt6 program is. Mi az alkalmazasfejlesztes egy kenyelmes, a gyors fejlesztest tamogat6 fejlesztoi komyezet - a Visual Studio - segftsegevel megval6sftott formajat valasztjuk abbOl a celb61, hogy a rna elvarasainak megfelelni tud6 alkalmazasok es fejlesztesuk alapfogalmaival megismerkedjunk.
A C# nyelv a C nyelvcsalad tagja A Visual Studio lehetove teszi alkalmazasok kiilOnbozo nyelvi kornyezetben tOrteno fejleszteset, sot azt is, hogy egy alkalmazason beliil az egyes elemeknel kiilOnbozo nyelveket hasznaljunk a fejlesztes soran. A C# programozasi nyelvet kifejezetten azzal a cellal hoztak letre, hogy hatekonyan tudjon megfelelni a rna programozasi elvarasainak. Amint az nevebol is kideriil, a C nyelvcsalad egy ujabb tagjar61 van sz6.
13
BevezetO
Az elso C nyelv 1972-ben kesziilt el, Dennis Ritchie nevehez kotodik.
alacsonyszintii programozas~ nyelve~ a. Unix -' o~-,eraci6s rendszerhez keszitettek, csak kesobb terjedt el hasznalata a tobbI operaclOs rendszeren. A nyelvet 1978Brian Kernighan fejlesztette tovabb az ismert (K&R) C nyelvve. 1983-ban hozta letre Bjarne Stroustrup a C++ nyelvet, melyet eredetileg osztalyokkal neven neveztek. A eel az objektumorientalt programozas ranl0Q:ara volt a proceduralis hagyomanyok megtartasa mellett. A vilag egyik "-E,'-'H'-'Lj'VUL'-'UU programozasi nyelve lett sokretiisegenek koszonhetoen. A C nyelvet 1983-ban, a C++-t 1998-ban standardizaltak. Platformfiiggetlenseget a ket nyelv koszonhette, hogy szinte minden operaci6s rendszerhez kesziilt fordit6ja. A ~La.uual forrask6d m6dositas nelkiil fordithat6 barmely operaci6s rendszerre. 1 Ehhez azonban sziikseg van a fordit6ra es a forditashoz erto szakemberre. Az 1995-ben James Gosling nevehez fiizodik a Java nyelv letrehozasa C, C++ es
Smalltalk alapokon. A Java tiszta objekturnorientalt nyelv. Elterjedeset annak koszonhette, hogy az internet hasznalatanak altalanossa valasaval a platforrnfiiggetlenseg uj szintjet kinalta. A kiilOnbOzo kornyezetekben a gepre telepitett Java Virtualis Gep (JVM) a bajtk6dra forditott fajlt autornatikusan interpretalja (ertelrnezi). Vagyis nern kell szakernber a tavoli geprol letOltOtt k6d futtatasahoz. Az interpretaIas azonban gyakran lassunak bizonyul. A C nyelvcsalact legfiatalabb nyelve a C# (C sharp, ejtsd szi sarpl. 2000-ben talalkozhattunk a beta valtozattal, a hivatalos kiadas 2002 tavaszan keriilt forgalornba. A C# csoport vezetoje Anders Heilsberg, aki korabban a Borland Pascal es a Delphi nyelveket is keszitette. 6 volt a Microsoft J++-t es az MFC-t keszito csoport vezetoje is. A C# egy tiszta objektumorientalt prograrnozasi nyelv, rnelyet C++ es Java alapokon fejlesztettek ki. A .NET futtat6komyezethez keszithetiink vele skaIazhat6,. biztonsagos web alkalrnazasokat. Tarnogatja a kornponens alapu es a tobbretegii alkalmazasfejlesztest. 3 "A C#-et hasznaltak mar dinamikus webhelyek, fejlesztoeszkozok, sot fordit6programok keszitesehez is.,,4
1
Wikipedia: Timeline of programming languages, http:Uwikipedia.orgffimeline of programming languages
2
Itthon a zen ere utalva cisz-nek is szoktak nevezni.
3
Tovabbi informaci6k a www.microsoft.com keresojebe beirva a Visual C# Language szoveget, vagy kozvetleniil a: http://msdn.microsoft.com/librarylenus!cscon!html!vcoriCStartPage.asp lapon.
a .NET futtat6kornyezet biztosftja. A JIT (just in time) automatikus helyben futtatast a lefordftott k6d gyors
egy operaci6s rendszer szintii futtat6kornyezet. David S. Plattot idezve: ,Ii ..t·r\tt infrastruktura az internetes alkalmazasokban jelentkezo problemak . Ma meg kiilon telepftjilk az operaci6s rendszer fole, de a jovoben z telepftocsomagjuknak. megkonnyfti kiilonbozo nyelveken frt komponensek egyilttmiikOdeset, a ;Comnl0n Language Runtime) es a CTS (Common Type System) segftsegevel A feliigyelt k6d szamara biztosftja az operaci6s rendszer szintii ,aUJ\."''' szemetgyiijtest, es rendelkezesilnkre bocsatja a .NET osztalykonyvtarat, felhasznalasaval gyorsan es hatekonyan fejleszthetilnk alkalmazasokat a futtat6kornyezethez. A .NET-rol bOvebben olvashatunk a 6-8. fejezetekben. informaci6kat 'A .NET Framework es programozasa,2 dmii kot~tben az olvas6. alkalmazasok platformfiiggetlensege a .NET platformfiiggetlensegetol fugg. A Microsoft platformokon maga a Microsoft biztosftja a ~'PI;~tf()rn1fiiggl~th~nsegl~t, de mar letezik a Microsoftt6l fuggetlen .NET megva16sftas Mono egy nyflt forrask6du .NET kompatibilis ECMA standard C# fordft6val, -el. Fut Linux, UNIX, Mac OS X es Windows operaci6s rendszeren is.
Studio fejlesztoeszkoz a Visual Studio fejlesztoi kornyezet szolgaltatasait hasznalja az .,Ull'-'UJ'. ." .... "c.v.... fejlesztesehez, Az eszkoz egy Wbbablakos, a fejlesztes kenyelmet :~zolgaI6 kornyezet. A Visual Studi6 ablakai dokkolhat6k, vagyis odaragaszthat6k a .keret egyes reszihez ugy, hogy a dmsort megfogva az egerrel vonszoljuk az ablakot. Vonszolas kozben egy teglalap keret jelzi az ablak elengedett helyzetii helyet a felUleten. fgy tebat kiilonbozo megjelenesii lehet az eszkoz. Mi itt ragaszkodunk a telepftes utani valtozathoz.
1
David S. Platt: Bemutatkozik a Microsoft .NET, Szak Kiad6 Kft. Bicske, 2001. 23. old.
A Visual Studio a Solution adatai kozt elmenti beallftasainkat is, fgy ha kenyelmes feliiletet alakftottunk ki magunknak, a kovetkezoben ezt a feliiletet indftaskor. A New Project /Visual C# project / Windows Application valasztas utan az 1. abra altaI mutatott eszkozt l:itjuk. Az abra kozepet a FormI oszt:ily felhasznal6i feliiletenek szerkeszteset tamogat6 [Design] nezet foglalja el. Ide tudunk a baloldali Toolbox ablakb61 vezerloket vonszolni, melyek mogott automatikusan letrejonnek a szovegtiknek (Text tulajdonsag) megfelelo - az osztalyuk nevebOl es egy sorszamb61 osszeruzott objektumok. Ezeket az objektumokat javasolt 'beszedes' nevure atnevezni.
~dit
Eile
'[iew
Project
~uild
Q.ebug
Dilta
FQ!'mat
Iools
'Mndow
tielp
Data
.~.~.~'p?,!~0.~.~_." ..
-_._-
Windows ._-., .. _.... _, ....Forms c--'.~'.-.- -p·~·i~t~';
A A
label linkLabel
Default
~ Button
r.bi
False True
TextBox
~ MainMenu
M Co
RadioButton
r "'1
(.;1'f'l1lnRny
False
:r
CheckBox
,adioButton1
: (- ,adioB utton2
X
Clipboard.. ~ing
_
.General -•.. ...........~5ervel ,.
------ Build started:
Project:
Windo~sApplicationl~
Preparinq resources __ _ Updatinq references. __ Per forming main compilation_ ..
i\ZJy:atnevezeshez celszeriien az abra jobb oldalan lathat6 Properties ablak Name tillajd.911Sagat valasszuk! A propertiest lehet kateg6riankent es ABC sorrendben is keresni.;az ablak megfelel6 felso eszkozgombjanak valasztasaval. AifJ6~~oldalon
meg tovabbi fli1ek teszik lehetove a projekt adatainak kiilonbozo z~mpohtU feldolgozasat. A kis hely miatt az abran S betiivel jelzett flil - Solution ~xploter --- valasztasara a Solution, azon bellil a projekt fajljaival dolgozhatunk. A C betUveljelzett flil a Class View rovidftese. A Class View mint nevebol is kideriil, az albllmazasban letrehozott osztalyokr61 ad informaci6t a graftkus UML jelOleseket haszmHva (2. abra). emlftett ablakokat a ket oldalon, ha nincsenek nyitva, a View mentib61 erhetlULK el. -~- ~,~ ~-"~ ~
Bevezetes 2. abra a Properties, a Solution Explorer es a Class View ablak A jobboldali ablak tovabbi flilei a sug6 ablakokat adjak, melyek a Help menti Contents, Index vagy Search mentipontjaval nyithat6k ki. A sug6 szovege kozepen jelenik meg. Asug6, mivel a fejlesztoeszkoz tObb nyelvii, tehat tobb programozasi nyelven kozOl informaci6kat. Az ablak tetejen lathat6 egy to1cser formaju ikon mely nyelvi szUrokent miikOdik. Ha kivalasztjuk benne a C# nyelvet, akkor attekinthetobb informaci6khoz jutunk. Ha a [Design] nezet Forml ablaka ( 1. abra) folott jobbegerrel kattintunk a gyorsmentibol kivalaszthatjuk a View Code mentipontot, mely a Formi osztaly forrask6djat mutatja. A forrasfajlok neve cs kiterjesztesii, utalva a C# nyelvre. A ket nezet kozott az ablak tetejen talalhat6 flilekkel valtogathatunk. Ha a k6d az utols6 mentes 6ta m6dosult, a flileknel a forrasfajl neve utan egy * jelzi. Az abran is ezt lathatjuk. Ha csak egy fajlt akarunk menteni, hasznalhatjuk az egy
17
Bevezeto
floppyval jelOlt ikont, az osszes fajlmentesehez a tObb floppyst. A fejlesztes soran ritkan szoktunk menteni, mert a Visual Studio forditas elott menti a forrasfajlokat. Ilyenkor eltunik a * a fajlok fiileirol. A forrask6d bal szelen kis kockakban +, - jeleket latunk, amelyek lehetove teszik a forrask6d attekinthetosegenek noveleset. A C++ nyelv header fajljai tobbek kozott lehetove teszik, hogy egy osztalyr61 atfog6 kepet kapjunk, lassuk, mil yen szolgaltatasokat ny6jt anelkill, hogy elmelyednenk a filggvenyek megval6sitasaban, a k6d reszleteiben. A C# eseten ezt a funkci6t a szovegszerkeszto vallalja magara azzal, hogy a filggvenyeink k6dja becsukhat6 vagy kinyithat6. A szovegszerkesztoben ezen kivill regi6kat is letrehozhatunk, mellyel nagyobb egysegek ily m6don tOrteno kezeleset tesszilk lehetove. Ilyen regi6 a k6dgenerator altalletrehozott k6d (Windows Form Designer generated code), mely olvashat6, de melynek szerkesztese kozvetleniil a szovegszerkesztobol nem ajanlott. Az 1. abra aljan lathat6 Output ablak a forditas szerkesztes allapotar61 es eredmenyerol ny6jt informaci6kat. Most epp azt irta ki, hogy a felepites befejezodott. 0 hiba, 0 figyelmeztetes. A hihak es figyelmeztetesek listaja a Task List fiilben talaIhat6. A nyomkovetes szolgaltatasair61 a feladatok megoldasa sonin talaIunk informaci6t. Az Output ablak combo boxaban a Build helyett a Debug elemet valasztjuk, akkor a futtatas lefolyasar61 kapunk informaci6kat az ablakban.
A Find Results fill az utols6 kereses eredmenyet mutatja, az Index Results fill akkor aktivizaI6dik, ha a sug6ban az adott cimsz6hoz tObb bejegyzes is kapcsol6dik. Akkor itt tudjuk kivalasztani, melyiket kivanjuk a kozepso ablakban megjeleniteni. A fejlesztoeszkoz meg lathat6an rengeteg szolgaltatast ny6jt, ez a leiras csak az elso pillanatban tOrteno eligazodast szolgalja. A tovabbi reszletekkel a feladatok megoldasa soran talalkozhatunk.
Forditas es futtatas Technikailag nagy on egyszeruen, a Start gomb ( 1. abra) vaIasztasaval a Visual Studio menti, forditja es futtatja az alkalmazast. Ha a forditaskor hihat talal a fordit6, figyelmezteto ablak jelenik meg, es a folytatas elutasitasa eseten a Task List ablakban a hibara duplan kattintva a hihas k6dsorra ugrik a szerkesztoben. Alapertelmezesben ketfele m6dot kinal a forditasra: a Debug es a Release m6dot, de tovabbi forditasi beallitasok is megadhat6k. A Debug beallitast hasznaIjuk a fejlesztes soran, mert a nyomkoveteshez szilkseges informaci6kat is szolgaItatja. Release m6dban a kesz alkalmazast szokas forditani, ha mar nincs szilksegilnk a hihak elemzesehez a nyomkovetesre.
18
Forditas es futtatas fordi'tlisakor nem kozvetleniil natlv k6dot kapunk, hanem egy koztes nyelvii MSIL (Microsoft Intermmediate Language). Ez a k6d barmely .NET CLR Language Runtime) komyezettel rendelkezo gepen futtathat6. Vagyis, ha . nines telepftve a .NET CLR, akkor hhiba exe kiterjesztesii az allomany, ULLiUU''''V a gepen.
IUL&.'V
Akozt1es k6du fajl tehat kozvetleniil nem futtathat6, Ie kell fordftani. A JIT (Just In ~··.,c·-.\ compiler feladata, hogy koztes k6dr6l natfv k6dra fordftsa a fajlt futtatasa k02~!)eJn. A JIT a .NET CLR altaI szaIlftott fordft6, mely a fe1haszna16 gepen fut, a It;lll(:t''L'U"''~ CPU architekturajahoz fordft natlv k6dra. Osszegezve: a fordftas ket levleS!)I:>i all. A fejleszto koztes k6dra (MSIL) fordft, melyet a felhaszna16 gepen fut6 fordft Ie natfv k6dra. E ket lepesnek koszonheto a platformfiiggetlenseg.
Fejlesztoeszkozok PI. Visual Studio .NET
fl~tnisk6d
--->
,--I
Futtatas kozbeni fordft6 Just-in-time compiler
MSIL
,
1.-.---_--,> Komyezetspecifikus futtathat6 k6d
AJIT, figyelembe veve, hogy bizonyos fiiggvenyek egyaItalan nem lesznek meghfvva, csak azokat a k6dreszleteket fordftja Ie, melyeket a futas soran m~ghfvunk. Ha a k6dreszletet nem eloszor hfvjuk, mar nem kell ujrafordftani, a tarolt natfv k6d hfv6dik meg. Ezzel csokken a fordftasra szant ido. AzMSIL fajlokat tehat futasidoben fordltjuk. Emiatt a program kezdetben lassabban fut, mint a hagyomanyos alkalmazasok. Ez a platformfiiggetlenseg es a feliigyelt k6trlyezet ara. Lehetoseg van azonban olyan beallftasra, hogy telepfteskor fordftsuk Ie a k6dot (install-time code generation)!. Ehhez a Native Image Generator (Ngen.exe) all a rendelkezesiinkre, mely az adott komyezethez fordftja a fajlt.
Csak akkor hfv6dik meg a native image fajl, ha a fordftaskor beallftott parameterek es komyezet megegyezik a hfvaskor megadottai. (pI. .NET Framework verzi6) Egyebkent a szokasos JIT fordft6 lep eletbe.
1 MSDN
Library for Visual Studio .NET 2003, ITT compilation, Compiling MSIL to Native
Code.
19
BevezetO
------------------------------------------------------------XML dokumentaci6 generalasa az alkalmazashoz A Visual Studio .NET C# fornisk6d eseten himogatja a k6d es a megjegyzessorok felhasznalasaval XML dokumentaci6 generalasat. Ezt a kovetkezQ beallitassal erhetjiik el: Solution View Projekt nev kivalasztva View meniipont Property Pages Configuration Properties Build XML Documentation File: Fajlnev Alkalmaz, OK
A dokumentaci6s fajlt celszerii a projekttel (assemblyvel) azonos neven nevezni (xml kiterjesztes) es a futtathat6 allomannyal azonos konyvtarban elhelyezni.
20
1.Az osztaly es az objektum Az .elso. programok bonyolult szamitasok gyors elvegzeset celoztak meg. A progra11).ozas fejlodesevel egyre bonyolultabb igenyek jelentkeztek. A hardver es a prograinozas tovabbfejlesztesevel ezek az elvarasok megold6dtak, de az uj lehetosegek ujabb es ujabb elvarasokat teremtettek. E folyamat kapcsan alakult ki a hagyomanyos programozasb61 az attekinthetoseg erdekeben megszoritasokat hoz6 strukturalt programozas. A meg osszetettebb programok irasa erdekeben pedig, az objektumorientalt programozas (OOP). Az OOP lenyege nagyon leegyszeriisitve, hogy az osszetartoz6 adatokat es a rajtuk vegzett miiveleteket egy egysegben tarolja. Ezzel lehetove teve, hogy egyszerre egy kis egyseg - az osztaly - letrehozasanak probIemaira koncentraIjunk, vagy az osztaIyok kozotti kapcsolatok segitsegevel egy magasabb absztrakci6s szinten vizsgaljuk a program miikodeset. Az OOP tette lehetove Wbbek k6z6tt a grafIkus felhas.zna16i feliilet, az esemenyvezerelt programozas valamint a komponensalapu programozas kialakulasat. A kovetkezokben az OOP alapfogalmaival ismerkediink meg.
1.1. Oszbily, objektum fogalma Az oszbily (class) egy tipus megvalositasa. Az osztaly leirasa tartalmazza az osztaly adattagjait, es a rajtuk vegezheto miiveleteket, a tagfiiggvenyeket. Az osztaly leirllsa megadja az adattagok
IMhat6sagat, tfpusM es nevet, a tagfiiggvenyek IMhat6sagat, visszateresi tfpusat nevet es k6djat. class Osztaly {
private int adatTag; public int TagFuggveny(parameterek) { k6d }
Az osztaly tfpusu valtoz6k az objektumok. Az objektumokat szokas az osztaly peldanyainak, elOfordulasanak (instance) is nevezni. Az objektum az osztaly leirasaban megadott tipusu es nevii adatokat tarolja.
Az osztaly a letras, miiveleteket vegezni az objektumon lehet. A kapcsolatot illusztralhatjuk a kbvetkezo hetkbznapi peldaval: Az osztaly a stitemeny receptje, az objektum maga a stiti. A recept meghatarozza a stitemeny ktilbnbbzo tulajdonsagait, a hozzava16kat es a miiveleteket, amit elvegztink rajtuk. A stitemenyt a recept segitsegevel keszitjtik el, ahogy az objektumot az osztaly segitsegevel. A gylirast, szaggatast, stitest a stitin (a rendelkezestinkre a116 hozzava16kon, az objektum adatain) vegezztik. A stitemeny olyan lesz, amilyen a recept, (csak egy kicsit jobban fzlik)l. A miiveleteket tagftiggvenyekkel vagy tagoperMorokkal, objektumorientalt sz6hasznalattal elve met6dusokkal va16sitjuk meg. Az osztaIy es objektum egytittmukbdeset mutatja a kbvetkezo abra:
formObject.ShowO; -.....;.---.....
formObject : FormOsztaly top: int = 100 left: int =200
1.1. abra Osztaly es objektumanak egytittmiikbdese A formObject FormOsztaly tipusu. Az formObject bal fblso sarkanak adatait taro16 tagvaltoz6k (top, left) tfpusat es nevet a FormOsztaly hatarozza meg. A formObject tarolja a bal fblso sarok ertekeit. A k6dban (balra fent) a formObjectre hfvjuk meg a megjelenfteset biztosit6 Show ftiggvenyt, mely a k6dot a tfpusanak megfelel6 FormOsztalyb61 veszi. A megjeleniteshez a Show met6dusnak tudnia kell hova
I
Guy Eddon, Henry Eddon: Inside Distributed COM, Microsoft Press, 1998, Redmond, Washington, 12. old.
22
1.1. Osztaly, objektum fogalma
rajzolja kiaz ablakot. Az adatokat az azokat taro16,
at rneghlv6 objekturnb61 olvassa
!d. AzobJ¢l@lm: •
Iri¥~tDlaci6t tarol (tagvaltoz6k, member variables, adattagok, data roeijIbers) .
• F~ll:!~atokat hajt vegre (tagfuggvenyek, rnet6dusok, member functions). Az obje.!d:am adataihoz es rnet6dusaihoz val6 hozzaferes egysegesen a '.' operatorral t6rtenik.
i'6~jektum. adattag; bbjektum.TagFuggveny() ;
Az objektum felelos feladatai elvegzeseert. Ezt a felelosseget az osztalyanak leini~~biztositja. Csak olyan adatokhoz, rnet6dusokhoz ferhettink hozza, m~lyek nincs,{lnek elaliink elrejtve, esak olyan m6dositast vegezhettink az adatokon, 'rnely megym~edett. PI. egy osztalyzatokat tarol6 objekturn erteke esak 1 es 5 kozotti egesz szamlehet. Tehat biztosftja pI. az ellenarzott adatbevitelt. Hagyornanyos v::iltoz6k esetennem volt lehetasegiink ilyen ellenorzesek beiktatasara. Objektumok letrehozasa jellernzoen a kovetkezo rn6don tortenik: f:.1yClass myObject
= new
MyClass();
A MyClassO met6dus a MyClass osztaly konstruktora. Feladata az osztaly objektumainak letrehozasa, inicializalasa. A konstruktor az osztaly tagfuggvenye, neve megegyezik az oszbily nevevel, visszateresi erteke nines. Az objektum felszarnolasat egy rnasik specialis tagfiiggveny a destruktor vegzi. A destruktor neve megegyezik az osztaly nevevel, csak elotte egy tilde '",' jel van ~MyClassO visszateresi erteke es parametere sines. A destruktort feliigyelt k6d eseten az automatikus szemetgyiijta hfvja.
fLo It
Konstruktor es destruktor hasznalatara a 2. gyakorlat 3. feladataban latunk peldat.
Ha kifejezetten nern tiltjuk, egy osztalyb61 akarhany objekturnot is keszithetiink. Minden objekturn letrejottekor lefoglal6dik az osztalylefrasban rnegadott adattagoknak megfelelo hely. Az egyes objekturnok jellernzoen kUlonboza ertekii adattagokat tartalrnaznak. Az adattagokra tOrtena hivatkozas az egyes objekturnok adott rnezajere tOrteno hivatkozast jelent. A tagfuggvenyek k6dja az osztalylefrasban talalhat6. Tagfuggvenyhivas eseten tehat az osztaly tagfiiggvenye dolgozik az objekturn altaI tarolt adatokon.
23
.!
1. Az osztaly es az objektum
-----------------=--------=----------------.,.,+
';;\
Megallapodas: az osztalyok es a tagfiiggvenyek (tulajdonsagok)~ nevet nagy, mig az objektumok, vaItoz6k nevet kisbetiivel frjuk.
1.2. Adattagok Osztaly adattagja lehet a nyelv altaI biztosftott tfpusok, az osztalykonyvtar a1tal.~ szolgaltatott osztalyok es a fejlesztok altaI keszftett barmely tfpus peldanya. A Cit! valtoz6kr61 reszletesebben a 'A valtoz6k' szakaszban lesz sz6. Uj adattagot a definfci6 forrask6dba tOrteno befrasaval vagy a kovetkezo m6don' hozhatunk letre: Class View Az osztaly neve
jobbeger
Add Add Field Cit~Fi~ld -Wj~·arci""'.: Wind~;;Appli~;ti;~1·· ~.-
......... , .. .... -• .-~
--.~
-------------------------------------Welcome to the C# Add Field Wizard This wizard adds a field to your C# class,
Field access:
Fi!lld type:
p""riv,-at_e_ _ _ _ _-":::J~? lint public protected
rei
3
Field name:
!szam
internal protected internal
Comment (II notation not required):
Finish
Cancel
Help
1.2. abra Egy int tfpusu 'szam' new private adattag letrehozasa Az adattagok ketfele m6dosft6val (Field modifiers) lathat6k el. I:!::>
24
Static: Osztalyszintii vagy statikus adattagot hoz letre. Statikus adattag erteke nem az objektumban tarol6dik, igy letrehozhato es lekerdezhetO
1.3. A egyetlen objektum letrehozasa nelkiil is. OsztaIyszintii adattagb61 egy peldany van. Az osztaIY neve es a ' .' operator hivatkozhatunk ra.
statikus tagja az osztalynak az aktualisan letrehozott peldanyok mutat6 adattag. Ennek erteke ugyanis nem az objektumra, hanem az jellemzo.
)11\.1... '"''''
A k6dban a const ku1cssz6 all elotte. Constans adattag erteke valtoztathato. Kotelezo megadni a kezdoerteket. adat a jelsz6bekero ablak az ot meghiv6 alkalmazas Main JUUIS<1U'ClU. Eloszor az 8. gyakorlaton taIalkozunk vele.
utasitasok logikailag osszefiiggo esoportja, mely ona1l6 nevvel es ertekkel rendelkezik. A fiiggvenynek a prameterlistajaban atadhatunk , •es a visszateresi ertekben vagy a parameterlistaban visszakaphatjuk a eredmenyet. A fiiggvenyt a nevevel es parameterei megadasaval hivjuk '''T~'n'' visszateresi erteke lehet void is, ez azt jelenti, nines visszateresi a return kiirasa nem sziikseges. sszateresi ertek tipusa FuggvenyNeve( parameterlista ) tasitasok; visszateresi ertek; fiilJr!)v(~nv
szignaturaja (signature) alatt a fiiggveny nevet es parametereinek U""~I"' ertjiik. A parameterlista a parameterek sorrendjet es tipusat jelenti. A C# ...,,.,]iT.'megengedi a fiiggvenyek atdefinialasat, vagy twterheleset (overloading). Vagyisletrehozhatunk tObb azonos nevil fiiggvenyt is, ha parameterlistajuk elter. Az egyesfiiggvenyeket a szignaturajuk kUlonbozteti meg egymast61. A fordit6 szamara egyertelmiinek kell 1ennie egy fiiggvenyhivaskor, hogy az atdefinialt fiiggvenyek melyiket hivja aktualisan.
Pl.lehet MozgatO fiiggvenyiink, ha megallapodtunk, hogy ez a fiiggveny az objek:tumot 1 egyseggel mozgatja el x ininyban. Irhatunk Mozgat( int x) fiiggvenyt is, arnit akkor hivunk, ha fiiggvenyiinknek meg akarjuk adni, Mny egyseggel mozduljon el az objektum x iranyba. Irhatunk Mozgat( int x, int y) fiiggvenyt, ha azt akarjuk, hogy fiiggo1egesen is megadhassuk az elmozdulast. De nem irhatunk Mozgat( int y) fiiggvenyt, ha mar van Mozgat( int x), mert e kettonel hivaskor Mozgat( 5 ); nem lehetne eldonteni, hogy x vagy y iranyban szeretnenk 5 egyseggel elmozditani objektumunkat. A ket fiiggveny szignatliraja megegyezik, azonos neviiek es egy int tipusu parameteriik van.
25
1. Az osztaly es az objektum A tagfiiggvenyek az osztalyhoz tartoz6, annak leirasaban megadott fiiggvenyek. objektumoJjentalt gondolkodasm6d epp abban ter el a strukturaltt6l, hogy strukturalt programozas eseten az adatokat megadhatjuk egy egysegben, de a vegzett miiveletek altalaban a program kiilOnbOzo helyein szetsz6rva el, addig az objektumorientalt programozas egyetlen helyen, az osztalyban adja az adatokon kiviil az azokon vegezheto miiveleteket is]. Uj tagfiiggveny letrehozasa: Class View jobbeger
Az osztaly neve Add
Add Method
Welcome to the C# Add Method Wizard This wizard adds a method to your C# dass,
M~thod access:
Return type:
I:::::J "'ml..--------3--r I
\i'j~H
Parameter t~e:
Modifier:
INone:::::J Iml
Parameter name:
3 rl-------8dd
Remove
Methog name:
r-!AdC"":d------Parameter list:
1
Method modifiers:
r
:l.tatic
r
i;!~"::r,'"
r
'iJrtual
r
E",tern
r
Qverride
r
Ne~
Comment (/I notation not required):
IKet eges2 szamot ad 6ssze
Finish
Cancel
Help
1.3. abra Ket egeszet osszead6 Add fiiggveny letrehozasa ~
Static: A fiiggvenyeknel is bejelolhetjiik a Static m6doslt6t (k6dban static). Ekkor osztalyszintii tagfiiggvenyt hoztunk letre, ami azt jelenti, hogy a fiiggveny objektum letrehozasa neIkiil is meghlvhato. (Szintaxis: MyClass.MyStaticFuntion.) Statikus metodusok csak statikus
] Veg Csaba: Alkalmazasfejlesztes a Unified Modeling Language szabvanyos jeloleseivel, Logos 2000 Kiad6, 1999,5. old.
26
1.3. A
latt:ag()Kon dolgozhatnak. Ilyen a Form osztalyok Main met6dusa vagy APpw:.:aLlLUIl
osztaly Run met6dusa, amit a Mainben hivunk meg.
objektumorientalt nyelvekben (C#, Java) - a hagyomanyos programozasban globalisan megval6sftott fiiggvenyek Nezziik meg barmelyik osztalyt a sug6ban! Az 3 ikonnal jelOlt mind statikusak es meglehetosen gyakoriak.
:Li:tUl.l\.U.,<.U.'-o
taklran hasznalt statikus fiiggveny a MessageBox osztaly Show met6dusa, ugy hasznalhatunk iizenetek megjelenftesere, hogy nem vesziink fel az objektumot. MessageBox.Show("Statikus!"); De ilyen a Thread Sleep met6dusa is, melyet a program varakoztatasara hasznalunk (4. vagy a Process osztaIy Start met6dusa, mely programok indftasara lULU'V,", (6. gyakorlat). kezelese soran is uj, esemenykezelo tagfiiggvenyeket hozunk Ietre. k6dja a k6dszerkesztoben a gepeles soran automatikusan megjeleno lID.t:eIliSelllse) segftsegeve1 frhat6. A sz6 gepeleset elkezdve, a legordiilo a megfelelo elemet a kovetkezo operator ( , (', ';', '.') leiitesevel 1T",,,nT formaban kifr6dik. Ennek a technikanak koszonhetoek a gyakran this kezdodo utasftasok. A fiiggvenyek, tulajdonsagok neve a Ctrl + sz6koz lenyomasaval is kiegeszftheto, ez fOlOslegesse teszi a this hasznalatat. Az szolgaItatas a k6d begepelese soran piros alahlizassal jelzi a hibas k6dreszletet. A hibat kovetoen nem miikOdik a szolgaltatas. ",,,,,'1£1,,,'111
A fiiggvenyek neve elott a k6dszerkeszto biztosft egy +/- ikont, melynek valasztasakor kinyflik / bezar6dik a fiiggveny k6dja. Ha a fiiggvenyeket bezarjuk, az osztaly lefrasat lathatjuk, mig kinyitva a megval6sftast is. Ha bezart fiiggveny neve mellett a ... ikonra mutatunk a kurzorral, a fiiggveny k6dja egy kinyfl6 ablakban olvasllat6. Megjegyzesek eseten a /**/ szoveget tartalmaz6 doboz teszi ugyanezt.
Ii 1;1;/1
D
static void Main () private void Picture ~-------------------, {
1.4. abra A szovegszerkeszto az osszecsukott Main k6djaval
27
1. Az osztaly es az
ektum
I-"~ I~2
Az eszkozsor ikonjaival a kijeWlt sorok megjegyzesse alakithatok, illetve megjegyzesjelet kivehetjtik elolUk.
1.4. A valtoz6k Amikor eldontjtik egy adattag tfpusat, akkor donttink az adat altai felveheto ertekekrol es a rajta elvegezheto miiveletekrol. A kozos tfpusrendszer a .NET komyezetben a CTS (Common Type System) a CLR (Common Language Runtime) resze. ACTS biztosftja a ktilonbbzo nyelveken irt komponensek kozti adatkommunikacio lehetoseget. A valtozok ket kategoriaba sorolhatok: •
Ertek tfpusok (Value Types) Kozvetlentil tartalmazzak az adatokat. A rajtuk vegzett muveletek nem modosftanak mas valtozokat. A minden ertek tfpusnak van alapertelmezett kezdoerteke. (Sligo: types, default values) PI. iot az egeszek tarolasara, float a valos szamok eleresehez. (Sligo: types, built-in, Built-in Types Table) A kovetkezo ket kodsor ugyanazt az eredmenyt adja, egy int tfpusu egesz szamara foglal helyet es 0 kezdoertekkel inicializalja. int i int i
•
new int ( ) ; 0;
Hivatkozas tfpusok (Reference Types) Egy hivatkozast tartalmaznak egy adattertiletre. Az adatok a hivatkozott tertileten tarolodnak a memoriaban. Ket hivatkozas tfpusli valtozo hivatkozhat ugyanarra az objektumra. Az egyiken elvegzett mlivelet modosftja a tbbbi, ugyanarra az objektumra hivatkozo valtozo erteket. Hivatkozas tfpusli pI. a string a szovegek tarolasara, de ilyenek az osszes osztaly tfpusli valtozok es a tbmbbk is. A hivatkozas tfpusli valtozokat ket lepesben hozzuk letre, bar ez a ket lepes egy sorba is kertilhet. System. Windows. Forms. Button
button;
II A referencia
valtozo deklaracioja. Meg nincs meg az objektum amire hivatkozik.
28
1.4. A vaItozok button = new System.Windows.Forms.Button(); //Anew
operator letrehozza az objektumot es visszaad egy referenciat, amit a hivatkozas tfpusu valtoz6ban tarolni tudunk. A C# nyelv tartalmaz egy specialis erteket - a null-t. Egy referencia erteke null, ha nem hivatkozik semmire. Ha fel akarjuk szabadftani a hivatkozott teriiletet, egyszeriien allftsuk a valtoz6 erteket null-ra! A mem6ria felszabadftasat az automatikus szemetgyiijto vegzi majd el.
Az ertek tfpusok nem lehetnek null ertekUek.
~. Az automatikus szemetgyiijtest a 2. gyakorlat 3. feladataban demonstraljuk. Egyszeru tOmbot hozhatunk letre a [ ] operator segftsegevel. A tOmb olyan ertekek gyiijtemenye, melyekre indexelessel hivatkozhatunk. . PI. egy szamokb61 all6 tOmbot a kovetkez6keppen hozhatunk letre: iIlt[] int [ ]
nums = new int[] {5,-1,12,8,5} numbers = new int [5] ;
Mindket esetben egy int tfpusu 5 elemii tOmb keletkezett, csak a nums tOmb elemekkel is fel van tOltve. A tOmb elemeire sorszamukkal hivatkozhatunk. A sorszamozas O-val kezd6dik. A kovetkez6 utasftas a numbers tomb els6 (nulladik) elemenek 8 erteket ad. numbers [0] = nums[0]+3;
Ha a tOmb nem letez6 elemere hivatkozunkpl. -1. vagy jelen peldanal5. vagy 12.akkor (out of range) kivetel keletkezik. A string tfpus egy gyakran hasznaIt speciaIis tfpus, fgy szanjunk neMny sz6t a megismeresere! A string tfpusnev val6jaban egy rovidebb eleres a System. String osztalyhoz. Bar a sztringeken mindenfele m6dosft6 miiveleteket vegezhetiink, val6jaban egy sztring erteke nem m6dosfthat6. A m6dosft6 fuggvenyek, melyek latsz6lag a sztringet valtoztatjak, val6jaban egy uj peldanyt hoznak letre. A [] operator a sztringet tOmbkent kezeli. Az els6 karakter indexe O. string s = "Karaktersor"; char ch = 8[2]; II 'r' s[O] = 'k'; II Hiba! Nem m6dosithat6 a sztring erteke!
A Length tulajdonsag megadja a sztring hosszat. A sztringek a + operatorral osszefiizhet6ek (konkatenalhat6k), a ToUpper es ToLower met6dussal nagy- es
29
1. Az osztaIy es az objektum kisbetiisse alakithat6k. Az strO met6dussal szamok sztringge alakithat6k. sztringek osszehasonlftasa ( == egyenlo, != nem egyenlo) soran nem az altalu hivatkozott dmet hasonlitjuk ossze, hanem karaktereiket. A tobbi osszehasonlit operator nincs megval6sftva a String osztalyban.
IMegjegyzes: I M6dosfthat6 sztring osztaIy a StringBuffer. Minden osztaly tartalmaz egy ToString met6dust, melynek feladata az osztaI Iefrasa. Alapertelmezett megval6sftasa a tipus nevevel ter vissza, de ezt feltilfrhatju peldaul ugy, hogy az adattagok ertekeit is kifratjuk vele.
? 1.5.
A System.String osztalyr61 bovebb informaci6t a .NET Framework SDKban talalhatunk.
A hithatosagok
Az osztalyokat, adattagokat es a met6dusokat egyarant negy+ 1 fele lathat6sagga (visibility), hozzMeresi szinttel (accessibility) erhetjtik el. A nevek elott (Unified Modeling Language) jelOlestik lathat6. - Privat (private)
# Vedett (protected) B elso(internal) + Nyilvanos (public) A nevek onmagukert beszelnek. Van meg protected internal hozzaferesi szint is (+ 1). A privat tagot csak maga az osztaIy lathatja, ezek a tagok csak az osztaIy belsejebol (met6dusainak blokkjab61) erhetok el. Ha a k6d mas reszeben hivatkozunk raj uk, a fordft6 hibatizenetet ktild. A vedett lathat6sagot az orokles soran (5.1.4. szakasz), a belsot az assembly fogalmanal (7.2.1. szakasz) targyalja a konyv. A nyilvanos tagokat mindenhonnan elerjiik, az osztalyok belsejeb61 is es kfviilr61 is hivatkozhatunk rajuk. Az adattagokat lehet ugyan, de az objektumorientaIt elvek betartasa eseten nem illik nyilvanosra deklaralni. Az objektumorientalt gondolkodasmod szerint alapertelmezesben az osztaly minden tagja private. Ez azt jelenti, ha nem frunk a k6dba lathat6sagot, akkor az private lathat6sagot jelent. Ha a k6d froja meg akarja engedni mas osztalyok vagy ftiggvenyek szamara a hozzaferest, akkor azt ki kell frnia. Ha a fejlesztoeszkoz
30
1.6. A tulajdoosag hozzuk letre az osztaly tagjait, akkor a hozzaferes alapertelmezett UUUll''-', amit a combo listajab61 m6dosfthatunk. Az osztaIy neve
A tulajdonsag fogalma (encapsulation) az objektumorientalt programozas egyik alaIP¢l'\le. Az elnevezes onnet szarmazik, hogy mig a proceduralis programozasban .valtoz6kban taroltuk az adatokat, s kiilon fuggvenyek, eljarasok dolgoztak eze:k!9t1 az adatokkal, addig az objektumorientalt programozasban egy egysegben tOI:tellik az adatok es a hozzajuk tartozo metodusok kezelese. J\z.j~~~gysegbezaras
lehetove teszi, hogy az adattagokat csak tagfuggvenyeken ke,f.y§~tiil erhessiik el. Ennek megva16sftasat a tulajdoosag (property) fogalmanak bex~zetesevel tamogathatjuk. Egy tulajdonsagot olvasni (getting) vagy frni (setting) vagM,mindkettot lehet. A tulajdonsag frasa a vele azonos nevi! adattag set met6duson ke~esztiil megva16su16 beallftasat, mig olvasasa a get met6duson keresztiili eitekvisszaadasat jelenti. A kovetkezo k6dreszlet egy Name tulajdonsag m.egva16sftasat mutatja: private string name; II A taro16 adattag
II frhat6-olvashat6 tulajdonsag: public string Name {
get {
return name; }
set {
name
= value;
} }
31
1. Az
es az
A tulajdonsag (nagybetuvel) a hiv6 k6dban ugy viselkedik, mint egy tagvaitOZ6, ffiekadaskor a set met6dusa hivOdik, mig olvasaskor a get met6duson kel'esz:tij jutunk az adathoz. A tulajdonsag segitsegevel gyakran egy adattag egy reszet, vagy !Obb adattagban tarolt adatot kezeliink.
A keszen kapott felhasznal6i interfesz osztalyaink (pI. vezer16k) tulajdonsagainak kezd6erteket kenyelmesen allithatjuk a Visual Studio Properties ablakaban. Milyen el6nyokkel jar a tulajdonsag hasznalata? <:!:>
Lehet6ve valik csak olvashato (csak frhat6) adat ietrehozasa, ha nem irunk set (get) met6dust.
<:!:>
Lehet6ve valik az elJenorziitt adatbevitel. A set met6dus k6djaban eJlen6rzi a befrni kivant erteket.
<:!:>
Lehet6ve vaJik az adatok praktikus tarolasa meJlett azok kenyelmes irasa, olvasasa. A get es set met6dusok k6djaban italakithatjuk az adatokat.
<:!:>
Lehetove valik az adattiiroliis mOdjiinak megviiitoztatasa anelkiil, hogy az osztaly felhasznal6janak m6dositani keJlene a k6djat. (PI. az ezredfordul6n sZiiksegesse valt a ketjegyii evszam tarolasr61 a negyjegyiire !Orten6 atvaltas. Y2K) Propertyvel !Ortena megval6sitas eseten elegend6 csak a tarol6 adattag es a get / set fiiggvenyek k6djanak megvaltoztatasa. Az osztalyt hasznal6 k6dot csak ujra kell forditani, nem kell ujrafrni, hisz az csak a public propertyvel dolgozhat, a private adattagot nem erheti el.
<:!:>
Lehetove valik osszefiigga adatok !Obb kii16nbOz6 adattagban !Ortena tarolasa es egyseges kiolvasasa. PI. egy nevet a kes6bbi kenyelmesebb feldolgozas erdekeben lehet ket mez6ben, csaladi nev es ut6nevkent tarolni, de beolvasaskor, kifraskor ez egyetlen adatkent erzekelheto.
<:!:>
Lehet6ve valik ugyanarr61 az adathalmazr61 kii16nboz6 m6don informaci6 kerese.
<:!:>
Altalunk frt vezerl6 felhasznalasa eseten a tulajdonsag megjelenik a Properties ablakban, kezd6erteke a fejlesztes soran kenyelmesen allithato be.
A tulajdonsag haszniilata j61 megfigyelheto DateTime tipus tulajdonsagainak tanulmanyozasaval. A DateTime tipus az - encapsulation elvnek megfelel6en szamunkra ismeretlen m6don tarolja az adott datum, id6 adatot. Viszont tulajdonsagain keresztiil kenyelmesen olvashat6 az ada!.
32
1.7. A nevterek (index) a DateTime felsorohisban a properties kategoriat ,SZl:va liithatjuk, hogy az ev a Year, a hOnap a Month, a nap a Day, az Honr, a perc a Minnte, a masodperc a Second tulajdonsag kaphato meg, de a DayOfWeek segitsegevel azt is gIlidhlltJU.k, hogy a het Mnyadik napjara esik az adott datum (0 ertek a ,,,arnar'), A Now tulajdonsag a gep aktuaiis datumat 6s idopontjat adja egy DateTime tipusli vaitozoban. letrehozasat a Visual Studio kornyezet tamogatja. :ellass View: Osztaly kivalasztasa
jobbeger gomb
Add Add Property
;ze
A DateTime osztaiy Now tulajdonsaga az aktu,His idot adja vissza. Ez egy statikus, vagyis osztalyszintii tulajdonsag, mert a feladatban szereplo idot tarolo objektumoktol fiiggetlen erteket a gepidot adja vissza. Erteke nem modosithato, teMt csalc get metodussal rendellcezik. Uisd sligo! Tulajdonsag felhasznahisa mar a legegyszeriibb programban is ellceriilhetetlen, k6szitesere a 8. gyalcorlat 8.1.5. szalcaszaban es a 9. gyalcorlaton tiibbszor is IMhatunk peldat.
1.7. A nevterek A nevterek az osztalyok valamilyen logikai osszefiigges szerinti csoportjat jelentik. Mind nagyobb egy program, anml! hasznosabbak a nevterek, hogy kifejezzek a program egyes reszeinek logikai elkiilOniileset. A nevterek egymasba agyazhatok. Peldaul a .NET keretrendszer biztositja szamunkra a: '<:> System nevteret, mely tartahnazza a .NET kornyezetben altalanosan
hasznalt osztaJyokat. A System tobb kisebb nevterre bonthat6, melyek nevet a '. ' elvalaszto karalcterrel adhatjuk meg. A System nevter tartalmazza kozvetleniil a DateTime tipust es a String osztaiyt.
33
1. Az osztiily es az objektum
--------------~~==~~~~==------------'<:> System.Net nevter biztositja a hiil6zat programoziisiihoz sziiksege.s
protokollok pI. a TCP/IP (Transmission Control Protocol/lnternel Protocol) magas szintii elerese!. '<:> System.Windows.Forms nevter Windows alapu alkalmaziisok sziimara
lehetove teszi a Windows operiici6s rendszer iiltal biztositott gazdag felhaszniil6i interfesz lehetosegek kenyelmes elerese!. Itt taliiljuk a formokon kiviil a piirbeszedablakok es a vezeriok, valamint egyet komponensek osztiilyainak leiriisiit. '<:> System.IO nevteret Input/Output mllveletek (hiis / Olvasiis) elvegzesere al
operiici6s rendszer fiijlrendszerevel kapcsolatos miiveletek elvegzesel tiimogatja. PI. a File es Directory osztiilyai lehetove teszik az alkalmaza~ sziimiira fiijlok es kiinyvtiirak letrehoziisiit, Wrieset, m6dositiisii!. '<:> System.Data nevter szolgiiltatja az adatbiizis eleresek egyseges feliiletet
Tiibb nevterre oszlik. A System.XML nevterrel egyiitt tiimogatja osztOl1 adatbiizis-kezelo alkalmaziisok fejleszteset es az adatok kezelesel connected es disconnected rendszerekben. Kiiliinbiizo nevterekben haszniilhatunk egymiissal megegyezo elnevezeseket is, his1 nevteriik megkiiliinbiizteti oket egymiist61. Nevteret a -
A using nevter neve; direktiva haszniilata lehetove teszi hogy a nevter osztiilyai ell ne kelljen kiirnunk a nevter nevet. Az elozo k6d a direktiva haszniilatiival , kiivetkezore m6dosulhat:
34
1.8. A this system.windows.Forms; Elsa class Formi : Form private Button pictureButton;
1.s:;;.:Athis parameter
~ ~ds'~~IY
csak az adott tipus lefnisat tartalrnazza, az osztalyban nem tiirtenik helYtoglalas az adatok szamara. A helyfoglalas az objektum definialasakor tiirtenik meg'Il~ termeszetes is, hisz egy adott osztalyb61 tiibb kiilOnbOziS ertekii objektumot hOzhatunk letre. Honnet tudjak az osztaly lerrasaban szereplo fUggvenyek, hogy most~pen melyik objektumon dolgoznak? Am~tjldushivasok (ha nem statikusak) objektumMI induluak. Az lehet,' hogy egy met6~~~t egy masik met6dus belsejebol hivunk meg, de a hivas itt is objektumb61
indult,'mi csak tovabbadtuk. A met6dusok a k6dot az osztaly lerrasab61 veszik, es van egy lathatatlau parameteriik: a this. A this az aktualis objektumra hivatkozik. A ftiggveny vcgrehajtasakor az adatokat a this altai hivatkozott a cfrnrol veszi, a this altaI hivatkozott adatteriileten dolgozik. Ha a fUggveny belsejebOI met6dust hivunk, a this tovabbad6dik. A kiivetkezo k6dreszletben a FormI osztaly Initillli.~eComponent met6dusa parameter nelkiilinek i:itszik, de k6djaban megis tudunk hivatkozni a this-reo A this a latszat ellenere a ResumeLayout met6dusnak is tovabbad6dik. private void InitializeComponent{) (
this.BackColor
=.
System. Drawing. Color. LightBlue;
this.ResumeLayout{false)
i
}
1.6. abra A this szerepe a fUggvenyhivasban
35
1. Az osztaly es az objektum C# k6dban a thist es a nevterek hivatkozasat explicit m6dou ki szokas Imi, talar forrask6d szerkeszto szoveg kiegeszit6 tamogatasa miatt. Vagyis ann koszonhet6en, hogy a this. utan a szovegszerkeszt6 felkinalja az adott Oszta met6dusait, tagvaltoz6it es tulajdonsagait (InteIliSense). Ezek !Obbnyire hass neviiek, de nebany kezd6betii leiitese utan a nev kiegesziil, a kis- es nagybeb helyesen kiir6duak Enterre, vagy meg gyorsabb, ha k6dban a nevet kovet6 operata ';' '.' '(' ) karaktert iitjiik Ie. Tebat a this kiirasaval gyorsabban irhat6 hibatlan kt mint elhagyasakor. A fenti k6dban mindket this elhagyhat6 lenne, es mivel a us1 System. Drawing; a fajl elejen szerepel ez is, elhagyhat6 lenne a Color el61. Ba, k6d a kiirasokkal gyorsabban irhat6, de nehezebben olvashat6, kii16nosen egymas agyawtt fiiggvenyhivasok eseten. A konyvben ritkan szerepelnek foloslegesen ki tagok. A k6dgenenitor min dig kiirja a nevterek hivatkozasat es a this referenciat.
A this vagy a nevter hivatkozas elhagyasa eseten a kezd6betiik ut a Ctr! + sz6koz billentyiik segitsegevel hivhatjuk elo a legordii slig6t (InteIliSense).
1.9. Teszt 1.
A nevter a logikailag osszetartoz6 osztalyok esoportjat jelenti.
2. Statikus met6dusnak nines this parametere, mert nem objektumb61 indul hivasa. 3. A 'using nevter neve;' utan mar ne irjuk ki a k6dban a nevter nevet, mert az nevter dupla hivatkozasat jelenti, es hibaiizenethez vezet. 4. Statikus met6dusnak nines visszateresi erteke. 5. Az osztaly tagjai alapertelmezesben publikusak, ha el akarjuk 6ket rejteni, eleji kell irnunk pI. a private kulessz6t. 6. A tulajdonsag az adatok tulajdonsaglapon torteno beallitasara swlgal. A k6db erteke nem valtoztathat6. 7.
A vaItoz6kat kotelezo inieializalni, ha nem akarunk kezdoerteket adni, akk null erteket kell beallitanunk.
8. A fiiggveny szignatlirajat a neve, a parameterlista es a visszateresi ertel hatarozza meg. 9.
36
A tulajdonsagok hasznalata lehetove teszi a batteradatok kiilonbOzo m6d, !Orten6 felhasznal6barat kiolvasasat.
1.9. Teszt
~"~~:{:;~~:~!;~egYik elonye a public adattaggal szemben, hogy ertekadaskor a ellenorizni lehet a bevitt adatok helyesseget.
iJj
rkiiliillbOz( lathatosagu fuggvenynek lehet azonos a szignattiraja. 12. " tipusu valtozo referencia tfpusu, fgy csak a szovegek helyenek dmet \llflllJroazza. 13.irita,,5; int b"a; a,,7; eseten b erteke 5 marad, mert az int mek tipusu valtozo.
14. stririg a="alama", string b=a; a="korte"; eseten b erte.ke "k5rte" lesz. 15. Publikus tagokhoz mindenhonnan hozziiferhetiink, mig private tagok csak az osztaty tagfiiggvenyeibOlliithatoak. 16. A fiiggveny atdefiniiilas azt jelenti, hogy azonos new, de mas parameteriistaju fiiggvenyt keszitiink. Javit6kolcs;
I" I H, H,H,H,H,H,I,I,H,I,I,H,I,I.
37
2. .L.~"" alkalmazas vezerlese 2:li"A Main Minden alkalmazasnak kezdodnie kell valahol. Az alkalmazasok vegrehajtasa a Main fiiggveny hfvasaval indul, es a Main befejeztevel vegzOdik. Egy alkalmazas t5bb oszrnlyt is tartalmazhat, de beJepesi pontja csak egy lehet.
A C# nyelv case sensitive, vagyis megkiilOnbOzteti a kis- es nagybetiiket. A Maint es altaJaban a met6dusok, valamint oszrnlyok nevet nagybetiivel, a valtoz6k neveit kisbetiivel szokas kezdeni. A fordft6 nem engedi a sz6k6z6k,hasznalatat a nevekben, fgy az 6sszetetelek menten nagybetiivel szokas az uj sz6t irni, ezzel segftve a hosszu szavak olvashat6sagat. PI. InitializeComponent. A Maint a Visual Studio automatikusan static met6duskent hozza letre. Mivel a Main inditja az alkalmazast, meg barmely objektum Jetrehozasa doU meghfvhat6nak kelliennie.
39
2. Az alkalmazas vezerlese
2.2. Az esemenykezeles A Windows openici6s rendszer biztosft az osszes rajta fut6 aIkalmazas szamara esemenykezel6 (iizenetkezeI6) mechanizmust, mely soran a bekovetkez6 eSI!mlen~ek (event) hatasara iizenetet kiild. A programoz6 feladata az esemenYhez esemenykezel6 met6dus kapcsolasa, mely megadja az esemenyt kezel6 k6dot. PI.
Lenyomjuk a baloldali egergombot a Form felett. Esemeny: MouseDown Met6dus: sender = {EIso.Form) private void Form_MouseDown(object sender, System. Windows. Forms . MouseEventArqs ..JC)
/ e= {X=l17Y= 141 Button = Left) A met6dus a Form osztaly tagfiiggvenye, es els6 parametere tartalmazza a kiildo objektum adatait, mfg masodik parametere az esemeny adatait. A formot, vagy egy konkret vezerl6t kivalasztva, a Properties ablak Events eszkozgombjan kattintva az adott vezerl& altaI kezelhet& esemenyeket nezhetjtik meg. Hozzarendeles a gyakorlatban: Legyen aktualis a Form Properties ablak Esemeny gomb Nezhetjiik abc sorrendben, Kategoriak szerint csoportositva.
40
2.2. Az
Esemenyek
----- -------- ------;:';1
2.1. abra Esemenykezel0 met6dus letrehozasa A kezylni kivant esemeny neven duplan kattintva letrejiin a kezelomet6dus, a kurzor pedig a met6dus k6djahoz ugrik. Ha mi akarjuk megadni a kezelofiiggveny nevet, egyszeriien begepelhetjiik az esemeny neve melle a tulajdonsagablakban.
2.2.1. Az alapertelmezett esemeny kezelese Minden vezerlohiiz tartozik egy altalanosan kezelt (default) esemeny, ezt az adott vezerlon a tervezoablakban duplan kattintva generalja a Visual Studio kiimyezet. llyen a' form eseten a Load, mig a gomb eseten a Click esemeny. Ezzel a gyors lehet6seggel elve nem vilaszthatjuk meg a kezelofiiggveny nevet, azt az objektum neveb6l es az esemeny neveb6l rakja iissze a k6dgenerator: Form_Load, HatterszinButton_Click. A kezelo lelrehozasakor a knrzorunk most is a kezelofiiggveny elso soraban villog, lehet6ve teve a k6d frasat.
2.2.2. Az esemenykezelii kodja Az esemenykezelo lelrehozasa soran a fejlesztoeszkiiz ket helyre fr bejegyzest, egyreszt a fiiggvenyt frja be a form osztaly tagfiiggvenyei kiize, annak blokkjaba 41
2. Az alkalmazas
vezerh~se
---------------=~~==~~~~-------------
frjuk a k6dunkat. Masreszt az esemenyhez hozzarendeli az esemenykezelot az EventHandler met6dus segftsegeve!. A k6dban a
I
#region
Windows
Form
Designer
regiO kinyitasaval az InitializeComponentfiiggvenyben MouseDown esemenyhez kezel6t rendeltiink.:
generated
code'
hithatjuk,
hogy a
this.MouseDown += new System.Windows.Forms.MouseEventHandler
(this. Form_MouseDown) ;
Ha veletleniil hozunk letre ilyen esemenyhez kezelot, azt a Properties ablakban celszerii tiirOlni, vagy a k6db61 k€t helyr61 kell kivenni a bejegyzest.
2.3. A program szerkezete A program a Main fiiggvennyel indu!. A Main feladata konzol alkalmazasoknal a paranessori parameterek fogadasa, feldolgozasa, es a kapott eredmeny alapj'n visszajelzes az operaei6s rendszernek. Windows alkalmazasok eseten a Main hozza letre az esemenyvezerelt futtatast biztosit6 h:itterk6dot, es a felhasznal6i feliiletet, amin keresztiil a felhasznal6 a programmal kommunikalni tud. Az Application osztaly statikus Run met6dusa biztositja az aktualis sz.l iizenetkezel6 eiklusat. A Run parameterekent jiin letre a f6ablak -ami egy form -, s melynek InitializeComponent met6dusa tartalmazza az ablakra vonatkoz6 egyedi informaei6kat. static void Main() {
ApplicatioD.Run(new Forml()); }
A f6ablak letrejiitte utan a k6dban mar uines kiivetkezo utasitas, a Run metodus elindftja az iizenetkezelest, az alkalmazas iizenetre var, s ha az adott iizenethez van kezel6 met6dus, akkor azt mvja meg. A kilepes iizenet (Bezaras ikon, vagy a menii Bezaras meniipontja) hatasara a Run futasa befejezodik, es az alkaimazas vegrehajtasa veget er.
! 42
A gyakorlat soran feitetlen hajtsa vegre a debuggerrel a programot lepesenkent!
2.4. A vezerlOszerkezetek
2.4. A vezerlOszerkezetek 2.4.1.. A szekvencia A program egymas utan frt utasitasok sorozata. Az egyruast kovet? utasitiisokat zekVencianak nevezziik. Az utasitasokat ';' valasztja el egymast61. Uj utasitast uj :orban szokas irni. Az utasitasok vegrehajtasa frasuk sorrendjeben tOrteIrik. A program egyruashoz logikailag kapcsol6d6 utasitasait egy blokkba szokas frni. A blokk elejet a '{', veget a ')' jelzi. A blokk vegere nem tesziink ';' -t, mert a '}' lezarja azt! A blokkok egymasba agyazhat6k.
Ha a blokk kezdetet es veget uj sorba frjuk, a szerkeszto egyruiis ala igazitja oket, s igy jobban attekintheto k6dot kapunk. Ha a blokkot lezarjuk, a '}' epp a ' {' ala kertil, a blokk belsejehez tartoz6 k6dsorokat pedig egymas ala rendezi a szerkeszto. Egy rovid ideig meg a blokk eleje es vege vastagon szedve jelenik meg, hogy jobban lehessen latni az osszekapcsol6d6 reszeket. Minden blokk egy hat6kOr (szk6p, scope). A blokkban definialt valtoz6t lokalis valtoz6nak (local variable) nevezziik. A lokaJis valtoz6 a definici6jiit6l a blokk vegeig lathat6. Az egymasba agyazott blokkok belsejebOl latjuk a .kiilso blokkok vrutoz6it, igy a fordit6 nem engedelyezi a kiilsa blokkal azonos new valtoz6 hasznalatat a belsa blokkban. . int i :::: 3; (
int i = 5:
II Hiba, azonos nevd valtozQ mar szerepel a I Ihat6korben.
Egymast61 elkiiWniila blokkokban Ietrehozhatunk azonos new vrutoz6kat. (
int i
3,
) (
int i
5,
)
Celszerii a valtoz6kat az aket felhasznru6 blokkban definialni. Ez futaskor hatekonnya, fejleszteskor pedig attekinthetave teszi a programot.
43
2. Az alkalmazas vezerlese
--------------------------------------------------------------------2.4.2. Az elagazas Egyagu elagazast hasznalunk, ha egy utasftast csak bizonyos feltdel teljestiIese eseten hajtunk vegre. TeMt az elagazasban szereplo utasftas(ok) nem minden esetben hajt6dnak vegre. if (logikai kifejezes) utasitas vagy utasitas blokk.
pI.: if
( j e 1 S Z oBox . Text
!=
Azonossag megalIapftasahoz az operator ertekadast vegez!
" AAA "
)
Application.Exit();
es a ' !=' operatorokat hasznaljuk. Az
'~,
Ketagu elagazasr61 beszeltink. ha egy feltetel teljesiilese eseten valamit, mig ellenkezo esetben mast tesz a program. Itt az elagazas valamelyik agan szereplo utasftas (sorozat) biztosan vegrehajt6dik. if (logikai kifejezes) utasitas vagy utasitas blokk else utasitas vagy utasitas blokk
Egesz tfpus nem frhat6 a C++-ban megszokott m6don a logikai kifejezes helyere. Explicit ki kell frnunk: if ( i '= 0 ). Tiibbiigu elagazas megval6sftasahoz a C# nyelv ket lehetoseget is kfna!. Az if, else if technikaval tetszoleges szamu egymast kizar6 feItetelt vizsgalhatunk, az else if agak szama hatarozza meg az elagazasok szamat Az utols6 else ag lete vagy elhagyasa hatarozza meg, hogy biztosan vegrehajt6dik-e valamelyik ag, vagy a feItetelek nem teljesiilese eseten a program a kovetkezo utasftason folytat6dik. if (logikai kifejezes) utasitas vagy utasitas else if (logikai kifejezes) utasitas vagy utasitas else if (logikai kifejezes) utas.1.tas vagy utasitas else utasitas vagy utasiLas
blokk blokk blokk blokk
Vegyiik eszre, hogy a fenti elagazas nem azonos az egymas utan frt if elagazasokkal! Mfg a fenti esetben az else if ag vizsgaIata csak az if feltetel nem teljesiilese eseten
44
2.4. A vezerloszerkezetek
..rtenik meg. addig egymas utan ITt if utasitasok mindegyikeben megtortenik a
~Olt'tel vizsgruata, teMt aw az is elOfordulhat, hogy minden feltetel teljesiil es
;:degyik utasItas blokkja vegrehajt6dik. Egymast kizar6 feltetelek eseten az else if k6d a hatekonyabb.
Az if utasitasok egyrnasba agyazhat6k. Az else if utasitas is tekintheto az else agba agyazott ujabb if utasitasnak, de megtehetjiik, hogy az igaz agban isujabb feltetelt vizsgruunk pI. if (jels2oBox.Text !::: "AAA") if (++missed == 3) Application.Exit();
else label.Text:::: "Helyes jelsz6!U;
A ++ openitor eggyel noveli, mig a -- operator eggyel csokkenti a valtoz6 erteket. MindkeM aIlhat a valtoz6 elott vagy mogott. A ++ (increment) operatort a numerikus valtoz6 elott hasznalva (prefi¥.) a miivelet vegeredmenye az l-gyel novelt valtoz6 erteke. A valtoz6 utan frva (postfix) a ++ operatort a miivelet eredmenye a vaItoz6 erteke a noveles elott. Jelen helyzetben teMt az osszehasonlitasban a novelt ertek vesz reszt, mig missed++ eseten meg a noveles e10tti erteket hasonlitanank ossze, majd azutan novelnenk a missed erteket. Mikor hajt6dik vegre az else ag? Az else alapertelmezesben a legbelso if parja. Ha eMI el kivanunk terni, blokkok
letrehozasaval megtehetjiik ezt. Hiaba frtuk teMt a kiilso if-fel egy vonalba, a fenti k6d else aga minden olyan esetben vegrehajt6dik, amikor meg nem erte el a missed a 3 erteket. A k6dreszlet helyesen: if (jelszoBox.Text !::: "AAA") {
if (++missed
3) Application.Exit();
)
else label.Text::: "Helyes jelsz6!";
A feltetelek kiertekeleset a C# felteteles logikai openitoraiban (&&, II) oly m6don optimalizaItak, hogy ha a kifejezes erteke mar egyertelmii, a kierteke1es nem folytat6dik. fgy egy AND (&&) miivelet eseten, ha a baloldali parameter hamis, a kifejezes erteke mar biztosan hamis lesz teMt a jobboldali ertek nem ertekelodik ki. Hason16 m6don OR (II) eseten a baloldali operandus igaz volta eredmenyezi az operaci6 biztosan igaz erteket, igy a jobboldali operandus kiertekelesere nem keriil sor. Ezt kihasznalva a prograrnoz6kuak nem kell peldaul egyrnasba zart 45
2. Az alkalmazas vezerlese elagazasokat, ciklusokat frniuk olyan esetekben, amikor a baloldali erteketol fiigg a jobboldali kiertekelhetosege. Irhatjak egy kifejezesbe a ket feltetelt Ez noveli a k6d attekinthetoseget. . if (textBox.Text.Length > 0 && textBox.Text ; : ; "DolLir! else textBox.Text = "";
I• Figyelem!
II
textBox.Text[OJ~~'$')
i
A bitenkenti logikai (&, I ) operatorok mindket operandusl
kiertekelik. A switch case utasitas attekinthetobb t6bbagu elagazasok irasat teszi lehetove, de haszmilata korlatozott. A switch ku1cssz6 utani kifejezes tipusa csak valamilyen egesz tipus, char, enum vagy string lehet - vagy olyan objektum aminek van implicit cast operatoral ezen tipusok egyikere -, a case ku1cssz6 moge pedig nem irhatunk ertektartornanyokat, csak egyedi ertekeket.
A C, C++ es Java nyelvekkel ellentetben a switch utan hasznalhatjuk a string t{pust is, ilycnkor a case erteke akar null is lehet. A switch case ehigazas tartalmazhat egy default ku1cssz6t is, mely utani blokk akkor hajt6dik vegre, ha egyetlen case utiini ertekkel sem egyezett meg a valtoz6. switch (jels2oBox.Text) {
case "Anna" : label.Text="Helyes jelsz6"; break; case nUll: label.Text=="Meg nines jelsz6"; break; case "" . label.Text="Meg nines je1820"; break; default: label.Text="Hibas jelszo" i break; }
I
A castoliisr61, konverzi6r61 az Ortiklesnel, az 5.3.2.szakaszban olvashatunk oovebben.
46
2.4. A vezerloszerkezetek - .,
egyes agak vegere nem frjnk be a 'break' kulcssz6t - a fordft6 hibatizenetet ~~;sz~intaz ellenorzes ~em eshe; at az .e~ik 'case' cfmkerol a rrulsikra. Tehat ~dag~zasnakPontosan egy aga fog vegrehaJtodni.
2.4.3. A cikllls E utasitasblokk tiibbsziiri vegrehajtasara a C# nyelv tiibb lehetoseget is kimi\' A cS'usokat felteteles es 16pteto kateg6riaba soroljuk. 2.4.3.1. A feltl!teles ciklusok Vegrehajtasuk egy logikai kifejezes igaz voltat61 fiigg. A while utan szereplo feltetel kiitelezo en logikai kifejezes. A C++-t61 elteroen nem engedelyezett az int ertek hasznalata . A blokkot hatarol6 kapcsos zar6jelek egy utasitas eseten elhagyhat6k. EliiI tesztelOs ciklus: while (logikai kifejezes) {
utasitasok;
A ciklus blokkjaban szereplo utasitasok mindaddig vegrehajt6dnak, amig a feltetel igaz. A blokkvegere erve a feltetel ujra kiertekeIesre keriH. A feltetel hamis erteke eseten a blokk nem hajt6dik vegre. Ha a feltetel mar az elso alkalommal hamis, a blokk utasitasai egyszer sem hajtodnak vegre, a vezerles a blokk utani elso soron folytat6dik. Hatul tesztelos ciklus: do {
utasitasok; }while(logikai kifejezes}i
Az utasftasok vegrehajrnsa ullin a logikai kifejezes igaz erteke hatasara a vezerles ujra a doutani sorra kernl, hamis ertek eseten a kiivetkezo soron folytat6dik. Hatul tesztelos ciklus egyszer biztosan vegrehajtodik.
Ne feledjtik a logikai kifejezesben szereplo valtoz6k erteket a kiertekeles elott beallitani es a ciklus blokkjaban m6dositani, mert kiinnyen vegtelen ciklust keszfthettink! Mig eliil tesztelos ciklus, eseten a while feltetele utani ';' tires ciklust jelent, addig a batul teszteT0s ciklusnal kiitelezo a ';' a while feltetele utan.
47
2. Az alkalmazas vezerlese 2.4.3.2. A leptetOs ciklusok A leptetos ciklusok gyakran a blokk adott szamu vegrehajtasat jelentik. Mivel a ciklus fejeben osszefoglalva szerepel a belepes, kilepes es !eptetes, elkerUlheto a feIteteles ciklus gyakori hiMja: a ciklusvaItoz6 m6dosftasanak elfelejtese. for (ciklu8vciltoz6(k) kezd6erteke; bentmaradas feltetele; ciklu8valtoz6(k) m6dositasa) (
utasitasok; )
PeldilUI: for
(int i
= 0;
i
< 10;
i++)
label.Text += l; }
Bar a leptetest biztosft6 utasftas fizikailag a blokk elott helyezkedik el, vegrehajtasara csak a blokk vege utan keriil sor. Egy for ciklusban t6bb valtoz6t is letrehozhatunk, ha azonos tipusuak, es killankiil6n Ieptethetjiik 6ket. for
(int i
=
0
I
j
0;
l
+ j
=
0;
< 15;
i++,
j
+=3)
(
label.Text += i; }
for (int i
=
0, uint j
i
+ j
< 15;
i++,
j
+=3)
IIHiba!
A hiMt az okozza, hogy a ket ciklusvaltoz6 csak azonos tipusu lehet, es emiatt csak egyszer szabad kiirni a tipust. A ciklusban letrehozott valtoz6k (i, j) a ciklus blokkjan kiviil mar nem erhetok el. Tilos a for ciklust tartalmaz6 blokkban a ciklusban hasznalttal azonos nevii valtoz6kat Ietrehozni, mert azok a ciklus belsejeben elerhetok, es neviitk6zes lepne fel! Egymas utan vegrehajtott for ciklusok viszont hasznalhatnak azonos nevii vaItoz6t a lepteteshez.
48
2.4. A vezerliiszerkezetek fpr (int i " 0; l < 10; i++) {. .. } '(int l " 5 ; i > 0; i--) {... } f~ i < 10; i++){ .. } for (int l "
°;
2.4.3.3. A foreach dldus v~gy mas :~emeket iissze~yiijt6 bjektum minden elemere kell valaffilt vegrehaJtam. Ezt segill a foreach. Ml most ~sak az egyszerii tOmb esetet mutatjuk be.
Gyakran elOfordul6 fe!adat, hogy egy , tOmb,.
PI. .egy szamokb61 an6 tOmb elemei kiiziil meg akarjuk hatarozni a 10-nel nagyobbakszamat. i.ntl] nums " new int I] {0,lS/23,S,-71,10,1l}; int big == 0; foreach (int i
in nums)
{
if (i>10) big++; }
A foreach haszmllata soran a tOmb minden elemen vegigmegyiiuk, fgy csak akkor hatekony, ha ez sZiikseges. Akkor viszont egy egyszerii, attekiothet6 es gyors megoldasi lehetoseget kina!. A ciklusv,iltozo csak olvashato. (Tehat ha big++ helyett i++-t fruuk, az hibat okoz.)
A fenti k6dreszlet a felteteles megszamlalas programozasi tetele. (Lasd a programozasi tetelek fejezetben!) 2.4.4. Tovabbi vezerlO szerkezetek Rendelkezesiinkre allnak meg, talan a hagyomanyorzes miatt a goto, continue es a break vezerloszerkezetek.
• • •
goto: cfrokere ugrik. continue: a ciklus vagy e1agazas vegrehajtasat ujrakezdi (switch, while, do, for, foreach). break: a ciklus vagy elagazas vegrehajtasat megszakftja es a kiivetkez6 utasltasra ugrik. A switch case elagazas case again a break utasftas akadaIyozza meg az ' atcsordulast', vagyis azt, hogy az egyik case ag utan a kiivetkez6 is vegrehajt6djon.
49
2. Az alkalmazas vezerlese
----------------------------------------------------------------E vezerliiszerkezetek hasznalata nagyon iittekinthetetlenne teszi a programot, igy nem javasolt. A programok bonyolultsaganak kezelesere kialakult strukturalt programozas kifejezetten tiltja hasznaIatukat. A nyeIvek a korabbi verzi6kkal tortenii kompatibilitas megiirzese erdekeben tartottak meg ezeket az elemeket.
2.5. A kivHelkezeh:>s A kivt'telkezeles (exception handling) programozasi fiIozofiaja azl jelenti, bogy koncentriljunk a program varhato helyes vegrehajtasara, es a ritbin eliifordUIo eseteket a kiveteleket kiil6n teehnikaval kezeljiik Ie. PI. egy fajl megnyitasa varhatoan zokkeniimentes feladat, azonban ha a megadott utvonal hibas (mert athelyeztek egy masik konyvtarba es megsziintettek a regit), vagy nines ilyen nevi! fajl (Ietoroltek), esetleg mar megnyitotta valaki mas, vagy nines jogunk hozziferni_ ezek kiveteles helyzetek, melyeknek eliifordulasara megis gondolnia kell a programozonak. Tebat kezelni kell a helyzetet, de iigy, hogy a kod logikajat ne zavarja ezeknek az eseteknek a vizsgalata.
2.5.1. A kivetel dobiisa Ha a program vegrehajtasa nem vart akadalyba iitkozik, a throw kivetelobjektum segftsegevel dobhatunk kivetelt. if ((month <0) ilyen hanap") j
I I (month>12))
throw new SytemException( "Nines
Ha nem kapjuk el a hiMt, az alapertelmezett kivetelkezelii gyakran valamilyen hibaiizenet uUin leallftja a programot. C#-ban a throw utan egy objektumot szokas tovabbadni, mely a hiMrol tbbb informaeiot tartalmazhat. P!. throw new FileNotFoundException(fajlnev};
Ha a kivetelt dobo sort egy try blokkba helyezziik. A kiveteldoMs utani sorok a kivetel bekovetkeztevel nem hajtodnak vegre, a vezerles a kivetelt elkapo k6dra keriiI.
2.5.2. A kivetel elkapasa A kivetel elkapasa catch blokkal tbrtenik. Parameter nelkiili catch blokk minden kivetelt elkap, de mivel nem veszi at a throw altaI dobolt valtozot, fgy nines konkret informaeionk a kivetel okaro!. try {
if {(month
I I
(month>12))
throw new SytemException ("Nines ilyen hanap"); Tovabbi k6dsorok; }
50
2.5. A kivetelkezeles catch (
label. Text
==
IIHibas datum"
i
)
A catch parameterezheto. !Ia a catch blokknak. van par~met<;re, 1lkk:0r csak a par~m~ter ~pu~.a~ak .m~g~elel~ kivetelt tudja elkapm. Egyrnas utan tobb catch blokk IS rrhato kiilonbozo tlpusu arameterekkel. Ha az eiso catch nem kapta el, a kovetkezo Iekezelheti a hihat. ~rte1emszeriien, ha haszmiljuk a parameter nelkiili catch blokkot, az csak a lista egere kerii1het, hisz minden kivetelt elkap. Ha egy kivetelt lekezeltiink, a k6d az :tols6 catch blokkja utani soron folytat6dik. !Ia egy kivetelt elkaptunk, de csak bizonyos esetekben tudjnk kezelni, lehetoseg van a catch blokkb6l egy parameter nelkiili throw segftsegevel az elkapottal azonos ertekU kivetelt dobni, ami lehetove teszi a tovabbi kezelest. A kivetelkezeles egymasba agyazhat6, es a try blokkb6l hfvott fiiggvenyek is dobhatnak kivetelt. A slig6 a fiiggvenyek ismertetese soran a fiiggveny altal
System. IO. File. Open (lie: \ \rnyFile. txt
II ,
Systern.IO.FileMode.Open); )
catch(System.IO.FileNotFoundException fnf) (
label. Text == "Nines "+fnf. FileName+
I,
faj I! " i
)
A try blokkhoz tartozhat egy finally klauza is, ami mindig vegre lesz hajtva, akar kiveteldohas nelkiil hajt6dott vegre a blokk, akar kivetellel. Ide szokas fmi olyan tevekenysegek k6djat, mint a lefoglalt eroforrasok felszabadftasa vagy a fajlbezarasok. Systern.IO.FileStrearn file = null; try (
file = new System.IO.FileStream( "C:\\rnyFile.txt", Systern.IO.FileMode.Open); }
catch(System.IO.FileNotFoundException fnf) {
label.Text:::: "Nines n+fnf.FileName+" fajll"i }
51
2. Az alkalmazas vezerlese finally {
MessageBox. Show ( "Finally") ; if (file !~ null) file.Close (); }
o
I
A 6.1.1 gyakorlati alkalmazasa met6dushivassal' fejezetben lathat6. \
a
'Folyamat
inditasa
statikus
Kivetelkezeles alkalmazasakor a kivetelek elkapasa is meghatarozhatja a k6d vegrehajtasi sorrendjet. A program szerkezetet befolyasolhatja a return utasitiis fiiggveny vege elotti, gyakran a fiiggvenyen beltili tObbszori, esetenkent mas-mas visszateresi ertekkel tOrteno kiadasa. Esemenyvezerelt programozasniil a program a Quit esemeny bekovetkezesenek hatasara fejezodik be es hajt6dik vegre a Main fiiggveny k6djanak Application.Run utani szakasza. Az alkalmazas beziirasa Ietrehozhat6 peldaul valamely tagfiiggveny belsejeben kiadott Application.ExitO; fiiggvenyhivassal is.
2.6. Teszt 1.
Mit latunk a kepernyon a kovetkezo k6dreszlet vegrehajtasa utan? int i ~ 10; if (ida) label.Text ~ "JO" i if (hO) label.Text +:::: 11 VALASZ"; else label.Text +~ " .1 " ,•
2. Mit latunk a kepernyon a kovetkezo k6dreszlet vegrehajtasa utan? Irja Ie maskepp a k6dot! int i ~ 10; while (i>O) {
i--; label.Text
+~i;
}
3. Mennyi lesz i erteke a kovetkezo k6dreszlet vegrehajtasa utan? i:::O;
52
-
2.6. Teszt int [1 arr = new int [1 {O, 1, 2,3,4,5,6,7,8,9,10} ; for each (int j in arr) {
3. Avezerlok, tulajdonsagok, esemenyek, ablakok 3.1. AProperties ablak es kezelese A form es a vezerl6k kezd6 tulajdonsagait a Properties (tulajdonsag) ablakanak bel111itasaval hatarozhatjuk meg. Az ablak altalaban a Visual Studio fejleszt6eszkoz jobb als6 sarkaban talalhat6, vagy az ott e1erhet6 megfelel6 fiil kivalasztasaval nyithat6 ki. Ha nines nyitva az ablak, a View menii Properties Window meniipontjat valasztva, vagy a Standard eszkozsor Properties eszkozgomjan
kattintva erhetjiik el.
Az ablak tetejen a legordiil6 listaban kivalaszthat6 a jelenleg tervezes alatt aH6 ablaknak es vezerl6inek azonosft6ja, de a kivalasztast tobbnyire a tervez6ablak (Design) megfelel6 elemere kattintva vegezziik el.
A tulajdonsagablak egy eszkozsort is tartalmaz a kovetkez6 eszkozgombokkal: ~ Categorized: Logikai kateg6riakba esoportosft.
~ Alphabetic: ABC sorrendben mutat.
Ez a k6t valasztas ertelemszeriien egymast kizarja.
55
3. A
ablakok
~
Properties: A tulajdonsagokat mutatja.
~
Events: A kezelhet6. kezelt esemenyeket mutatja a ke.zel6nlet6dllsukk egyiitt.
E ket kateg6ria is egymast kizarja. es e valasztast6l fiiggetleniil az el6z6 Kat"g6ri m6dosithat6.
Ivlicrosoft Sans Serif; ForeColor FormBorderStyie RightToLeft Text
•
ControiText
Sizable
No LoForm
3.1. abra A tulajdonsagablak tulajdonsagai. kateg6ria szerinti csoportosftasban A m6dositott tulajdonsag erteke vastagon szedve jelenik meg (LoForm az ibnln). Egyes tulajdonsagok legordiil6 listab61 valaszthat6k (Cursor), masok egy piirbeszedablak segitsegevel allfthat6k be (Font, szinek). Az egyes tulajdonsagcsoportok becsukhat6k (Font) vagy kinyithat6k (Behavior) az el6ttiik megjelen6 kis + - ikon segitsegeveI. A kivalasztott tulajdonsag rovid lefnisa elolvashat6, ha az ablak gyorsmeniijeben (jobbeger) a Description meniipontot kivalasztjuk.
3.2. A vezer)6k A teljesseg igenye nelkiil vizsgaljunk meg neMny rendelkezesiinkre an6 vezerl6osztalyt!
3.2.1. A Label es a LinkLabel Az eddigiekben mar taliilkoztunk a Label vezerl6vel, mel yet feliratok keszitesekor hasznalunk. Location es Size tulajdonsiiga beallit6dik amikor elhelyezziik a formon. Jellemz6en a Text tulajdonsagiit allitjuk be. Id6nkenl specialis fontot is megadhatunk. A Label vezerI6ket ritkiln m6dositjuk a k6db61, es esemenyt sem szoktunk hozzajuk csatolni, igy nines jelent6sege, hogy beszedes valtoz6neviik legyen. Emiatt ez az a kiveteles eset, amikor ritkiln m6dosftjuk a k6dgenerator altai 56
3.2. A vezerl6k ,tulajdonsiigot. KiilOnleges formiija a LinkLabel, mely a hiperhivatkoziisok megval6sftisiit tiimogatja. Wajdclns:iga lehet6ve teszi, hogy tiiroljnk, volt-e mar liitogatva a link. a link aJlapot:H61 fiigg6en, pI. hogy viilasztottuk-e vagy sem. (tabelhaszniilatara a 7. gyakorlaton liitunk konkret peldiit.
3.2. abra Vezerl6k a szerkeszt6ben es futasid6ben
3.2.2.. A Button, a RadioButton, a Group8ox es a CheckBox Tal:ilkoztunk mar a Button vezerl6vel is, mely parancsok kiadasra haszmilatos. Text tulajdonsaga vaIasztiisakor vegrehajtott parancsra utal. Tobbnyire a Click esemenyet kezeJjilk. A valasztOgombok (RadioButton) segftsegevel a feJsoroltakb61 pontosan egy elemet viilaszthatunk ki egyszerre, mig a jelol6 negyzetek (CheckBox) kUlOn-killon vaIaszthat6 tulajdonsagokat jelentenek. Ez' a kUlOnbseg a megjelenesUkben is
57
I "
3. A vezerlok,
esemenyek, ablakok
jelentkezik, igy else pillantasra tudjuk, hogy pontosan egy vagy akarhany valaszthatunk egymast6l ftiggetleniil. Ha csak egy csoportba vaIaszt6gombjaink vannak, akkor nem sziikseges eket kiilOn csoportba (radio Button 1, RadiButton8), de t6bb csoport eseten egy GroupBox hatarozhatjuk meg, mik az egy csoporthoz tartoz6 elemek (2, 3, 4). A ~""UIJ'Dfl~ feliileten lehet egy egyszeru keret, de lehet a csoportnak felirata is. tulajdonsaguk alapertelmezesben False, vagyis nincsenek kivalasztva. valaszt6gombok csoportjaban - ha maskepp nem allftjuk a Checked erteket kezdetben egy sincs kivalasztva (2,3,4), de az else valasztas utan a felhasznal6 nem tudja visszaaIlitani ezt az allapotot (groupBox2), mindig pontosan egy lesz ervenyes. A k6dban termeszetesen hamisra aIlfthatjuk a csoport elemenek Checked tulajdonsagat akar futasideben is.
IMegjegyzes: I Ha egy, mar a feliileten leve valaszt6gombot a csoportba akkor az a csoport tagjava valik, azonban ha a csoportot hiizzuk gomb tole, akkor nem, hiaba tessziik a mogekiildes segftsegevel valaszt6gombot a csoport f610tt lathat6va. A gombok hatterszfne (BackColor), set hatterkepe (Backgroundlmage) is A betuszfnt a ForeColor tulajdonsaggal, a betu tulajdonsagait pedig a Font alatt aIlfthatjuk. A RadioButton es a CheckBox eseten a Checked tulajdonsag meg, ki van-e vaIasztva az adott vezerle, es a leggyakrabban a CheckedChan~ed esemenyiiket kezeljiik. Ha a valaszt6gombok eseten kozos met6dussal szeretnenk vaIasztas m6dosulasat kezelni, ezt a legegyszerubben ugy tehetjiik meg, hogy else gomb eseten a gomb nevetel ftiggetlen, esetleg a csoport nevere kezelemet6dust adunk meg, a tobbi gombnal pedig a legordiilo listab6l ezt a leteze met6dust valasztjuk ki. UUU.llQLU,
D
I~~\
A RadioButton csoportok hasznalatara az 5.4. tesztfeladatban latunk peIdat.
3.2.3. A TextBox, a ListBox, a CheckedListBox es a ComboBox A TextBox vezerle valtoz6 adatok kifnisara, beolvasasara szolgal. Text tulajdonsaga szoveges adatot jelenft meg, igy a kifrni kivant nem sztring tfpusu adatot tObbnyire a ToStringO met6dussal elebb sz6vegge kell alakitanunk. Beolvasaskor legegyszerubben a Convert osztaly kiilonboze (Tolnt32, ToBoolean, ToDateTime ... ) atalakit6 ftiggvenyei segftsegevel konvertalhatjuk a Text tulajdonsag szoveget a kfvant tfpusra. Leggyakrabban kezelt esemenye a TextChanged. Egy lista megjelenftesere szolgal a ListBox vezerle, specialis esete a CheckedListBox, mely kepes megjegyezni a kivalasztott elemeket, es egy pipaval
58
3.2. A vezerlok belyigenye miatt kozkedvelt a ComboBox, mely legordtil6 listakent elemeket, es rendelkezik egy TextBox resszel, ami a bevitelt teszi Ih"~'{"\m eseten az Items tulajdonsag segitsegevel adbatjuk meg a lista idolt>en az Items.Add segitsegevel vebetiink fel uj elemet, mig az ~se~gitse~~evel tOrolbetiink elemet a listaMl. DropDown Style -ja baromfele lebet: Simple eseten mutatja a fugg6leges merete beallitbat6. Simple eseten nines m6d uj elem stilus eseten legordtil, es ba elkezdtiik a gepelest, az els6 "~"'.I___ raall legorditeskor a megadott elemre. Ha megval6sitjuk az m6d UJ elem bevitelere is a listaba. Ha ........'."L tipusu, akkor a begepelt els6 karakterrel kezd6d6 ,utcimaitIkus2lll kivalasztja, s a karakter ujb6li leiitesere lep a kovetkez6 kezd6d6 elerrire. Termeszetesen, ba legorditjiik, itt is az aktualis la"'LLV'H a listan. Uj elem bevitelet ez a stilus sem tamogatja. adhatjuk meg, maximalisan
!rO!!rE~SSJjal
es a TrackBar
ertekek folyamatos beallItasara, kijelzesere basznalatos a csuszka illetve a folyamatkijelzo (ProgressBar). Mindkett6nel beallitbat6 a minimum ertek es az aktualis ertek (Value). Csuszka eseten megadbat6, milyen egyseget jelOljenek (TickFrequency), es bogy a billentyiizet egyseggel valtoztassak az aktualis erteket (SmallChange), "'J".lLV.ll"~ beallitbatjuk, mikor jelenjen meg az uj jel (Step).
Fa")i.eh segitsegevel elerbetjiik, bogy a nihUzott vezerl6k egyiitt mozgatbat6k, mel~~l@nithetok legyenek. Beallitbatunk kozos hcitterszint, batterkepet, mindent, ami vezerl6elemek elkiilOnitesere szolgal. Segitsegevel megval6sitbatjuk, bogy m7rm"/~" adatok eseten ilyen, mas adatok eseten masmilyen vezerl6k jelenjenek meg l'''''';';'o,~ adott reszen. Tob~<egymasra
lapolt ablak kezeleset teszi lebet6ve a TabControl. A TabPages tulajd()nsagaban felsorolhatjuk a kiilOnboz6 fiileket, megadva neviiket. A le-fel nyilak segitsegevel beallithatjuk sorrendjiiket. A tervezo ablakon (Design) a kivant fiilre kattintva egymas fOie lapolt (azonos meretii) paneleket kapunk, melyekre tetszoleges vezerl6k hUzhat6k. A lapok koztil a ftilekre kattintva valasztbatunk.
59
3. A vezerlOk, tulajdOlrlSa.!!OJI{. esemenyek, ablakok
3.2.6. A tovabbi elemek Termeszetesen tovabbi vezerloelemek is rendelkezestinkre allnak, asszetettebb feladatok megval6sftasa eseten lehet sztiksegtink. Nagymeretii gardftosavokkal kezelhettink, letrehozhatunk eszkazsort, tajekoztathatunk az alkalmazas allapotar61. .. Ezek megismereset a halasztjuk. A ToolBox rendelkezik olyan elemekkel is, melyek nem vezerlok, hanem -~-'V"VI funkci6kat tamogatnak az ablakhoz kapcsol6d6an (Menu, ToolTip, Timer Ezeket A komponensek fejezetben targyalja a kanyv.
3.3. Az ablakok megjelenltese 3.3.1. A modalis ablak Ablakokat modalisan vagy nem modalis an lehet megjeleniteni. Ha egy modalis, akkor az alkalmazas tabbi ablaka nem kertilhet f6kuszba addig, amfg ablakunkat be nem zartuk. Modalis ablakok tipikusan a hibatizenet ktildo a de modalisan szokas az adatokat bekero ablakot is megval6sftani. Modalis ablakot a Form osztaly ShowDialog met6dusaval tehettink ki a kepernyore. Modalis ablakn3.l gyakran csak egy OK gomb jelzi, hogy nines lehetosegtink. Azonban ha fel akarjuk kfmHni a felhasznal6 szamara a valasztast, akkor az ablak bezarasa utan tudnunk kell, mi volt a valasztas. Erre szolgm a DialogResult tulajdonsag. Erteke futasidoben a DialogResult felsorolastlpus ertekei kaztil valasztva allithat6. Lehet: OK, Cancel, Yes, No, Retry, Ignore ... Az ablak bezarasa utan az objektum DialogResult tulajdonsagat lekerdezve tudjuk meg, mit valasztott a felhasznal6. A parbeszedablakokat ShowDialog met6dus segftsegevel szokas megjelenfteni.
3.3.2. A nem modalis ablak Ha formunkat a Show met6dussal tessztik ki a kepernyore, megjelenese nem lesz modalis. Vagyis tole ftiggetlentil dolgozhatunk az alkalmazas tObbi ablakaban is, ha meg van nyitva mas ablak is. Amelyik ablak f6kuszban van, oda tOrtenik az adatbevitel a billentyiizetrol. A Wbbi ablak nem zar6dik be, csak elveszfti a f6kuszt.
3.3.3. A Form tulajdonsagai Ha nem az egyes vezerloket valasztjuk ki, hanem az egesz form ki van jelOlve, akkor az ablakra vonatkoz6 tulajdonsagok allfthat6k. Ezt hasznaltuk az elso feladatban, amikor a hatterkepet allftottuk be, vagy amikor a Text mezot kitOltve megadtuk a form cimsoranak szoveget. Itt nehany gyakran hasznalt tulajdonsagr61lesz sz6.
60
3.3. Az ablakok a Width, Height (Size) tulajdonsagokkal adhatjuk meg. A ;\m.oClC)Sll:aS,iIlL'Z elobb a StartPosition tulajdonsagot kell m6dositanunk, ~'ElolcatlOn tulajdonsag X es Y ertekenek megadasaval a bal folso sarok adtuk meg, azonban a StartPosition alapertelmezett iUILL-V" ...tion beallftasa reszben feliilbfralja e bealHtast. Ervenyesitesehez allitanunk a StartPositiont. Ha a kepernyo kozepen szeretnenk latni ~bi,~f#c.~lt;
~W"
hogy abhiRU~•.• riii1Iirrl~l~zalva (teMt csak a ta1can) jelenik meg vagy maximalis meretben, ;;"t'>l;,'" kepernyot elfoglalva. A MinimizeBox, MaximizeBox tulajdonsag ~~~aaJI~~j+li()!~y valaszthat6-e a minimalizal6, maximalizal6 ikon a cimsorban. A tulajdonsag hamisra allitasaval eltiintethetjiik a ta1car61 az abl~~~l;. A FormBorderStyle tulajdonsag beallitasaval engedelyezhetjiik a melretez;n~1tQs:eglet. Ha igazra alHtjuk a TopMost tulajdonsagot, akkor ez az ablak a:l~~g!e:l~o a kepernyon akkor is, ha egy mogotte levo van f6kuszban. parbes:te~lll.bilal<:oKnal
szokasos az OK gombot Enter hatasara is, mig a Cancel / Esc hatasara is meghivni. Ezt ugy erhetjiik el, hogy a form Acci\~tInitt(J.n tulajdonsaganal az OK, mig CancelButton tulajdonsaganal a Cancel gombot valasztjuk ki. Ertelemszeriien barmely mas gomb is kivalaszthat6 a gombok listajabql. Az abla:k attetszoseget az Opacity tulajdonsagban a lathat6sag %-aban adhatjuk meg. [eljesen lathat6 ablak 100%. A lathatatlan 0%. Megadhatjuk azt is, hogy ablakunk melyik szfnu eleme lesz lathatatlan a TransparencyKey tulajdonsag szfneneIc vaIasztasakor. Ha ablakunk egy reszet idonkent lathatatlarma kfvanjuk tenni,2sak tegyiink az adott szinu panelt a megfelelo resz fole! Az atIatsz6 resz alatt erte1emszeriien latszanak a mogotte elhelyezkedo ablakok, es az egerrel kivalasztva aktualizalhat6k is.
Az ablak Region tulajdonsaga adja meg az ablak alakjat. Pontosabban tartalmazza azon pontok osszesseget, amit az operaci6s rendszer kirajzol. A regi6 tetszoleges szamu teglalap, ellipszis es sokszog egyesitesevel hozhat6 letre. fgy teMt tetszoleges alakti ablakokkal dolgozhatunk. Ha a Region tulajdonsag nincs megadva (undefined value), akkor a hagyomanyos ablakjelenik meg.
jgl,
A Region hasznalatara a gyakorlaton latunk peldat.
3.3.4. A .NET osztalykonyvtar parbeszedablakai A Windows operaci6s rendszeren fut6 alkalmazasok egyszeriibb hasznalatanak az is a magyarazata, hogy az alkalmazasok altaI gyakran hasznalt funkci6khoz alapertelmezett parbeszedablakokat biztosit. Peldaul barmelyik alkalmazasunkb61
61
3. A vezerl6k, tulajdonsagok,
eSf~ml~m'e
ablakok
kivanunk kinyomtatni valamit, ugyanazt az ablakot latjuk megjelenni a Es bar az angol nyelvii Visual Studioban fejlesztjtik alkalmazasainkat, ha Vur""'n' rendszertink magyar nyelvii, akkor magyar nyelvii hibatizenet ablakok jelennek futas kozben. Az operaci6s rendszer altaI szolgaltatott ablakokhoz a .NET
ablakosztalyokat biztosit. A System. Windows. Forms nevter tartalmazza a szokasos parbeszedablakok Ilyen parbeszedablakok a fajl megnyitasakor, mentesekor hasznalt es SaveFileDialog, a betiitipus kivalasztasara hasznalt FontDialog vagy nyomtataskor hasznalt PrintDialog. 3.3.4.1. ColorDialog
A szinek kenyelmes kivalasztasara szolgaI6 ablak. Megnyitasa elott a '~U'JU\JU~(I!!a beallithat6k. A Color tulajdonsaga megadja a megjelenesekor beallitott Alapertelmezese: Black. Az ablakot a ShowDialog met6dussal tehetjtik kepernyore, melynek visszateresi erteke a DialogResult, ami megadja, mely gornboi vaIasztottuk a bezanishoz. Maganak a ColorDialog osztalynak a Formt61 PIT<'~""_ nines DialogResult tulajdonsaga. Az ablak bezarasa utan a Color tulajdonsaga kerdezheto Ie az abIakban kivaIasztott szin. /Ilapszinek:
3.3. abra A CoIorDiaIog ablak ColorDialog dlg= new ColorDialog(); if (dlg.ShowDialog()==DialogResult.OK) BackColor = dlg.Color;
1/ 0j ablak. II Kiteszi modcilisan. II Kiolvassa a szint.
3.4. Teszt 1. Hogyan aIlithat6 be, hogy ha parbeszedablakot egy gomb vaIasztasara zartunk be az eredmeny OK Iegyen?
62
3.4. Teszt (Text) legyen OK! ... ",,'" legyen OKButton! val6 kattintas esemenyben aIlftsuk a DialogResult tulajdonsag
ablak bezarasa nelkiil is dolgozhatunk az alkalmazas mas ablakaiban. vezer16 segftsegevel megadhatjuk az ablak tabulatorsorrendjet. vezer16k
egymast61
fuggetlen
valasztast
kinalnak
a
alHthatunk be ertekeket es a TraekBar esak IUU'.LJOU'.....
Simple bealHtasa a szokasos, a nyu valasztasara lenyu6 listat
Number tulajdonsagat igazra allitjuk, akkor esak szamjegyeket bevitelkor.
v.l\.LJJUA
Group
tulajdonsaganak
bealHtasaval
hozhatunk
letre
;,'W.j'\Iorm akkor
je1enik meg parbeszedablakkent, ha DialogResult tulajdonsagat ,Y'''''~T''' allitottuk.
1O.'lJ,!t"aiablak MinimizeBox tulajdonsaga hamis, akkor nines minimalizal6 ikon a Glmsorban.
LA'L rorm osztaly DialogResult tulajdonsagab61 tudhatjuk meg,
1
hogy melyik
g()rnbot valasztottuk a Form bezarasakor. 12,A(::olorDialog osztaly DialogResult tulajdonsagab61 tudhatjuk meg, hogy melyik gombot valasztottuk az ablak bezarasakor. Iavft6ku1cs: DialogResult; H; H; H; H; H; H; H; H; H, I, H.
63
programoz3si tetelek a fe1adatot ugy akarjuk megoldani, hogy egy altahinos modszert kell tilUl11\., amellyel minden konkret esetben meg tudjuk vaIaszolni az adott Irpr{1t>cr algoritmikus problernar61 beszelhetiink. ,,1 Grady Booch kifejti: A szoftverfejlesztes hagyomanyosan kialakult m()gs~yre az algoritmikus nez6pont. Eszerint a szoftver f6 epit6eleme a fiiggveny. A ~~;iI~~~i:ai. vezerlesre es az osszetett algoritmusok kisebb egysegekre bontasara :~ Azonban ahogy az igenyek valtoznak (marpedig valtozni fognak), es a novekszik (marpedig novekedni fog), az algoritmikus nez6pontbol felepit~!tt rendszerek fenntartasa nagyon nehezze valik. Aje!enkori szoftverfejlesztes objektumorientalt szemlelem. F6 epit6eleme az objektum vagy osztaIy. Az objektumok allapotai es viselkedese all a szoftverfejlesztes kozeppontjaban. A modszer erteke bizonyitott nagymerem komplex programok eseten. 2 Objektumorientalt szemleletben irtuk az e16z6 fejezetekben is programjainkat, de az egyes tagfiiggvenyek megvalositasa (implementalasa) soran nagy hasznat vessziik az algoritmikus gondolkodasnak. A strukturalt filozofia szerint algoritmusaink ertekado utasltas, szekvencia, elagazas es ciklus felhasznalasaval epithet6k fei. A feladatok
1 Demetrovics,
2 Booch,
Denev, Pavlov: A szaroitistudomany matematikai alapjai, 244. old.
Rumbaugh, Jacobson: The Unified Modeling Language User Guide. 10-11. old.
65
4. Elemi programoz3si tetelek
megoldasa soran kikristalyosodott altalanos algoritmusokat, melyek matematikai uton is bizonyitottak, programozasi teteleknek nevezziik. A konyv nem ismerteti az osszes programozasi tetelt, csupan az gondolkodas fejlesztese erdekeben bemutatja, milyen algoritmusok hasznalatosak: programoz6k koreben a gyakran elofordul6 problemak megoldasara. A programozasi tetelek jelentos reszet az osztalykonyvtar szolgaltatjak, igy azokat leggyakrabban mint egyszerii hasznaljuk. Sokszor azonban magunknak kell megoldanunk a problemat, nagy segitseget nyujt a programozasi tetelek ismerete. Mielott a konkret tetelekre raternenk, ismerjiink meg egy egyszerii, de hasznalt algoritmust, mely nem tesz mast, mint ket valtoz6 erteket felcsereli. A csere
A csere nem egy programozasi tetel, hanem gyakran hasznalt technika. Adott ket azonos tfpusu valtoz6 'a' es 'b', szeretnenk felcserelni az ertektiket! A feladat megoldasahoz sziiksegiink lesz egy segedvaltoz6ra! Ha ugyanis pI. aZI mondanank a=b; elveszftenenk 'a' erteket! A segedvaltoz6 legyen 'temp', es tipusa egyezzen meg a k€t valtoz6 tipusaval! A csere algoritmusa harom ertekad6 utasitas szekvenciaja: temp=a; a=b; b=temp;
A kovetkezo tetelek egy adott - ertekekkeI rendelkezo - sorozatra vonatkoznak, es egy ertek eredmenyt adnak. A sorozat elemeit egy t tOmbben taroljuk. A tomb elemszama: n, az indexet, amivel vegigmegyiink a tomb elemein, i-vel jelOljiik.
4.1. A megszamhllas es az osszegzes 4.1.1. A megszamlalas Hany 'db' adott feItetelt teljesito eleme van az adott 'v' 'n' elemu sorozatnak? A feIteteI Iegyen: >5! db=O; for (int i=O; iS) db++;
FeItetel neIkiili megszamlaIast val6sit meg a ListBox es a ComboBox Items.Count tulajdonsaga es a String osztaly Length tulajdonsaga.
66
4.2. A kereses
'v' 'n' elemii sorozat elemeinek osszege 'sum'? i++)
kereses es az eldontes elemii sorozatnak adott feltetelt (>5) teljesito eleme? Az eldontes eredmenyt hoz. Az eredmenyt celszerii a k6d olvashat6saga erdekeben az igaz alHtast takarja (van).
&& i
= v[il>S;
Vagymaskent megval6sitva: i=O; while (! (v[il>S) && i
i++; }
van=i
A ciklusb61 vagy akkor lep ki a program, ha megtalalta az elso, a feltetelt teljesito elemet, vagy ha elert a sorozat vegere. A kilepeskor van erteke igaz, ha megtalalta a megfelelo e1emet, es hamis, ha nem.
67
4. Elemi programozasi tetelek
Linearis keresest, eldontest val6sit meg a ListBox, es a ComboBvA".I.~~;ull';.t met6dusa, mely igaz ertekkel ter vissza, ha a parametereben megadott elem a lista elemei kozt, egyebkent hamissal.
4.2.2. A linearis kereses es a kivalasztas Ha alaposabban vegiggondoljuk, az elozo tetel val6jaban ket tovabbi informkiot szolgaltat. Az i a kilepes utan epp a feltetelt teljes!to index utan kovetkezo szam. egy i-I; utasitassal megkaphatjuk az elso a feltetelt teljes!to elem indexet. Az ismereteben pedig tudjuk az elem erteket is v[i]. A feladatot tovabb bOvithetjiik, ha megadjuk az indexet 'm', ami utan a elemekre vegezziik el a vizsgalatot. van=false; i=m; while (!van && i
van = v[i]>5; i++ i
Mes sageBox. Show ( "Nines Vagy maskent megval6sitva: i=::rn; while (! (v[i]>5) && i
}
i f (i
MessageBox.Show("Az S"':'nel nagyobb }
else MessageBox.Show("Nines A feladatokban mindig az adott feltetelt teljesito elso elOfordulast keresttik. Termeszetesen az utols6 elOfordulas konnyen megtalalhat6, ha hMulr61 elore keresiink.
68
4.2. A kereses kiv~Hasztast
valosft meg a RichTextBox osztaly Find metodusa, LVJ.UV'JL vagy sztringet keres a vezer16 szovegeben. A visszateresi els6 karakterenek indexe. A RichTextBoxFinds parameteret afO,zhaLtjUK, hogy a kis- es nagybetiik megkiilOnboztetesevel, vagy es kiemelje-e a szovegb61 (a szoveg tObbi reszet61 elter6 11v~LaJ"'" szot, az utolso elOfordulast keresse-e. meg a ListBox es ComboBox Items tulajdonsaganak IndexOf (in(~.e;aa~·la a keresett elem indexet a listaban. Ha az elem nem szerepel ter vissza.
vagy logaritmikus kereses termeszetesen egy adott ertekii elemet is megtalalhatunk. Ha )rm~atl.mk rendezett, akkor hatekonyabba tehet6 az eljaras. El6szor is az els6 a keresett elemnel nagyobb elemig menni, hisz rendezett OSS,z,cs kovetkez6 mar mind nagyobb lesz. lJUiJ''''<''
azonbam a telefonkonyvre (es feledkezziink meg arrol, hogy a nev mi mar tudjuk, hogy a konyv elejen vagy vegen keressiik)! Keresiink new szemelyt. Fe1csapjuk a telefonkonyvet kozepen, majd hogy az ott talalhato nevekhez kepest e16bbre vagy Mtrebb van a Ba e16bbre, akkor az els6 reszt felezziik meg, ha Mtrebb, a masodik Az itt taIalhato nevnel megint e16bbre vagy Mtrebb van a keresett az c Az algoritmust addig folytatjuk, mig meg nem talaltuk a nevet vagy amik kozott kellene lennie. Ez a modszer sokkal hatekonyabb, lKe:ZOj::me~nK elolr61 olvasni a telefonkonyvet, amig meg nem taIaljuk a Persze, ha Arthur new fickot keresiink lehet, hogy gyorsabbam az e16z6 eljarassal, de Zaphodot mar nem. TeMt nem minden esetben, ,,"',....:,,"''' eseten bizonyosan gyorsabb.
!)!IliiJ;iS, KeI·eSt!S e16feltetele, hogy az adott sorozatunk rendezett legyen. Keressiik elemet! cilso=O; h,ifelso=ni l}ozepso=(also+felso)/2i wpiie(v[kozepso] !=a && also
if (a
69
4. Elemi programoz3si tetelek if(v[kozepso]==a) MessageBox.Show("Az "+a+" erteku elem a "+kozepso+". helYen van.") ; else MessageBox.Show("Nines "+a+" erteku elem a sorozatban.");
4.2.4. A minimum kereses Keresstik az adott - nem rendezett - sorozat legkisebb elemet! A keres est ugy va16sftjuk meg, hogy egy segedvaltoz6ban (min) taroljuk az aktulilis legkisebb elemet, es ezzel hasonlitjuk ossze az osszes tabbit, vegigmegytink a sorozat elemein. if (n>O) min=v[O]; else MessageBox.Show("A sorozat iires, igy nines legkisebb eleme.") ; for (int i=l; i
Hason16 m6don a legnagyobb elem is megtalalhat6.
4.3. A rendezes Nagyon sok rendezesi algoritmus ismert, ml most az eddig tanultak alapjan a legegyszeriibbel ismerkedtink csak meg.
4.3.1. Rendezes minimum kivalaszhissal A rendezes elve: megkeressiik a legkisebb elemet, kiemeljtik, es a meg nem rendezett resz elso elemevel kicsereljiik. A rendezetlen reszben ismeteljtik a feladatot. A megoldasban tehat ket egymasba agyazott ciklus van. A ktilso ciklus blokkjanak minden vegrehajtasa utan eggyel no a sorozat elejen a rendezett elemek szama es rovidiil a rendezetlen sorozatresz. A belso ciklus egy minimurnkereses es egy csere. A csere miatt nem a minimum erteket, hanem a minimalis elem indexet taroljuk. A belso ciklust csak akkor hajtjuk vegre, ha van meg legalabb ket rendezetlen elem. Ha egy 'rendezetlen' elemtink van, az mar a legnagyobb, tehat befejezhetjiik a rendezest.
A.JtiistlJox 6s a ComboBox.Sorted tulajdonsagat ha lekerdezziik, megtudjuk, hogy aY(~z~:lOren.de,~e~~.-e,.
de ha igazra allitjuk, a tulajdonsag set met6dusa abc sorrendbe renae2~ifa ve:zerlo listajanak elemeit. Alapertelmezesben hamis a tulajdonsag erteke.
1.
!~.binaris keresest csak rendezett sorozatra alkalmazhatjuk.
2. A linearis keres est csak nem rendezett sorozatra alkalmazhatjuk. 3. A kovetkeza k6dreszlet ket valtoz6 erteket csereli ki: a=b; b=a; 4. Mit csinal a kovetkeza k6dreszlet, ha feltetelezziik, hogy a v sorozat legalabb ygyelemii? a=O; for (int i=l; iv[a]) a=i;
5. Keresse meg a v sorozatban a masodik 5-tel megegyeza elemet! 6. Mia hiba a kovetkeza k6dreszletben? Az algoritmus az elsa 3 ertekii elemet keresi. i=O; while (v[i] 1=3) i++;
7. Keresse meg a 'v' sorozatban a lO-nel nagyobb legkisebb elemet!
Megoldasok: I, H, H, A maximalis elem indexet keresi,
71
4. Elemi programozasi tetelek db=O; i=O; while (db<2 && i
if (v[i]=5) db++; i++; }
if (db==2) MessageBox.Show("A masodik 5 erteku elem indexe: " +i--+" . , else MessageBox.Show("Nincs ket 5 erteku eleme a sorozatnak."); 11 •
-Ores tOmb eseten is lekerdezi a O. elemet. Ha nines 3 ertekii elem, akkor az utolso tOmbindexen tul fogja cfmezni a tombot. Vagyis nem all meg a tomb vegen. i=O; while (v[i]<=lO && i
if (v[i]>lO && v[i]<min) min=v[i]; i++;
72
5. Az orokles es a .NET osztalykonyvtar. Az objektumorientalt programozas elterjedesenek egyik oka, hogy nagymertekben tamogatja a k6d-ujrafelhasznalast. Az osztalyok egy egysegben rrjak Ie az adatokat es a rajtuk vegzett miiveleteket. Az objektumorientalt nyelvekben gyakran onall6 forrasfajlban (C#, Java) vagy forrasfajlokban (C++) taroljak az egyes osztalyok lerrasat. Egy alkalmazashoz megm osztaly k6dja igy konnyen felhasznalhat6 egy masik alkalmazas fejlesztese soran. Ujrafelhasznalast jelent, ha egy mar korabban megm osztalyb61 objektumot hozunk letre. Ezt tettiik amikor a formunkra vezerl6ket hliztunk. A vezerl6khoz tartozQ objektumok egy - a Microsoft altaI - mar megrrt osztaly peldanyai, melyeket a Name tulajdonsag megadasaval neveztiink el. Ezert nem kell megfrnunk azt, hogyan allfthatjuk be a gomb szoveget vagy a megjeleniteset biztosft6 fiiggvenyeket.
A k6d-ujrafelhasznalas tovabbi lehet6seget jelenti az orokles, mely az objektumorientaIt programozas egyik alapfogalma. Az orokles soran a kesz osztaly k6djat az ut6dosztaly fejlesztese soran hasznaljuk. N agymeretii, graftkus feliilettel rendelkez6, esemenyvezerelt alkalmazasok gyors es hatekony fejlesztesehez elengedhetetlen a k6d-ujrafelhasznalas.
73
5. Az orokles es a .NET osztalykonyvtar
5.1. Az orokh~s
•
5.1.1. Specializaci6 es absztrakci6 •
Specializaci6
Gyakran elOfordul6 helyzet a programozas soran, amikor a feladat megoldasahoz egy mar meglevo osztalyt szeretnenk hasznalni, de annak k6dja nem tartalmaz valamilyen adatot, amit nekunk tarolni kellene. Vagy az adott osztaly objektuman nem lehet elvegezni az altalunk vart muveletet, esetleg ellehet vegezni, de nem ugy, ahogy mi szeretnenk. Tehat szuksegunk lenne egy osztalyra, ami olyan, mint a llUlr meglevo, de vagy tobb adattagja van, vagy tobb tagftiggvenye, vagy egyes ftiggvenyeinek k6dja eltero. Az elteresek akar mindegyike egyszerre is megjelenhet. Azt mondjuk specializaci6ra van szuksegunk, s ennek eszkoze az orokles. Az orokles technikajat hasznaltuk mar eddig lrt k6djaink soran is, hisz a specialis, csak az adott alkalmazasra jellemzo form az System.Windows.Forms.Form osztaly ut6dosztalya volt.
•
Absztrakci6
Az orokles masik indoka az absztrakci6 lehet. Ha vannak hasonl6 feladatokat megval6sft6 osztalyaink, melyek kozt csak specialis feladatokban van eIteres, akkor ezekben a kozos ftiggvenyeket tObbszor k6doljuk Ie. Ilyenkor termeszetesen masolni szoktuk a k6dot, de a kesobbi m6dosftasok soran bizony mindenutt meg kell valtoztatni a k6dreszletet, majd az osszes m6dosftast ujra tesztelni. Ez tipikusan tevedesekhez, hibas k6dhoz vezet. Valamelyik ftiggvenyt biztosan elfelejtjtik m6dosftani, es aztan tesztelni is. Programozas technol6giai alapelv, hogy kertiljuk az ismetlodo k6dreszleteket! Osztalyok eseten ezt ugy val6sfthatjuk meg, hogy az ismetlodo funkci6kat egy kozos ososztalyban val6sftjuk meg, s ebbol szarmaztatjuk az egyedi tulajdonsagokkal rendelkezo specialis osztalyokat.
5.1.2. Az orokles fogalma Az ut6dosztaly objektuma mindent tud, amit az ososztaly objektuma tudot4 hacsak a kesobbiekben nem sz{ikftjuk az objektum lehetosegeit. Vagyis az ososztaly minden adattagja adattagja az ut6dosztalynak is, bar ezek az adattagok gyakran az egysegbezaras elvenek betartasa miatt csak met6dusokon kereszttil erhetok el (pI. tulajdonsagok). Az ososztaly private met6dusain kfvul barmely met6dusa meghfvhat6 az ut6dosztalybOl. Tehat az ut6dosztaly nem tud mindent, amit az ososztaly tudott, hisz annak private tagjait nem erheti el. Az objektumok viszont egyebkent sem erhetik el a private tagokat, tehat az ut6dobjektum min dent tud, amit az os tudott.
74
•
-•
5.1. Az orokles
Az orokles celja: ~
Uj adattagok tarolasa az ut6dosztalyban.
~
Uj tagfiiggvenyek letrehozasa az ut6dosztalyban.
~
Meglev6 tagfiiggvenyek m6dosftasa az ut6dosztalyban.
Ha egy nevterben hozzuk letre az osztalyt, hozzaferesi szintje public vagy internal lehet. Mivel eddig egy assemblyben k6doltuk alkalmazasainkat, a ket hozzaferes kozti kiilonbseget meg nem erzekeljUk, de a komponensekkel foglalkoz6 kovetkez6 fejezetekben latni fogjuk az elterest. Alapertelmezesben, tebat ha nem frjuk ki, akkor internal. Vagyis az osztaly csak az adott assembly (dll; exe) szamara erhet6 el. Ha art akarjuk, hogy mas programegysegek is hozzaferhessenek, public lathat6sagot kell megadnunk! •
Szintaxisa: public " " " Ut6dosztalyNev
I
OsosztalyNev
{
Az osztaly tagjainak deklaraci6ja.
}I
Az osztaly deklaraci6jakor tObbnyire megadjuk az osztaly adattagjait es tagfiiggvenyeit is a kapcsos zar6jelek kozott, de ez nem kotelez6, megtehetjUk, hogy a k6d egy kes6bbi resz6ben definialjuk az osztalyt. •
A sealed modosito:
A C# nyelv lehet6ve teszi sealed (lezart) m6dosit6val ellatott osztaly letrehozasat, mely azt jelenti, ebb61 az osztalyb61 nem lehet szarmaztatni. Peldaul a String osztaly sealed, fgy tebat nem tudunk a String osztalyb61 ut6dosztalyt letrehozni. A sealed m6dosit6t tobbnyire a program hatekonysaga erdekeben hasznaljuk. Ha megnezzUk az CLR osztalykonyvtar szamunkra felkfualt osztalyait, eleg sok sealed m6dosit6val ellatott osztalyt talalunk. View menU Object Bowser mscorlib System nevter String vigyiik az egeret a String szoveg elotti osztalyt je1z6 ikonra! A tobbi vaItozo osztaIy, vagy struktura is sealed.
75
5. Az orokh~s es a .NET osztalykonyvtar system.drawing System. Drawing nevter Bitmap, Font, Icon, Pen ... oszHilyai is lezartak.
5.1.3. Az eddig haszmilt orokles Bar nem beszeltiink r6la, de a Visual Studo fejlesztoeszkoz, amikor uj W· Application projektet geneniltunk, mindig keszitett nekiink egy Forml osztaIYt amit azUin mindig atneveztiink -, es ami a CLR osztaIykonyvtarban megirt osztaIy ut6da. public class Forml
System.Windows.Forms.Form
Az ososztaIy a System.Windows.Forms nevter Form osztalya. Az Object Browser ablakban a (dU, assembly) system. windows. forms komponens System. Windows.Forms nevtere alatti felsorolasban szerepel. Ha kivaIasztjuk, a Members of 'Form' ablakban lathatjuk az osztaly szamunkra elerheto tagjait. A private tagokat nem talaljuk, mert azok az osztaly sajat belso tagjai. Mivel mi nem m6dosithatjuk az osztaly k6djat, csak szarmaztathatunk bel ole, vagy peldanyokat hozhatunk letre, igy nincs sziiksegiink a private tagok ismeretere, hisz azokat ugysem erhetjiik el.
FOrm
\ Close ( )
FOrm1.
r/
button
A Form osztaly maga nem alkalmas egyetlen alkalmazasban sem felhaszmH6i feliiletnek, hisz nincs rajta egyetlen vezerlo sem. Ezert szarmaztatunk belole minden alkalommal egy ut6dosztaIyt, amiben mi az adott feladatnak megfeleloen biztositjuk a kivant feliiletet. Vagyis specializaIjuk a formunkat. A Form osztaly mint ososztaly biztosit szamukra egy mar megirt k6dtOmeget, mel yet mi felhasznalhatunk az ut6dosztaly miikodese kozben. Peldaul nem irtuk meg a megjelenito fiiggvenyt, meg is megjelenik az alkalmazas elinditasa utan a Form a kepernyon. Vagy a minimalizal6 vagy maximalizal6 ikon hatasara minimalizal6dik vagy teljes kepernyos lesz, a bezar6 ikon vaIasztasakor pedig bezar6dik az ablak. Amikor keszitettek ezt az osztalyt, osszegyiijtOttek a tapasztalatok alapjan a formokon szokasos miiveleteket, es az ezek megval6sitasahoz sziikseges adatokat. Az osztalykonyvtar fejlesztoi elkeszitettek a Form osztaIyt, hogy mi elhessiink fejlesztesiink soran a k6d-ujrafelhasznaIas eszkozevel, es gyorsan, egyszeriien keszithessiik el sajat formjainkat.
76
5.1. Az orokles
A Form osztaly tagjai kozt, de az ososztalyainak tagjai kozt sem talalunk adattagokat. Ez nem azt jelenti, hogy az osztalynak nincsenek adattagjai, hanem azt, hogy a fejlesztok korrektiil alkalmaztak az encapsulation (egysegbezaras) elvet, es elrejtettek eloliink az adattagokat private tagvaltoz6kba. Hozzaferesiiket pedig tObbnyire public tulajdonsagokkal teszik lehetove. Termeszetesen a BackColor vagy a Size tulajdonsag mogott tarolt private adatok vannak.
osztaly kapcsan mindjlirt peldat lathatunk tObb egymasb61 szarmaztatott is. Peldaul a sajat Forml osztalyunk Location tulajdonsagat a Form ososztalyai kozti Control osztalyban definialtak, onnet orokOlte a ScrollableControl, a ContamerControl, a Form majd a Forml. &~~~klott tagokat az osztaly lefrasakor nem szokas feltiintetni, az ezekre
vbilatKozo informaci6t az orokles tenyevel adjuk meg. Ezert a sajat form osztalyunR ~¥kJ~~~~itesekor a Class Viewban sokkal kevesebb tagot talalunk, mint amikor a this., ~eg1tsegeve1 sug6t hfvunk megtudni, milyen tagjai erhetoek el az osztalynak. 1I~"~~y~osztaly rendelkezik egy tulajdonsaggal vagy metodussal, nem lenyeges mforIIiaci6 szamunkra melyik osetol orokOlte azt. Fo, hogy van neki ilyen vagy niIlt~;>j
.5.1.4.
A. protected hozzMeres
ffa~gyosztaly
egy tagja (adattag, met6dus) protected Iathat6sagn, akkor az csak az osztruy belsejebol vagy az ut6dosztaly belsejebol erheto el. Tehat a protected tag az objektumok szamara a privatehez hasonl6an lathatatlan, de az ut6dosztalyok szamara a publichoz hasonl6an lathat6. Vagyis a private es public lathat6sag kozotti hozzaferest biztosft. Aprotected UML jele a #, a vizualis feliileten kules kepevel jelzi, hogy a tag vedett. Eddig nern hasznaltuk ezt a lathat6sagot, de a Visual Studio altaI generalt k6dban a form ·osztalyunk Dispose met6dusa protected lathat6sagn, mert az os Form osztalyban is ez a hozzaferes szintje. N6zziik meg az Object Browserben a Form osztaIyt! A Members of 'Form' ablakban lathajuk, hogy j6nehany protected lathat6sagu tagja van. Ha a val6 vilagban keressiik e hozzaferesi szintek megfeleloit, a csalad j6 peldanak bizonyulhat. Egy szemely nyilvanos (public) adatanak tekintheto a neve, a telefonkonyvben szereplo telefonszama. Ezt barki megtudhatja. Privat adata a szemelyes levelei, melyet a legkozvetlenebb hozzatartoz6nak sem illik felbontani, s v6dett (protected) a penztarcaja, amibe az ut6dok (a gyerekek) bejaratosak, de nem leone szerencses, ha a szomszedok vagy gyerekeik is onnet vennek a zsebpenziiket.
77
S. Az orokles es a .NET A protected lathat6sagot miikbdes kbzben is kipr6balhatjuk, ha megnyitjuk eddigi alkalmazasunk form osztalyanak barmelyik fiiggvenyet, vagy generalunk uj Windows Application alkalmazast, rahuzunk a formra egy gombot, kattintva a ButtonClick esemenykezelo met6dusaba ugrunk. •
A Form ut6dosztalyab61latjuk a Form osztaIy protected tagjait. Most mi egy a Form osztalyb61 szarmaz6 formban vagyunk. Ez ut6dosztaly mi most a k6djat irjuk, tehat latnunk kell a protected lathat6sagu tagokat. Ea' irjuk, hogy this. a slig6 fel is kinaIja nekiink a meghivhat6 tagokat, K02:tittii kulccsal jelezve a protectedeket. Valasszunk ki egy protected met6dust Object Bowserben pI. CenterToScreenO - mert neki nincs parametere -, es fogjuk, hogy vegrehajtja-e! A this.CenterToScreenO kivalaszthat6, es kbzben meg is hivjuk, mert az ablakunk a kepernyo kbzepere keriiI.
•
A Button objektumb61 nem erhetjiik el a Button osztaly protected tagjait. Most vizsgaljuk meg a gombunkat! A form szamara ez egy adattag. Button_Click met6dus nem a Button osztaly k6dja, hanem a rni ut6d osztaIyunke. A button objektum tehat a Button osztalyon kivtil van. Valasszun\( most az Object Browserben egy protected met6dust a Button osztalyb6l! PI. OnClick, vagy OnMouseUp leirva a button objektum nevet, a pont operator utan a sug6 nem kinalja fel ezeket a protected met6dusokat, sot lathat6an egyetlen protected met6dust sem. Ha rni begepeljiik a met6dus nevet, forditaskor a "Cannot access protected member. .. " hibaiizenetet kapjuk. Termeszetesen, hisz a protected tagok csak az osztaly es ut6dosztalyai szamara erhetoek el. Az objektum pedig az osztalyon kivtil van.
Vagyis az osztaly, ut6dosztaIy belsejebol (a this segitsegevel ) elerhetjiik, kivtiIr61 nem a protected tagokat.
5.1.5. Az ososztaly tagjainak elrejtese Az ut6dosztalyban lehetosegiink van uj tagok letrehozasara es mar letezo tagok elrejtesere. Ha az a cel, hogy egy mar letezo fiiggveny maskent viselkedjen, akkor azt a fiiggvenyt el kell rejteniink. Azonos szignaturaju fiiggveny irasaval az ososztaly azonos szignaturaju met6dusat elrejtetttik, azonban a forditas utan a fordft6t61 figyelmezteto (kek) iizenetet kapunk, ha nem hasznaltuk a new kulcsszot. A figyelmezteto iizenet a fordftas utan Build eseten az Output ablakban, Run eseten pedig a Task List ablakban erkezik.
Ugyanez tOrtenik azonos new adattag elrejtese eseten is.
78
5. Az oroklt~s es a .NET Ez az az eset, amikor az ut6dobjektum nem tudja ugyanazt mint osobjektumra hivhat6 a CloseO, mig ut6dra nem. De ha sziikftettiik a '-""''l\JS~n ez is volt a ce1unk.
101
Az"oro"k1'es alka1mazasat " mutatJa . az 5 . gyakor1at szavazatsza'rnl'l a as Formok tovabbi orok1eset 1athatjuk a fe1adatok kozt a szereplovalogatas mego1dasaban, es a Ti1i-toli is oroklesse1 val6sul meg. A 7. gyakorlat fe1adataban a Panel osztaIyb61 szarmaztatunk frhat6 Panelt.
I~'-\
5.2. A .NET oszbilykonyvUlr A .NET oszta1ykonyvtar osztalyai nevterekbe csoportosftva erhetok el. A csoportositast jelento nevtereket fizikailag kiilonbozo dll-ekben (dinamic library) taro1jak. Ez biztosftja, hogy a fut6 alka1mazasok ne legyenek 6rias Tn",".,"'::. hisz mindig csak a sziikseges reszeit tartalmazzak az osztaIykonyvtarnak. A Studio fejlesztoeszkoz altaI genenilt Windows alkalmazasok hivatkoznak legfontosabb dll-ekre (References), es hasznaIjak a sziikseges nevtereket (using). tovabbi nevterekben talalhat6 osztaIyokra van sztiksegtink, akkor azok hivatkozasait az alkalmazasunkba be kell frnunk. Erre a kovetkezo fejezetekben bosegesen peldakat. A sug6ban reszletes informaci6t talalunk az osztalykonyvtarral kapcsolatban a Help
Contents Visual Studio.NET .NET Framework Reference Class Library Ha kinyitjuk a mappat, nehany mondatos leirast talaIunk a fobb nevterekrol, de a + ikont kinyitva azonnaI tovabblephetiink a kfvant nevterre. A nevterek ket csoportra oszthat6k. A Microsoft kezdetiiek pI. a Microsoft.CSharp - a fordftast es k6dgeneraIast segitik az adott nyelven. A Vsa a script generahist, mig a Win32 az operaci6s rendszer altaI genenilt esemenyek es a Registry kezeleset tamogatja. A nevterek masik nagy csoportja a System kezdetiiek. A nevterek egymasba agyazhat6ak. A System nevterbe sok tovabbi nevter van beagyazva. Ha a nevter szerkezeti feIepftesere vagyunk kivancsiak, akkor a System mappa megnyitasa u1
80
5.2. A .NET osztalykonyvhir
kattintva hithatjuk az osztalyok listajat. Valasszuk ki az Object
az ose minden osztalynak, amit a .NET osztalykonyvtar definial. alaposztaIy. Minden osztaly ose. A tfpushierarchia gyokere. Mivel az utoda, mindegyik orokli a tagfiiggvenyeit. netOOtlSa lehetove teszi ket objektum osszehasonlftasat. Az alapertelmezett referenciak eseten az azonos referencia. Ha azonos objektumra - nyilvan egyenlok. Ertektfpusok eseten bitenkenti egyenloseg. Sok feliildefiniaItak az Equals metodust pI. a String osztalyban is, ahol a karaktereinek egyenloseget vizsgalja. metodusa minden osztaly peldanyainak szoveges lefrasat adja. metodusa hlvodik meg minden objektumra, mielott az automatikusan
A String oszbily UU.LL'-V~
karakteres szoveget tarol. A unik6d azt jelenti, nemcsak 256 angol karaktert tarolni, hanem a kiilOnbozo nyelvek ekezetes es egyeb kiilonleges karaktereit is>egyertelmiien, es mindenki szamara egyseges megallapodas szerint kezeli a kiilOnbOw matematikai es egyeb hasznaIatos je1ekkel egyiitt. Meg a kfnai es japan fnisjelek is a unikod karakterek koze keriiltek. Mint mar emlftettiik, a String sealed osztaly, tehat nem szarmaztathato belole uj osztaly. A String osztaly kisbetiivel - string - is hivatkozhato. A sztring erteke a benne
tarolt karakterek sorozata, mely ertek nem modosfthato, csak letrehozhato. string str = "alma"; Azok a fiiggvenyek, melyek latszolag az erteket modosftjak, valojaban egy uj sztringgel temek vissza. A string specialis szerepet jatszik a valtozok kozott, mert a kepemyon vagy mas
periferian 1Orteno ertekek megje1enftesekor 10bbnyire sztring tfpusu valtozokat varunk. Az Object osztaIy ToString metodusa biztosftja, hogy barmely objektum erteket sztringge tudjuk alakftani. A felhasznaloi feliilet kezeleset tlimogato vezerlok pedig rendelkeznek Text tulajdonsaggal, melynek ertekeiil sztringeket adhatunk meg. Gyakran fordul elo, hogy a sztring szamjegyeket tartalmaz. A sztring tipuson nem vegezhetok matematikai miiveletek, arra a szam tfpusok alkalmasak. A sztringek mas ertektipusolli atalakfthatok. Erre a Convert osztaly statikus tagfiiggvenyeit
81
s. Az orokles es a .NET osztalykonyvtar 5.2.4. A fajlba iras - olvasas A kiilonbOzo tfpusu adatok fajlba frasanak es fajlb61 olvasasanak legegyszeriibb m6dja, ha adatfolyamokat hasznalunk. Ez azt jelenti, a kiilonbozo adatok egymas utan folyamatosan keriilnek a fajlba, es ertelemszeriien ugyanabban a sorrendben sziikseges kiolvasni oket. Az adatfolyam fajl elereset a System.IO.FileStream osztaly tamogatja. Konstruktora 9 kiilonbozo parameterlistas valtozatban letezik. Mi csak a legegyszeriibbet emlftjiik meg: ha a fajl az aktualis konyvtarban van, eleg megadni a nevet, es masodik parameterkent a megnyitas m6djat.
A File Mode felsorolastfpus a kovetkezo elemeket tartalmazza: ~
Append: Megnyitja a fajlt, ha letezik es a vegere all, vagy letrehoz egy uj fajlt.
~
Create: Letrehoz egy uj fajlt, ha mar letezik ilyen nevil, azt feliilfrja.
~
CreateNew: Letrehoz egy uj fajlt, ha mar letezik ilyen nevil, IOException kivetelt dob.
~
Open: Megnyit egy letezo fajlt. FileNotFoundException kivetelt dob.
~
OpenOrCreate: Megnyit egy letezo fajlt, vagy letrehozza ha meg nem letezik.
~
Truncate: Megnyit egy letezo fajlt, majd kiiirfti, hogy a merete 0 byte lesz.
Ha
a
fajl
nem
letezik,
System.10.FileStream fs = new System.10.FileStream("jelszo.pwd", System. 10.FileMode.OpenOrCreate) ;
A fajlba frast egyszerii tfpusok eseten a System.IO.BinaryWriter osztaly tamogatja. Konstruktoraban meg kell adnunk a fajl objektumot, ahova frni szeretnenk. System.10.BinaryWriter bw = new System. 10. BinaryWriter (fs) ;
Ezutan a Write met6dus 18 kiilonbozo valtozata segftsegevel a kii16nbOzo tfpusu adatokat a fajlba a tfpusnak megfelelo meretil helyre frja. bw.Write(str) ;
A binaris fajlb61 a System.IO.BinaryReader osztaly objektuma segftsegevel tudjuk kiolvasni az adatokat az frasnak megfelelo sorrendben. A BinaryReader a kii16nbozo
84
--
5.2. A .NET oszhilykonyvtar
tipus ok olvasasahoz kiilOnbozo fiiggvenyeket kinal: pI. Readfut32, ReadChar, ReadString ...
S stem.10.FileStream fs = new s~stem. 10. FileStream (" j elszo .pwd" System. 10. FileMode. Open) ; ~stem.10.BinaryReader br = new System.10.BinaryReader(fs); numOfusers = br.Read1nt32(); I
is. close ( ) ;
Ne feledjiik el, hogy iras - olvasas utan a fajlokat Ie kell zarni!
A fajlkezeles tovabbi feltetele termeszetesen, hogy legyen megfelelo jogosultsag a fajl kezelesere.
~J
Alkalmazasa az 5. gyakorlat 12. feladataban.
5.2.5. A Control osztaly es ut6dai A System.Windows.Forms nevter legtobb osztaIya a Control osztalyb61 szarmazik. A Control az ose az osszes vezerlonek, de a Formnak is.
S6gO Index Control class (System.Windows.Forms) ,;
Control overview A Control osztaly informaci6kat szolgaltat a felhasznal6 szamara, es biztositja az adatbevitelt es iizenetkezelest a billentyiizet es az eger segitsegeveI. A Control osztaly un. ambient propertiest (kornyezo tulajdonsagokat) hasznal, ami
azt jelenti, hogy ha nem allitjuk be oket, akkor a sztiloablak beallitasai ervenyesek fli. Ezt megfigyelhetjiik, ha az ablak hatterszinet, betiiszinet, kurzorat vagy fontjat allitjuk, minden vezerlo hatterszine, betiiszine, kurzora vagy fontja vele egytitt valtozik. Ezert mutat egyseges kepet egy-egy ablak. A Control osztaly Text tulajdonsaga megadja a vezerlohOz tartoz6 szoveget. Ez
ablakok eseten a cimsor, egy nyom6gombnal a gomb felirata. Mivel a Text tulajdonsag a Control osztalyban lett definialva, minden vezerlo es ablak rendelkezik ezzel a tulajdonsaggal, hisz orokolte azt. Derived classes
85
5. Az orokles es a .NET osztalykonyvtar
5.3.2. Az explicit t1puskonverzi6 A kodreszletben jol hhhat6, hogy a form objektum szamara a val6sagban Fortn2 meretii helyet foglaltunk, megis, ha a form objektumra meg szeretnenk hivni egYa Form2-ben letrehozott uj fiiggvenyt, azt mar a gyorssug6 sem tamogatja. Nem szerepel a legordtila listaban a form-ra meghivhat6 met6dusok kozt az uj met6dus. Ha megis meghivjuk, a fordito a 'System.Windows.Forms.Form does not contain a definition for uj' hibatizenetet ktildi. Ha bizonyosak vagyunk benne, hogy az objektum val6jaban ut6dtipusu teriiletre mutat a memoriaban, akkor konvertalhatjuk az ut6d tipusara mielatt meghivnank a fiiggvenyt. ((Form2)form) .Uj ();
Ezt explicit tipuskonverzi6nak vagy castolasnak hivjuk, mivel explicit ki keU irni a konverzi6t. Ez a konverzio a programozo felelassege! Az a feladata, hogy megbizonyosodjek arr61, hogy a form szamara lefoglalt hely Form2 tfpusu. Ha ez nem igaz (pI. form = new Form ()), a fordft6 nem jelez hihat, de futaskor a 'System.InvalidCastException' kivetelt kapjuk, a 'Specified cast is not valid' magyaraz6 szoveggel, ami arra utal, hogy a castolas nem ervenyes. Explicit tfpuskonverzi6val az elabb meg hihas ertekadas is megvalosfthato. II
form2 form2
= form; = (Form2) form;
II Hiba!
IMegjegyzes: I Az elare definialt tfpusok elare definialt konverzios lehetasegekkel
rendelkeznek. Azokhoz a tfpusok kozotti atalakitasokhoz, melyek biztonsagosan vegrehajthat6k, es soha nem eredmenyeznek adatvesztest (pI. int atalakitasa long tipussa) implicit cast operatorokat biztosit az osztalykonyvtar. Az implicit konverzi6t nem keU kifrnunk. int a
= 5;
long b = a; II long b = (long)a; helyett.
Osztalykonyvtarak hasznalatakor alkalmazzuk az ertekadas kfnalta lehetasegeket. Az osztalykonyvtar altaI szolgaltatott fiiggvenyek nem dolgozhatnak a majd altalunk, a fejleszta altaI kesabb letrehozott tipusu parameterekkel vagy visszateresi ertekekkeI. Csak valamelyik az osztalykonyvtar altaI szolgaltatott asosztaly tfpusu 88
5.3. Az ertekadas ~
...... atIletert varhatjak, vagy iIyen tfpusu objektummaI terhetnek vissza. Ilyenkor, ha
P~·uk az objektum altaI fogIalt hely tipusat - es hasznalni akarjuk e tipus
:e~6dusait - a castolashoz kell folyamodnunk.
A Form osztalyok Controls tulajdonsaga visszaadja a Form feliiletere hrizott zer16k t6mbjet. Mivel a Visual Studio fejlesztoi nem tudhattak mi majd milyen vezer16ket hasznalunk, no meg igy mindegyikre egy os tipusokat tartalmaz6 ;'~rnbben hivatkozhatunk, a tomb Control tipusu elemeket ad vissza. Hiaba tudom, h~gy a Controls[O] egy listadoboz, nem kerdezhetem Ie az elemeinek szamat, mert a controls osztatynak meg nincs Items tulajdonsaga! Csak ha konvertalom ListBox tfpusura az egyebkent val6ban ListBox objektumot. int db = ((ListBox)Controls[O]) .. Items.Count
Vagy esemenykezelok sender objektuma object tipusu, de sziikseg eseten atkonvertalhat6 barmely ut6dtipusra, feIteve, hogy tudjuk val6jaban egy olyan tipusu ut6dra mutat. Az Object osztalynak nincs Text tulajdonsaga, de az altala hivatkozott objektumnak lehet. Ha az adott esemenykezelot tObb vezerlo is' rneghivhatja, es Ie akarjuk kerdezni a Text erteket a k6dban: private void Button_Click(object sender, System.EventArgs e) {
RadioButton r = (RadioButton)senderi MessageBox.Show(r.Text) }
JJl Az 5. gyakorlat mindket feladataban, a Tili-toliban es a valaszt6gomboknal is lathatunk peldat explicit tipuskonverzi6ra. A fenti k6dok, ha a valtoz6k nem az konverzi6 soran haszn:Ht tfpusuak, kivetel dobasat eredmenyezik.
5.3.3. Az 'is' operator A C# nyelv 'is' operatotaval tetszoleges objektumr61 eldonthetjiik, hogy az adott objektum konverzi6ja az adott tfpusra sikeresen vegrehajthat6-e. Az 'is' operator igaz erteket ad vissza, ha az objektum futasidoben adott tfpusu, vagy a tfpus utOdosztalyanak megfelelo teriiletre hivatkozik.
89
5. Az orokles es a .NET oszbilykonyvtar
10. Egy osztaly ososztaIyair61 a sug6 adott osztalyra vonatkoz6 about class bejegyzeseben kapunk informaci6t. 11. OsosztaIy tfpusu objektum ertektil kaphat ut6dosztaIy tfpusu objektumot. 12. A Form2 form2 = new FormO; tfpusu ertekadas gyakran alkalmazott az osztaIykonyvtarat hasznaI6 fejlesztesek soran. 13. Ha tudjuk, hogy az Object 0; objektum val6jaban Control-ra mutat, akkor castolassal elerhetjiik ForeColor tulajdonsagat. 14. Az 'is' operator csak akkor ter vissza igaz ertekkel, ha a jobboldalan megadott tfpus megegyezik a vaItoz6 deklaraci6ban megadott tfpusaval. 15. Ha egy ososztaIyban megfrt met6dust szeretnenk meghivni, elobb az 'as' operator segftsegevel az objektumot a kivant os tfpusara kell konvertalnunk.
Javft6ku1cs:
H, H, H, I, H, I, I, H, H, I, I, H, I, H, H.
92
6. A feliigyelt k6d es a Toolbox komponensek Az aikaimazasokkal szembeni eivarasok folyamatos novekedesevel uj es uj technikakat hoznak Ietre a hatekonysag, skaIazhat6sag es attekinthetoseg biztositasa erdekeben. Az eiterjedt programozasi nyeIvek mindegyike azert tud fennmaradni a piacon, mert vaiamilyen specialis igeny kielegitesere a tObbitol eltero szoigaitatast tud nylijtani. Osszetettebb alkalmazasok eseten az elvarasok az alkalmazas· egyes teriiIetein egymast6I nagyon elteroek lehetnek. Ez azt jelenti, hogy az alkaimazas egyik resze egy adott nyeIv, mig mas resze egy masik nyeiv alkaimazasat kivanna. FelmeriiIt az igeny olyan fejIesztoi es futtat6 kornyezet kifejIesztesere, mely a kiiIonbOzo nyeIveken irt programelemek egyiittmiikOdeset tamogatja. fgy minden egyes reszhez azt a programozasi nyelvet vaIaszthatjak a fejIesztok, ami annak a Ieginkabb megfelel. A dontesben szerepet jatszhat a projekt tagjainak programozasi nyeiv ismerete is.
Hagyomanyosan a forrask6du programot az adott operaci6s rendszerhez forditottak. ACes c++ nyeiv platformfiiggetlenseget, hordozhat6sagat az jelentette, hogy a standard C++ -nak minden operaci6s rendszerhez keszitettek fordit6t, igy a forrask6dot csak Ie kellett forditani a kiiIonbOzo kornyezetekben, es mar miikodott is a program. Az internet es intranet elterjedesevel az alland6 forditasok - melyek szakember jeIenletet es hozzaerteset koveteitek - a miikodes gatjava valtak. A Java nyeiv es futtat6 kornyezet, valamint a .NET kornyezet azzal a cellal jott Ietre, hogy tamogassa az aikaimazasok operaci6s rendszertol fliggetien futtatasat. A Java
93
6.1. A feliigyelt k6d
bjektUmra kesobb a programban megis hivatkozunk, a felszabaditott o emoriateriiletet mar egy masik valtoz6 adatai foglaljak el, mi megis irjuk, olvassuk mymarmegsziint objektum adatakent ertelmezve. Ennek a hibanak a felderitese e:ndldviilosszetett feladat. Gyakran nem is vessziik eszre, hogy egy most epp nem ~gyelt vaItoz6 erteke m6dosult, vagy ha eszrevessziik, nem ertjiik az okat. A eLR biztositja szamunkra az automatikus szemetgyiijtest. Igy minden .NET kornyezethez fejleszto programozasi nyelv, a C# is elvezi az automatikus memoriakeze1es elonyeit. Mintha a programoz6k kaptak volna egy takarit6 robotot, mely osszegyiijti utanuk a szemetet. Vagyis fe1szabaditja he1yiiket, ha mar ninesenek hasznalatban. Ezutan osszetomoriti a megmaradt objektumokat, es kijavitja a rajuk mutat6 hivatkozasokat.! Azokat az objektumokat, melyek eleteiklusa ily m6don szabaIyozott, feliigyelt adatoknak (managed data) hivjuk, a mem6riafelszabaditas menedzselesenek ezt a m6djat pedig automatikus szemetgyiijtesnek GC (garbage collection) nevezziik.
Ha nines tobb hely a mem6riaban elindul az automatikus szemetgyiijtes. Mivel a folyamat automatikus, nines m6d arra, hogy megmondjuk, a szemetgyiijto milyen sorrendben Wr61je az objektumokat. A fent leirt elony mellett azt is tudnunk kell, hogy a szemetgyiijtes j6val Wbb proeesszoridot igenyel, mint a hagyomanyos objektumok felszabaditasa, hisz itt nem egy objektum felszabaditasa zajIik, a hivatkozasok felderitese es a foglalt helyek egymas melle "tomoritese" is idoigenyes feladat.
Az adatok tomoritese soran az objektumok helye folyton vaItozik a mem6riaban, tehat feliigyelt k6dban nines lehetoseg a memoria kozvetlen cimzesere, mely gyakran nagyon hatekony megoldas a k6dolasban. A C# k6d alapertelmezesben feliigyelt, de lehetosegvan nemfeliigyelt (unmanaged) k6d lrasara is az unsafe ku1cssz6 segitsegevel. A feliigyelt k6d egyiittmiikodhet nemfeliigyelt k6ddal.
!
Da~id S. Platt: Bemutatkozik a Microsoft .NET, Szak Kiad6 Kft, Bicske, 2001, 72. old. 95
6. A feliigyelt k6d es a Toolbox komponensek
6.1.3. A nevterek A .NET kornyezet ket legfontosabb eleme a CLR es a .NET osztalykonyvtar. 1 A felhasznal6i igenyekhez igazodva egyre tObb osztaly szerepelt egy alkalmazasban. A .NET osztalykonyvtar sok szaz osztalyat rendszerezni kell ahhoz, hogy eligazodjunk: kozotttik. Az osztalyok logikai csoportosftasat szolgaljak a nevterek (namespace). Ha megnezztik az eddig elkesztilt k6djainkat (Class View), minden uj alkalmazas letrehozott az alkalmazas nevevel azonosftott nevteret (SzavSzam). Ebben a nevterben volt az altalunk letrehozott osztalyok lefrasa (SzavSzamForm, VoteButton). Ha a form forrask6djanak elejet megnezztik, j61 lathat6 a form altai gyakran hasznalt nevterek listaja a using direktfva utan. A nevterek egymasba agyazhat6k. Az egymasba agyazott nevterek nevet a '.' operatorral valasztjuk el.
Az osztalyokra a teljesen minositett nevtikkel (fully qualified name) kell hivatkoznunk, amint azt a fenti k6d Form osztalya eseten latjuk, ha nem a veltink azonos nevterben helyezkednek el. Mivel ez meglehetosen attekinthetetlenne teszi a k6dot, ezert importalhatjuk a nevtereket a using kulcssz6 hasznalataval. Az importalt nevterek osztalyai eseten eleg az osztaly nevet kifrnunk. A k6dban gyakran hasznalt osztalyok eseten celszerii az importalast elvegezni. A kozvetlen munkatarsakat mi is csak keresztneven sz6lftjuk, a tavolabbi munkatarsat a teljes nevtikon nevezzuk meg, de nagyobb intezmeny eseten hozzatessztik az osztalyt is. "A penztigyes Kiss Kati." Ha azonban a beszelgetes a penztigyesekrol sz61, akkor eleg csak Katikent megnevezni a kolleganot, mindenki tudja kirol van sz6.
I
Sligo, .NET Framework Developer's Guide, Overview of the .NET Framework
96
-
6.1. A feliigyelt k6d
6.2. abra A System nevter nehany alnevtere az UML jelOleseit hasznalva A nevterek nemcsak a logikai csoportosftast szolgaljak, hanem lehetove t'eszik azonos nevu osztalyok letrehozasat kiil6nb6zo nevterekben. Ekkor az osztalyokat a teljesen minosftett nevlikkel kiil6nb6ztetjiik meg. PI. nezziik meg a sug6 Index fulet hasznalva a Button osztaly lefrasat! Ket Button osztalyt talalunk, az altalunk ismert es hasznalt System.Windows.Forms nevterben lemat, es a System.Web.ULWebControls nevterben megadottat. De a Timer osztalyb61 harmat is talalunk, a System. Threading, a System. Timers es a System.Windows.Forms nevterben. A System nevter tartalmazza az operaci6s rendszer funkci6it. A System nevterben
szerepel az 6sszes osztaly osenek, az Object-nek a lefrasa. Itt talaljuk a String osztaly es a kii16nb6zo tfpusok k6z6tti konverzi6t lehetove tevo Convert osztaly lefrasat is. A System.Drawing-b61 hasznaltuk a Color-t, a System.Windows.Formsban nemcsak a Form osztaIyt, de az 6sszes vezerlo osztalyt is megtalaIjuk. Ha egy osztalyr61 nem tudjuk, melyik nevterben talalhat6 a lefrasa, es a fordft6 nem ismeri fel, akkor a sug6 Index fuIebe az osztaly nevet befrva, az about class a1cfmet valasztva, vagy az osztaly neven Fl-et iitve,az overview linket k6vetve megtalaljuk a nevter lefrasat. Ezutan az osztaly neve ele ki kell lrnunk a teljesen minosftett nevet, vagy a using ku1cssz6val importalnunk kell a nevteret a forrask6dba.
A using direktfvanak meg kell eloznie a nevter 6sszes elemet! Emiatt a forrask6d elejen helyezziik el, kiilOnben fordftasi hiMt kapunk.
97
6. A feliigyelt kOd es a Toolbox komponensek
6.2. A ToolBox altai felkinalt komponensek 6.2.1. A menii Parancsok kiadasara eddig a nyomogombot hasznaltuk, de ha nagyobb mennyisegii parancsot igenyel a feladat, helyigenye es attekinthetosege miatt a legbrdiilo menu kfnalja a legjobb megoldast. A menii egy tovabbi l::ithato ToolBox elem. Az eddig tanult vezerl6khbz hason16an kezelheto. A Menu teljesen minosftett neve a System.Windows.Forms.Menu. TeMt a tbbbi vezerlohbz hasonloan a System.Windows.Forms nevterben definiaItak, es ose a Component osztaly. A fOmenii, a menii mindig l::ithato elso sora alta laban nem kbzvetlen parancsot, hanem vegrehajthato meniipontok egy-egy csoportjanak nevet tartalmazza. A fOmenii valamely meniipontj::it kivalasztva lenyflik az almenii, mely mar tbbbnyire valoban parancsokhoz tartozo meniipontokat tartalmaz. Hogy egy meniipont legbrdiilo, vagy parancsot hajt vegre, azt a DefaultItem tulajdonsaga hatarozza meg. Ha a DefaultItem True, a meniipont parancsot tartalmaz. A mentipontok csoportosfthatok elvalasztok segftsegevel. Elvalaszt6t a kbvetkezokeppen hozhatunk letre. Vagy a meniiszerkesztoben a gyorsmeniiben (jobbeger) kivalasztjuk az Insert Separator meniipontot, vagy a meniipont Text tulajdonsag::it '-' -re allftjuk. Egy meniipont adhat tajekoztatast a program allapotar61 is. Peldaul gondoljunk a mindenki altaI j61 ismert sZbvegszerkesztokre! Az Edit menii Copy parancsa csak akkor hasznalhat6, ha van kijelblt szbveg, Paste meniipontja pedig tajekoztat arr6l, van-e a vagolapon elem, amit beszurhatunk. Ezt a meniipont Enabled tulajdonsaganak futasideju allftasaval erhetjiik el. Ha a Checked tulajdonsag igaz, egy pipa jelenik meg a mentipont elott - csak nem legbrdiilo meniipont eseten alkalmazhato -, s ha azt akarjuk, hogy pipa helyett egy pontot lassunk, akkor a RadioCheck tulajdonsagot is igazra kell allftanunk. Ne feledjiik, hogy itt is illik betartani az elvet, Radio eseten a csoport pontosan egy eleme, mfg pipa eseten tetszoleges szamu elem lehet kivalasztva! Meniipont eltiintetheto es megjelenftheto a Visible tulajdonsaggal, es termeszetesen sZbvege is modosfthato a Text tulajdonsag modosftasaval. EIOfordulhat, hogy nem tudunk egeret hasznalni. A meniipont kivalasztasa ilyenkor az Alt es az alahlizott betti segftsegevel tbrtenhet. Ennek tamogatasahoz a tulajdonsaglap Text tulajdonsagaban az alahuzni kfvant betti ele egy & jelet frjunk! Ekkor a szerkesztoablakban (Design) mar latjuk az alahuzast. Az, hogy a fut6 alkalmazasnal latjuk-e, az operaci6s rendszer beallftas::it61 filgg. Ha fut az alkalmazasunk, es a fOmenii valaszthat6 billentyiizetrol, akkor az Alt gomb 98
6.2. A ToolBox altai felklmilt komponensek
1.·· YOII1asara megjelennek az allihuzasok. Ha azt akarjuk, mindig lathatoak legyenek, ;or a Ve~,er~6pult, ,~egjel~nft~s, ~~gjelenftes fiil, Hams gomb, Hfvobetiik elrej~~sej.elolonegyzetbol vegyuk ki a plpat! Gy~rsgombot a meniiponthoz a Shortcut tulajdonsag listajab61 valaszthatunk, mely a
ShowShortcut tulajdonsag True-ra allftasaval kifrodik a meniipont melle. Meniipont kezelese a Click esemenyenek kezelesevel tortenik.
Osszetettebb feladatokban sziikseg lehet Wbb menii osszefesiilesere is, ezt is tamogatjak a meniitulajdonsagok.
6.2.2. A ToolTip AToolbox tartalmaz a futo alkalmazasban nem lathato elemeket is. Ezeket, ha a Designablak fOle hUzzuk, megjelenik egy szerkeszt6 say az ablak a1jan, ,es a kompollens a savra keriil. A tovabbiakban ugy dolgozhatunk vele, mintha az ab1akon vorna. HuzzuIlk egy ToolTip vezerl6t az ablakunk fOle! A segedablakban megje1en6 toolTipl nevil objektumot atnevezve myToolTip-re, minden vezerl6 tulajdonsaglapjan megjelenik a ToolTip on myToolTip tulajdonsag, ahova begepe1hetjiik a sarga teglalapba vart szoveget. Futtataskor vigyiik az egeret a vezerl6 fole, s egy kicsit varva mar olvashatjuk is az altalunk megadott ToolTip szoveget. Tulajdonsagai:
• • • •
Az InitialDelay: megadja bany ezredmasodperc mulva jelenjen meg az ablak. Az AutoPopDelay: Hany ezredmasodpercig lathato az ablak. A ReshowDelay: Az ujramegjelenftes id6tartama. Az AutomaticDelay: Az e16z6 barmat allftja ugy, hogy az InitialDelay vele egyez6, az AutoPopDelay a t!zszerese, a ReshowDelay az egyoWde lesz.
6.2.3. A Timer Amiot a nevtereknel szo volt rola, Wbb id6zft6nk is van, mi itt a System.Windows.Forms.Timer-rel foglakozunk. Ez a ToolBox Windows.Formsr6l hUzhato az ablakunkra. Adott id6kozonkent egy Tick esemeny kovetkezik be. Az Interval tulajdonsagaban adhatjuk meg az id6koz hosszat milliszekundumban. Tebat ha az Interval=500, fel
99
6. A feJiigyelt k6d
es a Toolbox komponensek
masodpercenkent fog a Tick esemeny bekovetkezni. A Tick esemenyhez esemenykezelot rendelve adhatjuk meg a vegrehajtand6 k6dot. Az idozftot a Start met6dussal indfthatjuk el, es a Stop met6dussal allfthatjuk meg.
t
II,
A 6. gyakorlat 2. feladata az idozfto hasznalatat mutatja.
IMegjegyzes: I A System. Windows. Forms. Timer Windows. Forms alkalmazasokhoz optimalizalt. Egyszalu, felhasznal6i felUlettel rendelkezo alkalmazasok hasznaljak, es pontossaga 55 milliszekundum. Ez a ToolBox Windows.Forms ablakab61 huzhat6 a szerkesztOfeliiletre. A System.Timers.Timer a hagyomanyos idozfto, szerveres kornyezetre optimalizalt, server-based timernek is hfvjak. Tobbszalu, felhasznal6i feliilettel nem rendelkezo hatterfeladatok (workerthread) kezelesere alkalmas. Milliszekundum pontossagti. A ToolBox Components ablakaban erhetjiik el. A System.Threading.Timer osztaly tObbszalu miiveletek eseten biztosftja egy fiiggveny adott idokozonkenti vegrehajtasat. Callback met6dusok kezelesere alkalmas esemenykezeles helyett. Prograrnk6db61 erheto el.
6.2.4. A Process Folyamatok indftasahoz, leallftasahoz es kezelesehez nyujt tamogatast a System.Diagnostics.Process osztaly. A folyamatok tObbnyire fut6 alkalmazasok. A folyamat legalabb egy, de akar tObb szalon is futhat. A Windows feladatkezelojeben (Ctrl + Alt + Del) megnezhetjiik a gepiinkon eppen fut6 alkalmazasokat es folyamatokat. A Visual Studio .NET Tools meniipontjab61 vagy a Start menii I Visual Studio .NET I Visual Studio .NET Tools alatti Spy++ alkalmazast indftva, a Spy I Processes meniipontjat valasztva megnezhetjiik az aktualisan fut6 folyamatokat es szalaikat.
100
6.2. A ToolBox rutal felkinalt komponensek
f±j-'l!> f±j-'l!>
Thread 000006D8 EXPLORER Thread 00000978 EXPLORER Thread 0000099C EXPLORER Thread 000009.110 EXPLORER Thread 000009.118 EXPLORER Thread 000009BO EXPLORER Thread 0000&,28 EXPLORER Thread 0000&'C8 EXPLORER Thread 00000B3C EXPLORER Thread 00000C20 EXPLORER Thread 00000C48 EXPLORER Thread 00000F2C EXPLORER Process 0000&,24 SPYXX Process 0000&,3C SYNTPENH
o
6.3. abra Az Explorer folyamat szalai es a Spy++ folyamat a Spy++ ablakaban A Process osztaIy statikus met6dusai objektum nelktil is hfvhat6k. A parameteres Start met6dus osztaIyszintii, csak parameterkent meg kell adnunk az indftani kivant program nevet. Ekkor azonban az elindftott folyamat futasaba a programb61 beavatkozni nem tudunk.
A GetProcesses, GetCurrentProcess, GetProcessesByName osztaIyszintii tagfiiggvenyek visszaadjak a fut6 folyamatok tOmbjet, az aktualis folyamatot, illetve az adott new fut6 alkalmazasok tOmbjet adja vissza. Process objektumot a ToolBox Components ablakab61 hUzhatunk a Formra. A Process objektum is egy lathatatlan komponens, fgy a segedablakba keriil. A parameter nelktili Start met6dus a Process.Startlnfo tulajdonsagb61 olvassa ki az elindftani kivant alkalmazas adatait.
A Process objektum a k6dunkb61 elerheto, fgy futas k6zben is kezelhetjtik. Lekerdezhetjtik adatait, ha van felhasznal6i feliilete, aMain WindowTitie tulajdonsaga adja meg a foablak cfrnsorat, es a CloseMainWindow segftsegevel aIlithatjuk Ie a normal uton. A Kill met6dus azonnali leallast eredmenyez, de az abnormal program termination adatveszteshez vezethet. PI. ha a fut6 folyamat egy Word alkalmazas, a Kill met6dus ugy allitja Ie az alkalmazast, hogy nem menti a megnyitott es szerkesztett fajlok adatait, mig a CloseMainWindow visszakerdez, ha nem mentetttik az utols6 m6dositasokat. Egy folyamat Exited esemenyehez tudunk tizenetkezelot rendelni. A folyamat csak akkor tud tizenetet ktildeni, ha az EnableRaisingEvents tulajdonsaga true-ra van aIlitva.
D
1»<»<)
A folyamatok kezelesere a 6. gyakorlat 1. feladata mutat peldat.
101
6. A fel
k6d
es a Toolbox komllionensek
IMegjegyzes: I Az adatbazis-kezelest tamogat6 osztalyok is futasidoben lathatatIa komponensek, veltik az adatbazis-kezelessel foglalkoz6 fejezetbe n talalkozunk. n
6.3. Teszt l.
A .NET futtat6kbrnyezet biztosftja az automatikus szemetgyiijtest.
2. A fejlesztoeszkbz a CLS segftsegevel kbztes k6dra fordftja az alkalmazast, melyet aCTS ertelmez az adott kbrnyezetben. 3. Az automatikus szemetgyiijto folyamatosan dolgozik a Mtterben, es a nem hivatkozott objektumokat azonnal eltakaritja a mem6riaM!. 4.
Ha egy osztalyt nem akarunk mindig a teljesen minositett nevevel megadni, akkor a k6d elejen a names pace kulcssz6val importalhatjuk a nevteret.
5. A kiilbnbbzo nevterekben azonos nevu osztalyokat is megadhatunk, sot akar egy programban is hasznalhatjuk oket, de ilyenkor a nevlikbn kivlil a nevteruket is meg kell adnunk (fully qualified name). 6. frhatunk a feltigyelt k6don kfvlil unmanaged k6dot is, de egy alkalmazason bellil a ketto nem keveredhet. 7. A felhasznaI6i fellileten meg nem jeleno komponenseket csak k6dMI erhetjlik el, a ToolBox a larhat6 elemek szerkeszteset segfti. 8. A meniit a program allapotanak kijelzesere is hasznalhatjuk. 9. A menu megjelenese az alkalmazas futasa soran valtoztathat6. 10. A ToolTip segftsegevel a Design m6dban megnyitott ablak felhaszmil6i felliletere kenyelmesen hUzhatunk be vezerloket. 11. A Timer. Interval tulajdonsagaban masodpercekben adhatjuk meg a Tick esemeny bekbvetkezesenek gyakorisagat. 12. A Process osztaly statikus met6dusai lehetove teszik, hogy alkalmazasunk folyamatosan vezerelje a statikus met6dus segitsegevelletrehozott folyamatot. 13. A folyamatok Kill met6dusa lehetove teszi az adatok menteset a folyamat lezarasa elott. Javft6kulcs: I, H, H, H, I, H, H, I, I, H, H, H, H.
102
1....AiDLL es a szerelveny Osztalyaink logikai csoportositasat a nevterek tettek lehetove. Azonban ilyen sok osztalyt nem lehet minden alkalmazasba beforditani, mert akkor nagyon nagymeretiiek lennenek. Alkalmazasaink nem hasznaljak az osztalykonyvtar altaI kinalt osszes lehetoseget, csak a problema megoldasahoz sziiksegeseket. Ezert tebat celszerii osztalyainkat fizikailag mas-mas fajlban, ugynevezett libraryben tarolni, es a forrutas soran csak a sziiksegeseket a k6dhoz szerkeszteni. Ha tObb fizikai fajlban taroljuk az alkalmazast, lehetove valik azok kiilOna1l6 fejlesztese. Lehetoseg nyilik ra, hogy egy DLL-t tObb alkalmazas hasznaljon, es a fejlesztes es karbantartas soran a DLL-eket ona1l6 verzi6szammal ellatva azok ona116 frissitese is megval6sithat6.
7.1. A DLL A DLL (dynamic-linked library) olyan konyvtar, melyet dinamikusan szerkeszthetiink alkalmazasunkhoz. Bar .NET eseten az exe csak akkor indul el, ha minden dll rendelkezesiinkre all, futas kozben a sziikseges library-t olvassa be az alkalmazas. Ez a kovetkezo elonyokkel jar: ~ Csokken az exe fajl merete.
~ Ugyanazt a dll-t tObb alkalmazas is hasznalhatja akar egyszerre is. Ehhez
nem kell pI. az osszes meghajt6 k6djav I kozben az eppen hasznalt eszkbz telepfte~ k6dunk. PI. nem kell tudnunk a felhasznal6 ahhoz, hogy alkalmazasunk az adott ny omtat6n
~ A hibas dll onall6an javithat6, frissithet6 anelkiil, hogy az 6t hasznal6
alkalmazasokhoz nyulnank. Ezt tessziik pI. a Windows frissftesek letOltese es telepftese soran. Tudnunk kell viszont, ha a dll-t elfelejtjiik az exe-vel egytitt telepiteni, nelkiile nem futtathat6, vagy csak reszben fog mukodni alkalmazasunk. Ezert nem lehet egyszeruen az exe fajl masolasaval programokat elvinni egy gepr6I. A reszleges mukOdesre j6 pelda, hogy amig egy gepre nines nyomtat6 meghajt6 telepitve, addig a nyomtatasi funkci6k nem mfikodnek. Nines nyomtatasi kep, nem lehet jelentest kesziteni Excelben ... A dll onall6an nem futtathat6 allomany. Kell hozza egy exe, hogy a szolgaltatasait elerjiik. Ezert el6szor a kesz dll felhasznaIasanak m6djat tanulmanyozzuk, hisz az altalunk keszitett dll tesztelesehez is sziiksegiink lesz erre a tudasra.
7.1.1. Az eddig fejlesztett alkalmazasok komponensei
7.1. abra A References alatt es az Object Browserben az alkalmazasban hasznalt osztalykonyvtarak Az eddig keszitett alkalmazasaink is hasznaltak osztalykonyvtarakat, csak eddig a k6dgenerator el6keszitette nekiink a hasznalatukat. A Solution Explorer ablakban a References folder tartalmazza az alkalmazasunkba beszerkesztetl osztalykonyvtarakat. Ha egy kivalasztott elem gyorsmeniijeben a Properties 104
7.1. A DLL
meiliip'QntUl vlilasztjuk, a Description tulajdonsag alatt megtalaljuk a dll kiterjesztesii .ne"v', a Path tulajdonsag alatt pedig az eleresi utjat. "J"Jlbie4~t . Browser
ablakban megnezhetjiik, hogy mely nevterek mely osztalyait fnrditop[~ be az adott dll-be. Kivalasztva egy oszhHyt, a mellette leva ablak kilist~'Zl~a az osztaly tagjait. AiJ9~ai.
csoportositas a nevterekben es a fizikai csoportositlis az s#~y~onyvtarban tObbnyire fedi egymast, de nem kotelezoen. Vagyis az egyes °6vter~k osztalyai jellernzoen egy osztalykonyvtarban vagy vegrehajthat6 ~o~nyban tarol6dnak, es egy library vagy exe nehany nevter osztalyait tarolja. A 7.21 libra komponensdiagramja a System nevter es nehany gyakran hasznalt alneyterenek, a Microsoft.Ink nevternek, valamint a Tablet.exe alkalmazasban genenHt Tablet nevternek a fizikai komponenseit mutatja.
7.2. abra A nevterek es fizikai tarolasuk exe es dll fajlokban
7.1.2. A keresett osztaly osztalykonyvtara Amikor olyan osztalyt kivanunk hasznalni a projektiinkben, amit a fordft6 nem ismer fel, de mi a sug6b61 tudjuk, hogy a .NET osztalyok egyike, akkor eloszor meg kell keresniink a nevteret, hogy vagy a using direktivaval importaljuk, vagy megadjuk a teljesen minositett nevet. Ezt tettiik az elozo fejezetben a Process osztaly Diagnostics nevterenei. Ha a fordit6 valtozatlanul nem talalja az osztalyt vagy nevteret, annak az az oka, hogy az osztalyt tarol6 osztalykonyvtar nines a projektiinkhoz csatolva. Az osztalyt tarol6 dll-rol a sug6 Index ablakaba az osztaly nevet lrva, az about osztalynev elemet valasztva kaphatunk informaci6t. Az ablak aljan, a Requirements cfmsz6 alatt pI. a Process osztaly eseten a kovetkezot olvashatjuk:
105
7. A DLL es a szerelveny Requirements Namespace: System. Diagnostics Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family Assembly: System (in System.dll)
fuformaci6t kapunk a nevterr61, melyben az osztaly definialva lett, az ope:racif.. rendszer platformr61, amelyen hasznalhat6, es az osztalyk6nyvtarr61, fizikailag tarolOdik. Ha azt akarjuk, hogy projektiink hozz
7.1.3. Uj oszhilykonyvhir-hivatkozas az alkalmazasban Solution Explorer References jobbeger Add Reference
.NET
I
COM
I Projects I
Component Name RegCode stdole System,Configuration,!'" System,Data,dll System,Data,OracleCrre", System, Design,dll
7.3. abra A .NET komponensei az Add Reference ablakban A parbeszedablakban harom ftillel talalkozunk: ~ .NET fiiI valasztasakor a feliigyelt k6du osztalyk6nyvtarakat v
ki.
106
7.1. A DLL
fill alatt a regebben letrehozott COM komponenseket, melyek nem k6duak. ~rollects
fill az adott gepen altalunk letrehozott dll-eket kinalja feH.
komponenst a Select gomb segitsegevel adhatjuk a Selected A lista kijelOlt elemet a Remove gombbal tavolithatjuk el.
LaUUL<.
letOltott, vagy egy meghajt6n rendelkezesunkre a116 dll-el szeretnenk a Browse gomb segitsegevel erhetjuk el. hatasara az osztalykonyvtar bekeriil projektunk referenciai koze. gYOlmaIIYOS
dll
a dll-t jellemzoen tObb alkalmazas hasznalta (hasznalja). A fejlesztok lihholnnOlllL(:I1K ki, hogy ha az adott dll uj es uj verzi6i a szolgaltatott met6dusokat m&gfW."tjak, legfeljebb bOvitik, akkor az uj verzi6val helyettesithetok a regi dll-ek. Eze~\
dll egyszer szerepelt a gepen, tObbnyire a Windows system vagy a s~stem32alkonyvtaraban platformt61 filggoen. XP eseten, ha megnezzuk a gepunk syster:n32alkonyvtarat, 5000-nel is tObb fajlt taIalunk benne, tObbnyire dll-eket. A(~jlesztok
teszteltek a dll-ek uj verzi6it, hogy megoriztek-e regi funkci6ikat, de a szeles· felhasznal6i kor minden igenyet nem tudtak tesztelni. A hibak, bar ritkan fordultak elo, a tOmeges hasznalat miatt megis egyre gyakrabban jelentkeztek. Minden uj program telepitesekor j6neMny dll felulir6dott anelkiil, hogy ez a felhaszna16ban tudatosult volna. Es ez ritkan, de hibakhoz vezetett. Gyakran nehezen felderitheto hibakhoz. Mert eleg nehez rajonni, hogy a hOnapok 6ta j61 miikOd6, de ritkan hasznalt alkalmazasunk azert nem fut, mert a mult heten kipr6baltunk egy jatekprogramot, ami felulirta az altala hasznaIt d11-t. Mar reg eIfelejtettuk a jatekot, Ie is tOrOltiik a geprol, de az eddig hasznalt szoftver erthetetlen hibajat a gyenge jatek hibas dll-je okozza. Tovabbi problemat okozott, hogy a kozos d11-eket kozos konyvtarba szokas telepiteni (system, system32). Ha nem hasznalunk tovabb egy alkalmazast, es nem az eltavolit6val tOrOljuk Ie, akkor dll-jei ott maradtak a gepen. Masreszrol a fejleszto gepen a kozos konyvtarb61 haszmHt dll-t, ha nem telepitettek es regisztraltlik a felhaszna16 gepen, akkor ott mar nem miikOdott az alkalmazas. A .NET elotti dll-ek nem koztes k6dra fordultak, hanem nativ k6dra, teMt a TIT nelkiil is azonnal felhaszn~Hhat6k voltak. 107
7. A DLL es a szerelveny A feladat tehat adott: ugy megval6sitani a dll csereket, hogy ha helyettesitsek egymast, de ha nem akarjuk, akar egymas melle tobb verzi6t feltehesstink! Ez ut6bbi helypazar16, de biztonsagos megoldas, es rna mar nagyobbak a hattertarak, mint nehany evvel ezelott. A feltigyelt k6d erre megoldast kinal az assembly letrehozasavaI.
7.2. A szerelveny A szerelveny (assembly) egy vagy tObb fajl egytittese, melyeket kbzos verzi' informaci6val latunk el, es egyiitt telepitiink. Az assembly a .NET alkalmazas els~ epitoeleme, melynek egyik legfontosabb feladata a k6d biztonsaganak biztosftasa. Ha a Solution Explorerben vagy az Object Browserben a dll-ek elotti ikonra mutatunk, a ToolTip ablak assemblynek nevezi oket. Egy dll vagy egy exe gyakran egy szerelvenyt alkot.
7.2.1. Az internal hithat6sag Az internal larhat6sagu tagok csak az adott szerelvenybol erhetok eI. Tehat b6vebb a hozzaferestik, mint a private tagoknak, hisz az assembly tObbi osztalyai is hozzafernek, de sziikebb, mint a public tagokenak, amiket barmely mas assemblybol is elerhettink. Ha a protected larhat6saghoz hasonIitjuk, akkor abban az esetben, ha az ut6doszta1y es az ososztaly egy assemblyben van, akkor az internal hozzaferes a bOvebb, hisz az assembly nem ut6dosztalyai is hozzaferhetnek. Azonban, ha az ut6dosztaly masik assemblyben talalhat6 - pI. a Form a System.Windows.Forms.dIl assemblyben, mig a MyForm a My.exe assemblyben -, akkor a protected lcithat6sagu tagokhoz hozzafer az ut6d, mig az internalokhoz nem. Ezert van szlikseg a protected internal Iathat6sagra, melyhez az assemblybol es az ut6dosztalyokb61 is hozzaferhettink. Az uj lathat6sagok bevezetese a k6d biztonsagat szolgalja.
7.2.2. A managed k6d A kbztes k6dra fordftott osztalykbnyvtar elonye a ktilonbozo operaci6s rendszerek klilbnbbzo platformjain tOrteno futtathat6sagon kivtil az, hogy az egyes nyelveken irt alkalmazasok nemcsak objektumok Ietrehozasara hasznalhatjak osztalyaikat, hanem akar sajat osztalyokat is szarmaztathatnak beloltik. Ahhoz, hogy a CLR biztosftani tudja szolgaItatasait, a nyelvi fordft6knak metaadatokat kell a k6dba frniuk.
108
7.2. A
az alkalmazas k6djat es eroforrasait tartalmaz6 EXE vagy DLLgyiijtemenye. Az assembly onleiro adatokat, un. manifesztet is az assemblyben talalhat6 k6d es erOfomlsok leirasa metaadatok Ax assembly gyakran egyetlen fajl - EXE vagy DLL -. Egy projekt assemblynek fe1e1 meg. Bar az assembly gyakran egy fajlban talaIhat6, hogy az assembly t6bb, azonos konyvtarban talalhat6 fajl logikai gyiijtemenye. Az assemblyt alkot6 fajlokat leir6 manifeszt vagy az egyik EXE- vagy DLL-allomanyaban talaIhat6, vagy pedig maga kiilOn, iinrotagli Ui1U alkot egy EXE- vagy DLL-fajIt.,,1 tehat feIiigyelt k6du dll, exe faji vagy ezek gyiijtemenye, mely a mU£,.~,"U"~"l:;"" adatokon kiviil metaadatokat is tartalmaz. Asz~relveny
rnanifesztjet az ILDASM.exe segitsegevel nezhetjiik meg. Az exe fajlt l~g,egYMe~rtil)be:n a Start meniibOl indithat6 Visual Studio .NET Tools alatti Visual Command Prompt ablakb61 indithatjuk ugy, hogy begepeljiik a nev~t a f~ ':lANiFEST
~
~-
~
~
i3J@l@ID
.asselllbly extern Microsoft.Ink (
.publickeytoken .uer 1:0:2201:2
=
(31 8F 38 56 ilD 36 4E 35 )
}
... class: pubtic auto ansi beforefiellf!l'lil .,' e!dends (System.Windows.Forms]System.Windows.Forms.Panel inkOver!ay: private class IMicrorofLlnklMicrosofLlnk.lnkOverlay .clor: voidO
i
EO". SignForm
1'--" .cIass public aulo ~nsi belorerleldirul
.asselllbly extern CIlScorlib (
.pUblickeytoken .uer 1:0:5000:0
\ ". 1abeIZ: private class [Syslem.Windows.Forrm]Sysl;em.WlI1do1'/s.Forms,label
t·,-. IabeJ3: private class [SystemWindows.Forms]Syslem.WlI'ldows.Forms.LabeE (,-.$ 1abe14: ptivate class [System. Wmdows.FotmS]System. Windows.Forms.Labei $ 1abe15 ~ ptivate class [System.WlIlciows,Forms]system.WlIldows.Forms.Label . $- labelS; private class (System.Windows.Forrns:]System.Wl!"Idows.Forms.Label Iabel7: private class [System.WlI'lC!ows.FormsJSystem. Wndows.Forms.Label roameT eldBox: private class [System.Windows.FarmsJSystem.WlIldows.Forms.T extBoK szigTextBOK: private class [System.Window.s.Forrns:JSystem.Windows.F arms. Te)(t8 OK 1 .••ctor:voidO
i-..
'. '* (_. +
. -+
L. Dispose: void(booij i-a InitialireComponent: voidO ~-D Main:voidO
(87 7R
5C
56 19 34 EO 89 )
}
.asselllbly extern
Systelll.Dra~ing
(
.pubUckeytoken = (80 3F SF 7F 11 D5 OR 3R ) .ver 1:0:5000:0
'_,,<$ componen\s: private class [System]SystemComponef\lModetContainei t-.•• inkPaneI: private classSign.lnkPanei :'" ¢. Iabet1 : private class [System.Wmdows.FOfms}System.Wmdows.Focms.Label
=
}
.assembly Sign (
.CUStOIll instance uoid [CIlScorlib]System.Reflection. .custOIl'l instance void (mscorlib]Systelll.Reflection. .CUStOIll instance void [mSCorlib]Systelll.Reflection. .custom instance uoid [ro.5corlib]System.Reflection. .CUStOIll instance uoid [lIlscorlib]Systelll.Reflection • .custom instance void [mscol'"lib]Systelll.Reflection. II --- The following custom attribute is added aut II .CUStOR instance uoid [m5corlib]Systelll.Diagnos 1/ .custom instance void [mscorlib]SystePl.Reflection.Rssl .CUStOIll instance uoid [PlScorlib]systefll.Reflection.Rss, .CUStOIll instance void [PlSCorlib]Systelll.Reflection.Rssl .custom instance void [mscorlib]System.Reflection.Rss' .hash algorithlll Ox00008004 .ver 1:0:1648:34948 mresource public sign.InkPanel.resources
7.4. abra A Sign alkalmazas manifesztje az ILDASM-ben Koztes k6du fajl nem fog vegrehajt6dni, ha nines assembly manifestje.
1 David
S. Platt: Bemutatkozik a Microsoft .NET, Szak Kiad6 Kit, Bieske, 2001, 51-52. old.
109
7. A DLL es a
7.2.4. Privat es osztott szerelveny A privat szerelveny (private assembly) csak a vele azonos konyvtarstrukturab6l (tbbbnyire azonos konyvtarb61) erheto el, csak egy alkalmazas hivatkozhat n1. Ez szerelveny keszitesekor az alapertelmezes. a Az osztott szerelveny (shared assembly)t tbbb alkalmazas is hasznalhatja. Az osztott szerelvenytt a global assembly cash-ben (GAC) taroljuk, es eros nevvel (strong name) latjuk el. A global assembly cash egy konyvtar, a Windows / assembly nevii kbnyvtara. Ha megnezzlik, itt talaljuk a System nevterek dll-jeinek szerelveny fajljait. Minden szerelvenynek van neve, verzi6 szama es kultura informaci6ja. A kultura informaci6 opcionalis. Az eros nev az osztott assembly azonosft6ja. A neven, a verzi6 szamon, es a kultura informaci6n kfviil egy nyilvanos kulcsu azonosft6b61 es digitalis alafrasb61 au. Ha megnezztik az eddigi alkalmazasaink hivatkozott system nevtereinek tulajdonsagait, le'ithatjuk, hogy Copy Local tulajdonsaguk false, es Strong Name tulajdonsaguk True. Ha pedig kinyitjuk a GAC konyvtarat, akkor hithatjuk a nyilvanos kulcsokat is a Public Key Token oszlopban.
Description:
System.Drawing.dll
COPYright:
Copyright (C) Microsoft Corporation 1993-20(
Item name: Comments com~t.Name
Value: System.Drawing,dll
1mb)!" Language
legal Trademarks Original Filename Product Name Product Version
7.5. abra A System.Drawing assembly tulajdonsagai a Windows / assembly konyvtarban Ha viszont egy sajat dll-t hivatkozunk az alkalmazasunkban, akkor annak alapertelmezett Strong Name tulajdonsaga False, es Copy Local tulajdonsaga True. A sajat assembly alapertelmezesben egy privat assembly, hiaba is keresstik a GACben. A privat assembly dll fajlje'it celszerii az alkalmazassal azonos kbnyvtarban elhelyezni, mert telepfteskor, torleskor ez leegyszerusfti a feladatokat. (Nezztik meg az alkalmazas 'bih /Debug alkonyvtarat, ott Iesz a Sajat.dll!) Ha nem masoljuk 110
7.2. A "7P.I·plv,i>nv vagyis a Copy Local tulajdonsag False lesz, akkor nem kesziil tSo!!W;:i:l Sajat.dll-rol az alkalmazas konyvtaraban, de akkor biztosftanunk kell, ~{)l~Vc~:ai!c~le])ft~~tt gepen azonos legyen a fejlesztoi geppe* a konyvtarstruktUra, es uttal rendelkezzen a Sajat.dll. Ez intranetes alkalmazasok eseten, _.... 'lTor egy vallalat minden gepe azonos mOdon lat egy konyvtarat praktikus lehet, kortilmenyes feladat. j
f2.~: Verzi6 szam
A.hli§z",hogy az egyiittmiikOdo komponenseket kezelni tudjljOO-,. meg kell kiiio~?,o~tetni az egyes valtozatokat a fejlesztes soran. Erre a feladatra alakult ki a verzioszam. Az ujabb komponens magasabb verzi6szamot kapott. A programozasban fratlan szabaly, hogy a magasabb verzi6szamu, teMt ujabb komponens ny6jtsa a regi szolgaItatasokat. Ennek a szabalynak a szoftverek jelentos resz~~n megfelelnek, azonban az egyre osszetettebb felhasznalas soran egyre gyalg.libban fordul elo, hogy bizonyos specialis esetekben az uj verzi6 nem ny6jtja a regis~olgaltatasainak egy kis reszet. ' Akozosen hasznalt dll-ek eseten a .NET elotti idokben az uj verzi6 megjelenesevel a r6giverzi6 feliilfrasa volt a szokas. Igy nem taroltuk ugyanazt a k6dot Wbb peldlinyban a, gepen. A kompatibilitasi problemak azonban egyre gyakrabban jelentkeztek. Uj programok telepftesekor az is eloforduJt~ hogy az uj program telepftoje regebbi verzi6ju dll-t tartalmazott, es bar rakerdezett, hogy feliilfrja-e a telepftesi hibak miatt gyakran feliilfrtak a magasabb verzi6szamu dll-t egy regebbivel. Ennek hatasara az ujat kfvan6 program nem miikodott helyesen. Az egyik program telepftese elrontotta a masik miikOdeset. A hiba g~an a telepftes utan hosszu idovel jelentkezett, fgy senki nem gondolt erre az okra. Az ilyen problemak egyre tobb felhaszna16 es fejleszto idejet toltottek ki bosszant6 hibakeresessel. A .NET komyezethez a Microsoft egy szabvanyosftott verzi@kezelest val6sftott meg, mely lehetove teszi a ktilOnbozo verzi6k egyidejii tarolasat nem csak privat assembly eseten, de a GAC-ban is.
Akompatibilitasi verzi6 negy szamb61 all. •
major version - fo verzi6szam
•
minor version - masodlagos verzi6szam
•
build number - fordftas sorszam
•
revision - revfzi6 szam
111
7. A DLL es a szerel A verzi6szamot szerelveny manifesztjeben' talaljuk. A fejlesztes soran Assemblylnfo.cs fajl tartalmazza a verzi6 letrehozasahoz sztikseges ,',.,'T~~_---"V1\" A build number es a revision helyettesftheto *-al is. Ez esetben a fordft6 ertektiket. [assembly: AssemblyVersion("l.O.*")]
A manifesztben talalhat6 verzi6 a fordftas utan pI.: .ver 1:0: 1716: 19100. Az assemblyt hasznal6 masik szerelveny ford/ftasa soran szinten a manifesztben megadja a sziikseges assembIyk verzi6szamat. Igy futtataskor pontosan lehet tudnj hogy az esetlegesen tbbb azonos nevil csak verzi6szamban kiilbnbbzo assemblyb61 meIyikre van sziikseg az adott program futasakor (8.1. abra).
Az assembly technibival biztosithatjuk, hogy az adott osztott szerelveny az alkalmazasok altaI kbzbsen haszmHt Iegyen, sot a verzi6informaci6val meg azt is meghatarozhatjuk, mely verzi6tartomanyon beliil helyettesftheto, es mely esetben nem. Masreszrol a sajat dll-jeinket nem kell kitenniink a feliilfras veszelyenek, ha privat assemblykent hozzuk letre oket. Ez tehat nbveli a biztonsagot, es egyszeriisfti a telepitest es tbrlest, hisz egy alkbnyvtar bsszes fajljat masoljuk a telepftes soran, es bsszes fajljat tbrbljiik az alkalmazas eltavolftasakor. A hagyomanyos registry regisztraci6 .NET alatt nem sztikseges.
7.3. Teszt 1.
A nevterek hierarchiaja egyfajta logikai csoportosftasa az osztalyoknak, a dll-ek egy masik logika szerint csoportositjak oket.
2.
A dll dinamic-linked libraryt jelent, vagyis a dll-ben tarolt osztalyok k6dja nem nbveli az exe fajl meretet, es futasid6ben az eppen aktualis dB tblt6dik be a mem6riaba.
3.
A dll metaadatok nelktil is futtathat6, csak akkor a futas elejen meg kell adnunk az adatok erteket.
4.
A dll osztalyait barmely .NET programozasi nyelvb61 hasznaIhatjuk objektumok letrehozasara, de szarmaztatni beloliik csak ugyanazon a nyelven lehet, amiben fr6dtak.
5.
A privat assembly dU-t telepiteskor regisztraItatni kell a regisztryben.
6.
Hibas dll cserejekor ujra kell forditani az ot haszna16 alkalmazasokat.
7.
Az exe az altala haszmllt dll nelkiil nem vagy csak reszlegesen mukbdik.
I
A manifesztr61 bOvebben az OsztaIykonyvtar keszitese, 8.1.2 szakaszaban olvashatunk.
112
7.3. Teszt Studioban a Solution View References alatt taIaljuk az adott projekt la"L-'''~'' dll-eket. assemblyt a GAC-ben taroljuk. jteI'llal hithat6sagli tagok az assemblybOl hozzaferhetoek, azon kivulrol nte<;tea internal lathat6sagu taghoz hozzaferhettink az assemblyt hasznal6 1malzas minden olyan osztalyab6l, mely a tagot tartalmaz6 osztaly ut6da.
113
8. Osztalykonyvtar keszitese Az elozo fejezetekben megismertiik a komponensalapu programozas elvet, es keszitettiink dinamikus osztalykonyvtarakat (dll) felhaszna16 alkalmazasokat. Ebben a fejezetben megtanulunk osztalykonyvtarat kesziteni.
8.1. A Class Library fogalma Azokat az osztalyokat, amelyeket tobb alkalmazasb61 is hasznalni szeretnenk, osztalykonyvtarban gyiijtjiik ossze. A dinamikusan szerkesztett osztaIykonyvtarak biztositjak szamunkra, hogy ugyanazt a dll-t tObb alkalmazas hasznalhassa akar egyidoben is. Az osztalykonyvtar onmagaban nem futtathat6 allomany, arra szolgal, hogy oszt,Hyait kiilOnbozo futtathat6 alkalmazasok tudjak felhasznalni. Az osztalykonyvtar koztes kodra (MSIL) vagy nativ k6dra forditott osztalyok gylijtemenye. A nevterek az osztalyok logikai, hierarchiaba rendezett csoportositasat teszik lehetove. Az osztalykonyvtarban tObb nevteret vagy nevterek egy reszet is tarolhatjuk. Jellemzoen a gyakran egyiitt hasznalt nevterek keriilnek be egy dll-be. Az osztalykonyvtar feladata a k6d minel kisebb meretenek biztosftasa is, tehat a gyakran hasznaIt osztalyokat celszerii nehany osztalykonyvtarban implementalni, es a bizonyos esetekben hasznaltakat kiilOn dll-ben megva16sitani. fgy erhetjiik el, hogy lehetoleg minel kevesebb nem hasznalt osztalyt szerkessziink be alkalmazasunkba.
115
8. Osztalykonyvtar keszitese
8.1.1. Az osztalyok lathatosaga A C# nyelvben nemcsak az osztalyok tagjai rendelkeznek lathatosaggal, hanern a Z osztalyok maguk is. Az osztaly alapertelmezett lathatosaga internal. Ez azt jelenti ha nem irunk az osztaly deklaracioban az osztaly eM lathatosagot, akkor osztalYUnk internal lathatosagu lesz. Ez esetben az osztalyt csak az assemblybOl erhetjtik eJ. Osztalykonyvtarunk osztalyait, amiket masok szamara is elerhetave kivanunk tenni public lathatosaggal kell ellatnunk! ' Osztaly az internal es public lathatosagon kiviil mas lathatosaggal nem rendelkezhet.
8.1.2. Elnevezesi konvenciok Mar eddigi fejleszteseink soran is betartottunk elnevezesi szokasokat, de osztalykonyvtar fejlesztesekor hangsulyozottan figyelni kell ezekre, hisz az osztalykonyvtar azert kesziil, hogy masok is felhasznalhassak.
8.1.2.1. A kis- es nagybetiik hasznalata •
PascalCase Az azonosfto elsa betiije es a szoosszetetel minden tagjanak elsa betuje nagybetii, a tObbi kicsi. Nevterek System.Windows.Forms, osztalyok InkPanel, GetChildIndexO, tulajdonsagok BackColor eseten hasznaljuk.
•
met6dusok
camelCase Az azonosfto elsa betiije kicsi, a szoosszetetel minden tagjanak elsa betuje nagybetii, a tObbi kicsi. Privat lathatosagu adattagok mint billButton, fiiggvenyparameterek mint sender, lokalis valtozok mint ar. Az ajanlas szerint a public es protected lathat6sagU peldanyokat javasolt tulajdonsaggal megvalosftani, ami 'Pascal case' frasm6du. Ez megfelel az objektumorientalt programozas egysegbezaras elvenek.
•
UPPER case Az azonosfto csupa nagybetii. PI. System.IO, System.Web.UI I
IMegjegyzes: I Sajnos a fejlesztai kornyezet (egyelare) nem tamogatja az elvek betartasat, mert ha kisbetus privat tagvaltozohoz esemenykezel6
I
MSDN Library, Visual Studio .NET 2003, Capitalization Styles.
116
8.2. Class Library keszitese
met6dust rendeliink, annak neve is kisbetiivel kezd6dik, ha at nem irjuk. Es lustasag fel egeszseg, nem szoktuk atirni. N hasznaljuk ki a nyelv kinalta case sensitivitast az azonosit6k elnevezeseben! Az e talykonyvtarunk akkor lesz teljes ertekii, ha hasznalhat6 lesz case-sensitive es o:~e_insensitive nyelvekb61 egyarant. Vagyis ne keszitsiink azonos betiikb61 a1l6, ~sak a kis- es nagybetiikben kiilonboz6 azonosit6kat! 1 Ha betartjuk az egysegbezaras elvet, akkor az a szokas, hogy C#-ban a kisbetiivel kez oodo (tag)valtoz6 neve megegyezhet a nagybetiivel kezdOdo osztalyanak neveve1, vagy a hozza kapcsol6d6 nagybetiis tulajdonsag nevevel (pI. BackColor backColor), nem mond ellent annak az elvnek, hogy ne hasznaljunk azonos neveket, melyekcsak a betiik kis es nagy voltaban kiilOnboznek. Az osztalykonyvtar felhasz m116i ugyanis csak a public, vagy protected lathat6sagU tagokhoz fernek hozza,az egysegbezaras elve szerint viszont a kisbetiis tagvaltoz6 legyen private, amiaz osztalykonyvtaron kiviilr61 nem lathat6. A kisbetiis lokalis valtoz6k sem !Iithat6k kiviilroi. A fiiggvenyparametereknel mar oda kell figyelni erre az elvre!
8.1.2.2. Azonosit6 kezdetek es vegzodesek Az interfeszek azonosit6ja I betiivel kezd6dik, lDisposable. A kivetelosztalyok Exception taggal vegzodnek, WebException. Az esemenykezelok neve a vezerlo nevevel kezd6dik, amin az esemenyt kivaltottuk, es '_' az esemeny nevevel fejezodik be, BillButton_Click lenne a konvenci6k betartasaval, de a kisbetiis billButton-b61 billButton_Click-et general a Visual Studio. Lehetoseg szerint keriiljiik az azonos azonosit6k hasznalatat! PI. a nevter neve ne egyezzen az osztaly nevevel! Ezt ugy keriilhetjiik el, ha hasznaljuk a nevben az osztaly 6sere vonatkoz6 azonosit6t. Sign nevter, SignForm, de lehetne SignButton, SignPanel, SignView stb. osztaly is. Az azonos nev hasznalata al61 kivetel a konstruktor, melynek neve kotelezoen azonos az osztaly neveveI. De a fiiggvenykepz6 operator, a ( ) megkiilOnbozteti oket.
8.2. Class Library keszitese 8.2.1. Oszhilykonyvtar letrehozasa File menii
New
1 MSDN
Library, Visual Studio .NET 2003, Case Sensitivity.
117
8. Osztalykonyvtar keszitese
Prqjett Project types: Visual C# Projects Templates: Class Library Name:.MyClassLibrary Location: Tobbnyire az el6z6leg beallftott Add to Solution / Close Solution Eddig mindigClose Solution-t valasztottunk, mert onaIl6 alkalmazast fejlesztettiink. Most viszont 'a~Class Library ona1l6an nem futtathat6, tehat kell neki egy futtat6 kornyezet. Ha a futtat6 alkalmazast es az osztalykonyvtarat egymast61 fiiggetieniil kfvanjuk kezelni, akkor a Close Solution valasztasa az indokolt. De ha azt szeretnenk, hogy egyszerre dolgozzunk mindkett6ben, es mindkett6 forduljon Ie, ha m6dosult a k6dja, es most epp a tesztalkalmazas van betOltve, akkor vaIaszthatjuk az Add to Solution valaszt6gombot. Vagy most a Close Solution-t, de a tesztalkalmazas letrehozasakor az Add to Solution-t. ~
Project.WI! be created at C:\CS'\ClassLibraryl \Classlibraryl. OK
Cancel
Help
8.1. abra Osztalykonyvtar projektjenek generaIasa A Visual Studio a kovetkez6 k6dot generalja: using System; namespace MyClassLibrary {
/ /! <surrunary> II! Summary description for Classl. II! public class Classl {
118
8.2. Class
.h.·....
·~1
keszitese
public Classl.() {
II II TODO: Add constructor logic here II }
lIa.;.megnezziik, a kOO csak a System nevteret importalja, es a References is keyesebb osztalykonyvtarra hivatkozik. A legfeltiinobb a System.Windows.Form hianya,Mivel egy osztalykonyvtar magaban nem futtathat6, nem kell rendelkeznie felhasznal6i feliilettel. Termeszetesen, ha akarjuk, rendelkezhet vele. Nem kell mast tenniink, mint a referenciakhoz hozzaadni a System.Windows.Forms.dll-t, es a using System.Windows.Forms; sort a k6d elejere beirni. Ak6d egy iires osztalydeklaraci6 egy iires konstruktorral. Az osztaly nevet meg m6dositanunk kell! Az osztaly k6djat sem lehet helyettiink megirni. . Ha a megszokott Start paranccsal akarjuk felepiteni es futtatni a konyvtarat, az Output ablak Build: 1 succeeded, 0 failed, 0 skipped iizenete utan a kovetkezo ablakjelenik meg. (Ha nines tesztalkalmazas, vagy nema teszt a kezdo projekt.)
8.2. abra Hibaiizenet ablak, ha az osztalykonyvtarat futtatni akarjuk A hibaiizenet tajekoztat benniinket, hogy osztalykonyvtar kozvetleniil nem futtathat6, de ha egy nem konyvtar projektet hozzaadunk a Solution-hOz, es azt beaIlitjuk kezdo projektkent, akkor megold6dik a problema. A hibaiizenetet elkeriilhetjiik, ha a Start parancs helyett a Build menii Build Solution parancsat, vagy a projekt neven (MyClassLibrary) jobbegerrel kattintva a legordiilo meniiben a Build parancsot adjuk ki. Ezt minden alkalommal megtehetjiik, amikor a fejlesztes alatt meg nem akarunk tesztelni, de szintaktikai hibainkat ellenorizni akarjuk.
8.2.2. Egy solution tobb project Keszitsiik el a tesztalkalmazas projektjet! A tesztalkalmazas a szokasos Windows Application, csak most celszeru az Add to Solution gombot valasztani a generalaskor. Ha elfelejtettiik volna az Add to Solution valasztast, vagy egy mar letezQ alkalmazasban kfvanjuk hasznalni osztalykonyvtarunkat, utolag a kovetkezokeppen tehetjiik a ket projekttinket egy solutionbe:
Add Existing project Az ablakban egy csproj kiterjesztesu fajIt kell valasztanunk. Az alkalmazas a mar ismeros Form1.cs [Design] ablakkal jelenik meg. Ha futtatni akarjuk megoldasunkat, bar az Output ablak immar azt frja ki, hogy Build: 2 succeeded, 0 failed, 0 skipped, mindket projekt sikeresen lefordult, megis megjelenik a hibaiizenet ablak. Ha raneziink a Solution View ablakunkra, azt latjuk, hogy a MyClassLibrary vastagon szedett, mig a Test nem. Vagyis kezdo alkalmazasnak a MyClassLibrary van kijelOlve, ami nem futtathato.
Solution View Test jobbeger Set as StartUp Project Ezzel a Test alkalmazast allftottuk be kezdonek, fgy mar futtathatjuk is az alkalmazast. Most a Test van vastagon szedve. Bar most mindket alkalmazast felepfti a Visual Studio, es futtatja is a Test-et, de meg nines koze az osztalykonyvtarunkhoz. Ez a resz viszont mar az elozo fejezet ismetlese, hisz ott megtanultuk az osztalykonyvtarak hasznalatat.
8.2.3. Az oszhilykonyvtar hasznalata A Test References folderehez hozza kell adnunk a MyClassLibrary hivatkozast!
Solution View Test References jobbeger
120
-
8.3. Teszt Add Reference
A Projects lap on megtalaljuk a MyClassLibrary-t. Ha nem akarjuk kiirni a teljesen rninosftett osztalynevet, akkor meg a using MyClassLibrary; sorral a Class1 osztaly nevteret is importaltuk a Test projektbe. Ezzel Test alkalmazasunk k6dja hasznalhatja a Class 1 osztaIy public tagjait.
Bar most mar feivetttik a referenciak koze a MyClassLibrary-t, az be is masol6dott a Test exe-vel azonos konyvtarba, de ha megnezztik a Test.exe manifestjet, nem latjuk benne az osztalykonyvtarat. A fordft6 csak akkor teszi bele, ha a k6db61 hivatkozunk is az osztalyra. Vegytink fel peldaul a konstruktorba egy lokalis objektumot a Class1 osztliIyb61! public Farmi () {
InitializeCampanent() ;
}
Ha most inegnezztik a Test.exe manifestjet, most mar benne lesz a MyClassLibrary assembly hivatkozas.
A ket projekt kozos solutionbe helyezese csak a fejlesztest segfti, az osztaIykonyvtar es a tesztalkalmazas ettol nem kertil kozos assemblybe. A fejlesztes soran viszont sokkal gyorsabb es kenyelmesebb a munkank abban az esetben, ha meg m6dosftjuk a dll k6djat is. Ha ugyaois ktilOn solution-be dolgoznank a ket projekttel, akkor a dll k6djanak fordftasa utan mindig at kellene tolteni azt a masik solutionbe. Vagy ugy, hogy a Visual Studioban valtogatjuk a betOltOtt projekteket, vagy ugy, hogy parhuzamosan ket Visual Studio ablakban dolgozunk, de akkor a tesztelo alkalmazasb61 minden m6dositas utan ki kell venni az elozo dll-t, majd hivatkozni kell a m6dosftott dll-t. Mindket eset nagyon kenyelmetlen es idOrabl6.
8.3. Teszt 1. Az osztalyok, ha nem trunk elejtik lathat6sagot, akkor privat hozzaferesuek.
2. Az osztalykonyvtar azon osztalyait, mel yet mas alkalmazasokb61 el akarunk erni - public lathat6saglira kell deklaralni. 3. A dlliehet assembly, az assembly nem mindig dll.
4. Az osztalykonyvtar felhasznalhassuk.
azert ir6dik,
hogy
osztalyait
tObb
alkalmazasb61
121
8. Osztalykonyvtar keszitese
---
5. Ha olyan public azonosft6kat haszmilunk, melyek csak abban ternek I egymast61, hogy kis- vagy nagybetiivel muk oket, akkor azok case-insensiti: nyelvekbol nem lesznek hasznalhat6ak. e
6. A Form osztalyok neveben szerepelnie kell a Form vegzOdesnek (SignForm JelszoForm), mert ennek hianyaban a fordit6 nem tudja, hogy itt egy Form osztalyr61 van sz6. 7. Ha a Solution-ben egy osztalykonyvtar van kijelOlve StartUp projektnek, akko r futtataskor hibauzenetet kapunk. 8. Ha a Solution tObb projektbol all, akkor a kozos forditas soran egy k6ztis assembly keletkezik, mely tartalmazza az osszes projekt fordftasakor keletkezo allomanyt. 9. Amikor felveszunk egy dll-t a projekt referenciai koze, akkor a projekt assemblyjenek manifesztjebe bekeriil a dll hivatkozasa. 10. A dll omill6an nem futtathat6 allomany, ezert a generalasa soran az Add to Solution-t kotelezo valasztanunk. Javit6ku1cs: H, I, I, I, I, H, I, H, H, H.
122
9. Windows vezerlo keszitese A Windows Control Libray vagy vezerl6 konyvtar, amint a neveben is benne van, az osztalykonyvtar egy specialis esete. Amig az osztalykonyvtar tetsz6leges osztalyt, osztalyokat tartalmazhat, amelyek a felhasznal6 k6djab61 elerhet6ek, addig a Control Library kifejezetten egy vezerl6 k6djat tartalmazza. Ez nem jelenti azt, hogy a k6d nem tartalmazhat a hlitterben megirt tovabbi osztalyokat, s6t osszetett vezerl6 eseten tovabbi vezerl6ket is, a konyvtar celja megis az uj tObb alkalmazasban hasznalhat6 vezerl6letrehozasa.
9.1. A Windows Control Library Uj vezerl6t uj projekt letrehozasakor a Windows Control Library template valasztasa segftsegevel keszithetunk.
9.1.1. A vezerlo felhaszmil6i feliilete Lenyeges kiilOnbseg az osztalykonyvtar letrehozasahoz kepest, hogy a generalt projekt egy felhasznal6i feliilet szerkeszt6vel - [Design] ablak - jelentkezik be. A vezerl6 ugyanis, mint a neve is mutatja, az alkalmazas lefutasanak vezerlesere alkalmas osztaly. Feladata, hogy iranyitsa az alkalmazas vegrehajtasanak m6djat. Napjaink felhaszna16ja igenyli, hogy beavatkozhasson az alkalmazas vegrehajtasaba, ehhez a vezerl6nek felhasznal6i feliiletet kell kfnalnia. A Visual Studio avezerl6k felhasznal6i feliiletenek szerkesztesere ugyanazt a komyezetet biztositja, amit mar megszokhattunk a formok szerkesztese soran. 123
9. Windows vezerH:i keszitese
9.1.2. A vezerlo osztaly ose Ha
a
fornlsk6dot
nezzUk
(jobbeger, View Code), hithatjuk, hogy WindowsControlLibraryl nevterben letrehozott UserControll osztalyunk a System. Windows. Forms. UserControl osztaly ut6da. Tehat nem egy egysze~ Ures konstruktorral ellatott osztalyt generalt a Visual Studio, hanem egy olYa osztalyt, mely felhasznal6i felUlettel rendelkezik, es biztosftja a UserControl Osztal~ szolgaltatasait.
9.1. abra A UserControl osztaly osei A UserControl osztaly ose - a Form osztalyhoz hasonl6an - a ContainerControl, melynek ose a ScrollableControl, annak pedig a Control. Az osoknek koszonheto, hogy a Form-hoz hasonl6an tud vezerloket kezelni, es orokWtt Controls tulajdonsagan keresztUl vezerloi akar tOmbkent is kezelhetoek, amint arr61 az 5.2.4 szakaszban mar olvashattunk. Az ososztalyok biztosftjak az Uzenetkiildo mechanizmust, eger, billentylizet, valamint mas esemenyekhez val6 hozzaferest.
9.1.3. Sajat vezerlo felepitese A Windows Control Library az osztalykonyvtarhoz hasonl6an nem futtathat6 ona1l6an. Az assemly keszfteshez hasznaljuk a Build menU Build parancsait vagya WindowsControlLibraryl Build parancsat, mely letrehozza az alkalmazasokb61 felhasznalhat6 dll allomanyt.
IMegjegyzes: I A Visual Studio .NET segitsegevel letrehozott vezerlo komponens a dll kiterjesztest kapja. Azonban a COM alapu ActiveX vezerl6k, jelezve, hogy speciMis osztalykonyvtarr61 van sz6, ocx kiterjesztesiiek. Tehat, ha egy ocx kiterjesztesii fajllal talalkozunk tudjuk, hogy egy ActiveX vezerlot tartalmaz6 osztalykonyvtarat latunk. 124
9.2. Sajat vezerlo felhasznalasa m51ii,:/,~.tUat
vezerlo felhasznalasa
k6nyvtarunk alkalmazasb61 t6rten6 felhasznallisat legegyszeriibben egy tei;2:taUka1lmaZa~;~al pr6balhatjuk ki. Ismerve a projektek k6z6s solutionben Wrten6 Kei(~iest:l1C;'l\. el6nyeit, celszerii a fejlesztes soran tesztalkalmazasukat a vezerl6 kony:vtarral k6z6s solutionben - esetleg a vezerl6 alk6nyvtara alatt - letrehozni. Vim""",
Toolbox My User Controls ~-~~
-~
,-.
~--~---
I~
-
~
~
I~
~---
~-
---
~
-~~
~-
~
I~
~ Pointer l4$u~~~cont;~il-------
Pointer r&LJserControll
Data --.J","~ Components Windows .Forms II General
-.J JJ
~5er,,,
-
Toolbox My User C~~trols
~TOol:·,r
Data Components Windows Forms General
.J~
I
,:;·1
J
~5er", *To~l.,.r
9.2. abra A UserControll vezerl6 a Toolboxban baloldalt egy solution eseten; jobboldalt, ha hozzaadjuk a Toolbox eszk6zeihez Ha ezf a technikat hasznaIjuk, akkor tesztalkalmazasunk Toolboxanak My User Controls kateg6riaja alatt meg is jelenik a sajat vezerl6nk, amint azt a baloldali abra mutatja. Ha a tesztalkalmazasunkat kezd6 projektkent allftjuk be, vezerl6nket a form feliiletere hUzva mar ki is pr6balhatjuk az uj vezerl6t. Azonban, ha mas alkalmazast indftva kinyitjuk a Toolbox My User Controls kateg6riajat, abban nem lesz bent az uj vezerl6. Azt is nezziik meg a k6dban, hogy a vezerl6 formra hUzasaval a tesztalkalmazas references listajaba bekertilt az uj vezerl6t lerr6 dll!
9.2.1. Sajat vezerlo a Toolboxban Tetsz6leges alkalmazas Toolbox ablakanak My User Controls kateg6riajat nyissuk kit Az eger jobbgombjaval a meniit leg6rdftve:
Add / Remove Items A .NET es a COM komponensek a megfelelo fiilet valasztva, a sajat vezerlok a Browse gomb segitsegevel erhetok eI. A Toolbox abra jobboldali kepe mutatja a sajat vezerl6t a Toolboxban, miutan felvettiik a vezerl6k k6ze. Ezutan a beallftas utan minden alkalmazas hozzafer a vezerl6nkh6z egeszen addig, mig ki nem WrOljiik a Toolboxb61.
125
---
9. Windows vezerlO keszltese
Ezzel a technikaval termeszetesen a Toolbox barmely kategoriajaba felvehettink vezerloket, a sajat vezerloket megis ktilbn kateg6riaba szoktuk tenni.
I• Vegytik eszre, hogy itt tovabbi, a Toolboxban eddig nem latot1' vezerlok allnal< rendelkezeslinkre! Peldaulia COM kateg6riaban rendelkezeslinkreall egy olYan ProgressBar vezerlo, melynek Appearance kateg6riaban megjeleno Scrolling tulajdonsaga ccScrollingSmooth ertekiire allfthat6, s fgy folyamatos kijelzesu lesz.
!Megjegyzes:
I A Toolbox gyorsmentijeben talalhat6 egyShow All Tabs meniipont~ melynek hatasara a Toolbox tovabbi oldalai jelennek meg. A beallftas ugyanitt ki is kapcsolhat6.
9.2.2. A saJat veze.rlo tulajdonsagai A Visual Studio fejleszto kornyezet szolgaltatasa, hogy a vezerlok felhasznalasakor tulajdonsagaikat megjelenfti egy Properties ablakban. A tulajdonsagok kezdeti beallftasai szerkeszthetok a Properties ablakban. Welcome to the C# Add Property wizard This wizard adds a property to your C# class.
~operty
Property gccess:
type:
-'------,_:..1 lm.----------_;J
pu-'-'bli-'
ccI
r..J
Property !lame:
!Tulajdonc-';"CC"g--
-
Properties;
_
_
-
®
Accessors:
(". get ('
~et
(.'
g~t/set
, Property modifiers:
r.
NQne (~ Statle (- Y.irtual ("
. Com.ment fJI notation net required):
, JA tulajdonsaghoz megjegyzest is fuzhetunkl
I±l Location
32;24-
El Size
128; 56·
B
Finish
J
!'-';-o(
Cancel
9.3. abra Tulajdonsag letrehozasa a vezerl6 projektben, es megjelenese a tesztalkalmazas ban
126
.
9.2. Sajatvezerlo felhasznalasa private int t; / /:' <surrunary-.>
III
A tulajdonsaghoz megjegyzest is fuzhetunk!
!! / public int Tulajdonsag {
get {
return t; }
set {
t=value; } }
A tulajdonsag esak az elso fordftast k6vetoen jelenik meg a veterlo tulajdonsaglapjan. Ez ertheto, hisz a felhaszna16 k6d a dll-bOl epftkezik. Ha nem vettiink fel sajat tulajdonsagot a vezerlonkh6z, 6r6kl6tt tulajdonsagai akkor is beallfthat6k a tulajdonsaglapon. A beallftott tulajdonsag kezdoerteke az InitializeComponent () k6djaban ellenorizheto. private void InitializeComponent() {
this.userControlll.Tulajdonsag = 5; }
A tulajdonsag kezdoerteke esak akkor allfthat6 be, ha van a tulajdonsag m6g6tt tagvaltoz6, ami az erteket tarolni tudja. Atulajdonsagok a tulajdonsaglapon kateg6riankent vagy abc sorrendben jelennek meg a megfelelo eszk6zgomb valasztasat6l fiiggoen. Az altalunk felvett tulajdonsag a Mise kateg6riaba keriil. Ha mi akarjuk megvalasztani a tulajdonsag kateg6riajat, azt a kOdban kell eM frnunk! 1II~'JllJI public int Tulajdonsag
-OJ kateg6riat is letrehozhatunk:
127
9. Windows vezerlO keszitese
~
PrOl!erties
I userControlll
WindowsControlLibr ary 1,UserControll
=:]
~~~j Dock
None
I±J DockPadding
I±I location
32; 24
I±I Size
128; 56
Tula!donsag
c
'"
5
Tulajdonsag
9.4. abra A tulajdonsag kateg6riaja egy uj kategoria
9.2.3. Sajat vezerlO ikonjanak beallitasa Ezt a System.Drawing. ToolboxBitmapAttribute osztaly segitsegevel tehetjiik meg. Az osztaly konstruktora egy 16x16 keppontos bitmapet var, mely erOfomiskent van beeptilve a projektbe. A ToolboxBitmapAttribute osztaly GetImage metodusa egy kis 16x16-os vagyegy nagy 32x32-es keppel tud visszaterni, melyet a kis kepbOl keszit. Adjunk a vezerl6 projekttinkhoz egy 16x16 pixeles bitmapet! A projekt neven jobbeger Add Add Existing Item Files of type: Image Files kijeWljiik a fajlt (net. bmp) Open Allitsuk a net.bmp allomany Build Action tulajdonsag
128
9.3. Alkalmazasok beepitese a programba -
A'allfe1epftese
utan az ikon csak akkor valtozik, ha a ToOlbox-ba ujra beszurjuk az uj komponenst. A Costumize ToOlboX ablak listajaban mar szerepel a UserControll, de az gyregebbi verzi6. A Browse gomb segftsegevel ujra fel kell ~enniink a listara, es legyen kijelOlve ahhoz, hogy bekeriiljon aieszkozgombok koze! Lathat6an az uj vezerl6 ikonja az altalunk keszftett kep. S6t, a vezerl6 kijelolesekor a szetkeszt6feliileten a kurzor mellett is megjelenik az ikon. 9.5. abra A vezerl6nk a harom ikonnal a Toolboxban
--
-"
-----
Toolbox
My,Ws~~i26ritr~~'
~
'I.$J
~;~piPt1r>' ','< . , . ",IJ~rConJroll ..
I;net UserControll
,.
·~~~.i;JI,~
I;D:c::ilo:;::tili.c:!
Windows Forms.
I I
General
I
components.
~ ser'1 .. ,~ T66i.LT
Az egy solutionben hasznalt vezerl6 frissiil a tesztalkalmazasban. Ez a Solution szolgaltatasa. A Toolboxban mar kesz vezer16ket szokas felvenni, s azok a felvetel pillanataban aktualis verzi6ju vezerl6k. Ha m6dosftunk rajtuk, az el6z6 verzi6 torl€se utan vagy amelle az uj verzi6t is fel kell venniink, hogy hasznalhassuk alkalmazasaink fejlesztesehez.
Az altalunk m projektekben alapertelmezesben teljesiil, de nem
art
tudni, hogya miikodes feltetele a szerelveny (assembly) es a nevter nevenek megegyezese. A fent lem beallftasok barmelyikenek hianya hibahoz vezethet. A hiba kovetkezteben eltiinhet a vezerl6 a szerkeszt6 [Design] ablakb61 es az alkalmazasb61. A hiba javftasat a gyakorlat lefrasaban talaljuk.
OJ
I~\
A gyakorlat 5. feladatanak megoldasaban latunk peldat a megval6sitasra.
9.3. Alkalmazasok beepitese a programba Az eddigi fejezetekben volt sz6 arr61, hogyan indfthatunk mas alkalmazasokat
programunkb61, es hogyan tudjuk 6ket a mi alkalmazasunkb61 kezelni. Az elozoekben pedig lattuk, hogyan keszithetiink es hasznalhatunk a Toolboxb61 olyan komponenseket, melyek egy vezerl6t val6sftanak meg.
A Toolbox egy tovabbi szolgaltatast is nylijt a fejleszt6knek. Lehet6ve teszi beagyazott alkalmazasok inditasat az altalunk fejlesztett programb61. Technikailag a megval6sitas nem ter el a vezerl6 felvetelet61 a Toolboxba. A Toolbox kivant kateg6riajat megnyitva, a gyorsmeniib61 az Add/Remove Items meniipontot valasztva a .NET vagy a COM oldalon talaljuk a rendelkezesiinkre all6 komponensek listajat.
129
9. Windows vezerlO keszitese
Tartalmilag azonban ebben az esetben masr61 van sz6, mint a vezerlo felvet I eseten. Egy alkalmazas fejlesztesekor beallfthat6, hogy az adott alkalma;,e tartalmaz-e kontener (container) szolgaltatasokat - vagyis a fejlesztes sor~s epfthetiink-e be mas alkalmazasokat -, illetve szerveralkalmazas (serv~ szolgaItatasokat, vagyis alkalmazasunk beepftheto-e mas alkalmazasokba. Ez ut6b~~ szolgaltatas teszi lehetove, hogy egy alkalmazas mas alkalmazasok kiszolgal6jaken: (server) mlikodjon. Ez esetben tehat nem egy vezerlot hasznalunk alkalmazasunkb6l, hanem egy specialis - vezerlo tulajdonsagokkal rendelkezo _ szerveralkalmazast epftiink be mint szolgaltatast. A COM oldal listajan taIalhat6 a Windows Media Player komponens. Ennek segftsegevel a Windows Media Player alkalmazas szolgaltatasait vehetjiik igenybe a sajat alkalmazasunk egy ablakaban. Lejatszhatunk vele videofajlokat es hangfajlokat. Hangfajlok eseten ha az objektum lathat6sagat (Visible tulajdonsag) hamisra allftjuk, akkor hasznalhatjuk az eszkozt az alkalmazasunk alatt futtatott hangfajlok indftasara anelkiil, hogy a felhasznal6 tudna, hogy a hangokat a Windows medialejatsz6ja segftsegevel hallja.
t
11\
A gyakorlat 8. feladataban l.ltunk peldat hasznalatara.
COM komponens a Microsoft webbongeszo is, amivel internetes oldalakat tehetiink be az alkalmazasunk egy ablakaba.
)~~
11\
A gyakorlat 10. feladataban latunk peldat hasznalatara.
9.4. Teszt 1. Minden class library Windows control library, de nem minden Windows control library class library. 2. A Windows control library nem futtathat6 ona1l6an. 3. A sajat vezerl6t nem mutatja a Toolbox, a References listara felveve a k6db61 hivatkozhatunk ra. 4. Ha a sajat vezerl6 projekt es az azt felhasznalni kfvan6 projekt egy solutionben van, akkor a Toolbox mutatja a sajat vezerl6t. 5. A Toolboxba felvehet6k tovabbi, a Microsoft vezerl6k.
~iltal
rendelkezesiinkre bocsatott
6. A sajat vezerl6 objektumanak tulajdonsagai megjelennek az objektum Properties ablakaban, es kezdoertekiik beallfthat6. 7. A tulajdonsag a Misc kateg6riaba keriil alapertelmezesben, de megadhatjuk kateg6riajat, mely csak a letez6 kateg6riak valamelyike lehet. 130
9.4. Teszt Ilaicjonsag ikonjanak megadasahoz egy 32x32 pixeles bitmapre van szukseg. oolbmcba b
I, I, I, H, H, H.
131
10. Adatbazis-eleres Az eddigi egyszerii problem
Ket klilOnbOzo adatbazis-kezelot vizsgalunk, ezzel azt is bemutatva, hogy a ktllonbozo adatbazisok val6ban egyseges feltileten erhetok el. A Microsoft SQL Server, mint a nevebol is kiderlil, az adatok szerverben tOrteno tarolasat es elereset tamogatja, mig az Access adatbazis fajl a Data Connections alatt erheto el. Microsoft ajanlas szerint kis, nehany felhasznal6s alkalmazasok eseten hasznalhatjuk a Microsoft SQL Server X.X Desktop Engine-t, mely a Microsoft Office XP Premium resze, vagy a Visual Studio 6-os verzi6janak telepito CD-in megtalalhat6. A Desktop Engine a Visual Studiob61 az SQL szerverhez hasonl6an hasznalhat6. Optimalis felhasznalas eseten legfeljebb 5 egyidejii felhasznal6
133
10.
Adatbazis-elt~res
csatlakozasa engedelyezett, mely a fejleszteshez es teszteleshez elegendo. segftsegevel Ietrehozott adatbazis modosftas nelktil futtathato SQL Server alatt.!
IMegjegyzes: I A Microsoft Campus csomag tartalmaz egy Microsoft SQL Server Desctop Engine-t. Telepftesehez a Visual Studio .NET telepftese soran ki kell je16lni ezt az elemet. Kesabb a Visual Studio.NET / Add or Remove Features / SQL Server Desctop Engine / Update Now segftsegevel keszfthetjtik ela a telepftest. Majd a telepftocsomag 3. CD-jen a Program Files \ Microsoft Visual Studio.NET \ Setup \ MSDE \ setup.exe (SQL Server Setup Microsoft Corporation) fajl futtatasaval telepfthetjtik. Az SQL Server a gep ujraindftasa utan automatikusan elindul. Default neve VSdotNET. Futasat az asztal jobb sarkaban egy ikon jelzi.
Telepftett SQL Server eseten a talc a jobb szelen megjelenik az SQL Server Service Manager. Ha zold nyilat latunk rajta, akkor fut az SQL Server. Az eszkiiz segftsegevelleallfthato vagy elindfthato.
Selyer:
/SIPOSWSdotNET
Services:
JSQL Server
Refresh services...
~ " "'."
L..:.....••• ..••.•.
i rv
'
""
~
..:J
N:J I
~ Eo",e ~
Stgp
auto-start selvice when as starts
Running :\\sjpOS\VSdotNET-MSSdLServer
10.1. abra Az SQL Server fut A Microsoft SQL Server, ha fut a geptinkon, vagy egy szamunkra eIerheto szerveren, akkor a Visual Studio Server Explorer segftsegevel elerheta. A Server Explorer a Visual Studio ablak bal szelen a Toolbox ikon mellett talalhato. Kepe ket monitor. Ha nines megnyitva az ablak, a View menii Server Explorer meniipontjaval nyithatjuk ki.
!
MSDN Library for Visual Studio .NET, Selecting a SQL Server Data Source. 2001.
134
10.1. Az adatbazis letrehozasa
A$erver Explorer ablak mutatja a gepen fut6, vagy tavoli eleresii szervereket es datkapcsolatokat. A fut6 szerverek kozt talalhat6k az SQL szerverek es azon beliil a ~onkret SQL Server. Neve alapertelmezesben azonos a szamit6gep nevevel. -
employee jobs ['3'" pubjnfo III pubjd , .. III logo III prjnfo $ . . I[) publishers !±j.. I[) roysched ttl I]) sales iB. · I[) stores [±] I[) otleauthor • Eli· I[) titles 8··· Views . it} @ titleview Stored Procedures [±]
[±].
!%
ttJ
!% .. !%
__~_.__. .__. :. .
::h- flli ~ !l" Functions
~ -serVer ExpJcirer,
Toolbox
!
102. abra A Solution Explorer szerverei es az SQL Server pubs adatbazisa
A jobboldali abra a pubs adatbazist mutatja a tablillal, a tablakon beliil a mezonevekkel. Egy mezonevet (oszlopot) kivalasztva a Properties ablakban megnezhetjiik a tfpusat, meretet. A Views alatt a nezetek felsorolasa kovetkezik a mezoikkel, majd a tarolt eljarasok parametereikke1 es mezoikkel.
10.3. abra A pubs adatbazis emloyee tabla adatai. Fent a lekerdezes eszkozsor
135
10. Adatbazis-eleres
Ha egy tabla adatait kivanjuk megnezni, a tabla neven duplan kattintva 6ket.
"''''51\.ol0111'I.>,81
10.1. Az adatbazis letrehozasa A Server Explorerben a csatolt SQL szerverek gyorsmentijeben megtaIaljuk a New Database mentipontot. Az adatbazis nevet megadva, es kivalasztva, hogy az operaci6s rendszer vagy az SQL szerver azonositasat kivanjuk-e hasznalni letrehozzuk az adatbazist. ' Ha az SQL szerver Windows alapu intraneten erhet6 el, akkor ha a szerver az nS-el (Internet Information Server) azonos gepen fut, es azonos domain nevhez tartoz6 felhaszmil6k hasznaIjak, akkor hasznalhatjuk a felhasznal6k Windows azonosit6it. Ez a megoldas biztonsagosabb, de nem hasznalhat6 nyilvanos Web oldalakon, amik pI. Unix al61 is elerhet6ek. Az adatbazis tablaihoz a gyorsmenti New Table parancsaval adhatunk tablakat, megadva a mezok nevet es tulajdonsagait a megjeleno ablak adatait kitoltve. Menteskor nevezztik el a tablat! A tabla az adatok megjelenftese funkcioval feltoltheto, modosithato. Access adatbazist az Access segftsegevel hozzuk Ietre! Az Access adatbazist a Server Explorer Data Connections segftsegevel erhetjiik el. A csatolt adatbazis adatai az SQL Serverhez hasonloan szerkeszthetok. TeMt az adatbazis elerese a Server Explorer mas kateg6riajab61 tortenik, de az adatok megjelenitese es szerkesztese mindket esetben azonos. A lekerdezesek szerkeszteset az SQL Serverben vagy az Accessben megszokott Query eszkozsor, es a hozza kapcsol6d6 ktilOnbozo nezetek segitik. A nezetek ki-be kapcsolhat6k, es az eszkozsor bal oldalan a kovetkezo sorrendben erhetok el:
136
~
Diagram nezet: a lekerdezesben szereplo tablak kozti kapcsolatot mutatja attekintheto grafikus abran.
~
Tervezo nezet (Grid Pane): A lekerdezes tervezeset tamogatja.
~
SQL nezet: Az SQL nyelv j6 ismeroinek teszi lehetove a lekerdezes szoveges begepeleset, vagy a tervezo nezetben megszerkesztett lekerdezes atolvasasat.
~
Adatlap nezet (Results Pane): A lekerdezes eredmenyet mutatja. A kapott adatokb61 kovetkeztethettink helyesen fogalmaztuk-e meg a lekerdezest.
10.2. Az adatbazis-elerest biztosit6
lOA. abra Lekerdezes eszkozsor ikonjai
a 10.7. abra lekerdezes szerkeszt6jeben lathat6ak. AJi(~lW~ge
Type eszkozgomb segftsegevel adhatjuk meg, hogy a lekerdezessel az csoportositasban vagy sziirve, csak olvasni szeretnenk (Select), l/1I.lt·v 1Itl6dlosit:anl is (Insert, Update, Delete). eszkozgombok a lekerdezes futtatasat, ellen6rzeset, szerkeszteset
t,
,
"
II
10~2.Az
adatbazis-elerest biztosit6 osztalyok
;;;' . eddigiekben az alkalmazason kiviilr61, csak a fejleszt6eszkoz lehetosegeit felhaszmllva szerkesztettiik adatbazisunkat. Most megvizsgaljuk, hogy a .NET osztalykonyvtar mely osztalyai tamogatjak az adatok elereset alkalmazasainkb61.
I.
z :t
e a
s s t
10.5. abra Az adatok kezeleset biztosit6 osztalyok UML diagramja
Az ADO.NET osztalyokat ugy terveztek, hogy tObbretegii kornyezetben tamogassak az adatokhoz tOrten6 hozzaferest ugy is, ha a rnvoli adatbazis folyamatosan nem 137
10. Adatbazis-eleres erhet6 el. Alkalmazasunk fejIesztesekor eldonthetjiik, hogy folyamatosan, vagy a sziikseges ideig kapcsol6dunk az adatbazis szerverhez. R6vid idejii "~1>"'1)\JI0CI~, eseten leWItjiik az adatokat, es azokon a tovabbiakban az adatbazist6l ~u~;ge[lenii dolgozhatunk (disconnected data). Az ADO.NET osztalyok a System.Data nevterben es alnevtereiben taIaIhat6k.
10.2.1. Az adatkapcsolat Az adatbazis elereset a Connection osztalyok biztosftjak. SQL adatbazis eseten az SqlConnection osztaIy, ODBC (Open Database Connectivity) kapcsolat eseten OdbcConnection, Oracle adatbazis eseten Oracle Connection, mfg OLE DB kapcsolat eseten OIeDbConnection osztaly. Mindegyik osztaly legfontosabb tulajdonsaga a ConnectionString, mely meghatarozza az adatbazis helyet.
Ha egy tablcit vagy tarolt lekerdezest a Form feliiletere hiizunk, a fejlesztoeszkoz automatikusan letrehozza hozza a Connection objektumot. Vagy a Toolbox Data csoportjaban megtalaljuk az objektumokat, kivalasztva a megfelel6t, a Properties ablakban beallfthatjuk a ConnectionString tulajdonsagat. A OleDbConnection objektumanak ConnectionString tulajdonsagon a nyiIat valasztva, New Connection, es megjelenik az adatkapcsolat tulajdonsagai ablak. SzolgaItat6kent Access eseten celszerii a Microsoft Jet OLE DB Providert vaIasztani, majd megkeresni az adatbazist. ~
Adatkapcsolat 1ulajdonsagai -
I
S,0I9011.'61 Kapcsolall Sp,c~6s Mind
~
~
~
-
I
Jercilie ki. hog}' rnefy acIatforrasokhoo: kivan csatlakoznt
..Qg...p'.~...g.Q!9.~!~§~L....._...__... " ...._...._."... _..._._............ I '
MediaCalalogDB OLE DB P/Ovidef MediaCatalogMergedDB OLE DB Provider
1~,W_~ ~ [!ls~a( ljl~r~l~!lr~·ij.~ ~ l~i !i:.~ r~ Z~ ~,er!l!lP!1IIII!I!I. .tlill Microsoft OLE 08 Provider For Data Mining Sesvices Microsoft OLE DB P/Oyider for DTS Packages Micresol! OLE DB Provider for Inde)(ing Service Microsoft OLE DB PlOvider fOl Intelnet Publishing MiclOsoft OLE DB PlOvider fOl ODBe Drivers Microsoft OLE DB Provider fOl Olap Services 8.0 Microsoft OLE DB PlOvider for Orade Microsoft OLE DB Provider for Outlook Search Microsoft OLE DB Provider fOl SQL Server Microsoft OLE DB Simple PlOvider MSOataShape OLE DB szolgaJtato • Microsoft cfmtasszolgaltatasok
;/:;;~
;;;{ ",'i'
, ~; (:~[ p~,:j
r;;t! ;,;il.!
Iovabb>
OK
SUgO
I I
10.6. abra Az adatkapcsolat tulajdonsagait beaIlft6 ablak Mint frhat6 tulajdonsag, .aConnectionString futasidoben a k6db6l is beallfthat6.
138
10.2. Az adatbazis-elt~rest biztosit6
yan.v.....
10.3. szakaszaban latunk erre peldat.
Comnlanld oszhllyok objektumok az adatbazis kozvetlen eleresere hasznalhat6ak. Az Command objektumb6l is negyfelet kinal: OleDbCommand, ,....,..~, OracleCommand, OdbcCommand. Segftsegiikkel SQL parancsokat A COlUlection tulajdonsagukba kivalaszthatjuk a mar letez6 kapcsolatok vagy letrehozhatunk uj kapcsolatot. Ha mar meghataroztuk a a CommandText tulajdonsagban megadhatjuk a lekerdezest. A Ietrehozasahoz az SQL Serverb6l vagy az AccessbOl mar ismert zessze:rkf:szt:O (Query Builder) segfti munkankat.
10.7. abra Az SQL parancs szerkesztese a gyorsmeniivel
Az ablak gyorsmeniijeb6l a Run meniipontot valasztva a lekerdezes eredmenyet is megnezhetjiik. A parancsot sziikseg eseten parameterezhetjiik, fgy futasid6ben is meghatarozhatjuk a lekerdezes parametereit.
10.2.3. A DataReader Ha folyamatos adatbazis-hozzaferessel rendelkeziink, akkor a leggyorsabban az adatokhoz DataReader objektum segftsegevel juthatunk. A DataReader segftsegevel egymas utan (csak e16re, forward only) kiolvashatjuk az adatokat az adatbazisb61. Barmely SELECT parancs vagy SELECT-et tartalmaz6 tarolt eljaras vegrehajthat6 fgy. A DataReader objektumhoz a Command objektum ExecuteReader tagfiiggvenyenek visszateresi ertekekent juthatunk hozza. Ne feledjiik azonban, amfg a DataReadert be nem zarjuk, addig el a kapcsolat az
139
10.
-
Adatbazis-elt~res
alkalmazas es az adatbazis k6z6tt! fgy a DataReadert olyan gyorsan zarjuk be a Close met6dussal, arnilyen gyorsan csak lehetseges. A k6vetkezo k6dreszlet vegigolvassa a gyakorlaton szereplo pw Access adatbazist es hianyz6 jelsz6 eseten tires sztringet tesz a password lokalis valtoz6ba. ' using System.Data.OleDb; string user; string password; try {
oleDbConnection1.Open() ; OleDbDataReader reader = oleDbCommand1.ExecuteReader(); while (reader.Read()) {
user = reader.GetString(O); if (reader. IsDBNull (1) ) II Dres jelsz6. {
password
=
password
= reader.GetString(l);
II" ,•
}
else }
reader.Close() ; }
catch (InvalidOperationException ex)
II Mar nyitva!
{
MessageBox.Show(ex.Message) ; }
catch (OleDbException ex)
II Nem sikerult megnyitni!
{
MessageBox.Show(ex.Message) ; }
finally {
II A kapcsolatot bezarjuk akar volt kivetel akar nem. oleDbConnection1.Close() ; }
10.2.4. A DataSet
A DataSet osztaIy a lekerdezes eredmenyekent visszaadott adatokat tarolja a mem6riaban. Amfg a DataReader egyszerre egy sort ad vissza a mem6riaban, addig a DataSet a lekerdezes teljes eredmenyet szolgaltatja. A DataSet szerkezete az adatbazisehoz hason16. Az adatokat tablakban (DataTable) t:irolja, a t:ibl:ik sorokra 140
-
10.2. Az adatbazis-elerest biztosito osztalyok
(DataRoW) (rekordokra) es oszlopokra (DataColumn) (mez6kre) oszthat6k. A kapCSolt tablak kozti kapcsolatokat DataRelation objektumokban tarolja.
A tabhik gyiijtemenye a DataSet.Tables tulajdonsagan kereszttil erhet6 el. A konkret tabla sorait a Rows gyiijtemeny, mig oszlopait a Columns gyiijtemeny tartalmazza. A sorok es oszlopok is indexelhet6k, az oszlopok a neviikkel is azonosfthat6k.
Az oszlopoknal 1ekerdezhetjtik a nevet (ColumnName), a tfpusat (DataType), az alapertelmezett erteket (DefaultValue), hogy engedelyezett-e az tires ertek (AllowDBNull), egyedi-e (Unique), csak 0lvashat6-e (ReadOnly), vagyis amit a tervezeskor megadhatunk. Egy konkret sor meg6rzi a m6dosftas el6tti allapotat is, amig AcceptChangesO fijggvenyt nem hfvunk ra. A RowState tulajdonsagban lekerdezhetjtik, lett-e m6dosftva a sor, es a RejectChangesO hfvasaval visszaallfthatjuk az utols6 AcceptChangesO hfvaskor megadott erteket. Mivel az alkalmazasunk altaI felhasznalt DataSet osztaly adatblizis-specifikus, ezert az alkalmazasban egy specialis ut6dosztalyt kell letrehoznunk, mely a konlaet adatblizis konkret tablait, konkret oszlopait tartalmazza. A Visual Studio automatikusan egy DataSet1 new osztalyt tud letrehozni, melyet celszerii egyedi beszedes nevvel ellatnunk (UsersDataSet). A DataSetl osztaly objektumat a fejleszt6eszkoz dataSetll-nek nevezi. Bar az osztaIy nagy kezd6betiije megktil6nb6ztetne a kis kezd6betiis objektumt61 C# komyezetben, de a komponensfejlesztesnel emlftetttik, hogy a case sensitivitast nem celszerii altalanosan kihasznalni. Ez magyarazza az objektum dupla indexeleset. Mi adjunk beszedes azonosft6t objektumainknak is! (dsUsers) A letrehozott UsersDataSet osztaly tartalmazza a konkret tabllik lefraslit tartalmaz6 DataTable ut6dosztalyat es a konkret sorok lefnisat tartalmaz6 DataRow ut6dosztaIyat. Ha egy sor konkret mez6jenek kovetkez6keppen tehetjtik:
erteket
szeretnenk
[ TablanevJ
visszakapni,
. / Mezonev
azt
a
]
textBoxl.Text = dsUsers.Users[Oj .pwd;
A DataSet objektum tehlit egy helyi masolata az adatbazis, vagy mas adatforras adatainak. Ezert haszmHata lehet6ve teszi, hogy alkalmazasunk ne kapcsol6djon folyamatosan az adatblizishoz, hisz a helyi adatokon a kapcsolat fenntartasa nelkiil is lehet dolgozni. Ez nagymertekben noveli az adathozzaferes skalazhat6sagat (scalability), vagyis azt, hogy adatblizisunkhoz minel t6bb felhasznal6 ferhessen hozza. Hisz a felhasznaI6k csak az adatok letOltese es frissftese idejen foglaljlik az adatbazis er6forrasait. .
141
&
10. Adatbazis-eleres
IMegjegyzes: I A DataSet osztl.Hyok lehetnek tipusosak es tipus nelktiliek. Mi itt tipusos DataSettel foglalk~ztunk, melynek mar forditasid6be~ ismerjiik a tablait es mez6it. Igy kenyelmesebb dolgozni vele, de j6 ha tudjuk, hogy a .NET tamogatja a futasid6ben erkez6, a~ adatszerkezet informaei6kat IS futasid6ben megad6 adatok feldolgozasat is.l
10.2.5. A DataAdapter osztaly A DataAdapter objektum koti ossze az adatbazist a DataSet objektummal. Biztositja az adatok kiolvasasat az adatbazisMl es menteset az adatbazisba. DataAdapterbOl is az adatkapesolat tipusanak megfeleloen ktilonbozo osztalyok allnak rendelkezesiinkre: OleDbDataAdapter, SqIDataAdapter, OdbeDataAdapter, OracleDataAdapter. A DataAdapter negy paranes tulajdonsaggal rendelkezik: SeleetCommand, DeleteCommand, InsertCommand es UpdateCommand. Mindegyik paranes eseten megadjuk a Connection objektumot es a CommandText tulajdonsagban a megfelelo SQL lekerdezes szoveget. A DataSet objektumot a legegyszeriibben a forrnra hUzott DataAdapter objektumb61 gyorsmenii segftsegevel hozhatjuk letre. A Generate DataSet meniipontot valasztva a New melletti szovegmezoben megadhatjuk a DataSet osztaly nevet, vagy az Existing valaszt6gombot kijelOlve a listaMl kivalaszthatjuk a m6dosftani kivant DataSet osztalyt. Kivalasztjuk a tartalmazott tablak nevet. A Visual Studio a DataSet osztalyon kivtil az osztaly egy objektumat is letrehozza. Az objektum nevet a Properties ablak Name tulajdonsagaban frhatjuk at. Vizsgaljuk meg a Class View ablakban a letrehozott DataSet ut6dosztalyat, a DataTable ut6dosztalyat es a DataRow ut6dosztalyat! A Solution View ablakban megjelent a UsersDataSet szerkezetet leir6 UsersDataSet.xsd, mel yet tablazatosan vagy XML nezetben mutat a fejlesztoeszkoz. Az XML lefras az adatok tovabbftasat platform fiiggetlenne teszi, vagyis adataink barmely bOngeszoben bemutathat6k lesznek. A Solution View ablakban lehet torOlni a feleslegesse valt DataSeteket.
A DataSet objektum feltOltese a DataAdapter.Fill met6dusaval tOrtenik, melynek parameterkent kell megadnunk a DataSet objektumot. Az adatok mentese a DataAdapter objektumra meghivott Update fiiggvenyhivassal val6sul meg, a mentesre var6 DataSet, tabla vagy sorok tOmbje parameter megadasaval. A Fill met6dus a SelectCommand, az Update fiiggveny pedig a DataSet sorain bekovetkezo valtozast6l fiiggoen az InsertCommand, DeleteCommand vagy UpdateCommand parancsot hasznalja az adatok m6dositasahoz. Az adatbazishoz csak e ket met6dus futasa alatt kapcsol6dik alkalmazasunk. Ezt jelOli a DataAdapter ikonja,mely egy sziirke mezoben mutatja a kapcsolatot az adatbazissal, fgy hangsulyozva annak ideiglenesseget. Ha az adatforras adatai valtoznak, a valtozasoknak a DataSet-ben is meg kell jelenniiik Erre szolgal a DataSet osztaly AcceptChanges met6dusa. A DataAdapter Fill es Update met6dusai meghivjak az AcceptChaneges-t csak ha kozvetleniil Command paranccsal m6dosftjuk az adatbazist, akkor kell meghfvnunk a DataSet m6dosftasahoz. 143
10. Adatbazis-eleres
10.3. Az adatok megjelenitese A legegyszeriibb mod egy tabla vagy egy lekerdezes eredmenyenek megjelenfteser a Data Form Wizard. e File menii Add New Item Templates: Data Form Wizard
Data Form Wizard
Open. Next DataSet letrehozasa, vagy kivalasztasa Crate a new DataSet named: MyDataSet. Next Kapcsolat kivalasztasa, vagy Ietrehozasa. Next Tablak, nezetek kivalasztasa. Next Oszlopok meghatarozasa. Next Tablazatos, vagy egy oldalon egy sor onall6 vezerlokben Kivalaszthatjuk az engedelyezett miiveleteket: Add, Delete, Cancel, navigaci6s vezerlOk Finish Eldonthetjiik, keriink-e jelsz6t a Form megjelenitesehez. ~
Data Form Wizard Choose the display style You can display a single record at a time or display all records d:. once.
r
All r.ecords in a grid
r.
~ngle record
In'individual contrOls
What additional controls do you' want On the form?
P' Cancm AII- Cancels changes to'-aU recor~ in the dataset. If you select individual controls, you can add controls for editing and navigation:
P: &::Id· creates a new record. W Q,elete - De~s the current recoid. ~ ~ance!-~ caficets Changes: to the turrent record.
P' ~!Llgation c~rtrols - Moves to flfst~,previolJ$~ nextJ,or kJst record. The wizard now has the information it needs. dick Finish ,to exit and generate your new form.
10.8. abra A Data Form Wizard adatmegjelenftesi beaIlftasai
144
10.3. Az adatok ,,,,",,,...,,n
'IIIVU<-<
formot szerkeszthetjiik, es a k6db61 hivjuk meg!
taForm myDataForm aForm. Show ( ) i
= new
MyDataForm()i
10.9. abra A Data Form Wizard altalletrehozott miik6d6 form
10.3.1. A vezerlok Azet6z6ekben generalt formot is tovabbfejleszthetjiik, m6dosithatjuk, a Visual Stq
lOj.1..1.
A DataGrid
AnOataGrid vezerl6 kenyelmesse teszi az adatbazis adatainak megjeleniteset t~bl'azatos formaban. A vezerl6 DataSource tulajdonsagahoz DataSet objektumot, vag"yk6zvetleniil tablat rendelhetiink hozza. DataSet eseten felhasznalaskor ki kell vlilasztani a megjeleniteni kivant tablat, viszont tCibb tabla megjelenitesere is m6dunk van. Ha a tablat adjuk meg k6zvetleniil, akkor az adataival egyiitt latszik futliskor.
10.10. abra A DataGrid ket allapota, ha DataSet objektum az adatforras
T6bb tablas adatbazis eseten a csatolt tablak hasonl6 m6don, a + ikont kinyitva mutatjak meg adataikat. 145
10. Adatbazis-eleres 10.3.1.2.
A ComboBox
Ha ComboBox segftsegevel szeretnenk egy mezo kiilonbozo ertekeit felsorolni akkor a ComboBox tulajdonsaglapjan ket tulajdonsagot kell beallftanunk. ' •
DataSource: Egy DataSet, vagy egy tabla valaszthat6 ki
•
DisplayMember: DatSet esten a tabla es a mezo, tabla eseten a mezo kivaIasztasa sziikseges.
10.11. abra A kivalasztott usecID sora lesz az aktualis a tablat mutat6 tablazatban is A ComboBox meg egy szolgaItatast kinal, ha DropDown Style-jat ComboBoxStyle.DropdownList tipusura allitjuk, akkor a begepelt karakterekre automatikusan raaIl. Emiatt nem kell vegiggepelni hosszu neveket. Ilyen beallitas eseten a ComboBoxba nem gepelheto mas ertek, csak azokat az elemeket tudjuk kivaIasztani, melyek az adatbazisban szerepelnek. Ez a szolgaltatas kiilonosen elonyos nagymeretii adatbazisok eseten, ahol nem a felhasznal6nak kell gorgetessel megkeresni a kivant sort.
10.4. Teszt 1. A Visual Sudio tamogatja letezo adatbazisok szerkezetenek es adatainak megtekinteset, de a m6dositast nem teszi lehetove. 2. A Connection osztaly ConnectionString tulajdonsagaban adhatjuk meg az adatbazis elereset. 3. A Microsoft SQL Server adatbazisokon kiviiI a tObbi elereset csak ODBC-n keresztiil teszi lehetove az osztalykonyvtar. 4. A Command objektumok kozvetleniil az adatbazison dolgoznak, ezert miikodesiikhoz kozvetlen adateleres sziikseges. 5. A DataSet objektum a mem6riaban tarolja a DataAdapter altaI visszaadott adatokat.
146
10.4. Teszt
egy adat erteket esetleg vissza ldvanjuk allitani a DataSetben, mentsiik el egy >.O"edv:cilt()zc,ban, mielott megvaltoztatjukl LIJ""~~U
DataSet a leirasat XML Schemaban tarolja, mely egy xsd kiterjesztesii fajl.
DataAdapter objektum Fill met6dusaval fel kell tOlteniink a DataGrid """ryprli'lt hogy az adatokat ki tudja tenni az ablakba. Data Form Wizard lepesein vegighaladva elkesziti nekiink a kivant Form nekiink csak az esemenykezelo fiiggvenyeket kell megirnunk a miikodesehez. A ComboBox DropDownStyle tulajdonsaganak DropDown-ra allitasaval a vezerlo a begepelt szoveget kiegesziti a lista elemeve. Javit6ku1cs:
!IiT, H, I, I, H, I, H, H, I.
147
,.L, . . . .
111~1.
eb alkalmazas fejlesztese
Elofeltetelek
Ahhoz, hogy Web alkalmazast (ASP.NET Web Application), hal6zati szolgaltat6t (i\~P.NET Web Service) es hal6zati alkalmazasok vezerloit (Web Control Library) k€siithesstik el a Visual Studioban, operaci6s rendszertink te1epitese utan t~lepitetntink kell az Internet Information Servicest (lIS).
Internet Information Services Parancsikon
2 KB
11.1. abra Az lIS ikonja a Vezerlopult Feltigyeleti eszkozei kozott Bizonyos telepito csomagok eseten a Visual Studio telepitese is csak az lIS mukOdesekor lehetseges. Az alkalmazasok bongeszoben futtatasahoz pedig a helyi hal6zat proxykiszolgal6janak beallitasa sztikseges. Az elokeszitesrol reszletes informaci6k a fejezethez tartoz6 gyakorlat elejen olvashat6k.
11.2.
A Web Form
A web form olyan dinamikus web old ai, amit a felhaszmll6 a bongesz6ben lat, es amelyet a szerver allit elO. A web form HTML, k6d, es olyan vezerl6k 149
11. Web alkalmazas fejlesztese kombinacioja, melyek esemenyeit a Web szerveren (lIS) futo kOd kezeli. A form a szerkeszt6ben megadott felhaszmi16i feliiletbOl (Design) HTML general, es ezt kiildi el a bongeszonek. A feliilethez tartoz6 hatterk6d a szerveren Tehat a kliens oldalon a felhasznal6i felUlet latszik, mig a k6d a szerver oldalon Ez meroben mis megoldas, mint a hagyomanyos web oldalak, melyeknel a k6d letOltese es vegrehajtasa a kliens bOngeszojeben tortent. Web form eseten CSak . felUlet vezerl6it kell elki.ildeniink a bongesz6nek, a k6d vegrehajtasa a M,ron,.".,. marad. A felhasznal6i feliilet es a k6d szetvalasztasa naveli a bongesz6k szamat, noveli a funkeionalitast es a biztonsagot. Mivel a web form kliens oldali scriptekre csak a kliens szolgaltatasai eseten epit - a szerver olda: kod iIyen szolgaltatast nem biztoslto kliens eseten is lefut -, nem fiigg a klie~ bongeszojetol es operaci6s rendszeretOl. Termeszetesen, mint az eletben es a programozasban mindennek, fgy ennek a fiiggetlensegnek is ara van. Ha a k6d a szerveren hajt6dik vegre, akkor hasznalatahoz alland6 internetkapcsolatra van sziikseg, melyet minden esemeny bekovetkeztekor igenybe is vesziink. Mikozben az oldal letOltesekor kevesebb adat sziikseges - hisz nines sziikseg a seriptekre -, addig az esemenyekhez kapesolt k6d vegrehajtasahoz a tovabbi adatatvitel elengedhetetlen. Bar kismereti.i adatok eseten ez a felhaszm1l6 szamara lehet, hogy nem erzekelhet6. Az alland6 intemetkapcso}at koltseges, bar a koltsegek esakkenek. Sok esetben Iassu az adatatvitel, ez is javul. Ezen kfvi.il pedig folyamatosan terheli a szervert, ezert a hatekonysag €rdekeben altalaban vegyes megoldasokat szoktak alkalmazni. Az egyszeri.ibb, nem er6fomlsigenyes tevekenysegeket - pI. hogy a bevitt ertek adott hatarok kozt van-e rabfzhatjuk a kliensoldali scriptre, ha tamogatja azt a bongesz6. fgy nem terheljiik szerveriinket, es meg gyorsabb is helyben a vegrehajtas. Ha bOngesz6 nem tamogatja a kfvant script vegrehajtasat, elvegezheti azt a szerver. Tehat a web formok uj, eddig akadalyt jelento tevekenysegeket kfnaInak szamunkra, de Clni veliik akkor erdemes, ha val6ban hatekonyabba es akadalymentesebM teszik alkalmazasunk vegrehajtasat! Adatb.lzis.mdf Adatbazis-szerveren tarolva es futtatva
WebOldal.aspx
WebOldal.dll Webszerveren taro Iva es futtatva
11.2. abra Egy web alkalmazas f6bb komponensei
A Web Formokat gyakran ASP.NET (Active Server Page .NET) oldalaknak vagy ASPX oldalaknak is nevezik az aspx kiterjesztestik miatt. ASPX oldalak es ASP oldalak (.asp kiterjesztes) futhatnak azonos szerveren. A Web Formokhoz tObbnyire 150
11.2. A Web Form tartozik, az aspx fajl tartalmazza a felhaszlllil6i feltiletet (UI User az aspx.cs fajl a C# k6dot, melyet az oldal mogotti k6dnak is hivnak page). html nezeteben lathatjuk: id="Forml" method="post" runat="server">
runat attribUtuma server erteket vett fel. Ez mutatja, hogy az "c;£~:a"," k6dja a szerver oldalon fut. Egy HTML oldalon akarhany form is de csak pontosan egy server-side form lehet egy .aspx oldalon! A attribUtum beallitas kovetkezteben a form a vezerles adatait annak a kiildi el, melyen a k6d fut. Ha a mnat attributum nem server, akkor '''.,,,,n<: HTML oldallal dolgozunk. els6 sora mutatja a forrask6d nyelvet es a forrasfajl nevet: language="c#" Codebehind="WebForml.aspx.cs"
megtudhatjuk az 6sosztaly nevet, es az eddig tanultak alapjan l"'LJ."""I, ..n, irhatjuk a forrask6dot. raSKOcl0()i
class WebForml : System.Web.UI.Page
\'1(!fU~"·· A
Web Form szerkesztese
~\Weboldal
elrendezese ketfele lehet:
•
Tablazatos elrendezes - GridLayout: A Form a Windows Formhoz hason16an kenyelmesen szerkeszthet6. Futtataskor meg6rzi a vezerl6k egymashoz es a formhoz viszonyitott helyzetet. Hatranya, hogy a kii16nboz6 felbontasu es ablakmeretii gepeken futtatva a vezerl6k egy resze az ablak szelen kiwI kertilhet, igy kenyelmetlenne vMhat a hasznalat. Ki nem jart mar olyan Web oldalon, ahol a szoveg egy resze a keret moge csuszott, es soronkent oda-vissza kellett gorgetni az elolvasashoz?
•
Sorfolytonos elrendezes - FlowLayout: A vezerl6k egymas utani sorrendje meghatarozott. Az ablak hataran nem nylilnak tul, a k6vetkez6 sorba kertil az a vezerl6, amelyik nem fer el az e16z6 sor vegen. E16nye, hogy tetsz61eges felbontasu es ablakmeretii b6ngesz6ben megmarad a vezerl6k sorrendje es lathat6saga. Hatranya, hogy neMz elegans elrendezest biztositani az ablaknak. Sorfolytonos elrendezes eseten tablazat segitsegevellehet pozicionalni. 151
11. Web alkalmazas Az ablak elrendezeset a pageLayout tulajdonsagban allithatjuk be. A Visual
GridLayout formot general, mel yet a Properties ablak pageLayout modosfthatunk.
tUl;tlJ UO nl,aQilh,
A Toolbox Web Forms vezerl6i kozt nagyon sok eddig megismert talalkozhatunk. Ezek azonban, bar funkcioik jelent6s reszeben azonosak, osztiilyok. Mig a Windows Forms vezerl6ink osztalyai a Sys tem. Windows. nevterben, addig a Web Forms vezerl6ink mogott a System. Web. UI. "~,J'-U nevter osztalyai allnak. Web alkalmazasok eseten a Toolbox meg tartalmaz HTML csoportot is, melynek vezerl6ihez alapertelmezesben a bongesz6jeben futtatott k6d tartozik, vagyis a kliens oldalon scriptek segfts kezelhetjuk esemenyeiket.
IMegjegyzes: I A HTML vezerl6k gyorsmenujeben a Run As Sever Control meniipontot valasztva a System. Web. UI. HtmlControls nevter osztalyait kapjuk meg a hatterben, melyek szinten lehetove teszik a szerver oldali esemenykezelest. A kovetkez6 HTML reszlet harom nyom6gomb leirasat mutatja, melyek azonos m6don jelennek meg a bOngesz6ben. HTML button, csak kliens old ali esemenykezeles:
HTML server control button:
Server
Button"
Web server control button ASP.NET HTML:
11.3.
runat="server"
Text=
A Server Control
Az ASP.NET szerver vezerl6k eseten elvalik a felhasznal6i felulet es a futtatott k6d. Az UI a bOngeszo ablakaban jelenik meg, mig a k6d a szerveren fut. A server
control a WebForm.aspx Design nezeteben grafikusan szerkeszthet6. A felhaszmil6i felUlet lein'isa a HTML kodban olvashato. A szerver vezerl6 runat attribUtuma is - a web formhoz hasonl6an - "server" ertekii. A felhasznal6i felUleten azonosft6ja (id) van, ami a C# fornlsk6dban az objektum nevenek felel meg. HTML kontrol esemenykezeleset kliens oldali script vegrehajtasaval oldhatjuk meg, mig a szerver vezerl6 esemenykezelese a hagyomanyos Windows vezerl6kehez hasonloan tortenik.
152
11.3. A Server Control form Button vezerlon duplan kattintva az aspx.cs forrasfajlban letrejon a gomb alapertelmezett esemenykezeloje - a Button_Click kiilonbseg csak az, ami a formnal is, hogy a gomb a bOngeszoben amely egy tavoli gepen is futhat, s az esemenykezelo met6dus a vegre. A lathat6 eredmeny pedig lijra a tavoli gep bongeszojeben
.,CIlI"I-"""
megorzese
egyik fO problemaja, hogyan orizzek meg allapotukat - beallftasaikat "u".. ~, bevitelt. A HTML oldalakat a szerverrol Wltjiik Ie, es a kovetkezo megsziinik a form objektum ami letrehozta az oldalt. Ha rajuk, lijra letrejon a form objektum alapertelmezett ertekekkel es ez a bongeszoben. A felhasznal6 altaI kiWIWtt adatokes beallitasok Azt mondjuk erre, hogy a Web oldalak allapot nelkiiliek (stateless). Web Form ligy kezeli ezt a problemat, hogy tarolja a vezerlo allapotat. rejtett vezerlot hasznal amit _VIEWST ATE-nek neveziink es ha igazra 10 vagy az oldal EnableViewS tate attriblitumat, akkor megjegyzi a az oldal adatait. Amikor az oldalt lijra leWltjiik a szerverrol az allapot a egyiitt leWltodik. telnlez1esben a Web Form megorzi a vezerlok allapotat. Tobb vezerlos oldal oldal _ VIEWS TATE tulajdonsaganak merete nagyon nagy lehet. Ezert tiltsuk Ie az oldal @Page direktfvajaban az oldal allapotmegorzeset, es vei~rIC)11k,ent allftsuk be azt! i)<;:j;<::%@ Page EnableViewState = "False" %> :ListBox id="Users" EnableViewState = "true" runat = "server">
Az ASP.NET oldalnak van meg egy hatekonysagot novelo eszkoze, ez a
SmartNavigation. Ha ezt a direktfvat igazra allftjuk, frissfteskor csak a m6dosftott adatokat Wlti Ie az oldal. <%@ Page SmartNavigation = "True" %>
11.3.2. A bevitt ertekek ellenorzese Lehetosegiink van meg egy hasznos vezerlotlpus alkalmazasara, ez a Validation control. A Validation control feladata az adatbevitel ellenorzese. Szerver oldali es kliens oldali ellenorzest egyarant megval6sfthatunk veliik.
153
11. Web alkalmazas fejlesztese
-----
Az ellenorzo vezerloket a Toolboxb61 hUzhatjuk az ellenorizni kivant vezerl6 mellA ControlToValidate tulajdonsaghoz kivalasztott azonosit6 (id) hatarozza meg e. ellenorzbtt vezerlot. Egy vezerlohi:iz tbbb ellenorzo vezerlot is csatolhatUnk, egy~ peldaul a kotelezo kitbltes, mig a masik a bevitt ertek ellenorzese, megfelel-e a '" - k na k , Z e1Olraso Az EnableClientScript tulajdonsag True ertekre allitasaval (alapertelmezes) engedelyezhetjiik, hogy az ellenorzes a kliens oldalon tbrtenjen meg eloszor. fgy elerhetjiik, hogy bizonyos hibak eseten az oldal nem ktild adatokat a szervernek, a kliens oldalon vegrehajtott k6d ktild hibaiizenetet. A kliens oldali ellenorzest a DHTML-t tamogat6 bbngeszok (pI. Internet Explorer 4.0 vagy kesobbi verzi6k) tudjak biztosftani, mas bbngeszok eseten az ellenorzes a szerver oldalon tbrtenik meg. Nehany ellenorzo vezerlo: RequiredlnputValidator a kbtelezo kitbltest ellenorzi, a Compare Validatorral bsszehasonlfthatunk, mfg a Range V alidator ellenorzi, hogy a vezerlo tartalma a megadott ertekhatarok kbzt van-e. Ne feledjiik Type tulajdonsaganak beallftasat, mert annak hianya hibas mukbdest eredmenyezhet! A 1999 mint sztring kisebb az 5-nel, hisz elso karaktere kisebb, de mint Integer mar nem. A RegularExpression V alidator segftsegevel specialis mezoket ellenorizhettink, pI. e-mail efmet, vagy URL-t. A CustomV alidator a fejleszto altaI definialt ellenorzest biztosft. A szerveroldali ellenorzo fiiggvenyt a ServerValidate esemeny kezelesevel tudjuk letrehozni. A fiiggveny ServerValidateEventArgs parameterenek Valuetulajdonsagaval erhetjiik el az ellenorizni kfvant sztring erteket, es IsValid tulajdonsaganak beallftasaval adhatjuk meg a sztring ervenyesseget. Ha kliens oldali ellenorzest akarunk, a szerver oldali ellenorzo fiiggveny elkesziilte utan keszftsiik el az aspx oldal ellenorzo fiiggvenyet, melynek formatuma a kbvetkezo: VBScript: Sub ValidationFunctionName(source, arguments) JScript: function ValidationFunctionName(source, arguments) Ezutan a ClientValidationFunction tulajdonsagba frjuk be az ellenorzo fiiggveny nevet! Minden ellenorzo objektum eseten adjuk meg az ErrorMessage szbveget, mely ervenytelen bevitel eseten a felhasznal6 szamara nyujt tajekoztatast a hiba okar61!
154
11.4. Az adatbazis adatainak megjelenitese
---
lh4. Az adatbazis adatainak megjeienitese
Webszerver
Munkaallomasok
11.3 .. abra Szamit6gepek kommunikaci6ja web alkalmazasok futtatasa soran Az adatbazis adataihoz a Windows alkalmazasokhoz hasonl6 m6don az adatbazis hozzaferest tamogat6 osztaIyok segitsegevel juthatunk el Web alkalmazasok eseten is. A Connection osztalyok biztositjak az egyszerii hozzaferest, a DataAdapter az adatatvitelt az adatbazis es az .Htalunk letrehozott DataSet kozott. A DataSet biztositja a csatlakozasfiiggetlen (disconnected) adatkezelest, ahol az adapter csak a letOltes vagy a m6dositas idejere all kapcsolatban az adatbazissal. Az adatok fnisat-olvasasat a Command osztaIyok vegzik.
Wel6tt egy DataSet objektumb6l az adatot kitennenk a felhasznaI6i feliiletre, elobb fel kell tOlteni azt ertekekkel. Ezt teszi a DataAdapter Fill met6dusa. Ezutan WindowForm eseten csak a DataGrid DataSource tulajdonsagat kellett a DataSetre allftani, es megjelentek a tablazatban a DataSet adatai. Web alkalmazas eseten meg kell hivnunk a DataGrid DataBind met6dusat, melynek feladata, hogy a tablazatot a DataSource tulajdonsagaban megadott adatforrashoz kosse. Ennek hatasara tOltodik csak fel a tablazat a DataSet adataival. Ahhoz, hogy hozzaferjiink az adatbazishoz, megfelelo jogosultsaggal is rendelkezniink kell. Az SQL Server eseten beallitand6 jogosultsag reszletes leirasa a gyakorlaton szerepel.
11.5.
Teszt
1. Ahhoz, hogy Web alkalmazasokat tudjunk fejleszteni, sziikseg van az lIS telepitesere.
2. A Web Form a Form egy specialis fajtaja, mely a szerverhez kapcso16dik, es futtatasahoz nem kell mas szoftver, eleg ha kozvetlen hal6zati kapcsolat van a szerver es a kliens gep kozott. 3. Web Form es Web Control eseten a felhaszna16i feliilet a bOngesz6ben jelenik meg, mig a hatterk6d a szerveren fut. 4. A Web Form nem minden vezerlojenek esemenyeit kezeljiik a szerveren, csak amelyikre be van aHitva a runat="server" attributum. 155
11. Web alkalmazas
5. A Web Form FlowLayout beaBitasa azt jelenti, hogy folyamatosan a felntk vezerlok sorrendjeben tOrtenik az esemenyfeldolgozas. ott 6. A PageLayout elrendezes eseten az oldal jobb szelere tablazat segitsegev I tehetiink vezerlot. e 7. A Toolbox Web Control kateg6riajaban felsorolt vezerlok nem tudnak Szerv oldali k6dot futtatni. er 8. A Server Control esemenyehez rendelt k6dot a Form.aspx.cs forrasfajlban talaljuk. 9. Alapertelmezesben a Web Form megorzi az allapotat, mfg a HTML oldal stateless. 10. A vezerlokbe beolvasott adatokat Validator objektumokkal ellenorizhetjiik az adatbazisba fras elott. A kliens oldali ellenorzest nem erdemes bekapcsolni, mert ha a bongeszo nem tamogatja a DHTML hasznalatat, akkor az ellenorzes elmarad. 11. Egy vezerlohOz csak egy Validator tartozhat, de egy Validator tObb kiilOnbOzo ellenorzest tud elvegezni. lavit6kulcs: I, H, I, I, H, H, H, I, I, H, H.
156
"Informatics is like love, you cannot learn it from books. ,,1 Graffiti
1
Az informatika olyan, mint a szerelem, k6nyvekb61 nem tanulhat6!
GYAKORLATOK
1. Gyakorlat. Bevezeto feladat A k6nyv gyakorlatok resze tObbnyire egymasra nem epUlo feladatokat tartalmaz.
1.1.
A hatter beallit6 alkalmazas
Ezen a gyakorlaton elkeszitjtik a Visual C# fejlesztoeszkozt hasznal6 elso alkalmazasunkat. Ismerkedtink a fejlesztoi k6myezet nyt1jtotta lehetosegekkel. Kezeljtik a felhasznal6 szamara felkfnalt interfesz, a form felUlet beallftasi lehetosegeit. A nyom6gombokhoz esemenykezelo fiiggvenyt keszittink. M6dositjuk a program ikonjat, lehetove tessztik az ablak minimalizalasat, maximalizalasat. Megtanuljuk, hogyan nyithatunk meg egy regebben frt projektet. I
1.1.1. Elokeszites Hozzon letre egy konyvtarat, melyben a tanulas soran a Visual Studio C#-ban (ejtsd: szi slirpban) frt programjait tarolni fogja! Ha nem teszi, az alkalmazasvarazsl6 felkfualja a MyProjects alkonyvtarat.
} Inditsuk el a Microsoft Visual Studio .NET fejlesztoeszkozt! Start
Programs Microsoft Visual Studio .NET 161
1. gyakorlat. Bevezeto feladat
---
Az 1. Gyakorlat. 1. abra a kesz fut6 alkalmazas kepet mutatja. Ha a 'Hatter kep' feliratu gombot leiitjiik, megje1enik a hatter kep.
1. Gyakorlat. 1. abra A Mtter beallit6 alkalmazas futas kozben
Aki mar ismeri a Visual Studio korabbi verzi6it, a kezd6lapon (Start Page) beallfthatja a profile ablakban az altala megszokott kornyezetet. Mi a kovetkez6kben Visual C# Developer beallftassal dolgozunk.
1.1.2. Uj projekt File menii New meniipont Project Project Types: Visual C# Projects Templates: Windows Application Name:
Elso
Location: A kfvant konyvtar OK.
Ha a jobboldali Properties ablakot a folotte elhelyezked6 Solution Explorert es Class Viewt tartalmaz6 ablak melle hUzzuk (drag & drop), jobban latjuk a tulajdonsagokat. A cfmsorat megfogva a balegergombot lenyomva mozgatjuk az 162
1.1. A hatter be311ito alkalmazas keret mutatja az ablak helyet az egergomb elengedese utan. Ha az eger epp mutat ugy engedjUk el, akkor a Properties is a valaszthat6 fiilek egyike baloldalan a ToolBox (szerszamok ikon) fOie mozgatva az egergombot az megnyflik. A kitiizovel rogzfthetjUk, hogy ne csuk6djon vissza.
1. Gyakorlat. 2. abra Az uj alkalmazas a komyezet beallftasa utan
~
Forditas/Futtatas
:r<:eszitsUk el az alkalmazast! A Build menU Build Solution vagy Build Eiso utasftasara elkesztil az alkalmazas. Egy solution t6bb projectbol is allhat, de jelen esetben csak az Eiso alkalmazas tartozik hozza.
A Debug menU Start vagy Start Without Debugging menUpontjai segftsegevel futtathatjuk az alkalmazast. A nyomkoveteses futtatas ikonja az eszkozsoron egy ~ ikon. Javaslom, a nyomkovetes nelktili futtatas ikonjat is tegytik melle, hisz ez gyorsabban vegrehajt6dik. (1. Gyakorlat. 3. abra) Az eszkozsoron jobbegerrel kattintva, a gyorsmenU Customize parancsara a Commands ftil Debug kateg6riaban megtalalhat6 a parancs. Ikonjat drag & drop technikaval az eszkozsoron a kivant helyre hUzhatjuk.
~... Debug .... 1 ~st;art Without Debugging~]1 1. Gyakorlat. 3. abra Az nyomkovetes nelktili futtatas eszkozgombja az eszkozsoron
163
1. gyakorlat. BevezetO feladat
-
A k6dot majd lepesenkent ismerjtik meg. Most csak azt nezztik meg, hogyan indul el -az alkalmazas! (A kesobbiekben a projekt es a nevter fogalma is tisztaz6dik.) A Class View ftil ablakaban kinyitva az Eiso projektet, majd az Eiso nevteret (namespace) a Form 1 osztalyban megtalaljuk a MainO ftiggvenyt, mely az alkalmazas inditasaert felelos. Duplan kattintva a MainO neven kinyflik a forrask6dot tartalmaz6 ablak, es megnezhetjtik a MainO k6djat. static void Main() { }
Ez azt jelenti, az alkalmazas fusson egy uj Formi letrehozasaval.
1. Gyakorlat. 4. abra A Formi osztaly UML diagramja balra, Class View nezet jobbra. J61lathat6 a konstruktor, a statikus Main es az InitializeComponent.
1.1.3. Kezdeti beallitasok Legyen a FormI.cs [Design] flil az aktualis, allftsuk be a hatterszfnt es az ablak cimsorat! A Properties ablakban a BackColor mezonel a nyflra kattintva valasszuk ki a szfnt (Web ftil / LightBlue)! A Text mezobe pedig frjuk a Virag szoveget! Az eszkoztarr61 hUzzunk be egy gombot (Button) az ablakba! A gomb szovege legyen 'Hatter kep'! Ezt a Properties ablak Text mezojeben allfthatjuk be. A gomb kapjon 'beszedes ' nevet. A Name mezoje leg yen pictureButton-ra allftva!
Vizsgaljuk meg, mi tortent a k6dban! A Class View ftilben lathatjuk, hogy megjelent a Formi osztalyban a pictureButton tag. A kezdo allapot beallitasa az inicializaIas soran ttirtenik (InitializeComponent). 164
-
1.1. A hatter beaIlito alkalmazas private void InitializeComponent() {
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); .Y&~'1[_Jl.IIBJI1JJ11i:l_. this.ClientSize = new System.Drawing.Size(292, 262); this.Controls.AddRange( new System.Windows.Forms.Control[] { this.PictureButton}); this.Name = "Forml"; this.Text = "Forml"; this.ResumeLayout(false);
•__
_ _"
}
Az inicializahis soran tOrtenik a hlitterszin beallitasa, mely vonatkozik a gomb szfnere is. A this a Form1 objektum.
Ha az InitializeComponent met6dust az osztalynezet helyett a k6dban keressiik, akkor a Windows Form Designer Generated Code felirat alatt talaljuk meg. Eza regi6 (k6dreszlet) tObbnyire osszecsukott allapotban jelenik meg, mert k6djat jellemzoen nem kezzel irjuk, hanem a tulajdonsaglap bealHtasai alapjan a fejlesztoeszkoz generlilja. ForditasiFuttatas 1.1.3.1. A this es a nevterhivatkozasok elhagyhatoak
Pr6bliljuk ki, hogy ha a k6db6l kitOroljiik a this. szovegreszeket, a fordit6 ugyanugy megtalalja a met6dusokat es tulajdonsagokat, es a program hiblitlanul lefut! Ha azonban a using direktivaval hivatkozott nevterek kiirasat megjegyzesjelek moge tessziik, a formt6 azonnal hianyolja a nevter hivatkozast. 165
1. gyakorlat. BevezetO feladat
-
Forditas/Futtahis
1.1.4. A gombon kattinhis
kezeh~se
Azt szeretnenk, hogy a 'Hatter kep' nevii gomb valasztasa eseten megjelenne egy kep az ablak hatterekent! Ehhez ket dolgot kell ismerniink. 1. Hogyan lehet kepet a hatterbe betenni? 2. Hogyan lehet egy gombon a kattintas esemenyt kezelni? Pr6baljuk meg el6szor a kep megjelenfteset az esemenykezeles nelkiil, tehat kezdeti beallftasokkal megval6sftani! Ez a megoldas segfthet abban is, hogy megtudjuk, mil yen k6d segftsegevel tehetjiik ki a kepet az ablakba. Miel6tt nekilatnank azonban, nezziik meg az alkalmazas konyvtaraban elhelyezett ket fajl meretet! Az Eiso alkonyvtarban talalunk egy Forml.resx nevii fajIt, melya Form kirajzolasahoz sziikseges informaci6kat tarolja. Merete 6 KB koriil van. Ha a bin\Debug alkonyvtarban talalhat6 exe fajIt nezziik, annak a merete is hasonl6.
IMegjegyzes: I Ha a resx kiterjesztesii fajl tartalmat is meg akarjuk nezni, azt a Solution Explorer I Show All Files ikonjat valasztva, es a Form1.cs foldert kinyitva az er6forras adatait lefr6 XML fajIt nezhetjiik meg Data es XML megjelenftesben.
1.1.5. A hatterkep beallitasa Nezziik meg, van-e a forrnnak olyan tulajdonsaga, ami a hatterkepet allftja! Legyen a Form1.cs [Design] aktu~lis! A Properties ablakban a Properties megjelenftesevel megnezhetjiik a form tulajdonsagait, es a megjelenes (Appearance) kateg6riaban rogton a BackColor alatt meg is talaljuk a BackgroundImage tulajdonsagot. A keres6gomb segftsegevel csak ra kell keresniink a megjelenftend6 kepre, s azt mar a szerkeszt6ablakban is lathatjuk. A kep termeszetesen nem allftotta at a hatter szinet, amint azt a gomb szfneb61lathatjuk. Ha elmentjiik fajljainkat, nezziik meg a resx fajl meretet, jelent6s valtozast erzekelhetiink. A fordftas es futtatas utan az exe merete is megnovekszik. A meretnovekedes arra utal, hogy a kep adatait mindket fajl tartalmazza, vagyis a kepfajIt nem kell az alkalmazas telepftesekor magunkkal vinni.
166
1.1. A hatter beaIlit6 alkalmazas
-
A resx rajl tartalmat meg is nezhetjiik, es megtalaIjuk benne a kepre vonatkoz6 adattomeget.
Emtan kezeljiik a kattintas esemenyt! Legyen a Forml.cs [Design] aktualis! Hatasara elkesziil a Kattintsunk duplan az egerrel a gombon! pictureButton_Click tagfiiggveny, es mar frhatjuk is a k6djat. ~~~~
1. Gyakorlat. 5. abra Az Eiso osztalydiagramja balra, Class View nezet jobbra. J6l hithat6 az uj pictureButton tag es a PictureButton_Click esemenykezelo met6dus.
Azt szeretnenk, ha a gomb hatasara megjelenne egy kep az ablak hattereben! Nezziik, hogyan va16sftotta ezt meg a Form Designer! Nyissuk ki a Windows Form Designer generated code regi6t, es az InitializeComponent () met6dusban megtalaljuk a hatterkep beallftasat. this.Backgroundlmage = ((System.Drawing.Bitmap) ( resources.GetObject("$this.Backgroundlmage")))i
Jrjuk ezt be az esemenykezelonkbe! private void PictureButton_Click(object sender, System.EventArgs e) {
The type or namespace name 'resources' could not be found hibaiizenetet
kapunk. Tehat a fordft6 nem ismeri fel a resources objektumot. Azert nem, mert az InitializeComponent () met6dus elso. soraban letrehoztuk, itt pedig nem. A lokaIis objektumot nem latjuk a tObbi fiiggvenybOl. Hozzuk letre a k6d masolasaval! 167
Forditas/Futtatas A k6d most mar lefordul, ahhoz hogy lassuk is a kep betolt6deset, a ket sort t6roljtik az InitializeComponent () k6djab61. Meg lehet-e mindezt egyszeriibben is va16sftani? A System. Drawing nevternek van egy Image osztalya is, amit a FrornFile met6dussal tOlthetiink fel. A this-szel kezdjtik a k6d irasat, mert a form tulajdonsagat szeretnenk megvaltoztatni. A pont letitese utan megjelenik a hfvhat6 ftiggvenyek listaja. A BackgroundImage tulajdonsagot szeretnenk allftani. A kepet a fut6 alkalmazas konyvtaraba Elso\bin\Debug-ba tegytik, vagy adjuk meg az eleresi utjat is? private void PictureButton_Click(object sender, System.EventArgs e) {
IMegjegyzes: I Ha kozvetlentil fajlb61 olvassuk be a kepet, akkor a res x fajlb61 kit6rolhetjtik annak adatait. Legegyszeriibben a Data nezetben a sor kijelOlesevel. Ekkor visszacsokken a res x es fordftas utan az exe merete is, de a kep csak akkor tud betolt6dni, ha az eleresi utban megadott helyen a fajl elerhet6 az exe szamara. Valtoztassuk meg az ablak meretet! Azt tapasztaljuk, ha az ablak merete a kep meretenel nagyobb, akkor ujra kirajzo16dik a kep. Azt is lathatjuk, hogy a Hatterkep feliratu gomb nem m6dosftja helyet az ablak szelessegenek valtoztatasakor. Ha azt akarjuk, hogy a gomb az ablak jobb szelet61 mindig azonos tavolsagra legyen, akkor rogzftstik azt a jobb szelhez! Ezt az Anchor tulajdonsag
168
1.1. A haUer be311it6 alkalmazas ~-------------------------------------------------------
kivalasztasaval tehetjUk:. (Design fiil / Properties ablak / Anchor) A felso es a jobb szelhez rogzftsuk a gombot!
1.1.6.Az alkalmazas ikonjanak m6dositasa A Solution Explorerben v:Hasszuk ki az alkalmazas ikonjat tartalmazo fajlt (APP.icO)! A rajz eszkoztarral megszerkeszthetjuk az ikon kepet! A vagolapon keresztiil kepet is masolhatunk bele. A fordftas utan azt lathatjuk, hogy a Debug konyvtar nem minden nezeteben vaItozott meg az ikon kepe. Ne feledkezzunk meg arrol, hogy alapertelmezesben minden ikonnak ket valtozata van, a 32x32-es es a 16x16-os 16 szfnii. Ha csak az egyiket modosftjuk, akkor azokban a nezetekben, amikor a masikat latjuk, nem tapasztalhato a valtozas. Az Image menu / Current Icon Image Types hatasara v:ilaszthatunk a szerkesztett kepek kozott. Az Image menu / New Image Type segftsegevel vehetunk fol ujabb ikontfpusokat tarolasra. Minel tObb tfpust valositunk meg, alkalmazasunk annal tObb kornyezetben lesz kepes a kornyezet beallftasainak megfelelo minosegii ikont alkalmazni. A futaskor a cimsorban megjeleno ikont a Form tulajdonsagai kozt, az Icon tulajdonsagnal allithatjuk be az App.ico fajIra.
"?
Elso - Microsoft Visual C# .NET [design] - App.ico
~~1IJ
1. Gyakorlat. 6. abra Az ikonszerkeszto
169
1. gyakorlat. BevezetO feladat
1.2. Az ertl~k tipusu es a referencia tipusu valtozok osszehasonlitasa
-
Keszitstink egy uj alkalmazast az ertek es referencia valtoz6 k6zti ktilOnbseg bemutatasara! File New Project Visual C# projects Windows Application Name: ValRef Location: beallitva
OK 1.2.1. Az ertEik tipusu valtozok Tegytink a Formra egy GroupBox, ket Label, ket TextBox es ket Button vezerlot! "'«~""
"''' ,
~
~""="~~
~ Form1
..
. .
.....
-
","~"=,,,~~
. .
...
•
~w. ,"'"~-=""~ OJ "" =~'"v_*~''''''''''
. .
",,,"'''''''''''', ~
flU• •
........ ....
. .
...
1. Gyakorlat. 7. abra Az ablak a szerkesztoben
Name GroupBox
valueGroupBox
Label
Ertek (int) tipusu valtoz6k a: /b:
TextBox
aTextBox / bTextBox
Button
aButton / bButton
170
Text
Beolvas: a / Beolvas: b
1.2. Az ertek tipus6 es a referencia tipus6 vaItoz6k osszehasonlitasa
Rendezziik oket a Layout eszkozsor segitsegevel! Ha a GroupBox eltakama a tobbi vezerlot, a Send to Back eszkozgomb segitsegevel "kiildheto" hatra. Vegyiink fel ket int tfpusu tagvaltozot a Forml osztalyba 'a' es 'b' neven!
Class View Forml
jobbeger
Add Add Field Field sccess: private Field Type: int Field name: a Finish Allitsuk be a ket valtozo kezdoerteket! Ez a konstruktor feladata, melyet ugy ismeriink fel, hogy neve megegyezik az osztaly nevevel. public Forml ( ) {
II II II
Required for Windows Form Designer support
InitializeComponent();
II IITODO:Add any constructor code after InitializeComponent call
II
}
AText tulajdonsag sztringet Vllr, igy egyszeriien int erteket nem tudunk.atadni, de a ToStringO met6dussal sztrigge alakftjuk. Kezeljtik a gombokon kattintas esemenyeket! Duplakattintas a gombon.
Az elsa sor az aTextBox vezerlabe bevitt szoveget atalakitja int tipusu valtoz6va. , majd kiirja az a es a b erteket a kepernyare.
!
Forditas/Futtatas
A futtataskor azt l
1.2.2. A hivatkozas tipusu valtoz6k Val6sitsuk meg ugyanezt a feladatot egyelemii tOmbokre! Ne feledjiik, az elsa elem sorszama: O! private int[] ta; private int[] tb; public Forml () {
Forditas/Futtatas A tb=ta; ertekadas utan a tb tomb ugyanazon a mem6riatertileten dolgozik, mint a ta, hisz a tOmbok referencia tipusu valtoz6k, vagyis a mem6riatertilet dmet 172
1.3. Feladatok tartalmazzak. Tehat a ket referencia ugyanarra a teriiletre hivatkozik. fgy hithat6an tb[O] erteket nem is kell megadnunk, az megegyezik tarO] ertekevel. Nezzuk, mi tOrtenik, ha beolvasunk egy erteket barmelyik tOmb O. elemebe! private void taButton_Click(object sender, System.EventArgs e) {
Uthat6an csak a tarO] erteket olvastuk be, megis vele egyiitt valtozott tb[O] erteke is. Ha tb[O] erteket olvassuk be (tbButton_Click), vele m6dosul tarO] erteke is.
1. Gyakorlat. 8. abra Tomb eseten az ertekek egyszerre m6dosulnak Miert nem mutathat6 be ez sztring valtoz6 eseten, hisz a sztring is referencia tfpusu? ¥~rt a sztring tfpusu valtoz6nak va16jaban nem m6dosfthat6 az erteke. Vagyis a m6dosftas soran uj helyen foglal6dik Ie a szoveg szamara a hely. fgy ket azonos ewe mutat6 sztring eseten, ha az egyik uj erteket kap, akkor mar nem mutatnak azonos cfmre.
1.3.
Feladatok
1. Keszftsiink egy aikalmazast, mely egy gomb valasztasanak hatasara egy iizenetablakot tesz ki a kepernyore 'Masik gomb' felirattal! Az iizenetablak 173
1. gyakorlat. BevezetO feladat
-
bezanisa utan az els6 gomb eltiinik es megjelenik egy masodik. A masodik gombot valasztva ugyanez tOrtenik. Ez igy folytat6dik, amig egy Nem unod meg? En mar igen! feliratu szoveg utan nem jelenik meg ujabb gomb. * 2. Keszitstink sztiletesnapi koszont6kartyat! A kartyan nyom6gombokkal valaszthassuk ki, milyen nyelven szeretnenk liz tidvozl6 szoveget latni! Tegytink kepe(ke)t is a szoveg melle!
3. Keszitstink egy utazasi iroda kinalatar61 egy programot! Az utazas celpontjaul felkinalt varosokat nyom6gombok segitsegevel valaszthassuk kit A kivalasztott yaros hatterkepe legyen a yaros egy jellegzetessege, irjuk ki az ablakba az utazas kinalataval kapcsolatos informaci6kat! 4. Keszitstink egy allithato tulajdonsagu ablakot! Az ablak tulajdonsagait gombokkallehessen allitani! Hatterszin, betiiszin, mindig feWI (TopMost), kez alakU kurzor, fix meret. *
Kicsit osszetettebb, de elegansabb megoldas, ha szint beallit6 parbeszedablak objektumot hasznalunk. ColorDialog colorDlg = new ColorDialog(); colorDlg.ShowDialog(); this.BackColor=colorDlg.Color;
174
2. Gyakorlat. Jelsz6bekero ablak A gyakorlat soran keszfttink egy jelsz6bekero ablakot, melybe ktilOnbozo felhaszna16knak mas-mas jelsz6t kell befrniuk a Helyes jelsz6 felirat megjelenesehez. Harom hiMs jelsz6 bevitele utan az alkalmazasleal1'.
~ Jelsz6
[J~~
2. Gyakorlat. 1. abra Az alkalmazas futas kozben Egyszerii jelsz6bekero ablak. J6 jelsz6 eseten kifrja, hogy helyes a jelsz6, hiMs jelsz6 eseten leaH.
2.1. Az egyszerii jelsz6bekero ablak Kerjtik be a jelsz6t, es helyes jelsz6 eseten frjuk ki: helyes jelsz6, s a program fusson tovabb, mig hiMs jelsz6 eseten figyelmeztetes utan alljonle,!
2. Gyakorlat. 3. abra az alkalmazas osztalydiagramja ~
Keszitsiink egy uj projektet! File menU New menUpont
Project Project Types: Visual C# Projects Templates: Windows Application Name:
Jelszo
Location: A kivant konyvtar OK. ~ Nevezziik at a Forml formot JelszoFormra!
Forml.cs [Design] Properties fiU Name mezo: JelszoForm II Az osztaly neve. Text mezo: Jelsz6 Solution Explorer ftil 176
II A dm felirata.
2.1. Az egyszerii jelswbekero ablak Forml.cs-t atnevezni: JelszoForm.cs-re
II A fajl neve.
JelszoForm.cs Main: Application.Run(new JelszoForm(»; II Mar nincs FormI! summary: A namespace deklaraci6 utani megjegyzesek kozt is van egy Form 1.
A /// -el frt es <summary> tegek koze zart megjegyzessorok a fordft6 szamara val6ban. megjegyzesek, de a k6dszerkeszto a tulajdonsaglefr6 sug6 ablakban - (property description TooITips), mely pI. az osztaly objektuma fOle vfve a kurzort jelenik meg - , innet olvassa a megjelenftett adatokat. Ha tehat nem javftjuk itt a nevet, akkor kesobb egy tObb osztalyt, komponenst hasznaI6 alkalmazasban lesz sok egymast61 kiilOnbozo osztalyti, a' sug6 szerint Formi tfpusu ablakobjektum, melyek osztalyat mar reg nem fgy hfvjuk, csak a sug6t nem tajekoztattuk errol. Ezek a megjegyzesek bekertilnek fejlesztoeszkoz altaI generalt XML dokumentaci6ba is. ~
Keszitsiik el a feliiletet!
A Toolbox-b61 valasszunk egy Label, egy TextBox es egy Button vezerlot! M6dosftsuk tulajdonsagaikat a kovetkezore:
X
Name
Text
Label
label
Kerem adja meg a jelsz6t!
TextBox
jelszoBox
'
...'
*
.
Button
ellenorButton
Password Char
Ellenorzes
ne engedjuk meretezni, hisz a tovabbi teriiletek ugyis iiresek: A (Design) / Properties / FormBorderStyle legyen Sizable helyett
U.thatjuk, hogy a szbvegmezoben karakterek helyett csillagok jelennek meg. Ha till kicsinek tahiljuk a csillagokat, a jelszoBox Font tulajdonsaganak Size erteket allfthatjuk nagyobbra. ~
Kezeljiik az ellenorzes gombot!
Duplan kattintva a gombon general6dik a kezelomet6dus. private void ellenorButton_Click(object sender, System.EventArgs e) {
if (jelszoBox.Text != "AAA") Application.Exit(); label.Text = "Helyes jelsz6!"; }
Ez egy egyagu elagazas, ha nem "AAA" a jelsz6, az alkalmazas leall. Ellenorizze az Enter gomb leiitese utan is a jelsz6t! Ehhez a JelszoForm AcceptButton tulajdonsagat az ellenorButton-ra kell allitani! Ha azt akarjuk, hogy a kilepes elott meg irja ki, hogy hibas jelsz6, majd varjon 2 masodpercig, s csak azutan lepjen ki, akkor az igaz ag k6djaba tbbb utasftas keriil, ezeket egy blokkba kell elhelyezni! private void ellenorButton_Click(object sender, System.EventArgs e) {
A varakoztatast a Sleep fiiggvennyel szokas megoldani. A sug6 Indexben rakeresve talalunk is egy Sleep method kulcsot. A .NET Framework Class Library szolgaltatja. A leirasnal lathatjuk, hogy C# met6dus, hogy a Thread osztaly tagfiiggvenye, es a Thread a System. Threading nevterben van leirva. Parameteret milliszekundumban kell megadnunk. Ez egy osztalyszintii met6dus, teMt nem kell hozza objektum, hogy meghivjuk. Vagyis nem hozunk letre uj szalat, csak a szal osztaly statikus met6dusat hivjuk meg.
178
2.2. Harom pr6balkozas
A Sleep egy publikus, statikus met6dus, es emiatt, bar a Thread oszt,Uy tagfiiggvenye, nem kell a vegrehajtasahoz egy uj szal objektumot letrehozni.
~
Forditas/Futtatas
A futtarns soran, bar a program a leallas elott varakozik, megsem latjuk a 'Hibas jelsz6' feliratot! Az Enter miikOdik. Biztosan van a Label osztalynak egy frissito met6dusa pI. Refresh? Ha a valtoz6 nevet begepelve kitessziik a '.' karaktert, a megjeleno sug6ban pr6balkozhatunk az R betUvel, s lam van Refresh met6dusa! private void ellenorButton_Click(object sender, System.EventArgs e) {
Forditas/Futtatas A jelenlegi k6dnal mindegy, hogy a 'Helyes jelsz6!' szoveget az elagazason kiwI, vagy az elagazas else agaban helyezziik el, mert hibas jelsz6 eseten az alkalmazas leall, vagyis a k6d semmikepp nem jut el az elagazas utani k6dsorokra. A szoveg most meg arra is utalhat, hogy itt folytat6dikaz alkalmazas.
2.2. Harom pr6balkozas A program csak a 3. hibas jelsz6 megadasa urnn alljon let
Ehhez sziiksegiink van egy szamlal6ra, melynek kezdoerteke 0, es erteket a hibas pr6balkozasok novelik. Nezziik meg, milyen egesz tipusok allnak rendelkezesiinkre! A sug6 index szerinti keresojeben (Index fill) adjuk meg az int kulcssz6t! Az int keyword a1cim alatt a tObbi egesz tipusr61 is informaci6khoz juthatunk. A byte a legkisebb nem negativ egesz.
179
2. gyakorlat. Jelsz6bekero ablak Class View ftil
-
JelszoForm osztaly, jobbegergomb Add Add Field Field access private Field type byte Field name missed private void ellenorButton_Click(object sender, System.EventArgs e) {
if (jelszoBox.Text != "AM") {
label.Text = "Hib~s jelsz6!"; label.Refresh(); II Frissitesre kenyszeriti a II vezerlot. System. Threading. Thread. Sleep (2000) ; II vAr. if (++missed == 3) Application.Exit(); }
label.Text = "Helyes jelsz6!"; }
p:rivate byten:li ssed::O;
A ++ meg az osszehasonlftas elott noveli a missed erteket eggyel.
~
Forditas/Futtatas
Azt latjuk, hogy a ket masodpercig latszo 'Hibas jelszo!' felirat 'Helyes jelszo!'-ra valt. Igen, hisz most mar nem all Ie minden esetben az alkalmazas: hibas jelsz6 eseten, vagyis ha meg nem erttik el a 3 probalkozast, akkor vegrehajtodik az elagazast koveto sor, mely atirja a szoveget. Most mar tehat csak az else agban helyes a 'Helyes jelszo!' felirat. Vegyiik eszre, hogy a megoldashoz egym
if (jelszoBox.Text != "AM") {
Szepiteskent meg hibas jelsz6 eseten keriiljon a kurzor a TextBox mez6be, legyen kijelolve a tartalom, hogy gyorsabban lehessen az uj jelsz6t meg~dni, es csak a ldlepes elott varakozzon, az uj jelsz6t lehessen azonnal bevinni! private void ellenorButton_Click(object sender, System.EventArgs e) {
if (jelszoBox.Text != "AAA") {
else label.Text = "Helyes jelsz6!"; }
Ha a blokk kezdetet es veget uj sorba tesszuk, a szerkeszto automatikusan tabulalja a zar6 blokkot a nyit6 ala. Egy rovid ideig meg vastagon ki is emeli a part. A blokk zar6 kapocs kiirasakor a blokkban megirt k6dot is tabulalja. Forditas/Futtatas
2.3. Tobb felhaszmil6 egyedi jelszava Legyen tobb fe1haszna16nk, akik kiilonbozo je1sz6va1 rende1keznek! Az ab1akban ket szovegmezo kell, egy a fe1haszna16 nevenek, egy pedig a je1sz6nak a bekeresehez! Sziiksegiink van a fe1haszna16kat es je1szavukat taro16 tOmbre! Egyszeriien frjuk be az oszta1yba a tobbi adattag mage: private string[] user = new string[5]{nAnna n ,
2. Gyakor1at. 5. abra az adatok tombokben A fe1haszna16 azonosft6jat bekero TextBox neve userBox. A Layout eszkozsor eszkozgombjaiva1 rendezziik a felU1etet! A View menii Tab Order. meniipontjaval (vagy a tu1ajdonsag1ap Tab Index mezojeve1) beallfthatjuk a Tab billentyii altaI meghatarozott sorrendet, az ugynevezett tabulator sorrendet. Egyszeriien az egerre1 a kfvant sorrendbe kell a vezerlokre kattintanunk. A 1egkisebb ertek: 0, kezdetben a 0 indexu vezerlo az aktua1is. A fe1iratok nem keriilnek f6kuszba. A Tab Order a meniipont ujrava1asztasava1 kapcso1hat6 ki.
A fiiggveny elejen egy while eiklussal megkerestiik a beirt felhaszmil6 indexet a user lOmbben. Ha megta1ciltuk, a talalat helyenek indexevel lep ki az i, ha nem ta1ciltuk, akkor i = 5 ertekkellep ki. Ez alapjan tesztelheto, hogy volt-e talalat.
A felhasznal6t a Linearis Kereses programozasi tete I segftsegevel kerestiik meg. A programozasi tetelekkel a kesobbiekben reszletesen foglalkozunk. Ha a hibas felhasznal6i nevet is a harom hibaba beszamoljuk, akkor a 'Nines ilyen user' agat is a 'Hibas jelsz6' agnak megfeleloen ki kell egeszfteni a missed novel6 es vizsga16, az alkalmazast leallft6 k6ddal.
Hibas felhaszn.3lo nev Felhasznalo nev: Jelszo:
!mml Ellenorzes
2. Gyakorlat. 7. abra A hibas felhaszna16 esete
A hibas jelsz6 (felhasznaI6nev) utan ugy is beallfthatjuk az ablakot, hogy kitoroljiik a hibas sz6t, es a lOrles utan a kurzor az tires szovegmezoben varakozik az uj bevitelre UelszoBox.Clear();). 184
-
2.3. Tobb felhaszmil6 egyedi jelszava
A felhaszmil6k szama novekedhet vagy esokkenhet. Ekkor mindeniitt a jelenlegi '5' erteket at kell lrnunk az lij ertekre. Ha valahol elfelejtjiik a m6dositast, az slilyos programozasi hibahoz vezethet. (PI. olyan Wmbindexre hivatkozunk, arnilyen eleme mar nines is a Wmbnek.) Ezert fontos ely, hogy az 'ilyen' ertekeket a program~an egy valtoz6ban taroljuk, es a program irasa soran rnindeniitt erre hivatkozzunk! Igy valtozas eseten elegendo egyetlen helyen m6dositani a k6dot.
JelszoForm Add Add Field Field access: private Field type: int Field name: numOfUsers Filed modifiers: Constant Field value: 5 Finish Mivel a vaItoz6 ertekenek valtoztatasat a futas soran nem engedelyezziik, legyen konstans! Ekkor kotelezo az ertek kiWltese is.
Edit menii Find & replace Replace Find what: 5 Replace with: numOfUsers Find Next es ha eserelni klvanjuk a szamot: Replace private byte missed=O; private string[J user = private string[J
A tOmbOk megfelelo szamu elemenek beallftasat a fordft6 ki fogja kenyszerfteni. A felhasznal6nevek legbrdiilo listabOl tbrteno kivalasztasara, es az alkalmazas foablakanak megnyitasara a 3. gyakorlat, uj felhasznal6 felvetelere a 4. gyakorlat, mfg a jelsz6 fajlba mentesere az 5. gyakorlat feladatai kbzt latunk peldat.
2.4. Feladatok 1. M6dosftsuk alkalmazasunkat ugy, hogy minden felhasznal6 harom jelsz6beviteli lehetoseggel rendelkezzenl Pontosabban, ha valtozik a felhasznal6, akkor kezdjtik ujra a hibas jelszavak szamlalasatl 2.
Kep ki-be. Az 'EIso' alkalmazast m6dosftsuk ugy, hogy ha nines kep a Mtterben, akkor legyen, de ha van, akkor tiinjbn ell A gomb felirata is valtozzon a feladatnak megfeleloen! *
3.
Automatikus szemetgyiijtO demo. Hozzunk letre egy osztalyt, mely egy statikus adattagban szamolja a peIdanyai szamat! Egy alkalmazasban gombnyomasra hozzunk letre egy valtoz6ban sok peldanyt! Nezztik meg, hogyan szabadftja fel az automatikus szemetgyiijto az elengedett peldanyokat!*
4.
Sztringek osszehasonlitasa. Keszftstink alkalmazast, mely sztringeket hasonlft bssze! Legyen egy az == operatort, egy az Equal met6dust es egy a CompareTo met6dust hasznal6 gombunk! Az eredmenyt frjuk ki a ket beviteli mezo k6ze! Ha valamelyik sztring tires, azt kiilbn frjuk ki!*
5.
Keszftstink egy alkalmazast, mely a sztinet elott kifrja a VAKAcIO szbveget! Eloszbr esak az utols6 O-betiit lassuk, az egerrel kattintva rajta jelenjen meg az I, es minden tovabbi betiin kattintva az elotte aH6 betii. Esetleg a vegen egy Vegre itt a vakaei6!!! parbeszedablak is elobukkanhat!
6.
Happy 15th birthday! Adja meg, hogy Mnyadik sziiletesnap (15), es megjelenik a 'Happy 15 th birthday!' felirat val ami j6pofa keppel a Mtterben. *
3. Automatikus szemetgyiijtO demo Hozzunk letre egy GC nevil alkalmazast! A Solution Explorerben a projekten jobbegerrel kattintva: Add / Add class I MyClass. public class MyClass {
public { }
}
Az alkalmazasunk formjan egy gomb a kovetkezo k6dot hivja: private void buttonl_Click(object sender, System.EventArgs e) {
for (int i=Oii
MyClass m = new MyClass()i Console.WriteLine("Db: " +MyClass.db) i }
}
187
2. gyakorlat. Jelsz6bekero ablak Nezziik futas kozben az Output ablakban (View menii / Other Windows) a kifrt szamokat, mikozben t6bbszor megnyomjuk a gombot! Gorgessiik vissza az Output ablak tartalmat, keressiik meg a pontokat, ahol automatikus szemetgyiijtes t6rtent! Ne feledjiik, mi nem sziintettiink meg egyetlen objektumot sem, csak elengedtiik oket! 2. Gyakoriat. 8. abra Az Output ablak az eppen letezo objektumok szamat mutatja.
if (saTextBox.Text== "" I I sbTextBox.Text == "") compareLabel.Text="ures"; else if (saTextBox.Text == sbTextBox.Text) compareLabel.Text = "="; else compareLabel.Text = "<>"; }
6. Happy 15th birthday! switch (age % 10) {
case 1: suffix break; case 2: suffix break; case 3: suffix break; default: suffix break; }
188
= (age / 10
1)
?
"th":
"st";
= (age / 10
1)
?
"th":
"nd";
= (age / 10
1 ) ? " th":
" rd" ;
= "th";
3. Gyakorlat. A vezerlok hasznalata 3.1. Az ablak mint allatorvosi 16 Keszftsunk egy ablakot, amin megpr6baljuk bemutatni a Form es a vezerl6k beallftasainak minel tObb lehet6seget!
Name: Lo Nevezzuk at a Form osztalyunkat LoForm~ra!
3.1.1. A hatterszin beallitasa futasidoben Az ablak hatterkepet mar allitottuk az elso gyakorlaton, most tegyiink egy Hatterszln feliratu gombot ablakunkba! A kattintas esemeny a gombon alapertelmezett, tehat miutan a Name:: HatterSzin_Box es Text: Hatterszln tulajdonsagat beallitottuk, elegend6 duplan kattintani az egerrel a gombon, es elkesziil az esemenykezelo. A szint a kesz ColorDialog ablak segitsegevel szokas kivalasztani. Tegyiik ki azt modalisan a kepernyore! private void HatterSzinButton_Click(object sender, System.EventArgs e) {
ColorDialog dlg= new ColorDialog(); II Uj ablak. if (dlg.ShowDialog()==DialogResult.OK) IIKiteszi modal. BackColor = dlg.Color; II Kiolvassa a szint. }
A form hatterszine 1egyen a parbeszedablakban kivalasztott szinnel egyenlo!
!
Forditas/Futtatas
Nezzuk meg, va16ban nem valaszthat6 a fOablak, amfg a szinbeallit6 ablak nyitva van!
~IK_e_s_z_fts_u_·k_e_l_a_.b_e_t_ak__Sz_f_n_et_v_a_lt_o_n_a_to_'=90_m __ b_ot_i_s_'________________~Ii 3.1.2. A dmsor szovegenek m6dositasa Egy szoveget 1egegyszeriibben egy szovegmezoben vihetiink be. Vegyiink fel egy CimLabel nevil, Cfmsor szovege Text tulajdonsagu szoveget es egy CimBox new 'Az ablak mint allatorvosi 16' Text tulajdonsagu szovegmezot! Mivel a TextBox alapertelmezett esemenye a TextChanged, tehat eleg kettot kattintanunk rajta: private void CimBox_TextChanged(object sender, System.EventArgs e) {
Text = CimBox.Text; }
190
3.1. Az ablak mint allatorvosi 16
~
Forditas/Futtatas
Uthatoan amint v~Utozik a szovegmezobe frt szoveg, ugy modosul a elm.
3.1.3. Az ablak bizonyos szinek mogott legyen atbitsz6! E16szor is tegyiink fel egy panelt az ablakra ugy, hogy a ket hatterszint anito gomb f016tte legyen! A panel batterszinet anitsuk feherre! Vegyiink fel egy GroupBox vezerlot 'Athitszo szin' felirattal! Tegyiink bele egymas utan 4 valasztogombot (RadioButton)! Feliratuk es nevtik legyen rendre: Feher, Fekete, Control, Nines. Kezeljiik a CheekedChanged esemenyiiket! private void WhiteButton_CheckedChanged(object sender, Systern.EventArgs e) {
Annak visszaallitasahoz, hogy ne legyen egyik szin sem atlatszo, allitsuk iires szime az atlatszo tulajdonsagot! private void NincsButton_CheckedChanged(object sender, Systern.EventArgs e) {
TransparencyKey
= Color. Empty;
}
3.1.4. Az ablak attetszosege Az attetszoseg merteket az Opacity tulajdonsag adja szazalekban. Egy esuszkaval (TraekBar) modositsuk az erteket! A esuszka Maximum tulajdonsagat allitsuk 100ra, mig Minimum erteket O-an hagyjuk. !A§;Form rendelkezik egy Opacity tulajdonsaggal, melyben megadhatjuk, hogy bany szazalekban kivanjuk latni az ablakot. •·~~;zit:siink egy esuszkat, mellyel az ablak attetszosege szabalyozhato! Mivel az tulajdonsagot %-ban adjuk meg, eelszerii a esuszka (TraekBar) ertekeit 0 es 191
3. gyakorlat. A vezerlok haszmilata
100 koze venni. Huzzunk be a formra egy TrackBar vezerl6t! Neve legyen opacityTrackBar, a Maximum tulajdonsagat allitsuk tOO-ra (Minimum marad 0), es az erteket (Value) is tOO-ra allitsuk kezdetben! Majd kezeljiik a Scroll esemenyet! private void opacityTrackBar_Scroll(object sender, System.EventArgs e) {
Opacity = ((float)opacityTrackBar.Value)/lOO; }
A TrackBar erteke int tipusu, ha egyszeriien 100-zal osztjuk, az egesz resz 0 lesz, tehat azonnal eltiinik az ablak. Ha el6bb float-ta konvertaljuk, akkor az osztas eredmenyebe is lehet tOrtresz.
~
Forditas/Futtatas
Ne feledjiik az egeret a csuszkan tartani, mert a teljesen atlatsz6 ablakot ertelemszeriien nem hitjuk. Ilyenkor a futtat6kornyezet Stop debugging gombjaval vagy Ctrl + Alt + Del utan Task List-bOl allithatjuk Ie. Ha kipr6baljuk, azt tapasztaljuk, hogy az els6 pillanatban egy kicsit elfeketedik az ablak, de utana szepen miikOdik az attetsz6seg. A feketedest az okozza, hogy rnivel az ablak nem volt attetsz6, igy nem volt sziiksege a hatter informaci6k tarolasara, ezt az els6 beallitas soran tOlti be. Ha kezdetben 99%-ra allitjuk az attetsz6seget (Opacity), akkor bar ez meg nem erzekelhet6, megis mar kezdetben sziikseg lesz a hatterkepre. Ekkor a program indulasakor latjuk a fekete villanast, de kes6bb nem. Teljes atlatsz6sag beallitasakor, bar az ablakot eltiintettiik a keperny6r61, a ta1can lathat6, es a gyorsmeniivel be is zarhat6. Ha azt akarjuk, hogy innet is tiinjon el, a ShowlnTaskbar tulajdonsagat allitsuk hamisra! private void opacityTrackBar_Scroll(object sender, System.EventArgs e) {
3.1.5. A tulajdonsagok ki-be kapcsolasa jelolonegyzettel Legyen nehany olyan tulajdonsaga ablakunknak, ami egymast61 fiiggetleniil allithat6! Ezek a tulajdonsagok legyenek ki-be kapcsolhat6ak! A tulajdonsagok a kovetkez6k: ~ Az
192
ablak formajanak m6dositasa.
3.1. Az ablak mint allatorvosi 16 ~
Az ablakunk legyen mindig fOnt, akkor se tiinjon el, ha egy masik ablakot
helyeziink f6kuszba! ~
Meretezhetoseg allftasa.
~
Gorgethetoseg aIlftasa.
3.1.5.1. Az ablak formajanak m6dositasa Tegyiink ki egy je1010negyzetet a Formra, es kezeljiik a valasztas (vaItoztatas) esemenyt! LoForm.cs(Design) CheckBox vezerlo a Tooffioxr61 Properties Name: regionCheckBox Text: Uj forma Events: CheckedChanged
duplaklikk
Pr6baljuk meg hagyomanyos gondolkodassal megoldani a fe1adatot! Van az ablaknak egy kezdo regi6ja, legyen ez a frrstRegion, es van egy masik, amit valaszthatunk (region). A je1010negyzet ki-be kapcsolasa ezek kozotti valtogatast jelent. A firstRegion megkaphatja a kezdoallapot erteket, a region pedig a konstruktorban kap kezdoerteket. Dgyeljiink ra, hogy a jelO1onegyzet a valasztott teriiletre essen!
public LoForm ( ) {
InitializeComponent();
II II TODO: Add any constructor code after II InitializeComponent call II
i f (this.Region== firstRegion) this.Region else this.Region = }
!Megjegyies:1 A Form osztaly Region tulajdonsaga mogott, feltehetoen egy region privat adattag tarolja a form aktualisan beallftott regiojat. Nem problema, ha az utodosztalyban azonos nevu adattagot hozunk letre, mert az a tagftiggvenyekhez hasonloan eltakarja az ososztaly azonos new adattagjat. Ez fontos, hisz a sligo nem mutatja meg a privat tagok nevet, mert azokhoz a fejleszto nem ferhet hozza. Forditas/Futtatas
Mar az iras soran is fel kellett tunnie, hogy nem mukodik a sugo, de a forditas soran a GraphicsPath-t nem ismeri fel. Ha a szora kattintva az Fl gombot megnyomjuk, a sligo About GraphicsPath class leirasanak vegen a Reqiurementsben megtalaljuk, hogy az osztaly a System.Drawing.Drawing2D nevterben szerepel, mely a System.Drawing.dll-ben talalhato. Ezt a dll-t mar hasznaIjuk, fgy csak a nevteret kell a using direktfvavallehivatkozni.
~
Forditas/Futtatas
Azt tapasztaljuk, hogy egyszeri ki-be kapcsolas mukOdik, de mas ods zorra hibaiizenetet kapunk. Vizsgaljuk meg nyornkovetovel a hiba okat! Tegyiink tOrespontot a regionCheckBox_CheckedChanged ftiggveny elso sorahoz ligy, hogy a k6d melletti sziirke csikra kattintunk az egerrel! Ott egy bordo pont je1enik meg, amit ugyanfgy vehetiink ki. Ennek hatasara, ha nyornkovetessel futtatjuk a programot (Start), akkor Ie fog aIlni a vegrehajtas, amikor ehhez a sorhoz er. Kezdetben meg a form Region tulajdonsaga azonos a firstRegion-nal. A keperny6 aljan (3. Gyakorlat. 2. abra ) lathato Watch ablakba irjuk be a vizsgalni kivant valtozok erteket! Egyebkent a k6dban az egermutatot barmely valtozo fCile mozgatva a megjeleno ablakban megnezhetjiik annak pillanatnyi erteket.
194
-
3.1. Az ablak mint allatorvosi 16
I
System.MarshalByRefObject
{System.Drawing.Region} {System. Drawing. Region}
1~lIiDmmllli;I~1I1II42 54577680
System. Drawing. Region System.MarshalByRefObject int System.Drawing.Region System.Drawing.Region
3. Gyakorlat. 2. abra Nyomkovetes kozben a k6d sarga nyfllal jelzett sora kovetkezik a vegrehajtasban Az elso, amit eszrevesziink, hogy a frrstRegion erteke null, ezt pedig folOsleges kiilOn valtoz6ban tarolni. Mivel a gondot a harmadik valasztas okozta, addig menjiink tovabb (continue)! A masodik valasztas utan lathatjuk, hogy a this.Region az elso valasztas soran felvette a region erteket. A k6d mostani vegrehajtasa soran (StepOver) pedig ujra null erteket kap. Continue. A harmadik megallas soran azt tapasztaljuk, hogy mikozben a this.Region erteke null lett, a region nativeRegion tagja is 0 erteket kapott. Ez okozza aztan a hihat.
Vagyis a k6d lrasa soran nem vettiik figyelembe, hogy a C# objektumok referenciak. Kezdetben a form Region tulajdonsaga nem mutat sehova (null). Kesobb raallitjuk a konstruktorban elkeszitett regi6ra, ami azt jelenti, hogy a region es a this.Region azonos mem6riateriiletre mutatnak. Amikor a this.Region null erteket kap - a nativeRegion adattagnak is el kell engednie hivatkozasat, hogy az automatikus szemetgyiijto felszabadithassa -, vele egyiitt a region is elvesziti az altala mutatott dmet. Tehat hiaba terveztiik el, ezzel a m6dszerrel nem lehet visszaallitani a regionban kezdetben meghatarozott allapotot. Vagyis, ha megorizni nem tudjuk, akkor letre kell hozni minden alkalommal az uj regi6t, amit aztan az automata-szemetgyiijto szabadit fel, amikor mar nem hasznaljuk. Azert, ha futas kozben megnezziik a Windows feladatkezelo (Ctrl + Alt + Del) folyamatok ablakaban az alkalmazas altaI felhasznalt mem6riat, az a valtasokkal egyre novekszik. Ne fe1edjiik, az automatikus szemetgyiijtot, mint a 195
3. gyakorlat. A vezerlOk hasznalata neveben is bent van, nem mi indftjuk! Emellett a gyakorlatban nem szokas siiriin vaItoztatni egy ablak alakjat. A nyomkovetest a Stop Debugging valasztasaval allithatjuk Ie. A javitas utan nines sziikseg a ket Region adattagra es a konstruktorba frt k6dra. A K6d a javitas utan: private void regionCheckBox_CheckedChanged(object sender, System.EventArgs e) {
if (regionCheckBox.Checked)
// (this.Region== firstRegion)
{
GraphicsPath gp = new GraphicsPath(); gp.AddRectangle(new Rectangle(O,O,Width,60)); gp.AddEllipse(10, 62, Width-20,100); this.Region = new Region(gp); }
else this.Region
= null;
}
Ugyeljiink ra, hogy a regi6t a11it6 jelOlonegyzet, de legalabb a fomenii ikonja vagy a bezar6 gomb elerheto legyen, mert kiilOnben a talcan jobbegerrel, vagy a feladatkezelot hivva a Task List-ben kell a fut6 alkalmazast leallftanunk!
A Region osztaIynak van egy Clone nevil met6dusa, mely egy masolatot keszit az objektumr61. Ha a Region tulajdonsagot e masolattal tessziik egyenlove, akkor megorizhetjiik az eredeti valtoz6 erteket. Ez azonban minden alkalommal ujra letrehoz egy uj valtoz6t, tehat a k6d nem lesz hatekonyabb a fent lefrtnal. Masreszrol az ablakmeret valtoztatasa eseten, ha azt akarjuk, hogy a felirat toltse ki az egesz ablakot, akkor ugyis ujra kell szamolni a regi6t. Alakftsuk at a regi6t LO feliratra! GraphicsPath gp = new GraphicsPath(); gp :"AddRectangle (nE;w Rectangle (0,0,100, Height) ) ; gp.AddRectangle(new Rectangle(100,Height-100, Width-100,100)); gp.AddEllipse(100, 50, Width-100,Height-100);
196
-
3.1. Az ablak mint allatorvosi 16 point[] points = new Point[4]i points[O] = new Point(Width-40,30)i points[l] = new Point(Width,30)i points[2] = new Point(Width-20,60)i points[3] = new Point(Width-60,60)i gp.AddPolygon(points)i
3. Gyakorlat. 3. libra Az ablak formlija a L6 sz6 Ha azt akarjuk, hogy a meretezes szlimolja ujra a regi6t, akkor a LoForm SizeChanged esemenyeben kell ezt elvegeztetntink! LoForm[Design] / Properties ablak / Events fill/ SizeChanged duplaklikk private void LoForm_SizeChanged(object sender, System.EventArgs e) {
regionCheckBox_CheckedChanged(sender,e)i }
3.1.5.2. A TopMost tulajdonsag Uj jelolonegyzet: Name: topCheckBox Text: Mindig fOnt
case "Homokora":{Cursor=Cursors.WaitCursor; break;} case "Kereszt": {Cursor ~ Cursors.Cross;break;} case "K~z":{Cursor = Cursors.Hand;break;} case "S6go":{Cursor = Cursors.Help;break;} } }
jL,Jt Az
elegedett On a fizetesevel lehetosegekkel is tahHkozhatunk.
feladatban
tovabbi
kurzorkezelesi
3.1.7. Az ablak merete beolvasassal Nyom6gomb: Name: sizeButton Text: Ablakmeret
Solution View Lo project
jobbeger
Add Add Windows Form Templates: Windows Form
.Name: SizeForm.cs Open Properties, Text: Ablakmeret beallitasa
3. Gyakorlat. 4. abra A meretet beolvas6 ablak a szerkeszt6ben A szovegmez6k nevei a kim szovegben olvashat6k. A vezerl6k legyenek public hozzaferesiiek, hogy kiviilr61 aIlithassuk ertekiiket! Tegyiink egy OK es egy Megse gombot is az ablakba! Az OK gomb DialogResult erteke legyen OK, a megsem gomM CANCEL! A
SizeForm AcceptButton tulajdonsaga legyen az OKButton, igy Enter hatasara az OK gomb DialogResult erteke allit6dik be. A CancelButton tulajdonsagot aIlitsuk a megsem gombhoz tartoz6 nevre, igy Esc hatasara a Megsem gombhoz rendelt esemenykeze16 hiv6dik meg. private void sizeButton_Click(object sender, System.EventArgs e) {
SizeForm form = new SizeForm(); form.xTextBox.Text=Left.ToString() ; form.yTextBox.Text=Top.ToString(); form.widthTextBox.Text=Width.ToString(); form.heightTextBox.Text=Height.ToString() ; form.ShowDialog() ; if (form.DialogResult==DialogResult.OK) {
1. A jelsz6bekero alkalmazasunkat oldjuk meg ugy, hogy a felhasznal6k nevet egy comboboxb61lehessen kivalasztani! Helyes jelsz6 eseten nyfljon ki a foablak, Mrom hibas jelsz6 eseten Iepjiink ki az alkalmazasb6l! *
2. CSUszka es folyamatkijelzo. Tegyiink az ablakra egy csuszkat es egy folyamatkijelzot! Mindketto azonos ertekhatarokat mutasson! A esuszkat mozgatva a folyamatkijelzo is mutassa a beallftott erteket! Egyiitt mozogjanak!*
3. Egy utazasi iroda az utazasra vonatkoz6 adatokat ker. Ha repiilogeppel utazunk, kerdezze meg, hogy business vagy turista osztalyon utazik-e, ha vonattal,.akkor ker-e hal6koesit es helyjegyet, busz es sajat szemelygepkocsi eseten nem kerdeziink semmit.
4. Tipp. A feladat 1 es 100 kozotti veletlen szamra megtippelni, hogy 50-nel nagyobb lesz-e. A ket szam kozti gombra kattintva az egerrel valtozik a =, » felirat. Helyes tipp eseten a jatekos folyamatkijelzoje, hibas tipp eseten a gep folyamatkijelzoje novekszik. Aki elobb eleri a 10 pontot, az nyerte a jatekot. *
«;
5. Ko, papir 0116 jatek. A jatekos kijelOl, a gep veletlenszam-generatorral valaszt. A jatek alIas at folyamatkijelzo mutatja.
6. Elegedett On a fizetesevel? A kerdes az ablak cfmsora, es az ablak ket gombot tartalmaz, az egyiken 'Igen', a masikon 'Nem' felirat. Ha az egeret a nem gomb fOle vissziik, hogy kivalasszuk, az elugrik egy veletlen helyre. igy esak az 'Igen' gomb lesz valaszthat6, ami utan egy parbeszedablak a kovetkezo szoveget frja ki: A fonoke elegedett Onnel!* A feladat megoldhat6 'Szereted a esokit?' kerdessel, es itt esak a 'Nem' valasz valaszthat6, es a 'A fogorvosod elegedett Veled!' felirat a befejezes.
201
3. gyakorlat. A vezerlok haszmilata
--
A fOnoke elegedett annei!
IL::::::::::9.~::::::::::::l1
Mas megvalositas: Ne engedjtik a kurzorunkat az 'Igen' gombr61 elmozdulni! Mas megvalositas: Ne a gombot, az egeret dobjuk veletlen helyre! 7. Szamologep. Keszftstink egy szamol6gepet, eloszor csak a negy alapmuvelet elvegzesere, aztan lehet tovabbfejleszteni!
3.3. Megoldasotletek 1. Valasszuk combo-bol ajelszobekero ablak felhasznalojatl A combo neve: userComboBox, Text tulajdonsaga tires, DropDownStyle tulajdonsaga DropDownList (lehet DropDown is, ha az uj user bevitelet is itt akarjuk kes6bb megvaI6sftani). Az items collection ablakaba vigyiik fel a felhasznal6kat! A kivalasztott elem indexet a Selectedlndex met6dus adja vissza. Ha meg nem valasztottunk ki semmit, visszaadott erteke -1, egyebkent a collection megfelel6 elemenek sorszama. (Az indexelest O-val kezdjtik!) Az ellenorButtonClick fuggveny fenti k6dreszlete a kovetkezore m6dosul: private void ellenorButton_Click(object sender, System.EventArgs e) {
if (comboBoxl.SelectedIndex>-l&& jelszoBox.Text == jelszo[comboBoxl.SelectedIndex]) II Helyes jelszo. label.Text = "Helyes jelszo!"; else II Hib~s jelszo .... }
Helyes jelsz6 esten jelenjen meg a fOablak! Ehhez eloszor letre kell hoznunk a fOablakot!
202
3.3. Solution Explorer Jelszo namespace
jobbeger
Add Add Windows Form Windows Form Name: MainForm Open Itt mar szerenesere nines sziikseg az atnevezesekre. A Main met6dust kell m6dositanunk, hogy mielott elindul az alkalmazas, kerje be a jelsz6t! A jelsz6bekero ablakot modalis an nyissuk ki (ShowDialog)! Ez azt jelenti, hogy amig be nem zartuk, addig az alkalmazas tObbi ablaka nem kap f6kuszt. A modalis ablaknak van visszateresi erteke. Ez a DialogResult tulajdonsagban taro16dik. Ezt az erteket be kell al1itanunk helyes jelsz6 es 3 rossz jelsz6 eseten. static void Main() {
4. Tipp Minden kattintasra valtozzon a gomb felirata es a tipp tagvaltozo erteke! private int tipp=l; private void tipButton_Click(object sender, System.EventArgs e) {
A MouseEnter is j6 lenne, esak ha veletleniil ugy indul az alkalmazas, hogy az eger epp a 'Nem' gomb fOlott van, akkor nem ugrik el. Ha azt akarjuk, hogy a Tab gombbal se lehessen fi:lle mozdulni, aIlftsuk hamisra a TabStop tulajdonsagot!
Mas megvalositas: Ne engedjiik a kurzort az 'Igen' gombr6l elmozdftani! A Cursor Clip tulajdonsaga adja meg a teglalapot amibe a kurzort bezartuk. A teglalapot kepernyo koordinatakban kell megadni (RectangleToScreen)! Mivel esak olyan ablakra lehet beallitani, amelynek a Cursor iizenetek mennek, az ablak aktivalasakor tudjuk beallitani.
A teszteles soran, Alt F4-gyel bezarhat6 az ablak, ha a kurzort nem tudjuk kimozdftani. privateRectangle fullScreenRect; private void FizForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
Mas megval6sitas: Ne a gombot, az egeret dobjuk veletlen helyre! private void nemButton_MouseMove(object sender, System. Windows. Forms . MouseEvent:Args e) {
II nemButton.Left=rand.Next(ClientSize.WidthIlnemButton.Width) ; II nemButton.Top=rand.Next(ClientSize.HeightIlnemButton.Height); Cursor.Position = new Point ( rand. Next (fullScreenRect.Width), rand.Next(fullScreenRect.Height)); }
207
4. Gyakorlat. Programoz3si tetelek Geneniljunk egy uj Windows Applicationt Tetelek neven! A Formjat nevezziik TetelekFormnak! Az egyes tetelcsoportok bemutatasahoz hasznaljunk TabControlt! A tabControl TabPages tulajdonsagat tOltsiik fol elemekkel!
4.1. A csere algoritmusa TabPage Collection Editor Add Name: csereTabPage Text: Csere A csere, mint nevebol is kideriil, ket vciltoz6 erteket hivatott kicserelni.
A feladatban be kivanjuk mutatni, hogy a csere soran sziiksegiink van segedvaltoz6ra. A hibas es helyes k6dot egy-egy listadobozban taroljuk. A mozg6 feladata az adatmozgas bemutatasa. Keszitsiik el a kovetkezo feliiletet a tervezoben!
Name
Text
TextBox
aTextBox, bTextBox
3,5,
Label
aLabel, bLabel,
a:, b:
Visible
Items
209
4. gyakorlat. Programoz3si tetelek
Name
Text
Items
Visible
TextBox
tempTextBox
Label
tempLabel
segedvaltoz6 (tern ):
False
Label
textLabel
mozg6
False
ListBox
failedCodeListBox
False
a=b·, b=a·,
ListBox
validCodeListBox
False
Helyes k6d: temp=a; a=b; b=temp;
Button
startButton
Kezd
Button
helyesButton
Helyes k6d kezd
False
False
A textLabel BackColor tulajdonsagat allftsuk White-ra, ForeColor tulajdonsagat pirosra es a fontjat felk6verre (Bold) . .
4. Gyakorlat. 1. abra A csere ftil felhasznal6i feltilete a tervez6ben
Ugyeljtink a vezerl6k egymas fOlOtti elhelyezesere! (A textLabelt hozzuk legfeltilre!) Futasid6ben csak az a, b valtoz6k es a Kezd gomb lathat6 indulaskor. lrjuk meg a kezd valasztas k6djat! Ne vegezzen val6sagos cseret, mert akkor elveszitjtik 'a' erteket!
Amikor a textLabelleer a bTextBoxr61- annak ablaka tires. Ha ujraindftom: az 'a' tires, a 'Ribas k6d' szoveget ujra es ujra befrja a listadobozba. Celszerii lenne a gomb 'Kezd' szoveget 'Hibas k6d kezd' -re valtoztatni, ha mar tudjuk, hogy ez fgy hibas. Az ablak feliiletenek frissftese egy windows tizenet kezeleset jelenti (meghozza pihenoidos tevekenysegkent). Amfg egy fiiggvenytink k6djanak vegrehajtasat vegezztik, nem lenne j6, ha kevesM fontos (pihenoidos) tevekenysegek vennek el a vegrehajtast61 az idot. Itt viszont mi azonnal szeretnenk latni a megjelenftett labelt, vagy a mogotte immar latsz6 szovegmezot, ezert magunknak kell a RefreshO ruggvenyhfvassal kikenyszerfteni a frissftest.
A hibas k6dot tartalmaz6 listadoboz nem baj, ha piros hatterii marad, es most mar valaszthatunk a hibas vagy helyes k6d vegrehajtasa kozott, hogy osszehasonlfthat6k legyenek.
211
4. gyakorlat. Programoz3si tetelek A k6d a m6dositasok utan: private void startButton_Click(object sender, System.EventArgs e) {
Forditas/Futtatas/Teszteles Mivel a fiiggveny vegen nem csereIjiik ki az aTextBox es a fOle mozgatott textLabel szoveget, hanem fOlotte latni hagyjuk pirossal a hibas erteket, ezert minden ujrakezdeskor az aTextBox tartalmat frissiteni kell, hogy kezdetben lathato legyen.
212
4.1. A csere a1goritmusa
4. Gyakorlat. 2. abra A csere hibas k6dja futas utan
4.1.2. A helyes csere Kezeljiik a 'Helyes k6d kezd' gombon kattintas esemenyt! El6bb csak a temp=a-;t! private void helyesButton_Click(object sender, System.EventArgs e) {
aTextBox.Refresh(); validCodeListBox.Visible=true; validCodeListBox.Refresh() ; validCodeListBox.SelectedIndex=3i //temp=a; tempLabel.Visible=truei tempLabel.Refresh(); tempTextBox.Visible=true; tempTextBox.Refresh() i //Kiteszi a textLabelt. textLabel.Left=aTextBox.Left; textLabel.Top=aTextBox.ToPi textLabel.Text=aTextBox.Text; textLabel.Visible=truei textLabel.Refresh()i System.Threading.Thread.Sleep(300);
213
4. gyakorlat. Programozasi tetelek //Mozgatja a textLabelt tempre. while(textLabel.Topl=tempTextBox.Top)
--
{
textLabel.Top--; if (aTextBox.Top==textLabel.Bottom+l) aTextBox.Refresh() ; if (aLabel.Top==textLabel.Bottom+l) aLabel.Refresh(); System. Threading. Thread. Sleep (20) ; }
Forditas/Futtatas/Teszteles Itt nemcsak az aTextBox, hanem az aLabel fOlott is elmegy a textLabel, fgy amikor elhagyja, annak megjeleneset is frissfteniink ken! A kovetkezo k6dreszlet szinte a fenti hibas k6ddal azonos, csak itt mar megtortenhet az ertekadas, mert 'a' erteket elmentettiik temp-be. Irjuk a tempBox.Refresh(} utan: private void helyesButton_Click(object sender, System.EventArgs e) { .. ,
~ Forditas/Futtatas/Teszteh~s Mar csak a temp tartahmit kell b-be betenni. private void helyesButton_Click(object sender, System.EventArgs e) { ...
aTextBox.Refresh() i / /b=tempi validCodeListBox.SelectedIndex++i System.Threading.Thread.Sleep(500)i //Kiteszi a textLabelt temp-reo textLabel.Left=tempTextBox.Lefti textLabel.Top=tempTextBox.ToPi textLabel.Text=tempTextBox.Texti textLabel.Visible=truei textLabel.Refresh() i System.Threading.Thread.Sleep(300)i //Mozgatja temp-bol b-be. while (textLabel.Left ! =bTextBox.Left) {
textLabel.Left+=2i textLabel.Top++i if (tempTextBox.Left==textLabel.Left-l) tempTextBox.Refresh() i System.Threading.Thread.Sleep(20)i }
bTextBox.Text=textLabel.Texti textLabel.Visible=falsei bTextBox.Refresh() i
215
4. gyakorlat. Programozasi tetelek IIEltlintetjlik a segedvaltozGt. tempTextBox.Text=""i II Ujrainditas miatt. tempLabel.Visible=falsei tempTextBox.Visible=falsei
-
}
Forditas/Futtatas/Teszteles Bar a harom k6d mIs-mas adatokat cserelt ki, mas iranyU mozgast vegez, es mas vezerl6k folOtt halad el - az olvas6 is nyilvan masolta es m6dosftotta a meglev6 k6dreszletet -, a k6dismetles elkertilese vegett j6 lenne egy aItahinos fiiggvenyt frni az adatmozgatas megjelenftesere, mely fiiggvenyt aztan parameterezve hfvhatnank!
Class View TetelekForm class jobbeger Add Add Method Method name: Mozgat Parameter type: Control Parameter name: mit Add Parameter type: Control Parameter name: hova Add Parameter type: Control Parameter name: at Add Finish. public void Mozgat(Control mit, Control hova, Control at) {
//Kiszamitja a mozgatas egyseget int x=o i if (mit.Leftl=hova.Left) x=(hova.Left-mit.Left)/SOi int y=Oi if (mit.Topl=hova.Top) y=(hova.Top-mit.Top)/SOi //Mozgatja mit-bel hova-ba. while(textLabel.Leftl=hova.Left I I textLabel.Topl=hova.Top) {
textLabel.Left+=xi textLabel.Top+=Yi I/Egyszerubb frissiteni, mint kiertekelni mikor kell. mit.Refresh()i at.Refresh()i System.Threading.Thread.Sleep(20)i }
II Hova megkapja az 6j erteket. hova.Text=textLabel.Texti textLabel.Visible=falsei hova.Refresh()i }
A Mozgat fiiggvenyt nem tudjuk meghivni a hibas k6db61, mert a vegen ott a 'hova'
parametemek atadott ertek. De a j6 k6dr6sz1etb61 haromszor is hivhat6. A tetelek demonstralasa soran ujra hasznalhat61esz. A hivasok k6dja: private void helyesButton_Click(object sender, System.EventArgs e) {
r{flliii;i'~i(?~~~fil~~I~f~£¥i[i;r~~~~~lgDY4~~li!lI~1~~i;~llt~~~;iJ~~~~&~$l?~~'Jlrl&.lil IIElt0ntetj0k a segedvaltozot. tempTextBox.Text=""; II Ujrainditas miatt. tempLabel.Visible=false; tempTextBox.Visible=false; }
Fordibis/Futtatas/Teszteles
Pr6baljuk ki, hogy az 'a', 'b' valtoz6 ertekenek futasidejii vaItoztatasa (atgepelese) utan is helyesen miikOdik a program! System. Threading. Thread. Sleep (1500) ; ~"
_
~
~
'"'
~
0
~
'"
~
~
m'"
~
~
=~
~
_"~
~
"
~ Programozasi tetelek [sere
ISzamlalas I Osszegzes I Eldontes I Kivalasztas I segecivaltoz6 (temp):
13 a:
~
-.
~
~
flDlfGlJI]
Hibas k6d kezd
3
b: Helyes k6d:
I Helyes k6d kezd
temp=a; a=b;
4. Gyakorlat. 3. abra A csere helyes k6dja futas k6zben
4.1.1. A kivalaszhis tetele Adjuk meg, hogy hanyadik helyen taIalhat6 az adott sorozatban az elso, adott feltetelt teljesito elem. A feladatban a feltetel az adott ertekkel egyenlo. Alapertelmezesben az adott ertek legyen 8, mely a futtarns sonin m6dosithat6! A sorozat legyen 10 elemii, elemeinek van kezdoerteke, hogy ne kelljen mindig felt61teni ertekekkel, de blirmely elem m6dosithat6. A fenti 11 erteket egy-egy szovegmezoben mutatjuk meg, es a keresett index tarohisara is felvesziink egy szovegmezot. Az index kezdetben legyen tires!
Eloszor oldjuk meg 10 elemre a feladatot! Az index meze kiiirftese, es a nyu else elemre allitasa a fiiggveny ujrahivasakor fontos. private void kezdButton_Click(object sender, System.EventArgs e) {
indexTextBox. Text= "i indexTextBox.Refresh()i n=lOi int i=Oi kivalasztListBox.Selectedlndex=li arrowBox.Left=findTabPage.Controls[il.Left+5i Thread.Sleep(400)i II
221
4. gyakorlat. Programozasi tetelek
-
while (valueTextBox.Text != findTabPage.Controls[i] .Text && i
kivalasztListBox.SelectedIndex=2; i++; arrowBox.Left=findTabPage.Controls[il.Left+5; Thread. Sleep (400) ; kivalasztListBox.SelectedIndex=l; Thread.Sleep(400) ; }
if (i
kivalasztListBox.SelectedIndex = 3; Thread.Sleep(lOOO); kivalasztListBox.SelectedIndex = 4; indexTextBox.Text = i.ToString()+"."; }
else MessageBox.Show("Nincs '"+valueTextBox.Text+", ~rt~ka elem a sorozatban."); }
Forditas/Futtatas/Teszteles. "
",.~.
,,~~
_~",.~"
_-,~_
,,,.so,~,~,"
'"~='""-"~ ~
_
~
"",-
-~-~~'"'
_ '>'0""""
,=~
_,fr
~"
~ Prggramozasi tetelek Csere
I Szamlalas I Osszegzes I Bdiintes
rs
Kivalasztas
A keresett index A keresett ertek
fT
1.
2.
y<
~~
'" v
~
"'"
"'~
'" z
I
~,,~
"
""~,~
"""'~
~~~"t<
"'''
IDIlIHll
i=O; index:"";
I,
KezdJ
while (vDl!=keresett) && i([l) i++;
if I ([l else MessageBox.Sho·"'CNincs keresett elem.l:
n=10
o.
~~"
3.
4.
5.
6.
... 7.
9.
10.
4. Gyakorlat 5. abra A keresett elema,sorozatban van
Ha a keresett elem megtalalhat6 a sorozatban, a program j61 miikOdik. M6dositas es ujraindftas utan is. Ha a keresett elem nines a sorozatban, az algoritmus akkor is helyes eredmenyt ad, azonban a nyu nem a k6vetkezo tires helyre mutat, hanem annak a vezerlonek az oszlopaba ugrik, amelyik a k();vetkezo a vezerlok listajan. Tehat sztiksegiink van egy olyan sz6vegmezor.e, mely a, k6vetkezo helyen an a.
222
4.1. Elemi esak nem llitszik. Ha ennek indexet a konstruktorban beallftjuk a kovetkez6 "rlteKI'e, akkor erre a lathatatlan TextBoxra fog ramutatni a nyu. Es ez a eel.
.SlJJLV""'"
public TetelekForm() {. . . findTabPage.Controls.SetChildlndex(textBoxlO,9); ~
4. Gyakorlat. 6. abra A keresett elem nines a sorozatban A sorozat veget az els6 ures mez6 jelezze! Mivel az elemek a futas soran m6dosithat6k, kezdeskor hatarozzuk meg 'n' erteket! Mivel a lathatatlan TextBox szoveget uresre allftottuk, tehat legkes6bb annal, leall a kereses. Ekkor 'n' ert6ke epp az ures ertekii elemre mutat. Vegytik figyelembe, hogy 'n' nem az utols6 elem indexet jelenti, hanem a sorozat elemszamat, ami epp megegyezik az utols6 utani elem indexevel, mivel az indexeIest mindig O-val kezdjuk!
223
-
4. gyakorlat. Programozasi tetelek
Az tires mezo utani ertekeket tOroljtik kit Vegytik eszre, hogy az elemszarn meghatarozasa az elso tires mezo kereseset jelenti! TeMt ez is egy linearis kereses algoritmus. private void kezdButton_Click(object sender, System.EventArgs e) {
n=O; while (findTabPage.Controls[nj .Text!="") n++; //Az ares mez6 ut~ni elemeket kit6r61jak. for (int j=n; j<10; j++) findTabPage.Controls[jj .Text=""; nLabel.Text="n="+n; Refresh ( ) ; int i=O; kivalasztListBox.SelectedIndex=l; }
Forditas/Futtatas/Teszteles ~
_ "
~
~,,_"
"~~
~
~~, p
~
=
=
~
~
~"
~
""-
h
=
="""
[!l Programozdsi tetelek Csere
I Szamlaicis I Osszegzes I Bdontes
""
~ ~
~"".
IRlllJB
.Kivaiaszlas'
A keresett index: A keresett ertek
fM
I
o.
1.
10.
2. . . 3. Nines 'M' ert:ekil elem a sorozatban.
IL:::::::::9.~:::::::::::JI 4. Gyakorlat. 7. abra A keresett elem nines a rovidebb sorozatban
224
4.2. Feladatok
Az iires mezoket, es az elsot kiveve a hozzajuk tartoz6 indexet lathatatlanna is tehetnenk, azonban akkor, ha tObb elemmel kivcinunk pr6balkozni a kovetkezo tesztben, nem all m6dunkban azokba erteket irni. Keszithetnenk egy 'uj sorozat' gombot, ami lathat6va tenne az osszes mezot, esetleg veletlen szam ertekekkel fel is tolthetne azokat. A feladat tovabbfejleszteset az olvas6ra bizzuk. Ez a feladat is j6 pelda arra, hogy minden programnal van altalanosabb, felhasznal6baratabb, hatekonyabb, gyorsabb, esztetikusabb, testre szabhat6bb ... egysz6val meg jobb program.
4.2. Feladatok 1. Demonstrciljuk a tObbi tanult programozasi tetelt is! 2. Parlament. Az elso parlamenti napon valasztjak meg a hazelnokOt, igy az ujjavcilasztott parlamentben nines, aki a hazelnoki teendoket ellassa e valasztas elott. A hazszabaly szerint az elso napon a legidosebb kepviselo lesz a hazelnok, a legfiatalabb pedig a jegyzo. Keressiik meg az uj kepviselok kozt a hazelnokot es a jegyzot! *1
3. Keszitsiink a jelsz6 m6dositasat lehetove teva ablakot, melybekeri a felhasznal6 nevet, a regi jelsz6t, majd ha az megfelelo, lehetove teszi uj jelsz6 berrasat, melyet ismetelt begepelessel kell megerositeni! 4. Keszitsiink uj felhasznal6 felvitelet lehetove tevo ablakot, mely bekeri a felhaszna16 nevet, ellenorzi, hogy ilyen new felhasznal6nk meg nines, majd lehetove teszi a jelsz6 berrasat, melyet ismetelt begepelessel kell megerositeni!
I ..
Otlet: Medzichradszky Denes.
225
4. gyakorlat. Programoz3si tetelek
4.3. Megoldasotietek 4. Parlament A feladatot maximum 10 kepvise16re oldjuk meg, de a szam ertelemszeriien a kepvise16k szamahoz igazithat6. Sztiksegtink lesz ket tOmbre, melyben a kepvise16k nevet es sztiletesi datumat taroljuk, valamint egy db. vaItoz6ra, mely megadja az eddig felvitt kepvise16k szamat. A helyfoglalast es a kezdoertekadast a konstruktorban va16sitjuk meg. A datumot DateTimePicker vezerl6vel vissztik fOl, ez biztositja a va16di datumfelvitelt, ellen6rzi, hogy az adott h6nap hany napos. Az adatok begepelhet6k (a h6napnal is szamot var), vagy kivalaszthat6k a naptarb6l. DateTime[] szuletes; string [] nev; int db; public ParlamentForm() {
InitializeComponent();
}
A felhaszna16i feltilet az osszes vezerl6t tartalmazza, egymas folOtt a dateTimePickert es a jegyzoTextBoxot is. Ez ut6bbi kezdetben lathatatlan, a hazelnok meghatarozasa utan pedig a dateTimePicker a lathatatlan. A hazelnokot feltOltes kozben is meghatarozhatjuk, de ha mar minden kepvise16 adatat feivitttik, akkor csak az eredmeny megjelenitese lehetseges. private void felvitelButton_Click(object sender, System.EventArgs e) {
II Ha meg nem tbltbtt0k fel, Iide mar megnezt0k a hazelnbkbt. jegyzoTextBox.Visible=false; dateTimePicker.Visible=true; labell.Text = "Nev:"; labe12.Text= "Sz0letesi id6";
226
4.3. Megoldasotietek //Felvitel. nev[db]=nevTextBox.Text; szuletes[db]=dateTimePicker.Value.Date; i f (db<9) db++; else {
5. Gyakorlat. Az orokles es a .NET osztalyai 5.1. Szavazatszamlalas Kesz(tsiink egy alkalmazast, mely a nyilvanos szavazatszamIalast tamogatja! A formon megjelen6 gombok szama egyezzen meg a jeWltek szamaval, es feliratuk a jelOltek nevet tartalmazza! Minden nev mellett egy sz6vegmez6 mutatja a kapott szavazatok szamat. A vegeredmeny gomb valasztasara egy iizenetablakban frjuk ki a gy6ztes jeWlt nevet es szavazatainak szamat! ~ Szavazat szamlalas L;J§~ JeloltJeno
5. Gyakorlat. 1. abra A kesz alkalmazas
229
5. gyakorlat. Az orokles es a .NET osztalyai A szavazatszamlal
erteke eggyel novekszik.
5.1.1. A projekt felhaszmil6i feliilete A feladat megoldasahoz generaljunk egy Windows alkalmazast SzavSzam neven! A
form osztalyunk neve legyen SzavSzamForm! Tegytik ki ra a vezerlaket!
Name
jejeButton
_gyozoButton
nagy Button
vesztButton
probaButton
Text
JelOlt Jena
Gyaza Peter
Nagy Vikt6ria
Orok Vesztes
Pr6ba Szerencse
ox
Name Text
o
o
o
vesztTextBox
o
o
Legyen meg egy Gyaztes! feliratu eredmButton is!
5.1.2. A szamlahis kijelzest szinevel tamogat6 gomb Nektink olyan gombra lenne sztiksegtink, aminek a szavazatok novekedtevel egyre sotetebb a szine, ezzel is jelezve, ki vezet a jelOltek koztil. Ezt a Button osztaly nem szolgaltatja. Tehat sztiksegtink van egy olyan osztalyra, amilyen a Button, de amelyik kepes sotetiteni a szinet. Tehat a Button osztalyt szeretnenk a celnak megfelelaen specializalni! A problemat oroklessel, a Button osztaly VoteButton nevu ut6dosztalyanak letrehozasaval oldhatjuk meg. Solution View SzavSzam projekt jobbeger
Forms::Buttonl
~ VoteButton
Add Add Class
+VoteButtonO
Name: VoteButton.cs Ezzel letrehoztunk a projekttinkbe egy VoteButton new osztalyt. Ha megnezztik a fomisk6dot, mindossze egytires konstruktort tartalmaz. Azt szeretnenk, ha ez az osztaly a Button osztalyb61 szarmazna! Nezztik meg, hogyan szarmaztattuk a SzavSzamForm osztalyt a Form osztalyb61! A Button osztaly leirasa is a System.Windows.Forms nevterben szerepel, tehat:
230
5.1. Szavazatszambilas
-------------------------------------------------------A konstruktorban allitsuk a gomb szinet feherre! A feher szin ugy jon letre, hogy a szin piros (red), zOld (green) es kek (blue) osszetevojet is maximalisra (255-re) 6.11itjuk. A Color osztaly FromArgb fiiggvenye a harom szin szamertekebOl osszeallitja a szint. public VoteButton() {
5. Gyakorlat. 2. abra Az alkalmazas nevterei es osztalyai Hasznaljuk ezt az osztalyt, mint a gombot a SzavSzamForm feliileten! Ezzel egyben tesztelhetjiik a letrehozott osztalyt. Az objektumok letrehozasakor Button helyett VoteButtont hozzunk letre! A VoteButton a SzavSzam nevterben lett definialva, amiben epp most dolgozunk. Ez j61lathat6 a k6db61, de mutatja Class View ablak .. ~,
IS. ._ __ __
namespace SzavSzam
0----
__ "___ ___ ~
~._~
Class View - SzavSzam
q
~
~
{
public class VoteButton System.Windows.Forms.Button }
5. Gyakorlat. 3. abra A VoteButton osztaly a SzavSzam nevterben
Tenm!szetesen az objektum oszt.Hyanak megfele16 konstruktort kell hivnunk az InitializeComponent tagfiiggvenyeben, ha nem ezt tessziik, a fordit6 figyelmeztet benniinket.
this.jejeButton = new VoteButton() i this.gyozoButton = new VoteButton()i this.nagyButton = new VoteButton()i this.vesztButton = new VoteButton() i this.probaButton = new VoteButton()i }
Forditas/Futtatas
A gombok feher szinben jelennek meg az ablakban.
5.1.3. (Jj metodus a VoteButton osztalyban Class View VoteButton jobbeger Add
----------------------------------------------------------------A Color osztaly R, G, B tulajdonsagai visszaadjak az aktualis szin osszetev6inek erteket. public void Darken{byte deer) {
if (BackColor.R>decr) BackColor = System. Drawing. Color. FrornArgb{ BackColor.R-decr,BackColor.G-decr,BackColor.B-decr)i }
A gombon valo kattintas esemeny kezel6jeben nem kell mast tenniink, mint meghfvni ezt a fiiggvenyt. private void jejeButton_Click{object sender, System.EventArgs e) {
jejeButton.Darken{lO)i II A szavaz6k szamat6l fuggoen. }
Forditas/Futtatas/Teszteles Azt tapasztaljuk, hogy amint sotetedik a gomb, egy id6 utan nem lehet elolvasni a feliratat. A sOtetedes feIenel valtsuk at a betiiszint feherre! Terjiink vissza a VoteButton osztaly kodjahoz! public void Darken{byte deer) {
A tobbi gomb valasztasat is hasonlo modon kell megoldanunk. Elegansabb lenne, ha egy fiiggvennyel tudminklekezelni az osszes esemenyt. Ehhez azonban egy6telmiien meg kell hataroznunk a vezerl6k indexet a Controls tOmbben. A SzavSzamForm osztaly konstruktoraban tehetjiik ezt meg. public SzavSzamForm{) {
InitlalizeComponent{)i II TODO: Add any constructor code after II InitializeComponent call Controls.SetChildlndex{jejeButton,O)i
233
5. gyakorlat. Az orokles es a .NET osztalyai Controls.SetChildIndex(gyozoButton,l) ; Controls.SetChildIndex(nagyButton,2) ; Controls.SetChildIndex(vesztButton,3); Controls.SetChildIndex(probaButton,4) ; Controls.SetChildIndex(jejeTextBox,6) ; Controls.SetChildIndex(gyozoTextBox,7) ; Controls.SetChildIndex(nagyTextBox,8) ; Controls.SetChildIndex(vesztTextBox,9) ; Controls.SetChildIndex(probaTextBox,10) ;
-
}
Jelezziik az allast a sz6vegmez6ben! Ehhez a legegyszeriibb, ha minden jel61thoz egy byte meretii segedvaltoz6t hasznalunk, mely szamszeriien tartalmazza a szavazatok szamat. A segedvaltoz6kat is celszerii tOmbben elhelyezni. Egyszeriien irjuk a k6dot a SzavSzarnForm osztaly k6djaba! private byte[] szamlal
=
new byte[5]
{O,O,O,O,O};
A gombvalasztas esemenykezel6jet nevezziik Button_Click-nek! Nevezziik at a jejeButton Properties ablak Events gomjaval megnyilt ablakban a Click esemeny kezel6jet jejeButton_Click-r61 Button_Click-re! A t6bbi gomb eseten pedig ezt a fiiggvenyt valasszuk ki a Click esemeny kezel6jekent! private void Button_Click(object sender, System.EventArgs e) {
((VoteButton)sender).Darken(10) ; II 10 a szavaz6k sz~m~t61 fDgg6en. int ind = Controls.GetChildIndex( (VoteButton)sender); szamlal[ind]++; Controls [ind+6] .Text = szamlal[ind] .ToString(); }
Forditas/Futtatas/Teszteles
A k6dban pontosan tudjuk, hogy a 'sender' gombok kivaIasztasa eseten hivtuk meg konvertalhatjuk ilyen tipusura. Sziikseg is van altalunk irt osztalyban letezik. Ha tudjuk allithatjuk a t6mbben a hozza tartoz6 erteket, TextBoxban.
234
VoteButton tipusu, hisz csak ilyen az esemenykezel6t. Tehat batran erre, mert a Darken met6dus csak az a valasztott gomb indexet, akkor es kiirhatjuk azt a megfelel6 indexii
-
5.2. Vendeglo a Vihig Vegen
5.1.4. A gy6ztes meghabiroz3sa
Ez egy maximum keresest jelent. Mivel ki kell lrnunk a gyoztes nevet is, celszerii a maximalis elem indexet tarolni az erteke helyett. Tudjuk, hogy a tomb nem tires. private void eredmButton_Click(object sender, System.EventArgs e} {
A k6d miikOdik, csak ha ketten azonos szamu szavazatot kapnak, akkor az elso nevet frja ki. Pedig ebben az esetben a szavazas vegeredmenyedontetlen. Nezztik meg tehat, van-e a maximaIis elem utan vele azonos ertekii a tombben! private void eredmButton_Click(object sender, System.EventArgs e} {
int maxind=Oi for (int i= Ii i<5i i++) {
if (szamlal[i]>szamlal[maxind]) maxind=ii
MessageBox.Show(nA gyoztes: n+ Controls [maxind] .Text +n lO+ szam l a l[maxind] .ToString(} +n szavazattal.n}i }
5.2. Vendeglo a Viblg Vegen Douglas Adams nagysikerii sorozatanak a Galaxis Utikalauz Stopposoknak egyik kotete hatasara kesztilt a kovetkezo feladat, mely a Vendeglo a Vilag Vegen barjanak itallapjat mutatja be lehetove teve az italok megrendeleset, es a vendeg 235
-
5. gyakorlat. Az orokies es a .NET osztalyai
tiivoziisa elott a sziimla elkeszfteset. A rendeles mutassa az eddig rendelt italok listiijiit es osszarat! Az itallap a kiilOnbozo viliigokban kedvelt kiilOnleges italokat tartalmazza
meglehetosen borsos, megfizetheto aron.
az
otcsillagos
vendeglo
~ Vendeglff a vilcig vegen itallapja
kiilOnleges 8lQJ~
Aldebrani ital
I 45 Pur I 32 Pur I 26 Pur
Egy uveg Jan"
1250 Pur
Csinanto/mnings2
~
Pangalaktikus gegepukkaszt6 Dzsynneis tonnyk
IT ap-O-Mat ital
vendegkorenek
~
5. Gyakorlat. 4. abra A kesz alkalmazas
Mivel az olvaso nem biztos, hogy ismeri a miivet, rovid ismertetot fiiznek az egyes italokhoz. A Telepszichopatikus • Pangalaktikus gegepukkaszto: Turbomixerhez merhetoen szomyii ita!. Zaphod Beeblebrox egyik kedvence. • Dzsynneis tonnyk: A Golgafrinchamrol jott hajo kapitanyanak kedvence. • Csinanto/mningsz: Sivolviai kozonseges csapvfz, szobahOmersekletnel kicsit melegebben szervfroznak.
melyet
• Tap-O-Mat ital: A Szfriusz Kibemetikai Tarsasag altaI forgalmazott nutrimatikus italszintetizator, mely a Ieheto legszelesebb valasztekiit kepes eloallftani az italoknak a 236
Az italok ara trigani pur-ban van megadva, mely a Galaxis Utikalauz szerint a harom szabadon konvertalhat6 valuta egyike. 1 pur = 8 ningi. A ningi olyan haromszogletii gumierme, melynek hatezer-nyo1cszaz merfold az oldalhossza, s ennelfogva senkinek sincs 1 purra val6 bel61e. A Galaktibankok pedig nem bajlodnak apr6penzzel.
5.2.1. A felhaszmil6i feliilet elkeszitese Generaljuk Ie az alkalmazast Itallap neven, a Form legyen ItalForm, es keszitstik el a felhasznaloi feltiletet! A kepen lathato gombok RadioButton vezerl6k. Newk pan,dzsyn-, aldeb-, janx-, csin-, tapRadioButton. A TextBoxok el6tagjai is azonosak. A valaszt6gombok Appearance tulajdonsaga legyen Button es FlatStyle tulajdonsaga System, ezt az osszes kije101esevei is beallfthatjuk. HaIForm -panRadioButton : RadioButton Forms::RadioButton! -dzsynRadioButton : RadioButton -aldebRadioButton : RadioButton 6 -janxRadioButton : RadioButton -csinRadioButton : RadioButton 1 -tapRadioButton : RadioButton Forms::TextBoxl -panTextBox : TextBox -dzsyn TextBox : TextBox 7 -aldebTextBox : TextBox '..00.. -janxTextBox : TextBox 1 -csinTextBox : TextBox -tapText Box : TextBox -label1 : Label I FOlllls::Labell -fizBox : TextBox 1 -components: Container = null 1 +ltalFormO #Oispose(in disposing: bool) -lnitializeComponentO -MainO
+-
~
~
5. Gyakorlat. 5. abra Aszerkeszt6ablak A TextBoxok TextAlign tUlajdonsaga legyen Right! Legyen egy Fizetend6 feliratunk, mellette egy fizBox nevil szovegmez6, mely az osszarat mutatja, szinten jobbra rendezett szoveggel. Az osztalydiagram j61 mutatja, hogy a System. Windows.Forms.Form-t61 szarmaz6 ItalForm osztaly a System.Windows.Forms nevterben definialt RadioButton, TextBox es Label osztalyok objektumait tartalmazza. A multiplicitas a tartalmazasi kapcsolat mellett jelzi, melyik osztaIybol hany objektumot hoztunk letre.
237
s. gyakorlat. Az orokles es a .NET osztalyai 5.2.2. Az italvalasztas esemeny kezelese Ebben a feladatban kifejezetten a String osztaIy elemeivel szeretnenk ismerkedni, ezert nem taroljuk az arakat ona1l6 tombben, mindent a vezerlokbOl fogunk kiolvasni, es a Text mezok alapjan szamolunk. A P616 gombot kijelOlve a Properties ablak Events~l eszkozgombjat aktualizalva a Click esemenyt valasszuk ki duplan! A fejlesztoi kornyezet elkeszfti a Click esemeny kezelomet6dusat a panRadioButton_Click fiiggvenyt. Ez a ftiggveny akkor hiv6dik meg, ha valtozott a gomb kivaIasztasa. private void panRadioButton_Click (object sender, System.EventArgs e) {
int ar; int fiz; ar = Convert.ToInt32 (panTextBox.Text) ; if (fizBox.Text == "B) fiz = 0; else fiz = Convert.ToInt32 (fizBox.Text) ; fizBox.Text=(fiz+ar) .ToString(); }
A fiiggveny k6dja elobb atalakftja a poloBox es a fizBox szoveget int-te, majd osszeadva oket a kapott szamot stringge alakftva kifrhatjuk a fizBoxba. Ha a fizBox tires, akkor legyen 0 a fiz szamerteke!
:!.
Forditas/Futtatas
A k6dot meg kellene frni a tobbi gombra is, de az k6dsokszorozast jelentene, helyette rendeljtik az osszes gomb kattintas esemenyehez ezt a fiiggvenyt! Ehhez viszont nevezztik csak egyszeriien Button_Click-nek! A nevet a Properties ablak Events?1 eszkozgombjat aktualizalva a Click esemenyt valasztva m6dosithatjuk.
IMegj~gy;z~~: I Ellenorizztik, hogy a legordtilo listaban nem maradt-e ott a regi ftiggveny! Ha igen, akkor masoljuk at a k6dot az ujba, majd t6r6ljtik a regit! Ezutan minden gomb Click esemenyehez a Combo listajab61 valasszuk ki a Button_Click met6dust! Nezztik meg a k6dot, az lnitializeComponent met6dusban minden Button k6dreszlete vegen megjelent az esemeny hozzarendeles sora.
238
5.2. Vendeglo a Vilag Vegen
~
Forditas/Futtatas
Ezze1 a fuggveny meghfvodik, de termeszetesen minden esetben a pangalaktikus gegepukkaszto araval noveli az osszeget. Honnan tudhatjuk meg, melyik gomb kiildte az iizenetet? A sender parameterbOl. Tegyiink egy tOrespontot a fuggveny valamelyik vegrehajthato sorahoz! (F9) Majd futtassuk nyomkovetes iizemmodban a programot! (Start) Amikor egy gombot vlilasztunk, a program a nyomkovet6 ablakban vizsgalhato, es a senderre mutatva egeriinkkel elolvashatjuk, hogy meIyik gomb kiiIdte az iizenetet. Allftsuk Ie a nyomkovetest, es vegyiik ki a tOrespontot (F9)! private void Button_Click(object sender, System,EventArgs e) {
5. gyakorlat. Az orokles es a .NET osztalyai Ha szeretnenk, hogy az arat jelzo szamok mogott a 'Pur' ki legyen irva, akkor azt a szamolas elott ki kell szedni, mig a kifras elott vissza kell irni. Eloszor irjuk be az arakmoge! private void Button_Click(object sender, System.EventArgs e) {
Ha ezt a sok vaItoztatast egyenkent kellett volna minden gombhoz rendelt fiiggvenyen vegrehajtani, bizonyosan lett volna olyan, amit elhibazunk, es meg tesztelni sines kedviink, teh:it a hiba akar a programban is maradhat.
~
Forditas/Futtatas
A fizBox. Text kiszamltasanal akar el is hagyhatjuk a ToString fiiggvenyhivast, mert a + operator, ha egyik operandusa sztring, a masik numerikus operandust automatikus konverzi6val :italakltja a neki megfelelo sztringge.
240
S.2. Vendeglo a Vilag Vegen
5.2.3. Legyen az ablakban egy a megrendelt italokat felsorol6 Iistadoboz! Az ItaIForm tervezes nezeteben (Design) az eszkoztarb61 (ToolBox) vaIasszuk ki a ListBox elemet, es igazitsuk el az ablak feliileten! A listadoboz neve legyen italokBox! A gomb kivaIasztasakor az italt vegyiik fel a listara! private void Button_Click(object sender, ... ) {
...
}
!
Forditas/Futtatas
Ha tobb elemet vesziink fOl a listara, gorgetessel erhetjiik el azokat. Mivel a szovegek jelentosen eltemek, azonos tabulatorszam kiilonbozo hosszusagU szoveget eredmenyez. A szoveg tetszoleges karakterrel tOrteno adott szelessegii kitOlfeset biztosftjak a string osztaIy Pad fiiggvenyei. Ha nem adjuk meg a karaktert, sz6kozzel tOlti ki a helyet. String sz=r.Text.PadRight(30); italokBox.ltems.Add(sz+sar+" Pur");
32 Pur
.1:~~~~:~1:i\~~s gegepukkaszto 26 Pur .,
45 Pur
2 Pur
5. Gyakorlat. 6. abra Az cirak meg mindig nincsenek egymas alatt a listadobozban Meg mindig nem keriiltek egymas ala a szamok! Nezziik meg Debuggerrel, vajon 'sz' 30 hosszu-e! Tegyiink tOrespontot a fenti k6d elso soraba(a sziirke csikon kattintva), majd futtassuk az alkalmazast! Amikormegallt a vegrehajtas, valasszuk a Watchl flilet, es frjuk be a kivant valtoz6kat! 241
s. gyakorlat. Az orokles es a .NET osztalyai Azt hitjuk, hogy a sor vegrehajtasa (Step Over ikon) utan 'sz' hossza 30 lett. Object Browser
5. Gyakorlat. 7. abra Az 'sz' hossza va16ban 30 karakter A magyarazat az, hogy az alapertelmezesben beallitott Microsoft Sans Serif font un. proporcionalis font, vagyis cellaszelessege karakterenkent valtozik (a sz6koze a legkisebb). Ha fix szelessegii fontot (pI. Curier) vaIasztunk a kiirashoz, a kfvant eredmenyt erhetjiik ei. VaIasszuk a listadobozunk Font tulajdonsagat a ... gomb felhasznalasaval Curier New 10 -nek!
5. Gyakorlat. 8. abra Az arak egymas ala balra rendezve Most mar egymas ala keriiltek az arak, viszont balra vannak rendezve. Ez akkor latszik meg jobban, ha a Janx arat 250-re emeljiik. Az arakat helyi ertekiik szerint szoktuk egymas ala irni. Ezt most a PadLeft fiiggvennyel oldhatjuk meg. A kovetkezo k6dsor sz6kozokkel 4 karakter szelesre egesziti ki az arat tartalmaz6 sztringiinket, ugy, hogy a sz6kozoket balr6l teszi a szoveg ele. sar = sar.PadLeft(4);
5. Gyakorlat. 9. abra Az arak egymas ala jobbra rendezve VizsgaIjuk meg a listadoboz viselkedeset, ha sok elemmel tOltjiik fell A gorditosav megjelenesehez szelesebb listadoboz kell. 5.2.4. A lishlb61lehessen torolni is! 5.2.4.1. Egy elem torlese Tegyiink egy tOrOl gombot a listadoboz jobb sarkahoz! (Name: TorolButton, Text: Torles) Rendezziik a Layout eszkozsor gombjai segitsegevel! Duplan kattintva a gombon, frhatjuk a Click esemeny kezelomet6dusat. private void TorolButton_Click(object sender, System.EventArgs e) {
italokBox.ltems.Remove(italokBox.Selectedltem)i }
Teszteljiik a fiiggvenyt, ha nines kivalasztott elem, nem torol semmit, egyebkent torli a kivalasztottat.
243
5. gyakorlat. Az orokies es a .NET osztalyai """,~",,,=.,,~~~~
5_ Gyakorlat. 10. abra A tOrles gomb es az osztalydiagram 5.2.4.2.
Tobb elem tor lese
Ha meg akarjuk engedni tObb elem kivalasztasat is egyszerre, ahhoz el6szor allftsuk a listadoboz SelectionMode tulajdonsagat MultiExtended-re, majd a kezel6fiiggvenyt m6dosftsuk! Azt gondolnank, hogy egy egyszerii megoldas, ha a kivalasztott indexeket tartalmaz6 tomb elemein vegigmegytink es kitoroljtik 6ket: foreach(int i in italokBox.SelectedIndices) italokBox.Items.RemoveAt(italokBox.SelectedIndices[i]);
Azonban a futaskor kidertil, hogy ez nem miikOdik. Vizsgaljuk meg nyomkovetessel az okot! Tegytink egy tOrespontot a foreach sorra, es futtassuk az alkalmazast! Tobb elemet valasszunk es toroljtink! (A tablazat adatai 4 elem kivalasztasaval allfthat6k elc.) A Watch ablakban alul beallfthatjuk a megfigyelni kfvant adattagokat, majd lepesenkent hajtsuk vegre a programot:
244
5.2. Vendeglo a Vilag Vegen
-
2
int
italokBox.SelectedIndices. Count
2
int
italokBox.SelectedIndices[i]
{"Index was outside the bounds of the ........"
System.IndexOutO
Elobb vagy ut6bb a tomb tulindexelese iizenetet kapjuk. Ha megnezziik a reszleteket hithatjuk, hogy a kivcilasztott elemek indexe vegigmegy az eredetileg kivalasztott szamig, de minden tOrleskor csokken a kivalasztott elemek szama. A fenti tablazat mutatja, hogy a kivalasztott e1emek szama meg 2 (count), es mi a 2 indexiit, vagyis a harmadikat szeretnenk tOrolni. (Az indexeles O-val kezdOdik.) Ez termeszetesen a tOmb e1emein tulmutat, tehat hibahoz vezet. Javftsuk a k6dot! private void TorolButton_Click(object sender, , System.EventArgs e) {
}
Forditas/Futtatas Pr6baljuk ki a SelectionMode MultiSimple tulajdonsagat is! 5.2.4.3.
Torleskor modosuljon a fizetendo erteke!
Ehhez a kivalasztott elem arat kell kivonnunk a fizetendo osszegbOl. MindkettohOz sztringkent jutunk hozza, es mindketto mogott ott a Pur felirat. Eloszor olyan sztringge alakftjuk oket, amiben csak sz6koz es szamjegyek vannak, majd szamma konvertaljuk, hogy elvegezhessiik a kivonast. Utols6 lepeskent visszaalakftjuk sztringge a m6dosftott erteket a fizetendo mezonek. private void TorolButton_Click(object sender, System.EventArgs e) {
I A Pur felirat levaghato a Substring(O, fizBox.Text.Length-4) fiiggveny hfvasaval is. A Pur megjelenftese megoldhat6 ugy is, hogy a Mtterben vegig karbantartunk fiz nevii numerikus adattagot, es annak erteket frjuk ki a kepemyore a ToString met6dus segftsegevel a Purt hozzafiizve. Lehetoseg az is, hogy a Pur feliratot egy Label segftsegevel tessziik ki a szovegmezo melle.
5.3. Feladatok 1. Reklamfilrnhez szereplovalogatast tartanak. Minden meghallgatason resztvevorol felveszik a nev, telefonszam, idopont, pontszam, szoveges megjegyzes adatokat. Ezen kfviil a szineszekneI a szfniiskolakat, eddig jatszott szerepeket: tancosoknal a tanckepzeseket, eddigi eloadasokat, mil yen tfpusu tancot ismer; kaszkadoroknel: milyen tfpusu triikkot vallal; statisztaknal: eddig Mny filmben statisztalt. * 2. Bizonyos osszegii rendeles folOtt a vendeg tOrzsvendegkartyat kap, mely mindig aktualizalhat6 kedvezmenyeket (ajandektargy, arengedmeny ... ) jelent. Ezt jelezze a program a fizetopincemek ugy, hogy az osszeg szfne megvaltozik, es vastagon szedett lesz. 3. Hasznaljunk CheckedListBox vezerIot az alkalmazasban, a kivalasztott !ista tarolasara a checked segftsegevellehessen kijelOlni a tOrIesre szant elemeket!
246
5.3. Feladatok
Oldjuk meg az itallap feladatot ugy is, hogy a Mtterben numerikus adatok taroljak az arakat es az osszeget! Amoba, a jelek: ikonok, melyeket egerkattinHissal tesznek ki a jatekosok egymast valtva. A gyoztes, aki 5 azonos jelet tud egymas melle tenni. *
6. Aknakereso. Amelyik gombra az eger mutat - atszfnezodik, kattintasra valaszthat6. Ha nem aknat valasztunk, irja ki, hogy Mny szomszedos akna van! Aknatalalat eseten veszitett, az abra mutassa meg az osszes akna helyet! 7. Tili-toli jatek. Egy 3x3-as negyzetben 1-8-ig szamok talalhat6ak. Egy kocka tires. A jatekos az tiressel szomszedos mezok valamelyikere kattintva, az ott elhelyezkedo szamot az tires helyre csereli. eel a szamok sorba rendezese. 1*
~ Tili-toli
IDfiJlIil
8. Valasztogombok. Teszteljtik a valaszt6gombok hasznaIatat! Legyen ket csoport, az egyik szamokat jelOljon (1, 2, 3), a masik betiiket (a, b, c, d)! A ket csoport gombjaihoz rendeljtink egy-egy esemepykezelot, mely a kivalasztott gomb melle kiirja: "valasztva: 2" vagy "valasztva: d"! A ki nem valasztott gombok felirata legyen az eredetivel megegyezo! *
lpeladat6tlet: Baga Edit, Delphi maskepp, Budapest 1998, 88.old. A feladat szerepel a szerzo A Visual c++ es az MFC k6nyveben is, de mindharom k6tet lenyegeben eltero megoldast mutat be.
247
5. gyakorlat. Az orokies es a .NET osztalyai
-
9. Az itallapon az italok arai m6dosfthat6ak. Ne engedjiik meg a felhaszna16nak hogy szamjegyektol elt6ro karaktereket vigyen be a szovegmezobe! * '
10. Elad6 alkalmazas. Keszitsiink el tetszoleges iizlet (divataru, aut6, illatszer, konyv) eladasat tamogat6 alkalmazast! 11. Az Elado alkalmazasban a gombokat valasztva jelenjen meg egy tovabbi parbeszedablak, ahol beallithatjuk a reszleteket: meret, szin, garbO-e, ujja hossza ... , vagy egy listabOl valaszthatunk a keszletbOl. 12. Ielszo alkalmazasunk adatait mentsiik fajlba!*
5.4. Megoldasotietek 1. SzereplOvalogatas Lathatjuk, hogy bizonyos adatokat mindenkinel meg kell adnunk, mig masokat, a foglalkozast61 fiiggoen. Celszerii lenne a kozos adatokat egy os form osztalyon SzereploForm megadni, a specialis adatokat pedig ut6dosztalyok eseten bekerni (absztrakci6). Akar mindjart az adatfelvetel elejen megkerdezhetjiik a jelentkezo foglalkozasat, s igy a megfelelo form betOltesevel kerdezhetjiik meg adatait. Keszitsiik el az ososztaly formjat!
New:
ICinka Panna
Telefon:
1111-1111
Meghallgatas id5pontia:
i2011. november 11. iJ
Csinos, ugy8sen rogtonoz. Javaslom. . Rende,5
5. Gyakorlat. 11. abra A SzereploForm a tovabbi formok ose Keszitsiik el az ut6dosztalyokat!
Solution View ReklamSzerep projekt jobbeger Add Add Inherited Form Name: SzineszForm.cs Az Inherited Form legyen kivalasztva!!!
5. Gyakorlat. 12. abra A SzfneszForm a SzereploForm ut6da a szerkesztoben A tObbi ut6dosztaIyt is elkeszitve, a foablak (SzereploForm) Main met6dusaban meghivjuk a nyit6 ablakot, majd a valasztast61 fiiggoen a megfelelo formot.
5. Gyakorlat. 13. abra A megnyit6 ablak (SzakmaForm) es az ut6d formok
249
5. gyakorlat. Az orokles es a .NET osztalyai
A Main kodja:
-
static void Main() {
SzakmaForm nyit = new SzakmaForm(); nyit.ShowDialog(); if (nyit.szineszRadioButton.Checked) Application.Run(new SzineszForm()); else if (nyit.tancosRadioButton.Checked) Application.Run(new TancosForm()); else if (nyit.kaszRadioButton.Checked) Application.Run(new KaszkadorForm()); else if (nyit.statRadioButton.Checked) Application.Run(new StatisztaForm()); else Application.Run(new SzereploForm()); }
5. Gyakorlat. 14. abra A form osztalyok szarmaztatasa 5. Amoba Huzzunk az AmobaFormra PictureBox vezerlot! A Size tulajdonsagat aIlftsuk 24; 24-es-re! Ez nem lehet neMz, ha a Form GridSize tulajdonsaga 8; 8-as. Legyen a hatterszfne (BackColor) White es a BorderS tyle: Fixed3D es a SizeMode: Centerlmage! Masoljuk vagolapra, majd illessziik be a Formra! Az uj kockat hUzzuk az elozo ele! Ismeteljiik meg a beillesztest, es az eddigiek el6 hUzast addig, amfg 10 vezerlo nem lesz a Formonl
Ezutan jeloljiik ki a 10 vezerlot, masoljuk oket a vagolapra, majd illessziik be a Formral A 10 vezerlot hUzzuk pontosan az eloz6 sor fOiel (A + egerkurzor jelzi, ha megfogtuk oket.) Ismeteljiik meg a beillesztest es az elozo sor ele hUzast addig, amfg 10 sorunk nem lesz! Mivel az ujra es ujra beszurt vezerloket a fejlesztokomyezet a Controls lista elejere illeszti, vagyis az utoljara felvett lesz az elso a listan, ezert keszftjiik el a feliiletet hatulrol elore. Teszteljiik, jol helyezkednek-e el a kepek! Kezeljiik az 250
5.4. Megoldasotletek
osszes vezerlohOz a Click esemenyt! Je16ljiik ki (bekeretezessel a vezerloket), majd a Click esemenyen kattintsunk duplan! A Design View / Properties / Events ablakban m6dosftsuk a nevet PictureBox_Click-re! private void pictureBox_Click(object sender, System.EventArgs e) {
Taroljuk egy 'elso' new logikai valtoz6ban, hogy melyik versenyzo kovetkezik! Az elso versenyzo sarga banan ikonokai rak a kattintaskor, a masodik piros konyvet. Az ikonok a Microsoft Visual Studio .NET 2003\Common7\Graphics\icons
konyvtarban talalhat6k, de termeszetesen mashonnet is valaszthatunk. A legegyszeriibb a valasztott ikonokat az alkalmazasunk exe fajljaval azorios (bin/Debug) alkonyvtaraba bemasolni, akkor mindig elerheto lesz. Taroljuk a kepeket egy-egy segedvaltoz6ban, a tObbi referencia erre hivatkozzon! Egyreszt fgy nem kell mindig uj mem6riahelyre fajlb61 beolvasni, masreszt fgy osszehasonlfthat6ak lesznek.
if (elso) ((pictureBox)sender) . Image = elsoImagei else ((pictureBox)sender) . Image = masodikImagei e.l so= ! elso i }
251
5. gyakorlat. Az orokies es a .NET oszhllyai
-
A gyoztest a Winner fiiggveny keresi meg, melyben a linearis kereses es a szamlaIas algoritmust alkalmazzuk. private void pictureBox_Click(object sender, System.EventArgs e) {
if (elso) ((pictureBox)sender) . Image = elsoImagei else ((PictureBox)sender) .
elso=!elsoj }
private bool Winner(object sender) {
Image image=( (PictureBox) sender) . Imagej IIBalra, fbI kezd. int x=-lj int y=-lj int ind=Controls.GetChildIndex( (pictureBox)sender)i while (y
int i=ind/lO j int j=ind%10j IIOsztasi maradek. ind mod 10 II Addig megy, mig szelre ert, vagy azonosat talal. l+=Yi I I sor j+=Xi II oszlop while ((i>-l) && (j>-l) && (i<10) && (j<10) && (((PictureBox)Controls[i*10+j]). Image==image)) {
i+=Yi j+=Xj }
252
5.4. Megoldasotletek
-
IIMost
kezdi a szamolast. Visszaindul. int count=O; l-=Y; J-=x; while ((i>-l) && (j>-l) && (i
count+=l; l-=Y; j-=x; }
if (count < 5)
//Iranyt valt.
{
if (x
else return true;
II
Gyoz6tt.
}
return false; }
Ne engedjiink kep ftHe kattintani, a kovetkezo jatekost jelezhetjiik a kurzor megvaltoztatasaval!
7. TiIi-toli Oldjuk meg a feladatot ugy, hogy letrehozunk egy olyan Button ut6dosztalyt, mely tartalmaz egy byte sor es egy byte oszlop adattagot, melyet kfviilrol is elerhetiink (internal)! Mentsiik ell Tegyiink 9 gombot az ablakra! A gombok legyenek ilyen TiliButton tipusuak, es feliratuk a kepen lathat6! A bal felso sarok sora=O, oszlopa=O, mellette 0,1 es 0,2; a kovetkezo sor ertekei: 1,0; 1,1; 1,2, es a legals6 sor 2,0; 2,1; 2,2. Az utols6 gomb legyen felirat nelkiili! A TiliForrn osztaly tar1almazzon meg egy uresButton TiliButton tipusu adattagot, mely kezdoertekiil a button9-et kapja! Jrjuk meg a csere fiiggvenyt, melynek hatasara az tires az uj elemre mutat, a regi iires pedig megkapja a valasztott gomb szoveget! public void Csere(TiliButton b) {
Buttonl_Click esemenykezelot, melyet visszaterve a Properties ablakba atnevezhettink Button_Click-re. Ha az iiressel szomszectos gombra kattintunk, hfvjuk meg a cseret! private void button_Click(object sender, System.EventArgs e) {
Nem minden szamsorrend ad megoldhat6 feladatot. Ugy erhetjiik el, hogy a feladat mindig megoldhat6 legyen, hogy az elejen a cserek segftsegevel megkeverjiik a gombokat. private void keverButton_C1ick(object sender, System.EventArgs e) {
Random rand=new Random(); int n=rand.Next(lOO); for (int i=O; i
8. Valasztogombok private void radioButton_CheckedChanged(object sender, System.EventArgs e) {
9. Az itallap arai csak szamjegyek lehetnek! Ha a Pur sz6veget nem a sz6vegmez6ben, hanem azon kfviil egy label segftsegevel frjuk ki az ablakba, nem kell sztring muveletekkel levagnunk a szam vegerol ezeket a karaktereket. Ez esetben megtehetjiik, hogy nem
254
5.4. Megoldasotletek engediink mast, csak szamjegyeket a szovegmez6be frni. Ehhez keze1jiik a szovegmez6 KeyPress esemenyet! private void KeyPress (object sender, System.EventArgs e) {
if (!Char.1sDigit(e.KeyChar)) {
e.Handled
=
true;
}
else {
e.Handled
= false;
}
}
Ha a negatfv el6jelet is meg akarjuk engedni, akkor a feltetel fgy m6dosul: if (!Char.1sDigit(e.KeyChar) I I e.KeyChar
== '-')
12.Jelszavak fajlb61 olvasasa A legegyszeriibb ha a meglev6 tOmbiink adatait el6bb fajlba frjuk, majd ezzel a fajIlal dolgozunk. System.10.FileStream fs = new System. 10. FileStream (" j elszo. pwd" , System.10.FileMode.OpenOrCreate); System.10.BinaryWriter bw = new System.10.BinaryWriter(fs); bw.Write(numOfUsers); foreach (string str in user) bW.Write(str); foreach (string str in jelszo) bW.Write(str); fs. Close () ;
A betOlteskor beolvassuk a tarolt adatokat. private void JelszoForm_Load(object sender, System.EventArgs e) {
try
255
5. gyakorlat. Az orokles es a .NET osztalyai {
System.10.FileStream fs = new System. 10. FileStream (" jelszo .pwd" , System.10.FileMode.Open)i System.10.BinaryReader br = new System.10.BinaryReader(fs)i numOfUsers = br.Readlnt32()i user = new string[nurnOfUsers]i jelszo = new string[numOfUsers]i for (int i=Oi i
catch (System.10.FileNotFoundExceptionfe) {
MessageBox. Show (" A (z) Application.Exit()i } }
256
'" + fe. FileName+ '" faj 1 nem elerheto") i
6. Gyakorlat. A Toolbox komponensek Szeretnenk az alkalmazasunkb61 mas alkalmazasokat inditani, illetve az altalunk: inditott programokat szeretnenk leallitani. A gyakorlat celja, hogy egyszeriien ugy inditsunk alkalmazasokat, hogy futas kozben nem kivanunk az alkalmazasokkal kommunikalni, azok onali6an, az altalunk fejlesztett alkalmazassal parhuzamosan futnak. A gyakorlat 2. feladata az idozito hasznalatat mutatja be.
6.1. Tobb folyamat indibisa Ha egy alkalmazast keszitiink, felmeriilnek olyan igenyek, hogy az alkalmazasbOl szeretnenk mar elkesziilt dokumentumainkat elerni. Egy munkaiigyi eload6 tevekenyseget tamogat6 alkalmazasbanaz eload6nak az adatok kitOltesehez, az ajaruattetelhez sziiksege lehet a kovetkezo dokumentumokra: ~
Internet Explorer segitsegevel egy link labelrol szeretne eIerni az interneten meghirdetett aliashirdetes pontos szoveget.
~
A ceg dokumentumai kozt talalhat6 a meghirdetett alias munkakori leirasa MSWord formatumu .doc fajlkent. Ezt egy gomb segitsegevel kivanja megnyitni.
~
A ceg dokumentumai kozt szerepel a dolgoz6k berenek nyilvantartasa Excel fajlban. A berajanlathoz e fajlt is szeretne olvasni mUnkaja soran.
257
6. gyakorlat. A Toolbox komponensek '"'~
,
~
...
(
~
",.~"
l!! MunkaUgyi ajanlattetel
q
\"
,.-
r,
~~.
Nev:
iRemenyked6 Jelentkezo
",..
MlInkakori leir;~s
I
Hirdetes
Iskolai vegzettseg:
IEgyetem
Berjegyzek
Ajanlott boosztas:
Aj
I
Ft.
6. Gyakorlat. 1. abra Az alkalmazas fOablaka Keszitsiik el a felhaszna16i feltiletet az abrlinak megfele16en! A 'Munkakori lefras' gomb legyen workButton, a 'Hirdetes' LinkLabel legyen advertiseLinkLabel, a 'Berjegyzek' gomb salaryButton new!
6.1.1. A folyamat inditasa statikus met6dushivassal A dokumen1!um eleresenek legegyszeriibb m6dja, ha a Process osztaly statikus Start met6dusanak hivasakor hasznaljuk az operaci6srendszer fajlkeze16jenek beallItasat, mely a dokumentum kivalasztasakor, annak kiterjesztese alapjan elinditja a dokumentumot keze16 alkalmazast. Egy folyamatot szeretnenk inditani! Keressiik meg a sug6ban a Process os ztalyt! Az about Process class leiras vegen tahiljuk, hogy a System.dll-ben a System.Diagnostics nevterben szerepel a leirasa. A System.dll-t mar hasznaljuk. Ha ugy veljiik, a programban Wbbszor fogunk a Process osztallyal dolgozni, es nem kivanjuk minden alkalommal a teljesen min6sitett nevet megadni (System.Diagnostics.Process), akkor a Diagnostics nevteret celszerii a using direktivaval elerhet6ve tenni. using System. Diagnostics;
A dokumentumot a workButton valasztasakor szeretnenk megnyitni: private void workButton_Click(object sender, System.EventArgs e) {
Process.Start("Munkakor.doc"); }
258
6.1. Tobb folyamat inditasa Forditas/Futtatas/Teszteh~s
Ha a munka projekt bin / Debug alkonyvtanlban ott van a kivant dokumentum, a gomb valasztas hamsara elindul a Word es megnyitja a fajlt. Ha azonban nem erheto el a Munkakor.doc fajl, akkor kezeletlen kivetel hibaiizenetet kapunk. Alkalmazzuk a kivetelkezelest arra a kiveteles helyzetre, ha nem erheto el a fajl! private void workButton_Click(object sender, System.EventArgs e) {
try {
Process. Start ( "Munkaor. doc" ) ; }
catch(Exception exception) {
MessageBox.Show(exception.Message); } }
Forditas/Futtatas/Teszteles Latjuk, hogy a kivetelt nem mi dobtuk, hanem a Process osztaly Start met6dusa. Ha nem neziink utana a sug6ban, hogy a fiiggveny milyen kivetelt dob, vagy egyszeriien barmely kivetelt el szeretnenk kapni, akkor a legegyszeriibb az osszes kivetelosztaly osenek, az Exception osztalynak egy peldanyat elkapnunk. Az os referencia hivatkozhat ut6dra, tehat minden kivetelt el tud kapni. Mivel az Exception osztalynak van Message tulajdonsaga, igy minden kivetelnek van Message tulajdonsaga. Ha ezt irjuk ki egy iizenetablakban, akkor lathat6an az operaci6s rendszer nyelven kulturalt es tajekoztatast nylijt6 hibaiizenetet kapunk.
6. Gyakorlat. 2. abra A kezelt kivetel altaI kiirt hibaiizenet Ha nem klvanjuk felhasznalni a kiterjeszteshez (doc) rendelt alkalmazas (WinWord) beinditasat - ami a fajlkezeloben van beallitva-, akkor meg kell adnunk a kezelo fajl nevet is a statikus Start fiiggveny parameterekent.
Itt is kihasznaltuk, hogy a WinWord.exe benne van az eleresi utban, es a doc fajl az aktmilis konyvtarban. Egyebkent a teljes eleresi utvonallal kell megadnunk a fajlneveket. Ha ez ut6bbi esetben a megadott fajl nines meg (vagy mas neven van ott), a Word elindulasa utan a kovetkez6 hibaiizenetet kapjuk:
A dokumenrum neve vagy elen§si wlja hibas. Probalja meg a kOvetkezoket: '" Ellenorizze, hogy van-e engedelye a dokumenrumhoz es a meghajt6hoz. "'A dokumenrum megnyitasahoz hasznalja a Fajl menu Megnyitas parancsat.
IC::::::::9.~:::::::::J 6. Gyakorlat. 3. abra A hibaiizenet szovege Lathat6an a WinWord lekezelte a kivetelt, fgy a mi kivetelkezel6nk nem hfv6dott meg. Ha azonban maga a WinWord.exe nines telepftve, vagy nines az eleresi utban, akkor sziikseges a kivetelkezelesiink. A programunkb61 indftott Word alkalmazast hasznalata utan a felhasznal6nak kell leallftani. Ha azonban az altalunk indftott alkalmazast Ie is akarjuk allftani a programb61, akkor sziiksegiink lesz egy objekturnra, amin keresztiil elerhetjiik.
6.1.2. A LinkLabel vezerlo haszmilata Helyezziink egy LinkLabel vezerl6t a listadoboz fOle! Properties Text Hirdetes
A LinkArea tulajdonsag harompontos gombjat vaIasztva megjelenik egy ablak, ahol beallfthatjuk, a szoveg melyik reszehez szeretnenk esatolni. Alapertelmezesben a linket jelz6 szfn kek (linkColor), alaMzott (LinkBehavior SystemDefault). Az eppen feltolt6 link PITOS (AetiveLink), a mar latogatott link bordo (VisitedLinkColor).
6.1.3. A folyamat inditasa objektumbol A dokumentumok eleresenek masik egyszerii m6dja, ha az adott dokumentumot kezel6 alkalmazast egy Process objektumb61 indftjuk el. Az indftaskor egyszeriien
260
6.1. Tobb folyamat inditasa tulajdonsag beallitasaval megadhatjuk, hogy az alkalmazas mely dokumentumot nyissa meg indftasakor. Tegyiink fel egy Process komponenst a ToolBox Components lapjar61! Name: iexplorerProcess Startlnfo FileName: Az iexplore.exe eleresi tittal az adott gepen, pI.: C:\Program Files\Internet Explorer\IEXPLORE.EXE Arguments: A megjelenfteni kfvant honlap helye. Ha nines Intemeteleresfink, akkor egyszeriien a Visual Studio File / New !File / HTML Page / Open segftsegevelletrehozhatjuk a fajlt, melyet Hirdetes.htm neven elmenthetfink. Ezutan az Arguments tulajdonsagba a Hirdetes.htm fajlt adjuk meg a teljes eleresi titvonalaval egytitt! Itt ugyanis a fajlt nem ami alkalmazasunk, hanem az iexplore.exe keresi, es neki nem a mi Debug konyvtarunk az aktualis konyvtar!
Abban az esetben, ha az indftani kfvant dokumentumhoz hozza van rendelve az ot kezelo alkalmazas, itt is megtehetjfik, hogy a FileName tulajdonsagba egyszeriien pI. egy .txt fajl nevet frjuk. Ilyenkor tobbnyire a Notepad indul el a megadott txt fajlt megnyitva, htm eseten a bOngeszo, doc eseten a Word ... Nezzfik meg, hogy a Windows 'Form Designer generated code' szakaszban az 'InitializeComponent()' met6dus k6djaban a bem iexplorerProcess. Start Info . FileName es Arguments tulajdonsagaiban az titvonal dupla \\jelek~t tartalmaz, a C nyelvekben ugyanis a '\' sztringekben vezerlokanikter. \n pI. nem n betUt, hanem soremelest jelent. Most mar csak a LinkLabel valasztasra azt kell mondanunk: private void advertiseLinkLabel_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) {
6. gyakorlat. A Toolbox komponensek Termeszetesen itt is sziikseges a kivetelkezeles, mert bar az Interenet Explorerer kezeli a hibas honlap vagy fajl parametert, de ha nincs a gep eleresi utjaban az iexplore.exe, akkor kezeletlen kivetel keletkezne. A Process objektum Startinfo.FileName tulajdonsagaba frt kiterjesztestol fiiggoen
valtozik a Verb tulajdonsag listaja. Ha pI. egy doc kiterjesztesu fajlt indftunk a folyamatunkb6l, a Verb tulajdonsag listajan vaIaszthatjuk a Print erteket, amely eseten nem megnyitja, hanem kinyomtatja a kfvant dokumentumot alkalmazasunk. Huzzunk uj Process vezerlot az ablakunkra, neve legyen excelProcess! Allftsuk a FileName tulajdonsagat Salary.xls-re (melyet az ExcelbOl letrehoztunk es a Debug konyvtarba elmentettiink), Verb tulajdonsagat pedig Print-rel private void salaryButton_Click(object sender, System.EventArgs e) {
try //Kivetelkezeles, ha nem lenne Excel a gepen. { excelProcess.Start();} catch(Exception exception) { MessageBox.Show(exception.Message) ; } }
Forditas/Futtahis/Teszteles A gomb valasztasara az xIs fajlt kinyomtatja alkalmazasunkat az alapertelmezett
nyomtat6n. Ha a Word (vagy Excel) hfvasat ismeteljiik (Munkakori lefras gomb), az alkalmazas csak aktivizalja a mar megnyitott fajlt. Ez a WinWord beepitett szolgaltatasa. Ha azonban az Internet Explorert (Hirdetes link) hivjuk meg tdbbszor, az minden alkalommal uj es uj bOngeszot nyit.
6.1.3.1. Csak egy peldany fusson! Ha nem akarjuk, hogy tdbb peldanyban induljon el, sziiksegiink lesz meg egy logikai valtoz6ra (isExplorerProcess), mely megmondja, elindftottuk-e mar a bongeszot. Kezdoerteke legyen false, es indftaskor allitsuk true-ra! private void adverti icked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) {
262
6.1. Tobb folyamat inditasa try {
iexplorerProcess.Start();
}
catch (Exception
}
~
Forditas/Futtatas/Teszteh!s
6.1.3.2. Visszajelzes leallitaskor Ha munka kozben a felhaszmil6 leaIlftja a bOngeszot, a logikai valtoz6nknak is mutatni kell a vaItozast! Ahhoz, hogy lizenetet tudjon klildeni a folyamat, az EnableRaisingEvents tulajdonsagat igazra kell allftanunk. Rendeljlink kezelo met6dust a folyamat Exited esemenyehez! private void explorerProcess_Exited(object sender, System.EventArgs e) {
isExplorerProcess
= false;
}
~
Forditas/Futtatas/Teszteles
A link szoveg szfne is m6dosfthat6, ha ezzel kfvanjuk jelezni, a hatterben meg van-e nyitva az alkalmazas.
A Process osztaIy rendelkezik egy HasExited tulajdonsaggal, mely segftsegevel a mar elindftott folyamatr61 megtudhatjuk, hogy leallte. A mi esetlinkben hasznalatara nem volt szlikseg.
6.1.3.3. Kilepeskor alljon Ie az elinditott folyamat is! private void MunkaForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
if (isExplorerProcess) iexplorerProcess.CloseMainWindow(); }
263
6. gyakorlat. A Toolbox komponensek
,
Forditas/Futtatas/Teszteles
• Ha az Internet Explorer (iexplore.exe) helyett a fajlkezelot (explorer.exe) indftjuk, az is megtalalja a kiterjesztes alapjan az inditani kivant fajlt, de leallftani mar nem tudja.
A CloseMainWindow tagfiiggveny helyett haszmilhattuk volna a folyamat leallitasara a Kill met6dust is. Mig a CloseMainWindow elkiildi a folyamat tizenetsoraba a leallitashoz sztikseges tizenetet, es fgy a szokasos leallast produkalja, a Kill azonnali befejezest jelent, abnormalis prograrnleallast fgy adatvesztessel jarhat. Olyan folyamatok eseten, melyeknek nines ablakuk, a Kill az egyetlen m6dja a folyamat leallftasanak.
6.2. Az idozito
kezelt~se
Tegytink a kepernyore egy gombot, mely rovid idokozonkent valtoztatja helyet! A felhasznal6 feladata a gomb 'elkapasa', a gombon torteno kattintas. A gomb neve legyen eatehButton, felirata: Kapj ell Huzzunk a formra a ToolBox Windows Forms eszkozei koztil egy Timer komponenst! A neve legyen eatehTimer! Ha fel masodpereenkent szeretnenk az tizenetkiildest, Interval tulajdonsagat allftsuk 500-ra! A gomb uj helyenek meghatarozasahoz hasznaljuk a veletlen szam generatort! ClassView CatchForm
jobbeger
Add Add Field Field access: private Field type: Random Field name: rand Finish A form konstruktoraban adjunk neki kezdoerteket, es inditsuk el az idozitot! A gombon val6 kattintaskor allitsuk Ie az idozitot!
A timer az Enabled tulajdonsaganak true-ra allitasaval is indfthato. A catchTimer valtozon duplan kattintva, vagy catchTimer a Properties ablak Events gombjat valasztva a Tick esemenyhez kezelot rendelve mozgassuk a gombot! private void catchTimer_Tick{object sender, System.EventArgs e) {
Azt tapasztaljuk, hogy idonkent a gomb az ablak aljan epp hogy lathato. Mivel az ablak magassagaba beletartozik a cfmsor is, igy hiaba vontuk ki a magassagb61 a gomb magassagat, meg a cfmsor es a keret vastagsagat is ki kellene vonni. Akkor mar egyszeriibb a kliensteriilet meretevel dolgozni. private void catchTimer_Tick(object sender, System.EventArgs e) {
Most mar a teljes gomb a kliensteriileten beliil mozog, meghozza az ablakmeret vciltozasaval kihasznalja a rendelkezesre all0 teret. Ha eleg kicsire valasztjuk az ablak meretet, el tudjuk kapni a gombot, ezzel tesztelve az idozito leallftasat.
265
6. gyakorlat. A Toolbox komponensek A jatek meg l
6.3. Feladatok 1. Keszitsiik el a 'Munka' alkalmazasunkat ugy, hogy a megtekintheto dokumentumokat egy meniibOl lehessen kivalasztani! Itt m6d nyflik arra is , hogy egy almeniibOl tObb azonos tipusu, de ktilonbozo tartalmu dokumentum vaIasztasat felkfnaljuk. 2. Inditsunk el a programb61 egy PowerPoint bemutat6t, kezeljiik a lezarasat is! 3. Fut6 alkalmazasok. Keszitsiink alkalmazast, mely egy ablakban kilistazza az adott nevil eppen fut6 alkalmazasokat! Egy gomb valasztas hatasara az osszes adott nevil alkalmazas alljon Ie! *
4. Feny6jsag. Keszitsen egy mezot az ablakban, melyben egy szoveg jobbr61 balra folyamatosan mozog! 5. Az alkalmazas ablakaban egy szovegmezo es egy folyamatkijezo mutassa az inditas 6ta eltelt idot! Tobb folyamatkijelzonk is lehet. PI. egyik 10 perces idotartamot jelez, a masik az eltelt 10 perceket pI. 25 perc az 2 egyseg az egyik, mig 5 a masik kijelzon. 6.
Folyamatkijezos jatek. Legyen az ablakban egy folyamatkijelzo egy '+' es egy '-' gomb. A progressbar 0 es 100 kozotti ertekeket mutat. Kezdetben epp 50-et. A '+' gombbal +10 a '-' gombbal -10 ertekkel m6dosithatjuk erteket. A hatterben egy idozito 0,5 masodpercenkent hozzaad vagy levon egy 0 es 30 kozotti szamot. Ha a kijelzo eleri a 0 vagy a 100 erteket,agep nyert, ha a jatekos bfrja 10 masodpercig, akkora jatekos nyert. Egy szovegmezo mutassa a folyamatkijelzo aktuaIis erteket! A jatek egy Start gomb segitsegevel indithat6, ujraindithat6. * "
~
"-~~
--~
[f;J[I)1fl
6!1 Tartsa 0 es 100 kozott! 135
Start +
I
111111-1---
- I
On gy5zottl Gratulalok! Ha Uj jatekot akar nyomja meg a Start gombotl
IL:::::::::¢.~::::::::::::;J 6. Gyakorlat. 4. abra A jatekos gyozelme
266
6.4. Megoldasotletek
--------------------------------=--------------------------------7. A progressbaros jatek tovabbfejlesztese ugy, hogy be lehessen allftani az id6zft6 gyorsasagat, a '+' es '-' gombok altaI hozzaadott, levont erteket es a Maximalis erteket es egy menet idejet!
6.4. Megoldasotietek 3. Fut6 alkalmazasok Ha csak a felhasznal6i feliilettel rendelkez6 folyamatokat kfvanjuk kilistazni, akkor, mivel nekik van f6ablakuk es annak cimsora, a legtobb informaci6t e cfmsor szovegebOl kapjuk. A frissftes (refresh) gomb hatasara a processListBox listadobozba kilistazza az eppen fot6 processek cimsorat, ha az nem tires. private void RefreshButton_Click{object sender, System.EventArgs e) {
processListBox.ltems.Clear{); foreach (Process p in Process.GetProcesses{)) if (p.MainWindowTitle!="") processListBox.ltems.Add{p.MainWindowTitle) ; }
A val6sagban az itt felsoroltnal j6val tObb folyamat fot. A tObbsegnek vagy nines ablaka, vagy a f6ablak cfmsora tires. Ezt megnezhetjtik a Tools mentipont Spy++ almentipontjat valasztva, majd a Processes eszkozgombra kattintva. Ha ezek mindegyiket ki akarjuk listazni az ismetl6d6 System.Diagnostics.Process es a zar6jelek nelktil: foreach (Process p in Process.GetProcesses{)) {
str=p.ToString{); str=str.Remove{O,28); II System.Diagnostics.Process str=str.Remove{str.Length-l,l); II ) processListBox.ltems.Add{str); }
A Notepad gombon kattintva bezarjaaz osszes Jegyzettomb alkalmazast. private void
NotepadButton~Click{object
sender, System.EventArgs e)
{
Process [] p=Process. GetProcessesByName ( "Notepad" ) ; for (int i= p.Length-l; i>-l; i--) p [ i] . Ki 11 ( ) ; }
A folyamatok leaIlftasahoz itt azert hasznaltuk a Kill met6dust, mert ha valamilyen okb61 - pI. internet honlapot keresiink, de nines internet kapesolat, vagy epp meg akarunk nyitni a Jegyzettombben egy fajlt - egy modalis ablak van eppen kinyitva, akkor is leallftja a folyamatot a CloseMainWindow-val ellentetben.
Ha a lezarasnal a GetProcesses tagfiiggvenyt hfvtuk volna, az mindent visszaad, fgy met6dusunk mindent leallftana, meg a Windowst is! 6. Folyamatkijelzos jatek A feladathoz ket id6zft6 kell: timer valtoztatja az erteket, Interval tulajdonsaga 500, a timeTimer meri a jatekid6t, Interval tulajdonsaga 10 000.
A megjelenftett erteket eelszerii egy int tfpusu adauagban (val) tarolni, hisz alland6an szamolnunk kell vele. A veletlen szam hozzaadashoz kell egy veletlen szam generator (rand). private Random rand; private int val; public ProgressForm() {
InitializeComponent() ;
}
A folyamatkijelz6 ha tu1csordul vagy aIu1csordul, azaz ha a maximaIis erteknel t6bbet, vagy a minimalis erteknel kevesebbet vesz feI, kivetelt dob. A tu1csordulast es alu1csordulast egy ona1l6 tagfiiggvenyben (OverFlow) vizsgaijuk, mert a timer es a ket (+, -) gombon kattintas esemenykezel6je is m6dosftja az erteket, fgy rnindharom esetben vizsgaini keli. Ilyenkor gy6z a gep. Celszerii a mindharom esetben ismetl6d6 egyeb tevekenysegeket pI. textBox-ba kifras is itt megval6sftani a k6dt6bbszorozes eikeriilese erdekeben. private void plusButton_Click(object sender, System.EventArgs e) {
textBox.Text=val.ToString(); if (val>100 I I val
timer. Stop ( ) ; timeTimer.Stop(); MessageBox.Show("Sajnos a gep gyoz6tt! Probalja ujra!");
val = 50; }
else progressBar.Value=val; }
Ha letelt a 10 masodperc, es nem alit meg a timeTimer, akkor el tudja kiildeni az iizenetet, s igy a jatekos gy6zott. private void timeTimer_Tick(object sender, System.EventArgs e) {
timer.Stop(); timeTimer.Stop() ; MessageBox.Show("On gyoz6tt! Gratula.lok! Ha lij jeitekot akar, nyomja meg a Start gombot!"); }
269
7. Gyakorlat. A komponensek felhasznalasa Az alkalmazasunkkal parhuzamosan szeretnenk futtatniegy mar megirt alkalmazast oly m6don, hogy nemcsak altalanosan mint folyamatr61 szeretnenk informaci6t kapni, hanem az alkalmazassal kapcsolatos konkret utasitasokat szeretnenk kiildeni neki. A Microsoft rendelkezesiinkre bocsatja a gepiinkre telepitett office alkalmazasok komponenseit.
7.1. Szamiainis, nyomtatas A 'Vendegl6 a Vilag Vegen' feladatban a vendeg) szarnlat szeretne kerni a fogyasztasar61. Ehhez tegyiink egy SzamIa feliratu billButton nevii' gombot az ablakra!
7.1.1. A Word indiblsa a programb61 Solution Explorer References jobbeger Add Reference COM fill
271
7. gyakorlat. A komponensek felhaszmihisa Microsoft Word X.X Object Library (a verzi6szam a gepre telepitett Word verzi6jat61 fiigg) Select
OK
'p angala k t ik u SSl~.9$'~JOt.ls-"J;'-AJ:;9~AWN~wi9. PUr Aldebrani ix~-1,~v~v~v~V~V~V~V~V~V~VA~vvZf, Pur Dzsynne is 19.R1W.t..v~v~'V~V'AV~V~V'AV'AV~%'VJJ!v Pur
Csinant o/WR'i»m'~~w"~~'~'vvvv'vvvv~l}', Egy uve g ~r~W.J;vv'vv~'vv'vvvv'vv'~VV'VV'VVVNl.~.Q Dzsynne ist.0}:mZt~~~vv~~~vv~vvvv1.2v Tap-O-Mat ij;N~v~vvV~v~vvvvvvvvvvvvvvvv2,
Fize tendo: 398 §
Pur Pur Pur Pur
PmJ
!o~:';;~ Oldal 1
S2 1
Pangalaklikus gog.pukkas,lo
f45Pu;"
Dzsynneis lonnyk
I 32 Pur
Aldebrani ilal
~
Egy iiveg Jam:
I 250 Pur
Csinanto/mningsz
~
Fizetendo:
Sza!llioi
J
398 Pur
Pangalaktikus gegepukkaszt6 Aldebrani ital
45 Pur 26 Pur
Dzsynneis tonnyk
32 Pur
Csinanto/mningsz Egy uveg Janx
11 Pur 250 Pur
Dzsynneis tonnyk Tap-O-Hat ital
32 Pur 2 Pur
7. Gyakorlat. 1. abra A szarnla a W ordbe rrva A valasztas hatasara a References lis tab an negy uj komponens jelent meg, k6z6ttiik a Word, mely az Interop.Word.dll-ben van lerrva. A privat assemblyket Interop.Microsoft.Office.Core.dll, az Interop.VBIDE.dll es az Interop.Word.dll- a Visual Studio alapertelmezesben (Copy Local = True) a k6nyvtarunkba masolja. Mig az stdole.dll osztott assemblyt a GAC-bOl hivatkozza Ie az alkalmazas. (Solution Explorer / References / stdole / Properties.) Keresslik meg 6ket a k6nyvtarakban! private void billButton_Click(object sender, System.EventArgs e) {
Word.Application word word.Visible = true; }
Forditas / Futtatas
272
=
new Word.Application(); II Ha latni akarjuk.
,
7.1. Szamlairas, nyomtatas
• A Word nevteret ki kell frnunk, mert nem adtuk meg a using direktfva mogatt. Itt ne is tegyiik, mert ha befrjuk: using Word; akkor az alkalmazas Main met6dusaban mvott Application osztaIyr61 a fordft6 nem tudja eldonteni, hogy a System.Windows.Forms nevterben vagy a Word nevterben megadott deklaraci6t hasznalja. 'Application' is an ambiguous reference hibauzenetet kapunk. ,
7.1.2. Iras a Wordbe a programb61 A Wordbe uj dokumentumot a Document~.Add fiiggvennyel adhatunk, mely negy parametert var. A C# fiiggvenyek nem ismerik az alapertelmezett parameter fogalmat, viszont egy specialis parameterrel helyettesfthetjuk a hianyz6 argumentumokat. A Missing osztaly Value statikus adattagja lehet6ve teszi, hogy a hianyz6 parametereket helyettesftsiik vele. A Missing osztaIy a System. Reflection nevter tagja.
Word.Application word = new Word.Application(); word.Visible = true; II Ha latni akar'uk.
}
Az lrashoz egy Selection objektum szukseges, mel yen szukseg eseten beallfthatjuk
a felhasznalt font tulajdonsagait. :irni a TypeText met6dussal, sort emelni a TypeParagraph met6dussal, vagy a szovegben szokasos \n-el lehet. Ezt itt felvaltva hasznaIjuk. private void billButton_Click(object sender, System.EventArgs e) {
Word.Application word = newWord.Application(); word.Visible = true; II Ha latn:L akarjuk. object m = Missing.Value; word.Documents.Add(ref m,ref m,ref m,ref m);
273
7. gyakorlat. A komponensek felhaszmilasa
System.Windows.Forms.dll
.
.
Interop. Word.dll
I System.Windows.Forms
I I
Form
f:;::,.
,•
I
Word
I Dokuments 1
.
I Application I I
Selection
1
.
Iitallap.e~e Itallap
I
I
ItalForm
L..
7. Gyakorlat. 2. abra A felhasznalt f6bb komponensek, nevterek es osztalyaik Forditas / Futtatas / Teszteles Az egyes tetelek arai most sincsenek egymas alatt, de most mar tudjuk, hogy ez a
proporcionalis fontszelesseg miatt van. Ha Courier New fontot valasztunk a tetelek kllrasahoz, a problema megold6dik. s~J:~Citi6n.~··Font·]Nam~/·· .•;'i.l~coiir;i.~r·.Nejifii·.·~'· ~ .<-,': "", " -,__ . "'_'' ,. " :_> _ _ :~t.: J'.'i',' '
'_', "'-,
- _,
' _ ,- -:' ,·'C'.":
-',_'",-_ - "'V" ','.,',' ,c",, __ . _: '_
'c,
' __ ".,
"_';"''',,_,', __
for (int i=O; i
selection.TypeParagraph() ; selection.TypeText(italokBox.ltems[ij .ToString()); }
A kiiratasmil a fontot meg animalni is lehet, a lehetosegekrol a legordiilo sug6 tajekoztat. PI. a kovetkezo beallirns villogtatja a mogotte kiirt karaktereket. selection.Font.Animation Word.WdAnimation.wdAnimationBlinkingBackground;
~
=
Forditas / Futtatas / Teszteles
Ne kiszftsunk szamlat! Lepjunk ki az alkalmazasb6l!
JO.
Indftsuk a szamlat, majd ne zarjuk be! Lepjiink ki az alkalmazasb6l!FUT TovABB. Indftsuk a szamlat, majd zarjuk be! Lepjiink ki az alkalmazasb6l! Indftsuk a szamlat, majd zarjuk be! Indftsuk ujra a szamlafrast!
JO. JO.
Indftsuk tobbszor a szamlafrast! Lepjunk ki az alkalmazasb6l! FUTNAK TOVABB. '
.
Ha kilepiink az alkalmazasb6l, azt szeretnenk, ha az altalunk nyitott Word ablakok is bezar6dnanak. Bezaraskor a foablak Closing esemenye hiv6dik meg, itt kellene bezarni az ablakokat. Azonban most a word objektumunk a billButton_Click fiiggveny lokalis objektuma, mas tagfiiggveny nem lathatja. Tehat eloszor az alkalmazas minden tagfiiggvenye szamara hozzaferhetove kell tenniink a word objektumot. Vagyis tagvaltoz6kent kell felvenniink. Az inicializalast vegezziik a konstruktorban! private Word.Application word; public ItalForm() {
InitializeComponent() ; word = new Word.Application(); word. Visible = false; }
Ezutan csak lathat6va kell tenniink a billButton_Click elejen.
~
Forditas / Futtatas / Teszteles
Bar val6ban lathat6va valik, megis a hatterben marad. Aktivva is kell tenniink! word. Visible = true; word.Activate() ;
II Ha latni akarjuk.
275
7. gyakorlat. A komponensek felhaszmilasa
7.1.3. A parhuzamosan megnyitott alkalmazast zarjuk be kil{~peskor! Ezutan mar leallithatjuk alkalmazasunkat. private void ItalForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
object m = Missing.Value; word.Quit(ref m, ref m, ref m); }
Forditas / Futtatas /
Tesztelc~s
Ne keszitsiink szamlat! Lepjiink ki az alkalmazasb6l!
JO.
Inditsuk a szamlat, majd ne zarjuk be a Word ablakot! Lepjiink ki az alkalmazasb6l!
JO. Inditsuk a szamlat, majd ne zarjuk be a szamlat! F6kuszaljunk egy masik alkalmazasra, majd vissza a VendeglOhoz! Lepjiink ki az alkalmazasb6l! NEM VESSZUK ESZRE, HOGY RAKERDEZ, MENTSE-E AZ ADATOKAT. A HATTERBEN MARAD. Inditsuk a szamlat, majd zarjuk be! Lepjiink ki az alkalmazasb6l! HIBA: Az RPC -kiszolgal6 nem erheto el. A Quit hivasanal. Inditsuk a szamlat, majd zarjuk be! Inditsuk ujra a szamlairast! HIBA: Az RPC -kiszolgal6 nem erheto el. Az Activate( )-ne!. Inditsuk tobbszor a szamlairast! Lepjiink ki az alkalmazasb6l!
JO.
A hibak tebat lenyegeben ket helyzetben lepnek fel, ha mar bezartuk az alkalmazast es ujra aktivizalni akarjuk, vagy ha ujra be akarjuk zami. Vagyis nem miikOdik az alkalmazas elejen megnyitom a vegen zarom ely, mert a felhaszna16 is bezarhatja. Tebat, ha sziiksegiink van ra, akkor kell megnyitni (ez hatekonyabb is)! Az ablak sziikseg eseten torteno letrehozasa visszakeriil a billButton_Click met6dusba. private void billButton_Click(object sender, System.EventArgs e) {
if (word == null)
//Ha
m~g
{
word = new Word.Application(); }
276
nem hoztuk
l~tre.
7.1. Szamlairas, nyomtatas try
IIHa mar bezartuk, akkor lijra letre kell hozni.
{
word.Visible = truei
II Ha latni akarjuk.
}
catch {
word = new Word.Application()i word.Visible = truei II Ha latni akarjuk. }
word.Activate()
i
II Ha felul akarjuk latni.
}
Az elejen a word == null vizsg,ilat akar folOsleges is lehet, hisz ha meg nem hoztuk letre, akkor ugyanugy kivetelt dob a kovetkezo sorban, mint amikor bezartuk. A kerdes az, hogy kiveteles esetnek tekintjtik-e a letre nem hozast? Ha igen, akkor hagyjuk el az elso elagazast! A bezarast fgy val6sftjuk meg. private void ItalForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
try {
word.Visible=truei word.Activate()i object m = Missing.Valuei word. Quit (ref m, ref m, ref m)i }
catch {}i }
A catch blokk tires, hisz ha nines word, akkor nem kell kilepni belole.
~
Forditas / Futtatas /
Teszteh~s
Ne keszltsiink szamlat! Lepjiink ki az alkalmazasb6l!
JO.
Indltsuk a szamlat, majd ne zarjuk be a Word ablakot! Lepjiink ki az alkalmazasb6l!
JO. Indltsuk a szamlat, majd ne zarjuk be a szamidt! F6kuszaljunk egy masik alkalmazasra, majd vissza a VendeglOhOz! Lepjiink ki az alkalmazasb6l! HA A MAS ALKALMAZAs EGY MASIK WORD ABLAK, AKKOR FOLlJ; KERUL, EGYEBKENT SARGAN FIGYELMEZTETVE VILLOG A START TALCAlAN AWORDIKONJA. JO. Indltsuk a szamidt, majd zarjuk be! Lepjiink ki az alkalmazasb6l!
JO. 277
7. gyakorlat. A komponensek felhaszmilasa Indftsuk a szanilat, majd zarjuk be! Indftsuk ujra a szamlafrast!
JO.
Indftsuk tobbszor a szamlafrast! Lepjunk ki az alkalmazasb6l!
JO.
7.1.4. A nyomtabisi kep Ha csak a nyomtatasi kepet szeretnenk latni, akkor kezdetben legyen a Visible tulajdonsaga false, majd a k6dreszlet vegen: selection.Document.PrintPreview() word.Visible=truei
i
Forditas / Futtatas / Teszteles
7.1.5. Hatterben nyomtatas Ha pedig ugy akarjuk kinyomtatni, hogy kozben ne nyiljon ki a word, akkor a word. Visible = false; sor legyen az elejen, a vegen pedig meghfvjuk a PrintOut fiiggvenyt csupa Missing.Value parameterrel: selection.Document.PrintOut(ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m) i
Mar csak annyi a feladat, hogy a 'Vendegl6 a Vilag Vegen' fe1iratot, es egy parbeszedablakba bekerve a vev6 adatait is kirrjuk a szamlara. Ezt mar az 0lvas6 az eddig tanultak alapjan meg tudja val6sftani.
~
Forditas / Futtatas / Teszteles
7.2. Ahiinisgyujtes digihilisan Kepzeljiik el, hogy egy TabletPC segftsegevel gylijttink alarrasokat egy petfci6hoz! Az alarrasok feldolgozasa - feIteve, hogy adatbazisban taroljuk 6ket- sokkal egyszeriibb. Az ismet16desek es a nem letez6 szemelyek kisziirese egyszeriien megoldhat6. Az ily m6don rendelkezesiinkre a1l6 alarrasok szama azonnal megtudhat6. Mi most e feladatban a felhaszna16i feltilet elkeszitesevel foglalkozunk. Mivel nem all rendelkezesiinkre aktfv toll es TabletPC, ezert alafrni az egerrel tudunk, de az alkalmazast TabletPC-re masolva aktfv tollal is miikodik.
,
• A letOlthet6 forrask6d miikOdesehez is sziikseges a Tablet PC Platform SDK. LetOItese nelktil eltiinik a Sign alkalmazas [Design] nezeteb61 es a lefordftott alkalmazasb61 is az InkPanel vezer16.
278
7.2. Alrurasgyiijtes digitalisan
7.2.1. Honlapr611etoltott komponens haszmilata Toltsuk Ie a Microsoft honlapr61 a Tablet PC Platform SDK-t! Ez www.microsoft.com Search Microsoft.com for: Tablet PC Platform SDK
GO
Download details: Tablet PC Platform Software Development Kit (SDK) Meret az 1.5 verzi6 eseten: 11020 KB
Download
A letoltott telepitot elinditva, telepithetjuk az SDK-to A telepites utan a Start menu / Microsoft Tablet PC Platform SDK alatt reszletes dokumentaci6t es mintaprogramokat talaIunk. Keszitsuk el az alairasgyiijto (Sign nevil) alkalmazasunk parbeszedfeliiletet!
7. Gyakorlat. 3. abra Az alairasgyiijto felhasznal6i feliilete A feliilet aljara egy olyan panelt teszunk, amin ala tud irni a jelentkezo. Ehhez a Microsoft.Ink.dll-re lesz sziiksegiink. Solution View References jobbeger Add Reference .NET flil Microsoft Tablet PC API Select
OK 279
7. gyakorlat. A komponensek felhasznalasa
Ha a Visual Studiot meg a komponens telepftese elott indftottuk, elofordulhat, hogy nem tal
7.2.2. Az irhat6 panel osztaly elkeszitese A ToolBoxban rendelkezestinkre all egy Panel, de mi azt szeretnenk, ha frni is lehetne r
A k6dban sztiksegtink lesz egy InkOverlay objektumra, ami lehetove teszi az frast a panelen. Az InkOverlay osztaly k6dja a Microsoft.Ink nevterben szerepel. uSlng System; using Micrpsoft.Ink;
namespace Sign { ,I / ,/ ,
:
!
;
,I !
Sun®ary description for InkPanel.
!// < /
~::. Ul1una:cy:>
public class InkPanel : System.Windows.Forms.Panel {
Ezutan hUzzunk egy Panel objektumot a formunkra, es a forrask6dban allftsuk at az osztalyat Panel-rol InkPanelre! A k6dot a SignForm osztaly adattagjai k6zt es az InitializeComponent-ben a konstruktor hfvasat m6dosftsuk:
280
7.2. Alairasgyiijtes digitalisan public class SignForm : System.Windows.Forms.Form {
this.cimTextBox = new System.Windows.Forms.TextBox()i . . • •»~ thlS .lnkPanel = new f~:~~~~~~~~~~ 1~:U~&",,~".i%lfJlit'i!JA~ this.SuspendLayout() i } }
~
Forditas / Futtatas / Teszteles
Ha a hibas k6dohis miatt eltiinik a SignForm Design nezeteb61 a panel, annak valami szoftverhiba az oka. A legegyszeriibben a k6dban tortent javitasok atnezesevel (visszagorgetesevel) hozhatjuk helyre. -
~ Alai.as gyiijles!
~
~--
[¥B1iJ1III
7. Gyakorlat. 4. abra Az alairasgyiijt6 felhasznal6i feliilete az inkPanellel . Szeretnenk jelOlni a jelentkez6 szamara, hoI tud alairni! Tegytink egy alairas feliratot az inkPanel ala - ugy meretezzUk, hogy ketsoros legyen es TextAlign BottomCenter -, es allitsuk a panel BorderStyle tulajdonsagat Fixed3D-re! 281
7. gyakorlat. A komponensek felhasznalasa
I
I
System.Windows.Forms.dll
I
I
I
System. Windows.Forms
I I
I
I
I
I
II
Form
y
Panel
~
I MiCrOS~ft.lnk.dll
I
I
Microsoft.lnk
I
I
.
I InkOverlay I
I ;--
I
Sign.e xe
I
I
Sign
I
I
I SignForm J
I
U
InkPanel
I
r
7. Gyakorlat. 5. abra Az alafrasgyiijto fObb komponensei, nevterei es osztalyai A Label osztalyt nem tudjuk a TrancparencyKey tulajdonsaggal atlatsz6va tenni, mert ez a Form osztaIy tulajdonsaga. Viszont keszfthettink egy frhat6 Label osztaIyt. Azt hasznalva az alafras szoveghez megtehetjiik, hogy alafrasunk a pontozott vonal ala csusszon.
IMegjegy:zes:1 Ha val6ban tudjuk az alkalmazast Tablet PC-re telepiteni, akkor erdemes kipr6balni az egyik szovegmezo helyett a Microsoft. Ink. InkEdi t osztaIyt, amely lehetove teszi a szovegmezobe is a tollal frast, sot angol szoveg eseten karakterfelismerot is tartalmaz, vagyis a kezzel frt szoveget karakteresse alakftja.
7.3. Feladatok 1. Egy alkalmazas meniijeben keszftsiink az adott temaval kapcsolatban tajekoztatast ad6 meniipontokat! Az informaci6t kiilonbbzo honlapokon erhetjiik el. A feladatot Internet Explorer objektum segftsegevel oldjuk meg, melynek cfmet a meniipontok vaIasztasaval allfthatjuk be!*
2. Szamlairas mentese. Mielott bezarnank a Szamlat keszfto alkalmazasunkat, ne visszakerdezziink, hanem kerdes nelkiil mentsiik el a hatterben meg nyitva levo szamlakat!*
282
7.4. Megoldasotletek Tegyiink egy gombot az Elad6 alkalmazas feltiletere, mely lehetove teszi szamlanyomtatasat MS Word felhasznalasaval! Italosszesito Excelben. Keszitstink az Itallap feladathoz egy hatter Excel tablazatot, mely folyamatosan tarolja az elfogyasztott italok szamat es arat!* Inditsunk programunkb61 egy PowerPoint bemutat6t! Indftsuk el, es kezeljtik a programunkb61 a Windows Media Playert! Valamely eddig elkesztilt alkalmazasunk hattereben jatsszunk zenet a Windows Media Player segitsegevel! A hangot lehessen ki- es bekapcsolni!
7.4. Megoidasotietek 1. Navigalas az Internet Explorerben meniipontok v3lasztasara Az Internet Explorer az SHDocVw komponensben es nevterben van lefrva, melyet az Add Reference ablak COM fiile alatt talalunk. private SHDacVw.lnternetExplarer ie;
Az ie indftasa: ie = new SHDacVw. InternetExplarer () ; ie.Visible = true;
Az ie navigalasa a mentipontok hatasara: Object a = null; ie.Navigate(nC:\\praba.html n , ref a/ref a/ref a/ref a);
Csak akkor erdemes navigalni, ha nem az az oldal van betOltve, mert az ujraletOltes idoigenyes lehet. Az ie.LocationURL tulajdonsagaval kerdezhetjtik Ie az epp betOlOtt lap cimet. A LocationURL erteket a debugger segitsegevel nezhetjtik meg. A Variables ablak mutatja a letOltes befejezese utan.
Regebbi verzi6knal fajl eseten nem eleg az eleresi utat beirnunk, ele kell tenni a file nevet es a ///jelet. if (ie.LoeationURL != "file:IIIC:/proba.html n
)
II Web eim eseten azonos a Navigate parameterevel.
283
7. gyakorlat. A komponensek felhasznahisa
------------~~--------~-----------------------
Lehet6seg van a betbltes folyamatanak figyelesere es kijelzesere egy folyamatkijelz6 segftsegevel. Azt is szabalyozhatnank, hogy csak akkor mutassa a linklabel szfne, hogy kivalasztottak, ha val6ban letbltodott a fajl, ne minden esetben. Az is megoldhat6, hogy ha tbbb helyen tarolt anyag az egyik helyen nem erhet6 el, keresstik a masik helyen.
2. A szamlairas mentese A dokumentumokat az utolsoval kezdve zarjuk be, fgy a sorszamokat csokken6 sorrendben celszerii kiosztani.
word.Visible=true; word.Activate() ; object m = Missing.Value; int i = word.Documents.Count; foreach.(Word.Document doc in {
}
word.Quit(ref m, ref m, ref m); }
catch {}; }
A Word a dokumentumait, Dokumentuml, Dokumentum2 ... nevvel hitja el, vagyis a szamlaIasukat a C tfpusu nyelvektol elter6en nem O-val, hanem l-gyel kezdi. Erre figyelniink kell, ha ciklussal valosftjuk meg a mentest! Raadasul az utoljara ITt lesz az els6.
284
7.4. for(int
l
=1 ;i<word.Documents.Count+1;i++)
{
object filename= "Szillnla"+i; object o=(object)i; Word.Document doc = word.Documents.ltem(ref 0); doc.SaveAs(ref filename,ref m,ref m,ref m,ref m, ref m, ref m, ref m, ref m,ref m, ref m, ref m,ref m,ref m,ref m,ref m); }
Mivel csak a szamlak nevet adjuk meg, a fajlok a Word alapertelmezett konyvtaraba, a Dokumentumokba mentOdnek. 4. ItalosszesitO Excelben Az Excel komponens a COM lapon Microsoft Excel X.x Object Library nev
alatt erhet6 el. Keszitsiink egy Excel tablazatot az excelben, es mentsiik a Dokumentumok konyvtarba ltal1apFogyaszt.xls neven! Az Oszz At oszlop cellait es az osszes fogyasztast keplettel adjuk meg! (=B3*C3; =SZUM(D3:D8»
Ha nem akarjuk minden ital vaIasztasakor ujra es ujra nyitni es zarni az Excelt, akkor a program elejen / vegen tegyiik ezt meg! private Excel.Application excel; public ItalForm() {
InitializeComponent() ; excel = new Excel.Application(); excel.Visible = true; object m = Missing.Value; Excel.Workbook workb = excel.Workbooks.Open( "ItallapFogyaszt.xls",m,m,ffi,m,m,m,m,m,m,m,m,m,m,m); }
Keszftsiink egy Italok new fiiggvenyt az ItalForm osztalyba, mely noveli az italvalasztaskor a cella tartalmat! (Class View / ItalForm / Add / Add Method) public void Italok(int sor) {
Excel.Worksheet worksheet = (Excel.Worksheet)excel.Worksheets[ll; Excel.Range range = (Excel.Range)worksheet.Cells[sor,31; int db; db = Convert.Tolnt32(range.Value2.ToString()); worksheet.Cells[sor,31=db+l; }
Az ital vilasztasakor ezt a fiiggvenyt hfvjuk meg a megfelelo sorszammal! private void Button_Click(object sender, System.EventArgs e) { ... case "Pangalaktikus gegepukkaszt6": sar = panTextBox.Text.TrimEnd(penz); //Excel ::tta1,9~(•
3}·.;····
break; }
Ne feledjiik meg a Wries megval6sftasit! Ha Wbb alkalmazisb61 egyszerre kfvanjuk frni az excel fijlunkat, az mar problemat jelent. Hisz ez a megval6sftas minden alkalmazasb61 uj es uj Excelt nyit benne az aktmilisan mentett dokumentummal. Az azonos alkalmazasb61 nyitast meg meg lehetne val6sitani, de ha ugy akarunk a dokumentumba frni, hogy az adat beolvasasa 6ta valaki mas mar m6dositotta annak erteket mire mi a m6dositott erteket frni akarjuk (concurrency violation), ez problemit okoz. Ilyen esetben javasolt az adatok - parhuzamos adatkezelest biztosit6 - adatbiziskezelo alkalmazasban Wrteno feldolgozasa excel fiji helyett.
286
8. Gyakorlat. Osztalykonyvtar keszitese . Az elozoekben megtanultunk oszhl1ykonyvtarakat felhasznalni, most kesziteni szeretnenk egyet. Az osztalykonyvtar lenyege, hogy Wbb alkalmazas is hasznalhatja. A 2. gyakorlaton keszitettiink egy je1sz6bekero alkalmazast. A jelsz6bekeres azonban nem egy ona1l6 alkalmazas, hanem tipikusan a feltetele egy alkalmazas hasznalatanak.
Sok kiilOnbozo alkalmazas indulhat jelsz6bekeressel. Termeszetesen a kiilonbozo alkalmazasok hasznal6inak jogosultsagai e1teroek, de az elv megis azonos, ahhoz, hogy elindithassak az alkalmazast, vagy ahhoz, hogy futtatas kozben bizonyos miiveleteket elvegezhessenek, sziiksegiik vafl a jogosultsag ellenorzesre, az azonosit6juk es a jelszavuk megad
8. gyakorlat. Osztalykonyvtar keszitese
Pangalaktikus gogepukkaszto Dzsynneis tonnyk
Kerem adia meg a ielszot! Aldebrani ital Felhasznalo nov: Jelszo:
8. Gyakorlat. 1. abra A Vendeglo a Vilag Vegen alkalmazas ajelsz6bekero ablakkal
8.1. Jelsz6bekero komponens keszitese Keszithetlink ugy is osztalykonyvtarat, hogy eloszor egy tesztalkalmazas segitsegevel teszteljlik. Azonban a legtobb esetben a dll keszites egy elo feladat kapcsan merlil fei. Mindig is megvolt az igeny a programfejlesztokben, hogy megirt k6djaikat mas alkalmazasokban is ujrahasznositsak. Ezert igyekeztek a feladatot minel altalanosabban megva16sitani. Termeszetesen csak annyira, hogy az ne menjen a fejlesztesi ido j6 kihasznalasanak karara. Az osztalykonyvtar csak egy tovabbi lehetoseget kinal a k6d-ujrahasznositasra. Elhataroztuk, hogy a Vendeglo a Vilag Vegen alkalmazasunkat jelsz6bekeressel inditjuk. Az elso felmerlilo kerdes, hogy a JelszoForm es az ItalForm kozlil melyik lesz az alkalmazas foablaka. Bar sorrendben eloszor a JelszoForm fog megjelenni, es latsz6lag ez az ablak nyitja meg az ItalFormot, megis az alkalmazas lenyegi tevekenyseget nem a JelszoForm vegzi. Vagyis a f6 tevekenyseg az Itallap alkalmazasban van leirva, csak indulasa elott meg bekeri a jelsz6t. A jelsz6 bekerese egy ona1l6 tevekenyseg. J6l elklilOnitheto a rendelesektol es a szamlaadast6I. Ez a tevekenyseg el is hagyhat6 az alkalmazasb6l, esetleg mas alkalmazasokban is megjelenhet. Ez indokolja az omill6 dll-kent tOrteno megva16sitast. A dll teszteleset most kozvetlenlil az Itallap projektbOl vegezhetjlik. Olvassuk be az Itallap projektet a Visual Studioba!
288
8.1. Jelsz6bekero komponens keszitese
8. Gyakorlat. 2. abra A Solution Explorer egy projekttel Szeretnenk: a jelsz6bekero alkalmazas mar megfrt k6djat felhasznalni ebben az alkalmazasban is. Keszftsiink: belole egy dll-t mely a jelsz6 bekereseert felelos. Ez mar csak azert is elonyos, mert ha hasonl6 jogosultsagokkal mas alkalmazasnal is hasznalni szeretnenk: a jelsz6 bekereset, erre dll eseten lehetosegiink: lesz. Tobb alkalmazas is elerheti ugyanazt a dll-t.
8.1.1. Masodik project letrehozasa a solutionbe File New Project Project Types: Visual C# Projects Templates: Class Lybrary Name: Jelszo Add to Solution kivalasztva Folder Name: Ha az ot hasznal6 projekt alatt kfvanjuk tarolni, a Browse gomb segftsegevel megkereshetjiik a kfvant konyvtarat, ha ona1l6an, akkor a projektek konyvtargyiijtemenye megfelelo hely. Ha itt mar van Jelszo, akkor vagy mas nevet adunk:, vagy mas konyvtarba tessziik a projektet.
OK. Megkapjuk a Jelszo nevteret az iires Class! osztallyal. Ha most megnezziik a Solution Explorert, most mar ket project van az alkalmazasunkban.
8.1.2. A mar megirt osztaly felhasznalasa A Jelszo project egyenlore egy Class! nevil osztallyal rendelkezik. Mi szeretnenk: a lIllir megfrt jelsz6alkalmazasunk k6djat felhasznalni az uj project elkeszfteseben.
289
8. gyakorlat. Osztalykonyvhir keszitese Lehetosegtink van a mar megfrt forrasfajlt eredeti helyen csatolni a projecthez, de mar elore tudjuk, hogy meg szeretnenk valtoztatni a k6djat, igy jobb lehetoseg, ha a meglevo k6dot atmasoljuk az uj project konyvtaraba, es igy az eredeti valtozatlanul hagyasa mellett lehet m6dositani a fajlokat. Az intezovel masoljuk at a jelsz6alkalmazasunk konyvtarab61 a JelszoForm.cs fajlt az Elado konyvtar alatti Jelszo alkonyvtarba!
Solution Explorer Jelszo project, jobbeger Add Add Existing Item JelszoForm.cs Open A Class1.cs-t tOrOljtik ki a Jelszo projectbOl! KijelOles, Del gomb valasztas. Pr6baljuk meg a project ona1l6 forditasat! Solution Explorer Jelszo project, jobbeger Build Tobb hibatizenetet kapunk a Task List ablakban, melyek a Drawing es a Windows nevtereket hianyoljak, de a zar6jeles mondatban megmondjak a teendot is. Hianyzik ezek hivatkozasa a References koztil. C: \CS\Jelszo\JelszoForm.cs (2) : The type or namespace name 'Drawing' does not exist in the class or namespace 'System' (are you missing an assembly reference?)
Val6ban, ha a Solution Explorerben megnezztik az Itallap project hivatkozasait, ott szerepelnek a hivatkozasok, mig a Jelszo projectben nem. Javitsuk a hianyt! Solution Explorer Jelszo project, jobbeger Add Reference .NET ftil System.Drawing.dll
Select
System. Windows.Forms.dll
Select
OK.
290
8.1. Jelsz6bekero komponens keszitese
Pr6baljuk ujra a project felepiteset! Most mar sikeriilt. Nezziik meg a Jelszo alkonyvtar bin alkonyvtaraban elkesziilt a Jelszo.dll! Mivel dll ona1l6an nem futtathat6, csak valamilyen alkalmazasb61 tudjuk futas kozben tesztelni. Ez lesz az Itallap.exe. Most pr6baljuk meg tehat a Solution-t futtatni, azt latjuk, hogy az Itallap alkalmazasunk az eddigieknek megfelel6en fut, de ha megnezziik az Output ablakot, akkor latjuk, hogy mindket projektet felepitettiik. A jelsz6 ablakot meg nem hivtuk meg! Mikor szeretnenk meghivni? Miel6tt az ltalForm megjelenne. static void Main() {
Applicat on.Run(new ItalForm())
i
}
Utrehoztuk az objektumot, majd a Show met6dusaval kitettiik a kepemy6re. A fordit6 nem ismeri fel a JelszoForm-ot. Sziiksegiink van a using direktivara, hisz a JelszoForm osztaly a Jelszo nevterben tahilhat6. Irjuk tehat az ltalForm.cs fajl e1ejere a tObbi using moge: using Jelszoi
Ezen kiviil meg sziiksegiink 1esz ra, hogy a referenciak koze lelszo.dll-t!
IS
felvegyiik a
Solution Explorer ltallap project, jobbeger Add Reference Projects fiil Jelszo.dll
Select
OK. Forditas/Futtatas
Mindket ablak megjelenik es ona1l6an miikodik. A Jelszo bezarasa utan az Itallap meg fut, az Itallap bezarja a Jelszot is. Ribas felhaszna16nev eseten tovlibb var, de harom hibas jelsz6 megadasa utan (2 masodperccel) vege az alkalmazasunknak.
291
8. gyakorlat. Oszhilykonyvhir keszitese
8.1.3. Jelsz6bekeres parbeszedablakb61 A gond csak az, hogy azonnal megjelenik mindket ablak, tehat az Itallap alkalmazas a jelsz6 megadasa nelkiil is hasznalhat6. Nyissuk meg modalisan a jelsz6bekero ablakunkat, akkor nem lehet a masik ablakkal kommunikalni. Ha parbeszedablakkent szeretnenk megnyitni, akkor azt a Show helyett a ShowDialog met6dussal tehetjiik.
~
Forditas/Futtatas
Ekkor val6ban elobb a jelsz6bekero ablak jelenik meg, s csak annak bezarasa utan indul az alkalmazas. Az ItalFormot a jelsz6 helyes megadasat61 fiiggoen szeretnenk inditani. A Formnak van egy DialogResult tulajdonsaga, mely kilepeskor lekerdezheto. Tehat ket tennival6nk van. Ezt a visszateresi erteket produkalni a 'Jelszo' projectben, es lekerdezni az 'Itallap' projektben. ltaIForm.cs: static void Main() {
II Megkeresi a user indexet. int i = Oi while ((i
if (i
label.Refresh(); II Frissitesre kenyszeriti a vezer16t. System.Threading.Thread.Sleep(2000); II Var. lication.Exit
}
}
!
Forditas/Futtatas/Teszteles
Vizsgaljuk meg, mi tOrtenik, ha egyszeriien kilepiink a jelsz6beker6 ablakb61, ha hibas a felhasznal6nev, ha hibas a jelsz6 egyszer, ketszer, haromszor; es mi tOrte:pik, ha j6 a felhasznal6nev es a jelsz6 is. Lathat6an a Jelszo projeetben nines sztikseg a Main met6dusra, kisse zavar6 is, hisz nem hiv6dik meg. Amig alkalmazas volt a Jelszo, addig ez kellett az inditashoz. Egy dll-nel nines ra sztikseg. Tehat tegytik megjegyzesjelek moge, vagy egyszeriien toroljtik ki a forrask6db61. / I I < s LLTTllnary > 1// The main entry point for the application.
III II II II II II
[STAThread] static void Main()
{ Application.Run(new JelszoForm());
}
8.1.4. M6dositsuk a jelsz6bekero ablak feliiletet! Ha a JelszoFormot design m6dban is latni akarjuk, akkor a JelszoForm.resx fajlra is sztikseg lesz. A Solution View / JelszoForm.es / jobbeger / View Designer hatasara kinyilik a Design View. Csak ket felhasznal6nk legyen: Vasarl6 es Elad6. Ezek koztil egy combo boxb61 szeretnenk valasztani. A vasarl6nak nem kell jelsz6 (ne is kerjtink), elad6 eseten 1gen. TorOljtik a userBox new TextBoxunkat, es tegytink a helyere egy szinten userBox new ComboBox vezerl6t!
293
8. gyakorlat. Osztalykonyvtar keszitese Properties Items hiirompontos gomb Vasarl6 Elad6 Text VasarI6 TablndexO Kezdetben, amikor a VasarI6 van beallftva, ne kerjiink jelsz6t! Tiltsuk Ie a jeIszo mezot! jelszoBox Properties Enabled False Ha masik felhasznaI6nevet valasztunk, akkor jelsz6t kell kemiink. userBox Properties Events SelectedlndexChanged
M6dosftsuk a k6dot: numOfusers=IIIIS; user = new string [numOfUsers] { Anna " , "Pali", "J6zsi jelszo = new string [numOfUsers] { "Anna " , "Palin, "J6zsi","Mari","Kati"};
III " III
294
8.1. Jelsz6bekero komponens keszitese
~
Forditas/Futtatas/Teszteles
8.1.5. Sziiksegiink van a JelszoForm adataira az ltalForm tagfiiggvenyeiben! Mivel a JelszoForm objektum a Main lokalis vaitoz6ja, a tObbi met6dusb61 nem erhetjiik el. Vagy az egesz jFrm objektumot az ItalForm adattagjava kell tenniink, de kisebb helyet foglal, igy hatekonyabb megoldas, ha csak egy user new tagvaltoz6t vesziink fel az ItalFormban is.
Class View ltalForm jobbeger Add Add Field Field access: private Field type: string Field name: user Field modifiers: Static Finish Erteket a Main met6dusban kell beallitanunk, ahol meg latjuk a jFrm lokalis valtoz6t! Mivel a Mainben allitjuk be, es a Main statikus, teMt az adattagnak is statikusnak kelliennie. private static string user; static void Main() {
JelszoForm jFrm = new JelszoForm(); if (jFrm.ShowDialog()==DialogResult.OK)
•
Application.Run(new ItalForm());
}
Ez lenne a megoldas, de a userBox a JelszoForm privru: tagja, igy nem erheto el mas osztalyb61. Az elnevezesi konvenci6k ajaniasa szerint ilyenkor a tagvaltoz6 nyilvanossa tetele helyett egy public tulajdonsagot szokas kesziteni. Az objektumorientalt programozas egysegbezaras elve is ezt ajanlja.
295
8. gyakorlat. Osztalykonyvtar keszitese
Nekiink itt is folOsleges az egesz usrBox vezerl6hOz tulajdonsagot rendelni, hisz mindig a kivalasztott felhaszmH6ra vagyunk kivancsiak. Ne engedjuk a jelszoForm osztalyon kiviilr61 frni a felhasznal6t! Ezzel biztosftjuk a jelsz6bekerest. Tehat csak get tulajdonsag legyen! Class View JelszoForm jobbeger Add Add Property Property access: public Property type: string Property name: CurrentUser get Finish public string CurrentUser {
get {
return } }
Ezutan az ltalForm Main k6dja a kovetkez6re m6dosul: static void Main() {
JelszoForm jFrm = new JelszoForm(); if (jFrm.ShowDialog()==DialogResult.OK) {
Az ItalForm betOltesekor elad6 eseten engedelyezzuk az arak m6dosftasat,
egyebkent ne! Az ItalForm Load met6dusat (a formon duplan kattintva) m6dosftsuk a user adattag mez6jebOi kiolvasva a felhasznal6t! Alapertelmezesben az italok arat a tulajdonsaglapon allftsuk Enabled False-ra!
Azt meg erzekeljiik, hogy van egy kis 'szepseghibaja' a dll-nek, csak a bevesett Vasarl6 es Elad6 felhaszmU6k bevesett jelszavat tudja hasznalni. A kesobbiekben ezt meg javitjuk.
8.2. Feladatok 1. Keszitstik el az ltalForm alkalmazast ugy, hogy a program futasa soran biirmikor m6dosithassuk a felhasznaI6t! Keszitstink az ItalForm feltiletere egy 'Felhasznal6' feliram gombot, melynek valasztasa ezt a m6dosftast lehetove teszi!
2. Keszitstink egy parkereso programot! Az ablakban ket comboBox nok es ferfiak listajat tartalmazza. Mindket listaban legyen aktualis elem! Egy + feliratu gomb segitsegevel parokat hozhatunk letre az aktualis elemekbol. Egy listadoboz tartalmazza a mar letrejott parokat. Megval6sitasfuggo, hogy a parba bekertilo szemelyt tOrOljtik-e a combo listajab61. A parok listajab6l lehessen torolni! Legyen lehetoseg uj jelentkezok felvetelere, egy 'Uj jelentkezo' gomb hatasara nyfljon meg egy parbeszedablak, ahol felvehetjtik a jelentkezo adatait! Az uj jelentkezo kertiljon a megfelelo combo listajara! Legyen az uj jelentkezo ablak egy ona1l6 dll-ben megval6sitva! 3. Egy ablakban mutassuk meg egy raktar arukeszletet! Egy listadoboz mutassa a keszletelem lefrasat (nev, ar, db)! A listab6llehessen tOrolni, es lehessen amt beszallitani egy uj ablak segftsegevel, melyben megadjuk az aru nevet (esetleg comboBoxb6l valasztva), arat es darabszamat. A felvesz gomb beteszi az arut a szallitott .listaba. Az ablak bezarasa utan a beszallftott aru novelje a raktarkeszletet! Legyen a felvitel ablak egy ona1l6 dll!
297
8. gyakorlat. Oszhilykonyvhir keszitese 4. Az Elado alkalmazasban barki atfrhatja az aruk arat. Ehhez csak az elad6knak legyen joguk! 5. Arengedmeny a torzsvasarloknak. Az Elado alkalmazasunkban adjUnk: arengedmenyt a tOrzsvasarl6knak es az elad6knak! Ez a vasar16t csabft6 fogas csak akkor eri el hatasat, ha a vasar16 latja is az arengedmenyt. * A feladatok csoportmunkaval is megoldhat6k! PI. a raktarkeszlet feladatot ket szemely keszfti. Eloszor a ket ablak feliiletet keszftik el az elnevezesekkel, es azuj aruknal egy konstans listavai. Ezutan a dll beszerkesztheto a foablakhoz, es a feltoItes miivelet megva16sfthat6. A beszallft6 dll onall6an fej1esztheto tovabb , elkesziiltevel csak ki kell cserelntink a regi dllt.
8.3. Megoldasotietek 5. Arengedmeny a torzsvasarloknak Ez harom felhaszna16t jelent, Vasarl6, Elad6 es Torzsvasar16. Tegytink a kedvezmenyes aruk ara melle ket szovegmezot, melyek az engedmeny merteket es a kedvezmenyes arat tartalmazzak. Adjunk 20% arengedmenyt a p616kra, 15%-ot a cipokre es 30%-ot a taskakra. A vezerloket a legegyszeriibben az eroforras-szerkesztovel hozhatjuk letre, majd lathatatlanra allftva oket, csak akkor jelenjenek meg, ha a megfelelo felhaszna16 hasznalja a programot. [[JL§J~
Text KijelOlve az osszes kedvezmenymez6t, ForeColor: 192;0;0, Font: Felkover, 10. meret tulajdonsagokat aIlftsuk be! Es minden vezerl6 legyen lathatatlan! Majd a feltOltes soran deriil ki, melyiket tegyiik lathat6va. private void EladoForm_Load(object sender, System.EventArgs e) if (user == "Elad6") {
Termeszetesen a fIzetend6t is ebbOl az arMl kell szamolnunk! Megval6sfthatjuk szarmaztatott Form segftsegeyel is. Elad6 felhasznal6 eseten az eredeti, mig kedvezmenyes vasarl6k eseten az ut6d form tOlt6dik be.
299
9. Gyakorlat. Vezerlo keszitese 9.1. Digitalis idokijelzo vezerlo keszitese 9.1.1. A felhaszmiloi interfesz elkeszitese Keszftstink egy digitalis idot kijelzo vezerlot, mely az indftast61 eltelt ido meres ere es kijelzesere alkalmas. Ezt a vezerlot tObb alkalmazasban szeretnenk felhasznalni. Fajl New Project Project Types: Visual C# Projects Templates: Windows Control Library Name: Ora Close Solution
OK Nevezztik at a keszen kapott UserControll new osztalyunkat, a forrasfajlt, a konstruktort es az osztalyhoz tartoz6 megjegyzessort OraControlra!
301
9. gyakorlat. Vezerlo keszitese A vezerlo tartalmazzon egy idokijelzo szovegmezot, egy indft6 es egy megaIlit6 gombot!
9. Gyakorlat. 1. abra A digitalis stopper a szerkesztoben
00:00:00 startButton
True
Highlight Text
Felkover, 10. meret
Center
Start
A TextBox TabIndex tulajdonsagat aIlitsuk I-re, hogy megjeleneskor ne legyen kiemelve a szovege! A felhaszna16 ne m6dosfthassa erteket ( Read Only), de ne legyen sziirke a hattere (BackColor)! Huzzunk be a ToolBoxb6l, a Windows Forms listar6l (ne a Components listar6l) egy Timer komponenst! A timer nem keriil a vezerlo feliiletere, hisz nem egy lathat6 elem, a tervezonezet aljan egy erre kialakftott savban keriil bemutatasra. Neve (Name) legyen timer! Mivel az idozfto a Tick iizenet kiildesenek intervallumat ezredmasodpercekben meri, ahhoz hogy masodpercenkent kapjunk iizenetet, Interval tulajdonsagat allftsuk 1000-re!
9.1.2. A funkci6k megval6sitasa A vezerlo hattereben celszerii az idot egy DateTime tfpusu (time), vaItoz6ban tarolni, mert ebbOl kenyelmesen olvashatjuk ki az ido erteket, nem kell a perc, 6ra atvaItasokkal foglalkozni. A time erteket masodpercenkent noveljiik! A time ertekebol frhatjuk ki a kepemyore formazva a megjelenfteni kfvant idot. Az idozfto feladata e szam automatikus novelese lesz.
Egy vezerlot nem Iehet magaban futtatni, de a forditasi es szerkesztesi hibakat megkaphatjuk. 303
9. gyakorlat. Vezerlo keszitese Solution Explorer Ora project
jobbeger
Build
Indftsuk es allftsuk meg az idozftot! A ket gomb Click esemenyenek kezeloje legyen a kovetkezo: private void StartButton_Click(object sender, System.EventArgs e) {
9.1.3. A tesztelesehez keszitsiink egy alkalmazast, mely hasznalja ezt a vezerlot! File New Project Project Types: Visual C# Projects Templates: Windows Application Name: OraTeszt Add to Solution
OK A tesztalkalmazasunk legyen a kezdo alkalmazas! (Itt keresse a Maint.) Solution Explorer OraTeszt project
jobbeger
Set as Startup Project
A ToolBox eszkozsorban a UserControls vegen ott az Ora nevil eszkozgomb, amit drag&drop technikaval a Forrnra hUzhatunk. Ha megnezzUk a Solution Explorert, azt latjuk, hogy Egy Ora hivatkozas keriilt be az OraTeszt project References listajiba. 304
9.1.4. Irjunk az ora vezerlohoz indito es megallito metodust! Ezeket a met6dusokat kfvtilrol, a vezerlot hasznaI6 programb6I is el akarjuk emi, fgy public hithat6sagUra allftjuk oket! Class View OraControl Add Add Method Method access public Return type void Method name Start Comment Inditja a stoppert Finish / / / <surmnary> //1 Inditja a stoppert 11/ public void Start() {
timer.Start()i }
IsmeteIjiik a Stop met6dussal! A StartButton_Click es a StopButton_Click privat met6dusokb61 ezeket a ruggvenyeket hfvjuk meg! Vagyis timer.StartO helyett StartO szerepeIjen!
9.1.5. A vezerlohoz tulajdonsag keszitese Azt tapasztaijuk, hogy a stopper nem kezdi ujra a szamlalast ujrainditaskor. Ez a funkci6 feladatruggo. Van amikor epp tovabbszamoini akarunk, van amikor mindig ujrakezdeni. J6 Ienne, ha lenne egy olyan tuIajdonsaga a vezerlonek, amivel beallfthatnank ezt a funkci6t! Egy tulajdonsag az osztaIyban tarolt adatokon dolgozik. Vagy mar megievo adattagokat IT, olvas, vagy ujakat. Az ujrainmtashoz nekiink egy Iogikai vaItoz6ra van sziiksegiink.
305
9. gyakorlat. Vezerlo keszitese Class View OraControl
jobbeger
Add Add Field Field access private Field type bool Field name restart Finish Class View OraControl
jobbeger
Add Add Property Property access public Property type bool Property name Restart Finish private bool restart = true; public bool Restart {
get {
return restart; }
set {
restart =.value; } }
Forditas/Futtatas/Teszteles A Start gomb leiitesekor, ha igaz a Restart, akkor kezdje ujra a szamlalast, egyebkent net
306
9.1. Digitalis idokijelzo vezerlo keszitese public void Start() {
timer.Start(); }
Forditas/Futtatas/Teszteles
Allitsuk a Properties ablakban False-ra a Restart tulajdonsagot, ugy is teszteljtik az alkalmazast! A tulajdonsag termeszetesen futasidoben is mooosithat6.
9.1.6. Legyen tulajdonsag!
az ora
kezdoertt~kenek
bealHhisat
lehetOve
tevo
Mivel kesobb a felhasznaIas soran lehetove akarjuk tenni a mutatott ido beallitasat, ezert hozzunk letre a time adattaghoz egy public eleresii irhat6, olvashat6 tulajdonsagot! Class View OraControl Add Add Propety Property access public Property type DateTime Property name Time Finish public DateTime Time {
A tulajdonsag termeszetesen nem jelenik meg az els6 fordftasig a Fonnl vezerl6jenek tulajdonsaglapjan!
!
Forditas/Futtatas/Teszteles
Ha azt akarjuk, hogy az ujraindftaskor a tulajdonsagban beallftott kezdoertekrol induljon a stopper, akkor ezt az erteket tarolnunk kell egy tagvaltoz6ban, melyet kfvi.ilrol, a stoppert hasznal6nak is celszerii elernie. Tehat hozzunk letre egy startTime tagvaltoz6t, es kapcsoljunk hozza egy StartTime tulajdonsagot is! Class View OraControl
jobbeger
Add Add Field Field access private Field type DateTime Field name startTime Finish Class View OraControl Add Add Propety Property access public. Property type DateTime Property name StartTime Finish private DateTime startTimei public OraControl() {
//This call is required by the Windows.Forms Form Designer.
InitializeComponent()i II TODO: Add any initialization after the InitForm call time = new DateTime(O)i }
308
9.1. Digitalis idokijelzo vezerlo keszitese public DateTime StartTime {
get {
return startTime; }
set {
startTime
= value;
} }
public void Start() {
Mivel itt a Time tulajdonsagnak adtunk erteket, ez a set met6dusanak hfvasat jelenti, a set pedig beallftja a timeBox szoveget is. Ha a time adattag kapta volna az erteket, akkor csak egy masodperc mulva jelenik meg a keperny6n az ujraindftaskor kapott ertek.
~
Forditas/Futtatas/Teszteles
A teszteleshez termeszetesen be kell allftanunk a tulajdonsagok erteket. Ezt a Forml(Design) nezeteben az oraControll tulajdonsagablakaban tehetjiik. Ha csak az id6 erteket gepeljiik be (3:11:5), akkor az aktualis datumot automatikusan ele teszi. J6l lathat6 a futaskor, a vezerl6 kezdetben a Time tulajdonsagban beallitott id6t mutatja, de indftaskor Restart true eseten a StartTime tulajdonsagban beallftott ertekr6l indul, egyebkent a Time tulajdonsagban beallftott ertekr61. Termeszetesen futas kozben a Time ertekenek m6dosftasa azonnal jelentkezik.
,
• Ha a vezerl6nk k6djanak m6dosftasakor olyan hihat vetiink, amit a felhaszna16 alkalmazas fordft6ja nem tud ertelmezni, a fordft6 kitorolheti a #region Windows Form Designer generated code blokkb6l a ra vonatkoz6 sorokat, es fgy eltiinik vezerl6nk a szerkesztOfeliiletr61. E nem tul szimpatikus megoldas indoka a fejleszt6 hibakeresesenek egyszeriisftese lehet. Ha elolvassuk a blokk kezd6 megjegyzeset lathatjuk, hogy ezt a k6dreszt a Visual Studio generalja es m6dositja. I
I
309
9. gyakorlat. Vezerlo keszitese / !! <su:mlTlary> !!! Required method for Designer support - do not modify I!! the contents of this method with the code editor. I i i
A vezerlo kodjanak javitasa utan az ot hasznalo alkalmazasban a Visszavonas eszk6zgomb segitsegevel allithatjuk vissza az eredeti, most mar hibatlan allapotot. Hasonlo jelenseg lephet fel, ha a Sign alkalmazasunk InkPanel vezerlojet olyan gepen kivanjuk forditani, melyre nines telepitve a Tablet PC Platform SDK.
9.2. Feladatok 1. StartVisible, StopVisible tulajdonsag a Behavior kategoriaban. Keszitsiink az ora vezerlonkh6z olyan tulajdonsagot, mely megadja, latszik e a vezerlon a Start es a Stop gomb! A tulajdonsag az Behavior kategoriaban jelenjen meg! * 2. Keszitsiink ebreszt06ra formaju ablakban egy digitalis ebreszt06rat! Az ora ketyegjep is! 3. A Stop gomb ketszeri megnyomasara a stopper nullazza ki a kezdoerteket, vagy allitsa be a StartTime tulajdonsagban megadott ertekre! 4.
Visszaszamlalas. Keszitsiink az ora vezerlonkh6z egy tulajdonsagot, mely megadja, hogy az ora a beallitott kezdoertektol visszafele vagy elore szamole! Visszaszamolasnal a null ertek eleresekor megall es hangjelzest ad. *
5. Az ora vezerlonknek legyen oraformaj6 ikonja!* 6. Keszitsiink a sakkjatszmaknal szokasos, a hatralevo jatekido kijelzesere alkalmas programot! Az oravezerlok miikOdtessenek egy-egy folyamatkijelzot is, mely mutatja a jatekido vegenek k6zeledtet! A jatekot lehessen ujrainditani! Ha elfogy a jatekos ideje, akkor a partner nyert. 7.
Keszitsiink olyan vezerlot, melyre egerrel vagy aktiv tollal ifni lehet!
8. Az amoba alkalmazasunkat bOvitsiik ki hanggal!* 9. Keszitsiink alkalmazast, mely bemutatja tevekenysegiinket! A bemutato tartalmazzon az alkalmazasba beepitett ablakban levetitett videofilmeket, hanganyagokat! 10. Honlapok az alkalmazas ablakaban. Nyissunk alkalmazasunkban egy ablakot, mely vezerloink allapotatol fiiggoen kii16nbOzo honlapokat mutat be!*
310
93. Megoldasotletek 11. Keszftsiik el a szavazatszamllil6 gombot vezerl6kent! Lehessen beallftani a maxertek es a sotetedik / vilagosodik tulajdonsagat! 12. Keszftsiink a penznemet kifr6, csak szamot, +,- jelet elfogad6 vezerl6t, mely a negatfv szamokat pirossal frja ki, es ezres bontasban sz6kozt tesz a szamjegyek koze!
get { return startButton.Visible;} set { startButton.Visible = value;} }
Ha azt akarjuk, hogy a lathatatlan gombok helye ne legyen fonntartva a felhasznaIas soran, az OraControl vezerl6nk TextBox vezerlojenek Anchor tulajdonsagat allftsuk Bottom, Left-re! Ekkor a ket gomb lathat6sagat kikapcsolva a vezerlo merete a kijelzo meretere csokkentheto. Termeszetesen ilyen esetben a programb6l kell a Start es Stop met6dusok segftsegevel vezerelni az 6rat.
4. Visszaszamlalas I I I <sUJ1rrnary> II/ no==true eseten az ide erteke rnasodpercenkent II/
5. Az ora vezerlonknek legyen oraformaju ikonja! Eloszor hozzunk letre egy 16x16 keppontos - ez a szokasos ikonmeret bitmapet! File / New /File / Bitmap file / Open. A generalt kep 49x49-es, a jobb also sarkat megfogva nyomjuk ossze 16x16 keppontosra! A Visual Studio statuszsora mutatja a jobb als6 kepkocka sor es oszlopindexet. A bitmap ugy lesz 16xr6-os, ha az osszenyomaskor 17x17-et mutat a kiilso keret, vagy ha a bitmap jobb als6 kockajara 15x15-ot fr ki a statuszsor. Mentesnel a konyvtarban a fajl neve alatt 16x16 Bitkep legyen kifrva! Ezutan a rajzeszkozokkel szerkeszthetjiik.
9. Gyakorlat. 2. abra Az 6ra vezerlo ikonja a szerkesztoben Termeszetesen a kellekek Paint alkalmazasaval is keszfthetiink 16x16 keppontos bitmapet. Solution Explorer / Add / Add Existing Item / Files of type: Image files / Ora.bmp / Open. Solution Explorer / Ora.bmp aktiv / Properties fiiI / Build Action tulajdonsag / Embedded Resource rf~9~;~j:)§:~~!~f.~P~f.f.;'~j:)~f.~d<;f.¥i?~~~:<~;'€+§9~f.~~~:~"i;~115,~~:~fj:)~l?"11"f;i{~21 public class OraControl :System.Windows.Forms.UserControl
312
9.3. Megoldasotletek
OraTeszt / Forml [Design] / Toolbox / My User Controls jobbeger / Add/Remove Items / Browse / Ora.dll / OK A fornisk6db6l tOr6lt fajlok a resource allomanyb61 nem tOrlodnek, ezert pI. egy korabban felvett erOforras tOrlesehez sztikseg lehet a resx allomany tOrlesere. A k6vetkezo felepfteskor ujra letrej6n az allomany. A resource allom;inyba beeptilest ellenorizhetjtik, ha atmasoljuk valahova Ora.bmp allomanyunkat, majd tOr61jtik a projektMI. A fordftas mindaddig sikertil, mig nem tOr6lttik resource allomanyunkat. (Ilyenkor k6z6s solution eseten ervenytelenne valhat az automatikusan felvett ikon, de az Ora.dll ujrafelepftese utan ez is megsziinik.) Ha a resource allomanyt tOr61jtik, annak feIepftesehez sztikseg lesz ujra az Ora.bmp allomanyra. 8. Az amoba a1kalmazasunkat bovitsiik ki hanggal! Tegytink a Toolbox-ra egy Windows Media Player vezerlot! Huzzuk be az AmobaForm feltiletere, es kapja az axMediaPlayer nevet! Visible tulajdonsaga legyen False! A kivant hangfajlokat rnroljuk privat string tfpusu mezokben! public AmobaForm() {
Ha teszteljiik, a hangok megszolalnak, de a Controls tombben indexelesi hiMt kapunk. A O. indexii elemmel van baj. Amikor a medialejatszotfelvettiik aformra, ez az eszkoz lett a O. indexii, mert.az utoljarafelvett lesz mindig az. Ez okozza a hiMt. Modositsuk a medialejatszo indexet! public AmobaForm() {
= "C: \ \WINDOWS\ \Media \ \ tada. wav" ;
10. Honlapok az alkalmazas ablakaban Valasszuk ki a Toolboxba a Microsoft webbongeszot a Costumize Toolbox ablak COM Components listajab6l! private void addressComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
9. Gyakorlat. 3. abra HonlapbOngeszo az alkalmazasban
314
0,
O)i
10. Gyakorlat. Adatbazis-eleres A Jelsz6 alkalmazas azonosft6it es jelszavait taroljuk adatbazisban! Minden, a jelsz6 komponenst hasznal6 alkalmazas mas es mas adatbazisfajlon dolgozik, fgy lehetoseg nyflik kiilOnbozo jogosultsagok meghatarozasara. Ez az adatbazis termeszetesen nagyon egyszerii, de a cel nem az adatbazis-kezeles megismerese, hanem az adatokhoz tOrtenohozzaferes bemutatasa. Ha van a gepiinkre Microsoft SQL Server telepftve, azt is hasznalhatjuk, de ilyen kis mennyisegii adat tarolasara Access adatbazis is bOsegesen megfelelo. Az adatokat egyszeriien fajlba is menthetnenk - arnint azt az 5. gyakorlat 12. feladatanal tettiik-, de rni most az adatbazis-elerest kfvanjuk bemutatni. A feladat megoldasahoz a gepre telepftett SQL Serverre vagy Access adatbaziskezelore van sziikseg.
10.1. Az adatbazis letrehozasa 10.1.1. SQL Server adatbazis letrehozasa Indftsuk el a Visual Studiot! Nem kell projektet letrehoznunk, hogy az adatbazison dolgozni tudjunk! Server Explorer Servers 315
10. gyakorlat.
Adatbazis-eH~res
Sajat szerver megnyitasa SQL Servers Sajat SQL Server jobbeger New Database New Databse Name: pw
OK Jelsz6 eseten nem erdemes ilyen nyilvanval6 adatbazisnevet adnunk, de most erthetosegre tOrekszlink. A pw adatbazist kinyitva a Server Explorerben valasszuk a Tables foldert! A gyorsmenli New Table parancsaval tablakat hozhatunk letre. <,
x
c""""" Description Default Value
OK
I
(,,,,oJ
10. Gyakorlat. 1. abra A Users tabla mezoi A usecID nvarchar tipusa max 20 karakter hosszu, de valtoz6 hosszusagu. adatbevitelt tesz lehetove. Engedi a nernzeti karakterek hasznalatat, igy a karaktereket 2 byte helyen tarolja. Az abra tetejen lathat6 Table eszk6zsor kules ikonjat a kijelOlt mezo(k)hOz
valasztva azok a tabla ku1csmezoi, vagyis egyedi azonosit6i lesznek. A mentes ikon valasztasara nevet adhatunk a tablanak. A neven duplan kattintva kitOlthetjlik, ertekeit megnezhetjlik, m6dosithatjuk. Elad6
ea
tv
10. Gyakorlat. 2. abra A Users tabla mezoinek felt6ltese 316
10.1. Az adatbazis letrehozasa A ceruza az elso oszlopban a tarolt adatbazishoz kepest a m6dosftast jelzi. Az adatok mentese a sorr61 torteno lelepeskor val6sul meg. Ekkor eltiinik a ceruza.
10.1.2. Access adatbazis letrehozasa Az Access segitsegevel tOrtenik.
Access
Ures adatbazis Hely: Megadjuk a tarolcis helyet. Fajlnev: pwd.mdb Letrehozas Tabla letrehozasa tervezo nezetben Egy, az elozohOz nagyon hasonl6 ablakot kapunk, melyben letrehozhatjuk a tabla mezoit. A usecID 20 mezomeretii szoveg, pwd 10 hosszu szoveg. A k:u1csmezot itt is a k:u1cs ikonnal allithatjuk be. A tabla neve menteskor legyen Users! Access Nezet menii Adatlap nezet Kezdodhet a mezok feltOltese. Itt is ceruza jelzi a m6dositott es nem mentett sort, es a sorr61lelepve tOrtenik a mentes az adatbazisba. Ne to!tstik fO! teljesen adatokkal! Visual Studio Server Explorer Data Connections jobbeger Add Connection Szolgaltato fiil Microsoft Jet 4.0 OLE DB Provider Tovabb Jeloljon ki, vagy adjon meg egy adatbazisnevet: pw.mdb Kapcsolat tesztelese, A kapcsolat vizsgaIata sikeres. OK
317
10. gyakoriat. Adatblizis-eieres Az adatbazist megnyitva, adatai az SQL szerverhez hasonl6an szerkeszthetok. ~
10. Gyakorlat. 3. abra A pw.mdb Users rnblaja a Server Explorerben Az adatokkal tOrteno feltoItest folytassuk!
10.2. Az adatbazis adatainak megjelenitese az alkalmazasban Vegyiik elo Jelsz6 komponenslinket! De ujra is frhatjuk, mert szinte a teljes k6d megvaltozik.
10.2.1. Az adatbazis-adatok hozzafereset tamogat6 objektumok Huzzuk pw adatbazisunk Users tablajat a Jelsz6Form felliletere [Design]! Mivel az adatbazis-kapcsolat es az adapter is lathatatlan komponensek, ezert az ablakhoz tartoz6 als6 osztott savba kerlilnek. Ha az SQL adatbazis tablajan dolgozunk, sqlConnection1 es sqlDataAdapterl az objektumok neve. Ha az Access adatbazison, oleDbConnection1 es oleDbDataAdapterl. Nevezzlik at jelszoConnection es jelszoAdapterre! Mivel mi most csak olvasni akarunk adatokat, nezzlik meg a jelszoAdapter tulajdonsagablakaban a SelectCommand CommandText erteket! Ez egy SQL lekerdezes, mely a Users tabla mindket mezojet visszaadja. jeiszoAdapter jobbeger Preview Data Fill Dataset
Hatasara a megjeleno ablakban megnezhetjlik az adapter altaI lekerdezett adatokat. Ha ezeket egy Dataset objektumban tarolni akarjuk: jeiszoAdapter jobbeger Generate Dataset
318
10.2. Az adatbazis adatainak megjelenitese az alkalmazasban New: JelszoSet
OK A Users tabla ki volt jelOlve. A generalt JelszoSet osztaly ezt a tablat tartalmazza. Nezziik meg a Class View ablakban a Jelszo nevteret! A JelszoForm osztaly melle elkesziilt a JelszoSet osztaly. Az osztaly objektuma a JelszoForm.cs [Design] ablak als6 savjaban megjeleno jelszoSetl objektum. A mentes utan a JelszoForm osztalyban,megisjelenik a privat lathat6sagn jelszoSetl. Mivel a lathat6saga privat, mas assemblyk nem fognak hozzaferni. A mi projektiink C# nyelvii. A C# case-sensitive, fgy megtehetjiik, hogy osztaly es objektuma csak a kis es nagy kezdobetiiben ter el. Vagyis nevezhetjiik objektumunkat a Properties Name tulajdonsagat atfrva jelszoSet-nek!
Kattintsunk duplan a Class View JelszoForm osztaly jelszoSet adattagjan! Az adattag deklaraci6jara ugrik a kurzor a forrask6dban: private Jelszo.JelszoSet jelszoSeti
Kiilonbozo DataSetek eseten a sqlDelete-, sqIInsert-, sqlSelect-, sqIUpdateCommandl objektumoknak is beszedesebb nevet kellene adnunk.
10.2.2. A jelszoSet es a userBox feltoltese adatokkal A kezdoertekadas a konstruktor feladata. Az SQLDataAdapter Fill met6dusa a beaIlftott lekerdezesnek megfeleloen tOlti fol a jelszoSet objektumot. A feltoltott jelszoSet-hOI soronkent kiolvashat6ak az ertekek. Ahhoz, hogy csak az adatbazis ertekei legyenek a userBoxban, a Properties ablak Items tulajdonsaganak gyiijtemenyet ki kell tOrOlniink. public JelszoForm() {
InitializeComponent()i
}
A userBox a tulajdonsaglap DataSource es DisplayMember tulajdonsaganak beallftasaval is feltOltheto lett volna. Lasd elmelet.
Forditas/Futtatas/Teszteles
319
10. gyakorlat. Adatbazis-eleres
Mivel altahinos megoldast kivanunk keszfteni, nem t6lthetjuk ki el6re a userBox szoveget, mert lehet, hogy nines is Vasarl6 a felhasznal6k kozott. TeMt a Text tulajdonsagat is tOrOljuk, es a jelszoBox legyen engedelyezve (Enabled: True)! fgy teMt a felhasznal6 kenytelen felhasznaI6 nevet valasztani a listaMl. Ha a kivalasztott index jelszava ures, ne kerjunk jelsz6t! Egyebkent igen! private void userBox_SelectedlndexChanged(object sender, System.EventArgs e) {
10.2.3. A jelszo bekerese, ellenorzese Ha a Vasarl6t valasztjuk a listaMI, a program kezeletlen, kivetel hibaval leaH. Val6ban a jelsz6nak nines erteke, nem ures sztring az erteke, amire rakerdeztilnk. Kapjuk el a kivetelt, es aHftsuk ures sztringre a pwd erteket! A problemat megoldhattuk volna ugy is, hogy az adatbazisban ures sztring alapertelmezett erteket adunk a jelsz6 mez6nek, de ezt nem varhatjuk el az osszes felhasznal6t6l! private void userBox_SelectedlndexChanged(object sender, System.EventArgs e) {
if (jelszoSet.Users[userBox.Selectedlndex] .pwd jelszoBox.Enabled = false; else 'elszoBox.Enabled
}
320
nn)
10.3. KiilonbozO adatbazisok elerese
A pwd mezo erteket a jelszoSet-ben iires sztringre allitottuk, de nem mentettiik az adatbazisba. Az adatbazist megnezhetjiik a Server Explorerben. fgy a program futasa alatt nem dob tObbet kivetelt az ertek vizsgalata (ellenorButton_Click), mikozben nem nyliltunk az esetlegesen mas program altaI is hasznalt adatbazishoz. Allitsuk a userBox DropDownStyle tulajdonsagat DropDownList-re! A beallitassal azt ertiik el, hogy a beviteli mezobe csak a listan szereplo ertek viheto be, de ahhoz eleg annyi karaktert leiitniink, amennyi egyertelmiien azonositja. A mi esetiinkben minden felhasznaI6 neve mas-mas betiivel kezdOdik, igy eleg egyetlen betiit leiitniink a valasztashoz. A listaelem kivalasztasaval a fenti fiiggveny is meghiv6dik, hisz valtozott az index. Most mar koncentraIhatunk a jelsz6 ellenorzesere. private void ellenorButton_Click(object sender, System.EventArgs e)
if (helyesJelszo) this.DialogResult = DialogResult.OKi else if (missed ==3) this.DialogResult = DialogResult.Canceli else label.Text = "Hib~s jelsz6!"i }
10.3. Kiilonbozo adatbazisok elerese A problema mar csak az, hogy az adatelerest tamogat6 adatbazis a tabla behUzasakor beegetodott a programba. Ahhoz, hogy a J elszo komponens kiilonbozo adatbazisokon hasznalhat6 legyen, az adatbazis megadasat kiviilrol is lehetove kell tenniink. Mivel tipusos DtaSettel dolgozunk, a kiilOnbozo adatbazisok szerkezetenek meg kell egyeznie. Ennek leirasat mellekelni kell a komponenshez. A mi esetiinkben csak Microsoft SQL Server adatbazis lehet, mert az objektumaink SqlConnection, SqIAd§lpter, SqlCommand tipusuak. A tabla neve kotelezoen Users, es a mezok 321
10. gyakorlat. Adatbazis-eleres
neve es tipusa is meg kell egyezzen a pw adatbaziseval. U gyanis a Ietrehozott, es a k6dban szerepI6 JelszoSet osztlily ilyen adatokon dolgozik. Azonban az adatbazis neve es az SQL Server amin fut - m:is es mas Iehet. fgy a ktiionboz6 feIhasznaI6k Ietrehozhatjak a sajat adatblizisukat, vagy egy gepen a ktiionboz6 programok ktilOnbOz6 adatbazisokon dolgozhatnak. A csatIakozas beallitasara meg a jelszoSet feltoltese eI6tt sztikseges. Ez pedig a konstruktorban tOrtenik. Ha kivtilr61 egy masik alkalmazasbOl akarjuk megadni a szerver es az adatbazis nevet, azt csak parameterezett konstruktorral tehetjtik. Masoljuk Ie a jelenlegi parameter nelktili konstruktorunkat a JelszoForm osztalyba, es adjunk neki ket string tipusu parametertl Az InitiaIizeComponent hozza Ietre az objektumokat, tehat utana adjuk meg a ConnectionString erteketl public JelszoForm(string database, string server) {
InitializeComponent() ;
jelszoAdapter.Fill(jelszoSet); foreach (JelszoSet.UsersRow row in jelszoSet.Users) userBox.Items.Add(row.user_ID) ; }
Ezutan a mv6 alkaimazasban - amikor a JelszoForm objektumot Ietrehozzuk - a konstruktorat ket parameterrel, az adatbazis nevevel es az SQL szerver nevevel kell meghivnunk.
10.4. Feladatok 1. Keszitstink uj adatblizist, mely egy masik alkaimazashoz adja meg a feIhasznaI6kat es jelszavukat! Hasznaijuk ezt az adatbazist a jelsz6bekeresere! 2. Keszitstink egy uj aikaimazast 'Megyek' neven! Az alkaimazas Magyarorszag megyeinek adatait mutatja be tablazatos formaban. Az adatokat Iehessen m6dositani is 1* 3. Taroljuk a rendelkezestinkre aH6 video- es hangfajlok nevet es eleresi utjat adatbazisban! Keszitstink aikaimazast, mely az adatbazisban tarolt fajIokat Iejatssza!
322
10.5. Megoldasotletek
4. Keszftsiink osztalykonyvtarat, mely egy jatekprogramhoz tarolja az eddig jatszo jatekosok nevet es eredmenyet, es uj jatekos eseten felveszi azt a listaba, regi jatekos eseten pedig, ha a most elert eredmeny jobb, mint az eddigi legjobb, akkor javftja azt. 5. Termekeket bemutato ablak. A termek lehet pulover, auto, illatszer, konyv, utazasi ajanlat ... Mindenki valasszon kedvere valot! 6. A Kapj el, az Am6ba ... feladat tovabbfejleszthet6 ugy, hogy az ablak meretet nem engedi valtoztatni, helyette fokozatot lehet vaIasztani a jatek indftasakor. A fokozat az ablakmeretet allftja. Egy masik id6zft6 meri a jatek idejet, es az indftaskor bekert jatekos neven rogzfti azt, ha a jatekos gy6z. Egy fajlban vagy adatbazisban tarolja az eddigi gy6zeipIek rangsorat. Legyen dll, hisz sok jatek hasznalhatja! .. 7. Keszitsiink alkalmazast, mely egy rendszer feliigyeletet ellato szemelyek iigyeleti nyilvantarrnsat kezeli! Az adatokat adatbazisban tarolja. Lehessen meghatarozni, kinek bany orat kell kifizetni az iigyeletre!
10.5. Megoldasotietek 2. Megyek adatai biblazatosan. Keszitsiink Access adatbazist a megyek adatainak tarolasara! Vegyiik fOl a Server Explorerbe a Data Connections koze!
A Server Explorerb61 altalunk valasztott tabla Formra hUzasaval az OleDbConnection es OleDbDataAdapter tfpusu objektum letrejon. Neviik: megyeDbConnection, megyeDbDataAdapter. Az adatokat egy· tablazatban szeretnenk az alkalmazasunkban latni. Ehhez egy
DataGrid vezerl6t hUzzunk a Formra a ToolBox Windows Forms listajarol! A tablazat neve legyen megyeGrid! A tablazat adatforraskent (DataSource) egy DataSet objektumot var, mely biztositja a tablazatban megjelen6 adatokat. Ezt a DataAdapterbOl generalhatjuk. MegyeForm.cs[Design] megyeDbDataAdapter jobbeger Generate Dataset New: megyeDataSet Choose which table(s) to add to the dataset: Megyek
323
10. gyakorlat. Adatbazis-eleres Add this dataset to the designer. OK. Ezutan mar kivalaszthatjuk megjelenfteshez.
a
dataset
objektumot
a
gridben
tOrteno
MegyeForm.cs[Design] megyeGrid kijelOlve Properties DataSource: megyeDataSet.Megyek Mar a tervezo m6dban latjuk, hogy megjelennek a tablazat cfmsoraban az adatbazisban kivalasztott tabla mezonevei.
Futtatva az alkalmazast, meg tires a tablazat. Az adatok beolvasasat a megyeDataSetbe az ablak megnyitasakor meg el kell vegezntink! A Form Load esemenyenek kezelojebe (duplakattintas a formon): private void MegyeForm_Load(object sender, System.EventArgs e) {
}
Az adatok az alkalmazason keresztiil szerkeszthetok (tOrolhetok, m6dosfthat6k,
uj adatok vehetok fel). Az adatok m6dosftasa csak a megyeDataSet-ben tOrtenik meg. Ha azt akarjuk,
hogy a m6dosftas az adatbazisban is megtOrtenjen, akkor az alkalmazas befejezesekor m6dosftsuk az adatbazist!
11. Gyakorlat. Web alkalmazas keszitese, 11.1. A sziikseges elokesziiletek Ha a Visual studio telepftes.ehez nem volt sziikseg az ITS-re, akkor eddigi feladataink ITS nelkiil is megoldhat6k voltak. Azonban ha Web alkalmazast (ASP.NET Web Application)iiMl6zati szolgaltat6t (ASP.NET Web Service) vagy hal6zati alkalmazasok vezerloit (Web Control Library) szeretnenk keszfteni, azt csak akkor engedelyezi a Visual Studio, ha operaci6s rendszertink telepftese mtan telepftetttik az Internet Information Servicest(ITS). Ha ezt eddig'nem tettiik meg, a szolgaltatas ut6lag is telepftheto,aWindowsoperaci6s rendszer CD-jerol. Ha van lIS azt a Vezerlopult / [Teljesftmeny es karbantartas /] Feliigyeleti eszkozok kozt talaljuk meg. (11. Gyakorlat. 2. abra) Ahhoz, hogy az elkesziilt k6dot egy bongeszoben futtatni tudjuk, a helyihal6zat proxykiszolgal6janak beallftasa sztikseges. (A beallftasokat az Internet Explorer / Eszkozok / Internet beallltasok / Kapcsolatok / LAN beallftasok alatt is megtehetjiik. )
Visual. Studio Tools
Options Projects
327
11. gyakorlat. Web alkalmazas keszltese Web Settings Connection Settings LAN beallitasok: Proxikiszolgal6 hasznalata a helyi hal6zaton
igen
Clm es Port megadasa a szamit6gep beallftasainak megfelel6en. Az IP efmet a Vezerl6pult /[ Hal6zati es Intemetes kapcsolatok /] Hal6zati
kapcsolatok / Helyi kapcsolat / Tamogatas fiilet valasztva olvashatjuk ki. Ehhez e16 Intemetkapcsolattal kell rendelkezniink. Mindenkepp miikOdik a localhost IP efme, a 127.0.0.1, amit a generalt Web alkalmazas Web.config fajljaban is megnezhetiink: stateConnectionString="tcpip=127.0.0.1:42424"
a kett6spont el6tti szakasz. - Helyi hcil6zat (LAN) becillitiisai -
~
Automatikus konfiguracio ,,','"
-~
"~-
~tIJ
"" """"'" '""",.""""""--"-' ""
Az automatikus konfiguracio ervenytelenitheti a kezi beallitasokat. Ha ezeket hasznalja, kapcsolja kiaz automatikus konfiguraciot.
~~:hi.~!I~~~Qk:~~~Q!!i~~!tY.~::~~~Iif.~~~f
o Automatikus konfiguracios parancsfajl nasznalata
Megse
1·
11. Gyakorlat. 1. abra A proxykiszolgal6 beallftasa
11.2.Keszitsunk Web alkalmazast! File menii
New Project Project Types: Visual C# Projects Templates: ASP.NET Web Application 328
11.2. Keszitsiink Web alkalmazast! Location: http://localhostffanfolyam Close Solution
OK A projekt letrehozasa az eddigieknel egy kicsit tovabb tart. Ha megnezziik az elkesziilt WebForm1.aspx formot, az a Windows Formhoz hason16an szerkesztheto, csak az ablak aljan, a Design fiil mellett van egy HTML nezet is. Vagyis szerkeszthetjiik a tervezoeszkozzel, de frhatjuk az oldal HTML k6djat is. A fejlesztes soran a ket lehetoseget felvaltva szoktuk alkalmazni. Termeszetesen a gyorsmeniiben a View Code meniipontot valasztva a C# forrask6dot is megnezhetjiik WebForml.aspx.cs fajlban. Nevezziik at: 1. a Solution Explorerben WebForm1.aspx-rol TanfolyamForm.aspx-re! 2. a Class Viewban az osztaly nevet! 3. a K6d megjegyzeset! 4. a TanfolyamForrh.aspx Properties ablakaban (vagy a HTML k6dban) a title tulajdonsagot! Az oldal dme, ha azonnal nem latszik is, t5bb helyen fontos az intemeten. A keresoprogramok ezt szoktak kifrni, de ha mi futtatjuk az oldalt a sajat bongeszonkben, a Start menii talcajara is az oldal dme (title) keriil. (Nem eleg a frissftes, ujrafordftas kell!) 5. a TanfolyamForm.aspx HTML nezeteben form id= "Form 1" azonosft6t! generaIas soran megadtuk a k6d helyet. A A http://1ocalhostffanfolyam!fanfolyamForm.aspx cfmet a bongeszonkbe frva meg is nezhetjiik a Web oldalt a Build Solution utan. (Egyelore iires.) A Start parancsot valasztva a felepftes utan ki is nyitja nekiink a bongeszot az oldallal.
~
Forditas/Futtatas
HoI tarolja a Visual Studio a projekt fajljait? A solution fajlt a Documents and Settings I Felhaszna16 nev I Dokumentumok I Visual Studio Projects alatti projekt nevvel megegyezo alkonyvtarban. A FelhasznaI6 nev I VSWebCache I projekt neve alkonyvtar a fordftas helye. A kesz fajlok publikalasa, ahonnet elerhetjiik oket a bongeszovel, a C:\lnetpub\wWWfoot konyvtar alatti, a projekt nevevel megegyezo alkonyvtarban t5rtenik. Ide masolja oket a VS. Ha megnezziik az lIS nyilvantartasat, a sajat gepiink Webhelyek I alapertelmezett webhely alatt megtalaljuk a Tanfolyam mappat. Az lIS-ben a Miivelet menii Csatlakozas meniipontjaval tudunk tovabbi szamft6gepekhez kapcso16dni. A Webhelyek adatai kozt a Port informaci6t is megtalaljuk. 329
11. gyakorlat. Web alkalmazas keszitese ~~
~"~r
p
~
_
~
~
~~,~"
~
"~~~h~
__
~"'_iffi'~~"_~
~i Internet Information Services Eajl
Ma~elet
Nezet
~~
~~
~
~
_~_
~lIJa
2ugo
Internet Information Services g.~ BMF-SIPOS (helyi szam~ogep) g Webhelyek
11. Gyakorlat. 2. abra Az lIS a Tanfolyam Web alkalmazassal A fejlesztes soran a web formot a bOngeszoben nezziik. Ha nem akarjuk a bOngeszot minden alkalommal ujrainditani es bezarni, celszerii nem a Visual Studiob61, hanem ona1l6an elindftani. fgy persze minden fordftas utan frissfteni kell a bongeszett oldalt. Ezt a honlap szerkesztoi mar megszokhattak, nem eleg m6dositani a k6dot, csak akkor latjuk a valtozast, ha a bongeszoben frissitiink. A bongeszot a Visual Studio kornyezet elemekent is hasznalhatjuk, ha a TanfolyamForm.aspx oldalon a gyorsmeniiben a View in Browser meniipontot valasztjuk. A bongeszo szokasos Web eszkozsora a frissito ikonnal a Visual Studio eszkozsorai kozt jelenik meg.
11.3. Azadatok megjelenitese 11.3.1. Az adatbazis letrehozasa Valasszuk a Server Explorerben a sajat SQL Serveriinket vagy az Accesst. Az uj adatbazis neve legyen Tanfolyam! Tablai: Tanfolyamok, Kurzus, ReszCKurzus es Resztvevo. Az adatbazis szerkezete a kovetkezo:
330
11.3. Az adatok megjelenitese
Resztvevo 11 r-'
i
• . ..... .
. Kurzus . ;;Go; kurzus -'
r!
'--
11. Gyakorlat. 3. abra A Tanfolyam adatbazis szerkezete
11.3.2. Az adatok megjelenitese Tegyiink a TanfolyamForm.aspx Design nezetenek feliiletere a Web Forms kateg6riab61 egy Button vezerl6t! Az ID legyen fillButton, a Text tulajdonsaga: Feltolt! Huzzuk a TanfolyamForm.aspx Design nezetenek feliiletere a Tanfolyamok tablat! Az objektumok neve legyen tanfConneetion, tanfDataAdapter! Az adapterbOl generaljuk a TanfDataSet-et! A Toolboxb61 hUzzunk a formra egy DataGrid objektumot tanfDataGrid ID-vel! A DataSouree tulajdonsagahoz vaIasszuk ki a tanfDataSetl objektumot! DataMember tulajdonsaga legyen a Tanfolyamok tabla neve! A szerkeszt6 nezetben (Design) tablazat cfmsoraban megjelennek a mez6nevek. FeltOlt gomb vaIasztasa soran tOltsiik fel a DataSet-et adatokkal, es esatoljuk az adatokat a tablazathoz! private void fillButton_Click(object sender, System.EventArgs e) {
tanfDataAdapter.Fill(tanfDataSetl)i tanfDataGrid.DataBind() i }
Forditas/Futtatas/Teszteles
Start valasztasara megjelenik a Feltolt gomb a bongesz6ben, majd a gomb vaIasztasa utan a Login failed for user 'SZERVER-NEV\ASPNET'. hibaiizenetet kapunk. Vagyis ezen a neven szeretnenk hozzaferni az adatbazishoz, de ilyen neven nines hozza jogosultsagunk. 331
11. gyakorlat. Web alkalmazas keszitese 11.3.2.1.
A jogosultsag beaIlitasa
Adjunk az SQL szervertinkben ilyen felhaszmil6neven jogosultsagot! Start menii Minden program Microsoft SQL Server Enterprise Manager Microsoft SQL Servers SQL Server Group local Security Logins jobbeger New Login General fill Name harompontos gomb Hozzaadando nev: SZERVER-NEV\ASPNET
OK Authentication: Windows Authetication Domain: SZERVER-NEV Security access: Grant access Database: Tanfolyam Language:
OK Ne csukjuk be az SQL Server Enterprise Managert!
~
Forditas/Futtatas/Teszteles
A hibaiizenet a kovetkezore m6dosult:
Cannot open database requested in login Tanfolyam'. Loginfails. Login failed for user 'BMF-SIPOS\ASPNET' Tehat mar konkretan a Tanfolyam adatbazissal van a hozzaferesi problema. Databases Tanfolyam 332
11.3. Az adatok megjelenitese Users jobbeger New Database User Login name: SZERVER-NEV\ASPNET User name: SZERVER-NEV\ASPNET Database role membership: public, db_datareader
OK Forditas/Futtatas/Teszteles Most mar hibatlanul megjelent a bOngesz6ben az adatbazis tartalma a tablazatban. ! '!J TanfolyamForm . Microsoft Internet Explorer Eajl
11. Gyakorlat. 4. abra A Tanfolyam adatbazis Tanfolyamok tablajanak adatai a bOngesz6ben
Az olvasas jogot a Tanfolyam adatbazisra mar a New Login letrehozasakor, a Database Access fiilben is beallithattuk volna.
11.3.2.2.
A tablazat formazasa
A Grid tulajdonsaglapjan: BackColor: ControlLight
333
11. gyakorlat. Web alkalmazas keszltese
BorderColor: ControlDark A Grid vezerl6 gyorsmeniijeben: Property Builder A Columns fiilben vegyiik ki a Create columns automatically at run time dobozb61 a pipat, mert szeretnenk az oszlopok feliratait megvaltoztatni! Az Available columns kateg6riab61 tegyiik at egyenkent az oszlopokat a Selected columns kateg6riaba (esetleg a k6d elhagyhat6)! Majd egyenkent adjuk meg a Header text mez6ben a kivant fejlecnevet! A tanfolyam k6dja legyen Read only! A tanfolyam hosszeit megad6 napok szamat szeretnenk k6zepre rendezni! Format Columns Columns[3] Items Horizontal alignment: Center
OK A fejlecet fOlfele illessziik, es allftsuk a tanfolyamleiras szelesseget! A szinezest pedig a gyorsmenii Auto Format parancsaval oldjuk meg.
Ta:nfolyam Taufolyam :neve Taufolyam leil'ss kiid
,
Hossz (:nap)
11. Gyakorlat. 5. abra A formazott Tanfolyamok tabla
• Ha elveszitenenk a localhost beallitast (nem tudjuk az aspx alkalmazasokat futtatni es nem tudunk web alkalmazast generalni), az TIS / Alapertelmezett webhe1y / Miivelet / Tulajdonsagok / Webhely / IP cimet allitsuk a localhostnak megfelelo 127.0.0.1-re!
334
11.4. Feladatok
11.4. Feladatok 1. Keszitstink Web alkalmazast, mely ket bevitt datum eseteiln gombnyomasra megadja a kozottUk eltelt napok szamat! Adjuk\, meg aZ/. eltelt idot datumertekkent is, azaz ev, h6,nap felbontasban! 2. Bovitstik a Tanfolyam feladatot ugy, hogy a kivalasztott tanfolyamhoz sorolja fel a kurzusokat, s az adott kurzus eseten lehessen megnezni a jelentkezettek nevsorat! 3. Keszitstink egy Web Formot, melyen sztiletesi datumadatokat kertink b~cktilOn evszam, h6nap, nap mezokbe! Az evszam legyen nagyobb, mint 1900, es legfeljebb az idei evvel egyezo legyen! A h6nap-, napadatok a datumnak megfeleloek legyenek! Adjunk reszletes indoklasu hibatizeneteket! Hasznaljunk Validator objektumokat az ellenorzeshez! 4.
Osztalyzatok. Keszitstink Web alkalmazast egy osztaly valamely tantargyanak osztalyzatai bevitelere! Ellenorizztik, hogy az osztalyzatok 1 es 5 kozotti egesz szamok legyenek, es ne lehessen ugyanazt a szemelyt ketszer felViTIni:!*'
11.5.Megoldasotletek 4. Osztalyzatok. Keszitstik el az adatbazist, a DataSet osztalyt generaljuk Ie, es olVassuk be a dataSet objektumba az adatokat feltolteskor!
Tegytink ellenorzo vezerloket a beviteli mezok melle! Egy RangeValidator vezerlo, tulajdonsagai: ID: jegyRangeValidator ControlTo Validate: jegyTextBox ErrorMessage: A jegy 1 es 5 kozotti szam lehet! : MaximumValue: 5 MinimumValue: 1 Type: Integer
Ha a felviteffiutton alapertelmezett Causes Validation tulajdonsagat True erteken hagytuk, a gomb valasztasakor megtortenik az ellenorzes. Ezt tesztelhetjtik, ha a gombhoz egy tires kezelomet6dust rendeliink. A teszteles soran kidertil, az ellenorzessj~l miikodik, kiveve, hogy tires mezo eseten nem ktild hibatizenetet. Mivel eg:yymezohoz tObb ellen6Dz&.~·vezerlot is rendelhettink, hUzzunk a feltiletre egy Reql1-lredFieldValidatort! '
335
11. gyakorlat. Web alkalmazas keszitese
ID: jegyRequiredFieldValidator ControlTo Validate: jegyTextBox ErrorMessage: Ajegy mez6 kitOltesekotelez6! Hasonlo modon a nev mez6t se lehessen iiresen hagyni!
11. Gyakorlat. 6. abra A RequiredFieldValidator miikodes kozben Mivel megengedtiik a kliens oldali ellen6rzest, az el6z6 ellen6rzesek a kliens oldalon tOrtentek. Ezt jol lathatjuk, ha a felvitel gomb valasztasat kovet6en a statuszsorban az adatatvitel folyamatkijelz6jet figyeljiik. Ha a felvitel gomb esemenykezel6jebe tOrespontot tesziink lathatoan az esemenykezel6 nem hivodik meg. Annak ellen6rzeset, hogy ugyanazt a szemelyt ne vihessiik fol ketszer, mar a szerver oldalon fogjuk megoldani. Ehhez egy CustomValidator vezerl6t hasznaIunk.
ID: nameCustomValidator ControlTo Validate: nameTextBox ErrorMessage: Ez a nev mar szerepel a nyilvantartasban! Az esemenyek kozott a ServerValidate esemenyt kezeljiik! private void nameCustomValidator_ServerValidate( object source, System.Web.UI.WebControls.ServerValidateEventArgs args) {
11.5. Megoldasotletek Ha az OsztaIyzatok tabla sorai tartalmazzak a bem nevet, akkor hamis legyen az ervenyesseg! Most mar nines mas tennival6nk, mint megfrni a felvitelt! private void felviszButton_Click(object sender, System.EventArgs e) {
met6dus onmagaban is garantalja, hogy kulcsmezot nem vihetiink fO! tObbszor, megis a legegyszeriibb, ha meg sem hivjuk a felvitelt ismetelt nev eseten. l
rg@~
JegyWebForm - Microsoft Internet Explorer
Ez a nev mar szerepel a 1l)ilvant3Itasban! Nev: Jegy: @!Iici M~Zk6------1
15-]
[Felvitell
11. Gyakorlat. 7. abra A CustomValidator figyelmeztetese A CustomValidator szerver oldali ellenorzeset az adatatvitel kijelzesebol latjuk a statuszsorban.
IS
337
Irodalomjegyzek 1. Albert Istvan, Balassy Gyorgy, Charaf Hassan, Erdelyi Tibor, Horvath Adam, Levendovszky Tihamer, Peteri Szilard - Rajacsies Tamas: A .NET Framework es programozasa, Szak kiad6, 2004. 2. A tantargyak eloadasaihoz hasznalt segedletek. www.nik.hu/aii/oktatok/siposmarianna.html 3. Baga Edit: Delphi maskepp, Magan kiadas, Budapest, 1998. 4. Booch Grady, Rumbaugh J, Jacobson I: The Unified Modeling Language User Guide, Addison Wesley Longman Inc., Reading Massachusetts, 1998. 5. Bradley L. Jones: C# mesteri szinten, Kiskapu Kft, 2004. 6. Gamma Erich, Helm R, Jonson R, Vlissides J: Design Patterns, Addison Wesley Longman Inc., Reading Massachusetts, 1995. 7. Jacobson I, Griss M, Jonsson P: Software Reuse ACM Press, New York, 1997. 8. Jacobson Ivar, Rumbaugh J, Booch G,: The Unified Software Development Process, Addison Wesley Longman Inc., Reading Massachusetts, 1999. 9. Jutta Eckstein, Mary Lynn manns, Helen Sharp, Marianna Sipos: Teching from Differnet Perspectives, EuroPLoP'03, Irsee, 2003. 165-183. old. 10. Madsen Ole Lehrmann Madsen, Henrie Ron, Kresten Krab Thorup & Mads Torgersen, A Conceptual Approch to Teaching Object-Orientation to C
339
Irodalomjegyzek
Programmers, Proceedings, Educator's Symposium, OOPSLA'98, Vancouver, ACM, New York, 1998. 11. Microsoft: Developing Microsoft.NET Applications for Windows Visual C#.NET, Microsoft Corporation 2002, Material No: 2555A 12. Microsoft: Developing Microsoft ASP.NET Web Applications Using Visual Studio .NET, Microsoft Corporation, 2002, Material No. 2310. 13. Microsoft: Introduction to C# Programming for the Microsoft.NET Platform, Microsoft Corporation, 2001, Material No. 2124B. 14. Microsoft: Querying Microsoft SQL Server 2000 with Transact-SQL, Microsoft Corporation, 2002, Material No 2071BCP 15. Microsoft .NET Framework SDK Documentation v1.1, Microsoft Corporation, 2002. 16. MSDN Library for Visual Studio .NET 2003 Microsoft Corporation, 2003. 17. MSDN Online: http://msdn.microsoft.com 18. Nyekyne Gaizler Judit: Java2 Utikalauz programoz6knak I. ELTE TTK Hallgat6i Alapftvany, Budapest, 2000. 19. Platt David S.: Bemutatkozik a Microsoft .NET, Szak Kiad6 Kft, Bicske, 2001 20. Petho Adam: abC, Szamalk Konyvkiad6, Budapest, 1991. 21. Rumbaugh James, Booch G, Jacobson I: The Unified Modeling Language Reference Manual, Addison Wesley Longman Inc., Reading Massachusetts, 1998. 22. Rebecca M. Riordan: Microsoft ADO.NET Step by Step, Microsoft Press, Redmond, Washington, 2002. 23. Sipos Mariann: Objektumorientalt programozas a C++ nyelv lehetosegeivel, Gabor Denes Foiskola, foiskolai jegyzet, Budapest, 2000. 24. Sipos Marianna: A Visual C++ es az MFC, masodik kiadas Budapest, 2001. 25. Visual C# Language 2004. 09. 28.: http://msdn.microsoft.comllibraryJenus!cscon/html!vcoriCStartPage.asp 26. Visual Studio.NET C# 2001, Software Offline, Animare Software Kft, 2002. 27. Visual Studio.NET C# 2002, Software Offline, Animare Software Kft, 2003. www.SoftwareOnline.hu 28. Wikipediathe free encyclopedia http://wikipedia.org
340
Konyvismerteto Bradley L. Jones C# mesteri szinten 21 nap alatt Mindossze 21 nap alatt elsaj
Adatok:
ISBN: 963 9301 736 Ara: 6930 Ft Oldalszam: 768 oldal Temakor: programozas, C# Felhasznal6i szint: kezd6-profi