Spis treści
W prow adzenie...........................................................................................................................................7 ✓
1.
Środow isko p ro g ram o w an ia..........................................................................................................9
2.
Pierwszy p ro g ra m ...........................................................................................................................15 ,
*>
Ćwiczenie 1. Zaczynam y......................................................................................................15 3.
W prow adzanie danych, form atow anie w yników ................................................................... 17 Ćwiczenie 2. Obliczamy objętość k u li...............................................................................17 Ćwiczenie 3. Inny sposób wyprowadzenia w yników ......................................................20 Ćwiczenie 4. Pytanie w oknie M essageBox..................................................................... 22
4.
Podstaw y języka C # ...................................................................................................................... 23 4.1. Wyrażenia i operatory arytm etyczne................................................................................. 23 Ćwiczenie 5. Wyrażenia i operatory.................................................................................. 23 4.2. Instrukcje w yboru................................................................................................................. 26 Ćwiczenie 6. A naliza............................................................................................................26 Ćwiczenie 7. Obliczamy dzień W ielkanocy..................................................................... 28 Ćwiczenie 8. K alendarz........................................................................................................31 4.3. Instrukcje powtarzania..........................................................................................................33 Ćwiczenie 9. Funkcje trygonometryczne...........................................................................33 Ćwiczenie 10. Wyznaczanie wartości 7t....................... 35 Ćwiczenie 11. Szukamy największego wspólnego dzielnika........................................ 38 Ćwiczenie 12. Obliczamy wartość funkcji silnia..............................................................39
5.
T ypy referencyjne, tablice i k o lek c je........................................................................................ 41 5.1. Typy wartościowe a referencyjne.......................................................................................41 Ćwiczenie 13. Porównanie typów wartościowych i referencyjnych............................41 5.2. T ab lice.................................................................................................................................... 43 Ćwiczenie 14. Sito Eratostenesa.........................................................................................44 Ćwiczenie 15. Obliczamy dokładnie silnię z1000............................................................47 Ćwiczenie 16. Tworzymy stos w tablicy...........................................................................49 5.3. K olekcje..................................................................................................................................51 Ćwiczenie 17. Tworzymy stos jeszcze r a z ....................................................................... 52
6.
M etody, przekazyw anie arg u m en tó w ..............................................
55
Ćwiczenie 18. Skracamy ułam k i........................................................................................56
4
C# w praktyce
7.
In terfejs u ż y tk o w n ik a ................................. ............................................................................. 61
8.
7.1. Kontrolki i zdarzenia........................................................................................................... 61 Ćwiczenie 19. K ontrolki..................................................................................................... 62 7.2. M enu .......................................................................................................................................64 Ćwiczenie 20. Edytor tekstu - pasek m enu......................................................................64 7.3. Pasek narzędzi....................................................................................................................... 68 Ćwiczenie 21. Edytor tekstu - pasek narzędzi................................................................ 68 7.4. Pasek stanu.............................................................................................................................71 Ćwiczenie 22. Edytor tekstu - pasek stanu.......................................................................71 7.5. Obsługa plików ..................................................................................................................... 72 Ćwiczenie 23. Edytor tekstu - odczyt i zapis.................................................................. 74 7.6. Drukowanie............................................................................................................................78 Ćwiczenie 24. Edytor tekstu - drukow anie......................................................................78 t t K ontrola popraw ności danych, obsługa b łędów .................................................................. 85 8.1. Kontrolki ograniczające wprowadzanie danych.............................................................. 85 Ćwiczenie 25. Zakup sam ochodu...................................................................................... 86 8.2. Weryfikacja danych..............................................................................................................89 Ćwiczenie 26. Sprawdzamy wprowadzane dane............................................................. 89 Ćwiczenie 27. Używamy maski wprow adzania..............................................................91 8.3. Zdarzenia walidacji d an y ch ................................................................................................ 92 Ćwiczenie 28. W ykorzystujemy zdarzenia Validating i V alidated..............................93 8.4. Strukturalna obsługa w yjątków ......................................................................................... 95 Ćwiczenie 29. Przechwytujemy błędy dyskowe..............................................................97 Ćwiczenie 30. Sprzątamy po błędzie.................................................................................99 Ćwiczenie 31. Zgłaszamy własne wyjątki...................................................................... 101
9.
K om entarze X M L .......................................................................................................................103 Ćwiczenie 32. Stosujemy komentarze X M L ..................................................................105 Ćwiczenie 33. Tworzymy dokumentację wpostaci raportu H T M L ..........................116
10.
G rafika G D I+ ...............................................................................................................................119 10.1. Podstawowe metody i obiekty graficzne........................................................................ 119 Ćwiczenie 34. Rysujemy typowe elementy graficzne.................................................. 119 Ćwiczenie 35. Przeglądamy wypełnienia typu H atchStyle......................................... 123 10.2. Pliki graficzne......................................................................................................................125 Ćwiczenie 36. Kolekcja plików graficznych..................................................................126 10.3. A nim acja...............................................................................................................................129 Ćwiczenie 37. Animacja z użyciem PictureBox............................................................ 129 Ćwiczenie 38. Animacja grafik pobieranych z plików ................................................. 131 Ćwiczenie 39. Księżyc....................................................................................................... 132 Ćwiczenie 40. Działania na macierzach klasy M atrix.................................................. 134 Ćwiczenie 41. Transformacje M ultiplyTransform........................................................140 Ćwiczenie 42. Animacja z użyciem transformacji M ultiplyTransform .................... 141
Spis treści 11.
5
W łasne k la s y ..............................................................................................................................143 Ćwiczenie 43. Czy liczba jest obiektem ?....................................................................... 143 11.1. Pierwsza klasa......................................................................................................................144 Ćwiczenie 44. Własna k la s a ............................................................................................. 145 11.2. Herm etyzacja.......................................................................................................................146 Ćwiczenie 45. A kcesory.................................................................................................... 147 Ćwiczenie 46. W łaściwości...............................................................................................149 11.3.Konstruktory i destruktory................................................................................................. 151 Ćwiczenie 47. Własny konstruktor.................................. 152 11.4. Dziedziczenie....................................................................................................................... 153 Ćwiczenie 48. Tworzymy klasy potomne........................................................................154 11.5. Metody wirtualne.................................................................................................................158 Ćwiczenie 49. Wywoływanie właściwych m eto d ......................................................... 158 11.6. Indeksatory............................................................................................................................162 Ćwiczenie 50. Używamy indeksatorów........................................................................... 163 11.7. Sami tworzymy aplikację W indow s.................................................................................165 Ćwiczenie 51. Aplikacja Windows - od początku........................................................ 165
12.
Bazy d a n y c h ................................................................................................................................171 12.1. Kreator Data Form W izard............................................................................................ 171 Ćwiczenie 52. Dostęp do danych z użyciem Data Form W izard ................................. 171 12.2. Poznajemy obiekty A D O ................................................................................................... 179 Ćwiczenie 53. Odczytujemy dane z b azy ........................................................................180 Ćwiczenie 54. Korzystamy z komponentów bazodanow ych...................................... 181 12.3. Server Explorer, SQL Server.............................................................................................186 Ćwiczenie 55. Integracja danych z różnych źró d eł........................................................ 188
13.
A plikacje W W W .......................................................................................................................201 Ćwiczenie 56. Aplikacja ASP .NET................................................................................ 203 Ćwiczenie 57. Kalkulator e u ro .........................................................................................205 Ćwiczenie 58. Dostęp do bazy danych z aplikacji W W W .......................................... 206
14.
Usługi W eb Services................................................................................................................. 209 Ćwiczenie 59. Tworzymy i wykorzystujemy usługę W ebServices............................209 Ćwiczenie 60. Korzystamy z metod sieciowych i baz danych................................... 213
15.
P akiet instalacyjny a p lik a c ji..................................................................................................217 Ćwiczenie 61. Tworzymy pakiet instalacyjny............................................................... 217
Podsum ow anie..................................................................................................................................... 223 S k o ro w id z............................................................................................................................................. 225
Wprowadzenie
V isual Studio .N E T integruje w iele środow isk program istycznych w postaci je d nolitego interfejsu (IDE). U dostępnia środow isko, z którego korzystać m ogą różne języki program ow ania. M icrosoft dostosow ał do platform y .N E T, od lat znany i p o pularny, ję z y k Visual B asic, zm ieniając go generalnie. VB .N E T jest w pełni obiek to w ym języ k iem program ow ania. D la użytkow ników języ k ó w rodziny C utw orzono na platform ie :N ET now y jęz y k C # („C sharp”). Jest to now oczesny, obiektow y języ k program ow ania, używ ający w ielu konstrukcji języ k a C + + , ale .bez zbędnych „nalecia łości histo ry czn y ch” . Język Visual C + + rów nież jest obecny n a tej platform ie. Istnieje przecież w iele w cześniej dla niego napisanych, przydatnych bibliotek obiektow ych. T w o rze n ie aplikacji m o żn a podzielić na trzy zasadnicze fazy: an alizę, p ro je k to w anie i p ro g ram o w an ie (kodow anie). P o d ział ten m a sz czeg ó ln e zn ac ze n ie d y d a k tyczne. K ło p o ty z praw idłow ym d ziałan iem aplikacji m ają często źró d ło w p o w ie rz chow nej bądź błędnej analizie pro b lem u , w złym (n iep rzem y ślan y m ) p ro jek cie. E m o cjonalne p o d ejście do p ro g ram o w an ia przez w ielu p ro g ram istó w p o w o d u je n ie d o c e nianie d w ó ch p ierw szych faz, czego efektem je st pro g ram b łęd n y lub g o rszy od o c z e kiw ań. E fek ty w n e tw orzenie ap likacji pow inno się składać nie z je d n o ra z o w e j an alizy , p ro jek to w an ia i p rogram ow ania, lecz z ró w n o czesn eg o ro z w ija n ia w szy stk ich ty ch faz. A by udosk onalać i popraw iać sw ój produkt, należy w ie lo k ro tn ie p o w ra ca ć po fazie p ro g ram o w an ia do ponow nej analizy lub p rojektow ania. Je st to tzw . m o d e l p iłk i ba seb a llo w ej.
F in aln y m zapisem algorytm u ro zw iązan ia p roblem u je s t k o d źró d ło w y (skry p t) zap isan y w jęz y k u program ow ania. D alej n astępuje proces k o m p ilacji i u ru ch a m ia n ia p ro g ram u . C zęsto używ anym i narzędziam i są tutaj środow iska zin teg ro w an e w p ostaci
C# w praktyce
8
ró żn y c h w ersji P ascala (D elp h i) lub C + + {Builder). Z am iast nich użyjm y jęz y k ó w p la tfo rm y .N E T. D obrym w yborem m oże być V isual C#. Jedną z zalet śro d o w isk a .N E T je s t to, że w y b ó r ję z y k a je st rzeczą drugorzędną. Integracja w ielu jęz y k ó w w je d n y m środow isku pow oduje, że nie m usim y tracić czasu na uczenie się od p o c z ą t k u n o w ych języ k ó w , aby tw orzyć, urucham iać i rozw ijać aplikacje. V isual CU i V isu a l B a sic na platform ie .N E T dają nam podobne m ożliw ości. U życie zm ien n y ch , k la s, ich w łaściw ości i m eto d je s t praw ie identyczne w obydw u języ k ach . Ś ro d o w isk o .N E T (tzw . F ram ew ork) o feru je w spólne typy danych {C om m on Type S ystem ) i b i b lio te k i klas {.N E T C lass F ram ew ork). P o trzeb y obecnych u ży tk o w n ik ó w opro g ram o w an ia w ym agają, aby ap lik acje d y sp o n o w ały graficznym i in terfejsam i (były „o k ien k o w e”). T o z kolei rodzi w y m a g a n ia w zględem środow isk p ro g ram isty czn y ch , które m uszą być efektyw ne. A rc h a ic z n y m p odejściem do nauki p ro g ram o w a n ia je st w ykorzystyw anie narzędzi, któ re nie zap e w n ia ją w sp o m ag an ia g rafic zn e g o w tw orzeniu interfejsów , nie p referu ją p ro g ra m o w a n ia o b słu g u jąceg o zd arze n ia i pro g ram o w an ia obiektow ego. T e p o jęcia nie m u sz ą o znaczać „w y ższeg o w taje m n ic ze n ia ” w sztukę p rogram ow ania. N ie n ależy ich k lasy fik o w ać , ja k o p ro b lem ó w zaaw ansow anych. Od n ich m usim y zaczynać nie ty lk o p ro g ram o w an ie, ale ju ż an aliz ę problem u i projek to w an ie rozw iązania. Języ k i p la t fo rm y .N E T u m o żliw iają, ja k nigdy dotąd, tw orzenie p rogram ów o biektow y ch , ste ro w an y ch zd arzen iam i i siln ie w spom aganych graficznie. O d sam ego p o czątk u w y k o rzy stu je m y tutaj (p rzy n ajm n iej pasyw nie) w łaściw ości i m etody obiek tó w , n aw et o nich nie w sp o m in ając. W sytuacjach, gdy interfejs g raficzn y je s t zbędn y lub p rz e szk ad za w „ zg łęb ien iu isto ty p ro b lem u ” , m ożna zbu d o w ać aplikację konsolow ą. P latfo rm a .N E T to nie tylko jęz y k i program ow ania. W w ielu sytuacjach p ełn ią ro lę p o m o cn iczą, służąc do zap isy w an ia poleceń. Z n ajo m o ść podstaw y p ro g ram o w a n ia w CU lub V is u a lß a s ic p om aga budow ać i zarządzać bazam i danych. W V isu a l S tu d io .N E T zn ajd ziem y Server E xplorer, za pom ocą k tó reg o m ożem y tw o rzy ć tab ele b az dan y ch i łąc zy ć je relacjam i. Z b ió r klas A D O .N E T z kolei um ożliw ia z arząd zan ie bazam i w śro d o w isk u trad y cy jn y m , połączonym , ja k i w bardziej efektyw n y m i n o w o czesn y m śro d o w isk u rozłączonym . D o w ykonania szeregu zadań, takich ja k z a p y ta n ia i m o d y fik acje rela cy jn y ch baz danych, m ożem y w yk o rzy sty w ać p opu larn y ję z y k S Q L . D ane m ożem y zap isy w a ć w coraz bardziej p o p ularnym , n iezależny m od p lat fo rm y fo rm acie X M L . P latfo rm a .N E T o feru je rów nież (m oże przede w szy stk im ) narzędzia do b u d o w a n ia ap lik acji intern eto w y ch i zarządzania zasobam i rozp ro szo n y m i. B iblio tek a A S P .N E T u m o żliw ia tw o rzen ie fo rm u larzy W W W . U sługi W eb S en d ee s ułatw iają b u d o w a n ie n o w o czesn y ch aplikacji rozproszonych.
1.
Środowisko programowania
Ję zy k C # je st narzędziem p ro g ram isty czn y m , z ap ro jek to w a n y m do użycia na p latfo rm ie .N E T F ram ew ork firm y M icrosoft. P latfo rm a ta stan o w i śro d o w isk o u ru c h o m ien io w e, bibliotekę klas, kom p ilato ry i narzędzia p o m o cn icze. P ro g ra m y n ap i sane w śro d o w isku .N E T F ram ew ork nie są k o m pilow ane od razu do k o d u m aszy n o w ego d an eg o p rocesora, lecz do kodu pośredniego M S IL {M icrosoft Interm ed ia te L a n g u a g e). U ruchom ienie p rogram u w ym aga śro d o w isk a C L R (C o m m o n L a n g u a g e R u n tim e ), które je st częścią .N E T F ram ew ork. P odczas p ierw sze g o u ru ch o m ien ia p ro g ram u na m aszynie docelow ej k o m p ilato r J u st In T im e tw o rz y ko d m aszy n o w y , sp ecy ficzn y dla d anego procesora. W u proszczeniu p rze d sta w ia to p o n iższy schem at. .NET Framework Projekt Kod źródłowy
1 Kompjilator
Common Language Runtime_________ ^_r______ Kod w języku pośrednim MSIL
Kompilator JIT
Kod maszynowy procesora
10
C# w praktyce
W e w szy stk ich system ach W indow s, w cześniejszych niż W indow s X P , n ie z b ę d ne je s t zain stalo w an ie p akietu N E T F ram ew ork, d o stęp n eg o bezpłatnie na stro n ach ✓
in te rn eto w y c h M icrosoftu. Ś ro d o w isk o to w ystarcza ja k o m inim um do p isan ia, k o m p ilo w a n ia i u ru cham iania pro g ram ó w w języ k u C # (zaw iera k o m p ilato r w ierszo w y te g o ję z y k a - csc.exe). A by je d n a k efektyw nie tw o rzy ć kod źródłow y (k o rzy stać z g ra fic z n e g o w spom agania i w ielu innych narzędzi w sp ierających), k o m p ilo w ać go i w y k ry w ać błędy, w arto się zaopatrzyć w środow iska zintegrow ane V isu a l S tu d io N E T (M icro so ft V isual C # N E T ) lub B orland C # B uilder. *
Ś ro d o w isk a z in teg ro w an e zw aln iają program istę z „ rę cz n e g o ” p isan ia całeg o k o du, o feru jąc g raficzn e w sp o m ag an ie podczas w y b ieran ia typu aplikacji i w sta w ian ia p o szcz eg ó ln y c h k o m p o n en tó w . Z n acząco przyspiesza to cały proces tw o rzen ia p ro g ram u i o d ciąża p ro g ram istę z pam ięcio w eg o op an o w y w an ia w ielu szczegółów . € * Pierwszy - Microsoft Visual C/i .NET [design] - Forml .cs [Design] File
Edit
View
yD - $3 »
($ ■
Project y
|§P
guild
Debug
4: : iff
D ata
Fgrmat
” ::
-
lools
Window
Help
► Debug
»
•*»
dele
. Sta t Page
Form 1.cs [D e sig n ]*
Solution Explorer - Pierwszy
3 n
q •■■•jgtf.u
n
j
ia
Solution 'Pierwszy' (1 project) P ie rw s z y ( jłReferences Q App.ico 1*1 AssemblyInfo.es Pp I Form l.cs
%
Mój pierw szy program
^
Solution Explorer
[j?) inne-
Properties F o rm l ł
Index Results
System.Windows.Forms.Form
II
fe
liii
Cursor El Font
<;.................................. 2 l fasl; li'-t
E l Output
.....
........
i.. ’I
X
X
Location
Title
g
>
T7] Index Results | igjj ' arch Results for clipl>
R eady
Rysunek 1. Środowisko zintegrowane Visual Studio .NET
Default ■*; Microsoft Sans Serif; 8,2E__ _
ForeColor
■
FormBorderStyle
Sizable
RlghtToLeft
No F o rm l
.e r :
ControlText
Środowisko programowania
11
(f{r P ie rw s z y - B o rlan d C IB u ild e r for th e M icroso ft .N E T F ra m e w o rk - W ln F o rm .e s Edit
File t i
Search View Protect
- 8
#
&
t l
Ł
£
Iñ b e ll System.Windows.Forms.L
;Cursor
¡RightToleft » |Text (TextAlign
-
11
Window
yelp
j
asL -
ProjectGroup! !-i |ip Pierwszy.eHe *'■
AccesslbleName
iFlatStyle □¡Font jForeColor limage ilmageAlign ilmagelndex IlmageList
►
lools
l** W « * I fr fr fr #•
□ A ccessibility |AccessibleDescri|
l8ackColor jBorderStyle
Component
.! SJLÏ^JStÊ. 1..F1E5L.P*]
Properties ] Events j
iAccessibleRole □ Appearance
Łun
References
111 Ass8mblyInfo.cs +: WinForm.cs
W in F o rm Default ,§ 1 ! Control None !Défaut 'Standard A ria l Narrow H ContrdT 1 1 (none) 'MiddleCenter
! ! !d"’
'
ù .................
Ü
□Mój pierwszy program!!! . . 1 *1.. u m r u iu . 1u .
: : :;■]
D ;, .a
I 1 (none) (none) iNo y program !!! Topteft V
;C:\Documents and Settings\Marian\Moje doku
a n s H H i
T e xt The text contained In the control.
Categories v j kSearch Tools >
F• m
1 object selected
48: 1
Insert
Code Design
Windows Forms
*
Rysunek 2. Środowisko zintegrowane Borl and C # Bui l der K o d au to m aty czn y program u typu W indow s A p plication: using using using using using using
Syst em; System.Drawing; System.Collections; System.ComponentModel; System.Windows.Forms; System.Data;
namespace Pus t y C I J I i l l Summary d e s c r i p t i o n f o r F o r ml . I l l p u b l i c c l a s s Forml : S y s t e m . W i n d o w s . For ms . Form ( I I I I I I Required desig ner v a r i a b l e . I l l p r i v a t e S y s t e m . C o m p o n e n t M o d e l . C o n t a i n e r components = n u l l ; public FormlO { II I I 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
C# w praktyce
12 // In i tia liz e C o m p o n e n t ( );
// / / 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 a l l //
I I I I I I C l e a n up any r e s o u r c e s b e i n g used. I l l p r o t e c t e d o v e r r i d e v o i d D i s p o s e ( bool d i s p o s i n g ) C i f ( disposing ) C i f ( c ompone nt s != n u l l ) C c o m p o n e n t s . Di s p o s e ( ) ; } } b a s e . Dispose( disposin g ); } # 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 I I I I I I 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 n o t m o d i f y I I I 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 . I l l p r i v a t e void I n i t ia l iz e C o m p o n e n t ( ) C t h i s . c omponent s = new S y s t e m . C o m p o n e n t M o d e l . C o n t a i n e r ! ) ; t h i s . S i z e = new S y s t e m . D r a w i n g . S i z e ( 3 0 0 . 3 0 0 ) ; t h i s . T e x t = "Forml"; 3 # e n d r e g i on I I I I I I The main e n t r y p o i n t f o r t h e a p p l i c a t i o n . I l l CSTAThr ead] s t a t i c void MainO i Appl i c a t i on . Run (new F o r m l O ) ; 3 3
3
Środowisko programowania
13
S z k ielet aplikacji, tw orzony auto m aty czn ie, m oże być częścio w o niezrozum iały dla p o czątk u jąceg o program isty, jed n a k że je g o szcz eg ó ło w a znajom ość nie je st k o n ieczn a na tym etapie nauki p rogram ow ania. W arto zw rócić uw agę na niektóre c h a rak tery sty czn e m iejsca kodu: •
u s i n g - d ek laracja użycia przestrzen i nazw . P o zw ala u n ik n ąć p isa n ia k w alifik o
w an y ch (w ieloczłonow ych) nazw ; •
namespace - definicja w łasnej przestrzen i nazw zap isan ej w pliku;
•
public
class
Forml
: S y s t e m . W i n d o w s . Fo r ms . Form- d e fin icja k lasy fo rm u la
rza; •
^ re g io n - dyrek ty w a początku obszaru (regionu), tutaj a u to m aty c zn ie w y p e łn ia n eg o po d czas um ieszczania elem en tó w (fo rm an tó w -k o n tro lek ) na fo rm u larzu ;
•
# e n d r e g i on - d y r e k ty w a k o ń c a obszaru;
•
static
void
M a i n O - sp ecjaln a m etoda (funkcja),
o d k tórej ro z p o c z y n a się
w y k o n an ie program u; •
Appl i c a t i o n . Runinew
FormlO) -
uru ch o m ien ie stan d ard o w ej ap lik ac ji W in
d o w s z u tw orzeniem obiektu form ularza; •
I I - k o m entarz w ierszow y (znaki po m ijan e, do k o ń c a w iersza, p rze z k o m p ila tor);
•
I I I - k o m en tarz X M L .
W jęz y k u C #, podobnie ja k w innych jęz y k ac h ro d zin y C, w ielk o ść u żytych liter m a zn aczen ie, np. M ain i m ain nie są tym i sam ym i nazw am i. O p ró c z aplikacji W indow s (okien k o w y ch ) m ożem y tw o rzy ć p ro g ram y d zia ła jąc e w o k n ie k o n so li poleceń. K od tw o rzo n y auto m aty czn ie je s t w ted y p rostszy. u s i n g Syst em; namespace Konsol a { I I I I I I Summary d e s c r i p t i o n f o r C l a s s l . I l l class Classl { I I I I I I The main e n t r y p o i n t f o r t h e a p p l i c a t i o n . I l l CSTAThread] s t a t i c void M a i n ( s t r i n g [ ] args) C II
14
C# w praktyce / / TODO: Add code t o s t a r t a p p l i c a t i o n h e r e //
W y g ląd takiej aplikacji je s t jed n a k dość ascetyczny. N ie będziem y w ięc jej u ż y w ać w naszych p rzykładach. A plikacje konsolow e w arto w ykorzystyw ać, w p rzy p a d k a ch g d zie je s t n ieisto tn y tzw . g raficzny interfejs użytkow nika.
2.
Pierwszy program
✓
Ć w iczen ia będziem y realizo w ać z w ykorzystaniem śro d o w isk a z in teg ro w an eg o V isual S tu d io .NET. *
Ćwiczenie 1. Zaczynamy U ru ch o m im y V isual Stu d io .N E T i k lik n iem y przycisk N ew P roject. New Project * I
M IE S . l i i i m
Project Types:
m
m
m
m
g [ÏÏS ]
Templates:
r - ( i l l Visual Basic Projects ; - - _ j Visual c # Projects H "1 1 -0 | | r h -i I L- i I
m
m
Visual C + + Projects Visual Python Projects Setup and Deployment Projects O ther Projects Visual Studio Solutions
Class Library
m
w
Windows Control Library
w
ASP.NET W eb ASP.NET W eb Application Service
W eb Control Library
A project for creating an application with a Windows user interface Name:
fPierwszy
Location:
jc \D o c ü rn e n ts and 5ettings\M arian\M oje dokumenty\C-
Browse...
Project will be created a t C:\Docum ents and Settings\M arian\M oje dokumenty\C#-c'wiczenia\Pierwszy. *M o re
I
OK
Cancel
I
Help
Rysunek 3. Okno dialogowe New Project •
W o k n ie d ialogow ym N ew P roject w ybierzem y typ p rojektu (języ k p ro g ra m o w a nia) - V isual C # P ro ject, szablon (T em p la tes) - W in d o w s A p p lic a tio n , o k reślim y w łasn ą n azw ę projektu (zostanie au tom atycznie u tw orzony k ata lo g o podanej n a zw ie) i w y bierzem y lokalizację na dysku. Po otw arciu projektu zobaczym y projekt fo rm u larza i k ilk a in n y ch o k ien (R y su n e k 1). P rojekt fo rm u larza będzie oknem naszej ap likacji.
•
W p raw y m dolnym narożniku ekranu znajdziem y okno w łaściw o ści (P ro p erties), w któ ry m w ybierzem y w łaściw ość form ularza: Text. W p iszem y tam „P ierw szy p ro g ra m ” . B ędzie to ty tu ł naszego form ularza.
•
N a fo rm u larzu um ieścim y nap is (etykietę): „M ój p ierw szy p ro g ra m ” . R o b im y to, w y k o rzy stu jąc przybornik (T oolbox), zaw ierający różne ko n tro lk i (inaczej for-
C# w praktyce
16
m anty). Po ro zw in ięciu p rzy b o rn ik a w ybierzem y k ontrolkę L a b e l i n an iesiem y ją na fo rm u la rz (p o d o b n ie ja k rysuje się elem enty graficzne w edyto rze g ra fic z nym ). W oknie w łaściw o ści, które au tom atycznie w y św ietla w łaściw ości w y b ra n ego fo rm an tu , o d szu k am y pozycję T ext i w piszem y sw ój tekst. •
M o żem y jeszc ze zad b ać o je g o w ygląd. W łaściw ość F ont pozw ala nam w y b rać atry b u ty czcio n k i (rodzaj, w ielkość, k o lor itp.). P o kliknięciu na tej w łaściw ości n ajlep iej w y b rać p rzy c isk [...] . O tw iera on okno dialogow e C zcion ka (p o d o b n e ja k w ed y to rach tekstu). N asz p ierw szy p ro g ram je s t gotow y. U tw orzyliśm y go jed y n ie przy użyciu na
rz ę d z i g raficzn y ch , nie n ap isaw szy kodu „ręcznie” . M ożem y teraz w y p ró b o w ać nasz p ro d u k t, u ru ch am iając go ze śro d o w isk a zintegrow anego. W tym celu z p ask a n a rz ę d zi w y b ieram y przycisk S ta n ( ►). A lternatyw ne sposoby to D ebug!S ta n lub k law isz F5 D eb u g !S ta n W ith o u t D eb u g g in g lub Ctrl +F5. W arto polecić ostatni sposób p o m i ja ją c y śled zen ie p ro g ram u (sp o w aln iające kom pilację i uruchom ienie). P rogram m o żn a o czy w iście u ru ch am iać spoza środow iska zintegrow anego. O d n ajd ziem y go w sw o im p ro jek cie w o d p o w ied n im podkatalogu.
M ój p ie rw szy program
Rysunek 4. Pierwszy program w działaniu
3.
Wprowadzanie danych, formatowanie wyników
T y lk o n ajp ro stsze program y tw o rzy m y , bazując c a łk o w icie na k o d z ie p isan y m autom atycznie. P rogram ro zw iązu jący n aw et n iesk o m p lik o w an e z ad an ie m a te m a tyczne w y m ag a napisania o d p o w ied n ich form uł, p o dania d an y ch i w y p ro w ad z en ia w yników . A
Ćwiczenie 2. Obliczamy objętość kuli Analiza problemu: Z asto su jem y w zór na o b liczan ie objęto ści kuli v = 4/3
tu r
.
Projekt: •
O b jęto ść kuli zależy od jej pro m ien ia, w ięc na fo rm u larzu u m ieścim y n a stę p u ją ce kontrolki: o
E ty k ietę (L abel) z n ap isem „Podaj p ro m ie ń :”
o
P ole tekstow e (T extB o x), w którym w ym ażem y nap is d o m y śln y z w ła śc i w ości Text.
•
W staw im y drugą etykietę (usuniem y napis dom yślny) do w yprow adzenia w yników .
•
O b liczen ia zostaną uruch o m io n e po podaniu pro m ien ia i n aciśn ięciu o d p o w ie d niego przycisku. P rzycisk (B uton) w staw im y z p rzy b o rn ik a na p ro jek t fo rm u la rza. Jego w łaściw ości T ext nad am y w artość „ O b licz” .
•
U ruchom im y edycję m etody obsługi zdarzenia „przy kliknięciu” , klikając dw ukrotnie na projekcie przycisku. W ten sposób zaczynam y ręczne w prow adzanie kodu. N a głów ek tej m etody zostanie utw orzony autom atycznie i nie należy go zm ieniać.
Programowanie (pisanie kodu): p r i v a t e v o i d b u t t o n l _ C l i c k ( o b j e c t s e n d e r . S y s t e m . E v e n t A r g s e) C doubl e r , v; r = Double. Parse(t e x t B o x l . T e x t ); v = 4 . 0 / 3 * Math. P I * r * r * r ; l a b e ! 2 . T e x t = "Objętość k u l i wynosi: " + v . T o S t r i n g ( " N 4 " ); 3
18
C# w praktyce P rz eśled ź m y w p ro w ad zo n y kod. S ło w em k lu czo w y m doubl e dek laru jem y użycie dw ó ch zm iennych r i v. Ję z y k C # w y m ag a d e k la ro w an ia typu zm iennych (d anych) przed ich użyciem . T ab e la p rezen tu je d o p u szczaln e typy danych.
Typ C#
T yp .NET F ram ew ork
Z akres
Rodzaj - rozm iar
bool
Syst em. Bool ean
true, false
Logiczny, 32 bity
byte
Sy s t e m. By t e
0 do 255
Bez znaku, liczba całkowita, 8 bitów
sbyte
Syst em. SByt e
-128 do 127
Ze znakiem, liczba całkowita, 8 bitów
char
Syst em. Char
U+0000 do U+ffff
Znaki Unicode, 16 bitów
deci mal
Syst em. Deci mal
1.0 x 10'28 do 7.9 x 1028 Precyzja: 28-29 cyfr znaczą cych
Liczba stałopozycyjna (rzeczywista), 96 bitów
d o u bl e
Sy st em. Doubl e
±5.0 x 10"324 do ±1.7 x 10308 Precyzja: 15-16 cyfr
Liczba zmiennopozycyjna (rzeczywista), 64 bity
f 1o a t
System.Single
±1.5 x 10'45 do ±3.4 x 1038 Precyzja: 7 cyfr
Liczba zmiennopozycyjna (rzeczywista), 32 bity
i nt
System.Int32
-2,147,483,648 do 2,147,483,647
Ze znakiem, liczba całkowita, 32 bity
ui nt
System.UInt32
0 do 4,294,967,295
Bez znaku, liczba całkowita, 32 bity
1 ong
System.Int64
-9,223,372,036,854,775,808 Ze znakiem, liczba całkowita, do 9,223,372,036,854,775,807 64 bity
ul ong
System.UInt64
Odo 18,446,744,073,709,551,615
object
System.Object
short
S y s t e m. I n t l 6
-32,768 do 32,767
Ze znakiem, liczba całkowita, 16 bitów
ushort
System.UIntl6
0 do 65,535
Bez znaku, liczba całkowita, 16 bitów
s t r i ng
System.String
Do 2 miliardów znaków
Łańcuch znakowy w kodzie Unicode
Bez znaku, liczba całkowita, 64 bity Odwołanie do obiektu klasy, 32 bity
Wprowadzanie danych, formatowanie wyników
19
P latfo rm a .N E T F ram ew o rk w ym aga używ ania z u n ifik o w an y ch typów d anych. Z asto so w an ie typu doubl e je st ró w n o zn aczn e z u ty c ie m Syst em. Doubl e. D an e w p row adzane do o k n a edycyjnego T e x t B o x są z aw sze łań cu ch em znaków (w łaściw o ść T e x t ) . N ależy je przek ształcić w liczbę w ła ściw e g o typu. W y k o n u jem y to, u ży w ając m etody Parse: r = Double.Parse(textBoxl.T e x t ) ;
P o d czas o b liczan ia objętości należy zw rócić uw agę, że o p e ra to r “/ ” o zn acza w C # d zie le n ie c ałk o w ito liczb o w e (pom ija część u łam k o w ą), je ż e li liczn ik i m ia n o w nik są liczb am i całkow itym i. W naszym p rzypadku n ależy , zam iast d z ie le n ia „ 4 /3 ” , n ap isać 4 .0/3 (4.0 nie je s t ju ż zap isem liczby całkow itej) lu b użyć p rz y ro stk a „ d ” (jak double): „ 4 d /3 ” . L iczb a n je s t w arto ścią stałą, um ieszczoną w k lasie Mat h. D o stęp do niej u zy skam y, n ap isaw szy Ma t h . PI. D an e w y prow adzam y do ety k iety ( L a b e l ) na form u larzu . W ła śc iw o ść T e x t e ty kiety w y m ag a p o d an ia łań cu ch a znaków . W artość v m u sim y w ięc sk o n w erto w a ć do p ostaci łań cu cha. Z ro b im y to, używ ając m etody T o S t r i n g ( " N 4 " ). A rg u m en t w n a w ia sie p o d aje fo rm at liczby i liczbę m iejsc po p rzecinku d ziesiętn y m . P o n iew aż ch cem y podać tek st o b jaśn iający w y p ro w ad zan ą w artość, w p isu jem y łań cu ch in fo rm acy jn y i d o łąc za m y do niego v . T o S t r i n g ( " N 4 " ) : l a b e ! 2 . T e x t = "Objętość k u l i wynosi:
P o d a j promień:
" + v.ToString(” N4");
¡2*5
O b ję to ś ć k u li w ynosi: 65.4498
Oblicz
Rysunek 5. Kula
20
C# w praktyce
Ćwiczenie 3. Inny sposób wyprowadzenia wyników W y n ik i i kom unikaty m ożem y w yprow adzić do standardow ego okna MessageBox. p r i v a t e void b u t t o n l _ C l i c k ( o b j e c t sender, C d o u b l e r , v; r = Double.ParseCtextBoxl.Text); v = 4 . 0 / 3 * Math. P I * r * r * r ; M e s s a g e B o x . S h o w (" 0 bj ęt o ść kuli
wynosi:
S y s t e m . E v e n t A r g s e)
" + v . T o S t r i n g ( " N 4 " ),
"Wyni k i ", M e s s a g e B o x B u t t o n s .OK, M e s s a g e B o x I c o n .Informat i o n );
3 M e to d a Show klasy MessageBox służy do w y p ro w ad zan ia różnego rodzaju k o m u n ik a tó w w form ie stan d ard o w eg o okna.
P o d a j promień:
j
3.4
OK
Oblicz
Rysunek 6. MessageBox M e to d a Show m oże być u ż y w an a z ró żn ą liczbą argum entów . Jej bardziej ro z b u d o w a n a p o stać to: MessageBox. Show(komunikat, t y t u ł , M e s s a g e B o x D e f a u lt B u t t o n );
MessageBoxButtons, MessageBoxIcon,
G d zie: •
komuni k a t - kom u n ik at u m ieszczan y w oknie,
•
t y t u ł - ty tu ł okna,
•
M e s s a g e B o x B u t t o n s - ro d zaje przycisków ,
•
Me s s a g e Bo x I c o n - ro d zaje ikon (znaków g raficzn y ch w oknie),
•
Me s s a g e B o x D e f a u l t B u t t o n - dom yślny przycisk.
Wprowadzanie danych, formatowanie wyników
21
T rzy ostatnie argum enty są w yliczeniam i. W C # w y liczen ia używ am y łączn ie z nazw ą typu, np. M e s s a g e B o x I c o n . I n f o r m a t i o n . MessageBoxBut tons określa ilość i rodzaje przycisków . M oże przy jm o w ać na stępujące w artości: Nazwa
Opis
OK.
Wyświetl tylko przycisk OK.
OKCancel
Wyświetl przyciski OK i Anuluj.
AbortRetrylgnore
Wyświetl przyciski Przerwij, Ponów i Ignoruj.
YesNoCancel
Wyświetl przyciski Tak, Nie i Anuluj.
YesNo
Wyświetl przyciski Tak i Nie.
RetryCancel
Wyświetl przyciski Ponów i Anuluj.
W arto ści MessageBoxI con: Nazwa
Opis
Error, Hand lub Stop
Wyświetl ikonę Komunikat krytyczny.
Question
Wyświetl ikonę Pytanie ostrzegawcze.
Exclamation lub Warning
Wyświetl ikonę Komunikat ostrzegawczy.
Information lub Asterisk
Wyświetl ikonę Komunikat informacyjny.
None
Brak ikony.
W arto ści Messa ge Box De f a ul t But t on: Nazwa
Opis
Button 1
Domyślnym przyciskiem jest przycisk pierwszy.
Button2
Domyślnym przyciskiem jest przycisk drugi.
Button3
Domyślnym przyciskiem jest przycisk trzeci.
M eto d a Show zw raca określone w artości, zależne od n a c iśn ięte g o przy cisk u . M ożna to w y k o rzystać do p o staw ien ia pytania w oknie Mes sage Box.
C# w praktyce
22
Ćwiczenie 4. Pxtanie w oknie
MessageBox
F o rm u larz z p o p rzed n ieg o ćw iczen ia u zupełnim y o przycisk „Z am k n ij” . O p ro g ra m u je m y go następująco: p r i v a t e v o i d b u t t d n 2 _ C l i c k ( o b j e c t s e n d e r . S y s t e m . E v e n t A r g s e) C i f ( M e s s a g e B o x . S h o w ( " Z a k o ń c z y ć p r o g r a m ? " . "Uwaga", M e s s a g e B o x B u t t o n s . Y e s No, M e s s a g e B o x I c o n . Q u e s t i o n . MessageBoxDefa ult B u t t o n .Button 1 )==Di a 1ogResul t .Y e s ) thi s .C l o s e ( );
3
Rysunek 7. MessageBox Tak/Nie P e łn a lista zw racan y ch w arto ści Di al ogResul t: Stan
Opis
OK.
OK
Cancel
Anuluj
Abort
Przerwij
Retry
Ponów
Ignore
Ignoruj
Yes
Tak
No
Nie
None
Nic nie zwraca
4.
Podstawy języka C#
4.1.
Wyrażenia i operatory arytmetyczne
Ję zy k C # daje do dyspozycji ty pow e sym bole p o d staw o w y ch d z iałań a ry tm e tycznych oraz operatory u m ożliw iające osiąganie dużej zw ięzło ści zap isu kodu (zn an e ju ż z innych ję z y k ó w rodziny C).
Ćwiczenie 5. W ważenia i operatory O tw ieram y now y projekt (F ile/N ew /P roject). N azw iem y go „ D zia ła n ia ” . W n a zw ach p ro jek tó w nie m ożna używ ać polskich znaków (tutaj ,,ł”). N a zw a ta je s t dalej używ ana w k o d zie ja k o nazw a przestrzen i ( namespace Dzi al a n i a). P ro jek tu jem y w ygląd fo rm u larza, k o rzystając z p rzy b o rn ik a (T o o lB o x ) i okna w łaściw ości (P roperties): •
W łaściw o ści T e x t (form ularza) nadam y nazw ę „D zia ła n ia a ry tm e ty c z n e ” .
•
W y n ik i d ziałan ia program u będziem y oglądać w oknie t e x t B o x l . N an iesiem y go na fo rm u larz. Z m ienim y je g o w łaściw ość M u l t i l i n e na T r u e i ro zc iąg n iem y go do o d p o w ied n ich rozm iarów . O znacza to, że okno ed y cy jn e będzie w ie lo w ie rszow e. M ożem y rów nież ustalić w łasne p referencje w stosunku do czcio n k i u żyw anej w tym oknie (w łaściw ość Font ) . W arto je sz c z e zm ienić w ła śc iw o ść R e a d o n l y na T r u e (tylko do odczytu).
•
W d o ln ej części form ularza um ieścim y przycisk ( B u t t o n ) . Jego w ła ściw o ści T e x t n ad am y w artość: „O b licz” .
•
P o d w ó jn ie k likniem y projekt przycisku „O b licz” , ro zp o c zy n a jąc ed y cję p ro c e d u ry o b słu g i zdarzenia „przy k lik n ię ciu ” (Cl i ck).
p r i v a t e v o i d b u t t o n l _ C l i c k ( o b j e c t s e n d e r . S y s t e m . E v e n t A r g s e) ( i n t a = 5, b = 3. c. i l o r a z , r e s z t a : / / z mi e n n e a i b i n i c j u j e m y wł a s ny mi w a r t o ś c i a m i po c z ą t k o w y mi flo at iloraz2; s t r i n g l i n i a = ""; linia linia
+= "a = " + a . T o S t r i n g O + " \ r \ n " ; += "b = " + b . T o S t r i n g O + " \ r \ n " ;
C# w praktyce
24 / / o p e r a t o r " + = " - d o d a j do p o p r z e d n i e j w a r t o ś c i / / ( t u t a j ł ą c z e n i e łańcuchów) i l o r a z = a / b: / / d z i e l e n i e c a ł k o w i t o l i c z b o w e i n i a += " D z i e l e n i e c a ł k o w i t o l i c z b o w e : \ r \ n a / b = " + i 1oraz.To S tring() + " \r\n " ;
i l o r a z 2 = ( f l o a t ) a / b; / / wymuszeni a d z i e l e n i a " z w y k ł e g o " l i n i a += " D z i e l e n i e \ " z w y k ł e \ " : \ r \ n a / b = " + i 1 o r a z 2 . T o S t r i n g ( ) + "\r\n"; r e s z t a = a % b; / / r e s z t a z d z i e l e n i a l i n i a += " R e s z t a z d z i e l e n i a : \ r \ n a % b = " + r e s z t a . T o S t r i n g ( ) "\r\'n "; a + = 2; / / p o w i ę k s z a o 2 l i n i a += " P o w i ę k s z a o 2 : \ r \ n a += 2 / / a a++; lin ia
//powiększ a o 1 += " P o w i ę k s z a o l : \ r \ n a + +
= " +a.ToString()
+
+" \ r \ n " ;
//a = " +a.ToString() + "\r\n ";
c = * - a + b++; / / do a . p o m n i e j s z o n e g o o 1 . d o d a j b, a n a t ę p n i e z w i ę k s z b o i L i n i a += "Do a . p o m n i e j s z o n e g o o 1 . d o d a j b , \ r \ n a n a t ę p n i e z w i ę k s z b o 1 : " + " \ r \ n"; l i n i a += "c = - - a + b ++ = " + c . T o S t r i n g ( ) + "\r\n"; l i n i a += "a = " + a . T o S t r i n g ( ) + " \ r \ n " ; i n i a + = "b = " + b . T o S t r i n g ( ) + " \ r \ n " : i n t d = a > b ? l : 0 ; l i n i a + = " O p e r a t o r warunkowy ? : \ r \ n d = a > b ? 1 : 0 \ r \ n " ; l i n i a += "d = " + d . T o S t r i n g ( ) ; textBoxl.Text = lin ia ;
3 O p e ra to r d zie le n ia , / ’ m a znaczenie zależne od je g o operandów . Jeżeli są nim i ty p y całk o w ite , w y n ik iem je s t rów nież w artość całk o w ita (tzw . d zielen ie c ałk o w ito lic zb o w e). Jeżeli p rzy n ajm n iej je d e n z operandów je s t typu rzeczy w isteg o , w y n ik je s t ró w n ie ż rzeczy w isty . A by w y m u sić rzeczyw isty w ynik w p rzypadku d zielen ia d w ó ch w a rto ści całk o w ity c h , m o żn a w ykorzystać rzu to w an ie typów (np. (flo at)a / 2) lub z ap is je d n e j z liczb w p o staci rzeczyw istej (np. 4.0 / 3 lub 4d /3 ).
Podstawy języka C#
25
W C # m o żem y używ ać o p erato ró w przypisań: =, +=, -= , *=, /= , %=. P ierw szy z o p erato ró w je s t oczyw isty. P o zo stałe m ożna zilu stro w ać przy k ład em . Z am iast pisać: a = a + 2; m o żn a krócej a += 2; M o żn a ró w nież używ ać o p erato ró w inkrem entacji p rzed ro stk o w ej + + a lub p rz y rostkow ej a++, dekrem entacji p rzedrostkow ej - a , lub p rzy ro stk o w ej a - . W y jaśn im y ich zn aczen ie przykładam i: a = a + 1; je s t rów now ażne a += 1; lub a++; lub ++a; a = a -1; je s t ró w n o w ażn e a -= 1; lu b a— lub - a . In k rem en tacji i dek rem en tacji m ożna używ ać ja k o sam o d zieln y c h in stru k cji w w y rażen iach arytm etycznych. W y stąp ien ie o p erato ra przed z m ien n ą (p o stać p rz e d rostkow a) w w yrażeniu arytm ety czn y m oznacza p o d staw ienie^w artości p o m n iejszo n ej lub p o w ięk szo n ej o 1. Postać przy ro stk o w a p o w oduje u ży cie w arto ści pierw o tn ej w w y rażen iu ary tm etycznym , a następnie pom n iejszen ie lub p o w ię k sze n ie zm ien n ej o 1. O statn ia postać często je s t sto so w an a w instrukcjach p o w tarzan ia. C iek aw y m operatorem je st tró jarg u m en to w y o p erato r w a ru n k o w y „ ? ” . Z a s to sujm y g o w przykładzie: i n t d = a > b ? 1 : 0;
jest rów now ażne: int d ; i f (a > b) x = 1; el se x = 0;
Z n ak i „ \r\n ” , w ystępujące w niektórych łań cu ch ach , są zn ak am i steru jący m i. O znaczają zm ianę w iersza w w y p row adzanym tekście. Z esta w ien ie z n ak ó w sek w en cji sterującej p o k azuje tabela. Z nak
Opis
\a
Alann.
\b
Znak cofania.
\t
Znak tabulacji poziomej.
\r
Powrót karetki.
\ V
Znak tabulacji pionowej.
\f
Wysuw strony.
C# w praktyce
26 Opis
Z nak \n
Nowy wiersz.
\e
Znak escape.
\040
Znak ASCII w systemie ósemkowym (od 3 cyfr). Z nak\040 oznacza spację.
\x20
Znak ASCII w systemie szesnastkowym (2 cyfry).
\CC
Znak A S C II, kombinacja z klwiszem Ctrl, np. \cC oznacza CtrlC.
\u0020
Znak Unicode w systemie szesnastkowym (4 cyfry).
\ " l u b i nne z naki po \
Cudzysłów lub inne znaki.
4.2.
Instrukcje wyboru W a ru n k o w e stero w an ie p rzeb ieg iem w ykonania p ro g ram u u m o żliw iają in stru k
c je w y b o ru , o p e ra to r ? (w cześniej o m ów iony), instrukcje p ow tarzania, m eto d y w irtu a ln e i d eleg acje. In stru k cja w a ru n k o w e g o w yboru i f m a następującą składnię: if
(warunek) i nstrukcjel [ e l se instrukcje2]
C zęść ujęta w naw iasy k w ad rato w e [] je st opcjonalna. Instrukcję tę czasam i z a g n ie ż d ż a się, u m o żliw iając w y b ó r jed n e j drogi d ziałania spośród kilku.
Ćwiczenie 6. Analiza N a p isze m y p ro g ram a n alizu jący tekst w p ro w ad zo n y do okna edycyjnego. •
N a fo rm u larzu u m ieścim y dw a o kna edycyjne T e x t Box.
•
W ła śc iw o ść M u l t i 1 i n e d ru g iej k ontrolki zm ienim y na Tr ue .
•
N ad p ierw szy m oknem u m ieścim y napis (k o n tro lk a L a b e l ) : „W p ro w ad ź d o w o ln e z n a k i” .
•
U d o łu fo rm u la rza u m ieścim y p rzy cisk z napisem „ A n a liz u j” .
•
O p ro g ra m u je m y go n astępująco:
p r i v a t e v o i d b u t t o n l _ C l i c k ( o b j e c t s e n d e r . S y s t e m . E v e n t A r g s e) C string tekst, lin ia =
Podstawy języka C#
27
tekst = textB o xl.T ext; / / wykonaj d l a każdego znaku w łańcu chu foreach (char c in t e k s t ) C l i n i a += c + " • if
(C h ar.IsD ig it(c)) l i n i a += " c y f r a d z i e s i ę t n a \ r \ n " ; else i f (C har. Is U p p e r(c )) l i n i a += "duża l i t e r a \ r \ n " ; else i f (Char. Is L o w er(c)) l i n i a + = " ma ł a l i t e r a \ r \ n " ; else i f (Char. Is P u n ctu a tio n (c )) l i n i a += "znak i n t e r p u n k c y j n y \ r \ n " ; else i f (C har. IsW hiteSpace(c)) l i n i a += " o d s t ę p \ r \ n " ; e ls e i f ( C h a r . IsSymbol( c ) ) l i n i a += " s y m b o l \ r \ n " ; e l se l i n i a += " i n n y z n a k \ r \ n " ; 3
textB ox2.Text = l i n i a ; 3
In stru k c ja w a ru n k o w a i f je s t tutaj p ię c io k ro tn ie z a g n ie ż d ż o n a (p o sta ć k a s k a d o w a). W ten sp o só b p o z w a la w y b rać je d n ą z sie d m iu m o żliw o śc i. A lg o ry tm w y k o rz y stu je m eto d y lo g ic zn e (in ac ze j b o o lo w sk ie ) - z w ra c a ją c e t r u e b ąd ź f a l se ) , z d e fin io w a n e w stru k tu rze Char . In stru k c je w a ru n k o w e zo stały u m ie sz cz o n e w e w n ą trz in stru k c ji f o r e a c h . Je st to ro d zaj in stru k c ji p o w ta rz a n ia (tzw . pętli - inne o m ó w im y w n a stę p n y m ro z d z ia le ). P ę tla f o r e a c h m a n a stę p u ją c ą składnię: foreach(typ id e n ty fik a to r
in w yrażenie)
blok_instru kcji;
S to su je m y ją do tab lic (łań c u ch zn ak ó w je s t ró w n ie ż ta b lic ą ) i k o le k c ji o b ie k tó w . W w y g o d n y sp o só b p o z w a la w y k o n a ć o k re ślo n e p o le c e n ia n a w sz y stk ic h e le m e n ta c h ko lek cji.
C# w praktyce
28
1
Analiza wprowadzonego tekstu
1«
W p is z d o w o ln e znaki: IM a1.+
M - d u ż a l i te r a - o d s tę p a - m a ł a li te r a 1 - c y fra d z i e s i ę t n a „ - z n a k in te r p u n k c y jn y ♦ - sy m b o l
Analizuj
Rysunek 8. A naliza tekstu
Ćwiczenie 7. Obliczam \ dzień Wielkanocy W ie lo k ro tn e u ż y c ie in stru k c ji i f m o ż e m y p rze śle d zić, an aliz u jąc a lg o ry tm o b li c z a ją c y d a tę W ie lk a n o c y d la p o d a n e g o roku. N a p ro je k c ie fo rm u la rz a u m ieścim y : •
e ty k ie tę 1 a b e l l(„ P o d a j ro k :”) i p o le te k sto w e t e x t B o x l ,
•
p u s tą e ty k ie tę 1 a b e l 2 - tutaj w y p ro w a d z im y w y n ik . W y m a ż e m y tek st d o m y śln y z w ła śc iw o ś c i T e x t tej ety k iety . W arto u staw ić w ła ściw o ść A u t o s i z e e ty k ie ty na T r u e (n ie z n a m y d łu g o śc i ła ń c u c h a do n iej w y p ro w a d z a n e g o ),
•
p rz y c isk z n a p ise m „ O b lic z ” ,
•
n a p is „ W ie lk a n o c ” n a listw ie ty tu ło w e j ( T e x t ) ,
•
tło fo rm u la rz a m o ż e m y p rzy o z d o b ić o b raz k iem „ o k o lic z n o śc io w y m ” . W ła ś c i w o ść B a c k g r o u n d l m a g e fo rm u la rz a p o z w a la p o d ać n a z w ę p lik u g ra fic z n e g o .
p r i v a t e void b u t t o n l_ C lic k (o b je c t sender,
C i n t r , wiek, greg, string w ie!-"";
lz.c.
el,
faza.
r = In t3 2 . Parse(textB oxl.T e x t);
i f ( ( r <1583) C
| | ( r >4 9 0 2 ))
d;
S y s te m .EventArgs e)
Podstawy języka C#
29
M e s s a g e B o x . Show( " D a t a musi m i e ś c i ć s i ę w z a k r e s i e od 1 5 8 3 r . return; }
do 4 9 0 2 r . " ) ;
wi ek = r / 100 + 1; g r e g = 3 * w i e k / 4 - 12 ; l z - r %19 + 1; c = ( 8 * w i e k + 5 ) / 25 - 5 - g r e g ; e l = 5 * r / 4 - g r e g - 10 ; f a z a = ( 1 1 * l z + 20 + c) % 3 0 ; i f ( ( f a z a = = 2 5 ) && ( l z > 1 1 ) | | ( f a z a = = 2 4 ) ) faza++; d = 44 - f a z a ; i f ( d < 21) d += 30; d + = 7 - ( d + e l ) % 7; i f ( d <=31) w i e l = d . T o S t r i n g O + " marca"; e l se wiel = ( d - 3 1 ) . T o S t r i n g ( ) + " k w ie tn ia " ; l a b e l 2 . T e x t = "Wielkanoc:
" + wiel;
) W y ra ż e n ia lo g ic zn e w y stę p u jąc e w in stru k c ja c h w a ru n k o w y c h m o ż n a łą c z y ć o p e ra to ram i lo g ic z n y m i & & (ilo czy n AND) i II (su m a 0R). Istn ie je ró w n ie ż je d n o a rg u m en to w y o p e ra to r z a p rz e c z e n ia ! (NOT). U m ie sz c z o n y p rze d w y ra ż e n ie m lo g ic z n y m z m ien ia je g o w a rto ść na p rz e c iw n ą (z f a l se na t r u e b ąd ź n a o d w ró t). W w y ra ż e n ia c h lo g ic zn y c h m o że m y sto so w ać o p e ra to ry ró w n o śc i i relacji: •
==
- ró w n y ,
•
!=
—n ie ró w n y ,
•
<
- m n ie jsz y ,
•
<=
- m n ie jsz y lu b ró w n y ,
•
>
- w ię k szy ,
•
>=
- w ię k sz y lu b rów ny.
C# w praktyce
30
( 4 ; • ■ ki **!%
« •
Podaj* rok; ’** • • • .• * jHf: r '
t
•
i
»
<•
.
’
>•
j
« i.
> ..•••*»>•* *»«W »
f-a
• • .. ■**¥><< «‘• ■y 4 . i »t . >iv»’| » * t « J-r •! -
• ■
1» ¿4* lit
» • «
|
t <•'■* r
* '^ y * r £
* • * • 1 ' ' ' ■*■
■»* . »• * ! Ik-ł *» »•»' r i;» 4 f 4 . «. . ■ , i. ■• . -'»-i i * "+ :-r • '•
“ 1 *
i •>* ■
W ielk ano c: 11 kw ietnia - 4 Jt-T • •
fjr 1 * * i-Ł' r * • ' « • i • • IV «•« ■•+... i i » - ; - '• I
•j-lr 4
kr»**- ♦ <• *'x j t ‘.l i ■»•■*• ¿:M r - , '
•. i •. •v iM t V ł
* '*•»«# l*PV:r
. M
* /*
jJJHrg*«r f f #>«« ■
*• • i ’
s*j4 f V y 4 * *>* ■.
. , ,
V * * . « »•-*> ' « > h: ii i y ą w ł'~ ip § * vX* VVv-. "‘i i w l i l m
rTN.'1* V.t
■
-
4
»
. « i. *
* * | I
«' ‘ *
|r-frr
•• • ’
¥
*4
4.:* »*«
Sr ff1• ■» • * •_
"
4"tJ* P« »•*(•»•'»■r * « '• • —- •'■*».> i y 4‘ i-i* y-» « • •*»ł * i*.* « 4 f*r4. i. -i'* ił’-? * * . • * * • •
V* *«
* •
* I 1»»»' f
t S
»** - • •--«*’ •
i«:i- —V ■» - ► ?:* V
Rysunek 9. W ielkanoc C z a s a m i z a m ia st w ie lo k ro tn e g o z a g n ie ż d ż a n ia in stru k cji i f w y g o d n ie j je s t u ży ć in s tru k c ji w y b o ru swi t c h . Jej sk ła d n ia je s t n astęp u jąca: switch (w yrażenie) C case w y r _ s t a ł e : instrukcja i nstrukcja_skoku [ c a s e „.] [d efau lt: i nstrukcja i nstrukcja_skoku]
G d zie: •
wyrażenie -
w y ra ż e n ie , k tó re g o w a rto śc ią je s t
ty p p re d e fin io w a n y (ró w n ie ż
s t r i n g ) . W y ra ż e n ie je s t o b lic z a n e je d n o ra z o w o , n a stęp n ie je s t w y k o n y w a n y
sk o k d o e ty k ie ty z o d p o w ie d n ią w a rto śc ią , •
c a s e - sło w o k lu c z o w e ro z p o c z y n a ją c e e ty k ietę p rz y p a d k u ,
•
w y r _ s t a ł e - w y ra ż e n ie stałe np. 5,
•
i n s t r u k c j a - d o w o l n a in stru k c ja , b ą d ź b lo k {},
Podstawy języka C# •
31
i n s t r u k c j a _ s k o k u - o b o w ią z k o w a in stru k c ja skoku: b r e a k , c o n t i n u e , d e f a u l t , go t o , r e t u r n ,
•
d e f a u l t - b lo k d o m y śln y , w y k o n y w a n y , g d y w a rto ść w y r a ż e n i a n ie p a su je do
żad n eg o p rzy p a d k u . ✓
Ćwiczenie 8. Kalendarz N a p isz e m y a lg o ry tm o b lic za jąc y n u m e r d n ia ty g o d n ia d la p o d a n e j d a ty i z a m ie niający go n a n a z w ę dnia. F o rm u la rz b ę d z ie p o sia d ać 3 p o la te k sto w e p rz e z n a c z o n e n a p o d a n ie d n ia , m ie siąca i ro k u , e ty k ie ty z p o lec en iam i i e ty k ie tę p rz e z n a c z o n ą n a w y n ik . P rz y c is k „O blicz” b ę d z ie u ru ch a m ia ć m eto d ę w y liczającą. p riv ate void b u t t o n l _ C l i c k ( o b j e c t sender,
S y s t e m . EventArgs e)
C int d = m= r =
d, m, r ; Int32.P arse(textB oxl.T e x t); In t3 2 . Parse(textBox2.T e x t ) ; In t3 2 . Parse(textBox3.Text);
/ / a l g o r y t m o b l i c z j ą c y numer d n i a : i f (m < 3) (
r--; m + = 1 2 ; }
d = r+r/4-r/100+r/400+3*m -(2*m +l)/5+d+l; d += - d / 7 * 7 ; *
l a b e l 4 . T e x t = "Dzień tygodnia: II in s tru k c ja switch(d)
swi t ch,
";
w y b i e r a j ą c a nazwą d n i a t y g o d n i a
C
c a s e 0: C
l a b e l 4 . T e x t += " n i e d z i e l a " ; break; }
c a s e 1: C l a b e l 4 . T e x t += " p o n i e d z i a ł e k " ; break; }
b
C# w praktyce
32 c a s e 2: C l a b e l 4 . T e x t += " w t o r e k " ; break; 3 c a s e 3: C l a b e l 4 . T e x t += " ś r o d a " ; break; 3 c a s e 4: C l a b e l 4 . T e x t += " c z w a r t e k " ; break; 3 c a s e 5:
C la b e l 4 . T e x t += " p i ą t e k " ; break;
3 c a s e 6: C l a b e l 4 . T e x t += "sobota"; break; 3 3 3
D z ie ń :
IT
M ie s ią c :
5
R ok:
2004
D z ie ń tyg od nia : soboto
O blicz
R ysunek 10. Kalendarz
Podstawy języka C#
4.3.
33
Instrukcje powtarzania W w ielu p ro g ra m a c h o k reślo n y b lo k in stru k c ji n a le ż y w y k o n a ć w ie lo k ro tn ie .
U ży w am y w te d y z w y k le in stru k cji p o w ta rz a n ia , z w a n e j in aczej in stru k c ją ite rac y jn ą lub „ p ę tlą ” . Je d n ą z n ic h , f o r e a c h , u ż y w aliśm y ju ż w c ze śn ie j. Ję z y k C # d y sp o n u je je sz c z e trzem a in n y m i: f o r , w h i l e i do. . . whi l e. S k ła d n ia in stru k cji f o r : for ( [ i n i c j a l i z a c j a ] ; [w yr_logiczne]; [a k tu a liz a c ja ]) i nstrukcja;
G dzie: •
i n i c j a 1 i z a c j a - o p cjo n aln a d ek laracja i n a d an ie w arto ści p o c zą tk o w ej, np. x
•
w y r _ l ogi c z n e - o p c jo n a ln e w y ra ż e n ie lo g ic z n e sp ra w d z a n e po k a ż d y m p rz e b ie
=
1,
gu, np. x < 10, •
ak’t u a l i z a c j a - in stru k cja w y k o n y w a n a po k a ż d e j ite ra c ji (ró w n ie ż o p c jo n a ln a )
n a jc z ę śc ie j w y k o rz y sty w a n a do a k tu a liz a c ji z m ie n n e j ste ru ją c e j, np. x+ + , •
i n s t r u k c j a - d o w o ln a in stru k c ja b ą d ź b lo k in stru k c ji, k tó ry b ęd zie p o w ta rz an y .
In stru k c ja f o r ro z p o c z y n a d z ia ła n ie od in ic ja liz a c ji je d n e j b ą d ź w ielu z m ie n n y c h (łączn ie z e w e n tu a ln ą d e k la ra c ją ty p u ). D alej je s t sp ra w d z a n y w a ru n e k lo g ic zn y . Jeżeli w a ru n e k z w ra c a p raw d ę ( t r u e ) , je s t w y k o n y w a n a in stru k c ja b ą d ź b lo k in s tru k cji. N a stę p n ie je s t w y k o n y w a n a a k t u a l i z a c j a
(trze ci p a ra m e tr
for)
i ponow ne
sp ra w d z en ie w a ru n k u . W p rz y p a d k u p raw d y - je s t w y k o n y w a n y b lo k in stru k c ji. C y k l p o w ta rz a się, d o p ó k i w a ru n e k je s t p raw d ziw y .
Ćwiczenie 9. Funkcje trygonometryczne O b lic z y m y i w y p ro w ad z im y na fo rm u la rz sta b lic o w a n e w a rto śc i fu n k c ji try g o n o m e try c z n y c h sin (x ), c o s(x ), tg (x ) i ctg (x ) w z a k re sie od 0 d o 359 sto p n i, z k ro k ie m 1 sto p ień . F o rm u la rz b ę d zie z a w ie ra ć w ie lo w ie rsz o w e o k n o te k s to w e ( t e x t B o x l ) . U s ta w iam y je g o n ie k tó re w łaściw o ści: •
Mul t i 1 i n e = T r u e ,
•
Readonly = T r u e ,
•
S c r o l l B a r s = V e r t i c a l (p io n o w y p a sek p rz e w ija n ia ).
P rz y c is k u ru c h a m ia ją c y o b lic za n ie u m ie śc im y na d o le fo rm u la rz a . N a d o k n e m m o że m y u m ie śc ić e ty k ietę z n ag łó w k am i.
C# w praktyce
34
C # p o s ia d a k lasę Mat h u d o stę p n ia ją c ą sta ty c z n e m eto d y p u b lic zn e (czy li fu n k cje , z k tó ry c h m o ż e m y sk o rz y sta ć , nie tw o rząc o b iek tu tej k lasy , lecz u ż y w ają c sam ej n a z w y k la sy ) o b lic z a ją c e w a rto ści w ielu fu n k c ji m a te m a ty c z n y c h , m ię d z y in n y m i Sin(x),
Cos(x)
i T a n ( x ) . F u n k c ji c t g ( x )
nie m a, ale m o ż e m y ją o b lic z y ć ja k o
C o s ( x ) / S i n ( x ) . A rg u m e n ty fu n k cji try g o n o m e try c z n y c h m u sz ą być w y ra ż o n e w ra-
d ia n a c h . P rz e d o b lic z e n ie m w a rto ści fu n k cji p rze lic zy m y w ięc sto p n ie n a rad ia n y . W y k o rz y s ta m y z ależ n o ść : r = d / 1 8 0 * x , g d z ie : r - w a rto ść w y ra żo n a w ra d ia n ac h , x - w a rto ść w sto p n iac h . p r iv a t e void b u t t o n l _ C li c k ( object sender. C string lin ia ; double r; / / wyczyszczenie zawartości t e x t B o x l . C l e a r ( );
S y s t e m . EventArgs e)
okna t e k s t o w e g o
/ / in s tr u k c ja powtarzania f o r ( i n t x = 0 ; x ! = 3 6 0 ; x++) C / / z a m i a n a s t o p n i na r a d i a n y r = Math. P I/1 8 0 * x ; / / ł a ń c u c h wynikowy lin ia = x.ToStri n g () +" "+ M a t h . S i n ( r ) . T o S t r i n g ( " N 6 " ) +" "+ M ath.C os(r) .T o S trin g (" N 6 ") +" "+ Ma-th.Tan(r) .T o S trin g (" N 6 ” ) +" "+ ( M a t h . C o s ( r ) / M ath. S i n ( r ) ) . T o S t r i n g ( " N 6 " ) + " \ r \ n " ;
t e x t B o x l . T e x t += l i n i a ; ) 3
Z w ró ć m y u w a g ę n a tzw . p u n k ty n ie c ią g ło śc i fu n k cji tg (x ) i c tg (x ). D la x = 0° w a rto ś c ią C o s ( x ) / S i n ( x ) je s t + n ie sk o ń c z o n o ść i ta k ą w a rto ść o trz y m u je m y n a w y d ru k u (z a m ia s t sy g n a liz a c ji b łęd u d z ie le n ia p rz e z 0 i p rz e rw a n ia d z ia ła n ia p ro g ra m u ). P o z o s ta łe p u n k ty n ie c ią g ło śc i m ają tu w a rto śc i sk o ń c zo n e (w y n ik a to z p rz y b liż o n e g o s p o s o b u o b lic z a n ia ty ch fu n k cji - ro z w in ię c ia w szereg). S ą to je d n a k p rz y b liż e n ia w y s ta rc z a ją c e .
Podstawy języka C#
35
31 Tunkcje trygonometryczne sin(x)
0 1
0,000000 0,017452 2 0,034899 3 0,052336 4 0.069756 5 0,087156 6 0,104528 7 0,121869 8 0,139173 9 0,156434 10 0,173648 11 0,190809 12 0,207912
co s(x )
1,000000 0,999848 0,999391 0,998630 0.997564 0.996195 0.994522 0,992546 0,990268 0.987688 0,984808 0,981627 0,978148
tg(x)
0,000000 0,017455 0,034921 0,052408 0.069927 0,087489 0.105104 0,122785 0,140541 0,158384 0,176327 0.194380 0,212557
ctg(x) +nieskońc 2oność
57,289962 28,636253 19.081137 14,300666 11.430052 9,514364 8,144346 7,115370 6,313752 5.671282 5,144554 4.704630
v
Rysunek 11. Tablica funkcji trygonometrycznych W y ra ż e n ia z m ie n n o p o z y c y jn e (w C # są to ty p y f l o a t i d o u b l e ) m o g ą p rz y jm o w ać n a stę p u ją c e w arto ści: •
d o d a tn ie b ą d ź u jem n e zero,
•
d o d a tn ią b ą d ź u jem n ą n iesk o ń cz o n o ść ,
•
w arto ść n ie n u m e ry c z n ą (N a N - N o t-a -N u m b e r),
•
sk o ń c z o n e w arto ści n ie z e ro w e (zak res w ta b e li z ro z d z ia łu 3).
y
✓
Ćwiczenie 10. Wyznaczanie wartości 71 O b lic z y m y w arto ść stałej n. Z a sto su je m y m e to d ę w y k o rz y stu ją c ą g e n e ra to r lic zb lo so w y ch (p se u d o lo so w y c h ).
Opis metody: W y b ie ra m y lo so w o p u n k t o w sp ó łrz ęd n y c h (x , y) ta k ic h , że 0 <= x < 1 o ra z 0 < = y < 1.
S p ra w d z a m y , czy p u n k t leży w e w n ą trz ć w ia rtk i k o ła, w y k o rz y stu ją c to ż sa m o ść : x2+ y 2 < = 1. C z y n n o śc i te p o w ta rz a m y w ie lo k ro tn ie (np. m ilio n razy ). Je ż e li ro z k ła d w y lo s o w an y ch w sp ó łrz ę d n y c h x i y je s t ró w n o m ie rn y (co z a k ła d a m y ), to s to su n e k lic z b y p u n k tó w k leż ą c y c h w e w n ą trz ć w ia rtk i k o ła d o lic z b y w szy stk ic h p u n k tó w w y n o si (p o w ierz ch n ia ć w ia rtk i k o ła o p ro m ie n iu je d n o stk o w y m ).
tt/4
C# w praktyce
36 i
i
Y
1
private
void b u tto n l_ C lic k (o b je c t sender,
S y s te m .EventArgs e)
{
i nt i . k , n ; double x, y; k -
0;
n = 1000000;
/ / u t w o r z e n i e o b i e k t u k l a s y Random Random r nd = new RandomC) ; / / in s tr u k c ja powtarzania f o r ( i = 0; i < = n ; 1++) {
/ / generowanie w artości x = r n d . NextDouble ( ); y = r n d . NextDouble ( ); i f ( x * x + y * y < = t l)
pseudolosowych
k++;
3
la b e l 1 . Text = "PI = " + ( 4 . 0 * k / n ) . T o S t r i n g C ); 3
O b ie k ty klasy Random są generatoram i liczb pseudolosow ych. M etoda N e x t D o u b l e ( ) z w ra c a lic z b ę lo so w ą (ty p u doubl e) z p rz e d z ia łu 0 .0 do 1.0. In n e m e to d y tej k lasy g e n e ru ją c e lic zb y p se u d o lo so w e to: N e x t O (lic z b y ty p u i n t ) i N e x t B y t e s ( ) (w y p e łn ia w sk a z a n ą ta b lic ę w a rto ścia m i typu b y t e ) .
Podstawy języka C#
37
PI = 3 , 1 4 1 5 4 4
i::*i
. . \'f-Ą •
Rysunek 12. W yznaczanie wartości
k
P o n ie w a ż w sz y stk ie trzy p a ra m etry in stru k c ji f o r są o p c jo n a ln e m o ż n a je o p u ścić i u ży ć n a stę p u ją c e j p o sta ci tej in stru k cji: for ( ; ; ) instrukcja ;
O z n a c z a o n a tzw . p ętlę n ie sk o ń c z o n ą , k tó rą m o ż e m y je d n a k ste ro w a ć , d e k la ru ją c jej „ lic z n ik ” p rz e d u ży ciem f o r i z m ien ia ją c je g o w a rto ść ja w n ie w b lo k u in stru k cji. O p u szczen ie
p a ra m e tró w
w
takiej
in stru k cji
p o w ta rz a n ia
m ożem y
z re a liz o w a ć ,
w sp o m ag ając się in stru k cją w a ru n k o w ą . P rz y k ła d o w a p o sta ć m o że w y g lą d a ć n a s tę pująco: int x = 0;
for ( ; ; ) C i f (x > 1 0 ) b r e a k ; / / dowolne i n s t r u k c j e x++; )
Z a m ia st ta k iej p o staci in stru k cji f o r w arto u ży ć in stru k cji p o w ta rz a n ia whi 1 e. Jej sk ład n ia je s t n astęp u jąc a: while (w yr_logiczne) i nstrukcja;
N ie m u sim y tutaj sto so w ać in stru k cji w a ru n k o w e j, ab y o p u śc ić p ę tlę. Je ż e li w y rażen ie lo g ic z n e z w ra c a p raw d ę, p o w ta rz an ie je s t k o n ty n u o w a n e . N a le ż y je d n a k ja w n ie z m ie n ia ć w a rto ść lic z n ik a pętli i u sta w ić je g o w a rto ść p o c z ą tk o w ą p rze d ro zp o c zę c ie m iteracji.
C# w praktyce
38
Ćwiczenie 11. Szukamy największego wspólnego dzielnika N a jw ię k sz y w sp ó ln y d z ie ln ik o b lic z y m y , k o rz y sta ją c z a lg o ry tm u E u k lid e s a (w e rsja z o d e jm o w a n ie m ). M e to d a p o le g a na z a stę p o w a n iu w ięk szej liczb y ró ż n ic ą liczb y w ięk szej i m n ie j szej o ra z sp ra w d z a n iu , k ied y o b y d w ie b ęd ą rów ne. F o rm u la rz b ę d z ie z a w ie ra ć d w ie e ty k ie ty i d w a p o la te k sto w e , u m o ż liw ia ją c e p o b ra n ie d a n y c h , e ty k ie tę p rz e z n a c z o n ą na w y p ro w ad z en ie w y n ik u i p rz y c isk u ru c h a m ia ją c y o b lic z a n ie . private
void b u tt o n l_ C lic k to b je c t sender.
System. EventArgs e)
C
i n t x. y; x = In t3 2 . P arseitextB oxl.Text); y = In t3 2 . Parse(textB ox2.Text); / / p o w t a r z a j dopóki x j e s t whi 1 e ( x ! = y ) i f ( x > y) x -= y ; els e y -= x ;
r ó ż n e od y
1 a b e l 3 . T e x t = "NWD = " + x . T o S t r i n g ( ) ; }
r
■
•-
--
■
•■
p5 9
8 Największy wspólny dzielnik P o d a j p ie rw sz ą liczb ę naturalną: P o d a j d ru ą liczb ę n a tu ra ln ą
34896 1234
NW D **6
Oblicz
i
Rysunek 13. Największy wspólny dzielnik In n a p o sta ć in stru k cji iteracy jn ej to: d o . . . w h i l e : do i nstrukcj a ; while (w y r_ lo g ic zn e );
Podstawy języka C#
39
W y ra ż e n ie lo g ic zn e je s t tutaj o b lic za n e d o p ie ro po w y k o n a n iu in stru k c ji lu b b lo ku. P ętla z o sta je w ięc p rzy n a jm n ie j raz w y k o n an a.
Ćwiczenie 12. Obliczamy wartość funkcji silnia F u n k cja siln ia (o z n a c z a n a ja k o n!) je s t ilo c z y n e m k o le jn y c h lic zb n a tu ra ln y c h od 1 do n. F o rm u la rz z a w ie ra d w ie ety k iety , p o le te k s to w e i p rzy cisk . p r iv a te void b u t t o n l _ C l i c k ( o b j e c t sender,
S y s t e m . EventArgs e)
C
/ / d e k l a r a c j e i w a r t o ś c i początkowe i n t n, i = 1; / / l o n g s = 1 ; / / z a k r e s n do 20 d o u b l e s = 1; / / z a k r e s n do 170 n =Int32.P arse(textB oxl.Text); / / wy k o n u j d o p ó k i l i c z n i k j e s t m n i e j s z y l u b równy p o d a n e j l i c z b i e do s = s * i + + ; / / p o każdym o b l i c z e n i u i l o c z y n u z w i ę k s z l i c z n i k o 1 w h i 1 e ( i <= n ) ; l a b e l 2 . T e x t = " S i l n i a = " + s .T o S t r in g C ); ]
F u n k c ja siln ia je s t fu n k cją szy b k o ro sn ą cą . M a k sy m a ln a
w a rto ść d la ty p ó w c a ł
kow itych z o sta je o sią g n ię ta ju ż d la n =20. D e k la ru ją c n ja k o typ z m ie n n o p o z y c y jn y ( d o u b l e ) , m o ż e m y ten z ak res p o szerzy ć. O sią g a m y to je d n a k k o sz te m o trz y m a n ia
p rzy b liżo n eg o w y n ik u . ggj Obliczanie wartości funkcji silnia
P o d a j liczb ę n a tu r a h ?
jj 7 Q~
S ilnia = 7 ,2 5 7 4 1 5 6 1 530799E+306
O blicz
Rysunek 14. W artość funkcji silnia
5.
Typy referencyjne, tablice i kolekcje
5.1.
Typy wartościowe a referencyjne
W ję z y k u C # ty p y d an y ch d z ie lim y n a d w ie k a te g o rie : ty p y w a rto ś c io w e i ty p y referencyjne. P ie rw sz e z n ich p rz e c h o w u ją d a n e b e z p o śre d n io , np. i n t x = 5; o z n a c z a u tw o rzenie z m ie n n e j o n a zw ie x i p rz y p isa n ie je j w a rto śc i 5. D o tej k a te g o rii z a lic z a m y w szystkie ty p y p o d sta w o w e (tab e la z ro z d z ia łu 3) z w y ją tk ie m ty p u o b j e c t i s t r i n g . Je d n ą z p o d sta w o w y c h cech ty p ó w w a rto śc io w y c h je s t to , że p rz y p is u ją c je d n ą zm ienną d ru g ie j, tw o rz y m y je j k o p ię, np.: i n t x = 5; in t y = x;
//
utworzenie kopii
x.
T y p y re fe re n c y jn e d e k la ru ją o b ie k t o ra z d e fin iu ją re fe re n c ję (w s k a z a n ie ) do te g o obiektu. P rzy k ład : S t r i n g B u i 1 d e r a; a = new S t r i n g B u i 1 d e r ( ) ;
//
o p e r a t o r new i n i c j u j e
obiekt
D e k la ra c ję ty p u i in ic ja liz a c ję o b iek tu m o ż n a u m ie śc ię w je d n e j in stru k c ji: S t r i n g B u i 1 d e r a = new S t r i n g B u i 1 d e r O ;
✓
Ćwiczenie 13. Porównanie typów wartościowych i referencyjnych Z b u d u je m y p ro g ram p o ró w n u ją c y z a c h o w a n ie się z m ie n n y c h w a rto ś c io w y c h i refe re n c y jn y c h p o d c za s p rz y p isy w a n ia je d n e j z m ie n n e j d o d ru g iej. priv a te void b u t t o n l _ C l i c k ( object sender. C
/ / typy wartościowe i n t x, y; x = 5; y = x; / / utworzenie kopii x l o b e l l . T e x t = "y = " + y . T o S t r i n g ( );
S y s te m .EventArgs e)
C# w praktyce
42 x += 3; lab el2.Text =
"y = " + y . T o S t r i n g ( ) ;
/ / typy referencyjne S t r i n g B u i 1 d e r a , b; a = new S t r i n g B u i 1 d e r ( "Al a " ) ; / / o p e r a t o r new i n i c j u j e o b i e k t b = a; / / a i b w s k a z u j ą t e n sam o b i e k t l a b e l 3 . T e x t = "b = " + b . T o S t r i n g ( ) ; a . A p p e n d C " i A s " ) ; / / z m i e n i a j ą c a. z m i e n i a m y r ó w n i e ż b 1 a b e l 4 . T e x t = "b = " + b . T o S t r i n g ( ) ;
K la s a S t r i n g B u i l d e r z o sta ła z d e fin io w a n a w p rze strze n i S y s t e m . T e x t . N a le ż y w ię c z a d e k la ro w a ć u ż y c ie tej p rze strze n i: using S ystem .T e x t;
C z ę ś c ie j u ż y w an y je s t je d n a k ty p s t r i n g lub o d p o w ia d a ją c a m u k lasa S t r i n g . Je s t to je d n a k w y ją tk o w y p rz y p a d e k ty p u re fe re n c y jn e g o , g d z ie n o w y e g z e m p la rz m o ż n a u tw o rz y ć p rz y p isa n ie m id e n ty c z n y m ja k d la ty p ó w w a rto ścio w y c h . ly p y wartościowe i referencyjne
y = 5
y = 5
b = A la
b = Ada i A s
i
W ykonaj !
R ysunek 15. Typy wartościowe i referencyjne A b y z ro z u m ie ć ró ż n ic ę w z a c h o w a n iu się z m ie n n y c h ty p u w a rto śc io w e g o i re fe re n c y jn e g o , n a le ż y w y ja śn ić sp o só b ro z m ie sz c z a n ia ty ch z m ien n y c h w p a m ię c i o p e ra c y jn e j. Z m ie n n e ty p u w a rto śc io w e g o są u m ie sz c z a n e w o b sz arz e p a m ięc i z w a n y m sto se m , n a to m ia st z m ie n n e re fe re n c y jn e - na ste rcie, a o d w o ła n ie do n ich n a stosie. P o d s ta w ie n ie je d n e j z m ien n e j w a rto śc io w e j pod d ru g ą tw o rzy je j k o p ię na stosie. A n a lo g ic z n e p o d sta w ie n ie w sto su n k u d o z m ien n y c h re fe re n c y jn y c h p o w o d u je sk o -
Typy referencyjne, tablice i kolekcje
43
piow anie ta k ie g o sa m eg o w sk az an ia na stosie. O b ie k t w sk a z y w a n y na stercie dalej pozostaje je d e n . In stru k cja
Stos
1n t x - 5;
x=5
i n t y = x;
y=5 (kopia x)
S t r i n g B u i l d e r a;
a=@
S terta
--------- ► Ala
a = new S t r i n g B u i l d e r C ' A l a " ) ; S t r i n g B u i l d e r b = a;
b=@ ^
Z m ien n e w a rto śc io w e m o ż n a je d n a k u m ieścić n a stercie. P o k a z u je to n a stę p u ją c a sekw encja: In stru k cja
o .te rta S
Stos
■
.
i n t x = 5;
x= 5
o b j e c t o = x;
o=@
------------------------------
-------------- * 5
O p e ra c ję ta k ą n a zy w a m y p a k o w an ie m (b o xin g ). M o d y fik a c ja z m ie n n e j w a rto ściow ej nie z m ie n ia a u to m a ty c z n ie w arto ści u m ie sz c z o n e j na ste rc ie (to je s t ty lk o kopia z ro b io n a w cze śn iej). P ro c es o d w ro tn y , z w an y ro z p a k o w a n ie m (u n b o x in g ) lu b p o b ra n ie m w a rto śc i, m oże w y g lą d a ć n astęp u jąco : Stos
In i n sstru t r u k ccja ja object o = 5 Int x = (in t)
S te rta
o = @ - ----------- ------------- ►5 o;
x=5
T y p o k re śla n y w rz u to w a n iu np. (in t), m usi b y ć d o k ła d n ie tak i sam ja k ty p sp a kow any. W p rz e c iw n y m w y p ad k u k o m p ila to r zgłosi błąd (w y jątek ).
5.2.
Tablice T a b lic e są ty pam i refe ren c y jn y m i. S ta n o w ią g ru p ę (ciąg , m a c ie rz itd .) e le m e n tó w
o k reślo n eg o ty p u . D e k la ru je m y je , u ży w ając n a z w y ty p u , n a w ia só w k w a d ra to w y c h i n azw y w ła sn ej. N a stęp n ie d e fin iu je m y w sk az an ie i ro z m ia r tab licy , u ż y w a ją c o p e ra to ra new.
C# w praktyce
44 P rz y k ła d : in t[] tabl; //deklaracja tablicy t a b l = new i n t C I O ] ; / / d e f i n i c j a w s k a z a n i a do t a b l i c y / / o 10 e l e m e n t a c h
D o s tę p do p o sz c z e g ó ln y c h e le m e n tó w tab licy u z y sk u jem y p o p rz e z ich in d ek i N u m e ro w a n ie in d e k só w z a c z y n a się od 0. T a b lic e m o g ą b y ć w ie lo w y m ia ro w e . P rz y k ła d y : / / t a b l i c a dwuwymi arowa f l o a t [ . ] t a b 2 = new f l o a t [ 1 0 , 5 ] ; / / t a b l i c a trójwymiarowa d o u b l e C. . ] t a b 2 = new d o u b l e C I O . 5 , 8 ] ;
M o ż n a tw o rz y ć ró w n ie ż ta b lic e ta b lic. N ie m u sz ą to b y ć ju ż je d n a k ta b lic e p r s to k ą tn e . Ich tw o rz e n ie je s t je d n a k b a rd z iej p rac o ch ło n n e . T a b lic e m o ż n a w y p e łn ia ć w a rto śc ia m i p o d czas ich d e k la rac ji. W te d y m o żen s to s o w a ć sk ró c o n y zapis. intQ ]
t a b l = C4. 8 ,
5. 8}
W ó w c z a s ro z m ia r ta b lic y je s t o k re śla n y na p o d sta w ie liczb y p o d a n y c h elem e tó w . In d e k s y są im p rz y d z ie la n e w e d łu g k o le jn o śc i w y stą p ie n ia (od 0 d o n -1 ). Z d e fin io w a n a ta b lic a m a n ie z m ie n n y ro z m ia r (jeżeli je s t to ta b lic a w ie lo w y m ro w a - d o ty c z y to k a ż d e g o w y m iaru ).
Ćwiczenie 14. Sito Eratostenesa L ic z b y p ie rw s z e to lic z b y n a tu ra ln e p o d z ie ln e ty lk o p rze z sieb ie i p rz e z 1. Z n a jd z ie m y w sz y stk ie lic zb y p ie rw sz e z z ak resu od 1 do 10000. Z a s to s u jm y g o ry tm z w a n y site m E ra to sten e sa .
Projekt: •
d e k la ru je m y ta b lic ę w a rto ści lo g ic z n y c h o in d ek sac h od 2 d o 10000, tab w y p e łn ia m y w a rto śc ia m i t r u e (p ra w d a ),
Typy referencyjne, tablice i kolekcje
•
2
45
pozycję analizy ustawiam y na elem encie o indeksie 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
t •
2 je s t lic z b ą p ierw szą , a w ięc w szy stk ie je j w ie lo k ro tn o śc i n ie są lic z b a m i p ie rw szy m i - w y k re śla m y je ( f a l se):
1 I 1X1 2
3 4
1X1 1X1 5
6
7 8
1X1
1X1 1X1
9 10 11 12 13 14 15
1X1 16
1X1
1X1' 1X1 1X1
17 18 19 20 21 22 23 24
1X1
1X1
1X1
25 26 27 28 29 30
! •
p rz e su w a m y p o z y c ję an aliz y do n a stęp n e g o e le m e n tu n ie w y k re ś lo n e g o ( t r u e ) i w y k re śla m y w szy stk ie je g o w ie lo k ro tn o śc i:
1 I 1X1 2
3 4
5
1X1 IXIXIXI 6
7 8
1X1 IXIXIXI
9 10 11 12 13 14 15
16
1X1
IXIXIXI Ix l
17 18 19 20 21 22 23 24
IX I^IX I
1X1
25 26 27 28 29 30
1 •
2
p o w ta rz a m y p o p rze d n i k ro k , d o p ó k i nie d o jd z ie m y do k o ń c a ta b licy :
I 1X1 3 4
5
1X1 IXIXIXI 6
7 8
9 10
1X1 IXIXIXI
11 12 13 14 15
16
1X1
IXIXIXI IXIXIXIXIXI
17 18 19 20 21 22 23 24
IXI
25 26 27 28 29 30
! •
w y p ro w a d z a m y w y n ik i, d ru k u ją c in d ek sy e le m e n tó w n ie w y k re ślo n y c h . F o rm u la rz b ę d zie z a w ie ra ć p rz y c isk u ru c h a m ia ją c y sz u k a n ie i w ie lo w ie rsz o w e
okno tek sto w e. Je g o p o d sta w o w e w ła ściw o ści u sta w im y w o k n ie P ro p e rtie s: •
Mul t i 1 i ne = T r u e ,
•
Readonly = T r u e .
•
S c r o l l B a r s = V e r t i c a l (p io n o w y p a sek p rze w ijan ia).
p r i v a t e void b u t t o n l _ C l i c k ( o b j e c t s e nder, S y s t e m .EventArgs e) C const i n t MAX = 1 0 0 0 0 ; / / d e k l a r a c j a w a r t o ś c i s t a ł e j b o o l C ] t a b = new b o o l [ M A X ] ; / / t a b l i c a w a r t o ś c i l o g i c z n y c h i nt p o z. i ; s trin g s=""; for
( i = 0 ; i < MAX; i + + ) t a b ti] = true; / / wypełnienie t a b l i c y wartościami
true
46
C# w praktyce
poz = 2; w h i l e ( p o z < MAX) C i f (tab[poz3) C i = 2; w h i l e ( i * poz < MAX) C t a b t i * poz] = f a l s e ;
//
„wykreślanie"
i+ + ; } ] p o z + + ; 3
t e x t B o x l . Cl e a r O ; f o r ( i = 2 ; i < MAX; i + + ) / / d r u k o w a n i e i n d e k s ó w e l e m e n t ó w z w a r t o ś c i a m i tnie i f C tab C iD ) s += i . T o S t r i n g ( )+ " "; t e x t B o x l . T e x t = s; 3
2 3 5 7 11 13 17 19 113 127 131 137 139 239 241 251 257 263 373 379 383 389 397 503 509 521 523 541 647 653 659 661 673 809 811 821 823 827 953 967 971 977 983 1087 1091 1093v1097 1213 1217 1223 1229 1319 1321 1327 1361 1459 1471 1481 1483 1579 1583 1597 1601 1699 1709 1721 1723 1847 1861 1867 1871 1987 1993 1997 1999 2099 2111 2113 2129 2243 2251 2267 2269
23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 * 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 w 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 1J03 1109 11171123 1129 1151 1153 1163 1171 1181 1187 1193 1201 1231 1237 12491259 1277 1279 1283 1289 1291 1297 1301 1303 1307 1367 1373 13811399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1487 1489 14931499 1511 1523 1531 1543 1549 1553 1559 1567 1571 1607 1609 16131619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1733 1741 17471753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1873 1877 18791889 1901 1907 1913 1931 1933 1949 1951 1973 1979 2003 2011 20172027 2029 2039 2053 2063 2069 2081 2083 2087 2089 2131 2137 21412143 2153 2161 2179 2203 2207 2213 2221 2237 2239 2273 2281 22872293 2297 2309 2311 2333 2339 2341 2347 2351 2357 V!
R ysunek 16. Liczby pierwsze - sito Eratostenesa
Typy referencyjne, tablice i kolekcje
47
✓
Ćwiczenie 15. Obliczamy dokładnie silnię z 1000 Tablice m ożna w ykorzystać do przechow yw ania w artości nie m ieszczących się w zm iennych typów prostych (np. 1ong). O bliczym y silnię z 1000. Ponieważ typ całkow ity l o n g pozw ala jedynie na prze chowanie w artości z 20!, a typ rzeczyw isty D o u b l e na przybliżone obliczenie silni maksymalnie ze 170, zastosujm y tablice do przechow yw ania w artości silni „po ka wałku”. Podobną m etodę stosuje się przy tzw. pisem nym m nożeniu. Projekt: •
Zadeklarujem y tablicę, która pomieści obliczoną w artość silni:
Ustalim y liczbę i typ jej elementów. W jednym elem encie tablicy przechow am y 6 cyfr. Zastosujem y typ i n t . Aby obliczyć, ile elem entów pow inna m ieć tablica, należy oszacow ać liczbę cyfr 1000! M ożna to zrobić, korzystając ze w zoru Stirlinga (słownik m atem atyczny). W ynika z niego, że liczbę cyfr m ożna oszacow ać, korzysta jąc z wyrażenia: (n + 0,5) * log(n) - n/3 + 2 dla n = 1000, liczba cyfr wynosi w przybliżeniu 2700. Z aokrąglim y to z nadm iarem do 3000. W jednym elem encie tablicy przechow am y 6 cyfr.. Potrzeba w ięc 3000/6, czyli 500 elementów: c o n s t MAX = 5 0 0 ,
0]
= 1,
•
w pierw szym elem encie tablicy umieścimy wartość początkow ą: a pozostałe elem enty wyzerujemy,
•
w p ro w a d z im y d w ie zm ien n e p o m o cn icze: k = 1 i 1 = MAX - i , k tó re p o s łu ż ą d o
a [
p o sz u k a n ia p ie rw sz e g o n iez ero w e g o e le m e n tu z p raw ej i z lew ej stro n y ta b lic y , p o d c za s w y lic z a n ia k o lejn y ch w arto ści silni (w ten sp o só b u n ik a m y n ie p o trz e b n ych m n o ż e ń p rze z 0),
•
w yliczym y kolejne wartości silni, m nożąc aktualną w artość elem entu tablicy aCj] przez licznik „i” oraz dodając wartość przeniesienia z poprzedniego ele mentu (na tym polega „pisem ne” mnożenie),
•
w ydrukujem y wartość silni od elementu o najw iększym indeksie (z w artością niezerow ą) do elem entu o indeksie 0,
•
podczas w ydruku musimy uzupełniać początkow ym i zeram i każdy elem ent ta blicy, m ający mniej niż 6 cyfr (zera w środku liczby m ają znaczenie).
C# w praktyce
48
F o rm u la rz b ę d z ie m ia ł p o d o b n ą b u d o w ę ja k w ć w icz en iu p o p rze d n im . private
void b u t t o n l _ C li c k io b j e c t sender,
S y s t e m . EventArgs e)
C c o n s t i n t MAX = 5 0 0 ; i n t i , j , k , 1 = MAX - 1 , n, p. w; i n t [ ] a = new i n t C M A X ] ; / / deklaracja ta b lic y string lin ia = ; n = In t3 2 . ParseCtextBoxl.Text); te x tB o x 2 . C l e a r ( ); / / wyczyszczenie zawartości
okna t e k s t o w e g o
a [ 0 1 = 1 ; / / wa r t oś ć ^ p o c z ą t k o w a f o r ( j - 1 ; j < MAX; j + + ) a [ j ] = 0; / / zerow an ie elementów t a b l i c y for C
(i
=2;
i <= n ; 1 + + )
p = 0; k = 0; 1 = M A X w h i l e ( a Ck ] == 0) k++; whi l e ( a C1 ] = 0 ) 1 - - ;
1; //
s z u k a n i e elementów zerowych
1++; for C
( j = k; j
< - 1; J + + )
w = a C j ] * i + p; p = w / 1000000; aCj] = w - 1000000*p;
/ / „mnożenie pisemne” / / przeniesienie / / z a w a r t o ś ć k omór ki
} w.
3
for C
( j = 1; j
>= 0; j - - )
for
( i = 1; i <= 6 - ( a [ j ] . T o S t r i n g ( ) ) . L e n g t h ; 1 + + ) l i n i a += " 0 " ; / / u z u p e ł n i a n i e z e r a m i do 6 p o z y c j i l i n i a += a [ j ] . T o S t r i n g ( );
)
te x tB o x 2 .Text = l i n i a ; }
Typy referencyjne, tablice i kolekcje
Podaj lic z b ę
49
[1000
0000004023872600770937735437024339230039857193748 a 6421071463254379991042993851239862902059204420848 6969404800479988610197196058631666872994808558901 3238296699445909974245040870737599188236277271887 it 3251977950595099527612087497546249704360141827803 4646496291056393887437886487337119181045825783647 8499770124766328898359557354325131853239584630755 5740911426241747434934755342864657661166779739666 8820291207379143853719588249808126867838374559731 7461360853795345242215865932019280908782973084313 9284440328123155861103697680135730421616874760967 5871348312025478589320767169132448426236131412508 7802080002616831510273418279777047846358681701643
O b lic z
Rysunek 17. Dokładna wartość 1000! ✓
Ćwiczenie 16. Tworzxm\ stos w tablicx S to s je s t stru k tu rą b u d o w a n ą w ten sp o só b , że o sta tn io w p ro w a d z a n y e le m e n t je s t pierw szym d o u su n ię c ia (a n g ie lsk ie o k reślen ie: L IF O - L a st In F irst O u t). M o ż n a g o porów nać do sto su u ło żo n y c h k sią że k - je d n a na d ru g iej. S to s m o ż e m y u tw o rzy ć , w y k o rz y stu ją c tab lice . P e w ie n p ro b lem s tw a rz a je d n a k n iezm ien n a d łu g o ść tab licy . •
Z b u d u je m y fo rm u la rz z o k n em te k sto w y m d o p o b ie ra n ia e le m e n tó w d w o m a p rz y c isk a m i (D o d a j i U suń) o raz z d ru g im o k n e m te k sto w y m d o w y p ro w a d z a n ia b ież ąc ej z a w a rto śc i stosu.
•
T a b lic ę z a d e k la ru je m y p o za m eto d am i o b słu g i p rz y c isk ó w (w d e fin ic ji k la sy F o r m l) , p o n ie w a ż b ęd zie u ż y w an a p rze z o b y d w ie m eto d y . Z d e fin iu je m y ją p ie rw o tn ie z ro zm iare m 0. T rze b a je j p rz y p isa ć w sk a z a n ie (o p e ra to r new), n a to m ia st n ie b ę d z ie p o sia d ać je s z c z e żad n y ch e le m e n tó w .
•
N ie z m ie n n o ść ro zm iaró w tab licy o m in ie m y n a stę p u ją c o : o
u tw o rz y m y tab licę p o m o c n ic z ą t a b ,
o
p rz e n ie sie m y do niej d an e z tab licy s t o s ,
o
u tw o rz y m y n o w ą tab licę s t o s .
p r i v a t e s t r i n g [ ] s t o s = new s t r i n g E O ] ; int dl; / / rozmiar t a b lic y p r iv a t e void b u t t o n l _ C l i c k i o b j e c t sender,
S y s t e m . EventArgs e)
C# w praktyce
50 C if C
(textB oxl.Text
!= " " )
t e x t B o x l . Focus(); / / ustawienie kursora w oknie textB o xl t e x t B o x l . S e l e c t A l 1 O ; / / z a z n a c z e n i e z a w a r t o ś c i okna dl = s t o s . L e n g t h + 1 ; / / nowa d ł u g o ś ć s t o s u / / utworzenie kopii ta b lic y s t r in g C ] tab = ( str1ngC] ) s t o s . C l o n e ( ); / / ponowne u t w o r z e n i e t a b l i c y s t o s = new s t r i n g t d l l ;
stos
( z i nnym r o z m i a r e m )
« / / / p r z e k o p i o w a n i e z a w a r t o ś c i t a b do s t o s tab.CopyTo(stos, 0); / / pobranie o s ta tn ie g o elementu z te x tB o x l s t o s t s t o s . Length-13 = t e x t B o x l . T e x t ; / / p o ł ą c z e n i e elementów t a b l i c y w łańcuch t e x t B o x 2 . T e x t = S t r i n g . J o i n ( " ’’ . s t o s ) ;
} 3
private
void b u tto n 2 _ C lic k (object sender.
S y s te m .EventArgs e)
C if
( s t o s . Length
!= 0)
C I I nowa d ł u g o ś ć s t o s u ( b e z o s t a t n i e g o e l e m e n t u ) dl = s t o s . L e n g t h - 1 ; strin g[]
t a b = new s t r i n g t d l ] ;
/ / przekopiowanie zawartości A rra y .Copy(stos, tab, d l);
s t o s do t a b
/ / ponowne u t w o r z e n i e . t a b l i c y s t o s ( z i nnym r o z m i a r e m ) s t o s = new s t r i n g C d l ] ; tab.CopyTo(stos. 0); te x tB o x 2 .Text = S t r i n g . J o i n ( " " .s t o s ) ; 3 3
Typy referencyjne, tablice i kolekcje
51
T ab lic e d z ie d z ic z ą z k lasy A r r a y . O trz y m u je m y w ię c d o d y sp o z y c ji k ilk a u ż y tecznych m eto d . W y ja śn im y ich zn aczen ie: •
( s t r i n g C ] ) s t o s . C l o n e ( ) - u tw o rze n ie k o p ii (tzw . p ły tk ie j) ta b lic y s t o s ,
•
t a b . C o p y T o ( s t o s , 0 ) - p rz e k o p io w a n ie w sz y stk ic h e le m e n tó w z ta b lic y t a b do
tab licy s t o s , p o c z ą w sz y od w sk a z a n e g o m ie jsc a (tu od e le m e n tu o in d e k sie z e ro w y m ), •
Array.Copy(stos,
tab,
dl)
- je s z c z e in n a m e to d a k o p io w a n ia e le m e n tó w
z tab licy s t o s do tab licy t a b , dl - lic z b a e le m e n tó w do p rz e k o p io w a n ia , •
S t r i n g . J o i n ("
",
s t o s ) - u tw o rze n ie ła ń c u c h a z e le m e n tó w ta b lic y , u ż y w a ją c
se p a ra to ra p o d a n e g o ja k o p ierw szy a rg u m e n t (tu taj sp a cja ), 4
•
t e x t B o x l . Focus () - u sta w ien ie k u rso ra n a w sk a z a n e j k o n tro lc e ,
•
t e x t B o x l . Sel e c t A l 1 () - z a z n a c z e n ie z a w a rto śc i k o n tro lk i,
•
s t o s . L e n g t h - w ła ściw o ść p o d a ją c a ilość e le m e n tó w tab licy .
fr Ż 3 ~ 4 5 6 7 8 9 10
Rysunek 18. Stos w tablicy
5.3.
Kolekcje
Biblioteka Framework Class Libraty udostępnia zestaw struktur danych zw anych kolekcjami. K olekcje mają podobne zastosow ania do tablic. Służą do grupow ania elementów. M ogą jednak, w odróżnieniu od tablic, zm ieniać swoje rozm iary i grupo wać elem enty różnych typów. K olekcje zostały zdefiniow ane jako klasy. Przechow ują elementy w postaci obiektów. M a to swoje konsekw encje. O ile tablice, będące typem referencyjnym, przechow ują na stercie typy w artościow e (np. int), o tyle kolekcje »
C# w praktyce
52
przechow ują typy referencyjne. Kolekcje nie muszą grupować elem entów tego sa m ego typu i m ogą w trakcie swojego istnienia zm ieniać rozmiary. K olekcje znajdziem y w przestrzeniach nazw System .Collections i System .C ollections.Specialized. Do podstaw ow ych klas kolekcyjnych m ożem y zaliczyć: •
Ar r a y L i s t — lista,
•
Queue — k o lejk a,
•
S t a c k — stos,
•
H a s h t a b l e - kolekcja par: klucz - w artość,
•
S o r t e d Li s t - lista par: klucz - w artość sortująca wartości według klucza,
•
Bi t A r r a y - spakow ana tablica w artości logicznych t
( t r u e , f a l se).
i
Ćwiczenie 17. Tworzymy stos jeszcze raz B udow ę stosu zrealizujem y, w ykorzystując kolekcję S t a c k . Jako dynam iczna struktura danych kolekcja um ożliw ia dokonyw anie zm ian swoich rozm iarów. M etody P u s h ( ) i P o p ( ) realizują głów ne zadania stosu. Form ularz m oże pozostać taki sam, jak w poprzednim ćwiczeniu, private
S t a c k s t o s = new S t a c k O ;
//
deklaracja
private
void b u t t o n l_ C lic k to b je c t sender.
stosu
S y s t e m . EventArgs e)
C if
( t e x t Box2.T e x t !="")
C
t e x tB o x 2 . Focus(); textBox2. S electA l1 (); / / u m i e s z c z e n i e e l e m e n t u na s t o s i e s t o s . Push(t e x t Box2.T e x t ) ; string
CD t a b = new s t r i n g L s t o s . C o u n t ] ;
//przekopio w an ie zawartości stos.CopyTo(tab.O);
//
tablica
pomocnicza
s t o s u do t a b l i c y
/ / p o ł ą c z e n i e elementów t a b e l i w łańcuch textB oxl.Text = S tring.Joint" ".ta b ); 3 3
p r i v a t e void b u tto n 2 _ C lic k to b je c t sender. C
S y s t e m . E v e n t A r g s e)
Typy referencyjne, tablice i kolekcje if C
53
( s t o s . Count > 0) s t o s . P o p O ; / / u s u n i ę c i e elementu ze st o s u s t r i n g [ ] t a b = new s t r i n g C s t o s . C o u n t ] ; s to s .CopyTo(tab.O); textBoxl.Text = S trin g.Join(" ".ta b );
}
M e to d a s t o s . C o u n t p o d a je liczb ę e le m e n tó w n a stosie. T a b lic a p o m o c n ic z a z o sta ła z a sto so w a n a w y łą c z n ie w c e lu p ó ź n ie js z e g o p o łą czenia je j e le m e n tó w w ła ń c u c h i w y p ro w a d z e n ia do o k n a te k s to w e g o . D o fu n k c jo now ania sto su n ie je s t p o trzeb n a. D w ie p o d sta w o w e m eto d y d z ia ła ją c e na k o le k c ji S t a c k to: •
P u s h () — u m ie sz c z e n ie e le m e n tu na sto sie,
•
P o p ( ) - u su n ię c ie e le m e n tu ze stosu.
Podaj element:
D odaj
Z a w a rto ś ć stosu:
110 98 76 54 32 1
Rysunek 19. Stos
U su ń
6.
Metody, przekazywanie argumentów
D otychczasow e nasze program y w ykorzystyw ały jedynie m etodę obsługi zda rzenia „przy kliknięciu”. Bardziej rozbudow ane aplikacje będą zaw ierać w ięcej metod obsługi różnych zdarzeń i innych metod (funkcji) w łasnych - użytkownika. Metod w łasnych używamy najczęściej po to, żeby nie pow tarzać fragm entów kodu, aby kod programu był bardziej czytelny i zwięzły. Raz napisany kaw ałek kodu możemy oznaczyć odpow iednią nazwą i w ielokrotnie się do niego odnosić. Takie „odniesienie” będziem y nazywać wywołaniem funkcji (m etody). M ożem y je w yw o ływać z różnym i danymi w ejściowymi (argum entam i). M etody m ogą w ykonyw ać określone czynności, zw racać wartości i m odyfikow ać dane wejściow e. Składnia definicji metody: [ m o d y f i k a t o r ] v o i d | t y p nazwa( [ r e f | o u t ] typ .... [ r e f | o u t ] typ [ [i n s trukcje] [return wyrażenie] )
arg_l. arg_n)
Uwaga: znak „I” oznacza lub. Przed nazw am i m etod możemy używać tzw. specyfikatorów zasięgu: •
p u b l i c - wskazuje, że m etoda będzie dostępna (m ożna ją w yw oływ ać) we w szy
stkich innych klasach, •
p r o t e c t e d - m etoda będzie dostępna w klasach pochodnych,
•
p r i v a t e - metoda będzie dostępna tylko w swojej klasie (m odyfikator domyślny).
M etody w yw ołujem y, wpisując ich nazwy, a po nich (w naw iasie) listę argum en tów rozdzielonych przecinkami: nazwa( [ r e f | o u t * ] a r g _ l
[ r e f | o u t ] typ arg_n)
Jeżeli w definicji metody występuje słowo kluczow e v o i d , m etoda nie zw raca wartości, a jedynie w ykonuje określone czynności (w wielu innych językach progra mowania jest to procedura). Zam iast słowa v oi d m oże w ystąpić nazw a typu (np. i n t ) . Wtedy wartość metody w yprowadzam y, używając słow a r e t u r n , a po nim w yrażenia obliczającego w yprow adzaną wartość.
C# w praktyce
56
A rgum enty przekazujem y do metod przez wartość lub przez referencję (inaczej: przez zm ienną, przez adres). Pierwszy sposób jest sposobem domyślnym. Przekazując argum ent przez referencję, należy w definicji i w wywołaniu metody um ieścić słowo r e f lub out . W drugim przypadku (z out ) konieczne jest przypisanie nowej wartości do argum entu przed pow rotem z metody. Jaka jest różnica pom iędzy tymi sposobami przekazyw ania argum entów ? S praw dzim y to, tw orząc i urucham iając własny przykład.
Ćwiczenie 18. Skracamy ułamki N apiszem y program pobierający z okien T e x t B o x dwie liczby naturalne i skraca jący ułam ek utw orzony z,ty ch liczb. W tym celu zdefiniujem y własną m etodę i n t n w d ( i n t x . i n t y ) , zw racającą najw iększy wspólny dzielnik z podanych argum en tów. M etodę tę w ykorzystam y w procedurze (m etodzie, która nie zw raca wyniku) skracającej nasz ułamek: v o i d s k r a c a j ( r e f i n t k,
r e f i n t 1)
O bliczenia uruchom im y, naciskając przycisk S k r a c a j . in t C
nw d(in t x.
i n t y)
w h i1e ( x != y ) i f (x > y) x -= y; e l s e y - = x; r e t u r n x;
} v.
v o i d s k r a c a j ( r e f i n t k . r e f i n t 1) C i n t d z i e l n i k = nwd(k. 1 ); k /= d zie ln ik ; 1 /= d zieln ik; 3 p r i v a t e v o i d b u t t o n l _ C l i c k ( o b j e c t s e n d e r , S y s t e m .EventArgs e) C in t lic z n ik = In t3 2 . Parse(textBoxl.T e x t); i n t mianownik = I n t 3 2 . P a r s e ( te x t B o x 2 . T e x t ) ; //
w y p r o w a d z e n i e u ł a mk a p r z e d s k r ó c e n i e m
l a b e l 3 . T e x t = 1 i c z n i k . T o S t r i n g C ) + " / "+ m i a n o w n i k . T o S t r i n g ( )+" = ";
/ / wywołanie procedury skracaj s k r a c a j ( r e f l i c z n i k , r e f mianownik);
Metody, przekazywanie argumentów
57
/ / w y p r o w a d z e n i e uł a mk a po s k r ó c e n i u l a b e l 3 . T e x t += 1 i c z n i k . T o S t r i n g ( ) + " / " + m i a n o w n i k . T o S t r i n g ( ); )
Jak zach o w ują się zm ienne oraz argum enty m etod w czasie działania program u? M o żemy to prześledzić, urucham iając program w trybie przerw ania i w ykonując go „krok po kroku” . Z m ien n e będziem y obserw ow ać w oknie Watch. A by to zrobić, należy: •
w p ie rw sz y m w ie rszu m eto d y b u t t o n l _ C l i ck u m ie śc ić p u n k t p rz e rw a n ia k lik a jąc m y sz ą n a w y so k o śc i teg o w ie rsza w sz ary , lew y m a rg in e s (w ie rsz z o sta nie z a z n a c z o n y na b rązo w o ),
•
u ru c h o m ić p ro g ram - Start lub F 5 ,
•
w p ro w a d z ić d an e (np. 15 i 9) o raz n acisn ąć Skracaj,
•
gd y w y k o n a n ie p ro g ram u z o sta n ie z a trz y m a n e w p u n k c ie p rz e rw a n ia ( break
point), o tw o rz y ć o k n o Watch 1 ( D ebug/W indow s/W atch/W atch / ) , •
w pisać do o k n a Watch 1 nazw y zm iennych: licznik, mianownik, k, l, x, y, dzielnik,
•
w y k o n a ć p ro g ram w try b ie k ro k o w y m (w ie rsz po w ie rsz u ), n a c isk a ją c k la w isz F I 1 lu b w y k o n u ją c p o le c e n ie D ebug!Step Into,
•
po k a ż d y m k ro k u (n ac iśn ięc iu F I I ) o b se rw o w a ć w a rto śc i z m ie n n y c h w o k n ie W a tch 1. V
void skracaj(ref int k, ref int 1)
É
int dzielnik » nwd(k, 1) ; k /- dzielnik; 1 /■ dzielnik;
private void buttonl_Click(object sender, System.EventArgs e)
int mianownik - Int32.Parse(textBox2.Text); label3.Text = licznik.ToString() + ,r / " + mianownik.ToString()+ skracaj(ref licznik, ref mianownik); labe!3.Text +* licznik.ToString() + " / " + mianownik.ToString();
>1
Name Reznik mianownik k
x
y dzielnik
Value
Type
5 3
int
int
error: identifier V out of scope error: identifier T out of scope
88
116
int int
error: identifier 'dzidruk' out of scope
Rysunek 20. Śledzenie zmiennych - przekazywanie argum entów przez referencję
C# w praktyce
58
W ykonajm y program ponow nie w trybie przerwania, usuwając wcześniej m ody fikatory r e f z definicji i w yw ołania metody s k r a c a j . la
void skracaj(int k, int 1) <
int dzielnik = nud(k, i); k /- dzielnik; 1 /* dzielnik; } a
private void buttonl__Click (object sender, 3ystero. Event Args e) <
int licznik = Int32.Parse(textBoxl.Text); int roianounik = Int32.Parse(textBox2.Text);
label3.Text = licznik.ToString() + " / " + mianownik.ToString()+ skracaj(licznik, mianownik);
rr
=
rr .
labe!3.Text += licznik. ToStr ing () + " / ” + mianownik. ToStr ing () ;
W atch 1 Nam e licznik m ianow nik k I
x y dzielnik
1 Value 15 9 error: identifier 'k' out of scope error: identifier T out of scope 66 87 error: identifier 'dzielnik'out of scope
Type Int int
Int int
R ysunek 21. Śledzenie zmiennych - przekazywanie argumentów przez wartość
Przekazanie argum entów do m etody przez referencję pow oduje, że w szelkie zm iany w artości są dókonyw ane w m iejscu pamięci operacyjnej (pod adresem ), gdzie są um ieszczone zm ienne będące argum entam i. W naszym przypadku w m iejsce para m etrów k i 1 zostały przekazane adresy pamięci l i c z n i k a i m i a n o w n i k a . Podczas w ykonyw ania działania na k i 1 zm ienialiśm y tym samym 1 i c z n i k i mi anowni k. Przekazując param etry przez w artość, jest pobierana tylko wartość argum entów : l i c z n i k a , m i a n o w n i k a i przekazyw ana do param etrów k, 1 . Same argum enty nie są zm ieniane. W obec pow yższego, w drugim przypadku program działał wadliwie. Przekazyw anie argum entów do m etod przez referencję stosuje się w tedy, gdy chcem y w w yniku uzyskać zm ianę argum entów na zewnątrz metody (argum enty takie określam y rów nież jako w ejściow o-w yjściow e). Jeżeli natom iast argum enty służą tylko do w prow adzenia do m etody określonych danych i nie chcem y ich zm ieniać przekazujem y je przez wartość.
Metody, przekazywanie argumentów
59
Skracanie ułamka
P o d a j lic z n ie P o d a j m ianow nie
jj 5 “ j9
15/9-5/3
i S k ra c a j
Rysunek 22. Skracanie ułamków
7.
Interfejs użytkownika
7.1.
Kontrolki i zdarzenia K o n tro lk i, zw an e inaczej fo rm a n ta m i, są e le m e n ta m i u m ie sz c z a n y m i n a p ro je k
cie fo rm u la rza . U m o ż liw iają w p ro w ad z an ie d a n y c h p rze z u ż y tk o w n ik a , o g ra n ic z a n ie w artości w p ro w a d z a n y c h d a n y ch , w y p ro w ad z an ie w y n ik ó w . W p o p rz e d n ic h p rz y k ła d ac h u ż y w aliśm y ju ż ta k ic h k o n tro le k ja k : •
TextBox —o k n o tek sto w e (ed y c y jn e), «
•
La bel - e ty k ie ta ,
•
Buton - p rzy cisk . Properties b u t t o n ! System .W indows.Forms.Button
f f l ł t ® [#1
b u tto n !
System .Windows.Forms.Button
g ê i
m \ V :■
■
i Action
Layout 0 A p p e a ra n c e
M ove Resize
Paint □ B e h a v io r
□ M ouse
ChangeUICues
MouseDown
HelpRequested ImeModeChanged
MouseEnter MouseHover
QueryAccessibilityHelp
MouseLeave
StyleChanged
MouseMove
SystemColorsChanged
MouseUp □ P r o p e r ty C h a n g e d
□ D a ta 0 (DataBindings)
B
BackColor Changed
D r a g D ro p
BackgroundlmageChanged
DragDrop
BindingContextChanged
DragEnter
CausesValidationChanged
DragLeave
ContextMenuChanged
DragOver DockChanged
GiveFeedback
EnabledChanged FontChanged ForeColorChanged Leave
LocationChanged
Validated
ParentChanged RightToLef tChanged
Validating
□ Key
SizeChanged
KeyDown
TablndexChanged
KeyPress
TabStopChanged TextChanged
KeyUp
VlsibleChanged
....
Rysunek 23 i 24. Zdarzenia związane z przyciskiem
ü
C# w praktyce
62
K o n tro lk a je s t e le m e n te m , z k tó ry m są z w iązan e ró żn e z d arze n ia, np. k lik n ię c ie n a p rz y c isk u . N o w o c z e sn e ję z y k i p ro g ra m o w a n ia u m o żliw iają b u d o w a n ie p ro g ra m ó w re a g u ją c y c h n a z d arze n ia. P o p rz e d n ie ć w ic z e n ia ró w n ie ż w y k o rz y sty w a ły te m o ż li w o ści. B y ł to je d n a k je d e n ty p z d a rz e n ia „p rzy k lik n ię c iu ” . K lik n ię cie m y sz ą na p rz y c isk u u ru c h a m ia ło m eto d ę o b słu g i z d arze n ia: " C lic k " . N a g łó w k i tak ich m e to d są tw o rz o n e a u to m a ty c z n ie . N a jp ro s ts z y m sp o so b em u ru c h o m ie n ia ed y cji m eto d y o b słu g i d a n e g o z d a rz e n ia je s t p o d w ó jn e k lik n ię c ie m y sz ą n a k o n tro lc e . W ten sp o só b m o żn a u ru ch o m ić e d y c ję je d n e g o , d o m y śln e g o z d a rz e n ia d la danej k o n tro lk i. D la p rzy c isk u je s t to z d a rz e n ie " C lic k " . E d y c ję w sz y stk ic h m eto d z w ią z a n y c h z o k re ślo n ą k o n tro lk ą m o ż e m y in i c jo w a ć , w y b ie ra ją c w o k n ie P roperties p rz y c isk E v e n ts (zd a rze n ia). W ię k sz o ść k o n tro le k p o s ia d a d o ść lic zn ą g ru p ę z w ią z a n y c h z n im i zdarzeń.
Ćwiczenie 19. Kontrolki W y p ró b u je m y fu n k c jo n o w a n ie k ilk u ty p o w y c h k o n tro lek : HScrol 1 Bar, CheckBox, R a d io B u tto n i GroupBox. W y k o rz y sta m y d o m y śln e z d arze n ia z nim i z w iąz an e (są na p ie rw s z y c h m ie jsc a c h w o k n ie P ro p erties/E ven ts). N a fo rm u la rz u u m ie śc im y : •
o k n o te k s to w e (T extB ox) - b ę d ziem y z m ie n ia ć w y ró w n an ie tek stu , w y g lą d o b ra m o w a n ia i k o lo r tła teg o o k n a,
•
3 p o z io m e p ask i p rz e w ija n ia (H S c ro llB a r) - tutaj b ęd ziem y w y b ie ra ć trz y sk ła d o w e k o lo ru w sta n d a rd z ie R G B ,
•
p o le w y b o ru (CheckBox) - p rz e łą c z a w y ró w n a n ie tek stu w o k n ie,
•
g ru p ę pól w y b o ru (GroupBox) — g ru p u je p o la opcji (d o p u sz c z a ją c w y b ó r „ je d en s.
z w ie lu ” ), •
3 p o la o p c ji (Radi o B u tto n ) - do w y b o ru stylu o b ra m o w a n ia o k n a te k sto w e g o ,
in t r,
g , b;
p r i v a t e void h S c r o l l B a r l _ S c r o l 1( o b j e c t sender, Sys t em. Wi ndows. For ms . S c rol 1Event Args e) C r = h S c r o l 1 B a r i . Va l ue; t e x t B o x l . BackCol or = Col o r . Fr o mAr g b ( r , g. b ) ; )
p r i v a t e void h S c r o l1Bar2_Scrol 1 ( o b j e c t sender. System.Windows.Forms S c r o l 1 EventArgs e) C g = h S c ro l1B a r2 . V a lu e ;
Interfejs użytkownika
63
t e x t B o x l . BackCol o r = Col o r . F r o m A r g b ( r . g,
b);
}
private void
h S c r o l 1 B a r 3 _ S c r o l 1 (object
sender,
S y s t e m . W i n d o w s .F o r m s . S c r o l 1 E v e n t A r g s
e)
C b = h S c r o l 1B ar 3 . V a l u e ;
t e x t B o x l . BackCol or = Col o r . Fr omAr gb( r , g, b ); }
priv ate void checkBoxl_CheckedChanged(object sender, C i f (checkBoxl.Checked) te x tB o x l. RightToLeft = R ightToLeft.Y es; el se t e x t B o x l . R i g h t T o L e f t = R i g h t T o L e f t . No; )
S y s te m . E ventA rgs e)
private void radioButtonl_CheckedChanged(object sender. System.EventArgs e) C te x tB o x l. BorderStyle = BorderStyle.Fixed3D; )
p r iv a t e void ra d io Bu tton 2_Ch ec kedC h ang ed( ob je ct s en d er. Sy stem .E vent Arg s e) C te x tB o x l. BorderStyle = B orderS tyle. F ix ed S in g le; )
p r i v a t e void rad io Bu tt on 3 _ Ch ec k e dC h a ng e d( ob je c t s e n d e r. S ys tem .Ev ent Arg s e) C t e x tB o x l. BorderStyle = BorderStyle.None; 3
M eto d y o b słu g i zd arze ń S c r o l l trzech p a sk ó w p rz e w ija n ia p o z w a la ją w y b ra ć kolor tła p o la te k sto w e g o , w y k o rz y stu jąc stru k tu rę Col or . S tru k tu ra ta p o sia d a szereg w łaściw ości u sta w ia ją c y c h ty p o w e ko lo ry . P e łn ą g a m ę k o lo ró w m o ż e m y u z y sk ać , stosując m e to d ę A r g b ( r ,
g,
b ) , g d zie r , g, b o k re śla ją sk ła d o w e k o lo ru c z e rw o n e g o ,
zielonego i n ieb iesk ieg o . S ty l o b ra m o w a n ia o k n a tek sto w eg o o k re śla w a rto ść w y lic z e n ia B o r d e r S t y l e (Fixed3D,
FixedSingle,
None).
C# w praktyce
64 sfaif,vTTir
■;'ifjif f fh:■4*■■;■■•'
0130
i f . i***/ &
d o praw ej
?
tz
czerwory
^ 3D
zielony
ii ♦
Obramowanie
j
j
C zwflJhc brak
niebieski
il
42J
R ysunek 25. Kontrolki
Z darzenia są zw iązane rów nież z form ularzam i (utworzenie, zam knięcie, klik nięcie form ularza i wiele innych).
7.2.
Menu
T ypow ym elem entem interfejsu użytkow nika w aplikacjach W indows jest menu. M ożna je tw orzyć w sposób graficzny (często w ygodniejszy) lub program ow y. P od czas budow y menu należy, w miarę m ożliw ości, dostosowyw ać się do przyzw yczajeń potencjalnych użytkow ników . Przykładow o zwykle pierwszym elem entem na pasku m enu je st P lik, zaw ierający polecenia tw orzenia nowego dokum entu, otw ierania istniejącego, zapisyw ania bieżącego i zam ykania programu. M enu (dokładniej pasek menu) zw ykle zaw iera hierarchiczną strukturę, w której m ożna w yróżnić nagłówek, m enu, a w nim elementy menu. Te ostatnie m ogą jeszcze się składać z podm enu (zaw ierają wtedy strzałkę wskazującą na dalsze elem enty).
Ćwiczenie 20. Edytor tekstu
-
pasek menu
U tw orzym y prosty edytor tekstu. Polecenia edytora zostaną zgrupow ane na pa sku m enu. U tw orzym y go, posługując się kontrolką m ainM enu. U m ożliw ia ona gra ficzną budow ę menu. •
Z okna Toolbox przeciągniem y do form ularza kontrolkę o nazwie M ainM enu. Po je j w ybraniu u góry form ularza znajdziem y pole T y p e H e re .
Interfejs użytkownika •
65
A by d o d a ć p o lec en ie do m en u , k lik a m y p o le T y p e H e r e i w p isu je m y n a zw ę p o lec en ia, np. P lik . P o w p ro w a d z e n iu p ie rw sz e g o zn ak u z o b a c z y m y k o le jn e p o la p o z w a la ją c e na ro z b u d o w ę m enu. N azw a p o le c e n ia je s t w ła śc iw o ś c ią T e k st, u tw o rzo n e j k o n tro lk i o d o m y śln ej n azw ie m e n u lte m l. W a rto n a d a ć n a z w y w ła sne (w ła śc iw o ść N a m e ) tej i n a stęp n y m k o n tro lk o m m en u . U m o ż liw i to ich ła tw ie jsz ą id e n ty fik a c ję w k o d zie p ro g ram u . N a z w a k o n tro lk i P lik m o ż e n a p r z y kład b y ć n a stęp u jąc a: m e n u lte m P lik (z a m ia st n u m e ru w d o m y śln e j n a z w ie w p i su jem y n a z w ę p o lecen ia).
•
S tru k tu ra m en u b ęd zie n astęp u jąca:
Plik
•
Edycja
N ow y
K opiuj
O tw ó rz
W ytn ij
W sta w p lik
W klej
Z a p isz
K opiuj fo rm at
Z a p isz ja k o ...
W klej fo rm a t
Z akończ
Z a z n a c z w szy stk o
Form at
Pom oc
C z c io n k a
E d y to r
W w y b ra n y c h m ie jsca c h d o d a m y lin ie ro z d z ie la ją c e p o z y c je m en u . U c z y n im y to, k lik a jąc p ra w y m p rzy c isk ie m m y szy p o le c e n ie , nad k tó ry m c h c e m y w sta w ić li nię. Z m e n u p o d rę c z n e g o w y b ie rz e m y In se rt Separator.
•
D o n ie k tó ry c h p o lec eń m enu d o d a m y k law isze sk ró tó w . W ty m celu , po w y b ra niu d a n e g o p o lec en ia, w o k n ie P roperties z m ie n im y w ła śc iw o ść S h o rtcu t. P rz y k ład o w o p o le c e n ie N o w y sk o ja rz y m y ze sk ró te m
C trl+ O . O b o k
p o le c e n ia
w d z ia ła ją c y m p ro g ram ie a u to m a ty c z n ie p o jaw i się in fo rm a c ja d la u ż y tk o w n ik a , np. N o w y C trl+ O . •
P o le c e n io m m en u m o żn a p rz y p isy w ać k law isze d o stęp u . S ą to c z ę sto p ie rw s z e litery p o le c e ń (lub inne, gdy p ierw sze zo stały j u ż w y k o rz y sta n e ). P rz y p is z e m y k law isze, w p isu ją c z n ak „ & ” p rzed literą, k tó ra m a się stać k la w is z e m o d stę p u (w m en u p o ja w i się z n ak p o d k reślen ia).
•
O k n o e d y to ra u tw o rz y m y , k o rzy stając z k o n tro lk i R ic h T e x tB o x .
U s u n ie m y
w arto ść w ła śc iw o śc i T ext, a w ła ściw o ści N a m e n a d a n y w a rto ść O kn o . •
P o sz c z e g ó ln y m p o lec en io m m en u d o d a m y tzw . fu n k c jo n a ln o ś c i, c z y li u tw o rz y m y m e to d y o b słu g i zd arze ń „p rzy k lik n ię c iu ” : private Font czcionka: pr iv ate Color kolor: private void m e n u I t e m Ko ni ec _ Cl ic k( ob je c t sender,
S y s t e m .EventArgs e)
C A p p l i c a t i o n .E x i t ( );
)
// zak ończenie programu
C# w praktyce
66
p r i v at e void m e n u I t e m W y t n i j _ C l i c k ( o b j e c t sender,
S y s t e m .EventArgs e)
C
Okno.CutO;
// wyc i ęc ie zaz na c zo ne go tekstu
3
p r i v a t e void m e n u l t e m k o p i u j _ C l i c k ( object sender,
S y s t e m .EventArgs e)
C Okno.CopyO;
// kopiowanie zazn aczo nego tekstu
3
p r i v a t e void m e n u I t e m W k l e j _ C l i c k ( object sender,
S y s t e m . EventArgs e)
C O k n o . P a s t e ( );
// wkl e je ni e zazn acz one go tekstu
3
p r i v a t e void m e n u I t e m Z a z n a c z w s z y s t k o _ C l i c k ( object sender, S y s t e m . EventArgs
e)
C O k n o . S e l e c t A l 1();
//z azn ac ze nie całego tekstu
3
pr i v a t e void m e n u l t e m k o p i u j f o r m a t _ C l i c k ( o b j e c t sender. S y s t e m . EventArgs e)
C czcion ka = O k n o .S e l e c t i o n F o n t ; // za p a m i ę t a n i e właściwości
czcionki
z zazn acz on eg o obszaru
kolor = O k n o . S e l e c t i o n C o l o r ; // za p a m i ę t a n i e koloru czcionki
z zazn ac zon ego obszaru
3
p r i v a t e void m e n u I t e m W k l e j f o r m a t _ C li ck ( ob je ct sender, S y s t e m . EventArgs e) C
O k n o . S e l e c t i o n F o n t = czcionka; // u s ta wi en ie właściwości
czcionki
według wcześniej
// z a p a m i ę t a n y c h cech O k n o . S e l e c t i o n C o l o r = kolor; // us ta wi eni e koloru czcionki
według wcześniej
// wartości 3
pr iv at e void m e n u I t e m N o w y _ C l i c k ( o b j e c t sender. S y s t e m .EventArgs e) C
zapamiętanej
Interfejs użytkownika O k n o . C l e a r ( );
67 //wycz ysz cze nie okna
3
3 •
A by z m ien ia ć c zc io n k i, w y g o d n ie się b ę d z ie p o słu ż y ć k o n tro lk ą F o n tD ia lo g . N a n iesie m y ją n a fo rm u la rz i w y k o rz y sta m y w m e to d z ie o b słu g i k lik n ię c ia na p o lecen iu m en u C zc io n ka . W o k n ie w ła śc iw o śc i tej k o n tro lk i u sta w im y S h o w C o lo r n a w a rto ść True. private void menuItemCzcionka_Click(object sender,
S y s t e m . EventArgs e)
C if ( f o n t D i a l o g l .S h o w D i a l o g ( ) == D i a l o g R e s u l t .OK) C
Okno. S e l e c t i o n F o n t = f o n t D i a l o g l . F o n t ; // ustawienie w oknie di al og owy m właściwości
czcionki
O k n o .S e l e c t i onColor = f o n t D i a l o g l .Col o r ; // ustawienie w oknie dial ogo wym koloru czcionki Okno'. Select (Okno. Text. L e n g t h . O ) ; // ust awienie zaznaczenia
3 3
Czcionka:
Styl czcionki:
Rozmiar:
IScTip* M T Bokll
[Pogrubienie
20
MÓj. e d i/io i tefzótu
( / Shruti O Sylfaen O Symbol O Tahoma O Times N ew Roman O TrebuchetM S
f
Efekty r
PoofUbienie Pogrubiona kursywa Kursywa * Regularne
mm a 22 24 26 28 36 48
m \
Przykhad
Przekreślenie
r~ Podkreślenie Kolor: Skrypt: [Z a ch o d n i
Rysunek 26. Edytor tekstu •
P o lecen ie m e n u E d y to r - info rm a cje b ę d zie w y św ie tla ć in fo rm a c je o p ro g ra m ie : M e s s a g e B o x .Show(
C# w praktyce
68
" E d y t o r t e k s t u w e r s j a 1 . 0 \ n \ r A u t o r : Mari an Mys i or " , " I n f o r m a c j e " , Me s s a g e Bo x Bu t t o n s . OK. MessageBoxI con. I n f o r ma t i o n ); •
P o le c e n ia m en u : O tw ó rz, W sta w p lik , Z a p is z, Z a p isz ja k o i D ru ku j o p ro g ra m u je m y n iec o p ó ź n ie j, g d y p o z n am y sp o so b y zap isu d an y ch do p lik u i o d c zy tu z p lik u .
7.3.
Pasek narzędzi W s p ó łc z e s n e a p lik a c je , o p ró cz p ask a m en u , c zę sto p o sia d a ją p a sek n arzęd zi
(T o o lb a r). Je st to z w y k le rzą d p rzy c isk ó w u m ie sz c z o n y po n iżej p a sk a m en u . P o z w a la o n u ż y tk o w n ik o w i n a w y g o d n e k o rz y sta n ie z c z ę sto u ż y w an y c h opcji p ro g ram u . * i
Ćwiczenie 21. Edytor tekstu
-
pasek narzędzi
W ć w ic z e n iu ty m sk o rz y sta m y z p ro je k tu z a d a n ia p o p rze d n ieg o . •
A b y z b u d o w a ć p asek n a rz ęd z i, w y b ie rz e m y k o n tro lk ę T o o lb a r z p rz y b o rn ik a T o o lb o x i u m ie śc im y ją na fo rm u la rzu . S ta n o w i o n a p o w ie rz c h n ię d o u m ie sz c z a n ia p rz y c isk ó w .
•
P rz y c is k i n a p a sk ac h n arz ęd z i z w y k le p o sia d a ją e le m e n ty g ra fic z n e (ik o n y ). P o je m n ik ie m na ikony b ęd zie k o n tro lk a Im a g e L ist. U m ie śc im y ją na fo rm u la rz u .
•
W o k n ie P ro p e rtie s k o n tro lk i to o lB a r l z n ajd z ie m y w ła śc iw o ść Im a g e L ist. U sta w im y d la n iej w a rto ść im a g e L is tl.
•
Z a p ro je k tu je m y p rz y c isk i, k tó re u m ie śc im y na pasku n arzęd zi. B ęd ą to p rz y k ła d o w o p rz y c isk i w y k o n u ją c e n a stę p u ją c e fu n k c je m enu: N o w y, O tw ó rz, Z a p isz, D ru k u j, W ytn ij, K o p iu j, W kle j, C zc io n ka .
•
D la p rz y c isk ó w w y b ie rz e m y o d p o w ie d n ie ikony. W o k n ie w ła śc iw o śc i im a g e L i s t l z n a jd z ie m y Im a g e s i k lik n ie m y .... W ten sp o só b u ru c h o m im y Im a g e C o l le c tio n E d ito r.
•
W Im a g e C o lle c tio n E d ito r k lik n ie m y p rz y c isk A d d . O tw o rz y m y o d p o w ied n i fo ld e r z ik o n a m i (C :\P ro g ra m F ile s\M icro so ft V isu a l S tu d io .N E T \C o m m o n 7 \ G r a p h ic s\ic o n s \O ffic e ) i w y b ie rz e m y w ła śc iw y plik.
•
K a ż d ą n a stę p n ą ik o n ę w y b ie rz e m y p o d o b n ie.
•
A b y d o d a ć p rz y c isk do p a sk a n a rz ę d z i, w o k n ie w ła śc iw o śc i to o lB a r l w y b ie rz e m y B u tto n s i k lik n ie m y .... W ten sp o só b u ru ch o m im y T o o lB a rB u tto n C o llectio n E d ito r.
Interfejs użytkownika
69
Image Collection Editor Members: fî
System. Dr awing. Bitmap Properties:
B
Syst ero.Dra w ing. Bitmap System.Drawing.Bfcmap
1 :& A
F’hvViMMiiTicnftorf
System.Drawing.Bitmap System.Drawing.Bitmap
E3
System.Drawing.Bitmap
E 3
System.Drawing.Bitmap
t|j
0
I w t System.Drawing.Bitmap E S System.Drawing.Bitmap
Add
f«vit
H*jght«=i6j
i forf
RawFgrroat *
^rnotyffrnp ie; Tt
•ilov»br:icaiP
96
Remove
OK
Cancel
Help
Rysunek 27. Im age Collection Editor ...
ToolBarButton Collection Editor
,
toolBarButtonl Properties: ■ - m r 'v y 'i T ' ? i;; 'it.
—
□
toolBarButton2
B (DynamicPropertu
toolBarButton3 toolBc^Button4
B Tag
toolBarButton5
| Q 5,H: vî«3lâ :
too!BarButton6 toolBarButton7
4
(Name)
to o lB a rB u tto n l
\
Modifiers
Private
DropDownMenu
(none)
; •./ :.
toolBarButtonß
□
■ Ww a
Enabled
True
Imagelndex
GÖ o
PartialPush
False
Pushed
False
0
'ä-’i: 24j"u Style
PushButton
Text Add
Remove
ToolTipText
Nowy
Visible
True
OK
Cancel
Help
Rysunek 28. ToolBarButton Collection Editor •
K lik n ie m y p rz y c isk A d d i z ro zw ija n ej listy w y b ie rz e m y w a rto ść d la w ła śc iw o ś c i Im a g e ln d e x .
C# w praktyce
70
•
D la w łaściw ości ToolTipText w piszem y wartość Nowy (podpowiedz, po najecha niu m yszą na przycisk).
•
D ziałania te pow tarzam y dla każdego z przycisków.
•
Przyciski na pasku narzędzi nie m ogą obsługiwać własnych zdarzeń Click. D zielą one w spólne zdarzenie „przy kliknięciu” dla całego paska ToolBar. Aby uzyskać inform ację o tym, który przycisk został użyty, m usim y zastosow ać in strukcję w yboru. p r i v a t e void t o o l B a r l _ B u t t o n C l ic kCobject sender, S y s t e m .W i n d o w s .Fo rm s. To ol Ba rB u tt on Cl ic kE v en tA rg s e)
C swi tch(tool B a r i .B u t t o n s .I n d e x O f ( e .B u t t o n ))
*
C
t
case 0: m e n u I t e m N o w y _ C l i c k C s e n d e r , e); // w y wo ła ni e met od y obsługi
zdarzenia
// "przy kliknięciu" menu "Nowy" break; case 1: //m enu Ite m Ot wo r z_ Cl ic kC se n de r, //metoda czasowo wyłącz ona
e);
- brak definicji
break; case 2: / / me nu It em Za pi s z_ Cl ic kC se n de r,
e);
break; case 3: //menuIt em Dru kuj _Cl ickCsender,
e);
break; case 4;
'*
menuItemWytnij_ClickCsender. e ) ; break; case 5; menuItemKopiuj_Click(sender. e ) ; break; case 6: me nu It em Wk le j _ C l i c k C s e n d e r ,
e);
break; case 7: me nu It em Cz ci on k a _ C l i c k C s e n d e r , break;
3 3
e);
Interfejs użytkownika
'
71
..............
Rysunek 29. Edytor tekstu - wersja 2.
1A.
Pasek stanu
Pasek stanu m oże dostarczać użytkow nikow i dodatkow ych inform acji, np. o działaniach aktualnie w ykonyw anych w program ie. Zw ykle jest um ieszczany na dole form ularza.
Ćwiczenie 22. Edytor tekstu
-
pasek stanu
W yposażym y edytor tekstu w pasek stanu (S ta tu s bar). •
Z przybornika T o o lb o x w ybierzem y kontrolkę S ta tu s B a r i um ieścim y ją na form ularzu.
•
Pasek stanu może wyświetlać napisy um ieszczone we w łaściw ościach T e x t lub w niezależnych panelach. Zastosujem y drugi sposób, w ybierając w oknie P ro p e r tie s , dla w łaściw ości P a n els, przycisk .....
•
W uruchom ionym S ta tu sB a rP a n e l C o lle ctio n E d ito r użyjem y przycisku A d d , aby dodać kolejno dw a panele.
•
We w łaściw ościach T e x t tych paneli możemy umieścić w łasne napisy początko we, które dalej będą aktualizowane.
•
W łaściw ościom Ico n m ożna przypisać ikony.
•
W łaściw ość A u to S ize pierw szego panelu ustaw m y na S p rin g , a drugiego na C o n ten ts.
C# w praktyce
72
StatusBarPancI Collection Editor Members:
statusBarPane!2 Properties: B
0^ statusSarPanell
i i
;
-..p. Alignment
Left
AutoSi2e
Contents
BorderStyle
E l icon
Sunken P E
(Icon)
Style
Text
Text
Edytor te k stu versja
ToolTipText n B
W idth ; •■
153
MinW idth
1C
B t m m M □ (DynamicPropertie § | | i p | p | '. 1 1 I j 1' statusBarPanel2 (N am e) Modifiers Add
Private
R em ove
OK
Cancel
Help
A R ysunek 30. StatusBarPanel Collection Editor
•
T ekst um ieszczony w pierwszym panelu będziemy aktualizować podczas zm iany czcionki: p r i v a t e void m enuItem Czcionka_Click(object sender.System.EventArgs C i f ( f o n t D i a l o g l . S h o w D i a l o g ( ) = D i a l o g R e s u l t . OK) C
s t a t u s B a r l. PanelsCO].Text="Bieżąca czcionka: Okno.SelectionFont.Name; 3 3
•
7.5.
e)
"+
D rugi panel w ykorzystam y później.
O bsługa plików
F unkcjonalny edytor tekstu powinien m ieć m ożliwość odczytu wcześniej zapisa nych dokum entów w pliku dyskow ym oraz ew entualność zapisu redagow anego tekstu. O dczytując i zapisując dane używ am y plików, które należy odpow iednio otw ie rać przed użyciem i zam ykać po w ykorzystaniu. Plik możemy określić jako sekw encję bajtów przechow yw anych na dowolnym nośniku. Plik posiada zdolność przyjm ow a
Interfejs użytkownika
73
nia i o d d a w a n ia c ią g ó w bajtów . M o ż em y w y ró ż n ić pliki tek sto w e i p lik i b in arn e. Przepływ d a n y c h z pliku i do p lik u to inaczej stru m ie ń (ang. stream ). M o żem y o d p o wiednio nim ste ro w ać . O tw a rc ie p lik u do o p e ra c ji stru m ie n io w y c h je s t (zw y k le ) rów noznaczne z je d n o c z e sn y m sk o ja rze n ie m stru m ie n ia z ty m p lik ie m . S tru m ień je st abstrakcją p ro g ra m o w ą o z n a c z a ją c ą p rz e p ły w d a n y c h od ź ró d ła d o m ie jsc a p rz e z n a czenia. Z a p isu ją c d a n e do stru m ie n ia i o d c z y tu ją c je z n ieg o , n a le ży p a m ięta ć, że w rzeczy w isto ści w sze lk ie d z ia ła n ia są w y k o n y w a n e n a p lik u , k tó ry je s t sk o ja rzo n y z danym stru m ie n iem . S tru m ie n ie m o ż n a w y k o rz y sty w a ć do ta k ich z a d a ń ja k : •
o d czy t d a n y c h , czy li tra n sfe r do o d p o w ie d n ic h stru k tu r d a n y c h (np. ta b lic ),
•
zapis, c z y li tra n sfe r ze stru k tu r d a n y ch ,
•
w y sz u k iw a n ie , czy li z a p y ta n ia i m o d y fik a c je w y k o n y w a n e n a b ie ż ą c e j p o zy cji stru m ien ia. ✓
Ś ro d o w isk o .N E T F ra m e w o rk o feru je k ilk a n a śc ie k las słu ż ą c y c h d o d z ia ła ń na plikach i stru m ie n ia c h . Z n a jd z ie m y je w p rzestrzen i nazw : S y ste m .1 0 . K lasa
O pis - zastosow anie
Bi naryReader
Odczyt danych binarnych.
BinaryWriter
Zapis danych binarnych.
Bu f f e r e d S t r e s m
Odczyt i zapis danych do innego strumienia.
Di r e c t o r y
Udostępnia metody statyczne do tworzenia, przenoszenia i enumeracji na katalogach i podkatalogach.
File
Udostępnia metody statyczne do tworzenia, kopiowania, usuwania, przenoszenia i otwierania plików.
FileStream
Udostępnia metody i właściwości do odczytu i zapisu danych w posta ci strumienia bajtów.
MemoryStream
Strumień do działań na pamięci operacyjnej.
Stream
Podstawowa klasa do działań na strumieniach.
StreamReader
Implementuje TextReader do odczytu znaków ze strumienia.
S t r e a mWr i t e r
Implementuje TextW riter do zapisu znaków do strumienia.
StringReader
Implementuje TextReader do odczytu znaków z łańcucha.
StringWriter
Zapisuje dane do łańcucha.
Text Reader
Odczyt sekwencyjnych danych znakowych.
TextWri t e r
Zapis sekwencyjnych danych znakowych. Klasa abstrakcyjna.
C# w praktyce
74
Ćwiczenie 23. Edytor tekstu
-
odczyt i zapis
W y p o sa ż y m y e d y to r w fu n k cje o d c zy tu i zap isu d a n y ch w p liku d y sk o w y m . •
D o fo rm u la rz a z p o p rz e d n ie g o z ad a n ia d o d a m y d w ie k o n tro lk i: O penFileD ialog i SaveFileD ialog. T w o rz ą one o k n a d ia lo g o w e do w y b o ru ścieżk i i n a z w y p lik u d y sk o w e g o .
•
W ła śc iw o śc i F ilter k o n tro lk i O penFileD ialog n a d am y w arto ść: Pliki tekstowe
(*.txt)/*.txt. S p o w o d u je to, że w o k n ie d ia lo g o w y m będą w id o c z n e ty lk o pliki te k s to w e . •
N a p o c z ą tk u k o d u p o d in n y m i in stru k c ja m i using... d o d a m y je s z c z e je d n ą : using
System .IO . •
U s u n ie m y zn ak i k o m e n ta rz a z in stru k c ji w y b o ru , d o ty c z ą c e j p a sk a n a rz ę d z i, aby o d b lo k o w a ć w y w o ła n ie m eto d u ru c h a m ia ją c y c h k lik a n ie p rz y c isk ó w „ O tw ó rz ” i „ Z a p is z ” : •
•
•
c a s e 1: menuItem Otworz_Cli c k ( sender . e ) ; break; c a s e 2: menuItemZapisz_Click(sender, e ) ; break; N a p i s z e m y t r e ś ć w ł a s n e j me t o d y „ O t w ó r z ” . private C
void otwórz(bool
czyste)
FileStream p lik ; StreamReader s t C z y t ; / / w y k o n a j , j e ż e l i w y b r a n o OK w o k n i e d i a l o g o w y m i f ( o p e n Fi 1 e D i a l o g l . S h o w D i a l o g ( ) = = D i a l o g R e s u l t . O K )
C / / w y c z y ś ć Okno, j e ż e l i c z y s t e = t r u e i f ( c z y s t e ) O k n o .C le a r (); / / p o d s t a w i e n i e nazwy p l i k u n a z w a P l i k u = o p e n F i 1 e D i a l o g l . Fi 1 e Na me ; / / utworzenie obiektu " p lik " / / i o t w a r c i e s k o j a r z o n e g o z ni m p l i k u p l i k = new Fi 1 e S t r e a m ( n a z w a P l i k u. Fi 1 e M o d e . O p e n . F i l e A c c e s s . Read. FileSha r e . N o n e ) ;
Interfejs użytkownika
//
75
/ / u t w o r z e n i e s t r u m i e n i a do o d c z y t u ze s k o j a r z o n e g o z nim p l i k u s t C z y t = new S t r e a m R e a d e r ( p l i k ) ; / / podstaw ienie łańcucha odczytanego z p l i k u O kno.Text+=stCzyt.ReadToEndi); / / zamknięcie strum ienia i p lik u s t C z y t . C l o s e ( ); p l i k . C l o s e ( );
} } P a ra m e tr ty p u lo g ic z n e g o c z y s t e p o z w a la p o d ją ć d e c y z ję , c z y c h c e m y o tw o rz y ć plik tek sto w y w c z y sty m o k n ie, czy też d o p isa ć do istn ie ją c e j treści. Z m ie n n ą nazwa Pl i ku b ę d ziem y u ży w ać p o z a m e to d ą „ O tw ó rz ” , z a d e k la ru je m y ją więc ja k o p o le k la s y For ml (n ajlep iej p rze d alb o po m e to d z ie M a i n ( )): private S t r in g
•
nazwaPliku
K likając d w u k ro tn ie m enu „O tw ó rz ” i „W staw p lik ” , z re d ag u je m y m eto d y o b słu g i tych p o z y c ji m en u . p r i v a t e void m enuItem O tw orz_Click(o b je c t sender. S y s t e m . EventArgs e) C O tw órz(true); 3 p r i v a t e void menuItemWstaw_Click(object sender. S y s t e m . E v e n t A r g s e) C otw órz(false); 3
•
N a p isze m y tre ść w łasn ej m eto d y „ Z a p isz ” . p r i v a t e void za pisz(boo l C FileStream p lik ; StreamWriter stZapis; / / wykonaj, if(nazw a ||
na z wa )
j e ż e l i nazwa=true i nazwaPliku j e s t (nazwaPl i k u = " " ) )
pusta
C# w praktyce
76
W olum in (C:) Rozm iai woluminu Rozm iar klastra Z a ję te miejsce W o ln e m iejsce P rocent w olnego miejsca Fragm entacja woluminu Fragm entacja ca łko w ita Fragm entacja plików Fragm entacja wolnego mi
Otwieranie
mmmmi
% M oje bieżące dokum enty
0^>M v Albums
! ra p o rt2 .tx t
© B o r la n d Studio Projects
© M y eBooks
© re g 3 2 2 .tx t
© C # -ć w ic z e n ia
© M y PSP8 Files
0
© D C Edukacja
¡ © M y W ebs
® te s t.tx t
© P la t f o r m a N E T-referat
0
Folder Settings
Pulpit
© SBS2k
M oje dokum enty
CranmaKił ar«ia nlil» 11 ctrnnicni
B ieżąca czcionka: Micros
// urucł if (print prii
M ój komputer
W olum inC.t S tare dokur
© V B -L a b o ra to ria E jV b -p o p ra w io n e
U Magda © M a k ra
©
VBScript
O
©
Visual Studio Projects
M atem atyka. xls
^ M o j a muzyka
© V S .N E T
© M o j e obrazy
© d a n e .tx t
£ 3 M oje wideo
© doc 1. tx t
S i M oje w itryny
© d oc2.txt
:M¡ü mm
, -w .
Moje miejsca sieciowe
N azw a pliku:
S®S3SSI
3
O twórz
Eliki typu:
[P lik i tekstow e (Mxt)
3
A nuluj
Rysunek 31. Okno dialogowe OpenFileDialog
I I w y k o n a j , j e ż e l i w y b r a n o OK w o k n i e d i a l o g o w y m i f ( s a v e F i 1 eDi a l o g l . ShowDi a l o g ( ) = = D i a l o g R e s u l t . OK) / / p o d s t a w i e n i e nazwy p l i k u n a ź w a P l i k u = s a v e F i 1 e D i a l o g l . Fi 1 e N a m e + " . t x t " ; / / w p r z e c i w n y m wypadku ( w y b r a n o r e z y g n a c j ę z / / z a p i s u ) w y j d ź z me t o d y else return; / / w ykonaj, j e ż e l i p l i k o podanej nazwie j u ż i s t n i e j e / / i w y b r a n o r e z y g n a c j ę z n a d p i s a n i a go i f ( F i l e . E x i s t s ( n a z w a P l i k u ) && MessageBox.Show( " P l i k i s t n i e j e - czy z a p i s a ć zmiany?" , "Uwaga! " . MessageBoxButtons. YesNo,MessageBoxIcon.Stop)= D i a l o g R e s u l t . No) return;
//
System Rep
Security
Książka - Python Książka - VBA
&
© & Uh
¿ J Awans zaw odow y
J )K s ią ż k a - C *
Fragm entacja plików C a łko w ita liczba plików śre dni rozmiar pliku C a łko w ita liczba pofragrm C a łko w ita liczba nadmiari śre d n ia liczba fragmentów
3
S zukaj w: p o M oje dokumenty
/ / utworzenie obiektu " p l i k " i otw arcie skojarzonego z ni m p l i k u w t r y b i e u t w o r z e n i a nowego, do z a p i s u p l i k = new Fi 1 e S t r e a m ( n a z w a P I i k u , Fi 1 e M o d e . C r e a t e .
Interfejs użytkownika
77
Fi 1 e A c c e s s . W r i t e , F i l e S h a r e . N Ó n e ) ;
//
/ / u t w o r z e n i e s t r u m i e n i a do z a p i s u ze s k o j a r z o n e g o z nim p l i k u s t Z a p i s = new S t r e a m W r i t e r ( p l i k ) ; / / z a p i s do p l i k u s t Z a p i s . Wri t e ( O k n o . T e x t ) ; / / zamknięcie strum ienia i p lik u stZapi s . C l o s e ( ); p l i k . C l o s e ( );
)
•
Klikając dw ukrotnie menu „Zapisz” i „Zapisz jak o ” , zredagujem y m etody obsłu gi tych pozycji menu. p r i v a t e void m e n u Ite m Z a p is z _ C lic k (o b je c t sender, S y s te m .EventArgs e) C zap isz(false); 3 p r i v a t e void m e n u Ite m Z a p is z ja k o _ C lic k (o b je c t sender, S y s t e m .EventArgs e)
i zapi s z ( t r u e ) ; 3
•
Aby rozm iary okna edytora zm ieniały się razem z ew entualnym i zm ianam i rozm iarów form ularza edytora, w ykorzystam y m etodę obsługi zdarzenia „przy zm ianie rozm iarów ” (Resize). p r iv a t e void Forml_Resize(object sender. C Okno.W idth=this.Si z e . Width-25; O k n o . H e i g h t = t h i s . S i z e . Hei g h t - 1 2 0 ; 3
•
S y ste m .EventArgs e)
Czas w ykorzystać drugi panel na pasku stanu. U m ieścim y w nim ścieżkę dostępu do pliku zapisanego bądź odczytanego z dysku. Kod dodam y do m etod „O tw órz” i „Zapisz” . U m ieścim y go po określeniu nazwy pliku: •••
n a z w a P l i k u = o p e n F i 1 e D i a l o g l . Fi 1e Na me ;
C# w praktyce
78 / / ten w ie rs z dopisujemy s t a t u s B a r l . P a n e l s C l ] . T e x t = n a z w a P l i ku;
P odobnie w m etodzie „Zapisz”.
7.6.
Drukowanie
D obry edytor tekstu pozw ala w ydrukow ać napisany dokument. W środowisku .N ET do drukow ania m ożem y w ykorzystać kontrolkę P ń n tD o c u m e n t i zdarzenie zachodzące podczas w ydruku strony: P ń n tP a g e . M etoda P rin t klasy P ń n tD o c u m e n t inicjuje w łaśnie zdarzenie P ń n tP a g e . O program ow ując metodę obsługi zdarzenia P ń n tP a g e , m ożem y sform atow ać stronę przed wydrukiem (ustawić, ile znaków i w ierszy zm ieścim y na stronie, sposób łam ania wierszy itp.) i następnie wykonać sam o drukow anie. Przed w ydrukiem może zechcem y w skazać drukarkę, określić liczbę kopii. W tym celu w ykorzystam y kontrolkę P ń n tD ia lo g . Profesjonalne edytory tekstu pozw alają w oknie dialogow ym określić ustawienia strony. M y w ykorzystam y do tego celu kontrolkę P a g eS e tu p D ia lo g . U tw orzym y rów nież podgląd w ydruku, używając okna dialogow ego P rintP re v ie w D ia lo g .
Ćwiczenie 24. Edytor tekstu
-
drukowanie
U zupełnim y edytor tekstu, z poprzedniego ćwiczenia, o funkcje druku doku m entów . •
N a form ularz w staw im y dwie kontrolki: P rin tD o ku m en t i P ń n tD ia lo g .
•
D odam y, na początku kodu, pod innym i instrukcjam i using... następną instruk cję: u sin g S y ste m .D r a w in g .P r in tin g -,.
•
Z adeklarujem y nowe pola klasy F o r m l (czyli umieścimy je poza obszaram i definicji m etod, przykładow o pod poprzednim i deklaracjam i innych pól): p r i v a t e P a g e S e t t i n g s u s t a w i e n i a S t r o n y = new P a g e S e t t i n g s ( ) ; p r i v a t e F o n t p r i n t F o n t = new F o n t ( " A r i a l " , 1 2 ) ; p r iv a te s trin g tekstDoDruku;
•
K likając dw ukrotnie menu „D rukuj”, uruchom im y edycję metody „przy kliknię ciu” i w piszem y następujący kod: p r i v a t e void m e n u Ite m D ru k u j_ C lic k (o b je c t sender. S y s te m .EventArgs e)
Interfejs użytkownika
79
C / / o k r e ś le n ie ustawień strony printDocum entl. DefaultPageSettings = ustawieniaStrony ; / / p r z y p i s a n i e t e k s t u do d r u k u tekstDoDruku = Okno.Text; / / p r z e k a z a n i e dokument u do okna d r u k o w a n i a p r i nt D i a l o g l . Document=pri n t D o c u m e n t l ; / / ur uchom d r u k o w a n i e , j e ż e l i n a c i ś n i ę t o OK i f C p r i n t D i a l o g l . ShowDi a l o g ( ) = = D i a l o g R e s u l t . OK) p r i n t D o c u m e n tl. Pri n t ( );
3
•
Ponow nie w yśw ietlim y form ularz i klikniem y dw ukrotnie obiekt printD ocum en tl. U ruchom im y wtedy edycję metody obsługi zdarzenia PrintPage (druko wania strony). Ta m etoda zrealizuje w ydruk dokum entu w edług zdefiniow anego obszaru drukowania. Jest ona urucham iana podczas w ydruku dokum entu. N api szemy jej treść. / / d r u k o w a n i e dokument u p r iv a te void p rintD ocum entl_P rintP age(object sender. System. D raw ing. P r i n t i n g . P r i ntPageEventArgs e) C i n t nZna kow, n W i e r s z y ; strin g tekstNaStr; S t r i n g F o r m a t s t r F o r m a t = new S t r i n g F o r m a t ( ) ; / / p r o s t o k ą t d r u k o w a n i a , z a l e ż n y od u s t a w i e ń s t r o n y RectangleF prostok=new RectangleF ( e . M a r g i n B o u n d s . L e f t , e . Ma r g i n B o u n d s . T o p . e.MarginBounds.Width, e.MarginBounds. H e i g h t ) ; / / i l e t e k s t u z m i e ś c i s i ę na s t r o n i e ( m i n u s j e d e n w i e r s z ) S i z e F r o z m i a r = new S i z e F ( e . M a r g i n B o u n d s . W i d t h , e . MarginBounds. Height p rin tF o n t. GetHeight(e.Graphics) ) ; / / d z i e l e n i e d ł u g i c h w i e r s z y m iędzy wyrazami s t r F o r m a t . Trimming = S y s t e m .D r a w i n g . S t r i n g T r i m m i n g . W o r d ;
//
/ / w y l i c z e n i e , i l e znaków i w i e r s z y z m i e ś c i s i ę na s t r o n i e e.Graphi cs.MeasureStri ng(tekstDoDruku,
pri n tF o n t,
C# w praktyce
80 rozm iar,
strFormat,
o u t nZna kow, o u t n W i e r s z y ) ;
/ / o k r e ś l e n i e ł a ń c u c h a , k t ó r y z m i e ś c i s i ę na s t r o n i e t e k s t N a S t r = t e k s t D o D r u k u . S u b s t r i n g C O . nZnakow); / / d r u k o w a n i e ł a ń c u c h a na b i e ż ą c e j s t r o n i e e . Graphi c s . D r a w S t r i n g ( t e k s t N a S t r , p r i n t F o n t , Brushes.BIack, prostok, strFormat); / / j e ż e l i j e s t w i ę c e j z n a k ó w, p r z e n i e ś j e na n a s t ę p n ą s t r o n ę if(nZnakow < tekstDoDruku.Length) C tekstDoDruku = tekstDoDruku.S ubstring(nZnakow ); e.HasMorePages = t r u e ; / / są d a l s z e s t r o n y ) e l se C e.HasMorePages = f a l s e ; / / n i e ma d a l s z y c h s t r o n
//
// //
gdy t e k s t z o s t a n i e w y d r u k o w a n y , p r z y w r ó ć początkową wartość zmiennej tekstDoDruku = Okno.Text; 3
3
D rukarka s
r~
~
Nazwa:
z z z z d a rk ¡et 9 * 0 c
Stan:
Gotowe
Typ:
hp deskjet 920c
Gdzie:
LPT1:
z
....z
z
z z z f i l i i
z - ........:....... .• ▼] W ła ś c iw o ś c i..
Komentarz: W i u
r Kopie
Z akres wydruku W szystko
r
Drukuj do pliku
- i—
F “ ±i
Liczba kopir
fio f
im
iH s j
, 2 |3|
OK
F
Anuluj
Rysunek 32. Okno dialogowe PrintDialog
•
U zupełnim y form ularz o dalsze dwie kontrolki: PageSetup i PrintPreview, czyli o okno dialogow e ustaw ień strony i podgląd wydruku.
Interfejs użytkownika
81
•
D o d a m y , o d p o w ie d n io do m en u „ P lik ” , p o z y cje: „ U sta w ie n ia s tro n y ” i „ P o d g lą d w y d ru k u ” .
•
N a p a sk u n arz ęd z i u m ie śc im y d o d a tk o w y p rz y c isk „ P o d g lą d w y d ru k u ” . P rz y u ży ciu n a rz ę d z ia T o o lB a rB u tto n C o lle ctio n E d ito r m o ż e m y , po je g o u tw o rz e n iu , u m ie śc ić g o z p raw ej stro n y p rz y c isk u d ru k o w a n ia .
•
N a stę p n ie p rz e re d a g u je m y in stru k c ję w y b o ru w s k a z u ją c ą re a k c ję n a k lik n ię c ie o k re ślo n e g o p rzy cisk u . swi t c h ( t o o l B a r i . B u t t o n s . I n d e x O f ( e . B u t t o n )) C
c a s e 0: me nu I t e mNo wy _Cl i c k ( s e nde r , e ) ; break; c a s e 1: me n u I t e mOt wo r z _ C l i c k ( s e n d e r , e ) ; break; c a s e 2: menuIt emZapi s z _ C l i c k ( s e n d e r , e ) ; break; c a s e 3: menuI t emDrukuj _Cl ick(sender, e ) ; break; c a s e 4: me n u I t e mP o d g l Wy d r u k u _ Cl i c k ( s e n d e r , e ) ; break; c a s e 5: me n u I t e mWy t n i j _ C 1 i c k ( s e n d e r , e ) ; break: c a s e 6: menuItemKopi uj _ Cl i c k ( s e n d e r , e ) ; break; c a s e 7: me n u I t e mWk l e j _ Cl i c k ( s e n d e r . e ) ; break; c a s e 8: me n u I t e mCz c i o n k a _ Cl i c k ( s e n d e r , e ) ; break;
...
3 P rz y c isk p o d g lą d u w y d ru k u m a tera z in d ek s 4 , n a to m ia st n a stę p n e p rz y c isk i mają n u m ery o je d e n w ięk sze. •
Z re d a g u je m y m e to d ę o b słu g i z d a rz e n ia „p rz y k lik n ię c iu ” w m en u „ U sta w ie n ia stro n y ” .
C# w praktyce
82 p r i v a t e void m enuItem U stStrony_C lick(object sender. S y s t e m . EventArgs e) i / / załadowanie ustawień s trony p a g e S e t u p D i al o g l . P a g e S e t t i n g s = u s t a w i en i a S t r o n y ; / / w y ś w i e t l e n i e ustawień s trony p a g e S e t u p D i a 1 o g l . ShowDi a l o g ( ) ;
3
Orientacja Pionowa C* Pozioma
Marginesy (milimetry) Lewy:
¡10
Prawy:
( l0
Górny:
[l0 ~
Dolny:
]10
OK
A n u lu j
|
'■
!ih .
[
Rysunek 33. Okno dialogowe PageSetupDialog •
P o d o b n ie u tw o rz y m y i n a p isz e m y o b słu g ę m en u „ P o d g ląd w y d ru k u ” . p r i v a t e void menuItem PodglWydruku_Click(object sender, System . EventArgs e) C / / załadowanie ustawień strony p r i n t Document 1 . D e f a u l t P a g e S e t t i n g s = u s t a w i en i a S t r o n y ; / / podstawienie zawartości tekstDoDruku = Okno.T ex t;
okna do z m i e n n e j
/ / z a ł a d o w a n i e dok u me nt u p rin tP review D i a l o g l . Document=printDocumentl;
Interfejs użytkownika / / w y ś w i e t l e n i e p o d g l ą d u w y d r u k u d o k u me n t u p r i n t P r e v i ewDi a l o g l . ShowDi a l o g ( ) ;
}
Rysunek 34. Okno dialogowe PrintPreviewDialog
83
8.
Kontrola poprawności danych, obsługa błędów
W wielu program ach m ożem y się spotkać z niepraw idłow ościam i w ich d ziała niu. Jest to w ynikiem różnego rodzaju błędów, które m ogą się w nich pojaw ić. Z błę dami w program ow aniu spotykam y się na każdym etapie realizacji zadania pro gramistycznego. Już na poziom ie analizy rozw iązania danego problem u m ożem y popełniać błędy uniem ożliw iające praw idłow e rozw iązanie lub je utrudniające. T w o rzenie projektu (przed przystąpieniem do program ow ania) rów nież jest m iejscem popełniania błędów. My jednak skoncentrujem y się na błędach pow stających podczas programowania (tw orzenia kodu). M ożemy w yróżnić tu trzy typy błędów: •
składni - w ystępują, gdy napiszem y instrukcje niezgodnie z regułam i składni języka, są lokalizow ane przez translator podczas kom pilacji,
•
logiczne - obserw ujem y je, gdy aplikacja nie zachow uje się zgodnie z naszym i oczekiw aniam i, na przykład nie rozw iązuje praw idłow o określonego problem u,
•
czasu w ykonania - pojaw iają się, gdy aplikacja próbuje wykonać operację nie m ożliw ą na przykład dzielenie przez zero, czy konw ersję łańcucha znaków na liczbę, gdy zaw iera on znaki niedozwolone, odczyt z nieistniejącego lub uszko dzonego pliku.
O ile błędy pierw szego typu są stosunkowo łatw e w diagnozow aniu (podpow iada nam kom pilator), to w przypadku błędów drugiego rodzaju m usim y czasam i w rócić do ponownego projektow ania rozw iązania lub nawet do ponow nej analizy problem u. W przypadku w ystąpienia błędów trzeciego typu aplikacja przeryw a działanie i generuje tzw. wyjątek. U żytkow nik przeczyta w tedy często mało zrozum iały kom u nikat w języku angielskim i niestety najczęściej nie będzie m ógł kontynuow ać pracy z programem. Przed wystąpieniem tych błędów m ożem y jednak zabezpieczać się na kilka sposobów. Przede wszystkim m ożem y nie dopuszczać do pojaw iania się w yjąt ków, a jeżeli ju ż zaistnieją, m ożem y przechw ytyw ać je i um ożliw ić użytkow nikow i naprawę sytuacji bez przeryw ania działania programu.
8.1.
Kontrolki ograniczające wprowadzanie danych
Jednym ze źródeł błędów czasu w ykonania są niepraw idłow e dane, w prow a dzane przez użytkow nika podczas pracy z program em . Podstaw ow ym sposobem zabezpieczania się przed takimi sytuacjami jest ograniczenie sw obody w prow adzania
C# w praktyce
86
różnych danych, zaw ężając je do niezbędnego zakresu. W tym celu możemy zastoso wać szereg różnych kontrolek. Sposób zabezpieczenia
K o n tro lk a CheckBox
Ogranicza wprowadzane dane do wartości tm e \ false.
CheckedLi st Box
Dostarcza listę poprawnych danych.
ComboBox
Dostarcza listę poprawnych danych.
DateTimePi cker
Ogranicza wprowadzane dane do prawidłowych dat i czasu.
H s c r o l 1 Bar
Ogranicza wprowadzane wartości liczbowe.
i VScrollBar Li st Box
Dostarcża listę poprawnych danych.
MaskEdBox
Ogranicza wprowadzane dane według tzw. maski (kontrolkę trzeba dodać do Toolbox z Customize Toolbox).
MonthCalenadar
Ogranicza wprowadzane dane do prawidłowych dat.
Numeri cUpDown
Ogranicza wprowadzane wartości liczbowe.
Radi o B u t t o n
Ogranicza wprowadzane dane do wartości true i false.
Te x t Box
Może ograniczać, blokować lub m odyfikować dane.
✓
Ćwiczenie 25. Zakup samochodu U tw orzym y program pozw alający w ykonać kalkulację zw iązaną z zakupem sa m ochodu. W szystkie dane użytkow nik będzie wybierał, w ykorzystując różne kontro lki. N ie trzeba będzie w prow adzać danych z klawiatury. v«
•
N a form ularzu um ieścim y następujące kontrolki: o
L abel (etykiety): „M arka”, „C ena”, „Rabat”, „Do zapłaty”, „K redyt”, „R oczna stopa proc.”, „Ilość rat m iesięcznych” , „W ysokość raty”,
o
C om boBox,
o
TextB ox (zm ienim y jej w łaściw ość N am e na „txtC ena”),
o
Num ericU pD ow n {Nam e = „num ericU pD ow nRabat”),
o
TextB ox (,Name = „txtZaplata”),
o
TextB ox {Name = „txtStopa”),
o
H scrollBar,
o
Num ericU pD own {Name = „num ericU pD ow nN Per”),
o
T extB ox {Name = „txtR ata”),
Kontrola poprawności danych, obsługa błędów o
87
p rzy w a rto ścia ch w y ra ża n y ch w „ z ł” i w „ % ” u m ie śc im y o d p o w ie d n ie e ty k iety .
•
P o d w ó jn ie k lik n ie m y k o n tro lk ę C o m b o B o x . W ten sp o só b u ru c h o m im y e d y c ję m eto d y o b słu g i d o m y śln e g o z d arze n ia, czy li p rzy „ w y b ra n iu in d e k s u ” d la tej k o n tro lk i. W p isz e m y tam kod. p r iv a t e void comboBoxl_SelectedIndexChanged(object sender. S y s t e m . EventArgs e) C / / w y b ó r ł a ń c u c h a z k o n t r o l k i "ComboBox" / / i p o d s t a w i e n i e o d p o w i e d n i c h w a r t o ś c i do " T e x t B o x " switch(comboBoxl. S e lectedIndex) C c a s e 0: txtC en a.T ext = "41000"; break; c a s e 1: tx tC e n a .T e x t = ”31000"; break; c a s e 2: txtC en a.T ext = "45000"; break; c a s e 3: txtC en a.T ext = "28000"; break; c a s e 4: tx tC en a.Text - "32000"; break; c a s e 5: txtC en a .T e x t = "36000"; break; ) / / a k tu a liza c ja „zapłaty" i „ ra ty ” Zaplata(); Rata( ) ;
•
N a p iszem y w ła sn ą m eto d ę o b lic z a ją c ą zap łatę. / / o b l i c z e n i e z a p ł a t y po u w z g l ę d n i e n i u r a b a t u p r iv a te void Z a p la ta O { t x t Z a p l a t a .Text = (Decim al. ParseCtxtCena.Text)* ( ( d e c i mal ) 1 0 0 . 0 - n u m e r i c Up D o w n R a b a t . Val u e ) / 1 0 0 ) . T o S t r i n g ( " N 2 " ) ; }
C# w praktyce
88 •
P o k a ż d e j z m ia n ie rab a tu n ależy p o n o w n ie p rze lic zy ć w y so k o ść z ap łaty i p o w tó rn ie w y lic z y ć ratę m iesięc z n ą. W y k o n a to m e to d a o b słu g i z d arze n ia. / / P r z e l i c z e n i e z a p ła ty i ra ty przy zmianie rabatu p r i v a t e void numericUpDownRabat_ValueChanged(object sender. System . EventArgs e) C Zapla ta (); Rata(); 3
•
P o k a ż d e j z m ia n ie sto p y p ro c e n to w e j n a le ży p o n o w n ie w p isać ją do o k n a te k s to w e g o i p rz e lic z y ć w y so k o ść raty. / / o d c z y t s t o p y p r o c e n t o w e j i ponowne o b l i c z e n i e r a t y p r i v a t e void h S c r o l1B a r l _ S c r o l 1 ( o b j e c t sender. S y s t e m . W i n d o w s . F o r m s . S c r o l 1 E v e n t A r g s e) C t x t S t o p a .T e x t = ( h S c r o l lB a r i . V a lu e /1 0 0 . 0 ) . T o S t r i n g ( ); Rata(); 3
•
P o k a ż d e j z m ia n ie lic zb y ra t ró w n ie ż m u sim y na n o w o p rze lic zy ć w y so k o ść raty. / / ponowne o b l i c z e n i e r a t y p r z y z m i a n i e i l o ś c i r a t p r i v a t e void numericUpDownNPer_ValueChanged(object sender, S y s t e m . EventArgs e) C Rata(); 3
•
W y s o k o ś ć m ie się c z n e j ra ty (a n g ie lsk ie o k reślen ie „ p m t” ) o b lic z y m y z tzw . „ ró w n a n ia b a n k ie ró w ” . N ie k tó re ję z y k i p ro g ra m o w a n ia (np. V isu a l B a sic ), a ta k że a rk u s z e k a lk u la c y jn e p o sia d a ją w b u d o w a n e fu n k cje fin a n so w e {pv, rate, n p er i p m t). I I o b l i c z e n i e wysokości r a t y p u b lic void R ataO C d o u b l e p v , r a t e , n p e r . pmt ; pv = D o u b l e . P a r s e í t x t Z a p l a t a . T e x t ) ; rate = Double.Parse(txtStopa.Text)/1200; n p e r = ( d o u b l e ) ( n u m e r i cUpDownNf * er. V a l u e ) ; // r ó w n a n i e bankierów if (rate=0)
Kontrola poprawności danych, obsługa błędów
89
pmt = p v / n p e r ; el se pmt = - ( pv * M a t h . P o w ( l + r a t e , n p e r ) * r a t e ) / ( l M a t h .P o w ( l+ r a t e .n p e r ) ); txtR ata.Text = pm t.ToString("N2");
)
■ ¡■ ¡■ ■ I I H
i y
M arka: ¡Opel Aslra
Rabat
•A
z*
Cena: i5
D o zapłaty:
±1 % ¡38 950.00
*ł
•
Kredyt: R oczn a stopa proc.:
[8,2
^
Ilo ś ć ra t miesięcznych: ¡36 W yso ko ść raty:
[V224,15
z* •
Rysunek 35. Zakup samochodu
8.2.
W eryfikacja danych In n y m sp o so b e m u n ik a n ia b łęd ó w cza su w y k o n a n ia je s t śc isła k o n tro la w p ro w a
dzanych d a n y c h . Je ż e li a lg o ry tm p rz y k ła d o w o o c z e k u je w p ro w a d z e n ia lic z b y n a tu ra l nej, n ależy n ie d o p u sz c z a ć w p ro w a d z a n ia in n y ch z n a k ó w n iż cyfry.
Ćwiczenie 26. Sprawdzamy wprowadzane dane Z a b e z p ie c z y m y p ro g ram „ N W D ” p rzed w p ro w a d z a n ie m n ie p ra w id ło w y c h d a nych. O tw o rz y m y p ro jek t z ćw iczen ia 11 i zm ien im y kod w ed łu g p o n iższeg o w y d ru k u . private void b u t t o n l _ C li c k (o b je c t sender, C uint x=0, y=0; / / j e ż e l i j e s t wpis w TextBox i f (textBoxl.Text.Length!=0)
S y s t e m . E v e n t A r g s e)
90
C# w praktyce
C
/ / s p r a w d ź każdy znak fo re a c h (char i in t e x t B o x l . T e x t ) / / j e ż e l i znak n i e j e s t c y f r ą i f ( ! C h a r. I s D i g i t ( i )) C M e s s a g e B o x . Show( " P i e r w s z a l i c z b a n i e j e s t l i c z b ą n a t u r a l n ą ! " , "Uwaga"); return; 3
x = U In t32 . P arse(textB oxl.T e x t); 3
¥ i f ( t e x t B o x 2 . T e x t . Leng th!=0)
t
C
foreach (char i in te x tB o x 2 .T e xt) i f ( I C h a r . I s D i g i t t i )) C
M e s s a g e B o x . Show( "Druga l i c z b a n i e j e s t l i c z b ą n a t u r a l n ą ! " , "Uwaga"); return; 3
y = UInt32.Parse(textB ox2.Text); 3
/ / algorytm nie d z ia ła i f ( x==0 || y==0)
p r a w i d ł o w o d l a x l u b y równe O
C
M e s s a g e B o x . S h o w ( " Ż a d n a z l i c z b n i e może być równa O ! " . " U w a g a " ) ; return; 3
while (x!=y) i f (x > y ) x - = y ; else y-=x; 1 a b e l 3 . T e x t = "NWD = " + x . T o S t r i n g ( ) ; 3
In s tru k c ja p o w ta rz a n ia fo r e a c h p rz e sz u k u je k o lejn e zn ak i w p ro w a d z o n e z k la w ia tu ry d o k o n tro lk i T e x tB o x w p o sz u k iw a n iu zn ak u in n eg o n iż cy fra. P o e w e n tu a l n y m z n a le z ie n iu ta k ie g o z n ak u je s t w y św ie tla n y k o m u n ik a t i n a stę p u je o p u sz c z e n ie m e to d y (p o w ró t do fo rm u la rz a , g d z ie m o ż n a p o p raw ić w p ro w a d z o n ą w a rto ść). Jeżeli n ie w p ro w a d z o n o ż a d n y c h w a rto ści (u su n ię to d o m y śln e ) lub w p isa n o 0, ró w n ie ż n a stą p i p o w ró t d o p o n o w n e g o w p ro w a d z a n ia d anych.
Kontrola poprawności danych, obsługa błędów
91
a
Ćwiczenie 27. Używamy maski wprowadzania Ł a tw iej m o ż e m y z ab e z p ie c z a ć sw o je p ro g ra m y p rz e d w p ro w a d z a n ie m n ie o d p o w ied n ich d a n y c h , sto su ją c k o n tro lk ę M a sk E d B o x z a m ia st T e x tB o x. K o n tro lk a M a sk E d B o x n ie je s t d o m y śln ie u m ie sz c z o n a w p rz y b o rn ik u T o o lb o x . M usim y j ą tam d o p ie ro d o d ać. W ty m c elu w y b ie rz e m y C u s to m iz e ! o o lb o x z m e n u Tools. N a z a k ła d c e C O M C o m p o n e n ts z a z n a c z y m y M ic ro so ft M a s k e d E d it C o n tro l, version 6.0 . W y b ó r p o tw ie rd z im y p rz y c isk ie m
O K . K o n tro lk a z o sta n ie u m ie sz c z o n a
w p rz y b o rn ik u w g ru p ie G eneral. O tw o rz y m y p ro je k t W ie lk a n o c (ć w ic z e n ie 7) i u su n ie m y z je g o fo rm u la rz a k o n trolkę T e x tB o x , a n a je j m ie jsc e w p ro w a d z im y M a sk E d B o x . K o n tro lk a ta p o sia d a k ilk a in te re su ją c y c h w ła śc iw o śc i: •
M a sk - d e fin iu je sz ab lo n (m ask ę) d la d a n y c h w p ro w a d z a n y c h p rz e z u ż y tk o w n i ka. Z n ak i d e fin iu ją c e szablon:
•
o
# - c y fra , w y m a g an a ,
o
9 - c y fra , o p c jo n a ln a ,
o
? - d o w o ln y zn ak ,
o
A - z n a k a lfa n u m e ry c z n y , w y m a g an y ,
o
a - z n a k a lfa n u m e ry c z n y , o p c jo n a ln y ,
C lip T c x t — z w ra c a ciąg zn ak ó w w p ro w a d z o n y p rz e z u ż y tk o w n ik a b ez z n a k ó w z d e fin io w a n y c h w m asce,
•
F o rm a tte d T e x t - z w ra c a c ią g z n ak ó w w p ro w a d z o n y p rz e z u ż y tk o w n ik a ze z n a kam i z d e fin io w a n y m i w m asce,
•
F o rm a t - p o z w a la o k reślić fo rm a t do w y ś w ie tla n ia z a w a rto ś c i k o n tro lk i. W ła śc iw o śc i M a s k n ad am y w a rto ść # # # # ( ro k - c z te ry w y m a g a n e c y fry ).
private void b u t t on l_ Cl ic k( o bj ec t sender,
C int r. wiek.
greg,
lz.c,
el, faza, d;
string wiel=""; // jeżeli
nie wp ro wad zon o wartości
i f ( a x M a s k E d B o x l .ClipText=="")
C 1a b e l 2 .Text="Należy podać rok!"; return;
} // pobranie wartości
z kontrolki
r = Int32.Parse(axMaskEdBoxl.ClipText);
S y s t e m . EventArgs e)
92
C# w praktyce
i f ( ( r <1583) C
||
( r >4 9 0 2 ))
1 a b e l 2 .Text="Zakres lat:
1583 do 4902
!!!";
return;
) wi ek =
r / 100 + 1;
greg =
3 * w i e k / 4 - 12;
lz = r
%19 + 1;
c = (8
* wiek + 5) / 25
e l = 5 * r / 4 faza =
- 5 - greg;
greg - 10;
(11 * lz + 20 + c) % 30;
1 f ( ( f a z a — 25) && (lz > 1 1 ) faza++;
|| (faza— 24))
d = 44 - f a z a ; if(d < 21) d + = 30; d + = 7 - (d + el) % 7; if(d <=31) wiel = d . T o S t r i n g O
+ " marca";
el se wiel
= ( d - 3 1 ) . T o S t r 1 n g ( ) + " kwietnia";
l a b e l 2 . T e x t = "Wielkanoc:
" + wiel;
}
8.3.
Zdarzenia Walidacji danych P o b ie ra ją c d a n e , m o ż e m y te sto w a ć ich p o p ra w n o ść po k lik n ię c iu p rz y c isk u uru
c h a m ia ją c e g o , m ię d z y in n y m i p ro c e s ich sp ra w d z a n ia , a n a stę p n ie , g d y są n ie w ła śc i w e , p o n o w n ie p o w ró c ić d o p o b ie ra n ia d a n y ch . N ie je s t to je d y n y sp o só b testo w an ia. Ś ro d o w is k o .N E T g e n e ru je d w a z d a rz e n ia d o z a tw ie rd z a n ia (w a lid a c ji) p o p raw n o ści d a n y c h . S ą to z d a rz e n ia V a lid a tin g i V a lid a ted . M eto d o b słu g i tych z d arze ń m ożna u ż y ć, ab y u n ie m o ż liw ić u ż y tk o w n ik o w i w y jśc ie z k o n tro lk i, d o p ó k i d a n e p rz e z niego w p ro w a d z o n e n ie b ę d ą p o p raw n e. K o n tro lk i p o sia d a ją lo g ic zn y cią g k o le jn o z a c h o d z ą c y c h z d arze ń z w iązan y ch z tzw . fo k u s e m (o g n isk ie m - a k ty w a c ją k o n tro lk i). S ą to k o le jn o z a c h o d z ą c e zd arze n ia:
•
Enter—wejście,
•
G o tF o c u s - u z y sk a n ie fo k u su ,
Kontrola poprawności danych, obsługa błędów
•
Leave - o p u sz c z e n ie ,
•
Validating - z a tw ie rd z e n ie ,
•
Validated — po z atw ierd z en iu ,
•
LostFocus - u trata fo k u su .
93
Z d a rz e n ia Validating i Validated są w łą c z o n e je ż e li w ła śc iw o ść k o n tro lk i Cau-
sesValidation je s t ró w n a True (d o m y śln ie). M o ż n a je w y łą c z y ć (False). W m eto d zie obsługi zd arzen ia Validating m o że m y zez w o lić n a z a tw ie rd z e n ie w prow adzonej d an ej, nadając w łaściw ości Cancel a rg u m e n tu e (ty p u CancelEventArgs) w artość false lub nie zezw alać (w przypadku b łęd n y ch d an y ch ) p o d sta w iając e.Cancel=
tnie. W ted y n a stęp n e zd arzen ia nie m ogą zajść - k o n tro lk a nie utraci fokusu. Z d a rz e n ie V a lid a te d zac h o d zi, g d y w aru n k i z d a rz e n ia V a lid a tin g z o s ta n ą s p e ł nione e.Cancel= false. M eto d ę o b słu g i teg o z d a rz e n ia m o ż e m y w y k o rz y sta ć , ab y „posprzątać po b łę d z ie ” . In n y m u sp ra w n ie n ie m , k tó re m o ż n a w y k o rz y sta ć p o d c z a s s p ra w d z a n ia p o p ra w ności d a n y ch (n ie k o n ie c z n ie w p o łąc ze n iu z p o w y ż sz y m i z d a rz e n ia m i) je s t k o n tro lk a
ErrorProvider. S ta n o w i ona w iz u aln y e le m e n t, p o w ia d a m ia ją c y u ż y tk o w n ik a o z a is t niałym błęd zie.
Ćwiczenie 28. Wykorzystujemy zdarzenia Validating i Validated O tw o rz y m y p ro je k t W ie lk a n o c (ć w ic z e n ie 7). Z p rz y b o rn ik a Toolbox w s ta w im y na fo rm u la rz k o n tro lk ę ErrorProvider. W p isz e m y n a stę p u ją c ą treść m etod o b słu g i z d a rz e ń Validating i Validated: p riv a te void t e x t B o x l _ V a l i d a t i n g ( o b je c t sender, S y s t e m . Component Model . C a n c e l E v e n t A r g s ć ) ( / / j e ż e l i n i e wpr owa dz ono danych i f (textBoxl .Text— "") C / / n i e można o p u ś c i ć k o n t r o l k i e.Cancel=true; return; } foreach (c h a r x in t e x t B o x l . T e x t ) C e.Cancel=true; / / s p r a w d ź w s z y s t k i e wpr o wa dz one z n a k i f o r ( i n t i = 0 ; i <10; 1++) i f ("0123456789".S u b s trin g ^ , l ) = x . T o S t r i n g ( ))
94
C# w praktyce
/ / z e z w o l e n i e na o p u s z c z e n i e k o n t r o l k i e.Cancel=false; break;
/ / j e ż e l i n i e można o p u ś c i ć k o n t r o l k i i f ( e . Cancel) C / / u s t a w i e n i e komunikatu i u a k t y w n ie n i e k o n t r o l k i errorProviderl.SetError(textB oxl. " Wpr owa dź p o p r a w n ą w a r t o ś ć ! " ) ; //
E r r o r P r o v i der
wyprow adzenie komunikatu k o n t r o l k i E r r o r P r o v i der 1a bel 2 . T e x t = e r r o r P r o v i d e r l . G e t E r r o r ( t e x t B o x l ); return; 3 3
3 p r iv a t e void te x tB o x l_ V a lid a te d (o b je c t sender. C / / z r e s e to w a n ie k o n t r o lk i E r r o r P r o v i der errorP roviderl.S etE rror(textB oxl, ""); 3
System.EventArgs e)
.... .
Wielkanoc
■f
r f*
< •
>-
krt*# > » • « >
* •- »
• -
.
. •
i - ’ *» ............ * i - 4 T -V -* 4« * . - r • ' ’I m«* -'-y % Podaj rok; .. t ar*. r ‘* !
........
kfdhfjg ł.V 'T I ■< I ► «•»
I ■'tSL-m '•V t ♦ * j C W V ' W '
>*•«
[Wprowadź poprawną wart
W prow adź ~........
opraw ną wartość!
* * * *•' * ■ ' * *
. v- •
,
»>/ 1• -v *»t' W*^ ♦** '• * «»*1 »■•••”»1;
«-vVv t -•* 1*7? ' . ^ V - A >• - > M
- •« « r - •••<* ' » ■ IfrWiir**? *'•' >'''1••>.*
>
•' *•«!■ * •>£$ a - rV ‘x
- .'feM -
■;,>y*w.*.:*. !■
■- ■ / . - *.*i 4;w>V;' :5'/. -*, $1 . ,( !• * « , • <.-» t ;
SKr,r.n: ■ '« fW W 'V + M .
4i->
f l v n f r « •»% „ -A -‘tsT I ; . ■
■•.. t
«•* • •••:•■
>•* <»> i
w
* %:* •.
O blicz ' • •
Rysunek 36. W ielkanoc - kontrolka ErrorProvider
Kontrola poprawności danych, obsługa błędów
8.4.
95
Strukturalna obsługa wyjątków Jeżeli p o d c za s w y k o n y w a n ia p ro g ram u w y stą p i b łąd , C # .N E T tw o rz y o b ie k t,
który p rz e c h o w u je o nim in fo rm a cje. S y tu a cję ta k ą o k re śla m y m ia n e m w y s tą p ie n ia (zgłoszenia) w y ją tk u . W y ją tk i są o b iek tam i, k tó re d z ie d z ic z ą po k la s ie E x c e p tio n . B iblioteka .N E T F ra m ew o rk d e fin iu je w iele ro d z a jó w w y ją tk ó w , d o sta rc z a ją c y c h w y czerpujących in fo rm a c ji n a tem at p o w sta łe g o b łęd u . Je że li n ie z a re a g u je m y n a w y g e nerow any w y ją te k , nie p rze ch w y cim y go, a p lik a c ja z ak o ń c z y d z ia ła n ie w n ie z a p la now anym p rz e z nas m iejscu i w y św ietli c zę sto m a ło z ro z u m ia ły k o m u n ik a t. S tru k tu ra ln a o b słu g a w y ją tk ó w to sp e c ja ln a in stru k c ja , u m o ż liw ia ją c a w y k o n a n ie od p o w ied n ieg o b lo k u k o d u w zależ n o śc i od ty p u p o w sta łe g o w y ją tk u . Jej p rz y k ła d o w a składnia: try t / / i n s t r u k c j e mogące powodować bł ę dy ( w y s t ą p i e n i a wyj ąt ków) } / / b l o k i pr z e c hwyt ywa ni a wygenerowanego wy j ą t k u c a t c h ( Fi 1e No t F o u n d Ex c e p t i on ex) C
Mess ageBox. Show("Brak p l i k u : " + n a z wa Pl i k u , "Uwaga". Messa g e Bo x Bu t t o n s .OK.Mess a g e B o x I c o n . E r r o r ) ; ) c a t c h ( Di r e c t o r y N o t FoundExcept i on ex) C Mess ageBox. Show("Zł a ś c i e ż k a d o s t ę p u : " + n a z wa P l i k u . "Uwaga", Mess a g e B o x B u t t o n s . O K . MessageBoxI c o n . E r r o r ) ; 3 c a t c h ( E x c e p t i o n ex) C Mess ageBox. Show( ex. Mess age, "Uwaga", Mess a g e B o x B u t t o n s . O K , MessageBoxI c o n . E r r o r ) : ) In stru k cja try ...c a tc h m o że m ieć je d e n lub w ięcej b lo k ó w ca tch . W b lo k u t r y u m ie sz c z a m y p o te n c ja ln ie n ie b e z p ie c z n e p o le c e n ia , m o g ą c e b y ć przyczyną p o w sta w a n ia w y jątk ó w . B lo k i c a t c h są m ie jsca m i d o c e lo w y m i „ sk o k u ” po w y stą p ie n iu w y ją tk u (z a m ia st przerw ania d z ia ła n ia p ro g ram u i w y św ie tle n ia k o m u n ik a tu ). B lo k i te p rz e sz u k iw a n e są w k o le jn o śc i ich w y stą p ien ia, w celu d o p a so w a n ia o b ie k tu w y ją tk u , k tó ry p o d a jem y ja k o p a ra m e tr. W a ż n a je s t ich k o lejn o ść. N a jp ie rw p o w in n a w y stą p ić n a jb a rd z ie j szczegółow a d ia g n o z a w y ją tk u , a na k o ń cu n a jb a rd z ie j o g ó ln a , c z y li o b ie k t k la sy
C# w praktyce
96
Exception. Dopasowanie następuje według hierarchii dziedziczenia. Tylko jeden z bloków catch jest wykonywany. Ważniejsze klasy wyjątków: System.Excepti on System.SystemException System.AppDomai nUn1oadedException System.ArgumentException System.ArgumentOutOfRangeException System.Ari thmeti cException System.ArrayTypeMi smatchExcepti on System.Bad Image FormatException System.CannotUnloadAppDomai nException System.ComponentModel.Des ign.Seri ali zati on. CodeDomSeri ali zerException System.ComponentModel.Li censeExcepti on System.ComponentModel.Warni ngExcepti on System.Confi guration.ConfigurationExcepti on System.Configuration.Install.Install Exception System.ContextMarshalException System.Data.DataExcepti on System.Data.DBConcurrencyExcepti on System.Data.SqlCli ent.SqlExcepti on System.Data.SqlTypes.SqlTypeExcepti on System.Drawi n g .Pri nti ng.Invali dPri nterExcepti on System.EnterpriseServices.Regi strationExcepti on System.Enterpri seServi ces.ServicedComponentExcepti on System.Executi onEngi neException System.FormatExcepti on System.IndexOutOfRangeException System.Invali dCastExcepti on System.InvalidOperationExcepti on System.Invali dProgramExcepti on System.10.Internal ButferOverf 1 owExcepti on System.10.10Exception System.10.Di rectoryNotFoundExcepti on System.10.Fi 1eNotFoundException System.Management.ManagementExcepti on System.MemberAccessException System.Multi castNotSupportedExcepti on System.NotImplementedExcepti on System.NQtSupportedExcepti on System.NullReferenceExcepti on System.OutOfMemoryExcepti on System.RankExcepti on System.Ref1ecti on.Ambi guousMatchExcepti on
Kontrola poprawności danych, obsługa błędów
97
S y s t e m . R e f 1e c t i o n . R e f l e c t i onTypeLoad E x c e p t i on S y s t e m . R e s o u r c e s . Mi s s i ngMani f e s t R e s o u r c e E x c e p t i on S y s t e m . Run t i me . I n t e r o p S e r v i c e s . E x t e r n a l E x c e p t i on S y s t e m . R u n t i m e . I n t e r o p S e r v i c e s . I nval i dComObj e c t Exc e pt i on S y s t e m . R u n t i m e . I n t e r o p S e r v i c e s . I nval i d O l e V a r i a n t T y p e E x c e p t i o n S y s t e m. R u n t i me . I n t e r o p S e r v i c e s . Ma r s h a l Di r e c t i v e Ex c e p t i on S y s t e m . R u n t i m e . I n t e r o p S e r v i c e s . S a f e Ar r a y RankMi smat chExcept i on S y s t e m . R u n t i m e . I n t e r o p S e r v i c e s . Saf eArr ayTypeMi s ma t c h E x c e p t i on S y s t e m. R u n t i me . Remoti n g . Remoti n g Ex c e p t i o n Sy s t e m. Ru n t i me. Remoti n g . S e r v e r E x c e p t i on S y s t e m . Run t i me . Se r i a l i z a t i o n . Ser i al i z a t i o n Ex c e p t i o n S y s t e m. S e c u r i t y . C r y p t o g r a p h y . C r y p t ogr a phi c Ex c e p t i on S y s t e m . Se c ur i t y . Pol i c y . Pol i c y Ex c e p t i o n S y s t e m. S e c u r i t y . S e c u r i t y E x c e p t i on S y s t e m . S e c u r i t y . V e r i f i c a t i on Exce pt i on S y s t e m . S e c u r i t y . Xml Synt axExcept i on S y s t e m. S e r v i c e P r o c e s s . T i me o u t E x c e p t i on S y s t e m . S t a c k O v e r f 1owExcept i on Sy s t e m. Th r e a d i n g . Synch r oni z a t i on Lock Exc e pt i on Sys t er n. Thr ea di n g . T h r e a d Ab o r t E x c e p t i on S y s t e m . Thr e a di n g . Th r e a d I n t e r r u p t e d E x c e p t i o n System.Threading.ThreadStateException Sys t e m. Typ e I n i t i a l i z a t i o n Ex c e p t i o n S y s t e m . TypeLoadExcept i on Sys t e m. Type Unl oa de dEx c e p t i on S y s t e m . Unaut hor i zedAccess Ex c e p t i on S y s t e m . We b . S e r v i c e s . P r o t o c o l s . Soa pExc e pt i on Sys t e m. Xml . Sc he ma . Xml Schema Exce pt i on System. Xml.Xml Exce pt i on S y s t e m . Xml. XP a t h . XPat h Except i on Sys t e m. Xml . Xs1 . X s l t E x c e p t i o n A
Ćwiczenie 29. Przechwytujemy błędy dyskowe B łęd ó w c za su w y k o n a n ia m o że m y się sp o d z ie w a ć w m ie jsc a c h , g d z ie p ro g ra m sięga do d a n y c h d y sk o w y ch . M o g ą to być u sz k o d z o n e p lik i, z łe n a z w y p lik ó w lub ścieżek d o stę p ó w d o p lik ó w , n iesp ra w n e n ap ęd y d y sk ó w itp. N a p ro je k c ie n o w e g o fo rm u la rz a u m ieścim y : •
k o n tro lk ę R ic h T e x tB o x (n a z w ie m y ją O kn o ) z a jm u ją c ą p ra w ie c a ły fo rm u la rz ,
•
p rz y c isk z n a p ise m „ O tw ó rz p lik ” (n ajlep ie j u d o łu fo rm u la rz a ),
•
k o n tro lk ę O p e n F ile D ia lo g ( F ilte r = tek sto w e (* .tx t)/* .tx t).
C# w praktyce
98 P rz y c is k o p ro g ra m u je m y n astęp u jąco : p r iv a t e void b u tto n l_ C lic k (o b je c t sender.
S y s t e m . E v e n t A r g s e)
C
Fi 1 e S t r e a m p l i k; StreamReader s t C z y t ; s t r i n g nazwaPliku = try C / / p o d s t a w i e n i e nazwy p l i k u nazwaPliku = " c : W t e s t . t x t " ; / / utworzenie obiektu " p l i k ” / / i o t w a r c i e s k o j a r z o n e g o z nim p l i k u do o d c z y t u p l i k = new Fi 1 e S t r e a m ( n a z w a P l i k u , F i l e M o d e . O p e n . Fi 1 e A c c e s s . R e a d . Fi 1 e S h a r e . N o n e ) ; / / u t w o r z e n i e s t r u m i e n i a do o d c z y t u ze s k o j a r z o n e g o z nim p l i k u s t C z y t = new S t r e a m R e a d e r ( p l i k ) ; / / p o d sta w ie n ie łańcucha odczytanego z p l ik u Okno.Text = s tC zy t.R e a d T o E n d (); / / zamknięcie strum ienia s t C z y t . C l o s e ( ); p l i k . C l o s e ( ):
i pliku
c a t c h ( Fi 1 e N o t F o u n d E x c e p t i on e x ) C
Me s s a g e B o x . S h o w ' C ' B r a k p l i k u : " + n a z w a P l i k u , " Uwaga " , M e s s a g e B o x B u t t o n s . O K . M e s s a g e B o x I c o n . E r r o r ) ; } c a t c h ( Di r e c t o r y N o t F o u n d E x c e p t i on e x ) C
MessageBox.Show("Zła ścieżka dostępu: " + nazwaPliku. " U w a g a " . M e s s a g e B o x B u t t o n s . OK.MessageBoxI c o n . E r r o r ) ;
3 c a t c h ( Exception ex) C
MessageBox.Show(ex.Message, "Uwaga", M e s s a g e B o x B u t t o n s . O K , M e s s a g e B o x I con . E r r o r ) ; / / M e s s a g e B o x . Show("B łą d p l i k u : " + n a z w a P li k u , M e s s a g e B o x B u t t o n s . OK.MessageBoxI c o n . E r r o r ) ; }
}
" U wa g a " ,
Kontrola poprawności danych, obsługa błędów W
celu
p rz e te sto w a n ia
p ro g ram u
99 z m ie n n e j
n a zw a P liku
nadam y
w a rto ść:
"c:\\ test.txt". Z w ró ć m y u w ag ę, że zn ak „ \” n a le ży p isać p o d w ó jn ie , p o n ie w a ż w ła ń c u c h a c h zn ak o w y ch je s t zn ak iem steru jący m . U tw o rz y m y , p o z a p ro g ram e m , d o w o ln y p lik te sto w y (np. p rz y w y k o rz y sta n iu N o ta tn ik a ) i z a p isz e m y go w p o d an ej w y żej lo k a liz a c ji. P ro g ra m p o w in ie n p ra w i dłow o
o tw o rz y ć
w sk az an y
plik.
Z m ie n im y
n a stę p n ie
śc ie ż k ę
d o stę p u
na
np.
"c:\\test2 .txt", a p ó źn iej je s z c z e na, "c:\\a b c \\te st2 .tx t". Ja k ie b łę d y z o sta ły p rz e c h w y cone p rzez p ro g ra m ? *
Ćwiczenie 30. Sprzątamy po błędzie C z a sa m i, m im o w y stą p ie n ia b łęd u , p ro g ram p o w in ie n pr-zed z a k o ń c z e n ie m s w o jego d z ia ła n ia w y k o n a ć ró żn e c zy n n o śc i p o rz ą d k o w e , np. p o z a m y k a ć o tw a rte p lik i dyskow e. M o ż n a to z re alizo w ać , d o d a ją c do b lo k u t r y . . . c a t c h fra z ę f i n a l l y (m o ż n a rów nież sto so w a ć ty lk o t ry. . . f i na l l y - b ez c a t c h ) . N a fo rm u la rz u u m ie śc im y p rz y c isk i o p ro g ra m u je m y go n a stę p u ją c o : p r iv a t e void b u t t o n l _ C l i c k ( o b j e c t sender. C s t r i n g n a z wa P l i ku = ; double a , b , c , v ;
S y s t e m . E v e n t A r g s e)
try C / / p o d s t a w i e n i e nazwy p l i k u nazwaPliku = " c : W t e s t . t x t " ; / / utworzenie obiektu " p lik " / / i o t w a r c i e s k o j a r z o n e g o z nim p l i k u do o d c z y t u p l i k = new Fi 1 e S t r e a m ( n a z w a P l i k u . Fi 1 e M o d e . O p e n , Fi 1e A c c e s s . Read . Fi 1 e S h a r e . N o n e ) ; / / u t w o r z e n i e s t r u m i e n i a do o d c z y t u , ze s k o j a r z o n e g o z ni m p l i k u s t C z y t = new S t r e a m R e a d e r i p l i k ) ; / / podstaw ienie w ierszy odczytanych z p l i k u a = In t 3 2 . P a r s e ( s t C z y t . ReadLineC) ) ; b = In t32.Parse( s tC z y t. ReadLine()); c =* I n t 3 2 . P a r s e ( s t C z y t . R e a d L i n e ( ) ) ; v = a*b*c; l a b e l l . T e x t = v . T o S t r i n g ( );
3
100
C# w praktyce
c a t c hCFi 1e No t F o u n d E x c e p t i on ex) C
Mess ageBox. Show( " Br ak p l i k u : " + n a z wa Pl i k u, "Uwaga" , Me s s a g e Bo x Bu t t o n s . OK.Me s s a g e B o x I c o n . E r r o r ); 3
c a t c h ( Di r e c t o r y N o t FoundExcept i on ex) C
Mess ageBox. Show( "Zł a ś c i e ż k a d o s t ę p u : " + n a z wa Pl i k u . "Uwaga". Me s s a g e Bo x Bu t t o n s . OK. Me s s a g e Bo x I c o n . Er r o r ); 3
c a t c h ( E x c e p t i o n ex) C Me s s a ge Box. Show( e x. Me s s a ge . "Uwaga” , MessageBoxBut t ons. OK, MessageBoxI con . E r r o r ); 3
finally ( / / z a mk n i ę c i e s t r u m i e n i a i p l i k u i f ( s t C z y t != nul 1) s t C z y t . C l o s e ( ); i f (pl i k != nul 1) p l i k . C l o s e ( ); 3 3
Ni e m o ż n a b e z w a ru n k o w o z a m y k a ć stru m ie n ia i p liku (m o że nie z o sta ł o tw a r ty ?). P rz e te s tu je m y p ro g ram . W lin ia c h k odu: a = I n t 3 2 . P a r s e ( s t C z y t . ReadLine() ) ; b = I n t 3 2 . P a r s e ( s t C z y t . ReadLine() ) ; c = I n t 3 2 . P a r s e ( s t C z y t . ReadLine() ) ; n a s tę p u je o d c z y t trz e c h k o le jn y c h w ie rsz y p liku te k sto w e g o i p ró b a k o n w e rsji tych w ie rs z y n a lic z b y ty p u d o u b le. Je że li trz y k o le jn e w ie rsze w p lik u nie b ęd ą m o g ły być s k o n w e rto w a n e n a lic zb y rz e c z y w iste , w y stą p i w y jątek . S p ró b u jm y u m ie śc ić w p lik u n a jp ie rw trzy liczb y w k o le jn y c h w ie rsz a c h , a p ó ź n iej z m ie ń m y je d n ą z n ich na d o w o ln y ciąg zn ak ó w . Jak i b ę d z ie e fek t?
Kontrola poprawności danych, obsługa błędów
101
A
Ćwiczenie 31. Zgłaszamy własne wyjątki M o ż em y z g ła sz a ć w łasn e w y jątk i. C z asam i z a c h o d z i sy tu a c ja n ie lo g ic z n a , ale m atem a ty c zn ie d o p u sz cz aln a . P ro g ra m nie z g ło si w te d y w y ją tk u , k tó ry m o g lib y śm y p rzech w y cić. P rz y k ła d o w o , je ż e li w p ro w a d z im y d o p ro g ra m u u je m n y p ro m ie ń k u li, m o żem y w y lic z y ć je j o b jęto ść , ale w ia d o m o , że n ie m a p ro m ie n i i o b ję to śc i u je m nych. W tak ich sy tu a c ja c h sam i m o że m y z g ła sz a ć w y ją tk i. O tw o rz y m y p ro je k t z ć w ic z e n ia 2. A lg o ry tm o b lic z a n ia o b ję to śc i k u li w y p o s a żym y m e c h a n iz m p rz e c h w y ty w a n ia w y ją tk ó w t r y . . . c a t c h . W ten sp o só b z a b e z p ie czym y n asz p ro g ra m p rze d p o b ie ra n ie m z n a k ó w nie b ę d ą c y c h sk ła d n ik a m i lic zb y rzeczy w istej. M o ż e m y je d n a k w p isy w ać lic zb y u jem n e. A b y o d rz u c a ć w p ro w a d z a n e liczby u jem n e, z g ło sim y w łasn y w y ją te k sto su ją c in stru k c ję t h r o w i tw o rz ą c w ła sn y obiekt w y ją tk u (d z ie d z ic z ą c y po k lasie E x c e p t i o n lu b je j p o c h o d n e j). *>
p riv a te void b u t t o n l_ C lic k (o b je c t sender,
S y s t e m . EventArgs e)
C double r ,
v;
/ / w ł ą c z e n i e s t r u k t u r a l n e j o b s ł u g i błędów try C r = Double.Parse(textBoxl.T e x t); i f ( r < 0) / / z g ł o s z e n i e własnego w y ją t k u t h r o w new A r g u m e n t O u t O f R a n g e E x c e p t i o n ( " " , " Pr omi eń n i e może być u j e m n y ! " ) ; v = 4 . 0 / 3 * Math. P I * r * r * r ; l a b e l 2 . T e x t = "Objętość k u li wynosi:
" + v.ToString("N 4");
} / / przechwycenie zgłoszonego wyjątku catch (A rg umentOutOfRangeException ex)
[ Me s s a g e B o x . S h o w ( e x . M e s s a g e , " U w a g a " , MessageBoxButtons.OK. Mes sa geB oxI co n. E r r o r );
3 / / przechwycenie pozostałych wyjątków catch ( E x c e p t i o n ex) { M e s s a g e B o x . S h o w ( ” To n i e j e s t l i c z b a ! " . " U w a g a " , MessageBoxButtons.OK, Message Box Ico n. E r r o r ); 3 3
C# w praktyce
102
T w o rz ą c n o w y o b ie k t w y jątk u m o ż e m y z d efin io w ać w łasn y opis - w łaściw o ść M e s sa g e . T re ść o p isu p o d a je m y ja k o je d e n z a rg u m e n tó w k o n stru k to ra: t h r o w new A r g u m e n t O u t O f R a n g e E x c e p t i o n ( " " ,
" P r o m i e ń n i e może być u j e m n y ! " ) ;
9.
Komentarze XML
K o d ję z y k a C # m o żem y o p a try w a ć k o m e n ta rz a m i u ła tw ia ją c y m i je g o p ó ź n ie js z ą analizę i sta n o w ią c y m i d o k u m e n ta c ję p rojektu. R o d z a je k o m en tarz y : •
w ie rszo w y - ro zp o c zy n a się od zn ak ó w „ //” (d o m y śln ie k o m e n ta rz e są p isa n e z ie lo n ą c z c io n k ą ) i k o ń c zy w ra z z k o ń c e m w ie rsz a ,
•
b lo k o w y - od zn ak ó w „/* ” do „ * /” m o że o b e jm o w a ć w ie le w ie rszy .
•
X M L - o d zn ak ó w „ ///” do k o ń c a w iersza, z a w ie ra ją c y z n a c z n ik i ste ru ją c e (d o m y śln y k o lo r - szary). Z a z n a c z o n y b lo k k o d u m o że m y z a m ie n ić w k o m e n ta rz e w ie rs z o w e (i ty m sa
mym w y łą c z y ć z k o m p ila c ji), w y b ie ra ją c z m en u se k w e n c ję E dit\A dvanced\C om m ent
Selection lub sk ró t k la w ia tu ro w y CTRL-KC. K o m e n ta rz e m o ż n a a n u lo w a ć w p o d o b n y sposób E dit\Advanced\U ncom m ent Selection lub sk ró te m k la w ia tu ro w y m CTRL-KU . W ię k sz e p ro g ra m y w y m a g ają d o b re g o u d o k u m e n to w a n ia . Z c z a se m c o ra z tr u d niej je ro z b u d o w y w a ć bez d o k u m en tac ji. C zęsto n ie ste ty b rak je j lu b n ie je s t z s y n ch ro n izo w an a z k o d em . P o w o d em ta k ieg o stanu je s t d o k u m e n to w a n ie p ro g ra m u ju ż po je g o u k o ń c z e n iu , a nie w c z a sie p isan ia ko d u . D o k u m e n ta c ja je s t u m ie s z c z a n a w n iezależn y ch p lik a c h , co w p ły w a na je j ro z sy n c h ro n iz o w a n ie . W C # .N E T p ro b lem ó w ty ch m o żn a u n ik n ąć, u m ie sz c z a ją c z n a c z n ik i X M L b e z pośrednio w k o m e n ta rz a c h k o d u ź ró d ło w eg o . K o m p ila to r C # p o tra fi w y d o b y ć z k o d u tak sk o n stru o w a n e o p isy i u tw o rzy ć z nich d o k u m e n ta c ję , k tó rą m o ż e m y w ró ż n y sposób d alej w y k o rz y sty w a ć. K o m e n ta rz e X M L u m o żliw iają: •
w yśw ietlanie um ieszczonych w cześniej w nich opisów w sygnaturze w łaściw ości p o przez m o d u ł IntelliSense (podpow iedzi ukazujące się podczas w p isy w an ia kodu),
•
tw o rz e n ie stru k tu ra ln y c h p lik ó w H TM L - Code Com m ent W eb Report,
•
tw o rz e n ie d o k u m e n ta c ji w p o sta ci p lik ó w XML. private void button3_Click(object sender, System.EventArgs e) C zcionka_C1ick(sender, e ); )
void F orm l .Czcionka_Click (o b je ct sender, System .EventArgs e) zmiana czcionki
Rysunek 37. Kom entarz XM L w module IntelliSense
C# w praktyce
104
W k o m e n ta rz a c h J /P ' u m ie sz cz am y z n ac zn ik i ję z y k a X M L (E x te n sib le M arkup L a n g u a g e ), d zięk i c ze m u m o żem y z ag n ieżd żać w kodzie C # w ew n ętrzn e stru k tu ry (ba zy d a n y ch ). W arto p o zn ać p odstaw y tego n iesk o m p lik o w an eg o ję z y k a zn aczn ik ó w . P rz y k ła d o w y k o m e n ta rz X M L u m ie sz c z o n y p rze d d e fin icją w ła sn ej m eto d y : I I I I I I zmiana c z c i o n k i I I I I I I p ie r w s z y p a r a m e tr < / p a r a m > I I I drugi p aram etr I I I zmiana c z c i o n k i - komentarz szc zegółowy p r i v a t e vo id C z c i o n k a _ C l i c k ( o b j e c t se n d e r. System. EventArgs e)
K o m p ila to r C # ro z p o z n a je k ilk a n a śc ie p re d e fin io w a n y c h zn ac zn ik ó w : •
< c > - te k s t sy g n a liz u ją c y kod
•
< c o d e > - te k s t sy g n a liz u ją c y w ie lo w ie rsz o w y kod
•
< e x a m p le > - o p is p rz y k ła d u , z a g n ie ż d ż o n e g o w k o m e n ta rz u < c o d e >
•
< e x c e p tio n > - o p is d e fin ic ji k lasy w ła sn eg o w y jątk u
•
< in clu d e> - w skazanie do innego pliku zaw ierającego kom entarz w form acie X M L
•
< list> - lista typu „b u llet” , „ n u m b e r” lu b „table” - zaw iera w ew n ętrzn ą strukturę: <1 i s t t y p e = ' ' b u l l e t " 1 " n u mb e r " | " t a b l e " > <1 i s t h e a d e r > o k r e ś l e n i e < d e s c r i p t i on>o p i s < / d e s c r i p t i o n > < / l i stheader> - o k r e ś l e n i e < d e s c r i p t i on>o p i s < / d e s c r i p t i o n > < / i tem> < / l i st>
•
< p a ra > - z n a c z n ik sto so w a n y w e w n ą trz < re m a rk s> lub < re tu m s > d o p o d ziału te k s tu n a p a ra g ra fy
•
< p a ra m > - k o m e n ta rz d la p a ra m e tró w m eto d
•
< p a ra m re f> - o z n a c z a n ie n a zw p a ra m etró w
•
< p e rm is s io n > - w sk a z u je d o k u m e n t, d o k tó reg o m o że m y o trz y m a ć d o stę p
•
< re m a rk s > - o p is, u w a g i do k lasy , m e to d y lub w ła ściw o ści
•
< re tu m s > - k o m e n ta rz d o m e to d o k re śla ją c y z w ra c a n ą w arto ść
•
< s e e > - o d sy ła c z do tek stu
•
< s e e a ls o > - o d Isy ła c z do te k stu ty p u „ S e e A lso ”
Komentarze XM L
105
•
< su m m a ry > —k ró tk i o p is k lasy , m eto d y lub w ła śc iw o śc i
•
< v a lu e > —opis d e fin ic ji w łaściw o ści. Z naczniki w ystępują param i, ja k o znacznik o tw ierający i znacznik z am y k ający , np.:
I I I z mi a n a c z c i o n k i < / s u m m a r y >
Ćwiczenie 32. Stosujemy komentarze XML O tw o rz y m y p ro jek t z ć w ic z e n ia 24 (E d y to r) i w sta w im y w y b ra n e k o m e n ta rz e X M L (fra g m e n t): I I I I I I Gł ówna met oda a p l i k a c j i I I I < / s u mm a r y > [STAThread] s t a t i c void M ainO C Appl i c a t i o n . RunCnew F o r m l O ) ; } I I I I I I zmienne k la s y - i n a c z e j : pola I I I < / s u mma r y > p r i v a t e Font czc io n k a ; p riv a te Color kolor; p r i v a t e S t r i n g nazwaPliku = ""; p r i v a t e P a g e S e t t i n g s u s t a w i e n i a S t r o n y = new P a g e S e t t i n g s i ) ; p r i v a t e F o n t p r i n t F o n t = new F o n t ( " A r i a l . 1 2 ) ; p r iv a t e s t r in g tekstDoDruku; I I I I I I z a k o ń c z e n i e pr o g r a mu I I I < / s u mm a r y > I I I I I I p r iv a t e void m enultem koniec_Click(object sender.
C A p p l i c a t i o n . Exi t ( ) ;
3 I I I I I I w y c i ę c i e zaznaczonego t e k s t u 111 < / s u mm a r y > I I I
System.EventArgs e)
106
C# w praktyce
I I I p r i v a t e void menuItemWytnij _ C l i c k ( o b j e c t sender. C Okno. C u t ( ) ;
S y s t e m . EventArgs e)
3
I I I I I I kopiowanie zaznaczonego te k stu I I I I I I p r i v a t e void m e n u lte m k o p iu j_ C lic k (o bject sender. C Okno.Copy();
S y s t e m . E v e n t A r g s e)
3
I I I I I I w k l e j e n i e zaznaczonego t e k s t u I I I I I I I I I p r i v a t e void m e n u Ite m W k le j_ C lic k (o b je c t sender.
S y s te m . EventArgs e)
C Okno. P a s t e ( ); 3
I I I I I I zaznaczenie całego tek stu I I I I I I I I I p r i v a t e void menuItemZaznaczwszystko_ClickCobject sender. S y s te m .EventArgs e)
C Okno. S e l e c t A l 1 ( ) ; 3
III III
i•
zapam iętanie właściwości
i koloru czcionki
z zaznaczonego obszaru
I I I I I I I I I < p a r a m name=,,e " X / p a r a m > p r i v a t e void m en u ltem ko p iu jfo rm a t_ C lic k (o b je c t sender, S y s t e m . EventArgs e) C c z c io n k a = Okno. S e l e c t i o n F o n t ;
Komentarze XM L
107
k o l o r = Okno. S e l e c t i o n C o l o r ;
) I I I III u s t a w i e n i e w ła ś c iw o ś c i i k o l o r u c z c i o n k i według w c z e ś n i e j III z a p a m i ę t a n y c h cech I I I < / s u mm a r y > I I I I I I < pa r a m n a m e = " e " > < / p a r a m > p r iv a te void m enuItem W klejform at_C lick(object sender, System. EventArgs e) C
O k n o . Sel e c t i o n F o n t = c z c i o n k a ; Okno. S e l e c t i o n C o l or = k o l o r ; 3 I I I I I I w y c z y s z c z e n i e okna I I I < / s u mma r y > I I I I I I p r i v a t e void menuItemNowy_Click(o b je c t sender,
System. EventArgs e)
C
Okno.Cl e a r ( ) ; 3
I I I I I I z mi a n a w ł a ś c i w o ś c i c z c i o n k i I I I I I I I I I I I I I II ustaw ienie właściwości czcionki III ustawienie koloru czcionki I I I ustaw ienie zaznaczenia I I I a k t u a l i z a c j a paska stanu III p r iv a te void menuItemCzcionka_Click(object sender. System.EventArgs e) C
if
( f o n t D i a l o g l . ShowDialog() =
D i a l o g R e s u l t . OK)
C
Okno. S e l e c t i o n F o n t = f o n t D i a l o g l . F o n t : O k n o . S e l e c t i o n C o l or = f o n t D i a l o g l . Col or ; Okno. S e l e c t ( Okno. T e x t . Length . 0 ) ; s t a t u s B a r l. Panels[ 0 3 .Text="Bieżąca czcionka:
"+
C# w praktyce
108 O k n o . S e l e c t i o n F o n t . Name; 3 3
I I I I I I in fo rm a c je o programie I I I I I I I I I p r iv a t e void In fo rm a c je _ C lic k (object
sender.
S y s t e m . E v e n t A r g s e)
C M e s s a g e B o x . Show( "Edytor t e k s tu w ersja 1 . 0 \ n \ r A u t o r : Marian M ysior", "In fo rm a c je " . Messag e B o x B u t t o n s .O K . M e s s a ge B ox Ic o n. I n f o r m a t i o n ); 3
III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III
w y b ó r p r z y c i s k u na p a s k u n a r z ę d z i wybór p r z y c is k u r e a l i z u j e i n s t r u k c j a 's w i t c h ' : C l i s t type="bul le t " > case < d e s c r i p t i on>Opi s < / d e s c r i p t i on> - 0<7term> nowy dokument
- l < d e s c rip tio n > o tw a rc ie dokumentuC/description>
- 2 za p is dokumentu
- 3 < d e s c r i p t i o n > w y d r u k < / d e s c r i p t i on>
- 4
Komentarze XM L
109
pod glą d w y d r u k i K / d e s c r i p t i o n > 5< /t erm > wytnij 6< /t erm > kopi uj 7 wki ej
’i
8< /te rm> zmi a na czci onki re ma r ks > ivate void t o o l Ba rl _B ut to nC lic k(o bj ect sender,
Sys e m . W i n d o w s .F o r m s .T oo lB ar Bu tto nC lick Ev entArgs e) s w i t c h ( t o o l B a r l . B u t t o n s . I n d e x O f ( e .B u t t o n ))
C case 0: m e n u I t e m N o w y _ C l i c k ( s e n d e r , e); // w y wo ła ni e metody obsługi
zdarzenia "przy
// kliknięciu" menu "Nowy" break; case 1: m e n u I t e m O t w o r z _ C l i c k ( s e n d e r . e); break; case 2: menuItemZapisz_Click(sender, e ) ; break; case 3: menuItemDrukuj_Cl i ck( s e n d e r , e ); break; case 4: menuItemPodglWydruku_Click(se nder, e ) ; break; case 5: menuItemWytnij_Click(sender, e ) ; break; case 6:
C# w praktyce
110
menuItemKopi u j _ Cl i c k ( s e n d e r . e ) ; break; c a s e 7: me n u I t e mWk l e j _ Cl i c k ( s e n d e r , e ) ; break; c a s e 8: me n u I t e mCz c i o n k a _ Cl i c k ( s e n d e r . e ) ; break; 3 3
K om pilator języ k a C# pozw ala „w ydobyć” osadzone w kodzie źródłow ym ko m entarze X M L i zapisać je do pliku *.xm l. P lik taki zostanie utw orzony podczas kom pilacji wykonanej z wiersza poleceń: e s c F o r m l . c s / d o c : e d y t o r . xml.
W ygodniej jednak jest go utworzyć podczas kom pilacji kodu źródłow ego w śro dow isku V isu a l S tu d io .N E T. P lik dokum entacji X M L dla kodu źródłow ego C # utworzym y, w ykonując nastę pujące kroki: •
w eksploratorze rozw iązań ( S o lu tio n E xplorer) prawym przyciskiem wskażemy projekt, np.: E d yto r5 ,
•
z listy kontekstow ej w ybierzem y właściw ości (P ro p erties ),
•
w oknie E d yto r5 P roperty P a g e s wskażem y C o n fig u ra tio n P roperties i dalej B u ild ,
•
w w ierszu X M L D o c u m e n ta tio n F ile wpiszemy nazwę pliku X M L , np.: D o k u m e n ta c ja ed yto ra .x m l,
•
zw róćm y rów nież uwagę na katalog docelow y O u tp u t P ath,
•
zatw ierdzim y podane ustaw ienia przyciskiem O K ,
•
skom pilujem y projekt.
Komentarze XM L
111
pgEaiBawii^Mi Configuration:
A ctive(D ebug)
▼ * Platform:
A ctive(.N ET)
3 ~ r.
,f Common Properties Q i Configuration Properties v
C onfiguration M a n a g e r..,
Conditional Compilation Constan DEBUG; TRACE
Build Debugging
Optimize code
A dvanced
Allow unsafe code blocks
False
Warning Level
W arning level 4
T rea t W arnings As Errors
False
■ Ł » iS ; i
False
Check for Arithmetic O v e rflo w /l False
______________
VIiflfr bin\D ebug\
XML Docum entation File
Dokum entacja ed ytor a . xml
G enerate Debugging Inform atioi True
^Register for COM Intorop
Pds*
Output Path
Specifies the location of th e output files for this project’s configuration.
OK
A nuluj
j
rq ' j
Pom oc
Rysunek 38. Property P ages
N asz przykładow y plik XML: :_ ^ Edyto r1 :_ ^m e m b e r name="T : Edytorl .Forml "> klasa formularza Forml. :_ Wyczyszczenie zasobów przed użyciem ;_ Required method for Designer support - do not modify the contents of this method with the code editor. r_ Główna metoda aplikacji
:_ zakończenie programu wycięcie zaznaczonego tekstu kopiowanie zaznaczonego tekstu wklejenie zaznaczonego tekstu :_ zaznaczenie całego tekstu :_ zapamiętanie właściwości i koloru czcionki z zaznaczonego obszaru :_ ustawienie właściwości i koloru czcionki według wcześniej zapamiętanych cech :_ wyczyszczenie okna
Komentarze XM L
113
:_ zmiana właściwości czcionki
•>
:_ :_ case Opis :_- 0 nowy dokument
r_- 1 otwarcie dokumentu
^- 2 zapis dokumentu
^- 3 wydruk
114
C# w praktyce
4 podgląd wydruku 5 wytnij :_- 6 kopiuj
t
i
:_- 7 wklej
:_- 8 zmiana czcionki
remarks> :_ własna metoda otwórz plik Czy wyczyścić okno przed otwarciem nowego pliku? r_ otwarcie nowego pliku :_ wstawienie pliku ;_ własna metoda zapisu do pllku
Komentarze XM L
115
zapisanie pliku
i zapisanie pliku pod inną nazwą zmiana rozmiarów okna :_ drukowanie
^ ustwaienie parametrów i wydruk dokumentu
^ ustawienie parametrów strony
i podgląd wydruku
Składnia pliku X M L jest dość typowa. W yjaśnienia w ym agają przedrostki w wartościach znaczników (łańcuchów identyfikacyjnych)
116
C# w praktyce
Z n ak
O pis
N
nazwa przestrzeni
T
typ: klasa, interface, struktura, wyliczenie, delegata
F
pole
P
właściwość (również indeksatory)
M
m etoda (również konstruktory, definicje operatorów)
E
zderzenie
|
błędy podczas kompilacji
Ćwiczenie 33. Tworzxm\ dokumentację w postaci raportu HTML Środow isko Visual Studio .NET um ożliw ia w ygenerow anie z pliku źródłowego C#, z kom entarzam i X M L, ustrukturyzow anego raportu HTM L (Code Com m ent Web Report). U tw orzym y taki raport: •
korzystam y z efektów ćw iczenia poprzedniego - kod źródłow y wyposażyliśmy w kom entarze XM L,
•
z m enu Tools w ybierzem y B uild C om m ent Web P ages,
•
w skażem y ścieżkę dostępu do katalogu, w którym zostaną utw orzone pliki (Save W eb P ages In:),
•
ustaw ienia potw ierdzim y przyciskiem OK.
Build Comment Web Pages Build for entire Solution Build for selected Projects:
Save Web Pages i n
:
__________
j7y\C w 32- Komentarz XML\Raport.html! r
Browse..,
[
Add to Favorites OK
R ysunek 39. B uild Comm ent Web Pages
Cancel
j
Help
j
Komentarze XM L
117
W ygenerow any raport m ożem y zobaczyć natychm iast w środow isku Visual S tu dio .NET, a także w przeglądarce internetowej. form!,cs j Fotrnl.es[Design]
Edytor5 |
Code Comment Web Report te k s tD o D r u k u
b Edytorl Form l
m e n u Ite m K o n ie c C lic k m e n u Ite m W v tn ii C lic k m e n u Ite m K û p iu i C lic k m .g.n y j t ę fri W k I ę i .. C I i.gk
zakończenie pro gra m u w ycięcie zaznaczonego te kstu kopiow anie zaznaczonego te kstu w kle je n ie zaznaczonego te kstu zaznaczenie całego te kstu
m e n u îte m K o p iu ifo r m a t C lic k
zapam iętanie właściwości i ko lo ru czcionki z zaznaczonego obszaru
m ęnultęm W kie ifo rm at Click
ustaw ienie właściwości i ko lo ru czcionki w edług w cześniej zap am iętanych cech
m.enyltęrpN.ftBf m enyltemÇ.gçLonka ..Çü.ck
w yczyszczenie okna zm iana właściwości czcionki in fo rm a c je o p ro g ra m ie
tofofJM Sig CÜçk
.> .....
Rysunek 40. Code Comment Web Report
10. Grafika GDI+
Zdolność tw orzenia obiektów graficznych je st istotną cechą każdego języ k a pro gramowania. C # buduje obiekty graficzne, używ ając zaaw ansow anej im plem entacji graficznego interfejsu użytkownika W indows (graphics design interface - G D I) na zwanego GDI+. Grafikę m ożna umieszczać na form ularzach i kontrolkach grupy W indow s F om i i Web Form. D o rysow ania w ykorzystujem y obiekt Graphics, który tw orzym y sam o dzielnie lub korzystam y z niektórych m etod obsługi zdarzeń (np. Paint), dostarczają cych go w postaci argumentu. K orzystanie z metody obsługi zdarzenia P aint ma istotne znaczenie. W w ielu sytuacjach istnieje potrzeba powtórnego narysow ania określonych elem entów na ekranie, np. gdy są czasowo zasłonięte przez inne okno, podczas przesuw ania okien po ekranie, zm ieniania ich rozm iarów, m inim alizow ania itp. System czuw a nad takim i sytuacjami, generując zdarzenie Paint, gdy zaistnieje potrzeba ponow nego narysow a nia określonego obiektu graficznego. W ykorzystując m etodę obsługi tego zdarzenia, możemy tw orzyć grafikę „odporną na uszkodzenia”. Ponow ne odrysow yw anie obiektów graficznych jest wykorzystywane również w celu uzyskania efektów animacji.
10.1.
Podstawowe metody i obiekty graficzne
✓
Ćwiczenie 34. Rysujemy typowe elementy graficzne W ypróbujem y rysowanie podstaw owych obiektów graficznych, tw orzenie piór (do rysow ania linii), pędzli (do wypełniania figur) i tw orzenie czcionek (do kreślenia napisów). Instrukcje „graficzne” um ieścim y w m etodzie obsługi zdarzenia Paint. Zapew ni to nam odm alow yw anie form ularza w przypadku jeg o „zam azania” , a także m ożem y skorzystać z argum entu e tej metody. O biekty graficzne są zdefiniow ane w przestrzeniach nazw: System.Drawing i System.Drawing.Drawing2D.
Pierw szą z nich dołącza do kodu środow isko VS .NET, natom iast drugą m usim y dołączyć sami, używ ając dyrektyw y usi ng.
120
C# w praktyce
p r i v a t e void F o r m l_ P a in t ( o b je c t sender, S y s t e m . Wi n d o w s . F o r m s . Pa i n t E v e n t Ar g s e ) C / / u tw o rz e n ie o b ie ktu typu Graphics //G raphics grafika = this.CreateG raphics(); / / l u b w y k o r z y s t a n i e argumentu „ e ” metody o b s ł u g i Graphics g ra fik a = e.Graphics; / / utworzenie pióra Pen p = new P e n ( C o l o r . F r o m A r g b ( 2 5 5 . 2 5 5 , ' 0 .
0).
zdarzenia
3);
/ / wyczyszczenie t ł a (ustawienie koloru) g rafi ka. C lea r(C o lo r . Y e llow); II lin ia grafika.Draw Line(p,
20, 30,
/ / e l i psa g r a f i k a . D ra w E l1 i p s e ( p , 10,
100, 8 0 ) ;
120,
200,
150);
/ / utw orzenie pędzla (k o lo r j e d n o l i t y ) S o l i d B r u s h b = new S o l i d B r u s h ( C o l o r . H o t P i n k ) ; / / wypełniony prostokąt g r a f i k a , Fi 1 1 R e c t a n g l e ( b ,
150,
10, 250,
100);
/ / u t w o r z e n i e 6 p u n k t ó w i t a b l i c y t y c h pun k t ó w Point punktl = new P o i n t ( 2 5 0 , 1 5 0 ) Point punkt2 = new P o i n t ( 3 0 0 , 1 3 0 ) Point punkt3 = new P o i n t ( 4 0 0 , 1 3 0 ) Point punkt4 = new P o i n t ( 4 5 0 . 1 5 0 ) Point punkt5 = new P o i n t ( 5 0 0 , 2 0 0 ) Point punkt6 = new P o i n t ( 5 5 0 , 3 0 0 ) P o in tC ] punkty = Cpunktl. punkt2, punkt3, punkt4, / / u tw o rzen ie pędzla teksturowego T e x t u r e B r u s h b2 = new T e x t u r e B r u s h ( I m a g e . Fr omFi 1 e ( " c : \ \ w i n d o w s \ \ N i e b i e s k a koronka .1 6 .b m p " ) ) ; / / w ie lo k ą t wypełniony te k s tu r ą g r a f i k a . Fi 1 1 P o l y g o n ( b 2 , p u n k t y . F i l l M o d e . W i n d i n g ) ; / / utworzenie czcionki F o n t f = new F o n t ( " A r i a l " . 1 0 , G ra p h ic s U n it.M illim e te r, 1); //
k r e ś le n ie napisu
F o n tS tyle. Boid.
punkt5.
punkt6);
Grafika GDI+
121
g rafi ka.DrawString("Moja
grafika",
f.
b 2 , 10, 3 0 0 ) ;
// ut wor zen ie pędzla we "wzorki"
H a t c h B r u s h b3 = new H a t c h B r u s h ( H a t c h S t y l e . Cr o s s , C o l o r . B l u e , C o l o r . C o r a l ); / / prostokąt w "kratkę" g r a f i k a . Fi 1 1 R e c t a n g l e ( b 3 , 2 5 0 , 3 0 0 ,
200,
100); V;
/ / utw orze nie obszaru prostokątnego R e c t a n g l e r = new R e c t a n g l e ( 4 5 0 . 1 0 .
100, 8 0 ) ;
/ / u tw o rzen ie pędzla o liniowym g r a d ie n c ie L i n e a r G r a d i e n t B r u s h b4 = new L i n e a r G r a d i e n t B r u s h ( r , C o l o r . L ig h t B lu e , Color.Red, LinearGradientMode.ForwardDiagonal ); / / e l i p s a w y p e łn io n a pędzlem z d efinio wanym wyżej g r a f i k a . Fi 11 E l i i p s e ( b 4 , r ) ; / / d e f i n i c j a pędzla o grad ien cie w postaci " ś c ie ż k i" G r a p h i c s P a t h P a t h = new G r a p h i c s P a t h C ) ; R e c t a n g l e r 2 = new R e c t a n g l e ( 4 5 0 , 1 0 0 , 1 0 0 , 6 0 ) ; Path.AddRectangle(r2); P o in tF C ] Pts = P a t h . P a t h P o i n t s ; P a t h G r a d i e n t B r u s h b5 = new P a t h G r a d i e n t B r u s h ( P t s ) ; b 5 . C e n t e r C o l o r = C o l o r . Y e l 1ow; ColorC] SColor = CColor.Redl; b 5 . SurroundColors = SColor; / / e l i p s a w y p e łn i o n a pędzlem zd ef in io w an y m wyżej g r a f i k a . Fi 11 El 1 i p s e ( b 5 , r 2 ) ;
Składnia niektórych poleceń: •
U tw orzenie nowej instancji obiektu pióra: Pen p = new P e n ( C o l o r . F r o m A r g b ( a , r ,
g. b ) ,
grubość);
Pierw szy argum ent jest strukturą pozw alającą ustalić kolor, a drugi grubość pió ra. Kolory m ożna określać, używając funkcji A r g b ( a , r . g , b ) lub w ybierając predefiniow ane pola kolorów. •
M etoda rysująca linię (odcinek): grafika.DrawLine(p, d
xl.
yl,
x2, y2)
- pióro,
xl. yl.
x 2 . y2 - w spółrzędne początku i końca rysow anego odcinka.
C# w praktyce
122
•
M e to d a ry su ją c a elip sę: g r a f i k a . DrawEl 1 i p s e ( p , x. y . s z e r , wys) x , y - w sp ó łrz ę d n e g ó rn eg o , lew eg o n a ro ż n ik a p ro sto k ą ta , w k tó ry je s t w p isa n a e lip sa , s z e r , wys - sz e ro k o ść i w y so k o ść p ro sto k ą ta .
•
U tw o rz e n ie n o w e j in stan c ji o b iek tu p ę d z la (k o lo r je d n o lity ): S o l i d B r u s h b = new S o l i d B r u s h ( C o l o r . H o t P i n k ) ;
•
M e to d a ry s u ją c a w y p e łn io n y p ro sto k ąt: g r a f i k a . Fi 1 1 R e c t a n g l e ( b , x. y, s z e r , wys) : b - p ę d z e l, x , y , s z e r , wys —ja k d la elip sy .
•
U tw o rz e n ie n o w ej in sta n c ji o b ie k tu czc io n k i: Font f = new F o n t i n a z wa ,
•
r o z mi a r ,
styl,
jednostka.
M e to d a k re ś lą c a n apisy: g r a f i k a . D r a w S t r i n g ( n a p i s , f . b. x. y) f - c z c io n k a , b - p ę d z e l w y p e łn ia ją c y n ap is, x . y - w s p ó łrz ę d n e le w e g o g ó rn e g o n a ro ż n ik a napisu.
R ysunek 41. Podstawowe metody graficzne
1)
Grafika GDI+
123
a
Ćwiczenie 35. Przesiadamy wypełnienia typu HatchStyle Pędzle o wypełnieniach niejednolitych pozwalają w sposób szczególny wzbogacać grafikę. W ypełnieniem może być wskazany plik graficzny (TextureBrush), predefinio wane wzory (HatchBrush), a także wypełnienia gradientowe ( L i n e a r G ra di en t Br us h, PathGradi e n t - Brush).
N apiszem y program demonstrujący predefiniowane w ypełnienia typu HatchStyle. private void For ml_ Pa in t( ob j ec t sender, System.Wi n d o w s .F o r m s .Pa i n t EventArgs e)
C Graphics grafika =e.Graphics; Font f = new Font ("Arial",4,
FontSty le. Bo id ,
Graph>csllnit.M i l l i m e t e r , 1); SolidBrush b = new S o l i d B r u s h ( C o l o r .BIack) ; // po bra nie stylów wypełnień Array hstyle = E n u m . G e t V a l u e s i t y p e o f ( H a t c h S t y l e ) ); int i =0
,j = -1;
// nar y so wa ni e wypełnień foreach (Ha tchStyle hs in hstyle)
C Ha tchBrush h = new H a t c h B r u s h ( h s . Color.Blue,
Col o r .Y e l 1o w ) ;
if (1X10— 0)j++; grafika. Fill Rectangleih, 10+80*(i°/ol0) ,10+80*j ,50,50); g r a f i k a .D r a w S t r i n g ( (i + 1 ) . T o S t r i n g ( ), f, b. 2 5 + 8 0 * ( i + + % 1 0 ) ,
65+80*j ); } )
Na form ularzu z próbkam i stylów wypełnień nie m ieszczą się ich opisy. U m ie ścimy je na dodatkow ym form ularzu, otw ieranym przy użyciu przycisku „ O p is”. Form ularz ten musimy najpierw zdefiniow ać w postaci klasy dziedziczącej z Foim . W ydatnie pom oże nam tu środow isko V S .N E T , który utw orzy szkielet klasy Fomi2 (podobnie jak został zdefiniow any głów ny form ularz F o r m l). W tym celu wybierzemy przycisk A d d N e w Item , a następnie W in d o w s F o rm . N azw ę dom yślną Form2 m ożem y pozostaw ić bez zmian. Na form ularzu um ieścim y kontrolkę T e x tB o x , której w łaściw ość M u ltilin e ustawimy na True. K ontrolka pow inna zajm ow ać praw ie całą pow ierzchnię formularza. Służyć będzie do w yśw ietlania legendy z opisam i stylów.
124
C# w praktyce
Rysunek 42. Style wypełnień
T reść m etody obsługi przycisku „Opis” z form ularza głów nego jest następująca: pri vat e void b u t t o n l _ C l ickCo bje ct sender.
S y s t e m . EventArgs e)
C // u t w o r z e n i e ob iektu formularza Form2 opis = new Form2(); // w y ś w i e t l e n i e fo rm ula rza na ekranie opi s .S h o w ( );
)
Do w yśw ietlenia form ularza na ekranie może służyć m etoda Show() lub ShowD ialog(). Pierw sza z nich w yśw ietla okno (form ularz) niem odalne, czyli m ożna zostawić je na ekranie i przejść do w ykonyw ania innych zadań (m anipulow ania in nymi oknam i). D ruga natom iast w yśw ietla okno m odalne - nie m ożna w ykonać innych czynności przed zam knięciem tego okna. O kna m odalne najczęściej stosujem y w przypadku form ularzy dialogow ych.
Z adaniem form ularza F orm 2 jest w yśw ietlenie (po otw arciu) legendy. W ykorzy stamy w ięc zdarzenie „przy załadow aniu” tego formularza.
Grafika GDI+
125
private void Form2_Load (o bje ct sender.
S y st em .E ve nt Ar g s e)
C // po bra nie stylów wypełnień Array hstyle = E n u m . G e t V a l u e s ( t y p e o f ( H a t c h S t y l e ) ); int 1-1; foreach
(HatchStyle hs in hstyle)
C // w y pr ow ad ze ni e nazw stylów wypełnień t e x t B o x l .Text+= i + + . T o S t r i n g ( ) + " - " + h s .T oS tr in gC )+" \r\ n" ; // us ta wie nie kursora na początku kontrolki t e xt Bo xl.Select(O.O);
3 }
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
DashedVertical SmallConfetti Large Confetti ZigZag Wave DiagonalBrick HorizontalBrick Weave Plaid Divot DottedGrid DottedDiamond Shingle Trellis Sphere SmallGrid SmallCheckerBoard Larg e Ch e eke rB o ard OutlinedDiamond SolidDiamond
a*
m a
Rysunek 43.Opisy stylów wypełnień
10.2.
Pliki graficzne
U m ieszczanie gotow ych grafik na form ularzach jest istotnym elem entem wielu programów. C # może używać wielu form atów plików graficznych. Są to: bm p, emf, exif, gif, ic o jp g , png, tif, wmf. M iejscem um ieszczania grafiki jest zw ykle kontrolka Pi ctureBox.
C# w praktyce
126 A
Ćwiczenie 36. Kolekcja plików graficznych U tw orzym y program służący do przeglądania różnych plików graficznych. N a projekcie form ularza umieścimy: •
K ontrolkę P ictu reB o x. U staw im y jej właściwości: o
S ize M o d e = S tre tc h lm a g e (obraz rozciągnięty do wym iarów kontrolki),
0
B o rd e rS tyle = F ix e d 3 D („trójw ym iarow y”).
•
D w a przyciski z napisam i „ P o p rze d n i ” i „N a stę p n y ” do przeglądania kolejnych obrazów naszej kolekcji grafik.
•
P rzycisk z napisem ,,/Vpvvy” służący do dodaw ania nowych obrazów do kolekcji.
•
Przyciski m ożem y „upiększyć” ikonam i, ustawiając ich właściwości Im a g e na pliki z przykładow ego folderu: C :\P ro gram F ile s\M ic ro so ft V isu a l S tu d io .N E T \C o m m o n 7 \G ra p h ic s\ic o n s\
K od program u: •
Z definiujem y kolekcję grafik: ArrayList
K o l e k c j a = new A r r a y L i s t O ;
1 zm ienną określającą indeksy poszczególnych elem entów kolekcji: i nt
i = 0;
D eklaracje um ieścim y w obszarze deklaracji pól i metod klasy F o m i l . K lasa A n a y L is t (om ów iona w cześniej) jest wygodnym sposobem grupowania różnych elem entów . •
O program ujem y metody obsługi kliknięcia przycisków , rP o p rze d n i ” i N a s t ę p n y " (w ygodnie będzie w cześniej zm ienić w łaściw ości N a m e tych przycisków na takie - j a k napisy na nich).
private C if
S y s te m .EventArgs e)
> 0) / / o k r e ś l e n i e nazwy p l i k u g r a f i c z n e g o ; / / o p e r a to r " - - i " zmniejsza index o 1 / / p r z e d o d w o ł a n i e m s i ę do e l e m e n t u k o l e k c j i pi c t u r e B o x l .Image = Im age. FromFi1e ( K o l e k c j a C - - i ] . T o S t r i n g ( ) ) ;
}
(i
void P o p rze d n i_ C lick (o b je c t sender,
Grafika GDI+
127
p riv ate void N a s te p n y _ C lic k (o b je c t sender, System.EventArgs e) C if (i < K o lek cja. Count-1) p i c t u r e B o x l . I mage = I m a g e . F r o m F i 1 e ( K o l e k c j a [ + + i ] . T o S t r i n g ( ) ) ; 3
Zanim w ypróbujem y przyciski do „przew ijania” naszej kolekcji, m usim y zbu dować m echanizm dodający do niej nowe elem enty (teraz jest jeszcze pusta) i prze chowujący jej elem enty po zakończeniu programu. •
U zupełnim y projekt form ularza o kontrolkę O penF ileD ialog.
•
Do deklaracji przestrzeni nazw dodamy: u s i n g S y s t e m . 10; •N
•
N apiszem y metodę obsługi kliknięcia przycisku „Newy” : p r i v a t e v o i d N o w y _ C l i c k ( o b j e c t s e n d e r, S y s t e m . EventArgs e) C / / łańcuch, d e f in iu ją c y f i l t r . / / pozwalający wybierać ty lk o określone p l i k i o p e n F i 1 e D i a l o g l . Fi 1 t e r = "Obrazy bitmapowe ( * . b m p ) | * . b m p | M e t a p li ki ( * . w m f ) | * . w m f | I k o n y ( * . i c o ) | * . i c o | P I i ki j p g ( * . j p g ) | * . j p g |PI i ki g i f ( * . g i f ) | * . g i f " ; i f (o p en F i1e D i a l o g l . ShowDialog() = C Fi 1e S t r e a m pl i k ; StreamWriter stZapis;
D i a l o g R e s u l t . OK)
/ / z a ł a d o w a n i e o b r a z u z okna d i a l o g o w e g o do P i c t u r e B o x p i c t u r e B o x l . Image = I m a g e . FromFi 1 e ( o p e n F i 1 e D i a l o g l . Fi 1 e N a m e ) ; / / dod a ne w s k a z a n e g o p l i k u do k o l e k c j i K o l e k c j a . A d d ( o p e n F i 1 eDi a 1 o g l . Fi 1 e N a m e ) ; / / z a p i s nazwy i ś c i e ż k i d o s t ę p u do p l i k u pl i k = new F i l e S t r e a m ( " c : \ \ d a n e . t x t ' ' , F i l e M o d e . A p p e n d , F i l e A c c e s s . W r i t e . Fi 1 e S h a r e . N o n e ) ; s t Z a p i s = new S t r e a m W r i t e r ( p l i k ) ; s t Z a p i s . Wri t e L i n e ( o p e n F i 1 eDi a 1 o g l . Fi 1 e N a m e ) ; stZapis.Close(); p l i k . C l o s e ( );
3 3
128
C# w praktyce
Po uruchom ieniu program u należy odczytać lub utworzyć nowy plik z danym i do kolekcji. •
M etoda obsługi zdarzenia „przy załadow aniu” formularza: p r iv a t e void Forml_Load_l( object sender. C Fi 1 e S t r e a m p l i k ; StreamReader s tC z y t;
S y s te m .EventArgs e)
p l i k = new Fi 1 e S t r e a m ( " c : W d a n e . t x t " , Fi 1 eMode. O p e n O r C r e a t e . Fi 1 e A c c e s s . R e a d . F i l e S h a r e . N o n e ) ; s t C z y t = new S t r e a m R e a d e r ( p l i k ) ; / / d o p ó k i i s t n i e j ą z n a k i do c z y t a n i a z p l i k u , / / dodawaj k o l e j n e w i e r s z e , j a k o e le m e n t y k o l e k c j i w hile (s tC z y t.P e e k () > -1) K o l e k c j a .Add( s t C z y t . R e a d L i n e ( ) ) ; s t C z y t . C l o s e ( ); p l i k . C l o s e ( ); // // if
j e ż e l i są j a k i e ś e l e m e n t y w k o l e k c j i , z a ł a d u j p i e r w s z y e l e m e n t do P i c t u r e B o x ( K o le k c ja . Count>0) p i c t u r e B o x l . I mage = I m a g e . F r o m F i 1e ( K o l e k c j a t i ] . T o S t r i n g ( ) ) ;
}
Z naczenia niektórych poleceń: •
pi c t u r e B o x l . I mage =
Im age.From File(openFileDialogl.FileName)
- statycz
na m etoda, tw orząca obiekt Im age z podanego pliku. Tutaj nazwę pliku określa w łaściw ość FileN am e obiektu o p en F ileD ia lo g l. •
Kol ek cja . A d d ( o p e n F i 1 eDi al o g l . Fi 1 eName)
— dołączenie elem entu do kolekcji (.ArrayList). Tutaj elem ent jest pobierany z właściwości FileNam e.
•
s t C z y t . P e e k ( ) - zw raca kolejny znak z pliku tekstowego. Jeżeli napotkano
koniec pliku, jest zw racana w artość -1. •
- dołączenie elem entu do kolekcji. Tutaj elem ent został odczytany z pliku (jako kolejny wiersz pliku tekstow ego). Kol e k c j a . A d d ( s t C z y t . R e a d L i n e O )
Grafika GDI+
129
fr P op rzed ni
N a stę p n y
Rysunek 44. Kolekcja grafik
10.3.
Animacja
S ta ty c z n e fig u ry g e o m e try c z n e i sta ty c z n e p lik i g ra fic z n e m o ż n a w p ro w a d z ić w ru ch , sto su ją c ró żn e m eto d y an im acji. R u ch , c z y li a n im a c ję g ra fik i, m o ż n a u z y sk a ć , w ie lo k ro tn ie ry su ją c w ró żn y ch m ie jsca c h fo rm u la rz a o k re ślo n e e le m e n ty g ra fic z n e lub se k w e n c y jn ie o d c z y tu ją c ró żn e pliki z d y sk u . D o u z y sk iw a n ia efe k tó w a n im ac ji w y k o rz y stu je się: •
w ła śc iw o śc i Left, Top, Location, SetBounds k la sy PictureBox,
•
k o n tro lk ę T i m e r - do o d m ie rz a n ia cza su trw a n ia p o sz c z e g ó ln y c h fa z ru c h u ,
•
m e to d ę o b słu g i z d a rz e n ia Paint,
•
p rz e k sz ta łc e n ia g e o m e try c z n e , w y k o rz y stu ją c e k lasę M atiix.
Ćwiczenie 37. Animacja z użyciem PictureBox P ro sty sp o só b an im acji m o ż e m y u z y sk ać , z m ie n ia ją c se k w e n c y jn ie (w „ p ę tli”) w arto ść w ła śc iw o śc i Left k lasy PictureBox (ru ch p o z io m y ) lub w a rto ść Top (ru ch pio n o w y ). N a fo rm u la rz u u m ie śc im y k o n tro lk ę PictureBox (jej ro z m ia ry i p o ło ż e n ie b ę d z ie my u sta w iać w k o d z ie ) o ra z p rz y c isk z n a p isem „ S ta rt” . P rz y c isk o p ro g ra m u je m y n astęp u jąco : p r iv a te void b u t t o n l _ C li c k io b j e c t sender.
t //
o d c z y ta n ie rozmiarów form ularza
S y s t e m . EventArgs e)
130
C# w praktyce
i nt x = t h i s . W i d t h ; in t y = t h i s . Height; / / u s ta w ie n ie rozmiarów p ic tu re B o x l p i c t u r e B o x l . W i d t h = 50; p i c t u r e B o x l . H e i g h t = 50; / / pionowe p o ł o ż e n i e p i c t u r e B o x l p i c t u r e B o x l .Top = y / 2 - p i c t u r e B o x l . H e i g h t ; / / n i e b i e s k i e k o ł o na p i c t u r e B o x l Graphics g = p i c t u r e B o x l . C re a te G ra p h ic s (); Br u s h b = new Sol i d B r u s h ( C o l o r . BI u e ) ; g . Fi 11 El 1 i p s e ( b , 0 , 0 . p i c t u r e B o x l . W i d t h - 1 , pi c t u r e B o x l . H e i g h t - 1 ) ; / / animacja koła wzdłuż formularza f o r ( i n t i = 0; i < x - p i c t u r e B o x l . W i d t h - 6; 1++) p ictu re B o x l. Left = i;
3 S z y b k o ś c ią a n im a c ji m o ż e m y ste ro w ać , u m ie sz cz ają c p ę tlę o p ó ź n ia ją c ą , np.: for(int
i = 0;
i < x - p i c t u r e B o x l . W i d t h - 6 ; 1++)
C
p ic tu re B o x l. Left = i; for (flo a t j= 0 ; j< le 6 ;j+ + );
//p ętla
opóźniająca
3
Rysunek 45. Anim acja m etodą zmiany właściwości „Left”
Grafika GDI+
131
Ćwiczenie 38. Animacja erafik pobieranych z plików Sekw encje grafik, stanowiące kolejne fazy ruchu, m ożna um ieścić w plikach dyskowych. O tw ieranie takich plików, w odpow iednim tem pie i kolejności, m oże być metodą uzyskiw ania animacji. N a projekt form ularza naniesiem y kontrolkę PictureBox i przycisk „Start”. W ła ściwość SizeM ode kontrolki PictureBox ustawim y na Stretchlm age. Szczególnym elem entem naszego projektu będzie kontrolka Timer, którą rów nież naniesiem y na form ularz (dokładniej - zostanie ona rozm ieszczona na palecie pod projektem form ularza). Zadaniem Timera jest generow anie zdarzenia „Tick” w okre ślonych odstępach czasu. W ykorzystując m etodę obsługi tego zdarzenia, będziem y odczytywać z plików kolejne fazy ruchu. Odstęp czasu pom iędzy kolejnym i w ystą pieniami zdarzenia Tick ustawim y we w łaściw ości Interval."W piszem y tutaj 100, co oznacza 100 milisekund. Timer m usim y włączyć (inaczej zdarzenia Tick nie będą za chodzić). U czynim y to, nadając właściw ości E nabled w artość True. M etoda obsługi zdarzenia Tick: p r i v a t e vo id t i m e r l _ T i c k ( o b j e c t s e n d e r, S y s t e m . EventArgs e) C / / o k r e ś l e n i e ś c i e ż k i d o s t ę p u do p l i k ó w / / (bieżący katalog - bin\debug)) s t r in g ścieżka = E n vironment. C u r r e n t D ir e c t o r y . S u b s t r i n g ( 0 , Envi r o n m e n t . C u r r e n t D i r e c t o r y . L e n g t h - 9 ) ; / / załadowanie z p lik u , kolejnych faz animacji p i c t u r e B o x l . I mage = S y s t e m . D r a w i n g . I m a g e . F r o m F i 1 e ( s c i e z k a + " f a c e O " + liczn ik.T o S trin g () + ".ico"); 1i czni k += 1 ; / / j e ż e l i o s i ą g n i ę t o o s t a t n i ą f a z ę - p o w r ó t do p i e r w s z e j i f ( l i c z n i k = = 5 ) l i c z n i k = 1;
3
•
Licznik należy zadeklarow ać na poziom ie klasy i nadać mu w artość 1. Przycisk „Stop”/„Start” będzie w yłączał i w łączał anim ację: p riv a te void b u t t o n l _ C l i c k ( object sender. C if
( b u t t o n l . T e x t == " S t o p " ) C / / zatrzymanie animacji t i m e r l . Enabled = f a l s e ;
S y s t e m . EventArgs e)
132
C# w praktyce // pr ze łą c z e n i e napisu "Stop" na "Start" b u t t o n l . T e x t = "Start";
3 el se
{ // u r uc ho mi en ie animacji t i m e r l .Enabled = true; // p r z e ł ą c z e n i e napisu "Start" na "Stop" b u t t o n l . T e x t = "Stop";
3
Rysunek 46. Anim acja m etodą pobierania faz ruchu z pliku v*
Ćwiczenie 39. Księżyc W ykorzystując jednocześnie w łaściw ości Left i Top klasy PictureBox, m ożem y przesuw ać rysunki pobrane z pliku po pow ierzchni formularza. K ontrolka Ti mer będzie odm ierzać czas pom iędzy kolejnym i fazami ruchu. Prędkość ruchu będziem y regulow ać suw akiem . Do anim acji w ykorzystam y rysunek K siężyca, który będzie w ykonyw ał ruch obiegow y w okół rysunku Ziemi. N a projekt form ularza naniesiem y: •
dw ie kontrolki PictureBox: o
Z iem ia - na środku form ularza,
o
K siężyc - z boku.
Grafika GDI+
133
Ich w ła śc iw o śc i Im a g e u staw im y n a p lik i z fo ld eru : C :\P ro g ra m F ile s\M ic ro so ft V isu a l S tu d io .N E T \C o m m o n A G r a p h ic s\ic o n s \E le m e n ts: E a trh .ic o i M o o n 2 .ico . R o z c ią g n ie m y k o n tro lk i P ic tu reB o x (w c z e śn ie j u sta w im y w ła śc iw o śc i S iz e M o d e n a S tre tc h lm a g e ), aby ro zm iary w z g lęd n e Z ie m i i K się ż y c a b y ły o d p o w ie d n ie . •
p rz y c isk z n a p isem „ S ta rt” ,
•
k o n tro lk ę Tim er,
•
k o n tro lk ę H S c r o llB a r - su w ak p o z io m y (d o z m ia n y p rę d k o śc i a n im a c ji). Tim er, p rz y c isk i su w ak o p ro g ra m u je m y n a stę p u ją c o : *\
/ / kąt obrotu i n t k a t = 0; p r i v a t e void t i m e r l _ T i c k ( o b j e c t sender, S y s te m .EventArgs e) C / / współrzędne Księżyca double x, y; / / w a r t o ś ć k ą t a z m i e n i a s i ę od 0 do 3 6 0 s t o p n i k a t = ( k a t + 1 ) % 360; x = ( p i c t u r e B o x l . Width+50) * M ath.C os ika t * M a t h .P I ' / 1 8 0 ); y = ( p i c t u r e B o x l . H e i g h t + 5 0 ) * M a t h . S i n ( k a t * M a t h . PI / 1 8 0 ) ; / / p o ło ż e n ie Księżyca pi c t u r e B o x 2 . L e f t = ( i n t M p i c t u r e B o x l . L e f t + p i c t u r e B o x l . W i d t h / 2 + x - 8 ) ; p i c t u r e B o x 2 . Top = ( i n t ) ( p i c t u r e B o x l . T o p + p i c t u r e B o x l . H e i g h t / 2 + y - 8 ) ;
) p r i v a t e void b u t t o n l _ C l i c k ( o b j e c t s ender, S y s t e m . EventArgs e) C / / w ł ą c z e n i e / w y ł ą c z e n i e Timera t i m e r l . Enabled = ! t i m e r l . Enabled; / / z mi a n a n a p i s u na p r z y s i s k u i f ( t i m e r l . Enabled) b u t t o n l . T e x t = "Stop” ; else b u tto n l.T e x t = " S ta rt" ;
p r i v a t e void h S c r o l 1B a r l _ S c r o l 1 ( o b j e c t sende r, System.Windows. Forms. S c r o l 1 EventArgs e) C
134
C# w praktyce
/ / re g u la c ja prędkości animacji t i m e r l . I n t e r v a l = h S c r o l 1 B a r i . V a l ue + 10;
}
Rysunek 47. Ruch Księżyca wokół Ziemi
Ćwiczenie 40. Działania na macierzach klasy Matrix Transform acje obiektów graficznych (i animację) można efektywnie realizować, w ykorzystując klasę Matrix. Udostępnia ona matematyczną macierz o wymiarach 3 na 3. M etody tej klasy pozwalają wykonywać różne przekształcenia geometryczne obiektów graficznych na płaszczyźnie z wykorzystaniem danych wpisanych do macierzy. Jaki jest m echanizm w ykorzystania m acierzy udostępnianej przez klasę Matrix! Jak w ykonyw ać przekształcenia przy jej użyciu? Punkt geom etryczny na płaszczyźnie możemy przedstaw ić jako m acierz 1x2 (jeden w iersz, dw ie kolum ny), np.: [50, 100]. O brót tego punktu w okół środka układu w spółrzędnych o 90 stopni jest iloczynem macierzy:
[50 100]x
0
1
-1
0
= [-100 50]
Iloczyn dw óch m acierzy m ożem y określić w przypadku, gdy liczba kolumn pierw szej m acierzy jest rów na liczbie wierszy drugiej macierzy. M acierz wynikowa posiada tyle w ierszy - ile m acierz pierw sza, oraz tyle kolumn - ile m acierz druga. E lem enty m acierzy wynikow ej obliczam y jako sumę iloczynów kolejnych elementów i-tego w iersza pierw szej m acierzy oraz k-tej kolum ny drugiej macierzy. Powyższy przykład w yliczam y więc następująco: [5 0 * 0 + 100*-1;50*1 + 100*0] = [-100, 50].
Grafika GDI+
135
P rz e su n ię c ie d e fin iu je m y ja k o su m ę m ac ie rzy , np.:
[50, 100] + [20, 30] = [70, 130] O b ró t i p rz e su n ię c ie m o żem y z ap isa ć w m a c ie rz y ty p u M a trix i w y k o n a ć tr a n s form ację z ło ż o n ą z ty ch p rze k sz tałce ń . P o n ie w a ż m a c ie rz M a trix m a ro z m ia ry 3 x 3 , to aby o b lic z y ć ilo c zy n (zg o d n ie z d e fin icją ) do w sp ó łrz ę d n y c h x, y p u n k tu d o łą c z a m y trzecią w sp ó łrz ę d n ą o w arto ści 1, np. [50, 100, 1]. T e ra z z ło ż e n ie o b ro tu i p rz e s u n ię cia m o ż e m y z a p isa ć n astęp u jąco : 0
[50 100 l]x
1 0
- 1 0 0 = [ - 8 0 80 l] 2 0 30 1
T rzecia k o lu m n a m acierzy M arix, podobnie ja k trzecia w sp ó łrzęd n a pierw szej m ac ie rzy (punktu), stanow ią jed y n ie „atrapę” do obliczeń i nie są dalej brane pod uw agę. S to su ją c m a c ie rz M a trix, m o ż n a w y k o n ać se rię k ilk u p rz e k sz ta łc e ń g e o m e try c z nych, ta k ic h ja k o b ró t, p rze su n ię c ie , p rz e sk a lo w a n ie (z m ia n a sk a li), p rz e s u n ię c ie p o w spółrzędnej {shear) i inne. Z n a c z e n ia e le m e n tó w m ac ie rzy M a trix : m il
m l2 0
m 21 m 2 2 0
dx
dy
1
m l 1 - o b ró t i sk a la o si x, m l2 —o b ró t, m21 - o b ró t, m 22 - o b ró t i sk a la osi y, d x - w sp ó łrz ę d n a x p rz e su n ię cia, d y - w sp ó łrz ę d n a y p rze su n ię cia. T rz e c ia k o lu m n a m ac ie rzy m a w a rto ści stałe. E le m e n tó w m a c ie rz y M a trix nie m o ż n a p o d sta w ia ć b e z p o śre d n io , c h o c ia ż m o ż n a je o d czy ty w ać (w ła śc iw o ść ty lk o do o d czy tu ). D e k laru jąc m ac ie rz M a trix n a stęp u jąc o (jej d e fin ic ja z n a jd u je się w p rz e strz e n i nazw: S y s t e m . D r a w i n g . D r a w i n g 2 D) : M a t r i x m = new M a t r i x O ;
C# w praktyce
136
p rz y k ła d o w e d a n e, re a liz u ją c e p rz e su n ię cie m o że m y w p ro w ad z ić p o lecen iem : m . T r a n s ! a t e ( 2 0 ,30); S p o w o d u je to w p ro w a d z e n ie d a n y ch d o m acierzy:
"1 0 0
"
0 1 0 20 30 1 O b ró t o 90 sto p n i m o ż e m y w y k o n a ć n a stę p u ją c o , w p ro w a d z a ją c dane: m.Rotate(90); W a rto ś c i e le m e n tó w m acierzy :
"0
1 0
-10
0
0 0
1
“
Z m ia n ę sk a li w y k o n a m y tak: m. S c a l e ( 0 . 5 f , 1 . 5 f ); W a rto ś c i e le m e n tó w m acierzy : '
0,5 0 0
0 0
“
1,5 0 0 1 C ie k a w ą tra n s fo rm a c ją je s t p rz e su n ię c ie po w sp ó łrz ęd n e j (w p rz y k ła d z ie po
w s p ó łrz ę d n e j x): m.Sheard,
0);
W a rto śc i e le m e n tó w m acierzy :
"1 0 1
0
1
0
0 0
1
"
Grafika GDI+
137
W arto w ypróbow ać to przekształcenie na przykładach graficznych. Aby w ykonać przekształcenia geom etryczne (czyli pom nożyć m acierze), po wprowadzeniu danych do macierzy M a t r i x , należy w yw ołać m etodę Transform Points. P o i n t F E ] p = Cnew P o i n t F ( 5 0 , m .TransformPoints(p) ;
100)3;
Jeżeli chcem y, aby po każdym przekształceniu m acierz została w yczyszczona, należy użyć m etody R eset: m.ResetC);
Elem enty m acierzy m ożem y odczytać, w ykorzystując w łaściw ość E l e m e n t s C i ] (tablica jednow ym iarow a). K olejność elem entów w tablicy jest następująca: m i l , ml 2 , m21, m22, dx, dy, np.: string s tr= ""; f o r ( i n t i = 0 ; i <6; i + + ) s t r += m .E le m e n t s C i] .T o S tr in g (" N 0 " )+ " Dane.Text + = " \ n m a c i e r z :" + s t r ;
W ykonam y przykład ilustrujący transform acje punktu przy użyciu m acierzy typu Matrix. W tym celu utw orzym y form ularz podobny do podanego.
Dane początkow e - p unkt: {X=50. Y=100} m acierz:! 0 0 1 0 0
Po przesunięciu * punkt: {X*70.Y-1 30} macierz:1 0 0 1 20 30
N arysuj transform ację “ S h e a r*
Po obrocie o 90 stopni - punkt: (X=>-130, Y=70} macierz:0 1 - 1 0 0 0 Po po zm ianie s ka li (0 .5,1 .5)-p u nkt: {X=-65. Y=105} macierz:0,5 0.0 0,0 1.5 0.0 0.0 Po przesunięciu 'S hear(1.0)' - punkt {X=40. Y=105} macierz:1 0 1 1 0 0
O b licz przykłady
Rysunek 48. Wykorzystanie macierzy typu Matrix
138
C# w praktyce P rz y c is k „ O b lic z p rz y k ła d y ” o p ro g ra m u je m y n astęp u jąco :
p r iv a t e void b u tto n l_ C lic k (o b je c t sender. C P o i n t F C ] p = Cnew P o i n t F ( 5 0 , 1 0 0 ) 3 ;
S y s t e m . EventArgs e)
M a t r i x m = new M a t r i x O ; D a n e . T e x t = " Da n e p o c z ą t k o w e - p u n k t : " + p . G e t V a l u e ( 0 ) . T o S t r i n g ( ) ; string str=""; f o r ( i n t i = 0 ; i <6; i + + ) str+=m .E lem en tsC i3 .T o S trin g ("N O ")+ " D a n e . T e x t + = " \ n m a c i e r z :" + s t r ; / / przesunięcie m .Translate(20,30); / / t o p o l e c e n i e możemy z a b l o k o w a ć . / / aby z o ba czy ć t r a n s f o r m a c j ę z ł o ż o n ą m .Transform Points(p); P r z e s u n i e c i e . T e x t = "Po p r z e s u n i ę c i u - p u n k t : p . G e t V a l u e ( 0 ) . T o S t r i n g ( ); str“ " " ; f o r ( i n t i = 0 ; i <6; 1++) str+=m .Elem ents[i 3 .T oS tring ("N O ")+ " P r z e s u n i e c i e . T e x t + = " \ n m a c i e r z :" + s t r ; // //
" +
t o p o l e c e n i e możemy z a b l o k o w a ć , aby zo ba czy ć t r a n s f o r m a c j ę z ł o ż o n ą
m .ResetO ; / / obrót m .R otate(90); m .Transform Points(p); O b r ó t . T e x t = "Po o b r o c i e o 90 s t o p n i p . G e t V a l u e ( 0 ) . T o S t r i n g ( );
- punkt:
" +
str“ " " ; f o r ( i n t i = 0 ; i <6; i + + ) s t r + = m . E l e m e n t s [ i 3 . T o S t r i n g ( " N 0 " ) + " "; O b r ó t . Text += " \ n m a c ie r z : " + s t r ; m. R e s e t ( ) ; / / zmiana s k a l i m. S c a l e ( 0 . 5 f , 1 . 5 f ) ; m .Transform Points(p); S k a l a . T e x t = "Po po z m i a n i e s k a l i
(0.5.
1.5)
- punkt:
" +
Grafika GDI+
139
p . G e t V a l u e ( 0 ) . T o S t r i n g ( ); str=""; f o r ( i n t i = 0 ; i <6 ; 1 + + ) str+=m.ElementsEi1 .T o S trin g ("N l")+ " S k a l a . T e x t += " \ n m a c i e r z : " + s t r ; m .R e s e t(); I I p r z e s u n i ę c i e po w s p ó ł r z ę d n e j m .S heard, 0); m .Transform Points(p); P r z y c i ę c i e . T e x t = "Po p r z e s u n i ę c i u ' S h e a r ( l . O ) ' p .G e t V a lu e ( 0 ) . T o S t r i n g ( ); str=""; f o r ( i n t i = 0 ; i <6; 1++) s tr+ = m .E le m e n ts E i1 .T o S tr in g (" N O " )+ " "; Przycięcie.Text+= "\nm acierz:" + s tr; m .R e s e t ( );
- punkt:
" +
G ra fic z n y p rzy k ła d ilu stru ją c y d z ia ła n ie tra n s fo rm a c ji S h e a r z d e fin iu je m y ja k o m etodę o b słu g i p rz y c isk u „N ary su j tra n sfo rm a c ję " S h e a r" ” . p r iv a t e void b u t t o n 2 _ C l i c k ( o b j e c t sender,
S y s t e m . E v e n t A r g s e)
C
Graphics g = C re a t e G r a p h ic s ( ); M a t r i x m y M a t r i x = new M a t r i x O ; / / prosto kąt pierwotny g . DrawRectangle(new P e n ( C o lo r .G r e e n ,2 ) , 0.
0 . 100 , 5 0 ) ;
/ / tra n s fo rm a c ja "Shear" - p r z e s u n ię c ie myMatrix. Shear(1, 0); / / transformacja g r a fik i g. Mu l t i p i y T r a n s f o r m ( m y M a t r i x ) ; / / p r o s t o k ą t i e l i p s a po t r a n s f o r m a c j i g . DrawRectangle(new P e n ( C o lo r . Red, 2 ) . 0. 0 . 100, 5 0 ) ; g . D r a w E l 1 ip s e ( n e w P e n ( C o l o r . B l u e , 2 ) , 0, 0, 100, 5 0 ) ;
140
C# w praktyce
s _________________________________________________ _____
Ćwiczenie 41. Transformacie MultiplyTrans form P o z n a n ą m acierz k lasy M atrix w y k o rzy stam y do w y k o n an ia tran sfo rm acji elipsy. N a p u sty m p ro je k c ie fo rm u la rz a u ru c h o m im y e d y cję m eto d y o b słu g i z d arze n ia P a in t. p r i v a t e void F o r m l _ P a i n t ( o b j e c t sender, S y s t e m . W i n d o w s . F o r m s . Pa i n t E v e n t A r g s e ) C / / e lip s a pierwotna e .G r a p h ic s . DrawEllipse(new Pen(Colo r . B Iu e , 3 ),
0.
0,
160,
80);
/ / utworzenie macierzy przekształceń M a t r i x t r a n s f o r m M a t r i x = new M a t r i x O ; / / dodanie p rze s u n ięc ia tran sfo rm M atrix.T ran slate(200.0F,
1 0 0 . OF) ;
/ / d o d a n i e o b r o t u o 90 s t o p n i transform M atrix.R otate(90F ); / / tra n s fo rm a c ja obiektów graficznych / / ( p r z e k s z t a ł c e n i a w c z e ś n i e j dodane) e.Gra p h ic s .M u lti p ly T r a n s form(t r a n s f o r m M a t r ix ) ; / / narysowanie obróconej i p r z e s u n ię te j e lip s y e . G r a p h i c s . D r a w E l l i p s e C n e w P enC Color.R ed, 3 ) , 0,
3
R ysunek 49. Przekształcenie M ultiplyTransform
0,
160, 8 0 ) ;
Grafika GDI+
141
✓
Ćwiczenie 42. Animacja z użyciem transformacji MultiplxTransform P rz e k s z ta łc e n ia g rafic zn e M u l t i p l y T r a n s f o r m m o ż n a w y k o rz y sta ć d o ry so w a n ia ko lejn y ch faz ru ch u . •
N a p ro je k t fo rm u la rz a n a n ie siem y k o n tro lk ę Tim er. Jej w ła śc iw o ść In terya l u staw im y na 10 m s. N ie z a p o m n ijm y o w łaściw o ści E n a b le d = True.
•
W k o d z ie u m ie śc im y d ek larację: using System.Drawing.Drawing2D;
•
U ru c h o m im y e d y cję m eto d y o b słu g i z d a rz e n ia Pa i n t d la fo rm u la rz a . *> p r iv a t e void Form l_P aint(object sender, Sys tem .Wi ndo ws . Forms. P a i n t E v e n t A r g s e) C Graphics G = e.G ra p hic s ; / / utworzenie "ścieżki g ra fic z n e j" G r a p h i c s P a t h P a t h = new G r a p h i c s P a t h ( ) ; / / u t w o r z e n i e p r o s t o k ą t a i d o d a n i e go do ś c i e ż k i R e c t a n g l e r = new R e c t a n g l e ( 7 5 , 9 0 , 1 5 0 , 1 0 0 ) ; Path.AddR e c t a n g le ( r ) ; / / u t w o r z e n i e p ę d z la gr ad ie ntowego z t a b l i c y punktów P o i n t F C ] Pt s = P a t h . P a t h P o i n t s ; P a t h G r a d i e n t B r u s h b = new P a t h G r a d i e n t B r u s h ( P t s ) ; / / k o l o r p ę d z la w centrum b . C e n t e r C o l or = C o l o r . Y e l l o w ; / / k o l o r y p d z l a na b r z e g a c h C o l o r C ] S C o l o r = ( C o l o r . R e d , C o l o r . G r e e n , C o l o r . BI u e , C o l o r . M a g e n t a } ; b.SurroundColors = SColor; / / utworzenie obiektu macierzy M a t r i x m = new M a t r i x O ; / / d o d a n ie o b r o t u wokół wskazanego p u n k t u , / / do m a c i e r z y p r z e k s z t a ł c e ń m.RotateAtCkat, b .C e n te rP o in t); / / wykonanie t ra n s f o rm a c ji b.M ultiplyTransform (m);
pędzla
(nie prostokąta)
C# w praktyce
142 / / narysowanie wypełnienia prostokąta G.Fi 11R e c ta n g le (b , Draw ingRect); / / z w o l n i e n i e zasobów p a m i ę c i m .D is p o s e (); b . D is p o s e (); P a t h . Di s p o s e ( ) ;
) •
Z m ie n n e k a t i Dr a wi n g R e c t z a d e k la ru je m y n a p o z io m ie k lasy fo rm u la rza : f l o a t kat; R e c t a n g l e D r a w i n g R e c t = new R e c t a n g l e ( 2 5 , * t
•
25. 225,
225);
U ru c h o m im y e d y c ję m eto d y o b słu g i z d a rz e n ia T i c k d la o b iek tu t i m e r 1. p r iv a t e void t im e r l_ T ic k ( o b je c t sender,
S y s te m .EventArgs e)
C / / z m i e n n a z a d e k l a r o w a n a na p o z i o m i e k l a s y kat++; / / z g ło s z e n ie potrzeby odświeżenia / / ( p o ś r e d n i e w y w o ł a n i e me t o dy F o r m l _ P a i n t ) t h i s . I n v a l i d a t e (Drawi n g R e c t ) ;
} •
A b y z a p e w n ić p ły n n o ść a n im ac ji, w a rto je s z c z e d o d a ć w k o n stru k to rz e F o rm l p o le c e n ia : t h i s . S e t S t y l e ( C p n t r o l S t y l e s . A l l Pa i n t i n g l n W m P a i n t . t r u e ) ; t h i s . S e t S t y l e ( Control Styl e s . D o u b le B u ffe r. t r u e ) ; t h i s . S e t S t y l e ( Control S t y l e s .U s e rP a in t. t r u e ) ;
11. Własne klasy
Język C# je st językiem obiektowym. O znacza to, że pisząc kod naw et najskrom niejszej aplikacji, stosujemy program ow anie obiektow e. Jest to często jed n ak tylko korzystanie z ju ż istniejących klas. W specyfikacji Common Type System .NET Framework (w spólne typy .NET) k la są bazow ą w szystkich typów jest System .O bject. K ażdy języ k program ow ania musi zachować zgodność ze specyfikacją tych typów , chociaż m oże rów nolegle używ ać własnych słów kluczow ych do określania poszczególnych typów. C # stosuje np. słowo kluczow e object, które jest rów now ażne nazw ie S ystem .O b jec t. Typ object {System.Object) jest klasą bazow ą dla w szystkich typów w artościo wych, referencyjnych i nawet literałów, jakim i są przykładow o w artości liczbow e czy łańcuchy znaków. W obec tego m ożem y używać różnych w łaściw ości i m etod działa jących na zm iennych i literałach. s
Ćwiczenie 43. C z\ liczba jest obiektem? Spraw dzim y użycie metod na zm iennej i literale, a także zapytam y o typy ró ż nych literałów. Sprawdzim y również, czy typem bazow ym dla literałów je st object. p riv a te void b u t t o n l _ C l i c k ( object sender. C i n t a = 5;
S y s t e m . EventArgs e)
I
£
/ / u ż y c i e met od s t r i n g s2 = a . T o S t r i n g ( ) ; s t r i n g s = 3 .T o S tr in g C );
/ / typy l i t e r a ł ó w MessageBox.Show(3.GetType() .T o S t r i n g ( ) + " \n " + 3 L . G e t T y p e ( ) .T o S tr in g C )+ " \n " + 3 . 1 .G e t T y p e ( ) . T o S t r i n g ( )+ " \n " + 3 . 1 F .G e t T y p e ( ) .T o S tr in g C )+ " \n " + 3 . IM.GetTypeC) .T oS tringC )+ "\n" + " a b c " . G e t T y p e C ) . T o S t r i n g C ) + " \ n " , "Typy l i t e r a ł ó w " / / t y p y bazowe M e s s a g e B o x . ShowC3 . G e t T y p e C ) . B a s e T y p e . T o S t r i n g ( ) ,
);
144
C# w praktyce
" T y p ba z o wy l i c z b y 3 " ) ; MessageBox.Show(3.GetType() .BaseType.BaseType.ToString(), " T y p ba z o wy t y p u bazowego l i c z b y 3 " ) ; MessageBox.Show("abc". GetTypeC) . B a s e T y p e .T o S tr in g (). " T y p b a z o wy \ " a b c \ " " ) ; }
B ogate biblioteki obiektow e um ożliw iają tw orzenie nawet bardzo rozbudow a nych program ów , w ykorzystując zaw arte w nich klasy.
11.1.
Pierwsza klasa
Pełną sw obodę progrąm ow ania uzyskujem y, definiując własne klasy i rozwijając kod dzięki technice dziedziczenia. Taki sposób program ow ania nazyw am y zoriento w anym obiektow o (OO P - O bject Orientem Programming). O biektem określam y zwykle w yodrębniony elem ent otaczającego nas św iata lub pew ne pojęcie abstrakcyjne. M oże to więc być cokolwiek, czemu potrafim y przypisać nazw ę, np. rzecz, osoba, idea. Obiekt m oże oddziaływ ać na inne obiekty i może podlegać oddziaływ aniu. Zbiór obiektów pow iązanych interakcjam i tw orzy system. M odelow anie system u na kom puterze sprowadza się do opisania i zbudowania form alnego m odelu tego systemu. M odel ten jest wynikiem procesu abstrakcji tzn. um ieszczenia w opisie system u cech istotnych, a pom inięcia mniej istotnych dla danego zadania szczegółów . M odel abstrakcyjny konstruuje się w ten sposób, aby istotne w łasności m odelu i system u rzeczyw istego były takie same. W inform atyce m odel system u nazyw am y obiektowym, jeżeli składa się w yłącz nie z obiektów program ow ych i ew entualnie sprzętowych. W języku program owania określenie obiekt odnosim y do pew nego identyfikowalnego fragm entu oprogram owa nia. K oncepcja obiektu wiąże się ściśle ze stosowaną w informatyce abstrakcją danych. Podstaw ow ą zmianą wprowadzoną przez programowanie obiektowe w stosunku do program ow ania strukturalnego jest inne spojrzenie na kod programu. Pisząc program obiektow y (object oriented), przede wszystkim zwracamy uwagę na dane, na których chcem y w ykonywać pewne działania, nie zaś na same działania (procedury, funkcje). Program ow anie obiektowe pozwala wiązać struktury danych z działaniami. Maksyma, że kom puter służy do przetwarzania danych, jest tutaj znacznie bliższa prawdzie. Ś w iat zew nętrzny w życiu codziennym postrzegam y w sposób „obiektow y ’. Pa trząc na telew izor, zauw ażam y, że potrafi on przekazywać obraz i dźwięk. Zawiera przyciski i pokrętła regulacyjne. N iew iele osób wie, że telew izor składa się z głowicy V H F i U H F, w zm acniaczy, detektora, generatorów odchylania itd. Są to podzespoły ukryte przed użytkow nikiem , ale m ożna nim i sterować (nie znając ich zasady działa nia i budow y), korzystając z przycisków i pokręteł. Tw orząc program techniką obiek tow ą, postępujem y podobnie. Dajem y użytkownikowi działające obiekty, oddziały
W łasne klasy
145
wujące na siebie w zajem nie i „w yprow adzam y pokrętła” do m odyfikow ania ich własności. Program ow anie proceduralne oferuje „zestaw podzespołów ” i w ym aga znajom ości ich budowy, aby praw idłow o regulow ać w łasnościam i. Program ow anie obiektow e pozw ala rów nież tw orzyć hierarchiczne struktury, gdzie nowe obiekty mogą dziedziczyć cechy przodków . A nalogie, np. z biologii, nasu wają się same. O biekty, w sensie używanym w program ow aniu obiektow ym , są zorganizow ane w klasy. K lasa jest wzorcem (szablonem ) opisującym dane i dopuszczalne sposoby działania na tych danych. Zadeklarow ana zm ienna typu zdefiniow anej klasy jest zwana obiektem . Procedury i funkcje zdefiniow ane w klasie (stanow iące jej integralną część) nazyw ane są metodam i danej klasy i pow inny (po praw idłow ym zaprojektow a niu) być jedynym i funkcjam i mogącymi m anipulow ać danyjni określonego obiektu. Każdy tw orzony obiekt (zm ienna typu wcześniej zdefiniow anej klasy) posiada w łasną kopię danych klasy, czyli różne obiekty mają sw oje w łasne dane (są w yjątki!). Obiekty m ogą w yw oływać m etody danej klasy, co często określa się jak o w ysyłanie kom unikatów do obiektu. K om unikat wysłany do danego obiektu nie je st odbierany przez inne obiekty. Definiując nowe klasy, m ożem y korzystać z dziedziczenia. Polega ono na tym, że nowo tw orzona klasa przejm uje z klasy poprzedniej (rodzica) zarów no dane (własności), jak i metody. W nowej klasie m ożem y dodaw ać now e w łasności, nowe metody i zm ieniać działanie m etod odziedziczonych. Fundam entalną rolę od grywa tu zjaw isko polim orfizm u. N ow a klasa m oże dziedziczyć cechy jednej (np. w C#) lub większej liczby innych klas (w C + + ). Struktura definiow ania klas często kształtem przypom ina drzewo. Klasa podstaw ow a (ta, z której dziedziczą inne) zw ana jest bazow ą lub rodzicem , a klasy pochodne (te, które dziedziczą) dziećm i. Po praw i dłowym zaprojektow aniu i przetestow aniu klasy m ożem y ją dalej używ ać, tw orząc kolejne klasy i w ykorzystując techniki dziedziczenia. Nie m usim y zm ieniać zdefinio wanych ju ż klas, lecz tw orzym y klasy pochodne. Program ow anie obiektow e polega na rozszerzaniu kodu, a nie na poprawianiu. Ł atw iejsze staje się w tedy w yszukiw anie błędów i testow anie aplikacji.
Ćwiczenie 44. Własna klasa Z definiujem y w łasną klasę Punkt i utw orzym y obiekt p będący instancją (w ystą pieniem) tej klasy. •
Projekt rozpoczniem y oczyw iście od utw orzenia form ularza, na którym um ie ścim y tylko jedną kontrolkę - przycisk z napisem „U tw órz punkt”.
•
U ruchom im y edycję metody obsługi kliknięcia przycisku. Treść m etody pozo staw im y czasow o pustą.
•
K ursor przeniesiem y na koniec kodu, dokładnie przed ostatni naw ias, zam ykają cy na me s pa c e K l a s y .
146
C# w praktyce
•
Tutaj rozpoczniem y definicję własnej klasy (są rów nież inne m ożliw e miejsca definicji klas). Zw róćm y uwagę, że klasa F o m il została już zdefiniow ana auto m atycznie po wybraniu typu aplikacji: W indows Application. Szczegółam i doty czącym i tej klasy zajm iem y się później.
•
N ajprostsza definicja klasy Punkt może w yglądać następująco: c l a s s Punkt C p u b l i c i n t X; p u b l i c i n t Y; }
S pecyfikatory p u b l i c są tym czasow o konieczne, abyśm y mogli uzyskać dostęp składow ych przyszłego obiektu. •
W rócim y do treści m etody obsługi przycisku: p r i v a t e void b u tto n l_ C lic k (o b je c t sender. C / / d e k la ra cja obiektu P u n k t p; //
S y s t e m . EventArgs e)
utworzenie obiektu p = new P u n k t ( ) ; / / przy p isan ie wartości p.X = 50; p.Y = 100;
pol om o b i e k t u
MessageBox. Show("Współrzędne punktu: "+ p . Y . T o S t r i n g ( ) ) ; 3
" + p . X.ToStringC) +",
A by utw orzyć obiekt, nie w ystarczy zadeklarow ać go jak zm ienną typu w arto ściow ego. O biekt tw orzym y, używ ając słow a kluczow ego new i nazwy klasy. Pow yższe form y zapisu są znane w program ow aniu strukturalnym , gdzie kolej nym etapem byłoby napisanie funkcji pozw alających m anipulow ać zadeklarowanym i zm iennym i. Program ując obiektow o, rów nież napiszem y funkcje, lecz istotnie różnią ce się. B ędą to m etody obiektu, a więc zostaną dołączone do definicji klasy.
11.2.
Hermetyzacja
B ezpośrednie przypisyw anie i odczytyw anie wartości pól obiektu nie jest dobrą praktyką i kłóci się z w łaściw ym stylem program ow ania obiektow ego (choć, jak w idać, je st dopuszczalne).
W łasne klasy
147
F undam entalną cechą program ow ania obiektow ego jest dostarczenie użytkow ni kowi system u nadającego się do dalszej rozbudow y bez potrzeby popraw iania istnie jącego kodu. System ten jest też odporny na przypadkow e kolizje m iędzy danym i. Aby to osiągnąć, należy odpow iednio zabezpieczyć projektow ane klasy przed nie upraw nionym i ingerencjami. W tym celu trzeba ukryć ich w ew nętrzną strukturę. Określam y to herm etyzacją , enkapsulacją lub po prostu ukryw aniem danych. U krywanie wewnętrznej struktury obiektu jest istotne z kilku względów. Po pierw sze izoluje się dzięki temu obiekt od niezamierzonych lub celowych działań użytkow ni ka, co mogłoby zmienić jego cechy. Po drugie chroni się w ten sposób obiekt od niepo żądanych interferencji z innymi obiektami. Po trzecie um ożliwia się projektantow i systemu wprowadzanie zmian i korekt w szczegółach im plementacji, jeżeli zm iany te nie naruszają zewnętrznych cech obiektu - w szczególności sposobu kom unikacji obiektu z otoczeniem. I po czwarte uzyskuje się przenośność' obiektu, tzn. m ożliw ość wykorzystania definiującej go klasy w innych programach i systemach. ✓
Ćwiczenie 45. Akcesory Z kodu źródłow ego z poprzedniego ćw iczenia usuniem y m odyfikatory dostępu public. Spow oduje to, że nie m ożna będzie bezpośrednio pobrać w artości pól X i Y. Jeżeli skom pilujem y kod po takiej m odyfikacji, otrzym am y kom unikaty o błędach związanych z brakiem dostępu do powyższych pól (warto spraw dzić). Bez jaw nego określenia m odyfikatora dostępu w C# dom yślnym m odyfikatorem staje się private zabraniający dostępu do pól z tzw. kodu klienckiego (dokładniej - spoza m etod nale żących do danej klasy). Przy okazji warto użyć konw encji nazew niczej stosowanej w .N ET Fram ew ork: •
nazwy identyfikatorów publicznych zaczynam y pisać w ielką literą (określam y tę konw encję nazew niczą jako PascalC ase), *
•
nazw y identyfikatorów niepublicznych (i zm ienne lokalne) piszem y m ałą literą (konw encja - cam elCase),
•
nazwy klas piszem y w ielką literą. Z tego pow odu konstruktory (om ów im y je później), nawet prywatne, również musimy pisać w ielką literą, poniew aż ich na zwy m uszą dokładnie odpow iadać nazwom klas (C # rozróżnia w ielkość liter).
Z m ienim y nazwy pól z X i Y na x i y. W szystkie odw ołania do nich rów nież na leży uaktualnić. Aby udostępnić wartości pól, utworzym y m etody pobierające dane x i y. N azw ie my je G etX() i GetYQ. M etody zm ieniające te w artości nazw iem y S etX () i SetYi). M ożemy określić je wspólną nazwą - akcesory („udostępniacze”).
C# w praktyce
148 class C
Punkt i n t x; i n t y; / / metody p o b i e r a j ą c e w a r t o ś ć i x i y p u b lic i n t GetX() C
r e t u r n x;
3 public
in t GetY()
C
r e t u r n y; 3 / / metody z m i e n i a j ą c e w a r t o ś ć i p u b l i c v o i d S e t X ( i n t nowyX)
x i y
C
x = nowyX; 3 p u b l i c v o i d S e t Y ( i n t nowyY) C y = nowyY; 3 3
K o d k lie n c k i m o ż e te ra z w y g lą d a ć n a stęp u jąc o : p r iv a t e void b u t t o n l_ C lic k (o b je c t sender,
( //
deklaracja P u n k t p;
System.EventArg s e)
obiektu
/ / utworzenie obiektu p = new P u n k t ( ) ; / / p rzy p is a n ie wartości p.SetX(50); p.SetY(lO O );
pol om o b i e k t u
/ / pobranie wartości MessageBox.Show("Współrzędne punktu: p .G e tY i) .ToStringC)); 3
" + p . G e t X ( ) . T o S t r i n g ( ) +*' ,
"+
149
Własne klasy
Zwróćmy uwagę, że akcesory Set. .. nie muszą przyjmować wszystkich podanych przez użytkownika wartości. Ich zadaniem jest sprawdzenie poprawności w prow adza nych danych, ewentualna korekta i dopiero przypisanie. Podobnie z akcesoram i G et. .., również nie muszą podawać rzeczywistej wartości pola, lecz dowolnie przetworzoną. Użytkownik klasy nie musi wiedzieć, jakie są prawdziwe wartości i nazwy pól. W definicjach klas możemy um ieszczać zarów no deklaracje zm iennych, jak i funkcji. Zm ienne, deklarowane w definicji klasy, nazyw am y polam i. Funkcje metodami lub usługami. W wielu innych, obiektow ych językach program ow ania, zamiast pól używ a się określenia właściwości. W C# nie m ożna tych nazw utożsa miać. W łaściw ości mają tu szczególne znaczenie.
Ćwiczenie 46. Właściwości
*\
W języku C# nie musimy koniecznie tw orzyć opisanych w cześniej m etod, za pewniających dostęp do prywatnych pól. M ożem y tu zdefiniow ać specjalne m etody służące do odczytu i zm iany wartości pól. N azyw am y je w łaściw ościam i. Zm odyfikujem y poprzednie ćw iczenie, definiując w łaściw ości X i Y (nazw y mogą być dow olne - powinny się jednak kojarzyć z nazw am i pól), zam iast m etod GetXO, GetYQ, SetXQ, SetYQ. D efinicja klasy Punkt m oże wyglądać następująco: c l a s s P unk t C / / prywatne pola x i y i n t x; i n t y; / / właściwości X i Y public in t X C get C r e t u r n x; 3
set C x = v a lue; 3 3
public in t Y C
».
C# w praktyce
150 get C
re t u r n y; 3 set C y = value; 3 3 3
K o d k lie n c k i b ę d z ie teraz w y g lą d a ł tak: ♦ i p r i v a t e v o i d b u t t o n l _ C l i c k C o b j e c t s e n d e r . S y s t e m . EventArgs e) C / / d e k la ra c ja obiektu P u n k t p; / / utworzenie obiektu p = new P u n k t ( ) ; / / p r z y p i s a n i e w a r t o ś c i pol om o b i e k t u p .X = 50; p .Y = 100; MessageBox.Show("Współrzędne punktu: " + p . X . T o S t r i n g ( ) +", "+ p . Y . T o S t r i n g ( ) ) ; 3
C z y m są w ła śc iw o śc i i ja k ie z m ia n y w p ro w ad z ają? C e c h y w ła śc iw o śc i: •
d e fin iu je m y je p o d o b n ie do m eto d , c h o c ia ż nie p o sia d ają a rg u m e n tó w i n aw ia só w ,
•
z a w ie ra ją d w ie se k c je se t i g e t (m o że z aistn ie ć p rzy p a d ek , że b ę d z ie ty lk o jed n a z n ic h ),
•
je ż e li istn ie je ty lk o se k c ja g e t, p o le, d o k tó reg o ta w ła ściw o ść z a p e w n ia d o stę p je s t p o le m ty lk o do o d c zy tu ,
•
je ż e li istn ie je ty lk o se k cja set, p o le do k tó reg o ta w ła ściw o ść z a p e w n ia d o stę p je s t p o le m ty lk o do z ap isu ,
•
u ż y w a m y je p o d o b n ie do pól, sto su ją c z n ak p o d sta w ia n ia w a rto ści, n p . p .X = 5 0 ; (stą d z a p e w n e ich n azw a).
Własne klasy
151
Z a d a n ie m w ła ściw o ści je s t k o n tro lo w a n a z m ia n a i o d c z y t w a rto śc i pól. P rz e jrz y sta i lo g ic z n a k o n stru k c ja w ła ściw o ści p rz e m a w ia za ich sto so w a n ie m z a m ia st w ła snych m eto d , u d o stę p n ia ją c y c h pola. Z a b e z p ie c z a ją c o b iek t p rzed n ie u p ra w n io n y m d o stę p e m , n a le ży sto so w a ć w ła ściw e m o d y fik a to ry d o stę p u w o b ec je g o pól, a ta k ż e w ła śc iw o śc i i m eto d . P o la , je ż e li to ty lk o m o ż liw e , p o w in n y być zaw sze p ry w a tn e (ta k je s t d o m y śln ie b e z u ż y c ia sło w a prívate). W ła śc iw o śc i i m eto d y m o g ą b y ć p u b lic z n e lub c h ro n io n e (w s z c z e g ó ln y c h p rzy p ad k ach p ry w a tn e ). P o d su m u jm y p o z io m y d o stęp u do sk ła d n ik ó w k las: •
p u b lic z n y (p u b lic ) - d o stę p m ają d o w o ln e fu n k c je (m e to d y ) b ę d ą c e z a ró w n o c z ę śc ią k lasy , ja k i fu n k cje z p o z a niej ;
•
p ry w atn y (p ríva te) - dostęp m ają w y łączn ie m eto d y z d efin io w an e w d an ej klasie;
•
z a b e z p ie c z o n y (protected) - d o stę p m ają m e to d y z d e fin io w a n e w d a n e j k la s ie o raz m e to d y k las d z ie d zicz ą cy c h ;
•
w e w n ę trz n y (in ternal) - d o stę p m ają w sz y stk ie m eto d y z d e fin io w a n e w d a n y m p ak iecie;
•
z a b e z p ie c z o n y w e w n ę trz n y (p ro te cted in tern a l) - d o stę p m a ją m e to d y z d e fin io w a n e w d a n y m p a k ie cie i m eto d y klas d z ie d z ic z ą c y c h .
11.3.
Konstruktory i destruktory
W śró d fu n k c ji, k tó re są c zę śc ia m i sk ła d o w y m i klas, n a sz c z e g ó ln ą u w a g ę z a s łu gują m eto d y z w a n e k o n stru k to ra m i i d e stru k to ra m i. S łu ż ą o n e do p o w o ły w a n ia obiektów do „ ż y c ia ” (p rz y d z ie la n ia p a m ięc i, n a d a w a n ia z m ie n n y m w a rto ś c i p o c z ą t kow ych) i d o u su w a n ia ich z p am ięci. K o n s tru k to r je s t m eto d ą a u to m a ty c z n ie w y w o ły w a n ą w c h w ili tw o rz e n ia o b ie k tu. M o żn a go ró w n ie ż w y w o ły w ać tak, ja k k a ż d e in n e m eto d y . Je ż e li nie z d e fin iu je m y w łasnego k o n stru k to ra , k o m p ila to r d o d a b e z p a ra m e tro w y
k o n s tru k to r d o m y śln y .
Inicjuje on p o la w a rto śc ia m i 0 (p o la lic zb o w e), fa ls e (lo g ic z n e ) lu b n u li (re fe re n c je ). D e fin iu ją c k o n stru k to r, m u sim y m u n ad ać n a z w ę ta k ą sa m ą ja k n a z w a d e fin io wanej k lasy . Je s t to w ła śn ie n a zw a z a strz eż o n a d la k o n stru k to ró w . K o n s tru k to ry n ie zw racają ż a d n e g o w y n ik u (n aw et void). K la sa m o że p o siad ać w ięcej niż je d e n k o n stru k to r. Ję z y k C # d o p u sz c z a istn ien ie w ielu fu n k cji o tej sam ej n azw ie. M u sz ą o n e j e d nak się ró ż n ić lic zb ą i (lu b ) ty p am i p a ra m etró w . D e fin io w a n ie fu n k cji o ty c h sa m y c h nazwach n a z y w a m y p rzeciążan iem . P a ram e try k o n stru k to ra u m o ż liw ia ją in ic jo w a n ie pól o k re ślo n y m i w a rto śc ia m i w ch w ili tw o rz e n ia o b iek tu .
C# w praktyce
152
Istn ie n ie w ielu k o n stru k to ró w w je d n e j k lasie p o z w ala in ic jaliz o w a ć d a n y obiekt n a k ilk a ró ż n y c h sp o so b ó w .
Ćwiczenie 47. Własny konstruktor Z d e fin iu je m y w ła sn y k o n stru k to r in ic ju ją cy w arto ści pól x i y. W y k o rzy stam y p ro je k t z p o p rz e d n ie g o ć w icz en ia. K o d k la sy P u n k t ze z d e fin io w a n y m k o n stru k to re m m o że być n a stęp u jąc y : class C // int int
Punkt prywatne pola x i y x; y;
/ / konstruktor public Punkt(int in itX C X = i ni t X ; Y = i ni t Y; 3 / / właściwości X i Y public in t X C get C r e t u r n x;
set t x = value;
3 3 public in t Y C get C return y; 3 set C
.in t
initY )
W łasne klasy
153
y = v a lue;
} 3 3
Kod kliencki inicjuje teraz pola w artościam i przekazanym i podczas tw orzenia obiektu do zdefiniow anego konstruktora. p r iv a te void b u t t o n l_ C lic k (o b je c t sender. C / / d e k la ra c ja obiektu P u n k t p;
S y s t e m . EventArgs e)
/ / u t w o r z e n i e o b i e k t u z z a i n i c j o w a n i e m pól / / p r z e k a z a n y m i do k o n s t r u k t o r a w a r t o ś c i a m i p = new P u n k t ( 5 0 , 1 0 0 ) ; MessageBox.Show("Współrzędne punktu: " + p . X . T o S t r i n g ( ) +" , "+ p .Y.ToString( )); 3
Z konstruktorami ściśle są powiązane destruktory. Destruktor jest w yw oływ any, gdy obiekt „kończy swoje istnienie”. Jego zadaniem jest przekształcenie obiektu w ob szar pamięci, który następnie jest zwracany na stertę przez m echanizm autom atycznego odśmiecania (garbage collection). W języku C+ + destruktor również zw alniał pamięć, ponieważ nie istniało automatyczne odśmiecanie. Destruktor ma nazwę klasy lecz poprzedzoną znakiem ~ (tylda). Znak ~ symbolizuje operator uzupełnienia. D estruktor dla danej klasy jest tylko jeden. Nie może on mieć argumentów i nie zw raca żadnego wyniku. Destruktor domyślny jest dodawany automatycznie przez kompilator. D estruk tor jest w ywoływany wyłącznie automatycznie przez m echpiizm odśm iecania pamięci. Nie możemy nawet przewidzieć dokładnego m om entu jego użycia. W naszym przykładzie destruktor m ożna zdefiniow ać następująco: ~Punkt() C / / kod 3
D efiniow anie własnego destruktora jest zw ykle zbędne. Trzeba go zdefiniow ać w szczególnych przypadkach, gdy chcem y usuwać zasoby niepam ięciow e.
11.4.
Dziedziczenie
Program ow anie obiektow e polega na rozbudow ie istniejącego ju ż kodu. Nie na leży nanosić popraw ek do wcześniej zdefiniow anych klas (pod w arunkiem , że są dob
154
C# w praktyce
rze zaprojektow ane), lecz definiow ać następne klasy, przejm ujące własności istnie jących. Postępow anie takie jest m ożliw e dzięki dziedziczeniu. Program ista m oże bu dow ać tw ór przypom inający drzew o genealogiczne.
Ćwiczenie 48. Tworzvmx klasy potomne B udując klasy, m ożem y skorzystać ze w spom agania oferow anego przez V isu a l S tu d io .N E T . N ie m usim y w tedy pisać całego kodu „ręcznie”. •
W now ym projekcie utw orzym y form ularz z przyciskiem (taki sam jak w po przednich ćw iczeniach).
•
Z m enu P ro je c t w ybierzem y A d d C l a s s . .. i w piszem y nazw ę klasy: P u n kt. S zkielet klasy (obejm ujący rów nież definicję konstruktora) zostanie utw orzony w now ym m odule (now ym pliku: P u n k t.c s ), jednakże w tej samej przestrzeni nazw ( n a m e sp a c e K la s y 5 ).
•
D efinicje pól, w łaściw ości i m etod rów nież m ożem y rozpocząć od autom atycz nego w staw ienia ich szkieletów . Z m enu P ro ject lub klikając przycisk na pasku narzędzi, w ybierzem y C la ss V iew . W strukturze drzew iastej, w oknie C la ss V iew w skażem y klasę P u n k t i praw ym przyciskiem m yszy otw orzym y menu kontek stow e. W skażem y polecenie A d d .
<1
>
3
a
X
2*
b
- jgpf Klasy5 B
{ } KlasyS Sfef
Form l J k
Go To Definition Go To R eference Browse Definition Quick Find Symbol
Sort By Access Group By Type Ę?j
R ysunek 50. Dodawanie pól, właściwości i metod
Pcoperties
W łasne klasy •
155
P o n ie w a ż c h c e m y n a jp ierw z d e fin io w a ć p o la k lasy P u n k t, w y b ie rz e m y A d d F ie ld i w o d p o w ie d n ie p o la te k sto w e w p isz e m y m o d y fik a to r d o stę p u , ty p i n a zw ę pola. O p u śc im y o k n o , n a c isk a ją c p rz y c isk F in ish .
O
t
F i e l d W i z a r d - K la s y S
W e lcom e to th e C# A d d Reid W iza rd This w izard adds a field to your C # class.
0 Field access:
Field typ e :
( private
j int
Field Qame: JÜ
!*
Field modifers: ( •
None
C
Static
C
Constant *%
frfeld i Comment ( / / notation not required):
Finish
% Cancel
Help
Rysunek 51. Okno dodawania pól •
P o d o b n ie d o d a m y p o le y o ra z w ła śc iw o śc i X i Y (A d d P ro p e rly. ..). W ła śc iw o śc i m u sim y u z u p ełn ić o d p o w ie d n im k o d e m .
•
W ła śc iw o śc i w y k o rz y sta m y (z g o d n ie z ich p rz e z n a c z e n ie m ) d o k o n tro li z a k re s u w p ro w a d z a n y c h w arto ści p ó l, u z u p e łn ia ją c ich k o d o in stru k c je w a ru n k o w e . O g ra n ic z y m y w a rto śc i x do p rz e d z ia łu (0, 4 0 0 ), a w a rto śc i y d o (0, 3 0 0 ). p u b l i c c l a s s Punkt C public PunktO C } p r i v a t e i n t x; p r i v a t e i n t y; public in t X { get C
C# w praktyce
156 r e t u r n x;
} set C
if
(valu e < O || value > 400) MessageBox.Show("Nieprawidłowa wartość X ! " ) ; e l se x = value;
) 3 public in t Y C get
*
/
C
re t u r n y; 3 set C if
(value < 0 || value > 300) MessageBox.Show("Nieprawidłowa wartość Y ! " ) ; e l se y = v a lue;
3 3 3
•
Z a s to s o w a n e tu o k n o d ia lo g o w e M e s s a g e B o x w y m a g a d e k la ra c ji o d p o w ie d n ie j p rz e strz e n i nazw : using System.Windows. Forms;
•
Z d e fin iu je m y k lasę p o to m n ą , d z ie d z ic z ą c ą z k lasy P u n kt. N a z w ie m y ją P u n ktE kra n u . In fo rm a c ję o d z ie d z ic z e n iu p o d a je m y w n a g łó w k u d e fin icji k lasy , d o p i s u ją c po je j n a z w ie n a zw ę k lasy b a zo w e j. E le m e n ty te ro z d z ie la m y d w u k ro p k ie m . K la sa P u n k tE k ra n u b ę d zie p o sia d a ła m e to d ę ry su ją c ą p u n k t na e k ra n ie , m eto d ę
u s u w a ją c ą p u n k t i m e to d ę p rz e su w a ją c ą p u n k t do w sk az an e g o p o ło żen ia. Jej k o d m o ż e b y ć n a stęp u jąc y : p u b l i c c l a s s Pu nkt Ek ran u : Punkt C public PunktEkranu() C 3
Własne klasy
157
/ / me t o da r y s u j ą c a p u n k t na e k r a n i e p u b l i c v o i d R y s u j ( G r a p h i c s g) C
S o l i d B r u s h b = new S o l i d B r u s h ( C o l o r . B I a c k ) ; g . Fi 11 El 1 i p s e ( b , X. Y, 3 , 3 ) ;
} / / me t o da u s u w a j ą c a p u n k t z e k r a n u p u b l i c v o i d U s u n ( G r a p h i c s g) C S o l i d B r u s h b = new Sol i d B r u s h ( C o l o r . W h i t e S m o k e ) ; g . F i l 1 El 1 i p s e ( b , X, Y, 3 . 3 ) ; 3 *\
/ / me t o da p r z e s u w a j ą c a p u n k t do w s k a z a n e g o p o ł o ż e n i a p u b l i c v o i d P r z e s u n ( G r a p h i c s g, i n t nowyX, i n t nowyY) C
this.U sun(g); t h i s . X = nowyX; t h i s . Y = nowyY; t h i s . Rysuj(g); 3
•
Aby używ ać m etod graficznych na początku m odułu, m usim y dodać:
using S y s t e m . D r a w i n g ;
•
N apiszem y kod kliencki w ykorzystujący klasę PunktEkranu. Zw róćm y uwagę, że w bieżącym projekcie definicje, klas i kod kliencki zostały um ieszczone w oddzielnych plikach. Takie odseparow anie jest bardziej w łaściw e technice program ow ania zorientow anego obiektow o (szczególnie w w iększych aplikacjach). Rysowanie będzie urucham iane przez m etodę obsługi zdarzenia Paint form ularza F orm l. p r iv a t e void F o rm l_P aint(object sender, S y s t e m . W i n d o w s . F o r m s . Pa i n t E v e n t Ar gs e )
C / / wy c z y s z c z e n i e f o r mu l a r z a e . Graphi c s . Cl e a r ( Col o r . Whi t eSmoke) ; / / utworzenie obiektu P u n k t E k r a n u p = new P u n k t E k r a n u ( ) ; //
p r z y p i s a n i e nowych danych
C# w praktyce
158 p . X = 100; p.Y = 80; / / rysowanie punktu p . R y s u j ( e . G ra p h ic s ); / / p ę tla opóźniająca f o r ( i n t i =0; i! = 3 e 8 ;
i++);
/ / p r z e s u n i ę c i e punktu p . P rze s u ń (e . G raphics.100,
200);
}
11.5.
M etody wirtualne
Ćwiczenie 49. Wywoływanie właściwych metod •
Poprzednie ćw iczenie uzupełnim y następną definicją klasy potomnej Kolo dzie dziczącej z klasy P unkt Ekranu.
•
W klasie Kolo zdefiniujem y pole r (prom ień) i w łaściw ość R.
•
P onow nie m usim y zdefiniow ać m etodę rysującą i usuw ającą koło. Nie m ożna jej dziedziczyć z klasy PunktEkranu (inaczej rysuje się punkt, a inaczej koło).
p u b l i c c l a s s Kolo : PunktE kran u C public KoloO C
p r iv a t e in t r; public in t R C get C re tu rn r; ) set C i f ( v a l u e < 0 || v a lu e > 100) MessageBox. ShowC"Nieprawidłowa wartość R ! " ) ; e l se r = value;
} }
W łasne klasy
159
p u b l i c v o i d R y s u j ( G r a p h i cs g) C S o l i d B r u s h b = new Sol i d B r u s h ( Col o r . B l a c k ) ; g . Fi 11 El 1 i p s e ( b , X - R , Y - r , 2 * R , 2 * R ) ; } p u b l i c v o i d U s u n ( G r a p h i c s g) C S o l i d B r u s h b = new S o l i d B r u s h ( C o l o r . W h i t e S m o k e ) ; g . Fi 11 E l l i p s e ( b . X - R . Y - R , 2 * R , 2 * R ) ; }
)
Zw róćm y uwagę na m etodę P r z e s u ń zdefiniow aną w klasie P unktE kranu : p u b l i c v o i d P r z e s u n ( G r a p h i c s g, ( t h i s . Usun( g ) ; t h i s . X = nowyX; t h i s . Y = nowyY; thi s . R ysuj(g); }
i n t nowyX,
i n t nowyY) '
W yw ołuje ona m etody Usuń i Rysuj. M oże w ięc być dziedziczona w klasie K olo. Należy jedynie zastanow ić się, których metod będzie używać. Czy tych z klasy PunktEkranu, czy z klasy K o lo l •
Pow iększym y obszar form ularza, aby zm ieścić koło.
•
Kod kliencki m oże być teraz następujący:
p r i v a t e void F o r m l_ P a in t ( o b je c t sender. System .Wind ows . Forms. P a i n t E v e n t A rg s e) C / / wyczyszczenie formularza e.Graphics.ClearCColor.W hiteSmoke); / / utw orzenie obiektów P u n k t E k r a n u p = new P u n k t E k r a n u ( ) ; Kol o k = new Kol o ( ) ; / / p r z y p i s a n i e danych p . X = 100; p.Y = 80; k . X = 300; k.Y - 100; k.R = 50;
k
160
C# w praktyce
/ / rysowanie p . Rysuj(e.Graphi c s ) ; k.R ysuj(e.G raphics); / / pętla for (in t
opóźniająca i =0; i ! = 3 e 8 ;
i++);
/ / przesuwanie p .P r z e s u n ie .G r a p h ic s .100, k .P r z e s u n ie .G r a p h ic s .300,
200); 200);
} t
»
Po uruchom ieniu program u m ożem y zaobserw ow ać, że nie działa oń zgodnie z naszym i oczekiw aniam i. Zam iast przesuw ać (w drugim poleceniu P r z e s u ń ) koło, przesuw a jedynie punkt (środek koła). Dlaczego? W ykonując polecenie k. P r z e s u n i e . G r a p h i c s , 3 0 0 . 2 0 0 ) , aktyw izujem y metodę P r z e s u n ( ) na rzecz obiektu k, klasy Kolo. Jeżeli brak jest tej metody w definicji klasy Kolo, zostanie odziedziczona z klasy PunktEkranu. Przypom nijm y sobie jej treść: this.U sunig); t h i s . X = nowyX; t h i s . Y = nowyY; thi s . R ysuj(g );
N asza m etoda w ykona najpierw U s u n i ), ale tę z klasy PunktEkranu, następnie zm ieni w spółrzędne punktu X , Y i w ykona m etodę R y s u j ( ) - również z klasy PunktE kranu. W efekcie zobaczym y zm ianę położenia nie koła, lecz punktu. Co jest przy czyną takiego działania naszego program u? Kompilator! Podczas kom pilacji metody P r z e s u n ( ) kom pilator wstawia adresy wywołań odpowiednich metod ( Us un( ) i Rys u j ( ) ) z klasy PunktEkranu (do tej klasy należy przecież nasza metoda). Pozornie jednakow e m etody P r z e s u n ( ) w klasach PunktEkranu i Kolo różnią się więc po kom pilacji (inne adresy w yw ołań odpow iednich metod). M ożem y temu zaradzić, redefiniując metodę P r z e s u ń w klasie Kolo (proszę sprawdzić). Jej definicja będzie tutaj identyczna. Na suw a się więc pytanie, czy koniecznie trzeba redefiniow ać identyczne m etody w kla sach potom nych? O czyw iście nie. Jak napraw ić tę niedogodność dziedziczenia? Poin form ow ać kom pilator, aby w przypadku aktyw ow ania niektórych metod (u nas Usun() i R y s u j ( ) ) ustalał ich adresy w yw ołań dopiero po kom pilacji w czasie wykonywania program u (tzw. późne wiązanie). M echanizm ten pow inien w yw oływ ać metody z klasy, do której należy obiekt, na rzecz którego aktywow ano daną m etodę lub naj bliższą w hierarchii dziedziczenia. Np. w naszym program ie aktywizujem y metodę P r z e s u n ( ) . Jest to m etoda odziedziczona z klasy PunktEkranu, ale aktywowana na rzecz
W łasne klasy
161
obiektu k klasy Kolo. Pow inna więc również w yw oływ ać m etody Us un( ) i R y s u j ( ) z klasy Kolo. Pow yższy problem został rozw iązany przy użyciu tzw. m etod polim orficznych lub inaczej w irtualnych (dopasow ujących się do odpow iedniego obiektu w trakcie w ykonania program u). D eklaracje takich metod w definicji klasy poprze dzamy specyfikatorem v i r t u a l . W naszym program ie m etodam i wirtualnym i będą oczyw iście Us un( ) i Rysuj(). Przed typem m etody, w definicji pierw otnej (klasa PunktEkranu), um ieścim y słowo kluczow e v i r t u a l , a podczas redefinicji (w klasie Kolo) - słow o o v e r r i de. p u b l i c c l a s s PunktEkranu :Punkt C p u b l i c v i r t u a l v o i d R y s u j ( G r a p h i cs g) C
) public v ir tu a l C
v o i d U s u n C G r a p h i c s g)
3
p u b l i c v o i d P r z e s u ń ( G r a p h i c s g, C this.U sun(g); t h i s . X = n o wy X ; t h i s . Y = nowyY; t h i s . Rysuj( g ) ; 3
i n t nowyX,
3
3
p u b l i c c l a s s Kolo : PunktEkranu C p u b l i c o v e r r i d e v o i d R y s u j ( G r a p h i c s g) C 3
p u b l i c o v e r r i d e v o i d U s u n ( G r a p h i c s g)
C 3 3
i n t nowyY)
162
C# w praktyce
M etody w irtualne tw orzą kolekcję funkcji składowych o takich sam ych nazwach i tego sam ego typu, ale z różnych klas pow iązanych m iędzy sobą stosunkiem dziedzi czenia. Z aczynają się od funkcji ze specyfikatorem v i r t u a l . Pozostałe metody kolek cji (w następnych klasach dziedziczących) m uszą posiadać specyfikator o v e r r i d e . K olekcja rozciąga się na w szystkie funkcje takiego sam ego typu i o takiej samej naz wie w klasach pochodnych. M etody, w zestaw ie funkcji w irtualnych, m uszą mieć identyczną liczbę i typy argum entów . K orzystając z w irtualności, m ożna projektow ać bardzo skom plikow ane klasy, które dziedziczą nie tylko cechy, lecz rów nież zachowanie. D efiniując przesuwanie punktu, nie w iedzieliśm y (kom pilator rów nież), że ta sama m etoda będzie przesuwać koło, a m oże jeszcze inne na razie niezdefiniow ane figury. H ierarchię dziedziczenia klas m ożna przedstaw ić graficznie:
11.6.
Indeksatory
D ostęp do pól obiektu pow inny zapew niać odpow iednio zdefiniow ane w łaściw o ści. G dy jednak polam i są tablice lub kolekcje, dostęp do nich warto zorganizować poprzez zastosow anie indeksatorów . Indeksatory przypom inają w łaściw ości. Rów nież posiadają akcesory get i set. Jednakże poprzez tablicow ą składnię w ykorzystującą operator [] um ożliw iają indek sow anie obiektu.
W łasne klasy / / klasa z indeksatorem p u b l i c c l a s s Klasa C i n t [ ] t a b = new i n t
163
[10];
/ / d e f in ic ja indeksatora p u b lic i n t th is [ i n t indeks]
C get C...3 set
C...3 )
/ / kod k l i e n c k i Kl a s a o b i e k t = new KI a s a ( ) ; o b i e k t [ 0 ] = 5; o b i e k t [ l ] = 3;
In d e k s a to r d e fin iu je m y , u ż y w ają c ja k o n a z w y sło w a k lu c z o w e g o t h i s . D la d a n e j k lasy m o ż n a z ad e k la ro w a ć w iele in d e k sa to ró w p rz y jm u ją c y c h ró ż n e p aram etry. D o stę p do e le m e n tó w ta b lic o w e g o p o la o b ie k tu u z y sk u je m y p o p rz e z nazw ę o b iek tu i indeks. *
Ćwiczenie 50. Używamy indeksatorów •
Z d e fin iu je m y k lasę L ista O c e n z p o lem ta b lic o w y m oceny.
•
In d e k s a to r z ap ew n i k o n tro lo w a n y d o stę p do p o la o ceny.
•
U tw o rz y m y o b ie k t uczeń.
•
O c e n y z p o sz c z e g ó ln y c h p rz e d m io tó w b ę d z ie m y w p isy w a ć u ż y w a ją c p rz y k ła d o w o sk ład n i: uczen[Przedmioty. J _ p o ls ki] = 4.5;
•
Z d e fin iu je m y p o m o c n ic z y ty p w y licz en io w y .
•
U tw o rz y m y w ła ściw o ść ty lk o do o d c zy tu o b lic z a ją c ą w a rto ść śre d n ią z o c e n (n ie tw o rz y m y pola).
164
C# w praktyce
/ / d e k la r a c j a typu wyliczeniowego p u b l i c enum P r z e d m i o t y ( J _ p o l s k i , M a t e m a t y k a , Bi ol o g i a } ;
Fizyka,
Chemia,
p u b l i c cla ss ListaOcen C / / u tw o rze n ie pola typu tablicow ego d o u b l e [ ] o c e n y = new d o u b l e [ 5 ] ; / / indeksator p u b l i c double thisC P rze dm ioty indeks] C
t
.
get C
*
return oceny[( i n t ) in d e k s ];
} set C
if
( v a l u e >= 1 && v a l u e <= 6 ) oceny[ ( i n t ) indeks] = value;
} ] / / w ł a ś c i w o ś ć t y l k o do o d c z y t u p u b l i c double Średnia ( get C d o u b l e suma = 0; f o r e a c h ( d o u b l e ocena i n o c e n y ) suma + = o c e n a ; r e t u r n suma / o c e n y . L e n g t h ; ;
] } 3 K o d k lie n ck i: private
void b u t t o n l _ C li c k ( object sender,
S y s t e m . EventArgs e)
C / / utworzenie obiektu L i s t a O c e n u c z e ń = new L i s t a O c e n O ; //
pzypisanie wartości
z użyciem i n d e k s a t o r a
Własne klasy
165
uczenCPrzedmioty. J _ p o ls k i] = 4 .5 ; u c z e n C P r z e d m i o t y . M a t e m a t y k a ] = 6; uczenCPrzedmioty. B io lo g ia ] = 4 .5 ; u c z e ń [ P r z e d m i o t y . Ch e mi a ] = 5; uczeń[Przedmioty. Fizyka] = 5.5; / / w y p r o w a d z e n i e wy ni k ów MessageBox.Show("Oceny:\n" + P rz e d m io ty .J _ p o ls ki + " = " + uczenCPrzedmioty.J_polski] + "\n" + Przedmioty.Matematyka + " = " + uczeń [P rzedm ioty. Matematyka]+ "\n" + Przed m ioty. Fizyka + " = " + uczenCPrzedmioty. Fizyka] + "\n " + Przedmioty.Chemia + " = " + uczenCPrzedmioty.Chemia] + "\n" + Przedm ioty.B iologia + " = " + uczenCPrzedmioty. B io lo g ia ] + " \ n \ n ś r e d n i a wynosi: " + uczeń. Średni a . T o S t r i n g ( ) . "Średnia o cen"); )
11.7.
Sami tworzymy aplikację W indows
W dotychczasow ych projektach w ykorzystyw aliśm y obiektow y szkielet aplikacji W indows A pplication autom atycznie tw orzony przez środow isko Visual Studio .NET. Można go rów nież utworzyć sam odzielnie, poznając podczas tej czynności techniki program ow ania zorientow anego obiektowo. *
Ćwiczenie 51. Aplikacja Windows
-
od początku
U tw orzym y aplikację zawierającą form ularz dziedziczący z klasy Form. Na formularzu um ieścim y etykietę wyśw ietlającą czas bieżący. Form ularz, kontrolki i inne potrzebne elem enty interfejsu utworzym y z poziom u kodu bez w ykorzystyw ania graficznego wspomagania. t
*
•
U tw orzym y nowy projekt na bazie szablonu E m pty Project. N adam y mu w łasną nazwę, np. WinApp.
•
W oknie Solution Explorer prawym przyciskiem m yszy w ybierzem y - R eferen ces. Z menu kontekstow ego w ybierzem y A d d Reference.... W oknie dialogow ym A dd Reference na karcie .NET odnajdziem y i zaznaczym y następujące biblioteki: System .dll, System.Drawing.dll i System .W indow s.Fom is.dll. O kno zam kniem y przyciskiem OK.
•
Dodamy klasę do projektu. W oknie Solution Explorer praw ym przyciskiem myszy w ybierzem y nazwę projektu WinApp. Z menu kontekstow ego w ybierze my A d d a następnie A d d C lass. ... W oknie dialogow ym A d d N ew Item w skażem y szablon Class i nadamy mu nazwę, np. Zegar.
C# w praktyce
166
•NET
! COM
j Projects |
B row se... Com ponent Nam e System .EnterpriseServlces System . M anagem ent System .Messaging.dll System . R untim e. Remoting 5 y ste m . R untim e. Serialization System . Security S ystem . 5er viceProcess. dll S ystem .W eb.dll System . W eb . R egularExpressi... Syst e m . W e b . S ervices. dll ¡System. Wirpd0w5.F0rms.dli 1 em.Xml.dll
Version
P ath
^
1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1 .0 .3 3 0 0 .0 1.Ö.33ÜÖ.Ö i.n .3 3 n n .n
C: \W IN D O W 5\M icro soft .N E T... C :\W IN D O W S \M ic ro so ft.N E T ... C :\W IN D O W S \M icro so ft.N E T ... C :\W IN D O W S \M ic ro so ft.N E T ... C :\W IN D O W S \M icro so ft.N E T ... C : \W IN D O W S \M icrosoft. NET... C :\W IN D O W S\M icrosof t . NET... C : \W IN D O W S\Microsof t . NET... C: \W IN D O W S\M icrosoPt.N ET... C :\W IN D O W S \M ic ro so ft.N E T ... m W IN O O W S lM irrn ^ n ft.N F T ..
Me#
v
Selected Components: Com ponent Nam e System .dll System .D raw ing.dll System . W ind ow s. Form s. dll
_._J.Type .NET .NET .NET
Rem ove
Source C :\W IN D O W 5\M icro s o ft.N E T \F r.., C :\W IN D O W S \M ic ro so ft.N E T \F r... C :\W IN D O W S \M ic ro so ft.N E T \F r...
Help
Cancel
OK
R ysunek 52. Okno dołączania bibliotek
A dd N ew Item
W inApp Tem plates:
C ategories:
A
■
•rr Component Class
W indows Form
User Control
D ata Form W izard
!¿3
fM
*ol ;<>
XML File
XML Schema
An em pty class declaration Nam e:
[ Zegar
O pen
D a ta Set
Cancel
R ysunek 53. Okno dodawania nowych elem entów do projektu
Code File
Własne klasy
167
K o d n a sz e j a p lik ac ji w y g lą d a tera z n a stę p u ją c o : usi ng Syst em; namespace WinApp C I I I I I I D e f in i c ja klasy Zegar. I I I < / s u mma r y > p u b l i c c l a s s Zegar C public ZegarO { II I I TODO: Add c o n s t r u c t o r l o g i c II
here
3 3 3
S z k ie le t d e fin ic ji k lasy m o ż n a te ż n a p isa ć „ rę c z n ie ” . •
Z m o d y fik u je m y d e fin icję k lasy Zegar, ta k b y d z ie d z ic z y ła z k la sy Fom i: p u b l i c c la s s Zegar C
: Form
3
•
M u sim y ró w n ie ż z ad e k la ro w a ć u ży cie p rz e strz e n i n a zw , w k tó re j z n a jd u je się k la sa Form:
i
*
using System.Windows. Forms;
•
Z d e fin iu je m y m e to d ę Mai n b ę d ąc ą p u n k te m w e jśc ia d o p ro g ra m u . T w o rz y o n a n o w ą in sta n c ję (o b iek t) k lasy Zegar. s t a t i c void MainO C Appl i c a t i o n . RunCnew Z e g a r O ) ; 3
•
W o k n ie Solution Explorer p raw y m p rz y c isk ie m m y sz y w sk a ż e m y n a z w ę p ro je k tu W inApp. Z m en u k o n te k sto w e g o w y b ie rz e m y Properties. W o k n ie d ia lo g o w y m Property Pages, w p o lu O utput Type, w y b ie rz e m y z listy — W indows A p
plication, a w p o lu Startup O bject - W inApp.Zegar.
168
C# w praktyce
Od tego m om entu m ożem y ju ż w ypróbow ać nasz program. Tw orzy on pusty form ularz W indows. •
Do definicji klasy Zegar dodam y deklaracje prywatnych pól: etykiety o nazwie WyswCzas i kontrolki pozwalającej urucham iać metodę obsługi zdarzenia w okre ślonych, regularnych odstępach czasu - Timer. p r i v a t e L a b e l WyswCzas; p r i v a t e Timer Zegarek;
•
D efinicję klasy Zegar uzupełnim y o m etodę I n i t i a l i z e C o m p o n e n t ( ). M ożna ją nazw ać inaczej, tak jest standardow o nazyw ana podczas autom atycznego tw o rzenia przez środow isko Visual Studio .NET. t
t
p r iv a te void I n i tialize C o m p o n en t() C / / utworzenie obiektu e ty k ie ty t h i s .WyswCzas = new La be l O ; / / ustaw ienie właściwości e t y k ie ty t h i s . Wy s w Cz a s . B o r d e r S t y l e = B o r d e r S t y l e . F i x e d 3 D ; t h i s . Wy s w Cz a s . L e f t = 1 0 0 ; t h i s . W y s w C z a s . T o p = 50 ; t h i s . Wy s w Cz a s . H e i g h t = 3 0 ; t h i s . W y s w C z a s . Width = 120; t h i s . W y s w C z a s . F o n t = new S y s t e m . D r a w i n g . F o n t ( " M i c r o s o f t Sans S e r i f " , 1 2 F , S y s t e m . D r a w i n g . F o n t S t y l e . Boi d ) ; / / d o d a n i e e t y k i e t y do k o l e k c j i t h i s . C o n t r o l s . Aęld( Wy s wCza s ) ;
kontrolek
/ / u tw o rzen ie o b ie k tu zegarka t h i s . Z e g a r e k = new T i m e r ( ) ; / / u s ta w ie n ie właściwości zegarka t h i s . Z e g a r e k . I n t e r v a l = 100; Zegarek.Enabled = tru e ; / / p r z y p i s a n i e o b s ł u g i z d a r z e n i a do o b i e k t u t h i s . Z e g a r e k . T i c k + = new S y s t e m . E v e n t H a n d l e r ( this.Zegarek_Tick);
3
W yjaśnienia w ym aga przypisanie obsługi zdarzenia do obiektu. W indows używa m odelu zdarzeniow ego do sterow ania w ykonyw aniem kodu.
W łasne klasy
169
In stru k cja : t h i s . Z e g a r e k . T i c k + = new S y s t e m . E v e n t H a n d l e r ( t h i s . Z e g a r e k _ T i c k ) ;
tw o rzy tzw . d e le g a c ję (re fe re n c ję do fu n k cji) E v e n t H a n d l e r , k tó ra w sk a z u je m eto d ę Z e g a r e k _ T i ck. N a stęp n ie d o d a je d e le g a c ję do z d a rz e n ia T ic k z e g a ra Z e g a r e k .
•
M e to d ę I n i t i a l i z e C o mp o n e n t f ) a k ty w u je m y w k o n stru k to rz e k lasy : public ZegarO C I n i t i a l i zeComponent(); 3
•
N a p isz e m y je s z c z e m eto d ę o b słu g i z d a rz e n ia T i c k d la n a sz e g o z e g a rk a : p r i v a t e v o i d Z e g a r e k _ T i c k ( o b j e c t s e n d e r . EventArgs e) ( this.W ysw Czas.T ext = D ateTim e.N o w .ToS tringC ); 3
•
S k o m p ilu je m y i u ru ch o m im y p ro g ram . Z e g a r c h o d z i, c h o c ia ż je s t d o ść a sc e ty c z n y w sw o im w y g lą d z ie .
12. Bazy danych
/
_
Środowisko .NET oferuje efektywne m echanizm y dostępu do danych zgrom a dzonych w bazach danych. Dostęp do źródeł danych oraz zarządzanie zbioram i danych umożliwiają klasy zgromadzone w unowocześnionej bibliotece A ctiveX D ata Objects (ADO .NET). Z ich pomocą można współpracować z bazą danych zarów no w tzw. środowisku połączonym jak i rozłączonym. ADO .NET rozdziela m echanizm łączenia się z bazą danych od manipulacji na zbiorach danych. Dzięki temu m ożem y w spółpra cować z dow olnym źródłem danych (np. z danymi form atu m db, dbo, xml). Klasy modelu obiektowego ADO .NET zostały zdefiniowane w przestrzeni nazw System.Data.
12.1.
Kreator Data Form Wizard
Szybkie zbudow anie interfejsu um ożliw iającego dostęp do źródła danych oferuje kreator D ata Form Wizard. W ykorzystując go, m ożna utw orzyć form ularz z kontrol kami pow iązanym i ze źródłem danych i um ożliw iający w ykonyw anie podstaw ow ych operacji, takich jak przeglądanie, dodaw anie, usuw anie, edytow anie zapisów . ✓
Ćwiczenie 52. Dostęp do danych z użyciem Data Form Wizard U tw orzym y interfejs udostępniający dane zaw arte w bazie danych M S A ccess o nazwie Biblioteka. Baza ta składa się z dwóch tabel C zytelnicy i W ypożyczenia połą czonych relacją. Jej strukturę przedstaw ia rysunek.
i
i /-¿llillfl Nazwisko Imię Kod Miejscowość Ulica Numer Telefon
X
oo
Id wypożyczenia
J Id czytelnika ¡T y tu ł ¡A u to r j Indeks książki jD a ta w ypożyczenia jD ata zw rotu
Rysunek 54. Relacja między tabelami
•
U tw orzym y nowy projekt typu W indows Application o nazw ie Baza.
•
Z menu Project w ybierzem y polecenie A d d N ew hem .
•
W otw artym oknie dialogow ym wskażemy D ata Form Wizard. W polu N am e w piszem y D ataForm Biblioteka.es i całość zatw ierdzim y przyciskiem Open.
172
C# w praktyce
•
W uruchom ionym kreatorze D ata Form W izard klikniem y przycisk Next.
•
W następnym oknie kreatora, w polu Create a new dataset nam ed, wpiszem y nazw ę zestaw u danych - BibliotekaD ataSet i zatw ierdzam y przyciskiem Next.
Choose the d a ta se t you want to use The dataset contains the tables and columns to work with in your form.
The wizard helps you create a new dataset. Alternatively, you can use a dataset already defined in your project or one provided by a Web service. Which dataset do you want to use? ?• Create a new dataset named: BibliotSkaDataSet
Cancel
< Back
I
Next >
Rysunek 55. Nazw a zestawu danych
•
N astępnie w ybierzem y połączenie ze źródłem danych, klikając przycisk New C o n n ectio n ... . Odia Form V Choose a d a ta connection The data connection specifies how to find and log into a specie server and database.
Choose from the 1st of data connections currently in the Server Explorer, or add a new connection If the one you want is not listed. Which connection should the wizard use?
æ -i
CCESSX ^Documents ¿nd
New Connection...
Some of the existing data connections use an ODBC provider which cannot be used by the wizard. These connections were not loaded.
Caned
R ysunek 56. Połączenie ze źródłem danych
< Back
Next >
Iteh-
Bazy danych
173
W oknie W łaściwości łącza danych w ybierzem y zakfatlkę D ostaw ca. D om yśl nym wskazaniem jest połączenie do bazy um ieszczonej na serw erze SQL. My jednak zm ienim y to, ponieważ nasza baza została utw orzona w M S A ccess. N a szym dostaw cą jest M icrosoft Jet 4.0 OLE D B Provider. W ybór zatw ierdzim y przyciskiem D a l e j » . *& Właściwości łącza danych D ostaw ca j Pof-ęczenie | Zaaw ansow ane
j W szystkie J
W ybierz dane, z którymi chcesz się pomęczyć: D ostaw cy OLE DB MediaCatalogW ebDB OLE DB Provider Microsoft ISAM 1.1 OLE DB Provider Mícioooft d el 4 .0 OLE 0 8 Provide*
vi;: mußBBn
Microsoft OLE DB Provider For D a la Mining Services Microsoft OLE DB Provider for DTS P ackages Microsoft OLE DB Provider for Indexing S ervice Microsoft OLE DB Provider for Internet Publishing Microsoft OLE DB Provider for ODBC Drivers Microsoft OLE DB Provider for OLAP Services 8.0 Microsoft OLE DB Provider for Oracle Microsoft OLE DB Provider for O utlook Search Microsoft OLE DB Provider for SQL Server Microsoft OLE DB Simple Provider MSDataShape SQL Server R eplication OLE DB Provider for DTS VSEE Versioning Enlistment M anager Proxy D a ta Source
V
> Dalej »
OK
A nuluj
Pom oc
Rysunek 57. Dostawca danych
•
N a karcie Połączenie w prowadzim y nazwę pliku bązy danych (zę ścieżką do stępu - najwygodniej przyciskiem ). Pozostałe param etry zostaw im y bez zm ian. W arto w ypróbow ać połączenie przyciskiem Testuj połączenie. C ałość potw ier dzim y przyciskiem OK, w ten sposób w racając do okna połączenia ze źródłem danych.
•
W oknie połączenia ze źródłem danych klikniem y teraz N ext, tym sposobem przechodząc do wyboru tabel bazy danych. W skażem y tu tabele C zytelnicy i W y pożyczenia. Przeniesiem y je z tabel dostępnych do w ybranych, klikając przycisk >. W szystko to zatw ierdzim y przyciskiem Next.
174
C# w praktyce
>Właściwości łącza danych 0 ,
D ostaw ca
Pokączenie | Z a aw ansow ane j W szystkie |
A by pofączyć się z danymi programu A ccess, podaj następujące informacje: 1. W ybierz lub wprowadź nazwę bazy danych: [okum enty\Książka • C tt\P ro je kty\B a za \B ib lio teka mdb
... S
2. W prow adź informacje o logow aniu do bazy danych: N azw a użytkow nika: |Admin ;N ^ o :
|
fi/ Puste hasko
T
Zezw alaj na zapisywanie haska
T estui pokączenie
OK
Pomoc
Anuluj
Rysunek 58. Nazw a bazy danych
C hoose ta b le s o r v ie w s The tables or view s you choose will determ ine which columns will be available to display on yo ur form ,
The w izard creates a d a ta ad ap ter to populate th e d a ta s e t from available tables or view s. I f you pick more th an one item , you can establish a relationship be tw e en them in th e n e x t ste p .'
W h a t Ite m (o r ite m s ) d o y o u w a n t t o access? A vailable item (s):
Selected item (s): i-i Tables Czytelnicy
Tables Views
W ypożyczenia Views
_ sj
Cancel
Rysunek 59. W ybór tabel
N ext >
Bazy danych
175
W o k n ie tw o rz e n ia rela cji w p isz em y n a zw ę n a sze j rela c ji {Name), np. czyt-wyp, n a zw ę tab e li g łó w n e j {Parent table) - C zytelnicy , n a z w ę ta b e li p o d rz ę d n e j {Child
table) - W ypożyczenia o raz p o la łą c z ą c e tab e le . W o b y d w u ta b e la c h je s t to p o le Id czytelnika. A b y u tw o rzy ć re la c ję , k lik n ie m y p rz y c isk > . T e ra z m o ż e m y p rz e jść d alej {Next).
C re a te a re la tio n s h ip b e tw e e n ta b le s The w izard will use th e relationships to g e n erate code th a t keeps the tables synchronized as you w ork w ith them .
Relationships are based on common keys b e tw e en tables. Nam e your new relation, choose th e parent and child tables and key fields, and then add it to th e relations list using th e arrow button. Nam e:
Relations i
jc zy t-w y p P arent table: (czytelnicy
Child table:
zl
¡W ypożyczenia
zl
js
Keys:
IId czytelnika 1
zJ
zl |ld czytelnika zJ i
J
zl zi
Rysunek 60. Tworzenie relacji między tabelami •
N a le ż y je s z c z e w sk az ać p o la, k tó re z o sta n ą w y św ie tlo n e n a fo rm u la rz u . D o m y śln ie są w y b ie ra n e w sz y stk ie p o la z o b y d w u tabel. M o ż e m y o d z n a c z y ć Id
czytelnika z tab e li W ypożyczenia (ten sam n u m e r je s t ju ż w ta b e li C zytelnicy). P rz e jd z ie m y dalej {Next). •
W o sta tn im o k n ie k re a to ra w y b ie rz e m y styl w y ś w ie tla n ia p o łą c z o n y c h tab el. W a rto w y b ra ć układ: fo rm u la rz - p o d fo rm u la rz {Single record in individual con
trols). P o z o sta w ie n ie w łą c z o n y c h w sz y stk ic h p ó l w y b o ru p o z w o li n a d o d a w a n ie i u su w a n ie n o w y ch re k o rd ó w , n a a n u lo w a n ie w p ro w a d z o n y c h z m ia n i d o d a n ie n a w ig a to ra do p o ru sz a n ia się po k o le jn y c h z ap isa ch . W p ro w a d z o n e o p c je z a tw ie rd z a m y p rz y c isk ie m Finish.
C# w praktyce
176
Choose tables and columns to display on the form Your form can display any of th e tables and columns available in the d a ta se t.
I f you display more th an one table on th e form , th e tables h ave a m a ste r-d e tai relationship
W h a t ta b l e s a n d c o lu m n s do y o u w a n t to d isp la y on th e form ?
M aster or single table: [Czytelnicy
Detail table: ■ ■ 1
▼
(W ypożyczenia
Coiumns:
Coiumns: ✓
Kod
✓
Miejscowość
✓ ✓
Nazwisko Numer
V
Telefon
3
A. \ m
A ';
V Autor ✓ D a ta w ypożyczenia ,
1È
D ata zwrotu
\ r ..
:j.Ł -
Id czytelnika ✓
¿slis V ‘ÜÍK1
iV: Ulica
Cancel
j
Id w ypożyczenia Indeks książki
< Back
Next >
V
Finish
R ysunek 61. W ybór tabel i pól, które zostaną wyświetlone na formularzu
Data Form Wizard Choose the display style You can display a single record a t a tim e or display all records a t once.
How d o y o u w a n t t o d isp lay y o u r d a ta ? C
All records in a grid
( •
Single record in individual controls
W h a t a d d itio n a l c o n tro ls d o y o u w a n t o n t h e fo rm ? P
Cancel All - Cancels changes to afl records In th e d a ta se t.
I f you select individual controls, you can add controls for editing and navigation:
P P
Add - C reates a new record.
P
Cancel - Cancels changes to th e current record.
P
Navigation controls - M oves to first, previous, n e x t, or last record.
D elete - D eletes th e current record.
The w izard now has th e inform ation It needs. CBck Finish to exit and g e n e ra te your n e w form .
Cancel
Rysunek 62. W ybór stylu wyświetlania połączonych tabel
Finish
:
Bazy danych
•
177
Przed uruchom ieniem programu trzeba jeszcze zdecydow ać, czy form ularz bazy danych będzie głów nym oknem aplikacji, czy też będzie otw ierany z innego okna? o
W pierw szym przypadku musimy zm ienić opcje startow e projektu. M ożna to uczynić, klikając prawym przyciskiem m yszy na nazw ie projektu i w y bierając z menu kontekstow ego Propenies. W polu StartupProject w pi szemy: Baza.D ataForm Biblioteka. W klasie D ataF om iB iblioteka m usim y jeszcze umieścić statyczną m etodę M ain (w ejście do program u). M ożna ją przekopiow ać z klasy F o m il (gdzie je st w takiej sytuacji niepotrzebna) i zm ienić nazwę tw orzonego obiektu z F ortnl na D ataF om iB iblioteka. static
void M ainO C Appl i c a t i o n . Run ( new
DataFormBibl i o t e k a O ) ;
}
o
W drugim przypadku, w głów nym oknie aplikacji, np. F o rm l um ieścim y przycisk (lub pozycję w menu) otw ierający form ularz D ataF om iB iblioteka. p r i v a t e void b u t t o n l _ C l i c k ( o b j e c t sender.
S y s t e m . EventAr gs e)
i
//
II utworzenie obiektu form ularza DataForm Biblioteka wypożyczenia=new D a t a F o r m B i b li o t e k a ( ) ; w y ś w i e t l e n i e f o r m u l a r z a na e k r a n i e wypożyczeni a . Show();
)
•
Interfejs utw orzony przez D ata Fom i Wizard posiądą przyciski z napisam i an gielskim i. Łatw o m ożem y je poprawić, zm ieniając ich w łaściw ości Text na napi sy polskie.
•
Kontrolki na form ularzu zostały rozm ieszczone przez kreator w kolejności alfa betycznej w edług napisów na etykietach. M ożem y to zm ienić, układając je (przsuw ając) w dowolnej kolejności. Nieco więcej trudności m oże spraw ić zm ia na kolejności kontrolek na podform ularzu. K ontrolka D a ta G ń d w yśw ietla tu pola tabeli W ypożyczenia. Aby zmienić ich kolejność, zaznaczym y kontrolkę D a ta G ń d na projekcie form ularza i znajdziem y w łaściw ość TableStyles w oknie Pro p enies. K likniem y przycisk .... W oknie D ataG ńdTableStyle Collection Eć/itor w yszukam y właściw ość G ńdColum nStyles. K likniem y przycisk .... W oknie D ataG ńdC olum nStyle Collection Editor znajdziem y ponum erow ane pola w aktu alnej kolejności, w skażem y dane pole i strzałkam i w górę lub w dół m ożem y przesunąć je we w łaściwe miejsce.
178
C# w praktyce
DatdGridColumnStyle Collection Editor Members:
objColum nStylegrdW ypożyczeniaId_w ypoży m m nm tm im r v .. - _ ..
Ol obiCoiunmSiyl^tdWypor/aerudt objColum nStylegrdW ypożyczenlaT objColumnStylegrdW ypożyczeniaC objColum nStylegrdW ypożyczenial
j
j
^
j
.- _
CE (DynamicPropertk □ : (N am e)
objColumnStylegrdW ypożyczeniaC
objColum nStylegrdVi
Modifiers
objColumnStylegrdW ypożyczeniaC
'B
v n % i
Private
lisy
w
e t
Left
Alignment H eader Text
Id w ypożyczenia
NullText
(null)
Width
75
: ~7
B
/ " •: ••••:
Format
4
MappingName
Id w ypożyczenia
R eadonly
False
y Add
*1
Rem ove
OK
Cancel
Help
R y s u n e k 63. D ataG ridC olum nStyle C ollection E ditor
a ts *
Z a fa d u j Anuluj wszystko
fi
N azw isko
\ Kowalski
Imię
|ja n
Numer
|3 4
Kod
145*530
T elefon
¡3456789
M iejscow ość
| Opole
Ulica
¡Krakow ska
Id czytelnika V.
Rysunek 64. Aplikacja utworzona przy użyciu Data Form Wizard
j
Bazy danych
179
U żyw ając kreatora D ata Form Wizard, nie m usim y praw ie w cale pisać kodu pro gramu. W arto jednak przeanalizow ać kod utw orzony autom atycznie. Pozw ala on poznać m echanizm y zapew niające dostęp do źródeł danych.
12.2.
Poznajemy obiekty ADO
AD O .N E T jest zbiorem klas służącym do w spółpracy z bazam i danych. P rojek tując dostęp do baz danych, tw orzym y oprogram ow anie w ykonujące najczęściej takie podstawowe zadania jak: •
połączenie z bazą,
•
pobranie określonych danych,
•
przesłanie aktualizacji danych,
•
zam knięcie połączenia po uzyskaniu danych oraz ponow ne otw arcie, gdy prze syłana jest aktualizacja.
Do połączenia z bazą są w ykorzystyw ane obiekty klasy C onnection. D ane po między klientem i bazą wym ienia obiekt typu DataAdapter. O biekt klasy D ataSet przechowuje pobrane dane w pamięci (niezależnie od stanu bazy - w trybie rozłączo nym). Poza tym wiele innych klas ADO .NET zapew nia sw obodną m anipulację da nymi.
Zarządza połączeniem z bazą danych
Database
Wykonuje kwerendy w bazie Connection
Wymienia dane pomiędzy zestawem danych a bazą
Command Przechowuje dane w pamięci niezależnie od bazy Pozwala na efektywny dostęp do strumienia danych w trybie tylko do odczytu
DataAdapter
DataSet
DataReader
Rysunek 65. Podstawowe klasy ADO .NET
180
C# w praktyce
>»
Ćwiczenie 53. Odczytujemy dane z bazy U tw orzym y program w yśw ietlający dane pobrane z tabeli bazy danych MS Afr cess: M oje adresy.mdb. Dane um ieścim y na formularzu w kontrolce DataGrid. Po trzebne obiekty zadeklarujem y i utw orzym y „ręcznie” (bez korzystania z kreatorów i gotow ych kom ponentów ). •
Na projekcie form ularza typu W indows Application um ieścim y kontrolkę Data Grid. R ozciągniem y ją na cały form ularz.
•
W łaściw ość R eadO nly kontrolki ustaw im y na Tme.
•
Na początku kodu dodam y dyrektywę: u s i n g S y s t e m . D a t a . O l e D b ;
•
U ruchom im y edycję m etody obsługi zdarzenia Load dla form ularza i wprowa dzim y następujący kod: p r iv a t e void Forml_Load(object sender,
S y s t e m . EventArgs e)
C / / o b i e k t t w o r z ą c y p o ł ą c z e n i e z bazą 0 1 e D b C o n n e c t i o n BazaConn = new 0 1 e D b C o n n e c t i o n ( ) ; / / o b i e k t p o b i e r a j ą c y dane / / z g o d n i e z d e f . k w e r e n d y SQL 0 1 e D b D a t a A d a p t e r B a z a A d a p t e r = new 0 1 e D b D a t a A d a p t e r ( " S e l e c t * from A d r e s y " . BazaConn); / / o b i e k t p r z e c h o w u j ą c y dane w p a m i ę c i / / ( n i e z a l e ż n i e od b a z y ) D a t a S e t B a z a D a t a S e t = new D a t a S e t O ; / / ł a ń c u c h ¿lanych p o ł ą c z e n i a BazaConn. C o n n e ctio n S trin g = " P r o v i d e r = M i c r o s o f t . J e t . OLEDB. 4 . 0 ; D a t a S o u r c e = " + ” C : W D o c u m e n t s and S e t t i n g s W M a r i a n W M o j e d o k u m e n t y W " + "K siążka - C # \\ P r o j e k t y \ \C w 5 3 - BazażWMoje adresy.mdb"; / / p o b r a n i e da ny c h B a z a A d a p t e r . Fi 1 1 ( B a z a D a t a S e t ) ; / / w y ś w i e t l e n i e da n y c h w k o n t r o l c e na f o r m u l a r z u d a ta G r id l.D a t a S o u r c e = BazaDataSet; d a t a G r i d l . Da t a Me mb e r = " T a b l e " ;
}
O biekt typu D ataA dapter w ykorzystuje zapytanie SQL. W arto poznać podsta w ow e polecenia tego języka. W wielu system ach obsługi baz danych SQ L służy do tw orzenia kw erend definiujących dane (pobierane i m odyfikowane).
Bazy danych
ID adresu
.►
Nazwisko
Adres
Norman
Menza
ul. Ogrodowa
Bo
Johanson
al. Wiśniowa
Ferdynand
Kiepski
ul. Komuny P
Venus
Williams
Marco
van Banan
ul. Chopina 1 (nuli)
Jola
Piękna
i7 8
Picrtr
9
1
...... 2
h
\
I i
I
181
4 5 6
| Imię
Miasto
AdresEmail
Kraków
bonnie@intefia.
6875456677
1976-05-14
Police
(nuli)
(nuli)
1961-01-18
W rocław
(nuli)
(nuli)
1972-04-26
Sopot
(nuli)
(nuli)
1981-09-19
Szczecin
(nuli)
(nuli)
1967-12-17
(nuli)
Cieszyn
(nuli)
1975-10-30
Myszkowski
(nuli)
Mirów
(nuli)
(nuli) (nuli)
Nalalia
Kukulska Kowalski
W arszawa Kraków
(nuli)
Jan
(nuli) Rynek 43
(m l) 504222444
1979-06-22 (null)
i
¡[email protected]
| TelefonKomórkowy
DataUrodzem a
i
1982-03-21
z m m m i i M m m m i i z a m i tx a x o x
ś
Rysunek 66. Odczyt danych z bazy
a
Ćwiczenie 54. Korzystamy z komponentów bazodanowych U tw orzym y program odczytujący dane z bazy. U zupełnim y go o m ożliw ość ak tualizacji danych i zapisu ich w pliku form atu X M L. Skorzystam y z kom ponentów dostępnych w przyborniku Toolbox. •
Zbudujem y projekt form ularza taki sam jak w poprzednim ćw iczeniu.
•
Do projektu form ularza dodam y 2 przyciski: jeden z napisem „A ktualizuj” i drugi - „Zapisz jako X M L”.
•
W przyborniku Toolbox wskażemy grupę D ata. Z niej w ybierzem y O leD bD ataA dapter (w przypadku baz SQ L Server należy w ybrać SąlD ataAdapter) i um ie ścimy go na formularzu. Spowoduje to uruchom ienie kreatora D ata A dapter Configuration Wizard. Klikniem y tutaj przycisk Next.
•
W oknie połączenia ze źródłem danych (rys. 55) w ybierzem y przycisk N ew C onnection.. . .
•
Dalej określim y dostawcę połączenia i nazw ę bazy danych - tak sam o jak w ćw iczeniu 52.
•
W oknie Choose a Query Type zgodzim y się na proponow aną opcję {Use SQ L Statm ents - użyj w yrażenia SQL), klikając przycisk Next.
C# w praktyce
182
Rysunek 67. Kreator D ata Adapter Configuration Wizard
tion Wizard C hoose a Q u e ry Type The d a ta a d ap ter uses SQL statem ents or sto re d procedures.
How should th e d a ta a d ap ter access th e database?
• Use SQL statem ents Specify a Select statem ent to b a d d a ta , and th e w izard will ge n erate the In s e rt, U pdate, and D elete statem ents to save d a ta changes.
C Cr&tWtel rwm s to re d pr& :edtires Specify a Select statem en t, and th e w izard will g e n e ra te new stored procedures to select, insert, up d a te, and de lete records.
C
\h ,i'
i:-*r*K:;edu*«s
Choose an existing stored procedure for each operation (select, insert, update and d e le te ).
Cancel
R ysunek 68. W ybór typu zapytania do bazy
< Back
N ext >
mm
Bazy danych •
183
W n a stę p n y m o k n ie m u sim y p o d ać treść z a p y ta n ia S Q L . M o ż e m y sk o rz y sta ć z p rz y c isk u Q u e ty B u ild e r .. . .
Generate the SQL statem ents The Select statem ent will be used to cre ate th e In s ert, U p d a te , and D elete statem ents.
S»
Type in your SQL Select statem ent or use th e Q uery Builder to graphically design th e query.
W hat d a ta should th e d a ta adapter load into the d a ta se t?
Advanced O ptions...
j
Q uery Builder...
Cancel
< Back
file.#
>
—
|
-J,
Rysunek 69. Tworzenie zapytania •
K o n s tru k to r z a p y tań u m o żliw i nam in te ra k ty w n ie z b u d o w a ć z a p y ta n ie d o b a z y (b ez k o n ie c z n o śc i z n a jo m o ści ję z y k a SQ L ). W sk a ż e m y tu ta b e lę /ta b e le (w n a szy m p rz y p a d k u - A d re sy ) i k lik n ie m y A d d , n a stę p n ie C lose. Z a z n a c z y m y d a le j p o la, k tó re c h ce m y w y b rać d o z a p y ta n ia (k o le jn o ść w y b o ru d e c y d u je o u k ła d z ie k o lu m n w p o b ran y c h dan y ch ). C a ło ść p o tw ie rd z im y p rzy c isk ie m O K .
•
O k n o tw o rz e n ia zap y tań o p u śc im y p rz y c isk ie m N ext.
•
W o sta tn im o k n ie k re a to ra sp ra w d z im y sz c z e g ó ło w ą k o n fig u ra c ję o b ie k tu o leD b D a ta A d a p te r 1. Je że li w szy stk ie d e ta le (5) są o z n ac zo n e ja k o w y g e n e ro w a n e , o p u sz c z a m y k re a to r p rzy c isk ie m F in ish .
184
C# w praktyce
A
S s J | jD a ta U ro d z e n ia ( 2 ID ackesu w
u r u ę
V Miasto ¡✓N a z w is k o ( ✓ j TelefonKom órkowy
&
A
i
CR'..' i V
>
< łlil Column ID ad resu Nazwisko Imię
Alias
(Tab le Adresy Adresy Adresy
| O utput v/ v/
15ort Type
| Criteria
| Sort O rder
M
> SELECT FR O M
ID ad resu, Nazwisko. Im ię, M iasto, Adres, AdresEmail, TelefonKomórkowy Adresy
Rysunek 70. Konstruktor zapytań
.
.
V ie w W iz a r d R e s u lts R eview th e list of tasks th e w izard has perform ed. Click Finish to com plete or Back to make changes.
m
m
The d a ta a d ap ter "oleD bD ataA dapter 1" was configured successfully. ;r.-' Details:
. u.
*
G en erated SELECT statem ent.
*
G en e rated tab le mappings.
*
G en erated INSERT statem ent.
*
G en erated UPDATE statem en t.
*
G en erated DELETE sta tem e n t.
. I.... 4 .
To apply th es e settings to your a d a p te r, dick Finish.
C an e d
a M
j
< Back
j
H ii"
R ysunek 71. Podsum owanie konfiguracji obiektu oleDbDataAdapterl
Finish
Bazy danych
185
K re a to r u m ie śc ił n a fo rm u la rzu , o p ró cz o b ie k tu o le D b D a ta A d a p te r l, ró w n ie ż O le D b C o n n e c tio n l. •
U tw o rz y m y i sk o n fig u ru je m y o b iek t k lasy D a ta S e t - p rz e c h o w u ją c y p o b ra n e dane. W ty m celu z o k n a w ła ściw o ści o le D b D a ta A d a p te r l (z d o ln e j je g o c z ę śc i) w y b ie rz e m y G e n e ra te D a ta s e t. . . . Generate Dataset G enerate a dataset th a t includes th e specified tables. Choose a dataset:
j Baza3. D ataSet 1 C
New:
jd
j-viS
Choose which table(s) to add to the dataset: m
Adresy (oleO b D ataA dap terl)
P7 Add this dataset to the designer.
OK
Cancel
Help
Rysunek 72. Tworzenie obiektu typu DataSet •
P o z o sta w im y u sta w ie n ia d o m y śln e i o p u śc im y o k n o p rz y c isk ie m O K .
•
W sk a ż e m y , n a p ro je k c ie fo rm u la rza , k o n tro lk ę d a ta G r id l i u sta w im y je j w ła ś c i w o ść D a ta S o u rc e n a w arto ść d a ta S e t 11 .A dresy. T e ra z w k o n tro lc e z o b a c z y m y stru k tu rę ta b e li (n a g łó w k i) A dresy.
•
O p ro g ra m u je m y p rz y c isk „ A k tu a liz u j” : p r i v a t e void B u t t o n l _ C l i c k ( o b j e c t sender.
C try C
/ / u a k t u a l n i e n i e danych oleD bD ataA dapterl. Update( d a t a S e t l1);
3 catch
(Exception ex)
C
MessageBox.Show(ex.ToStri n g ( ) ) ;
)
S y s t e m . EventArgs e)
C# w praktyce
186
•
P rzycisk „Zapisz jako X M L ” będzie służył do zapisu danych z obiektu d a t a S e t l i do pliku form atu X M L : p r i v a t e v o id B u t t o n 2 _ C l i c k ( o b j e c t s e n d e r , S y s t e m . EventArgs e) C / / o k r e ś l e n i e ś c i e ż k i d o s t ę p u do p l i k ó w / / (bieżący katalog - bin\debug)) s trin g ścieżka = E nviro n m en t.C u rren tD irecto ry.S u b strin g (0, Envi r o n m e n t . C u r r e n t Di r e c t o r y . L e n g t h - 9 ) ; / / z a p i s d a n y c h do p l i k u f o r m a t u XML d a t a S e t l i .W r ite X m l(ś c ie ż k a + " A d re s y . xml" ) ;
)
1
l
Pliki form atu X M L są plikami tekstow ym i. Ich w szechstronne zastosow anie do opisu różnych danych wynika z otwartości tego języka ( e x te n s ib le M arkup L a n g u a g e ) w stosunku do różnych system ów operacyjnych i platform sprzętowych. X M L w yko rzystuje się na praw ie w szystkich serw erach .N E T. D okum enty tego typu stosuje się do opisu danych strukturalnych, do przechow yw ania schem atów baz danych. Istnieje w iele innych zastosow ań języka X M L .
12.3.
Server Explorer, SQL Server
S e rv e r E x p lo re r jest narzędziem um ożliw iającym dostęp do zasobów komputerów
w sieci. A by otw orzyć okno eksploratora serwerów, należy z menu V iew wybrać S e rv e r E xp lo re r.
Do S e rv e r E xp lo rera m ożem y dołączać bazy danych, precyzując dostaw cę i połą czenie (tak jak w poprzednich ćw iczeniach). Służy do tego przycisk C o n n e c t to D a ta b a se. A by korzystać z zasobów zdalnych kom puterów , najpierw należy dodać okre ślony kom puter do S e rv e r E xp lo rera (przycisk C o n n e c t to Server). S e rv e r E x p lo re r um ożliw ia zarządzanie różnym i bazami danych. Bazy te zwykle
ju ż istnieją, np. w postaci pliku M S A c c e s s (* .m d b ). Czasam i jednak chcem y dopiero je utw orzyć. Zw ykle wtedy korzystam y z system ów zewnętrznych. W środowisku V isu a l S tu d io .N E T m ożem y zainstalow ać, pow szechnie używany system tworzenia i zarządzania bazam i danych, S Q L Server . Plik instalacyjny o nazwie sq l2 0 0 0 .m si znajdziem y w podfolderze: \M ic ro s o ft V isu a l S tu d io .N E I\F ra m e w o rk S D K \S a m p le s\S e tu p \m sd e \se tu p .
Z ostał tam um ieszczony podczas instalacji środow iska V isu a l S tu d io .N E T.
Bazy danych
187 S erv er Explorer
SI #
•ö
X
%&
B -* r # D ata Connections
i±! ë m * [i¡
4 q
ft;'
É* B
% i+r]
09
ACCESS.C :\Docum ents and Settings\M arian\M oje dokum enty\B iblioteka.m db.Admin fiS ACCESS.C :\D ocum ents and S ettings\M arian\M oje dokum enty\Książka - C # \P ro je k ty \C w 5 4 - Baza fix A CCESS.D:\Baza\Adresy.m db.Adm in * W ITEK-M ARIAN.AddressBook.dbo & %
W ITEK -M A R IA N . m aster. dbo W ITEK -M A R IA N .m aster.dbo2
%
W ITEK -M A R IA N .N orthw ind. dbo
Servers JH anow ak J|J rolandxp
-
$
W ITEK-M ARIAN
it] [ft
Crystal Services |*|j Event Logs
f f l - & £ M essage Q ueues E
0
Perform ance Counters
ftl- ^ B
Services
( i SQL Servers 0"
^ W IT E K -M A R IA N
ft
AddressBook 0 ^ Ewidencja
Hj
Ewidencja sprzedaży ffr
D atabase Diagrams
iB - ^
Tables E
0 3 Ewidencja
m
id
¡21 Id kJienta QO Id tow aru
1- m nose ( D D a ta s p rz Iffa Views Stored Procedures 1 it;
““ f i b Functions fix master
ft:
fix model
!t ift
fift msdb Northwind fi& tem pdb
.ft
Rysunek 73. Se/ver Explorer W arto ró w n ie ż z ain sta lo w a ć p rz y k ła d o w ą b azę d a n y ch typu SQ L Server. W fo l
W ic ro so ft Visual Studio skrypt: instnwnd.sql.
derze
.NET\Fram eworkSD K\Samples\Setup
z n a jd z ie m y
U ru c h a m ia ją c go p o lecen iem :
osąl - E -iinstnw nd.sql zainstalujem y b a zę d an y ch o n a zw ie Northwind. M o ż e m y ją p rze g ląd a ć, u ż y w ają c Server Explorera , a ta k ż e w y k o rz y sty w a ć d o dalszych ć w ic z e ń z b a za m i d anych.
188
C# w prćiktyce
W aplikacji ADO .NET m ożem y integrow ać dane pochodzące z różnych typów baz. M ożem y je odczytyw ać, m odyfikow ać, łączyć relacjami, transform ow ać do in nych baz. *
Ćwiczenie 55. Integracja danych z różnych źródeł Z budujem y aplikację do ew idencjow ania sprzedaży. Dane klientów będziemy pobierać z bazy typu M S Access. C ennik odczytam y z arkusza kalkulacyjnego MS E xcel (przykładow o -takie cenniki otrzym ujem y od kontrahenta), jednak przetransform ujem y go do pliku X M L (wygodniej go będzie używać). Ew idencję sprzedaży będziem y zapisyw ać w utworzonej do tego celu tabeli bazy SQL Server. •
Zaprojektujem y w ygląd głów nego form ularza (dla uproszczenia zastosujemy przyciski - m ożna użyć menu, pasków narzędzi): m Ewidencja sprzedaży towarow
1
l Klienci
Cennik
Sprzedaż
Ew idencja
Rysunek 74. Główny form ularz aplikacji
•
D la łatwiejszej lokalizacji nadamy przyciskom swoje nazwy (właściwość Name): Klienci, Cennik, Sprzedaż, Ewidencja.
•
M etoda obsługi przycisku Klienci będzie następująca: p r iv a t e void K I ie n c i_ C lic k ( o b je c t
sender,
S y s te m .EventArgs e)
C K l i e n c i f r m K l i e n c i = new K l i e n c i O ; f r m K l i e n c i . ShowDi a l o g ( ) ;
)
Z aprojektujem y form ularz Klienci (A d d W indows Form . ..): K om ponenty bazodanow e um ieścim y na palecie form ularza, korzystając z kre atora urucham ianego z dodaniem O leD bD ataAdapter (ćwiczenie poprzednie).
Bazy danych
189
A ktualizuj
oleD bD ataA dapter l
^
oleDbConnection 1
CęD d ataS et 11
Rysunek 75. Form ularz Klienci •
O p ro g ra m u je m y m eto d ę o b słu g i z d a rz e n ia L o a d d la te g o fo rm u la rz a : p r i v a t e void K Iie n c i_ L o a d ( o b je c t sender. System .EventArgs e) C try C / / p o b r a n i e danych o l e D b D a t a A d a p t e r l . F i l i ( d a t a S e t 11. " K I i e n c i " ) ; 3 catch C
( E x c e p t i o n ex )
« MessageBox.Show(ex.ToString()) ;
3 d a t a G r i d l . DataSource = d a t a S e t l l ; d a t a G r i d l . Dat aMember = " K l i e n c i " ;
3 •
M e to d a o b słu g i p rzy cisk u b ęd zie n astęp u jąca: p r iv a te void b u tto n l_ C lic k (o b je c t sender,
S y s t e m .EventArgs e)
C try C / / a k t u a l i z a c j a danych oleD b D ataA d ap terl. Update(d a ta S e t11,
"KI i e n c i " ) ;
190
C# w praktyce 3 catch
( E x c e p t i o n ex )
C Mes s a g e B o x . S h o w ( e x . T o S t r i n g ( ) ) ;
3 / / z a m k n i ę c i e okna d i a l o g o w e g o D i a l o g R e s u l t = D i a l o g R e s u l t . OK; 3
•
W rócim y do głównego okna aplikacji i napiszemy kod obsługi przycisku Cennik. p r i v a t e v o i d C e n n i k _ C l i c k ( o b j e c t s e n d e r . S y s t e m . EventArgs e) C
C e n n i k f r m K C e n n i k = new C e n n i k i ) ; f r mK C e n n i k . S h o w D i a l o g ( ) ;
3
•
Zaprojektujem y form ularz C ennik:
Rysunek 76. Form ularz Cennik
•
T ym razem nie skorzystam y z gotow ych kom ponentów , lecz utw orzym y obiekty „ręcznie” . MS Excel nie jest bazą danych, mimo to dostaw ca będzie taki sam jak dla bazy MS Access. / / o k r e ś l e n i e ś c i e ż k i d o s t ę p u do p l i k ó w / / (bieżący katalog - bin\debug)) s t r i n g Ścieżka = Environm ent.C u r re n tD ir e c to ry .S u b s trin g iO . Env i r o n m e n t . C u r r e n t D i r e c t o r y . L e n g t h - 9 ) ;
Bazy danych
191
/ / o b i e k t p r z e c h o w u j ą c y p o b r a n e dane D a t a S e t D a t a S e t 2 = new D a t a S e t O ; p r i v a t e void O d c z y t E x c e l _ C l i c k ( o b j e c t s e n d e r , S y s t e m . EventArgs e) C / / da ne d o s t a w c y - ł a ń c u c h p o ł ą c z e n i a s t r i n g conn2 = " P r o v i d e r = M i c r o s o f t . J e t . 0 L E D B . 4 . 0 ; D a t a S o u r c e = " + Ścieżka + " c e n n i k . x l s ; " + "Extended P rop erties=E xcel 8 . 0 " ; / / o b ie k t nawiązujący połączenie 0 1 e D b C o n n e c t i o n c o n n e c t i o n 2 = new 0 1 e D b C o n n e c t i o n ( c o n n 2 ) ; / / o b i e k t w y k o n u j ą c y z a p y t a n i e SQL 0 1 eDbCommand cmd2 = new 0 1 e D b C o m m a n d ( " S e l e c t * f r o m [ c e n n i k i ] " , connection2); / / o b i e k t d o s t ę p u do danych 0 1 e D b D a t a A d a p t e r d a t a A d a p t e r 2 = new 0 1 e D b D a t a A d a p t e r ( c md 2 ) ; / / wyczyszczenie D a t a S e t 2 . C l e a r ( );
pobranych w c z e ś n i e j
da ny c h
try C / / p o b r a n i e danych d a t a A d a p t e r 2 . Fi 1 1 ( D a t a S e t 2 , " c e n n i k " ) ; ) catch ( E x c e p t i o n ex) C MessageBox.Show(ex.ToString() ) ; 3 / / w s k a z a n i e ź r ó d ł a danych w t a b e l i d a t a G r i d l . DataSource = DataSet2; dataGridl.DataMember = "Cennik";
dataG ridl
3 p r iv a t e void 0dczytXML_Click(object sender,
C D a t a S e t 2 . C l e a r ( ); / / o d c z y t danych z p l i k u XML D a t a S e t 2 . Re a d X ml ( Ś c i e ż k a + " c e n n i k . x m l " ) ; d a t a G r i d l . DataSource = D ataSet2;
S y s t e m . EventArgs e)
192
C# w praktyce d a t a G r i d l . Dat aMember = " C e n n i k " ;
} p r i v a t e void A k t u a li z u j X M L _ C li c k ( o b je c t sender, C / / z a p i s danych do p l i k u XML DataSet2. WriteXm l(Ścieżka + " c e n n ik .x m l" ) ;
S y s te m .EventArgs e)
D i a l o g R e s u l t = D i a l o g R e s u l t . OK;
3
•
Ponow nie wrócim y do głów nego okna aplikacji, aby napisać kod obsługi przyci sku Sprzedaż. p r iv a t e void S p rzed az_C lick(o b ject sender. C S p r z e d a z f r m K C e n n i k = new S p r z e d a z O ; f r m S p r z e d a z . ShowDi a 1 o g ( ) ; 3
•
S y s t e m . E v e n t A r g s e)
Projekt form ularza Sprzedaż m oże być następujący:
Rysunek 77. Form ularz Sprzedaż
•
Poszczególnym kontrolkom , w których będziem y um ieszczać dane, nadamy nazw y kojarzące się z ich przeznaczeniem .
•
W łaściw ość ReadO nly kontrolki Id ( typu TextBox) zm ienim y na True. D ane do niej będą w pisyw ane autom atycznie.
•
D w ie następne kontrolki (Firma i Towar) będą typu C om boBox (dane będziemy w ybierać z listy). Ich w łaściw ości Text m ogą być poleceniam i skierow anym i do użytkow nika.
Bazy danych •
193
K o n tro lk a z ilo ścią to w a ru b ę d z ie ty p u TextBox, a d a ta z a k u p u - ty p u D ateTim e-
Picker. A b y z a p isy w a ć d a n e d o ty c z ą c e sp rz ed a ży , m u sim y m ie ć ta b e lę (b a z ę d a n y c h ), k tó ra b ęd zie p rz y jm o w a ć te d ane. T y m raz em u tw o rz y m y b a zę ty p u SQ L Sewer. N a zw ie m y j ą „ E w id e n c ja sp rz e d a ż y ” . B ę d zie się sk ła d a ć z je d n e j ta b e li „ E w id e n c ja ” . D o tw o rz e n ia b a zy SQ L S ew er u ż y je m y S ew er Explorera. P o o tw a rc iu S ew er Explorera w y b ie rz e m y w ła sn y se rw e r (n a k tó ry m w c z e śn ie j z a in sta lo w a liśm y SQ L Sew er), a n a stęp n ie SQ L Sewers. P ra w y m p rz y c isk ie m m y sz y w sk aż em y w ła sn y se rw e r i z m enu k o n te k sto w e g o k lik n ie m y N ew D atabase. W o k n ie d ia lo g o w y m p o d a m y n a zw ę „ E w id e n c ja sp rz e d a ż y ” i z a tw ie rd z im y j ą (OK). •
R o z w in ie m y „ d rz e w k o ” n aszej b azy i k lik n ie m y p ra w y m p rz y c isk ie m m y sz y p o z y c ję Tables, a n a stęp n ie z m en u w y b ie rz e m y New Table.
•
Z b u d u je m y stru k tu rę tab e li, p o d a ją c w p ro je k c ie n a zw y k o lu m n , ty p y d a n y c h i d łu g o śc i pól (m o żn a z o sta w ić d o m y śln e). P o le ID z a z n a c z y m y ja k o p o le k lu c z o w e (Set Primary Key). 7 Por m i .cs [D esign] .
Form 1, cc ■K ltenacs [ D ^ g n ]
Column Name
D ata Type
Klienci. C5 1 C eny.c? [D esign]
ID
int
Length | Allow Nulls 4
%
[Id klienta] M [Id to w aru ] ii m :•---§ J j _ Ilość % v T [D a ta sprz] ;: i— N__
int
4
i
int
4
V
float datetim e
8
V
8
V
u
, m
1
✓
Rysunek 78. Projekt tabeli Ewidencja •
T a b e lę z a p isz e m y p o d n a zw ą „ E w id e n c ja ” . M o ż em y te ra z p o w ró c ić do fo rm u la rz a Spn ed a ż.
•
N a p o c z ą tk u k o d u , p o d istn ie jąc y m i d y re k ty w a m i using, d o d a m y je s z c z e n a s tę p u jące: using S y s te m .D a ta ; using S y s t e m .D a t a .0 1 e D b; using S y s te m .D a ta . S q l C l i e n t ;
•
P o o tw a rc iu fo rm u la rz a listy w y b o ru Com boBox p o w in n y z a w ie ra ć d a n e o d p o w ie d n io o a d re sa c h i to w a ra ch . P o le tek sto w e ID n a jle p ie j, a b y b y ło w y p e łn ia n e au to m aty czn ie. W tym celu o p ro g ram u jem y z d arzen ie Load fo rm u la rz a Sprzedaż. p r i v a t e v o i d S p r z e d a z _ L o a d ( o b j e c t s e n d e r, S y s t e m . EventArgs e) C / / o k r e ś l e n i e ś c i e ż k i d o s t ę p u do p l i k ó w
194
C# w praktyce / / (bieżący katalog - bin\debug)) s t r i n g ś c i e ż k a = Envi r o n m e n t . C u r r e n t D i r e c t o r y . S i i b s t r i n g ( 0 , Env i r o n m e n t . C u r r e n t D i r e c t o r y . L e n g t h - 9 ) ; //
W y p e ł n i e n i e ComboBox - a d r e s y f i r m
/ / d a ne d o s t a w c y - ł a ń c u c h p o ł ą c z e n i a s t r i n g strConn = " P r o v i d e r = M i c r o s o f t . J e t . OLEDB. 4 . 0 ; D a t a S o u r c e = " + ścieżka + "K 1ien ci.m d b ;"; / / o biekt nawiązujący połączenie 0 1 e D b C o n n e c t i o n conn = new 0 1 e D b C o n n e c t i o n ( s t r C o n n ) ; * # / / o b i e k t w y k o n u j ą c y z a p y t a n i e SQL OleDbCommand cmd = new 0 1 eDbCommand( ) ; / / t r e ś ć z a p y t a n i a SQL cmd. CommandText = "SELECT [ Nazwa f i r m y ]
FROM A d r e s y " ;
/ / u s t a w i e n i e t y p u p o l e c e n i a - z a p y t a n i e SQL c md. CommandType - C o m m a n d T y p e . T e x t ; / / wskazanie obiektu r e a liz u ją c e g o połączenie cmd. C o n n e c t i o n = c onn ; / / w y c z y s z c z e n i e e l e m e n t ó w ComboBox Fi r m a . I t e m s . C l e a r ( ) ; / / otwarcie-połączenia c o n n . Op e n ( ) ;
z danymi
/ / p r z e s ł a n i e z a p y t a n i a do o b i e k t u t y p u 0 1 e D b C o n n e c t i o n / / i utw orzenie o b ie k tu typu 0 1 eDbDataReader. / / c z y t a j ą c e g o k o l e j n e w i e r s z e że ź r ó d ł a danych 0 1 eDbDataReader r e a d e r l = cmd. ExecuteReader(CommandBehavi o r . C l oseConnecti o n ); / / pobieranie kolejnych w ierszy, / / d o p ó k i met oda R e a d O n i e z w r ó c i w hile ( r e a d e r l . Read())
"false”
C / / w s t a w i a n i e k o l e j n y c h w i e r s z y do ComboBox / / z indeksatora obiektu readerl Fi r m a . I t e m s . A d d ( r e a d e r l [ " N a z w a f i r m y " ] ) ;
}
Bazy danych
195
/ / W y p e ł n i e n i e ComboBox2 - C e n n i k s t r i n g strConn2 = " P r o v i d e r = M i c r o s o f t . J e t . OLEDB. 4 . 0 ; Da t a S o u r c e = " + ścieżka + "C e n n ik .x ls ;" +"Extended Properties=Excel 8 .0 " ; 0 1 e D b C o n n e c t i o n conn2 = new 0 1 e D b C o n n e c t i o n ( s t r C o n n 2 ) ; OleDbCommand cmd2 = new 0 1 eDbCommand( ) ; cmd2. CommandType = C o m m a n d T y p e . T e x t ; c m d 2 . CommandText = "SELECT [ N a z w a ] FROM [ c e n n i k $ ] " ; c md 2 . C o n n e c t i o n = c o n n 2 ; T o w a r .I t e m s . C l e a r ! ); conn2. 0 p e n ( ); 0 1 eDbDataReader reader2 = c m d 2 . E x e c u t e R e a d e r ( C o m m a n d B e h a v i o r . Cl o s e C o n n e c t i o n ) ; w hile ( rea d e r2 . Read()) C Towar. Ite m s .Add(reader2["Nazwa"] ) ; 3 //
Autonumeracja
ID
s t r i n g strConn3 = " I n i t i a l catalog=Ewidencja sprzedaży; in te g ra te d s e c u rity = S S P I" ; S q l C o n n e c t i o n conn3 = new S q l C o n n e c t i o n ( s t r C o n n 3 ) ; / / z a p y ta n ie z l i c z a j ą c e rekordy s t r i n g strSQL = " S e le c t C o u n t!*)
from Ewidencja";
conn3.O pen!); / / o b i e k t wykonujący z a p y t a n i e SqlCommand cmd3 = new S q l C o m m a n d ! s t r S Q L ,
conn3);
/ / wykonanie zapytania I d . T e x t = c md 3 . E x e c u t e S c a l a r ( ) . T o S t r i n g ( ) ;
/ / bieżąca data D a t a . V a l u e = DateTime.Now;
)
•
Zanim oprogram ujem y przycisk Zapisz, na projekt form ularza w staw im y SqlD ataA dapter (użyjem y kreatora) i utworzym y D ataSet (G enerate D ataSet...).
•
Teraz m ożem y napisać m etodę obsługi przycisku Zapisz. p r iv a t e void Z a p is z _ C lic k ( object sender, C
S y s t e m . EventArgs e)
C# w praktyce
196
/ / łańcuch połączenia s t r i n g strConn = " I n i t i a l catalog=Ewidencja sp rz e d a ży ;in te g ra te d s e c u rity = S S P I" ; S q l C o n n e c t i o n conn = new S q l C o n n e c t i o n ( s t r C o n n ) ; // //
Z a p i s d a n y c h - d o d a n i e w i e r s z y do " D a t a S e t ” N a l e ż y u ż y ć komponent ów: S q l D a t a A d a p t e r i D a t a S e t
try C / / otwarcie połączenia c o n n .0 p e n (); * # / / p o b r a n i e d a n y c h do D a t a S e t s q l D a t a A d a p t e r l . Fi 1 1 ( d a t a S e t 1 1 .
"Ew idencja");
/ / u t w o r z e n i e nowego w i e r s z a Dat aRow rowNew = d a t a S e t l l . T a b l e s [ " E w i d e n c j a " ] . Ne wRowi ) ; / / w y p e ł n i e n i e w i e r s z a danymi z f o r m u l a r z a rowNewC"Id"] = I d . T e x t ; r o w N e w f ' I d k l i e n t a " ] = Fi rma . Sel e c t e d l n d e x + 1: r o w N e w [ " I d t o w a r u " ] = T o w a r . S e l e c t e d l n d e x + 1: rowNewC"Ilość” ] = I l o s c . T e x t ; rowNew["Data s p r z " ] = D a t a . V a l u e . D a t e ; / / d o d a n i e w i e r s z a do k o l e k c j i da t a S e t 1 1 . T a b l e s C ' E w i d e n c j a " ] . Rows. A d d ( r o w N e w ) ; / / a k t u a l i z a c j a ź r ó d ł a danych sqlDataAdapterl.Update(dataSetll, / / zamknięcie połączenia conn. C l o s e ( );
} catch (E xception ex) C MessageBox.Show(ex.ToString() ) ; } D i a l o g R e s u l t = Di al ogRes u l t . OK;
)
"Ewidencja"):
Bazy danych
197
D a n e z fo rm u la rz a Sprzedaż m o że m y ró w n ie ż z a p isa ć w in n y sp o só b , b u d u ją c z nich o d p o w ie d n ią k w e re n d ę SQL - IN SE R T i w y k o n u ją c j ą p rz y u ż y c iu o b ie k tu
SąlC om m and (m eto d a: ExecuteNonQ ueiy). T a k a w e rsja m eto d y o b słu g i p rzy c isk u Zapisz m o że w y g lą d a ć n a stę p u ją c o : p r i v a t e void Z a p i s z _ C li c k ( o b je c t sender, System .EventArgs e) C / / łańcuch połączenia s t r i n g strConn = " I n i t i a l catalog=Ewidencja sprzedaży; in te g ra ted s e c u rity = S S P I" ; S q l C o n n e c t i o n conn = new S q l C o n n e c t i o n ( s t r C o n n ) ; //
I n n y s p o s ó b z a p i s u danych / / P r z y u ż y c i u o b i e k t u SqlCommand ( m e t o d a :
ExecuteNonQuery)
/ / t r e ś ć kwerendy d o p i s u j ą c e j s t r i n g strSQL = " In s e r t E w id e n c ja !Id . [ Id k l i e n t a ] , [ I d t o w a ru ], II ość, [Data s p r z ] ) " + "Values (" + I d . T e x t + + (F irm a .Selectedlndex + 1 ) .T o S t r in g ( ) + " , " + ( T o w a r . S e l e c t e d l n d e x + 1) . T o S t r i n g ( ) + " , " + I l o s c . T e x t + ", '" + D a ta.V a lu e.T o S trin g ("d ") + )"; / / Otwarcie połączenia conn.O p e n (); / / u t w o r z e n i e o b i e k tu wykonującego z a p y t a n i e SqlCommand cmd = new S q l C o m m a n d ( s t r S Q L , c o n n ) ; / / wykonanie zapytania c md. E x e c u t e N o n Q u e r y ! ) ; / / zamknięcie połączenia conn. C l o s e ( );
} •
N a g łó w n y m fo rm u la rz u p o z o stał n am je s z c z e p rz y c isk E w idencja. B ę d z ie on o tw ie ra ł fo rm u la rz p o z w ala ją cy p rz e g ląd a ć z a p isy w A dresach, C enniku i Sprze
daży. p r i v a t e void Ewidencja_Cl i c k ( o b je c t sender,
S ystem .EventArgs e)
C E w i d e n c j a f r m E w i d e n c j a = new E w i d e n c j a ! ) : f r mE wi d e n c j a . ShowDi al o g ( ) ;
]
198
C# w praktyce
S ^ o le D b D a ta A d a p te rl
oleDbConnectionl
^
sqlD ataA dapter 1
' Ę
sqtC om ectionl
^
dataSet31
Rysunek 79. Form ularz Ewidencja •
K o m p o n e n ty b a z o d a n o w e u m ie śc im y n a p a le cie fo rm u la rz a , k o rz y sta ją c z k re a to ra u ru c h a m ia n e g o w ra z z d o d a n ie m O leD bD ataAdapter (d la b azy K lienci.m db ) o ra z sqlD ataA dapter (d la b azy ty p u S Q L S e iv e r - Ewidencja sprzedaży).
•
K o n fig u ru ją c o b ie k t D ataSet31 ( Generate D a ta set...) - z a z n a c z y m y o b y d w ie b azy .
•
O p ro g ra m u je m y z d a rz e n ie L oad fo rm u la rz a Ewidencja. p r i v a t e void Ew idencja_L oad(object sender. C
Sys te m . EventArgs e)
o l e D b D a t a A d a p t e r l . Fi 1 1 ( d a t a S e t 3 1 . " A d r e s y " ) ; s q l D a t a A d a p t e r 1 . Fi 11 ( d a t a S e t 3 1 . "Ewi d e n c j a " ) ; d a t a S e t 3 1 . Re a d Xml Sc he ma ( s c i e z k a + " c e n n i k . x s d " ) ; d a t a S e t 3 1 . ReadXml( ś c i e ż k a + " c e n n i k . x m l" ) ; / / D a t a C o l u mn / / dataColumnl / / D a t a C o l u mn //dataColumn2
d a t a C o l u m n l = new D a t a C o l u m n ( " I D k l i e n t a " ) ; = d a t a S e t 3 1 . T a b l e s C " A d r e s y " ] . Co1 u m n s [ " I D k l i e n t a ” ] ; d a t a C o l u m n 2 = new D a t a C o l u m n ( " ID k l i e n t a " ) ; =dataSet31.Tables["Ewidencja"].Columns["ID k lie n ta " ];
try C //
d a ta S e t3 1 . R e ia tio n s .A d d ("Z a k u p y ", dataColumnl. dataColumn2); d a t a G r i d l . DataSource = d ataS et31;
} c a t c h ( E x c e p t i o n ex)
Bazy danych
199
C Mess ageBox. ShowCex. ToSt r i ng ( )) ; ) 3 W ie rsz e o p a trz o n e zn ak a m i k o m e n ta rz a tw o rz ą re la c ję m ię d z y ta b e la m i A d re sy i E w id e n c ja . N ie są p o trze b n e, je ż e li rela cję u tw o rz y m y w try b ie in te ra k ty w n y m . •
R e la cję , p o z a k o d e m p ro g ram u (nie p isząc g o ), m o ż e m y u tw o rz y ć , w y b ie ra ją c z S o lu tio n E xplorera p lik D a ta S e t3 .x sd (p o d w ó jn y m k lik n ię c ie m m y sz y ).
•
W sk a ż e m y pole I d k lie n ta w tab eli A d re sy i p rz e c ią g n ie m y m y sz ą d o ta b e li E w id e n c ja na p o le I d klien ta . W o tw a rty m a u to m a ty c z n ie o k n ie d ia lo g o w y m w p isz e m y n azw ę rela cji, np. Z a k u p y o raz sp ra w d z a m y n a zw y tab e l i p ó l tw o r z ą cy ch re la c ję {Id klièn ta ). E d y c ję rela cji k o ń c z y m y p rz y c isk ie m O K . Edit Relation pakupy
Nam e:
To define a relationship (k e y re f), select the parent elem ent and key, select th e child elem ent, an d then select th e child field corresponding to each parent fie ld .
P arent elem ent:
Child elem ent:
I A dresy
3
▼[ [Ew idencja
Key: C onstraint!
New
Fields: K ey Fields
; Foreign Key Fields
Id_x0020_kJienta
Id _ x0 020 _k lien ta
:W
, ‘ 1
;%\;::. : ;f
: ;;VjjH;; i y ; . ; ;
" /.S
D a ta s e t Properties r
, ,, 'S y '- 'f t/? /
.......................
C re a te foreign key constraint only
U p d ate rule: [(D e fa u lt)"
A ccept/R eject rule:
D elete rule: ‘
jJ
{(D efault)
OK
Rysunek 80. Edycja relacji
[(D efau lt)
Cancel
Help
200
C# w praktyce
r S - d a n g a ' ” ¡(Ewidencja) int ? E ID E Id klienta
int
E Id tow aru
int
E Ilość
double
E D a ta s p rz
dateTim e
~r
Q Q p V d re s y ę E Id klienta
▲
((Adresy) int
E N azw a firmy
string
E Adres
string
E NIP
string
n
W
--- ;
.1 i
»i
; « r •
* *
.•ł; t
/ .
Rysunek 81. Schemat relacji
K ontrolka typu D ataG ńd, na form ularzu Ewidencja, przedstaw ia trzy tabele: Adresy, Ew idencja i Cennik. Dwie z nich zostały połączone relacją. W górnym pra wym narożniku tej kontrolki znajduje się nawigator pozw alający poruszać się po poszczególnych tabelach i korzystać z dobrodziejstw relacji.
Rysunek 82. Nawigacja w DataGrid
Bazy danych w środow isku .N ET to zagadnienie złożone. M ożna jednak w prosty sposób za jego pom ocą korzystać z różnych typów baz danych, przeglądając je, m ody fikując i tw orząc nowe.
13. Aplikacje WWW
W spółcześnie coraz więcej aplikacji jest urucham ianych w przeglądarkach inter netowych. G łów nym powodem jest oczyw iście korzystanie z rozproszonych zasobów sieciowych. Przeglądarki internetow e stają się uniw ersalną platform ą uruchom ie niową. Tw orzenie interfejsów opartych na takich założeniach jak w środow isku .N E T jest równie łatw e jak projektow anie aplikacji W indows Form. A plikacje sieciowe, czyli oparte na stronach W W W , różnią się od aplikacji tra dycyjnych. Przede wszystkim muszą korzystać z Internetu bądź intranetu, chociaż dostęp nie musi być ciągły. Program ista powinien przew idzieć m ożliw ość chw ilow ego braku dostępu do zasobów sieciowych. Poza tym dużo w iększą rolę odgryw ają spraw y bezpieczeństw a serwera w sieci. Przeglądarki internetow e interpretują kod HTM L. Szkielet aplikacji sieciow ej bę dzie więc (przynajm niej w części wysyłanej na kom puter klienta) kodem typu HTM L. A plikacja WWW jest um ieszczana na serwerze sieciowym. W iele zadań takiej aplika cji jest w ykonyw anych na serwerze (nie zawsze). Serw er sieciow y, odpow iadając na żądanie klienta, przekazuje przeglądarce odpow iedni kod. Aby tw orzyć i testow ać aplikacje WWW, należy zainstalow ać oprogram ow anie serwera. Nie jest konieczne połączenie z siecią. W W indows, począw szy od w ersji N T poprzez 2000 i XP , m ożem y zainstalow ać Internetowe Usługi Inform acyjne (IIS Internet Inform ation Services). Przed przystąpieniem do projektow ania aplikacji W W W należy spraw dzić, czy w kom puterze je st zainstalow ane odpow iednie oprogram owanie. i
N iezbędne są następujące składniki: •
Internet Information Sendees,
•
Front P age 2000 Server Extensions,
•
biblioteki obiektow e A SP .NET i inne, np. .ADO .NET.
Z bibliotekam i obiektowym i zwykle nie ma problem ów. W szystkie są dostępne po zainstalow aniu Visual Studio .NET. Różnie byw a z pozostałym i elem entam i. P od czas instalacji VS .NET otrzym ujem y inform ację, czy potrzebne rozszerzenia zostały zainstalow ane. O program owanie M icrosoft W indows C om ponent U pdate (składnik pakietu instalacyjnego) analizuje system i inform uje o takiej potrzebie. Przy jego pom ocy m ożna doinstalow ać Front Page Server Extensions.
202
C# w praktyce
Internetow e Usługi Informacyjne pow inniśm y zainstalow ać przed instalacją Vi sual Studio .NET. M ożem y to zrobić z Panelu Sterowania W indows, w ybierając D odaj lub usuń programy, a następnie D odaj/U suń składniki system u Windows. W oknie kreatora składników systemu W indows zaznaczam y odpow iednią pozycję (IIS) i za tw ierdzam y całość przyciskiem Dalej.
S k ła d n ik i sy stem u W indow s Możesz dodać lub usunąć skła d n iki systemu W in d o w s XP.
A by dodać lub usunąć s kła d n ik , kliknij to pole wyboru. Pole zacieniow ane oznacza, ze tylko część s kła d n ik a będzie zainstalowana. A b y zobaczyć, co zawiera dany skła d n ik, kliknij przycisk Szczegóły. S kładniki: 0,0 MB
8 ^ I n t e r n e t Explorer 0
Internetow e usługi informacyjne (IIS)
□
Kolejkow anie wiadom ości
0.0 MB
i i ^ N a r z ę d z ia 7ar7arbania i monitorowania ....................i s m Opis: Zaw iera rozmaite specjalistyczne usługi i p rotokoły związane z siecią.
M iejsce dostępne na dysku:
:
i
12.5 MB
0 ^ M S N Explorer
W ym agane miejsce na dysku razem:
a
15.7 MB
0,0 MB
S z c z e g ó ły ..
28378,3 MB
< W stecz
v
Dalej >
Anuluj
R ysunek 83. Instalacja Internetowych Usług Informacyjnych
W przypadku gdy IIS doinstalow aliśm y ju ż po instalacji VS.NET, należy napra wić bibliotekę .N E T Framework. W tym celu trzeba umieścić CD z W indows Component Update w napędzie, wybrać polecenie U ruchom ... i wpisać następującą komendę: E :\dotN etFram ew ork\dotnetfx.exe lt:c:\tem p Je:”m siexec.exe /fvecm s c:\tem p\netfx.m si”. (gdzie E : - przykładow a nazw a napędu) Potw ierdzić wpis (OK) i dalej wyrazić zgodę na instalację pakietu .NET Fram e work. W przypadku wadliwej instalacji, potrzebnych do tw orzenia aplikacji W W W składników , m ożem y nie uzyskać połączenia z serwerem lub też form ularz Web Form będzie działał niepraw idłow o (np. po uruchom ieniu aplikacji na form ularzu brak niektórych kontrolek serw erow ych). A plikacje W W W korzystają z biblioteki ASP .NET (A ctive Server Page). Jest to unow ocześniona w ersja wcześniejszej biblioteki obiektowej ASP. Jej cechą charakte
Aplikacje W W W
203
rystyczną są kontrolki serwerowe, które działając po stronie serw era w odpow iedzi na żądanie użytkow nika, tw orzą odpow iedni kod H TM L. Inną zaletą A SP .N E T jest korzystanie z języków kom pilow anych (C#, Visual Basic), zam iast interpretow anych języków skryptow ych. Znacznie to popraw ia funkcjonalność aplikacji.
Ćwiczenie 56. Aplikacja ASP .NET U tw orzym y aplikację, w yśw ietlającą kom unikat w przeglądarce internetow ej. •
Po uruchom ieniu Visual Studio .NET w ybierzem y projekt A SP .N E T W eb A p p li cation.
•
W polu Location wpiszemy nazwę projektu: http://localhost/Cw56 - P ie w szy ASPx. Ścieżkę dostępu pozostawimy bez zmian. Prowadzi ona do lokalnego serw e ra W W W . Fizycznie projekt znajdzie się w folderze C:\Inetpub\wwwroot\Cw56 Pierwszy ASPx. Każdy projekt aplikacji W W W należy umieszczać w folderze wwwroot. s
9
•
Po otw arciu projektu form ularza W ebForm I .aspx m ożem y przystąpić do jeg o budowy. Jeżeli projekt nie zostanie otwarty, należy spraw dzić instalację IIS.
•
W oknie Solution Explorer zm ienim y nazwę projektu formularza. Praw ym p rzy ciskiem m yszy w ybierzem y menu kontekstow e i klikniem y Rename. M ożna też usunąć istniejący form ularz i utw orzyć nowy, nadając mu swoją nazwę.
•
Z przybornika Toolbox, z grupy W eb F onns w ybierzem y etykietę i um ieścim y ją na projekcie. W staw ienie własnego tekstu, zm iana stylu czcionki, koloru i innych atrybutów jest podobna jak w przypadku kontrolek W indows Forms.
•
W skazując prawym przyciskiem myszy projekt form ularza, m ożem y z m enu kontekstow ego w ybrać B uild S ty le... . U ruchom iony Style Builder pozw oli nam w w ygodny sposób ustalić czcionkę, tło, w yrów napie i inne atrybuty dom yślne dla w szystkich elem entów na formularzu.
•
Zapiszem y go przed uruchom ieniem form ularza.
•
Aby zobaczyć utw orzoną stronę w Visual Studio .NET, w ybierzem y m enu F ile i dalej View in Browser lub Ctrl + E8. Z podglądu m ożem y skopiow ać adres URL tej strony. Prawym przyciskiem m yszy klikniem y pole tekstow e U R L na pasku narzędzi i wybierzem y Copy.
C# w praktyce
204
Font
Font narne
Family:
5 = Text • System Pont: =
3
I Dialog te x t
* □ Position Font attribu tes
Layout
Color:
Small caps:
Italics:
0 3 Edges j Blue
•r l-*sts
3 3
-
!
r
Effects
Sjze
O ther
3
(* cl;
:
F
None
r ~ Underline
^ Ąhsoiłitft;
3
Reistivb:
P
Strikethrough
P
Overline
Capitalization:
BSId
<* Absou^è:
3
r
3
3
Rysunek 84. Tw orzenie stylu form ularza
Cw56 - PieiwszyASPx - Microsoft Visual C#■♦NET[design] * Br File
Edit
i|jp ^
View ’
Project
O? 0 £P
© tSJ *
Build
t S
Debug
Tools
Window " x
S
Start Page ! Pierwszy-asp>
l
i"
Help ► Debug
http ://to calh o st/C w 56% 20-°A2Q Picrw szyA :
Brow>se se - W ebFornJdSp
I I
(M oj pierwszy form ufarz ASP R ysunek 85. Podgląd strony S p ra w d z im y w y g lą d a p lik a c ji w p rz e g lą d a rc e in te rn eto w e j. S k o p io w a n y adres w k le im y d o p o la a d re su p rze g lą d a rk i i p o tw ie rd z im y k la w isz e m E nter. P rz e g lą d a rk ę in te rn e to w ą z u tw o rz o n y m d o k u m e n te m m o że m y u ru c h a m ia ć ró w n ie ż ze śro d o w isk a V S .N E T - k la w isz e m F 5 (lu b C T R L + F 5).
Aplikacje W W W
205
11WebForml Plik
Edycja
- Program Microsoft Internet Explorer dostarczony przez W idok
O **« Adres
Ulubione
©
S
Narzędzia
Pomoc
iźl €Ł >
© ^ bi°ne ^
h ttp : / /lo calhost/C w 56% 20-% 20P ierw szyA 5P x/P ierw szy. aspx
Moj pierwszy formularz MS(P Rysunek 86. Strona w przeglądarce
•
Kod źródłow y H T M L naszej strony m ożem y zobaczyć, zmieniając w idok D e s ig n na H T M L ( u dołu projektu formularza). W widoku H T M L m ożna „ręcznie” inge rować w kod. Potrzebna jest jednak znajom ość języka H T M L .
U tw orzenie tak prostego projektu nie wymagało pisania kodu C#. D opiero ob sługa form ularza (przetw arzanie danych) będzie związana z programowaniem.
Ćwiczenie 57. Kalkulator euro U tw orzym y kalkulator walutowy, przeliczający euro na złotówki w edług p o d a nego kursu. Będzie to aplikacja W W W , w ykorzystująca formularz ASP .NET. •
Po uruchom ieniu V isual S tu d io .N E T wybierzem y projekt A S P .N E T W eb A p p li ca tio n .
•
W polu L o c a tio n wpiszemy nazw ę projektu: h ttp :lllo ca lh o stlC w 5 7 - K a lku la to r.
•
Z przybornika T o o lb o x , z grupy W eb F o rm s wybierzemy potrzebne kontrolki: etykiety, pola tekstowe i przycisk. W oknie P roperties ustawimy dla nich odpo w iednie właściwości: nazwy, wielkości, rodzaje i kolory czcionek.
“ “ W ...............................;
-su.................................... —
- A. —
k u rs :
..i—
;
;
;
;
;
;
;
;
;
; ®
::::::::::
Oblicz
IB * zł flvöUHUiikat]
Rysunek 87. Projekt kalkulatora €
A plikacje A SP .NET m ogą korzystać z dw óch rodzajów kontrolek: W eb F o rm s (są to kontrolki serwera) i kontrolek H T M L . Zw ykle należy korzystać z tych pierw
C# w praktyce
206
szych (gdy tw orzym y aplikację od początku). Kontrolki H T M L zostały opracow ane dla starszej architektury A S P . Dzięki nim łatw iej przenieść istniejące projekty A S P do A S P .N E T .
K ontrolki W eb F o rm s są bardzo podobne do kontrolek W in d o w s. Istnieją drobne różnice np. zam iast w łaściw ości N a m e mamy tu właściwość ID . U żytkow nik kontro lek W in d o w s łatw o przyzw yczai się do używ ania kontrolek W eb F orm s. •
O program ujem y przycisk Oblicz'. p r i v a t e void B u t t o n l _ C li c k ( object sender. C try
S y s t e m . E v e n t A r g s e)
C z l o t y . Text = (D ouble. P arse(euro.T e x t)*Double. Parse( kurs.T e x t)) Komun i k a t . T e x t =
. T o S t r i n g ( );
3
c a t c h ( E x c e p t i on) C K o m u n i k a t . T e x t = " N i e p r a w i d ł o w e dane!
Popraw!":
3 3
Ćwiczenie 58. Dostęp do bazx danych z aplikacji WWW C zęsto używ am y baz danych, łącząc się z nimi za pośrednictw em Internetu. K o rzystając z technologii ASP .NET i ADO .NET, możemy w stosunkowo prosty sposób zbudow ać aplikację zapew niającą taki dostęp do zdalnej bazy. •
W ybierzem y nowy projekt A S P .N E T W e b A p p lic a tio n .
•
W polu L o c a tio n w piszem y nazwę projektu: h ttp ://lo c a lh o st/C w 5 8 - A d resy.
•
Z przybornika T o o lb o x , z grupy W eb F o rm s w ybierzem y kontrolkę D a ta G r id w niej um ieścim y tabelę bazy.
•
Z m ienim y nazw ę dom yślną kontrolki na d ataG ridA dresy.
•
K likniem y, praw ym przyciskiem m yszy, na kontrolce D a ta G rid i w ybierzem y A u to F o rm a t.
N arzędzie to służy do w ygodnego form atow ania wyglądu kontrolki.
Aplikacje W W W
207
Select a scheme: Rem ove A uto Format Colorful 1 Colorful Z Colorful 3 Colorful 4 Colorful 5 Professional 1 Professional 2 Professional 3 Simple i Simple 2 Simple 3 Classic 1
Preview : a
;:
f m
Column 1
Column 2 ####
. : V' - -v. ,V; ####
1
OK
Cancel
Help -----Hę-
Rysunek 88. Formatowanie kontrolki DataGrid
•
W ybierzem y jeden ze schem atów form atow ania, np. C o lo rfu l 2.
•
Z przybornika, z grupy D a ta wstawimy na paletę projektu form ularza kom ponent SqlD ataAdapter.
•
A utom atycznie uruchom i się kreator D ata A dapter C o n fig u ra tio n W izard.
•
O dpow iadając na pytanie kreatora: „ W h ich d a ta c o n n e c tio n s h o u ld th e d a ta a d a p te r u s e ? ” - w skażem y wcześniej otw artą w S e rve r E xp lo re rze bazę N o rth w in d {n a zw a servera.dbo).
•
Zapytanie S Q L , dotyczące wyboru rekordów z tabeli, m ożem y napisać sami: S E L E C T * F R O M C u sto m ers lub skorzystać z Q uery B u ild era .
•
Zostanie rów nież w ygenerow any kom ponent typu S ą lC o n n e c tio n . N azw y d o m yślne m ożem y pozostaw ić bez zmian.
•
W staw im y jeszcze kom ponent D a ta S e t. T ym razem zaznaczym y „beztypow y” kom ponent ( U n ty p e d d a ta set).
•
W łaściw ość D a ta S o u rc e kontrolki d a ta G rid A d re sy ustaw im y na d a t a S e t l .
•
Aby otw orzyć edytor kodu, prawym przyciskiem m yszy klikniem y w W eb F o r m l.a s p x i wybierzem y V ie w C ode.
•
W ykorzystam y m etodę obsługi zdarzenia P a g e _ L o a d (jej szkielet ju ż istnieje). p r i v a t e v o i d P a g e _ L o a d ( o b j e c t s e n d e r. S y s t e m . EventArgs e) C / / s p r a w d z e n i e , czy f o r m u l a r z j e s t w y ś w i e t l a n y p i e r w s z y r a z . / / t e ż b y ł j u ż o d s y ł a n y do s e r w e r a i f ( ! IsPostBack) C
//
otwarcie połączenia
C# w praktyce
20 8 sqlConnecti o n i .O p e n ( ); / / p o b r a n i e da ny c h s q l D a t a A d a p t e r l . Fi 1 1 ( d a t a S e t l ) ; / / w y ś w i e t l e n i e d a ny c h w D a t a G r i d dataG ri dAdresy. D a t a B in d ( ); / / zamknięcie połączenia s q lC o n n e c tio n i.C lo s e ();
) 3
3 W c b l o rm 1 Pik
Edycja
C #
P ro g ra m M ic ro s o ft In te rn e t Ix p lo r e r d o s ta rc z o n y p rz e z ID G .pl Wklok
Ulubione id
Narzędzie id
- 'f i
Pomoc
S
,!w'rszukai ^
Ulubione
^
Multmeda
4 0
£ rj¡* • -
r AJ m.*. jig ] http://locahost/Cvy58%20*%20Adrwy/WebFormt.4Spx C ustom erlD CompanyNarae ContactName ContactTitle
f t <9 y Region PostaJCode Country
Address
030. 0074 321
ÁLFK1
Alfreds Futteikiste
ÁNÁTR
Ana Trujillo Emparedados y Ana Trujillo heiados
Owner
Âvda de la Constitución 2222
México D.F
05021
Mexico
antom
Antonio Moreno Antonio Taquería Moreno
Owner
Mataderos 2312
México D F.
05023
Mexico
(5) 5553932
ÁP.OUT
Around the Horn Thorn a? Hardy
Sales Representative
120 Hanover Są
London
WA1 1DP
U.K
( H l ) 5557788
BSRGS
Berglunds snábbkcp
Chrisbna Berglimd
Order
Berguvsvàgen 3
Lulea
S-958 22
Sweden
092Î -12 34 65
BLAUS
Biauer Sec Dehkatessen
Hanna Moos s.
Sales Representative
Försters?!. 57
Mannheim
68306
Germany
062108460
BLO N P
Blondesddsl pere et fils
Frédénque Cite aux
Marketing Manager
24. place Klèber
Strasbourg
67Ú00
France
88.60 15 31
BOLID
Bólido Comidas Martín Sommer Owner preparadas
28023
Spain
(911 555 22 82
M ana Anders
Sales Representative
Obere Str. 57
Berlin
12209
Germany
Adm inistrator
C/ Araquil. 67 M adnd
< 5 )5 3 5 -
4729
Rysunek 89. Tabela bazy danych na stronie W W W
A plikacje W W W korzystające z baz danych mogą być bardzo rozbudowane. M ogą stosow ać różne, naw et bardzo złożone zapytania SQL. M ogą pobierać różno rodne dane od klientów. Zwykle też bazy danych są chronione loginami i hasłami dostępu. A SP .NET posiada odpow iednie m echanizm y pozw alające na taką ochronę. W arto zajrzeć do pliku W eb.config i go przeanalizow ać.
14. Usługi Web Services
P ro g ra m o w a n ie o b ie k to w e u m o ż liw iło e fe k ty w n y p o d z ia ł z ad a ń w g ru p ie p r o g ra m istó w . P ro je k t p ro g ra m isty c z n y b y ł je d n a k ż e , w e fe k cie k o ń c o w y m , tw o rz o n y w je d n y m m ie jsc u , n a je d n e j m aszy n ie. O b e cn ie , w c z a sac h sz y b k ie g o ro z w o ju In te r n e tu , m o ż liw e sta ło się ró w n ie ż u m ie sz cz an ie p o sz c z e g ó ln y c h e le m e n tó w p ro je k tu na ró ż n y c h se rw e ra c h , c zy li rea liz o w a n ie p rz e tw a rz a n ia (p ro g ra m o w a n ia ) ro z p ro s z o n e g o . U słu g i W eb Services u m o żliw iają p ro je k to w a n ie , b u d o w a n ie i te sto w a n ie k o m p o n e n tó w (m eto d ), k tó re m o żn a u d o stę p n ić w In te rn e c ie o ra z in te g ro w a ć w ię k sz e a p lik a c je . U słu g a Web Services je s t m e to d ą d o stę p n ą z d a ln ie , w której d an e p rz e c h o w u je się w fo rm a c ie X M L , p rz e k a z u je p rzy u ż y ciu p ro to k o łu HTTP.
Ćwiczenie 59. Tworzymy i wykorzystujemy usłuze WebServices U tw o rz y m y m eto d ę sie c io w ą ( Web M ethod), k tó rą n a stęp n ie w y k o rz y sta m y w sw o im p ro jek c ie . •
W y b ie rz e m y n o w y p ro jek t, k o rz y sta ją c z sz a b lo n u ASP. N E T W ebService.
•
Z m ie n im y n azw ę p ro jek tu , w p isu ją c w polu Location w ła sn ą n a zw ę A nalizaTek-
stu z a m ia st d o m y śln ej - Web S ervicel. •
P ra w y m p rz y c isk ie m m y szy w y b ie rz e m y p lik Service 1 .a sn u i k lik n ie m y View
Code, o tw ie ra ją c o k n o e d y cji kodu. •
W sz k ie le c ie d e fin ic ji k lasy Service 1 u su n ie m y w ie rsz e z k o m e n ta rz a m i p rz y k ła d u H elloW orld i z d e fin iu je m y w ła sn ą m e to d ę sie cio w ą : [ We b M e t h o d ] / / a t r y b u t me t o dy s i e c i o w e j p u b l i c s t r i n g Anal i z a T e k s t u ( s t r i n g t e k s t ) C string lin ia = foreach (char c in t e k s t) C l i n i a += c + " - "; if
(C har.IsD igit(c)) l i n i a += " c y fra d z ie s ię t n a else i f (Char. Isllpp er(c)) l i n i a += "duża l i t e r a else i f (Char. IsLow er(c))
";
C# w praktyce
210 l i n i a + = " ma ł a 1 i t é r a " ; else i f (C har. Is P u n c tu a tio n (c )) l i n i a += "znak i n t e r p u n k c y j n y "; else i f (Char. IsW hiteSpace(c)) l i n i a += "odstęp else i f (C har. IsSym bol(c)) l i n i a + = " symbol " ; e l se l i n i a += " i n n y znak "; return U n i a ;
} W sz y stk ie m e to d y e k sp o n o w a n e p rze z W e b S e ty ic e m u sz ą b y ć o z n a c z o n e a try b u te m W eb M e th o d . •
P rz ed d e fin ic ją k la sy d o d a m y atry b u t w sk a z u ją c y opis i p rz e strz e ń n a zw , słu ż ąc y d o id e n ty fik a c ji u sługi: [WebService (D e s c rip tio n = " U s ł u g a s i e c i o w a , z w r a c a j ą c a a n a l i z ę poda ne go ł a ń c u c h a z n a k ó w " , Namespace = " h t t p : / t e m p u r i . o r g / " ) ] p u b l i c c la s s S e r v i c e l : System.Web. Servi c e s . WebService C
3 •
N o w o z d e fin io w a n ą u słu g ę m o że m y p rz e te sto w a ć n a w et b ez p ro g ram u u ż y tk o w e g o . N a c iśn ie m y k la w isz F 5, aby ją sk o m p ilo w a ć i u ru ch o m ić. W w y n ik u u ru c h o m ie n ia u słu g i o trz y m a m y stro n ę W W W z o d sy ła c z e m d o m e to d y sie c io w e j, a ta k ż e z n a z w ą k lasy i o p ise m . 3 Servicel Web Service Program Microsoft Internet Explorer dostarczony przez IDG.pl Plik
Edycja
Widok
J
Ulubione
Narzędzia
L*î ¡"O
Pomoc
*'■■■ y
Wsaika)
V Ulubione
^ M u lt im e d ia
0 :
'
#
Adr&?; ;f g j h ttp ://bcalhost/AnafizaTekstu/Ser vice 1. asmx
Servicel VILCX U s łu g a s ie c io w a , z w ra c a ją c a a n a liz ę p o d a n e g o ła ń c u c h a ¿ n aków T h e fo llo w in g o p e ra tio n s a re s u p p o rte d . For a fo rm a l d e fin itio n , ple a se re v ie w th e S e r v ic e D e s c r i p t i o n .
■ Ś ] G o to
we
Rysunek 90. Przykład usługi Web Service •
K lik n ie m y o d sy ła c z A n a liza te k s tu , ab y sp ra w d z ić m eto d ę siecio w ą.
211
Usługi W eb Services d Service1 Web Service - Program Microsoft Internet Explorer dostarczony przez IDG.pl Plik ©
E dycja
W idok
W stecz
Ulubione
*
1 3
Narzędzia B ]
Pomoc
; ł
:'|£
W yszukał
^U U H one
Mutomedia
0
’
Adnas 4 f | h ttp ://lo ca lh o st/A n e łiza T e kstu /S e rvice l .asm x?op-A nalizaTekstu
fT 3 v
’
Przejdź
là fiz à
C lic k feajĆR f o r a c o m p le te lis t o f o p e ra tio n s .
A n a l iz a T e k s t u T e st To te s t th e o p e ra tio n u sing th e HTTP GET p ro to c o l, click th e 'In v o k e * b u tto n . P a ra m e te r
V alue
te k s t:
D c?
W eb u5| In v o k e
i Gotowe
...... ........ .
*
Lokalny intranet
Rysunek 91. Przykład metody sieciowej •
W p isz e m y p rz y k ła d o w y te k st i w y w o ła m y m e to d ę p rz y c isk ie m In v o k e . O trz y m a m y w y n ik i z w ró c o n e p rze z m e to d ę sie cio w ą . M, } h tlp .7 /lo c d !h o s !/ A n a liz a le k s tu /S e m c c 1 .a $ m x M n a liz ö r e k s tu ? te k s t =Dc?< W e b + ... ! » Płk
Edycja
Widok
Ulubione
Narzędzia
Pomoc
,
» »
j* | Ackes
[g?|
;: | ¡
.• : Wyszukaj
^ U lu b io n e
^ M u lt im e d ia
http://localhost/AnalizaTekstu/Servicel.asmx/AnalizaTekstu?tekst«Dc%3F+Wc V
Ë l Przejdź
< ? x m l v e r s io n = " 1 . 0 M e n c o d i n g ^ 'u t f - B " ? >
!
< s t n n g x m l n s = " h t t p : / t e m p u r i . o r g / " > D - d u ż a lite ra c - m a ła lite ra ? -
z n a k in te r p u n k c y jn y - o d s t ę p W - d u ż a lite ra e - m a ła lit e ra b - m a ła lite ra - o d s tę p u - m a ła lite ra 5 - c y fra dziesiętna< /string> » Gotowe
* *
J
Lokalny intranet
Rysunek 92. Przykładowe wyniki, zwrócone przez metodę sieciową •
W y k o n u ją c ten p rzy k ła d , z w ró ćm y u w a g ę na n ie k tó re sz cz e g ó ły te c h n ic z n e : o
S O A P (S im p le O b je c t A c c e s s P ro to co l) - p ro to k ó ł u ż y w a n y w celu w y s y ła n ia żąd a ń do usłu g W e b S erv ice s o raz o d b ie ra n ia o d p o w ie d z i,
o
W S D L (W eb S ervice D e fin itio n L a n g u a g e ) - d e fin iu je in te rfe js i z a c h o w a n ie u słu g i.
P rz y k ła d o w e k o d y ty ch p ro to k o łó w m o że m y z n a le ź ć n a stro n ie te stu n a sz e g o ć w icz en ia. •
U tw o rz o n ą i p rz e te sto w a n ą m eto d ę sie cio w ą w y k o rz y sta m y w in n ej a p lik ac ji. W ty m c e lu u tw o rz y m y n o w y p ro jek t ty p u W in d o w s A p p lic a tio n i n a z w ie m y g o C w 5 9 -W e h M e th o d T e s t.
212
C# w praktyce ® i
A naliza te kstu*źi •fififWs. I
EBB
I
r u u a j ł>La|i lUK&L i
•- ••••
i i i : : : : : : : : : : : : : .
;• •
i•
::: ■■■ -
f
.............
......................................
• •.. • t ; •
•• •• •; •*
Anałizuj ........... .........
* Rysunek 93. Aplikacja W ebM ethodTest
•
i
A b y o d w o ła ć się do u słu g i sie cio w e j, m u sim y u tw o rzy ć do niej o d n ie sie n ie . K lik a ją c p ra w y m p rz y c isk ie m m y szy n a z w ę p ro jek tu , w y b ie rz e m y A d d W eb R efe r e n c e .
•
W p o le a d re su w p isz e m y U R L n aszej usłu g i: h ttp :lllo c a lh o s tlA n a liz a T e k s tu lS e r v ic e l.a s m x
•
O tw a rtą stro n ę p o tw ie rd z im y p rz y c isk ie m A d d R eferen ce. Add W eb R eference o
=t>
El
Address:
Available references:
Web Services •^1 http://localhost/AnalizaTekstu/Servicel .asmx?wsdl
U sługa sieciow a , z w ra c a ją c a an alizę po dane go łańcucha znaków
Vfrw.Cpntiflrt
vi Th e fo llo w in g o p e ra tio n s are su p p o rte d . For a fo rm a l d e fin itio n , plea se re v ie w th e •
> Add Reference
R ysunek 94. Dodawanie referencji sieciowej
|
Cancel
Help
Usługi W eb Services •
213
O p ro g ra m u je m y p rz y c isk A n a lizu j: p r i v a t e v oid b u t t o n l _ C l i c k ( o b j e c t s e n d e r. S y s t e m . EventArgs e) C l o c a l h o s t . S e r v i c e l o b j S e r v i c e l = new 1 o c a l h o s t . S e r v i c e l ( ) ; t e x t B o x 2 . T e x t = o b j S e r v i c e l . Anal i z a T e k s t i K t e x t B o x l . T e x t ) ; 3
Ćwiczenie 60. Korzystamy z metod sieciowych i baz danych U tw orzym y m etodę sieciową, odczytującą z bazy danych N orthw ind (przykłado wa baza z pakietu VS .NET - opis instalacji w rozdziale 12.3) cenę podanego produk tu. U zupełniając dane ilością produktu - otrzym am y w artość zakupu. Program kliencki będzie pobierał nazwę produktu (najlepiej z listy wyboru) i ilość. Następnie będzie w yw oływ ał metodę sieciow ą i drukow ał wyniki przez nią zw racane. •
W ybierzem y nowy projekt, korzystając z szablonu ASP. N E T W ebService.
•
W piszem y w łasną nazwę projektu - W artoscW ebService.
•
Zm ienim y nazwę pliku Service 1 .asmx na: W artoscSeiyice.asm x.
•
W skażemy ten plik prawym przyciskiem m yszy i klikniem y View Code - otw ie rając okno edycji kodu.
•
W szkielecie definicji klasy S eiyicel zm ienim y jej nazwę na: W artoscSeiyice,
usuniemy wiersze z kom entarzam i przykładu H elłoW orld i zdefiniujem y w łasną metodę sieciową: [ We bMe t hod] p u b l i c decimal W a r t o ś c i s t r i n g nazwaTowaru,
in t ilosc)
c S q l C o n n e c t i o n conn = new S q l C o n n e c t i o n ( " d a t a s o u r c e = mm ; i n i t i a l c a t a l o g = N o r t h w i n d ; i n t e g r a t e d security=SSPI¡persist security info=False¡w orkstation si ze=4096"); SqlCommand cmd = new S q l C o m m a n d i ) ; cmd. CommandText = "SELECT U n i t P r i c e FROM P r o d u c t s WHERE P r o d u c t N a m e = + na z wa To wa r u + c m d . C o n n e c t i o n = conn; conn.Open(); d e c i m a l cena = ( d e c i m a l ) cmd. E x e c u t e S c a l a r ( ) ; conn. C l o s e ( ) ; r e t u r n cena * i l o s c ; 3
id=MM;packet
C# w praktyce
214 •
N a p o c z ą tk u k o d u d o d a m y d y rek ty w ę: sing System.D a t a .S q lC lie n t;
•
P rz e d d e fin ic ją k lasy d o d a m y a try b u t w sk az u ją cy opis i p rze strze ń n a zw , słu ż ąc y d o id e n ty fik a c ji usługi: [WebService (D e s c r ip tio n = " U s ł u g a s i e c i o w a , o b l i c z a j ą c a w a r t o ś ć podanego p r o d u k t u " . Namespace = " h t t p : / t e m p u r i . o r g / ” ) ]
•
S k o m p ilu je m y , u ru c h o m im y i p rz e te stu je m y n aszą m eto d ę siecio w ą. P rz y k ła d o w e n a zw y to w a ró w m o ż e m y o d c z y ta ć z bazy N orth w in d , z tab e li P ro d u c ts k o rz y s ta ją c z S e rv e r E xplorera. '3k WarloscServíce Web Service - Program Microsoft Internet Explorer dostarczony.. Plik
o
Edycja W stecz
W idok *
Ulubione
*3 S3
N arzędzia
ÍÉ
Pomoc W yszukaj
y
J; 'w
Ulubione
Multimedia I Przejdź
e j h ttp ://localhost/W artoscW eb S ervice/W artosc5ervice.asm x?op=W artosc
W artoscService C lick
faftre fo r
Î É Î iS i
a com plete list of operations
W artosc Test To test the operation using the HTTP G E T protocol, d ic k the 'Invoke' button.
P a ram eter
Value
nazw aTow aru: |Rfcd Kaviar ilosc:
3| Invoke
<
> Lokalny Intranet
Gotow e ....................Ml.
R ysunek 95. M etoda sieciowa Wartosc •
U tw o rz y m y ap lik ację k lien ck ą typu W in d o w s A p p lic a tio n : C w 6 0 - Tow ary N ort hw in d .
Usługi W eb Services
21 5
23
Towary firm y Northwind * f . . . . . .
> •
•
•
•
•
N azw o towaru: Ilość:; ‘
V*
w • • • •
*
Oblicz w artość
i
: P "."". \ p .". : . .
. .
. .
. .
W a r to ś ć
:r
w m tm
Rysunek 96. Projekt aplikacji klienckiej
U tw orzym y odniesienie do usługi sieciowej (A d d W eb Reference). W pole adresu wpiszem y URL naszej usługi: http://localhostlW artoscW ebServicelW artoscService.asmx Po otw arciu strony potw ierdzim y odniesienie przyciskiem A d d Reference. O program ujem y zdarzenie L oad form ularza - w ypełnienie kontrolki C om boB ox nazwam i produktów z tabeli Products: p r iv a t e void Forml_Load(object sender.
System. EventArgs e)
t / / W y p e ł n i e n i e ComboBox - P r o d u k t y s t r i n g strConn = "data source=m m ;initial catalog=N orthw ind; in te g ra te d s e c u r i t y = S S P I ; p e r s i s t s e c u r i t y i n f o = F a l s e ;w o r k s ta tio n id=MM;packet si z e = 4 0 9 6 " ; S q l C o n n e c t i o n conn = new S q l C o n n e c t i o n ( s t r C o n n ) ; SqlCommand cmd = new S q l C o mma n d ( ) : cmd.CommandType = C o mma n d T y p e . T e x t ; c md. CommandText = "SELECT P r od uc t Na me FROM P r o d u c t s " ; c m d . C o n n e c t i o n = conn; cbxNazwa. I t e m s . C l e a r ( ); c o n n . Open( ) ; SqlDataReader reader = cmd. Ex ecu teReader (CommandBehavior. C l o s e C o n n e c t i o n ) ; while (r e a d e r . Read())
t cbxNazwa. Item s.Add( rea d e r[" P ro d u c t Name"]);
}
C# w praktyce
216
•
O program ujem y przycisk Oblicz wartość: p r i v a t e void b t n W a r t o s c _ C lic k ( o b je c t sender,
S y s te m .EventArgs e)
C 1 o c a l h o s t . W a r t o s c S e r v i ce o b j W a r t o s c S e r v i ce = new 1 o c a l h o s t . W a r t o s c S e r v i c e ( ) ; try
i txtW arto sc.Text = (objWartoscService.Wartosc( cbxNazwa.Text, n u d l l o s c . V a l u e ) ) .T o S tr in g C ); ) catch (E xception)
C M e s s a g e B o x . S h o w ( " N i e p r a w i d ł o w e d a n e ! " , "Uwaga b ł ą d " . M e s s a g e B o x B u t t o n s .OK, M e s s a g e B o x I c o n . E r r o r ) ;
} )
U sługi W eb Services um ożliw iają budow anie systemów rozproszonych, używ ają cych elem entów um ieszczonych w różnych m iejscach Internetu. M ogą to być przy kładowo usługi zw iązane z bezpieczeństw em , komponenty finansow e, bazy danych i wiele innych.
15. Pakiet instalacyjny aplikacji
B u d o w a p a k ie tu in sta la c y jn e g o ap lik acji n ie je s t ju ż b e z p o śre d n io z w ią z a n a z p ro g ra m o w a n ie m , ale je s t sp ra w ą isto tn ą p o d c z a s tw o rz e n ia a p lik a c ji. P ro g ra m y tw o rz o n e p rzy u ż y ciu .N E T F ra m ew o rk sk ła d ają się z je d n e g o lu b w ię ce j tzw . a sse m b lies, c zy li p lik ó w z a w ie ra ją c y c h in fo rm a c je p o trz e b n e do z a rz ą d z a n ia w e rsją i in s ta la c ją a p lik ac ji n a k o m p u te rz e d o c elo w y m . Istn ie je k ilk a sp o so b ó w d o sta rc z a n ia a p lik a c ji n a k o m p u te r u ż y tk o w n ik a . M o ż e to b y ć, w n a jp ro stsz y m p rz y p a d k u p lik *.exe (lub
o trz y m a n y w w y n ik u k o m p i
lacji w try b ie rela se b u ild . M o ż n a sk o rz y stać z p lik ó w * .ca b u m o ż liw ia ją c y c h k o m p resję. C zy w re sz c ie m o ż e m y w y k o rz y sta ć p a k ie t W in d o w s In s ta lle r (* .m si). P rz e c h o w u je on w sz y stk ie sk ła d n ik i p o trze b n e do z a in sta lo w a n ia a p lik a c ji n a k o m p u te rz e d o c e lo w y m w je d n y m sk o m p re so w a n y m pliku. W in d o w s In sta lle r, o p ró cz z a u to m a ty z o w a n ia in sta la c ji a p lik ac ji: •
p o tra fi tw o rz y ć sk ró ty n a p u lp ic ie i w m enu Start,
•
n a p ra w ić in sta la c ję , k o p iu ją c je d y n ie b ra k u ją c e lub u sz k o d z o n e p lik i,
•
p rz e k a ż e in fo rm a c ję u m o ż liw ia ją c ą p ó ź n ie jsz e o d in sta lo w a n ie a p lik a c ji,
•
sk o n fig u ru je tak ie u słu g i ja k p rz y k ła d o w o IIS. A b y u tw o rz y ć p a k ie t in stalac y jn y , m u sim y d o łą c z y ć do p ro je k tu sw o je j a p lik a c ji
S e tu p P roject.
Ćwiczenie 61. Tworzymy pakiet instalacyjny U tw o rz y m y p a k ie t in stalac y jn y d la je d n e g o z w c z e śn ie jsz y c h ć w ic z e ń (p ro je k tó w ). W y k o rz y sta m y go p ó źn iej, in stalu jąc a p lik a c ję na k o m p u te rz e k lie n c k im . N a stę p n ie o d in sta lu je m y a p lik a c ję , k o rz y sta ją c z P a n e lu S te ro w a n ia W in d o w s. •
O tw o rz y m y w y k o n a n y w cześn iej p ro je k t z ć w ic z e n ia 54 - B a za 3 (lu b w y k o n a n y je g o k o p ię do e k sp e ry m e n to w a n ia ).
•
W S o lu tio n E xplorerze w sk aż em y ro z w ią z a n ie S o lu tio n
‘B a z a 3 ’ i k lik n ie m y
p ra w y m p rz y c isk ie m m yszy. Z m en u k o n te k sto w e g o w y b ie rz e m y A d d , a n a s tę p n ie N e w P r o je c t.... •
W o k n ie d ia lo g o w y m A d d N e w P ro ject w sk a ż e m y ty p p ro jek tu : S e tu p a n d D ep lo y m e n t P ro ject, szablon: S e tu p W iza rd i w p isz e m y n azw ę: C w ó l - A d re sy setu p .
218
C# w praktyce Po u ru chom ieniu kreatora klikam y przycisk N e x t, przechodząc do w yboru typu p ro jek tu . T w o rząc aplikację W indow s, dom yślne ustaw ienie pozostaw iam y bez zm ian.
Choose a project type The type of project determines where and how hies will be installed on a target computer.
Do you want to create a setup program to install an application? <•
Create a setup for a Windows applcation
C Create a setup for a web application Do you want to create a redistributable package?
C Create a merge module for Windows Installer C
Create a downloadable CAB file
< Back
Cancel
Next >
Finish
Rysunek 97. Setup Wizard - wybór typu projektu •
W trz e c im k ro k u k re a to ra w y b ie rz e m y fo rm a t w y jśc io w y . W p rz y p a d k u k o m p i lac ji d o p lik ó w *.exe lu b * .d /l w y b ie rz e m y : P ń m a ry o u tp u tfr o m B a za 3 .
Choose project ou tpu ts to include You can include outputs from other protects in your solution.
Which project output groups do you want to Include? i j Documentation Files from Baza3
a—
L ! Localized resources from Baza3 □ Debug Symbols from Baza3 U Content Files from Baza3 D Source Files from Baza3
Description: Contains the DLL or EXE built by the project.
Cancel
j
< Back
Rysunek 98. Setup Wizard - wybór formatu wyjściowego
Next >
Finish
Pakiet instalacyjny aplikacji •
219
W k o le jn y m k ro k u k re a to ra w y b ie rz e m y d o łą c z a n e p lik i d o d a tk o w e , ta k ie ja k p lik i p o m o c y , in fo rm a c y jn e , ik o n y , c z y p lik i b a z d a n y ch . W n a sz y m p rz y p a d k u d o łą c z y m y p lik b azy d a n y ch „M o je a d re s y .m d b ” i d w ie ik o n y (je d n ą p ó ź n ie j u m ie śc im y na p u lp ic ie k lie n ta, a d ru g ą w m e n u S tart). P lik i ik o n m o ż e m y z n a leźć w fo ld e rz e W ic r o s o ft V isu a l S tu d io .N E T \C o m m o n 7 \G ra p h ic s\ic o n s. S e tu p W iz a r d (4 o f 5 ) Choose files to include You can add files such as ReadMe files or HTML pages to the setup.
Which additional Hies do you want to include? Add...
¡cs\icons\Wribng\BOOK03.ICO ics\icons\Writing\BOOK04 .ICO
Remove
—*--------—■
Cancel
Next >
Finish
R ysunek 99. Setup Wizard - wybór plików dodatkowych •
O sta tn i k ro k k re a to ra je s t p o d su m o w a n ie m w c z e śn ie jsz y c h w y b o ró w . Z a tw ie r d z a m y g o p rz y c isk ie m F in ish .
•
W o k n ie P roperties u sta w im y w a ż n ie jsz e w ła śc iw o śc i p ro jek tu : M a n u fa c tu re r = „ M o ja F irm a ” P ro d u c tN a m e = „ K a rto te k a a d re so w a ” T itle = „ A d re sy - se tu p ”
•
O k re ślim y p o ło ż e n ia p lik ó w n a k o m p u te rz e k lien ta. W o k n ie F ile S y s te m k lik n ie m y A p p lic a tio n F older. W k o lu m n ie N a m e p raw y m p rz y c isk ie m m y sz y w s k a ż em y P rim a ry O u tp u t fr o m B a z a 3 , a n a stę p n ie w y b ie rz e m y z m en u : C re a te S h o rtc u t...i w p isz e m y „ K a rto te k a a d re so w a ” .
•
W o k n ie P roperties, k tó re p o w in n o z a w ie ra ć tera z w ła śc iw o ś c i tw o rz o n e g o sk ró tu , k lik n ie m y w ła ściw o ść Ic o n , a n a stęp n ie (B ro w se ...).
•
W o k n ie d ia lo g o w y m Ico n k lik n ie m y p rz y c isk B r o w s e .. . .
220
C# w praktyce
•
W kolejnym oknie (Select Item In Project) klikniem y dw ukrotnie Application F older i zaznaczym y jedną z w cześniej w ybranych ikon. O kna dialogow e za m kniem y przyciskam i OK.
•
W rócim y do okna Properties tw orzonego skrótu. W ybierzem y tu w łaściw ość Folder. K likając ..., otw orzym y okno dialogow e Select F older i zaznaczym y User s Programs M enu. Zatw ierdzim y to przyciskiem OK.
•
Podobnie utw orzym y skrót dla User s Desktop. U tw orzone skróty m ożna znaleźć w oknie File System, w folderach User s Program s M enu i User’s Desktop. Adresy Fie
£dlt *
setup - Microsoft Development Environment [design] * File System (Adresy * setup) yiew &
Project
guild
£1
Qebug
Tcfols
Action
Window
Help
► Debug
X
¡PPS H flM H
-
Kavwr
&
File S y ste m (A dresy - setup) |
&
J U File System on Target Machine f 4
Application Folder
¿ J User's Desktop f
Name___________________________________ Type Name _________ i>i *1Kartoteka adresowa
Shortcut
ü J Moje adresy.mdb
File
I User's Programs Menu Create Shortcut to Primary output from Baza3 (Active)
&!
Dependencies Exdude£ilter Outputs
* Cut m
P ty & C ;
X
Qelete
■ Properties Window
Rysunek 100. Tw orzenie skrótów
•
Z m ienim y opcje kom pilacji, w ybierając Configuration M anager... z menu Build. Z m ienim y tu ustaw ienia projektów z D ebug na Release. Conftgurdtion Manager
"
Active Solution Configuration: ¡Debug
~ j £ ]
Project Contexts (check the project configurations to build or deploy): Project
Configuration
Adresy - setup
Release
Baza3
jReiease
O | - j .NET
2Ü
Close
L Rysunek 101. Ustawiane opcji kompilacji
1 Build
Platform
®
Help
Pakiet instalacyjny aplikacji
221
•
Skom pilujem y projekt, klikając prawym przyciskiem m yszy nazw ę projektu „Adresy - setup” w Solution Explorerze i wybierając z menu kontekstow ego Build.
•
Zam kniem y środowisko Visual Studio .NET.
•
Odnajdziemy folder \Adresy - setupNRelease i klikniemy dwukrotnie plik Setup.exe, urucham iając instalację.
r
0
Kartoteka adresowa
Welcome to the Kartoteka adresowa Setup Wizard
T h e installer will guide you through the steps required to instai K artoteka adresow a on your computer.
W A R N IN G : This computer program is protected by copyright law and international treaties. Unauthorized duplication or distribution of this program, or any portion of it, may result in severe civil or criminal penalties, and will be prosecuted to the maximum extent possible under the law
Bad
Cancel
N ext >
Rysunek 102. Program instalacyjny
•
Spraw dzim y proponowaną lokalizację plików podczas instalacji aplikacji.
•
Po zainstalow aniu aplikacji sprawdzim y jej działanie.
•
U żyw ając Panelu Sterowania W indows, odinstalujem y aplikację.
i
*
Podsumowanie
W tra k c ie w y k o n y w a n ia p o w y ż sz y ch ć w icz eń je d n o c z e ś n ie p o z n a w a liś m y m o ż liw o śc i ję z y k a C # i p latfo rm y .N E T . Z re a liz o w a n e ć w ic z e n ia nie w y c z e rp u ją tem aty k i p ro g ra m o w a n ia w ję z y k u C # i m o ż liw o śc i śro d o w isk a .N E T . S ą zaled w ie w stęp em do d a lsz y c h , w ła s n y c h d z ia ła ń . Je st w iele w a ż n y c h z a g a d n ie ń , k tó re nie zm ieściły się w ram a ch tej k s ią ż k i w c a le lub z o sta ły p o ru sz o n e je d y n ie w stęp n ie. D o tak ich tem ató w m o ż n a z a lic z y ć , m ię d z y in n y m i: d e le g a c je , in te rfejsy , p rz e c ią ż a n ie o p e ra to ró w , kod n ie b e z p ie c z n y i w s k a ź n ik i, stru k tu ra i z a sto so w a n ie p lik ó w X M L , b a zy d an y ch . P la tfo rm a .N E T sta ła się na ty le fu n d a m e n ta ln y m sta n d ard e m , że ró w n ie ż in n e firm y tw o rz ą c e ję z y k i p ro g ra m o w a n ia m ig ru ją na n ią ze sw o im i p ro d u k ta m i. D o b ry m p rz y k ła d e m m o ż e być B o rla n d , k tó ry n a p la tfo rm ie .N E T u m ie śc ił n ie ty lk o C # B u il der, ale ró w n ie ż n a stę p n ą w e rsję (n r 8) sw o je g o śro d o w isk a D E L P H I. N a w e t d o ś ć e g z o ty c z n y P Y T H O N (w e rsja A c tiv e S ta te V isu a l P yth o n ) używ a p la tfo rm y .N E T . J u ż o k o ło 2 0 ró ż n y c h ję z y k ó w p ro g ra m o w a n ia d z ia ła n a p latfo rm ie .NET.
Skorowidz
A akcesory, 147 animacja, 129; 131; 141 aplikacje W indows, 13; 165 aplikacje W W W , 201 argument, 55 ASP .NET, 203
F form ant, 61 form atowanie wyników, 17 form aty plików graficznych, 125 funkcje, 13 trygonom etryczne, 33
G
B bazy danych, 171; 206 biblioteka, 202 Fram ework Class Library, 51 obiektowe, 201 błędy dyskowe, 97
c
GDI, 119 generator liczb losowych, 35 grafika GDI+, 119
H HatchStyle, 123 herm etyzacja, 146 HTM L, 201
ciąg, 43 I
D Data Form W izard, 171 dekrem entacja, 25 destruktory, 151 dostawca danych, 173 drukowanie, 78 dziedziczenie, 153 dzielenie całkowitoliczbowe, 24
iloczyn, 29 indeksatory, 162 inkrem entacja, 25 instrukcja for, 33 instrukcje powtarzania, 33 w yboru, 26 integracja danych, 188 Internetowe Usługi Informacyjne, 201
E edytor tekstu, 64; 68; 71; 74; 78 elementy graficzne, 119 menu, 64 enkapsulacja, 147 etykiety, 19
J język C#, 7 Just In Time, 9
22 6
C# w praktyce
K kalkulator euro, 205 klasy, 13 M atrix, 134 pierwsze, 144 potom ne, 154 własne, 143; 145 wyjątków, 96 kod źródłowy, 7 kolekcje, 41; 51 kom entarz, 13 blokowy, 103 wierszowy, 103 XML, 103; 105 kom pilacja kodu, 110 kom pilator Just In Tim e, 9 konstruktory, 151 własne, 152 zapytań, 184 kontrola popraw ności danych, 85 kontrolki, 61; 62 kreator D ata Form W izard, 171
L liczba, 143 LIFO - Last In First Out, 49 literał, 143
M m acierz, 43 maski w prow adzania, 91 menu, 64 metody, 13; 55 graficzne, 119 logiczne, 27 wirtualne, 158 model piłki baseballowej, 7 M SIL (M icrosoft Intermediate Language), 9
N nagłów ek m enu, 64 najw iększy wspólny dzielnik, 38 N ET Fram ew ork, 9
O obiekty ADO, 179 obiekty graficzne, 119 obsługa błędów, 85 obsługa plików, 72 obszar, 13 operand, 24 operatory arytmetyczne, 23 przypisania, 25 warunkowe, 25 zaprzeczenia, 29
P pakiet instalacyjny, 217 pakowanie, 43 pasek menu, 64 narzędzi, 68 stanu, 71 pętla, 27 PictureBox, 129 plik XML, 111 pliki graficzne, 125 podmenu, 64 polimorfizm, 145 przedrostki, 115 Przeglądarki, 201 przekazywanie argumentów, 55 przepływ danych, 73 przestrzeń nazw, 13 punkt na płaszczyźnie, 134
R raport HTML, 116 region, 13 rozpakowanie, 43
s Server Explorer, 8; 186 serwer sieciowy, 201 silnia, 39; 47 sito Eratostenesa, 44
Skorowidz składnia pliku XM L, 115 skrypt, 7 SQL Server, 186 stos, 49 strumień, 73 suma, 29 szkielet aplikacji, 13 ✓
s środowisko program owania, 9
T tablice, 27; 41; 43 transformacje M ultiplyTransform , 140 typy błędów, 85 d a n y c h ,18 referencyjne, 41 wartościowe, 41
U ukrywanie danych, 147 ułamki, 56
227 usługi Web Services, 209
V Visual Studio .NET, 7
W walidacja danych, 92 W eb Services, 209 weryfikacja danych, 89 wielkość liter, 13 właściwości, 149 wprowadzanie danych, 17; 85 wyjątki, 95; 101 wypełnienia, 123 wyłażenia arytmetyczne, 23
Z zapytania, 183 zdarzenia, 61 zestaw danych, 172 zmienne, 143 znaczniki predefiniowane, 104 znaki sekwencji sterującej, 25