> f e l t e t e l e k = new L i s t
>(); i f ( c h e c k e d L i s t B o x 1 . C h e c k e d I n d i c e s . Co n ta in s ( 0 ) ) f e l t e t e l e k . Add( Prim ) ; i f ( c h e c k e d L i s t B o x 1 . C h e c k e d I n d i c e s . Co n ta in s ( 1 ) ) f e l t e t e l e k . Add( Paros ) ; i f ( c h e c k e d L i s t B o x 1 . C h e c k e d I n d i c e s . Co n ta in s ( 2 ) ) f e l t e t e l e k . Add( P a r a t l a n ) ; i f ( c h e c k e d L i s t B o x 1 . C h e c k e d I n d i c e s . Co n ta in s ( 3 ) ) f e l t e t e l e k . Add( Oszt3 ) ; i f ( c h e c k e d L i s t B o x 1 . C h e c k e d I n d i c e s . Co n ta in s ( 4 ) ) f e l t e t e l e k . Add( Oszt6 ) ; i f ( c h e c k e d L i s t B o x 1 . C h e c k e d I n d i c e s . Co n ta in s ( 5 ) ) f e l t e t e l e k . Add( Oszt9 ) ; i f ( c h e c k e d L i s t B o x 1 . C h e c k e d I n d i c e s . Co n ta in s ( 6 ) ) f e l t e t e l e k . Add( Negyzet ) ; LBx_Valogat . Items . C l e a r ( ) ; for ( I n t 3 2 i = 0 ; i < LBx_Ossz . Items . Count ; i ++) { Boolean k e l l = f a l s e ; foreach ( P r e d i c a t e
19.47. forráskód. Generálás és szűrés
277
19.48. ábra. Működés közben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
private void monthCalendar_DateChanged ( object se n d e r , DateRangeEventArgs e ) { i f (MC_kezd . S e l e c t i o n S t a r t . CompareTo (MC_veg . S e l e c t i o n S t a r t ) > 0 ) { L B_kulonbseg . Text = "A␣ keződátum ␣ nagyobb , ␣ mint ␣a␣ végdátum . " ; } else { L B_kulonbseg . Text = S t r i n g . Format ( "A␣ k é t ␣dátum␣ k ö z ö t t ␣ e l t e l t ␣ napok ␣ száma : ␣ {0} " , MC_veg . S e l e c t i o n S t a r t . S u b t r a c t (MC_kezd . S e l e c t i o n S t a r t ) . Days ) ; } }
19.49. forráskód. Különbség kiszámítása
19.50. ábra. Működés közben.
278
1 2
private void B tn_Horoszkop_Click ( object s e n d e r , EventArgs e ) { l a b e l 1 . Text = C s i l l a g j e g y ( dateTimePicker1 . Value ) ; }
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
private S t r i n g C s i l l a g j e g y ( DateTime dateTime ) { dateTime = new DateTime ( 2 0 1 1 , dateTime . Month , dateTime . Day ) ; DateTime [ ] d a t e s = new DateTime [ 1 2 ] { new DateTime ( 2 0 1 1 , 0 1 , 2 0 ) , new DateTime ( 2 0 1 1 , 0 2 , 1 9 ) , new DateTime ( 2 0 1 1 , 0 3 , 2 1 ) , new DateTime ( 2 0 1 1 , 0 4 , 2 0 ) , new DateTime ( 2 0 1 1 , 0 5 , 2 1 ) , new DateTime ( 2 0 1 1 , 0 6 , 2 2 ) , new DateTime ( 2 0 1 1 , 0 7 , 2 3 ) , new DateTime ( 2 0 1 1 , 0 8 , 2 3 ) , new DateTime ( 2 0 1 1 , 0 9 , 2 3 ) , new DateTime ( 2 0 1 1 , 1 0 , 2 3 ) , new DateTime ( 2 0 1 1 , 1 1 , 2 2 ) , new DateTime ( 2 0 1 1 , 1 2 , 2 2 ) }; S t r i n g [ ] j e g y e k = new S t r i n g [ 1 2 ] { " Vízöntő " , " Halak " , "Kos" , " Bika " , " I k r e k " , "Rák" , " O r o s z l á n " , " Szűz " , " Mérleg " , " S k o r p i ó " , " N y i l a s " , "Bak" }; int i = 0 ; Boolean found = f a l s e ; while ( i < 11 && ! found ) { found = ( ( d a t e s [ i ] < dateTime ) && ( dateTime < d a t e s [ i + 1 ] ) ) ; i ++; } return ( found ) ? j e g y e k [ i − 1 ] : j e g y e k [ 1 1 ] ; }
19.51. forráskód. Csillagjegy megadása
19.52. ábra. Működés közben.
279
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
private void BT_hozzaad_Click ( object s e n d e r , EventArgs e ) { DateTime i d o ; try { i d o = DateTime . ParseExact ( maskedTextBox1 . Text , "HH:mm: s s " , Cu l t u r e I n f o . I n v a r i a n t C u l t u r e ) ; } c atch ( FormatException ) { MessageBox . Show ( " Nincs ␣megadva␣ i d ő ! " ) ; return ; } DateTime uj_datum_es_ido = new DateTime ( datum . Value . Year , datum . Value . Month , datum . Value . Day , i d o . Hour , i d o . Minute , i d o . Second ) ; I n t 3 2 n o v e l e s = ( int )numericUpDown1 . Value ; i f (RB_ev . Checked ) uj_datum_es_ido = uj_datum_es_ido . AddYears ( n o v e l e s ) ; else i f (RB_honap . Checked ) uj_datum_es_ido = uj_datum_es_ido . AddMonths ( n o v e l e s ) ; else i f (RB_nap . Checked ) uj_datum_es_ido = uj_datum_es_ido . AddDays ( n o v e l e s ) ; else i f (RB_ora . Checked ) uj_datum_es_ido = uj_datum_es_ido . AddHours ( n o v e l e s ) ; else i f (RB_perc . Checked ) uj_datum_es_ido = uj_datum_es_ido . AddMinutes ( n o v e l e s ) ; e l s e i f (RB_masodperc . Checked ) uj_datum_es_ido = uj_datum_es_ido . AddSeconds ( n o v e l e s ) ; l a b e l 3 . Text = S t r i n g . Format ( "A␣ n ö v e l t ␣dátum␣ é s ␣ i d ő : ␣␣␣␣␣␣␣␣ ␣␣␣␣␣␣␣␣ { 0 : yyyy ␣MM␣dd , ␣HH:mm: s s }" , uj_datum_es_ido ) ; }
19.53. forráskód. Dátum növelése
19.54. ábra. Működés közben.
280
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
private void Stopper_MouseClick ( object s e n d e r , MouseEventArgs e ) { i f ( e . Button == System . Windows . Forms . MouseButtons . Right ) { if ( started ) { l a b e l 1 . Text = "Jobbgomb : ␣ s t o p p e r ␣ i n d í t á s a " ; l b_mert . Text = S t r i n g . Format ( " Mért ␣ i d ő : ␣ { 0 : t }" , ( DateTime . Now − st a r t T i m e ) ) ; } else { l a b e l 1 . Text = "Jobbgomb : ␣ s t o p p e r ␣ l e á l l í t á s a " ; st a r t T i m e = DateTime . Now ; l i s t B o x 1 . Items . C l e a r ( ) ; l b_mert . Text = S t r i n g . Empty ; } started = ! started ; } e l s e i f ( e . Button == System . Windows . Forms . MouseButtons . L e f t ) { if ( started ) l i s t B o x 1 . Items . Add ( ( DateTime . Now − s t a r t T i m e ) . T oS t r i n g ( " t " ) ) ; } }
19.55. forráskód. Egérkattintás kezelése
19.56. ábra. Három szám átlagai.
281
1 2 3 4
private bool JoSzamok ( ) { r eturn ( ( int . TryParse ( textBoxSz1 . Text , out s z 1 ) ) && ( int . TryParse ( textBoxSz2 . Text , out s z 2 ) ) && ( int . TryParse ( textBoxSz3 . Text , out s z 3 ) ) ) ; }
5 6 7 8 9 10 11 12 13
private void mértaniKözépToolStripMenuItem_Click ( object se n d e r , EventArgs e ) { i f ( JoSzamok ( ) ) { ListBoxEredmeny . Items . Add( " Mértani ␣ közép : ␣" + (Math . Pow( s z 1 ∗ s z 2 ∗ sz3 , 1 . 0 / 3 ) ) . T o S t r in g ( ) ) ; } else { MessageBox . Show ( "3␣ e g é s z ␣ számot ␣ k é r e k ! ! ! " , " Hiba . . . " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; } }
19.57. forráskód. Három szám mértani közepe
19.58. ábra. Három szám átlagai ikonokkal.
19.59. ábra. Listaelemek kezekése menüből
282
1 2 3 4 5 6
private { int min fo r {
i; = max = Convert . ToInt32 ( l i s t B o x 1 . Items [ 0 ] ) ; ( i = 1 ; i < l i s t B o x 1 . Items . Count ; i ++) i f (max max i f ( min min
7 8 9 10
< = > =
Convert . ToInt32 ( l i s t B o x 1 . Items [ Convert . ToInt32 ( l i s t B o x 1 . Items [ Convert . ToInt32 ( l i s t B o x 1 . Items [ Convert . ToInt32 ( l i s t B o x 1 . Items [
i i i i
])) ]); ])) ]);
}
11 12
void S z e l s o e r t e k ( out int max , out int min )
}
13 14 15 16 17 18 19 20 21 22
private void S e t S t a t u s ( ) { S t a t u s L a b e l 1 . Text = " Elemek ␣ száma : ␣" + l i s t B o x 1 . Items . Count . T o S t r i n g ( ) ; int max , min ; S z e l s o e r t e k ( out max , out min ) ; S t a t u s L a b e l 2 . Text = " Legnagyobb ␣ elem : ␣" + max . T o St r i n g ( ) ; S t a t u s L a b e l 3 . Text = " L e g k i s e b b ␣ elem : ␣" + min . T o S t r in g ( ) ; }
23 24 25 26 27 28 29 30 31 32 33 34
private void SetDef ( ) { int i , szam ; l i s t B o x 1 . Items . C l e a r ( ) ; fo r ( i = 0 ; i < 1 0 ; i ++) { szam = rnd . Next ( 1 0 ) + 1 0 ; l i s t B o x 1 . Items . Add( szam . T o S t r i n g ( ) ) ; } SetStatus ( ) ; }
35 36 37 38 39 40
private void al a p h e l y z e t T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { SetDef ( ) ; }
41 42 43 44 45 46 47 48 49 50 51
private void öss z e g To o l S t ri p M e nu I t e m _C l i c k ( object se n d e r , EventArgs e ) { int i , s = 0 ; fo r ( i = 0 ; i < l i s t B o x 1 . Items . Count ; i ++) { s += Convert . ToInt32 ( l i s t B o x 1 . Items [ i ] ) ; } l a b e l O s s z e g . Text = " Elemek ␣ ö s s z e g : ␣" + s . T o S t r i ng ( ) ; }
19.60. forráskód. Listaelemek kezelése
283
1 2 3 4 5 6 7 8 9 10 11 12
private void sz o r z a t T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { int i ; double s = 1 ; fo r ( i = 0 ; i < l i s t B o x 1 . Items . Count ; i ++) { s ∗= Convert . ToInt32 ( l i s t B o x 1 . Items [ i ] ) ; } l a b e l S z o r z a t . Text = " Elemek ␣ s z o r z a t a : ␣" + s . ToString ( ) ; }
13 14 15 16 17 18 19 20
private void k i j e l ö l t e k T ö r l é s e T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { while ( l i s t B o x 1 . S e l e c t e d I t e m s . Count > 0 ) { l i s t B o x 1 . Items . Remove ( l i s t B o x 1 . S e l e c t e d I t e m s [ 0 ] ) ; }
21
SetStatus ( ) ;
22 23
}
24 25 26 27 28 29 30
private void új B e v i t e l e T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { int s z ; i f ( int . TryParse ( textBox1 . Text , out s z ) ) l i s t B o x 1 . Items . Add( textBox1 . Text ) ;
31
SetStatus ( ) ;
32 33
}
19.61. forráskód. Listaelemek kezelése
284
J 19.26. feladat I [Véletlen számok mátrixban] Töltsön fel egy 3x3 mátrixot 10 és 20 közé eső véletlen számokkal. Végezze el menüből és helyi menüből választhatóan
4
a következő műveleteket: transzponált, a páratlan számok összege, a főátló számainak összege, a sorokban lévő értékek és az oszlopokban lévő értékek összege. Ezeket az eredményeket jelenítse is meg a formon. 19.62. ábra. Mátrix elemek kezelése menüből
Segítség a megoldáshoz: A feladat megoldásánál használjuk a DataGridView komponens adta lehetőségeket. Figyeljünk arra, hogy a mátrix bejárásánál a sorokat és oszlopokat megfelelően azonosítsuk. Használjuk az összegzés tételét megfelelően. A transzponált előállítását lásd a 19.74-ben. J 19.27. feladat I [Műveletek] Írj programot, amely egy számokkal töltött listában végez műveleteket. A műveleteket menüből érhessük el, és a következők legyenek: – minimum/maximum keresés (ezt almenü segítségével old meg) – átlagszámítás – összeg – páros számok összege Ugyancsak menüből lehessen kiválasztani, hogy kézzel adjuk meg a számokat, vagy a program generálja őket. Menüből és gomb segítségével is lehessen kilépni a programból. A számok bekérésénél végezzünk ellenőrzést, hogy valóban egész számot adjon meg a felhasználó és a megadott határokon belül legyen: 1 és 20 között lehet a darabszám, és a számok 1 és 99 között legyenek a listában.
285
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
private void Gen era l ( ) { Random rnd = new Random ( ) ; int i , j , szam ; dataGridAlap . Rows . C l e a r ( ) ; fo r ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; for ( j = 0 ; j < 3 ; j ++) { szam = rnd . Next ( 1 0 ) + 1 0 ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; d c . Value = szam ; r . C e l l s . Add( dc ) ; } dataGridAlap . Rows . Add( r ) ; } }
19.63. forráskód. Mátrix elemek generálása
Segítség a megoldáshoz: Mivel gyakran kell egy bekért szám ellenőrzését elvégezni, írjunk rá külön metódust, mely egy textbox szövegét próbálja meg átalakítani és megadható neki két határ, amik közé kell essen a szám.
19.7. Több info egy formon J 19.28. feladat I [SplitContainer használata] Írjon programot, mely tartalmaz 2 színes panelt egymás mellett, és lehetőség legyen a területük arányának változtatására.
1
Adjuk meg a jobboldali panel szélességének arányát az egészhez képest. Segítség a megoldáshoz: A panelek eltolására használja a SplitContainer komponenst, míg látványosan az arány megaddható a Trackbar segítségével. J 19.29. feladat I [TabControl használata] Írjon programot, mely bekér két egész
1
számot külön külön egy TabControl egyik lapján. Majd kiszámolja a két szám számtani közepét, amit kiír egy másik lapra, aminek a címkéje legyen: eredmények. A bekéréskor ügyeljen a kivételkezelésre! A programból való kilépéskor kérdezzen rá, hogy biztos ki akar-e lépni a felhasználó, és a válasznak megfelelően járjon el. Segítség a megoldáshoz: Figyeljünk oda a hibakezelésre, és a váltásra a TabPage -ek között. J 19.30. feladat I [Mátrixok adatai egy formon] Írjon programot, mely generál egy 3x3 mátrixot olyan véletlen számokból, melyek 1 és 20 közé esnek. Határozza meg a mátrix transzponáltját, a skalárszorosát és a mátrix legkisebb és legnagyobb értékét is válassza ki. Az egyes mátrixokat és a szélsőértékeket külön lapokon jelenítse meg, de csak egy formot használjon. 286
3
1 2 3 4 5 6 7 8 9 10 11 12 13 14
private void pá r a t l a n Ö s s z e g T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { int i , j , szam , p t l = 0 ; fo r ( i = 0 ; i < 3 ; i ++) { for ( j = 0 ; j < 3 ; j ++) { szam = ( int ) dataGridAlap . Rows [ j ] . C e l l s [ i ] . Value ; i f ( szam % 2 == 1 ) p t l += szam ; } } l a b e l P t l O s s z e g . Text = " P á r a t l a n ␣ elemek ␣ ö s s z e g e : ␣" + p t l . T o S tr i n g ( ) ; }
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
private void sorokÖsszegeToolS trip Me nuIt em_Click ( object se n d e r , EventArgs e ) { int i , j , szam , s ; l a b e l S o r o k . Text = " Sorok ␣ ö s s z e g e : ␣\n" ; fo r ( i = 0 ; i < 3 ; i ++) { s = 0; for ( j = 0 ; j < 3 ; j ++) { szam = ( int ) dataGridAlap . Rows [ i ] . C e l l s [ j ] . Value ; s += szam ; } l a b e l S o r o k . Text = l a b e l S o r o k . Text + ( i +1). T o S t r i n g ( ) + " . ␣ s o r : ␣" + s . T o S t r i n g ( ) + "\n" ; } }
33 34 35 36 37 38 39 40 41 42 43 44 45
private void fő á t l ó Ö s s z e g T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { int i , szam , o s s z = 0 ; fo r ( i = 0 ; i < 3 ; i ++) { szam = ( int ) dataGridAlap . Rows [ i ] . C e l l s [ i ] . Value ; o s s z += szam ; } l a b e l F o A t l O s s z e g . Text = " F ő á t l ó ␣ e l e m e i n e k ␣ ö s s z e g e : ␣" + o s s z . ToString ( ) ; }
19.64. forráskód. Mátrix elemek kezelése
Segítség a megoldáshoz: A kezdeti állapotban a program generáljon egy kiinduló mátrixot. Figyeljen oda, hogy a véletlen számok a megadott intervallumba essenek. Megjelenítéshez lehet használni a DataGridView egy megfelelően beállított példányát. Segítség a megoldáshoz: A számolás indításakor határozza meg a feladatban előírt mátrixokat
287
19.65. ábra. Működés közben
és számokat.
19.8. Dialógusok J 19.31. feladat I [Színek állítása dialógusablak segítségével.] Készítsen egy olyan programot, mely egy formon lévő label -nek a szín tulajdonságait állítja. A színbeállítást egy nyomógomb segítségével kezdeményezze. A színeket a szokásos windows beállító ablak segítségével lehessen kiválasztani. Egy további label -be jelenítsük meg a
1
kiválaszott szín adatait is. Segítség a megoldáshoz: A ColorDialog példányosítása történhet a komponens használatával, vagy a kódból közvetlenül is! Figyeljen arra, hogy a ColorDialog is, mint minden dialógus ablak, a ShowDialog() metódussal hívható, melynek visszatérési értéke a DialogResult osztály egy példányában fogadható, és utána értékelhető ki. J 19.32. feladat I [Kép megnyitása dialógus ablak segítségével.] Készítsen egy olyan programot, melyben a szokásos windows Megnyitás ablak segítségével kiválaszt egy képet, és azt megnyitja egy PictureBox -ban. A kép töltse ki a form felületét, méretezésre kövesse annak mozgását. A megnyitást egy gomb segítségével kezdeményezze.
1
Segítség a megoldáshoz: Figyeljen rá, hogy a PictureBox Dock tulajdonságát hogy állítja be! J 19.33. feladat I [Szöveges file megnyitása és mentése] Készítsen egy programot, mely a szokásos windows Megnyitás ablak segítségével meg tud nyitni egy szöveges file-t egy TextBox -ba. Illetve tudjuk elmenteni a tartalmát a szokásos Mentés ablak használatával. 288
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
private Boolean E l l e n o r i z ( TextBox tb , I n t 3 2 ah , I n t 3 2 fh , out In t 3 2 szam ) { i f ( I n t 3 2 . TryParse ( tb . Text , out szam ) && ( szam >= ah ) && ( szam <= f h ) ) { return true ; } else { M essageBox . Show ( S t r i n g . Format ( " Számot ␣ k e l l ␣ megadni ␣ é s ␣ { 0 } , " +" {1} ␣ k ö z ö t t ␣ k e l l ␣ l e n n i e ! " , ah , f h ) ) ; tb . Text = S t r i n g . Empty ; tb . Focus ( ) ; return f a l s e ; } }
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
private void párosakÖsszegeToolStripMenuItem_Click ( object se n d e r , EventArgs e ) { I n t 3 2 sum = 0 ; fo r ( I n t 3 2 i = 0 ; i < l i s t B o x . Items . Count ; i ++) { i f ( ( I n t 3 2 ) l i s t B o x . Items [ i ] % 2 == 0 ) { sum += ( I n t 3 2 ) l i s t B o x . Items [ i ] ; } } i f ( sum > 0 ) M essageBox . Show ( S t r i n g . Format ( "A␣ p á r o s ␣ számok ␣ ö s s z e g e : ␣ {0} " , sum ) ) ; else M essageBox . Show ( " Nincs ␣ p á r o s ␣szám ! " ) ; }
35 36 37 38 39 40 41 42 43 44 45 46
private void számokátlagaToolStripMenuItem_Click ( object se n d e r , EventArgs e ) { I n t 3 2 sum = 0 ; fo r ( I n t 3 2 i = 0 ; i < l i s t B o x . Items . Count ; i ++) { sum += ( I n t 3 2 ) l i s t B o x . Items [ i ] ; } MessageBox . Show ( S t r i n g . Format ( "A␣ számok ␣ á t l a g a : ␣ {0} " , sum / ( ( double ) l i s t B o x . Items . Count ) ) ) ; }
19.66. forráskód. Ellenőrzés és összegzés
Segítség a megoldáshoz: Figyeljen oda, hogy a TextBox Multiline tulajdonságát hogy állítja be. Ne feledjük, a file-ok használathához a System.IO névtérre szükség van.
289
19.67. ábra. Működés közben a SplitContainer.
1 2 3 4 5 6 7 8
namespace T obbinfo_1 { public p a r t i a l cl a s s Form1 : Form { public Form1 ( ) { InitializeComponent ( ) ; }
9
private void tr a c k B a r 1 _ S c r o l l ( object se n d e r , EventArgs e ) { splitContainer2 . SplitterDistance = s p l i t C o n t a i n e r 2 . Width ∗ t r a c k B a r 1 . Value / 1 0 0 ; l a b e l P o s . Text = t r a c k B a r 1 . Value . T oS t r i n g ( ) + "%" ; }
10 11 12 13 14 15 16
private void Form1_Shown ( object s e n d e r , EventArgs e ) { splitContainer2 . SplitterDistance = s p l i t C o n t a i n e r 2 . Width ∗ 10 / 1 0 0 ; l a b e l P o s . Text = t r a c k B a r 1 . Value . T oS t r i n g ( ) + "%" ; }
17 18 19 20 21 22
}
23 24
}
19.68. forráskód. SplitContainer használata
J 19.34. feladat I [Dialógusok használata] Készítsen programot mely egy RichText komponensbe megnyit egy kiválasztott rtf file-t. Tudjuk módosítani a háttér színét, a karakterek színét, a karakterek jellemzőit. Tudjunk menteni. Az egyes lehetőségeket
3
helyi menüből érjük el. Segítség a megoldáshoz: A háttérszín beállításánál használjuk a ColorDialog komponenst. A karakterek jellemzőit a FontDialog komponens segítségével állíthatjuk be. Ennek a Font tulajdonsága tartalmazza az összes beállítást. 290
19.69. ábra. Adatbekérés TabControl használatával.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
private void buttonSzamol_Click ( object s e n d e r , EventArgs e ) { int szam1 , szam2 ; i f ( textBox1 . Text != S t r i n g . Empty && textBox2 . Text != S t r i n g . Empty ) { try { szam1 = Convert . ToInt32 ( textBox1 . Text ) ; szam2 = Convert . ToInt32 ( textBox2 . Text ) ; labelEredmeny . Text = ( ( szam1 + szam2 ) / 2 ) . T o S t r i n g ( ) ; tabControl1 . SelectTab ( 1 ) ; } catch { M essageBox . Show ( " Adathiba ! " , " Hiba " , M essageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; } } else { MessageBox . Show ( " Mindkét ␣ számot ␣ í r d ␣ be ! " , "␣ Hiba " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; } }
19.70. forráskód. TabControl használata
Segítség a megoldáshoz: Mentésnél figyeljünk arra, hogy file művelet végzésekor erőforrást használunk. Szükség lehet a kivételkezelésre.
19.9. Modális és nem modális formok J 19.35. feladat I [Üzenetablak használata] Írjon programot, mely véletlenszerűen kitalál egy egész számot 1 és 20 között. A felhasználó tippelje meg, hogy páros vagy páratlan lesz. A kiértékelést egy dialógus üzenettel végezze a program. 291
1
19.71. ábra. Kiinduló mátrix.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
private void buttonAlap_Click ( object s e n d e r , EventArgs e ) { Random rnd = new Random ( ) ; int i , j , szam ; dataGridAlap . Rows . C l e a r ( ) ; fo r ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; fo r ( j = 0 ; j < 3 ; j ++) { szam = ( rnd . Next ( ) % 2 0 ) + 1 ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; d c . Value = szam ; r . C e l l s . Add( dc ) ; } dataGridAlap . Rows . Add( r ) ; } }
19.72. forráskód. Kiinduló mátrix generálása
Segítség a megoldáshoz: Ügyeljen a véletlenszámok használatára. Az üzenetablak a MessageBox Show metódusával hívható, melynek 4 paramétere van. A megjelenítendő szöveg, a form fejlécszövege, a megjelenő gombok, és az ikon. A gombok és az ikon a rendszer felsorolt típusa MessageBoxButtons és MessageBoxIcon. Ezek közül kell választani. A Páratlan tipp kiértékelése teljesen hasonlóan mehet. J 19.36. feladat I [Üzenetablak kiértékelése] Írjon programot, mely feltesz egy eldöntendő kérdést egy üzenet ablakban, és a válasznak megfelelően, ha IGEN, akkor zöldre, ha NEM akkor pirosra színezi a form hátterét.
292
1
19.73. ábra. Kiinduló mátrix.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
private void Tr a n s z p o n a l t ( ) { int i , j , szam ; dataGridTr . Rows . C l e a r ( ) ; for ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; for ( j = 0 ; j < 3 ; j ++) { szam = ( int ) dataGridAlap . Rows [ j ] . C e l l s [ i ] . Value ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; dc . Value = szam ; r . C e l l s . Add( dc ) ; } dataGridTr . Rows . Add( r ) ; } }
19.74. forráskód. Transzponált számítása
293
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
private void S k a l a r S z o r z a s ( ) { Random rnd = new Random ( ) ; int i , j , szam , s z o r z o ; s z o r z o = ( rnd . Next ( ) % 7 ) + 3 ; l a b e l S k a l a r . Text = "␣A␣ s k a l á r ␣a : ␣"+s z o r z o . T oS t r i n g ( ) ; d a t a G r i d S z o r . Rows . C l e a r ( ) ; for ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; for ( j = 0 ; j < 3 ; j ++) { szam = ( int ) dataGridAlap . Rows [ j ] . C e l l s [ i ] . Value ∗ s z o r z o ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; dc . Value = szam ; r . C e l l s . Add( dc ) ; } da t a G r i d S z o r . Rows . Add( r ) ; } }
19.75. forráskód. Skalárral szorzás
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
private void S z e l s o E r t e k e k ( ) { int szam , i , j , min = 2 1 , max = −1; fo r ( i = 0 ; i < 3 ; i ++) { for ( j = 0 ; j < 3 ; j ++) { szam = ( i nt ) dataGridAlap . Rows [ i ] . C e l l s [ j ] . Value ; i f (min > szam ) min = szam ; i f (max < szam ) max = szam ; } } la b e l M i n . Text = min . T o St r i n g ( ) ; labelMax . Text = max . T o S t ri n g ( ) ; }
19.76. forráskód. Szélsőértékek
294
19.77. ábra. Működés közben.
1 2 3 4 5 6 7 8 9 10 11
private void bu t t o n C o l o r s _ C l i c k ( object se n d e r , EventArgs e ) { C o l o r D i a l o g cd = new C o l o r D i a l o g ( ) ; D i a l o g R e s u l t dr ; dr = cd . ShowDialog ( ) ; i f ( dr == D i a l o g R e s u l t .OK) { l a b e l M i n t a . BackColor = cd . C o l o r ; l a b e l V a l . Text = cd . C o l o r . T o S t r i n g ( ) ; } }
19.78. forráskód. ColorDialog használata
19.79. ábra. Kép megnyitása.
295
1 2 3 4 5 6 7 8 9 10
private void b uttonOpen_Click ( object s e n d e r , EventArgs e ) { Op e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; D i a l o g R e s u l t dr = o f . ShowDialog ( ) ; i f ( dr == D i a l o g R e s u l t .OK) { pi c t u r e B o x D e s t . SizeMode = PictureBoxSizeMode . CenterImage ; pi c t u r e B o x D e s t . Image = new Bitmap ( o f . FileName ) ; } }
19.80. forráskód. OpenFileDialog használata 19.81. ábra. Szöveges file mentése dialógus ablakkal.
1 2 3 4 5 6 7 8 9 10 11
private void b uttonOpen_Click ( object s e n d e r , EventArgs e ) { O p e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { F i l e S t r e a m f s = new Fi l e S t r e a m ( o f . FileName , F ileMode . Open ) ; StreamReader r s = new StreamReader ( f s ) ; string s = r s . ReadLine ( ) ; while ( s != null ) { textBoxDest . Text += s ; s = r s . ReadLine ( ) ; } r s . Close ( ) ; f s . Close ( ) ; } }
12 13 14 15 16 17 18 19 20
private void buttonSave_Click ( object s e n d e r , EventArgs e ) { S a v e F i l e D i a l o g s f = new Sa v e F i l e D i a l o g ( ) ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { F i l e S t r e a m f s = new Fi l e S t r e a m ( s f . FileName , F ileMode . C r e a t e ) ; StreamWriter wr = new S treamWriter ( f s ) ; wr . Write ( textBoxDest . Text ) ; wr . C l o s e ( ) ; f s . C l o s e ( ) ; } }
19.82. forráskód. A SaveFileDialog használata
296
19.83. ábra. Helyi menü használata a feladatban.
1 2 3 4 5
private void há t t é r s z í n T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { C o l o r D i a l o g cd = new Co l o r D i a l o g ( ) ; i f ( cd . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . BackColor = cd . C o l o r ; }
6 7 8 9 10 11
private void f o n t B e á l l í t á s T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { FontDialog f d = new F ontDialog ( ) ; i f ( f d . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . Font = f d . Font ; }
19.84. forráskód. Háttérszín és Font beállítása 1 2 3 4
private void be t ö l t é s T o o l S t r i p M e n u I t e m _ C l i c k ( object se n d e r , EventArgs e ) { O p e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . L o a d F i l e ( o f . FileName ) ; }
5 6 7 8 9
private void mentésToolStripMenuItem_Click ( object se n d e r , EventArgs e ) { S a v e F i l e D i a l o g s f = new Sa v e F i l e D i a l o g ( ) ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . S a v e F i l e ( s f . FileName ) ; }
19.85. forráskód. Mentés és visszatöltés 19.86. ábra. Kiértékelés üzenetablak segítségével.
297
1 2 3
private int aSzam = 0 ; private bool P arosE ; private Random rnd = new Random ( ) ;
4 5 6 7 8
private void buttonGen_Click ( object s e n d e r , EventArgs e ) { aSzam = ( rnd . Next ( ) % 2 0 ) + 1 ; ParosE = ( ( aSzam % 2 ) == 0 ) ; labelSZAM . Text = " G e n e r á l á s ␣ k é s z " ; }
9 10 11 12 13 14 15 16 17
private void buttonParos_Click ( object s e n d e r , EventArgs e ) { i f ( ParosE && aSzam != 0 ) MessageBox . Show ( " J ó l ␣ t i p p e l t é l ␣ nagyon . ␣" , "Eredmény" , M essageBoxButtons .OK, MessageBoxIcon . I n f o r m a t i o n ) ; else M essageBox . Show ( " Rossz ␣ t i p p . ␣" , "Eredmény" , M essageBoxButtons .OK, MessageBoxIcon . Warning ) ; labelSZAM . Text = aSzam . T o S t r i n g ( ) ; }
19.87. forráskód. Deklarálás
19.88. ábra. Üzenetablak gombjai.
298
1 2 3 4 5 6 7 8 9 10 11 12 13
private void buttonKerdes_Click ( object s e n d e r , EventArgs e ) { i f ( MessageBox . Show ( " Süt ␣ k i n t ␣a␣nap␣ ? " , " Kérdés ␣ a b l a k . . . " , MessageBoxButtons . YesNo , MessageBoxIcon . Qu e st io n ) == D i a l o g R e s u l t . Yes ) { t h i s . BackColor = C o l o r . Green ; } else { t h i s . BackColor = C o l o r . Red ; } }
19.89. forráskód. Egy lehetséges megoldás.
J 19.37. feladat I [Adatbekérés modális form segítségével.] Írjon programot, mely bekér két egész számot külön külön egy adatbekérő modális form segítségével. Majd
3
kiszámolja a két szám számtani átlagát, amit kiír a főformra. A bekéréskor ügyeljen a kivételkezelésre! A programból való kilépéskor kérdezzen rá, hogy biztos ki akar-e lépni a felhasználó, és a válasznak megfelelően járjon el. 19.90. ábra. Modális form.
Segítség a megoldáshoz: Figyeljen oda, hogy az adatbekérés után publikus adatmezőbe kerüljön az adat, hogy át lehessen venni a másik formból. Ne felejtse el az adatbekérő formon a felrakott gombok DialogResult értékét beállítani. Alapértelmezése None. Az adatbekéréshez példányosítsuk a bekérő formot. A kilépésnél kezeljük a MessageBox Show metódusának a visszatérési értékét.
299
1 2 3 4 5 6 7
private void buttonBe1_Click ( object s e n d e r , EventArgs e ) { FormBeker frm = new FormBeker ( ) ; i f ( frm . ShowDialog ( ) == D i a l o g R e s u l t .OK) { SzamEgy = frm . BekertSzam ; l a b e l E l s o . Text = frm . BekertSzam . T oS t r i n g ( ) ; } }
8 9 10 11 12 13 14
private void FormMain_FormClosing ( object s e n d e r , FormClosingEventArgs e ) { i f ( MessageBox . Show ( " B i z t o s ␣ k i ␣ akar ␣ l é p n i ? " , " Kérdés " , MessageBoxButtons . OKCancel , MessageBoxIcon . Q u es ti o n ) == D i a l o g R e s u l t . Cancel ) { e . Cancel = true ; } }
19.91. forráskód. Egy lehetséges megoldás.
J 19.38. feladat I [Összetartozó adatok kezelése] Készítsen egy programot, mely-
5
ben egy kiscserkész csapat tagjainak adatait tudjuk nyilvántartani. A tagokról az azonosítójukat, a nevüket, és a születési dátumukat kell letárolni. Az adatbevitel egy modális form segítségével történjen. Az adatokat táblázatos formában jelenítsük meg. Tudjunk adatot menteni és visszatölteni fileból, a szokásos windows dialógus ablakok használatával. 19.92. ábra. Kiscserkészek adatai
Segítség a megoldáshoz: A feladat során több mindenre kell figyeljünk. Amit át kell tekinteni, a ListView kezelése, bináris file írása és olvasása, modális form használata, és adatforgalom a 300
formok között. Tekintsük először az adatbeviteli formot. Itt csak arra ügyeljünk, hogy az adatmezőket publikus láthatóságra állítsuk, hogy a FormMain osztályból is el lehessen érni. 1
// Az a d a t b e v i t e l i form
2 3 4 5 6 7
public p a r t i a l c l a s s FormAdat : Form { public string Beazon = "" ; public string Benev = "" ; public DateTime B e s z u l ;
8
public FormAdat ( ) { InitializeComponent ( ) ; }
9 10 11 12 13
private void buttonOK_Click ( object s e n d e r , EventArgs e ) { Beazon = textBoxAzon . Text ; Benev = textBoxNev . Text ; B e s z u l = dateTimePickerSzDatum . Value ; }
14 15 16 17 18 19 20
}
19.93. forráskód. Adatbeviteli form
Segítség a megoldáshoz: A FormMain osztály eseménykezelői kissé összetettebbek, mert itt végezzük el a feladatokat. J 19.39. feladat I [Memória] Írj memória játék programot. A következő beállításokat támogassa a program:
4
– hány szám legyen (6 vagy 9) – mennyi ideig látszódjanak (5, 10, vagy 20 mp) – hány jegyűek legyenek (1 vagy 2) Ha 6 db számot kell kitalálni, akkor 5/10 mp, ha 9 számot, akkor pedig 10/20 mp legyen a választható. A program a beállított paramétereknek megfelelően generáljon számokat és jelenítse meg azokat egy ideig, majd kérdezze vissza őket. A számok megjelenítéséhez és visszakérdezéséhez is modális ablakokat használjunk. A visszakérdezéskor csak annyi tippje lehessen a játékosnak, mint amennyi a kitalálandó számok darabszáma. Segítség a megoldáshoz: A labeleket dinamikusan rakja fel a formra, mivel nem tudni előre, hogy hány számot kell megjeleníteni. Segítség a megoldáshoz: Maximálisan annyi számot lehessen beírni, amennyit eredetileg kiválasztottunk megtekintésre.
301
1
// A f ő f o r m
2 3 4 5 6 7
public p a r t i a l c l a s s FormMain : Form { private string a zon = "" ; private string nev = "" ; private DateTime s z u l ;
8 9 10 11 12
public FormMain ( ) { InitializeComponent ( ) ; }
13 14 15 16 17
private void buttonZar_Click ( object s e n d e r , EventArgs e ) { Close ( ) ; }
18 19 20 21 22 23 24 25 26 27 28
private void FormMain_FormClosing ( object se n d e r , F ormClosingEventArgs e ) { i f ( MessageBox . Show ( "␣ B i z t o s ␣ k i l é p ? " , " Kérdés " , MessageBoxButtons . YesNo , MessageBoxIcon . Q ue st i on ) == D i a l o g R e s u l t . No) { e . Cancel = true ; } }
19.94. forráskód. A főform eseménykezelői, metódusai
19.10. Időzítés és üzenetek J 19.40. feladat I [Időzítés használata] Írj programot, mely a form közepén mutatja
2
a futó időt másodperc pontosan. Segítség a megoldáshoz: Az időzítés legegyszerűbben a Timer komponens segítségével oldhatjuk meg. Használjuk a Tick eseményt. Figyeljünk rá, hogy az időzítőt engedélyezni kell. Az alapértelmezett értéke false. J 19.41. feladat I [Form színe időzítve] Írj programot, mely 1 másodpercenként
1
megváltoztatja a form háttérszínét. Segítség a megoldáshoz: Egy lehetséges megoldás a színek ciklikus változtatására a maradékos osztás használata. J 19.42. feladat I [Új formok születése és halála] Írj programot, 2 másodpercenként megjelenít egy 20 másodpercig látható formot. Ezt 1 percig csinálja. Minden új form más más feliratot tartalmazzon.
302
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// K i v á l a s z t o t t a d a t m ó d o s í t á s a private void b uttonMod_Click ( object s e n d e r , EventArgs e ) { FormAdat frm = new FormAdat ( ) ; frm . textBoxAzon . Text = l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . Text ; frm . textBoxNev . Text = l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . SubItems [ 1 ] . Text ; DateTime d = new DateTime ( ) ; d = Convert . ToDateTime ( l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . SubItems [ 2 ] . Text ) ; frm . dateTimePickerSzDatum . Value = d ; i f ( frm . ShowDialog ( ) == D i a l o g R e s u l t .OK) { l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . Text = f rm . Beazon ; l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . SubItems [ 1 ] . Text = f rm . Benev ; l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . SubItems [ 2 ] . Text = f rm . B e s z u l . T o S h o r t D a t e S t r i n g ( ) ; } }
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
// B i n á r i s f i l e −b a mentés private void buttonSave_Click ( object s e n d e r , EventArgs e ) { S a v e F i l e D i a l o g s f = new Sa v e F i l e D i a l o g ( ) ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { Bi n a r y W r i t e r br = new B i n a r y W r i t e r ( F i l e . Open ( s f . FileName , FileMode . C r e a t e ) ) ; t ry { int i ; for ( i = 0 ; i < l i s t V i e w D a t a . Items . Count ; i ++) { b r . Write ( l i s t V i e w D a t a . Items [ i ] . Text ) ; b r . Write ( l i s t V i e w D a t a . Items [ i ] . SubItems [ 1 ] . Text ) ; b r . Write ( l i s t V i e w D a t a . Items [ i ] . SubItems [ 2 ] . Text ) ; } b r . Flush ( ) ; } catch { MessageBox . Show ( " Hiba ␣a␣ mentésben . " ) ; } finally { br . Close ( ) ; } } }
19.95. forráskód. A főform eseménykezelői, metódusai
303
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
// V i s s z a t ö l t é s b i n á r i s f i l e − b ó l private void b uttonOpen_Click ( object s e n d e r , EventArgs e ) { Op e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { string sa ; l i s t V i e w D a t a . Items . C l e a r ( ) ; BinaryReader br = new B inaryReader ( F i l e . Open ( o f . FileName , FileMode . Open ) ) ; t ry { i f ( F i l e . E x i s t s ( o f . FileName ) ) { long le n 1 = br . BaseStream . Length ; while ( br . BaseStream . P o s i t i o n < l e n 1 ) { a zon = br . R eadS tr ing ( ) ; nev = br . Re adString ( ) ; s a = br . Re ad String ( ) ; L istVie wItem l i = new ListViewItem ( azon , 0 ) ; l i . SubItems . Add( nev ) ; l i . SubItems . Add( s a ) ; li s t V i e w D a t a . Items . Add( l i ) ; } } } catch { } finally { br . Close ( ) ; } } }
35 36 37 38 39 40
// Sor t ö r l é s e private void buttonDel_Click ( object s e n d e r , EventArgs e ) { l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . Remove ( ) ; }
19.96. forráskód. A főform eseménykezelői, metódusai
Segítség a megoldáshoz: Több timerre is szükségünk lesz mind a főformon, ami méri a 2 másodperceket, mind a létrejövő formokon, ami a 20 másodpercekért felel. A főformon az 1 percet is figyelni kell. J 19.43. feladat I [Keringő form] Írjon programot, mely egy formot mozgat a képer-
2
nyőn körbe, 1 másodperces időközzel lépkedve. A mozgás 2 percig menjen az indítástól. Használj felsorolás típust a mozgás irányának tárolásához. Segítség a megoldáshoz:
Az éppen aktuális irány tárolásához hozzunk létre egy felsorolás
304
19.97. ábra. Kezdő ablak
19.98. ábra. További megjelenő formok
típust (Jobbra,Le,Balra,Fel). Segítség a megoldáshoz: Az aktuális állapot alapján mindig tudhatjuk, hogy merre kell mozgatni a form-ot, és melyik lesz a következő irány, ha elértük a képernyő megfelelő szélét. Figyeljünk arra, hogy mivel fix nagyságú lépéseket teszünk, nem biztos, hogy pontosan a képernyő széléhez ér az ablak majd a mozgás végén, ezért igazítsuk be (ne lógjon ki és ne is maradjon rés).
305
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
private void B T_Indulhat_Click ( object s e n d e r , EventArgs e ) { int db = (RB_szam6 . Checked ) ? 6 : 9 ; Frm_Szamok frm_Szamok = new Frm_Szamok ( db , ( CB_Egyjegyu . Checked ) ? 1 : 2 , RB_mp5. Checked ? 5 : RB_mp10 . Checked ? 10 : 2 0 ) ; frm_Szamok . ShowDialog ( ) ; Frm_Memoria frm_Memoria = new Frm_Memoria ( db ) ; frm_Memoria . ShowDialog ( ) ; int j o V a l a s z = 0 ; foreach ( int i i n frm_Memoria . t i p p e k ) { i f ( frm_Szamok . szamok . C on t ai ns ( i ) ) { j o V a l a s z ++; } } MessageBox . Show ( S t r i n g . Format ( "A␣ j ó ␣ v á l a s z o k ␣ száma : ␣ {0} " , j o V a l a s z ) ) ; }
19.99. forráskód. Játék indítása és kiértékelése 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
private void La b e l e k K i r a k ( i nt db , i nt s zamjegy ) { Random v e l e t l e n = new Random ( ) ; int m e r e t S z e l e s s e g = ( p a n e l 1 . Width − 4 0 ) / 3 ; int meretMagassag = 200 / ( db / 3 ) ; szamok = new Li s t (db ) ; int min , max ; i f ( szamjegy == 1 ) { min = 1 ; max = 9 ; } else { min = 1 0 ; max = 9 9 ; } fo r ( int i = 0 ; i < db ; i ++) { Label u j L a b e l = new L ab el ( ) ; int x = i % 3 , y = i / 3 ; u j L a b e l . L o c a t i o n = new P oint ( x ∗ ( m e r e t S z e l e s s e g + 1 0 ) + 1 0 , y ∗ ( meretMagassag + 1 0 ) + 1 0 ) ; u j L a b e l . S i z e = new S i z e ( m e r e t S z e l e s s e g , meretMagassag ) ; u j L a b e l . Font = new Font ( Font . FontFamily , 1 6 ) ; u j L a b e l . TextAlign = ContentAlignment . MiddleCenter ; u j L a b e l . BackColor = C o l o r . Red ; int ujSzam ; do { ujSzam = v e l e t l e n . Next (max − min + 1 ) + min ; } w hile ( szamok . Co nt a in s ( ujSzam ) ) ; szamok . Add( ujSzam ) ; u j L a b e l . Text = ujSzam . T o S t r i n g ( ) ; p a n e l 1 . C o n t r o l s . Add( u j L a b e l ) ; } }
19.100. forráskód. Számok megjelenítése
306
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
private void BT_Hozzaad_Click ( object s e n d e r , EventArgs e ) { i f ( ! l i s t B o x 1 . Items . C o nt ai n s (TB_Szam . Text ) ) { int temp ; i f ( int . TryParse (TB_Szam . Text , out temp ) ) { l i s t B o x 1 . Items . Add(TB_Szam . Text ) ; t i p p e k . Add( temp ) ; } } TB_Szam . Text = S t r i n g . Empty ; TB_Szam . Focus ( ) ; i f (maxDb == l i s t B o x 1 . Items . Count ) { TB_Szam . Enabled = BT_Hozzaad . Enabled = f a l s e ; } }
19.101. forráskód. Tipp hozzáadása 19.102. ábra. Időzítés használata
J 19.44. feladat I [TiliToli játék] Írjon pogramot, mely megvalósítja a TiliToli játékot.
3
Közben valósítsa meg az időmérést is. Segítség a megoldáshoz: A játék lemezkéit egy-egy dinamikusan létrehozott label komponens valósítsa meg. Az újonnan létrehozott labeleket tároljuk el egy kétdimenziós tömbben, és mindegyikéhez ugyanazt az eseménykezelőt rendeljük. A közös metódus a sender objektumban utazó label pozíciójából „találja ki”, hogy ő melyik a rácsban. Ha a lyuk melletti lemezre kattintunk, akkor az cseréljen helyet a lyukkal. Készítsünk függvényt, ami a labelek feliratából és helyes sorrendjéből meghatározza, hogy jó-e az elrendezés. 307
1 2 3 4
namespace timer_1 { public p a r t i a l cl a s s Form1 : Form {
5
public Form1 ( ) { InitializeComponent ( ) ; ti m e r 1 . Enabled = true ; }
6 7 8 9 10 11
private void t imer1_Tick ( object s e n d e r , EventArgs e ) { l a b e l I d o . Text = DateTime . Now . ToLongTimeString ( ) ; }
12 13 14 15
}
16 17
}
19.103. forráskód. Időzítés használata
1 2 3 4 5 6 7 8
namespace i d o z i t _ 2 { public p a r t i a l cl a s s Form1 : Form { int in d = 0 ; Co l o r [ ] s z i n e k = new C o l o r [ 5 ] { C o l o r . White , C o l o r . Blue , C o l o r . Beige , Co l o r . Black , C o l o r . DarkSeaGreen } ;
9
public Form1 ( ) { InitializeComponent ( ) ; }
10 11 12 13 14
private void Form1_Load ( object s e n d e r , EventArgs e ) { ti m e r 1 . I n t e r v a l = 1 0 0 0 ; ti m e r 1 . Enabled = true ; }
15 16 17 18 19 20
private void t imer1_Tick ( object s e n d e r , EventArgs e ) { th i s . BackColor = s z i n e k [ i n d % 5 ] ; in d++; }
21 22 23 24 25
}
26 27
}
19.104. forráskód. Időzítés használata
308
19.105. ábra. Új formok születése és halála
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
DateTime k e z d i d o = new DateTime ( ) ; i nt x , y ; TimeSpan e l t e l t ; private void button1_Click ( object s e n d e r , EventArgs e ) { t i m e r 1 . Enabled = true ; timer1 . I n t e r v a l = 2000; k e z d i d o = DateTime . Now ; } private void timer1_Tick ( o bject s e n d e r , EventArgs e ) { e l t e l t = DateTime . Now − k e z d i d o ; i f ( e l t e l t . Seconds > 6 0 ) t h i s . C l o s e ( ) ; Form2 frm = new Form2 ( ) ; frm . l a b e l 1 . Text = DateTime . Now . ToLongTimeString ( ) ; frm . x = x % 8 0 0 ; frm . y = y % 6 0 0 ; frm . Show ( ) ; x += 1 0 0 ; y += 1 0 0 ; } }
19.106. forráskód. A vezérlés a főformon
1 2 3 4 5 6 7
private void Form2_Load ( o bject s e n d e r , EventArgs e ) { t i m e r 1 . Enabled = true ; } private void timer1_Tick ( o bject s e n d e r , EventArgs e ) { this . Close ( ) ; } private void Form2_Shown ( o bject s e n d e r , EventArgs e ) { t h i s . Top = y ; this . Left = x ; }
19.107. forráskód. A megjelenő formok
309
19.108. ábra. Körbe fut a képernyőn
1 2 3 4 5 6 7 8
namespace Korbefut { enum Ir a n y o k { Jobbra , Le , Balra , Fe l } }
19.109. forráskód. Felsorolás típus létrehozása
310
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
private void timer_Tick ( o bject s e n d e r , EventArgs e ) { l a b e l . Text = S t r i n g . Format ( " {0} ␣mp" , s t o p p e r . Elapsed . T o t a l S e c o n d s ) ; i f ( s t o p p e r . Elapsed . T o t a l S e c o n d s >= 1 2 0 ) { t i m e r . Enabled = f a l s e ; s t o p p e r . Stop ( ) ; L e f t = ( S c r e e n . PrimaryScreen . Bounds . Width − Width ) / 2 ; Top = ( S c r e e n . PrimaryScreen . Bounds . Height − Height ) / 2 ; return ; } switch ( i r a n y ) { case Ir a n y o k . Jobbra : i f ( L e f t + l e p e s < S c r e e n . PrimaryScreen . Bounds . Width − Width ) L e f t += l e p e s ; else { L e f t = S c r e e n . PrimaryScreen . Bounds . Width − Width ; i r a n y = I r a n y o k . Le ; } break ; case Ir a n y o k . Le : i f (Top + l e p e s <S c r e e n . PrimaryScreen . Bounds . Height − H eight ) Top += l e p e s ; else { Top = S c r e e n . PrimaryScreen . Bounds . Height − Height ; irany = Iranyok . Balra ; } break ; case Ir a n y o k . B a l r a : if ( Left − l e p e s > 0) L e f t −= l e p e s ; else { Left = 0; irany = Iranyok . Fel ; } break ; case Ir a n y o k . F e l : i f (Top − l e p e s > 0 ) Top −= l e p e s ; else { Top = 0 ; i r a n y = I r a n y o k . Jobbra ; } break ; } }
19.110. forráskód. Feladat megoldása
311
19.111. ábra. TiliToli játék
312
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
void u j L a b e l _ C l i c k ( o bject s e n d e r , EventArgs e ) { i f ( ! t i m e r . Enabled ) { t i m e r . Enabled = true ; } Label kep = ( s e n d e r as L ab el ) ; int i = kep . L e f t / meret ; int j = kep . Top / meret ; i f ( i > 0 && l a b e l e k [ i − 1 , j ] == n ull ) { Cse re ( i , j , i − 1 , j ) ; } else i f ( i < N − 1 && l a b e l e k [ i + 1 , j ] == null ) { Cs er e ( i , j , i + 1 , j ) ; } else i f ( j > 0 && l a b e l e k [ i , j − 1 ] == null ) { Cse re ( i , j , i , j − 1 ) ; } else i f ( j < N − 1 && l a b e l e k [ i , j + 1 ] == null ) { Cs ere ( i , j , i , j + 1 ) ; } i f ( MindegyikJoHelyen ( ) ) { t i m e r . Enabled = f a l s e ; M essageBox . Show ( " G r a t u l á l o k , ␣ k é s z ! ␣ {0} " , Lb_Ido . Text ) ; } }
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
private bool MindegyikJoHelyen ( ) { bool j o = true ; fo r ( int db = 0 ; ( db < N ∗ N) && j o ; db++) { int i = db % N; int j = db / N; i f ( l a b e l e k [ i , j ] != n ull ) { j o = Convert . ToInt32 ( l a b e l e k [ i , j ] . Text ) == ( db + 1 ) ; } } return j o ; }
19.112. forráskód. A kérdéses metódusok
313
20. Grafikai feladatok (szerző: Kovács Emőd) 20.1. Grafikai feladatok J 20.1. feladat I [Kör rajzolása] Készítsünk programot, mely az alább ismertetett MidpointKor és Korpontok metódusok felhasználásával köröket rajzol a képernyőre. A rajzolt kör minden esetben az egérrel
4
való kattintás helyén jelenjen meg 50 pixelnyi sugárral. Segítség a megoldáshoz: Az egér koordinátái a MouseEventArgs e változóból olvasható ki a MouseUp form eseményben. A 20.12 forrásszövegben láthatjuk, hogy a Bx és a By statikus változók. (static int Bx,By;) A rajzolást a Form1_Paint eseményben kell meghívni. A MouseUp eseményben a Refresh hívással aktivizálhatjuk a Form1_Paint metódust. Ez törli az előzőleg kirajzolt felületet, majd kirajzolja az új kört. A feladat továbbfejlesztéseként alakítsuk át a programot úgy, hogy az egérrel megadhatjuk a kör átmérőjét (lásd: 20.23). J 20.2. feladat I [Bezier görbe] Készítsünk WinForm programot, amely egy tetszőlegesen változtatható formájú Bezier görbét rajzol a képernyőre!
4
Segítség a megoldáshoz: Deklaráljuk, és kezdőértéket adunk a később felhasználandó segédváltozóknak. A bool típusú nyom változó, azt figyeli, hogy lenyomtuk-e már az egér gombját, azaz megadtuk-e már, hogy hol legyen a görbénk első pontja. Ha ezt nem tennénk meg, akkor a Form-unkra kirajzolódna egy vonal, ami a (0,0) koordinátából indul ki, és a kattintásunk helye a végpontjának a koordinátái. A következő változó, amelynek a neve max, a Form-ra kitehető maximális pontok számát jelenti. Aztán egy Point típusú mezők tárolására alkalmas tömböt hozunk létre. Most kell felhasználnunk a max változót, hisz meg kell adnunk, hogy milyen hossza legyen a tömbnek. Felmerülhet a kérdés, hogy miért nem használunk ArrayList-et, mivel akkor nem kellene a max változó sem, és az Add metódusa Object típust vár, tehát Point-ot is tehetnénk bele. Ez igaz, de, mikor az ArrayList-ben lévő elemeknek értéket próbálnánk adni (konkrétan a MouseMove eseményben) a fordító hibát jelezne a típuskényszerítés miatt. Majd jön az n változó, ebben a Form-ra kirakott pontok számát tartjuk nyilván, ez kezdetben 0. A mozgat a kontroll poligon pontjainak mozgatásához szükséges, illetve még szükségünk van egy Graphics típusú változóra is, deklarációját ezért raktuk ide, és nem a Paint eseménybe (lásd: 20.34 forrásszöveg). A programot elindítva, a vezérlők (a két nyomógomb, illetve két checkbox) megjelennek, meghívódik a Paint esemény, g itt megkapja az értékét, de az n értéke még mindig 0 (lásd: 20.45) Ezután, ha kattintunk, két esemény is meghívódik egymás után: a MouseDown(lenyomtuk az egér gombját), és a MouseUp(felengedtük) Ez a MouseDown esemény törzse. Az egérgomb lenyomása után, három dologra kell ügyelni. Az első, hogy kattintottunk-e egy pontra törlési céllal, illetve kattintás után nyomva tartjuk314
e a bal gombot, mivel ekkor pontot át akarjuk helyezni, vagy kattintottunk-e egy helyre a Form-on, és ide új pontot szeretnénk felvenni Először is megvizsgáljuk, hogy a checkBox2 be van-e jelölve. Ha igen, akkor törölni akarunk. Egy while-ciklussal végigmegyünk a Pontok tömbön, és megnézzük, hogy melyik pontra kattintottak. Ha megtaláltuk, meghívjuk a TorolPont metódust, átadva azt az indexet, ahol megtaláltuk a pontot. A mozgat változónak mindezek mellett adnunk kell valamilyen értéket, hogy az ne legyen -1, és ezáltal ne lépjünk be a pontlétrehozó feltételbe. A TorolPont metódus működésére még visszatérünk, egyelőre folytassuk a munkát az esemény vizsgálatával. Ha tehát nincs bejelölve a checkBox2, de mégis valamelyik pontra kattintottunk, akkor nagy a valószínűsége, hogy ezt mozgatni akarjuk. Mindössze annyi a dolgunk, hogy megkeressük azt a pontot, amire kattintottak, és az indexét értékül adjuk a mozgat változónak, amelyet aztán felhasználunk a MouseMove eseményben. Ha a fentiek közül egyik sem teljesült, akkor egy új pontot akarunk létrehozni. Megnézzük rakhatunk-e még le pontot, ha igen akkor n értékét (amiben a pontokat számoljuk) növeljük eggyel, és mivel ezen indexű helyen a tömbünkben még nincs érték, arra a helyre beállítjuk az X, és Y koordinátákat, úgy, hogy értékül adjuk nekik az egér azon pozícióját, mellyel bal gombjának lenyomásakor rendelkezett. Mivel már lenyomták az egér gombját, a nyom-ot true-ra állítjuk, és meghívjuk a Refresht, ami a Paint eseményt fogja újra végrehajtani. Az n értéke nagyobb, mint 0, így a Gorbe, és a PontKi metódusok végrehajtódnak. Mielőtt ezekre rátérnénk, térjünk vissza a TorolPont metódusra, és MouseMove eseményre. Kezdjük a TorolPont-al . A metódus paraméterében megkapja azt az indexet, ahol a törlendő pont van (ez az i). Majd következik egy ciklus, ami ettől az i-től kezdve végigmegy a tömb elemein, és minden egyes értékhez az azt következőt rendeli, vagyis a törlendőt fölülírtuk az azt következővel, az azt következőt, az őt követővel, és így tovább. Az n értékét csökkenteni kell, mivel pontok száma csökkent, majd, ha még maradt pontunk, az új értékekkel újrarajzoljuk a görbét, ehhez ismét kell egy Refresh, hogy lássuk a változásokat. A MouseMove eseményben megvizsgáljuk, hogy a mozgat értéke megváltozott-e. Ha igen, akkor pontosan azaz index az értéke, amely pontot mozgatni akarunk. Ezen index által meghatározott tömbérték X, és Y koordinátáit beállítjuk az egér aktuális pozíciójára, frissítünk, és újrarajzoljuk a görbét, hogy menet közben lássuk a változásokat. Van még egy egérművelettel kapcsolatos esemény, amiről eddig nem beszéltünk, ez a MouseUp (lásd: 20.1 forrásszöveg). A metódus a mozgat értékét visszaállítja 1-re (alaphelyzetbe), mivel lehetséges, hogy az egérgomb lenyomása során, (ha mozgattunk, vagy töröltünk) az értéke megváltozott. Mielőtt nekifutnánk a Gorbe metódusnak, nézzük meg, hogyan működik a törlés. A törlést egy gomb vezérli (aminek neve torlesButton). Ha erre a gombra kattintunk akkor az egy Click eseményt hoz létre. Elindul a TorolPont eljárás, az n értékét 0-ra állítja (ha törlünk mindent, nem marad több pont). A 20.2 forrásszövegben nézzük meg azt is, hogyan néz ki a TorolPont metódus, amely létrehoz egy új Rectangle-t, ami olyan széles, és magas, mint a Form, és a 0,0 koordinátából
315
indul ki, és ezt a Rectangle-t kifeszíti a képernyőre. Az eljárással igazság szerint nem a Form felületén lévő objektumokat töröltük, hanem a háttérszínnel lefestettük a felületét. A kontroll polinom vonalainak, és a pontoknak a rajzolását a Vonal, és a PontKi eljárással valósítjuk meg. Mindkettő egyszerűen egy helyben deklarált Pen segítségével a g grafikus metódusait használja. A Vonal rajzolásához a Drawline paramétereként meg kell adnunk az előbb létrehozott Pent, valamint, hogy honnan hova akarjuk a vonalat kirajzolni, azaz két pont x, és y koordinátáját. Ezeket a koordinátákat a Pontok i-edik elemének X és Y metódusainak meghívásával kapjuk (lásd: 20.3 forrásszöveg). A PontKi a paraméterként kapott i-edik pontot fogja kirajzolni a Drawrectangle metódus révén,ami egy négyszöget rajzol a képernyőre. Paraméterben meg kell adnunk, hogy mely x, és y koordinátára akarjuk kirajzoltatni, valamint, hogy milyen széles (Width), és magas (Height) legyen. Esetünkben 4-4 pixel. A görbe kirajzolását (lásd: 20.4) a Gorbe metódus végzi. Minden alkalommal, amikor pontot rajzolunk ki, vagy törlünk ezt hívjuk meg a háttérben. A metódus a Bezi segédmetódussal, ami a matematikai háttere a görbe rajzolásának, számoltat ki egy pontot. A 20.5 alapján először két pontra lesz szükségünk ezeket „ide”, és „oda” névvel illetjük, és a szakasz első és utolsó végpontját reprezentálják. Szükség van továbbá egy double típusú változóra (ez tartalmazza a lépésközöket), és természetesen a Pen eszközre a rajzoláshoz. A segédváltozóval a 0-tól indulunk, és amíg el nem érjük az 1-et 0.01-es lépésközökkel vonalakat rajzoltatunk a Drawline metódussal. Ezek a vonalak az „ide” ponttól az „oda” pontig tartanak, ha a „nyom” globális változó értéke igaz, azaz már van kirakva pont. Az „ide” minden kezdésnél az előző végpont lesz („oda”), míg az „oda” értékét a Bezi segédmetódus számolja ki. Ha az „i” értéke elérte az egyet, az azt jelenti, hogy már majdnem elértük a görbével a végpontot (megközelítettük). Ekkor rajzolunk egy vonalat, de most úgy, hogy a kezdőpont az eddig meghúzott vonal végpontja (ahogy ezt eddig is tettük), de a végpont a Pontok tömb utolsó eleme lesz. Ez a részlet garantálja, hogy a vonal pontosan a kezdőpontból a végpontig tartson. Ha a checkBox1 be van jelölve, vagyis kontroll polinomot kell rajzolni, és persze már „nyom” változó értéke true vagyis van kirakva pont, akkor meghívja a Vonal eljárást, majd a Pontok tömb összes elemét (pontokat) a PontKi eljárással kirajzolja. A matematikai hátteret a Bezier algoritmus szolgáltatja. A Bezi segédmetódus ezt valósítja meg. Visszatérési értéke egy Pont típusú változó. Egy double paramétert vár (lásd 20.6, 20.7, 20.8 forrásszövegek), és meghívja a Bez_Suly metódust a paraméterként kapott értékkel. J 20.3. feladat I [Szakasz lehatárolása] Készítsük el a klasszikus szakasz lehatároló programot, mely hasonlóan működik, mint a legtöbb rajzoló program kivágás (cut) művelete. A lehatárolást az egér kattintás hatására végezzük el a kijelölés mentén.
4
Segítség a megoldáshoz: A feladat megoldásához segítséget találunk a 20.9 forráskódban. A pixelek kirajzolásának módját a 20.10, a szakasz lehatárolását a 20.11, a midpoint szakaszok rajzolását a 20.13 forráskódban találjuk meg.
316
A 20.3 feladat szövege alapján, a Form1_Paint eseményben rajzoljunk egy tetszőleges vonalat a MidPoint metódus segítségével (piros színnel), majd tároljuk el koordinátákat. Rajzoljunk egy rectangle-t tetszőleges C# metódus segítségével, zöld színnel úgy, hogy az lehetőleg fedésen legyen a szakasszal! (pl.: drawRectangle) Fontos kérdések a program futásával kapcsolatban: A vágás sikeres-e? - Milyen módon ábrázolja a program a vágás eredményét? A kérdések megválaszolását a tisztelt Olvasóra bízzuk. J 20.4. feladat I [A DDA szakaszrajzoló] Készítsük el az ismert DDA szakaszrajzoló algoritmus programját. A DDA metódus két pont közé rajzol vonalat. A két pont x és y koordinátáit paraméterben kapja, valamit egy PaintEventArgs és egy Color típusú
4
változót. Segítség a megoldáshoz: A DDA pontokból, azaz pixelekből rajzolja ki a vonalat (lásd: 20.15). A KoordintaRendszer a paraméterben kapott színnel DDA segítségével rajzol egy kis méretű koordináta-rendszert beosztásokkal együtt (lásd: 20.16). A Diagram metódus a DDA-val rajzolja ki a diagramokat, azaz a diagram oszlopának 3 vonalát. Az oszlop bal felső sarkának x, és y koordinátáját paraméterben kapja, valamint azt is, hogy milyen színnel rajzoljon. A 20.17 forrásszöveg alapján a Form Paint metódusában hívjuk meg az előbb említett függvényeket, így kapunk egy koordináta-rendszert, valamint a paraméterezésnek megfelelő oszlopdiagramo(ka)t, ahogy ezt a 20.18 forrásszövegben láthatjuk. J 20.5. feladat I [Képek átméretezése] Készítsünk a mindennapi gyakorlatban is jól használható programot, amely JPG formátumú képek csoportos átméretezését valósítja meg egységes formátum alapján (lásd: 20.19).
3
Segítség a megoldáshoz: A 20.20 forrásszövegben a fix méretre történő átméretezést láthatjuk a maradék részek kitöltésével. Amennyiben arányosítva szeretnénk átméretezni a képeket, használhatjuk a 20.21 forrásszövegben található metódust. A méretezni kívánt képek helyét meg kell adni, amely eljáráshoz a 20.22 forrásszövegben látható programrészlet vehetjük alapul. A kép megnyitása a 20.24, a konvertálás a 20.25, valamint a 20.26 forrásszövegekben látható módon történhet. A konvertálás befejeztével ne felejtsük el felszabadítani az erőforrásokat, amelyeket a program felhasznált a futása során (lásd: 20.27). J 20.6. feladat I [Hermit görbe rajzolása] Készítsünk olyan ablakos alkalmazást, amely egy Hermit görbét rajzol a képernyőre.
4
Segítség a megoldáshoz: Szükségünk lesz számos változóra a program készítése során. Ahogy azt a 20.28 forrásszövegben láthatjuk, a maxp konstans a maximális pontok számát tartalmazza. A „pontmozg” az éppen mozgatott pontot tárolja. A szak2 egy pontokból álló tömb, amely maxp + 1 darab pontot tartalmaz. Az aktp az éppen aktuális pont sorszáma. Kell még 8 pont a segédvonalak, érintő, és a görbe kirajzolásához, valamint deklarálnunk kell egy Graphics típusú változót. A megoldáshoz használjuk a 20.28 forrásszövegben található Bezier algoritmusunkat is. A 20.29 forrásszövegben a hermithatarok metódus paraméterének át 317
kell adnunk két int-et, ami ezekhez számolja ki és állítja be a hozzájuk tartozó Point típusú érintőket. A paraméterben kapott számok a szak Point típusú tömb valahányadik elemének a számai. A 20.30 forrásszövegben található hermiteu3 metódus paraméterben vár 4 pontot, és egy double típusú változót, és az ismert matematikai képlet alapján számolja ki egy pont koordinátáit, amit vissza is ad. A 20.31 forrásszövegben bemutatott erintorajz 4 ponthoz rajzol érintőt. A pontokat paraméterben kapja. A hermitrajz (lásd: 20.32) paraméterében azt a színt kell megadni, amellyel ki akarjuk rajzolni a görbét. A polirajz2 poliszin paraméterként kapott színnel dolgozik. Ha bejelöltük, akkor meghívja a hermitrajz függvényt, ami a Hermit görbét rajzolja ki. Paraméterként a fekete színt adja át neki. Illetve ha be van jelölve akkor a bezier görbét is kirajzolja a matematikai képlet alapján (lásd 20.33, és 20.35 forrásszövegek). A pontjelolo paraméterében kapott Point típusú elemekből álló tömb összes elemét rajzolja ki a pontaszin színnel, valamint erintoszin színnel a szak tömb szomszédos pontjait összekötő szakaszokat. A pontjel a paraméterben kapott tömb paraméterként kapott helyen álló elemét (egy pontot) rajzol ki. A paraméter nélküli poliujra függvény a képernyőtörlés után újrarajzolja a polinomot, valamit visszaállítja a pontok alapértékeit. A segedvonal függvény a polinomunkhoz rajzolja ki a segédvonalakat (lásd: 20.39, 20.37, 20.38). Ez a metódus paraméterként kapja a szak Point tömböt, és egy int-et, amely megmutatja, hogy hányadik ponthoz rajzoljon vonalat, valamint egy színt, hogy a pontot milyen színnel rajzolja ki (lásd: 20.36). A rajz alapjainak elkészítését a paraméter nélküli initrajz függvény végzi (lásd: 20.41). Meghívni a Form indításakor kell és előre deklarált változókat állít be. A Form Paint eseménye az előre deklarált Graphics típusú változónknak ad értéket, majd meghívja a pontjelölő2 függvényt,paraméterként átadja a szak Point-okat tartalmazó tömböt, így az kirajzolhatja a pontokat, majd meghívja a polirajz függvényt, paraméterben egy színnel, ami a polinom színe (lásd: 20.42, 20.43, és 20.44 forrásszövegek). Ha az egér gombját felengedjük a pontmozg változónk érékét -1-re állítjuk, és újrarajzoltatjuk a polinomot a poliujra metódussal (lásd: 20.46 forrásszöveg). A további Form-on lévő objektumokhoz rendelt metódusokat a 20.47 forrásszövegben találjuk. A button1 megnyomásakor a program befejezi a futását, a Form1_Load esemény meghívja az initrajz függvényt, azaz elkészíti a görbe alapjait. Ha a checkBox2 megváltozik frissítünk, és a numericUpDown J 20.7. feladat I [Ellipszis rajzolása] Készítsünk olyan rajzoló programot, amely az egérrel kijelölt befoglaló keretbe ellipsziseket rajzol. A rajzoláshoz használhatjuk a C# beépített metódusát, vagy készíthetünk egyet magunk is.
3
J 20.8. feladat I [Rajzprogram] Készítsünk a Paint alkalmazás mintájára rajzoló programot, amelyben az egér segítségével lehet rajzolni, szakaszokat húzni pontok
3
között, valamint területeket színezni.
20.2. A fejezet forráskódjai 1. 20.3. A fejezet forráskódjai 2.
318
1 2 3 4
private void Form1_MouseUp ( object s e n d e r , MouseEventArgs e ) { mozgat = −1; }
20.1. forráskód
1 2 3 4 5 6 7 8
private void TorolPont ( ) { R e c t a n g l e r e c t = new Re c t a n g l e ( t h i s . C l i e n t R e c t a n g l e . L e f t , t h i s . C l i e n t R e c t a n g l e . Top , t h i s . C l i e n t R e c t a n g l e . Width , t h i s . C l i e n t R e c t a n g l e . Height ) ; t his . RectangleToScreen ( r e c t ) ; }
20.2. forráskód
1 2 3 4 5 6 7 8 9
private void V onal ( ) { Pen p = new Pen ( C o l o r . Black ) ; fo r ( int i = 1 ; i < n ; i ++) g . DrawLine ( p , Pontok [ i Pontok [ i Pontok [ i Pontok [ i }
] . X, ] . Y, + 1 ] . X, + 1 ] .Y) ;
20.3. forráskód
1 2 3 4 5 6 7 8 9 10
private void PontKi ( int i ) { Pen p = new Pen ( C o l o r . Blue ) ; try { g . DrawRectangle ( p , P ontok [ i ] . X − 2 , P ontok [ i ] . Y − 2 , 4 , 4 ) ; } }
20.4. forráskód
319
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
private void Gorbe ( ) { Point i d e , oda ; double i = 0 ; Pen p = new Pen ( C o l o r . Red ) ; oda = Pontok [ 1 ] ; while ( i <= 1 ) { i d e = oda ; o da = B e z i ( i ) ; i f (nyom == true ) g . DrawLine ( p , i d e . X, i d e . Y, oda . X, oda .Y ) ; i += 0 . 0 1 ; } i d e=oda ; oda=Pontok [ n ] ; g . DrawLine ( p , i d e . X, i d e . Y, oda . X, oda .Y ) ; i f ( checkBox1 . Checked&&nyom==true ) Vonal ( ) ; fo r ( int j =1; j
20.5. forráskód
1 2 3 4 5 6 7 8 9 10 11
private Poin t B e z i ( double t ) { double x = 0 , y = 0 , b = 0 ; fo r ( int i = 0 ; i < n ; i ++) { b = Bez_Suly ( i , n − 1 , t ) ; x = ( x + Pontok [ i + 1 ] . X ∗ b ) ; y = ( y + Pontok [ i + 1 ] . Y ∗ b ) ; } return new Point ( ( i nt ) x , ( i nt ) y ) ; }
20.6. forráskód
1 2 3 4 5 6 7
private double Bez_Suly ( i nt i , i nt n , double t ) { double temp = N_alatt_I ( n , i ) ; fo r ( int j = 1 ; j <= i ; j ++) temp ∗= t ; fo r ( int j = 1 ; j <= n − 1 ; j ++) temp ∗= ( 1 − t ) ; return temp ; }
20.7. forráskód
320
1 2 3 4 5 6
private int Faktor ( int n) { int tmp = 1 ; fo r ( int i = 2 ; i <= n ; i ++) tmp ∗= i ; return tmp ; }
7 8 9 10 11
private int N _alatt_I ( i nt n , i nt i ) { return Faktor ( n ) / ( Faktor ( i ) ∗ Faktor ( n − i ) ) ; }
20.8. forráskód
321
1 2 3 4 5 6
using using using using using using
System ; System . Drawing ; System . C o l l e c t i o n s ; System . ComponentModel ; System . Windows . Forms ; System . Data ;
7 8 9 10 11 12 13 14 15
namespace L e h a t a r o l a s { / / / <summary> / / / Summary d e s c r i p t i o n f o r Form1 . / / / public c l a s s Form1 : System . Windows . Forms . Form { p rivate System . ComponentModel . I C o n t a i n e r components ;
16
p ublic Form1 ( ) { // // R e q u i r e d f o r Windows Form D e s i g n e r s u p p o r t // In i t i a l i z e C o m p o n e n t ( ) ;
17 18 19 20 21 22 23
// // TODO: Add any c o n s t r u c t o r code a f t e r I n i t i a l i z e C o m p o n e n t c //
24 25 26
}
27 28
// / <summary> // / Clean up any r e s o u r c e s b e i n g used . // / protected override void D i s p o s e ( b ool d i s p o s i n g ) { i f ( disposing ) { i f ( components != null ) { components . D i s p o s e ( ) ; } } base . D i s p o s e ( d i s p o s i n g ) ; }
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#r e g i o n Windows Form D e s i g n e r g e n e r a t e d code // / <summary> // / R e q u i r e d method f o r D e s i g n e r s u p p o r t − do not modify // / t h e c o n t e n t s o f t h i s method w i t h t h e code e d i t o r . // /
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
///
p rivate void In i t i a l i z e C o m p o n e n t ( ) { th i s . components = new System . ComponentModel . C o n t a i n e r ( ) ; th i s . t i m e r 1 = new System . Windows . Forms . Timer ( t h i s . components ) ; th i s . mainMenu1 = new System . Windows . Forms . MainMenu ( ) ; th i s . menuItem1 = new System . Windows . Forms . MenuItem ( ) ; th i s . menuItem2 = new System . Windows . Forms . MenuItem ( ) ; th i s . menuItem3 = new System . Windows . Forms . MenuItem ( ) ; th i s . menuItem4 = new System . Windows . Forms . MenuItem ( ) ; // // t i m e r 1 322 // th i s . t i m e r 1 . I n t e r v a l = 1 0 0 0 ; th i s . t i m e r 1 . Tick += new System . EventHandler ( t h i s . timer1_Tick ) ;
1
drawPixel ( )
20.10. forráskód
1
CohenSutherlandLineClipAndDraw ( )
20.11. forráskód
1 2
Bx=e .X; By=e .Y;
20.12. forráskód
1
MidPoint ( )
20.13. forráskód
1
G r aphics G=e . Graphics ;
20.14. forráskód
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public void dda ( int x1 , i nt y1 , i nt x2 , i nt y2 , PaintEventArgs p , C o l o r c ) { Graph ics Gf = p . Graphics ; Bitmap P i x e l = new Bitmap ( 1 , 1 ) ; Pixel . SetPixel (0 , 0 , c ) ; int h o s s z ; f l o a t x , y , xn , yn ; h o s s z = Math . Abs ( x2−x1 ) ; i f ( h o s s z < Math . Abs ( y2 − y1 ) ) { h o s s z = Math . Abs ( y2−y1 ) ; } xn = ( f l o a t ) ( x2 − x1 ) / h o s s z ; yn = ( f l o a t ) ( y2 − y1 ) / h o s s z ; x = x1 ; y = y1 ; fo r ( int i = 1 ; i < h o s s z + 1 ; i ++) { Gf . DrawImage ( P i x e l , x , y ) ; x = x + xn ; y = y + yn ; } }
20.15. forráskód
323
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
private void KoordinataRendszer ( object s e n d e r , PaintEventArgs e , C o l o r c ) { S i z e f o r m s i z e = th i s . C l i e n t S i z e ; Graph ics g = e . Graphics ; dda ( C l i e n t R e c t a n g l e . L e f t +20 , C l i e n t R e c t a n g l e . Top+10 , C l i e n t R e c t a n g l e . L e f t +20 , C l i e n t R e c t a n g l e . Bottom−10 , e , c ) ; dda ( C l i e n t R e c t a n g l e . L e f t +10 , C l i e n t R e c t a n g l e . Bottom− 20 , C l i e n t R e c t a n g l e . Right −10 , C l i e n t R e c t a n g l e . Bottom−20 , e , c ) ; fo r ( int i = 1 ; i < ( C l i e n t R e c t a n g l e . Width / 1 0 ) − 2 ; i ++) { dda ( C l i e n t R e c t a n g l e . L e f t + 20 + 20 ∗ i , C l i e n t R e c t a n g l e . Bottom − 2 5 , C l i e n t R e c t a n g l e . L e f t + 20 + 20 ∗ i , C l i e n t R e c t a n g l e . Bottom − 1 5 , e , c ) ; } fo r ( int i = 1 ; i < ( C l i e n t R e c t a n g l e . Height / 1 0 ) − 3 ; i ++) { dda ( C l i e n t R e c t a n g l e . L e f t + 1 5 , C l i e n t R e c t a n g l e . Bottom − 20 − 20 ∗ i , C l i e n t R e c t a n g l e . L e f t + 2 5 , C l i e n t R e c t a n g l e . Bottom − 20 − 20 ∗ i , e , c ) ; } }
20.16. forráskód
1 2 3 4 5 6 7 8 9
private void Diagramm ( i nt x , i nt y , object s e n d e r , PaintEventArgs e , C o l o r c ) { Graph ics Gf = e . Graphics ; dda ( x , C l i e n t R e c t a n g l e . Bottom − 2 0 , x , C l i e n t R e c t a n g l e . Bottom − y , e , c ) ; dda ( x + 2 0 , C l i e n t R e c t a n g l e . Bottom − 2 0 , x + 2 0 , C l i e n t R e c t a n g l e . Bottom − y , e , c ) dda ( x , C l i e n t R e c t a n g l e . Bottom − 2 0 , x , C l i e n t R e c t a n g l e . Bottom − y , e , c ) ; S o l i d B r u s h brush = new So l i d B r u s h ( c ) ; Gf . F i l l R e c t a n g l e ( brush , x , y + C l i e n t R e c t a n g l e . Bottom − 20 , 2 0 , y ) ; }
20.17. forráskód
1 2 3 4 5 6 7 8 9
private void Form1_Paint ( o bject s e n d e r , PaintEventArgs e ) { Graph ics g = e . Graphics ; Koo rdinataRendszer ( s e n d e r , e , C o l o r . Black ) ; int s z a z a l e k = 4 0 ; Diagramm ( 1 0 0 , ( C l i e n t R e c t a n g l e . Height / 1 0 0 )∗ s z a z a l e k + 2 0 , s e n d e r , e , C o l o r . Red ) ; Diagramm ( 2 0 0 , ( C l i e n t R e c t a n g l e . Height / 1 0 0 )∗( 1 0 0 − s z a z a l e k ) + 2 0 , s e n d e r , e , C o Diagramm ( 3 0 0 , ( C l i e n t R e c t a n g l e . Height / 1 0 0 ) ∗ 100 + 2 0 , s e n d e r , e , C o l o r . Yellow ) ; }
20.18. forráskód
20.4. A fejezet forráskódjai 3.
324
1 2 3
s t a t i c int Bx , By , Ex , Ey ; s t a t i c double r ; s t a t i c bool nyom = f a l s e ;
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
private void M idPoint ( Graphics g , C o l o r c o l o r , int x1 , int y1 , int x2 , i nt y2 ) { int dx , dy ; int x = x1 , y = y1 ; dx = x2 − x1 ; dy = y2 − y1 ; i f ( dx ∗ dy == 0 ) { i f ( dx == 0 ) { y = ( y1 < y2 ) ? y1 : y2 ; y2 = ( y1 < y2 ) ? y2 : y1 ; fo r ( ; y <= y2 ; y++) d r a w P i x e l ( g , c o l o r , x1 , y ) ; } else { x = ( x1 < x2 ) ? x1 : x2 ; x2 = ( x1 < x2 ) ? x2 : x1 ; fo r ( ; x <= x2 ; x++) dr a w P i x e l ( g , c o l o r , x , y1 ) ; } } else { f l o a t m; int c 1 , c2 , p ; int bx = 1 , by = 1 ; m = dy / ( f l o a t )dx ; dx = ( dx > 0 ) ? dx : −dx ; dy = ( dy > 0 ) ? dy : −dy ; c1 = dy + dy ; c2 = ( dy − dx ) << 1 ; p = ( dy + dy ) − dx ; dr a w P i x e l ( g , c o l o r , x , y ) ; i f (m >= −1 && m <= 1 ) { i f ( x2 < x1 ) { bx = −1; i f ( y2 < y1 ) by = − 1; while (x > x2 ) { x += bx ; i f (p >= 0 ) { p += c2 ; y += by ; } el s e p += c1 ; dr a w P i x e l ( g , c o l o r , x , y ) ; } } else 325 { i f ( y2 < y1 ) by = − 1;
1 2 3 4 5 6 7 8 9 10 11
s t a t i c I mage F i x e d S i z e ( Image imgPhoto , i nt Width , int Height ) { int sourceWidth = imgPhoto . Width ; int s o u r c e H e i g h t = imgPhoto . Height ; int sourceX = 0 ; int sourceY = 0 ; int destX = 0 ; int destY = 0 ; f l o a t nPercent = 0 ; f l o a t nPercentW = 0 ; f l o a t nPercentH = 0 ;
12
nPercentW = ( ( f l o a t )Width / ( f l o a t ) sourceWidth ) ; nPercentH = ( ( f l o a t ) Height / ( f l o a t ) s o u r c e H e i g h t ) ;
13 14 15
i f ( nPercentH < nPercentW ) { nPercent = nPercentH ; destX = System . Convert . ToInt16 ( ( Width − ( sourceWidth ∗ nPercent ) ) / 2 ) ; } else { nPercent = nPercentW ; destY = System . Convert . ToInt16 ( ( Height − ( s o u r c e H e i g h t ∗ n Percent ) ) / 2 ) ; }
16 17 18 19 20 21 22 23 24 25 26
int destWidth = ( int ) ( sourceWidth ∗ n Percent ) ; int d e s t H e i g h t = ( i nt ) ( s o u r c e H e i g h t ∗ n Percent ) ;
27 28 29
Bitmap bmPhoto = new Bitmap ( Width , Height , PixelFormat . Format24bppRgb ) ; bmPhoto . S e t R e s o l u t i o n ( imgPhoto . H o r i z o n t a l R e s o l u t i o n , imgPhoto . V e r t i c a l R e s o l u t i o n ) Graph ics grPhoto = Graphics . FromImage ( bmPhoto ) ; Co l o r CL = C o l o r . FromArgb ( 6 2 , 7 9 , 1 0 8 ) ; grPhoto . C l e a r (CL ) ; grPhoto . I n t e r p o l a t i o n M o d e = I n t e r p o l a t i o n M o d e . H i g h Q u a l i t y B i c u b i c ; grPhoto . DrawImage ( imgPhoto , new System . Drawing . R e c t a n g l e ( destX , destY , destWidth , d e s t H e i g h t ) , new System . Drawing . R e c t a n g l e ( sourceX , sourceY , sourceWidth , s o u r c e H e i g h t ) , grPhoto . D i s p o s e ( ) ; return bmPhoto ;
30 31 32 33 34 35 36 37 38 39 40 41
}
20.20. forráskód
326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
s t a t i c I mage S c a l e B y P e r c e n t ( Image imgPhoto , int P e r c e n t ) { f l o a t nPercent = ( ( fl o a t ) P e r c e n t / 1 0 0 ) ; int sourceWidth = imgPhoto . Width ; int s o u r c e H e i g h t = imgPhoto . Height ; int sourceX = 0 ; int sourceY = 0 ; int destX = 0 ; int destY = 0 ; int destWidth = ( int ) ( sourceWidth ∗ n Percent ) ; int d e s t H e i g h t = ( i nt ) ( s o u r c e H e i g h t ∗ n Percent ) ; Bitmap bmPhoto = new Bitmap ( destWidth , d e s t H e i g h t , PixelFormat . Format24bppRgb ) ; bmPhoto . S e t R e s o l u t i o n ( imgPhoto . H o r i z o n t a l R e s o l u t i o n , imgPhoto . V e r t i c a l R e s o l u t i o n ) Graph ics grPhoto = Graphics . FromImage ( bmPhoto ) ; grPhoto . I n t e r p o l a t i o n M o d e = I n t e r p o l a t i o n M o d e . H i g h Q u a l i t y B i c u b i c ; grPhoto . DrawImage ( imgPhoto , new System . Drawing . R e c t a n g l e ( destX , destY , destWidth , new S ystem . Drawing . R e c t a n g l e ( sourceX , sourceY , sourceWidth , s o u r c e H e i g h t ) , G r a p h i grPhoto . D i s p o s e ( ) ; return bmPhoto ; }
20.21. forráskód
1 2 3 4 5 6
private void Megnyitas ( ) { try { System . IO . D i r e c t o r y I n f o d i = new System . IO . D i r e c t o r y I n f o ( @textBox1 . Te System . IO . D i r e c t o r y I n f o [ ] d i A r r = d i . G e t D i r e c t o r i e s ( ) ;
7 8 9 10 11 12
f oreach ( System . IO . D i r e c t o r y I n f o d r i in di A r r ) { System . IO . F i l e I n f o [ ] f i A r r = d r i . G e t F i l e s ( " ∗. j p g " ) ; foreach ( System . IO . F i l e I n f o f r i in f i A r r ) {
20.22. forráskód
327
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
private void K orpontok ( i nt cx , i nt cy , i nt x , int y , System . Drawing . C o l o r s z i n , System . Windows . Forms . PaintEventArgs e ) { Graph ics g = e . Graphics ; Bitmap bm = new Bitmap ( 1 , 1 ) ; bm. S e t P i x e l ( 0 , 0 , C o l o r . Red ) ; g . DrawImageUnscaled (bm, ( i nt ) x + cx , ( i nt ) y + cy ) ; g . DrawImageUnscaled (bm, ( i nt ) y + cx , ( i nt ) x + cy ) ; g . DrawImageUnscaled (bm, ( i nt ) y + cx , ( i nt)−x + cy ) ; g . DrawImageUnscaled (bm, ( i nt ) x + cx , ( i nt)−y + cy ) ; g . DrawImageUnscaled (bm, ( i nt)− x + cx , ( i nt)−y + cy ) ; g . DrawImageUnscaled (bm, ( i nt)− y + cx , ( i nt)−x + cy ) ; g . DrawImageUnscaled (bm, ( i nt)− x + cx , ( i nt ) y + cy ) ; g . DrawImageUnscaled (bm, ( i nt)− y + cx , ( i nt ) x + cy ) ; }
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
private void M idpointKor ( i nt cx , i nt cy , i nt r , System . Windows . Forms . PaintEventArgs e ) { int d , x , y ; x = 0; y = r; d = 1 − r; Korpontok ( cx , cy , x , y , C o l o r . Black , e ) ; while ( y > x ) { i f (d < 0){ d += 2 ∗ x + 3 ; x++; } else{ d += 2 ∗ (x − y ) + 5 ; x++; y−−; } Korpontok ( cx , cy , x , y , C o l o r . Black , e ) ; } }
20.23. forráskód
1 2 3 4
Image imgPhotoVert = Image . FromFile ( @textBox1 . Text + + d r i . Name + + f r i . Name . T o St r i n g ( ) ) ;
20.24. forráskód
1
Image imgPhoto = null ;
20.25. forráskód
328
1 2 3 4 5 6 7
i f ( ( int ) comboBox1 . S e l e c t e d I n d e x == 0 ) i mgPhoto = S c a l e B y P e r c e n t ( imgPhotoVert , Convert . ToInt32 ( th i s . textBox3 . Text ) ) ; else i mgPhoto = F i x e d S i z e ( imgPhotoVert , Convert . ToInt32 ( th i s . textBox4 . Text ) , C onvert . ToInt32 ( t h i s . textBox5 . Text ) ) ; i mgPhoto . Save ( @textBox1 . Text + " \\ " + d r i . Name + " \\ " + textBox2 . Text + f r i . N ImageFormat . Jpeg ) ;
20.26. forráskód
1 2 3 4 5 6 7 8
imgPhoto . D i s p o s e ( ) ; } ... catch { MessageBox . Show ( "A␣ konyvtar ␣nem␣ l e t e z i k ! " , " h i b a " , M essageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; }
9
M essageBox . Show ( " Kesz ! " , " A t m e r e t e z e s ␣" + comboBox1 . S e l e c t e d I t e m . T o S t r i n g ( ) , MessageBoxButtons .OK, MessageBoxIcon . I n f o r m a t i o n ) ;
10 11 12 13
}
20.27. forráskód
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
private private private private private private private private private private private private private private private private private private private private private private
const int maxp = 1 0 ; int o s z t a s = 1 0 0 ; byte p ontdb = 4 ; Co l o r p o l i a s z i n = C o l o r . Yellow ; Co l o r p o n t a s z i n = C o l o r . Aqua ; Co l o r p o n t p s z i n = C o l o r . S i l v e r ; Co l o r e r i n t o p s z i n = C o l o r . S i l v e r ; Co l o r e r i n t o a s z i n = C o l o r . Aqua ; int pontmozg = − 1; double e r s z o r = 0 . 5 ; Poin t [ ] s z a k = new P oint [ maxp + 1 ] ; double gd ; int gm ; Poin t a0 , a1 , a2 , a3 ; Poin t ep3 = new P oint ( ) ; Poin t p3 = new P oint ( ) ; double po n t o s s a g = 4 0 ; int aktp ; int j ; Poin t e r i n t o 0 = new P oint ( ) ; Poin t e r i n t o 1 = new P oint ( ) ; Graphics g ;
20.28. forráskód
329
20.5. A fejezet forráskódjai 4. 1 2 3 4 5 6
private void Cl e a r D e v i c e ( ) { R e c t a n g l e r e c t = new Re c t a n g l e ( t h i s . C l i e n t R e c t a n g l e . L e f t , th i s . C l i e n t R e c t a n g l e . Top th i s . C l i e n t R e c t a n g l e . Width , t h i s . C l i e n t R e c t a n g l e . Height ) ; this . RectangleToScreen ( r e c t ) ; }
20.29. forráskód
330
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
private void HermitHatarok ( i nt ind1 , i nt i n d 2 ) { i f ( i n d 1 == 0 ) { e r i n t o 0 .X = Convert . ToInt32 ( s z a k [ 1 ] . X − 0.5 ∗ ( szak [ 2 ] . X − szak [ 1 ] . X) ) ; e r i n t o 0 .Y = Convert . ToInt32 ( s z a k [ 1 ] . Y − 0.5 ∗ ( szak [ 2 ] . Y − szak [ 1 ] . Y) ) ; e r i n t o 0 .X = Convert . ToInt32 ( ( e r i n t o 0 .X − s z a k [ 0 ] . X) ∗ e r s z o r ) ; e r i n t o 0 .Y = Convert . ToInt32 ( ( e r i n t o 0 .Y − s z a k [ 0 ] . Y) ∗ e r s z o r ) ; } else { e r i n t o 0 .X = Convert . ToInt32 ( ( i nt ) ( s z a k [ i n d 1 + 1 ] . X − s z a k [ i n d 1 − 1 ] . X) ∗ e r s z o r ) ; e r i n t o 0 .Y = Convert . ToInt32 ( ( s z a k [ i n d 1 + 1 ] . Y − s z a k [ i n d 1 − 1 ] . Y) ∗ e r s z o r ) ; } i f ( i n d 2 == pontdb ) { e r i n t o 1 .X = Convert . ToInt32 ( s z a k [ i n d 2 − 2 ] . X + 1.5 ∗ ( szak [ ind2 − 1 ] .X − szak [ ind2 − 2 ] .X) ) ; e r i n t o 1 .Y = Convert . ToInt32 ( s z a k [ i n d 2 − 2 ] . Y + 1.5 ∗ ( szak [ ind2 − 1 ] .Y − szak [ ind2 − 2 ] .Y) ) ; e r i n t o 1 .X = Convert . ToInt32 ( ( s z a k [ i n d 2 ] . X − e r i n t o 1 .X) ∗ e r s z o r ) ; e r i n t o 1 .Y = Convert . ToInt32 ( ( s z a k [ i n d 2 ] . Y − e r i n t o 1 .Y) ∗ e r s z o r ) ; } else { e r i n t o 1 .X = Convert . ToInt32 ( ( s z a k [ i n d 2 + 1 ] . X − s z a k [ i n d 1 ] . X) ∗ e r s z o r ) ; e r i n t o 1 .Y = Convert . ToInt32 ( ( s z a k [ i n d 2 + 1 ] . Y − s z a k [ i n d 1 ] . Y) ∗ e r s z o r ) ; } i f ( th i s . checkBox3 . Checked == true && i n d 2 == 0 ) { e r i n t o 0 .X = Convert . ToInt32 ( ( s z a k [ 0 ] . X − s z a k [ pontdb − 1 ] . X) ∗ e r s z o r ) ; e r i n t o 0 .Y = Convert . ToInt32 ( ( s z a k [ 0 ] . Y − s z a k [ pontdb − 1 ] . Y) ∗ e r s z o r ) ; e r i n t o 1 .X = Convert . ToInt32 ( s z a k [ 1 ] . X − 0 . 5 ∗ ( szak [ 2 ] . X − szak [ 1 ] . X) ) ; e r i n t o 1 .Y = Convert . ToInt32 ( s z a k [ 1 ] . Y − 0 . 5 ∗ ( szak [ 2 ] . Y − szak [ 1 ] . Y) ) ; e r i n t o 1 .X = Convert . ToInt32 ( ( e r i n t o 1 .X − s z a k [ 0 ] . X) ∗ e r s z o r ) ; e r i n t o 1 .Y = Convert . ToInt32 ( ( e r i n t o 1 .Y − s z a k [ 1 ] . Y) ∗ e r s z o r ) ; } }
20.30. forráskód
331
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
private Poin t h er m i t eu 3 ( Point p0 , Point p1 , Point t0 , P oint t1 , double u ) { Point pont = new Point ( ) ; a0 = p0 ; a1 = t 0 ; a2 .X = 3 ∗ ( p1 .X − p0 .X) − 2 ∗ t 0 .X − t 1 .X; a2 .Y = 3 ∗ ( p1 .Y − p0 .Y) − 2 ∗ t 0 .Y − t 1 .Y; a3 .X = −2 ∗ ( p1 .X − p0 .X) + t 0 .X + t 1 .X; a3 .Y = −2 ∗ ( p1 .Y − p0 .Y) + t 0 .Y + t 1 .Y; pont .X = Convert . ToInt32 ( a0 .X + a1 .X ∗ u + a2 .X ∗ u ∗ u + a3 .X ∗ u ∗ u ∗ u ) ; pont .Y = Convert . ToInt32 ( a0 .Y + a1 .Y ∗ u + a2 .Y ∗ u ∗ u + a3 .Y ∗ u ∗ u ∗ u ) ; return pont ; }
20.31. forráskód
1 2 3 4 5 6 7 8 9 10 11
private void e r i n t o r a j z ( Point p0 , Point p1 , P oint t0 , Point t 1 ) { Pen p = new Pen ( C o l o r . Red ) ; try { g . DrawLine ( p , p0 . X, p0 . Y, t 0 .X + p0 . X, t 0 .Y + p0 .Y ) ; } c atch {
12
} try {
13 14 15
g . DrawLine ( p , p1 . X, p1 . Y, t 1 .X + p1 . X, t 1 .Y + p1 .Y ) ;
16 17
} c atch {
18 19 20 21
}
22 23
}
20.32. forráskód
332
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
private void he r m r a j z ( C o l o r p o l i a s z i n 3 ) { Point p0 , p1 ; p0 = new Poin t ( ) ; p1 = new Poin t ( ) ; fo r ( int j = 1 ; j <= pontdb ; j ++) { HermitHatarok ( j − 1 , j ) ; p0 = s z a k [ j − 1 ] ; p1 = s z a k [ j ] ; e r i n t o r a j z ( p0 , p1 , e r i n t o 0 , e r i n t o 1 , 0 ) ; ep3 = h e r m i t eu 3 ( p0 , p1 , e r i n t o 0 , e r i n t o 1 , 0 ) ; for ( gd = 1 ; gd <= p o n t o s s a g ; gd++) { p3 = h e rm i t e u3 ( p0 , p1 , e r i n t o 0 , e r i n t o 1 , gd / p o n t o s s a g ) ; Pen pen = new Pen ( p o l i a s z i n 3 ) ; t ry { g . DrawLine ( pen , ep3 . X, ep3 . Y, p3 . X, p3 .Y ) ; } catch {
23
} ep3 = p3 ;
24 25
}
26
}
27 28
}
20.33. forráskód
1 2 3 4 5 6
private bool nyom = f a l s e ; private const int max = 1 3 ; private Poin t [ ] Pontok = new P oin t [ max + 1 ] ; private int n = 0 ; private int mozgat = −1; G r aphics g ;
20.34. forráskód
333
20.6. A fejezet forráskódjai 5. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
i f ( checkBox3 . Checked==true ) { HermitHatarok ( pontdb , 0 ) ; p0 = s z a k [ pontdb ] ; p1 = s z a k [ 0 ] ; e r i n t o r a j z ( p0 , p1 , e r i n t o 0 , e r i n t o 1 ) ; ep3 = h e r m i t e u 3 ( p0 , p1 , e r i n t o 0 , e r i n t o 1 , 0 ) ; try { for ( gd = 1 ; gd < p o n t o s s a g ; gd++) { p3 = h e rm i t e u3 ( p0 , p1 , e r i n t o 0 , e r i n t o 1 , gd / p o n t o s s a g ) ; Pen pen = new Pen ( p o l i a s z i n 3 ) ; g . DrawLine ( pen , ep3 . X, ep3 . Y, p3 . X, p3 .Y ) ; ep3 = p3 ; } } c atch {
20
}
21 22
}
20.35. forráskód
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
private void p o l i r a j z ( C o l o r p o l i a s z i n ) { Point p = new Point ( ) ; Point ep = new Point ( ) ; i f ( th i s . checkBox2 . Checked == true ) h e r m r a j z ( C o l o r . Black ) ; i f ( th i s . checkBox1 . Checked == true ) { Pen pen = new Pen ( p o l i a s z i n ) ; ep = th i s . H e l y i e r t e k B e z i e r ( 0 ) ; for ( int i = 0 ; i <= o s z t a s ∗ pontdb ; i ++) { double j = ( double) i ; p = th i s . H e l y i e r t e k B e z i e r ( j / ( o s z t a s ∗ p ontdb ) ) ; t ry { g . DrawLine ( pen , ep . X, ep . Y, p . X, p .Y ) ; } catch {
20
} ep = p ;
21 22
}
23
}
24 25
}
20.36. forráskód
334
1 2 3 4 5 6 7 8 9 10
private void p o n t j e l o l o ( Point [ ] s z a k ) { Pen pen = new Pen ( p o n t a s z i n ) ; fo r ( int i = 0 ; i <= pontdb ; i ++) try { g . DrawRectangle ( pen , s z a k [ i ] . X − 3 , s z a k [ i ] . Y − 3 , 6 , 6 ) ; } catch {
11
} pen . C o l o r = e r i n t o p s z i n ; i f ( th i s . checkBox4 . Checked == fa l s e ) { for ( int i = 0 ; i < pontdb ; i ++) t ry { g . DrawLine ( pen , s z a k [ i ] . X, s z a k [ i ] . Y, s z a k [ i + 1 ] . X, s z a k [ i + 1 ] . Y ) ; } catch {
12 13 14 15 16 17 18 19 20 21 22 23
}
24
}
25 26
}
20.37. forráskód
1 2 3 4 5 6 7 8
private void p o n t j e l ( Point [ ] szak , i nt db ) { i f ( db > 0 ) { Pen pen = new Pen ( p o n t p s z i n ) ; g . DrawRectangle ( pen , s z a k [ db ] . X − 3 , s z a k [ db ] . Y − 3 , 6 , 6 ) ; } }
20.38. forráskód
1 2 3 4 5 6 7 8 9 10
private void p o l i u j r a ( ) { ClearDevice ( ) ; p o n t j e l o l o ( szak ) ; aktp = −1; pontmozg = −1; polirajz ( poliaszin ); t h i s . numericUpDown1 . Value = Convert . ToDecimal ( e r s z o r ∗ 10 ) ; }
20.39. forráskód
335
1 2 3 4 5 6 7 8 9 10 11 12
private void s e g e d v o n a l ( Point [ ] szak , i nt sz , C o l o r s z i n ) { i f ( s z != 0 && s z != pontdb ) { Pen pen = new Pen ( p o n t a s z i n ) ; try { g . DrawRectangle ( pen , s z a k [ s z ] . X − 3 , szak [ sz ] . Y − 3 , 6 , 6 ) ; } catch {
13 14 15 16 17 18 19 20 21 22 23 24
} i f ( th i s . checkBox4 . Checked == f a l s e ) { pen . C o l o r = s z i n ; t ry { g . DrawLine ( pen , s z a k [ s z ] . X, s z a k [ s z ] . Y, s z a k [ s z − 1 ] . X, s z a k [ s z − 1 ] . Y ) ; } catch {
25
} t ry {
26 27 28
g . DrawLine ( pen , s z a k [ s z ] . X, s z a k [ s z ] . Y, s z a k [ s z + 1 ] . X, s z a k [ s z + 1 ] . Y ) ;
29 30
} catch {
31 32 33 34
}
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
} } i f ( s z == 0 ) { Pen pen = new Pen ( p o n t a s z i n ) ; try { g . DrawRectangle ( pen , s z a k [ s z ] . X − 3 , s zak [ sz ] . Y − 3 , 6 , 6 ) ; } catch { } p en . C o l o r = s z i n ; i f ( th i s . checkBox4 . Checked == f a l s e ) { t ry { g . DrawLine ( pen , s z a k [ s z ] . X, s z a k [ s z ] . Y, s z a k [ s z + 1 ] . X, s z a k [ s z + 1 ] . Y ) ; } catch { } } } i f ( s z == pontdb ) 336 { Pen pen = new Pen ( p o n t a s z i n ) ; try
1 2 3 4 5 6 7 8 9 10 11 12 13
private void i n i t r a j z ( ) { pontmozg = −1; aktp = −1; szak [ 0 ] . X = 50; szak [ 0 ] . Y = 200; szak [ 1 ] . X = 100; szak [ 1 ] . Y = 150; szak [ 2 ] . X = 150; szak [ 2 ] . Y = 120; szak [ 3 ] . X = 200; szak [ 3 ] . Y = 150; szak [ 4 ] . X = 250; szak [ 4 ] . Y = 200; pontdb = 4 ; t h i s . numericUpdown1 . Value = Convert . ToDecimal ( e r s z o r ∗ 10 ) ; }
20.41. forráskód
1 2 3 4 5 6 7
private void Form1_Paint ( o bject s e n d e r , P aintEventArgs e ) { g = e . Graphics ; p o n t j e l o l o ( szak ) ; polirajz ( poliaszin ); }
20.42. forráskód
337
20.7. A fejezet forráskódjai 6. 1 2 3 4 5 6 7 8 9 10 11 12 13 14
private void Form1_MouseMove ( object s e n d e r , MouseEventArgs e ) { i f ( pontmozg > −1) { s e g e d v o n a l ( szak , aktp , e r i n t o a s z i n ) ; po l i r a j z ( poliaszin ) ; sz a k [ aktp ] . X = e .X; sz a k [ aktp ] . Y = e .Y; Refresh ( ) ; po l i r a j z ( pontaszin ) ; s e g e d v o n a l ( szak , aktp , e r i n t o a s z i n ) ; } }
20.43. forráskód
338
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
private void Form1_MouseDown ( object s e n d e r , MouseEventArgs e ) { i f ( e . Button == MouseButtons . L e f t ) { j = 0; i f ( aktp > −1) { i f ( ( e .X >= s z a k [ aktp ] . X − 3 && e .X <= s z a k [ aktp ] . X + 3 ) && ( e .Y >= s z a k [ aktp ] . Y − 3 && e .Y <= s z a k [ aktp ] . Y + 3 ) ) pontmozg = aktp ; e l s e j = −1; i f ( j == −1) { s e g e d v o n a l ( szak , aktp , e r i n t o a s z i n ) ; s e g e d v o n a l ( szak , aktp , e r i n t o p s z i n ) ; aktp = − 1; } } i f ( aktp == −1) { j = −1; fo r (gm = 0 ; gm <= pontdb ; gm++) i f ( ( ( e .X >= s z a k [ gm ] . X − 3 ) && ( e .X <= s z a k [ gm ] . X + 3 ) ) && ( ( e .Y >= s z a k [ gm ] . Y − 3 ) && ( e .Y <= s z a k [ gm ] . Y + 3 ) ) ) j = gm ; i f ( j > −1) { aktp = j ; pontmozg = j ; s e g e d v o n a l ( szak , j , e r i n t o p s z i n ) ; s e g e d v o n a l ( szak , j , e r i n t o a s z i n ) ; i f ( th i s . checkBox5 . Checked == true ) { for ( i nt i = j ; i <= pontdb − 1 ; i ++) { sz a k [ i ] . X = s z a k [ i + 1 ] . X; sz a k [ i ] . Y = s z a k [ i + 1 ] . Y; } pontdb−−; } } } } i f ( e . Button == MouseButtons . Right && aktp == −1) { i f ( pontdb < maxp ) { p olirajz ( poliaszin ); p ontdb++; sz a k [ pontdb ] . X = e .X; s z a k [ pontdb ] . Y = e .Y; p olirajz ( poliaszin ); s e g e d v o n a l ( szak , pontdb , e r i n t o p s z i n ) ; } } Refresh ( ) ; } 339
20.44. forráskód
1 2 3 4 5 6 7 8 9
private void Form1_Paint ( o bject s e n d e r , PaintEventArgs e ) { g = e . Graphics ; i f (n > 0) { Gorbe ( ) ; P ontKi ( n ) ; } }
20.45. forráskód
1 2 3 4 5 6
private void Form1_MouseUp ( object s e n d e r , MouseEventArgs e ) { pontmozg = −1; po l i u j r a ( ) ; }
20.46. forráskód
1 2 3 4 5
private void button1_Click ( o bject s e n d e r , EventArgs e ) { A pplication . Exit ( ) ; }
6 7 8 9 10
private void Form1_Load ( o bject s e n d e r , EventArgs e ) { initrajz (); }
11 12 13 14 15 16
private void checkBox2_CheckedChanged ( o bject s e n d e r , EventArgs e ) { Refresh ( ) ; }
17 18 19 20 21 22 23 24
private void numericUpDown1_ValueChanged ( o bject s e n d e r , EventArgs e ) { e r s z o r = Convert . ToDouble ( th i s . numericUpDown1 . Value ) / 1 0 ; Refresh ( ) ; }
20.47. forráskód
340
21. Adatkezelés (szerző: Radványi Tibor) 21.1. SqlConnection, ConnectionString J 21.1. feladat I [Kapcsolat felépítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Használja a szerver telepítésekor megadott sa
1
felhasználót és jelszavát. Majd egy labelben jelenítse meg a kapcsolat állapotát. Tudja a kapcsolatot bontani is. 21.1. ábra. Kapcsolódás adatbázishoz
Segítség a megoldáshoz: Figyeljünk arra, hogy az adatkezeléshez szükségünk van a System.Data.SqlClient névtérre. 1 2 3 4 5
namespace sqlconn_1 { public p a r t i a l cl a s s Form1 : Form { private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private Sq l C o n n e c t i o n sconn ;
6
public Form1 ( ) { InitializeComponent ( ) ; b uttonCon . Text = " K ap csolód ás . . . " ; l a b e l K a p c s . Text = S t r i n g . Empty ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; }
7 8 9 10 11 12
private void b uttonCon_Click ( object s e n d e r , EventArgs e ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) { sconn . Open ( ) ; la b e l K a p c s . Text = sconn . S t a t e . T oS t r i n g ( ) ; b uttonCon . Text = " M e g s z a k í t á s " ; } else { sconn . C l o s e ( ) ; la b e l K a p c s . Text = sconn . S t a t e . T oS t r i n g ( ) ; b uttonCon . Text = " K apcsolódás " ; } } }
13 14 15 16 17 18 19 20 21 22 23
}
21.2. forráskód. Kapcsolódás adatbázishoz
341
J 21.2. feladat I [Felhasználó azonosítás] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. A kapcsolat kiépítéséhez kérje be a felhasználó nevét és jelszavát. Egy labelben jelenítse meg a a kapcsolat állapotát. Tudja a kapcsolatot bontani is. 21.3. ábra. Kapcsolódás adatbázishoz adatbekéréssel
Segítség a megoldáshoz: A connectionString összeállítására kell figyelni. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
private void b uttonKapcs_Click ( object se n d e r , EventArgs e ) { i f ( textBoxUser . Text != S t r i n g . Empty && textBoxPw . Text != S t r i n g . Empty ) { string CS = ConnSt + " ; u i d=" + textBoxUser . Text + " ; pwd=" + textBoxPw . Text ; i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s ed ) { sconn . C o n n e c t i o n S t r i n g = CS ; s conn . Open ( ) ; la b e l C o n . Text = sconn . S t a t e . T oS t r i n g ( ) ; b uttonKapcs . Text = " M e g s z a k í t á s " ; } el s e { sconn . C l o s e ( ) ; la b e l C o n . Text = sconn . S t a t e . T oS t r i n g ( ) ; b uttonKapcs . Text = " Kapcsolódás " ; } } }
21.4. forráskód. Kapcsolódás adatbázishoz adatbekéréssel
342
2
J 21.3. feladat I [Kapcsolat jellemzői] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Használja a szerver telepítésekor megadott sa felhasználót és jelszavát. Majd írassa ki a kapcsolat jellemzőit a formra: Időtúllépés, Adatbázis neve, szerver neve, csomagméret, a host gép azonosítója és az adatbázis állapota. Tudja a kapcsolatot bontani is. 21.5. ábra. A kapcsolat jellemzői
1 2 3 4 5 6 7 8 9
using using using using using using using using using
System ; System . C o l l e c t i o n s . G e n e r i c ; System . ComponentModel ; System . Data ; System . Drawing ; System . Linq ; System . Text ; System . Windows . Forms ; System . Data . S q l C l i e n t ;
10 11 12 13 14 15 16 17
namespace sqlconn_3 { public p a r t i a l cl a s s Form1 : Form { private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private Sq l C o n n e c t i o n sconn ;
18 19 20 21 22 23 24
public Form1 ( ) { InitializeComponent ( ) ; b uttonCon . Text = " K ap csolód ás . . . " ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; }
21.6. forráskód. A deklarációk
343
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
private void buttonCon_Click ( object s e n d e r , EventArgs e ) { lvAdat . Items . C l e a r ( ) ; i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) { sconn . Open ( ) ; buttonCon . Text = " M e g s z a k í t á s " ; ListViewItem l = new L ist ViewItem ( ) ; l . Text = " I d ő t ú l l é p é s : ␣" ; l . SubItems . Add( sconn . ConnectionTimeout . T o S t r i n g ( ) ) ; lvAdat . Items . Add( l ) ; ListViewItem l d b = new L is tViewItem ( ) ; ld b . Text = " A d a t b á z i s : ␣" ; ld b . SubItems . Add( sconn . Database . T o S t ri n g ( ) ) ; lvAdat . Items . Add( l d b ) ; ListViewItem l d s = new L is tViewItem ( ) ; l d s . Text = " D a t a s o u r c e : ␣" ; l d s . SubItems . Add( sconn . DataSource . T o St r i n g ( ) ) ; lvAdat . Items . Add( l d s ) ; ListViewItem l p s = new L is tViewItem ( ) ; l p s . Text = "Csomag␣ méret : ␣" ; l p s . SubItems . Add( sconn . P a c k e t S i z e . T o S tr i n g ( ) ) ; lvAdat . Items . Add( l p s ) ; ListViewItem l s = new L istViewIte m ( ) ; l s . Text = " S z e r v e r ␣ v e r z i ó : ␣" ; l s . SubItems . Add( sconn . S e r v e r V e r s i o n . T o St r i n g ( ) ) ; lvAdat . Items . Add( l s ) ; ListViewItem lw = new L istViewIte m ( ) ; lw . Text = " Munkaállomás : ␣" ; lw . SubItems . Add( sconn . W o r k s t a t i o n I d . To S t r i n g ( ) ) ; lvAdat . Items . Add( lw ) ; } else { sconn . C l o s e ( ) ; buttonCon . Text = " Kap c solódás " ; lvAdat . Items . C l e a r ( ) ; lvAdat . Items . Add( sconn . S t a t e . T o S t ri n g ( ) ) ; } }
21.7. forráskód. A kapcsolat jellemzői
J 21.4. feladat I [Kapcsolat string dinamikus használata] Írjon programot, mely egy szabványos konfigurációs file-ból (programneve.exe.config xml file-ból) beolvassa
3
a ConnectionString tartalmát, bekéri a felhasználó nevet és a jelszót, ezzel kiegészíti a ConnectionStringet, majd kapcsolódni tud a Minta adatbázishoz. Majd írassa ki a kapcsolat jellemzőit a formra: Időtúllépés, Adatbázis neve, szerver neve és az adatbázis állapota. Tudja a kapcsolatot bontani is. Segítség a megoldáshoz: A konfigurációs file használatához a System.Configuration névteret használni kell. Ehhez nem elegendő a szokásos using sor, hanem adjuk a referenciákhoz is hozzá a fenti nevű dll-t. A konfigurációs fileba adjuk hozzá a ConnectionString szekciót, és 344
21.8. ábra. A kapcsolat jellemzői
töltsük is ki. 1 2 3 4 5 6
21.9. forráskód. A konfigurációs file
Segítség a megoldáshoz: A konfigurációs fileból a ConnectionStringet olvassuk be a ConfigurationManager segítségével. Akár több változatot is tárolhatunk, amiket névvel különböztetünk meg. 1
using System . C o n f i g u r a t i o n ;
2 3 4 5 6 7 8
public Form1 ( ) { InitializeComponent ( ) ; buttonCon . Text = " Kapcsolód ás . . . " ; sconn = new Sq l C o n n e c t i o n ( ) ; ConnSt = Co n f i g u r a t i o n M a n a g e r . C o n n e c t i o n S t r i n g s [ " b e t o l t " ] . C o n n e c t i o n S t r i n g ; }
21.10. forráskód. A konfigurációs file használata
21.2. Az SqlCommand J 21.5. feladat I [Tábla tartalmának lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából az első 5 nevet és fizetést, név szerint rendezve, és jelenítse meg egy ListView -ban. Használja az SqlDataReader és az SqlCommand osztályt. 345
2
21.11. ábra. Működés közben.
1 2 3 4 5 6 7 8 9
public Form1 ( ) { InitializeComponent ( ) ; buttonCon . Text = " Kapcsolód ás . . . " ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t ␣ top ␣5␣Nev , " +" Alapber ␣ from ␣ Alkalmazottak ␣ o r d e r ␣by␣Nev" ; }
10 11 12 13 14 15 16 17 18 19 20 21 22 23
private void Be o l v a s ( ) { SqlDataReader r = scomm . ExecuteReader ( ) ; while ( r . Read ( ) ) { ListViewItem l = new L ist ViewItem ( ) ; l . Text = ( string ) r [ 0 ] ; l . SubItems . Add( r [ 1 ] . T o S t ri n g ( ) ) ; lvAdat . Items . Add( l ) ; } r . Close ( ) ; }
21.12. forráskód. — J 21.6. feladat I [Skalár érték lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából az átlagfizetést és jelenítse meg egy Label -en. Használja az SqlCommand osztályt.
346
2
21.13. ábra. Működés közben.
1 2 3 4 5 6 7
public Form1 ( ) { InitializeComponent ( ) ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t ␣ avg ( a l a p b e r ) ␣ from ␣ Alkalmazottak " ; }
8 9 10 11 12 13 14
private double Be o l v a s ( ) { double a t l ; a t l = Convert . ToDouble ( scomm . E x e c u t e S c a l a r ( ) ) ; return a t l ; }
21.14. forráskód. —
J 21.7. feladat I [Séma lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak tábla
2
séma szerkezetét, és jelenítse meg. Használja az SqlCommand osztályt. J 21.8. feladat I [Tárolt eljárás futtatása] Írjon programot, melynek a segítségével
4
kapcsolódni tud a Minta adatbázishoz. Készítsen egy tárolt eljárást, mely a paraméterként kapott %-os mértékben megemeli az alkalmazottak fizetését, és kiszámolja az átlagfizetést az emelés előtt és után, és ezeket az adatokat visszaadja. Jelenítse meg az átlagértékeket. Használja az SqlCommand osztályt. J 21.9. feladat I [Adatfelvitel adatbázisba] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Kérje be egy új alkalmazott adatait, és szúrja be az új rekordot. Használja az SqlCommand osztályt.
347
4
21.15. ábra. Működés közben.
1 2 3 4 5 6 7 8
public Form1 ( ) { InitializeComponent ( ) ; buttonCon . Text = " Kapcsolód ás . . . " ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t ␣∗␣from ␣ Alkalmazottak " ; }
9 10 11 12 13 14 15
private void Be o l v a s ( ) { SqlDataReader r = scomm . ExecuteReader ( CommandBehavior . SchemaOnly ) ; DataTable dt = r . GetSchemaTable ( ) ; dgvAdat . DataSource = dt ; }
21.16. forráskód. —
J 21.10. feladat I [Adatkarbantartás adatbázisban 2] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Módosítsa a fizetéseket egy bekért értékre, de csak a segédmunkások esetén. A művelet végrehajtása után írassa ki a művelet által érintett sorok számát a formra. Használja az SqlCommand osztályt.
348
4
21.17. ábra. Működés közben.
1 2 3 4 5 6 7 8 9
CREATE PROCEDURE s p A t l a g N o v e l ( @ s z a z a l e k fl o a t , @ e l o t t e f l o a t o utput , @utana f l o a t output ) AS BEGIN s e l e c t @ e l o t t e=avg ( a l a p b e r ) from Alkalmazottak
10 11
update Alkalmazottak s e t a l a p b e r = ( 1 + @ s z a z a l e k / 1 0 0 ) ∗ a l a p b e r
12 13 14 15
s e l e c t @utana=avg ( a l a p b e r ) from Alkalmazottak END GO
21.18. forráskód. —
21.3. Adatok megjelenítése, adatkötés, DateSet és DataTable J 21.11. feladat I [Tábla tartalmának lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az
2
Alkalmazottak táblából az adatokat, név szerint rendezve, és jelenítse meg egy DataGridView-ban. Használja az DataTable és az DataAdapter osztályt. J 21.12. feladat I [Tábla tartalmának lekérése tárolt eljárással] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából a segédmunkások adatait, név szerint rendezve, és jelenítse meg egy DataGridView-ban. Használja a DataTable és az DataAdapter osztályokat. A beolvasást egy tárolt eljárás végezze el!
349
3
J 21.13. feladat I [Táblák tartalmának lekérése és megjelenítése XML-ben] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa
5
be az Alkalmazottak táblából az adatokat. Jelenítse meg DataGridView-ban. Használja az DataTable, DataSet és az DataAdapter osztályt. Lehessen Az adatokat elmenteni egy tetszőlegesen kiválasztott helyre, egy megadott nevű XML-fileba. Adjon lehetőséget, hogy egy XML file-ból a mentett adatokat vissza lehessen olvasni. J 21.14. feladat I [Adatbevitel] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Kérjen be egy új alkalmazott adatait, és szúrja be az új
3
rekordot.
21.4. Tárolt eljárások írása és használata J 21.15. feladat I [Átmeneti tábla lekérdezéssel] Írjon tárolt eljárást, mely az Alkalmazottak minta táblából kiválogatja a szakmunkások nevét és alapbérét, és ezt egy szaki nevű táblába tárolja el, és végül kilistázza.
350
2
1 2 3 4 5 6 7 8 9
namespace sqlcomm_4 { public p a r t i a l cl a s s Form1 : Form { private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private Sq l C o n n e c t i o n sconn ; private SqlCommand scomm ; private double s z a z a l e k ;
10
public Form1 ( ) { InitializeComponent ( ) ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . S t o r e d P r o c e d u r e ; scomm . CommandText = " s p A t l a g n o v e l " ; }
11 12 13 14 15 16 17 18 19
private void b uttonCon_Click ( object s e n d e r , EventArgs e ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) { sconn . Open ( ) ; b uttonCon . Text = " M e g s z a k í t á s " ; i f ( textBox1 . Text != S t r i n g . Empty && double . TryParse ( textBox1 . Text , out s z a z a l e k ) ) { Be o l v a s ( ) ; } } else { sconn . C l o s e ( ) ; b uttonCon . Text = " K apcsolódás " ; } }
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
private void Be o l v a s ( ) { double el , ut ; scomm . Parameters . Add( " s z a z a l e k " , SqlDbType . F l o a t ) ; scomm . Parameters [ " s z a z a l e k " ] . Value = s z a z a l e k ; scomm . Parameters . Add( " e l o t t e " , SqlDbType . F l o a t ) ; scomm . Parameters [ " e l o t t e " ] . D i r e c t i o n = Pa r a m e t e r D i r e c t i o n . Output ; scomm . Parameters . Add( " utana " , SqlDbType . F l o a t ) ; scomm . Parameters [ " utana " ] . D i r e c t i o n = Pa r a m e t e r D i r e c t i o n . Output ; i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) sconn . Open ( ) ; scomm . ExecuteNonQuery ( ) ; e l = ( double )scomm . Parameters [ " e l o t t e " ] . Value ; ut = ( double )scomm . Parameters [ " utana " ] . Value ; l a b e l A t l E l o t t e . Text = e l . To S t r i n g ( ) ; l a b e l A t l U t a n a . Text = ut . T oS t r i n g ( ) ; }
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
}
53 54
}
21.19. forráskód. —
351
21.20. ábra. Működés közben.
1 2 3 4 5 6 7 8
namespace sqlcomm_5 { public p a r t i a l cl a s s Form1 : Form { private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private Sq l C o n n e c t i o n sconn ; private SqlCommand scomm ;
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public Form1 ( ) { InitializeComponent ( ) ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . Text ; b uttonCon . Text = " K ap csolód ás " ; gbAdat . V i s i b l e = fa l s e ; buttonRogz . Enabled = fa l s e ; buttonUj . Enabled = fa l s e ; scomm . CommandText = " i n s e r t ␣ i n t o ␣ Alkalmazottak ␣" + " ␣ ( nev , ␣ S z u l e t _ i d o , ␣ r e s z l e g , ␣ b e o s z t a s , ␣ b e l e p e s , ␣ a l a p b e r , ␣"+ " n y e l v p o t l ) ␣ v a l u e s ␣" + " ( @nev , ␣ @Szulet_ido , ␣ @ r e s z l e g , ␣ @beosztas , ␣ @belepes , "+ " ␣ @alapber , ␣ @ n y e l v p o t l ) " ; }
21.21. forráskód. Deklarációk
352
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public Form1 ( ) { InitializeComponent ( ) ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . Text ; buttonCon . Text = " Kapcsolód ás " ; gbAdat . V i s i b l e = f a l s e ; buttonRogz . Enabled = f a l s e ; buttonUj . Enabled = f a l s e ; scomm . CommandText = " i n s e r t ␣ i n t o ␣ Alkalmazottak ␣" + " ␣ ( nev , ␣ S z u l e t _ i d o , ␣ r e s z l e g , ␣ b e o s z t a s , ␣ b e l e p e s , " +" a l a p b e r , ␣ n y e l v p o t l ) ␣ v a l u e s ␣ ( @nev , ␣ @Szulet_ido , " +" @ r e s z l e g , ␣ @beosztas , ␣ @belepes , ␣ @alapber , ␣ @ n y e l v p o t l ) " ; }
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
private void buttonRogz_Click ( object s e n d e r , EventArgs e ) { i f ( textBoxNev . Text != S t r i n g . Empty && numericAlapBer . Value > 0 ) { scomm . Parameters . C l e a r ( ) ; scomm . Parameters . Add( " nev " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " nev " ] . Value = textBoxNev . Text ; scomm . Parameters . Add( " S z u l e t _ i d o " , SqlDbType . DateTime ) ; scomm . Parameters [ " S z u l e t _ i d o " ] . Value = dateTimePickerSzdatum . Value ; scomm . Parameters . Add( " r e s z l e g " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " r e s z l e g " ] . Value = t e x t B o x R e s z l e g . Text ; scomm . Parameters . Add( " b e o s z t a s " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " b e o s z t a s " ] . Value = textBoxBeo . Text ; scomm . Parameters . Add( " b e l e p e s " , SqlDbType . S m a l l I n t ) ; scomm . Parameters [ " b e l e p e s " ] . Value = numericBelep . Value ; scomm . Parameters . Add( " a l a p b e r " , SqlDbType . I n t ) ; scomm . Parameters [ " a l a p b e r " ] . Value = numericAlapBer . Value ; scomm . Parameters . Add( " n y e l v p o t l " , SqlDbType . B i t ) ; scomm . Parameters [ " n y e l v p o t l " ] . Value = c heckBoxNyelvPotlek . Checked ; try { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) sconn . Open ( ) ; scomm . ExecuteNonQuery ( ) ; } catch ( E x c e p t i o n ex ) { MessageBox . Show ( " A d a t r ö g z í t é s ␣ s i k e r t e l e n . " + ex . Message , " Figyelem ␣" , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; } SetAlapHelyzet ( ) ; } }
21.22. forráskód. Végrehajtás
353
21.23. ábra. Működés közben.
1 2 3 4 5 6 7 8 9
public Form1 ( ) { InitializeComponent ( ) ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . Text ; buttonCon . Text = " Kapcsolód ás " ; scomm . CommandText = " update ␣ Alkalmazottak ␣" + " ␣ s e t ␣ a l a p b e r ␣=␣ @alapber ␣ where ␣ b e o s z t a s ␣=␣ @beosztas ␣" ; }
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
private void buttonRogz_Click ( object s e n d e r , EventArgs e ) { i f ( numericAlapBer . Value >= 0 ) { scomm . Parameters . C l e a r ( ) ; scomm . Parameters . Add( " b e o s z t a s " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " b e o s z t a s " ] . Value = c_beo ; scomm . Parameters . Add( " a l a p b e r " , SqlDbType . I n t ) ; scomm . Parameters [ " a l a p b e r " ] . Value = numericAlapBer . Value ; try { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) sconn . Open ( ) ; int r ows = scomm . ExecuteNonQuery ( ) ; l a b e l S o r o k . Text = rows . T o S t r i n g ( ) ; } catch ( E x c e p t i o n ex ) { MessageBox . Show ( " A d a t r ö g z í t é s ␣ s i k e r t e l e n . " + ex . Message , " Figyelem ␣" , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; } SetAlapHelyzet ( ) ; } }
21.24. forráskód. Működés
354
21.25. ábra. Működés közben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private Sq l C o n n e c t i o n sconn ; private SqlCommand scomm ; private D ataTable dt = new DataTable ( ) ; private SqlDataAdapter da ; public Form1 ( ) { InitializeComponent ( ) ; b uttonCon . Text = " K ap csolód ás . . . " ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t ␣∗␣from ␣ Alkalmazottak " ; } private void b uttonCon_Click ( object s e n d e r , EventArgs e ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) { sconn . Open ( ) ; b uttonCon . Text = " M e g s z a k í t á s " ; Be o l v a s ( ) ; } else { sconn . C l o s e ( ) ; b uttonCon . Text = " K apcsolódás " ; } } private void Be o l v a s ( ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) sconn . Open ( ) ; da = new S qlDataAdapter ( scomm ) ; dgvAdat . DataSource = dt ; da . F i l l ( dt ) ; }
21.26. forráskód. A program mejelenése
355
21.27. ábra. Működés közben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public Form1 ( ) { InitializeComponent ( ) ; buttonCon . Text = " Kap c solódás . . . " ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; DataColumn dcn = new DataColumn ( " nev " ) ; dt . Columns . Add( dcn ) ; DataColumn dca = new DataColumn ( " a l a p b e r " ) ; dt . Columns . Add( dca ) ; } private void Be o l v a s ( ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . Cl o s ed ) sconn . Open ( ) ; scomm . CommandType = CommandType . S t o r e d P r o c e d u r e ; scomm . CommandText = " spAdatLeker " ; scomm . Parameters . Add( " beo " , SqlDbType . NVarChar , 3 0 ) ; scomm . Parameters [ " beo " ] . Value = " Segédmunkás " ; SqlDataReader dr = scomm . ExecuteReader ( ) ; w hile ( dr . Read ( ) ) { DataRow r = dt . NewRow ( ) ; r [ " nev " ] = dr [ 0 ] ; r [ " a l a p b e r " ] = dr [ 1 ] ; dt . Rows . Add( r ) ; } dgvAdat . DataSource = dt ; }
21.28. forráskód. Beolvasás
356
21.29. ábra. Működés közben.
1 2 3 4 5 6 7 8 9
private void buttonToXML_Click ( object s e n d e r , EventArgs e ) { S a v e F i l e D i a l o g s f = new Sa v e F i l e D i a l o g ( ) ; s f . D e f a u l t E x t = "xml" ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { ds . WriteXml ( s f . FileName ) ; } }
10 11 12 13 14 15 16 17 18 19 20
private void buttonFromXML_Click ( object s e n d e r , EventArgs e ) { Op e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; o f . D e f a u l t E x t = "xml" ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { ds . ReadXml ( o f . FileName ) ; dgvAdat . DataSource = ds . T a b l e s [ 0 ] ; } }
21.30. forráskód. XML használata
357
21.31. ábra. Működés közben.
21.32. ábra. Működés közben.
358
1 2 3 4 5 6 7 8 9
using using using using using using using using using
System ; System . C o l l e c t i o n s . G e n e r i c ; System . ComponentModel ; System . Data ; System . Drawing ; System . Linq ; System . Text ; System . Windows . Forms ; System . Data . S q l C l i e n t ;
10 11 12 13 14 15 16 17 18 19 20
namespace adatkotes_4 { public p a r t i a l cl a s s Form1 : Form { private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private Sq l C o n n e c t i o n sconn ; private SqlCommand scomm ; private D ataTable dt = new DataTable ( ) ; private SqlDataAdapter da ;
21 22 23 24 25 26 27 28 29 30
public Form1 ( ) { InitializeComponent ( ) ; b uttonCon . Text = " K ap csolód ás . . . " ; sconn = new Sq l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; bu t t o n R o g z i t . Enabled = fa l s e ; buttonUj . Enabled = fa l s e ; }
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
private void b uttonCon_Click ( object s e n d e r , EventArgs e ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) { sconn . Open ( ) ; b uttonCon . Text = " M e g s z a k í t á s " ; bu t t o n R o g z i t . Enabled = true ; buttonUj . Enabled = true ; Be o l v a s ( ) ; } else { sconn . C l o s e ( ) ; b uttonCon . Text = " K apcsolódás " ; bu t t o n R o g z i t . Enabled = f a l s e ; buttonUj . Enabled = fa l s e ; } }
21.33. forráskód. Deklaráció és kapcsolódás
359
1 2 3 4 5 6 7 8 9
private void Be o l v a s ( ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) sconn . Open ( ) ; scomm . CommandType = CommandType . Text ; scomm . CommandText = " s e l e c t ␣∗␣from ␣ Alkalmazottak ␣ o r d e r ␣by␣ nev " ; da = new SqlDataAdapter ( scomm ) ; dgvAdat . DataSource = dt ; da . F i l l ( dt ) ; }
10 11 12 13 14
private void buttonZar_Click ( object s e n d e r , EventArgs e ) { Close ( ) ; }
15 16 17 18 19
private void buttonUj_Click ( object s e n d e r , EventArgs e ) { tabControl1 . SelectTab ( 1 ) ; }
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
private void bu t t o n R o g z i t _ C l i c k ( object s e n d e r , EventArgs e ) { string i n s = " i n s e r t ␣ i n t o ␣ Alkalmazottak ␣ v a l u e s ␣"+ " ( @nev , ␣ @szulet_ido , ␣ @ r e s z l e g , ␣ @beosztas , ␣␣"+ " @belepes , ␣ @alapber , ␣ @ n y e l v p o t l ␣ ) " ; SqlCommand s c = new SqlCommand ( i n s , sconn ) ; s c . Parameters . Add( " nev " , SqlDbType . NVarChar , 3 0 ) ; s c . Parameters [ " nev " ] . Value = textBoxNev . Text ; s c . Parameters . Add( " r e s z l e g " , SqlDbType . NVarChar , 3 0 ) ; s c . Parameters [ " r e s z l e g " ] . Value = textBoxNev . Text ; s c . Parameters . Add( " b e o s z t a s " , SqlDbType . NVarChar , 3 0 ) ; s c . Parameters [ " b e o s z t a s " ] . Value = textBoxNev . Text ; s c . Parameters . Add( " b e l e p e s " , SqlDbType . I n t ) ; s c . Parameters [ " b e l e p e s " ] . Value = numericBelep . Value ; s c . Parameters . Add( " a l a p b e r " , SqlDbType . I n t ) ; s c . Parameters [ " a l a p b e r " ] . Value = numAlapBer . Value ; s c . Parameters . Add( " s z u l e t _ i d o " , SqlDbType . DateTime ) ; s c . Parameters [ " s z u l e t _ i d o " ] . Value = dateTimePicker1 . Value ; s c . Parameters . Add( " n y e l v p o t l " , SqlDbType . B i t ) ; s c . Parameters [ " n y e l v p o t l " ] . Value = cbNyelvP . Checked ; i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l os e d ) sconn . Open ( ) ; try { s c . ExecuteNonQuery ( ) ; } c atch ( E x c e p t i o n ex ) { M essageBox . Show ( " Hiba ␣ az ␣ a d a t r ö g z í t é s b e n . ␣" + ex . Message , " Hiba " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; } dgvAdat . DataSource = n ull ; dt . Columns . C l e a r ( ) ; dt . Rows . C l e a r ( ) ; Beolvas ( ) ; dgvAdat . DataSource = dt ; tabControl1 . SelectTab ( 0 ) ; } } }
360 21.34. forráskód. Rögzítés
1 2 3 4 5 6 7 8
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 1 ] AS BEGIN s e l e c t nev , a l a p b e r i n t o s z a k i f rom Alkalmazottak w here b e o s z t a s = ’ Szakmunkás ’ s e l e c t ∗ f rom s z a k i o r d e r by nev END
21.35. forráskód. Átmeneti tábla
361
J 21.16. feladat I [Automatikus kulcsérték visszakérése] Írjon tárolt eljárást,
2
mely az Alkalmazottak minta táblába beszúr egy új rekordot, majd visszaadja az új rekord elsődleges kulcs értékét. Az elsődleges kulcs érték automatikusan generálódik.
1 2 3 4 5 6 7 8
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 2 ] ( @azon int output ) AS BEGIN i n s e r t i n t o Alkalmazottak ( nev , a l a p b e r , n y e l v p o t l ) v a l u e s ( ’ K i s s Ádám’ , 1 4 5 0 0 0 , 1 )
9
SELECT @azon = @@Identity ;
10 11 12
END
21.36. forráskód. @@Identity Segítség a megoldáshoz: Figyeljen arra, hogy hogyan lehet a tárolt eljárást futtani, helyes paraméter használattal. 1 2 3
d e c l a r e @i int e x e c s p T a r o l t 2 @azon = @i output s e l e c t i = @i
21.37. forráskód. Paraméteres futtatás
J 21.17. feladat I [Kurzor használata] Írjon tárolt eljárást, mely az Alkalmazottak
5
minta táblában megemeli az alkalmazottak fizetését. Ha egy alkalmazott az átlagnál kevesebbet keres, akkor 20%-al, míg ha többet, akkor 10%-al. A feladat megoldásához használjon kurzort. Segítség a megoldáshoz: A kurzor deklarációja és használata egyszerű. Használat után ne felejtse el bezárni és felszabadítani. Tartsa szem előtt, hogy a kurzor használata lassú folyamat! J 21.18. feladat I [Vezérlési szerkezetek 1] Írjon tárolt eljárást, amely kiírja a Fibonacci-sorozat első 10 elemét (0,1,1,2,3,...).
2
J 21.19. feladat I [Legnagyobb különbség] Írjon tárolt eljárást, mely a felhasználó által megadott részlegnél kiszámítja a legnagyobb fizetési különbséget.
2
Segítség a megoldáshoz: Figyeljen a paraméteres futtatásra
362
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 3 ] AS BEGIN d e c l a r e @atl f l o a t d e c l a r e @alapber f l o a t d e c l a r e @tsz int d e c l a r e @emel f l o a t d e c l a r e cur_alk c u r s o r f or s e l e c t a l a p b e r , t o r z s s z a m from Alkalmazottak s e l e c t @atl = avg ( a l a p b e r ) from Alkalmazottak open cur_alk ; f e t c h next from cur_alk i n t o @alapber , @tsz while @@fetch_status = 0 begin i f @ alapber < @atl s e t @emel = 20 el s e s e t @emel = 10 update Alkalmazottak s e t a l a p b e r = ( 1 + @emel / 1 0 0 ) ∗ a l a p b e r where t o r z s s z a m = @tsz f e t c h next from cur_alk i n t o @alapber , @tsz e nd c l o s e cur_alk ; d e a l l o c a t e cur_alk ; END
21.38. forráskód. Kurzor használata
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 4 ] AS BEGIN d e c l a r e @fib1 int d e c l a r e @fib2 int d e c l a r e @ u j f i b int d e c l a r e @i int s e t @fib1 = 0 s e t @fib2 = 1 s e t @i = 1 p r i n t @fib1 p r i n t @fib2 while @i < 9 begin s e t @i = @i + 1 s e t @ u j f i b = @fib1 + @fib2 p rint @ujfib s e t @fib1 = @fib2 s e t @fib2 = @ u j f i b e nd END
21.39. forráskód. Vezérlési szerkezet
363
1 2 3 4 5 6 7
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 5 ] ( @reszleg nvarchar ( 3 0 ) ) AS BEGIN s e l e c t max( a l a p b e r ) − min ( a l a p b e r ) from Alkalmazottak where r e s z l e g = @ r e s z l e g END
21.40. forráskód. Egy ötlet bejárás nélkül
1
e x e c s p T a r o l t 5 @ r e s z l e g = ’ Rendészet ’
21.41. forráskód. Paraméteres futtatás
364