100% found this document useful (2 votes)
6K views618 pages

Lap Trinh Window Voi C

Lap Trinh Window Voi C Sharp.net

Uploaded by

Nguyen Duong
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
6K views618 pages

Lap Trinh Window Voi C

Lap Trinh Window Voi C Sharp.net

Uploaded by

Nguyen Duong
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 618

"_r ...

Phuong Lan «u: bien) W



Tim. hU~u ki~n trite .NETquaC#

Tao ting d1;1Dg Windows Forms, ADO.NET, Web Service, ASP.NET

GDI+~ COM~ AsselDbly (rong.NET

I I

I

I . I

i

Phuong Lan (Chu bien) Hoang DUe Hii

LAp TRiNH WINDOWS



, .

val



,. -'? ..... --

NHA XUAT BAN LAO f>QNG - XA HQI

... ?

LOINGO

Kinh thua quy Ban doc gan xa, Ban xuAt bin MKPUB trutrc het xin bay to long biet an va niem vinh hanh trudc nhiet tlnh cua dong dao Ban doc d6i voi tu sach MKPUB trong thoi gian qua.

Kh.lu hieu cua chung tOi Ia:

* Lao dong khoa hoc nghiern tuc,

* Cha.'t hrong va ngay cang chAt luong' han. * TAt ca vi Ban doc,

RAt nhieu Ban doc da gai mail cho chung tOi d6ng g6p rihieu y kien quy bau cho tu SIkh.

Ban xuat ban MKPUB xin dliqc kinh moi quy Ban doc tham gia cung nang cao chili luong tu sach cua chung ta:

Trong qua trinh doc, xin cac Ban ghi chu lai cac sai s6t (du nho, Ian) cua cuon sach hoac cac nhan xet cua rieng Ban, Sau d6 xin giii v~ dia chi:

E-mail: [email protected];[email protected] Hoac gm v~: Nha sach Minh Khai

249 Nguyen Thi Minh Khai, Q.I, Tp. H& Chi Minh Neu Ban ghi chu t.ruc tiep len cuon sach, r5i gm cuon sach d6 cho chung toi thi chung toi se xin holm Iai circe phi buu dien va gm lai cho Ban cunn sach khac,

Chung toi xin giii ti.\ng m9t cuon sach cua til sach MKPUB tuy chon lua cua Ban theo m9t danh muc thich hop se duoc gai tci Ban.

Vdi muc dich ngay cang nang cao chat hrong cua tu sach MK.PUB, chung toi rat mong nhan duoc sl! hop tac cua quy Ban doc gan xa.

" MK.PUB va Ban. doc cung lam l"

MK.PUB

MVCLVC

LOI NOO 3

Ml,JC Ll,JC 5

PhAn I M{$ DAU 13

MfJ DAU 15

Chtidng 1-1: BQ khung .NET (.NET Famework) 15

1. Giai thieu nhanh v~ .NET 15

. 2. Xoa bo huy~n thoai v~ mOt may ao .net 15

3. Ngon ngii" trung gian Microsoft (MSIL) 17

4. Quan ly bO nho .NET 18

5. Ht\\ thong kiii'u dulit\\u eua·.NET 18

6. Cac d6i tugng trong ht\\ th6ng eua khung .NET 19

7. C# - mot ngon ngil' l~p trinh maio 19

8. Cac doi tuong W rna ta nhu the nao? 20

9. Tuong tac vdi the gidi COM 20

10. Windows Forms, Web Controls.va GDI+ 20

Chu'dng 1.2: BQ thttc thi ngon ngU' Mng quat 21

1. T6ng quan 21

1.1. Dan gian hoa vit\\c phat trign 21

1.2. Cong cu h5 trg 21

1.3. Hli trg da ngon ngif : 22

1.4. Vit\\c triii'n khai dugc thuc hien d~ han 22

1.5. SI! tach bit\\t cac phan mern 22

1.6. Tinh an toan kiii'u va sl! kiii'm tra 23

1.7. Tinh bao ~t 23

2. Quan M cua CLR vdi .NET 23

2.1.' Chi tiet v~ CLR. 23

2.2. CLR vao hie thuc thi 25

2.3. Cac kiii'u du)i~u duqc cung cap bi1i CLR. 27

2.4. Dtr Iieu va rna lo\\nh cua .NET 28

2.5. Ma l~nh cua COM va viec truy xuat dil' lieu 29

2.6. Cac thanh phan rna r{\ng cua .NET d6i vdi C++ 32

2.7. Cac ngoai 10\\ (Exception) 35

2.8. H6 trg vi~c giJ r6i.. 36

3. Ket chuong 36

!J6

MVC LVC

ChUdng 1.3 : Ngon ngii' trung gian IL : 37

1. Lien tac (INTER·OP) .ngon ng(1 38

2. HELLO IL 39

3. Ham (FUNCTIONS) : 41

4. Lap (CLASSES) 43

5. ILDASM < 45

6. METADATA : 48

7. REFLECTION API .49

8. Ket chuang 52

Chudng 1.4 : Lam vii;c vdib';' quan Iy C++ 53

1. Cac W khoa rna rong cua C++ 54

2. Sa dung trinh bien dich C++ cho Managed C++ 55

3. Cac lap thu gom rae (Garbage Collected) 56

4. ChI dan (Directive) #using 56

5. Chuni (String) " 58

6. Tron cac rna I(\nh diroc quan Iy (Managed) va khorig diroc quan ly

(Unmanaged) 59

7. Ch6t chat (Pinning) cac rna l~nh Managed .

.. ..... 59

8. Cac giao tiep duoc quan Iy (Managed Interface) 60

9. Tao ra cac killu gia tri 62

10. 'I'ao va sLt dung cac mo hinh uy thac (Delegate) 65

11. G9i cac DLL .NET tuy bien W ma h~.uh Managed C++ cua ban 68

12. Sa dung DLL C++ dircc quan Iy va .khong duqe quan ly trong chuong trtnh

.NET cua ban ,'., 70

13 .. Dung cac thuQc ttnh (Properties) tr~ng cac Lap cua ban 74

14. BaD dam viec sAp xep va dong gci cac cau true C++ cua ban 76

15. Ket chuang 84

Chucng 1.5: Gi8i thii;u VISUAL STUDIO, .NET 85

1. Tich hop moi truong phat tri~n (IDE) 85

2. DI! an (Projects) 88

3. Nhieu du an trorig m¢t Solution dan:', 88

4. Cac file phu thuoc cua du an (ProjectDependencies) 90

5. Class View . 90

6. Resource View 91

7. Macro Explorer 91

8. Trinh giup do (HelpL " " 91

9. Server Explorer " 93

10. Cu-a s6 ket xuat thong tin (Output). : 94

CHUONG 1-1: BO khung .NET

71!J

11. Tim kiem cac ky hieu Mc trung 96

12. Chi rnuc va ke't qua tim kiern 97

13. Cua s5g6 loi (Debug) 97

14. Trinh trq giup dQng (Dynamic Help) 100

15. Clia s6 Favorite . : 101

16. Chuong trinh ga loi (Debugging) 101

17. Cai dat breakpoint nang cao 102

17.1. Conditional Breakpoints 103

17.2. Hit Counts . 104

18. Lam gl khi rna chuang trinh bi tarn ngung 104

19. GAn trlnh ga loi (Debugger) vao mot tien trmh (Process) 104

20. JIT Debugging..... . 105

21. Ke't chuong 106

Phdn II: Ngon.Nga CI : 107

Chuong 2.1 : Cac vdn dE! eo' ban cua C# 109

1. H~ thong killu trong C#........................... . l10

1.1. Cac kiii'u gia tr] trong lap trmh : 111

1.2. Cac kieu tham chieu 114

1.3. Bao va kh6ng bao (Box va Unbox) 116

2. Cac khai niem lap trinh.....................................117

2.1. Kh6ng gian t€m (Namespace) 117

2.2. Cac phat bieu l~nh (Statements) 120

2.3. 'I'oan tu- di~u kien ?: .. .. 123

2.4. 'I'oan tu- (Operators i.. ..

2.5. Arrays (Mang) .

. .... 134

. 137

2.6. Struct (Ca'u trucr.i..; . 140

3. Lap (Class) 143

3.1. Doi tinrng (Object)........... .. 145

3.2. Phuong thirc (Method) :.......................... 145

3.3. Truyen tham 80 147

3.4. Thuoc tinh (Properties) 151

3.5. Toan tlt (Operator) 153

4. Ke'thua (Inheritance) 160

5. Da hlnh (Polymorphism) 162

6. Giao dian (Interfaces) 165

7. M6 hinh chuyen giao (Delegates) 168

8. Ke't chuang 170

Ml)C LT,JC

Chtidng 2.2 : C# nang cao 171

1. T~p hop (Collection) cua .NET 171

1.1. Stack 171

1.2. Hang doi (Queue) .. 172

1.3. Bang bam Hashtable 173

2. Danh sach lien k€t (Link List) 174

3. Attributes (dac tinh) 178

4. XML Serialization 179

5. C# hi} tro XML Serialization 180

6. K€t chirong 192

Phiin III : WINDOWS FORMS 193

Chtidng 3.1: Windows Forms 195

1. Giai thieu vii Windows Forms coo kie'n true .NET 195

2. Windows Forms va U'ng dung Hello World 196

3. Tao va sli dung cac be) xu ly su kien (Event Handler). 198

4. Dinh nghta cac ki~u duong vien (Broder Style) cho Forms 201

S. Tao va them vao trlnh dan menu 202

6. Tao va them vao cac muc chon tiit (Shortcut Menu) 204

7. Xli Iy sl! kien phat sinh til Menu 20S

7.1. SI! kisn dieu khien giao dien ngirci dung cua MenuItems 206

7.2. Dinh nghia Menultems la thanh phan each (Seporator) 207

7.3. Xli Iy sl! kien Select.. 209

7.4. Thi€t k€ khung Menu 212

7.5. Hien thi Menu tU phai qua trai................................................. 214

7 .6. T~iO va sil' dung cac Menu ngu canh (ContextMenu) 214

7.7. Thay the, sao chep lai va trOn cac muc cua Menu 215

7.8. Tao va them vao cac Menu con (sub-Menu) 222

8. K€t chuang 224

Chtidng 3.2 : Xii' ly giao dil,;n db hoa (GUI) 225

1. Giffi thieu v~ thanh phan giao dien d6 hoa (GUI) 225

2. HOp thoai (Dialog) 225

2.1. Sil' dung cac hop thoai thong dung (Common Dialog) 226

2.2. HQP thoai Print va Print Preview 236

3. Tao hOp thoai : 244

3.1. HQP thoai Model va Modeless 244

3.2. Chuyen du Iieu giua cac thanh phan trong hQp thoai . 247

3.3. Ki~m tra hrrp l~ (Validation) 249

ClludNG 1·1: BQ khung .NET

4. Sa dung cac dieu khien 252

4.1. Checkbox va nut Radio 252

4.2.6 soan thao Edit 257

4.3. ListBox 257

4.4. TreeView 257

4.5. Bang c1i~u khien Tab 258

4.6. Quan If cac thanh phan di~u khien dQng 258

5. Kilt chuong , 284

Chlidng 3.3 : Rang buoc dii' lieu 285

1. Chien hroc rang buoc duli$u............................... . 285

2. Cac ngu6n du lieu rang buoc 285

2.1. Giao tiep IList............................................ . 285

2.2. Cac dIli nnmg .NET cai d$t IList 286

3. Rang buoc gian don 286

4. Rang buoc du li~u gian dan 291

5. Rang buoc duli~u phirc hop . 297

6. Rang buoc thanh phan dieu khien veii Co' sci du WiU su dung ADO.NET .. 301

7. Tao ra mot khung nhin Co' sd du lieu (Databse Viewer) vo-i Visual Studio va

ADO.NET........ . 302

8. Kilt chuong 304

Chlidng 3.4 : xay d\l'llg Ung d~ng Windows Forms (Scribble .NET) 305

L Cac tai nguyen trong .NET 305

2. Dia phirong h6a san pharn mot each d~ dang 306

3. Cac lrip quan Iy tai nguyen cua .Net 306

3.1. TIm mot van hoa 307

4. Tao lap cac tal nguyen van ban 308

4.1. Chu6i tai nguyen van ban 309

4,2. MQt chuang trlnh mAu dira tren tai nguyen 311

4.3. Tao li;tp va stl' dung goi ket hop :......................... . 312

5. Dung Visual Studio. NET M qu6c te hoa 315

6. Tai nguyen hlnh anh 317

7. Sil dung danh sach hinh anh........................................................ . 318

8. Phuong each li).p trlnh truy xuat den cac tai nguyen. . 323

9. El9C va viet ti;tp tin XML RESX 329

10. KElt chirong 338

Chlidng 3.5: GDI+: Giao dien d6 hoa cua .NET 339

1. Cac nguyen If Co' ban ella GDI+ 339

Ml,JC Ll,JC

2. Hoi tuong Graphics 340

3. Cac h~ tea dQ do hoa 340

4. Ve duong thiing va cac hlnh don gian 341

5. Sa dung but ve (Pen) va co ve (Brush) chuyen mau gam mau 344

6. But ve va C9 ve c6 cha't lieu 346

7. Lam trrrn cac dau milt cua dUCrng thi'lng 347

8. DUCrng cong va cac durrng do thi 349

9. D6i tuong GraphicsPath 357

9.1. Them van ban <Text) va cRC duong do thi khac 359

to. Ky thuat Cl'it bing duo-ng duo-ng do thi va vung (Region) 360

11. Cac phep bien d6i (Transformations) 365

12. Sv phoi mau voi gia tri Alpha (Alpha Blending).......... 374

13. Sv phoi mau vci gia tri Alpha cho hinh anh 376

14. Nhung thao tac xu ly khac trong khorig gian rnau 380

15. Kat chl1ang......................................................... . 384

ChuO'ng 3.6: Th1!c hanh dng dv.ng Windows Forms 385

1. Stl' dung thuoc tinh.................................... . 385

2. Nang cap thuec tinh Experience 390

3. Giai thich ling dung : Formpaint.exe . 393

4. Ket chuang 432

Phiin IV : Ky thu~t Web 433

Chirong 4.1 ; ASP.NET 435

1. Web mot hoi th6 mrii 435

2. Yeu d.u can thiet cho ASP.NET...... . 435

3. Hello ASP.NET 436

4. Them chut huong vi 441

4.1. Kiem tra y tl1ang 441

5. Ket chuang...... ..__ __ 450

Chudng 4.2 : Truy xua't dll li~u tren .NET 451

1. Tang da lieu (Datal.ayer) .451

2. Lap Employee va lap Departrneut.. .462

3. Stored Procedures 462

4. Cai dat lap 463

5. Ki~m tra (Testing) , , 470

6. Hi) trg tim kiem gian dan .472

7. KetchLlang , 478

Chudng 4.3: WebForms 479

CHudNG 1·1: Bi) khung ,NET

1. Gi6i thieu ASP,NET WebForms ."......" " , "

, .479

1.1. Cac UserControl , .479

1.2. HeaderControl " , ",," " .. .479

1.3. EmployeeViewPagelet: Mi)t each tie'p can khac , ,485

2. Cac trang ASPX" 492

21. EmployeeEdit................................ .. '" .492

2.2. EmployeeListing .. , " , .. "........ . .. ".,,, 498

2.3. Trang tim kiem: Noi b<'!t Mu tim thong tin" ..

. " 507

.3. Ket chuang " " " .. " ".

.., " 514

Chrrong 4.4 : Cac dich vu Web (Webserviees) 515

1. Dich V1,l Echo (Echo Service) " " , 515

2. Xay dung lrrp Proxy " " , 520

3. Proxyfactory " " , " , .

. ....... 525

4. Cac chuang trinh Windows forms sLi dung WebService " 527

5. Tra v€' kieu do nginri dung dinh nghia , 530

6. T~o Service " .. , 530

7. Tao ra cac rang buoc cho Client " 533

8. Cac thuoc tinh XML , " .. " ,. . 536

9. Ket chuang , " , ,' 542

Philn V : GOI RET HOP 543

Chtidng 5.1 : Cac g6i ke't hQ'p (Assembly) 545

1. Goi ket hop (Assembly) la gt? " , ,...... " 545

1.1. NQi dung goi ket hop "... "" , .. " , 545

1.2. Oinh vi goi ket hop .,........... , ""............ 546

2, G6i ket hqp 100 trong mot t<j.p tin dan , " ".".547

3. G6i ket hop [00 trong nhieu t~p tin " " 547

4. Cac thuoc tinh cua goi ket hop " .. "" .. " "" " 549

5. Tai nap goi ket hop khi chuang tri nh dang thuc thi. ,.................. ",551

5.1. DI,f an FormHost " " 551

5.2. Trinh duyet g6i (Assembly Viewer) dan gian " 560

6. Ket chirong , , " " 568

Chuong 5.2: Chit ky s6 va phien ban 569

1. DlI hell................ , ,.............. . " ""."".569

2. BQ d~m (Cache) toan cue danh cho grii ket hop (Global Assembly Cache)

......................................................................... , , , , 569

3. Phien ban (Version) cua component. .

4. Cac g6i Assembly sU" dung nhieu phien ban ..

. 570

. 573

~12

Ml,JC LVC

5. Rang buoc tuy bien: Cau hinh (rng dung 574

6. K8"t chirong 578

Chlidng 5.3 : Tlidng bie v6'i the' gi6'i COM ....................................................•.... 579

1. The giai cua com 579

2 .. NET h& trc com........ 579

2.1. Trinh Tlbimp.exe 581

2.2. Rang buoc scm <Early Binding) 585

2.3. Rang buoc muon (Late Binding) 585

2.4. IConnectionPoint .

2.5. Nhirng van ct§ v~ ti;}u trtnh (Thread) ..

. 587

. 589

2.6. So sanh kiern .NET va COM . 589

3. Xem cac tharih phan .NET nhu la cac d6i tuqng COM .. . 590

3.1. Trinh RegAsm.exe 591

3.2. COM Callable Wrapper 591

4. Cac van de khi dung chung .net vii. com vdi nhau 591

5. Ket chuong 592

Chuong 5.4 : Cac tigu trinh <Threads) ...........•................................................•.. 593

1. Da t ieu trmh 593

1.1. Tieu trtnh U"ng dung (Application Thread) 593

1.2. Tieu trinh lam viec hay W~u trinh the (Worker Thread) 594

L:{. Tao mot ticu trl.nh tho 594

1.4. ThuQC t.mh ThreadStatic 596

1.5. Lien ket - Bern cac tieu trinh lai ben nhau 598

2. B5ng bi) tiE\U trlnh (Thread Syncronization) 599

2.1. Tu khoa Lock 599

2.2. Mutex 601

2.3. AutoResetEvent 605

2.4. Manual ResetEvent 607

2.5. Cac tieu tri nh dung chung (Thread Pools) 607

2.6. QueueUserWorkltem 607

3. M& rong' cac tieu trtnh .NET 609

3.1. Lap w orkerThread 609

3.2. Baa t6i cua cac nha triet hoc 611

4. Ke'tchuong 614

PhdnI

? ~

M(J DAU

Trang ph(ln nay:

• BQ khung .NET (.NET Famework)

• BQ thuc thi ngon ngG' tong quat

• Ngon nglt trung gian IL

• Lam viec vdi bi? quan ly c++

• Gioi thieu Visual Studio .NET

MaDAU

CHUaNG 1-1: BQ KHUNG .NET (.NET FAMEWORK)

1. -GI~I THI'¢U NHANH vE .NET

Trang cong nghiep may tinh, co the' n6i rang Microsoft da mang lai nhirng buoc di quan trong nhat, Chinh hanh clQng can clam cua Bill Gates va Steve Ballmer khi ho noi voi ling 16n IBM rang ho co mot he cli~u hanh can ban da dem lai thanh ccng vang doi cho DOS. H9 cung cla lam nhu the khi tao ra mot h$ dieu hanh Windows phil bien hau nhu khap toan cau khi "cam nham" cai phong each "nhm va cam nhan" (Look and Feel) ella Apple Macintosh.

Va bay gid, c6 the se la m(it chuyen bien 10n khi Microsoft phat minh lai mOt each t6ng the phuorig thirc rna chung ta se lam viec, se I4p trrnh cho chiec may tinh than yeu, Neu ban dang la mot nha lap trtnh C++, hay ban clang song nho vao h~ dieu hanh Windows hay bO thu vien MFC, khong con nghi ngo chac chan ban cung se bidarn chrm trong the girri .NET.

Tren thire te" ngay nay, Internet cia tro thanh phurrng tien cho chung ta lam viae. tham ban be, su dung tai khoan ngan hang, choi, tan ngau, rat thuc te va hi~u qua nha vao cac phan mem duoc viet de thuc hien cac ket n6i IP (Internet Protocol) cho WWW (World Wide Web). Cac phan mern duoc yeu cau thuc h ien hang trieu cuoc giao dich du lieu giUa cac may tinh vai nhau, va s61uqng cac cuoc giao dich nay ngay cang tang theo su tang nhanh ella kha nang va su phuc tap cua Web. Viec stl dung thu dien til, Iuat tren cac trang Web, trao doi voi cac co sa da lieu va Stl dung cac Ll'ng dung phan tan ngay cang tra nen phirc tap han, VI the trinh do va ky thuat li).p trinh de t<;10 va bao duang cac phan mem cung ngay cang diroc yeu du cao han, tinh vi han. Cac nha I~p trtnh chung ta hang ngay phai doi dien veri COM, COM+, DCOM, SP, SOAP, XML, XSL ... cung nhu phai chien dau vci hang ta cac sach huang diln, cac b(i cong cu SDK (Software Developer Kit: phrrc tap.

Microsoft, cung nhu da sO' trong chung ta, da t<;10 nen ngay cang nhieu cac cong cu chuyen dung. H~ di~u hanh hay cac oing dung Windows day du tinh nang han, theo yeu cau cua ky thuat, cong nghe, vii do do da them vao khOng it cac SDK hay cac tieu chuan ij chi> nay, chi> no, Ket qua la M dieu hanh, thu vien, cong cu tr& nen khong con kha chuyen, qua nang ne vai biet bao cac rna rong (extensions), add-in (phan phu them). The Ia be? khung .NET ra dai .. NET thuc 5V thay dO'i dieu ke tren. D6 kh6ng chi 1a mot bl16c tien, mot nang cap hay mot hop nhat cac cong viae. Ma d6 chinh Iii mQt dieu vi dai, mot su dung cam, mot cuoc bUt pha ngoan muc, N6 dinh nghta lai ta"t ca moi dieu ban da biet v~ I~p trlnh cho may PC ve tat ca rnoi hmh thu tan kich thuoc, H ca v~ ngon ngtr lap trrnh trang d6.

2. xoA BO HUY~:N THO~I VE MQT MAy Ao .NET

M(it trong nhirng thuc te ve .NET (rna c6 kha nang bi trich diin sai n hieu nhat) Iii b(i khung nay khOng co cai dat ky thuat may ao (tuong tlf nhu Java da lam vdi JVM). Phdn mem chay tren nen .NET that sif duoc bien dich va chay ij

~16

PHAN I: Md diiu

mire rna may tuong tlf nhu cac rna da bien djch cua cac chuang trinh C. Quan niam ph6 bien nhung sai him la .NET da dung mc;.t ngon ngtr trung gian, rna thucng' duQ'c goi la P-Code (pseudo-code), TMt ra, .NET cai d~t met che d{> bien dich nhi~u tAng (multistage compilation): trinrc tien, chuang trinh se duoc bien dich sang mot dang trung gian kha chuyen va de-n luc no duqc thuc thi, no se dugc bien dich We thai (just-in-time Compile hay con goi la JIT Compile) sang dang thuc thi cu6i cung (final executable form).

Ghrch u: Theo cluing toi co Ie day ta m¢t erich noi cho khric uai Java vi fa ciing co tId hdu dang trung gian klui chuyen gtin. nlut ta binary-code cua Java uO:

JIT ciing grin gi6ng vai Jaoa Runtime.

Mac du viln con kha phirc tap, h~ th6ng nay cung da dern lai cho cac nha l~p trinh va so' thuan ti/iln. Tat ca moi ngen ngcr deu co-rnet mtrc chung sau khi bien dich so khoi 0- dang trung gian. Nha the', cac modunda duoc vie't til cac ngon ngu khac nhau nhu C#, Visual Basic, Eiffel, FORTRAN, COBOL hay bat ky ngon ngU nao se dUQ'c hli tro trong nnrng lai co the ducc tich hop vao trong mot ling dung duy nhat. Ly rio cua su the nay la mot mOdun met khi dllVe bien dieh d dang ngon ngiJ trung gian (Intermediate Language hay g9i tAt la IL) se duoc dong goi vrri tat cit rna ta cua rni nh. Cac giao dien, thuoc tinh, phuong thee va cac lap cua no diroc rna ta bling sieu dcr lieu (metadata). Tat ca nhung thong tin nay se d~ dang doc duoc hoi cac moi trirong lap trrnh nhanh RAD (rapid application development environment} nhu Visual Studio .NET.

Khi trlnh thirc th i, .NET duoc goi d~ chay mot chuong trinh da dllqc chuyen d6i sang d'.'ng IL, n6 se goi mot trlnh bien dich We thai (JITer) M bien dich doan IL do sang rna may hoan toan M thuc thi tren bo vi x\1 Iy cua may. Trinh JITer lam viec rat nhanh va hieu qua, ca a vi$c khOng bien dich cac phan khorig duoc dung de'n cua rna lerih IL. Hien nhien Ia viec bien dich cung can de'n thai gian va phu thuoc vao viec chung ta xac dinh thai gian nap (load time) chuang trinh hay tinh kha chuyen (portability) cai nao se can han. Va khi ta quyet dinh tinh kha chuyen khong quan trong, h~ thong se cung cap mot trinh bien dich pre-JIT cho phep ta chuyen d6i IL thanh rna may thirong true, coi nhu tao nen cac ti),p tin tlurc thi .EXE hay .COM quen thuoc.

Minh hOI} duoi cho thay cac tang cua hi) khung .NET, dircc xem xat bO'i mot l~ptrinh vien, Cac phan in xam la cac phan dircc .NET them vao. Bi) khung .NET .hisn nay cung cap 4 ngon ngu rieng: C#, Visual Basic, C++ voi b¢ flj qulin rrur r¢ng (managed, extension) va JSeript. MQt viti ngon ngir khac duqc phat trien bO'i cac cong ty.khac nhu Fujitsu voi COBOL, ...

Da co nl(lt nh6m cac trtnh bien dich chuyen rna lenh cua cac ngnn ngtr hO trg .NET thanh cac mOdun ngon ngu trung gian. Ben diroi se lit cac trinh bien dich We thai chuy~n'rtg6n ngii' trung gian sang rna may (IL-to-machine-code JITer). C6 mOt trinh JITer chuan dugc M th6ng dung vtri nguon luc va bO nho d6i dao, no se bien dich dang chudn eua IL thanh dang dune t6i L1u hoa cua rna may tren may hien hanh.

CHUONG 1·1: BQ khung .NET

171tj

Muc cao

C#

VB

c++

JScript

Cric ngdn ng!l khric

Trinh bien dicit (Compiler}

Ngon. ng(l trung gian IL

JIT Compiler

econoJIT Compiler

preJIT Compiler

File tliuc thi . exe

(as) .NET Common Language Runtime

Ph.dn cung

Muc thcip

Hinh 1-1

K€ do la trmh bien dich JIT kinh t€ (econoJIT compiler), no bien dich rat nhanh nhirng khong tinh de'n (hay tinh .de'n Tilt it) slf to'i LiU cua l~nh va phu thuoc vao mot t4P con cua ngon ngtr trung gian ti~n toi LiU (Pre-optimized ILl.

Trrnh bien dich cuoi cling la trinh tien bien dich (preJIT compiler), co nhiem vu 11\ tao ra cac rna thuc thi dtroc, cao rna rna ta co th~ phan phO'i thing den ngiroi dung. Phuong thirc nay chi- diroc str dung doi vdi nhung chuang trinh khOng can thay dili. g1 tren nhung nen phan cU'ng khac nhau,

CuO'i cung Ia CLR LNET Common Language Runtime - tarn dich Ia trinh thirc thi ngfm ngit phil quat). KhO'i chirc nang nay cung U'ng tat ca cac dich vu rna cac thanh to' cua chung se giao tiep vdi may hay voi M dieu hanh rieng tren may do. Mt thu vi neu chung ta chu y rAng may rna ta vlta noi a tren khong chi la may PC va h~ dieu hanh cung khong chi Iii DOS hay Windows. Microsoft da co mot, chien luoc "gom thau thien ha" bang' each xay dung bi) khung .NET tren mci nen, til cac dung cu nho nhat, cac thiet bi cam tay, dien thoai, cac PDA cho Mn cac hi} UNIX hay LINUX. Mac du den nay .NET van chua tM dap ung ngay voi cac h$ thong khac han IA Windows 2000 (1386), nhung tinh khii chuyen cua no cung dang trrr nen du dung nhu Iii mot moi truong lap trinh viet-mi)t-liin-ch':ly-khiip-noi.

3. NGON NGD TRUNG GlAN MICROSOFT (MSIL)

Dieu dang noi la IL cua Microsoft khOng lin dAng sau cac tilng cua may. No la milt ngon ngitlma du ro. dua tren stack, eo mi)t chut tirong tu nhu rna assembly

I!J 18

PHAN I: M& dau

rna ban co th~ W viet lay neu ban du can dam. DI nhisn cung c6 nhung cong cu d€ ban co tM dich ngiroc cac ban rna IL lai d~ xem cac dong l~nh cua mmh va cac doi tUQ'ng M thong. Trang mQt chuang sau chung ta se cung phan tieh chi tiet v~ IL va thir viet true tiep cac ang dung nho bAng IL.

4. QUliN LY BQ NHO .NET

MQt d~c diem dang ban cai cua .NET la trrnh quan ly bo nhd thuc thi cua n6 hoat dQng nhu mot h~ thong thu gom rae (garbage-collected system viet titl la GC system). C6 ngl1ai thi thich thu, nguui Iai 10 sg hay chet lang di vi n6. C6 thii' ban cia la cac nha I~p trrnh tli lau him, neu the, chic ban kh6 the rna quen duoc nhirng ac mong trong nhung ngay cua Lisp, Ilk dqi cho ngimi don rae den, rna o ng ta chi den VaG tha ba: ca nui giay loai a chung quanh ban, Con han la lap trinh vien C++ thi hh ban se thay trlnh quan If bQ nhc nhay loan xa va c6 khi dan den treo may khi ban quen di lai nguyen v~ 51! quan If viec dirih V! con tro va loai bo cac vung nhc han da cap.

Trinh quan ly bo nho cua .NET da tie'p can viec djnh vi he) nho thea mot each khac, Mot khoi b<) nho duoc tv dong' ghi nhd thong tin khi no diroc yeu cau cap phat eho doi tuung' va co nhung tham chie'u de'n n6.Chl khi tat ca cac tham chieu den kho] n hrr duoc xoa thi doi tuong hay vung rihd rnrii bi huv that sir. Cach giai quyet nhu the that 51! da giiim nhe ganh nang quan Iy bQ nhrr cho lap trinh vien. Ban khong con can phai nho lit dil xoa vung nhrr da cap hay chua: dan gian la W nay ban chi can biet la ban khong con dung no nua. MQt Lap se kho ng con phai chu f thea doi hrong tham chieu den no mra, no da biet duoc khi nEW n6 se tir mlnh huy M.

De giam 51! phan manh cua vung nhd dong (heap}, trinh GC cung ail. huang muc tieu vao viec cung co cac vung b<) nhrr dang sa dung' hay cac vung nhrr tL,1 do chua duqc dung den. Dieu nay ngan ngua bQ nho bi mat vo Iy va nang cao h ieu qua cua mot hi? may chu. Heap diroc quan If cang chac chan rang tat ca cac truy xuat b<) nhrr khong chuan , nhu tran bo nhrr hay treo may, se khiing the tac dong den dfi lieu cua chuang trinh khac dang chay tren cung may nay. Va nhu the no him cho M thong tra len tin cay va baa mat.

BQ GC thucng bi coi la cham va kh6ng hieu qua nhung Microsoft da qua quyet rang GC cua .NET se khac, no thi,lt sl! hoat d(mg theo thCIi gian thuc GC cua .NET se hoat dong We thci va khOng tac dOng dang ke len bo vi xu ly (CPU) T6ng.quat, tren mot may Windows 2000, GC chi can khoang 111000 tong thai gian xl:i If cua CPU.

Cuoi cung, e6 ca mot hi? thong du phong eho cai gel la vung nhrr hay rna lii'mh khong duoc quan If {hay khong an toan) rna cac lip trrnh vien can dung can trode dinh vi vung nho thunng gap phai, Nhu the ban co tM dung cac cau true cei xua cua C-t+ ngay trong b<) khung .NET.

5. H~ THONG KIEU nu LI~U eVA .NET

Cac lijp trinh vien c++ co le se co nhieu ngac nhien khi biet v~ each quan If cac ki~u du lieu cua .NET. MQt kieu nguyen int se khOng con chi co nghia nhu

CHUONGl·l: BI) khung .NET

191!J

la mot vung nhc 2-bytes nao do. That ra, dcr li~u viln duoc luu vap bl) nho vaj mot kich co nao day nhung bay gio ban da c6 tM xem chung nhu la nhimg d6i tU(,1ng thirc sl! va truy cap den chung theo cac phuong thuc rna d6i tucng cho phep

Co 2 phan biat nho ve nhrim dcr lieu: ki~u gia tri (Value type) nhu chars, int, doubles va mot s6 nua. Kieu tham chieu (Reference type) nhu array, interface, class hay string.

MQt dieu thu vi la moi ngon ngtr trong Visual Studio .NET nhu C#, VB, C++ deu su dung cac ki€u duli~u nay giong nhu each rna .NET da tu dinh nghla. Nghla la, integer cua VB se dung hoan toan nhir integer cua C# va viec chuyen d6i gitta kieu tha (real type) va cac kieu nhu variant la khong can thict,

6. cAc Dor TDQNG TRONG H:at THONG CllA KHUNG .NET

M6 hmh cac d6i tuong cua h~ thong cua .NET dvgc luu gia trong mot tap cac tij.p tin DLL. Vung khong gian M thong (System namspace) da chira mot h~ thong cac lop (classes) cho cac tap hop, bao mat, truy xuat, tap tin, truy cap cac ham Windows API, XML, ... Va hien nhien la tat ca h$ th6ng .NET deu da s~n sang eho C# va VB cung nhu cac ngon ngtr khac.

Luu y: .NET dua ra. mot hhoi niem moi Iii Namspace hay kh6ng gian ten.

No luang duang ooi khai niem. t6'ng quat tliu vi?1I (library).

7. C# . MOT NGON NGff L~P TRINH MOL

Khdi Mu vci ten goi la Cool vao khoang narn 2000, C# da t?O ra vo s6 cac cucc tranh luan Ian tren nen .NET. Tv cac huyen thoai, cac d6n dai va cac uoe doan, C# ngay nay da that su trd thanh mot ngon ngu dan gian, hoan toan huang d6i tircng va nit tuyet vci. Cac d~c trirng nay cua C# cling gan giong vdi nhO'ng tuyen b6 cua Java? Du co hay khcng th) r6 rang cac n ha thiet ke C# da nit mu6n tao ra mot ng6n nga co the' lam vua long giai lap trinh C++. C# rat dil dap ung vdi ho va c6 kho ng it cac cau true gan giong nhu C++. DI nh ie n ta cling kh6ng loa i tru se co vai t.hieu sot nho nao do rna doi v&i mot so nguoi t hi chung tro nen bAt cap vii khOng ti$n loi.

C# khcng hi) tro da thua ke' (multiple inheritance): MQt lOp (class} cua C# co th€ duoc khai bao la no c6 thg dung nen 1 hay nhieu cac interface t giao dien hay giao tiep), nhung tinh da k;§ thua cua cac lap (classes) co ban lai khong duqc chap nhij.n. D6i vai mot so Iap trinh vien, dac bi~t la nhung ai yeu thfch ALT, thl. tinh chat nay duoc xern la mdt bat cap.

H$ thong C# cling khong cho phep su dung bat ky cac kigu miu template nao ca. Du vay, chung ta He ban them ve vAn d§ filly a cac chirong sau. Da s6 cac cuoc thao luan v~ C# hien nay deu tu ph an (jng cua nhung ai da gat bi'! C# nhu la mot co gang' hien nhien nham vao viec xoa bo Java. Tuy nhien, that ra C# va Java co th€ duoc xem nhu nhung con ngua tren nhung duong dua khac nhau, chung c6 tM' cung t6n tai va chung song hoa binh. C# va toan bi? he thong .NET se Ia cong cu t6t han cho viec ket hop cac rrng dung khach va cac U'ng dung phia may chu, con Java eo nhtrng khuyet diem ro rang cho phan may khach.

Chung ta co th8' noi them ve C# la mot ngon ngu hoan toan huang d6i tinmg (totally object-oriented). C++ bAt nguon tV C: trimc he"t do III mot sl! be) sung phuc hop eho C, sau do la mi)t c6 giing thuc SI! cua dinh huang doi tugng. D.§ t6t hen, C++ phai giU lai mot s6 di!.c di€m cua ngon ngu khong-hirdng-doi-urong: Do la

'li!l20

PHAN I: M& dau

nhung ham d(ic lap va cac bien toan cue, C# thi khac, no tuyet giao hoan toan vdi cac dac tinh nhu the". M9i kigu bien, k~ ca kieu gia tri dun gian, d~u ducc xern xct nhu la mot dOi tucng. M9i ham deu phai thu(ic mot lop (class). Khong con ducc dung cac bien toan cue. Tuy the, xin dltng 10 !.lng, vi cac lap chua cac ham tinh hay bien tlnh eo tM duqc xern va hanh d(ing nhu cac ham d(ic I~p va cae bie'n toan cue. 'I'a hay xern xet m(it vi du vo cung nlli tieng, vo cung ducc ua dung-va cung rat bi ghet: chuong trmh nho gon "Hello World" trong ngon nga C#,

using System; class helloworld; {

public static int Main ( ) {

Console. WriteLine ("Hello Word") i return 0:

} }

Nhu ban thay, cac khai bao va cau l~nh kha gi6ng C, va ban co the hieu duoc dfi dang neu ban dd bie"t lap trlnh C trudc day, Mot chuong trinh don gian cua C# la nhu vf!.y, Chung ta se tim higu no trong chuong sau

8. cAc DOl TU<;jNG TV MO TA NHU THE NAO?

Sieu da lieu (metadata) Itt thanh phan chinh yeu trong kien true dong go i cua ,NET Framework. Metadata dung de mo ta cac cau true da li~u, ban eo the' xern metadata thuoc loai du lieu dung mil ta di:l Iieu, No dung rno hi. cac lap, phirong thuc, danh sach tham s6, cae thanh phan da lieu trong file .EXE hoac .DLL. Bang mo ta metadata bat ky d6i tuong nao cung co thg d9C va hieu dune cau true cua dOi tircng viilt bang ngon ngtr khac. Vi du doi urong C# hoan toan co the d9C va Stl dung duoccac doi tuqng viilt bang Visual Basic hay C++ ,NET.

9. TUONG TAC VOl THE GIGI COM

Tuy ,NET Itt mil htnh mrri thay the cho the gioi COM dang co trong kien true cua Windows nhirng viec thay the khong dien ra den nili ban milt het kha nang sir dung c10i tucng COM, Nen ,NET cho phep ban sli dung va goi cac dOi tirong COM ngay tU cac dOi tliQ'ng .NET va tao ra cac lop vo boe cho phep d6"i tuqng .NET eo the bien thanh doi tuong COM.

10. WINDOWS FORMSJ WEB CONTROLS vA GDI+

Neu ban da tung viet chuang trinh Windows truoc (lay ban h11n da quen vdi lC1p thu vi~n do hoa cue ky hip dan. Trong .NET ban eo rat nhieu hra chon de lap trinh giao dien dli hoa, sli dung lop Windows Forms, thu vien GDI+ hoac cac di~u khien Web Control dg tiepe~n vrii giao dien danh cho irng dung Web. Ban khong con phai metnhoc vdi cac ldp MFC, thay vao do la nhung lap thu vien .NET dan gian d~ hieu va hieu qua hen ra'"t n hieu. Hang loat cong eu lap trinh hieu qua duoc them vao mni trircng Visual Studio .NET rna ban khong h~ tim thay trong nhung moi truCrng lap trtnh tntoc clay.

Moi thu dii sAn sang, eo Ie cIa den Ide chung ta di sau va tlm hieu ngon ngu C# va d6 ding Iii muc dich cua giao trinh nay,

ChUdng 1.2

BO THVC THI NGON NGif TONG QUAT

(COMMON LANGUAGE RUNTIME)

Cire van dJ ehinh se dUde dJ cap den

./ T6ng quan vJ kifin true .NET va ngon nga CLR ./ Quan h~ ella CLR trong .NET

1. TONG QUAN

BQ thuc thi ngon ngti t6ng quat (Common Language Runtime - CLR) giU nhieu vai tro trong h~ thong .NET. No la phan quan trcng trong h~ th5ng thuc thi, nhirng n6 cling giu nh iern VI,! tieh cue trong viec phat trilln VB trilln khai phan mern chay tren kien true nay. No cung cap sl! h6 trc da ngon ngu bang each quan ly cac trinh bien dich (compiler) diroc dung M bien dSi rna nguon thanh ngon ngu trung gian (intermediate language- IL) va tlt IL d€n rna goc (native code), va no buoc chuang trrnh phai thoa tinh an toan va bao mat.

Chung ta hay xem xet nhirng vai tro nay chi ti(~t han.

1.1. Doo gian boa vi~c pb at tri~n

Vai tro phat tri~n cua CLR la quan trong trong viec giarn ganh nang' rna chung ta phai rnang trong cong vii;\c cua chung ta tU ngay nay sang ngay khac, Dung .NET, ban khOng din phai 10 Mn chi tiet thuc cha't van de cua GUIDS, IUnknown, IDispatch, hay cac thir vien kieu, CLR se thay ban cham 10 tat ca nhirng thu nay.

Mil se dang tin cay han vi viec quan lv hi) nho cling la trach nhiern cua CLR. Cac doi tuong duoc thi'! hien dirdi CLR khOng can tinh Mn tham chieu Wang minh; dcr lii;\u rna ban cap phat duoc thu hoi lai bai bQ don dep rae (Garbage Collector) khi rna Ii;\nh cua ban khong slt dung nira, Metadata (sieu da lieu - dcr Iieu co' SCI) cling cho phep lien ket dong cac chuang trinh khli thi. Dieu nay muon n6i ding cac true trac trong viec ket hop cac DLL qua han hoan toan khong con mra. DQ tin cay cling ducc nang cao qua tinh an toan kieu. Ban khong cdn xern xet den nlurng di~u chua biet nhtt kich thiroc cau true hay t6 chuc cac thanh phan trong mot doi tuqng nao do, nho the ban cling khOng can 10 Mng gi v~ cac sap xep hay hil(lu chinh. Han the, khong bao gia ban can 10 v~ viec killm tra gidi han cua mang (array) hay bo dl(lm (buffer).

1.2. Cong' cu b6 trc1

CLR cong tac chat che v&i cac cong cu. nhu Visual Studio, cac trinh bien dich, cac trinh ga rili, va cac trmh tao profiles de lam cho cong viec cua nguni phat trien de dang han nhieu, N gay ca ban khong can Visual Studio .NET rna chi can Mn bo SDK cho c6 duoc su tich luy kinh nghiem, Mot chuang trlnh go rili

~22

PHAN I: Md dau

duoc cung cap bci SDK cung t6t nhu la trtnh da duoc tich hop vao VS.NET. Cac cong cu khac, chang han nhu b<) dich nguoc ngon ngir trung gian (Intermediate Language Disassembler - ILDASM), t~n dung ti~n lrri cua cac dich VI,! diroc cung cap bai CLR.

1.3. H6 trc;1 da ngon ngii

V3'"n de co ban ve h6 trn da ngon ngu la h~ thong' kii'iu chung va metadata (sieu da li~u - da Ii~u co sal. Cac kii'iu da lieu co ban diroc su dung bo'i CLR la phiS bien d6i vdi tat cil. cac ngfm ngl1. Vi vay khOng c6 cac van de chuysn d5i a cac kiElu so nguyen (integer), so cham dong (floating-point), va chuoi (string). Tat ca cae ngon ngu deu giai quyet tat cil. cac kie"u du Iieu thea cung mot each. Cung co mot co ch6 de" dinh nghra va quan ly cac kieu maio

Tat ca cac ngcn ngu cap cao bien dich thanh IL. Mot khi da duoc bien dich va metadata duqc tao cho doi urong, eo the" truy xuat de dang ttl cac ngon ngu khac. Dieu TI<IY muon noi ding cac doi tirong diroc viet bang mot ngon ngl1 c6 the" duoc ke thua trong mot ngon nga thli hai, C6 the" viet mot lap bang VB va ke thira tV no trong C#.

Den nay, co khoang 15 ngon nglY duoc hO tro bo i kien true .NET, kEi cR C++, Visual Basic, C#, Perl, Python, Jseript, Pascal, COBOL, va Smalltalk.

1.4. Vif:c tri~n khai du'c;1c tht!c hif:n d~ hrsn

Vdi kien true .NET, khOng baa gia can phai dang ky cac component (thanh phan) trong h~ thong, Dan giil.n ban eo the" chsp m¢t component vao met thu muc, va CLR se baa dam rang n6 duoc bien dich va chay dung, Ve phan rna dircc viet cho ASP.NET, ban chi can chap rna ngudn C# ca ban, -Iscr ipt, hay VB, va trmh bien dich lL se duqc thuc thi tren rna ngu6n dung do.

Cac component co thEi tr ien khai hay cai dat vao 2 noi. Nrri thli nhat la thu muc rna ling dung cu trii, Dieu nay cho phep cac ph ian ban khac nhau cua ling dung cung ton t<).i tren cung m(it may. Noi thu hai La GLobal AssembLy Cache. Day la kho luu trlY trung tam cho cac hop ngi1 (assembly) rna tat cil. cac ling dung cua .NET co the' truy xuat Mn,

Cho du cac component dircc 111u tru ba't eU- noi dau, thu tuc c;i.p nh~t nlt non gian, Ban chi chep hop nglY (assembly) vao dung thu muc, du la dOi nrcng do nang chay (ban khOng the" lam dieu nay voi m<)t DLL cua Windows), va hi) thong se khien n6 hoat dong,

1.5. St! tach bif:t cac phdn m~m

. Cac ling dung bi e6 lap voi mot ling dung khac bdi CLR M chung khong the" anh hUdng Ian nhau. Cac tai nguyen co the" dmrc dung chung, nhttng viec dung chung duc;te tao ra m(it each ra rang, £)i~u nay muon noi ding m(it M th6ng .NET co tM co each tie"p can tinh bao ~t cua hi) th6ng neu can. Khi ch€ d<) baa mat ducc tM long han, haykhi mu6n truy xuat vao bat ky phan nao cua tai nguyen hi)

CHUaNG 1·2: Bi? thuc thi ngon ngu t6ng quat

23 (!!l

thong, ta co th~ di~u chinh viec cho phep truy xuat cac tij.p tin hay cac tai nguyen h~ th6ng khac chi dua tren co sa ling dung,

1.6. Tinh an toan ki~u va s1$. ki~m tr-a

CLR thuc thi tinh bao mat va, tin cay qua an toan ki1\u, sl! kiern tra va uy thac, Mil lenh co ttnh an toan kieu ducc xay dung phu hop vdi cac qui uoe rna CLR dua ra. No chl dung cac ki~'u diroc nhan dang, chi dung bi? nho duoc cap phat hOi ,trlnh quan Iy bi? nho (memory manager) va kh6ng th~' truy xuat vao dll' lieu cue bi? hay cac phinrng thuc cua cac ling dung khac hay cac tien trinh (process) khac, Mi?t chuang trmh an toan ki~u khong th1\ rei vao tinh trang vi pham khong gian vii. ghi de len cac khci bQ nho ella cac tien trinh khac. Thoim tra an toan kieu xay ra khi rna I¢nh duoc nap len vii. duoc thuc thi hoi CLK Trong suot tien trinh thong dich moi phucng thirc , CLR xem xet cac d~c tll. metadata (dac ta dll' li¢u) ella phuong thuc vii kiern tr a tinh an toan kieu cua no. C6 mot vai tinh huong' rna viec kiern tra nay Iii. kh6ng th4', chang han, khi CLR can dung rna I¢nh ben ngoai ,NET tit rnQt doi tucng cua ,NET. Day Iii. trirorig hop thong thirrrng khi ffiqt lOp .NET goi met Win32 DLL. Trong trucng hop nay rna I~nh phai diroc uy thac (must be trusted) brri CLK

1.7. Tinh bao mat

Van d~ bao mat ella viec quan tdc cac h¢ thong rna e6 the thirc thi cac nQi dung hoat dQng hay thuc hien cac script ella nguai dung Iii rat cao. Vai tu each lit mot client ban khong cho phep mQt chucngtrmh khong ro ngudn goe chay tren may han, huy cac da Iieu c6 gia tr]. Vai tu each Iii mot nguol cung c1lp dich vu ban khOng cho phep cac cuoc tan cong hay cac 16i dan giiin rna nguai dung mang lai cho toan bii hi;! thong cua ban.

CLR kiem soat tinh bao mat, cua M thong qua m1}t cap thOng tin cua nginr: dung Iii user va rna nhan dang d& kiem tra. Vi\\e nhan dang rna, vi du nhu nguni tao ra vii nguo n g6c cua rna I~nh, c6 the duoc bret va viec cho phep sa dung cac tai nguyen se duoc gan tuong ling. Kieu bao mat nay dugc gQi Itt Evidence Based Security (BaD mat dva trsn bang chirng) va IiI mot dac tinh chinh ella .NET. Kien true ,NET cling eung cap viae h6 tro cho viec bao mat dua tren vai tro (role-based) dung trong cac account va group cua Windows NT.

2. QUAN H~ CVA CLR VdI .NET

Sa d5 khoi dLIqe trinh bay trong hinh 1.2·1 cho thay mbi quan hi;! cua CLR vai kien true .NET.

2.1. Chi tie'tv~ CLR

Nhu Iii. m(\t thanh. pMn con cua kien true ,NET, ban than CLR duoc xay dung til cac phan rteng biet, Hmh 1.2·2 eho thay cac phan nay quan h~ vai nhau nhu the nao.

rMj24

PHAN I: Ma Mu

c:JGc:JEJ Other
languages

The Common Language Specification
. (Dac ta ngon ngil chung)

Web Services User Interface E-<
!:il
(Cac dich V1,l Web) (Ciao dien nginri dung) Z
ci
;a
:l
+>
I Data and XML I rn
~
(DiY li~u va XML) :l
rn
>
I Base Class Library I
(Thir vien lap co sa)

The Common Language Runtime (CLR)
(Thuc thi ngon ngiY chung) Hlnh 1.2-1 : CLR vel: ki~n true .NET

Type Checker

Exception Manager

Security Engine

Debug Engine

Thread Support

COM Marshaler

Hinh 1.2-2 : Chi ti~t cae thcl:nh phiin cua CLR

CHudNG 1-2: B(i thuc thi ngtm ngiJ t6ng quat

25~

Nhu ban co thil thay trong hinh 1.2-2, chuc nang ehinh cua CLR nhu hi mot hi? nap tap (Class loader). N6 nap cac lcp rna ban tao hay cac lop mil. duuc cung c€p nhu la bi? phan cua thu vien cac lap co Sd, chuan bi chung cho vi~c str dung, va sau d6 hoac Iii thuc thi chung hoac Ia tham gia vao luc thiet, ke (design-time),

Cac lap ducc nap tir cac hop ngiJ (assembly), ,NET tmrng dircng vci DLL hay EXE. Doi khi hop ngii' chua rna g6c nhirng hau nhu chile chan la chua cac tap da duqc bien dich thanh IL va metadata him quan den chung. Trang thci gian thiet ke, CLR giao tiep voi cac eong cu nhu Visual Studio, NET M cung cap kinh nghiern ve phat triiln (tng dung trang thoi gian ngan (Rapid Application Development - RAOl rna cac nha vi€t chuang trinh VB da dung trong thai gian qua lau, rna con cho tat ca cac module trong tat ca cac ngon ngir. Con trong luc thuc thi, b9 nap I6'p se tai cac lop.

2.2.CLR vao hie thuc thi

Khi bi? nap lop (class loader) rna mot goi chuang trmh trong hie thuc thi, no co mOt s6 buae quan trong d€ thuc hi';'n truce khi cac lap co the th~t su duoc ch ay,

Hlnh 1.2-3 rna phong mo hinh t.huc h ien cho CLK ;

Hinh 1.2-3 : M6 hinh. thuc thi ella CLR

~26

PHAN I: Ma ddu

B9 nap l6'p (class loader) dung b9 quan If rna (Code Manager) d§ dp bo nho cho cac d6i tinrng va ao lieu. B6 tri cao l6'p trong b9 nhc duoc tinh, va moi pluro'ng thirc dii ducc luu tru nhu ngon ngti trung gian se duoc coi nhu hi milt stub dung dEi' goi trinh bien dich (compiler) cho llin thuc thi diu tien.

CHU Y Bqn se thCiy mil liinh. trong hlnli 1.2·3 co hai fti€u ngon ngil trung gian hluu: biet, MSIL va Opt.lls, duoc bien dicli bai cdc trinli bien dich. JIT ctia rieng ciuing. OptlL la mQt tfip con duoc toi uu hoa cao ciia MSIL, duoc thiet ki? dac biet de dung boi h¢ thong chii rrui Jdl0ng co SI! lang phi bQ nllt,! hay toe dQ tinh toano Vi cong oiec diic biet nay rna trinh bien diclt ctl« ngon ngl? cap cao co gang to"i uu. hod, OptIL tlit th.ich hop han vai cdc PDA, dien thoai thong minh, va nh.iing thr:t tuang tu. EconoJIT fa trinli bien dich gon. nhe ail dich. OptIL tluinli ma may.

Bat ell khi nao mot ham tham chicu ldn dilu met kip & trong mot hop ngu khac hay mot ki§u dQ lieu khac rna khong duoc dung truce d6, b6 nap lap (class loader) duoc goi la i de" nap cac d6i tuorig dn thiet. Ban hay nhin vao luu do de hieu r5 tien trinh hun. H~ th6ng thuc thi ao cua Cl.R'(Virtual Execution System - VES) va cac con duong di~u khien chinh duqc trinh My trong hinh 1.2-4.

manager

Hinh 1.2-4 : He thong thuc thi do (Virtual Execution Syslem!

CHUdNG 1-2: B{,> thuc thi ngon ngli t6ng quat

27~

2.2.1. BQ t{LO mii Iuc cai dij,t

M9t phan YES kh6ng dune trlnh bay trong hinh 1.2-4 la b{'> tao rna luc cai d~t rna thinh thoang xuat, hien khi cac hrrp ngir diroc dat len may chu IAn dau tien. Luc nay se tao ra rna go'e (native code) trong hop ngcr de: rna giarn thi§u thoi gian khdi dQng mot doi tltc;trig cu the. ThOng thucng, vise tharn dinh rna nay dlfqc thuc hioiln luc cai dat, nhung neu mot phisn ban thtrc thi hay vieo kie:m tra tinh baa mat Ia ciin thist, thl rna loilnh se duoc bien dich lai bai trinh bien dich JIT chuan thea each binh thircng.

2.3. Cae ki~u du li~lU dti~e cung ca'p hili CLR

Nhu da M cap trinio do, kien true .NET co mot tij.p cac kieu du lieU CC1 sa duqc dung bo i tat ca cac ngiin ng(l khac, Cac kieu nay baa g6rn cac kieu so nguyen nhu so nguyen 8-bit, 16-bit, 32-bit, va 64-bit va char (ky tl,f). Va ke ca cac kieu cham dong (floating - point) va cac kieu can tro den ca vung nho cua .NET lan vung nho ben ngoa i .NET.

Tat ca cac kieu da lii~u CC1 sa co the" dl1qc su dung bdi rna lenh viet bang IL, va ban co the tl! viet IL. IL ra't giong vai hop ngu (assembly language), nen neu ban da tung lam vice va su dung Z80 hay 6502, ban se cam t.hay thoai rnai voi IL. (j phan sau, chung toi se trlnh bay voi ban mot vai IL duoc viet va cac cong cu di vrii kien true .NET rna co the: duo'c dung de bien dich va dich nginrc Iai.

Cac kieu CC1 sd duoc djnh nghta trong bang 1.2-1

Bang 1.2-1 Cac ki~u dfi li~u cd slJ ella CLR

u

Gia tr] 8-bit co dau phan bu cua 2 Gia trj nhi phan khOng diu 8-bit Gia tri 16-bit eo dau phan bu cua 2 Cia tr; nhi phan kh6ng dau 16-bit Cia tri 32-bit eo Mu phan btl cua 2 Cia tri nhi phan kh6ng dau 32-bit Oia tri 64-bit co dau phan btl cua 2 Gia tri nhi phan kh6ng dau 64-bit Cia trj cham dong IEEE 754 32-bit Gia trj cham d(ing IEEE 754 64-bit

Gia trj co dau phan bu cua 2 co kich thuoc tI,f nhien

Gia tri nhi phan khong dau co kich thiroc til nhien , cung 1ft con tro (pointer) ella COM

I1 UI 12 U2 14 U4 18 U8 R4 R8

~28

pHAN I; M& d§.u

RBResuLt

Kich thuoc W n hien eho ket qua ttnh toan cham dQng 32-bit Kieh thuoc W nhien cho ket qua tinh toan cham dQng 64-bit Gia tri cham di)ng co di) chinh xac cao

Doi tUl,l'ng co kich thirdc tu nhien tham ch isu den vung nho cua .NET

R4Result

Rprecise

o

&

Con tro e6 kich thiroc tl! nh ien (co th~ chi den vung nhc cua .NET)

Bang l.2-1 de C?P den cac kich thuoc "tlj nhien" eho cac ki~u dCl lieu. 8ieu nay n6i den cac kich thuoc rna !lugc an dinh san bdi phan cung, Ching han nhu, mot may c6 duang truyen 16-bit co tM se co so nguyen tlj nh ien HI 16-bit, va mot, may c6 ducng truyen 32-bit se eo so nguyen Ian phu hop, Dieu filly eo the la mot, van de khi cacchunng tri nh phai noi chuyen vrri phan mem a dau kia cua mot ket noi internet. Kh6ng c6 chi thi ro rang, that la kh6 de' biilt mi)t so nguyen a dau kia Ion nhu the nao, va viec kh6ng urong thich ve kich thliac ki~u, va khong lien ket ve cau true eo tM xay ra. De' biilt dieu nay va cac van d~ nrong tv khac, CLR chi dung mot vai kiElu du lieu danh rieng khi liac luong va chay phan mern tlurc su. Kieu co' sa rna kh6ng vira vdi cac kich thuoc it diroc chon thl dul,l'c dong goi va mrr goi mot each clin than thanh nhung kieu du lieu kha chuyen hon. Dieu nay dien ra a ben dl10i va ban khong phai 10 LAng gl.

2.4. ))u li~u va ma l~nh cua .NET

CLR bao g6m bi) quanfy rna (Code Manager) va bl} don dep rae (Garbage Collector - GC). Cac khdi chuc nang nay chiu trach nhiem quan Iy bi) nhc cua ti'lt ca cac doi tucng co sa cua .NET, k~ ca cac ki~u dCl lieu dinrc quan IY. Code Manager cap phat khorig gian luu tri1; Garbage Collector xoa no va lam gnn heap de giam thigu cac phan doa n.

VI GC chiu trach nhiern lam gon heap (vung rihd cua chuang trlnh), du l ieu hay cac doi tircng duoc s11 dung trong khOng gian du'l,l'c ki~m soat bdi .NET thuong bi di chuyen til nai nay sang noi khac trong suot thoi gian song cua chung, Do la tai sao, trong cac tinh huorig thong thliang, cac doi ttrorig luon luon duoc truy xuat hoi tham chieu (reference). Trang the gidi c++. tham chieu thl khcng khac vo'i con tro (pointer). Co' che' duoc dung d/l tim d6i tuong diroc tham chieu den cung gicng nhu met con tro chi den mot khoi b(> rihd nao do. Cac tham chieu C++ la each n6i cua trtnh bien dich rna no chac di.ng ban dang chi den mnt kigu C1,I the. Trong C++ c6 tM hru rnl}t tham chiau diln mot db; tirong, huy doi tuong d6, va sau do su dung chinh tham chieu li'ii thai d6 M truy xuat Mn vung da dung cho doi tuong. Di~u nay thuong gay ra hu hong tram trong trong chuong trinh C++.

Tuy nhienduni M thong .NET, van d~ nay bi loai tru, Bat Cll khi nao mot tham chieu de'n mi)t dbi tl1qng dircc tao, db; tuong d6 bie't n6 dang dliqc tham chieu den, va GC se kh6ng bao giCl huy n6 tr-u phi n6 giai ph6ng ganh nang, Han nua, khi GC don dep heap (vung nho cua chuong trmh) va di chuyEi'n cac dbi tirong

29iMl

CHUONG 1-2: BI)' thuc thi ngon ngii' t6ng quat

trong bl) nhri, tat ca cac tham chicu den d6i tuong d6 diroc cap nhat mot each tli dl)ng, Di~u nay khien cac component (thanh phan) dang dung d6i tircng d6 se nhan dligc hfy tham chieu dung khi cac thanh phan nay truy xuat den d6i tugng a Ian ke,

. Qua Code Manager, CLR chiu trach rihiern bo trf b{l n ho tlurc cua cac doi tirong va cac cau true rna no lam chu, Thuong tien trinh b6 tr'i nay la tv dl)ng, nhung khi ban can lam thi ban e6 tM chi ra thir tt!, su sip xep, va dinh ro viec b6 trf bq nho trong metadata. R6 rang la dieu nay c6 the duoc thuc hien vi rnetadata tht luon e6 s~n d6i voi lij.p trlnh vien thong qua tap cac interface (giao dien) da duoc dinh nghra,

2.5. Mii l~nh ella COM va vi~c truy xua't dii li~u

Co le khong r6 rang la tinh an toan kieu, tinh baa mat, va viec kiem tra ella .NET cho phep ban bao v~ nhu the' nao 61,1' dau tir cua mlnh trong rna C++ rna tV lau nay ban da qua cham chut cho no.

Nhu la mot, he qua, Microsoft Ct trong cung canh ng? dung nhu vay vii kien true .NET c6 cac kha nang tuy~t v?ti cho vice sit dung lai ma c6 trirdc day cua ban.

C6 ba co che co ban danh cho thao tac lien ket giua .NET va COM trong .NET. COM lnterop cho phsp cac doi tugng COM ella ban duoc sit dung boi kien true .NET y nhu the chung la cac doi tuqng ella .NET. Co ch€ g9i M th6ng (Platform Invoke - PlInvoke) de cac doi nrcng ella .NET goi cac diem vao trnh (static entry) trong cac DLL giong nhu LoadLibrary va GetProcAddress. Cu6i cung, IJW (It Just Work - Lam viec ngay) trong hau hetcac hlnh thirc err ban ella no cho phep ban bien dich lai ma ella ban va , .. n6 lam viec ngay, Mot hinh thrro phirc tap han cho phep ban nang cap rna lenh cua ban trong vice su- dung cac phan md rong' ella .NET deli vdi C++. £)ieu nay cho phep ban t1,\O day du cac dbi tliqng GC trong vung nh6 cua .. NET de rna nguon C++ cu cua ban sit dung.

2.5.1. Ca che'gpi cae d5i (ur;tng COM (COM Interop) qua CLR B1,\n co the thily trong hmh 1.2-2 dng CLR chua mot bl) sap dat COM (COM marshaler), Khoi chtrc nang nay chiu trach nh iern ve v iec goi cac doi urcng COM (COM Interop) tren .NET. Co hai kich ban can phai goi cac doi tuong COM tren kien trucNET. Kich ban thir nhat la khi ban muon truy xuat cae doi tuqng COM cu tu rna lenh cua C# hay VB rna ban viet. Rich ban thu hai Iii khi ban muon thuc hien ml)t giao dien (interface) thong dung rna c6 cac doi tuqng COM ella ban truy xuA't den.

£)oi vci ca hai kjch ban nay, CLR dong vai tro rilt nang d{lng bang each tao mot lap baa (wrapper) rieng biet vao luc thuc thi va sau do lip di),t da Ii$u xuat nhap cua doi urong COM khi can. Sa do trong hinh 1.2-5 eho thay mot dOi tuong COM dang diroc truy xuat bcri mot d6i tugng client .NET.

~30

PHAN I: M& diiu

2. CLR tao mot lap bao thuc thi cho

1. Boi tu'Qng .NET muon

truy xuat mot doi tu'ong;-.----t;;;;;;,,;.,. _ ...

COM

Hrnh 1.2-5 . Ma duac qutin If l'o-i tien trinh goi d6i tuong COM

Be' Slr dung cac doi tinrng COM vrri cac chuang trinh .NET ella ban, ban can phai dira vao (import) dinh nghia thir vien kieu (type library). VS.NET se lam dieu nay cho ban mot each tv dong khi ban them m(lt tham chieu vao doi tuorig' COM trong IDE, thea cung mot each rna cac Hip trlnh vien VB da lam trong nhieu nam. Ban cung co the su dung cong C\I TLBlmp (Type Library Import) mot each tudng minh. TLBImp se chuyan cac ten phuong thirc trong COM thanh cac ten phuorig thirc trong .NET cho ban. Vi du, ten phuong thuc trong COM

HRESULT MyMethod(BSTR b, int n, [out, retval lint *retval); Duoc dich thanh

Int MyMethod(String b , int n);

Ket qua la, khi ban goi phuong thirc ban khOng phai 10 ling hieu HRESULT, dan gian ban eo the gan gia tri nguyen tra ve vao mot bien trang rna l~nh cua ban, Thuc te, toan bi) hlnh anh tien trmh .NET-to-COM la ra't d~ su dung, Ban khong phai 10 viec chuyen doi da lieu. Nhu ban eo tM thay trong vi du, cac kieu di'r lieu COM chang han nhu BSTR anh xa vao cac kieu nrong ducng de nhan tha'y cuaNET. Ban khong phai quan ly vi~c Mm tham chieu va khOng eo Gums. Neu ban nhan gia tri HRESUL T that bai, ldp wrapper dang thuc thi se tao mot exception (ngoai I~) rna ban co the nam b<'it.

CHudNG 1·2: B(\ thuc thi ngon ngu tong quat

31~

Khi ban muon goi mot doi tuong .NET tli cac doi tvqng COM, tie"n trinh rna CLR dung M lam cho viec ket noi de dang la wong tu vdi so d& dvqc dua ra trong hinh 1.2-5. Hinh 1.2-6 mo phong viec ke't noi COM-to-NET.

2. CLR tao mot lrrp baa co tit ea

4. Doi tuong COM nhan giao dien

COM client

1. COM client cl1n truy xuat mot interface tren doi tugng .NET

Hinh 1.2-6 Truy xutit mOt doi t uong .NET tit COM

Cac doi tucng COM chi co the' truy xuat cac phuong thuc loan cue ella cac d5i turrng' .NET cua ban, nhung chung co th(\' duoc su dung tit the gidi COM.

Dau tien, tao mot typelib W d6i tuong cua ban bang each BU dung cong cu TlbExp ella .NET. Ke den, dang ky hop ngO" diroc tao bdi TlbExp bang cang cu RegAsm. Day la lan duy nhat ban se can dang ky cai gi do du'ai .NET; COM dang chay trong phan chua duoc quan Iy tri'n may chu can pha i kich heat doi tuqng nay thea each chuan. Cu6i cung, tu COM ban c6 the' su dung CoCreateInstance va QueryInterface, si't dung AddRef vii Release nhu thirong, va su dung HRESULT rna lap wrapper cung cap.

Sau nay, trong phan 5.3, chung ta co mot chuong danh cho COM Interop, ta se di sau hen va co nhieu vi du hon.

~32

PHAN I: Md d.1u

2.5.2. LUi g9i hf th6ng (Platform Invoke - PIInvoke) tit CLR

Mot trong nhung yeu cau chung nhat doi vdi hoat dong Iien ket se Ia vi~c sU" dung mot DLL rna da t6n tai tren he thong CI,lC bi). Ching han nhu, ban co tM can phai tiep tuc sU" dung cac cong cu rna ban da dfiu tu vao va chi co sl'in d dang DLL.

Kien true .NET cung cap co che P/lnvoke cho muc dich nay. Co cM" ni)i tai thi rat giong vdi COM Interop, n hung vi cac DLL rna ban dung thi lucn luon 0" cue bi) (tren cung mot may), h~ thong de su dung han.

D~ sli dung Co' che PlInvoke, ban can met lap wrapper M uy quyen cac 1(li goi tU CLR den ham thuc su cua DLL. Ban co thii" tao cac wrapper nay bang each sl! dung cac thucc tinh d~c biet trong cac dinh nghla phuong thuc cua ban.

Doan rna trong vi du sau se eho phep ban goi mot ham trong mot DLL tuy

bien.

MyDlLDll chua m(it ham int Myfunction(int x); Public class t~yD1H-.jrapper

[DllImport ("t1yDll.Dll", EntryPoint="MyFunction") 1 public static extern int Myfunction (int x ) ;

Bay gio ban c6 th~ truy xuat DLL stl dung cac l~nh cua C#:

Int r =' t1yDll'tirapper. MyFunct i on (12) ;

Trong chirong 1.4, "Lam viec vrri cac phan rna rbng .NET va C++", chung ta se khao sat co' che P/lnvoke chi tiet han khi chung ta xe m xet cac phan mer rong duoc quan ly doi voi C++.

2.5.3. IJW (It just works - No hog.t di)ng ngay)

Cach dan gian nhat M dem cac ling dung C++ cua ban vao kien true .NET la phai t<%p hop tat ca cac rna: nguon EXE hay DLL cua ban. Bien dich lai tat ca chung vcri tuy chon / C LR cua trlnh bien dich va chay chung, Microsoft noi "N6 hoat d(\ng ngay.". Co Ie dieu nay dung neu ban da va dang lap trinh thea phong each hien dai, Neu rna cua ban van con chua cac khai bao kieu K&R Iau doi, thi no se khong hoat dong.

C6 mQt vai gicri han d6i voi tien trinh nay. Ban khong tM bien dich la i tat ca cac thu vien lap cua ban va sau d6 ke thiia tit chung trong noi da diroc kiern soat. Ban kh6ng th~ truyen mQt each d~ dang cac can tr6 cua .NET vao cac ham va cac ling dung cua ban.

CIl tien trmh IJW IAn Pl1nvoke deu keo dai CUQC song cac c6ng cu cua ban va cho ban m(>t co' hQi de dem vao kien true .NET.

2.6. Cae thimh phdn md rc}ng cua .NET d6i vai C++

'I'hucng tht khi sa dung lai, rna l~nh cu cua ban la kh6ng du, va ban cfin mot each tiep can hop nhat han tu vilin canh cua lap trinh vien C++, cac thanh

CHlfdNG 1·2: BQ thuc thi ngon ngfC t6ng quat

33~

phdn rna rQng cua .NET dQi vdi c++ la giai phap If tl1ang hoac la rnQt con dl1G'ng di VaG .NET.

Kien true .NET them VaG mot viti khai niem quan trong M quan If b9 nho va vi~e sa dung di? lieu. TAt ca cac dac tinh nay thl co sdn trong ng6n ngfC C# va VB nhung khong co san trong c++. 'Nhung dac tinh be) sung nay du'gc thao luan trong cac phan theo sau,

2.6.1. Cae lftp don. dep rae (OC)

Cac 16'p GC III cac dbi tl1Q'ng d~ rna tit ca viec quan If bi} nhd dl1gc thuc hien bai CLK M9t khi ban ngung sli dung mot lap GC, no dl1gc danh ddu met each nr dQng dg huy va duoc thu hili hai heap eua GC. M9t ldp GC cling co tM co phuong thuc My co tM duqc goi ID9t each tuang minh.

Ban c6 th~ tao cac lop GC bAng each sli dung tit khoa mci ~e tren cac krp cua ban:

_gc class MyClass {

public: int In_X; int In-y;

SetXY (int X, int y) {

In_X = J!:i In-Y = y;

}

}

Bay giG' MyCIass Iii met lop GC.

CANH BAo Neu ban su dung ~asrn hay setjmp trong cdc phuong thta: C++ ella ban, trtnh. bien dich. se dua ra cdc khuyiin cao; lhli chgy ma lenh. nay co thi dan den hu hong neu ph uang thtic nay sli dlfng bat ky kieu hay rna ella .NET. Cdc lap GC cua ban co the chi dung su M thua duy nhdt. Chung khOng thi co mgt copy constructor (phuang thu«: khi'Ji dung chong) va khtJng thi ki thua eh6ng cdc loan tli (operator) & va new.

2.6.2. Cae lflp giu. tri

Til khoa moi _value cho phep ban tao cac ki~u gia trl trong rna I~nh C++.

Chang han, ban co tM can tao tren heap (vimg nho cua chuong trinh) m9t cau true 3D_Point cocac thanh phan x,y,z duqc dung nhu la m(lt ki~u gia trio Cac ki~u nay duqc tao tren heap nhung e6 th~ dl1<;tc d6ng hay duqc g6i theo mOt ki~u bao di'ii tuqng, si't dung tic khoa _box d~ dung chung nhu cac Mi ttigng cua .NET. (C6 mOt thao luan bao quat v€l bao (boxing) cac doi ttiqng va khong bao (unboxing) cac Mi ttigng trong Phdn II ella quy€n sach nay, "The C# Language") Khi chung dl1qc bao, cac ki€u gia tr] nay c6 th~ diroe sli dung bai rna I~nh cua .NET, duqc gii? trong cac lap tap hop cua ,NET, dircc serialize thLiCtng la vai XML, va van van.

~34

PHAN I: Mit dt\u

Cac l~ va cac cliu true voi tit khoa _value kif thua tli lop System.ValueType cua ki€n true .NET va c6 tM dinh nghta chong bat ky phuong thirc nao mil. doi tucng d6 can c6. Dl).t cac phuong thuc virtual tren lap gia tri cua ban Iii kh6ng duoc phep, Chang han, ban co tM dinh nghia cMng phuong thuc System.ValueType.ToString M tao m(it chudi M me ta doi tUQ"ng. Vi du nnu, int32.ToString() tr~ v~ so il dang chuoi. Nhu itoa( ... ). Ban cling c6 th~ muon dinh vnghta chling phucng thuc System.ValueType.GetHasCode M sit dung trong mQt t~p hop anh xa,

Cac lop gia tri TIl\Y hoat dQng nhir cac lap cua c++ khi duqc sit dung trong c++ nhung ding co tM dugc su dung boi cac chuang trinh thuc thi cua . NET. Chung khong dugc cap phat true tiep ti1 heap (vung nha coo chuang trtnh) cua .NET, nhung chung c6 th~ dugc su dung bili cac deli tiamg cua .NET khi dugc bao lai.

Co mQt vai qui tAc d~ rna ap dung cac lap nay. Ban co tM nhan lop gia tr] tl1 mQt hay nhieu interfacs (giao tilfp) cua .NET. Nhung ban khOng th~ dinh nghla chling mot constructor (khdi dung) cho no. MQt lap gia trj kh6ng th1l c6 tiJ khoa _abstract di kern. Cac lap gia trt dugc "niem phong", c6 nghia 180 chung khong thE! diroc ddn xuilt. Ban khong tM khai bao mQt con tro Mn mQt lap gia trio

Nhu vdi tli khoa ~c, ban khong nen dung _asm hay setjmp neu lap do stl dung bilt ky ma lenh nao cua .NJ;:T, chap nhan cac kieu cua .NET nhu cac tharn so, hay tra v~ mQt ki~u cua .NET. N6 e6 th~ bien dich, nhung no se co th€ khong hoat dQng tot.

2.6.3. Cric thuQc tinh (property)

Cac lap Cit trong .NET c6 thEl co cac thuQc tinh co cac phuong thuc tru3 xuat get va set. Til khoa _property cho phep ban tao cac lOp GC dEl ho tro cal thuQc tmh. MQt thuoc tinh giong nhu mnt thanh phan da li¢u trong lap cua bar nhung lamotdoan rna thi).t SI!. Vi du dirdi cho thily mQt thuQc tfnh se duoc tao vi su dung nhu thE!" nao,

#using "mscorlib.dll" _gc class My3Dpoint

{

II ~c Clinh oa.c the.nh ph!n Ie. cue bi> int m_x;

int mJI

int m_ZI

public!

-property int get_x ( ) {return m_x;} ; .J!roperty void set_x(int value) {m~x=value;}; -property int getJ ( ) {return mJ; } ;

-property void set_x (int value) {mJ=value;};

-property int get_z () {return m_z; } ;

-property void set_x (int value) {m_z=val ue; } ;

II cac phuong thuc.khac cua 3D 6 Clay

} ;

void main (void)

r ,

y c n a

CHl1dNQ 1-2: BO thire thi ngon ngu t6'ng quat

35~

{

My3Dpoint ·pP=new My3Dpoint ( ) i p.P- >x:::l0; / I 99i set_x (10) ; int x ::: pP->Xi / I 99i get_x () ;

}

2.6.4. Ghim (pin) cae gici tri l{J.i

Heap cua GC sil thub'ng xuyen di chuyen cac d6i tuong' W ch6 nay den eh6 khac trong suot qua trtnh boat dOng ella n6. BAt ell' khi nao ban can truyen mot con tro Mn mot d6i tuong cua .NET hay met ham C++ cua COM, ban co tM ghim cac dili tuong bang viec So.1 dung tU khoa _pin. Thao tac ghim (pin) nay ngan cam GC di chuyen dili tirorig d6 cho den khi n6 khong hi ghim nua.

2.7. Cae ngoai l~ (Exception)

Tat ea cac ngoai I~ trong kien true .NET duqc xU' If bdi eLK CLR cung cap mi)t CCl che manh va nhat quan trong viec theo vet va xli 1)' 16i bift ell khi nao chung c6 th§ xay ra.

Cac ngoai I~ trong CLR dung cac deli tinrng exception, thuong diroc dan xuat tu lap System. Exception trong kien true .NET va mot trong b6n bi) xU' If ngoai l~. Cac bO xli If nay la

• Bi) xii Iy f i n a 11 y diroc thuc hien bat e(( khi nolo mot kh6i thoat ra. Bi) xii If nay diroc goi trong luc ket thuc blnh thuong ml>t deli tuqng cung nhu khi ml>t 16i xay ra.

• B(i xir If fau 1 t chay khi m(it ngoai l~ dung xay ra.

• BQ xli Iy type- f i It ered phuc Vl,I cho cac rigoai l~ tir ml>t tap cu thil hay cac tap dlln xuat cua n6. Vi du: catch (MyExceptionType e)

• BI> xli Iy user-f i 1 tered co the phat hien ngoai I~ d6 c6 nen bo qua hay kh6ng, diroc xLI Iy bdi bi? xii' 19 duqc lien ket, hay duqc truyen den ngoai l~ ke tiep co hieu Il!c.

Moi mQt phuong thtrc cua moi tap trong cac thu vien trong kien true .NET hay trong rna I~nh ella ban c6 rni;it bang cac bQ xli Iy ngoai Ii): k€t hcp vdi n6. Cac phdn tii' trong mang mo ta mQt khoi rna lenh diroc bdo vi): va bi) xli Iy ngoai I~ lien ket . vai n6. C6 th§ hoac la khong c6 bi) xu 19 nao, bi) xu Iy catch, b9 xl! Iy finally, hoac Iii bQ xu 19 fault cho moi phdn tli cua bang. Khi mQt ngoai I~ xiiy ra, CLR tim mQt ngoai Ii): trong bang phuong thirc d~ dua cho bo;. xii IY. Neu mi,it ngoai I~ dt.1qc tim thay, quyen di~u khien duoc truyen den b9 xif 19 nhu thuang; ne'u kh6ng, CLR tiep tuc qua ngan xep (stack) di Mn phuong thuc dang g',li va van van, giu lai chu6i milt rich cae lai goi cho den khi met b(i xii Iy diroc tim thlly. Neu mi)t ngoai W khong duqc tim thay, CLR se ket thuc ((ng dung va ti~n hanh hi~n thi ngan xe'p.

Khi chung ta di xuyen su6t quy~n sach nay, cac vi du se dua nhi~u thong tin chi tiet hen v~ each tao cac lap ngoai I~ va cac bQ xii' IY.

\!!l36

pHAN I: Mo d~u

2.8. H8 tr«j vi~c gCi r6i

Kien true .NET c6 trlnh g<t roi dugc xay d.,rng trong no d mire ra."t thap, Khong nhu cac h';' thong go reii khac mil cac Iap trmh vien C++ quen sii dung truoc kia, thuong Iii xen vao, CLR thuc hien ta."t ell cac rna l';'nh, n6 quan Iy viec gil rOi va gai cac 51,! kien den bi) ga roi duoc ket neii bat ell' khi nao can. .

SDK cua .NET e6 cac trmh go rili cua rieng no, them vao do la trinh duoc tieh hop vdi Visual Studio. NET. Ta."t eli cac trinh g<t rni hoat d(lng qua cac API chung duoc cung ea."p bai kien true.

3. KET CHUONG

CLR Iii trai tim cua h.;. thong .NET. N6 nap va quan ly cac mil len h, urong tac vai cae c6ng cu phat tri~n va cac trinh ga rili cho ban, twin thu tinh an toan va bao mat cua h~ thong cua ban, va eho phep ph!1n m,§m ella ban tieh hop vrri cac h';' thong co slin trinrc d6 nhu COM va cac DLL cua nguai dung. La mot thanh phan cua .NET CLR khong chdc rAng ban nghl nhieu ve no chut nao.

Chilling 1.3

NGON NGU TRUNG GIAN IL

Cae van d~ chinh se dil(!c d~ c{ip d€n ~ Lien kiit (Inter-Opt Ngon ngr7

~ Hello IL

~ Ham (functions) ~ Lap (classes)

~ ILDASM

~ Metadata

~ Reflection API

Vao thoi dai cua sv phat tritln phdn mern ngay nay, nhung ngisri phat tri';n g!l:n nhu chi sa dung ng6n ngir cap cao nhu c++, Visual Basic, hay Java dtl vie't cac ling dung va cac thanh phan (components). Co Ie coneat it ngu'oi higu du'qc cong' viec nhtrng ngl1o-i lap trinh xuyen phieu (binary developers) va cung c6 Ie chi con dam ba nguO-i I~p trinh hop ngu,

V~y tai sao IL, Intermediate language, quan trong doi vdi .NET den nhu V?y? Dg tra lo-i cau hoi nay dn di II1<1t qua nhrmg dieu co' ban (rna ta thunng gQi la 101 dieu) cua If thuyet ve trinh bien dich. C6ng viec co' ban cua trinh bien dich (compiler) til. phai dieh rna nguon d9C duoc thanh rna goc co tM thuc thi eho mQt h~ thong (platform. da dinh. Qua trinh bien dich baa g6m viti giai doan, baa gorn rna khbng hi giCii han ve vi~c quet tlt vung, phan trch , tao cay cu phap truu tucng (abstract syntax tree), tao rna trung gian (intermediate code), phat sinh rna (code emission), trrnh dich hop ngtr (assembler), va noi ket (linking). Hinh 1.3-1 trlnh bay mQt so' d5 co ban cua qua trrnh nay.

Hinh 1.3-1 TUrn trinli 81/ bien dich.

SI/ tao thanh rna l~nh trung gian (intermediate code) d~t ra mQt cau hoi thu vi: Neu co thg dich mot, t~p cac ng6n ngu da dinh thanh rna trung gian chuan nao

~38

PHAN I: Mil d!iu

d6 thi sao? Bay la ehO rna IL to ra thich ling voi van d~ dat ra. Kha nang dich cac du true ngon ngir cap cao thanh mQt dang chuan, nhu IL, co chu y d~n trmhbien dich co ban dan (single underlying compiler) hay trinh bien dich just-in-time (JIT). Day Iii each thrrc duoc thue hien do .NET.

Vai lei girli thieu v~ Visual Studio .NET, Microsoft cung cap Managed C++, C#, Visual Basic, va ASP.NET, moi ngon ngll nay tao ra IL tit rna nguon tuong Ung ella chung. Cung co mot vai nha cung ciip ngon nga thu ba dua ra cac phien ban .NET W nhung ngon ngu wang Ung cua ho. Hmh 1.3-2 trinh bay tien trlnh bien dich .NET eel ban.

Di,:l,u quan trong M chu y Mn la IL khOng duoc thong dich. Dung hon la, h~ thong .NET (.NET platform) stl dung cac ki~u khac nhau cua cac trmh bien dich just-in-time d(i' dua ra rna g6c (native code) til ma IL, Md goc chay true tie'p tren phan cling va khcng can phai co mqt may ao, nhu a trtlC1ng hqp Java vii nhirng phien ban ban diu cua Visual Basic. BAng each bien dich IL thanh rna g6c (native code), hi~u nang lric thuc thi duoc tang can so voi cac ngon ngu thiing dich chay tren mQt may ao, Chung ta se khao sat cac ki~u khac nhau cua cac trrnh bien dich just-in-time sau, (Tu day tr& di chung ta se gni cac trinh bien dich just-in-time nhu la jitter),

Hinh 1.3-2 Slj bien dicli .NET.

IL HI. ngon ngu tron ven , dua vao ngan xep (full, stack-based language) rna ban eo thg slt dung M cai dat cac thanh phan .NET Mae du n6 khong chile chin duoc dua ra vi muc dieh v~ hieu suat, ban <:6 the' sir dung IL d~ thuc hien n hung van d~ rna ban khiing tM thuc hien vrri C#. Vi du, trong IL, ban co the tao cac ham toan cue va goi chung til ben trong IL.

1. LIEN TAc UNTER-OP) NGON NGU

Kha nang HEm tac (inter-op) mot each li~n lac giila cac ngon ngll da duoc ban de-n tl1 lau, Tren cac n~n Windows khac nhau, tieu chuan d~ ph at tr ien ngon ngu chao nhau la COM (Component Object Model). M9t ding nghe hoan hao da ra dai rna muc dich duy nhat Iii phat tri~n cac COM component and ActiveX control,

cmrosc 1·3: Ngon ngO' trung gian IL

391fj

sai vi COM La m(jt chudn nhi phan, bilt cli ngon ngfi nao c6 khii nang sU' dung (of consuming) nhirng thanh phan COM La c6 th@' sli dung chung khOng k~ den ngon ngil' nao dii tao nen thanh phan COM,

M~e du COM dii cho kha nang sli dung lai cac thanh phdn, nhirng n6 con lau moi duoc hoan hao.: Cac ngon ngO' nao d6, nhu cac ngnn ngO' script, chi e6 the sll dung giao dien mac dinh duoc cung cap bdi d6i unmg COM. Ngoai ra, no khong the k~ thira (inherit) mot thanh phdn COM de rna rong chirc nang co ban cua n6. De rna rQng mQt dOi tuqng nhi phan, nhirng ng11Cri phat trien da phai baa thanh phan COM lai, khong La mot phirong phap huang dOi tuqng thij.t sl,f.

Vcri sJ! xuat hi~n cua .NET va IL, nhi1ng trd ngai nhu vay khOng ton tai lau han mra, Bdi vi moi ngon ngu khi da nham vao nen tang .NET d~u hieu ro ban cMt IL va sieu du lieu (metadata) cua thanh phdn .NET, m(jt eilp d(j mrri v~ kha nang hoat d(jng lien ke't (interoperability) ra di1i. Sieu du Li~u (metadata) eho phep duyet mQt thanh phan .NET d8 tim ra cac Lap (class), cac phuong thuc (method), cac trui1ng (field), va cac giao difn rna n6 chua. D~ tai cua sieu dn lieu (metadata) se duqc trlnh bay a cuoi phan nay.

2. HELLO IL

Vi~e Sll dung IL d8 phat trien cac thanh phan va cac Ung dung .NET co kha nang Ia ban se khong thirc hien duqe nhieu viec, Tuy nhien, M nghien CUll that su y~' kien true .NET (,NET framework), viec nam duoc co ban v~ cau true IL La quan trong. NET SDK khong chuyen giao rna nguon co sa. Dieu nay khong co nghia la ban khong' tM nghien ciru viec thuc hien cac thanh phan khac, Tuy nhien, din phai co met so' kien thuc v~ IL.

Thong thuong, hAu nhu can thie't, bucrc dau tien trong viec hoc mot ngon ngu mci La hiGn thi thong baa "Hello World" rna ai cOng bi€t tren man hlnh. Thuc hi~n cong vifc nay chi vdi IL tht khong mat nh ieu cong' sue nhu khi lam cho no phat ra am thanh, IL khOng la m(jt ngon ngO' cilp thilp thuc sl,f. tua assembly. Tuong tl! nhu hl'iu het cac ngon ngfr hien dai khac, dii co rnQt hrcng dang M cac khai niem truu tirong ngon ngir IL. Vi du 1.3-1 trinh bay chirong trrnh n5i tie'ng "Hello World" viet bang MSIL.

Vi du 1.3-1 Hello World

1:IIFile

2: IITac gia 3:11

4: II

5:

6: Ildtnh nghia m¢t va I thOng tin assembly co ban 7: .assemby hello 8: {

B:

:Hello.cil

: Richard L. Weeks

9: .ver 10: }

11:

1:0:0:0

~40

PHAN I; M6" dau

12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:

Ilt.,.o m¢t diem nh~p cho exe

. method public static void main ( ) i1 managed {

.entrypoint .maxstack 1

Iltcii chuOi len de hH~n th:j. 1dstr "Hello World IL sty1e\n"

Ilhitin th:j. ra man hinh

call void [mscor1ib)System.Conso1e: :WirteLine( class System. String )

26:

27: ret

28: }

29:

I)g bien dich vi du 1. 3-1, dua ra dong lerih sau: i1asm he1lo.ci1

Trinh dich hop ngu IL (Il, assembler) tao ra tap tin .NET hello.exe.

Ma I~nh IL hien thi thong baa "Hello World IL style" bang each sa dung phuong thirc static Write ella dili tuong System. Console. Lap Console Iii mQt phan ella kieri true .NET (.NET framework) va, nhu each Sl! dung cua no eho biet, muc dich cua n6 la ghi ra ket xuat chuan (standard output).

CM y ding khong can tao mot lap. IL kh6ng 1<1. mot ngon ngu huang d6i tuqng (object-oriented language), nhung no cung cap cac cau true can th iet M mo ta cite d6i tuqng va sll dung chung, IL duoc thiet ke M tao su tuong thich giUa cac cau true ngon ngu va cac kieu lap trlnh. Nhu vay tinh da dang va rong rai trong thiet k€ cua no se tinh Mn nhieu ngon ngu khac nhau M nham VaG thoi gian thut thi cua .NET.

/',(;)6· m(Jt. s6 chi.thj (directive) f;OY nghia d!)c bi~t trong Tl.. Cac chi thi (dirtlftHie) nay dliqe trlnb bay 6" bang 1.3-1.

Bang 1.3-1 Cae chi thi cua IL duoc dung trong "Hello World"

Chi thi

Y nghia

.assembly .entrypoint .maxstack

Ten ket xuat cua assembly

Bat dau sl,t tlurc hien cho mot .exe assembly

S6 cac khe ngan xep M danh rieng cho cac phinrng th((, hay ham hien hanh

CHUONG 1·3: Ngon ngu trung gian IL

41~

Chu y rangch] thi .entrypoint xac dinh di€m bAt d!iu vi~c thgc hiencho bat cu .exe assembly nao. Du eho ham ella chung ta co ten main, no co the co bilt cli ten nao rna chung ta muon. Khong giong nhu C, C++, va cac ngon ngtt cap cao khac, IL khOng dinh nghra m(lt ham duoc dung nhu diem khrri diiu cua viec thuc thi. Dung han, IL dung chi thi .entrypoint M dap (ing rnuc dich nay.

Chi thi khac can chu y la chi thi .assembly. IL Slt dung chi thj nay de dat ten ket xuat cua assembly. Chi thi .assembly cling chua so thir tv phien ban cua assembly.

3. HAM (FUNCTIONS)

Vi du Hello World cua IL chi bao ham mot phirong thuc. Gia rna tat ca nhung nhu cau phat trien phan mern dan gian nhu the nay! Bdi vi IL la mot ngon ngu dua vao ngan xep (stack-based language), cac tham so ella ham ducc day len ngan xep (stack) va ham duqc goi. Ham diroc go i co trach nhiern xoa b.1t ell tham ' so' nao kh6i ngan xep (stack) va My bilt ell gia tri tra ve nao trtr lai ngan xep (stack) cho ngiroi g9i ham.

Qua trinh day cac gia tri vao va lay cae gra tri ra tlr ngan xep goi (call stack) c6 the duoc hinh dung nhu da .trrnh bay a hinh 1.:3-3.

Add function
Program Code
call stack
call stack
pop
Push 10
0
Push 15 0 B8
B8
call Add pop 10

pop 25 localresult push rRsult

25

ret

Hinh 1.3-3 Ngtin xep goi tth» call stach).

Hinh 1.3-3 mo til mQt ke't xuat rat dan gian cua tien trinh th~t su, nhirng cung cap du thong tin M hi~u toan bi? cac buoc him quan. Tu hinh 1.3-3 chung ta dung IL tao ra rna nguon trong vi du 1.3-2

~42

PHAN I: Mci' dftu

Vi du 1.3-2 IL Function Calls

1:IIFile 2 :

3: • assembly function_call 4: { 4 :

5 : . ver 1 : 0 : 0 : 0

6: }

7 :

8 :

:function.cil

9: I I Them VaG phuong t.htro

10: . method public stati? int32 'add' ( int32 a, int32 b) il managed

11: { 12 :

13: .maxstack 2

14: .locals (int32 v_O, int V _1)

15:

16: Iliay c a c tham so t.ir ngan x,§p 99i

17: Idarg.O

18: Idarg.1

19:

20: add

21:

22: IldAy ket qua tro le!ll ngan xep 991

23: stloc.O

24: Idloc

25:

26: ret

27: }

28:

29: .method public static void main( ) il managed 30: {

31: .entrypoint

32: .maxstack 2

33: .locals (int32 V_O)

34:

35: IldAy hai tham so len ngan x,§p 99i (call stack)

36: Idc.i4.s 10

37: Idc.i4.s5

38:

39: call int32 'add' (int32, int32)

40: 41: 42:

stloc.O

1/ lay ket qua a bien cu c bQ V_O

43: / Ihien th:i- ket qua

44: listr "10 + 5 = {O}"

45: ldloc v_a

CHUdNG 1·3: Ngon ngu trung gian IL

43~

46: box [mscorlib] System. Int32

47: call void [mscorlib] System. Console: : WirteLine (

class System. String, class System.Object)

48:

49: ret

50: }

51:

Ma l¢nh ella ham .cil trong vi du 1.3-2 dua ra mot chi thi mci: .Iocals. Chi thi nay du"gc dung M danh truce mot vung cho cac bien cue bi? trong ham hi¢n hanh. Phuong thl1e add diroc di nh nghla i'I dong 10 khai bao mot vung cho hai bien cue bQ. Cac tham 56 du"Q'c truyen den pbucng thirc add se duoc nap vao vung danh tnroc qua l¢nh ldarg. Sau khi l¢nh add diroc gel, biroc ke tie"p La hru tru ket qua va sau d~ My ket qua tra len ngan xep goi,

Phuong thrrc main chi cap phat khong gian cho mot bien CI,lC bo dan le. Bien cue bQ nay se duoc dung M giu ket qua duoc tra v~ W phimng thuc add do nguci dung dinh nghla. Qua trinh day' cac gia tr] 10 va 5 len ngan xep (stack), goi phinmg thuc add, va la'"y ket qua tucng irng' duoc mo ta 0 hinh 1.3-3.

Ban rat c6 th;§" da chu y lfmh box a dong 46. Boxing la mot cai gi d6 mrri me d6i v6i .NET. Boxing lam cho cac kieu gia trj, chang han nhu cac kieu co' sd, dl1Q"c xem nhu cac d6i tuong,

4. L(lP (CLASSES)

Nhu da dUQ"c phat bieu truoc day. IL ur n6 khong la mot ngon ngu hudng' d6i tuong (00 language). Mac du IL hE> tro nhieu ngon ngir nguon (source language) va cac cau true, IL eung cap khai niern vi, viec tao cac lap (class), va tao cac the hien (instance) cua lap. Xem xet IL vi, viec khai baa va tao cac lop {class) se rho ban hieu nhieu han vi, Common Language Specification (CLS). Vi du 1.3-3 trinh bay rna IL cho vi¢c tao va sl1 dung mot lop (class).

Vi d~ 1.3-3 T~o 16' trong IL

1: _ assembly class_test as "class test" 2: {

3 : • ver 1: 0 : 0 : 0

4: }

5 :

6 :

7: .module class_test _ exe B:

9 :

10: / /T9-o m¢t lop Dog vof, hai truong t.oan cue (public //fields)

1ij44 PRAN I: Md d:iu

11:

12: . class public auto ansi Dog extends [mscorlib]

System. Object { 13 :

14: / /cac truong du li¢u chung (public data fields)

15: field public class System. String m_Name

16: . tield public int32 m_Age

17 :

18:

19: / /T9-o m¢t phuong t.htro d~ hil~n th.t cac truong

20: . method public hidebysig instance void Print ()

il managed

21: {

22: .maxstack 8

23: Idstr "Name: {O}\nAge :{1}"

24: Idarg. 0

25: Idfld class System. String Dog: :m_Name

26: ldarg.O

27: Idf1d int 32 Dog: :m_Age

28: box [mscorlib] System. Int32

29: call void

[mscorlib]System.Console: :

Wri teLine (class System. String,

30: class

System. Object, 31:

32: 33 :

34:

35: 36:

37 : 38: , .·39,:

40:

class System. Object)

ret

/ / Phuong t.huc khoi d\l'ng (Constructor) .method public hidebysig specialname rtspicialname instance void. ctor ( ) il managed

.maxstack Idarg.O call

8

instance void [mscorlib] System.

Obj ect : : ctor ( )

41: ret

42: }

43:

44: } 45 :

46: .method public static void maine } i1 managed 47: {

48: .entrypoint

49:

50: .maxstack 2

CHUdNG 1-3: Ngon ngu trung gian IL

45~

51:
52:
53:
54:
55:'
56:
57 :
58:
59:
60:
51:
62 :
63 :
64 :
65: }
65: .l.ocals (class DogV_O)

newobj stloc.O Idloc.O ldstr stfld Idloc.O Idc.i4.3 stfld Idloc.O call

ret

instance void Dog: : • ctor ( )

"Daisy"

class System. String Dog: :m_Name

int32 Kog: :m_Age

instance void Dog: : Print ( )

Tao mot lap trong IL la mot qua trinh kha de. Lap Dog diroc khai bao trong vi du 1.3-3 diroc dan Kwh W lap System. Object, lap d6 la lap err sO- cua tat ca cac lap .NET. Trong .NET, cac thanh phan da li~u diroc hieu nhu cac trucJng (field) va cac truong nhu vay diroc nhan hist vai W khoa .field

£)i! dinh nghia mot phuong thirc cua mot lap, tat ca nhirng dieu can thie't la phai dinh nghia phuong thuc ben trong pham vi tap vci cai rna phuong thirc d6 thuoc v~. Phuong thuc Print duqc khai baa & dong 20 trong vi du lB-S. CM Y den tU khoa instance ap dung cho phuong thirc Print. Vi phuong thirc Print duoc goi, mQt thi! hien (instance) cua lap Dog can den.

Cung mot (lieu fly dien ra dung deli vdi phuong thuc khrri dung (constructor) cua lap Dog. IL cung dip hai modifier rna phai dinrc ap dung vao cac phuong thiro khdi dung cua the hien. Modifier rtspecialname duqc dung van luc thai gian thuc hien (runtime), nhirng nguoc lai specialnarne dLiqc hi) trq cho cac cong cu .NET khac nhau, nhu Visual Studio .NET.

5.ILDASM

.NET di kern vdi mQt vai cong cu, tit cac trinh bien dich (compiler) cho den nhllng ngLioi thiet ke' form. Tuy nhien, cong cu quan trorig nhat, Ia ILDASM, Intermediate Language Disassembler. ILDASM chu y den viec quan sat cac assembly khac nhau cua .NET. Khong kil ngon ngl1 dLiqc dung M cai dat assembly, ILDASM co kha nang hiiln thi IL da dllqc bien dich,

Cira s6 chinh cua ILDASM tao mQt sa d6 cay (treeview) trtnh bay chi tie't nQi dung cua assembly trong .NET. S(J d6 cay (treeview) dLiqc nh6m theo khong gian ten (namespace) v6i mcli khong gian ten (namespace) chua mot. hay nhieu khong gian ten (namespace), cau true (struct), 16p (class), giao tiep (interfaces), hay ban li~t ke (enumerations) dinrc l6ng nhau (xem hinh 1.3-4).

~46

r C:W'JItl tH'MiCl'osoft.tIET'oJ'ramewori<\u1.0.2204mscorlib.dll .... 1iJ m

PHAN I: MiJ diu

Hinh 1.3-4 ILDASM vai mscorlib.dll duoc ttii len.

Hay tim met assembly co ten mscorlib.dll trong .NET va dung ILDASM db xem ni)i dung. Tuy thea cai dat cua .NET SDK, the .NET assemblies se dtfqc dinh vi a -crnootdr ive»: \ <windows directory> \Microsoft.Net \Framework\

vN.N.NNN.

a ..., C:WINNT'MicrosoflNET\Framewcrk\v1 .O.2204\msccrlib.clll ~ MAINfI.5ST

i£I ' .. Microsoft Wln32 EI • System

ltl· • System Collection

ttl • System.ComponentM!)clel

tt] • System Configuration Assemblies ff, • System Diagnostic

If) • SystemJD

[f] .. System .Rellectlon

1.*' .. System .Resources

[t, .. System Thre~ding 8:] .. _ComObiect

FE: .. _DTstring

i£I .. _HResu~

i±l .. _AccessExcepiion

assembly msccrlib ~s "mscorlib"

Thuc hien nhirng SI,I' thay tM thich hop. Hinh 1.3-5 trinh bay cac ky hieu khac nhau va cac y nghla cua chung trong ILDASM.

Hmh 1.3-5 Bang kj tu ILDASM.

CHl.1ONG 1-8: Ngnn ngU trung gian IL

47~

TnH tim cua kien truc .NET (.NET framework) 18. mscorlib.dll. Assembly nay chua hiiu he't cac giao dien va cac ldp ch~&n lit thanh phan cua .NET. Chac chan co cac assembly khac cho truy c~p CCf sa da lieu (database access), noi mang (networking), tinh an toan va van van, nhung nguon goe ella tit ea d;§u a mscorlib.dll.

Sli dung bang ky tv a hinh 1.3-5, ban co the xac dinh mot each true quan cac kieu thuc th~ can cu trong mscorlib.dll, Tim System.Object va nhap doi van nut do M rna rong no (xem hinh 1.3-6).

I±l

ffi.., Object

i

II> .class public auto anti seriesizable

• Equals: bool (class System.Object)

• Finalize: voidO

• GetExlstingClass: class System,TypeO

• GetHashCode: int320

.• GetType: class System.TypeO

• InternalGetClass: class System.TypeO

• Tostring: class System.stringO r±I . a Operating System

13:1 . ., OleAuBinder

Hinh 1.3-6 System. Object trong ILDASM.

Lap System. Object la lap co sa cua tat ca. cac lap trong .NET. Lap err sa System. Object cung cap chuc nang chi a xe diroc dung suot .NET. TIm phuong thuc ToString va nhap dup n6 M xem rna IL co sa, bao ham ca n6 (xem hinh 1.3-7).

Nhirng nguni phat trien MFC da dliqc lam quen vdi viec c6 rna nguon Visual C++ doi vui kie'n true MFC (MFC framework) san sang dung cho vi~c nghien cue ella ho. Di@;u nay khOng giong nhu ki~n true .NET (.NET framework). Hien nay, each duy nhat de dul1C quan sat ij ben duai lap vo boc lit phai sil' dung mOt con~ CI,I rihu ILDASM M xemcach cai di).t cua IL. Mi).c du IL cling khOng d~ doc bAn~ C# hay VB.NET, nhung n6 se giup ban hi,§'u dliqc cac hoat d(ing ben trong cac lap :NET.

[MJ48

pHAN r . Mo Mu

[H· a Null ReterenceException [fl. a Number

EB· a Object

.. ~ .class public auto anti serializable ..• Equals: boot (class System.Object) ....• Finalize: voidO

...• GetExistingClass: class System TypeO • GetHashCocle: int32()

.• GetType: class System.TypeO

method public hidebs}'sig new slot virtual

instance class System. S bing. T oslnng() il managed

{

II code size 12(0I<c) mexsteck 8 "_0000: Idarg.O

II 0001: call instance class Syslem.Type.S}'stem.Object::GeIType()

I C0006: callvarl instance class System. S Iring. System. Type:: gelJuliName(J 1I_000b: ret

II end of method Object::T oStling }

Hinh 1.3-7 Mii lL cho System. Object. to Stringt).

ILDASM cung cap kha nang tao ra mQt tap tin van ban (text file) v6"i rna ngu6n IL hoan chinh cho assembly da dinh trong .NET. Chay ILDASM tU dong l~nh va Stl: dung tham so /GU'I'e cfilenamec-, ILDASM se true ti€p xuat ra t~p tin dil dinh thay vi hien thi GUI cua ILDASM.

6.METADATA

Mbi thanh phan trong .NET chua metadata. Metadata rna ta cac kigu runtime, l6"p (Idp), giao tiep (interface), diu true (struct), va tat ea cac thuc th~ ben trong mQt thanh phan .NET. Metadata cung eung cap cac thOng tin v~ cai dat va btl trl rna .NET runtime si't dung d(\ dung eho JIT bien dich ma IL.

Metadata e6 th~ dung duoc tat ca cac cong cu qua hai t~p API khac nhau. d d6 Wn tai mOt ~p 0 mac thap (low-level), cac unmanaged API va mQt t~p cac managed API m~ 06 tM dliqc sU' dung M t~p hop thong tin v~ met thanh phan .NET. d d6 cung t6n tai mQt t~p cac API M tao Metadata. API nay ducc si't dung boi cac trmh bien dich trong suilt qua trrnh bien dich m<)t ngon ngtr ngu6n da quy

CHl10NG 1-3: Ngon ngfr trung gian IL

491!!J

dinh thanh IL cho .NET runtime SV roo t:i day du v~ cac API cua Metadata va co sa ha tang se can phai co mi)t quy~n sach khac, nhirng quyen sach nay se trlnh bay ml)t phan nho VEl each sa dung Reflection API di'l xern xet mot thanh phsn .NET.

7. REFLECTION API

Reflection mn ta m9t co che' eire ky manh d~ lam viec vdi cac thanh phan .NET. Do sa dung reflection, cac thanh phan .NET co th~ duqc nap d¢ng va ni)i dung cua chung dtroc tim ra luc dang thirc hi~n. Metadata la di~m chinh yeu cua chuc nang nay va nhu vay, Metadata co th~d)Jqc xet den nhu mot type lib cli co trong kien truc COM.

CLR .NET cung cap thong tin ki€u runtime r5 rang va cung cAp mot lap System.Type. Sau khi ffi9t thanh phan .NET duoc nap, IlIC do co th~ nhan duqc ki~u hay cac ki~u diroc chua trong goi assembly da dinh, Btl rno phong sue manh cua Metadata va Reflection API,b~n tao met t~p tin van ban dij.t ten imployee.cs vii chep vi du 1.3.4 vao do. Bien djch vi du, dung cau lenh sau:

esc It: library employee. cs

Cau lenh nay se xay dirng goi assembly employee.dl!.

Vi du 1.3·4 Em loyee Class

1:IIFile

2: IITac gia 3 : IIM1,lc dich 4:11

5:

6: using System; 7 :

8: namespacce Stingray { 9 :

10:

11: 1~: ':L'3Y: 14: 15: 16: 17 : 18: 19: 20: 21: 22: 23: 24:

:employee.cs

: Richard L. Weeks

: T9-o mot; thanh phAn . NET va SU' d1,lng reflection API de xem thanh phan

IIT9-o m¢t lap co ban p1,lblic class El'(Iployee {

Ilcac thanh phi!ln du: lii;!u rieng private string m_FirstName; private string m_LastName;

private string m_'l'itle;llten t.ac vu

Ileac d~e tinh chung (Public Properties) public string FirstName {

get { returnm_FirstName; } set { m_FirstName = value; }

}

~50

PnAN I: M& da.u

25: 26: 27 : 28: 29: 30: 31.: 32: 33: 34: 35: 36: 37 :

38:
39:
40:
41:
42:
43:
44:
45 :
46:
47:
48: }
49: }
50: public string LastName {

get { return m_LastName; } set { m_LastName = value; }

}

public string' Title

get { return m_ Title; set { m_ Title = value; }

.}

IICAc phuong thuc chung (Public Methods) public void ShowData ( ) {

object [1 args = { m_LastName, m_FirstName, m_Title }

Console.WriteLine{"***************\n") Console. Wri teLine ("Employee : {O}, {1} \

nTitle :{2}\n",args)

Console.WriteLine("***************\n")

}

IICacphuong tb\l:c r.ien~ (private methods). private void Update ( )(

IITIiVC HI$N: C<}p nh<}t thOng tin Employee

}

Lap Employee thuoc ve kh6ng gian ten stringray va chua ba thanh phdn du li{!U rieng (private). tuong ung vci ole thuoc tinh chung (public), va hai phuong thuc. Sa dung Reflection API, n6 c6 th~ nap met each nhanh chong employee.dll luc dang thuc hien. Sau khi assembly ducc nap, tat ca cac ki~u duqc chua trong assembly eo th~ duqc can de'n va Metadata cua chung duqe truy ci,\p. Vi du 1.3·5 sa dung Reflection API M quan sat mQt thanh phan .NET.

Vi du 1.3·a Metaview Source Listing

l:IIFile

2: /ITac gia 3: IIM\1C dich 4: 1/

5:

6:

7: using System;

8: using System. Reflection; 9:

10:

11:

:Metaview.cs

: Richard L. Weeks

: DUng Managed reflection API d~ duy~t m¢t thanh phan • NET

51~

cmroxo 1-3: Ngon ngu trung gian IL

12:
13 :
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37 :
38:
.U 39:
g 40:
II 41:
-g 42:
Hi
43:
• 44:
45:
46:
47:
48:
49:
50:
51:
52 :
53: public class ClsView {

public static void Main ( String [] args) {

try {

I /N~p assembly

Assembly asm '" Assembly. LoadForm(args [0]);

/ /Lffy cac kiE!u (Types) diroo chua trong //Assembly

System.Type(] Types :asm.GetTypes();

/ /Hien th~ thOng t in co ban v~ mOi kiliu foreach ( Type T in Types ) {

Console. Wri teLine ("Type {O} II ,

T.FullName); DisplayFields ( T ) ; DisplayProperties ( T ) ; DisplayMethods ( T ) ; Console.WriteLine(""};

}

}catch( Exception ex ) { Console. WriteLine ( ex ) ;

}

}

public static void DisplayFields ( Type T ) { Console.WriteLine("*****[DisplayFields] *****"}; Fieldlnfo [] Fields = T. GetFields ( System.Reflection.BindingFlags.lnstance 1 Syatem.Reflection.BindingFlags.Public 1 System.Reflection.BindingFlags.NonPublic );

foreach ( Fieldlnfo F in Fields)

Console. Wri teLine ( "FieldName = {O}", F _Name) ;

}

public: static void DisplayProperties ( Type T ) { Console.WriteLine{"******

[Display Properties] *****"); System.Reflection.Propertylnfo[]Propertiea

~52

PHAN I: Ma d&u

= T. GetProperties ( System.Reflection.BindingFlags.lnstance System. Reflection. BindingFlags .Public I System.Reflection.BindingFlags.NonPublic );

54 :

55: foreach ( Propertylnfo pi in Properties

56: Console. WriteLine ( pi. Name);

57: }

58:

59: public static void DisplayMethods ( Type T) {

60: Console.WriteLine{"******

[Display Methods] *****") i

61: System. Reflection. Methodlnfo [] Methods

= T. GetMethods ( System.Reflection.BindingFlags.lnstance I System. Reflection. BindingFlags .Public I System.Reflection.BindingFlags.NonPublic );

62:

63: foreach( Methodlnfo mi in Methods)

64: Console. Wr,iteLine ( mi. Name );

65: }

66: }

Vi du L3·5 sil' dung cac Reflection API co ban nhat d4 me. til chi tiet thong tin vfi mlii trmrng (field), thuoc tinh (property), va phuong thuc (method) vo employee assembly duoc len. M~c du ngon ngil C# con chua duoc khao sat den phan Ian rna l¢nh se n6i ro ban than difiu d6. Ban hay thii thuc hi¢n mQt phier ban thie't thuc vEl Metaview, hoan toan vdi Windows Forms GUI. MQt du ar (project) C\I the se rat co the lam tang them su hieu biet cua ban vEl .NET va t~I hop phong phu cac Me tinh rna no cung cap.

8. KET CHUONG

Chung ta da di qua nhieu van d~ co ban trong chuong nay. Cac van dEl de bao gom n, ILDASM, metadata, va kiEin true Reflection.NET (Reflection.NEl framework). Chao chan kien true .NET dem lai mOt lai knuyen v~ tuong lai cuas, phat trien phdn mem, Khong eon nea mQt rao can ngfm ngil'; M th6ng .NET hi tro cac ngon ngtr nham vao kha nang thuc h ien lien ket t6t hdn, cho den bay gia di,§u nay khong de dang sit dung hay rna rong,

Da qua nhii'ng ngaysii dung cac tij.p tin IDL va DEF M rna ta cac giao dier duqc dira ra bai cac d6i tuong. Dung han, tat ca cac doi tuong, cac giao tie'p, va ca: thanh phan duoc rna ta day du voi metadata. Nhung nha phat trien quen thuoc va Java se thay ro quyet dinh gAn Reflection vao .NET brn VI n6 h6 trg m(>t CCI chi manh ln~ d~ keo dili s1,l'son.g cua cac ililg dung va sil' dung cac thanh phan mdi mQI each nang dQng.

n

ChltOJJg 1.4

LAM vrec VOl BQ QUAN LY C++

Cdcrv6nd~ chinh se dude d~ cap den:

./ Cae tit khoa rna r(Jng ctla c++

./ Su dlfng B¢ bien dicli (Compiler) C++ clio trinh C++ duoc qudn If ./ Cae tap thu gom rae (Garbage Collected)

./ ChI dan (directive) #using

./ Chu6i (String)

./ Tron. Lan cac ma l~nh duac qutin If (Managed) va kh6ng dUr;1e qudn ly

. (Unmanaged)

./ CMt ch()t (pinning) cac rna lenh. duoc qtuin. Ii

./ Cae Giao dien duoc qulin ly (Managed Interface) ./ Too l(j.p cdc kieu gia tri (Value Type)

./ Tao va su dung Mo hinb. uy thiu: (Delegate)

./ GQi cdc DLL .NET tuy bien tit cae rna. l~nh C++ duoc qudn Iy (managed C++ code) cua ban.

./ SI1 d¥ng cae DLL managed c++ va Unmanaged C++ trong cluamg trinh. .NET cua ban

./ Dung cae th.uoc tinli (Properties) trong cae tap ella ban

./ Baa dam vi~c sap xep va d6ng g6i cae edu true C++ ctia ban.

6 r if. (i

Trong chuang trircc chung ta dB. xem sa v~ bQ rna r(lng ducc quan Ii (managed extension) cua C++ nhu m(lt each M sil dung cac ky nang ve C++ cua ban, eung nhu moi truang dl1(1e quan Ii (managed environment) cua .NET hay nhu mot each M ban dung lai (reuse) nhtrng doan rna IMh dB. eo cua mmh. Ne'u ban la m(lt l~p trinh vien C++ kinh dign va dang tim each chuygn sang .NET, cau hOi thllng dung nh!t trongdau ban se la "Toi eo tM bao v¢ tat cit nhimg gl dB. d<iu tu: vil.'o ina l~nh c++ khong?" va "Lii,\u toi e6 thl! de dang dung chung, c++ va C# k'h6ng?". May thay, dua VaG kha nang cua cac ky sir Microsoft, ca hai cau hOi tren d~u nh4ndl1(1c Ilhil'rig cau tra Uti tich cue, Ban hay tharn quan vung Mt cua be) rna r¢ng ditl1C quan ly eua'C++ va cam nhan item noi nao ban c6 thil d~t nhi1ng rna l~nh eu "ao trong th€ gidi mdi cua .NET.

BO ma rOng dlfqc quan Ii them vai ttt khoa mdi vao ngon ngU' c++. RO rang thOng I!y lam thich tbU' il d~ tranh ciii vil ngon ngii', tM nhirng hay nhc rang' trong thlfC te', Managed C++ khong dinh siJa d6i cac d~c ta ANSI rna no hua hen

s,

1!l54

PHAN I; MiS' diu

nhieu lei ich tU b{\ thuc thi quan If dircc (managed runtime} lai khong phai ganh la'y nhung va't va cua viec phai hoc m{\t ng6n ngf! hoan toan mol. 0 m{\t mat khac, trinh bien dich VS .NET C++ thuc ra tunng thich voi ANSI nhieu han cac vi ti~n bOi khi S11 dung i'J che' d{\ C++ g6c (native C++). Khi dircc bien dich theo ki~u C++ . thOng thuong, trlnh bien dich sinh ra cac rna doi tl1qng x86 d~ lien ke't (link) thea

ki~u thong thuong. Khi ducc dung d~ bien dich cac Managed C++, thong siS /CLR cua dong I~nh duoc sli dung d~ tao ra cac IL.

_astract

1. cAc TV KHoA MO RQNG CllA C++

Chi ra rAng lrip nay la lop truu tuong va can cai d~t mot so hay ta't ca cac phuong thlic cua no.

T1).o mi?t diSi tircng diroc quoin Iy tU mot kieu gia tri nhu cau true hay bien. Dbi tinrng box thi duqc cap phat tren heap cua BQ Thu gom Rae (GC - Garbage Collected) va sau d6 diroc GC quan lY·

La cau tra lai cua .NET cho callback. N6 la mot khai bao eho an chi cua mi}t ham nham cung cap thong tin v~ kieu tra v~ va cac tham siS cua ham d6. Khai bao cua Mo hinh uy thac (delegate) cho phep kh6ng chi cac thanh vien static rna ca cac thanh vien tM hien cua mot lop diroc gci. N6 cung duqc dung M anh xa m(\t b(\ xi'f Iy sl! ki1)-n (event handler) ling voj mot tac nhan kich thich (stimulus) nao do. Co hai ki~u cua Mo hinh uj thac: Single Cast va MultiCast. Chung cho phep goi hoac la . mot, x11 ly sl! kien dan gian hoac la mot chuoi cac xu ly cho m(lt ; tac di?ng.

_ge Lam eho cac lap hay cau true cua ban e6 th~ duoc quan ly Mi bQ thuc thi GC.

_delegate

i den t i fie r Cho phep ban dung cac tU khoa cua c++ nhu cac dinh danh, vi du nhu class hay for. TEd li~u cua Microsoft n6i rang vi~e su dung chung ehAng qua 1.3. do phong each.

_lloge Khai bao di.ng tM hien cua cau true hay lap khOng nen dLlQ'C quan ly bi'Ji bi? thuc thi QC.

-pin Duqe dung M ngan can CI1 che. nen cua GC khOng di chuyen lap hay ki~u dil lieu duqe quan ly. Mbi khi mot tM hien mQt do'i tuqng duqc ch6t chat (pin), no phai ducc tham de'n bang met con tro. MOt diSi tucng khong bi chiSt chat giong nhu "troi di duai chan ban" do cac hoat dQng cua GC se chuy~n cac do'i tl.tqng M don sach heap. Vi~c nay co tM co ke't qua tai hai!

-property Cac lap cua ngon ngf!C# co th~ dua ra cac thuoc tinh, gi6ng nhu cac thanh phan dil lieu cho cac diSi tuong ben

o a c c

CHUONG 1·4: Lam viec vdi b¢ quan ly C++

55~

va duqc thie"t lap quyen doc hay vie"t bang each goi ham' get_ hay set_. Trong thuc te, cac thuQc tinh c6 th~ thl,tc hien IDQt so tinh toan va truy nhap vao cac ham khac, khi sa dung cac dii' li~u diroc cung cap cho bQ truy e~p (accessor) set hay tnt(1c khi tra v~ gia tri cho bQ truy c~p get.

Co hai each dung. N6 co th~ duQ'c dung nhu mQt di~u chinh lop M cho biet rang lop nay khong dlfQ'C phep ddn xuat, N6 cling con co th~ dung nhu mot chinh sira tren cai d!)t cuoi cung cua mot phirong thirc ao nao do M ngan khOng cho chung bi vie't chdng (override).

Cho phep ban thlt chuyen mot lap sang mGt ki~u d~c biet nao do nhung se dira ra (throw) mQt ngoai l~ (exception) neu chuyen khong dircc trong thai gian thirc thi. CU phap cua no nhu sau:

_try_cast <type_id> (expression)

_sealed

_typeof

g .C

Y a )t

Neu viec chuyen ki&u khong thanh cong, System::lnvalidCastException se duoc goi, _try _cast nen dlfQ'c dung trong thai gian xay dung ve. thfr chuang trtnh va sau do duQ'c thay the' boi static_cast hay dynamic_cast nell ciln

tnl. v~ System::Type cua doi tuqng da dugc khai bao. Tuong tv nhu Iobjectl-c-Get'I'ypel) d.n mQt tM hien cua mot doi tucng, W khoa _typeof co th~ tra v~ kii!u cua mQt khai bao trw tuong, vi du:

1i

MyObjct 0;: new MyObject;

Type *pt = 0- >GetType ( ); / I cdnrnot thf hi~n ella m!)t MyObjeet

Type *pt2= _ typeof (MyObj eet) ; / I khOng edn mot thf hi~n cua MyObject

vi ,It

ac Lie ao hi di LI)t

Cau true va cac lop dan gian c6 tM dlfQ'C chuy~n sang kii!u gill trj dlfQ'C quan Iy bang each dung di~ll chinh nay. MQt ki~u gia tri co th~ dlfQ'C 'Cap phat tren heap GC va co thi! doi lai trong thai gian thuc thi bCri GC khi chung khong con dlfQ'C cAn nlla. NM rang, kit'lu gia trj nen dlfQ'C gill don gian nhat b&i vi c6 th& se xdy ra bung n6 (overhead) khi chung dlfqc su dung,

2. SU Dl)NG TRINH BIEN DICH c++ CHO MANAGED C++

Trinh bien dich co them ngAt chuyen (switch) dong ll$nh ICLR c6 th,; nhan I;l~gidn:g rnA l~nh nen duqc bien d!eh cho ngOn ngu th\l'c thi chung (Common Language Runtime).

Sa dung ngiit chuyifn ILD se 40 ra mot DLL thay vi EXE.

Khi sa dung trinh bien a che dQ nay, trmh lien ke't (linker) se 11)' di;ing tham gia vao viec tao ra mot ~p tin co kha nang thuc thi, tij.p tin nay c!n co .NET CLR

~56

PHAN I: Mil' dAu

khi chay. Di~u nay cung e6 nghta la ban khong tM' tao ra cac t~p tin c6 tM thuc thi va chay chung tren h1,\ th6ng khong M tro hi,\ th6ng thuc thi .NET. Ban c6 tM tAt bttCre tao WIn ket bllng each dung nglit chuy~n dong I~nh Ie. Trong trttang hop nay, IDi?t t~p tin .obj dttqc tao ra thea killu omh thuong,

Ban e6 tM dung tuy chon /link cua trmh bien dich d€ chuyen phan con Iai cua dong lenh trl,tcctiep Mn trinh lien ket (linker). Chi dan !link Iii. hill Y cu6i cung v~ trlnh bien dich. TAt ca cac chi dan khac d~u se duoc chuyen den dong Wnh ella trlnh lien kilt (linker).

3. CAC L(SP THU GOM RAC (GARBAGE COLLECTED)

Cac lop c++ thLiongdLiqe cAp phat tren heap hay stack khi can thiet. Cac 16p dttqc cAp phat bhg tit kh6a new thl phai diroc xoa theo thir tl,l' M phong tranh 10 h~ng trong vung nho, Cac lop thu gom rae dLiqc cap phat tren heap ella GC, J~ thuQe vao viec quan ly vorrg dOi vii. st! dich chuyen ella GC, va se bi x6a (delete) khoi h~ th6ng chi khi tham khao cuoi cung de'n chung diroc giai ph6ng.

Khai baa ella cac J6'p thu gom rae dLiai Map-aged C++ thl nhu sau:

_gc class SomeClass {

};

Du6'i .NET, tilt ell. cac lap khong e6 16'p co so ro rang se diroc dan XU/It ti'i System::Object. Cac J6'p Managed C++ duoc khai bao v6'i ~e cung con duqe them vao bll.ng each nay nhc trrnh bien dich. Cac 16'p co sci co cac phirong thuc rna ban c6 th~ override dll tang eui'rng sl,l' nrong tac giUa cac tap GC ella ban va h{\ thong. Xem cac phuong thuc ella System::Objeet trong tal li{\u ella .NET SDK M biet them chi tiet.

4. CHi DAN (DIRECTIVE) #using

#using co th~ duqe xem nhu tuong duorig li,\nh import va n6 duoc dung M tham khao Mn cac thu vien cua .NET. Vi du, M dung cac 16'p cua kien true .NET trong mil. li)cnh C++ ella ban, ban ~o th€i'dung nhu sau:

#usingcmscorlib.dll>

Khai bao cua namesape rna ban edn nen duoc dua ra ngay sau chi dan nay. Vi du 1.4.1 trlnh bay each tao lap mOt ling dung dan gian chua l6'p GC.

Vi du IA.I m arrajre d.cppr M<?t ca i nhin han d:i.u vi' Cu' ch[: thu gum r:ic

#using cmscorlib. dll> / / import thu' ui?n using namespace System; / I khai bcio namespace

_gc class MCPPDemo.

I

caudNG 1-4: Lam viec vdi hi} quan If c++

57~

public:

void SayHello() {

Console: :WriteLine ("Hello Managed C++");

}

} ;

void main ( ) {

MC,PPDemo ·pD=new MCPPDemo; 'pD->SayHello();

}

d day c6 vii di~u phai giai thich them. Thu nhat hi, co mot su khac biet ro r~t giUa "#using" va "using namespace". Chi Mill #using chi den mot DLL se dl1qc nhap vao (import). Con using namespace giG' y nghla truyen thong ella no. T'iep theo la, ham main tao ra m{lt con tro va ian mQt lop mci VaG n6, dung nel nhirng lai kh6ng xoa no khi thoat ra. La thay, dieu nay lai dung bdi vi tU khoa ~c da dl1l,1c ap dung VaG dinh nghta cua lap, cho phep no dl1qc quan If bdi trinh thuc thi (runtime) .NET. Co che' thu gom rae tu no se quan tam den vong dfJi cua nhirng doi ~lIQ';t'lg :nhll.Y4yv3sex6a (dele~e)ch(J.ng khi b~~ khong dung chung ni1a.Ket qua 1a sekh6ng e6 16 h6'ng trong vung nhc (memory leak).

Bdi vi cac kip ~gc thi dl1qc dac che' tren heap duoc quan If, ban khOng tM tao met thi'i hien trim stack thea kieu:

MCCPDemo d;

Neu ban thii dung, ban se nhan duoc m{lt 16i. Ban phai luon luon tao fa cac lap GC bling wan ttt new vii. dung chuyen "->" khi ban truy xuat den cac phuorig thuc hay da lieu cua no. Day la mdt dieu khac la cua Managed C++ bci vi C# va cac ngon ng(1 dl1gc quan ly khac dung dau "." di'i tham khao den cac thanh vien cua lap.

Neu ban muon chay chuang trrnh trong vi du 1.4.1, hay go n6 trong Notepad, luu lai no trong t~p tin managed.cpp va sau d6 dung dong lenh sau dP bien dich chung:

CL ICLR managed. cpp

N6 se tao ra managed.exe, va ban co th~ chay chung til dong l~nh. Luu y ve sl! thitu hut ro rang cua buc:k lienket, Trinh lien ket se tv dOng tham gia van qua trlnh 116,

Ili!d 58

PHAN I: Ma dil.u

5. CHUC)I (STRING)

IDe'n true .NET ho tro manh me cho chuci. Namespaee System co lap System. String co th~ duqe dung M hill gili van ban (text).

Bi;> rna rong diroc quan ly cua c++ con cho phep ban sd dung System. String thong qua b(i rna rong String.

Ban co th~ dinh nghta mot chuBi duui Managed C++ nhu sau:

String *pS :;;; S"Hello world";

Cac chudi nay duoc tao ra tren GC heap va chiu SL! quan ly dong drri,

Lu'U y ti~n to' S trudc chuoi ky tu. T1t ca tM hien cua cac chuoi c6 ti~n to S Ia cil.n thiet cho cung met chuoi. Mot chuoi con co th~ co ti~n t6 L. D:1u hieu nay cho bie"t no la mot chuni ky tu rQng (wide character string}:

String *8 == L"This is a wide string";

Miii chubi la bat bien. Moi khi ban dil. tao ra no thi ban se khong thi! thay doi no. Tuy rihien , co nhung' phuong thuc cua d6i tugng String cho phep bll-n tao chubi moi, thay d6i chuoi tU nguyen mau, Ngoai ra, con co kip StringBuilder co th~ tro giup cho qua trl.nh d6.

W du 1.4.2 trinh bay mot minh hila.

Vi du 1.4.2: sta-In s.c p: Sii' durig' Managed String ella C++

#using <mscorlib.dll> using namespace System;

void stringcompare (String *a, String *b) {

Console: :WriteLine ("a=\" {O} \" b=\" {1} \" same string? {2} \nn, a, b, a==b ? S"true" : S" false") ;

}

void main ( ) (

String* a:;;;S"Hello"; String* b=S"Hello"; StringCompare(a,b); a=a->Concat(a,S" World"); StringCompare(a,b); a=a->Remove(5,6); sStringCompare(a,b);

}

Them vao chuM String da sAn sang nhu rnot, ki~u goc, con co m(lt s6 la duoc thie't ke' di).e bi~t d§ thao tac cac chuci. Lap StringBuilder co sAn ?J namespac System::Text, vii. be> ghi luong (stream) cho chu6i disrc goi Ia StringWriter namespace System.rl'O.

cHl1dNG 1·4: Lam viec vrri b(J quan Iy C++

59~

L6'p StringBuilder cung cap mot tap cac chirc nang thao tac nhu them cac ky tI,t vao met, chuoi hC1~C d.t mot chu6i con tit gifla mQt chuoi. StringWriter cung cAp m(Jt giao tie'p kieu lu6ng (stream-style) cho chu6i va cho phep ban dung cac chirc nang dinh dang chuoi kigu .NET thay vi luon phai phu thuoc vao sprintf. Ngoai ra eon co lap StringReader di! doc chu6i thea luung khi no nAm r'1 m(lt ti.iP tin nao do.

Cac vi du vi! String Builder va StringWriter narn trorig mot ,,6 vi du trong phan con lai cua chuang nay, Mc biet la vi du 1.4.10.

6. TRQNCAC MA L:¢NH DU(1C QUA.N LY (MANAGED) vA KH{)NG DU(1C QUA.N LY (UNMANAGED)

Tren cac rna I~nh uUQ'c quan Iy va khong dtrcc quan ly kha Iii dan gian, nhung n6 phai thea cac huang d<1n.

B~ tao (hay baa tri l mot kh6i cac rna lenh khilng duoc quan lY. ban can gidi han rna I~nh bang cac chi dan #pragma_unrnanaged va #pragma_managed khi can. Vi du 1.4.3 trrnh bay ffiQt ham bl:ing rna l~nh khOng diroc quan lY.

Vi du 1.4.3 Sli' dung # ragma_unmanaged

#pragrna unmanaged

void timestwo (int * pToMultiply) {

*pToMultiply *= 2;

}

#pragma managed

Nhu ban co th~ t.hay, ham timestwo nhan mot so nguyen dang gan vao con tro pToMultiply va auqc coi nhu rna l~nh khong duoc quan Iy brri vice slt dung chi dan #pragma_unmanaged.

7. CH6T CH!T (PINNING) cAc MA L:¢NH MANAGED

Dean rna l~nh trong vi du 1.4.3 se e6 van d~ ne'u nhu ban muon truyen mot con tro den rnQt s6 nguyen thuoc v~ ki~u diroc quan IY. Ban se nhd rang cac ubi tuong duoc quan ly co the" duoc dich chuyen trong bi? nho cua he thong nen GC, vi th~ con tro truyen Mn rna I~nh khong duccquan Iy se phai du'Q'c bao dam rii.ng kh6ng bi dich chuyen. No diroc thuc hien bang viec chat chat d6i tunng (; mot noi bl:ing tU kh6a _pin.

Vi du 1.4.4 rninh hoa each m¢t d6i tuong rna I~nh duoc quan Iy co th~ hi ch6t Iai de" cho phep dung met con tr6

Vi u y. 1.'1. t pinncd.cpp: Gia ch4t con tro bling each ehbt ch<)t

#uBingcmscorlib.dll>

PHAN I: M& d§.u

using namespace System;

_. _value struct Managedgtruct {

int p; int q; } ;

#pragma unmanaged

void timestwQ(int* pToMultiply) {

*pToMultiply *= 2;

}

#pragma managed

void main ( ) {

ManagedStruct'" .pStruct=new M~nagedStruct; pstruct->p=l;

pStruct->q=2;

int --.pin'" pinnedp=&pStruct->p; int --'pin'" pinnedq=&pStruct- >q;

timestwo(pinnedp); timestwo(pinnedq);

Console: :WriteLine {"p= {O}, q= {l} ", _box(pStruct->p) , _box(pStr~ct->q»;

}

8. cAe GIAO TIEP DU(1C QUAN LY (MANAGED INTERFACE)

T(t kh6a _interface co thif dliqc dung de tao ra giao tiep kieu COM vdi it kh6 khan nMt va khong elm lDL. Tli kh6a nay khOng duoc li~t ke iJ phAn d§.u cua chuang bo-i vi no ap dung cho cong nghe khac,

TIIY nhien, khi duqc SU" dung chung v6i phftn rna rong duqc quan Iy -EC, no tao ra mOt giao ti€p duac qUlin If. M(jt giao ti€p dan gian se dliQ'c giai tbieu d vi d!J1.4.5.

CHUONG 1-4: Lam viec vdi hi) quan ly c++

61~

using narnespace System;

~gc ~interface IDoSomething {

string * SayHello ( ) ; } ;

_gc class CDoSomething : public IDoSomething {

string * IDoSornething :: SayHello() {

return new String ("Hello") ;

} ;

voidmain( ) {

CDoSomething* pD=:new CDoSomething ( ) ;

IDoSomething*pI=static_cast<IDoSomething*>(pD);

String* s=pI->SayHello(); Console::WriteLine(s);

}

MQt thuan Iqi Ion etta viec ket hop cac doi tuung' duoc quan ly '{a giao tiep lit viec trinh bien dich co th~ hii trq cho cac ten nhap nhling cua cac phuo'ng thuc, Neu ban co hai giao tiep vdi cac phuong thire co cung ten, ban co th~ chi ra nhtrng cai dij.t nao se di cung vdi giao tiep nao. Vi du 1.4.6 chi ra cae giai quyet cac giao tiep nhap nhang.

Vi du 1.4.6 Ambigous.epp: Giai uye't cae giao tie'p nh~ nhf.ng

#using<ms.;:orlib .dll>

using namespace System;

_gc ~interface IFirst {

void TheMethod ( ) ;

} ;

_gc _interface ISecond

{

void Tl?-eMethod ( ) ; } ;

~62

_gc class AClass : public IFirst, public ISecond {

void IFirst: : TheMethod ( ) {

Console: :WriteLine ("Invoked IFirst: : TheMet hod " );

void ISecond: ; TheMethod ( ) {

Console: :WriteLine ("Invoked ISecond: : TheMet hod " );

}

} ;

void main() {

AClass* c=nelll AClass () ;

IFirst *pF=static_castcIFirst*>(c);

ISecond*pS=static_cast<ISecond*>(c);

pF->TheMethod();

pS->TheMethod();

}

Lrip AClass phiin biet giua hai dirih ngh ia cua giao tie'p bang each chi' fO phuong thirc TheMethod duoc cai dat.

9. T~O RACAc KIEV GI:A TRt

Kie'n true .NET nhan ra hai ho kieu: cac kieu gia tri va cac ki~u tham chieu, Cac kieu gia tr] la cac cau true nho tirong dbi dan gian, duQ'c tao ra va dung true tiep trong stack. Kieu tham chieu Iii cac dbi tuqng d.n thiet trong quyen han cua chung, duqc tao ra tren heap duoc quan lv, va duqc b(l thu gom rae quan [y vong doi.

M¢t kieu gia tr] phai Ia. mot kieu luu trl1 dan gian nhu int hay float. No cung eo the la mot cau true hay lop nho nhu time_t hay CPoint. M(it kiElu tham chieu la met lop, giao tiep, mang .. '

Cac kieu du Iieu duoc tao ra va sa dung tren stack thl khong thuoc sl! quan Iy cua GC Mi VI chung duqc xoa kha hi~u qua bang each dich chuyen con tro stack khi no di ra khoi pharn vi. No ngu y rang chung du<,1c tao ra kha dan gian va tan rat it thai gian de quart IY. Co the se can thiet de tao ra mot cau true tren stack

CHudNG 1·4; Lam viec vci bO quan Iy C++

63~

va truyen chung den cac ham khac. Vcri Iy do nay. bO thuc thi duoc quan Iy dung ky thuat dong hop (boxing) cau true don gian trong mot doi tuqng bao boc dang giu ban sao cua di1li~u g6c nhung da bi gan lai tren heap duqe quan IY.

Nham chuan bi cho e{(u true dan gian cua chinh ban de' dung nhu mOt kieu du lieu.vban co the" dung tU kh6a _value:

_value struct Birthday

{

int day; int month; int year;

}

Cling luu y rang tlt khoa _value khong tac d(ing den tLt kh6a _ge, boi vay n8"u ban muon gan duoc kieu gia tr] cua mmh t.ren vung heap duoc quan ly, ban phai dung ca hai dieu chinh nhu sau:

_value _gc struct Birthday

{

int day; int month; int year;

LlnlY

Thu tu ella cae dieu chlnli Iii. quan trong, Neu ban dung ~c _value. ban se bi Mi ..

Vi du 1.4.7 trrnh bay mot ky thuat co the lam cho bilt ky I~p trrnh vien c++ nao cung phai nan long. N6 tao cac gia tri dan gian tren stack nOi bO va truye n can tro d8"n chung M goi gon chung trong mQt tap hqp. Vcri C++ khOng diroc quan ly, n6 c6 the" tao ra mot 16i tai hai khi t;%p hop do co ga.ng de tharn khao den cac item rna hien da (I ngoai pham vi. Duoi Managed C++, bO thu gam rae se quan 1.9" dong doi cua cac gia tri dliqc tham khao den va se khong eho phep chong bi xoa eho den khi tilt ca moi thu dgu di ra khoi chung,

Vi du 1.4.7 refdemo.c p: Kigu gia tr] duoi su di~u khi&n ella GC

#using <mscorlib.dll> using namespace System;

using namespace System: :Collections;

_value struct simple

int i; float f;

} ;

_gc class refdemo

{lJ64

PHAN I: Mit dau

{

ArrayList * 1;

public:

refdemo () {l=new ArrayList; }

void Add(Object* o ) {

l->Add(o) ;

}

void create (int n,Object **pO}

{ "

simple s;

s.i=ni s.f=n*3.1415926; *pO =~box(s);

}

void init () {

for(int x=OiX<10iX++) {

Obj ect" *pO; create(x,&pO)i Add(pO} i

}

}

void show () {

for (int x",O; x c L> >get_Count (); x++) {

try {

simple*pS= __ try_cast<simple*>(l->get_Item(x»; Console: :WriteLine (" {OJ * PI = {l}" , __ box(pS->i),

__ box(pS->f»i }

catch (System: : InvalidCastException *) {

Console: :WriteLine ("Bad __ try_cast ... ") ;

}

}

}

} ;

CHudNG 1·4: Lam viec vrri be? quan ly c++

65~

.~ .<I~~~;·~': void main()

{

refdemo *pD,;new refdemo;

pD->init (); / / t ao ra danh aach gia tr:j..

pD->show(J; / / l~p het danh aacb va hi~n thi gici" tr:j..

Viec tao ra mQt ki~u gia tri vrri tU khoa _value se thay diH cau true dan gian eua ban thanh mot lop duoc dl'in xuat tU System::ValueType. N6 co nghia rling t\i ki€iu gia. tri c6 th~ override m(lt so phunng thrrc ella lap Co' sO' M eho phep chung gop phan d1l.y du han mra vao viec thao tac vdi rnaIenh dutrc quan ly. MQt trong nhtrng each su- dung thong dung cua lap du lieu la trfch xuat (extract) ra mot ehuoi. Co' chi nay cho phep ban glti m!}t integer hay float duqc dong goi den tham sa ella ham Console::WriteLine va nhan v~ ki~u cua ban M tI! in chung ra, Vdi each nay, ban se khong phai 10 liing v~ dinh dang phil hop eua rna l~nh printf cho mot integer, float hay string. D6i tuung' bi~t each d~ tra vg chuoi rna til chinh no.

10. T~O vA sit Dl,lNG cAe MO HlNH uY THAc (DELEGATE)

Mil hinh uy thac Ia phien ban .NET cua callback va con tro ham. Chung chu y€u duqe su- dung trong vi~e dinh huang cac str kien den bQ xii If ngay khi chung xuat hien,

MQt khai bao M6 hinh uy thac mil til. mQt dau hieu cua ham (function signature) vai met m<iu dac bi~t cua cac tham so va ki~u tra v~. MM khi miu nay dU\1c thilt ltp, n6 co thi! diroc dung M goi bAt ctt ham nao c6 cung difu hieu. MQt SI! khac nhau gii1a M6 hinh uy thac va ham callback ducc eai di[!.t trong cac lap c++ la, trong khi callback trong c++ phai luon luon la cac thanh vien static cua lop, Mil hlnh uy thac cling co thE! duqc dung dE! goi cac thanh vien the hien (instance).

Ml;\t delegate duqc khai bao nhu sau:

_deleg1ite <kieu tra V€!> MyMCDelegate «danh aach tham 8(:5»

M6 hlnh. uy tluu: c6 thi c6 nhieu. tham so. M& hinh uy thac phu hqp oai mdu

dua tren kie'u tra v~ va danh stich. th~m s6'. Vi thi, ..

_delegate char MyDelegate (int x, int y, double d) co thi duac dung trang cti hai khai boo phuong tluic sau:

char AFunction (int a, intb, double dData)

static char Foo (intmoo, int hoo , double doo)

Vi dl,l 1.4.8 trinh bay each cai dl!-t M6 hinh uy thac, Chung minh hoa ml;\t MO hmh uy thacdon gian, mi)t Me hinh uy thac se nhij.n nhap cac tham so, cac Mil hlnh uy thac tra v~ cac gia trj va so khac tni v~.d(t li~u thOng qua thaw so.

l!j66

PHAN I: Ma dau

Vi d~ 1.4.8 delegate.cpp: Sa dung eric M{, hlnh u:i' t hric

#include <stdio.h>

II dau ti~n khai bao ca c dEi:u hi~u delegate se dung.

_delegate void SimpleDelegate (void) ;

_delegate void De legateWi thParameter (int) ;

_delegate int DelegateWi thReturn (int) i

_delegate void DelegatewithOutParameter{int, int *) ~

_gc class AClass {

public:

static void StaticHandler (int n) {

printf (" I am a static handler and my parameter is %d\n",n);

}

void InstanceHandler (int n) {

printf ("I am an instance handler and my parameter is %d\n",n);

}

void HandlerA ( ) {

printf ("I am handler (a) \n");

}

void HandlerB ( ) {

printf ("I am handler (b) \n");

}

void HandlerC ( ) {

printf("! am handler (c)\n");

}

void HandlerD ( ) {

printf ("1 am handler (d) \n") ;

CHUdNG 1·4: Lam viec vai bi) quan ly C++

67~

.}

void WithReturn(int x~ {

p:r;intf( "Returning %d*5\n", x) i

void wi thOutParam (int x, int * refval) {

printf ("Returning %d*14 through the out parameter\n", x);

*retval '" x* 14;

}

} ;

void main() {

/ / khai t<;\o 16p handler .. AClass* pC=new AClass () ;

/ / t ao ra mo hinh uy t.hac

DelegateWithParameter* sh",new DelegateWithParameter(NULL,&AClass;:staticHandler); DelegateWithParameter* ih=new DelegateWithParameter(pC,&AClass::lnstanceHandler);

DelegateWithReturn* wr=new Delega,teWithReturn(pC,&AClass: :WithReturn);

,',' Dt;tlegj;lteWi thOutParam* ,wo=new "'Dele:'ganewithOutParam(pC, &AClass: :WithOutParam)

//G9i static •.. eh->Invoke(10);

/ / va nhung instance handlers. ih->Invoke(lOO);

/ /Bfiy gio la mOt multicast cua tat ca handlers trong m¢t danh each

SimpleDelegate* mc=new

Sim,pleDelegate (pC, AClass: : HandlerA) ; mc=static_cast<SimpleDelegate*>(Delegate::Comb!ne(mc,

new SimpleDelegate (pC, &AClass: : HandlerB) » ;

mc=static_cast<SimpleDelegate*>(Delegate::Cornbine(mc, newSimpleDelegate(pC,&AClass::HandlerC»);

!J68

PHAN I: Ma di

mc:static_cast<SimpleDelegate*>(Delegate::Combine(mc new SimpleDelegate(pC, &AClass: :HandlerD»);

mc->Invoke (); II t.hiro thi 4 l$nh 99i

IIBay gio m¢t me hinh uy t ha.c vo l m¢t tham so xuAt

printf ("Invoking delegate with value S.\n"); int r = wr ->Invoke(S) i

printf ("WithReturn send back %d\n", r) i

IIKet t.hu o m¢t mo hinh uy t.ha c voi mot tham so xuAt

printf ("Invoking delegate with value S\n"); wo ->Invoke{ll,&r);

printf ("WithOutParam send back %d\n", r) i

}

11. GQI cAc DLL .NET TUY BIEN TU MA L~NH MANAGI c++ CUA B~N

Managed c++ dung cac .NET DLL bat cd' khi nao no import cac than thuc thi nhu MSCORLIB.DLL bang chi thi #using. N6 con htru ich d/\ co th~ dij.t mot ph.tn mii. l$nh cua ban bAng c++ va m{it phan bllng C# hay VB. N nghia Iii. ban, se import va dung nhtrng DLL tuy bien cua chmh ban, Quy trlnr dan gian va duoc m6 hI. trong phan nay.

Dliu tien, chung ta se chi tao ra mQt DLL C# mil. ban co th~ import va Vi du 1.4.9 trinh bay mQt DLL rilt don gian co mot lop va mi)t phuong thirc.

Vi du 1.4.9 mydll.cs: M(Jt DLL C# don giHll

using System;

namespace mydll {

public class myclass {

public void MyMethod () {

Console. WriteLine ( "MyMethod invoked! I ! ") ;

}

}

)



CKUONG 1-4: Lam viec vrri bl? quan ly C++

69~

Ban khong e§npMi Iii mOt chuyen gia C# d~ biet each chung lam vi~e. Luu y ding lap duqc khai baa voi dieu chinh public. f)i~u nay se cho phep no va cac JbIltmJ",thu-c eua no dl.iqcexport tU thu vien. Go t4 p tin nay bil.ngN otepad .trong' tfi~ttll.itm~t tr6ng, luu no thanh mydll.cs va dichno bll.l"lg trlnh bien dich C# nhu sau:

esc It: library mydll . cs

Tuy chon dong l~nh It: se baa cho trinh bien dich biet dE!' tao ra thu vien DLL. Ban co tM thay rang kh6ng co liii hay canh bao.

Khong co dieu gi phai noi vai ham khi viet hay dung DLL nhung chi la mot sa thich, ban c6 th~ se mucin go dong l~nh 'nay:

Ildasm mydll.dll

flieu nay se goi trinh bien dich ngucc Intemediate Language Disassembler (lLDASM), cho phep ban khao sat DLL ban vua tao ra, Hlnh 1.4-1 se eho ta thay,

_B'ii¥~i'I'iREfN~~E;;~A"'~ .<. "i:;··:

P*:-k~ ,~

t6 ~ai co ~hl

~ .. "",,10;11

~ MANifEST ~ • m,<II

''''''''01.>0.

J e~t putr.c ~IJO &'rti bI'llOI~heldrl •

• <,.., v<><lO

."')l1li_''1<>«1

'j

!

)

" CO~, sin 11 (lIlcbJ

... AltxSIt.ack 8:

IL B"DD; l~st. ··Ill/Hetho" inuOkMtft·· , ,

Il-D'OS; c"ll uo14 r,.scorlihjSl/sh ... Con""l,., :Writ .. Lin.,(.t .. ing)

IL:=".oa; ret

> 1/ e nd of .... thod "!lela,s; , ..... "..thod

.... thad publie niaellyslg ,illstanc" void Hyl1othOO() eil n~ll;>gea (

, >'

Hinh lA-1 ILDASM, cho thfiy' n¢i dung -as ou. thl1

.\>\c,<,>".' . ». . .>'.' >,'. '.

"Ban cung c6 eM dung ILDASM M khao cuu m(lt 86 t~p tin kha thi khac

ban da tao ra trong chuong nay,

l!J70

PHAN I: MO' dau

Vi du 1.4.10 cho thay mqt lap c++ dan gian se s .... dung phinrng thuc MyMethod g9i tu names pace mydll

Vi du 1.4.10 useCSdll.cpp: M<)t chu'o'ng tr-mh C++ sli' dl,lng DLL C# tuy bie'n

#using <mscorlib.dll> #using <mydll.dll>

using namespace System; using namespace mydll;

void main (void) {

myclass *pM::new myclass ( ) ;

pM->MyMethod() ;

}

Go t~p tin nay vao Notepad va 100 n6 thanh useCSdll.cpp. Nho d.ng ca ca lenh #using va chi dlln using names pace d~u tham khao den DLL C# ta vita ta ra iJ vi du 1.4.9.

Dich tap tin bang' dong lenh:

cl ICLR useCSdll.cpp

Chay n6 bang cacch go useCSdll 0' dong lenh.

Ban se tha"y DLL C# ban da tao ra dtiqc nap va g9i t1! d(ing.

12. SU DlJNG DLL C++ DUQC QUAN LV vA KHONG DUQC QUAN LV TRONG CHU(jNG TRINH .NET CVA B~N

Viec lien ket va s11 dung thu vien dQng chi dan gian la dung b{i mo rQI Managed C++ dLidi .NET. Cac DLL c++ duqc dich thanh IL, giong nhu pMn ngngtt ty nhien .NET cua chung, duoc danh dau bdi sieu du Iieu (megadata) cung c thong tin chuong trinh v~ cac lop va cac phuong thrrc luu trong DLL. Di~u nay cc nghia Ia ban co tM dung chung nhu cac dOi tuorig .NET duoc viet bang C# h VB

Cac DLL khac rna ban co thll dung, nhu la cac DLL hI} thong hay nhirng I do ban tao, cftn mi}t chut cong srrc nhung ro rang vdn phai cam on cac dich Interop duoc cung cap biJi Common Language Runtime.

Vi dl,l 1.4.11 chi ra mot thanh phan managed C++ se duoc bien dich nhu mQt DLL

Vi du 1.4.11 cppdll.cp : M<)t DLL Managed c++ dan ian

#using <mscorlib.dll>

.u

diu t!;lo

,c

I rQng I ngon Ilg cap ty c6 y ~# hay

Jng cai Iieh V1,l

nhu IA

-

CHU(JNGiI.-4: Lam vi~c vdi b~ quan ly C++

71~

:ft .• :c,;\t1~,,:f . -..'

us'ln~'n~~\'~pace System;

using nameepace System: : Text; using namespace System: : IO;

II E>4y la m¢t managed c-» DLL dung .Net framework classes Ild:j.ch bAng ...

II 01 lCLR fLD cppdll . cpp

namespace cppdll {

/ /minh hoa vi~c 99i m9t class method ...• public _gc class AClass

{

public:

void FirstMethod {int n} {

String* pS=S"Hi from Firstmethod ";

StringBuilder* pB=new StringBuilder(pS};

StringWriter* pW=new StringWriter (pB) ;

·tor{int x=n;x>=O;x--) {

pW->Write{_box(X»i if (x)

pW->Write(S", "); else

pW->Write{S" ... ");

}

pS=pW->ToString{); Console::WriteLine(pS);

}

}

Go rna l~nh nay va hill vao cppdll.cpp. Sau d6 dich chung bang dong lenh: 01 /CLR fLD cppdll. cpp

DLL nay se ducc goi nhu la mQt doi tuqng .NET duqc quan Iy dan gian.

Vi du 1.4,12 trinh bay mOt DLL kMng duqc quan ly tieu bieu co rnQt ham tLi!1ng U'ng vci DLL chung ta vua tao & vi du 1.4.9. Nhu ban co tM thay, n6 ell ham DllMain chuan va mot DllFunetion c6 th€ dl1qc goi dEl' thao tac miit s6 thir va in ra , mQt thong di~p.

1.'1..

~72

PHAN I: Mi'I ddu

Vi dt.J 1.4.12 strainghtdll.cpp: M(it DLL xBG don gian

II £lAy la m¢t C++ DLL thOng thuong se dU'QcgQib4ng 1/ system interop services cua , NET

#include <windows. h> #include c at.d i.o , h» #include <string. h»

static char *buffer;

char* _stdcall DllFunction(int n ) {

sprintf (buffer, "Hi From DllFunction! "); for(int x=n;x>=OiX--)

{

char temp[100] i

sprintf (temp, "%d%s" ,x, (x==O ? " strcat(buffer,temp);

"

"

II ) ) ;

}

return &buffer [0] ;

}

BOOL _stdcall DIIMain (HINSTANCE hlnst, DWORD dwReason, LPVOID resvd)

{

switch (dwReason) {

case DLL_PROCESS~ATTACH:

buffer = (char * )rnalloc (1000) ; memset(buffer,0,1000);

printf ("Straightdll'loaded\n") ; return TRUE;

case DLL_PROCESS_DETACH: free(buffer);

printf ("Straightdll unloaded\n") i return TRUE;

default:

return FALSE;

}

}

Thea sau hi t~p tin DEF kigu eli dl1<;1e dung M export cac ham cua DLL.

EXPORTS DllFunction @1 DIlMain@2

Go chung vao va luu thanh tap tin strainghtdlLdef, sau d6 dich thanh DL vcri dong l~nh sau:

,'J

cHIfdNG 1-4: Lam viec voi b(J quan ly c++

73lMJ

cIlLO strainghtdll.cpp Ilink IDEF: strainghtdll.def

Cac DLL nay c6 thE! duoc dung boi chuang trinh C# hay VB rna ban viet.

KhIi'ilAnig.jWi DLL kigu cu vdi rna lenh hay ngon ngu kiE!u mci nay S8 gin gia cac ffiiu tl1 cua ban a cac rna lenh, ling dung, va cong cu cu khi ban mu6n chuysn sang ki~n·tr1ic .NET. De rninh hoa, chungta S8 viet rn(lt chuang trinh cue ky dan gian C,t .. eho thliycach dung lap dinrc qulin ly c++ va DLL khong dl1qc quan ly. Vi du 1.4.13 cho t~liy rna l~nh cua tap tin thuc thi cppdl.lusr.exe.

Vi du 1.1.13 cppdllusr.cs: M.;.t chtidng trinh C# ddn gia.n cho thay each dung DLL

1: using System;

2: using System. Text;

using System. 10; u~ing$ystem.Runtime.+nteropServices;

3: 4: 5: 6: using cppdll;

7:

8: class dlltester 9: {

10:

11 : 12: 13: 14:

.~ /

15: static void Main'( )

{

[DIllmport ("straightdll.dll")] [MarshalAs(Unm~nagedType.LPStr)]

public static extern String DllFunction (int n) ;

16: 17: 18: gQi.. _

19:

II DAu tienmethod trong C++ dll "cppdll.dll" diroo

AClass pC=new AClass ( ) ; pC. FirstMethod (10).;

20:. 21:

22: If Bay gio 99i ham bao boo cho DLL khong duqc quan Iy

23: Console.WriteLine(DllFunction(lO»;

~~-~~'~,;,;;'~._ .. ;:;_'i"·:.'~i

25: }

26: }

Sa dung DLL cua managed C++ kha r5 rang, nhung cai kheng duqc quan ly thi phuc tap han. Chung ta khao soh pha n lam cho sV wang tac vdi rna l~nh khong dliqc quan Iy la co tM.

Dong rna li;,nh 11, 12, va 13 a vi du 1.4.13 cho ta thay each tao ra mot tilm phil (wrapper) cho m{\t ham trong mQt DLL khong duqc quan lY. each nay dung cac thuoc tfnh (attribute) d~ tao ra mot proxy cho cac rna lenh khong duqc quan If

LL

~74

PuAN I: M& dl1u

va sap d~t cac tham s6 va kieu tra v~ tit va Mn cac phan khongducc khai bao cua h~ th6ng.

Thuoc tinh 1D1llmport(' .. )1 chi r5 rling dau hieu cua ham theo sau la mQt thu dinrc xuat khau bai DLL duqc dat Wn, trong truO'ng hop nay la strainghtdll.dll rna chung ta da tao Ii vi du 1.4.11. Ham nay tra v~ mi)t char '" Mn mi)t vung d~m rna n6 duqccAp phat, Tuy nhien, bi) thuc thi dl1qc quan Iy se can dll lieu tra v~ d~ duqc d6ng goi trong mot d6i turmg than thien han vdi .NET, do do, thay VI dung cac char '" nhu lA ki~u tra ve cua ham cua chung ta, chung ta dung String va bao Mth6ngrl1ng n6 c!insil:pd~t(marshal) du lieu khi no duoc tra v~tuh8.m, D.ieu nay dl1gc th\,ce,hi~n Mi thuoc tinh {return:MarshaIAs( ... )]. V] tri cua n.6l;iung truCe khat bao ham cho thlly no la ki~u tra v~ se du;;ic si!:p x€p (marshal). ThuQc tinh nhu the' c6 th~ dung tren mot tham s6 M chuyen dll lieu tLr mot string thanh mot, con tro char "'. Tharn s6 cua thucc tinh Marshal As la mQt trong danh sach cac kieu c6 th~ nhan biet tu namespace System::Runtime::lnteropServices,

Vi~c gQi DllFunction 0 dong 23. 86 lit mot tham sO' don giancho phuong thuc Console,WriteLine. N6 chi chap nhan cac item dua tren System. Object , bai vay ban c6 th~ thay rl!.ng viec sAp xep cac ky tu diroc tni ve char * vao d6i tuong String nhir the' nao.

Go vi du 1.4.13 vao t!j.p tin cppdllusr.cpp va dich chung bl!.ng cau l~nh: esc Ir: cppdll. dll cppdllusr. cs

Chuang trrnh se bien dich, va ban co th~ chay cppdllusr tU dong l~nh.

13. DUNG cAc THUOC TiNH (PROPERTIES) TRONG cAc

,? •

LdPCUAB~N

Cac thuoc tin,h la cac tharih vien gia-du lieu cua cac tap cua ban. N6 dtfqc truy xuat nhu cac thanh vien da lieu publie nhung trong thuc te' chung la cac ham ben trong lop.

Vi~c them vao cac thuoc tinh cho cac I'ap thu gam rae C++ ducc thuc hien bang each dung tU khoa _property. Vi du 1.4.14 trrnh bay mot lap GC don gian vdi cac thuoc tinh.

Vi du 1.4.14 pro s.c : Cac thu(lc tinh don 'an ti-on m(lt Idp GC

#using <mscorlib.dll>

using namespace System; using namespace System: : IO;

_~gc class PropGlaes {

int m_x; int m--y;

CHu'dNG 1.4: Lam viec vrri bQ quan If c++

75~

public:

PropClass () mJ (19762) , m_z (3860) {

}

II properties dQc/viet cho m¢t data member

--'property int get_x () {return m_x;}

-----property void set_x(int v) {m_x=v;}

II properties chi d9C cho m¢t data member

--'property int get_y() {return mJ;}

II properties chighi cho m¢t data member

II properties khong t.a.c d¢ng tr~n du liti!u

--'property int get_bogus ( ) {

Console: :WriteLine ("Read the bogus property! ") ; return 10;

}

--'property void set_bogus (int v) {

Console: :WriteLine("Wrote {OJ to the bogus

property!" ,_box(v»; }

String* ToString ( ) {

StringWriter *w=new StringWriter ();

w~ >Write ("PropClass; m_x;;; {O} I mJ = {1}, m_z '" (".2}",~box{m_x) I _box (m_y) I _hox(m_z»;

, ,returnw~>ToString ();

}

} ;

void main ( ) {

PropClass ·pP",new PropClass ( ) i

Console: :WriteLine ("At Creation ... {O}" I pP) ;

\!J76

PHAN I: Mi1 d!lu

PP->X=50i

Console: : Wri teLine ( "Wrote to x ... {O}" , pP) ;

PP->Z=:lOOi

Console: :WriteLine ("Wrote to z ... {O}", pP) ;

pP->bogus =: 150j

Console::WriteLine(pP);

int x=pP- >x;

Console: :WriteLine ("Read x , Return ={ O}, { l} 11 , _box (x) , pP ) ;

int y;:pP->y;

Console: :WriteLine ("Read y. Return =dO}, {l}",_box(y},pP);

int z=pP->bogu8i

Console: :WriteLine {"Returned value ~ {O} • { 1} 11 • _box ( z ) I pP) ;

}

Chuong trinh props.cpp cho thay cac thuQc tirih truy xuat, true t.iep vathanh vien da li$u trong mQt lCip va cac thuoc tinh se thuc hi~n cac tinh toa: kh6ng can lien h$ den cac thuoc tinh cua lop,

Chinrng trlnh cung chi ra kg thuat tao I~p cac thuoc tinh chi d9C hay cl ghi. DE) tao ra mot thuQc tinh chi doc, chi can don gian them van accessor get ThuQc tinh chi ghi chi d.n accessor set_.

Cuo] cung, chuong trtnh trtnh di~n mot ky thuat ha'p dan cua viec overru phuong thuc ToString{). NM rling cac lop duqe khai bao voi _ge thi diiu duqe di xuat tu System::Objeet. Lap TIllY dinh nghia phuong thuc ToString, cai se du dung d€ xuAt mot, chuei ella lap ra lu6ng (stream) van ban.

14. BAo DAM VI~C SAP xEP vA DONG GO! cAe CAD TRue c++ etTA B~N

Bdi vi bQ thu gom rae lam kha nh ieu viec si\p xep va b6 tri rna lenh cho t nsn d6i khi rAtkh,6 hieu mot cau true nao My duoc b6 trl nhu the nao trong

CHUdNG 1~4: Dam viec vdi b(i quan ly C++

77

nho. No co th~ la rilt quan trong ne'u ban dang dem de'n m(it cilu true theo thu tl/ byte tit chuang trlnh hay DLL C++ trudc day va dung chung trong ngu canh ella .NET. Cac dich vu Platform Invoke co cac thuoc tinh rna ban c6 th~ dung d~ chi ra chinh xac cilu true cua ban se duoc b6 tri nhu the nao, nho v~y ban co the doc chung VaG cac rna lenh duoc quan Iy va vh chac chan rAng thd tv va sap xe'p cua cac bie-nbi} nM la da duoc hieu ro.

ThuQc tinh StructLayout co th~' duoc dung M b6 tri mQt cau true lien tuc, d~t cac bien thanh phan vao mot offset xac dinh ben trong cau true hay M khai bao ll(it union. B6 tri lien tuc la dang dan gian nhat, va ban c6 the chi r6 them ve vi~c dong goi cac thanh phan cua cau true.

Kich ban thirong' g:'1.P nhi'lt la ban Mn nci rna da co m(it cau true C++ duoc dinh nghia truae trong mot irng dung va ban can dung cau true nhu vay de' quan ly the giai, co thi'i lit tU mQt chuang trrnh Managed C++ hoac co vai doan rna I$nh duoc viet bling C#. Diilu nay se tac dong den ta't ca. Hay nhin vao cau true C++ dan giiin r1 vi du 1.4.15.

Vi clu 1.4.15 simplestruct.h: MQt ca'u true C++ don ghin

#pragma pack ( 8 )

typedef struct { char name [ 17] , int age, double salary, short ssh [3]

} simple;

Khai b'ao d vi du 1.4.15 dinh nghta mot cau true vdi mot dang dong goi dac biet, De biet xem cau true dy a trong b(i nho se nhu the' nao, chung ta hay dilln vao chung nhirng gill. tri dac biet va sau do ghi VaG cac bien trong cau true. Vi du 1.4.16 eho thily quy trinh va bang dump nQi dung cua edu true ily len man hlnh.

Vi d"" 1.4.16 shnplctcst.h: MQt chuong trinh de' thu' diu true don gUn

1: #include <stdio.h> 2: #include <memory·. h» 3':#include "simple. hOI 4:

5: void dump (uns igned char * pC, int count) 6: {

7: printf ("Dumping %d bytes\n", count);

8: int n==O;

9: while' (n-ccount.)

10: {

11':' tnt i;

12: int toDump = count-n>= 16 ? 16 count-n;

13: for (i=O; Le t.opump ; i++)

~78
14:
15:
16:
17:
18:
19:
20:
21 :
22: }
23: }
24:
25: pHAN I: Mcr diu

printf {"%02x", pC [n+i] } ; while (i++<16)

printf (" ") ;

printf (" " ) ;

for (i;:O; i<toDump ; i++)

printf ("%c", pC [n+i] >Ox1f?pC [n+i] : I • '); printf (" \n") ;

n +;: tODump;

26:void main (void) 27: {

28: simple s; 29:

30: memset(&s, Oxff, sizeof{simple)};

31: memcpy (&s. name [0] , "abcdefghij klmnopq", 17) i 32: s.age=Ox11111111;

33: s.salary;: 100.0;

34: s.ssn[O];: Ox2222;

35: s. BSn [1] = Ox3333;

36: s , ssn [2] = Ox4444;

37:

38: dump ( (unsigned char*) &s, sizeof (simple) ) ; 39: }

Dich rna l(!nh nay vrri dong lenh sau:

Cl simpletest . cpp

Bay giu hay chay n6 tit dong l(!nh.

Dumping 40 bytes

61 62 63 64 65 66 67 68 69 6a 6b 6e 6d 6e 6f 70 nrr ff ff 11 11 11 11 00 00 00 00 00 00 5940 222233334444 ffff

abedefghijklmnop

q .Y@

""33DD

Mil. l{!nh a vi du 1.4.16 eho th1ly ding cau true simple da dl1qc dien d[y da li(\u. Diiu Win, (1 dong 30, no duqe difm vao so hexa ff df phan anh du lieu thuc voi nhirng khoang tr1l:ng cua viec d6ng g6i cau true, Dong 31 chi ra thanh phin age dang du'qc di~n bang 17 ky tu, va dong 32 den dong 36 cho thay tat cit cac bien so d~u dugc gan tri. Mil l~nh n~m tu dong 5 den 32 chi dan gian dump cau true ra man hinh.

Kat xuilt thl kha ro rang, nrri rna if dtiqe nhin th.1y lit phdn cua ea'u true, Mgt d.1u rn6i khae 18 17 + 4 + 8 + 2 + 2 +2 khOng Mng 40, kich c{J dlfac khai baa

cda c§u true bru sizeoi; .

CHUdNG 1-4: Lam viec vrii b(l quan ly C++

791!!J

Khi truyen cdu true nay den rna i~nh eil ctia bgn tit managed C++ hay C# th: e6 thi se c6 IJi Mi vi 6¢ nh a duoc qudn if thea each khrie va CLR khOng cho phep ban. tao ra eric eciu true duoc quan if voi mot mdng kieh co co' dinh. Dr1li~u se cdn de vila 66 tri va sdp xep (morshal) giiio. hai the gioi duoc quan lj va kh6ng dltqc quan lj.

Vi du 1.4.7 minh hoa each mQt cau true e6 thE) duoc tao ra v6'i vi trt chinh xac cua cac thanh vien va each chuyen mot da li~u mango

Vi du 1.4.7 managedsimple.txt: Ph ie n ban du'<je qUan ly ella ca'u true ddn J!i~in~

[StructLayout(LayoutKind::Explicit,Size=40)]

public _gc struct managedsimple {

[FieldOffset(O)] [MarshalAs(UnmanagedType::ByValTStr,SizeConst=17)] System: : String *name;

[FieldOffset(20)]

int age;

[FieldOffset(24)]

double salary;

[FieldOffset(32)] [MarshalAs(UnmanagedType::ByValArray,SizeConst=3)] short ssn _gc () ;

} ;

Luu. Y

Nh6 ding bat cu khi 'lao dung nhiing thunc tinh nay trong pluin. mem. ciia minh, ban 'len khai brio rang bgn dang dung namespace System::Runtime:1nteropServices.

o day ban thay rang khOng chi b6 tri vij.t Ly cua cau true ducc di~u khign cdn than bdi viec dung cac thuec tinh StructLayout va FieldOffset ma cac mang C c6 chieu dai c6 dinh char va short con duqc thay thl! hai cac kigu System::String va System::Array than thien vrii bl} thu gam rae.

Brri vay, chuang trmh bil!t lam the' nao M cac mang duoc quan Ly se duqc chuyen ve cac rna I~nh cu, (thuoc tinh MarshalAs, cai rna chung ta da thay trong phan ket hop va; kigu tra v~), da duqc munn dg chi ra tAng mang can duoc sAp xe'p nhir Ia mQt rnang chui'ii 17 ky tv va mQt mang cua 3 s6 nguyen short.

Vi du 1.4.18 la rnQt thay d5i cua rna lenh a vi du 1.4.16. 0 day, chung ca dinh nghia mot DLL C++ khong duoc quan ly se him nhiem vu dump gi6ng nhu trtioc cho chung ta, DLL nay se duoc chuygn v~ chuang trinh managed C++, cai rna gi6ng nhu La cac module C# hay VB.NET. Ket qua se dinrc hien len man hmh Ian nCi'a. Dau tien la DLL khOng duqc quan IY.

f

r

.~80

pHANI: M& d~

Vi d~ 1.4.18 structuredll.cpp: DLL khong du'<1c qua n ly

1: #include <stdio.h> 2: Ihnc 1 ude <memory. h» 3: #include "simple.h" 4:

5: void dump (unsigned char * pC, int count) 6:

7: 8:

printf ("Dumping%dbytes \n", count);

9: 10:

int n=O'

.. ,- . ,

while (n-ccount; )

11: int i;

12: int toDump '" count-n >= 16 ? 16 c ourrt= n r

13: for (i=O; i<toDump i i++)

14: printf (1I%02x", pC[n+i]);

15: while (i++<16)

16:

printf ("

11 ) ;

17: pr int f (" " ) ;

18: for(i=O; i<toDump ; i++J

19: printf ("%c", pC[n+i]>Ox1f?pC[n+i]:'.')i

20: printf ("\n");

21: n +::: toDump;

22:

23:}

24:

25:void _stdcall ShowSirnple (simple *s) 26: {

27: printf ("Unmanaged DLL\n");

28: dump ( (unsigned char *) s, sizeof (simple»; 29: printf ("Name=%'17s\n", &s->name[O]);

30: printf ("Age",%d\n", &s->age);

31: printf ("salary=%f\n", &s->salary);

32: printf ("SSN=%d-%d-%d\n\n", &s->ssm[O] ,&s>ssm[1],&s->ssm[2]);

33: print f (" Changing the salary ... \n" ) i 34: s->salary=999999.0;

35: 36:

printf ("Changing the name .•. \n");

strcpy (s->name, "Mavis ");

,.-

<::H1J(1NG 1·4: .Larn viec vdi hI) quan Iy C++

81~

37: printf ("Changing the ssn •.• vn ") i 38: a-o-aam [0] =99;

39: s~>Bsm[1]=999;

40: s- >Bsm[2] =9999;

41: }

42:

43:BOOL _stdcall DIIMain(HINSTANCE hlnstance, DWORD dwReason, LPVOID)

44: {

45: switch (dReason) 46:

47: case DLL_PROCESS_ATTACH: 48: case DLL_PROCESS_ATTACH:

49: retun TRUE;

50: default:

51: return FALSE;

52: }

53: }

Tij.p tin DEF xuat khau cac phuong thuc rna ban se dung, IL1u chung trong structuredll, clef.

EXPORTS

DIIMain @1

ShowSimple @2

Dich DLL nay voi dong lenh:

CI fLD .structuredll . cpp f link fDEF: structuredll. def

Vi du 1.4.19 cho tM."y ding mot, irng' dung managed C++ se dung DLL 0 vi du 1.4.18 thong qua lei goi h~ thong, truyen cac cau true dL1q'c dinh nghia Me bi~t va dL1Q'e quan Iy vi~c sap xep.

Vi du 1.4.19 simpJedump.c p: Chlidng trinh thu mana ed C++

1: II £>ay lei managed C++ test 2: If de simpledump mot; dll 3:

4: #using <mscorlib .dll> 5:

6: using namespace System;

7: using namespace System: :Runtime: : InteropServices; 8:

9: II Ddy lei khai bao cua cau t ruc

~82

PHAN I: Md di1u

10: [StructLayout(LayoutKind::Explicit,Size=40)] 11:public _gc struct managedsimple {

12: [FieldOffset(O)]

13: [MarshalAs(UnmanagedType::ByValTStr,SizeConst=l7)] 14: System: : String *nanie;

15: [FieldOffset (20)]

16: int age;

17: [FieldOffset (24) ] 18: double salary;

19: [FieldOffset (32)]

20: [MarshalAs (UnmanagedType: : ByValArray, 5i zeConst=3) ] 21: short ssn _gc () ;

22: } ;

23:

24:

25: / / Dily la lap se imports ce.c DLL function ta din 26:_9C class stDll {

27:public:

28: [DllImport ("structuredll.dll")]

29: static void ShowSimple ( [In, ouc ,

MarshalAs(UnmanagedType::LPStruct,

30: 5izeConst==40) 1 managedsimple) ;

31:

32: / / neu ban muon import c a c functions khac cua DLL

33: / / c6 the them vao 6 day

34:} ;

35:

36:void main (void) 31: {

38: managedsimple *m == new managedsimple; 39:

40: m->age", 24;

41: m->salary = 180000.0;

42: m-e-name '" new System: : String ("Beavis"); 43: m- >ssn = new short _9c (3) ;

44: m->ssn[O] = 10;

45: rn->ssn[l] = 100;

46: rn->ssn[2] = 1000;

47:

~ CHU(1NG 1-4: Lam vi~c vaj b<) qwin ly c++ '48: managedsimple --pin* pS = m; 49:

50: StDll: : ShowS imp Le (pS) ; 51:

52:pS = 0; 53:

54: Console: :WriteLine ("Back in the managed code") ; 55: Console: :WriteLine (m->salary);

56: Console: :WriteLine (m->name);

57: Console: :WriteLine {" {OJ - {l} - {2}", _box(m>ssn[O]}, __ box(m->ssn[l]),

58: __ box (m- >ssn [2] ) ) ;

59:}

83~

BUm djch t~p tin nay bang dong l~nh:

Cl Iclr simpledump . cpp

Va bay gia hay chay no tlt dong l~nh. Ban se thay k€t xuat sau:

Unmanaged DLL Dumping 40 bytes

42 65 61 76 69 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 00 80 66 40 Oa 00 64 00 e8 03 48 00

Name::: Beavis

Age:::24 Salary=180.000000 SSN=10-100-1000

Beavis .

............... Qf@ .. d._.H.

Changing the salary ... Changing the name _ .. Changing the san ..• Back in managed code 999999

Malvie

99-999-9999

Blit d§u vci ham main fJ dong 36, chung ta tao ra m(lt cau true d dong 38 va sinh chung d dong 40 Mn 46. Dong 50 goi ham cua DLL. va chung ta nhay sang dong 25 vi du l.4.18.

Phuong thirc nay se dump mot n<)i dung cua cau true bAng M hexa, cho tha'y each cau true duqc quan If cua chung ta, voi ca ehu6i va mang cao s6 nguyen ngan (short) duqc slip xep vao the gidi khOng duqc quan Iy cua DLL. o dong 29 Mn 40 cua viec li~t ke cau true, da li~u trong cau true kh6ng duoc quan ly dircc

PIIANI: Ma Mu

thay Mi bdi rna lenh c++ cu khong dl1qe qulin Iy nhung tot. Khi tien trinh ke't thuc, trtnh sAp xep (marshal) .NET lai dem cac cH:u true kh6ng dl1qe quan Iy vao the gidi duec quan Iy noi dong 54 den 58 cua vi du l.4.19 xac nhan cac thay doi bang each in cac gia tri moi ra ngoai man hinh.

Nhu ban co the thay til cac doan rna I$nh trong phan nay, kha nang sieu - thao tac giira cac the gioi duqc quan Iy va kh6ng dliqe quan Iy duoc cung clip tot va chung giup ban gill cac gill. tri tri tu$ dd e6 vao nhung narn cua .NET.

15. KET CHUdNG

Cac I~p trrnh vien C++ dang lam viec vdi .NET duoc cham soc kha kyo Cac rna I~nh da co cua ban co the vunt qua hang rao .NET, ban cung kh6ng phai quang he't moi thu va lam lai til dau, Co the se co nguyen rnct cuon sach viet rieng vt3 dt3 tai dich chuyen (migration) rna I~nh, cluing ta tin rAng mot, ai do se him diEm nay tuy nhien chuang nay se giup ban thay duoc con dlfang va dung ban day dt'! chay,

Chl{ung 1.5

oror TIIT¢U VISUAL STUDIO .NET

C6c van d~ chinh se duuc d~ cap den: ./ Tich hop moi truong phat trien ([DE) .

./ Kliu vue soon thao chinh .

./ Guu phrip (Solution), Lap (Class), Muc (Item), va trinh giup do (Help) . ./' H¢p cong CIJ (Toolbox) va Server Explorer .

./ Nhilng tac VIJ (Task), ket xudt thong tin (Output), ket qua tim kiim (Search Result), vii Watch .

./ Thuoc tinh, Trinh giup do nang df)ng, va nhilng Favorite . ./ Chuang trink gfl 18i.

1. TI'CH H(1P MOl TRUONG pIlAT TRIEN (IDE).

Neu ban dii quen thuoc vci Visual Studio S.x hoac 6.x, tht giao dien cua Visual Studio .NET cling khOng khac may. Tuy nhian, co m(it vai SI/ khac biet ban nell tim hiii'u M d~ dang phat trien san pham voi b(i cong cu mdi nay.

Hinh 1.5-1 - Visual Studio .NET

IHJ 86

PHAN I: Mil dliu

Visual Studion .NET kha tien tien va ldn han so vdi ho Visual Studio cu.

Trong qua khu, viec phat tri~n cua c++ va Visual Basic thtmng tach bi~t nhau. Tuy nhien gia day, ban dtfgc cung cap SI! chon lua cua C++, C#, JavaScript, Visual Basic, va rat nhieu ngon ngil khac dang chay canh nhau tren kien true .NET framework. Moi trucng phat tri@'n tinh vi va co th~ xli. IY. ta't ca nhung' phan cua ling dung ciia ban theo each hop nhat.

Rieng bi) Visual Studio muon dEl cap het co Ie chiem rat nhieu trang cua giao trinh, nhung trong chuong nay, chung toi chi girri thieu khai quat ddy du d~ ban co th€ lam quen va lam vi~c hieu qua ngay vdi bi? cong cu phan rn~m nay.

Hinh 1.5-1 hi~n thi anh ban d:iu ella Visual Studio .NET. NhUng thanh phan chinh cua Visual Studio dugc chu thieh tlt A qua E.

PHAN A : KHU VVC SO~ THAO CHiNH

Dillu dau tien ban nhin tha'y trong khu vue nay la trang Start Page. Gi6ng nhirng cira s6 khac ella VS.NET, no la mQt ella so HTML Browser, ctra s5 nay hien thi nhirng du an g§.n nhat cua ban va dua ra nhUng thong tin huu dung khac v~ VS.NET. Khu vue nay cung la nci soan thdo ella nhUng t~p tin chirong trinh (source file) cua ban. d tren ella s6 nay la mot thanh tab cho phep ban d~ dang chon nhung t~p tin dang rna hien hanh M soan thao (htnh 1.5-2).

Hinh 1.5-2 - Chon nhiing ttip tin dang ma

d day ban co tM nhin tha'y rang Forml.CS duoc rnCJ cho viec soan thao trong cM' dQ thiet ke (Design Mode) (gi6ng nhu mQt bi~u mfiu trong Visual Basic), va tap tin chuong trinh ngudn C#. Ben phai thanh nay hi nlurng thanh phan diElu khien (control) cho phep ban cuon tab ben trai hoac ben phai va dong ctta st) hien hanh.

PHAN B : GIAI pIlAp (SOLUTIONS), LOP (CLASSES), TRQ GIlJp (HELP).

Trong phan nay cua ciias6 IDE, ban se nhm thay mQt sO' tab di~u khi~n (tabbed control) vai nhieu khung hien thi khac nhau, Htnh 1.5-3 hilln th] cac tab nay.

Contents ! [1) Index I Search i

Hinh 1.5·3 - Nhrlng .5 nhiiri ben phdi.

Mlj.c dinh, khung nay chua dung cac clla 85 Solution Explorer, Class View, Help Contents, va Help Search.

ClIUdNG 1-5; Gicrj thieu Visual Studio .NET

87~

1.1. Solution va Solution Explorer

Solution (gilii phap) Ia mOt kh6i cling vi~c n~n bing trong .NET. MOt solution cOtMchU'a'dl!ng nhi~u ki~u dV an (project) khac nhau. Vi du, ban mu6n 40 mOt ling dl,ulg ,k:hAchchil (client/server) dliy dil vai cac du an con (sub-project) rieng Ie tlt ch\iqng trtnh khach (client) dLigc viet rna tren MFC va chuang trmh chu (server) d\4'QC viet rna tren ASP.NET Solution la noi ke"t hop tat cil. nhimg dl,C an can trong ling dung. MOt Solution .co thEi bien dich met liin chung vdi nhi1ng du an con.

Khi ban chon tab Solution Explorer, ban se thay mOt cau true cay baa g6m nhang muc khac nhau. Cay nay chua dung nhirng dir an, thu muc, t~p tin, tai nguyen (resource), va nhi1ng dtr li~u l inh tinh khac dinh nghia pharn vi cong viec hien hanh cua ban,

MOt solution co nhung thucc tinh anh hu&ng den tat ca nhfrng dV an ben trong no. Nhu vai hau het nhung muc khac trong Visual Studio .NET, khi nhap chuot phai-len ten Solution va chon Properties se cho phep ban dieu chlnh nhtrng di!-c tinh cua Solution. .

Hlnh 1.5-4 - hit'in thi khung ci'ta s6 Solution va hop hQi thoai thuec tinh danh cho Solution d6.

".:.J S)"stem,Drawing

<;] System.Wh:lows.FOI"M:: ··:;)5y stern. XML

t{) AS5OfT1bjyln!o.cs iI~

Hinh 1.5-4 - Solution va nhilng ttiuoc tinh. ella no.

d day khung cua s5 Solution Explorer nam ben phai chira mQt du an don ten Ia AnApplication. Hop hiji thoa i thuec tinh Solution (narn ben trail cho phep ban chon dl,1 an con nao la du an khrri dQng, moi du an phu thuoc vao du an khac nhir the" nao, nci IDE se tim kie"m nhirng t~p tin tai nguyen khi g() loi, va noi nhllng t~p tin ky hieu gO loi dlJ'qc luu (debug symbol files). Nhttng thiet I~p nay se dung chung cho tat eli nhtrngdu an Mn trong m!)t Solution.

~88

PHAN I: M& diiu

2. Dlj AN (PROJECTS)

Solution chua cac dlJ an, con dlJ an chua nhung muc thong tin. Nhll'ng muc nay co ~M la nhirng thu muc dung cho vi~c W.chllc rna nguon ciia ban, nhimg t4p tin dinh nghta (header file) va t~p tin tal nguyen (resource file), nhung tham chieu toi nhirng' dt! an khac, nhU'ng dich vu web (web service) va nhirng t~p tin M thOng (system files),' cung tilt c:i nhung t~p tin Ina ngudn cua dl! an ben trong solution. Trong hinh 1.5·4, ban co th~ nhin tMiy dlJ an dang rna co 2 i~p tin la Form1.cs va Assernblylnfo.cs, cung t4p hqp nhiJng tham chieu (reference). Cac tham chieu reference nay tuong' tL,l nhu chi dan #include trong t4p tin C++; chung cho phep truy xuat tai cac sieu di1li~u metadata trong cackhong gian ten (namespaces). Nhimg tham chieu nay cung co th~ tham chieu Wi mo til. Web Service Description Language (WSDL) ella m(it dich vu Web. Ki~u tham vchieu Mn dich vu Web gt.li la Web

reference.

MoSi du an ben trong mQt Solution.co nhung thuQc tinh. Hmh 1.5·5 hien thi thuQc tinh cua dlJ an AnApplication.

oOSyStoMrl.Ctal:'III

.... '1iiSystem.Dr....-.;)

.0 'Sy$tOm.WIndows-.!"OI'ms. ...(J SyStMI,;tH, ~As_lrio." 1IiiI1'iiiiil>«

Hinh 1.5·5 - Hop h(Ji thoqi thll9C tinh ella dlf an.

Trong hQp thoai hien thi a hinh 1.5·5 nhu ban thay, chung dan gian, de stl dung va kha ngan gon han so vai VS 6.0 .

. Cac thuoc tinh cua dl! an bao gOm nhtrng til.y chon (options) quy dinh each bien dich chuang trlnh nhu mac t6i u\l h6a (optimizations), each khrri di/ng va hien thi form (start options), kii' cB each soan thao dong l~nh va nhung tuy chon go Uli.

Nhtlp chuet phai tren dl! an se hien thi trlnh dan ngtr canh (cho phap ban chon each bien dich dlJ an mot each rieng bi~t, cung vai them vao nhilng muc din thi~t cho di,t an, nhu tham chieu, file tai nguyen, mil nguon moi ...

3. NHl~U Dl,iAN TRONG MQT SOLUTION DdN

Vi~c tMm ml)t dl,l an vao ml)t solution kha dan gian. Ban nhap phai chuQt tr&n Selution.vt chon Add. Visual Studio BE! hi~n thi danh sach cac chon lua danh cho vi~ !;fo md'i Mi tl1gng, sil dung' dOi tu'gng hien c6 tren may ella ban, hoac lAy ml)t d6i tllqng v~ tit Web.

CHtfONG 1-'5: Gi6i thieu Visual Studio .NET

89~

Hlnh 1.5-6 hi.§n thi hop thoai New Project Wizard cua lenh Add, chung ta sa them m<)t dir an Managed C++ vao Solution.

Visu/ll C# Projeds l/I$\)aI,C++ Pt<ll\3d:~.

Gl setup and D~I()yment Projects ['.'] CJ Other Projects

· Gl Database Projects

it] CJ Enterprise Template i>roJects

, CJ Visual Studio Analyzer'Projects '

· CJ ExtensibHity Project,

· CJ Application Center Test Projects

Extended

Stored Pro.. . Project

~l~.·

~I!q F~\Temp\C#

,~!~~~~-~~~5f.~~~4£.:~-~.-

.. ..... . .. '. ' .. j" ......

.... • · .... 4·:.···.;;i···Tt~;.-;!:ht;d¥~·,;?·.?'E; .. : ... ·. J .:

Hinh 1.5·6 - Them mot dlf an vao solution.

Sau khi chap nhan hop thoai (nhan OK), Solution gia day se chua 2 du an (hlnh 1.5-7). DV an thl1 hai co cau true khac vdi dV an ditu. VI la mot du an Managed C++, nen no chua nhung thu muc cho danh cho cac tap tin rna nguon , t~p tin dinh nghta va tap tin tai nguyen.

Solution 'AnApplicatjon' (2 projects) dii!!I AnApplication

8l G2l References

. ~ Assemblylnfo.cs !ill FOfm 1. cs

~fI;DiDII

El ~ Source Files

[tj AnOtherApp,cpp [fj Assemblylnfo.cpp rn stdafx.cpp

El e?J Header Files

[J scdefx.h

s .. · ~ Resource FUes

GJ ReadMe.txt

Hinh 1.5-7 - Mi)t solution vai nhisu du all.

1!l90

PHAN I: MiJ dtlu

Trong ca hai du an nay, co mot t~p tin goi la Assembly. Tap tin nay Ole c6 troug tat ca nhung du an .NET Framework. N6 tucng tl,{ nhu tai nguyen VS_ VERSION_INFO sU' dung trong Visual C+-t-. M¢t Assembly Ia mQt dan v~ co ban cua Framework. N6 c6 thjj: chua mOt hoac nhi~u nhil'ng module thue thi va nhung tai nguyen. 1:l"6 cung chua mQt assembly "manifest". Manifest Ill. mot metadata (hay sieu da Iieu) ket hqp vdi assembly. Ban co tMthem thOng tin, nhu so' phien ban cua rna chuong trmh, nhan hii;!u dang ky , cac mB ta, va nhirng thu da li~u khac vao manifest bang each dien vao no i dung cua t~p tin Assemblyl nfo. Trong phan 5 cua cuon sach nay, chung tOi se giai thich each sa dung va quan ly Assembly.

4. cAc FILE PHU THUDC CVA mr AN (PROJECT

" .

DEPENDENCIES)

Hien chung ta dang co hai du an trong Solution, ban eo thjj: thay nhung file rna du an phu thuoc bling each nhap chuot phai tren dl! an va chon Project Dependencies tit menu ngil canh. Menu nay cho phep ban quyet dinh nhung dt,t an nao cAn phai duqc bien dich trudc, HQP thoai xac dinn tinh phu thuQc ducc h ien thi nhu trong htnh 1.5·8. HQp thoai hi~n thi dV an AnOtherApp phu thuoc vao du an AnApplication va nhtrng dir an nay se dl1qc bien dich theo tha tv duqe hien thi.

1_1Ill~1II,.,"':¥IIl,:'.:II!:~;lji.iLs'· ••• ··'~ •• 'i;I,~'&ijllik,!II'iIIIII"I: .• J.[l<\'.l!l

~lMoI····.~ ....

1""""';",, -"".

5. CLASS VIEW

Hinh 1.5·8 - Chi dinh. phI!- thuge trong d1f an

:£j Class View !

. '. .. .. Neu da quen thuoc vdi Visual C++ 6.0, th) iit hAn ban se ci

tha'y quen thuQc vrii tab Class View. Class View 18. nci quan sat cac lop cua dif l n6 ctlng cho phep xem nhung du an phan loai theo lop (class), thanh vi (member), va ham (function). Nhap chu9t tren m9t muc se dua ban vao moi true soan thao, Nhap chuot phai tren mOt lap se dU'a ra mQt trmh dan ngu canh 1 g6m nhung muc danh eho viec them vao phirong thac (methods), thuoc ti (properties), truang (fields), va cac chi muc (index). Nhirng ldp nay cung thg h

C;:1lI1dNG 1-5: Giai thieu Visual Studio .NET

91~

lop CCf sa rna chung ke' thua cung voi cac giao tiep (interfaces). Hlnh 1.5-9 hj~n thi nqi dung cua khung Class View chu Solution cua chung tao

£:lass V,ew - AnAppllcatlQn· . ~

~$ -! b

i;J'~ am.tmmiffltf

(-'oj {) AnApplication I.:';] ""r: Form 1

FfJ ,~ 8.oses and Interfaces ~ Dispo.e(bool)

c. FormlO

il!r. InitializeComponentO 1l!r. MainO

&J. components [",i tfilI AnOtherApp

.:"1, •• Glob,,1 Functions and V"n-~bles •• wmain(voidl

• _Glob"I~Attribute

Hlnh 1.5-9 Khung Class View.

6. RESOURCE VIEW

~".~.

.01 !

Il!jI Resource View .' 0

Tab dieu khien chua Class View va Solution Explorer cung co

thg dung M chua khung ctta s6 Resource Review. Khi dang tao ra mQt ung dung Windows Forms, ban se khong nhin thay tab nay, nhung ban co th1l yeu du hi1ln thi no met each thu cong b~ng each chon View I Resource View tU menu chmh hoac nhan phim tAt Ctrl+ShifhE. Khung cira s6 nay se cho phep soan thao nhU'ng t~p tin tai nguyen theo ki€u cu rna ban dB. tung biet tli c++ va MFC. CM Y r~ng Visual Studio .NET se cho phep ban tao va soan thao nhttng irng' dung MFC va ATL ben canh nhung dir an theo kien true .NET maio

7. MACRO EXPLORER

42 Macro Explorer C' h'o " •• • d • .• ha . '"

o t e rna rong VUilC s1.1 ung macro trong cong viec p at tnen

hang ngay cua ban. Visual Studio .NET co mot kieu d6i tuong thong minh, d6i tuqng nay cho phep ban viet kich ban (scripting) v~ rnoi chirc nang rna ban co th€ tuang tuong, Macro Explorer la noi rna ban se tim thay t1t ca nhtrng macro ke't hop vdi phien ban VS.NET cua chinh ban.

8. TRINH GUlP DiJ(HELP)

H~ thong Help h6 tro ban ra:"t nhieu thii no bao g6m nQi dung trq giup, chi muc, tim ki/fmo Hmh 1.5-10 IA mQt M th6ng trq giup Help dliy duo

~92

$ ~ Introdudl11;l Visual Studio. NET

; ¢I . ~ GettinQ ASsistanc.e

!±l. ~ Samples and Walkthroughs

[H ~ Developing with Visual Stud,o.NET if I ~ Visual Basic end Visual c#

if.; ~ Visuai c++

[f; ~ JScript

[H ~ .NET Framework Ef.j~ SDKs and Tools

I+] ~ The MSDN Library

Hinh 1.5-10 - Khung etta sf I Help

Tab Index cho phep ban danh vao mot nh6m tlt dan gian va chi rnuc di\ tim kiern nh6m tlt gAn giong nhat ngay tUc khac, Nhan Search cho phep ban thuc hien nhung cau truy van phuc tap, Nhung muc tai lieu co th~ duoc tim kifi'm bang' each su dung biifu thuc tim kiern, vi du, "Thread and blocking" se tim kiern tat ca nhung tai lieu chua nhung W "Thread and blocking" hoac "Thread" va "Blocking".

PIIAN C : HOP CONG CU (TOOLBOX) vA SERVER EXPLORER

. .

8_L Toobox

H9P cong' C\I (toolbox) chua nhieu phAn, phdn chinh Iii component toolbox.

Hmh 1.5-11 hi~n thi Toolbox trong trang thai mil' rQng. Giao dian cua Toolbox tuung tI! nhu Outlook Bar cda Microsoft Outlook nhung kha co dong. d day, ban co thl'f nhtn thay Windows Forms dang bi chinh sila. Cac thanh phAn giao dien co th~ duoc keo tlt Toolbox dua vao form.

Hinh 1.5-11 HQp cong CIf.

()X c6 c6

,C;auCSNG 1·5: Giai thisu Visual Studio .NET

931l1eJ

tJ

9. SERVER EXPLORER

Lam ban vdi Toolbox trong thanh cnngcu nay Iii Server Explorer. Day la milt tinh nang moi trong VS.NET cho phep l~p trmh va truy xuat nhanh co sO' da 'l'f~~ cua cac may chu (server), nhung hang dci thong diep, nhirng dich vu M thong,

(~Arihiirig su kien h~ th6ng deu dinrc ghi lai trong Server Explorer. .

'. Server Explorer hi8n thj tap hop cac nut theo cau true cay cho tat ca. nhung may ~hU rna n6 dLfgc Mt n6i Mi. Ban c6 tM chon nhtrng loai nut khac nhau va keo chUng Ien Windows Forms nci rna VS.NET tao mot tap hop nhtrng bo di~u ph6i dtr li~u (adapter) hQ ban, Cac bo dieu ph6i adapter nay cho phep chuong trrnh cua ban truy xmft nut dG' lieu duoc chon, Hinh 1.5-12 la giao dien cua Server Explorer

rx.

mioi~~

r :f#il,aig;glii:iil ~ ~~-1

IEl !~'5erv"rs

8 ill duongle

I l"} • Crystal Services

1 1.± .:. Crystal Enterpl'"Ise

j B g Server Files,

~ r~ W =eeture Examples

f±J W General Business I'

I i=i I5J Event LOg.

",I '-.+1 I.l.!J Application

,. . i:tj· [ill DNS Server

. l ~- (!g Security

. i ",' ',' if) . ffil System

X M",ssal)e Queues

'EiJ· !2'.1 Performance Counters :::::1 "Services:

c~ .NET Framework Support 5 '.~ Ale~ter

i :i!i. App[it~tion Management

'I, .~ ASP.NET State .~ ClipBook

• \,\1(, ~iiF" \i*!t,C2~"'rp.~~'iv:~~m~_~,_-,:·-,

, I

1\ \

m ~n ch ~a

Hinh1.5-12 - Gu-a SO Server Explorer

. Ban co thG keo mot co so dG' lieu Access tlJ goc Data Connections len tran

l'mQt form, form nay tao mot OleDBConnection toi cO sci' du lieu. Mil' roug nut co sa ! dcr li~u' trqng' Berver Explorer cho phep ban keo cac bang da .lieu (tables), cac thu ~\t~c\store'd procedure, va khung rihln da l ieu (view) di);t len form, d&ng thai M 'tho~g' ~iing se t~o ra eac b(> di~u phoi da lieu tuong' ung chinh xac cho chung.

Ban cung c6 thE! them mot nut server vao cira s6 Server Explorer bang each sa dung Tools I Connection to Server menu, cuathanh cong C1,l chinh. Sau khi thirc hien klit noi vao server, ban c6 th8 truy xuat nhirng dG' lieu rna server cung cap (n~ay trong' Server Explorer

~94

PHANI: Md Mu

PaAN D : TAc VI) (TASKS), KET XUAT THONG TIN (OUTPUT), TIM KIEM KET QuA, vA WATCH.

N gay ben duai rnoi trirong' phat trign ban c6 tM tim thiiy m.;.t tab caa s5 vo: nhi~u khung dung trinh bay cac tac vu (Task), va ke't xuiit (Output) tU tie'n trlnh bier dich, theo ve't thong tin go 16i (debug), cac ke't qua tim kiem ... (Hinh 1.5-13)

I!? Ii 1 ~ I • !!JII_A#~lll r'~'~::~:i::i::s:~~~~~"~: _ P-~Oj~:;t~~~PP1~~~tio~;"'co~fiqur~ti-~;'4

Updating references... --,

Per form.in~ m.a.in compilation. . . i

I: ; : \ t emp\ cj\ anapp li:; ~~~~~.~~:~~~~~~~.~o:_~~:~:~~~~

2J T "sk List. liB Output I i//P Find Symbol Result, [

Hinh 1.5-13 Khung cila so Task, Output, va kit qua tim kiem.

9.1. Tasks

Cac lap trinh him viec vdi Visual C++ truce day se sa dung nhung loi cl thich fiTODO dEl cai dlj.t them rna tuy bie'n cua minh. Cac chu thich (comment) ru xuat hien trong qua trmh Wizard phat sinh rna. Ban chi d.n tim nhung noi dal diu TODO vdi trmh tim kiem tap tin va ban c6 thEl nhm thiiy rna chuang tril d~y du nbu the' nao,

Visual Studio .NET se tl,i dong hoa cac tac vu (task) theo vet tien trio (process) giup ban. Bat eu khi nao ban nhap vao loi chu thieh ItrODO trong I chuang trinh cua ban, IDE se dua mot hie vu vao danh sikh tac vu. Nhap d6i cru tre n tac vu task rna ban muon, ban se diroc d§.n den lbi chu thich trong rna chuo trlnh. Ban co thi\ gan them cac the nhu TODO, HACK, UNDONE vao trong nhu the tuy bien cua ban, nhung the nay cling duoc hien thi trong task list.

Hlnh 1.5-14 hii\n thi danh sach Task List trong m6i quan M voi m';'t TOI Task trong ma chuang trmh.

DEl them the vao trong ehinh danh sach Task List cua ban, cl Tools I Options tU menu chinh, va sau do chon Evironment, Task List ttl danh So cay ella nhung cai dij.t tuy chon trong khung ben trai h/?p thoai, Mlj.c djnh, nhi tac vu dircc dau trong cira s5 Task. De nhin thAy tat ca cac tac vu, ban nhap ch phai tren khung Task, chon Show Tasks, va chon All.

10. eVA s6 KET XUAT THONG TIN (OUTPUT)

Chon tab Output se hi8n thi cho ban nlt nhieu thong tin. Nhimg thong I bien dich (bao g6m nhO"ng khuyen cao va thong bao loi) se duge hieri thi tai • Nhirng thong diep tU qua trinh theo 've't giJ 16i cung dligc hit1n thi.

s h h

,h

h

~p J'

ty, l)'"

cH1fdN~ 1-5: Giai thi~u Visual Studio .NET

11,

'.'

1000; Add ~Y(Qr1~uct~ ~~ -~ter 'ini'ti~'c~F':\re 1000: Add «lY I:msUuc:tor code- attel" rr.:1-*eCoo- 11:\Te

,. ~") 11 1000: Add.!ln-,. oOOftStruct'Ol' cGde after lntiaIi..,;;: F:\Tel\lP\C

c~fl~:L<I'

Hinh 1.5-14 Danh sacli tac UIf. (Task List),

, B{I,n co the' dira nhung thOng di~p cua rieng mlnh vao cua so nay (cu thg Itt khi go 16i chuang trmh) bAng each sit dung d6'i tuqng System.Diagnostics.Trace. Vi dl,1 nhu khi xu 1y mi)t str kien cua bi) dinh gia (timer) trong chuang trtnh C#, rna chuO'ng trinh duqc hign thj trong vi du 1.5-1

Vi Ih! 1.5·1 : SU' durig d6i tu'qn TRACE dtf ki{t xuat, thon tin.

pri vate void OnTick (

obj ect sender I System. EventArgs e)

System. Diagnostics _ Trace. Write (liThe timer

ran !1\n","Timer");

Doan rna nay sinh ra k~t qua nhu hmh 1.5-15.

Nhu ban co tM nhin thay, thong diep "The timer ran II n duqc hi~n thi lap l~i m{lt s61iln do ket qua cua chuang trmh dang chay.

Output '

an

• AnAppliC9.~ion. IIrJCIIi': Loaded • e : \'I:I'inn't. \*,5 5""mbly\ '1s-c\ systRlrL uindows. tor:t:ls\ 1.0.2411.

,',' . JuJApp.!icatl-on. ex.': L06.dlid "c: \uinnt\"u·"~ly\qa.c, synna\!. O. Zol!l. O_b'17aScSi&l~~_:; . AnAppl1 c:.t:. a.on . ex.' ~ Lo*d*d . c : \ wi.nnt'.I1I.mhly'. 'lac\ s:yst.ra_ d.ra.ving\..l. 0, 2:411. O_bO~·

n j' ThA:. proqrDl. • tl$'41 AnAppU.caei-on.oI"x'I1' ha. •• xi"t.oid 'W'i:eh "".,d-ilt 0 I OxO) .

Hinh 1.5-15 - Hoat df)ng thea tilt trong ella s6 Output.

95l!J

~96

11. TIM KIEM cAc Kt HI~U D~C TRUNG

Nhan Alt+F12 ho~c chon Edit I Find and Replace I Find Symbol se hi€n th h(lp hi)i thoai Find Symbol. Vci h(lp hQi thoai nay ban co tM tim kiern ky hie (symbol) trong chtnh nhrrng t~p tin U'ng dung cua dl,l' an, cac tham chie (references), ho~c nhung component rna chuang trinh su dung. Ke't qua duoc hi€1 thj trong Ii Find Symbol Results. Nhap chui)t phai trEm m{\t muc (entry) trong 0 d se cho phep ban di Wi noidinh nghia tiling. khu vue-soan thao hoac xem luat qu nlurng noi di nh nghta cac tham chie'u cho ky hieu d6. Chon Browse Definition s hien thi 0 Object Browser trong cua so ehinh noi rna ban co th€ nhln thay toan b cay ke' thira doi tuqng cho doi tuqng duqe chon va nhung doi tuong khac tron ehinh nh6m d6.

Hinh 1.5-16 hi€n th] nhtmg bircc d.n lam de tim mot ky hieu (symbol) tron VS.NET.

"".,AnApplicat.on-Mt(ro'!ioftYls.ual(#.NETlde§f9ll1~formJ.ts+ :1. "t;~;;p(' It~p1,~!,:.

fmd'S,;mb(l1 ' Ii." =1

;j{ii~;:;::, .J!;!J~ ~i.;iS:-:.: ~

".--:\

Hmh 1-5·16 - SII dlf.ng ht)p thoai Find Symbol.

Giao diijn cua Object Browser hoi khac so voi Browser Info trong VS 6.0. ( su dung Browser Information trong phien ban truce, du an can phai diroc bie dich mot each ro rang. Object Browser trong VS.NET luon luon sang sang, ngay ( trUGe khi ban bien dich dl,l' an. N6 cung huu dung cho nhung tac V1,I phat tri~ hang' ngay cua ban. Browser g6m 3 khung - khung Object ben trai, khur Members ben phai, va khung Description iJ ben dudi. Han ntra, thanh cong (

ien ca i~n mg, c~

cau'dNG 1-5: Gi~i thieu Visual Studio .NET

.u

(toolbar) i'r tren chophep ban chon nhtrng tuy chon (options) khac, Sa d\mg Object Browser, ban c6 th~ tim hi~u khong gian ten, lop, ki~u. cac giao tiil'P. ki&u enum, va cac cau true struture. Ban c6 th& tuy y sAp xep cac d6i ttlQ'ng trongkhung Browser bAng each sa dung thanh congo cu cua Object Browser d~ sAp xep thanh vien thea t~u tl,f abc, theo ki&u dcr lil.\u, theo dlli ttlc;tng truy xult (object ', access), ho4c nhom theo ki&u d6i tuqng. Hinh 1.5-17 hi&n thi ket qua tim kiem phuong thue InitializeComponent va ke't qua trarig thai eua Object Browser.

AnAppication , {} AnApp!;cation

~.~f'liiIIlIf E II AnOtheIApp .

'. Global Functions and Vl!flablas ffi "';.;:I mscortib

ffi -0 system.data 1:&.cJ s)lSlem .

r,ij +C.l Sl"'tem, dr .... ir19

it +C.l ')ISIem, .....::low,io,ms It, . ..;.) system, xml

Hinb 1.5-17 - Object Browser.

12. CHi MVC vA KET QuA TiM KIEM

Cil hai khung nay hi~n thi kat qua cua vil.\c tim kiam theo nl)i dung, ho~c bO'i yeu c~u mQt chI muc dan gUin, hoac thong qua sl,f tim hem kha phuc tap. Nhap chu¢t tren nut Search Result se duaban den muc trq giup.

13. CUA 86 GlJ Llh (DEBUG)

" , Ban co th~ thly ml)t s6 khung ctta s6 khac, Chung 11\ eac kbung Breakpoint X.' CW, ;;a dong l~nh tr1,tc tiep (immediate command window). ChUng toi se giai Allich nhirng khung ,ci'(a s6 nay trong pMn "Cd loi chuong trlnh".

~98

PHAN I: Md'dliu

PHANE : CVA s6 THUQC TiNHt DYNAMIC HELP, vA FAVORITES

B§.y gi<r chUngta hay tim hi~u nhi1ng clia a6 thucng' xuyen ali dung nhat trongmoi triJcJngsm;m thao IDE.

13.1. Property Browser

.Hau Mt cac thanh phan cua .NET dliqc cau hinh, di~u khien, va xem xet thong' qua cac thuoc tinh M thong. Cac d6i tuqng ben trong .NET co kha nang hi8'n thj nhi1ng d6i s6 cua chung thOng qua nhi1ng dac tinh rieng, nhi1ng di).c tfnh nay duoc gAn vao nhi1ng thui)c tinh cua chung, Neu ban quen thuoc vai Visual Basic, thi thuoc tinh luai {property grid) se him cho ban cam thay de chiu, Neu ban la nguoi l~p trmh c++ ky cJ!U, thi phan h~ thong thuoc tinh (property system) co tM t6n mi)t It thi'Ji gian dI!' lam quen vci n6. Hinh 1.5-18 hi€n thj khung ci'ia s6 Properties dllqc dung M chinh sua cac thanh phdn dieu khien cua Window Forms.

Dropdown Iist of

Hinh 1.5-18 Property Browser.

Khung Property Browser hi~n thi mQt a hroi gam tem va gia tri cua nhi1n~ muc c6 th8' nh6m ll;li tuy y thanh nhi1ng phan IOI;li. MQt s6 muc c6 them thuec tinb con. Nhi1ng thu~ tinh nay c6 tM duc;rc hi8'n thi nhieu th6ng tin han bang each

u

(:HudNG 1-5: Gi6i thieu Visual Studio .NET

99[IJ

nhan vao billu tuqng dau + ben trai. Tuong tl,l, toan b9 nhung phan loai Qeategories) co thii" rna va thu lai bang each nhan vao billu tilqng + va - thich hcp, MQt each t6ng quat, thuoc tinh h.tdi c6 quan h~ vci nhirng gia tri don gian rieng

it bi~t, vi du, m9t con so hoac mot chu5i gia trio Property Browser con co kha nang I»ie"n d6i eac ki€u thOng tin (vi du mQt gill. tr! mau dang so RGB) thanh phan til giao dien (UI ..:. user interface), chang han nhu nhirng m§.u mau trong hmh 1:5-18 hi~n thi mot thuoc tinh Cursor va gia tri hien hanh duqc chon la Ibeam.

et '( Property Browser khong chi hiii"n thi thong tin & dang than thien ngiloi

19 dilngnia. con hilln th] thea dang gqi nhc, N6 cho phep ban chinh 8tta thea each

ah riling eua mmh NhiYng mau mau hiii"n thi trong hinh 1.5-18 e6 tM duqc d6i Iai sa

tal dung' bi> chon mau (color picker) chuyen dung xu at hien khi ban muon thay d6i gia

ElU trl mAu tl10hg irng, Hmh 1.5-19 hi~n thi Property Browser dang thay d6i mot

rn) trong nhi1ng gia tr! mau,

~

so

is,

]

Hinh 1.5-19 - Thay d6i gui tri miui vai Property Browser.

Con mQt s6 trlnh soan thao chuyen dung danh cho nhi1ng thuoc tinh khac cua d6i tuqng. Vi du thuQc tfnh Anchor va Dock cua cac phdn ttt dj~u khiii"n Windo,ws Form co nhang trlnh soan thaD rat trt!c giac, theo giao di~ d6 hoa,

Thanhcong cl,l cua Property Browser (tren ddu ctta s6 Property Browser) tho phep thay d6i each nhin v~ danh sach thuQc tinh. Vi du ban c6 tM thA'y nhi1ng nut nMl"n sau:

.hang : tinh : each

~100

pHAN I: Mer d~u

IMI Phan loai (Categorized) - NMm cac thuOc tinh thea phfm loai nhu Appearance hoac Behavior.

Iftl Silp xe'p danh sach ten thuQc tinh thea thli tl,l chll cai (Aphabetic) thay vi nhom thea phan loai.

(9'1 SIj ki~n (Events) - Liet ke tat ca cac sll kien cua mot component va cho phep ban tao ra bO xli ly sI,C kien (event handler) cho chung, D~ tao hoac hi~u chinh nOi dung bl) xli Iy cho mi)t sI,C kien CI,I th~, ban nhap chuQt tren ten sI,C kien trong danh sach. IDE se cho phep ban danh vao ten cua bQ xli It ho/!.c chon bO xli It dd Mn tai tit mi)t danh sach tha xu6ng. Sau khi da tao xong bi) xii ly; ban co th~ nhap doi chuc)t ken no d~ di tdi rna chuong trtnh. Neu ban mu6n tao bi) xii Iy vai m<)t ten du'1c chon truac, dan gian nhap doi chuQt tren ten sv ki$n (event), IDE se tV tao mQt bi) xii ly tinmg aug cho sl,! kien,

f~cJ ThOng di~p (Messages) - Nut nhan nay se xudt hi~n tren thanh cong cu khi khung clia s6 Class View dang hi~n thi aug dung Windows c++. Ban co thil' xern, chinh sua, vA them vao nhiffig bi? xli lythOng di¢p eho cac lap c++ thong qua Property Browser. Cach thtrc cua viec them nhimg bi? xu Iy thong di~p vao cac lap C++ tuong W nhu phan them va hi~u chlnh cac bQ xu It 5I,C ki~n dd d~ c~p trudc day.

1_:1 Dinh nghta chdng (Overrides) - Khi Class View dang hi€n thi cac lap C++, ban co thg soan thao, them vao, va xem cac thanh phdn dinh nghla chong (g6m phinrng thuc, thuQc ttnh) cho mi)t lap duqc chon trong Class View bang each nhap chuQt vao nut nhlln riay tren thanh c6ng c\I eua Property Browser.

[I] Trang 'th~Qc tinh (Property pages) - Khi ban su dung Solution Explorer M xem dV an (project) hoac nhung' cdu hinh cua Solution, thanh cong CI,I cua Property Browser se hi~nthi nut nhan nay. SU dung n6 M hi~n thi hQp hQi thoai vci nhi1ng thuQc tinh sin sang cho cau hmn ban cAn.

nm) Thuoc tinh (Properties) - Neu ban d§ si'i dung Property Browser M hi~n thi nhirng sI,C ki~n hoac thong tin khac, tht ban c6 tM chuy~n nguqc lai Wi each xem thu(Jc tinh binh th!lang bl1ng nut nhan nay.

14. TRiNH TR(1 GUlP DQNG (DYNAMIC HELP)

H~ trQ' giup dong <Dynamic Help) mdi trong Visual Studio .NET tao ra 8~ khac bi~t IOn. d6i vdi ngttai l~p trinh. Bay gia ban khong can tim kie'm co sa da lieu tro pup khi dang l~p trinh, Mi vi Dynamic Help luen luen gill mOt danh sach thOng tin duQ'c c~p nhat lien quan tai nhilng hanh dQng rna ban dang thao taco Th~m chi n6 con giU thong tin v~ nhtrng ci'ia 86 rna ban dang su dung trong IDE.

,QBudN'G 1"5: Gidi thi~u Visual Studio .NET

101~

Vig ... , n~u ,b~n chon tab Dynamic Help trong phan E va sau do chon Class View, JIlQtnl1,lc .trqgiup Help v~ viec Sl! dung Class View se slin sang bat ky luc nao M "A.tham khao .

. iKinh nghiem cho thay Dynamic Help y!!u cau nhieu cong sac xl! 1:5', hai vi ~6timkiB"m va d6i chieu drr lieu hau nhu v6"i moi thao tac bam phim, di chuyl!"n 'tl'1~t' ' ... Ban 66 tM tuy chon tAt Dynamic Help.

~15.ei1A s6 FAVORITE

h DAy la noi chua danh sach cac dia chi Internet ua thich (gQi la Favorite)

~i ~b~1l:N6 cho phep ban chon mQt lien k€t thuiYngslt dung nhAt va nQi dung ciia

~i tt8l'lg,tai Mu do lien k€t tro den se hien thi trongeira s6 soan thao chinh tll<1ng tI!

.n nhu cU'a s6 trlnh duyii\t Internet Explorer.

LO

hi

n,

aa ~p :k

+,

m fp

d~ ·ty ng

s(! diJ lob ' ;ac! )E ..

16. CHUdNG TRINH GO UlI (DEBUGGING).

Ngay ca nguni l~p trinh tuyet viYi cung c6 th~ tao ra llii, vi v~y c6 mQt chuong trmh get Wi tOt la di~u rf(t sac quan trong, Vi~c get lili v6i Visual Studio dliqc thuc hien kha d~ dang, va ban co kha nhieu tuy chon cho vi~c ngirng chuang trinh va xem xet rna chuang trtnh, each dan gian nha't M get IOi (debug) rna chuongtrlnh Ia khi bAt dau qua trinh bien dich. Chuang trmh get 16i ciing co thE\" My mQtdi~u ki~n 1M, hoac b~n c6 th~ gAn chuang trinh gfJ I6i (debugger) vao ngay ti€n trmh dang chay, Chung ta hay xern xet truong hop dan gian dau WIn .

.Elii' gfJ 1M, chuang trinh cAn phai dttqc dich a chif d<) debug . .Elii' chon kil!"u debug, ban sl! dung Debug I Configuration Manager tit menu chinh.Htnh 1.5-21 Iii cU'a s6 Configuration Manager

Release <New".> <Edit ... >

Hinb 1.5-21 - Hr)p thoai Configuration Manager.

1mJ 102

PnAN I: Md' dtiu

Sau khi cdu htnh debug duoc chon, bLiac ke' ti~p la chi ra nrri ban mucin chuang trinh ngirng (stop) d~ ki~m soat, Di~u nay duqc thue hi~n bAng each d~t di~m dUng (breakpoint) ngay trong rna ngudn. Ban cling c6 th~ lam di~u nay bang each chon dong ma nrri rna ban mucin ngiing va nhan F9. M(it dau do se xudt hien i'J mep ella trinh soan thao ma (code editor), luc d6 breakpoint dang {j trang thai kich hoat (active). Ban cung c6 th~ d~t breakpoint bang ca~h nhap chuot vao mep xam ben trai clia 56 soan thao, hoac nhsn Ctrl--B.

Dil kich hoat khung clia 56" Debug, chon Debug I Windows I Breakpoint hoac nhan Ctrls-Alt-B.

Sau khi breakpoint dliqc d~t thanh cong, chuong trtnh c6 th~ chay vdi mong dqi cua vi~c danh trung diii'm dirng (break).· Nhan F5 d~ thirc thi rna chuang trml trong kieu debug.

. -----.-.- -----,---,

,

, ""

lJIEM DUNG BREAKPOINT

,

MOt vcng tron do rong 1A mOt breakpoint khOng kich ho:;tt.j Breakpoint c6 t.he dliqc kich hoat (active) hoac i'J dang khong' kich hoaf (deactive). Chon Debug I Windows I Breakpoints hoac nhan Ctrl+Alt+B. MQtl ,di1lm dung break.point vdi met dau hoi ben trong Ch.O biet n6· c6 tM khlin~ ic6 hifi;u luc, bai vi ti~n trlnh rna n6 hcp tac chua chay. Vi du, di~u nay xif ~a khi ban d~t breakpoint trong ling dung A va sau d6 chay irng' dung B t' i cung Solution. Ngay khi tien trinh chua breakpoint diroc tai vao, dii'!m dUn~ breakpoint se chuylln sang trang thai kich heat. I

Breakpoint vrii mOt ddu cham than khong thil dat, bci vi co mot loi.i !C6 Ie vi tri breakpoint thi khong hop I~ hoac breakpoint c6 tM bi tily thuQq ~ao mQt di~u kien rna c6 tM khiing bao gia thoa man. !

,

!

I M(it breakpoint vdi m(\t cham trong n6 thi dliqc d:;!.t trong trangj

IAsp, va diem dirng (break) dliqc anh x!,\ tai trang HTML tuong ling duq~ ~h8.t sinh bai ASP.

!

c ~~ • _

17. cAl DAT BREAKPOINT NANG CAO.

Thinh thoang ban c§.n nhi~u han m.;.t noi M ngirng va kiem tra rna ngudn De tao ra met breakpoint mdi, chon dong rna va nhan F9 hoac Ctr'l-i-B, F9 se t dQng di~n VaG ham va dong rna (line of code) noi rna ban muon ngung, Ctrl-i-B s yeu ci1u ban di~n thong tin bang tay. Khi ban sli dung Ctrl-i-B, ban se nhm tM hop hQi thoaiNew Breakpoint, nhu dliqc hig-n thj trong hinh 1.5-22.

,i!

I):

Hmh 1.5-22 - Hop h(ji thoai New Breakpoint.

C6 2nut nhan tren hQp hQi thoai nay la Condition va Hit Count. D~ chinh 'sua breakpoint dii dw;tc d~t, tim breakpoint trong 0 Breakpoints vii. nhap chuet 1J1i~i tr~n nd. Hanh dQng nay M ban chon nhtrng Properties tU menu ngil canh, Itti~t Mp chinh slta Breakpoint xuat hien, hi)p nay cung se c6 nhii"ng tuy chon :tucrng tlJ .

. On. , tl! : se ~a'y

17.1. Conditional Breakpoints

, .. .

Chon tuy chon nay cho phep ban quyet dinh khi nao ban muon chuang

trtnh treo (halt). Vi du, ban muon co mot chuang trinh dltqc ngirng khi mQt bien ~t t4hnQt gia tr] CI,I tM neu n6 du'gc thay d5i liin cuoi thOng qua breakpoint.

/il"

rI·"

11:104

PuAN I: MiI'd

1'7.2. Hit Counts.

Tily chon nay cho phep breakpoint thl,1C thi binh thuGng cho d€n khi n6 d dllqc ml)t 8{) l'nnao d6. Ban c6 tM d~t n6 bAng Break Always, Break When H COlUlt is' Equal to a Specific Value, Break When the Hit-Count is a Multiple Some Number, hoac Break When the Hit-Count is Greater Than or Equal To Value,

Chung ta c6 th.§' ket hop nhiffig tuy chon (option) nay vdi nhau, vi v~y hi c6 tM n6i ban mu6n chuong trinh gian dean trim dong th(( narn thong q breakpoint, tren di~u kien rna hie'n Ion han hay bling 14.

18. LAM GI KHI MA CHUONG TRINH Bf T~ NGUNG

MOt 56 tuy chon cli quen thu(\c vdi ngliGi l~p trinh khi rna chuang trrnh tam ngltng. BI!-n co th~ xem nhi1ng bien (thinh thOang thong qua nhi1ng dong r chirong trlnh), va tham chi gill nhi1ng l~nh tT1!C tie"p tai cac d6i tuqng trong u dung th6ng qua caa s5 l~nh (command window).

Hinh 1.5-23 hi~n thi bO xi't If dich vu dinh giG bi ngitng tai di~ breakpoint. N6 cling hi~n thi nhi1ng bie'n cycbO (local variables) cho phep du chinh 500 hoac xem nQi dung ngan xe"p (call stack) cua illlg dung t~i di~m do.

MQt tinh nang quen thuoc vai nhi1ng ngtlcri l~p trlnh Visual Basic, nhung Ie khong quen thuoc cho nhtrng nginri lap trinh C++, la cira s6 dong I¢I (command window). Tab nay (duqc dinh vi a day g6c phai a day man hinh) c phep ban viet nhil'ng I~nh trlfc tiep tac dQng len cac Mi tllqng bi treo trong tru get lOi (debugger). Trong trucrng hop mil. chuang trinh cua hO dinh gia ban c6 the this.timer1.Enabled = false <enter> va bO dinh gic'1 se hi v6 hieu hoa. Vi';'c sli du ci'ta sIS dong l~nh, ban c6 tM d~ dang thay d6i nQi dung hoac cau hinh nhimg c tuqng trong mil. chuang trrnh M thi't nhil'ng kich ban giup ban dii dang sira nhir lOi hien c6 trong chuang trmh,

19. GAN TRINH G(} LC)I (DEBUGGER) V Ao MOT TIEN

TRINH (PROCESS) .

Da.y la tinh nAng huu dung ne'u ban dang get 1M m{lt (4p hop nhi1ng (c dung tit cung mOt Solution hoac co Ie dang get 10i mQt DLL BI!-n c6 the chay (c dung, chay trlnh go 16i, va chon M sua chaa ben trong chuang trinh bang' ca

CHUaNG 1·5: Girii thieu Visual Studio .NET

105111

ngf.cng n6 lai. Ban se ducc hoiIoai ung dung rna ban muon go 18i. Nhi1ng chon IVa thOng thui'1ng la CLR-base App, Microsoft T-SQL, Native code program, Possibly C++, hoac script. Vi~c gAn toi mQt tiiln trinh khac cling c6 th€ dl1gc lam tren may tit xa (remote machine) neu ban dugc phep truy xuat n6.

thi!l.textBoxLLocSI'tion· nev Sy.stl!JD.Draving tllil.to!>ttBOlIloN«iIe • ~~ext.Box·l·)

thi~. t.ext.BoxI , Site :II neu Sy:stem. Drawing. 51 this. textBox 1. T<lbln~K • 0; thl.!1.te:KtBox1.Text = "textSoxl";

! ;

Hinh 1.5-23 - Ma. chuang trtnh. ngilng tai diim breakpoint.

20. JIT DEBUGGING

Just in time (JIT) debugging xiiy ra khi m<)t dean ma chuang trlnh (code) d\fgc quang ra ngoai 1~ (exception) khong xU- Iy va khong dircc gan vdi trmh giJ lbi (debugger). Ban c6 mQt vai tuy chon cho viec go 161 khi di{,u nay xily ra, Ban se duqc hien di~n vdi mot hop h<)i thoai rna cho phep ban chon trinh ga 16i nao ban mu6n dung. Chu y rAng du la ban khong c6 cai Visual Studio, ban vh se c6 nhi1ng tily chon get 16i. Neu ban co cai Visual Studio, thi each t6t nhat la ban chon Visual Studio him trmh go li'ii cho ban, bai vi nhi1ng tinh nang cua VB.NET nang cao hon nhi1ng chen Iva khac. Hinh 1.5-24 hiE!n thi hQp hOi thoai JIT debug sau khi mQt ngoai l~ phat sinh.

c':I day, ban nhin thiy nlurng tuy chon duqc dung cho trinh ga loi dang chay (day la trtnh go 18i dang duoc dung M sira chua ung dung AnApplication dl.lQ"c si't dung trong chuang nay), M si't dung trmh gCJ 16i CLR, hoac mQt tM hien mdi cua Visual Studio .NET. Chon trlnh gCJ 13i va nhap ehuQt tren nut nhan Yes se chay trinh se loi diroc chon, trrnh go I3i nay se dung lai tai diii"m rna 18i bi bay. Neu chuang trmh dl.lqc bien dich vdi cau hinh gCJ 13i (debug configuration) gay ra ngoai

lIE 106

l~ (exception), ban nen xern rna chunng trinh va di tUng buoc qua rna M tim 15i NB'u ffilg dung blli>i dugc bien dich vdi che d<) U'ng dung hoan chinh (release), JI1 c6 th~ kMng hUll dung Mm hal VI c6 Ie ban S9 duqc hien dien voi rna may X84 (assembly code) M gCl 16i.

Riuh 1.5-24 - Ht)p ht)i thoai Just - In - Time Debugging.

21. KET CHudNG.

Vi~c giai thieu nhanh vb Visual Stuido .NET nay se cho phep ban kMI phil. IDE va sil dung Hit ca nhung tinh nang chu yi'.u. Chuang nay chung ta chi gil thieu Mng· quan v~ .NET. Phan 2 cua cuon sach nay chung ta sil bAt dau hoc , ngon ngtr C#.

Ph6n II NGONNGUC#

Trong phiin nay:

• Cac vin d~ ca ban ciia C#

• C# Nang cao

ChlltYng 2.1

.il/ ',""';

cAc VAN DE co BAN CllA C#

I"

'i:ac vern d€ chinh, se dUdc d€ c4p den .,. Hr' thong kifu trang C#

./ Cdc kluii ni~m lljp trinh.

./ Mdng (Array)

./ C6u true (Struct)

./ Lap (Class)

./ Giao dien (Interface)

./ Md kink chuyin giao (Delegate)

C# mo ta mot ngon ngi1 hien dai huang deli tugng. No diroc thiet ke d~ chu y den vi~c dilin dat c++ theo kio~u I?p trlnh va phat tri€n nhanh U"ng dung RAD (Rapid Application Development) chang han nhu Microsoft Visual Basic, Delphi, c++ Builder. C# duoc xay dung va kien true bdi Anders Hejlsberg, nglio-i da. viet nen trinh bien dich Pascal va dii co rilt nhieu dong gop cho ngon ng(} Delphi cung nhu Java. Va do do su tien tri&n cua C# ehju anh huang bai cac ngcn ngi1 nhu C++, SmallTalk, Java, va cac ngon ng(} khac.

PM.n nay se khao sat ngon ngi1 C# cung vai ngi1 nghra, va van pharn la cac thanh phdn chinh cua ngon ngi1. Thiet k€ chu dao cua C# cho phep ban vai tu each la nginrl phat tri€n t?P trung vao cac tac vu x§.y dung cac U"ng dung thea nhu c§.u cong vi~e cua ban han lit vao nhi1ng ky thuat Hit leo cua ngon ngu lap trmh.

Di~u quan trong truac tien do la chung ta can tim hiii"u nhirng khai niern va vAn d~ eo ban trude khi di vao chinh ngon ngi1. Trude h€t, rnoi thu trong C# dilu la d5i tugng. KhOng nhu cac ngon ngi1 thU tuc, ngon ngir C# khong quan tam den di1 lieu toan cue hay cac ham toan CI;lC. Tilt cil. da Iieu va phucng thirc duqc chua trong hose III khai bao cau true struet hoac la class. D!ly IS. khai niem chinh trong bat ky ngdn ngu huang deli tircng nao. Tat ca du li~u va cac phuong thirc thao tac tren dO lieu clin phai dugc dong grii nhu rnQt dan vi chtrc nang. Cac don vi chuc nang nay la nhtrng dOi tuqng co tM sii dung lai, chang dQc lap va c6 tM tv hoat dQng.

Ml1-e du muc tieu cua phan nay khong phdi Ia dE! khao sat cac mau thiet, k€ (design pattern) huang dBi tUl,1ng va cong nghe phAn mem, nhung ban cung can hi~u nhi1ng khai niem chinh v~ thiet k€ va cai di).t huang Mi tuqng. C# se cho phep cil. nheng nginri l~p trinh co trlnh dQ cao va cho cil. nhOng nguci mci van ngh~ vie't mot chuang trtnh co tM tin c~y dltqc vdi cong' sac Wi thigu.

~1l0

PHAN II : N gon ngtr C#

1. H~ THONG KIEV TRONG C#

Trong kie'n true .NET, co m(it h~ thong kHlu chung dl1qc sil dung d€ cho phep tat ca cac ngon ngi1 nham vao moi trl10ng .NET thao tac lien ket IAn nhau, C# sii dung hill th6ng kiElu co sa nay. Chung ta da n6i ding moi thu trong C# Iii d6i tuong. l:)i~u nay hdu nhu dung cho d ki~u di1 lieu, Cac kieu di1 lieu don nguyen nhu int, char khOng duoc xem lA d6i timng, If do M bao dam tinh hii;.u qua. Bdi VI cac dOi tl1qng diroc cap phat tren heap vii dl1qc quan If bai GC (bi? don dep rae), di~u nay se dua ra mt)t y nghra quan trorig v~ toan bi? m6i quan h~ cua cac kiilu eo sa chang han nhu int va char cung vdi nhtrng kifi'u d6i tirong moi. Vi Iy do nay, C# cai di').t cac kieu don nguyen (primitive type) a dang struct, dl1qc coi nhu la cac kiilu gta tr] (value type). Trong C#, kieu gia tr] diroc cap phat tren stack (ngan xe'p), thni gian song cua chung bi gioi han trong pharn vi rna chung khai bao,

Bang 2.1-1 trinh bay mat danh sach cac kieu eo s1l:n trong C#

Tru kieu chuoi String ra, tilt cii. cac kieu dl1c;tc trinh bay trong bang 2.1-1 diroc cai di').t nhu mOt cau true struct, Kieu String trong thuc te' dl1c;tc cai di').t nhu mt)t Idp dong dau (sealed). MQt lop sealed 113. mot lap khong cho phep ke" thua va vi the' no h\ MlU cu6i ella mat xich ke' thira.

Bang 2.1-1 Cac kie'u cua C#

su«

M6 td

object

string

sbyte short

lnt Long Byte Ushort

Vint

Ulong Float Double Boo 1

Char

decimal

Lap co so ella tat ca cac doi tirong trong C# Day cac ky tv Cr dang Unicode

Nguyen co dau 8-bit

Nguyen co dau 16-bit

Nguyen co diu 32-bit

Nguyen c6 dau 64-bit

Nguyen khong dau 8-bit

Nguyen khong diiu 16-bit

Nguyen khong da."u 32-bit

Nguyen khong da'u 64-bit

So cham dQng c6 dQ chinh de dan So cham di?ng co do:) chinh xac d6i Kitlu logic - true hay false

Ky tI! Unicode

86 tM,e phan c6 28 chi} so c6 nghta

cHl.1dNG 2-1: Cac v.fnd~ co ban cua C#

111(ml

1.1. Cae ki~u gili trf trong l(lp trinh

Khi mOt ki~u don nguyen (int, char) du(,1c khai bao, C# yeu C!lu bien d6 phai dl1qc khai tao tntoc khi bi6n dl1qcsli dung. Trang C++, gia tri cua mot bie'n khong khai bao la khong xac dinh; trong C# cung ap dung nguyen t~c giorig' nhu vay. 81/ khac bi~t trong C++, bien co the duqc su dung vrri cac ke't qua khOng duqc biet.

Khai baa mot bie'n trong C# co cu phap nhu sau:

Type variable-name [=initializationl

(J day type la kieu bie'n, va variable-name co the' chua che cai, s6', vii da'u gach dl1oi. Tuy nhien, ten bien phai bilt diiu bllng hoac Iii d!u gach ducihoac la chii' cai va khong diroc b!i:t dliu bang so.

Dttoi day 18. cac vi du v~ khai baa bien:

int ~999;

/ / hop l~

int a_dog; / / hr;tp Ie

int 123_go; 1/ kh6ng hop l~

Chit j: C# co cd cdc kj hieu ghi chr.i / / va 1*_*/. Ddu II bie'u tb.i tat cd cdc van ban dung sau no tren dong hien luinli ia ghi clui. Dr'iu 1*_* / duoc sit dung cho ghi chu co nhieu. dong.

C# cung tuan thu nghiern ng(\t viec kiem tra kieu vii phsp gan, Trong C++, ban c6 tM khai baa mOt kieu so nguyen kh6ng dau va sau d6 gan vao bien mOt gia tri la -1. Trinh bien dich C# se 14p urc nhan ra phep gan do va tao ra mOt 101 bien dich chi ra phep gan kh6ng hop I~.

unsigned int cpp_fudge = -1 1/ hap l~ trang C++ uint csharp.fudge = -1 / / co 16i trong C#

L6i dl1qc sinh ra hOi trmh bien dich cua C# se cho biE'lt rang' gia tri hang -1 kh6ng tM dl1qc chuyen d6'i thanh ffi(it s6' nguyen khOng dau, £)6 chinh Iii tinh nghiem ng~t!

1.1.1. Struct (cdu true)

Trong cac ngon ngil' chAng han nhu C hay C++, khong thg tao mOt ki~u don nguyen diroc. Cac ki~u don nguyen nhu la cac thuc th,§ rna viec cai d(\t chung trudc day duoc xem la mOt bi mat, C# cai dat cac ki,§u don nguyen khong khac gi cac struct dan gian. Di~u nay muon n6i rang cac I~p trinh vien c6 th~ tao ra cac ki~l' rieng' cua mlnh va xlt 19 chung theo cung mot each nhir cac kieu don nguyen cua C#.

Khi tao mOt struct, di~u quan trong III pMi cai d~t nhii'ng cai tMt can thi€t.

Xet cho cung, n€u chuc nilng them van la can thi€t trong vi~c cai d~t, thl. viec cai d~t mOt thvc tM nhu Iii m(it doi tl1qng day du se tot hon, 8truct thttang dttqc dung

S1l2

PHAN II : N gon ngi1 C#

d~ bi~u dien cac mau da li~u nM ma thucrng c6 thoi gian song hi h!tlt\ che' va thUC1ng khong can thift M gia Iai lau trong bl> nho.

NgUgc lai vdi C++, cac struct va class (lap) IA hai thirc th~ khac nhau hoan toan, Trong C++, dieu khac nhau duy nhat gitra struct vai class IA thanh phan m~c dinh co th~ rhay duqc. Trong C#, cac struct va class duong nhu dung chung cac dieu tinrng tt! a mat ngoai, nhung chung khong eo quan hi;! va th~t su co nhieu khac biet,

M(lt struct trong C# kh6ng th~ ke" thira tu mOt struct khac hay class, tuy nhien mQt struet e6 th.§" cai dat m(lt hay nhieu interface (giao tiep). Cac struct co th.§" chira cac thanh phAn du lieu va cac phuong thuc, Mi,lt struct khong tM c6 mOt phucng th((c khCri dung (constructor) khong c6 d6i so. Tat ca cac struct Mu chua roOt constructor i'ln rna constructor do chiu trach nhiem khdi tao tat ca. cac thanh phan du lieu vdi cac gia tri mac dinh cila chung. Thy nhien, IDQt struct co tM dinh nghia mQt construct nh~n doi 56. M(it construct trong C# thi y nhu mOt constructor trong C++ hay Java. Df nhien , st! khae biet Ian giua struct va class Ia cac struct d6 la cac ki~u gia tr] duoc cap phat tren stack va kh6ng duqc coi Ie tham chieu,

Dudi day lA mot cu phap khai bao struct:

I" i I:

Struct name { [access-modifier] member i

}

Cu phap nay Wong tt! vdi ca C++ Ian Java ve khai bao va cau true. Tinl tM'y dircc cua bien thanh phan member phu thuQc vao tU khoa hay b6 ti private trong C#. Cac thanh phan trong struct co th.§" c6 cac access-modifie (cac M tu truy cap) duoc gAn vao chung nhir: public, private, internal. Vi mQ struct khong th~ cho mOt struct khac ke thua n6, nen tU khoa protected khong 51 dung trong struet; neu diroc sl1 dung, trinh bien dich C# se Ii,ip We chi ra 16i.

Vi du 2.1-1 eho th~y khai bao lflQt struet e6 ten Fraction. Chu y rarig cac truy xuat mot thanh phlln la SI1 dung wan tlt cham, dij\:u nay' e6 th.§" ducc tM.'y dong 13 va 14. Trong C#, t~t ea cac vi~e truy xuat thanh phan d~u thong qua toa tl1 cham bat kg d6 la struct hay la class.

Vi du 2.1-1 Mqt str-uct don gian

l://File : part02_01.cs

2: //Author : Richard L. Weeks

3.: //Purpose: Khai bao mQt cau truc don gian 4:

5: struct Fraction {

6: public int numerator; 7: public int denominator; B: }

9:

.fl

.,

\

cH11dNG 2·1: Cac van d~ co ban cua C#

113i!J

10: public class StructTest {

11: public static void main()

12: Fract ion f;

13: f . numerator = 5;

14: f . denominator = 10;

,15: }

16:, }

Cac kili'u gia tr] ding co mi)t toan tU' gan dU'l!C xay dung ben trong dE! thuc hi~n vi~c sao chep tat ca cac thanh phdn di1 li~u. Trong C++, chrrc nang nay c6 dLtgc bAng each cai dl),t toan tU' gan va vie't cac ma l~nh ean thie't d8 sao chep cac thanh phan di1li~u. Vi dl,l 2,1-2 sU' dung cac toan tU' gan dUqc xay d.,cng ben trong C# dI.\' sao chep gia tri cua mot struct nay vao mi)t struct khac eo cung mOt kili'u,

Vi th,1 2.1-2 Phe p gan struct

l:IIFile : part02_02.cs

2 : II Author : Richard L. Weeks

3: IIPurpose: Khai baa m¢t c~u truc dan gi.in 4:

5: using System; 6:

7: struct Fraction {

8: public int numerator;

9: public Lnt; denominator; 10:

,11: 12:;

13: 14: 15: 16: 17: 18: 19 :, 20: 21: 22: 23: 24: 25: 26: 27:

, 2E1.: ;-,;,2:9:,

30: 31:

public void Print () { Console.WriteLine("{O}/{l}", numerator,denominator);

}

}

public class StructTest { public static void Main () {

Fraction f;

f . numerator = 5;

f.denominator=10; f.Print();

Fraction f2 = f; f2.Print();

II sll~Mi th(hi?n f2 ella struct f2' .nUmera tor ='1 ;

f.Print();

i1J114

pHAN II : Ngon ngi1 C#

32: 33: 34: }

f2 .. Print();

Vi du 2,1-2 md r(lng viec cai dat struct Fraction bi'tng eachthem vao phuong thuc Print c1 dong 11. Phuong thuc Print sit dung phuong thuc Ccnsolc.Writebine M,hH~n th] gia trj hien hanh cua Fraction.

D~ minhhoa toan tu gan ducc cung cAp boi C# eho cac struct, hai th~ hi~n cua Fraction ducc khai bao. Dong 25 khai bao met bie'n f2 va khci tao no vai bi8"n feo ki~\.iF'raction, Khif2.PrintO dugc goi, k€t xuat, 5/10 se duoc hien th] y nhu g{li f.Print().

FBii!u:'quan trong' ban eAri n~'n thliy rA'ng mot sl! sao chep dB. xtiy ra va khong phai Ii mot phep gan tham chieu cua f vao f2. Khi f2 dugc sua d6i tren dong 29, loi goi cac phircng thuc Print ke tiep hien thi hai gia tr] khac nhau. G9i f.PrintO van cho ra k€t ]{uat 5/10, con g{li f2.Print() bay gio ,ke"t xua"t se la 1/10.

1.2. Cae ki~u tham chie'u

M(jt cau true class (lap) 10'1. met VI du v~ kiEi'u tharn chieu trong C#. Cac class (lap) co the dugc xern nhu dan anh doi vai cac struct (cau true) cua C#. Vi~c de"m tham chieu co nghta Ia Mt cu kieu tharn chie"u nao muon t6n tai chi can a do can 11).i mot vai tham chieu con hoat dOng (active reference) dili vrii thuc the. Trong mo hinh COM chuan , vi~c dern tham chieu (reference counting) co the thay duqc d cac phucng thirc AddRef va Release cua mOt doi tuong' COM. Khi tham chieu cu6i cung dugc giai phong tren the hi~n cua d6{ tircng, dbi tuqng thuc hien cac birdc c!in thie't de don dep moi thi.l'

TMt may man, C# da: duoc truu tUc;ing h6a he't tat ca cac chi tie't hoc bua ve viec dem tham chieu (reference counting). GC chiu trach nhii;lm thu don b(j nho dang ducc sli dung hai cac lop va cac giao tie'p interface khong duqc tham chieu (unreferenced). Khi mdt tham chieu cua d6"i tugng Mm de'n so kh6ng, GC se goi phirong thuc Finalize cua dai tUllng, phuc Mi Iai hi? nho, va tra no ve vung heap (tng dung chung. Phuong thue Finalize tuong tl,i vrri cac khai niern destructor trong C++.

M(lt tham chieu co duoc theo theo hai each: khi mot the hii;ln cua mqt ki~u tham chicu duoc tao ra vii khi thuc hien mot phep gan. Nho ding khi toan til gan da: duqc sit dung chung vdi cac kieu gia trj, m(it ban sao cua kieu gia trj da: duqc tao. Dieu nay kh6ng d truong hop khi toan tu gan duqc su dung vdi cac kieu tham chieu. Viec bien (16i cau true (struct) Fraction thanh mOt lap Iii thay d6i hanh vi cua to an tir gan, nhu duqc trinh bay i'J vi du 2.1-3.

Vi du 2.1-3 Cac kieu tham chie"u

1: / /File

2: //Tac gia

:part02_03.CB

: Ric-hard L. Weeks

CHUdNG 2-1: Cac van d~ cIJ ban cua C#

1151MJ

3: IIM1,lc dich : cac kHiu tham chieu 4:

5: using System; 6:

7 :, II Lap ma td mo! kiifu tham chiiu, trong C# 8: class Fraction {

9: public int numerator;

10: public int denominator

11:

12: 13 :

public void Print ( ) {

Console.WriteLine( UrO}/{I}", numerator. denominator);

14: }

15: } 16:

17 :

18: public class ReferenceTest {

19: public static void Main( ) {

20:

21: Fraction £ ~ll.ewFraction( );

22: f . numerator '" 5;

23: £.denominator '" 10,

24: £.Print()i

25:

26: Fraction £2 = £; 11£2 la mot tham chieu den

11£ va khOng la mot ,ban sao! ! I

27: £2.Print( );

28:

29 : / / sUa dt'/i the' hien. (2. Clu: y rdng f cling duoc

/ /thl/c h.ien.

30 : £ 2 . numerator::; 1;

31:

32: f.Print( );

33: f2.Print( );

34: }

35: }

Chi c6 hai thay dili duoc thuc hien a vi du 2.1-2 eM" tao vi du 2.1-3. Thay d6i dau Win lit viec khai bao Fraction a mot lap M thay cho rndt struct. Thay d6i nho nay c6 nghta lit dE! thay cho Fraction dang duoc cap phat & ngan xep (stack), bay gia n6 se duoc tao 11 vung heap va tham chieu dLiqc de'm.

Thay d6i ke tiep lien quan den each thtrc tao mOt thi'i hi()n Fraction. Chu y di.ng dong 21 dB: dLiqc sil'a Mi. f)~' tao m(lt th~ hi()n c6 kii'iu tham chieu, tlt khoa new phai duqc sil' dung, Bay gio; chUng ta phai tao mQt thi'i hien cua lap Fraction d~ khai bao bien f. Tru phi ban dang dung khai bao rieng, bien f se duqc xem nhu m(lt bien khOng diroc kMi tao.

lIU6

PHAN II : N g6n ngG' C#

Nhtrng thay dili d vi du 2.1-2 him anh huang de'n toan bO ngO' nghta cua doan rna d vi d\l 2.1-3. CM Y ding sl! khai baa cua biiin f2 a dong 26 luc nay diroc xem nhu m()t tham chiiiu de'n biiin f. Di~u nay c6 nghia la biiin t'l nhir bie'n f - f2 khOng la m9t ban sao. Day IA nguyen titc phan biet gii1a cac kigu gia tr] va cac kigu tham chieu, Khi f2 d.uqc saa d6i a dong 30, 51! slta d6i gi6ng nhu v~y Ia hign nhien ij bie"n f.

LC1i goi f.PrintO va f2.PrintO se luon dua ra cung mQt ke't xuat, Khi met thay d6i dugc thirc hien {J f2.numerator, dieu d6 cling nhu vi~c thay d6i f. numerator. Trong C++, co tM da dinh nghla mQt toan til gan va dil dieu khign hanh vicira toan tli. Kha nang nay khong tdn tai' {J Ct. T'oan t~ gan khong thg duqc dinh nghia ch6ng hay diroc cai d~t Iai bdi nginri l{ip trmh,

1.3. Bao va khong bao (box va unbox)

Khai niem v~ baa (box) cho phep xl! ly kigu du li(\u nhu la kigu tham chieu, ThC1i gian Wn tai Ia di~u cAn thiet M mot kigu gia .tri dliqc xli Iy nhu mot d6i tuqng, cling nhu vi~c luu tru cac g,ia· tr] vao mot mang hay mQt vai t~p hop khac,

Khi mot kigu gia trl duqc baa (box), met tM hi~n cua dOi tuqng diroc tao tren vung heap va gia tri cua kie'u diroc chep vao doi titqng d6. Khi dieu nay xay ra, d6i tuqng dt1qc baa (boxed object) va ki/lu gia trj la h~i 'thtrc tM khac nhau, Do"i tuqng khong ]a tham chieu de'n kigu gia trl g6c. Bl1t cas\1 thay d6i nao de'n kigu gia tri kh&ng dt1qc phan anh a d6i tliqng va nguoc lai,

Vij)c baa (box) m()t kigu'gia tri co thg duqc thuc hien vdi met phep gan kh6ng tt1ang minh. M/)t phep gan kh6ng tUC1ng minh la mQt phep gan khong yeu cliu mot su ep kigu (type cast), nhu duqc trmh bay sau day:

Lne i = 10; object 0 = i;

Kiilu gia tr] bie'n i bi ep kigu mQt each khOng tuang minh thanh kigu object.

Khi kigu gia tr] i duqc bao (box) thanh d6i urong 0, milt thg hi(\n cua kigu object duqc tao tren vung heap con thong tin v~ ki~u va gia. tr] d ben phai cua bieu thuc duqc chap vao d6i tucng.

Dg khOng bao (unbox) mot d6i tuqng, vi~c chuyen dOi tliflng minh la can thi€t, nhu duqc trinh baysau day:

int 1 = 10';

object 0 = i;

int j = (int) 0; II su chuve« d6i tr1Vng minh til object tluuih. int

Bi€n nguyen (int) j luc nay chua gia trl rna da duqc chua bdi d6i urong o.

Di~u quan t~Qng M bie't ding tat ca cac bi€n i, 0, va j 1a dQc l~p, vdi nhau va kh6ng

don t¥u4n'th~m chi€u Mri eung vung nhd, ' .

cHU'<1NG 2-1: Cac va"n d~ ca ban cua C#

1171!!J

Ne'u ban da quen vdi C++ hoij.cJava, ban se kh6ng c'n t6n cong nhieu dEl h9C v! Ct. Cu phap va nhi1ng Sl! trmh bay. duqc nhan tha"y d ngon ngi1 nay la nit gi5'ngv&inhi1ng di~u duqc tha"y i'I C++ hay Java. SI! tM-tcua va'n d~ Ia vi C# da , ~~~;\~wt,~e.~~n, gian. de hQC va du k¥:,n~~g M ~i~n dat ro 'rang.

2.1. Khong gian ten (namespace)

Trong nhil'ng nam gAn day, sl! thinh hanh cua kh6ng gian ten (namespace) tham gia mOt vai trb trong dai vao cong nghe phan m~m vaphat tri~n thanh phan, KhOng.gian ten (namespace) h6 trccho SI! co ll%p va viee dong gol cac tap (class), cac giao dien, va cac struct co lien quan thanh mQt don vi (unit).

Ki€n true .NET sli dung cac khOng gian ten (namespace) 16ng nhau xua"t phat W khong gian ten (namespace) System. Microsoft ding dii,cung cap cac lap (class), va cac giao dien duqe d~t dudi khong gian ten (namespaee) Microsoft danh cho chtre nang rieng bi~t cua Windows. Khi viec phat tri~n cac thanh phdn cho n~n tang .NET, ban se sli dung ten cong ty cua ban nhu kh6ng gian ten (namespace) & phia ngoai 0" noi rna chua ta"t ell cac lOp (class), cac giao dien, va rna thanh phAn cua ban.

MOt khai bao kh6ng gian ten (namespace) se dang trwc bat ca rna I~nh nao rna ban phat tri~n, mac du di~u do la khong can thiet. Cu phap cho viec khai bao rnQt khOng gian ten (namespace) Ia nhir sau:

namespace some-namespace-name {

/ /cac lOp (class), cac giao di$n, cac //struct,v.v

}

Sli dung cac tlnrc thg ben trong mOt khong gian 'ten (names pace) c6 th~ duqc tlurc hien hal each khac nhau. Cach d~ nhat d~ truy cjj.p cac thuc tM ben trong mQt kh6ng gian ten (namespace) la sii dung chl th] using. Xern xet khong gian ten {names pace) System. cai rna da d\1qc dung trong mOi vi du duqc trinh My cho den nay. DOng d4u tien cua doan rna trong cac vi du truac IA dong

using System;

Chi thi nay chi thi cho trrnh bien dich sli dung khOng gian ten (namespace) System d~ xac dinh ten cua cac ldp duqc dung trong than eua doan rna (code).

SI! Iva chon thu hai Ia sii dung ten dity du cua mt;Jt th"c tM rieng bi~t. Vi du, lop Console t6n tai ben trong khong gian ten System. Thay vi sli dung' chi thi using, n6 co thg dung ten diiy du M thay vao, nhu duqc trlnh My sau dAy:

System. Console • WriteLine ("Fully Qualified

Name Access") :

.~1l8

PHAN II: Ngon ngu C#

ChUng ta hay xern each slt dung khOng gian ten (namespace) trong khi l~p trinh. Doan rna mdu a vi du 2.1-4 thirc hien hai khong gian tiln (namespace). M6i t~n vung chira mQt ldp Money. BUm d6 quan trong M biilt ril.ng hai lap Money khOng ?1 cung phil.1l cua C#, Du 18 lap Money d6ng nha't trang khai baa va cai d~t, C# xet hai lop ro ri;!t duoc phiin bi~t brri kh6ng gian ten (namespace) khac nhau.

Vi du 2.1·4 Khong' gian ten

l:IIFile

2: I INgay vi€it 3: IITac gia 4: IIM\1c dich

:part02_04.cs :12.2B.2000

: Richard L. Weeks

: lam tha:y r6hon vEtlkhOng glan t~n (Namespace)

5: 6:

7: using System; B:

9 :

10:

11: namespace Foo { 12 :

13: public class Money {

14:

15: private double m_Amount;

16:

17: public Money ( ) {

1B: Init(O~O);

19: }

20:

21: public Money ( double Amount ) {

22: Init (Amount);

23: }

24:

25:

26: public void Print ( ) {

27: Console.WriteLine("Foo.Money.Print {O}",

m_Amount) ;

28: }

29:

30:

31: public void Init ( double Amount) {

32 : m_Amount = Amount;

33: }

34: }

35: } 36:

37: narnespace. Bar { 38:

CHUONG 2·1: Cac va'n dii co ban ella C#

119~

39: public class Money {

40:

41: private double m_Amount;

42:

43: public Money ( ) {

44: Init(O.O);

45: }

46:

47: public Money ( double Amount) {

48: Init ( Amount);

49: }

50:

51:

52: public void Print ( ) {

53: Console. WriteLine ("Bar . Money . Print {O}" I

m_Amount );

54: }

55:

56:

57: private void Init ( double Amount) {

58: m_Amount '" Amount;

59: }

60: }

61: } 62:

63:

64: public class NamespaceTest { 65:

66: public static void Main ( ) {

67 :

68 : Foo . Money fm '" new Foo . Money ( 5 . 00 ) ;

69 :. Bar. ;Mqney bm = n~w Bar. Money ( ~ .• 00 ) ;

70:

71:

72: fm.Print ( );

73: bm.Print ( );

74:

75:

76: }

77: }

Doan rna a vi du 2.1-4 khai bao hai kh6ng gian ten (namespace) - Foo va Bar. MQt 16p Money t6n tai ben trong rniii kh6ng gian ten (narnespace). IJ~ sa dung rniii lap Money, phuong thirc Main tao mot th~ hien clla mM lap Money bli.ng each sit dung ten dAy duo MQt diiiu kien duoc hill y la cau l~nh Using, a d6 kh6ng t6n tai mot tit khoa kh6ng sa dung met kh6ng gian ten (namespace). Cho nen, neu ban c6 hai dOi tttgng c6 cung ten thuoc v~kh6ng gian ten (namespace) khac nhau, ch<'ic chan stt dung ten dAy dii thi hay han Iii. chi thi using.

(11120

PIIAN II : N gon ng1l C#

2.2. Cae phat bi~u l~nh (statements)

D~ di~u khi~n trinh tl,i th\i'c hii;\n deli vaj m(lt doan ma chirong trinh, d.n phai c6 mOt hay nhiau khai niem v~ di~u khi~n luu de thuc hien chuong trinh. D6 la nill dung chinh cua phan nay.

2.2.1. Ph6t biGu if

Milt trong nhirng cau I~nh di~u khi~n .co ban nhat la phat bi~u if. Ra't dan gian, phat bi~u if se xac dinh gia tr] cua milt bi~u thtrc luan IY. Ke't qua cua bi~u thac luan ly se cho biet la chuang trinh c6 thl,iC hi~n ml)t dong ma hay ml)t dean mil. hay khOng. Khi ke't qua nhan dl1gc tit bi~u thirc 11\ true, cac phan rna ben trong cua l~nh if se duqc thuc hien. Khi k6't qua cila bi~u thirc di~u kio?n la false, doan rna ben trong l~nh if se khong duqc thl,ic hien,

CU phap eua phat bi~u if nhir sau:

if ( conditional-expression) phat bi~u l~nh don;

hoac:

if (conditional-expression) { m¢t hay nhiE!u cau 111mh

}

Bi~u thac di~u ki~n co tM la ml)t bi~u thac dan gian boljce Iii rnQt bi~u thirc phuc t{tP, nhung di~u quan trong la gia tr] ke'tqua sau cung phai Ia mQt gill tri Boolean. Trong ngon ngi1 C va C'H, bAtca bi~u thac nao c6 gia tri khac O d~u xem nhu Iii true va gia tr] 0 thi dl1qc xem Iii false. C# se thuc hien viec kiii'm soar ki~u nghiem ng~t va yeu du bi~u thirc di~uki~n phai luon la mOt trong hai gia tr] la true hoac false (xem vi du 2.1-5).

Vi lIu 2.1·:; Ph at hi-;u if

1: I/File

2: //Date 3://Author 4://Purpose 5:

6:

7: using System; .8:

9:

10: ",; .' ~

111 . publIc blass Statements { 12 :" '.

13:

14:'publio,static'void Kain( ) { 15:

:part02_07.cs :12.29.2000

: Richard L. Weeks

:C# if statement usage

CHUdNG 2-1: Cac va'n d~ co ban cua C#

121~

16: bool bSimple_1 = true;

17: bool bSimple_2 = false;

18:

19:

20: if ( bSimple_1 )

21-: Console. WriteLine ("You should see this") ;

22:

23: ·if ( bSimple_2 )

24: Console. Wri teLine ("You should not see

this"); 25:

26:
27 :
28: .
29:
30:
31:
32:
33:
34:
35:
36: }
37 : } / / sa dung if vai m9t pluit bieu dan if ( bSimple_1 && ! bSimple_2

Console .• WriteLine(IIWill you see this?");

II Sri dung if um nhieu phtit bieu l~n.h if ( bSimple_l ) {

Console _ WriteLine ("Statement 1"); Console.WriteLine("Statement 2");

}

Vi du 2.1-5 tM hi~n y nghta co ban cua phat bi~u if. Vi~c xac dinh gill. tr] cua' bi~u thirc dligc thire hi~n theo each tinh l1ac Il1gng rut gon (short-circuit). C6 nghta lA bi~u th(te se dl1ge duyet tLc tnii Bang phai, ngay khi bi~u thirc e6 gia tri la falsethi phep tinh dicng lai ngay vai ke't qua ella ca bi.iu thuc la false. Cach tinh nay cung dligc ap dung trong C va C++, nhirng Visual Basic thl khong sli dung each tinh short-circuit nay cho cac toan til'luan Ii nhu And vA Or. Trong VB.NET , hai toan tli Andalso vA OrEIse dligc them vao di1 thg hi(!n each tinh short-circuit nay.

2.2.2. Phat bitu if; .. else

Cau true if...else dan gian chi Iii phan rna rQng cua phat biElu chulin if.

M~nh d~ if chi cho phep thuc hien phan rna ben trong khi bigu thac di~u kien co ke't qua la true, menh d~ else cho phep thuc hien phan rna ben trong khi ke't qua cua bi~u thuc diiiu kien Iii false. Vi du 2.1-6 trinh bay vi~e sa dung cau true if-else d~xac dinh gia tri nguyen integer do ngucidung nhap VaG la eMn hay Ie

Vi £II.!- 2.1-(; Cach su dung me rrh d~ if...else

1: //File

2: //Author 3: //Purpose 4:

:part02_06.cs :RichardL. weeks

:C# if-else statment

l!j122

PHAN II : N gon ngil C#

5: using System; 6 :

7: public class StatementTest { 8:

9: public static void Main{ ) {

10: Console.Write("Enterannumberbet·ween1andl0: "); 11: int i = Int32 . FromString ( Console. ReadLine ( ) );

12 :

13: / / Neu 86' trong pham vi cho phep

14: if( (i >= 1) && (i <= 10) )

15:

16: / /Kie"m tra sJ cluin hone u

17: H{(i%2)==O)

18: Console. WriteLine ("The number {O} is even" I

i );

19: else

20: Console.WriteLine("Thenumber {O} is odd", i);

21:

22: } else

23: Console. WriteLine ("You must enter a

number between 1 and 10");

24:

25: }

2 6: }

Chung ta hay danh it phut d~ xem qua cac dong lenh trong vi du 2.1-6. a dong 10 chirong trinh nhac nguci sa dung nhap mot gill. tri t\1 1 Mn 10. Dong k€ tiep sa dung phuong' thirc ReadLine cua doi wang Console de dQC gill. tri nhap bdi ngl1<1i stl' dung. Vl phueng thrrc ReadLine tra v{, kieu chuoi string, nen can phai d6i w ki~u string sang met gia trj so nguyen. Viec nay diroc hoan thanh boi viec sU" dung phucng thrrc trnh (static) Parse tra v~ gia tri kieu Int32,

Blt6c ke tiep 18 kiem tra gill. trj nhap de xem gia tri co nam trong khoang duQ'c yeu cau hay kh6ng. Neu bieu thirc dieu kien Iii true, buck ke" tiep se tie"n hanh kiern tra so ducc nhap la chdn hay le. De kiern tra viec ,eMn le, chuang trmh sli dung toan ttl' chia lii"y phan du modulo. Toan tl.i' modulo chia gia tr] ben t.rai cho gia trj ben phai va tra v{, so du cua phep chiao Vl so chia 18 2 nen chi c6 cac so chdn mal c6 so du la O.

Nhir da n6i iJ phan tren, vi C# thirc hien kiern tra ki~u chat che nen 11 dong 17, ket qua phai co kieu Boolean. Trang C vii C++, dong lenh co the ducc viet nhu sau:

Tuy nhien, bi~u thtrc i%2 se tra v~ mot so integer, khong phai la mot kti't qua ki~u Boolean, Chinh vi vay, C# se khong chap nhan menh d{, nay va se bae liH.

#

16: 17 : 1B: 19:

;;.'2'nr: ':.~:II!i.~;··

-n:"

22: 23: 24: 25:

123~

'CHUdNG 2-1: Cac van d§ co ban cua C#

2.3. Toan tii' di~u ki~D ?:

Toan tu- dieu kien (condition operator) co th~ dltqc xem nhu Iii. mot hlnh thuc .khac cua menh d§ ifc..else. No ra't ti~n lqi khi muon gan gia tri cho bien dua tren mot vai bie'u tlurc dieu ki~n. C, c++ va ca Visual Basic deu hii trc toan tii'dieu kien, Visual Basic sii' dung phat bieu 11[(.) M thti hien toan ttl' dieu kien. KhOng giong nhu VB, C# dung each tinh short-circuit. Trong each tinh nay chi nhtrng ket qll~ ~~n thiEit moi dLtgc tmh. Trong VB, ca dieu kien true va false deu dl10C tinh.

,Dieu nay khong hi~u qua va c6 tM dan Mn mQt sO' loi tiem tang. .

Toan iii di§u kien c6 cu phap nhu sau:

, i I ~

result = conditional-expression? true exspression : false expression

Lu6n nhc III C# yeu cau tat cacac bieu thirc dieu kien c6 ke't qua la kitiu Boolean. Dieu nay phai dl1Q'c dam baa do tinh kie'm tra ki?u nghiem ngat trong C#. Vi du 2.1-7 la mot phien ban cai thien cua vidu 2.1-6, sii' dung toan ttl' dieu ,kien dti kie'm tra so diroc nhap VaG la chan hay le,

Vi du .2,]-7 Toan tit di~u kii.\n

1: /lFile

:2: / /Author '3: / /Purpose 4:

5:

6 :

'7: using System; B:

9 :

10: public class StatementTest { 11:

.12 :

13: public static void Main{ ) {

1 'I l

14: 15:

:part02_07.cs

: Richard L. weeks

: conditional-operator

Console. Write ("Enter an number between 1 and 10: ");

int i = Int32. FromString ( Console . ReadLine ( ) );

r.. -"1,f{ (i >= 1) && (i < = 10» {

/ / ki€m tra s6 chan te

string odd_even = (i%2) == O? "even" : "odd";

Console. Wri teLine ( "The number {O} is {1}" I i, odd_even);

r!J 124

PHAN II : N gM ngilC#

26:

27: } else

28: Console. WriteLine ("You must enter a number

between 1 and 10") ;

29:

30: }

31: }

Dong 23 trong vi du 2.1-7 cho thay each dung cua toan tu di~u ki~n. d day, bie'n ki€u string odd_even duocgan gia trj dua tren dieu ki~n (i%2)==0. Khi kat qua cua di~u ki~n 11'1 true, bien odd_even dttqc gan h~ng s6 dang chu 18 "even". Khi bi8u thuc la false, bien odd_even duoc gan gia tr; 11'1 "odd".

Trong vi du 2.1-7, toan tu di~u kien duqc su dung M thay the' cho b6n dong l~nh tU dong 17 den dong 20 ella vi du 2.1"6.

2.3_1- Ph6l bi~u golo

Yang, phat bieu goto vAn con dircc sa dung, Toi biet rling cac ban se tMc mac VI sao mQt ngon ugll hien dai nhu C# lai van su dung phat bieu goto? Phat bi~u gotocho pij~'p ti€n tdnhthl/C .bi(\n ngtt ngang va l~p tic ehuy~ den thl,ic hien tie'p chuong trlnh tai met nhan (label) chi dinh,

DOi khi viec sll' dung phat bieu goto m{it each dung dAn c6 th~ lam cho doan rna chuang trinh chat che va hieu qua. M~t khac, sa dung phat bieu goto se lam eho doan rna chuong trinh d~ doc han.

C6 mQt it di~u rang buec khi sa dung phat bieu goto. Phat biilu goto khong dt1qe Sll' dung dil nhay vao doan xii Iy cua cac phuong thuc khac hay thoat, ra kh6i phuong thtrc hien hanh, PMt biilu goto chi duoc sii dung de chuyen dieu khiiln Mn illQt nhan ngay trong vung rna hien tai,

Cu phap cua phat bieu goto cling Wang tV nhu C, c++ hay VB. NUn dich Ill. chuM cac ky tl,f chu cai va ky sO', trong d6 vi trf ddu tien phai Iii mQt chu cai, Ten cua nhan diroc ke't thuc bdi ky tlJ hai cham (:) M chi ra di.ng, day chi I:), nhan eM khOng phai I:). cau lenh , bi~u thuc hay I:). bien.

Phat bi~u goto c6 ell phap nhu sau:

goto labe'l-name;

Vi du 2.1-8 Minh hoa each dung co ban cua phat bigu goto.

Vi d~ 2.1-B Pha t bie'u goto

1: //File :02_10.cs

2: IIAuthor ":Richard L. Weeks

3: / /Purpose, : Demonstrate the use of the goto statment 4 :

5:

n n

OHtJdNG 2-1: Cae'vAn d~ co ban cua C#

12SIlj

'C#

ly, it hi

6: using System; 7:

8:

,:9; public class GotoTest { 110:

11: public static void Main ( ) {

12·:.

13:

14: 15: 16:

Console .WriteLine ("about to goto label!") ; goto label!;

19

V!~;t j<'·':Cons61e. WriteLine ("This 'Will not print " ) ; 18:

19: ~O: 21: 2:2: } 23:

label!:

Console. Wri teLine ("label! gotoeffecti ve" );

}

lc it

;:;

fC

Vi du 2.1-8 trmh bay each dung co ban cua phat bieu goto. a dong 19, mQt nhan c6 ten label l dtlQ'c khai bao, Phat bif','u goto a dong 15 chuytin di~u khien chuong trtnh ngay lq,p nrc Uri nhan ducc chi dinh, K€t qua IA doan rna W dong 15 tlti dong 19 se bi bo qua. CM y Iii. diu 1~!Vt WriteLine lJ dong 17 chi ra rdng phan chi1 nay se khong du'Q'c in ra.

Khi bien dich vi du, trlnh bien dich se dua ra mgt canh baa Iii da do ra mQt doan rna thita (Unreachable Code). Doan rna thua lJ vi du nay Iii dong 17. Boi vi di~u khil)n thuc hien chuong trlnh bo qua dean rna nay cho nen khOng co If do nao d~ no t&n tai, Ban phai luon chu y van nhtrng canh bao ciia trinh bien dich va xem nhu do cung chinh la cac 10i bien dich.

2.3.2. Phat bidu switch

Nhieu khi d.n phai xern xet mgt vai di~u kien va chon hra thirc hien thea nhi~u chon hra hay trtll'1ng hop. Day chinh la vai tro cua phat bieu switch. Vai ml)t vai bieu thuc d.n dinh gia tri, phat bieu switch co the dLlQ'C Sll dung dii' chon ra dung trLll'1ng hop de thl/c hien. Hay xern menh d~ switch nhu Iii each the hien vi~c thirc hien dua tren nhidu chon lira thay VI phai sll dung nhieu c<lu I~nh if I&ng nhau.

Phat bieu switch baa gdm mgt bieu thirc de xac dinh gia tri va mgt hay nhieu hang so gia trio dai dien cho cac truong hop co the xay ra,

switch( expression) (

case constant -expression: statement(s)

. jump statement

[d,efault: statement; jump- statement 1

~126

PHAN II: Ngon ngu C#

Bieu thirc dieu khien cho phat bieu switch co tM la bil:!u thltc kieu s6 hay kieu chuoi, Cac bieu thtrc hang' cua case phai cung kieu du lieu vdi bii'iu thirc dil'lu khien va khong the c6 2 ease co cung m(it bieu thltc hang.

Khong' nhu trong C va C++, C# kh6ng cho phep tU case nay thirc hien tiep sang case khac. De thuc hien dieu nay, co the' sa dung phjit bieu goto de chuyen dieu khien chuang trtnh nhay tdi doan rna cua case khac, Mi)i case phai co phat bieu nhay, ke ca case cuoi cung hay case default.

Vi du 2.1-9 trinh bay each sLt dung co ban cua phat bieu switch.

Vi du 2.1-9 Phdt bieu switch

1: //File :part02_09.cs

2: / /Author : Richard L. Weeks

/ /Purpose :The switch statement 3: using System;

4: public class SwitchTest {

5: public static void Main ( ) {

6: Console.WriteLine ("Please make your selection");

7: Console. WriteLine (" 1 Hamburger");

8: Console. Write-Line (U 2 Cheese Burger") ;

9: Console.WriteLine("3 Fish");

10: int Selection = int. Parse ( Console. ReadLine { } );

11: switch{ Selection) {

case 1:

12: Console. WriteLine ("Hamburger");

13: break;

14: case 2:

15: Console. Wri teLine ("Cheese Burger" ) ;

16: break;

17:

18: 19: 20:

case 3:

Console.WriteLine{"Fish"); break;

21:
22:
23:
24:
25: } default:

Console. WriteLine ("Unknown choice") ; break;

}

Vi du 2.1-9 trmh bay each sti dung phat bieu switch. Moi bieu thuc cua case dai dien bAng mOt hang so. CM y la lenh nhay break dugc thuc hien cho moi case.

Vi C# khong chp phep chuang trinh thuc hien tlt case nay sang case khac, nen phat bieu goto c6 tM duoc s~ dung d~ chuyen dijj,u khien sang case khac hay

CHuaNG 2-1: Cac van d~ eo ban ella C#

127~

case default. Vi du 2.1-10 SLt dung phat bieu goto M chuy~n di~ukhi~n tir mot menh d~ case sang msnh d~ case khac.

Vi d~ 2.1-10 sa dung goto hEin tr-ong m~nh d~ case

1: //File : 02 12. cs

2: / /Author : Richard L. Weeks

3: / /Purpose :The switch statement 4:

5: using System; 6:

7: public class SwitchTest {

8: public static void Main ( ) {

9: Console.WriteLine("Please make your selection");

1 0 : Consol e . Wr i teLine ( "1 Hamburger" ) i

11: Console.WriteLine("2 Cheese Burger");

12 : Console. Wri teLine (" 3 Fish" ) ;

13:
14:
15:
16:
17 :
18:
19 :
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31: } int Selection = int . Parse ( Console. ReadLine ( ) ) i switch ( Selection) {

case 1:

Console.WriteLine("Hamburger"); goto case 4;

case 2:

Console. WriteLine ("Cheese Burger") ; goto case 4;

case 3:

Console. WriteLine ("Fish") ; break;

case 4:

Console.Writ.eLine( "Transfered to case 4") i Console. WriteLine ("Transfering to

default case");

goto default; default:

Console. WriteLine ("Unknown choice") i break;

}

}

Vi du 2.1-10 la doan chirong trinh duoc sua lai W vi du 2.1-9. Cac ease 1,2 va 4 sa dung phat bieu goto M chuyen huong thuc hien chucng trtnh til' case hien tai tdi case khac Nhu v~y m(it bin ntra chung ta thay, ph at bieu gato dllqc dung de' chuy~n dieu khien cua chuong trrnh tai nhan case khae hay nhan default.

~128

PRAN II : Ngon ngil C#

2.3.3. Menh di for

Menh dil for Ia m{)t trong nhung menh d~ lap eo ban nha't. Nhilng tn1Crng ~gp.J';fil&~}il:,p. .. ~ugcxac dinh tru6c, Stl dl,mgmenr d~ for Ia rat thuan ti~n., Tunng W nhu C v~ C++, m~nh i1~ for bao g6m gia tri kMi tao, mQt bi~u thac di8u kien va menh d~ di~u khien IZlp. CU phap cua for nhu sau:

for ( ini tial zation; conditional-expression; iteration (s) statement;

initialzation la gia tri khdi tao, co thl! la mQt danh Bach cac khai bao va gan gia tri cho bien, dugc phan each bai dau phay. conditional-expression la bil!u thirc di~u khien phai c6 gia tri la kiiiu Boolean va duqc sa dung d~ xac dinh khi nao vong l~p for c6 tM ke"t thuc, iteration la menh d~ di~u khi~n viee l~p n6 thuong dungM tang hay giam cac bien di~u khien dugc sa dung bai menh d~ for (Xern vi du 2.1~11).

Vi du 2.1~11 M(inh dt< for

1: using system; 2:

3: public class ForStatement { 4:

5: public static void Main ( ) 6 ;

7: for(int i = 0; i < 10; i++)

8: Console.WriteLine( "i = t o i «. i);

9: }

10: }

Vi du 2.1.10 trinh bay hoat dQng cua vong lap for. Bien ki~u integer i duqc Blr dung dI\ di~u khiiin so IAn lap duqe thuc hien, Ket qua. cua vi du 2.1.10 c6 dang nhu sau:

i = 0

i = 1

i = 2

i = 3

i = 4

i = 5

i = 6

i=7

i:: 8

i = 9.

Ch6 Y h\ mi~n gia tri cua i la W 0 tdi 9 chu khong phai W 0 tai 10. Eli~u nay tuong' l1ngv6i dMu ki(\n i < 10. Chu y la biiiu th((c ki~m tra gia tri cua i hI. i phai nho han 10. Khi gia tri cua i bang 10, vong l~p for se ke"t thuc va chimng ~d~~~~*~~M~~~~~~

CHUaNG 2·1: Cac van d~ co' ban cua C#

129l!!j

Menh dfl for chi tac dQng Mn cau l~nh hay mQt doan cau l~nh (khOi)M ti€p ngay sau phat bieu for. D& thl,Cc hi~n nhieu l(lnh ling voi for, cac cau l~nh phai dugc d~t trong mot kh6i (khoi). Kh6i hi met dean cac diu l~nh ben trong dau rnava d6ng moe ( I, Vi du 2.1-12 trinh bay menh de for M di~u khien mot khoi cac cau lenh,

Vi du 2.1-12 Kh6i cac ciiu It:nh

1: using System; 2 :

3: public class ForTest { 4:

5: public static void Main ( ) {

6: for(int i "" 0; i < 10; i++ ) {

7: Console. WriteLine ("value of i to follow") ;

8: Console.WriteLine("i"" {O}II, i);

9: }

10: }

11:

12 :

Viti viec them vao menh de kh6i, menh d~ for bay gid se dieu khien viec thuc hien cac cau l(lnh ben trong kh6i. Ket qua ella vi du 2.1.12 co dang nhu sau:

1: value of i to follow 2: i"" 0

3: value of i to follow 4: i = 1

5: value of i to follow 6: i = 2

7: value of i to follow 8: i = 3

9: value 'of i to follow 10: i = 4

11: value of i to follow 12: i = 5

13: value of i to follow 14: i = 6

15: value of i to follow 16: i = 7

17: value of i to follow 18: i='8

19: value of i to follow 20: i = 9

Cdn d& y tam vue xac dinh cua cac bien. Trong cit 2 vi du ve each SlI dung menh de for, cac bien dieu khien deu duQ'c khai 18.0 vakhditao gia tri ben trong

l!!J 130

PHAN II : N gon ngll C#

chinh menh d~ for. Chinh vi vay, bien i chi tiin tai ben trong cau true for, va mo i nil lire truy xuat tai bien sau cau true for se d§n den liii bien dich (compile error).

2.3.4. Mfnh ~ while

Menh d~ while cho phep thuc hien lap cau lenh 0' phan than khi bi4u thirc di~u kien eho gia trj la true.

while ( condition-expression) statement

Menh d~ while hoat di)ng nhu sau:

L Bi,;u thirc di€u kien ducc ki~m tra

2. Neu bi~u thlicdi~u kien cho gia tri true, cau lenh phan than (body) se dvgc thuc hien

3. Viec nay 5e tiep dien eho de'n khi di~u kien tra thanh false.

4. Khi di~u kien c6 gia tri false, menh d~ dmrc ke"t thuc va churrng trlnh chuyen den thuc hien cau lenh k€ tiep.

Vi Iy do nay, phan than cua menh d~ co kha nang se khong duqc thuc hien litn nao. Neu di~u kien la false, phdn than cua m/!;nh d~ se khong duqc thuc hisn.

Menh de while rat phu hop trong trl1ang hop s6 hin I~p khong diroc bie't truce, kh5ng gi6ng nhu menh d~ for la doi hoi phai bie't tntac s6 Mn lap,

Hay xem xet each thire hien phuong phap cua Newton trong viec tim can bac hai. SO' Mn lap kh6ng duoc bie't truce vi phuong phap se tiep tuc chay khi phan chenh l~ch gii1a gia trj triroc va gia trj hien tai Ian han rni)t gia tri epsilon dinh trl1ac. Hay xem phan rna gia cua phuong phap Newton va sau d6 la each th€ hien bAng C#.

Epsilon: = 1. Oe-9

BaseGuess : = Nil C6 thi fa gui tri Mt ky

VAlue: = M l l gia tri do nguoi dung dinh. ngh.ia

NewGuess : = ( (Value / BaseGuess) + BaseGuess) / 2; While abs_delta ( NewGuess, BaseGuess) > Epsilon Begin

BaseGuess ::::: NewGuess;

NewGuess : = ( (Value / BaseGuess) + BaseGuess) I 2; End

LIiU Y rling kh6ng eo each de xac dinh 56 IAn lap cua menh de while. Bi;u tlurc dieu kien khnng dua tren mot bien dem (counter) rna la dua tren gia tri Boolean, e6 tM tr& thanh true bdt eli luc nao. Vf!.y d6i v6'i s6liin li!-p khong thJ xac dinh tru6'c, menh d~ while se phu hop han menh d§ for (ciin bi€t tnroc s6ltin lap), Phdn rna ciia phinrng phap Newton otren e6 th4 dien t:i rnqt each de dang trong C# nhu trong vi dJ,l2.1-13 sau day.

CUUdNG 2·1: Cac van d~ co ban cua C#

1311jl

Vi dt} 2.I·t:l Mi.'nh d~ while

1: IIFile :part02_13.cs

2: IIAuthor :RichardL. Weeks

3: IIPurpose :Make use of the while statement to 4: 'II : implement Newton I s method for finding 5: II : the square root of a number.

6:

7: using System; 8 :

9 :

10:

11: public class Newton { 12 :

13: public static void Main{ ) { 14:

15:

16: canst double epsilon '" 1. Oe-9;

17: double dGuess = 11. 0;

18:

l~f / /yeu cdu ngrJOi dung nht}p vao th6ng tin

20: Console.Write{"Enter a'positive number: ");

21: double dValue = double. Parse (

Console. ReadLine ( ) );

22: 23:

24: double dResu1t = ({dValue I dGuess)

+ dGuess) I 2;

25:

26: Console.WriteLine( "Guess Value = {O}", dGuess ); 27: Console.WriteLine( "ResultValue: {a}", dResult); 28:

29:

30: while ( Math.Aba (dResult - dGuess) > epsilon)

31:

32: dGuess = dResult;

33: dResult'" «dValue I dGuess) + dGuess) 12;

34: Console.WriteLine( "Guess Value = {a}",

dGuess );

35: Console.WriteLine( "Result Value = {a}",

dResult );

36: }

37:

38: Console.writeLine( "\n****\nThe approx sqrt of

{a} is {i) \n****", dValue, dResult );

39: }

40: }

~132

PHAN II: Ngon ngil C#

Vi~the hi~n',phlt(tngphap Newton trong vi du tran chl dan thuh la chuyen thing tli phan rna da li~t ke truce. C6 mgt it diem c&n phai hieu ro. Dong 21 trmh bay met vi du cua kieu co So' double va phuCfng'thac Parse. Nen nM rilng C# tM hien cac kii'iu co s6' nhu cac struct va struct thi co thi!' chua cac method (phuong thirc). Truong hcp nay ciing' co tM xay ra doi vdi ta"t ea cae kieu err sa trong C#.

Diem luu y ke tiep la menh d& while va bieu thuc di&u ki~n di~u khien a dong 30. Hay chu y phuorig thuc Abs, la phirong thtrc t.Inh (static) cua lop Math. Phuong thuc Abs tra ve gia trj tuyet dOi cua mgt bieu thae so nguyen eho truce,

2.3.5. Vong Ujp do ... while

Co cung cau true nhu menh de while la menh d~ do ... while. Khcng giong nhu menh d~ while, phan than cua rnenh de do .. .while se duge lij.p it nhat la mot IAn. Di&u nay urorig ling vrri vice bieu thirc dieu kien duoc kiem tra & cuoi ella mbi liin li).p chu khong phai la i'.J phan Mt dau, Vi du 2.1-14 duqe saa lai W vi du 2.1.13, thay the each slt dung vong li).p while biing slt dung vong lij.p do ... while. Ket qua cua ca hai each la nhu nhau, chi co each thirc thuc hien l8. khac nhau.

Vi du 2.1-14 M~nh d~ do ••. while

1: / /File

2: //Author :RichardL.Weeks

3: / /Purpose : Make use of the do while statement to

4: / / : implement Newton I s method for finding

5: / / : the square root of a number.

6 :

7: using System; 8:

9: public class Newton { 10;

11: public static void Main ( ) ( 12 :

13:

14: const double epsilon :: 1. Oe-9;

15: doubledGuess =11.0;

16: double dResul t :: 0.0;

17 :

18:

19: Console .Write( "Enter a positive number: ");

20: double dValue = double. Parse ( Console _ ReadLine ( ) ) i 21:

22:

23: dResult·= «dValue / dGuess) + dGuess) / 2;

24:

25:

26: do {

CHtfdNG2-1: Cac van d~ err han cua C#

133~

27: 28:

Console. WriteLine ( "Guess Value = {O}", dGuess ); Console.WriteLine ( "Result Value = {O}" I dResult

) ;

·29: 30: 31: 32: 33: 34: 35: 36:

dGuess = dResult;

dResult = «dValue /dGuess) + dGuess) I 2;

} while( Math.Abs(dResult - dGuess) > epsilon);

Console.WriteLine( "\n****\nThe approx sqrt of (O) is {l} \n****" I dValue, dResult );

37: }

38: }

~.3.6.M~nh d~ foreach

M~nh d~ foreach se roh quen thuoc n€u ban da tung phat trien ling dung vdi Visual Basic. V~ cc ban menh d~ foreach cho phep viec Ii!.p dua theo cac thanh phdn ben trong cua met mang array hay m9t collection (t;!;P hop) nao d6 SLr dung giao tiep (intrerface) !Enumerable. Chung ta se de C;!;P interface nay 0 phan sau.

Mili tlj.p hop collection cung cap mot s6 phuong thiro cho viec thirc hien I~p thong qua nQi dung cua collection. Trong the gi6'i C++ khai n iern iterator (b9 lap) trung khcp vdi khai niern enumerator (bl) Mm) trong the gi6i COM. Nhung nglioi dB: hai long vci interface IEnumVARIANT nhan thay ro vi~c d~ dang SLr dung interface lEnumerable cung vd'i viec h6 trg m';'t interface IEnumerator trong kie'n true .NET.

foreach (element_type variable in expression) stat.ement;

Hay xem xet cu phap ella mo?nh d~ foreach, element jtype la kilu di1 li~u ·dliqc SLr dung trong viec khai baa bien, expression c6 thti la mQt mang array hay m';'t ldp tlj.p hop (collection class) chua cac pMn tu co kilu la elernent jype. Vi du 201-15 IiILr dung foreach statement d~ li1,p thong qua n/)i dung cua ffit)t mang integer.

Vi du 2.1·15 M(\nh d~ foreach

1: IIFile :part02_15.cs

2: IIAuthor : Richard L_ Weeks

3: IIPurpose:Using the foreach statement 4:

5:

6: using System;

7: public class ArrayListing { B:

~134

PHAN II : Ngnn ngi1 C#

9: public static void Main( ) { 10:

11: int[] whole_numbers = {l,2,3,4,S,6,7,8,9,10};

12:

13:

14 : II Hien. th] toan b(J n(Ji dung ctia cac pluin til trong mdng

15: foreach ( int value in whole_numbers)

16: Console. WriteLine ( "value = (a}", value) ;

17: }

18: }

Khnng co qua nhieu rna trong vi du 2.1-14 vi t6i muon dat trong tam la lam sao de foreaeh hoat di)llg. Khi ban nhin toan bi) menh M foreaeh, ban se th§y dong 15 va 16 cua vi du 2.1-15 la tuong ducng voi VI du 2.1-16

Vi du 2.1-16 Mel rQng m~nh de foreach

1: IEnumerator i terator = whole_number. Get Enumerator ( ); 2: while(iterator.MoveNext(» {

3 : int value = (;i.nt) i terator. Current;

4: Console. WriteLine ( "value - {O} ", value); 5: }

Nhuban thay , ph§n rna rna ri)ng tren siJ dung interface !Enumerator va phuong thirc GetEnumerator(} eung di'p bdi ki~u System.Array. K€ tiep, mi)t m~nh de while dL1qc Stl' dung dli li~t ke so phan til' ciia mango Phan tU' hi~n tai ducc truy xuat va ep sang ki~u di11i~u phu hop.

2.4. Toan tu (operators)

Tolin tlt la phep toan duoc ap dung cho cac kieu co sa hay kieu dOi tuong' object. Toan tV eung cap viec thuc hien cac phep tinh. Toan tlt mi)t ngoi (unary operator) h\ toan tv thuc hi~n tren mQt toan hang duy nhat. Toan tiJ hai ngoi (Binary operator) can phai co hai toan hang ben phai va trai. Toan tli quan h~ '(relational operator) co dang la bigu thuc Boolean c6 th~ dUQ'c dung M tao nhi1ng bieu thuc dieu kien, Bang 2.1-2 chua tat cacac toannr clIa C#.

Toan hoc

Logical {Boolean va Bitwise} Co)ng mo)t ng6i,

+, -, *, t, %

&, I,",!,-,&&, II

++, --

Trl! mot ng6i

Shift (dich chuy~n bit)

», «

cHl1dNG 2·}: Cac vlfnd~ co ban cua C#

1351!J

Quan h~ so sanh

==, !=, <, >t <=, >=

Gan

Thong tin ki~u

is

(Type) Variable, as

Cac toan tu- trong bang 2.1-2 ni't quen thuoc vdi cac lap trlnh vien trong phan Ian cac ngon ng(l' voi ngoai tru toan tii is va as.

2.4.1. Toan tit is

Toan tli is dung M ki~m tra xem kiE!u ciia mQt thuc th~ la kiE!u gt. C# h6 tn;t rat manh thong tin v~ kiE!u trong qua trmh chay (runtime) va to an tit is sli dung thong tin kiE!u nay dil xac dinh xern thue tM da eho c6 phai la kiE!u da yeu cAu hay khOng. Cu phap toan tu is nhu sau:

expression is type

'I'oan ttl is co ke't qua la Boolean va c6 thE! dliqc sli dung trong biE!u thuc di~u ki~n, Toan tli is tra v~ gia t.ri true neu cac di~u kien sau thoa man:

Bi~u thuc co gia tri khac null

Bi~u thirc c6 tM ep ki~u (casting) an toan, Ep kiilu i'J day dliqc xem Ia ep kiii'u Wang minh (explicit) co dang: (type) (expression)

Neu ca hai di~u kien tren dliqc thoa man, toan tu is se tra v~ gia trl true, ngiroc lai, gia tri tra v~ Ia false. Vi du 2.1-17 trmh bay each sit dung toan ttl is.

Vi du 2.1-17 'I'osrn tir Is

1: IIFile :part02_16.cs

2: II Author: Richard L _ Weeks

3: IIPurpose : Demonstrate the I is I operator 4:

5 ;

6: using System; 7 :

8:

9: / / Tr,ro lap r6ng 10:

11: class Dog

~136

PHAN II ! N gon ngu C#

12: } 13:

14: class Cat { 15: }

16:

17 :

18: public class IsDemo { 19:

20: public static void Main( ) {

21:

22: Dog myDog = new Dog ( );

23: Cat myCat = new Cat ( ) i

24: int i = 10;

25:

26: WhatIsIt(myDog)i

27: WhatIsIt(myCat)i

28: WhatIsIt(i);

29:

30:

31: public static void WhatIslt ( obj ect 0 ) {

32:

33 : i f ( 0 is Dog )

34: Console. WriteLine (" It is a dog" ) ;

35 : else if ( 0 is Cat)

36: Console. Wri teLine ( "It is a cat" ) ;

37: else

38: Console. WriteLine ("I don I t know what it is") ;

39: }

40:

Vi du 2.1-17 trinh bay hai khai niem chua duoc gioi thieu, D<'tu tien la viec tao phurrng thirc tfnh (static) WhatIsIt trong lop IsDemo. M9t phirong thirc ttnh co tM su dung nhu hi met ham dQc l~p bai vi khong can ffiQt th~ hien (instance) cua dOi tuong. Phinrng thuc trnh se dircc trlnh bay chi tie"t a phan sau.

£)i~u thU vi ke tiep la tham s6 dugc truyencho phuung thuc tInh WhatIslt.

E)g y rAng dang ct1a tham s6 la object. TrongC#, tAt ca cac class d~u ngarn dinh la thua ke' tit lap co sa object va tAt ca cac ki~u gia trj co the dugc goi lai nhir object. Chinh vi di€m nay, object co th€ duoc su dung nhu 18. mot ki~u tOng hop co the chap nhan mci ki~u.

Cach sil dung thuc te" cua toan til is rAt ro rang. Vai moi phat bigu if, to an tu is dl1qc su dung M dinh ra thOng tin vi, kieu luc thuc thi cua d6i tunng object ducc truyen van ham. Tuy thuoc vao ke"t qua ella bieu thirc is, phan tra 1(/i tunng ling se duQ'c trinh bay len man hinh,

Sau day la ket qua cua vi du 2.1-16

. It is a dog

CHudNG 2·1: Cac van d~ co ban cua C#

13711)

11;is a: cat

I don' t know what it is

2.4.2. Toan tiI as

Cling sli dung thong tin v~ ki~u trong qua trtnh thuc thi nhu toan tli is, toan tli as se c6 gtlng ep kieu mot bilu thirc sang kilu duqc yeu du. Cach ep kilu thong thireng c6 dang (T) e, trong d6 T IS. killu va e la buiu thuc, Phep ep kiEi'u se tao nen mot InvalidCastException khi co sl! ep kiEi'u khong hup l~. Toan tit as khong phat sinh ngoai I~ exception, thay vi vay, k€t qua tra v~ IS. gia tr] null.

Toan til as su dung cu phap nrong tl,i nhu toan tli is:

expression as type

Cu phap cua toan tv as co thEi' duqc mer r(\ng nhu sau: espression is type? (type)expression : (type)null

Vi vay, toan tlI as dan gian chi la each vi€t rut gon cua toan tli is va toan ta di~u kien. Uu digm cua toan til as IS. de sa dung va di~u rii rang la khOng phat sinh ra ngoai l~ exception ngay d khi viec ep kiEi'u da li~u khorig thanh congo

2.5. Arrays (Mang)

Trong C#, Array (mang) la d6i tliqng kha dac biet, Tat ca cac d6i tucng kiEi'u mangd~u duqc ngam dinh la ke' thira W kiEi'u da lieu System.Array. Lap co sa System.Array cung cap nit nhieu phuong thuc duoc Stl dung trong qua trtnh thao tac tren mango Array cling cho phep kiEi'm tra chi muc (index). C6 nghia la khi eo su truy suat d€n mot. chi muc kh6ng hop l(i, vi du nhu Iii. chi rnuc ngoai khoang xac dinh (out of range), se phat sinh mOt ngoai l(i exception. D6i vrri C va C++, mOt mang dan gian se kh6ng bi kiem tra pham vi va co thEi' dlln Mn vi(ic ghi de (overwrite) len vung stack hay vung nho d(\ng (heap). C# thi khong nhu vay.

Viec khai bao mot bi€n mang thoat tien co ve hoi ky cue. nhung khi phan tieh lai cu phap, ban se thuc sl,! nhsn thii'y khai bao nhu vay .se ra rang han each khai bao mang trong C va C++.

Cu phap sau day duoc sl't dung M rip phat m(\t mang cap 1

array-type [] var = new array-type [size]

Chli y la dAu moe vuong a ngay ka ki~u cua mang (array-type) chu khong phai ngay sau ten bien, Cu phap nay lam cho viec khai bao ra rang hen la Mt diu m6c vuong ngay sau ten bie-n.

Mang trong C# sli dung chi muc dam til o. Nhung ngon ngu nhu COBOL va Visual Basic sa dung chi muc d€m tu 1, tuy nhien Visual Basic cho phep ban dinh nghia lai gia tr] dau tien cua chi muc, VI du 2.1-18 sl't dung mang mot chieu va mOt vai phuong thirc do ki~u System. Array cung cap.

~138

PHAN II : N g6n ng(l' C#

Vi dl:1 2.1·18 Mang mQt chi~u

1: IIFile :part02_17.cs

2: II Author : Richard L. Weeks 3:

4:

5: using System;

6:

7: public class ArrayTest { 8 :

9: public static void Main ( ) {

10:

11 : I I Khai bao mdng dan co kiiu int

12: int [] array_l = new int [5];

13:

14: II DUn day truing

15: fort int i = array_1.GetLowerBound(O);

i <= array_1.GetUpperBound(O); i++) array_1 [i] = i+1;

16:
17 :
18:
19:
20:
21 :
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35: }
36: }
37 : I I min tlii n(!i dung mung

for ( int j = array _1. GetLowerBound (0) ;

j <= array_l..GetUpperBound(O); j++) Console .WriteLine ("array_1 [{O}] = {1} ", j, array _1 [j] ) ;

Conso1.e.WriteLine("\n ....

Phase II \n .. );

I I Khai boo khiJi tao mung

int [] array _2 = new int [ 1

25,10,4,7,15, 2, 1. } i

II Sap Xf!P truing System.Array.Sort( array_2};

/ / Hien. th.i n(!i dung mdng

for ( int k = array _2. GetLowerBound (0).;

k <= array_2 .GetUpperBound(O); k++) Console.WriteLine("array_2[{0}] = {1}",

k, array_2 [k] );

cHlJ'dNG 2.1: Cac va:'n d~ cO' ban cua C#

139~

Vi dl,l 2.1-18 C! trencho thay each 811 dung phuong thuc GetLowerBound va GetUpperBound ella' System.Array. Phuong thuc GetLowerBound nhan m(lt tham tIi lci~u nguyen integer chi dinh gili tri chan duai cua chi muc, Tunng tunhu vij.y GetUpperBound nhan mot tham tr] integer d~ chi dinh gili trj chan tren cua chi ~l,Ic. Cach SI1 dung cac phirong thirc nay ducc th~ hien trong vi du i'J cac dong 15, 19 va 31.

Dong 12 den dong 16 khai bao mot mang va dung vong 11j.p for M khdi tao gia tr] . d dong 25 viec khai bao va khi'Ji tao gia trj diroc thJ,Cc hien tren mot dong duy nha],

Lap System.Array cung cung cap phurrng thuc Sort. Phuong thuc Sort dung M sApx€p cac ki~u di1 li$u nqi tai hay cac ki§u da li~u duqe phat trign thea giao di~h (interface) IComparabie. Cach ph lit tri§n interface se duoc trmh bay trong chU'crng.2.2 (C# nang cao),

Mang Array trong C# khOng nhat thiet Ia met chieu, Khai bao mang nhieu ehi~u don gian la chi dinh chieu dai cho mili chieu. Bi~u kha quan trong la ban phai chu y' r~ng mang kh6ng nhat thiet Iii phai vuong vue. Cac chieu c6 th§ e6 nhrmg chan tren khac nhau. Chung ta hay xem vi du 2.1-19 sau v~ each sa dung mang nhieu chieu

Vi du 2.]-19 Mang da chi~u.

1: IIFile :part02_18.cs

2: 1/ Author : Richard L. Weeks

3:' / /Purpose :Arrays with a Rank greater than 1 4:

,5:

6: using System; 7 :

Q:,\R~;Lic class Ar:rayTest { '9:'t:·" · ., ·pu'bi:tc static void Main ( 10:

11:

) {

int [,] grid = new int [3,3] { {1, 2 , 3} , {4,5,6}, {7,8,9} };

12:

13 : 1/ uu« thi n('Ji dung cua rna trtin

14: for(inti=0;i<3;i++){

15: for ( int j = 0; j < 3; j ++ ) {

16: Console .Write (" {a, 3} ", grid[i, j] );

17: }

18: Console.WriteLine(""};

19: }

20: }

21: }

Khai baa cho bien IDling hai chieu iJ dong 11 tinrng tJ,C nhu cu phap khai bao va khdi tao ella mang cdp 1 Dieu khac biet duy nhat 19. sO' chieu bay gia la 2; day

~140

PHAN II ; N gon ngi1 C#

goi Iii mang cap 2. Chu.yIa cac so chi muc.cho mang dU'qcphilncach b&i da'u phdy. Cu phap nay nlt quen thucc d6i vCii nhang I~p trinh vien Visual Basic, nhung neu ban lit nhirng' ngu'Cfi phat tri~n tren C.va C++, cu phap nay khac han nhirng gi ban thl1ang thay.

Vi du 2.1-19 cilng trinh bay each khdi tao danh sach khi khai bao bien mang hai ch ieu.

2.6. Struet (diu true)

Phan dau cua chuang, chung ta d<l ban ve kieu tharn tri (value type) va kieu tham chieu (reference type). Trong C#, mot cau true struct duoc xern la mi)t kiEi'u tham tri va nhu vay, duoc quan Iy a trong vung nhrr ngan xep stack chu khong phai a trong vung nhrr heap. C# phat trien cac kieu int va char nhu Ia cac struct.

Struct dung rat thich hap vdi cac kiii'u de li~u dan gian hoac hru giU err ch8' tuan tu hoa serialize va trang thai cua doi urcng. Struct co th~ chua cac thanh phan du Iieu, phuong thirc (method), thuoc tinh (property) va constuctor (b¢ khcri tao hay con goi la phuong thirc khdi dung). Trong hau he't cac truCtng hop struct hoan toan tinrng tl! nhu lap (class). Tuy nhien struct khong thE!' ke'thua (inherit) tU mot class hay La mi)t struct khac, Struct khong the' tao cac constructor voi tham so ben ngoai truyen vao, va neu ban co giing .Iamdieu nay trtnh bien dich se phat

sinh 16i. ...,'"

Protection (mrrc dil bao ve) mac nhien cua cae thanh phdn trong struct la rieng ttl (private). Trong C++, sl! khac biet duy nhat giaa struct va class Iii each bao v$ bien mac dinh, C# thi khong nhu vay. Bieu quan trong can phai bie't la trong C#, struct va class khcng th~ dung M hoan chuyen Ian nhau duoc. Nen nhd rang mot struct la mot kieu da li~u gia trj, con m/?t class la m9t kieu da lieu tham chieu, Vi du 2.1-20 dU'6i day se phat tri~n mQt struct don gian dai di1;ln cho m(it toa d(i diem (point).

Vi du 2.1-20 Khai bao va sri' d~n struct

1: using System; .2:

3: public struct Point { 4: public int X;

5: public int y;

6: }

7:

8: public class StructTest { 9:

10: public static void Main( ) {

11: Point p;

1.2: p_x = 5;

13: p_y= 10;

14: Point p.2 '" Pi

15: PrintPoint ( p ) ;

CHUONG .2-1: Cac vifn de co ban ella C#

141\!J

16: Print point ( p2 );

17: }

18:

19: public static void Print Point ( Point p ) {

20: Console_WriteLine( "x= {O}, Y= {1}", p.x, p.y);

21: . }

22: }

Vi du 2.1-20 cho ban thay lam the nao dinh nghia va sil dung struct cua C#.

Struet cua cau true Point chua hai thanh phan da li~u public (cho-phep truy cap toan cue) - x va y. CM ya dong 14 bien p2 diroc gan gia trj la bien p. Khi xem xet ki€u gi!i trj , phep gan mac dinh se chsp ni)i dung cua bien ben phai cho bien phia ben trai. Dieu nay phan anh ro net sl! khac biet vdi each thuc hien cua kigu tham chieu, Nen nhc ding doi vrii kieu tham chien, phep gan se thuc hien viec gan tham chieu chu khong chep ni)i dung nhir la kieu gia tri ,

C6 mot s6 dillm thu vi can phai ghi nhan kh i lam viec voi struct. Mi)t struct khOng th€duqc Slr dung cho den khi t<i't ca cac gia tri a ben trong struct da duoc khdi tao, Mgi lap class deu e6 phuong thac khdi dung constructor mi!.c dinh, kMi taocac thanh phan da lieu vrii nhtrng gi!i trj mac dinh uarng' irng. Tuy nhien, khi mi)t struct chua mot thanh phan da lieu dang rieng tu private, phtrong thuc khrri dung m~e dinh se kh6ng khdi tao gia tr] cua n6 neu kh6ng c6 yeu ciiu r5 rang. f)g i.l!pi .'~~·di~u nay;. phai tao cho struct toan tli new. Dieu nay gay nhdm Ian mqt chut hai vi struct v§.n duoc tao trong vung stack, khong phai trong vung nho heap nhu chung ta thuong hieu doi vdi toan tlr new. Vi du 2.1-21 trinh bay canh bao do trtnh bien dich phat sinh khi co gilng sil dung mot struct co chtra nhling thanh phil.n chua duqe kluri tao,

Vi du 2.1-21 Khdi tao cac tha nh phftn cua struct

1: using System; 2:

3: 4: 5: 6:

public struct Simple

public int i; private string s;

7:

8: publicvoidinit() {

9: i=10;

10: s="Hello";

11:

12 :

13: }

14:

15:

16:

17: public class T { 18:

~ 142 PHAN II : Ngon ngil' C#

19: public static void Main ( ) {

20:

21: Simple simple;

22:

23: simple.init( );

'24:

25: }

26: }

Khi bien dich vi.du 2,1-21, trrnh bien dich C# se phat sinh l6i sau:

Microsoft (R) Visual C# campi ler. Version 7.00.9030 [CLR version 1.00.2204. 21J

Copyright ( C) Microsoft Corp 2000. All rights reserved.

struct_02.cs(2S,3): error local variable' simple'

LiH phat sinh bdi trl.nh bien dich C# c6 ve hoi map rna vi n6 than phien v~ each sil dung bien CI,IC bq simple khi chua diroc khrri tao. Loi nay phat sinh Iii. do da li~u thanh phdn dang private s chua diroc khoi tao gia trio B,§' khdi tao gia tr] cho thanh phil.n private, mqt th,§' hien cua struct phai diroc khai bao sa dung toan tii new (xem vi du 2.1-22).

CSD165: Use of unasigned

Vi du 2.1-21 Khdi tao ca« tb arrh phii.n cua siruct

1: using System; 2:

3: public Btruct Simple { 4:

5: public int i;

6: private string a; 7 :

8: public void init ( ) {

9: i=10;

10: a = "Hello";

11: }

12:

13: public void show ( ) {

14:

15: ~onsole_WriteLine("i = {O}", i);

16: Console.WriteLine("s = {O}", s);

17: }

18:

19: } 20:

21: public class T { 22:

23: public static void Maine) {

24:

3. Ldp (CLASS)

I Lop hay con goi 11\ class la su gdi gon cao dcr Iieu va cac phirong thuc

(method) hoat dQng tren du li;;lu do. Trong C#, lop diroc xem la kieu da Iieu tham chieu (reference), va nhu vay, cac the hi~n (instance) ella lap se duqe chua tai vung nho heap va quan If bai GC (bQ thu gam rae). Khi mQt the hien cua lap dircc tao, be) nho 5e pharr pho] vung nho tucng aug tren heap va cac tham chieu den d6i tuqng se bitt dAu duoc Mm. Khi s6 Mm tham ch ieu bAng 0, GC se phuc h6i lai vung nhc bi chiern b&i dcli ttcqrrg va td. bQ nho sang trang thai sAn sang M su dung.

CHUONG 2-1: Cac vail d~ co ban etta C#

1431!J

25: 26: 47.: ..

'i"6:~"·

29: }

30: }

Simple simple = new Simple ( );

~imple _ ini t ( );

Xem lai vi du truce va thuc hien hai thay d6i, bay gia chuang trinh eo tM bien djch khcng c6 lbi va hoat dQng nhu mong dqi. Thay dlli thu nhat la them vao phlCCJng thirc show, trong d6 tM hien viec sil" dung di1 Iieu thanh phan s. Thay dlli nay thoa man duqe SI! nghiern ngat cua trinh bien dich v~ viec kh6ng cho phep troy xu'at cac dir lieu thanh phan dang private.

CM y la khai bao dong 25c6 sil dung toan tu- new. Nhitc lai IAn nua, di~u heft suc quan trong 11\ pMi hieu me)t struct la mQt kieu gia trj. Va nhu vay, no van thuQc v~ stack. Vi~c Sll' dung toan tl'1 new Jam eho phuong thirc khCri dung constructor m~c dinh thue hien va khdi tao gia hi cua di1 Mu thanh phan private.

Boi vi C# khOng cho phep constructor c6 tham s6 nen mci co gitng phat triil'n constructor dang nhu vay cho kieu gia tr] se ph at sinh 16i bien dich,

Lap c6 the chua cac fields (trucng), methods (phirong thirc), events (su kien), propertiestthucc tinh) va cac lap 16ng nhau. Lap cling co thg ke'thua W nhung ldp khac va phat tri1!n da giao dien (multiple intefaees).

Cilng gi6ng nhu struct, rrurc de') bdo v~ mac dinh cua lap Iii private. Lap co th~ khai bao cac thanh phan la public, protected, private, internal hay protected internal.

Khai bao mQt lap bao g6m cac digm sau:

'[attributes] [access modifier} class class-name [: [baseclass], [interfaceJ*]

body

!lj144

PaAN II : N gon ngil C#

Dau ngoac vuong cho bi~t day lit ph§.n cac tuy chon , khong Mt buoc phai khai bao, Vi du 2.1-23 trinh bay mqt 16'p dan gian dinh nghla cho ki~u da lieu la Dog.

Vi du 2.1·23 Lop don giiin

1: using Systemi 2 :

3: public class Dog { 4:

5: /I Truong

6: private string Name; 7:

8 : II Phuong tliuc khiji dl/ng con g9i La Constructor

9: publ ic Dog ( string name) {

10 : Name = name;

11: }

12:

13 : II Ph.uang thuc

14: public void Speak ( ) {

15: Console. writeLine ( "Hello. My name is {O}" I Name

) i 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:

}

}

public class Simple {

public static void Main ( ) {

Dog spot = new Dog ( II spot" ); spot. Speak ( );

}

}

Lap Dog trong vi du 2.1-23giiii thich eachco ban M diuh nghta va phat trign m(lt Iop trong C#. Lap chua mot truong riEmg tu private, m(lt constructor theo ki~u c6 tham so va duy nhat mot phirong thuc, Khong giong nhu struct , toan til new phai diroc sil dung d€ tao mot thii' hien cua lap. Dong 23 trlnh bay viec tao m(lt' thg hien cua lap Dog va sil dung constructor vci tham s6 d€ khdi tao. cho d6i tuong.

Bang 2.1-3 dudi day trinh bay cac b6 tit truy xuat qui dinh tam anh huang cua chung ddi voi cac bien trong 16p

Truy xua't c~p nlult cac thanh phan ciia Iop

public protected

Tilt ca cac rna deu tha'y dugc

Chi e6 thii thay duge a lap hien tai va lap ke'thlia

t

CHUdNG 2·1: Cac v&n d~ eo ban ella C#

14SI/j

protected internal

Chi thay diroc d lop hien tai

Chi thay dlfqc d g6i (assembly) hien tai

Chi thay diroc d g6i hien tai va cua ki,§u ddn xua't tU lap

private internal

s.i. D6i tli(jng (object)

Moi lop trong C# d~u duqc dan xuat tCt lop System. Object. Bdi VI ta't ca cac lap d~u dfin xu&t tU met lop co Sd chung, kha nang tao mQt lap t~p hop nhu collection tang hop cua cac lap trd thanh dieu khong cdn thiet, M6i tM hien cua mqt lop co th,§ duoc xem nhu la mot tM hien ella System. Object.

Lap System. Object cling cung cap mot s6 dich VI,! co ban dtCqc cac lap khac trong kien true .NET sa dung. Vi du, phuong thuc Console.Write se dung phuong thirc ToString cua 16p d,§ trinh bay nQi dung lap ra man hmh, Do d6 bilt cll' 16p nao trong C# cling c6 th~ dinh nghla chong len phuong thirc ToString va cung cap phat tri,§n tuy chinh d~c bi~t d6i vai l6"p. Bang 2.1·4li~t k~ mOt s6 phinrng thuc co ban cua lap Object.

Bang 2.1·4 L~~Srs~c:m.O~j,~ct

P4~t~~7:;0 ,;1td,f~JJijf'·i'(;·i;. .. ...•

Equalf Object)

Phep so sanh kieu Boolean Tinmg tJ,i nhu destructor cua c++ Chuyen d6i lap sang dang string.

Finalize

ToString

Lap co Sd System. Object con cung dip them mot s6 phirong thirc v~ thOng tin ki,§u (type information), phan chieu nQi dung lap (reflection), va sao chep (cloning). Nhi.1ng phuong thll'c nay nam ngoai nQi dung trinh bay cua phan nay, nhung viec tim hi,§u chung cling r;i:"t hiru ich.

3.2. Phlidng thuc (Method)

r n o

)i

Trong thuat ngil cua Ilj.p trinh hudng dbi tuqng, mQt phuong thuc (method) la met hanh d9ng cua d6i tirorrg. Phuong thirc c6 tM duqc tao ra va go! tCt tM hi.;\n cua dOi tucng hoac Iii phuong tlurc tlnh (static) co th~ duoc goi true tiep ttl mot lap. Mqt phuong thuc goi bang tM hien cua d6i tuong can phai tao ra doi ttCqng truoc khi co tM sa dung phmmg thuc, Tuy phirong thirc tmh khong can den vi~c khdi t~od6i tucng, nhirng no khong th,§ truy xuat den .cac du li~u thanh "phan cua ldp,

Phuong thirc cung gi6ng nhu da lieu thanh phan, no cung c6 thg co nhung bel tlt truy cap ap dung, Vi du phiarng thirc public cho phep user gQi trirc tiep, noi each khac, d6 la phuong thiic dung chung, Phuong thuc protected chl duqc sl'r dung bci chinh d6i nnmg hay nhung d6i tuong dAn xuat tlt d6i timng do. Phuong thtrc private chi c6 th,§' truy xua't bui lap da khai bao phinmg thirc. Cac Ic1pddn xua't kMng th,§' sa dung phinrng thuc private cua lop co sO'.

~146

PHAN II: Ngon ngi1 C#

Vi du 2.1-24 duai day se giai thich each sll' dung phuong thirc th~ hien (instance method) Wc Ia phuong thirc duoc goi chi khi hinh thanh deli tirong va phuong thUc ttnh (static method) la phuong thuc g9i thong qua t~n lap khong cAn ki~~t~o dQi tuong.

Vi d\l 2_1-24 Phu'dng thuc Instance vii Static

1: using System; 2:

3: pub~ic c La s s MyMath { 4:

5: II instance method

6: public long Factorial{ long 1 ) {

.7: return 1 <: 0 ? 1 : 1. * Factorial ( L - 1 ) ;

8: }

9 :

10: //static method

11: public static long SFactorial ( long 1 ) {

12: return 1 <: 0 ? 1 : 1 * SFactorial ( 1 - 1 ) i

13: }

14: }

15:

16: public class Methods 17 :

18: public static void Main ) {

19 :

20: / / SiI: dung phu:ang thuc static

21: Console. WriteLine ("5 Factorial;: {O}",

MyMath. SFactorial ( 5 ) );

22:

23 : / / SiI: dung phuang tliuc instance

24: MyMathm=newMyMath( )i

25: Conso1.e.WriteLine{"5 Factorial. = {O}II,'

m , Factorial ( 5 ) );

26.: }

27: }

Dt truy xuat phuong thUc tinh static, ten cua phuong thirc phai di kem sau ten eua lap. Dong 21 cua vi du 2.1-24 goi phuong thuc SFatoial cua lap MyMath Mng each sltd\lngtoan tli dau cham. G# sli dung toan ti'1 dau cham M truy xuat cac thanh phan va phuong thuc, C# thong nhat each truy xuat cac thanh phan va phinrng thdc thea toan ti'r dAu cham . Trang C++ , viec truy xuat cac thanh phan c6 tM . thong' qua con tro, ddu cham hay truy xuilt theo pham vi (scope) la tuy thuQc VQO tUng tinh huang. C# thi kpac hAn, chl toan tli da'u cham dircc sli dung cho moi truy xudt.

Phuong thuc instance cAn co mOt dOi tl1qng M gni. Phuong thuc Factorial li\. phiarng thirc loai nay bdi vi no khOng dugc khai bao hi static. Dong 24 tao ra mOt

CHUONG 2·1: Cac van d~ C(J ban cua C#

147~

tM hien hay instance cua lap MyMath d~ goi no. CM y la trong moi trucng hop , daucham d~u duQ'c sir dung d€ goi phuong thltc tinh static cung nhu phuong thuc tM hien instance.

3.3. Truy~n tham s6

M(ji ngon ngl1 Mu co cu phap dinh nghIa lit mot tham s6 duoc truyan thea tham tr] - mQt ban sao cua tham so duQ'c di).t vao stack khi goi- hay tham bien - mQt bf danh (alias) cua bien duoe d~t VaG stack khi goi, Trang C va C++, ban co thg truy§n mot tham 50" bling tham tri, tham hie-h, con tro (pointer). Lap trmh vien Visual Basic biet rang cac tham s6 duoc truyen mac dinh Ia tham bien va khi muon tham so duoc truyen Ill. tham trj thi phai chi dinh ro rang.

C# khOng chi h5 tro viae truyen tham so bang tharn tri hay tham bien rna con cho phep su dung them chi dan nhu in va out. Nhi1ng chidan nay cung Wang tl! nhu in va out dung trong COM.

Trong C#, cac ki~u gia tr] nhu kieu dan nguyen (primitive type), struct duqc truyen bang tham tri, tru khi ban chi dinh khac di. Khi tham so duoc truyen bang' tham tri , mot ban sao cung kieu gia tri se diroc tao ra. Phuong thirc se nhi).n· tham sO' ducc truyen va su dung de" sao chep hay thay d6i gia trio Tuy nhiEm,tham so khong he co sl! lien hi;': vci the gioi ben ngoai. Nsu mQt phuong thire thay d5i gia tri cua tham tri, anh hirong chi co tac dung trong ban than phuong thirc. Nhimg ki€u tham chieu nhu ldp hay giao dien inteface, dinrc truyen bang tham bien, khong thg truycn bang tham trio Be truydn mQt kigu gill. tr] nhu la tham bien, chung ta sli dung tU khoa ref. Khi mot tham so duQ'c truyen nhir tham bien cho met phuong thirc, phucng thirc co tM thay d6i gia tri va viec thay dGi nay co anh hirdng thue sl,i den tham so, dieu nay phat sinh ra hi/l;u ling Ie (side effect). Vi dl,l 2.1-25 giai thich each t.ruyen tham so trong C#.

Vi du 2.1·25 Truy~n tham 66

using System;

/ I T(!O ki€u cdu true mang ten Point public struct Point {

public int x; public int y;

}

I / T(!O kiiu tham ehi€u lap public class MyObject { public int i;

~148

PnAN II : Ngon ngil' C#

public class Pass {

public static void Main( ) {

int i = 100;

C.onsole. Writ-eLine {"Value of i before PassByValue Methed is {a}", i ); PassByvalu~ ( i );

C.onsole .WriteLine ("Value of i after PassByValue Methed is (a}", i );

Console. writeLine ( ,," ) t-

Cens.ole.WriteLine("Value o f i before PassByRef Method is {a} ", i ) ; PassByRef ( ref i );

C.ons.ole .WriteLine ("Value of i before PassByRef Method is {a}", i );

C.ons.o1e.WriteLine("");

I / Tga thi hien eua Point

Point Pi p.x"" 10; p.y= 15;

Console. writeLine ("Value of p befere PassByvalueis x={O}, y={l}", p.x,p.y); PassByValue ( P ) i

Cqnsole".Wr:j.teLip.e ("value.of p after, PassByValue "i:g'xb{O} ;'y";'{1}", p.x,p.y);

Censole.WriteLine("");

Corrao Le , wri teLine ("Value o f p befere PassByRef is x= { O}, s= { 1 } ", p. x , p . y) i PassByRef ( ref p ) ;

C.onsole. wri teLine ("Value o f p after PassByRef isx={O}, y={l}", p.x,p.y);

C.ons.ole.WriteLine("");

/ / Too thi hifn ctia do'i tuang

MyObj ect .0 '" new MyObj ect ( ); .o.i '" 10;

Cons.ole. WriteLine {"Value of o. i bef.orepassReferenceTypeis (O}", .o.i); PassReferenceType ( .0 ) ;

CHudNG 2-h Cac van d€! eel ban cua C#

149~

Console.WriteLine("Value of o.i after PassReferenceType is {O}", o , i ) i

}

public static void passByValue ( Point p) {

Console .WriteLine ( "Entering public static void PassByvalue ( Point p )" );

Console. WriteLine ( "Value of Point. x = {O} point.y= {l}", p.x, p.y);

p.x++; p.y++;

Consol.e. WriteLine ( "New Value of

Point. x = {O} : point. y:: {1}" I p. x, p , y ) ;

Console. WriteLine ( "Exiting public static void PassByvalue ( Point p )" );

}

public static void PassByValue ( int i ) { Console.WriteLine ( "Entering public static void PassByValue ( int i ) .. );

Console.WriteLine("Valueof i:: {O}", i); iTT;

Console.WriteLlne("NewValue of i = {O}", i);

Console. WriteLine ( "Exiting public static void PassByValue ( int i )" );

public static void PassByRef ( ref point p ) { Console. WriteLine ( "Entering public static void PassByRef ( ref point p )" );

Console. WriteLine ("Value of Point _x = {O} Point.y= {l}", p.x, P.y)i p.x++; p.y+,+;

CO;:lsole .WriteLine.( "New Value of Point.x = {OJ Point.y= {l}", p.x, p.y);

Console. WriteLine ( ~'Exiting public static v.oid PassByRef ( ref Point p )" ) i

public static void passByRef ( ref int i ) { Console. WriteLine ( "Entering public static

#l4e·

PHAN II: Ng6n ngQ C#

void PassByRef ( ref int i )" );

Console. WriteLine ("Value of i = {O} ", i ); i++1

Console. WriteLine ("New Value of i = {O}", i );

Coneole.WriteLine ( "Exiting' public static void PassByRef ( ref int i )" } i

}

public static void PassReferenceType ( My-Object 0 ) { Console. writeLine ( "Entering public static void

. PassReferenceType ( MyObject 0 )" ) i

Console.writeLine("Value of MyObject.i = {O}", o.i};

o.i++;

Console.writeLine("NewValue of MyObject.i '" {O}", o. i) ;

Console.writeLine( "Exiting public static void PassReferenceType ( MyObject 0 ) II );

}

}

Viec truyen tham s6 trong vi du 2.1·25 th~ hii;m trU'ong hoptruyen tham s6 kigu dan nguyen, struct va kigu tham chieu cho phirong thue bang gia tri va bang tham bien.

Kit qua ella vi du 2.1·25 nhu sau:

Value of i before Passl;3yValue Method is 100 Entering public static void PassByValue ( int i Value of i = 100

New Value of i = 101

Exiting public static void PassByValue ( int i Value if i after PassByValue Method is 100

Value of i before PassByRef Method is 100 Entering public static void PassByRef ( int i Value of i = 100

New Value of i = 101

Exiting public static void PassByRef ( int i Value if i afterPassByRef Method is 101

Value of p before PassByValue is x=10, y=15 Entering public static void PassByValue ( Point p Value of Point.x = 10: Point.y = 15

NewValue of Point. x = 11 : Point.y = 16

CHUONG 2-1: Cac vAn dii ea ban cua C#

151~

Exiting public static void PassByValue ( Point p Value of p after PassByValue is x=10, y = 15

Value of p before PassByRef is x e Lfl , y=lS Entering public static void PassByRef ( Point p Value of Point. x = 10 : Point.y = 15

NewValue of Point. x = 11 : Point. PassByRef = 16 Exiting public static void PassByRef ( Point p ) Value of p after PassByRef is x=ll, y = 16

Value of o. i before PassReferenceType is 10

Entering public static void PassReferenceType (MyObj ect a Value of MyObject. i = 10

NewValue of MyObject.i = 11

Exiting public static void PassReferenceType (MyObject 0 Val ue of 0 _ i after PassRe£erenceType is 11

3.4. ThuQc tinh (Properties)

, Trong the' giai C++ va COM, Property eo y nghta dan gran la nhirng phuong thirc assessor (lAy gia tri) va setter (diU gia tri). Trong COM, nhi1ng phirong thirc nay se hi. pucT va geCT trong d6 T la ten thuoc tinh. Lap trmh vien Visual Basic ngay I~p tuc se thAy quen thuoc vdi khai niem thuoc tinh nay bai vi cling co nhi1ng phmrng thirc urong tv-

C# cho phep thuoc tmh co thi\ chi doc (read only), chi ghi (write only) hay vira doc vua ghi (read/write), trong do thuQc tinh chi ghi it khi diroc dung.

CAu true khai bao mQt thuoc tinh property co cu phap nhu sau:

access-modifier return-type PropertyName { [get { statement; }]

[set { statement; }]

}

Thuoc tinh cung cAp co phap dan gian M truy cap cac y€u t6 trong mOt lap trong khi vAn quan tam den viec cai dij.t a ben trong. Vi du 2.1-26 xem lai phucng phap Newton di¥ tinh can bac hai va phat trii¥n hai thuoc tinh lA Value va Result.

Vi du 2.1·26 each sa dl,lng Propety

1: using System;

2 : 3 :

4: public class Newton { 5:

6 : 7 : 8:

private double m_dblValue; private double m_dblResult;

~152

PHAN II : N gOn ngil C#

25: }

26:

27: get { return m_dblValue; }

28: }

29:

30:

31: 32: 33 : 34 : 35:

36: 37 : 38: 39: 40: 41: 42:

9: 10: 11: 12: 13: 14: 15: 16: 17 : 1.8: 19: 20: 21:

22: 23: 24:

43: 44 ;,

45: 46: 47: 48: 49: 50: 51: 52: 53:

public Newton ( ) { m_dbl Value = 1.0; m_dblResul t '" 0 . 0; }

//Properties

//Value is set/get public double Value { set {

if ( val ue < = 0 ) {

Console. WriteLine ("Value must be greater than Zero" ) ;

return;

}

in_dblValue = value;

public double Result {

get { return m_dblResul t; }

}

public void FindSqrt ( ) {

const double Eplison '" 1. Oe-9;

double Guess = 11;

m_dblResult'" «m_dblValue / Guess) + Guess) / 2;

while ( Math.Abs ( m_dblResult - Guess) > Eplison ) {

Guess '" m_dblResult;

m_dblResult = «~_dblValue / Guess)

.. +Guess)/2;

}

}

}

public class PropertyTest {

CHlJdNG 2-1: Cac van d~ co ban cua C#

1531!J

5>4.: ~ubllc static void Main( ) {

55:

56: Newton n ::; new Newton ( );

57 :

58:

59: n.Value::; 100;

60:

51: n.FindSqrt( );

62:

63:

64: Console.WriteLine("The Sqrt of {O} is (l}",

n. Value, n.Result );

65: }

66: }

Trd lai vi du cua Newton, Vi du 2.1-26 trinh bay each cai d~t phuong phap Newton-de tinh can b~c hai cua mot so. Lap Newton cai d~t hai thuQc tinh Iii Value va Result. Thuoc tinh Value phat triE!n ca hai phuong thee get va set. Di~u nay cho phep thucc tinh c6 tht'i doc va ghi. thuoc tinh Result chi phat tril'ln phuong thuc get, ket qua la thuoc tinh chi c6 thJ doe (read only).

Muc dich cua thuoc tinh la cho phep truy cap de'n cac du li(iu thanh phan theo ngon ngi1 tl,l' nhien rna khong dn dE! y xii' ly a ben trong, Khi phat triE!n thuQc tinh get va set, ban co thE! thoai mai thuc hien kiJm tra, chuyl'ln dBi va nhtrng xii' Iy logic khac neu cdn thiet, 0 khia canh ngueri dung, tat ca nhirng phat triii'n ben trong 180 truu tuong va viec truy xuat du lieu cua cac thanh phan d6i vai ho la het suc tl,l nhien, ranh mach,

3.5. Toan tii' (Operator)

C# cung cAp kha nang cho phep ngueri dung dinh nghta cac toan tii' (operators) . BAt cu struct hay lap d~u co thEi' cung cap nhtrng phat triEi'n cua cac toan tii' cho truce, nhu phep cQng, tru hay ep kiJu tlt kiEi'u nBS sang kiJu khac. Khi nang tao ra nhtrng kiEi'u gia tr] rndi cQng ·vai vi~c dinh nghta nhung toan til' rndi tao ra kha nang phat triJn nhtrng kieu gia tri cung nhu cac kiii'u tham chieu moi,

Nhir da ban bac a phan d&u V'~ toan tii gan va SI! khac bi~t khi sa dung no d6i vm kiEi'u gia tr] (value type) va kiJu tham chieu (reference type), C# khong cho phep phat. tri~n toan tli gan, Nhi1ng ngtroi phat trien tren c++ bay gier se c6 ve tMc mac, Sl,l han che' nay 180 boi viec clem cac tham chieu Mn bien. MQt nguyen nhan nira Iii .NET duge xAy dung nham M cac ngnn ngi1 khac nhau co thii' giao tiep voi nhau, FM sao chep, hAu het cac kiEi'u tham chieu (reference type) dilu cung cap mi,lt phuong thuc Copy. Khi xay dung mQt lap, ban phai theo dung thiet ke nhu v~y.

C# yell cau tat ca cac toan ta (operator) phai 180 static phuong thire. Di~u nay lam cho ngen ngi1 them dii higu hOD. Toan tii' gAn Ii~n vci mot ki~u chu khOng phdi 180 mQt tM hien cua d6i tuqng.

D~ higu them v~ vi~c rna r<lng toan tli" (operator), lap Fraction trong vi du 2.1-27 duai day se giai thich each phat tr ien hai phep tinh toan hoc + va -.

\1154

PHAN II : Ngon ngil' C#

Vi d'u 2.1-27 Dinh nghla ch6ng toa n tit (Opel'ation Overloading)

1: !!File :part02_26_cs

2: II Author: Richard L. Weeks

3: IIPurpose : Demonstrate operator overloading 4:

5: using System; 6 :

7: public class Fraction B:

9: / /data members

10: pri vate int Ill_numerator;

11: private int m_denominator;

12:

13: /IProperties

14: public int Numerator {

15: get { return m_numerator i }

16: set { m_numerator = value; }

17: }

18: public int Denominator {

19: get { return Itt_denominator; }

20: set {m_denominator = value; }

21: }

22,:

23:

24: IIConstructors

25: public Fraction( ) {

m_numerator = 0; m_denominator = 0;

}

26:

27: public Fraction ( int iNumerator,

int iDenominator) {

28: m_numerator = iNumerator;

29: m_denominator = iDenominator;

30,: }

31:

32: J IArithmetic operators +, -, I, *

33:

34: public static Fraction operator+ (Fraction fl,

Fraction f2) {

35: Fraction Result = new Fraction( ) ;

36:

37 :

38: if( f1.Denominator != f2.Denominator) {

39: Result.Denominator = f1.Denominator *

f2·.Denominator;

CHl1dNG 2·1: Cac van d~ co ban cua C#

155aJ

40: Re~sult . Numerator '" (fl. Numerator .",

£2.Denominator) + (f2 . Numerator .", f1.Denominator)]

41: } else {

42: Resul t. Denominator ee fl. Denominator;

43: Resul t . Numerator =: fl. Numerator +

f2.Numerator;

44 :

45: return Resul t;

46: }

47:

48:

49·: public static Fraction operator- (Fraction f1,

Fraction f2) {

50: Fraction Resul t =: new Fraction ( );

51:

52:

53,: if( f1.Denominator I=: f2.Denominator) {

54: Result. Denominator =: fl. Denominator .",

f2.Denominator;

55: Result.NUmerator '" (f1.N\1.merator""

f2.Denominator) - (f2.Numerator

.", fl. Denomina tor) ;

56: else {

57': Result . Denominator =: fl.Denominator;

58: Result.Numerator f1.Numerator-

f2.Numerator;

59: }

60: return Result;

61:

62 :

63: }

64 :

65:

66: public class OperatorTest { 67 :

68: public static void Main ( )

69:

70: Fraction f1 =: new Fraction ( 1, 5 );

71: Fractionf2 =:newFraction( 2,5};

72 :

73 :

74: Fraction f3 =: f1 + f2;

75:

76:

77: Console.WriteLine("fl + f2 = {D}/{l}",

f3 • Numerator , f3. Denominator) ;

78:

~", .. ,.

iII·156

~

PHAN II : Ngon ngii C#

79:

80: f3 = f3 - f2;

81: Console.WriteLine("f3 - f2 ca {O}/{l}",

f3 . Numerator , f3. Denominator};

82: }

83: }

Lap Fraction trlnh bay trong vi du 2.1-27 tren phat trii1n cii hai toan tii + va -. Toan tU cong duoc phat tri~n & dong 34, va to/in ttl tru & dong 49. Hmh thirc rna rQng chung cua rn9t toan tli' co thi1 bi~u dien nhu sau:

public static return-type operator T (param p [, param pI] ) Trong do return-type chi dinh ke't qua cua toan hi, T la toan tit thuc sl! se bi chong len, va sIS lirong cae tharn s6 (parameter) tuy thuoc vao toan tii dang ducc dinh nghia chong len.

£>11 rna rong' cac toan tii toan hoc chuan, C# cung cap kha nang dinh nghta ch6ng cac toan til' quan h~ (relational) va cae toan tll ep kii1u (casting). Toan tli quan he thinrng' di theo tUng cap. Vi du, khi dinh nghta chong len toan ti'l quan he ==, toan tii tU<1ng. duong la != cfing phai dl1qc dinh nghia luon, Toan tii quan he khi di nh nghla chong cung dllQ'c su dung tuong tl! .nhu nhQng toan tU khac,

'I'oan tli ep ki~u (casting) co ngU nghla khac chut it so voi cac toan tli thOng thuong. Khi phat tril1n rn9t toan ti'I ep ki~u, ban phai quye't dinh ngay Iii ngil.m dinh (implicit) .hay tuang minh (explicit). Can nhd Iii mot ep kieu dang ngam dinh thi kh6ng dn chi dinh kii1u, trong khi ep kieu dang tUCrng minh doi hoi phai co.

Fraction f = new Fraction (1, 5) i

double d = f; II ep kdu ngdrn dink

doubl e dd = (double) f; II ep kilu tuimg minh

Cu phap di1 dinh nghIa chong mot toan tlt ep kieu nhu sau:

public static [implicit I explicit] operator Return-Type Type T}

Xin nhac lai, Return-Type chi r6 kieu rna Type T se du(,1c ep hay chuylln sang. Ma rQng vi du trurrc, I6p Fraction d vi du 2.1-28 duqc rna rQng di1 phat trilln mot toan tli' ep kii1u dang tuang rninh sang kie'u double va toan tli quan M == cling nhu !=. Khi bien dich phdn rna cua vi du 2.1-28, trmh bien dich se phat sinh hai canh bao CS660 va CS661. Canh bao nay sinh tu viec phat triiln cac toan tlt == va != va yeu cil.u d day la ba"t cu lap nao phat trie'n nhirng toan tli nay phai thuc hien phat trii1n them nhung phucng thirc Object.Equals va Object.GetHashCode. Bay gia, ban tarn thai bO qua nhU'ng canh bao nay, Tuy rihian khi tao rna san pha':'m, nen chac chan la phai phat trie'n nhung phirong thrrc cdn tw€t la Equals va GetHashCode nham dam bao Iuat co tM kh!lng dinh rang hai d6i tugng nao do duqc xern la bang nhau thong qua phuong thac Equals, hay bAng nhtrng toan tli

= va 1= co cling rna bam (hash code).

CHUONG 2-1: Cac va'n d€ eel ban cua C#

157~

Vi du 2.1-28 Md rQng Jdp Fraction

1: I/File

:part02~27.cs

l: / / Author: Richard L. Weeks

3: / /purpose : Demonstrate operator overloading 4:

5 :

6: using System; 7 :

8:
9 :
10:
11:
12:
13 :
14:
15:
16:
17:
18:
19:
20:
21:
22 :
23:
24:
25:
26:
27 :
11
11 28:
g 29:
d
a
n 30:
y
1,
a
6 public class Fraction {

/ / dat a members

private int m~numerator; private int m~denomlnatori

//properties

public int Numerator

get { return m~numerator; } set { m~numerator = value; }

}

public lnt Denominator {

get { return m~denominator; } set { m~denominator '" value i }

}

//Constructors

public Fraction( ) { m~numerator =·0; m...denominator '" 0; }

public Fraction( lnt iNumerator,

int iDenominator ) {

m~numerator = iNUmerator; m~denominator '" ,iDenominator;

}

iJ158

PHAN II : Ngcn ngu C#

36: IITo(mtU+,-,/,*

37:

38: public static Fraction operator+ (Fraction f1,

Fraction f2) (

39: Fraction Result:; new Fraction( );

40:

41:

42: if ( fl. Denominator! = f2. Denominator) {

43: Resul t _ Denominator = f1 _ Denominator *

f2.Denominator;

44: Result.Numerator = (fl.Numerator *

f2 . Denominator) + (f2 . Numerator * .f 1 . Denominator) ;

45: } else {

46: Result.Denominator = fl.Denominator;

47: Result . Numerator = fl.Numerator +

f2.Numerator;

48: }

49: return Result;

50: }

51:

52:

53: public static Fraction operator- (Fraction fl,

Fraction f2) {

54: Fraction Result = new Fraction( );

55:

56:

57: if( f1.Denominator 1= f2.Denominator ) {

58: Result.Denominator = fl.Denominator *

f2.Denominator;

59: Result. Numerator = (fl. Numerator *

f2.Denominator) - (f2.Numeiator * f1.Denominator);

60: } else {

61: Result.Denominator = fl.Denominator;

62: Result . Numerator = fl.Numerator -

f2.Numerator;

63: }

64: return Result i

CHtfdNG 2·1: Cac van d~ co ban cua C#

1591MJ

65:
66:
57 :
58:
69:
70:
71:
72:
73:
74:
75:
75.
77 :
78:
79:
80:
81:
8.2 :
83 :
84:
85:
86:
87 :
88:
89 :
90:
91:
92:
93:
94 :
. [ C~;
"6 ;.
97 :
98: }

public static explicit operator double ( Fraction f) {

double dResult =: «double)f . Numerator / (double}f.Denominator);

return dResul t;

}

public static bool operator== (Fraction f1, Fraction f.2) {

/ /TODO:lmplement comparison of fl to f2 return true;

}

public static bool operator! = (Fraction f1.

Fraction f2) {

return! (f1 =:= f2) ;

}

}

public class OperatorTest {

public static void Main ( ) {

Fraction f1 '" new Fraction ( 1, 5 ) ; Fraction f2 = new Fraction { 2, 5 );

/ / Add the Fractions Fraction f3= f1 + f2;

/ /Display the result Console.WriteLine("fl + f2 = {O}/{l}",

f3 . Numerator, f3. Denominator) ;

'ji

~160

PnAN II : N gan ngil (

99: 100: 101: 102:

IISubstract f2 from f3 should get £1 £3 == £3 - £2;

Console.WriteLine{"£3 - £2 = {O}/{l}", £3.Numerator, £3 . Denominator };

103: 104: 105:

IIPrint £3 as a double Console.WriteLine{"f3 as a double = {O}", ldouble}f3);

106: }

107: }

4. KE THUA (INHERITANCE)

Ki'i' thua la khai niem then chelt cua thie't ke' trong cac ngtm ngi1 huong' c tuong. Ke thua cho phep nhtrng chuc nang (funtionality) va thuoc tfnh (attribute dung chung i'J trong ldp co sa (base class), va nhung lap chi dinh co th~ k{; th nhirng chuc nang.cua lap co sa, C# chi hb tro ke' thua dan (single inherit), C++ • phep da k€ thira (mutiple inheritances> va neu duqc sa dung dung each, day th sJ,! 18. diern rat manh. Tuy nhien, phai thira nhan 18. da ke thua rat kh6 quan Iy nhu v~y, ciing rli.'t kh6 ap dung. Day 18. mot trong nhilng If do C# chi phat tri€n thua don.

Htnh 2.1-1 Trinh bay trl1dng hop chung cua ke thira

Hinh 2.1·1 Kd thua co ban

Lap cC1 so' Dog se chua thuoc tinh va phuong thuc chung cho tat ca gi6 cho. Mbi lap dan xuilt co th~ cai diiit ca biet hoa them ni'i'u thily can thiet. Di~u J quan trong nen chu.y rang C# chi cung cilp ki'i' thira dang public (xem vidu 2.1-2 Co Ie hie nay nhung ngiroi phai tri€n tren C++ se lai than phii!n.

Vi du 2.1-29 Kt: thua

1: IIFile :part02_2B .cs

2: IIPurpose : Demonst;.rate basic inheritance 3: /I

CHI,141N:G 2-1:.Ca<: vitn d~ eo ban ella C#

161\!j

4 :

5: using System; 6:

7: public class Dog { 8:

9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
~ 19:
20:
21:
22 :
23:
24:
25:
26:
27 :
'28 :
Ig
(t
I), 29:
,i 30: .
31:
32:
33:
34 : / /Common attributes public string Name; public int weight;

/ /Common methods

public void Speak ( ) { Console.WriteLine("ruff!");

}

public void DrinkWater ( ) { Console. Writelfne ("Gulp") ;

}

}

II Lap M thua

public class GermanShepard : Dog { public void OnGuard ( ) {

Console. writeLine ("In Guard Mode");

}

}

public class JackRussell : Dog { public, 'Void Chew { ) {

Console. WriteLine (" I'm chewing your favorite shoes!");

}

}

public class Inherit {

public static void Main{ ) {

~162
35:
36:
37 :
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52: }
53: } pHAN II : N gon ngil C#

GermanShepard Simon = new GermanShepard ( ); JackRusse~l Daisy = new JackRussell ( );

//Both Simon and Daisy have a name and weight Simon. Name = "Simon"; Simon.weight == 85; Daisy. Name == "Daisy"; Daisy.weight = 25;

Simon. Speak ( ); Simon.DrinkWater{); Daisy. Speak ( ); Daisy. DrinkWater ( ) i

I/Only Simon has the OnGuard Method Simon.OnGuard( ),

//Only Diasy has the Chew method Daisy. Chew ( );

Hmh 2.1-1 duqc phat trilln trong C# va duoc th~ hien trong vi du 2.1-29 Nen nhc rAng C# chi h6 trq ke thua dan, VI v!j.y khong tM tao lap dan xu at tlt ha:

I6"p CCf sa tro len. Cu phap M ke" thira tl1 mQt lop co sa 113. di!-t ten cua lop co sa ( ben phai dau hai cham thea sau ten cua lop dil.n xuat nhir trinh bay sau day:

class Bar: Foc ()

'Prong truong hop nay, Bar Itt lap dan xuat va Foo 113. 16p CCf sd.

5. DA HINH (POLYMORPHISM)

Trung thuat, ngl1 l!j.p trlnh hudng doi tl1qng, kha nang ghi de phuong thu cua lop co sa va cung cap mQt phat tri~n khac a trong lap dan xuat la mot hln tlure co ban cua khai niem da hmh,

Hay xem xet vi dl,l trudc, trong d6 GermanShepard va JackRussell dl1lJ dan xuat tit 16p co sa chung Dog. Lap co sa Dog cung cap phuong thirc Speak dire cac lap dan xuat thua ke. Tuy nhien, neu ban da tUng nghe thl. gi6ng Germe Shepard sua se khac voi giong Jack Russel, chang sua khong gi6ng nhau. Vi vi!. lap co sa Dog phai cho phep cac l{Jp din xuat cung cap phat tri~n phllClng thi Speak cua rieng' chung.

CHUdNG2.1: Cac vAn d~ C(J ban cua C#

1631!al

C# cung cdp ttl khoa virtual de chi ro hi phuong thirc co tM bi cae lop dan xu§t ghi de (overridden). Mi,lt lap dAn xuat co thg ghi de phuong thuc virtual b/l.ng each stl dung til khoa override.

Class Dog{

public virtual void Speak() { ... }

}

Class J'ackRussell : Dog{

public override void Speak () { ... }

Sue manh thirc su cua da hinh (polymorphism) tM hien khi kiii"u cua dOi tuqng (object type) chua xac dinh {j thai diilm bien dich chuang trmh, Di~u filly cho phep thong tin kiilu luc thirc thi (runtime type) dugcsU' dung M xac dinh phuong thltc thuc S\! duqc goi, Vi du 2.1-30 cap nhat lap co sO- Dog va cung cap phuong thltc eo speak.

Vi du 2.1-30 Phlidng thuc 80 (virtual)

1: //File ;part02_28.cs

2: //Purpose : Demonstrate basic inheritance 3: /I

4 :

5: using System; 6:

7: public class Dog { 8:

9: //Conunon attributes

10; public string Name;

11: public int Weight;

12:

13:

14: //Common methods

15: public virtual void Speak ( ) {

Console.WriteLine("ruff!");

}

16: public void DrinkWater ( ) {

Console. WriteLine ( "Gulp" ) ;

}

17 : /18: } i 19:

20: public class GermanShepard : Dog {

It! 164

PHAN II : N gOn ngtl C

21:

22: public void OnGuard ( ) {

Console. Wri teLine ( " In Guard Mode" ) ~ }

23:

24: / /override the Dog. Speak () method

25: public override void Speak ( ) {

Console. Wri teLine ( "RUFF, RUFF I RUFF" ) i

}

26: } 27: 28:

29: public class JackRussell : Dog {

30: public void Chew ( ) {

Conso 1 e . Wr i t eLine ( " I I m chewing your .' fav¢>rit;~!,~~oes!" ) r'"

}

31:

3 2 : / / overr ide the Dog. Speak () method

33: public override void Speak ( ) {

Console .WriteLine ("yap,yap,yap");

}

34: 35: } 36:

37: public class Inherit 38:

39: public static void Main( ) {

40:

41: GermanShepard Simon 7' new GermanShepard ( );

42: JackRussell Daisy = new JackRussell ( );

43:

44: / /Both Simon and Daisy have a name and weight

45: Simon.Name ;:;: "Simon"; Simon. weight;:;: 85,

46: Daisy. Name = "Daisy"; Daisy.Weight = 25;

47:

48: Dog d ;:;: Simon;

49: d.Speak( ) iI/calls GermanShepard. Speak ( );

50:

51: 52:

d = Daisy; d. Speak ( };

Ilcalis JackRussell. Speak ( );

cmroxc 2·1: Cacvan d~ co ban cua C#

165;1MI

53·.;

54 : .55: }

Bay gia vi du ve ke' thua sau khi slia lai da sa dung phuong thuc ao Speak. ell hai lop ddn xulft GermanShepard va JackRussel deu phat tri~n d~c biet hoa P~~(/!lg thac. Speak cua lop co So' Dog.

CM Y vi(\c khai bao bien ki.§u Dog va khdi tao cua n6 tham chieu di!n Simon. D~y mdi la di.§m thu vi. Khi phuong thuc Speak diroc goi, ki~u cua dOi tugng dugc dinh nghta va dua tren thong tin nay, phat trien phil hop vdi phuong thuc Speak duoc goi, Trong trunng hop nay la GermanShepard.Speak(). Theo sau lai goi d.Speakt), bien d duqe gan tham chieu de'n Daisy. M(\t Mn mra, d.Speak() lai duqc goi va thong tin ki€u duqc truy xuat M dinh ra phuung th(tc phil hQ"p.

-I,'

. Da htnh (polymorphism) tM hien rn(\t rn6 hlnh manh me trong the' gidi

huang i:tllt tugrig. Khi duqc sli dung dung each, cac thanh phan c6 the tiro'ng tao Ih nhau mil kh6ng can phai c6 nhtrng kien true ri(ing bi(\t.

6. GIAO nI:¢N (INTERFACES) H04,C GIAO TIEP

. .

Giao dien (Interfaces) cung cap hlnh thuctruu nrong hoa rilt thuan tii;:n cho ,vi~~ ph~t trienJheo pho~g each xaY dlJng theo thanh phan C<1 sa (component'~d)\J'1ntlfae~'scUrtgCap nhilng th03 thu4,richung ehopnep c~c .thanh pMn lam vi~c v6'i nhau. Trong mQt truClng hop C1,l the hem, dong he. bao thirc duqc dl!.t ben canh giuang cua ban, phat trien rat nhieu interfaces-alarm interface, Clock interface, va con co the la Radio interface.

Hinh 2.1-2 ve rnQt thanh phan AlarmClock trong d6 co he. trc mQt Alarm interface, mQt Clock interface va rnQt Radio interface.Hlnh 2.1-2 duoceoi nhu la mo hinh hQp mu6ng, trong d6 cac muong la nhung duong' thang vdi nhirng vong trim a dAu va phan du6i muong dinh vao pMn ngoai cua hQp.'

r Alana Clock

Alarm r---- ----{=.I

Clock ----------i~~

Radio

f--~--~~. ~~

~ ... _ .... ....J

Hinh 2.1-2 AlarmClack component ua interfaces

MQt interface kh6ng phai la mQt I6'p, va do d6, cung khong co bat clt rna cai ~t nao, MQt interface chua cac khai baa cua cac thanh phan (members) va cac phuong thli'c (methods), trong d6, tat cil. d~u phai khai bao public. C# cho phep ca struct va lop cai dat mQt hay nhi~u interfaces. Bi~u nay khac hlin viec ke thita (inheritance). Ke thira lit vi~e cai d~t mQt lop tit lop co sO', con cai Mt interface thl chi xac dinh ra rAng lop se phat tri~n mQt interface dac biet, va cam doan se 'hoan thanh interface nhu da d~ ra.

~166

PHAN II : N gon ngil C#

C# sa dung tU khoa interface d& thi1 hien viec khai bao cua m(it giao

dien,

interface name { body;

}

M(it lOp hay struct co tM cai di).t m(it interface bAng vi~c khai bao interface trong qua trinh dinh nghja, Vi du:

public class AlarmClock IAlarm, IClick, IRadio { / / cai d~t.

Chu y: M9t quy uoctieu. chudn dp dlfng khi khai baa interface La ten ctia interface nen duoc btlt ddu Mngky tlj cliii [ hoa. Quy uoc each. dat ten nay tid hi~n tinh nluit quan va giup dt? dang pluin. bi~t ddu fa interface , trtinli slj nluim. ldn veri dinh. nghia cua lop va struct.

Kien true .NET sa dung thirong xuyen cac interface. MQt dieu chao chan la, d& tan dung l1U di@m cua moi service dl1gc eung cap bdi .NET, ban MtbuQc phai higu ra each phat trign va cai di!,t doi voi interface. Vi du 2.1-31 se cai dlj.t lap AlarmClock th& hien tron veri interface du'gc trinh bay trong hinh 2.1-2.

Vi du 2_1-31 1.0 AlarmClock

1: / /File ~part02-,-30. cs

2: II Author: Richard L. Weeks 3: IIPurpose :Interfaces

4:

5: using Sy-stem; 6:

7: / / dinh. nghla [Alarm interface 8: interface IAlarm {

9: boolOn { get; set; }

10: void Snooze ( );

11: }

12 :

13: / / dinli nghia IClock interface 14: interface IClock {

15: void SetTime ( ); 16: }

17 :

18:

19 : I / djnlz nghla the !Radio interface 20: interface!Radio {

21:' 'void SetStation( double station_id ); 22: }

23:

elIltdNG 2·1: Cae vAn d~ co bancua C#

1671B

24: 25;

26: ,I [Tao lapAlarmClock cdi d(tt lAlarm, [Clock va !Radio

j'f: ':pubiic Class AlarmClock : IAlarm, IClock, IRadio { flh

U't / /Data members

3br" private bool m_bOnOff; 31;j" '

)'!h :U: 34 :

/ /The IAlarm interface implementation public bool On {

get { return m_bOnOff; } set { m~bOnOff = value; }

35:,

}

public void Snooze ( ) { Console.WriteLine(IIAla:pn.Snooze"};

.~-I.J

36: 37: 3.8't '

/ /IClock Interface

public void SetTime ( ) { Console.WriteLine("IClock.SetTime");

}

39=

40: / IIRadio interface

~l:i public void SetStation{ double station_id ) { Console.WriteLine(IIIRadio.SetStation( {O} ) ", station_id ); }

42:

43: .i~~~f~~:~-'-~·~D-j~;;

45:

46: public class InterfaceTest {

47: public static void Main (. ) {

48:

49: AlarmClock a = new AlarmClock( );

50:

51: / /Get the IAlarm Interface

52: IAlarm La La rm e (IAlarm) a;

53: ialarm.On =: false;

54: ialarm.Snooze( );

55:

56: / /Get the IClock interface

57: Iclock iclock =: (IClock) a;

58: iclock.SetTime( );

59:

60: / /Get the IRadio interface

61: IRadio iradio =: (IRadio)a;

62: iradio.SetStation{ 98.1);

~168

PHAN II : Ngon ngClC#

63: }

64: }

Hmh 2.1-2 duoc tri~n khai trong vi du 2.1-31. Toan tli ep ki~u dligc sll dung M nhan duoc interface yeu cAu (xem dong 52 cuavf du 2.1-31). Interface IAlarm duoc sli dung bdi tM hien cua AlarmClock. Trang truorig hop lap AlarmClock khOng hO tro IAlarm interface, ngoai l~ InvalidCastException sli duoc phat sinh. Neu interface tbn tai, mot con tro den bien AlarmClock sli diroc tra v~. Nhu v~y, bay gier ta co hai tham chieu Mn AlarmClock, mQt la tham chieu cua bien AlarmClock, hai la tham chieu Mn IAlarm interface. ell. hai tham chieu nay Mu dliQ"c giai phong trudc khi GC thu gom the hien cua AlarmClock.

7. Me) HINH CHUYEN GIAO (DELEGATES)

Delegate la can tro ham co ban. Lap trinh vien C va c++ rat quen thuoc voi can tro ham (function pointer) nhung khong co y niem v~ th~' hien (instance) cua mot con tro ham. Mi)t delegate co th~ hi~u nhu lit me)t co che callback, co nghfa la "Khi dung thai di€m , hay ggi phirong thuc nI\Y cho tOi".

Hay xem xet kich ban sau: Be) phan lam viec cua ban vira moi thue mot nhan vien moi, Bi} phan Nhan sl! ciin duQ'c baa khi co nhan vien mdi ducc thue M ho co th€ thu xep tien hanh hang 101;lt nhtrng cong vi~c s8 sach gia'y to ruom ril cung nhu ra sue huan luyen nhii.n vian rndi v~ quy ehe cua c6ng ty cCing nhu cong ~ae huan luyen nghiep vu, Nhirng cnng viec cue nhoc nay cua bi) phan nhan su cu lap di lap lai. Bay chinh la vi du hoan haocho mQt Delegate. Co bin la, Bi} phan nhan 8\1" dOi hoi dliqe thong bao khi co nhan vi en mdi dliqe thue va sli cung cap )oi ggi M thuc hien mot phuong thuc, Vi du 2.1-32 trmh bay each sU' dung co ban cua delegate.

Vi du 2.1-31 1,0 AlarmClock

1: IIFile

. 2: 1/ Author: Richard L. Weeks

3: //Purpose : Demonstrate the use of delegates 4:

5: using System.; 6:

7: IIDefine a person struct 8: public struct Person {

9: public string FNamei

10: public string LNamei

11: }

12:

13: ! I dinh. nghia Delegate

CHUaNG 2-1: Cac va'n d~ ca ban cua C#

169~

14: public delegate void OnNewHire ( Person person) ; 15:

16: 1/LIJpHR

1'1: public class HR { 18 :

19:

20: public void OnNewHire ( Person person) {

21: Console. WriteLine { "HR is in the process

of putting {O} to sleep", person. FName ) 1

22: }

23: } 24:

25: IICreate a department

26: public class Department { 27 :

2Ef: I I Who to notify

fl9: private OnNewHire m_OnNewHireDelegate = null;

30:

31,: Iiset the OnNewHire delegate

32,~ public void AddOnNewHireDelegate ( OnNewHire onh ) {

33l m~OnNewHireDelegate = onh;

3:4: }

3'5:

36:

3,7: public void HirePerson ( Person p ) {

38: lIdo we need to notify someone?

39: if ( m_OnNewHireDelegate ! = null

40: m_OnNewHireDelegate ( p ) ;

~1,; }

42: ,} 43:

44:

45~ pU:blicclass DelegateTest { 46:

47: public static void Main ( {

48:

49: HR hr = new HR ( );

50: Department dept = new Department ( );

~170
51:
5;2 :
53:
54 :
55:
56:
57:
58:
59:
60:
61: } PuAN II : N gOn ngir C#

//Register the OnNewHire Delegate

dept • AddOnNewHireDelegate { new OnNewHire ( hr.OnNewHire ) );

//Create a person

Person me; me.FName = "Richard"; me. LName = "Weeks";

//Hire ME!!!

dept. HirePerson ( me ) ;

Vi du 2.1·32 cai dat kich ban lam viec cua bi? phan nhan s .... va Sll' dung Delegate dg thong bao cho b(> ph1).n nhan s .... khi co nguoi rndi duoc thue, Delegate OnNewHire diroc dinh nghta d dong 14 Hay chu y each Sll' dung cua til khoa delegate Iii M chi ro Delegate duoc khai bao. Nen nhrr rling, C# khong cho phep khai bao phuong thtrc toan CI,lC, vi v1).y C# se phat sinh L6i ne"u ban thieu tlt khoa delegate.

Ldp HR cung clip mi;it trinh di~u khien cho Delegate. Ten cua phirong thrrc khong nhat thiet phai d~t trung ten vdi Delegate, viec d~t trung ten 0- day nham cho cac ban d~ thea doi han. Lap Department cung clip phirong thuc AddOnNewHireDelegate M dieu khien viec ket noi vdi trinh ditlu khi~n cua Delegate. Lei goi ham d dong 53 moi th .... c s .... ghep trrnh dicu khien delegate cua HR cho Department. M(>t delegate Iii mot kii\u trong C# va doi hoi phai Ia m(>t th~ hi~n, do do phai sll' dung tlt khoa new M tao m(it Delegate maio Chung ta se g~p lai DeLegate th1).t chi ti€t 0- phan sau bdi vi no duoc sa dung thuong xuyen trong .NET, d!).c biet la trong viecphat tril\n Window Forms.

8. KET CHUdNG

Bay gio c6 Ie ban da bi€t La C# rat manh me va cling rat de dung. PMt tril\n hl1dng giao dien Iii d~ tai n6'i bat trong nhirng narn gan day, va C# dl1qc thiet k€ thea hurrng nay voi phong each phat trien dan gian va nhat quan. Dac biet vai sl,i blS sung them khai niem chuy~n giao Delegate, C# cang tro- nen mot ngon ngil" manh me. Chucng ke ti€p se ban v~ nhtrng chit d~ nhu t1).p hop Collection, thui;ic tinh Attributes, va su he. trq XML.

) r

ChuClng 2.2

C#NA.NGCAO

Cae vein d~ chink se duue d~ eqp d€n: ¥' Tqp hr;rp (Collection) ctia .NET.

¥' DtJc tinh Attribute .

./ Twin trj hoa XML Serialization

1. T1).P HQP (COLLECTION) CVA .NET

T~p hop Iii noi chua mQt danh sach cac dOi tI.1gng tuong' W mango Khong bao lit! c6 mQt ~p hop cu tM danh rieng cho oac doi tllgng nhu nhan vien, xe hoi, nha ,<\I)a,.x,e cQ .... NET cung ca"p cho ban mi}t lop dOi tI.1gng t6ng quat Collectionsc6 ihlta I\iI,ng. chua tat ca cac doi tucng,

Cac lap doi tucng t~p hop trong cn phai cai dat giao tiep (Enumerable.

Giao tiep IEnumerable cho phep duyet qua nhung phan tlt chua trong t~p hop. Trang chuong nay chung ta se xern qua nhirng ~p hgp sau: Stack, Queue, va -Hashtable .. Cung vdi nhung t~p hop co' ban nay, chung ta se cai di).t danh sach lien 'kilt thee giao tiep IEnumerable.

Di biet nhung thong tin chi tiet v~ t~p hop (collection), cau true dtr li~u I.(~t\\ structure), va nhung thuat toan (algorithm). Ban nan doc nhung eu6n sach '~au ~ Algorithms C++ by SedgeWick, The Art of computer programming, Volume 3

.!>J.P. , .. o.!,1a. ".l. ? ~.n~.t. b.

~tfi:'St~~k .' .

Stack dai dien cho co che' FILO (First in last out - vao trtroc ra saul, va lap chua dl,l'ng (container). Gia thiet co biin eua stack lA di).t nhimg ph An tLc triln dlnh cua stack va la"y nhirng phan tLc ra tCf dlnh cua stack. Trong en, System.Collections.Stack (nhm vi du 2.2-1) cfing cai di).t giao tiep IEnumerable, giao tiep IEnumerable quan tam den viec li~t kil nQi dung cua Stack.

Vi d •. 1 2.2·1 : System.Collection.Stack

1: using System;

2: using System.Collections; 3 :

4: public class StackTest { 5 :

6: public static void main ( )

,7 :

8: Stack myStack = new Stack ()

(!J 172

PHAN II : N gon ngi1 C#

9 : 10: 11: 12: 13: 14: 15: 16:

17:

18: 19: 20: 21: 22: 23: 24: }

Mil chuong trinh trong vi du 2.2.1 cho tha'y each sit dung co ban v~ stack.

Nhtrng phdn tli duqc dl!-t VaG stack vadugc la'y ra theo thli' t1,l' ngllgc lai, Stack. hUll dung cho nhirng thuat toan de qui va c6 th€ phuc vu nhu nhtrng noi tiep nhan du li~u tam

for (int i = O;.i < 10; i++) myStack. Push (i) ;

for (int i = 0; i < 10; i++J Console.WriteLirie("{O}", myStack.Pop() );

for (int i = 0; i < 10; i++l myStack.Push(i) ;

foreach ( i nc i in myStack) Console.WriteLine("{O}", i);

1.2. Hang d«;ti (Queue)

Hang dgi dai dien cho t~p hop c6 tinh nang FIFO (First in First out - vao tnrcc ra truce). Hang dqi cung cap nhirng phirong thuc Enqueue va Dequeue M dua nhung phin tt.l' VaG hangdci va lAy nhting phan tt.l' ra khoi hang dqi. Cung nhu vCli tift cii nhung t~p hop collection khac cua .NET, t~p hop queue eilng cung cAp giao tiep IEnumerator. Vi dt.l2.2c2 sli dung Queue duoc cung cap bdi .NET dg giiii thich vi~c sli dung chirc nang co ban' cua hang dgi

Vi d", 2.2-2 ; Hang dqi

;L: using System;

2: using System.Collections;, 3 :

4: public class QueueTest ( 5 :

6: publicstaticvoidMain() {

.1:~!· ,'-::-:;;/,

8 :

9 : 10: 11: 12 : 13: 14: 15:

Queue myQueue = new Queue ( ) ;

j I dgt cdc pluin tii: vao hang dr;1i

for ,lint i = 0; i < 10 ; i++) myQueue.Enqueue(i) ;

I / Empty the queue

for (int i = 0; i < 10

i++)

I

rlr;

.. i d u ~.2-:1 : Has lrtab!e

~lUtdNG .2·2: :Clnang cao

17311J

16: 17; . 18:

19: 20: 21: 22: 23: 24:

fi5 : f!6:,

1.3. Bang bam hashtable

Console.WriteLine("{O}", myQueue.Dequeue());

/ f dien. ddy dilli~u vao hang dqi mot [lin nila for (i n t i = 0; i < 1 0 ;i + +) . rnyQueue.Enqueue(i) ;

foreach (inti in myQueue) Console.WriteLine("{O}",i) ;

. }

Bang bam Hashable hU"u dung khi ban can luu d6i tirong' va truy xuat chung theo kh6a. 'I'hci gian tim kilfm cho hash table Iii. nit nhanh. M6i khoa duoc dung M pil:!itsinh'l gia ttt bam (hash value), hash value nay hoat dQng nhu mot chi muc cho'd6i tliQ"ng trong t~p hgp.Khi c6 y~u cau truy xuAt den 1 philn tli xac dinh, thi gia tribam cua kh6a dliQ"c tinh toan va phan tu- truy xuAt duoc dinh vi. N6i chung, bang bam hashtable khong tie"t kiem bO nhc M do5i lAyt6c dO, vacon tuy thuoc r~?, ~~h s,u- dt,mg.vi ~\l 2.2-3 se minh hoa each su- dung hang bam

lF using System;

2': using System.Collections; 3:

,,: struct Person {

.i.;,;'I!I';§".;rt;;r·::;~~licJ?~rso~ ( st,ring f I stringl) r.

~ijI~:"" .. ", t. P'N'ame :: f; LName = l; }

6: public string LName;

7: public string FName;

"

8: } 9:

1\0; public class Hashtable'i'est ( 11:

12: public static void Main () {

13:

14 : Hashtable People = new Hashtable ( ) ;

15:

16 : / I Them VIlO da'i tuang Person

17: people.Add( "Smith", newperson("Jim",

"Smith") )";

:1,.8: People. Add ( "Jones", new Person ( "Dawn" ,

"Jones"»;

1J174

PHAN II : Ng6n ngl1 C#

19:

People.Add( "Powell", newPerson("Bob", "Powell"»;

20: 21: 22: 23:

I I Tim kiem Jim Smith

Person p = (Person) People [ "Sni.i th" ] ; Console. wri teLine ( .. { O} ", p. FName,

p.LName) ;

24: }

25: }

MQt chu y quan trong la bang bam hashtable se khOng cho phep 'nhieu han 1 muc dung chung gia tr] kh6a. Neu lam nhu vay bang bam hashtable se nern ra 1 ngoai l(! ArgumentException.

2. DANH SACH LIEN KET (LINK LIST)

D~ nhan manh tlim quan trong cua nhirng giao tiep va tinh rna rQng cua kien true .NET, mQt t~p hop danh sach lien ke"t dliqc dira ra cai d~t giao tiep !Enumerable va cung cap doi tl1qng tiep c~n !Enumerator. Ban co th~ sti dung cau ll\tnh foreach d~ duyet nci dung cua danh sach lien keto

Danh sach lien ket cai d~t trong vi du 2.2-4 vdn chua dliy duo Nhu la mot

. hai t~p, ban :nen rna rOng c)lltC nA~g eua danh sach lien k~t. ,Vi du Iri&rQrtg nay g6m kha nang cung cap 1 phuong thirc M them nhtrng muc tai, nut cuoi cua danh sach hoac tai bat ky vi tri nEW trong danh sach. Vi du nay cung' co tM xac dinh 1 doi tliqng CI,I th€ hen trong danh sach. OIiU y : giao tie'p IComparable se duqc stl' dung vao khi clin thie't).

Vi du 2.2-4 : Danh srich lien keto

1://File

2 : / / Author : Richard L. Weeks

3: //Purpose : Implement a linked list that supports the IEnumerable interface

4: 5 : 6 :

7 : using System;

8: using SyStem. Collections i

9 :

I

t:HUONG 2·2:C# nang cao

1751RJ

10: 11:

12: public class _node { 13:

14: public _node next;

15: public _node prev;

16: public object value;

17 :

18: public _node () {next = prev == null; value", null; }

19: publ ic _node (obj ect 0) {

20: value = 0;

21: next = prev = null;

22: }

23 :

24: public _node (_node n )

25:. 26: 27:

28: }

29: }

30:

31:

next = no next;

prev = n.prev;

value = n.value;

3'2: II Linked list enumerator

33: public class LinkedListEnumerator IEnumerator { 34:

35: private _node m_current = null;

36: private _node m_begin = null;

37: private m_Iast = false;

J3Sl

39: public LinkedListEnumerator (_node n) { m_current

= m_begin = n; }

40:

\11176

PHAN II : Ngfm ng(1

41 :

42: I I Implement the IEnumerator interface

! .

43: public object Current {'

44:. get {returnm_current,.value; }

45: set {m_current.value = value; }

46: 47 :

48: public bool MoveNext () {

49: if (m_last)

50: return false;

51: else {

52: m_curretn = m_current. next i

53:

54: return true;

55: }

56: }

57 :

58: public void Reset () {

59: m_current = m_begin ;

60: m_1ast = false;

61: }

62:

63:

64: public class LinkedList IEnumerah1e {

65:

66: pri vate _node m_root = null;

67 : 68:

69: IIImplement the IEnumerable interface methl

GetEnumerator()

70: public IEnumerator GetEnumerator () {

~lJdNG 2·2:1 C# nang cao

1771!!J

71: return (IEnumerator) new

LinkedListEnumerator(m_root.prev);

72: }

7.3 :

7.4:

7S: //Implement some basic methods

76: public void AddHead( object 0) {

77 : _node newNode '" new _node (0) ;

78: if (m_root == null) {

,,'

~.

,~9:. m_root = newNode;

'80:' m_root . next,. m_root;

iJj

B1: m_root . prey '" m_root;

82: }else {

83: newNode . next", m_root;

8:4': newNode • prey = m_root . prev;

iPS: m_root . prev. next = newNode;

.86:' m_root _prev:: neWNodei

',,~'7 .: m_root '" newNode;

BB: }

_r'::}.:.,.~·';·1i,:.':J:··. 90: }

91:

92:

93 :

94 :

95: public class LinkedListTest { 96:

97: public static void Main() {

98:

99:

100: 101:

LinkedList 1 = new LinkedList ( ) ;

S178
102:
103:
104:
105:
106:
107: }
108: } PuAN II : Nglln ngu C#

for(int i= 0; i < 10;i++) 1.AddHead(i);

foreach (int i in 1 ) Coneole.WriteLine(i)i

Vi du danh sach lien ket giai thich nhtrng khai nien co ban cua vi~c cai d~t nhtrng giao tiep va C# co tM S11 dung nhtrng' giao tiep nay nhir the nao. Bai vi l&p LinkedList thuc thi giao tiep IEnumerable va cung cilp thuc th~ I Enumerator , cau l~nh foreach co th~ dLigc S11 dung d~ I~p thong qua nhUng ni)i dung cua danh sach lien ket.

3. ATTRIBUTES (D4.C TiNH)

Attribute Ill. mQt khai niern mdi cua .NET. Attribute Ill. nhung the (tag) dLigc cong b6 co th.§ dliqe ap dung cho nhung thanh vien va nhtrng phirong thac khac nhau, Thong tin d6 CD thEi' dugc xem xet sa dung bdi System. Reflection API. Chi tiet va each Slt dung Reflection nam ngoai pham vi thao luan cua giao trtnh nay tuy nhien tlim quan trong cua nhimg Attribute cnng d.n phai dLige xem qua. Vi d\ 2.2-5 giai thich sa dung dac tinh Conditional dLige cung cilp Mi nhi1ng lap cua kier true .NET.

Vi du 2.2-5 : Conditional Attribute

1: /IFile

2 : II Author: Richard L. 'tJeeKs

3: IIPurpose: The conditional attribute 4: 1/

5: I ICompile instruct ions

6: Ilese Idefine:DEBUGpart02_36.cs

7: I lese part02_36. cs

8:

9: using System;

10: using System.Diagnostics;llthe ConditionalAttribut lives here

11:



mlf(INO,2.2:;C# liAng cao

179\!J

';12: ,:publicclass Foo 13!

14 : '15: '

I·~· ,

;,1,6; ,

17:

18:

19 :

20: public class AttributeTest {

.r,' : - .'

(Conditional("DEBUG")]

public void onlyWhereDebuglsDef ined () Console. Wri teLine ( "DEBUG is def i ned" ) i

~t jp iu ~h

21: pub l a c static void Main{)

22 :"" Foof = new Foa () ;

., "

23: f.OnlyWhereDebugIsDefined();

24:, '

25: }

Cach t6t nha't M higu nhanh v~ nhtrng attribute la nhin vao vi du a tren, Vi du 2.2.5 sli dung Conditional attribute, Nhu ten ella n6 ggi s, Conditional attribute dugc dung trong qua trlnh bien djch c6 di~u kien, Nhin vao dong 14. Conditional attribute duqc ap dung cho phirong thuc OnlyWhenDebugIsDefined. Phuong thirc OnlyWhenDebuglsDefined chi hQ'p I~ khi DEBUG dugc dinh nghra trong quatrinh )Jie!). dich. Chu y dong 23, tao ra 1 Uri goi phixrng thirc OnlyWhenDebuglsDefined va khOng c6 bat ky di~u k.i~n nao, Day la mQt lqi ich dugc them vao Conditional attribute. Khcng clin boc rna cluarng trlnh a tren trong dieu kien #ifdef types ella nhilng cau I~nh ti~n xii IY.

MQt di~m dang chu s. nhi1ng phurrng thtrc duge danh dau vdi Conditional attribute vdn dUQ'e tinh khi bien dich rna may. Tuy nhien, ta't ell nhi1ng Uri goi Wi phuong thirc Mu bi b6 di, Trong him dich cuoi cung, ta't ea rna di~u kien nen duoc lay ra tit qua trinh bien dich M.ng each sa dung nhirng cau l~nh tien xli Iy #if .

. NET sli dung nhi1ng attribute khong chi cho viec bien dich co dieu ki~n, rna con cho WebServices. XML va Window Services. Nhirng dj).c tinh Attribute kh6ng chi ~i¢i .han trong C#;, chliIlg cllll¥ c6 tM~ltgc t~mtMy trong ATL Server, the hi):

'm.at euaATL tit Microsc:ift.· . .

4. XML SERIALIZATION

£)6i tUQ'ng tulln tlJ h6a (serialization) la rnQt chu d~ chmh trong the gidi huang d6i tuorig (00 ~ Object Oriented) trong nhieu nam, Kha nang nhat quan 1 d6i tuQ'ng vii nhi1ng d6i tugng ket hop luon duoc quan tam va thuong duQ'c yeu cau v~ vi~c phat tri~n cua rna chuang trlnh d~c biet M xii Iy nhi1ng truong hqp cu th~.

1J180

PHA.N II ; Ngon nglJ C#

,

\ I

5. C# H6 TRQ XML SERIALIZATION

KIlIl nang cung cap mot kien true tang quat cho vi~c t~n tl,! hoa (serialization) thu'cmg yllu cAu nhUng dOi tu-;tng dong vai tro tfch cue trong tinh nhat quan cua chung.

XML dii trd nen 1 phan quan trong cua viec kinh doanh ngay nay. Voi chuin giao tiepma B2B, s1,l can: thiet cua XML dong vaitro quan trong trong vi~c phat tri~n phil.n m~m hien dai, Bdi vi XML dinh nghta khOng chi du li$u rna con metadata.

C# sli dung nhung dac tinh Attribute M M trq XML Serialization. Cac di).c tinh Attribute tan tai cho vi~c dinh nghla nhirng phain ttl' gO'c, nhimg d~e tinh Attribute con, va nhirng phlin tlt khac ben trong tai U$u XML. Di nhien, c6 mQt so nhUng yeu c;iu cc ban M M tro tudn t.,c hoa, Cac thanh vien cua lap hoac cau trac struct mu6n tuil.n tl,l hoa d~u phai 11\ public hoac co m(\t thudc tinh truy c;!.p (accessor). Neu mQt thanh vien mu6n khili phuc trd v~ trang thai trli6'c khi tu!n tl,l hoa (deseriatized), n6 phai cai d~t thuoc tinh setter tunng ((ng. Ceng co sl,! han cM v~ tudn tV h6a (serialization) cua nhUng 16'p collection. Hien nay, chi co kiE!u miing (array) co thE! duoc tuan tir hoa va chuyen v~ trang' thai phi twin tl,l (deser ialized). Di nhien, di~u nay yeu cAu ngliai 14p trrnh cung cap 1 thuQC tinh cho phep bien d1li lap Collection dang dl1qe sil' dung thanh 1 mang, vA tit mi;ltmiing thanh Collection tbich hop,

DE! dinh nghta nhUng phin ta g6c, chung ta c6 tM stl' dung XmlRootAttribute ap dung cho ldp h()~e cau true struct. Phinrng thae khai tao (constructor) eua XmlRootAttribute nhan mot chuM ten cua phan tii g6c ben trong tAi li(\u XML. Ch! co philn to: g6c (phan ttt tren dinh) yeu cil.u XmlRoot attribute. Tat ca nhtmg ph!n ttl' can chi clin dinh nghia nhUng thanh vien du<;tc nhAt quan.

[XmlRpot ("purchase ~ order") 1

public class Purchaseorder; {

II PurchaseOrderrnembers

Lop PurchaseOrder dai di';:il phan tli g6c cho tAi li.;:u XML. Mbi thanh vien ben trong lC1p PurchaseOrder se clin duQ'c qui cho la XmlElement attribute hoac XmlAttribute, can phu thu~c vao ch.inh ph!n to: duqc nhat quan nhu the' nao,

Vi du 2.2-6: Su' dung XML Attributes cho tUoln tt! hO<l.

1: I/File : PurchaseOrder.cs 2: II Author': Richard L. Weeks

3: I (Purpose: Demonstrate the basics of XML serialization 4: /I

) a

ClH1fdN02.2: C# nAng cao 18111l

5: I ICompilation instructions

6: Ilcsc PurchaseOrder.cs Ir:System.dll,System.Xml.dll 7:

8 :

9: using System;

10: using System. Xml;

11: using System. Xml. serial i zation; 12: us ing System. Coli ec t ions;

13; using System.IO;

14:

15:

16: 11/11/11/1/11

17: Define the Purch'ise Order

18: [XmlRoot ("purchase-order") ] 19: public class PurchaseOrder 20:

21: Ilprivate

22: private ArrayList m_Items; 23:

24: public PurchaseOrder () {

25: m_Items = new ArrayList () ;

26:

27:

28: IIProperties

29: [XmlElement("item")] 30: public Item[] Items {

31; get {

32: Item l l items = new Item [m_Items. Count] ;

33: m_Items.CopyTo(items);

34: return items;

35:

36: set

37: if(value == null) return;

38: Item[] items = new (Item[] )value;

r

!

i!!J 182

..

PHAN II : Ngon ngll

39: m_Items.Clear();

40: foreach (Item i in items)

41: m_Items.Add(i);

42:

43:

44:

45: //methods

46: public void AddItem(Item item)

47: m_Items .Add( item);

48:

49:

50: /1 indexer

51: public Item this [string sku)

52: get {

53: Illocate the item by sku

54: foreach (Item i in m_Items)

55: if (i. sku ~~ sku)

56: returni;

57: throw(new Exception ("Item not found" I );

58:

59:

60:

61: public void DisplayItems () {

62: foreach(Itemi inm_itemsl

63: Console.WriteLine(il;

64:

65:

66:

67:

68: 1/1//1///1//111

69: 1 IDefine an item entity 70: public class Item {

71:

72: Iii tern data

CH1.1dNG 2-2: C# nang cao

183~

73: [XmlAttribute ("sku")] public string sku;

74: [XmlAttribute ("desc") 1 public string desc;

75: [XmlAttribute ("price") 1 public double price;

76: [Xm.l At t r i but.e t "qty") 1 public int qty;

77:

78:

79: / IDefault constructor required for XML serialization 80: public Item () ()

81:

82: public Item(string sku, string Desc, double Price, int

Qty) {

83: s ku w Sk u r

84: desc =0 Desc ;

85: price -= Price;

86: qty -= Qty;

87 :

88:

89:

90: public override string ToStril1.g() {

91: object[] 0 = ne'Nobject[] {sku,desc,price,qty};

92: returnstring.Format("{O,-5} {1,-10}

${2,5:#,###.OO} {3,3}",o);

93: }

94: 95: 96: 97:

98:

99: II I

100: I IITest the XML Serialization and Deserialization

101: II

102: public class POExample 103:

104:

r-

!

.!I!!B!!!!E..1_8_4 P_HA_"_N_II_:_N----'g"-o_n_n.;=.g\l_c#\I.

105: publicstaticvoidMain() {

106:

107: 108:

109:

PurchaseOrder po = new PurchaseOrder ( ) ;

po. AddItem( new Item ( "123" , "pencial", 15,100) ) ;

110: po. Addltem ( new Item (" 321", "copy

pzrpe r " , 7 . 5 0 , 2 5) ) ;

111: po.Addltem( newltem("111","whiteout",1.35,10));

112:

113: po.Displayltems();

114: Console.WriteLine("Serialization inprogress");

115: II Serial i ze the Current. Purchase Order

116: XmlSerializer s = new

Xm1Serializer(typeof(PurchaseOrder)) ;

117 : 118: 119: 120: 121: 122:

TextWriter w = new StreamWriter ("po.xml") ; s.Serialize(w,po) ;

w.Close() ;

Console. W:riteLine (" serializat ion complete \n\n") ;

123: IIDeserialize to a new PO

Console. Wri teLine ( "Deserialization in progress ") ;

124: 125 : 126: 127: 128: 129: 130 : 131: 132 :

PurchaseOrder po2 ; II = new PurchaseOrder ( ) ; TextReader r = new StreamReader ( "po. xml") ; po2 =: (PurchaseOrder)s.Deserialize(r]; r.Close() ;

Console. Wri teLine ( "De s e r i a Li z a t Lori complete") ; po2.Displayltems();

Vi du 2.2-6 minh hoa each C# hb trq XML Serialization. Mi)t Mn nO'a, lap PurchaseOrder dr,ti di~n cho pMn tlr tren dInh trong t!i li~u XML. LOp PurchaseOrder chlia dl,ing mQt ArrayList, ArrayList nay chira nhilng pMn ta dttqc dua V80. HOi vi hi~n nay .NET chua hb tr(,1 viec tu'n tl,l' h6a nhi1ng ldp chira d.,mg (container), vi~c cung cii'p 1 thuQc tinh cho phep chuy~n ddi ArrayList thanh mQt

CHlfONG 2·2: C# nang' cao

185l!J

mang;va,ngtCc;1e lai la rat elin thiet. Dong 27 dinh nghta phan til XmlElement cho m~e hang. ThuOc tinh nay dligceai d~t nhu phep bien d3i ArrayList thanh rruing ki~u Iteml],

D~ phi tUAn tl,l' (deserialized) 1 d6i tuqng, 16p hoac cau true struet ban cAn cung cfip 1 phinrng thac khdi tao (constructor) mac dinh, Trong trirong hop cua 16P Item (boi vi chung ta dii dinh nghta 1 Mi so' cho phinrng thirc khdi tao co su) can mOt phuong thtrc khdi tao mae dinh ma khong c6 d6i so', vi v~y Mi tlic;1ng duqc tao 1 each nang dOng tl).i thai di~m chay, Vii\\c dinh nghta cMng (override) phuong thirc ToString cua ldp Item khong d6ng vai tro trong XML Serialization. S\I t6n tai cua no chi eho phep ket xuAt dong dulil.l:u (stream) ra man hinh (console).

Di twin tl,i (serialize) PurchaseOrder, ta dn tao mQt tM' hien cua n6 dua vao cac muc item vao d6. Tiep. theo la vii;\c tao 1 tM hien cua d6i tuqng XmlSeriaIizer. Doi tligng XmISerializer M trg mOt vai nhung phunng thac kMi tao tmh den thong tin phan til' phu - khong gian ten mac dinh va ten phan tLi g6c. d vi dl,l nay, chi co ki~u d6i tU~1ng dliQ"c truyen vao,

D6i vdi nhUng ngimi quen thu.uQc COM Serialization tncac dAy, thi khai niern dong hay luong (stream) khOng phai la khainlem xa 11;1. n6 dan thudn chi 18. mQt luong dO' lieu cho phep ket n6i tai co sa du lieu, t~p tin M th6ng (File system). hoac tham chi 18. 1 ddu cu6i ke't n6i mang <Network socket).

Khi PurchaseOrdE!~' duQ'c thl,ic thi, doan rna XML sau 1a ke't qua cua viec tuan t'! h6a.

<?xml version="l. Q" encodingo::"uft-8"?>

<purchase-order " •

xmlns:xsio::''http://www.w3.orgI200l/XMLSchema-instance''

xmlns:xsdo::''http://www.w3.org/2QOl/XMLSchema>

<item sku="123" desco::"p,encialII price="O.15" qty="lOQ" I> -c i tern sku=" 321" de s c e " copy paper" price=" 7 . 5" qty=" 25"

I>

<iternsku="lll" desc="whiteout" price="1.35" qty="lO" />

</purchase-order>

Tie'n trmh cua vi~c khOi phuc sau khi tudn tl,i hoa (deserialization) co ban thl,iC hi(\n theo cung each. XmlSerializer su dung Reflection API d~ xiiy dl,l'r.g nhUng dOi tu'gng cAn thie't va gan cac Attribute cung nhCi'ng phAn til' cho muc hang item.

Bay gia M lam mOt di~u gl d6 thu vi. thay vi tao ra chuan tuiin tl,i h6a te nhat cua cac d6i tuqng, chung ta se tao ra mOt chuang trtnh Finite State Machine sU' dung XML. Dua tren trang thai va nhUng san phl:'lm dllqc dinh nghia cho cll may, chUng ta dua vao mQt chu6i kj hi(\u dung cho sl,i xii It. Hinh 2.2-1 ma tei

\1186

PHAN II : Ngon ngil C#

r

I

trang thai cua chuang trmh FSM nho, FSM se duoc hien dien trong rna chuong' trinh SLe dung XML serialization duqc cung ca"p boi .NET.

Y

)C,Y

Hinh 2.2·1 Ba trangtluii ctla FSM.

XML roo ta trang thai may trong hinh 2.2-1 nhu sau :

-c Pxrn l, version=" 1 . O"?>

<fsm xmlns:xsi~''http://www.w3.org/1999/XMLSchema-instance''

xm l n s : xs de ''http://www . w3. org 119 99/XMLSchema" s t a t e jc ount;

= It 3" >

<state name ="a" is_start="true" is final="false" production_count="2">

<production token="x" state="b"l> <production token="y" state="c"/>

</state>

-cs t a t e riame e s b " is start="false" is f i ria Le v f a Ls e " production_count="2">

<production t okeri» "x " state="c"/> <production t o k erie v y " state="b" /> </state>

<state name ="c" is start="false" is final="true" production_courit=" 2" >

<production token="x" state="C"/> <product ion token= "y" state=" c" I>

C#

csudNG 2·2: C# nang cao

187~

ng </state>

</fsm>

1 :
2:
3 :
4 :
5 :
6 :
7 :
It 3 :
9 :
10:
11:
12:
13:
14 :
15:
16:
17 :
18:
19:
20:
21:
22 : Phan ttr g6c fsm dinh nghia Finite State Machine. fsm chua dung nhi1ng trang' thai khac nhau, va mOi trang thai chua dung' nhi1ng san pham rna n6 ha tro.

Doan rna chuong trinh xii Iy cua State Machine duqc vie't rat co dong nham giai thich kha nang cua XML Serialization. Khi doan rna dan gian nay duoc cai di!-t, no se nhac nM ngtiO'i slt dung cho vao mot chudi ky hieu M xli IY. Vi du, chuoi ky hieu xyxyxxy duqc xern la rn{\t chuei hop l~, trong khi chuoi xyxy thi khong hop l~. Chi nhi1ng chudi dau hieu ket thuc Cr trang thai cu6i cung rn6i duqc xern xet hop 1~.Vi du 2.2-7 se cai dlj.t FSM rno til trong luu dii 2.2-1.

Vi d", 2.2-7 : Cai d~t FSM vui X1'V1L Serialization.

I/File : part02_38. c s

// Author: Richard L. 'Aleeks /11111///11//1111

/IPurpose : Make use of XML Serialization to implement // afinitestatemachime

/1

II

/I

using System; using System. Xml;

using System. Xml. Ser i a Li z e t i on , using System. IO;

///11/11///111//1/1/1/ liThe FSM class [XmlRoot (" fsm") 1 public class FSM {

Iidata members

private int m_Stat2Count;

BlSS

PHAN II : N gon ngil'C

23:

24: [XmlAttribute("state_count")]

25: public int StateCount {

26.: get return m--,StateCount; }

2·7: s'et

2l1: m_StateCount '" value;

2 9: State", new State [m_StateCount] ;

30: 31: 32:

J3! 34: 35:

36:

37: public bool ProcessString (string s) (

[:xml~E 1 e~~l1t " S tat. 'e" ) J

public Stater] States = null;

38:

39: State CUrrentState = GetStartState () ;

40: Console.WriteLine("Start state is (O}",

CurrentState.Name) ;

41: IIProcess the token string

42: for(int i c- O;i<s.Length;i++)

43: string next_state =

CurrentState.ProcessToken(string.Format("{O}",s[i]») ;

44: if (next_state! = "")

45: CurrentState = GetState (next_state) ;

46: else {

47: Console;WriteLine(

"No product ion from {O} wi th token {I}", CurrentState.Name,s[i]);

48: return false;

49:

50: Console.~riteLine(

"Current State => {O} ". CurrentState. Name) ;

51:

cHt1dNG 2·2: C# nang' cao

189~

52:

53: return CurrentState. IsFinal;

54 : 55 :

56: private State GetState (string state_narnel

57: IILocate the state name

58: for ( i n t i=O; i<States. Length; i++)

59: if(States[i] . Name == state_na.me)

60: return State[i];

61: return nu Ll :

62:

63:

64: private S.tate GetStart3tate () {

65: for(int i = O;i<State.Length;i++)

66: if(State(i) .IsStartJ

67: returnState[i);

68: returnnull;

69:

70:

71:

72: 1111111111111111111 73: IIState class

74: [XmIRoot("state") J 75: public class State { 76:

77: private string m_Name;

78: private boolrn_lsStart;

79: private bool m_IsFinal;

80: pri vate int m_ProductionCount;

81: 82:

83: [XrnlAttribute ("name") ]

84: publ ic string Name (

85: get {returnm_Name;

(11190

PHAN II ! N gon ngi1 Ct

set { m_Name ::: value; }

86: 87:

88:

89: [XmIAttribute("is_start")]

90: public bool IsStart {

91: get { return m_IsStart;

92: set { m_ISStart ::: value;

93:

94:

95: (XmlAttribute("is_final") I

96: public bool IsFinal (

97: get { return m_IsFinal;

98: set { In_IsFinal ::: value; }

99:

100:

101:

102: 103: 104: lOS: 106: 107: 108: 109: 110: 111: 112: 113: 114 : 115:

[XmlAttribute("production_count") J public int ProductionCount (

get return m_ProductionCount;

set

Productions" new Production [value] ; m_ProductionCount ::: value;

[XmlElement("production") I

public Production [1 Productions -= null;

public string ProcessToken (stri.ng token) II loop through the product ions and

return the name of the next state

116: for(int i:::O;

i < Productions. Length; i++) {

cHl1dNO 2·2: Cit. nang cao

191~

117: Console.WriteLine("State (O} is evaluating

token {1}",

m_Name, token) ;

118: Console.WriteLine( "Testing Production {OJ

{1} " ,

Productions[iJ .token, Productions[i] .state);

119: if(Productions[ij . token ~= token)

120: return Productions[iJ .state;

121 :.

122: return"" ;

123: 124:

125:

126:

127: 1111111111111111111111 128: II Production struct

129: (Xm1Root ("product ion" ) J 130: public struct Production 131 :

132: [XmlAttribute("token") J

133: public string token;

134 :

135: [XmlAttribute("state") J

136: public string state;

137:

138 :

139:

140 :

141:

142: public class FiniteStateMachine { 143:

144: public static void Main () {

145:

146: IIDeserialize the FSM from the xm1 file

_192

147:

PuAN II : N gfm ngil CII

148: 149: 150: 151: 152: 153:

154: 155:

156: 157:

158: 159: 160:

XmlSerializer s = new

XmlSerializer(Lypeof(FSM));

TextReader t r = new StreamReader ( "f sm. xml" ) ; FSM fsm = (FSM)s.Deserialize(tr); tr.Close();

/ IGet the token string to process

Console. 'NriteLine ("EnLer token string to process: ");

sLring LUKens = Console. ReadLine () ; string r e s u Lt; = fsm. ProcessString (Loken) ? "valid" : "invalid";

Console.'tJriteLine("ThetokensLring {O} is {1}", tokens,result) ;

6. KET CHUdNG

Trong phan nay, chung ta da. tim hieu nhtrng khia canh khac nhau cua C va kien true .NET. Microsoft da dat nhirng tai nguyen dang k~ va nb hrc vao !tie true .NET. Con r{(t nhieu thu ciia .NET rna chung ta e&n khai pha, trong chuon sau ban se biit dAu cam th{(y .NET thuc te han vdi phong each lap trinh giao di~ Windows Forms, va c6 le day cung la chuang ban cam thfiy thu vi va hil'u ieh nha:

Trong pluin. nay:
• Windows Forms
• Xli If giao dien d6 hoa (GUI)
• Rang buec dtr li~u
C# • Xay dung (tng dung Windows Forms (ScRibble .NET)
en
ng • GDI+: Ciao dien d6 hoa cua .NET
~n
At. • Thuc hanh U'ng dung Windows Forms Phdn III

WINDOWS FORMS

Chrtdng 3.1

WINDOWS FORMS

C6c vlin d~ chinh se du(/c d~ cap din:

." Chuang trinli ung dung Windows Forms Hello ." Tao va sU' dung b(> qtuin Iy su' ki¢n

." Bini: nghia Border Style cho form

." Them menu viw cua s6 form

." Too menu leit shortcut

." XU' Ij sl/ ki¢n ctia muc chon menu

1. GI&: TH~U vE WINDOWS FORMS eUA KIEN TRUe .NET

Windows Forms la SI! thay the' cua .NET cho MFC trong Visual C++. Khong nhu thu vien MFC dung d6ng g6i cho tij.p cac ham Win32 API. Windows Forms hoan toan la cac lap huang doi tuong, mang tmh ke' thua danh cho cac nha phat tri~n Ung dung trong rnoi truong .NET.

Mac du mang thuat I1ga "Forms" nhung viec thiet ke cac thanh phan giao di~n tren Form lai khOng dua vao cac file tai nguyen resource nhu khi thiet ke cac biilu mi1u Dialog trong MFC theo each truyen thong cua Windows. Moi thanh phan giao dien con goi lacomponsnt dl:\t tren Form cua Windows Forms la mOt the hien (instance) CI,I the cua mot lap nao do. Component duoc dinh vi tren Form va thay d6i giao dien thong qua cac phuong thuc (method), thuoc ti nh (property) cua lap d6i nnmg. Cac cong CI,I phat trien true quan se cho phep keo tha (drag-drop) nhirng thanh phdn component len Form va quan ly ehac che viec khdi tao rna nguon cung nhu tuang tac giUa cac thanh phan component nay vai nhau.

Windows Forms cung dung cac file tai nguyen (resource file) cho cac lac vu d~t mOt anh len Form, hru cac da li~u text CI,lC hI) nrong tI,t nlurng file resource ella Windows c6 tU nhtrng narn 1980s, tuy nhien khuon dang cua cac file nay da thay d5i, chung duQ'c viet theo ng6n nga va cau true XML chudn. Chung ta se nghien c(tu chi tie't v~ cac file Uti nguyen nay trong chuang sau "Xay dung U'ng dung voi Windows Forms (Scribble .NET)"

f)~ xay dung va ke't gAn cac component tren mot Form ban c6 th~ su dung eac bang cong CI,I true quan trong nhtrng moi truO'ng phat tri€n nhu VS.NET, chang han C#, VB.NET hay C++ hoac ml)t ngon ngO' .NET nao d6. Tuy nhien, nham giup ban hieu ra han v~ Windows Form, chang toi han che' su dung nhfmg cong CI,I phat tri~n true quan nay. d day ta chi au dung trinh soan thao don gian notepad vie't nul va xay dung' Form cho Ung dung Windows Forms hoan toan dua trsn phuong thuc, thuoc tinh cua cac lap. MQt khi dii higu ra each Windows Forms lien ke't rna,

lfj 196

PHAN Ill: Windows Forms

ban co tM chuyen sang sU' dung cac cong cu true quan rna khong gap bat ky kh6 khan nao,

Tuong tac cua nguoi dung vdi cac thanh phan component trong Windows Form thuc hien thong qua su kii,';n (event). Moi thanh phan component cung cifp mot tap cac s\i kien nguon (event source) nhu sl,! kien di chuyen chuot. nut nhan diroc kich hoat, can tro thay dbi vi tri ... Nhism vu cua l~p trinh vien la viet, cac bO xU' ly (handler) cho nhirng 51,! kien nay. Cac ham xlr ly su kien durrc gni thOng qua rno hinh chuyen giao (deligate) rna kh6ng can dua vao bitt ky thong di~p nao trong M thting. Ban kh6ng can phai anh xa (mapping) cac thong diep sl! kien nhu trong MFC cua C++.

2. WINDOWS FORMS vA UNG DlJNG HELLO WORLD

Vi du 3.1-1 dUGi day la mOt ung dung Windows Forms dan gian hiEln thi vii chuBi Hello World ra giUa ei'ta so Form.

'Vi dl} 3_1-1 HWF.cs

/I HWF.cs

namespace HelloWindowsFormsNamespace {

using System;

using System_Drawing;

using System. ComponentModel; using System. Windows. Forms;

public class HelloWindowsForms System.Windows.Forms.Form

{

/ /Label 1 is the component that displays the text /Imessace "Hello Windows Forms! "

private System_Windows.Forms.Labellabell;

liThe constructor is where all initialization happerie . I/For forms created with the designer there is

Ilan InitializeComponent () method.

public HelloWindowsForms ()

{

this .labell = new System. Windows. Forms. Label ( ) ;

labell. Location:;: new System. Drawing. Point (8, 8); labell.Text:;: "Hello Windows Forms!";

labell. Slee = new System. Drawing. Size (408, 4B); ·labell. Font", new Sys tern. Drawing. Font (

"Microsoft Sans Serif", 24£);



CHu'~O 3·1: Windows Forms

197~

rs

label1.Tablndex = 0;

labell. TextAlign = ContentAlignment . MiddleCenter;

rs ip .n )1) ia

this.Text == "Hello World"; this . MaximizeBox == false; this.AutoScaleBaseSize =

new System.Drawing.Size(5, 13); this. FormBorderStyle =

FormBorderStyle.FixedDialog; this .MinimizeBox = false;

this. ClientSize = new System. Drawing. Size (426, 55); thii.Controls.Add(labell};

}

I I This main function instant"1ates a new form and runs it .

public static void Main(string[l args) (

Application.Run(newHelloWindowsForms(»;

}

}

I I end of namespace

Nhu ban thay, lap HelloWindowsForms chi chua mot thanh phdn component dan gian do la nhan (lap Labell mang ten labell cung vdi hai phuong thltc : phuong thuc trnh Main dung M tao va chay th€ hien cua tap HelloWindowsForms. Phuong thuc khdi dung HelloWindowsFormsO dung t"1-0 nhan va gan cac thuQc tinh ban dau cho cac tharih phan component tren Form.

Vi du tren cho thay nhUng chirc nang va sl! phuc t"1-P t6i thi.iu cua rnQt chuang trtnh Windows Forms. Cac chuang trtnh duqc thie't ke' va qudn ly bdi VS.NET hay WinDes.exe se c6 them mot vai tinh nang va nhirng thanh vien da li()u (data member) khac, tuy nhien chung chi dung M cac rnoi trtnrng phat tri€n U'ng dung true quan (RAD) d~ dang thea doi va quan ly viE);c thie:t ke' Form rna thoi,

B€ tao file thuc thi cua chinrng trmh, chung ta ehuan bi mot file batch (.BAT) lien ke't nhUng thu vien DLL can thie't cho viae bien dich rna nguon cua Windows Forms. sa dung file batch co uu diern la ban khong can dung den moi trinrng phat tri€n Visual Studio nang n~ c6ng k~nh va thinrng che dau hau nhirng ky thuat bien dich quan trong. Neu ban muon nghien cUu sau v~ C# va Windows Forms, each tot nha't la hay bAt diu ttl nhirng tharn sO' bien dich dong lenh, tuy don gian kh6ng than thien nhung chung to ra CI!C ky hieu qua va manh me. Vi du 3.1-2 la noi dung file build.batrlung bien dich rna ngu6n cac file *.cs sa dung thir vien Windows Forms.

Vi du 3.1·2 build.bat .

esc It :winexe Ir :Microsoft .win. Interop .dll, systern.dll

~198

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

..

PHAN III: Windows Forms

system.configuration.dll, system.data.dll, system.dianostics.dll, systern.drawing.dll system.winforms/dll lout: %1.exe %1.cs %2 %3 %4 %5 %6 %7 %8 %9

Luu y: khi go l~nh cho file build. bat tat CEi cac lenh phai a tren mQt dong va khOng duQ'c c6 khoang trAng gii1a ten thu vi~n trong chi-dan Ir:. Ban g9i file build. bat tU dong l~nh M bien djch cac file .cs nhu sau

Build hws.cs

Ke't qua, trinh bien dich se tao ra file hwf.exe. Chay chuang trinh hwf.exe ban se duoc cua s6' Forms hi en thj n hu hlnh :t 1-1

',tl·

:'-,-i':' -"-',:":':' '': -><.:-;:-, ":;" .,,:

.,hf'~'IQ;LWindows FOrm!;'}

. '::-'!',~j;;::~iir-~:;~:·~;:~;'g;/!;!,:~;/;,~~/, ... -, -, : - -. :+,:,,~\ :-: ~,,~ J

.r.: >ft!1 ;.'f ::j:~';::.

Hrnh 3.1·1 ella s6' chuang trinh HelioWindowsForms.

3. T~O vA SU Dl,JNG cAc BQ xu LY SQ KI~N (EVENT HANDLER)

Neu ban da quen vai vise phat trien cac ltng dung Windows tren C, ban se khong cam thay Ii). dOi vdi khai niern xli ly thong diep trong ham WinProc voi cau l~nh switch truyen th5ng lua chon cac thong diep. Neu da tUng sii dung MFC, ban cang da biet, ding thong diep dligc truyen den cac d5i tuong thong qua bang anh xa thong diep (message map). Trong .NET thong diep duqc gi1i di theo hinh thuc chuyen giao (delegate). Ung dung cua ban trliac het dinh nghia mot b(1 xii Iy SIf kien (event handler). B(1 xiily nay se diroc h~ thong tri$u goi bfit ky khi nao thong diep thich hop rna b(1 xii ly nay dang ky phat sinh. Vi du nhu khi ban kich chuot vao mot nut nhan, S1,( kien nay thucng dU'gc chuyen giao cho b(> xii ly EventHandler dam trach, Nhlrng kieu 51,( kien khac, nhu su kien chuot hoac su kien do b(> djnh thai (timer) phat sinh se ducc chuyen giao cho nhi1ng Handler wang ling cua no xU'IY. N6i chung, ban kh6ng dn phai quan tam Mn thong di~p, d.i rna chuang trlnh ffilg dung cua ban can quan tam la nhtrng bQ xiily S1,( ki~n.

Them mQt nut nhsn (button) VaG cira s6 Form ella mot ling dung Windows Forms rli"t dan gian. Ban co the them mot thanh phan nut nhan vao lOp chuang trinh chinh, khdi tao cac gia tri ban dau cho no trong phinrng thuc khrri dung (constructor) cua lop, sau cung la d~t no vao t~p hcp (collection) cua nhirng thanh phan di.§u khien (controls) trong ling dung.

Khi nhi1ng cong vi~c tren hoan ta-t. ban co the bat d!u xay dung cac b(> xli ly ket n6i Mn sl,l' kien, B(i xii ly nay se bay trang thai kich chuot cua nut nhan,

CHUdNG 3-1: Windows Forms

1991!J

Cac sl! kien gai tai th6ng qua M thong se dttqc m6c n6i VB-O mOt chuM cac handler dii dang ky trttac d6. M5i bQ xli Iy handler phiii co mQt dilu hieu nhan dang dE! trieu goi nhu sau

void 'EventMethodName (Obj ect sender, EventArgs e) ;

BQ xli Iy .su kien dliqc dat vao t~p ngu6n cac sl! kil\in cua thanh phan di~u khien biing toan tli += va loai bo bAng toan tli .=, vi v~y cac bQ xli ly SI! kien e6 th~ thay d6i dQng trong qua trmh thuc thi cua chuong trinh. Cung mQt su kien ban c6 tM dung mot hoac nhieu bQ xli ly SI! kien handler khac nhau. 'I'inh nang nay dliqe gui Ia multicast.

Chuong trmh HWFButton.cs dli(ri day se eho th!i'y each tao vai cai Mt bQ xu Iy sl! ki~n eho nut nhan.

Vi du 3.1·3 HWFButton.cs

/I HWFButton.cs

namespace HelloWindows FormsNamespace

using System;

using System. Drawing;

using System.ComponentModel; using System. Windows . Forms;

using System. Runtime. InteropServices;

public class HelloWindowsForms System. Windows. Forms.Form

{

IILabel 1 is the component that displays the text messace "Hello Windows Forms! "

private System. Windows . Forms. Label labell;

IIAdding a button member allows us to place a button on the panel.

private System. Windows. Forms .Button button1;

lIThe constructor is where all initialization happens. IIFor forms created wi th the designer there is an InitializeComponent () method.

public HelloWindowsForms ( )

{

this .labell = new System. Windows .. Forms. Label ( ) ;

labell. Location = new System. Drawing. Point (8, 8); label1. Text", "Hello Windows Forms!";

IIJ 200

pHAN III : Windows Forms

labell-Size = new System.Drawing.Size(408, 48); labell. Font = new System. Drawing. Font ("Microsoft Sans Serif", 24f);

label1 . TabIndex = 0;

label1. TextAlign = ContentAlignment. MiddleCenter;

this.buttonl=newSystem.Windows.Forms.Button();

buttonl.Location=newSystem.Drawing.Point(8,58); buttonl. Size = new System. Drawing. Size (408,25) ; buttonl.Text = "ClickMe!";

buttonl. TabIndex = l;

button1. Click +'" new EventHandler (OnButtonlClicked);

.this ~Tej(t.·,. "Hello World"·, this . Ma.:ic.imiZeBox =faise;

this. AutoScaleBaseSize = new System. Drawing. Size (5,

13);

this. FormBorderStyle = FormBorderStyle. FixedDialog; this. MinimizeBox = false;

this.ClientSize = new System. Drawing.Size (426, 85);

this.Controls.Add(labell); this.Controls.Add(buttonl);

}

void OnButtonlClicked(Object sender. EventArgs e) {

if(this.labell.Text ='" "HelloWindows Forms!") this .1abell.Text = "You Clicked?";

else

this .labell. Text = "Hello Windows Forms! ";

}

II This main function instantiates a new form and runs it.

public static void Main(string[] args) {

Application. Run (new HelloWindowsForms (»;

}

}

} II end of namespace

SiI' dung file build. bat ban bien dich chuang trmh HWFButton.cs nhu sau

Build HWFButton. cs

s

CHtfdNG 3·1: Windows Forms

2011!J

Banchay chuang trinh HWFButton.exe thu diroc sau khi bien dich, Ket qua chuang trinh se hi~nthi dca s6 nhu hinh 3.1-2.

c_,_, _ ... c

·'Vltfel't()·jWi)ntJ_:f:br:ni~···

";1' ",,:. '"'+"':C66kM~' "','t:

:-,You,Clicked?

I

C1i6kMe!

, L

Hinh 3.1-2 «« qua chuang trlnlt HWFButton

Khi ban kich chuot vao nut nhan, bi) xU" lyC Sl,i kien se diroc goi thay the noi dung chu trong nhan labell. Luu y, trong vi du tren, chung ta su dung each tri~u g9i phuong thirc thea khong gian ten day du cua lap d6i tuong

buttonl. size = new System. Drawing. Size (408, 25); Ban co th~ goi thea each ngan han

button1.size = new Size(408, 25);

Cac trlnh sinh rna (code generate) trong nhung cong cu phat tri~n true quan thimng sinh rna thea dang ten day du brri chung lam dieu nay mQt each tu dong, M<}.c khac, khi trieu goi phutrng thuc vdi dil.y du kh6ng gian ten, chung ta luon bao dam ding phirong thuc dUc;1c goi tham chieu dung tuye t d6i. Khi vie"t rna bang tay ban co tM se met moi vi phai sU" dung ten khai bao dai, khi do ta sU" dung each viet tat. Hau nhu nhtrng d6i tUQ"ng duqc tao ra ben trong khong gian ten rna ban khai baa no ban deu co th~ tri~u goi ten phircng thirc cua dtli tugng rna kh6ng cdn dung den khong gian ten.

4. DJNH NGHiA cAc KIEV DuCfNG VIEN(BRODER STYLE) CHOFORMS

Cac vi du tren day kha dan gian, cua 86 Form tao ra c6 kich thiroc ctl dinh, khong co nut nhan ph6ng to hay thu nho ben g6c phai. Ban co thii" them vao nhCl'ng thuoe tinh nay thong qua thay d5i kieu duang vien (border) ella Form. Khi thay d6i ki€u dinmg vien, cua s6 Form cua ban co thii" thay d6i kich tbuoc, ph6ng

~202

PHAN III : Windows Forms

to, thu nho nhu nhung img dung Windows thuan tuy. Chuang trinh resize.es trong vi du 3.1-4 dudi day cho se minh hoa tinh nang co gian cua mQt cUa s6 Form

Vi dV 3.1-4 resize.cs

using System;

us ing Sys tern _ Drawing;

using System.ComponentModel; using System. Windows. Forms;

public class SizeApp System. Windows. Forms. Form {

public {

SizeApp( )

this.Text = "SizeApp"i this.MaximizeBox", true;

this. FormBorderStyle = FormBorderStyle. Sizable;

static void Main() {

Application. Run (new SizeApp ( ) ) ;

}

}

Bien dich resize.cs bang chuong trinh build. bat. Chay chuong trinh ban ( thE; ph6ng to cua s6 Form toan man hrnh hay thu nho xuong thanh icon tre thanh taskbar cua Windows.

5. T~O vA THEM V Ao TRINH DdN MENU

HAu het cac chuong trinh U'ng dung trong Windows d~u co mQt trmh d( menu. Chucng trinh Windows Forms cung khOng 11\ ngoai l~. Tuong tV nhu thai phan nut nhan Button va nhan Label ban dB. hoc qua trcng phan tren, thanh ph; trinh dan c6 th/$ duoc tao ra va them vao thong qua bien thanh vien Menu c ling dung chinh. Sv kien phat sinh tU mot muc chon cua trinh don ciing duoc III noi vao mQt bQ xli ly sl,i kien qui dinh danh cho menu.

Menu trong kien true .NET co hai dang. MainMenu la trinh dan chi duoc lip dung cho cira s6 Form, n6 cung clip giao dien ki,su thuc dan nga (menubar) truy~n thong trong Windows. Dang thd hai Ia 18 trinh dan ngu ca (ContextMenu) duqc dung dE; h5 trg cac tinh nang nhanh cua t1ug dui ContextMenu thirong dugc hi~n th] khi ngl1iJi dung kich ehuQt phai len n vung nao d6 cua clia s6 Form. Trong ca hai dang nsu trsn, timg muc chon tt menu dllgc bi~u diem Ia kieu d6i tuqng Menultem. Trinh dan menu thinrng dl

illS

cH1fdNG 3-1: Windows Forms

2031!9J

ng

d.y dung theo quan hi) ke' thira cha con. MainMenu quan If cac popup hay drowdown menu, tie'p d6 nhi1ng thanh phan nay lai quan If cac muc chon MenuItem ella rieng chung .

Trinh tJ! tao menu di{\'n hinh thirong dLiqc thuc hien nhir sau



Vi du 3.1-5 Xiiy dlj'ng menu

MainMenu menu = new MainMenu ( ) 1

MenuItem filemenu = new MenuItem() 1 filemenu.Text:: "&File"; menu.MenuItems.Add(filemenu);

MenuItem open = new MenuItem ( ) ; open. Text = "&Open"; filemenu.MenuItems.Add(open);

MenuItem save= new MenuItem(); save.Text = "&Save"; filemenu.MenuItems.Add(save);

MenuItem exit= new MenuItem () ; exit.Text = "E&xit"; filemenu.MenuItems.Add(exit);

MenuItem editmenu= new MenuItem(); edi tmenu . Text :: II &Edi t " ;

6

1 menu.MenuItems.Add(editmenu);

MenuItem cut= new MenuItem( ) ; cut. Text = "&Cut "; editmenu.MenuItems.Add(cut);

MenuItem copy= new MenuItem ( ) ; copy. Text = "Copy II ; editmenu.MenuItems.Add(copy);

MenuItem paste= new MenuItem(); paste.Text = "&Paste";

1 editmenu.MenuItems.Add(paste);

s

It this . Menu = menu;

Ke't qua menu xay dung trong biroc tren khi hilln thi se co giao dien nhu hlnh 3.1-3

1 Ij"

liJ 204

PHAN III : Windows Form!

:1

'i

Hinh 3.1·3 Chuang trinh. vm menu

6. T~O vA THEM vAo cAc Ml}C CHON TAT (SHORTCUT MENU)

Khi dij.t dau & trl1i1e ky t\f th€ hien ten cua mue chon tren menu, Window! se gach chan ky W nay th~ hien day la ky tl,l' tAt. Ban co th.§ ket hap phim Alt va ky tl,l'tAt dt: trieu g9i rnuc chon tren trinh dan. Vi du:

filemenu.Text = "&File";

open.Text = "&Open";

dg goi muc chon "Open" ban co thg nhan phim tAt Alt-sF' M rna menu popup Fill tiep Mn nhan phim 0 M gQi muc Open. Chung ta co th~ chi dinh tuang mini phim tAt cho mot muc chon, vi du Ctrl--O se gni five Open nhu sau:

Vi du 3.1-6 Them phia truy c~p toit V30 muc cho n File

MainMenu menu = new MainMenu () ;

Menultem filemenu = new Menultem(); filemenu.Text = "&File"; menu.Menultems.Add(filemenu);

Menultem open = new Menultem ( ) ; open. Text '" "&Open"; filemenu.Menultems.Add(open};

open.Shortcut=CtrlO;

Ie void_function(Object, EventArgs) i

CHudNG 3·1: Windows Forms

205~

open.ShowShortcut=true;

Doan rna trim se gan phim tiit Ctrl-s-O cho mue chon Open. Ban hay nhan Alta-F diJ hi~n thi menu con File ti€p d€n nhan 0 M Mn muc chon Open (hinh 3.1-4). LIiU Y phirn Ctrl--O hien thj k€ ben Wiu dt\ Open. N€u ban nhan true Wl'p Ctrl+O thi bQ xU'ly s1,l kien danh cho rnuc chon Open se phat sinh. Chung ta se hoc each cai dat b(i xU: Iy sl,! kien cho muc chon cua menu trong phan sau.

.vs 'oi

Hmh 3.1-4 Thi hi~n menu tdt

7. XU LV su KIJ4;N PIlAT SINH Til MENU

C6 ri't nh ieu su ki$n ban can phai xl'cly d6i vdi mI,IC chon MenuItem .. MQt bQ xli Iy SI,! kien co ban 18. mot phuong thuc tuan theo khai bao

Ban khai bao phirong thrrc theo dang nay ti€p den dang ky n6 voi muc chon tren trinh don thong qua lop EventHandler. Vi du, khi ngui'Ji dung kich chuot vao muc chon Open, ta hien thi mQt h(ip thoai thong bao S1,I k.i~n da dien ra, d~ thuc hien di~u nay, trudc Mt bQ :xU'ly s1,l kien ducfe cai dat nhir sau:



Vi du 3.1-7 Cai d;)t bi;! xU' Iy st;i kien cho rrru c oho n

public class SizeApp : System. Windows. Forms. Form {

public void OnFileOpen(Object sender, EventArgs e) {

MessageBox. ShOW("You selected File-open") i

}

o day OnFileOpenO la b(i xU' Iy sl,! kien, ban co th~ dl1it cho phuong thirc rnQt ten khac, Tuy nhien M b(i xl'cly nay moe noi diroc vci 91,1 kien Click cua muc

1Mj206

pHAN III : Windows Forms

chon MenuItem mang ten Open, ban chuyen giao bO xli 1y cho doi tucng (hay nui each khac Ia dang ky phuong thuc xli 1y sl! kien Click vai dOi tirong) rihu sau:

open.Click+=newEventhandler(OnFileOpen)i

Bay gicr bat ky khi nao ban nhan Alt+F+O hoac Ctrl--O thi muc chon Open se kich hoat sl! kien Click va phuong thtrc OnFileOpenO duQ'c goi thuc thi.

7.1. 811 ki~n dMu khi~n giao di~n ngliCii dung eua MenuItems

Mot so su kien khac phat sinh bdi Menultems eho phep ban phan h5i hay tuy bien cho ngmri dung nhijiu kinh nghiem, MFC S11 dung lap CCmdUI cho rnuc dich nay trong khi Windows Forms sli dung sl! kien nguon mang ten Popup.

'I'rudc khi hien thi trinh don popup con chua muc chon, su kien Popup sil phat sinh. Day la co hQi giup ban thuc hien mot so thao tac kiem tra de hien thi dung diin trang thai cua muc chon, Ban co the bay su kien nay bAng each dira vao bQ xu 1y nhu sau:

filemenu.Popup+=newEventHandler(OnPopupFileMenu)i BO xli Iy OnPopupFileMenu diroc cai d~t nhir sau:

Vi du 3.1·8 Cai diU hi) xu 1y OnPopupFileMenu

bool m_bPopupCheckedi

public void OnPopupFilemenu (Object Sender, EventArgs e) {

m_bPopupChecked:::: ! m_bPopupChecked;

Menultem item = (Menultem) Sender; item.Menultems[O] • Checked = m_bPopupCheckedi item.Menultems [1] . Enabled '" m_bPopupCheckedi item. Menultems [2] • Visible = m_bPopupChecked;

}

Phuong tlurc OnPopupFilemenu() tren diiy ci'ti Mt mQt so ding vi~c thui'mg lam cua sl! kien Popup d6 la kiern tra, dat dau checkmark, §:n hoac vii hieu hoa muc chon Menultems theo mQt di~u kien nao d6. Lap chuong trmh chinh chua mQ! bien Boolean mang ten m_bPopupChecked. M6i khi menu File dttqc bung ra, co m_bPopupChecked duoc b~t trj true hoac false tuy van trang thai trudc d6. B6i tLigng Sender khi nay chinh Ie. the hien cua lap Menultems, cho nen viec chuyen kieu Sender tli Object v~ Menultems Iii hoan toan hqp 1~. Ba muc chon trong trinh dan File duoc danh dau, cho phep hieu luc hoac fin di tuy thuoc vao trang thai cua co m_bPopupChecked. Hinh 3.1·5 cho thay muc chon tren menu hi~n thi a hai trang thai

nne

public class SizeApp System. Windows. Forms. Form {

CHl1dNG 3·1: Windows Forms

n6i

pen

lay tll,lC

se thi rflO

Hinh 3.1·5 s« qua xU If menu

7.2. Binh nghia Menultems lit thanh phan each (seperator)

2071!l

Cac muc chon tren menu thircng dUQ'c nh6m lai theo mqt chuc nang nao d6 .

Giua nhirng nh6m nay thuang c6 mot thanh phan each (separator) giup ngixri dung phan biet r6 cac nh6m muc chon, Trong Windows Forms, thanh phan each tren menu kh6ng thuc hien bat ky chtrc nang gi ngoai viec the his n mot dl1O'ng thAng phan ranh gi6i giaa cac muc chon. Viec tao thanh phan each nft dan gian. Ban chi viec gan thuoc tinh Text cua muc chon la ky tl,f "-". Vi du:



Menultem dumrnymenu = new Menultem() ; dummyrnenu.Text = "Separator"; menu.Menultems.Add(dummymenu);

ng oa 19t ca oi ~n

dummyrnenu.Menultems . Add (new Menultem( "Above") ); dummymenu.MenuItems .Add (new MenuItem ( "-"»; dummyrnenu • Menultems • Add (new Menultem( "Below") ) ;

Durii day la toan bq rna nguon ella chuang trtnh resize2.cs b6 sung cae muc chon menu vao chuang trtnh resize.cs

)h Ja ai

using System;

using System. Drawing;

using System. ComponentModel; using System. Windows. Forms;

~208

PHAN III : Windows For]

public void OnFileOpen(Object sender, EventArgs e) {

MessageBox. Show ( "You selected File-Open!");

}

bool m_bPopupChecked;

public void OnPopupFilemenu(Object Sender, EventArgs e) {

m_bPopupChecked;; !m_bPopupChecked; MenuItem item = .(MenuItem) Sender;

item. Menultems [OJ • Checked '" m_bPopupChecked; item. MenuItems [1] . Enabled = m_bPopupChecked; item. MenuItems [2] . Visible = m_bPopupChecked;

}

public (

SizeApp ()

this.Text = "SizeApp"; this . MaximizeBox = true;

this . FormBorderStyle = FormBorderStyle. Sizable;

MainMenu menu = new MainMenu ( ) ; menu. RightToLeft = RightToLeft. Yes; MenuItem filemenu = new MenuItem(); filemenu.Text;; "&File"; menu.MenuItems.Add(filemenu);

MenuItem open = new MenuItem(); open.Text = "&Open";

filemenu.MenuItems.Add(open);

open. Shortcut = Shortcut. CtrlO; open. ShowShortcut = true;

open. Click += new EventHandler(OnFileOpen);

MenuItem save= new MenuItem ( ) ; save.Text = "Save"; filemenu.MenuItems.Add(save);

MenuItem exit= new MenuItem(); exi t • Text = "Exi t " ; filemenu.MenuItems.Add(exit);

MenuItem editmenu = new MenuItem(); editmenu.Text = "Edit";

clRfdNG 3-1: Windows Forms

2091Sl

menu.Menultems.Add(editmenu);

Menultem cut= new Menultem() ; cut. Text = "Cut" i editmenu.Menultems.Add(cut);

Menultem copy", new Menultem( ); copy ~ Text = "Copy"; editmenu.Menultems.Add(copy);

Menultem paste = new Menultem ( ) ; paste.Text = "Paste"; editmenu.Menultems.Add(paste);

Menultem dummymenu = new Menultem() ; dummymenu . Text =: "Separator"; menu.Menultems.Add(dummymenu);

dummymenu.Menultems . Add (new Menultem( "Above"»; dummymenu . Menultems . Add (new Menultem( "> ") ); dummymenu.Menultems . Add (new Menultem( "Below") );

f i 1 emenu • Popup + = new EventHandl er (OnPopupF i 1 emenu) ;

thi s . Menu = menu;

static void Main ( ) {

Application. Run (new SizeApp(»;

7.3. XU' ly sl! ki~n Select

Khi cac muc chon tren menu popup da hiE!n thi, nglioi dung di chuyeri chuQt Mn tUng rnuc chon hoac dung cac phim mui ten di chuyen vet sangden cac muc chon khac nhau ella trmh dan. Khi vet sang dau vao mot rnuc chon, su kien Select se phat sinh. Chunng trinh c6 thE! dung sl! ki~n nay M c~p nhat thong tin huang d~n v~ muc chon tren thanh trang thai statusbar cua etta s6' Form hoac thuc hi~n m(it thao eac tuy bien giao di(in ngtldi dung nao d6. Dttai d§y Ja vi dl,l ChD tha'y each xU'ly sl! ki~n Select

Vi du 3.1-9 menus.cs

using System;

·'1210

PHA.N III : Windows Forms

us ing System. Drawing; usingSystem.ComponentModel; using System. Windows. Forms;

IIThis application shows off sam of the menu features IILines below have been added but then commented out Ilplease feel free to remove the comment slashes to Iisee the effect of the commands.

public class menuapp : System. Windows. Forms. Form

Label label;

void Showlnfo (Obj ect Sender, EventArgs e) {

Menultemitem=(Menultem)Sender; Bwitch(item.Text)

{

case "&Open":

label. Text = "Open a file from disk"; break;

case "&Save":

label.Text = "Save a file onto disk"; break;

case "E&xit":

1 abe 1 . Text = "Exi t MenuApp" ; break;

}

}

public menuapp ( ) (

this. Text = "MenuApp"; this . MaximizeBox = true;

this. FormBorderStyle = FormBorderStyle. Sizable;

this. label = new Label () ;

label. Location = new Point (8,100) ;

CHUONG 3-1: Windows Forms

label. Size = new Size(200,25);

this.Controls.Add(label);

MainMenu menu = new MainMenu ();

Menultem filemenu = new Menultem(); filemenu.Text = "&File"; menu.Menultems.Add(filemenu);

Menultem open = new Menultem ( ) ; open. Text = "&Open";

open. Select += new EventHandler (Showlnfo) i filemenu.Menultems.Add(open);

Menultem save= new Menultem ( ) ;

save.Text = "&Save";

save. Select += new EventHandler (Showlnfo) ; filemenu.Menultems.Add(save);

Menultem exit", new Menultem(); exit .Text = "E&xit";

exit .Select += new EventHandler (Showlnfo); filemenu.Menultems.Add(exit);

this. Menu = menu;

}

static void Main()

Application. Run (new menuapp () ) i

Bien dich va chay chucng trinh. Khi ban di chuyeri chuQt tren menu thi nQi dung nhan label se thay dbi phan anh muc chon dang chieu sang (hmh 3.1·6).

~212

PRAN III : Windows Fa

Hinh .3.1-6 K@t qua xu lY sl/ ki~n Select

7.4. Thie't ke' khung Menu

Trinh dan ducc xay dung tir t~p hop cac thanh phan Menultems. Nhihlg muc chon menu thong thucng duoc dan ngang tran thanhmenubar cua cira s6 Form va di;it tlt trai qua phai. Ban c6 thEi: thay d5i ki1!uthie"t lap mac dinh nay.

Phuong thirc Break va Bar Break dliqe dung dC'i't{l.o trinh dan xep ngang thay vi xep doc, Thiet l~p thuoc tinh BarBreak trong Menultems se lam cho muc chon duqe ve sang mot cQt moi. BarBreak se them van thanh phiin each d9C tao thanh cac cet trong trinh dan. Break chi tao met cOt mdi nhirng khong ve thanh d9C phiin each. Ban c6 th~ thay d5i menus.cs doi chut di! dl1qc mot khung menu mai nhu sau:

Menultem filemenu = new Menultem() ; filemenu.Text = "&File"; menu.Menultems.Add(filemenu};

Menultem open = new Menultem ( ) i open _ Text = "&Open 11 ;

open. Select += new EventHandler(Showlnfo); filemenu.Menultems.Add(open);

Menultem save= new Menultem ( ) i save.Text = "&SaVe"i

save. Select += new Event Handl er (Showlnfo); filemenu.Menultems.Add(save); save.BarBreak=truei

Menultem exit= new Menultem(} ; exi t . Text = "E&xi t " i

exit. Select += new EventHandler (Showlnfo); filemenu.Menultems.Add(exit)i

'ng

s5 Hinh 3.1·7 Tee d(ing ella thuoc tinh. BarBreak

Cac cq.t khong bilt buoc phai can d6i s6 muc chon, ban co th€ d(lt muc chon

ay Exit rieng re trong mq.t CQt tach biet nhu sau:

on

nh loc u1i

cHI1(jNG S-l; Windows Forms

2131MJ

elC;it.BarBreak=true; exit.Break=true;

Ke"t quii khi d6 se hi€n th] nhu hlnh 3.1-7

Menultem filemenu :;: new Menultem() ;

filemenu. Text:;: "&File";

menu.Menultems.Add(filemenu);

Menultem open:;: new Menultem(); open. Text = "&Open II ;

open. Select += new EventHandler (Showlnfo) ; filemenu.Menultems.Add(open);

Menultem save:: new Menultem ( ) ; save. Text = II &Save II ;

save .Select += new EventHandler (Showlnfo); filemenu.Menultems.Add(save);

Menultem exit= new Menultem() ; exit .Text = "E&xit";

exit. Select += new EventHandler (Showlnfo); filemenu.Menultems.Add(exit); exit.Break=true;

~214

PRAN III; Windows

M6i khi Break mang tr] true, muc chon se dugc dem qua cQt mdi, Ket hien thi nhu hinh 3.1-8

Hinh 3.1·8 M¢t dang th~ hien hluic ctia BarBreak

7.5. Hi~n th] Menu tii phai qua trai

Ban c6 th~ d~t menu kh6ng theo qui uac chuan. Thong thuc'lng cac rm cua menubar b1l:t dAu tit trai qua phai. Chung ta c6 thE! thay d6i thu W tit P tnli nhir sau

MainMenu menu = new MainMenu ( ) ; Menultem filemenu = new Menultem{); filemenu .Text = "&File"; menu.Menultems.Add(filemenU)i menu.RighToLeft=RightToLeft.YeSi

ke't qua ban se duoc menu hiE!n th] nhu hmh 3.1·9.

Hinh 3.1-9 Menu canh pluii

7.6. 'I'ao va su d~ng eac Menu ngii carrh (ContextMeI Menu ngO" canh con goi hi cac menu popup n6i. N6 xuAt hien va thay dung cac muc chon tuy theo trang thai cua ngO" canh ngl1ai dung. Khi ngu kieh chuot phai len vung soan thao, len d5i tuong' anh, len etia s6 Form ts

~m$

CHudNG 3-1: Windows Forms

21SI!!J

l sil th~ cung cap menu ngtr canh dif nguai dung trieu goi. Menu ngil' canh lam tang t6e truy xu;it chirc nang cua img dung han la cac menu co dinh tren menubar.

D~ tao menu ngil' canh trong cac I1ng dung Windows Forms, ban S11 dung lop thanh phan ContextMenu.

Them vao, hi~n thi, thay dili, cai di).t bQ xU' Iy sl)' kien cho cac muc chon trong menu ngu canh hoan toan tucng tl)' nhu trong MainMenu. Doan rna sau se tao ra menu nga canh vdi 3 muc chon

ContextMenu cmenu = new ContextMenu ( ) ;

cmenu . Menultems . Add (new Menultem( "&First"»; cmenu.Menultems . Add (new lodenultem( "&Second") ) ; cmenu. Menultems. Add (new Menultem ( "- " ) ) ;

cmenu. Menultems. Add (new Menultem ( "&Third" ) ) ;

this.ContextMenu=cmenu;

Hay kich chuot phai vao ella s5 Form cua ii'ng dung, menu nga canh tren se xuat hi~n.

non qua

7.7. Thay the', sao chep l~i va trQn cae muo eua Menu

Mot t~p quan thong thuCrng cua cac img dung Windows do La thay d6i menu tuy thea nQi dung da lieu hien thj trong vung eaa s5. Nham giup ban tiet kiem thOi gian trong viec tao ra va huy cac menu dong .NET eho phep ban hoan chuytin hoac tron IAn cac muc chon ella menu nay voi menu da dinh nghia truoc d6.

Vi du diroi day se minh hoa each tao nhieu menu sau do thuc hii,\n viec ket hop trQn chung Iai theo cac each khac nhau tuy thee lua chon cua ngiroi dung.

Vi du 3.1-10 rnenuswo .cs

using System;

using System. Drawing;

using System. ComponentModel; us ing Sys t em. Windows. Forms;

namespace Sams {

classmenuswop System.windows.Forms.Form

MainMenu m_menu;

nQi Menultem m_editmenu,m_menumenu,m_switchitem,

ling rn_showsecond,m_merge;

CI c6

1Hj216

PHAN III: Windows I

Menultern rn-playrnenu;

bool rn_bswop;

bool rn_bshowsecond; bool m_brnerge;

void addmenuitem(Menultem menu, string s) {

Menultem temp=new Menultem(s) ; temp. Enabled= fal se; rnenu.Menultems . Add (temp) ;

}

void BuildMenu () {

rn_rnenu=new MainMenu ( ) ; m_rnenu.Menulterns.Add(m_rnenumenu.CloneMenu(»;

if (rn_brnerge) / / tron cdc muc chon {

Menultern ternp=new Menultern ( ) ;

addmenu it ern (temp, "Edit"}; ternp.MergeMenu(m_editmenu.CloneMenu(»;

}

else

{

addmenuitem(temp, "Play"); ternp.MergeMenu(rn-playrnenu.CloneMenu(»;

}

temp. Menultems. Add (new Menultem ( "-" ) ) ;

if (m_bshowsecond) {

I.

cHlf(1NG 3-1: Windows Forms

217~

if ( !m_bswop) (

addmenuitem{temp, "Play") ; temp.MergeMenu(m-playmenu.CloneMenu{»;

} else {

addmenuitem(temp,"Edit"); temp.MergeMenu(m_editmenu_CloneMenu(»;

}

}

temp .Text '" "&Merged"; m_menu.MenuItems.Add(temp);

}

else / / khi khong tron cac muc chon. {

if (!m_bswop) {

if (m_bshowsecond) {

m_menu.MenuItemS.Add{ m_editmenu.CloneMenu{»i

}'

m_menu.Menultems.Add{m-playmenu.CloneMenu(»i

} else

if {m_bshowsecond} {

m_menu.Menultems.Add( m-playmenu.CloneMenu(»i

} m_menu.Menultems.Add{m_editmenu_CloneMenu(»;

}

}

\!J 218

PHAN III : Windows Forms !

thi s . Menu = m_menu i

}

IIThis method sets or resets the checks on menu items

void PopupMenuMenu (Obj ect sender, EventArgs e)

m_menu . MenuItems [0) . MenuItems [0] . Checked = m_hswoPi m_menu.MenuItems[O).MenuItems[l] . Checked = m_hshowsecondi

ffi_menu.MenuItems[O) .MenuItems[21.Checked= m_bmergei

}

II The event handler for the switch menu entry void OnSwitchMenu(Object sender, EventArgs e} {

m_hswop = ! m_bswop; BuildMenu () ;

}

liThe event handler for the show menu entry void Onshowsecond(Object sender, EventArgs e) {

m_bshowsecond = ! m_bshowsecond; BuildMenu () ;

}

liThe event handler for the merge menu entry void OnMerge (Obj ect sender, EventArgs e)

{

m_bmerge = ! m_bmerge; BuildMenu () ;

}

public meriu swop ( ) {

/ / setup a main menu

J/l....IOel1lJ.1Oel1U = De", KeouIt:e.oJ/ ''.fKeDu '')/

CHUdNG 3·1: Windows Forms

2191!9J

m_menumenu . Popup +::: new EventHandl er (PopupMenuMenu) i

IICreate the switch item. m_switchitem:::new Menultem( "&Switch") i m_switchitem.Click+:::new

EventHandler(OnSwitchMenu)i m_menumenu.Menultems.Add(m_switchitem)i

m_showsecond ::: new Menultem( "&Show") ; m_showsecond.Click+::: new EventHandler(Onshowsecond); m_menumenu.Menultems.Add(m_showsecond);

m_merge ::: new Menultem( "&Merge") i

m_merge .Click += new EventHandler (OnMerge); m_menumenu.Menultems.Add(m_rnerge);

II create a second menu

In_edi tmenu=new Menultem ( "&Edi t" ) ; m_editmenu.Menultems . Add (new Menultem( "Cut") ) ; m_editmenu . Menultems . Add (new MenuItem( "Copy") ); In_editmenu . MenuItems .Add(new MenuItem( "Paste") ) ;

II and an alternative. m""playmenu=new Menultem ( .. &Play" ) ;

m""playmenu • MenuItems • Add (new MenuItem( "Normal") ); m....Playmenu.MenuItems.Add(newMenuItem(

"Fast Forward"» ; m""playmenu . MenuItems . Add (new MenuItem( "Reverse") ) ;

m_bshowsecond=truei

IINow build the menu from its parts .. BuildMenu ( ) ;

}

public static void Main ()

~220

PHAN III : Windows Forms

Application. Run (new menuswop () );

}

}

} / / end of Same namespace

Trong vi du tren , ban co th€ thAy viec khdi tao menu dutrc thue h ien thea each thong thuong, tuy nhien thuc 5V khOng co menu nao duoc them vao danh sach MenuItems chao Muc Edit va Play tren menu duqc giu tach biet.

Ham BuildMenu chiu trach nhiern tao menu va gan n6 cho menu chinh trong chucng trinh. Di~u nay se khien GC x6a tAt ca cac muc chon va menu con trong menu chinh. BuildMenu sau d6 tie'p tuc tao ra menu diroc s!lp xep hoac trqn hai menu con lai thanh mot tuy theo thiet I~pcua cac bien thanh vien ben trong lap.

Ky thuat nay cho phep ban khdi tao cac muc chon menu ding vai nhirng b(i xlily muc chon ngay mot ch6. Sau d6 ban co th€ dung chung theo nhieu each kat hop khac nhau rna khong can phai theo doi hoac dij.t chung ve gia tri mac dinh ban dliu.

Vi()c tron cac muc menu trong vi du tren rAt dan gian, Thuc te, ban co tM ket hop cac muc Menultems theo each phrrc tap han. Mlii IDI,IC chon MenuItems co mot thuoc tinh qui dinh trat tv sao cho khi dliqc tren vao menu khac chung se duqc sap xep theo mot trlnh tv nhat dinh. Vi du ban c6 th€ vira muon ban muon trong menu File c6 cae muc dliqc nh6m lai tuy theo kieu hoac I01.1i file tal nguyen nao d6. Vai vi~c dij.t thli til cho muc chon ban c6 tM dam bao ding nhi1ng muc chon thirong sa dung se duqc dat iJ dAu. Nlurng muc chon it sU" dung se dugc sAp xep a phan sau, Chuang trinh menuorder.cs dtiai day se minh hoa clurc nang tron menu theo thu tv tuy theo vi~c IVa chon thuong xuyen cua nguui sa dung

Vi du 3.1.11 menuorder.cs

using System;

using System. Drawing;

us ing Sys t em. ComponentMode 1 ; using System.Windows.Forms;

namespace Sams {

classmenuorder System.Windows.Forms.Form

MainMenu m_menu; Menultem m_workingmenu; Menultem m_menuentry;

o

_dNG 3-1: Windows Forms

221 r!J

il this event handler is called whenever an item is used i~:tvoid OnUsed(Object sender, EventArgs e)

{

fdr(int i=O;i<m_menuentry.Menultems.Count;i++) m_menuentry.Menultems[i] _MergeOrder++;

Menultem m= (Menultem) sender i

m.MergeOrder--;

if (m. MergeOrder < 0) m. MergeOrder = 0;

I I this event handler is also Lnvoked , You could have II many event handlers attached to the Click sources void OnClicked(Object sender, EventArgs e)

{

Menultem me (Menultem) sender i MessageBox_Show("You clicked "+m.Text};

}

lIAs a menu is popped up it is constructed on the fly_ void OnPopup (Obj ect sender, EventArgs e)

m_menu.Menultems.Clear(); m_workingmenu.Menultems.Clear(); m_workingmenu.MergeMenu(m_menuentry); m_menu.Menultems.Add(m_workingmenu);

}

I I Sets up the initial menu text and orders. public menuorder()

~222

PHAN III : Windows F(

string [] s==new

string[8] {"Cats","Dogs","Elephants","Geese","Mooses" Rats","Giunea-pigs","Horses"};

m_menu = new MainMenu ( ) ;

m_menuentry = new Menultem( "&Menu") ; m_menuentry.popup += new EventHandler{OnPopup);

m_workingmenu = new Menultem() ;

for(int i=O;i<B;i++) {

Menultem temp'" new Menultem(s [i]); temp.MergeOrder=i;

temp. Click+=new EventHandler (OnUsed) ; temp.Click+=newEventHandler(OnClicked); m_menuentry.Menultems.Add(temp)i

}

m_workingmenu.MergeMenu(m_menuentry); m_menu.Menultems.Add(m_workingmenu); this . Menu = m_menu;

}

II instantiates and runs the application. public static void Main ()

{

Application.Run(new menuozdez-t ) ;

- }

}

Vi du tren cung minh hoa eho thay each them vao hai bi? xU' Iy cho ell kien Click, Select hay Popup ella Windows Forms.

7.8. 'I'ao va them vao cae Menu con (sub-Menu)

Doi tuqng MenuItems trong Windows Forms chua m<)t tap hop ca tl.tq'ng Menultem (collect.ion l. Dieu nay cho phep ban tao ra m(it cau true ke

CHUdNG 3-1: Windows Forms

223~

eiia menu, Cau true k€ thira nay bao gbm nhirng menu cha va menu eon lbng nhau v(ri s6 cap tay y. Vi du M tao menu con chung ta thuc hi~n nhu sau:

Vi du 3.1-12 submenus.cs

using System:

using System. Drawing;

using System. ComponentModel; using System. Windows. Forms;

public class submenuapp System. Windows. Forms. Form {

public submenuapp() {

this .Text = "SubMenuApp" i this . MaximizeBox = true:

this • BorderStyle :: FormBorderStyle. Sizable;

MainMenu menu = new MainMenu ( ) ;

MenuItem filemenu = new Menultem() ; filemenu. Text = "&File": menu_Menultems.Add(filemenu):

Menultem open:::: new Menultem(); open. Text = "&Open"; filemenu.Menultems.Add(open);

Menultem print;,: new Menultem(); print .Text = "Print ... "; filemenu.Menultems.Add(print);

Menultem temp= new Menultem(); temp. Text = "Pre&view" i print.Menultems.Add(temp);

temp= new Menultem() ;

temp. Text = "To &File"; print_Menultems.Add(temp);

Menultem exit:: new Menultem(); exit . Text = "E&xit": filemenu.Menultems.Add(exit);

this • Menu = menu;

I!J 224

PH AN III: Windows Forms

r

[

1

,

ContextMenu cmenu == new ContextMenu ( ) i cmenu.Menultems .Add(new Menultem( "&First") ) ; cmenu.Menultems.Add(new MenuItem( "&Second") ); omerru • Menultems • Add (new Menultem(" _II) ) ; , cmenu_Menultems _Add (new Menultem( "&Third"»;

this.ContextMenu==cmenu;

}

static void Main ( ) {

Application. Run (new submenuapp(»;

}

Hinh 3.1-10 Menu con

8. KET CHl1<1NG

Trong chuang nay, chung ta dii xem qua each xay dung (eng dung Windows Form tit muc dan gian cho de'n xay dung h~ th6ng menu phuc hop xu It cac thao tac lila chon cua nguoi dung thong qua cac hI} xli It sl,i kien (event handler), Chung ta cling dii hoc qua rna hmh chuyen giao sl! kien trong M th6ng (Delegate system) thay cho each xli It thong diep truyen thong trudc day trong MFC hay ham WinProc kinh di€n cua ling dung Windows vii'lt trong C. Song song d6 chung ta dii xern qua met so' thanh phan giao dien (GUI component) co ban cua mdi truang .NET. Tie'p thea trong chuang sau ban se h9C chi tiet han v~ nhi1ng thanh phan giao dien de. hoa nay.

'thu<mg 3.2

xU LY GIAO DI~N DO BQA (GUI)

Cae vdn d~ chinh se dudc d~ cap din: .(' Hf)p thoai (Dialogs)

.(' Tao va xali hQp thoai

.(' sa dung cdc thnnh. phdn di~u khdn

1. GIGI THI~U vE THANH PHAN GIAO DI~N DO HQA (GU!)

Chuang nay chung ta se tim hieu qua cac thanh phan giao dien cua Windows Forms. Ban se h9C each tao va ket gAn nhirng thanh phan giao dien nay cang voi bol xli ly s1J kien wang ll'ng vao ella s6 Form hay hQp thoai (Dialog) cua UTig dung. Thanh phdn giao dien d6 hoa se giup ban tao nen cac img dung Windows r§t bAt mat.

Thu vien cua Windows Form chua r§t nhieu thanh phlin giao dien ngtmi dung chuan co thE! sa dung cho U'ng dung cua ban, Rat nhi~u thanh phAn giao dien c6 nhung tinh nang cao cap do vi~c cai ti€n hem hAn nhilng thanh phan dieu khio'ln anh em cua chung trong he thu vien Win32 tru~n thong eua Windows. D6 III cac h(\p thoai, danh sach listbox, dii\u khil\n cay Tree, khung chua (panel), nhan (label), thanh cong C\I (toolbar) ... Molt tap hop phong phu cac hQp thoai tMng dung nhu hi,ip thoai chon file, chon mau, chon font, hop thoai in §n ... Sau giao di.;in menu, hi,ip thoai hay dialog la thanh phan giao dien dliqc sa dung nhi~u nh§t doi voi nguiYi dung. Nao chiing ta hay hii.t dAu tim hi~u chi ti€t vi\ nhilng thanh phan nay.

2. HOP THOAI (DIALOG)

. .

C6 hai ki~u holp thoai: kiE!u modal (bAt bui,ic nhap lieu) va kiilu modaless (kh6ng bAt buoc nhap li~lU). Hop thoai kigu modal yeu cliu nginri dung phai hoan tilt thao tac nhap li.;iu hoac nhilng yeu cdu chon 11Ja trlioc khi quay tro ve dong hoat di,ing chmh cua chuang trtnh (vi du nhu cac hQp thoai Options trong MS Word). HQP thoai kil\u modaless co th~ dliqc dung M thuc hien thao tac nao d6 nhung vAn cho pMp~gUc'ri dung tutlng tac vai pMn con l~i cua chuang trinh chfnh (vi du nhu hQp thoai tim kie'm Search Dialog)

HQP thoai nit heu dung neu no dliqc thiet ke" don gian. N6 giupchtrong trinh tang kha nang tirong tac v6'i ngu'ai sa dung, Tuy nhien sa dung qua nhieu hQp thoai nho chua it thong tin co th~ gay b1JC mmh cho ngu'c'ri dung. Nginrc Iai, cac hQp thoai vdi qua nhieu rnuc co th~ lam ng1ioi dung bili rai va khong bie"t phai chon nhirng mile nao truce,

H~p thoai trong thu vien MFC cua Visual C++ thuong la su pha tap gilta cac Uti ggi thUlin Win32 API va cac lap thu vien MFC huang dOi tuqng nM:t la trong vi~c trao Mi da li(\u sle dung M th6ng DDX (Dialog Data eXchange) gil1a cac thanh pMn di~u khi~n trong h(ip thoai, H(! th6ng trao d5i nay xern dir li.;iu trong hqp thoai nhu 180 cac bien da li~u thanh vien (data memeber) cua lap Dialog nhung I~i dung nhiJng bien nay nhu la vung tam M chua cac th6ng tin th~t sl,i hieu chinh bdi cac thiinh phan di~u khien tren b€. mat cua hQp thoai. Di~u nay co nghia III kh6ng co co ehe' cap nhat dien ra tire thrri cho hi)p thoai Mi VI da lieu can phili duoc chuyen den hoac di khoi cac thanh phan dieu khiil"n hay cua s6 con ben trong hop thoai boi nhiJng thong diep Windows. Hop thoai trong Windows Form hoan toan khac, Chung tuong tl,i nhu ban than lcng dung da tao ra n6, cac thanh phan dieu khi~n va eo chEf xU Iy hoan toan mang tinh huang d6i tugng cung nhu him

vi~c theo mqt logic hop Iy han. .

Trong moi truang .NET, hop thoai lilt thanh phan thie't yeu cua Windows Form. Cac di€.u khidn duqc dat tren hop thoai theo cung each rna ban dung M d~t chung tren cac caa s5 form thong thucngcua irng dung - bang c6ng C1,l true quan I hoac bang vi~c vie't rna.

M·'M:;y?!f~~:·'··'·'····

" · .• .:II ... _2_2_6 P~H_A_N_I_II_: _W_i_n_d_o_w_s_F_o_f_ms

2.1. Su d¥ng eae hQp thoat thong dung (common dialog)

Cac hQp thoai thOng dung dugc dung vci muc dieh dan gian h6a va tao SJ,C tuong tac th6ng nhat cho ngU'Cli dung sa dung h~ dieu hanh Windows. Hop thoai duqc hi~n thj Mng each goi ham ShowDialog. Tat ea cac hi)p thoai th6ng dung d~u ra doi va k€ thiia tit lOp SystelIl.Window9.Forms.CommonDialog. Ban cung co tM dung lap co sa nay M tao ra cac hQp thoai tuy bien theo y minh.

HQP tho~i thuilng sit dung nha't - FileDialog

HOp thoai thaClng duQ'c sa dung nhat trong cac hQp thoai d6 la hop thoai rna, doc va ghi file (file dialog). Windows Forms dinh nghra hai loai hop thoai dang file d6 la hep thoai rna file (open file dialog) va hOp thoai luu file (save file dialog). D€ dung cac hop thoai nay trong U'ng dung, ban c~n pMi khai bao bi~n thanh vien c6 k.i4!u OpenFileDialog hoac SaveFileDialog trong 16p ung dung chinh, Va cling nhu cac hQp thoai co ban khac, hai ldp nay cling biit nguon ttr lap System.Windows.Forms.Dialog.

Vi du 3.2-1 dl16i dAy la mot U'ng dung don gian cho phep hi~n thi hop thoai rna file.

VI du :3.~·1 filt'orw n.cs

using System;

using System.Drawing;

using System.Windows.Forms;

namespace Sams {

3-2: X .... ly giao dien d6 hoa (GUI)

227

: System. Windows. Forms. Form

MainMenu m_menu; ~enultem m_filemenu; i;: .

!voidonopenFile(Object sender, EventArgs e) :{

OpenFileDialog dlg=new OpenFileDialog ( ) ;

if (dIg. ShowDialog () == DialogResult. OK} {

MessageBox.Show( "You selected the file "+dlg.FileName};

}

'void OnExit (Object sender, EventArgs e)

,( .

Dispose () ;

fileopenapp( ) {

m_menu = new MainMenu ( ) ; m_filemenu=new Menultem( "&File") ;

j, m_menu.Menultems . Add(m_filemenu) ;

" Menultem t;

t=new Menultem( "&Open") ;

t. Click += new EventHandler (OnOpenFile) ; m_filemenu.Mepultems.Add(t};

t=new Menultem ( " - " ) ; m_filemenu.Menultems.Add(t);

t=new Menultem( "E&xit") ;

" t .Click += new EventHandler(OnExit); m_filemenu.Menultems.Add(t};

this . Menu = m_menu;

public static void Main() {

Application. Run (new fileopenapp () ) ;

}

~228

PHAN III : Windc

} / / end of Sams namespace

.~.

Hinh 3.2-1 Ket qua chuang trtnli fileopen.cs

Tren day la vi du dan gian nhat, ve each sudung hop thoai. Tro eao hi?p thoai thimng' eung ea'p nhieu chrre nang va hoat di)ng phirc tap h,

Mi)t thanh phan dieu khien ella hOp thoai dligc sii dung thea cacl biet khi ling dung duoc kie'n tao hOi Visual Studio .NET. Trong vi du du6 dung cua ta se tao ra mot, hop thoai khi chuang trinh chay, dOng thai ke nguon sV kien (event source) mang ten FileOK vao bi) xU- 19 tmh hu6ng ella nut nhan tren Form. Vi~e chuyEi'n giao eho bi? xii If Sl! kien trong nul khac so voi SI! kien cua menu. Dau hieu nhan dang eho bi) xii 1:

CaneelEventHandler la ham marig tE!n

void FN (obj ect sender, System.ComponentModel.CancelEventArgs

Vi du duoi day se cai d~t ca che' xii If" 51,1' ki~n khi nut nhan tren dl1qc kich:

Vi du 3.2·2 fHeopenevent.cs

using System;

using System. Drawing;

using System.ComponentModel; using System. Windows. Forms; using System. IO;

namespace Sams {

'I :i

Xii ly giao dH;m d& hoa (GUI)

229

fileopenapp : System. windows. Forms. Form

i~!!IDFileDialog openfiledlg1;

void OnOpenFile (Object sender, EventArgs e)

1

openfiledlg1.Filter = "C* files (*.cs) 1"+ "*.csIBitmap files (*.bmp) I*.bmp"; openfiledlg1.Filterlndex = 1; openfiledlgl.ShowDialog();

'. ;void OnExit (Object sender, EventArgs e) {

fileopenapp ( ) t'oo:l( I

.rm...:.menu :;; new MainMenU ( ) ;

: .hrn_filem.enu=new Menultem( "&File"); m_menu.Menultems.Add(m_filemenu); Meriultem t;

.t=new Menultem( "&Open") ;

t .Click += new EventHandler (OnOpenFile); m_filemenu.Menultems.Add(t);

t=new Menultem( "_") ; m_filemenu.Menultems.Add(t);

. t=new Menultem ( .. E&xi t " ) ;

t.click += new EventHandler (OnExit) ; 'm...:,.filemenu .Menultems. Add ( c ) ;

this.Menu = m_menu;

openfiledlg1 = newOpenFileDialog(); openfiledlgl. FileOk +'" new CanceIEventHandler(OnFileOpenOK);

J;'"void OnFil.eOpenOK (Object sender I CancelEventArgs e) ni-. (

I!J 230

PHAN III : Windows Fori

OpenFileDiaIog dIg = (OpenFileDialog) sender;

Stream FileStream;

if ( (FiIeStream = dIg. OpenFiIe () ) ! =null) {

/ I Th.uc hi~n xu lj dts lieu u day FileStream.Cloae (); I /Cu6'i cung lit dong lu6ng

}

}

public static void Main{) {

AppIication.Run(new fileopenapp{»;

}

} II end of Sams namespace

Su kien trong vi du tren day chi phat sinh neu nut nhan OK cua hop the duoc kich, d day cling c6 tM phat sinh Sl,i kien HelpRequested neu nut nhan HI trong hop thoai duoc chon.

HQP thoai file e6 thll duoc cau hmh sao cho chi hien thi danh sach m¢t file da. qua di~u kien 19C hoac tham chi c6 th&" dung rna file va tra v~ cho ban IT luang (stream) doc ghi ten file. Vi du, M 19C ra cac file dua tren killu file vi du tr da goi cac lenh sau:

openfiledlgl.Filter = "C# files (* .cs) 1"+ "*.csIBitmap files (*.bmp) I*.bmp"; openfiledlgl. Filterlndex = 1; openfiledlgl.ShowDialog();

Lap SaveFileDialog cung heat dQng thea each tuong tV bai vi tuong tl,l nl OpenFileDialog n6 thua huang vii. kg thira cac tinh nang tU lap FileDialog. nhu ban sli dung ham OpenFile(), file dUq'e chon se diroc tao ra hoac rna cho dich ghi file,

Lttu y: FileDialog, SaveFileDialog, OpenFileDialog ho trq thuQc tinh phep ban thay dBi each file dugc hien thi, danh da.'u hoac chon. Hay tham tifit trong tai lieu ,NET SDK

HQP 'thoai chun mau - ColorDialog

Chen mau la cong viec rift thuong hay lam trong moi trucng do hoa Windows. Rat nhieu chuang trinh dii co gitng viet rieng cho minh m(lt mau vi Iy do tao tinh each rieng va n6i bij,t cho chuang trinh. Tuy nhien,

s

CHUdNG 3-2: Xi\' ly giao di~n do hoa (GUI)

231\!eJ

va hiau qua nhat lit ban hay sli dung lop ColorDialog. Ngoai tiU di~m d~ dung ra, hQp thoai chon mau 180 hop thoai chuan de dung va quen thuec doi Val hau het ngu'iri dung irng dung Windows.

G9i hi1ln thi hQp thoai ColorDialog thea cung each ban da goi OpenFileDialog. Truce het tao tht; hien cua d6i tugng tit lop ColorDialog, sau d6 thl g9i phuong thirc ShowDialog M hi~n thi.

Hinh 3.2-2 la ket qua hien thi cua hop thoai chon mau ColorDialog theo nhieu che dQ khac nhau.

Lap ColorDialog tra v~ thong tin mau (1 dang doi tl19'ng Color. Thong tin nay baa gom tri alpha (hay con gci la dQ trong suot) , tri do (Red), xanh la cay (Green) va xanh da trrri (Blue) day 180 cac gia tri mau cua M RGB. ban cung co the chuyon d6i chung sang hi; mau HUE dieu ta bAng do mau, dO sang va do baa hoa.

ColorDialog con cung cap mQt thuQc tinh mang ten AllowFullOpen cho phep hien th] nut nhan tuy bien dinh nghia mau, Neu ban sli dung thuoc tmh FullOpen, hlip thoai chon mau se hi€!n thi ij che de? phirc tap va di1y du nhilt d€! ban tl,f dinh

ri nghja gia trj mau can chon. Thuoc tinh CustomColors la met mang chtra cac gia

p trj mau co thil ducc chon ra dil dien van (\ mau tuy bien.

Dirdi day la chuang trrnh vi du cho thify each sU' dung h(ip thoai chon mau

o Color Dialog:

,t

Vi du 3.2-3 colordlgs.cs

n

us ing Sys tern}

using System. Drawing;

using Syst:e111. C0111ponentModel; using System. Windows. Forms;

namespace Sams (

classColorStretcher System.windows.Form~.Form

voidOnFull(Object sender, EventArgs e)

ColorDialog dlg=new ColorDialog ( ) ; dIg. FullOpen = true;

dlg.ShowDialog();

\!J232

PHAN III : Windows Forn

}

void OnNoCustom(Object sender, EventArgs e) {

ColorDialog dlg=new ColorDialog ( ) i dlg.AllowFullOpen = false;

dlg.ShowDialog{);

}

void OnNormal (Object sender, EventArgs e)

{

ColorDialog dlg=new ColorDialog ( ) ; dIg. Color = Color. PaleGoldenrod; dlg.ShowDialog();

}

void OnWithColours (Object sender, EventArgs e) {

ColorDialog dlg=newcolox-"riialog (); dIg. FullOpen '" true;

IICdu l~nh ndy dinh. nghia 5 mau tily bien ddu tien thief lfjp II nhu la cdc gia tri int, vi du. OxAARRGGBB trong d6 AA la / I dr,j trang suot, RR la tri do GG Ld tri xanh duang con BB Ia 1/ tri xanh Ld cay. Cdc tri nay biiu dUn a dgng s6' hex.

dlg.Cu8tomColors = new int [5] { OxOOff8040, OxOOc256fe,

OxOOaa2005, Ox0004f002, Ox002194b5};

}

dlg.ShowDialog();

ColorStretcher() {

1/ Truoc tien lit menu d€ lua ch9n

~ ....

CHUdNG 3·2: Xl! lj giao di~n d6 hoa (GUI)

233~

Menultem top, temp;

top=new Menultem( "ColorDialog"); m.Menultems.Add(top);

temp=new Menultem( "Full") ;

temp. Click+=new EventHandler (OnFull) ; top.Menultems.Add(temp);

temp=new Menultem( "No custom") ; temp.Click+=newEventHandler(OnNoCustom)i top.Menultems.Add(temp);

temp=new Menultem( "With Colours"); temp.Click+=new EventH~ndler(OnWithColours); top.Menultems.Add(temp);

temp "'new Menultem ( "Normal") i

temp. Click+=new EventHandler (OnNormal) i top.Menultems.Ad~(temp);

this. Menu = mi

}

public static void Main ( ) {

Application. Run (new ColorStretcher ( ) ) i

}

}

Lu'U j cac gill. tri mau tuy bien dl1qc dinh nghla nhu Ia tr] nguyen integer trong b., xiily sJ! kien OnWithColours

ColorDialog dlg=new ColorDialog ( ) ; dIg. FullOpen = true; dlg.CustomColors = new int [51 {

OxOOffB040, OxOOc256fe,

:J, OxOOaa200S, Ox0004f002, Ox002194b5};

~234

PHAN III : Windows Forms

E)~ ldy v~ gia tr] rnau dl!qc chon tir hQp thoai CoiorDialog, dan gian ban chi can doc ni}i dung cua thuQc tinh Color. 'I'hiet lij.p gia tr] cho thuoc ttnh nay tru'ac khi gci phuong thirc ShowDialogO se lip dM mau duoc chon van 11k hqp thoai hi€n thi, E)i~u nay se rat thuan lei cho viec thay d6i mau da dl1qc thiet lij.p san trong ung dung trudc do. Chung ta thuc hio?n dieu nay trong b';' xl1ly su kien OnNormal. f)g thay duoc mau da chon, ban can ktch chuot vao nut nhan Define Custom Color. Bang rnau se xuat hien ben tay phai con mau chon se Iii mau tuong irng voi gia tri rna ban chi dinh,

Hlnh 3.2·2 Kit qud hien th] cua chuang trtnh. Colordlgs.cs HQP thoai chon font - FontDialog

Trong Windows chon Font chu cho van ban (text) rlit quan trong va thuong xuyen duqc su dung trong rAt nhieu chuong trinh. Windows cho phep ban chon ten font (Times Roman, Arial, Tahoma ... ), co chtr. ki~u chit (darn, nghieng, gach chan). Lap Font.Dialog rnot, Ian nua giup lij.p trinh vien trong moi trunng .NET dan gian hoa thao tac xV Iy font.

Ky thuat dg goi va hi~n thi hop thoai font hoan toan gi6ng vdi cac h9p thoai truCtc day. Thuoc tinh cua hop thoai va dC! li~u tra v~ se duy nhat va chi dinh ro loai font cling nhu nhhung thong tin lien quan den font chtr rna nguci dung da chon.

Vi du dl1ai day la m9t (eng dung dan gian voi mQt nhan va mQt nut nhan cho phep chon hign th] h(lp thoai font. Hop thoai font ban than n6 chua rat nhieu tuy chen, ban co th~ thay d6i va thiet lap nhi1ng tuy chon nay thong qua thuoc tinh. Cac tuy chon nay con qui dinh each lam viec cua hQp thoai font. Trong vi du

CHudNG 3·2: Xli 19 giao di~n dB hoa (GUI)

2351iJ

cua ta, nut nhan Apply trong h9P thoai dliQ'c thiet l~p va giin vdi su kien cap nhat font chir cho nhan khi nut duoc kich hoat,

Vi du 3.2·4 fontdlg.cs

using System;

using System.ComponentModel; using System. Drawing i

using System. Windows. Forms i

namespace Sams {

classFontPicker System.Windows.Forms.Form {

Button b; Labell;

void OnAppIy(Object sender, System. EventArgs e) (

FontDialog dIg'" (FontDialog) sender; 1.Font",dlg.Font;

void OnClickedb (Object sender, EventArgs e) {

/ I Tqo h¢p tlioai Font

FontDialog dlg",new FontDialog ( ) ;

II Kluii tao h¢p thoai uai thong tin font co san trong d6i tuang nhiin. dlg. Font = 1. Font;

II FJ(jt thu¢c tinh eho phep hien th]: nut "Apply" dlg. ShowApply = true;

IIGdn phuoru; thuc xu lj su' ki¢n OnApply eho nut nluin dIg. Apply += new EventHandler(OnApply);

if (dIg. ShowDialog () ! = DialogResult. Cancel} {

I. Font = dlg. Font;

}

}

public FontPicker ( ) {

r

.

,

r·:

I, ~;, -.

III 236

PHAN III: Windows Fo

this. Size=new Size (416,320);

~l ;

l=new Label ();

1. Location = new Point (8, 8); 1. Size = new Size (400,200) ; 1 . Text = II 0 1 2 3 4 5 6 7 8 9

\nabcdefghijk1mnopqrstuvwxyz"+

" \nABCDEFGHIJKLMNOPQRSTUVWXYZ";

1. Font = new Font ("Microsoft Sans Serif", 18f); this.Contro1s.Add(1);

b=new Button ();

b . Text = "Choose Font" ;

b . C 1 i ck + = new EventHand1 er (OnC 1 i ckedb) ; b. Location = new Point (8,250) ;

b. Size = new Size (400,32) ; this.Contro1s.Add(b);

}

static void Main() {

App1ication. Run (new Fontpicker(»;

} }

Ban bien dich chuang trtnh tren tit dong It?nh nhu sau

csc It:winexe fontdlg.cs

2.2. H9P tho~i Print va Print Preview

Ve nQi dung cua m(it tai li~ll len man hmh hoac ra may in doi hOi ban f c6 kiEln thuc v~ d6 hoa. Ky thuat d6 hoa se duCJc chung ta nghian euu chi tiElt tr chuang sau. Chung ta chua cdn ban sau dEln van d~ d6 hoa trong chuang nay. ciin ban hieu duCJc co chEl in va xem truoc khi in (print-preview) dinrc thuc 11 nhu the nao qua Ung dung minh hoa sau day:

Vi du 3.2-5 pr-irrtprov'iew.cs

namespace Sams

{

using System;

using System. Drawing;

using System. Drawing. Printing; using System. Collections; using System.ComponentMode1; using System. Windows. Forms;

~~dNG 3-2: XU'ly giao dien d6 hoa (GUll

237~

".1 I J <summary>

'/}~ II ppView ta thanh pluin dii!u khiin dan gidn eua Windows cung cap I J nhiing ham ve thOng tltuang cho phep ve ra man hinh. va may in

J J hoqc thuc hi~n chile ruing print-preview

/ / < / summary>

public class ppView : System. Windows. Forms. Panel {

[-

I phai trong r. Chi

hi~n

-

private ArrayList points;

point mousePoint;

void OnClick(Object sender, MOl.lseEventArgs e) {

if (points == null) {

points=new ArrayList ();

}

points.Add(mousePoint); Invalidate () ;

void OnMouseMove (Obj ect sender, MouseEventArgs e) {

mousePoint = newPoint(e.X,e.Y);

}

public ppview() {

this. MouseDown+=new MouseEventHandler (OnClick) ; this.MouseMove+=new MouseEventHandler(OnMouseMove); this.BackColor=Color.Whitei

}

private void DrawSmiley{Point pt, Graphics g) {

g.FillEllipse(Brushes.Black,pt.X-52, pt.Y-52,104,104); 9.FillEllipse(Brushes.Yellow,pt.X-50, pt.Y-50,lDD,lDO); g.FillEllipse(Brushes.Black,pt.X-3D, pt.Y-IO,60,40); g.FillEllipse(Brushes.Yellow,pt.X-35,

I!!J 238

PHAN III : Windows Forms

pt.Y-IO,70,35); g.FillEllipse(Brushes.Black,pt.X-25, pt.Y-15,lO,lO); g.FillEllipse{Brushes.Black,pt.X+lO, pt.Y-15,lO,lO);

DrawSroiley(p,g};

private void DoDraw(Graphics g) {

if (points ='" null) {

return;

}

foreach(Point p in points) {

}

}

protected override void OnPaint (PaintEventArgs e) {

if (points == null) {

return;

} DoDraw(e.Graphics);

}

public void OnprintPage (Object sender, PrintPageEventArgs e)

{

if{points == null) {

return;

} DoDraw(e.Graphics};

}

}

public class MDIChildForm : System. Windows. Forms. Form {

private SYBtem.ComponentModel.Container

private ppViewvw;

components;

ms

CHUaNG 3·2: XU' ly giao di~n d6 hoa (GU!)

239~

/ I Phuong thue eho phep truy eg.p bien ctla lap public ppView View {

get

{

return vw;

}

}

public MDIChildForm{) {

InitializeComponent();

vw=new ppView();

vw. Location = new Point (3,3) ;

vw. Size = new Size (this. Size .Width- 6,this.Slze.Height-6);

vw.Anchor=AnchorStyles.Leftl AnchorStyles.Topl AnchorStyles.Rightl AnchorStyles.Bottom;

this.Controls.Add(vw);

1/

/ / TODO: Them van bdt ky doan nui new eua bq.n sau phan / / Initializetlomponent

/I

}

II I <summary>

I / I ouu ph6ng tai nguyen I / I < I summary>

public override void Dispose () {

base.Dispose(); components.Dispose();

/ II <summary>

III Phuong thuc h6 tro cho Designer - Dung thay ddi phuong thuc

/ I / nay trong edc ella s6 soan thiio eode eua m6i truimg phdt triin

I II < / summary>

\Il240

PuAN III : Windows Forms

private void InitializeCornponent () {

this. components = new System.ComponentModel.Container (); thi s . Text = "MDIChi ldForm" ;

this. AutbScaleBaseSize =

new System. Drawing. Size (5, 13); this.ClientSize = new System. Drawing. Size (328, 277) ;

}

}

II I <summary>

III Chuang trinli chinh III < I summary>

public class MainApp System.Windowa.Forms.Form {

private System.ComponentModel.Container components; private System. Windows. Forms . Menultem FileExit; privateSystem.Windows.Forms.MenuItem

FilePrintPreview; private System. Windows. Forms. MenuItem FilePrint; private System. Windows . Forms . Menu It em FileNew; pri vate System. Windows. Forms. MenuItem menuIteml; private System.Windows.Forms.MainMenu mainMenu1;

II

II Ban dfjt them cac doan. rna khai too ella mlnh a day 1/

public MainApp () {

1/

I I Ho tro eho Windows Form Designer 1/

InitializeComponent():

}

I f I <summary>

III X6a bo tdi nguyen dii. sa dung / / / < / summary>

public override void Dispose ()

s

CHUdNG 3·2: XLtly giao dien d6 hoa (CUI)

2411iJ

{

base.Dispose(); components.Dispose();

private void InitializeComponent () {

this. components = new System.ComponentModel.Container (); this. mainMenul '" new System.Windows.Forms.MainMenu (); this. FilePrintPreview = new System.Windows.Forms.MenuItem (li this. FileExit = new System.Windows.Forms.MenuItem (l; this. menuIteml = new System.Windows.Forms.Menultem (); this. FileNew = new System.Windows.Forms.MenuItern (l; this. FilePrint '" new System.Windows.Forms.MenuItem (l; mainMenul.MenuItems.AddRange(

new System. Windows. Forms .MenuItem[l]

{this.rnenulteml}l; FilePrintPreview. Text = "P&review ••. " ; FilePrintPreview. Index = 2; FilePrintPreview.Click +=

new System. EventHandler

(this.FilePrintPreview_Click); FileExit.Text = "&Exit";

FileExit. Index = 3;

FileExit .Click +'" new

System.EventHandler (this.FileExit_Click); menuIteml.Text = "&File";

menuIteml. Index = 0 i menuIteml.Menulterns.AddRange(new

System.Windows.Forms.Menultern[4]

{this.FileNew, this.FilePrint,

this. FilePrintPreview, this.FileExit});

FileNew.Text = "&:New"; FileNew.Index = 0; FileNew.Click += new

System.EventHandler (this.FileNew_Click); FilePrint.Text", "&Print •.• "';

FilePrint . Index = 1;

~242

PHAN III : Windows FOIT

FilePrint . Click +'" new

System.EventHandler (this.FilePrint_Click)i this. Text = "MainApp";

this .AutoScaleBaseSize = new

System.Drawing.Size (5,13); this. IsMdiContainer = true;

this . Menu = this .mainMenu1; this. ClientSize = new

System. Drawing. Size (368,289);

}

protected void FileExi t_Click (obj ect sender, System. EventArgs e)

Application.Exit();

}

protected void FileprintPreview_Click(object sender, System.. EventArgs e)

PrintPreviewDialog d=new PrintPreviewDialog ( ) ; Print Document doc = new PrintDocument ( ) i

MDIChildForrn f = (MDIChildForm)this.ActiveMdiChild; ppview vw = f . View;

doc. Print Page += new PrintPageEventHandler(vw.OnPrintPage);

d.Document=doc;

d.ShowDialog();

doc. PrintPage - = new PrintPageEventHandler(vw.Onprintpage);

}

protected void Fileprint_Click (object sender, System. EventArgs e)

{

Print Dialog dIg", new printDialog ( ) ; Print Document doc = new Print Document ( ) ;

MDIChildForm f = (MDIChildForm)this.ActiveMdiChild; ppview vw = f. View;

doc. Print Page += new PrintPageEventHandler(vw.OnPrintPage)i

I1S

CHIJdNG 3-2: Xa Iy giao dien dO hoa (GUll

2431!!J

dIg. Document=doc;

dlg.ShowDialog();

}

doc. Print Page' - = new printpageEventHandler(vw.onprintpage);

protected void FileNew_Click (object sender, System. EventArgs e)

(

MDIChildForm f "" new MDIChildForm() ; f_MdiParent=this;

f.Show() ;

}

1/1 <summary>

1// Chuang trinh. chinh J II «l summary>

public static void Main (string [1 args) {

Application. Run (new MainApp () ) ;

}

Chuong trmh cua ta c6 3 thanh phan. Thanh phan form, goi la MainAppp.

Day la loai form thea giao dien da tai lieu (MDI - hay Multiple Document Interface) truy~n thong ella Windows. etta s6 MDI bao g&m nhieu ctta s6' con thuQc I6p dOi tllqng MDIChildForm. Nhung d6i tllqng cua s6 con nay lai chua trong n6 m()t thanh phan d6i tllqng khac goi 18. ppView.

fJoi tinrng ppView thuc hien uit eii cac cong viec nhu thea doi trang thai chuot, them cac di~m va danh sach mang, ve mQt khuon m:}.t cllai tai mlii di~m 100 tru. ppView cling SLt dung mQt ham ve dun giiin nhan dOi tllqng Graphics lam dOi so'.

Co che' in (print) va xem trllOe khi in (print-preview) sa dung PrintDocument M xir ly sl! kien phat sinh cho mlii trang can xem hoac in. fJ~ c6 tM sa dung duqc eac ti~n ich print va print-preview, OnPaint va OnPrintPage dB. gQi mQt thu tuc ve dan giiin d6 la Dofrrawt). Thu tuc ve nay se chiu trach nhiem ve ra man htnh hay thie't bi may in tuy thea ngii' canh diroc goi. DoDrawO nhan d6i sO' la ki€lu d6i tuqng Graphics cho bie"t ngtr canh ve cila thie't bi. Graphics dtl thong minh dil nhan ra dQ phan giiii can thiet can st( dung M CD gian hmh cho phil hop tren thiet, bi ve fa.

"1J244

PHAN III : Windows Forms

Neu ban thich thu voi d6 hoa thi nhung ham sau trong chuong trmh se giup ban ve ra khu6n mat cuoi xinh xan:

private void DrawSmi1ey(Point pt, Graphics g) {

g.FillEllipse(Brushes.Black.pt.X-52~ pt.Y-52.104.104); g.FillEllipse{Brushes.Yellow.pt.X-50, pt.Y-50,100.100); g.FillEllipse(Brushes.Black.pt.X-30, pt .Y -1 ° , 60 , 4 a ) ; g.FillEllipse(Brushes.Yellow.pt.X-35. pt.Y-10,70,35); g.FillEllipse(Brushes.Black,pt.X-25, pt.Y-15,lO,lO); g.FillEllipse(Brushes.B1ack,pt.X+10, pt.Y-15,lO,10);

}

3. T~O HQP THO~I

Trong moi truong .NET. vii)c di/?'n dich va xern khi nao form nen la r thoai khi nao khcng con tuy thuoc vao muc dich rna l<1.p trtnh vi en lua chon. N da de cap trudc day, chung ta co hai loai hop thoai: hop thoai modal yeu cau ng dung phai ket thue nhap lii)u trudc khi quay trd ve chuong trmh ehinh. Va I thoai modeiess eho phep tuong tao song song vdi chuong trinh. GiiJa form va 1 thoai ban nen quyet dinh ean tij.p trung ph1in nao danh eho form va phan : danh eho hQp thoai. Neu hQp thoai qua phuc tap no se nan khong hiJu dung danh mgt chirc nang von co clla hop thoai.

3.1. Hc}p thoai model va modeless

HQP thoai duoc tao ra theo cung each tao form. Lop Form chua mQt tI tinh mang ten Modal, ne'u ban d~t thuoc tinh nay la true thi Form tao ra se la thoai dang modal. Phuong thuc Show Dialog() ella Form se d~t gia trj cho tl tinh nay hQ ban va cho phep ban hien thi form iJ dang modal. Vi du duai dii chuang trinh eho phep hien thj cira so form d dang hqp thoai iJ ca hai ch modal va modeless.

Vi du 3.2-6 Models.cs

using System;

us irtgSystem .ComponentMode 1 ; uSing System. Drawing;

using System. Windows .Forms; using System. Collections;

ns

CHUONG 3-2: Xli]y giaodien db hoa (GUI)

2451!J

up class ADialog : Form {

lUQC Mp :lUQC s Ia ~ d~

private Button ok, can;

public bool Modeless {

set (

if(value) {

ok.Click += new EventHandler (OnCloseModeless); can.Click += new EventHandler(OnCloseModeleaa)i

}

}

void OnCloseModelesB (Object sender, EventArgs e) {

this.Close();

publ ic ADialog ( ) (

this. Location = new Point (100,100); this. Size=new Size( 200,100) ;

this. FormBorderStyle =

FormBorderStyle.Fixedoialog;

ok = new Button{) ; ok , Text = "OK";

ok , DialogResult = DialogResult.OK; ok. Location '" newPoinl:(20,10); ok.Size:= newSize(80,25); this.Controls.Add(ok);

can = new Button ( );

can.Text = "Cancel"; can.OialogResult '" DialogReault .OK; can. Location '" new Point (110,10); can.Size '" newSize(80,25); this.Controls.Add(can);

}

} .

111246

pRAN III : Windows Forms

class AnApp : Form {

void OnModeless (Obj ect sender, EventArgs e) {

ADialog dig = new ADialog ( ) ; dlg.Text = "Modeless";

dlg .Modeless = true; dlg.Show();

}

void OnModal (Object sender, EventArgs e) {

ADialog dlg '" new ADialog ( ) ; dlg.Text = "Modal",; dlg.ShowDialog(};

}

public AnApp () {

this.Size=new Size(400, 100);

this. FormBorderStyle = FormBorderStyle.FixedDialog; this.Text = "Dialog Mode TeSter"i

Button modal", new Button () ;

modal. Text = "New Modal dialog" ;

modal. Location = new point (10, 10) ;

modal. Size = new Size (180, 25) ; modal.Click += new EventHandler (OnModal) i this.Controls.Add{modal);

Button modeless = new Button();

modeless . Text = 11 New Modeless dialog" ;

modeless. Location = new Point (210,10) ;

modeless .Size = new Size (180,25); modeless.Click += new EventHandler(OnModeless); this.Controls.Add{modeless);

}

static void Main{ ) {

Application.Run( new AnApp () ); }

}

Trong vi du tr~n, chuang trlnh chinh 1ft mot form vai hai nut nhan. nut nhtln dung gQi va hilln th] hQp thoai dang modaless. Nut nhan con lai goi

ns

CHUdNG 3-2: Xiily giao di~n d6 hila (GUI)

2471!J

thi hQp thoai dang modal. Khi kich nut nhan hi~n thi hQp thoai dang modal ban chi c6 tM hi~n thi diroc mQt. Trong khi d6, ban c6 tM kich chuet van nut nhan hil!n thi nhieu IAn cua 56 hOp thoai modaless khac nhau. D6ng ciia s6 cua chuang trinh chinh cling khien eho t8:"t ca cac etta s6 modaless dang rna dong theo.

3.2. Chuy~n dii li~u giiia eac thanh phdn trong hi)p tboa'i

Dan gian nhat hQP thoai c6 tM chi d.n chuyen da li~u v~ 51! ki~n cho billt nut nhan nao da duoc kich hoat M dong va thoat kh6i hQp thoai. Cac hQp thoai phirc tap cac tM tao 5<1n nhii"ng thuQc tinh cho phep l!j.p trinh vien dung n6 M Iuu hoac truy xuat cac thong tin lien quan de-n cac thanh phan dieu khil!n trtm hop thoai. Vi du form hil!n thi hoi phuong thtcc ShowDialog c6 tM duge dong lai bang each thiet lap gia tri eho thuoc tinh DialogResuIt. Gia tri nay se duge tra v~ cho doan rna dii goi hi~n thi h(ip thoai.

Du6i day la vi du minh hoa cho thdy cac trao d6i da li~u cua hOp thoai v6i chirong trinh hay ciia 56 form ehinh:

Vi du 3.2-7 simpledialog.cs

using System;

using System. Drawing;

using System.ComponentModel; using System. Windows. Forms;

namespace Sams {

class SimpleDialog : Form {

public SimpleDialog ( ) {

1/ Tao hai nut nluin

Button OkButton=new Button(); OkButton.Text = "Ok"; OkButton.DialogResult = DialogResult .OK; OkButton.Location = new Point (8, 20); OkButton.Size = new Size (50, 24); this.Controls.Add(OkButton);

Button CancelButton;"new Button(); CancelButton.Text = "Cancel"; CancelButton.DialogResult = DialogResult.Cancel; CancelButton. Location", new Point (64,20); CancelButton.Size = new Size(50,24) i this.Controls.Add(CancelButton);

Ii;: mi.L', mhl

this.Text="Dialog";

this. Size = new Size (130,90) ;

r

!J248

PuAN III : Windows Forms

Application.Run(new AnApp (» ;

this. F.ormBorderStyle '" FormBorderStyle.FixedDialog; this.StartPosition = FormStartPosition.CenterParent; this. ControlBox = false;

}

}

class AnApp : Form

{

void OnTest (Obj ect sender, EventArgs e) {

SimpleDialog dIg = new SimpleDialog ( ) ; dlg.owner = this;

if (dIg. ShowDialog () == DialogResult. OK) MessageBox. Show ( "Youclickeq ·Ok'.');

el~e . . .,

MessageBox. Show ("You clicked Cancel") ;

}

public AnApp ( ) {

thi s . Menu = new Ma inHenu ( ) ;

this . Menu.Menultems . Add (new Menultem( "Dialog"»; this.Menu.Menultems[O] .Menultems.Add(new

Menultem{"Test"»; this.Menu.Menultems [0] . Menultems [0] .Click += new EventHandler(OnTest);

}

static void Main ( ) {

}

}

}

HQpthOl;d cling nhu form co th~ chua ID9i thanh phAn di~u khien cUa Windows Forms. HOp thoai c6 tM dung dg trii ve cac gia tri dan giiin chlta thOng tin cua checkbox, nut radiao, 0 textbox ... £>6 thuc hien di~u nay, ban can co kh8 nang tra v~ nhi1ng thong tin plurc tap hem Is gia tri dan gian nhu trong vi du tr~D.

Dil" li~u trong Mp thoai cac tM dugc truy xuAt thOng qua cac bien tha vien chung (public member) hoac thOng qua cac phuong thac va thu/)c tinh the vao M dung cho cong vi~c d~c bi~t cua ban, Neu ban la tin d6 l~p trmh MFC tr'

h

CHl1dNG3-2: Xli 1,;' giao dien d5 hca (GUll

249~

c++ ban cAn chuyen thci quen truy xuit da liiju bang' cac bien thanh vien tro thanh truy xuat thong qua thuoc tinh. Truy XU!lt thuoc tinh hay phurrng' thuc d6ng vai tro rit Ian trong tuong tac cua cac doi nrong .NET.

Tuong tac giira ngudi dung va hQp thoai c6 tM rat phirc tap, M(it nut nhan dl1qc kieh hoat, 0 cheek box diroc chon hoac cac hanh d(ing khac c6 the sinh ra su kien duoc bfiy bai doan ma do hop thoai ella ban cai d<)t va thuc thi truoc ca khi nut nhan OK duqc nhan. 'I'hiet k€ mQt hop thoai c6 the hoan toan gicng voi each thi€t ke" form nrri se goi hQp thoai.

3_3. Ki~m tra h«jp l~ (validation)

MQt vai thanh phan di~u khion, vi du nhu di~u khien NumericUpdown, e6 nhtrng ling xl! dij.c thu cho viec kiem tra hop lij. l)i~u khidn nay chua thuoc tinh Minimum va Maximum c6 the ducc dung M dinh nghla pham vi cua so the hien trong di~u khien, Thanh phdn di~u khien cling se phat sinh mot sl,! kien khi n6 dang kiem tra chinh da liiju cua chinh ban than mmh va sau khi da lieu da kiem tra xong. Ban co the bay cac su kien nay va chung thuc 81,i d(: dang hen trong Windows Forms so vdi MFC. Sv kien kiem tra da lif;iu du:gc k€ thira tU ldp System,Windows.Forms.Control va se phat sinh bilt ky lfui 0<\0 di~u khien mat quyen kiem scat (lost focus). Di&u khien se milt quyen kiem Boat khi ngu'ai dung chuyen qua s11 dung dieu khien khac (chang' han nhu khi nhan phim Tab di chuyen giUa cac thanh phan dieu khien), hoac khi ban kich chuot vao nut nhan M d~t gia tr] cho thuQc tinh DialogResult va d6ng hop thoai, Neu dieu kien kiem tra du lieu nhap vao khong hcp If;i, hQp thoai se hi ngan kh6ng cho dong lai.

Trong chuong trmh vi du du'ai day, hQp thoai sil khong dong lai trir khi viec ki4m tra gia trj so chua trong thanh phan di~u khien la hop l~

Vi du 3.2-8 dialogValid.cs

using System;

using System.ComponentModel; us ing Sys t em. Drawi ng ;

using System. Windows _ Forms; using System. 10;

using System. Text;

namespace Sams {

classDialogValid System.Windows.Forms.Form

a {

,g it

private Button okButton; private Button cancelButton; private NumericUpDown num;

1.

m n

public decimal Num {

If'

l!!J 250 PHAN III : Windows Form

get { return nwn. Value; }

set { num. Value = value; }

}

void Onvalidating (Object sender, CancelEventArgs e) (

MessageBox.Show( "NurnericUpDown is validating");

}

void OnValid (Obj ect sender, EventArgs e) {

MessageBox.Show("NwnericUpDown is valid") i

public DialogValid ( ) {

Size = new Size (400,100) ;

ForrnBorderStyle = ForrnBorderStyle . FixedDialog; Text = "Dialog test" ;

f f dr'Jt cac nut nluin. len Form

okButton = new Button ( ); okButton.DialogResult = DialogResult.OK; okButton.Location = new Point (20,2B); okButton.Size = new Size(BO,25); okButton.Text = "OK"; Controls.Add(okButton);

cancelButton = new Button ( ) ;

cancelButton. Location = new Point (300,28) ; cancelButton. Size = new Size (80,25) ; cancelButton.Text = "Cancel";

cancelButton. DialogResul t :: DialogResul t. Cancel:

Controls.Add(cancelButton);

f f dq,t nluin l~n form

Label 1 = new Label () ;

1. Text = "NwnericUpDown";

1. Location = new Point (20, 5); l.Size = new Size(120,25); Controls.Add(l):

I I dg.t thanh phsin. Numeric ten form nurn = new NurnericUpDown() ;

nurn. Location = new Point (140, 5) ; nurn. Size = new Size (80,25) ;

'ms

CHUONG 3-2: Xii ly giao dien do hoa (GUI)

251~

num.Minimum == (decimal) 10.0; num. Maximum == (decimal) 100.0; num.Value = (decimal)10.0;

/ ! B9 xU: lj su' ki¢n cho thdy qua trinh kiim tra du Lieu num.Validating+==new CancelEventHandler(OnValidating); num. validated+==new EventHandler (OnValid) ;

Controls.Add(num);

}

class ddApp System. Windows. Forms. Form {

void OnExit (Object sender, EventArgs e) {

Application.Exit();

void OnDialogTest (Object sender, EventArgs e) {

DialogValid dIg == new DialogValid () ;

DialogResultr==dlg.ShowDialog();

stringWriter sw=new StringWriter(new StringBuilder(»;

sw.WriteLine("DiaIogreturnvalue = {O}"+ "\nNumericUpDown '" (I}", r, dIg .NUm);

MessageBox.Show(Sw.Tostring(»;

}

public ddApp ( ) {

MainMenu mm=new MainMenu () ;

mm.MenuItemS • Add (new MenuItem( "&Dialog") );

•'c'."'~." ,.J4. .: enuIteJllS[OJ .MenuItems.Add{new

l,;'" «: ..... MenuItem( "&Test",

new EventHandler (OnDialogTest) ) ) ;

mm.MenuItems [0] . MenuItems . Add (new MenuItem( "-"»;

~25.2

PHAN III : Windows Forrm

mm.MenuItems[O] .MenuItems.Add(new MenuItem( "E&xit",

new EventHandler (OnExi t ) ) ) ;

Menu", rom;

}

static void Main() {

Application.Run(new ddApp () ) i

}

}

}

Khi ban tl,i xay dung mQt thanh phan dieu khien, ban c6 th~ str dung thu tinh CauseValidation M yeu cau 51! kien Validating va Validated phat sinh II dieu khien cua ban mit quyen ki~m soat,

4. SU DlJNG cAc DIEU KillEN

Cho de'n thai dii'im nay chung ta da su dung va lam quen voi hai thil phan dieu khi~n d6 18 nut nhan (Button) va NumericUpdown. Windows For cung ellp rat nhieu dieu khi€n hUll Ich khac, chang se dl1ge chung ta xem qua tiet sau day.

4.1. Checkbox va mit Radio

Cac ling xli cua Checkbox va nut radio co ban rat gi6ng vdi nguoi anh cua no trong MFC. M~c du v;j.y Windows Forms kh6ng sil dung co che DDX trao dai du li~u giua cac nut dieu khi~n nhu trong MFC.

Checkbox co thii' dl1qc d~t true tiep tren form boac trong m1)t khung c hay met nhom bao g6m nhieu nut. Tuy nhien, bdi vi checkbox noi chung kl' phu thuQc vao trang thai cua cac nut khac trong nhorn cho nen xli ly checl tuong d6i don gian.

.

Nut nhan radio tht!?1ng dl1gc ke't hop voi nlurng nut khac va thuong

chung trong mdt nhorn de nut quan h~ voi nhau. Chon nut nay se dAn den chon cac nut khac trong cung nhorn.

Lay ve trang thai cua cac nut nay dan gian chi la van de d9C true tiel tri hien hanh ciia chung hoac ki€m tra cac sV kien kich ehuQt len nut M the sl! Iva chon cua ngtfC1i dung.

Vi du sau day bao g6m met sO' nut checkbox va radio minh hoa nhO"ng thuc khac nhau d~ d,?c trang thai va My sl,! kien phat sinh W chung.

Vi d~ 3.2-9 d iu log te st.c»

using System;

LS

CHUdNG 3-2: Xli ly giao di~n d6 hoa (GUl)

253~

~c hi

lh ns hi

sm

ng )oX

i!jt lUY

using System.ComponentModel; using System. Drawing;

using System. Windows . Forms; using System. IO;

using System. Text;

namespace Sams {

classDialogTest system.windows.Forms.Form {

private Button okButton; private Button cancelButton; private CheckBox checkbox; private GroupBox radiogroup;

private RadioButton radiol, radio2. radio3;

public int Radio;

public bool Check

get { return checkbox. Checked; } set { checkbox. Checked = value; } }

void OnRadio (Obj ect sender. EventArgs e) {

int n=O;

foreach (Obj ect 0 in radiogroup. Controls) {

if (0 is RadioButton) (

RadioButton r= (RadioButton) 0; if(r.Checked)

Radio=n;

n++i

}

}

}

public DialogTest () {

Size = new Size(400, 300);

FormBorderStyle = FormBorderStyle. FixedDialog; Text = "Dialog test" ;

.II aqt cdc nut nhan lim form okButton = new Button{) i

iljj 254

PRAN III : Windows Forms

okButton.DialogResult == DialogResult.OK; okButton.Location = new Point (20, 230); okButton.Size = new Size (80, 25); okButton.Text '" "OK"; Controls.Add{okButton}i

cancelButton == new Button () ;

cancelButton. Location = new Point (300,230) ; cancelButton. Size = new Size (80. 25) ; cancelButton.Text = "Cancel";

cancelBut ton. DialogResul t = DialogResul t . Cancel; Controls.Add{cancelButton}i

II dqt cdc nut nluin check box len form checkbox = new CheckBox ( ) ;

checkbox. Location :: new Point (20, 30); checkbox. Size = new Size (300,25); checkbox. Text == "CheckBox"; Controls.Add(checkbox);

II d(it cdc nut radio len forms

I I Cdc nul nay duac gam vao In¢t nhom. GraupBox radiogroup '" new GroupBox ( ) ;

radiogroup . Text:: "Radio Buttons" ; radiogroup. Loca t ion = new Point ( 10. 60) ; radiogroup. Size = new Size (380,110) ; Controls.Add(radiogroup};

radio1 = ne\.i RadioBut ton ( ) ;

radio1. Location == new Point (10,15) ;

I I T9a a¢ iuang d6i trong nh6m

radio1. Size == new Size (360,25) ; radio1.Click += new EventHandler (OnRadio); radio1.Text = "Radio Button #1"; radiogroup.Controls.Add(radio1);

radio2 = new RadioBut ton ( ) i

radio2 . Location = new Point (10.40) i

radio2.Size == new Size(360, 25};

radio2 .Click += new EventHandler (OnRadio) ; radio2 . Text = "Radio Button #2"; radiogroup.Controls.Add(radio2);

IS

CHU'dNG 3-2: Xli ly giao dien d6 hoa (GUI)

2551MJ

radio3 = new RadioBut ton ( ) ;

radio3 . Location = new Point (10, 70);

radio3. Size = new Size (360,25) ;

radio3 _ Click += new EventHandler (OnRadio) ; radio3 • Text = "Radio Button #3" ; radiogroup.Controls.Add(radio3)1

}

}

classdtApp System.Windows.Forms.Form

{

void OnExi t (Obj ect sender, EventArgs e) {

Application.Exit();

}

void OnDialogTest (Object sender, EventArgs e) {

DialogTest dIg = new DialogTest ( ) ;

DialogResultr=dlg.ShowDialog();

StringWriter sw=new StringWriter(new StringBuilder(»;

sw. WriteLine ("Dialog return value = {O} "+ "\nRadioButtons;: {l}\nCheckbox= {2}", r,dlg.Radio,dlg.Check);

MessageBox.Show(Sw.ToString(»;

MainMenu mm=new MainMenu ();

nun. MenuI t ems . Add (new Menultem( "&Dialog") ); mm.Menultems[O).Menultems.Add(new

MenuItem (" &Test" , new EventHandler (OnDialogTest) ) );

mm~MenuItems [OJ . MenuItems .Add(new Menu It em { "-") ) mm.MenuItems[O] .Menultems.Add{new

~256

pRAN III : Windows For

Menultem( "E&xit" ,

new Event Handl e r ( OnExi t) ) ) ; Menu = rom;

}

static void Main () {

Application.Run(new dtApp (»;

}

}

}

El9C ky doan rna trong vi du tren ban se thay cac nut radio that ra la cua thanh phan di~u khien nh6m (groupbox) Nhorn diroc t:;10 ra sau do lit. cac radio them VaG nhu sau:

radiogroup = new GroupBox ( ) ; radiogroup.Text = "Radio Buttons"; radiogroup. Location = new Point (10,60) i radiogroup.Size = new Size{380, 110); Controls,Add(radiogroup)i

Tilt ca cac nut radio trong nh6m d~u sit dung cung phuong thirc xti' 1 kien kich chuot Iii. OnRadio . Trong phirong thirc xll'19 nay, chung ta duye t qUI ca cac nut co trong nhorn va ki.§m tra xem trang thai nut nao dang ducc c "I'ucng ling vdi nut du(,'lc chon chung ta se thiet l~p cac gill. tri thich hop cho nl bien tharih vien.

void OnRadio (Obj ect sender, EventArgs e) {

int n=O;

foreach(Object 0 in radiogroup.Controls) {

if (0 is RadioButton) {

RadioButton r= (RadioButton) 0; if (r.Checked)

Radio=n;

n++i

}

}

}

DAy la mot trong so nhtrng ky tbuat rna ban eo thil sa dung M d9C g cua nut radio. Neu muon, ban c6 th~ thiet k€ mBi nut nhan mot phuong thuo rieng biet va khi Sl,i ki~n nut du(,'lc chon phat sinh ban thi€t l~p gia tTi ch bien thanh vien tuong U'ng vdi nut d6.

'8-2: Xli It giao dien de. hoa (GUl)

257

Ttub'ng hop cua nut radio, hop thoai luu da Iieu trong cac bien thanh vien c6tM truy xudt true tiep til ben ngoai Mi cac dOi tucng khac, D6i voi aa li~u tM hien Iai hi cac thuoc tfnh truy xua"t trl,l'C tiep den gia tri cua

o soan thao Edit

Windows Forms cung cdp cho ban thanh phan di~u khi~n HI. 0 soan thao

e6 khii. nang dung nhap Iieu mot dong hoac nhieu dong da lieu, Ban c6 tM thanh phdn edit cho nhieu muc dich khac nhau. Vi du d6i tuong edit c6 tM nhtt mOt clta s6 soan thao tal lieu tua notepad cua Windows. Hoac dan gian khung nho cho phep nhap vao mat kh§u (password) voi cac ky tl! lin ..... , .. ". "".,,,. Trong Ung dung Windows, d6i tttqng edit hay textbox duqc slt dung

riB eho muc dich nhap li~u. Vi du v~ d6i tirong nay duqe th~ hi~n trong vi 11 pMn sau,

'EJ'6i tU!Jng ListBox (hi?P danh sach) trong Windows form cho phep hien thi ml,lc chon a dang danh sach doc hoac ngang. Ban c6 th~ chon cung Iuc m¢t .nhi~u. muc chon trong danh sach, Vi du v~ ListBox cang se duqc trlnh bay iMDlr,'vi,crlu 3.2-10.

TreeView da trO' thanh chuan dung Mhi~n th] hoac trinh bay cac true, diJ li~u cay va nhtmg di1 lieu dang ke thua. Vi du, cau true h~ th6ng ~p thll' mt)ctren dia, cau true cua cac phan tli trong tai li~u XML .;. la mi?t cau cAy tM hi~n rdt hieu qua M.ng TreeView. Windows Form h6 tro kha nang vl,lva xltly dfii tuqng TreeView rdt phong phu, Trinh Explorer chinh Iii ml)t hoan chinh trong ung dung Windows.

TreeView bao g&m cac nut (node). M6i nut c6 tM co m(Jt nhan (label) ket veti nd cung' vdi cac thuec tinh khac nhu hinh anh bi~u dien trang thai eua Nut c6 tM chua cac nut con luu trong t~p hop nut bi~u dien bdi lap Collection. conb9.n thAn n6 lai c6 tM chua t~p hop cac nut con khac va cu th~ md r{ing Ban gian ban c6 tM hinh dung cau true cay wang tl! nhu menu c6 cac muc mj~;i myc chon trong menu lai c6 cac menu can (sub-menu) ...

TreeView h6 tro rdt nhieu sl,l' kien ki~m tra va nhan biet sl! thay d6i trang eua nut. Cac sl,l' kien mang ten Beforexxxxx se cho phep ban bAy cac tinh thay d6i tru6c khi di€.n ra va duqc phep bUy bO hay cho phep st,1 kien tiep sinh. Cac sl! kien mang tim Afterxxxxx dung thong bao cho ban nhirng

.1&1'1 nut di duQ'c thuc hien hoantat,

;OCM thao tac xii If nut trong Tree View va nhi1ng su kien Mt hop voi d6i s~ !lugc trinh bay chi ti€t trong vi du 3.2-10 phdn sau,

111258

pllAN III : Windows For

4.5. Bang di~u khi~n Tab

Bang di~u khi~n (Tab) c6 tM dung d~ phan hl}p thoai thanh nhieu tra Bang dieu khi~n bao g6m thanh Tab bar cho phep nguoi dung chon tab va ml}t hop cac d5i tUQ'ng TabPage dung M chea cac thanh phan di~u khi.§'n tuang tl,l' fc va phan trang cho hOp tnoai, Vi du 3.2-10 trong churrng trinh MungoTabApl cling se minh hoa each ste dung thanh phAn di~u khien nay,

4.6. Quan ly cac thanh ph4n dMu khi~n dQng

Nhu ban da: thay trong nhung vi du minh hoa d cac chuong truce, vi~c tl vao, dinh vi va I~p trinh cho nhang thanh phan dieu khien d~u dliQ'C thuc hien hie chuang trinh t.bl,Cc thi (runtime) va khiing can tham chieu den bat ky th: phdn tai nguyen nao tit ben ngoai. Di~u nay cling co nghla La sli dung cac th: phdn w~u khign cua Windows Forms rat de dang trong viec tuy bien theo chon cua nginri dung khi can co gian, dinh vi III-i cac thanh phan dieu khien 1 form hay hQp thoai, Ung dung MungoTabApp.cs trong vi du 3.2-10 dliai day se thay mQt s6 di!-c di.§'m thd vi trong vi~c weu khien cac thanh phdn giao dien d cung vdi minh hoa each ste dung nhirng thanh phdn dieu khi.§'n da: neu,

Luu y do rna ngu6n chuong trmh kha dai nen chung se dl1Q'c ciit ra va c giil.i thanh W doan. Khi viet rna ban c6 tM ggp chung lai thanh mgt ma ngu6n nhat.

Vi Lit). s.s-ro Murrgo'I'ab.Ap'p.cs

namespace Sams

(

using System:

using System.ComponentModel.; using System. Drawing;

using System.Windows.Forms; using System.Text;

/ / I <summary>

III (jng dl!ng nay se trinh. di~n khd ndng eua cdc thcnh. phtin. I / I di~u khitn trong Windows Form

/ II <l summary>

public class MungoTabApp : Form {

Tift ca cac bill'n thanh vien trong U'ng dung nay d~u la cue bO {pri khOng truy xuat duQ'c tit ben ngoai. D§.y cung la th6i quen t6t cho tinh nang g6i (encapsulation) cua lap va Mi tuqng. Trttac hll't chung ta bitt d4u khai bac cac d6i tUQ'ng Ia thanh ph1in di~u khi~n giao di~n nhu sau

II Phdn co sa

In ~o rh ih !Ii

.g. ~p In CS

~n

10 19

in

lY



l) ,g p

CHUaNG 3-2: xo ly giao dil\\~ db hoa (GUl)

2591!J

private Timer timer!;

private MainMenu rnainMenu!; private TabControl MainTabControl; private TabPage WelcomeTabPage; private TabPage SimpleTabPage; private TabPage DynamicTabPage; private TabPage ListBoxTabPage; private TabPage MouseTabPage; private TabPage TreeTabPage;

/ I Welcome page

private RichTextBox WelcomeTextBox;

/ / Cac dil!u khifn danh cho Simple Control Page private Label labell;

private Labellabel2;

private LinkLabel linkLabell; private TextBox ClearTextBoJ!;; private TextBox PasswordTextBox; private GroupBox groupBoxl; private RadioButton radioButtonl; private RadioButton radioButton2; private Panel panell;

private RadioButton radioButton3 i private RadioButton radiOButton4; private Button buttonl;

private CheckBox checkBoxl; private CheckBox checkBox2;

I / Listbox page

private ListBox listBoxl;

pr iva t e CheckedLi s t Box checkedLi s tBoxl ; private Label label3;

private Label label4;

private Label PickAWord;

private ComboBox comhoBoxl;

private ListView listViewl,

private DateTimePicker dateTimePickerl; private Label label6;

private Label label7 ;

private MonthCalendar monthCalenq,arl; private Label labellO;

private TrackBar trackBarl;

private ProgressBar progressBarl; private Labellabel8;

private DomainUpDown dornainupDownl;

l!J 260

PRAN III : Windows Form

private NumericUpDown numericUpDown1; private Labellabe19;

private Label labell1;

/ / Di chuy€n va ki€m sotit chui}t private Button ClickMeButton;

/ / Cac thanh. pluin. diJu khi€n di}ng private CheckBox ShowDynamic; private CheckBox UseAlternates; private CheckBox HideChecks; private GroupBox DynGroup;

private RadioButton DynRadioButtnl; private RadioButton DynRadioButtn2; private RadioButton DynRadioButtn3; private RadioButton DynRadi6Buttn4; private ListBox EventListl;

private ListBox EventList2;

private Button ClearEve·nts1; private Button ClearEvents2;

I /TreeView tab

private TreeView treeView1; private ListBox tvlistBox; private Button button4; private Button button5;

private bool ShowingRadioGrouPi

Phii.n ke tiep se khdi tao trang chao mung (Welcome page).

private void InitWelcome () {

WelcomeTextBox=newRichTextBox(); WelcomeTabPage = new TabPage (); WelcorneTabPage . Text = "Welcome"; WelcomeTabPage . Size = new

System.Drawing.Size(576, 422);

We 1 corneTabPage . TabIndex = 0;

We 1 comeTextBox . Text = "Welcome to the Mungo Tab App. \n"+

"This Windows Forms demonstration" +

" application accompanies the Sarns C# and the .NET framework" +

· cHl1dNG 3·2: Xli If giao dien d6 hca (GUI}

261~

" book by Bob Powell and Richard Weeks. \n\nThis tab hosts a"+

" RichTextBox. You can edit this text if you

wish. "+

"\n \nThe tabs in this form will show you" +

" some of the more complex controls that you can use in your "+

"Windows Forms application. \n\nPlease examine the source code" +

" for this application carefully. \n\nBob Powell. \n" i

WelcomeTextBox.Size == new System.Drawing.Size{576,424); WelcomeTextBox.TabIndex = 0; WelcomeTextBox. Anchor = AnchorStyles. Top AnchorStyles . Left I

AnchorStyles. Right I AnchorStyles.Bottom;

WelcomeTextBox. Visible = true; WelcomeTabPage.Controls.Add(WelcomeTextBox)i MainTabControl.Controls.Add(welcorneTabPage);

Tiep thea Iii cai d~t cac b{i xu Iy sl! kian eho m6i trang

I I Cac bg xu Ij srj kifn

private void OnClickedSimplel (Object sender, EventArgs e)

/ I ddy ta mgt trong hai bi) xu Ii su: kifn duoc gdn !1m niit nluin string message = "You clicked the big button"; if (this.checkBoxl.Checked)

(

message = "And the password

is .... "+this. p'asswordTextBox. Text;

MessageBox.Show(message);

}

private void OnCheckColorEdit (Object

sender, EventArgs e)

II B¢ xu Ii nay se them'Uiw hoac loqi bd b¢ xlilj tha hai ap di)t / / cho nut nhdn

\1j262

PHAN III : Windows Forms

if (this.checkBox2.Checked) (

this.button1.Click += new EventHandler(OnColorEdit);

} else {

this .buttonl.Click -= new EventHandler(OnColorEdit);

}

}

private void OnColorEdit (Object sender, EventArgs e)

{

/ I BI) xulj su kifn thit hai duoc du:a VIlO sl/ ki~n click cua nut I I ntuin. khi checkbox dUf!c danh ddu. chon.

ColorDialog dIg = new ColorDialog ( ) ;

if (dIg. ShowDialog() == DialogResult .OK) {

this.panell.BackColor=dlg.Color;

}

}

II BI) xu If nay se duoc gQi khi ban. nhiin. vao nhiin. N6 sii dua ban / /den m(it Web site.

private void LinkCIick(Object sender, EventArgs e) (

this.linkLabell.LinkVisited=true; if (this.ClearTextBox.Text==

"This is an editable text.box")

(

System.Diagnostics.Process.start( "IExplore.exe",

.. http://www.bobpowell.net/");

}

else {

try {

system.Diagnostics.Process.Start( ClearTextBox.Text);

IS

CHUONG 3-2: XU'ly giao di~n db hoa (GUI)

2631MJ

}

catch (Exception) {

,MessageBox.Show("

Cannot start process "+ClearTextBox.Text);

}

}

this. linkLabel.l . Text'" "Been there, Done that! " ;

}

private new void TextChanged{Object sender, EventArgs e)

{

if (linkLabell. LinkVisited ) {

linkLabell. Text = ClearTextBox. Text;

}

}

II Khoi tao simple page.

pri vate void Ini tSimple ( ) {

SimpleTabPage = new TabPage ( ) ; SimpleTabPage. Siz.e = new

System. Dra,wing. Size (576, 422); Sim:pleTabPage . ~ablndex = l; SimpleTabPage. Text = "Simple controls n ;

button1. = new Button ( );

button1.. Location = new System. Drawing. Point (32,

240) ;

button1..Size = newSystem.Drawing.Size(520, 32); button1. . Tablndex = 7;

buttonl.Text = "Buttons can be clicked ... n; buttonl.Click.+=new

EveiltHandler(OnClickedSimplel); checkBoxl = new CheckBOX ( ) ;

checkBoxl. Location = new System. Drawing _Point (32,

288);

che~kBox1.. Size = new System. Drawing. Size (520, 1.6); checkBoxl . Tablndex = 8;

chf;3ckBoxl. Te~t =

"Checking this box will make the button "+ "above say whats in the password box";

~264

PRAN III : Windows For

checkBox2 = new CheckBox ( ) ;

checkBox2 . Location = new System. Drawing. Point (3:;

327) ;

checkBox2 .Size = new System.Drawing.Size(520, 16 checkBox2 . Tab Index = 9;

t:heckBox2 . Text = "Checking this box will make the button" +

" above edit the colour of the text panel"; checkBox2 .Click += new EventHandler(OnCheckColorEdit);

ClearTextBox = new TextBox ( ) ; ClearTextBox.Location = new System. Drawing. Point (344, 8);

ClearTextBox. Size = new System. Drawing. Size (216,

20) ;

ClearTextBox. Tab Index = 2;

ClearTextBox.Text = "This is an editable text box"

domainUpDownl = new DomainUpDown ( ) ; domainUpDown1.AccessibleName = "DomainupDown"; domainUpDownl.AccessibleRole =

AccessibleRole.ComboBox;

doma inUpDownl . Loca t ion = new System.Drawing.Point(l28,368);

domainUpDownl . Size = new System. Drawing. Size (144

20);

domainUpDownl . TabIndex = lO; domainUpDownl. Text = "domainUpDownl"; domainUpDownl.ltems.AddRange(newobject

[]{"England",

"Africa" , "Mongolia", "Japan"});

groupBoxl = new GroupBox ( ) ;

groupBoxl. Location:;;; new System. Drawing . Point (8,

80);

groupBoxl. Size = new System. Drawing. Size (560, 80) groupBoxl . TabIndex = 5 i

groupBox1.TabStop = false;

groupBoxl . Text = "A GroupBox" ;

label1 = new Label () ;

labell. Location = new System. Drawing. Point (8, 8); labell. Size = new System. Drawing . Size (144, 24); labell. Tab Index = 0 i

label1. Text = "This is a label control";

CHUdNG 3·2: Xli ly giao di~n d6 hoa (GUI)

265~

label2 = new Label ();

label2 . Location = new System.Drawing.Point (8, 41); labe12 . Size", new System. Drawing. Size (328, 24); labe12 . Tablndex '" 4;

labe12 .Text '" "The edit box to the right has a password character" ;

labe19 '" new Label ();

labe19 . Location", new System. Drawing. Point (16,

368);

labe19 . Size", new System. Drawing. Size (104, 24); labe19. Tablndex = 12;

1 abe 19 . Text '" II DomainUpDown II ;

labe110 = new Label ();

labe110 • Location '" new System.Drawing.Point (276,

370);

labe110. Size = new System. Drawing .Size (104, 24); labellO . Tablndex '" 13;

labellO . Text", "NumericUpDown";

linkLabell '" new LinkLabel () ; linkLabel1. Location", new System.Drawing.Point(152,8);

linkLabe11.Size = new System. Drawing. Size (176,

24);

linkLabell. TabIndex '" 1; linkLabe11.TabStop", true;

linkLabe11.Text := "Link labels are like hypertext links" ;

linkLabel1.Click += new EventHandler(LinkClick);

numericUpDown1 '" new NumericUpDown ( ) ; numericUpDown1.BeginInit(); numericUpDown1.EndInit(); numericUpDown1.Location = new

System. Drawing.Point (392, 368); numericUpDownl . Size", new System.Drawing.Size(l76,20); numericUpDown1. Tab Index = 11;

panell = new Panel (); panell. BackColor =

(system. Drawing. Color) System.Drawing. Color. FromArgb «byte)25.5,

(byte)255,

il266

pHAN III : Windows Forms

(byte)128);

panel1. BorderStyle = (BorderStyle)FormBorderStyle.Fixed3D; panel1. Location = new System. Drawing. Point (8, 168);

panel1.Size = new System;Drawing~Size(560, 64); panel1.TabIndex = 6;

radioButton1 = new RadioButton() ;

radioButton1. Location = new System~Drawing.point(16, 24); radioButton1. Size = new System. Drawing. Size (504, 16);

radioButton1.TabIndex = 0;

radioBu t tonl . Text =" RadioBut tons 11 ;

radioButton2 = new RadioButton();

radioButton2. Location = new System.Drawing.point(16,48); radioButton2. Size", new System. Drawing. Size (504, 16) ;

radioButton2 . TabIndex = 1;

radioBut ton2 . Text = 11 In agroupBox are used to isolate" ;

radioButton3 = new RadioButton ( ) ;

radioButton3. Location = new System.Drawing.Point(16,8); radioButton3 .Size = new System.Drawing.Size(536, 16) ;'

radioButton3 . Tablndex = 0;

radioButton3 .Text = "Other radio buttons";

radioButton4 :c: .new RadioButton(); radioButton4 . Location = new

System. Drawing. Point (16, 32); radioButton4 .Size = new System. Drawing .Size (536, 16);

radioButton4.TabIndex'" 1;

radioButton4. Text = "in other GroupBoxes, or in this case, Panels.";

panel1.Controls.Add(radioButton3); panel1.Controls.Add(radioButton4);

groupBox1.Contro!s.Add(radioButtonl); groupBoxl.Controls.Add(radioButton2);

3·2: Xi\' l~ giao di~n d6 hoa (GUll 267

PasswordTextBox = new TextBox ( ) ; PasswordTextBox.Location = new

System. Drawing.Point (344, 40); PasswordTextBox. PasswordChar = '*' ; PasswordTextBox.Size = new System.Drawing.Size(216,20); PasswordTextBox.Tablndex = 3; PasswordTextBox.Text = "Password";

ClearTextBox.TextChanged += new EventHandler(TextChanged);

SimpleTabPage.Controls.Add(buttonl); SimpleTabPage.Controls.Add(checkBoxl); SimpleTabPage.Controls.Add(checkBox2); SimpleTabPage.Controls.Add(ClearTextBox); SimpleTabPage.Controls.Add(domainupDownl); SimpleTabPage.Controls.Add(groupBoxl); SimpleTabPage.Controls.Add(labell); SimpleTabPage.Controls.Add(labell0); SimpleTabPage.Controls.Add(label2); SimpleTabPage.Controls.Add(label9); SimpleTabPage.Controls.Add(linkLabell); SimpleTabPage.Controls.Add(numericUpDown1}; SimpleTabPage.Controls.Add(panell); SimpleTabPage.Controls.Add(PasswordTextBox);

}

II Cdc b9 xU ly danh. cho Listbox

II B9 xU [y nay chuyen gid tri trong track bar cho progress bar. private void OnTrack(Object sender, EventArgs e) {

TrackBar b= (TrackBar) sender;

this .progressBar1. Value = b. Value;

}

I I B9 xu Ii' nay se xay drjng cnu tit cdc m[!c checkbox trong danh sach. II sau d6 hien tlii cnu ben trong nhCin.

private void CheckedListHandler(Object

sender, ItemCheckEventArgse)

StringBuilder sb=new StringBuilder ( ) ; int ni=-1;

if (e.NeWValue==CheckState.Checked) ni=e.Index;

for (lnt 1=0; i<checkedListBox1. Items. Count; i++)

\!j268

PHAN III : Windows FOIT

{

if (i==ni I I (i! =e. Index && checkedListBoxl.GetItemChecked(i»)

sb.Append(checkedListBox1.Items{i] .ToString()+" "); }

PickAWord.Text = sb.ToString{);

}

II this handler gets the items from the list box and changes thier case

II as the mouse passes over them.

pri va te void Li s tBoxMouseOver (Obj ect sender, MousEl,EventArgs e)

{

string s; int i=O;

II first we reset the case of all the strings foreach(object 0 in listBox1.Items)

{

s=(string)oi listBox1.Items[i++l=s.ToLower();

}

i = listBoxl. IndexFromPoint (e. X, e. Y) ; if (1)-1)

{

s=(string)listBox1.Items[i]; listBoxl.Items[i]=s.ToUpper();

}

}

II Right clicking the combo box invokes this handler II it sorts the contents of the dropdown.

private void SortComboboxHandler (Obj ect sender, EventArgs e)

{

this.comboBox1.Sorted=true;

}

II List box tab initialization. private void InitLists ()

{

ListBoxTabPage = new TabPage ( ) ; ListBoxTabPage. Size,: new system.Drawing.Size(576,422); ListBoxTabPage.Tablndex = 2; ListBoxTabPage. Text = "List boxes";

CHUdNG 3-2: Xtc ly giao di~n d6 hoa (GUl)

269~

checkedListBoxl = new CheckedListBox ( ) ; checkedListBoxl.Items.AddRange(newobject[] ("The" ,

"These", "All", "Words", "Men", "Are", "Can", "Be", "Might", "Not", "Be", "Made", "As", "Happy", "Equal", "Stupid","Lost"});

checkedListBoxl. Location = new

System.Drawing.Point(216, B); checkedListBoxl.Size = new

System.Drawing.Size(192,94); checkedListBoxl.TabIndex = 1; checkedListBoxl.CheckOnClick=true; checkedListBoxl. ItemCheck += new

ItemCheckEventHandler(CheckedListHandler);

,

comboBoxl = new ComboBox ( ) ;

comboBoxl.Items . AddRange (new object [] ("A", "Little", "aardvark", "Never", "Hurt", II Anyone U ~ II 5 .r I 11 9 11, .. 7 .. , n 1 n , nO"

"2","4","3","6","B"});

comboBoxl.Location = new System.Drawing.Point{B,144); comboBoxl. Size = new

System.Drawing.Size(lB4,21); comboBoxl • Tab Index '" 5;

comboBoxl.Text", "Context menu sorts"; ContextMenu m=new ContextMenu ( ) ; MenuItem t=new MenuItern( "Sort",

new EventHandler(SortComboboxHandler»; rn.MenuItems.Add(t);

comboBoxl. ContextMenu = m;

dateTimepickerl = new DateTimePicker ( ) ; dateTimepickerl. Location =

new System. Drawing . Point (216, 272); dateTirnePickerl. Size '"

new System.Drawing.Size(344, 20); dateTimePickerl.TabIndex = 7;

label3 '" new Label () ; label3 • Location = new

System. Drawing. Point (8, 112); label3 . Size = new

System.Drawing.Size(184,16); label3 • TabIndex = 2;

label3 .Text '" "A Simple list box"; label4 '" new Label () ;

labe14. Location = new

Fi

~270

PHAN III : Windows Fo

System. Drawing. Point (224, 112); labe14 . Size = new

System.Drawing.Size{184,16); label4 . Tablndex = 3;

label4 . Text = "A Checked lis t box" ; labe16 = new Label ( ) ;

label6. Location = new

System.Drawing.Point(216,248); label6.Size = new System.Drawing.Size(184, 16); label6 . Tablndex = 8;

label6 . Text = "A list view"; label7 = new Label () i label7. Location = new

System. Drawing. Point (214, 303); label7 .Size = new System.Drawing.Size(184, 16); label7 . Tab Index = 9 i

label7 . Text '" "A DateTimePicker"; label8 '" new Label () ;

label8 .Location = new

System. Drawing. Point (7, 341); label8.Size = new System. Drawing.Size (184, 16); label8. Tablndex = 11;

label8. Text:: "The MonthCalender control" ;

label11 '" new Label (); label11.Location = new

System. Drawing. Point (7, 384); label11.Size = new System.Drawing.Size(184, 16) label11.TabIndex = 14;

label11.Text = "Trackbar

and progress bar (Right)";

listBox1 ::: new ListBox() ;

listBoxl. Items . AddRange ( new object (] ("Fish",

"Chips", "vinegar", "Marmite" , "Cream Crackers" ,

"Marmalade", "Stilton", "Mushy Peas", "Sherbert I.!emons" ,

"Wellie boots ", "Spanners"}) ; listBox1. Location", new

System.Drawing.Point(8,8); listBox1.Size::: new System.Drawing.Size(184, 9! listBoxl. Tab Index :: 0;

listBox1.MouaeMove += new

MouseEventHandler(ListBoxMouseOver); listViewl = new ListView(); listView1.ForeColor =

System. Drawing. SystemColora.WindowTe:

CHUdNG 3·2: Xli ly giao di~n d6 hoa (Gun

271 ill

listView1.Items.Add(new ListViewItem("knives"»;

listView1. Items .Add(new ListViewItem(" forks") ) ; listView1.Items.Add(new

ListViewItem("spoons"»;

listView1. Items . Add (new ListViewItem( "dogs") ); listView1. Items.Add(new ListViewItem( "fish") ); listV~ew1.Location = new

System.Drawing.Point(216,136); listView1.Size = new System.Drawing.Size(352,96); listViewl.TabIndex = 6;

monthCalendarl = new MonthCalendar{); monthCalendarl. Location = new System.Drawing.Point(8,184); monthCalendarl. TabIndex =: 10; monthCalendar1 . TabStop = true;

progressBar1 = new ProgressBar ( ) ; progressBar1. Location = new System.Drawing.Point(216,344);

progressBar1. Size;;;;; new System. Drawing. Size (336,

24);

progressBar1. TabIndex = 13;

PickAword =: new Label ( ) ; PickAWo"rd.Location =: new System.Drawing.Point(416,8);

PickAWord.Size = newSystem.Drawing.Size(152, 96); PickAword. Tab Index = 4;

trackBar1 = new TrackBar ( ) ; trackBarl.BeginInit(); trackBarl. Locat ion = new

System.Drawing.Point(272,376); trackBar1.Maximum = 100;

trackBar1. Size = new System. Drawing. Size (184, 42); trackBar1. TabIndex = 12;

trackBar1. ValueChanged += new

EventHandler(OnTrack); trackBarl.EndInit();

ListBoxTabPage.Controls.Add(checkedListBoxl); ListBoxTabPage.Controls.Add(comboBoxl); ListBoxTabPage.Controls.Add(dateTimePickerl); LlstBoxTabPage.Controls.Add(labelll); ListBoxTabPage.Controls.Add(label3);

~272

pHAN III: Windows Form!

ListBoxTabPage.Controls.Add(labeI4); ListBoxTabPage.Controls.Add(labeI6); ListBoxTabPage.Controls.Add(labeI7); ListBoxTabPage.Controls.Add(label8); ListBoxTabPage.Controls.Add(listBox1); ListBoxTabPage.Controls.Add(listViewl); ListBoxTabPage.Controls.Add(monthCalendar1); ListBoxTabPage.Controls.Add(PickAWord); ListBoxTabPage.Controls.Add(progreeeBarl); ListBoxTabPage.Controls.Add(trackBarl);

}

II This is the first of two possible events fired by

the

II dynamic radio buttons. It adds to a list box. private void RadioEventl (Object sender, EventArgs e) {

RadioButton r = (RadioButton) sender;

this .EventListl. Items . Add ( "Event #1 from: "+r.Text);

}

II This is the second of two possible events fired by

the

II dynamic radio buttons. It adds to a list box. private void RadioEvent2 (Object sender, EventArgs e) {

RadioButton r = (RadioButton) sender;

this. EventList2. Items .Add( "Event #2 from: "+r.Text);

}

II This handler clears the first list box out private void Clearl (Object sender, EventArgs e) {

this.EventList1.Items.Clear();

}

II This handler clears the second list box out pri vate void Clear2 (Obj ect sender, EventArgs e) {

this.EventList2.Items.Clear();

}

/ I This routine removes all events from all radio buttons

II in the dynamic page. private void RemoveEvents ()

ns

cat/dNG 3·2: Xli IS' giao di~n dd hoa (GUl)

2731!J

DynRadioButtn4 .Click -= new EventHandler(RadioEvent1); DynRadioButtn3 .Click :-=new EventHandler(RadioEvent1); DynRadioButtn2 . Click -= new EventHandler{RadioEvent1)i DynRadioBut tn1. Click -:: new EventHandler(RadioEvent1)i DynRadioButtn4 . Click -= new EventHandler(RadioEvent2); DynRadioButtn3.Click -= new EventHandler(RadioEvent2); DynRadioButtn2 .Click -= new EventHandler(RadioEvent2); DynRadioButtnl. Click -= new EventHandler(RadioEvent2);

}

II This method add the correct event handler

alternative

II to the radiobuttons on the dynamic page pri vate void .AddEvents ( )

{

if ( ! this. UseAI ternates. Checked) (

DynRadioButtn4 . Click += new EventHandler(RadioEventl); DynRadioButtn3 .Click += new EventHandler(RadioEventl); DynRadioButtn2 .Click += new ·EventHandler (RadioEvent1) ; DynRadioButtnl . Click += new ~entHandler (RadioEvent 1) ;

}

else {

DynRadioButtn4 .Click += new EventHandler(RadioEvent2); DynRadioButtn3 .Cli.ck += new EventHandler(RadioEvent2); DynRadioButtn2.Click += new .vlenl:Hiin(~~,er(RadioEvent2); DynRadioBut:t:n1. C.1.ick += nerY ~.'~~~lAo;lu~er(RadioEvent2);

}

\11274

PnAN III: Windows Forms

II This event handler swops the dynamic radio button event handlers

public void OnUseAlternates (Object sender, EventArgs

e)

{

if (ShowingRadioGroup) {

RemoveEvents(); AddEvents()i

}

}

1/ This method removes the whole dynamic radiobutton II panel, clears the event list and destroys the items public void RemoveRadio ()

{

if (ShowingRadioGroup) {

DynGroup.Controls.Remove(DynRadioButtn4); DynGroup.Coutrols.Remove(DynRadioButtn3); DynGroup.Controls.Remove(DynRadioButtn2); DynGroup.Controls.Remove(DynRadioButtn1); DynamicTabpage.Controls.Remove(DynGroup);

RemoveEvents(}; DynamicTabPage.Controls.Remove(DynGroup};

DynRadioButtn4.Dispose(); DynRadioButtn3.Dispose(); DynRadioButtn2.Dispose{); DynRadioButtn1.Dispose(); DynGroup.Dispose();

ShowingRadioGroup = false;

}

}

/ IThis method adds the dynamic radio button group a / Iwires up the event handlers.

private void AddRadio(}

{

if(lShowingRadioGroup) {

DynGroup = new GroupBox ( ) ; DynGroup. Location = new System. Drawing. Point (240, 16);

275\!J

CBudNG 3·2: Xv Iy giaodien d6 hoa (GUI)

120) ;

DynGroup.Size = new System. Drawing. Size (312,

DynGroup . Ta.bIndex = 3; DynGroup.TabStop = false;

DynGroup.Text = "Dynamic radiobuttons";

DynRadioButtnl = new RadioButton{); DynRadioButtn1.Location = new System.Drawing.Point(8,24);

DynRadi oBu t tnl . Size ::: new System.Drawing.Size(296,16); DynRadioButtnl.Tablndex = 0; DynRadioButtnl.Text = "Choice 1";

DynRadioButtn2 = new RadioButton (); DynRadioButtn2 . Location = new System. Drawing. Point (8, 41); DynRadioButtn2. Size = new System.Drawing.Size(296,16); DynRadioButtn2 . Tab Index = 1; DynRadioButtn2 .Text = "Choice 2";

DynRadioButtn3 = newRadioButton() i DynRadioButtn3 . Location = new System. Drawing • Point (8, 64);

DynRadioButtn3 .Size = new System.D;rawing.Size(296, 16); DynRadioButtn3. TabIndex = 2; DynRadioButtn3 .. Text = "Choice 3" ;

DynRadioButtn4 = new RadioButton(); DynRadioButtn4. Location = new System. Drawing. Point (8, 88); DynRadioButtn4. Size = new

1 System.Drawing.Size(296, 16); DynRadioButtn4.TabIndex = 3; DynRadioButtn4 . Text = "Choice 4" ;

AddEvents();

DynGroup.Controls.Add(DynRadioButtn4); DynGroup.Controls.Add(DynRadioButtn3); DynGroup.Controls.Add(DynRadioButtn2)i DynGroup.Controls.Add(DynRadioButtn1); DynamicTabPage.Controls.Add(DynGroup);

showingRadioGroup =. true;

}

~I

1J276

pRAN III : Windows Fo

}

IIThis event handler uses helper methode to manage t

presence of the .

I I dynamic radiobutton group and the handlers that they use

private void ShowDynamicEvent (Object sender, EventArgs e)

(

CheckBox b= (CheckBox) sender;

if {b.Checked} {

AddRadio{);

}

else {

RemoveRadio();

}

}

II This event handler adds or removes the dynamic check buttons and

II repositions the control to make it look neat anc tidy.

private void AddChecks {Obj ect sender, EventArgs 4 {

CheckBox c= (CheckBox) sender;'

if (this.HideChecks.Checked) {

RemoveRadio();

c. Location = new Point (S, 16) ;

DynamicTabPage.Controls.Remove(UseAlternates); DynamicTabpage.Controls.Remove(ShowDynami ShowDynamic.Click -= new EventHandler(ShowDynamicEvent); UseAlternates.Dispose(); ShowOynamic.Dispose();

}

else' {

c .Location = new Point(S, 64);

ShowDynamic = new CheckBOX ( ) ;

I;

calfdNG 3·2: Xii ly giao di~n dO hoa (GUll

2771!J

rris!

ShoWDynamic. Location = new System. Drawing. Point (8, 16);

ShoWDynamic.Size = new System. Drawing. Size (168,

1e 16) ;

ShowDYnamic . Tablndex = 0;

ShowDynamic . Text = "Show dynamic RadioRut tons" ; ShoWDynamic .Click += new

EventHandler(ShowDynamicEvent);

UseAlternates = new Checkaox () i UseAlternates.Location = new System. Drawing. Point (8. 40);

UseAl ternates. Size = new

System.Drawing.Size(168. l6}; useAlternates.Tablndex = 1;

UseAlternates. Text;; "Use alternate handlers"; UseAl ternates. Click += new

EventHandl.er (OnUseAlternates) I

DynamicTabPage.Control.s.Add(UseAlternates); DynamicTabPage.Control.s.Add(ShowDynamic);

}

}

/ I This method initializes the dynamic buttons tab private voi.d InitDynamic ()

{

DynamicTabPage = new TabPage ( ) ; DynaDliCTabPage.Slze = new System.Drawing.Si.ze(576,422);

DynamicTabPage •. Tablndex = 3; Dynami.cTabPage .Text = "Dynamic controls";

ClearEventsl = new Button (); ClearEventsl. Location .. new System. Drawing. point (48, 328);

ClearEventsl. Size = new System. Drawing. Size (128,

24) ;

Cl.earEvents1 • Tablndex = 6;

Cl.earEventsl.Text = "Clear the events"; Cl.earEventsl. Cl.ick += new EventHandler (Clearl) ;

ClearEvents2 = new Button () ; ClearEvents2 . Location = new System. Drawing. Point (340, 330);

Cl.earEvents2. Size = new System. Drawing. Size (128,

24) ;

1/!J278

PRAN fll! Windows Fort!

ClearEvents2. Tablndex '" 7;

ClearEvents2 .Text = "Clear the events"; ClearEvents2. Click += new EventHandler (Clear2) ;

EventListl = new ListBo:x ( ) ; EventListl. Location = new System.Drawing.Point(16,176);

EventListl.Size = new System.Drawing.Size(200,

121) ;

EventListl. Tablhdex = 4 i EventList2 '" new ListBox ( ) i EventList2 . Location = new

System.Drawing.Point(30e, 180)1

EventList2. Size = new System. Drawing. Size (200,

121);

EventList2 . TabIndex = 5;

HideChecks = new CheckBox () ;

HideChecks . Location "" new System. Drawing .Point (I

64 );'

HideChecks. Size;;: new System. Drawing. S'ize (16B,

16),

HideChecks . Tab Index = 2 i

HideChecks . Text = "Hide checkboxes";

HideChecks .Click += new EventHandler (AddChecks) AddChecks (HideChecks, new EventArgs ( ) ) ;

DynamicTabPage.Controls.Add(ClearEventsl}; DynamicTabPage.Controls.Add(ClearEvents2); DynamicTabPage.Controls.Add(EventList2); DynamicTabPage.Controls.Add(EventList1); DynamicTabPage.Controls.Add(HideChecks);

}

II

II Handlers for the mouse tab II

II This handler moves the button to the opposite sic of the tab-page

II from the mouse cursor

private void OnMouseMoved(Object sender, MouseEventArgs e)

{

Point center ""

. new Point(MouseTabPage.Widtb/2,MouseTabPage.Height/2);

MouseTabPage.MouseMove += new MouseEventHandler(OnMouseMoved)i

ie }

CHUONG 3-2: Xtr Iy giao di~n d6 hoa (GUl)

27911J

rms

ClickMeButton.Location ""

new Point (center .X(ClickMeButton_Size.Width/2}-{e.X-center.X), center.Y-(ClickMeButton.Size.Height/2)-(e.Ycenter. Y) ) i

}

liThia handler shows when the button is caught and clicked.

private void OnClickedClickme (Object sender, EventArgs e)

{

MessageBox. Show ("Caught me! ! ");

}

II This method initializes the mouse page. private void Ini tMouse ( )

{

:8,

MouseTabPage = new TabPage () ; MouseTabPage.Controls.Add(ClickMeButton); MouseTabPage. Size = new System. Drawing. Size (576,

422);

MouseTabPage . TabIndex= 4;

MouseTabPage. Text"" "Mouse interaction";

I ;

ClickMeButton = new Button() i ClickMeButton.Location = new System.Drawing.point(200, 128);

C1.ickMeButton.Size = new System.Drawing.Size(184,

112) ;

ClickMeButton.TabIndex = 0; ClickMeButton.Text = "Clickme!"; ClickMeButton.Click += new

EventHandler{OnClickedClickme);

MouseTabPage.Controls.Add(ClickMeButton}i

IIHandlers for the tree tab •. ; •

liThe overloaded list function shows the treee view events in a list

private void LiBt (string B, TreeNode n)

~280

PRAN III : Windows F

(

string 0=8+" "+n.Text; tvlistBox.ltems.Add(o);

}

private void List (string s, string 1, TreeNode n) {

string o=s+" (new = "+1+") current = "+n.Text; tvlistBox.ltems.Add(o);

}

II These handlers simply r~f1ect the event type and little bit of

II node data to the list box on the right of the treeViewl control.

private void OnAfterCheck(Object sender, TreeViewEventArgs e)

{

List("AfterCheck", e.Nodel;

}

private void OnAfterCollapse (Object sender, TreeViewEventArgs e)

{

List ("AfterCo11apse", e .Node);

}

private void OnAfterExpand(Object sender, TreeViewEventArgse)

{

}

i'·

Li st (" AfterExpand", e. Node) ;

}

private void OnAfterSelect (Object sender, TreeViewEventArgs e)

{ .

List ( II AfterSelect" Ie. Node) ;

}

private void OnBeforeCheck(Object sender, TreeviewCancelEventArgs e}

(

List ("AfterCollapse" , e.Node);

}

private void OnBeforeCollapse (Object sender, TreeviewCancelEventArgse)

(

List ("BeforeCollapse", e.Node);

CHUONG 3·2: Xii If giao diii\n d&'h9a (Gun

281~

private void OnBeforeExpand(Object sender, TreeViewCancelEventArgse)

{

List("BeforeExpand", e.Node);

}

private void OnBeforeLabelEdit (Object sender, NodeLabelEditEventArgs e)

{

List ("BeforeEdit", e.Label, e.Node);

}

private void OnAfterLabelEdit (Object sender, NodeLabelEditEventArgse)

{

List ( "AfterEdi t ", e. Label, e. Node) ;

}

private void OnBeforeSelect (Object sender, TreeViewCancelEventArgs e)

{

List ( "BeforeSelect If, e. Node) ;

}

private void OnAddRoot (Object sender, EventArgs e) {

button5.Enabled=true;

if (treeViewl.Nodes.Count==O) {

treeViewl.Nodes • Add (new TreeNode ("Root

node"});

} else {

treeViewl. Nodes. Add (new TreeNode (" Sibling

node") } ; }

}

private void OnAddChild(Object sender, EventArgs e) {

if (treeViewl.SelectedNode==null) return; treeViewl.SelectedNode.Nodes.Add(new TreeNode ( "Child" ) ) ;

}

IIJ 282

PHAN III: Windows FOrI!

/ /Initializes the tree control. private void InitTree ()

{

TreeTabPage :: new TabPage ( ) i TreeTabPage. Text =: "TreeView";

TreeTabPage .Size :::new System. Drawing • Size (576,

422) i

TreeTabPage . Tab Index =: 5;

treeViewl =: new TreeView() ; treeViewl.Anchor == AnchorStyles. Left AnchorStyles . Top I

AnchorStyles . Right I AnchorStyles.Bottom;

treeViewl. Size:: new System. Drawing. Size (264,

360) ;

treeViewl . TabIndex '" 0 i treeViewl.ShowLines=:true; treeViewl.ShowPlusMinus=true; treeViewl. ShowRoot'Lines=true; treeViewl.LabelEdit=truei

treeViewl.AfterCheck +=

new TreeviewEventHandler(OnAfterCheck)i treeViewl.AfterCollapse +=

new TreeViewEventHandler(OnAfterCollapse); treeViewl.AfterExpand+=

new TreeviewEventHandler(OnAfterExpand)i treeViewl.AfterSelect +=

new TreeViewEventHandler{OnAfterSelect)i treeViewl.Afte-rLabelEdit +=

new NodeLabelEditEventHandler(OnAfterLabelEdit}; treeViewl.BeforeCheck +==

new TreeviewCancelEventHandler(OnBeforeCheck); treeViewl. BeforeCollapse +=

new TreeViewCancelEventHandler(OnBeforeCollapse); treeViewl. BeforeExpand +::

new TreeViewCancelEventHandler(OnBeforeExpand); treeViewl. BeforeSelect +=

new TreeViewCancelEventHandler(OnBeforeSelect); treeViewl. BeforeLabelEdit +=

new NodeLabelEditEventHandler(OnBeforeLabelEdit);

cHIfdNG 3·2: Xli If giao dien dB hoa (GUI)

283lYd

tvlistBox = new 'ListBox ( ) ; tvlistBox. Location = new System. Drawing. Point (272, 0);

tvlistBox. Size = new System. Drawing . Size (304.

424) ;

tvlistBox. ForeColor '" System.Drawing.SystemColors.WindowText; tvlistBox.Tablndex", 1;

button4 = new Button () ;

button4. Location = new System. Drawing. Point (16,

376) ;

button4. Size =: new System. Drawing. Size (96, 24); button4. Tablndex = 2 i

button4 .Text = "Add Root";

button4. Click += new EventHandler (OnAddRoot) ;

buttonS = new Button ( );

buttonS. Location = new System. Drawing. Point (13 B,

376) i

buttonS.Size = new System.Drawing.Size(96,'24) i button5. Tablndex := 3;

buttonS.Text:= "Add Child";

bu t t on5 . C lick + = new EventHandl er (OnAddChi ld) ; buttonS.Enabled=false;

TreeTabPage.Controls.Add(button4); TreeTabPage.Controls.Add(button5); TreeTabPage.Controls.Add(tvlistBox); TreeTabPage.Controls.Add(treeview1)i

}

public MungoTabApp () {

/ / component s = new System.ComponentModel.Container(); AutoScaleBaseSize =: new System. Drawing. Size (5,

13) ;

ClientSize = new System. Drawing. Size (600, 477);

MainTabControl = new TabControl ( ) ;

1!d.284

PHAN III : Windows Forr

MainTabControl. Location = new System. Drawing.Point (8, 8); MainTabControl. Selectedlndex = 0; MainTabControl • Size = new System.Drawing.Size(584, (48); Main'l'abControl • Tablndex = 0;

InitWelcome(); InitSimple(); InitLists(); InitDynamic(); InitMouse () ; InitTree()j

mainMenul ,;. new MainMenu ( ) ; Menu = mainMenul;

Text = "Mungo Tab App"; timerl = new Timer ();

MainTabControl.Controls.Add(SimpleTabPage); MainTabControl.Controls.Add(ListBoxTabPage); MainTabControl.Controls.Add(DynamicTabPage); MainTabControl.Controls.Add(MouseTabPage); MainTabControl.Controls.Add('l'reeTabPage);

Controls.Add(MainTabControl);

}

public static int Main(string(] args) {

Application. Run (new MungoTabApp(»;

return 0;

}

}

}

5. KET CHU<1NG

Chuong nAy chUng ta dli xem qua toan hI} h{! thOng Windows Forms, chuang trinh dan gian Windows Forms Hello World cho d€n ling dung phuc tl han g6m (My dli cac thanh phdn giao di{!n nhu MungoTabApp.cs. Ban dA hi, duoc each sil dung vA di~u khi~n nhil'ng thAnh phll.n giao di{!n Windows Forr thong qua sl! ki~n, thuQc tinh. D~ chuy~n cac ling dung d6 hoa cua moi tn.lOl Windows cu sang .NET thi Windows Forms lA tat ca nhil'ng gi ban clin phai qUI tam Mn. Tam dirng d~ tAi Windows Forms d day, chung ta se bAt ddu chuy€n sal h9C vII each xu Iy dilli{!u cua .NET trong chucrng sau.

Chu(lng 3.3

RANG BUQC nu L~U

Coo vern d~ chinh se du(!c d~ c4p dtn: if Chi~n luoc rang buoc da li~u

./ Ngu6n dil li~u rang bugc

if Rang bugc dan giiin u6i DataSet

./ Rdng bu(Jc phuc hqp cae di~u khiin uao da lieu

./ Rdng buoc di~u khUn uao co sa da lieu biing ADO. NET

,/ T{W khung nhin Database Viewer uui Visual Studio uti:

ADO. NET

1. CHIEN LU<1C RANG BUQC nu LI~U

Trong chuang trinrc, chung ta dil. trm hi1)u qua cac thanh phan giao dien chuAn cua Windows Forms. MQt s6 thanh phan dii\.u khi1)n se treY nen d~ dang ki~m soat va l~p trmh han neu no duoc rang bucc <binding) vao mQt nguon dcr lieu nao d6 vi du nhu mQt bang trong co sa dcr lieu,

Do li~u n6i chung diroc luu giu trong bang (table) bao g6m cac dong va cot.

RAng bUQc dcr lieu (Data Binding) Iii ky thu~t ket gi\n giao dii)Jn cua thanh phan di~u khi~n true tiep viJi mQt hoac nhieu dong, cQt du lieu trong bang. 'I'ham chi c6 tM toan h1> bang du Iieu nham muc dich cho phep ngtlcri dung xem, xli If va hieu chinh du lieu true tiep.

C6 hai kie"u rang buoc dO liii\u, rang buoc dan (Simple bind) va rang bUQc phllc (Complex bind). Rang bui)c dan 113. gAn dO liii\u cua mOt dong hay cQt trong bang vao cac dii\.u khien don gian nhu textbox, checkbox ... Rang bui)c phirc hi. ke't n6"i toan bO bang hoac nhiau bang VaG thanh pMn di~u khiin M hi~n thi hay xU" It dcr liii\u.

2. cAc NGUON nn LI~U RANG BUQC

Nguen dcr Iieu thich hop cho viec rang buOc n6i chung bao g6m blft ky dO"i tuqng nao c6 cai dij.t giao tiep hay interface IList. Hau hilt cactap hop trong thu vi~n .NET deu c!\i dij.t giao ti~p nay. D6i tl1gng da Ji(m cung cap biJi ADO. NET cung cdi #t lList, ban than ben cilng c6 th€ tlj xay dung cac d61 tu"qng lilm ngu6n d(l: Ii~u thong' qua vi~c cai d~t IList interface.

2.1. Giao tie'p IList

Giao ti€p IList chi y8u cau mi;it s6 phunng thuc rna ban can cai dij.t nhu sau

PHAN III : Windows Form,

Add - Them mot muc vao danh sach

Clear - X6a tat ca cac muc khoi danh sach Contains - Tim mQt muc du lieu trong danh sach

IndexOf - Xac dinh chi so cua mOt gia tr] nao d6 trong danh sach Insert - Di).t ml,)t gia tri mdi VaG danh sach

Remove - Loai mi)t gia tri ra khoi danh sach

RemoveAt - Loai mi)t muc khoi danh sach dua tren chi s6 cua no Truy cap mQt muc da Iieu trong danh sach duoc thue hien thong qua chi s6 Vi du, Item x= Myl.istlnl. Cac muc chua trong danh sach dircc xem lA e6 kieu dO nrong .NET.

2.2. Cac d6i tu(jng .NET cai d~t IList

C6 rat nhiau lap trong thu vien .NET cai dat ILi5t. Mi)t 56 chi dung chi muc dich truy xuat, du li~u. Cac 16p . thinrng duqc sa dung C1,l th€ co Array Arrayl.ist va StringCollection. Cac lap phirc tap hen nhu DataSetView ha~ Data View lam vi¢c chung voi ADO cung cap each troy xuat toan bl,) da li~u cus bang hoac khung nhin (View).

Cac 16p phu con Iai it diroc dung hon, chu yeu dl1Q'c dung dif md ri)ng chi c6ng cu cua cac nha phat triii'n .NET truy tim cac sieu da Iieu ket hop ben trom mi)t lop. Chung bao g6m cac lOp nhir CodeClassCollection vi CodeStatementCollection cung nh11ng doi tucng khac ste dung rna cua rna hinh ta lieu doi tuqng (Document Object Model) hay con goi Iii DOM.

3. RANG BU()C GIAN DdN

Nhu da d~ CI1-P trudc diiy, rang bui)c gian don la cnng viec ldy cac milu di li~u don gian va buec chung VaG cac thanh phan di~u khien, Khi da Iieu thay dBi dieu khi€n se phan anh sl,! thay d6i nay. Khi thanh phan di~u khidn bi hieu chinh da lieu se dugc ghi lai neu quyen ghi tren da Iieu duQ'c phep.

M6i dieu khilln Windows Forms quan ly mi)t d6i tircng BindingContext, d6 tuong nay co mot t~p hop cac doi tuong Currency Manager. Du sao th CurrencyManager khOng gillp gl. cho c6ng vi~c Ul.i chmh. No dan gian chi quan I, vi trf hien hanh ben trong rn¢t d6i tugng da li~u cu tM nao d6 giup ban,

Cac di~u khiifn can, nhu GroupBox, cling co th€ c6 d6i tuqnJ BindingContexts va CurrencyManager dQc lap.

Htnh 3.3-1 minh hoa quan M giO'a Form, Di~u khi€n va doi tuqnJ BindingContext, CurrencyManager.

CHudNG 3·3: llimg bUQc dO lieu

287~

BindingContext

'~,

~--------~ ----1

Currency Manager . I

. __ "" --,------.---- J

--"--- --- - --I 80i tLi<1ng co sa I System.Collection '

r-~---"

6i tuorrg co So' System.Array

___ •• _0 _

Doi tLiqng di1 Iieu ADO. NET

I

------~

Hinh 3.3-1 Quan h~ giila Form va BindingManager, Currencybianager Chung ta hay xern cac S11 dung BindingManager va CurrencyManager vdi mot (fng dung dan gian rang buoc thuoc tinh Text cua 6 textBox vdi rnQt t~p hop chubi. Vi du 3.3~1 la rna ngudn cua irng' dung DataBound

Vi du 3.3-1 databound.cs

namespace Sams {

using System;

using System. Drawing; using System_Collections;

using System. Collections. Specialized; using System.ComponentModel;

using System.Windows.Forms;

/ / / <summary>

~288

..

PHAN III : Windows Forr

III Summary description for databound. III < I summary>

public class databound :System.Windows.Forms.Form {

private Button RightButton; private Button LeftButton; private TextBox textBox2; pr.ivate TextBox textBox1i private Button DoneButton;

private StringCollection sa;

public databound ( ) {

this. textBox2 = new TextBox(); this . RightButton = new Button ( ); this. textBox1 ::: new TextBox(); this.DoneButton '" new Button() ; this. LeftButton = new Button() ; this.SuspendLayout();

/I

II textBox2 II

this. textBox2 . Location = new Point (184, 16); this. textBox2 . Name", "textBox2";

this. textBox2 . TabIndex = 2; this.textBox2.Text"" "textBox2";

II

II RightButton II

this .RightButton. Location = new point (192, 64); this .RightButton.Name = "RightButton"; this.RightButton.TabIndex = 4; this.RightButton.Text", "»"; this.RightButton.Click += new

EventHandler (this. Right But ton_Clj,ck) ;

II

II textBox1 II

this .textBox1.Location = new Point (8, 16); this.textBox1.Name = "textBox1";

thi s . textBox1 . Tab Index = 1;

this. textBox1.Text = "textBox1";

II

II DoneButton II

this. DoneButton. Location = new Point (104, 64) ; this. DoneButton.Name = "DoneButton";

CHUONG 3-3: Rang buoc dtt lieu

2891l4l

this.DoneButton.Tablndex = 0: this. DoneBu t ton. Text = "Done"; this. DoneButton. Click += new

EventHandler(this.DoneButton_Click);

II

I I LeftBut ton II

this. LeftButton. Location = new point (16, 64) ; this. LeftButton.Name = "LeftButton"; this.LeftButton.Tablndex = 3:

this. LeftButton. Text = "«"; this.LeftButton.Click += new

EventHandler(this.LeftButton_Click); 1/

I I da tabound II

this. AutoScaleBaseSize '" new System.Drawing.Size{5,13); this.ClientSize = new System. Drawing. Size (294, 111) ;

this .ControlBox ;: false;

this .Controls. AddRange {new Control [] { this.RightButton, this.LeftButton, this.textBox2, this.textBox1, this.DoneButton});

this. FOrmBorderStyle '"

FormBorderStyle.FixedDialog; this . Name = "dat abound " ; this.ShowlnTaskbar = false;

thi s . Text '" "da tabound" ; this.ResumeLayout(false);

/ / Doan nu.i nay dung khiii tao dilli?u cho rang buoc gidn dan

/ / Chung" ta rang bugc hai di~u khitn textbox vda cung mQt / / StringCollection

sa=new StringCollection() ; sa. Add ("Hello databinding") : sa.Add("Sams publishing"}; sa.Add("C# example"); sa.Add( "By Bob Powell");

/ / Rang bu(ic di~u khiln vao co sa d(1 li?u

l!J 290

pRAN III: Windows Fo

this.textBoxl.DataBindings.Add("Text",sa,""); this.textBox2 .DataBindings.Add( "Text", sa,""};

}

public override void Dispose () {

base.Dispose();

}

I f Don. gidn chi tang tri crl,a thuoc tinh Position trong CurreneyManage protected void RightBut ton_Click (obj ect sender, System. EventArgs e)

this. BindingContext [sa] .Position++;

}

/ / Dan gian chi giam tri ella tlwQc tinli Position trong CurrencyManag protected void LeftBut ton_Click (obj ect sender I System. EventArgs e)

{

this.BindingContext[sa] .position--;

}

protected void DoneButton_Click (object sender, System. EventArgs e)

{

Application.Exit();

}

public static void Main{) {

Application.Run(newdatabound(}) s

}

}

}

Ban bien dich chuong trmh bling li.\nh sau:

csc t: Iwinexe databound.cs

Ban luu y d€n doan rna tao va dua StringCollection vao su dung

sa=new StringCollection ( ) i sa. Add ( "Hello databinding") i sa.Add( "Sams publishing"); sa • Add ("C# example") ;

IS

CHUONG 3-3: Rang buoc du liE;iu

291~

sa.Add( "By Bob Powell"};

NM rling cac ti!.p hop Collection d~u coli diJt giao tie'p IList h6 tro cho viec

rang buoc da Iieu. Doan rna sau se thuc hien rang buoc du lieu vao 0 TextBox

II Rang bur')c ddu khdn vao ca sa du lieu this.textBox1.DataBindings.Add("Text",sa,""); this.textBox2.DataBindings.Add("Text",sa,"");

Cuoi cung thu tuc RightButtonClick va LeftButtonClick se xU- Iy cho phep di chuyen con tro xem cac vi tri da lieu khac trong t~p hop,

4. RANG BUQC DU LI~U GIAN DdN

Rang buoc da Iieu la mot tinh nang quan trong trong .NET, cac di~u khien rang bU9C di1 lieu c6 th~ Sl1 dung trong Windows Forms, Web Forms, ASP.NET hoac bilt ky irng dung Windows nao sii dung nen .NET. Du Iieu rang buec diroc thuc hien thong qua dOi tinrng Dataset. Ban co th~ hinh dung Dataset la vung d~m tam thdi 100 gia phan dtr lieu dang can xii IY. Cach don gian M hii!u v~ Dataset 11'1 My t~p sa dung no. Vi du 3.3-2 dirdi day se cho thily each xii ly Dataset ben trong ung dung sa dung co che rang buoc gian don

Vi du 3.3-2 datasetapp.cs

1: namespace Sams

2: {

3: using System;

4: using System. Drawing;

5: using System.Collections;

6: using System. Data;

7: using System.ComponentModel;

8 : us i ng Sys t em. Windows. Forms;

9: / /This application shows simple data binding to a

10: / /programatically created dataset.

11: public class datasetapp

System.Windows.Forms.Form

12: {

13 : private System_ ComponentModel . Container

components;

14: / I Component declarations

15: private Label

lbl_first,lbl_name,lbl_title,lbl_company,lbl-phon e;

16: private TextBox

FirstName,SurName,Title,Com~any,Phone;

17: private Button btnNext, btnPrev, btnNew, btnEnd;

I!!J 292

PaAN In: Windows Forms

18: 19:

lIThe dataset used to store the table private DataSet dataset;

20: I IButton handler to navigate backwards through

the table records

21: private void OnPrev(Object sender, EventArgs e}

22: {

23: this. BindingContext [dataset. Tables ["Contacts"

]] .Position--;

24: }

25: I IButton handler to navigate forward through the

table records

26: private void OnNext (Object sender, EventArgs e)

27: {

28: this. BindingContext [dataset .Tables ["Contacts"

]] .Position++;

29: }

30: I IButton handler to create a new row

31.: private void.OnNew{Opject s~nder, EventArgs e)

32: {'

33: NewEntry{) ;

34: }

35: IIButton handler to exit the application

36: private void OnEnd(Object sender I EventArgs e)

37: (

38: Application.Exit();

39: }

40: I IMethod to move to the last record. Used when

adding a row.

41: private void MoveToEnd()

42: { ,

43: this . BindingContext [dataset .Tables ["Contacts"

]] .Position=

44: dataset.Tables["Contacts"] .Rbws.Count-1;

45: }

46: I/Method to add a new row to the table. Called at

initialization

47 : 1/ and by the "New" button handler.

48: private void NewEntry(}

49: {

50: DataRow row =

dataset.Tables["Contacts"].NewRow(};

51: I Iset up row data with new entries of your choice

ms

73: 74:

CHUdNG 3·3: Rang buoc da lieu

293~

52: 53: 54: 55: 56: 57 : 58: 59 : 60:

61: 62 : 63: 64 : 65:

66:

67 : 68: 69:

} ; 70: 71:

72:

row l " First"] "," Blank" ;

row [ " Name" ] "," " ;

row ["Company"] ="" i row["Title"]="";

row [ "Phone" ] =" " ; dataset.Tables[O].Rows.Add{row); dataset.AcceptChanges(); MoveToEnd ( ) ;

}

I ICalled at creation to initialize the Ildataset and create an empty table private void InitDataSet ()

{

dataset = new DataSet ("ContactData") ;

DataTable t=new DataTable {"Contacts" } ;

t.Columns.Add("First",typeof(System.String)}; t. Columns .Add( "Name", typeof (System. String}); t.Columns.Add{"Company", typeof (System.String)

t.Columns.Add("Title",typeof(System.String»; t . Columns . Add ( "Phone", typeof (System. String»;

t.MinimumCapacity=100;

dataset.Tables.Add(t); }

75: I ICalled at initialization to do simple binding of the edit

76: I Icontrols on the form to the dataset's

"Contacts" table entries

77: private void BindControls ()

78: {

79: FirstName.DataBindings.Add("Text",dataset.Tab

les["Contacts"],"First"};

80: SurName.DataBindings.Add{"Text",dataset.Table

s["Contacts"],"Name");

81: Title.DataBindings.Add("Text",dataset.Tables[

"Contacts"], "Title");

82: Company.DataBindings.Add("Text",dataset.Table

s ["Contacts" J , "Company" ) ;

83: Phone.DataBindings.Add("Text",dataset.Tables[

"Contacts"],"Phone");

84: }

b!J 294

PHAN III: Windows Forms

85: 86:

//Constructor. positions the form controls, //Ininitializes the dataset, binds the controls

and

87 : //wires up the handlers.

88: public datasetapp ()

89: {

90: this. components := new

System.ComponentModel.Container ();

91: this .Text ::= "datasetapp";

92: this .AutoScaleBaseSize ::= new

System. Drawing. Size (5, 13);

93: this.ClientSize::= new System. Drawing. Size (250,

200);

94: this. FormBorderStyle :=

FormBorderStyle.Fixed3D;

95: 96: 97 : 98: 99:

lbl_first ::= new Label ( ) ;

lbl_first .Text::="First name"; Ibl_first . Location = new Point{5, 5); Ibl_first. Size ::= new Size (120,28); Ibl_first . Anchor ::= AnchorStyles. Left AnchorStyles.Right;

100: Controls.Add(lbl_first};

101: FirstName ::= new Text Box () ;

102: FirstName. Location ::= new Point (125, 5) i

103: FirstName. Size ::= new Size (120, 28) ;

104: FirstName. Anchor = AnchorStyles. Left

AnchorStyles.Right;

lOS: Controls.Add{FirstName);

106: Ibl_name = new Label ( ) ;

107: lbl_name.Text="Surname";

108: Ibl_name. Location = new Point (5, 35);

109: Ibl_name.Size ::=newSize(120,28)i

110: lbl_name . Anchor ::=

AnchorStyles.LeftIAnchorStyles.Right;

111: Controls.Add{lbl_name);

112: SurName ::= new TextBox();

113: SurName. Location ::= new Point (125,35);

114: SurName. Size ::= new Size (120, 28) ;

115: SurName.Anchor = AnchorStyles.Left

AnchorStyles.Right;

116 : Controls. Add (SurName) ;

117 : 118:

lbl_company = new Label ( ) ; Ibl_company.Text="Company";

ms

156: 157: 158:

CHUdNG 3·3: Rang buoc di1li~u

29511J

119: 120: 121:

122 : 123 : 124 : 125:

126: 127 : 128 : 129 : 130 :

131: 132: 133 : 134:

135 : 136 : 137 : 138: 139:

140: 141 : 142 : 143 :

144: 145 : 146 : 147: 148: 149:

150: 151: 152 : 153: 154 : 155:

Ibl_company.Location = new Point (5. 65); lbl_company. Size = new Size (120,28) ; ControIs.Add(lbl_company);

Company = new TextBox ( ) ;

Company. Location = new Point (125,65) ; Company. Size = new Size (120,28); Controls.Add(Company);

lbl_title = new Label () ; Ibl_title.Text="Title";

Ibl_title. Location = new Point (5,95) ; lbl_title.Size = new Size(120,28); Controls.Add(lbl_title);

Title = new TextBox() ; Title.Location = newPoint(125,95); Title.Size = new Size{120, 28); Controls.Add(Title);

lbl-phone = new Label () ; lbl-phone.Text="Telephone"; lbl-phone. Locat ion = new Point (5,125) ; lbl-phone. Size = new Size (120,28) ; Controls.Add(lbl-phone);

Phone", new TextBox ( ) ;

Phone. Location = new Point (125,125) ; Phone. Size = new Size (120,28) ; Controls.Add(Phone);

btnNew = new Button ( );

btnNew. Location = new Point (5,155) ; btnNew. Size = new Size (70, 28) ; btnNew.Text="New" ;

btnNew.Click+=new EventHandler (OnNew) ; Controls.Add(btnNew);

btnPrev = new Button{) ;

btnPrev .Location = new Point (80,155) ; btnPrev.Size = newSize(35,28); btnPrev.Text="«";

btnPrev. Click += new EventHandler (OnPrev) ; Controls.Add(btnPrev);

htnEnd = new Button ( ) ;

btnEnd. Location = new point (120.155) ; btnEnd.Size = new Size(70,28);

~296

btnEnd. Text = II End" ;

btnEnd. Click += new EventHandler (OnEnd) ; Controls.Add(btnEnd);

PHAN III : Windows Forms

159: 160: 161:

162: 163: 164: 165: 166: 167:

168:

169:

170:

171:

172 : 173: 174: 175: 176 : 177 :

btnNext = new Button ( ) ;

btnNext . Location = new point (200,155) ; btnNext.Size::: new Size(35,28); btnNext.Text="»";

btnNext .Click += new EventHandler(OnNext); Controls.Add(btnNext);

InitDataSet();

NewEntry () ;

BindControls();

}

/ ICleans up the Form

public override void Dispose ( ) (

base.Dispose(); components.Dispose();

}

178: IIMain method to instantiate and run the

application.

179: staticvoidHain()

180: {

181: Application. Run (new datasetapp () ) ;

182: }

183: }

184: }

Vi du 3.3·2 minh hoa kha chi tie't. Deii tuqng DataSet duoc khdi tao c yeu & dong 66. d day, DataSet duqc tao ra va mot bang mai duqc d~t vao t~p h bang. Bang duqc tao ra vdi mQt t~p hop cac cQt xac dinh bOichuoi "First", "Nan

.... Vi~c them dcr li$u vao mQt bang dU'qe thirc hien tirng hang tai mot thai di~ Phuong thirc a dong 48 them mot hang moi vao bang va dUm diiy n6 voi nQi dt tuy y. Ban cung CD tM tao ra m(it bang vdi gia tri so' hoac nhtrng ki~u khac, DI 79·85 thirc hien rang buoc dcr Iieu trong bang vdi thuoc tinh Text cua nhung d khign xac dinh, Gia day n6 CD th~ dung M hieu chinh thOng tin trong bang, chung se hi~n thj moi muc tl,i d<)ng khi ban duyet qua co sO' dcr Iieu. Cac bQ Xl handler cua di~u khi€n nut nhan se thuc hiE;in viE;ie duyE;it dil Iieu. Chung Stl' dl thuoc tinh ContextManager.Position M danh chi muc cac hang trong bang. H 3.3-2 cho thay man hmh cua U'ng dung.

III Ip

IS

CHUdNG 3-3: Rang buec da lieu

.'i'.'···

Co~pqrn~

Titl~ lelElpll6ne

Hinh 3.3-2 Ung dung rang bu(ic Dataset

5. RANG BUQC DU LI~U pmJC H(1P

~'"

2.

.

Rangbuoc gian dan Iii qua trinh ke't nbi mQt di~u khi~n dan Wi mot muc

da li¢u dan. Rang buoc phuc hop 190 rang buoc mqt di~u khien dan tai nhiau muc dctli¢u. Nhtrng dieu khi~n thuong sit dung cho da li¢u phirc tap g6m co DataGrid, dOi taqng nay xua"t hien nhu mot bang bi~u dan gian. Bieu khie:n nay co thii' hi~n thi, x6a cac ban ghi tu mot bang. Thao tac rang buec da li¢u dan duoc dung di1 gtin ID9t dieu khien vai DataTable.

DataGrid chi co th@ Stl dung M hi~n thj mQt bang tai mQt thai di~m, nhung n6 cung co tM dung M hi~n thj quan h~ gicra cac bang. Vi du 3.3·3 cho thay phien ban stla dbi cua vi du ve rang bUQc gian dan duqc trmh bay trong 3.3-2. TrOng vi du nay ta Ioai bo ta't ca cac dieu khi~n c6 lien M vci DataSet va thay the chang bang mQt dieu khien Iudi phuc tap han. Rang buoc da li¢u phirc hop chi thue sl! phtrc tap ben trong ehinh clurcnang ella no, khong phai trong each sa dung,

Vi du 3.3·3 gridbind.cs

~"

n.:

Ig . Ig .

tu

'3 Y g h

1: 2 : 3: 4: 5: 6 : 7 : 8 :

names pace Sams {

using System;

using System. Drawing; using System. Collections; using System. Data;

using System.ComponentModel; using System. windows. Forms;

,

9: IIThis application shows a Lmp Le data binding to a

10: Ilprogramatically created dataset.

11: public class Gridl:i-ind

system.Windows.Forms.Form

12: {

~298

PuA.N III : Windows Forms

13 :

privateSystem.ComponentModel.Container

components;

14: private System. Windows. Forms . DataGrid

dataGrid1;

15: 16:

17 : 19: 19: 20: 21:

22:

23: 24: 25:

) ; 26: 27:

28:

29: 30:

liThe dataset used to store the table private DataSet dataset;

IICalled at creation to initialize the Iidataset and create an empty table private void InitDataSet ()

{

dataset = new DataSet ( "ContactData" ) ;

DataTable t=new DataTable ("Contacts");

t.Columns.Add("First",typeof(System.String»; t . Columns .Add( "Name", typeof (System. String) ) ; t . Columns . Add ("Company", typeof (System. String)

t.Columns.Add("Title",typeof(System.String»; t.Columns.Add("Phone",typeof(System.String»;

t.MinimumCapacity=lOO;

dataset.Tables.Add(t); }

31: IICalled at initialization to do complex binding

of the DataGrid

32: / Ito the dataset I s "Contacts" table entries

33: private void BindGrid()

34: {

35: this.dataGridl.SetDataBinding(dataset.Tables[

"Contacts"),"");

36: }

37 : 38:

and 39: 40: 41: 42:

43:

44:

IIConstructor. Positions the form controls, IIIninitializes the dataset, binds the controls

Ilwires up the handlers. public GridBind()

( InitializeComponent();

InitDataSet();

BindGrid ( ) ;

cHlfONG 3-3: Rang buoc da Iieu

299k!J

45: )

46: I /Cleans up the Form

47: public override void Dispose ()

48: {

49: base.Dispose{);

50: components.Dispose();

51: }

52: / IMethod added by the form designer

53: private void InitializeComponent ()

54: {

55: this. components ::: new

System.ComponentModel.Container ()i

56: this. dataGridl '" new

System.Windows.Forms.DataGrid ();

57: dataGrid1.BeginInit ()i

58: dataGrid1. Location = new System. Drawing. Point

(8, 16) i

59: dataGridl.Size:::newSystem.Drawing.Size (472,

224) ; 60:

61:

62:

63:

dataGrid1. DataMember = ""; dataGridl. TabIndex = 0; this.Text::: II GridBind" ;

this . AutoScaleBaseSize '" new

System.Drawing.Size {5, 13};

64: this. FormBorderStyle =

System.Windows.Forms.FormBorderStyle.Fixed3D;

65: this .ClientSize = new System. Drawing .Size (486,

251);

66: this.Controls.Add (this.dataGridl);

67: dataGridl. EndInit ();

68: }

69: I /Main method to instantiate and run the

application.

70: static void Main ( )

71: {

72: Application.Run(new GridBind(});

73: )

74: }

75: }

Dich chuang trmh nay v6'i dong li;lnh sau : csc It:winexe gridbind.cs

~300

P~N III: Windows Forms

Xem thong tin trong Vi du 3.3-3, ban c6 th~ thd'y rang' rna dil duyet tap hop da Iieu khong con can den nua, Phuong th(te d~ them mot hang da lieu rnoi cung khOng can. Di€u khi4n DataGrid lam td't ea di€u nay hQ ban. Rang bucc da lieu voi khung hlai diEm ra a dong 35. Vi~e khdi tao t~p hop da li~u hoan toan giong vdi vi du triroc day; no duoc minh hoa {j dong 19-30. Htnh 3.3-3 cho thay ang dung GridBind khi hoat d1?ng. CM y rAng khung lucri cung cap c(lt va cac dong Lieu d~ cho phep ban chon toan b(l dong hoi).c slip di).t bang tha tI! theo alphabe bai cac cot,

Dieu khien DataGrid cung c6 th~ sli dung M chi ra quan M phan dip giua nhieu bang du lieu,

Chang han nhu mot ung dung dang Quan If Tai nguyen Khach hang (Customer Resource Management) se can den mili quan h~ giUa m¢t khach hang vci nh ieu don dij.t hang cua. Khi do, rang buoc da lieu phirc hop him cho qua trinh

nay tTa nen de hon. .

Andrew Janel Margaret Steven Michael Robert

Hinh 3.3-3 K!t qud r .g bUQc dillifU phuc hap

Cho den luc nay, ban da nhm thay each rang buoc da li~u voi DataSets vii DataTables dl1qc tao ra trong doan rna tren. Chung ta hay xern qua mQt vi du thue te eho thay each rang buoc phirc hop tren co sa da lieu hien hanh. Cac dOi tircng rna chung ta dung d€ chua va xli ly du lieu la thanh qua do ADO.NET mang lai. H~ thong nay cho phep tuong tac ij mire cao vai cac bang eo sa da li$u t~ nhieu nguon cung cap da lieu khac nhau. ADO.NET c6 th~ duqc stl dung ket nili vdi OLEDB" SQL, va nhirng trmh dieu kh ien da li~u khac,

Gia chung ta hay xem qua mot vi du ve each sii dung kiElU Tang buoc co se da lieu phirc hop,

CHUONG 3·3: Rang buoc dcr li~u

301~

6. RANG BUQC THANH PHAN DIEU KHIEN VOl CO sd DU LI~U sit DVNG ADO.NET

ADO, NET sli dung khai niern mo hmh ngilt ke"t nBi voi co sa dcr li~u, mo hinh nay sa dung cac bang dcr Iieu duoc d~t van vung d~m (cache) sAn tren may khach khi hiiln thi va xli ly.

Tham chi ngay cd khi co sa da li~u dugc luu tren cung mot may voi chuang trinh hieu chinh. ADO. NET se sao chep mi)t anh (snapshot) cua dU li~u vaodoi tucng DataSet va chuyen nhung thay d6i nguoc vG co si'1 dcr li~u sau khi xu ly xong, M6 hmh nay diroc S11 dung nham cho phep cac irng dung co sa dcr Iieu duoc uyiln chuyen va dil thay d6i qua mar han VI no dap ling nhu cau cho rna nhieu ket noi d6ng thoi truy van co sa dcr hi Cac bang dcr lieu rAt co cau true va co thu bac.

£)i~u nay lam eho XML trd nen tuong eho vi~c di chuyan va luu tru du lieu,

That vay, khi ADO tao teet nbi Mn casa du lieu, thong tin duqc chuyen sang dang XML. Co nghia la phan rnern cua ban co tM t~n dung uu di~m cua mang cue bi) Intranet va dcr lieu tren Internet dugc luu tr11 de dang tuong' tv nhu each n6 luu trcr trong co sa dir li~u cua may CI,IC bi). Dieu quan trong can nhrr do Ia vil>c di chuyen rntrt so luong Ian du lieu den va di khoi co so du lieu tro thanh nhu cliu cung can nhu vi~c co sa dir li~u ngat ke't noi vrri may .khach. Mo hinh h~ thong nhieu tang thuong tie'p xuc sii dung vdi rat nhieu co sa diJ lieu nam tren nhung vung dia Ii khac nhau va cac dich VI,I Web thuong' huang da lieu thea yeu cau cua trlnh khach, Dieu TIlly c6 nghra Ia cac ling dung khach can thli dung nhfrng khoi dcr lil>u nho c6 th~ duo'c cap nhat va him moi lai nhanh chong tren mOt bang thong him viec nho hep, Vi Iy do nay, trach nhiern cua I~p trinh vien thuong la phai phan chia va quan Ii cac hroc do d11 Iieu thirc hien trong giao tac. Mi)t kha nang khac cua ADO. NET do la che difu nhitng eong vi~c co th~ lam ban met nhoc va ghlp ban lam viec hi~u qua han vdi dll Ii~u.

VisualStudioData dugc sao chep diln hoac di tU DataSet bai DataAdapter.

ADO. NET phan ehia hai kieu DataAdapter ehinh la OleDBDataAdapter dung kilt noi DataSet vdi nhirng ngu5n cung ca'p da li~u dang OLE Va SqlDataAdapter. Nham Mn muc tieu Ia cac ket noi SQL server. Ca hai lap tie'p hop (adaptor) nay sli dung m(lt t~p hop cac doi ttJgng Command M thuc hien IVa chon, c~p nhat, chen, va xoa n1?i dung co si'1 da lieu rna chung nbi kilt noi den. Lenh Select lAy da lieu tCt nguon dcr lieu, Cac I~nh Update, Insert, Delete thirc hien thay d5i da li~u dua tren nhirng thay dili tac d(lng van DataSet, m~n van Dataset nhung thong tin Ia'y tic co sa da Iieu rift dan gian. Cac bucc thuc hien duoc minh hoa trong doan rna duai day:

1: System.Data.OleDb.OleDbConnection Connection=

2: new System.Data.OleDb.OleDbConnection();

3: Connection.ConnectionString =

4: @"Provider=Microsoft . Jet. OLEDB. 4.0; "+

5: @"Data Source=northwin.mdb;";

1M) 302

PHAN III: Windows Form

6: System. Data. OleDB. OleDBCommand SelectCommand= new

System. Data. 01.eDBCommand ("Select * from Customers") ;

7: SelectCommand.Connection=connection;

8: System.Data. Dataset ds=new

System. Data. Dataset ("Customer Table") ;

9 : ds . Tables. Add ("Customers") ;

10: System. Data. OleDb. OleDbDataAdapter adapter=

11: new

System.Data.OleDb.OleDbDataAdapter(SelectCommand);

12: adapter.Fill(ds};

13: Console.WriteLine(ds.GetXmI(»;

Doan rna nay gia thiet ding ccr sd da li.;\u NorthWind mang te northwind.rndb co san trong thu muc cue bl). Cac dong 1 -5 tao ra mt Ole DbConnection va t~p hop cac chuOi ket noi. Dong 6 va 7 tao ra SelectComman va cho phep S11 dung chuoi duoc chon vdi cau truy van hop l~. Dong 7 phoi hop ki n6i co sd da lieu v6"i l~nh select, trong khi dong 8 tao ra dei tuong DataSet , them vao do mot bang.

Dong 10 tao ra mot, bi? tiep hqp da li(i\u va them vao l~nh select. Dong 1 di~n dliy da li~u thiet l~p tU' bi) tiep hop va cuoi cung, M chirng minh ding no th: sl! lam duoc cai gt do, dong cu6i cung do toan bi) bang da li.;\u khach hang ci northwind tu DataSet thanh da Iieu XML.

Theo each nhin nhan v~ nang sua't, ban co le se thirc hien cac thao tac nl vay thong qua s11 dung rnni truong IDE cua Visual Studio.NET d/$ tao ra ling dun Rang buoc da li~u sl't dung Visual Studio sinh ra mot kh6i khong 16 rna va lam cI cong viec ket noi CCI sd du lioilu ban lrd nen rAt toan dil;!n. Noi chung eho den hi gia, chung ta v.1n tranh sa dung Visual Studio bdi vi hI) khung cua nhung ling du tao ra thea each nay khOng phai la de doc va doi khi e6 tac dung ngucc, gay kl khan eho ban trong viec bo sung va soan thao rna do Visual Studio phat sinh. TI nhien, trong trmmg hop nay, each h9C tOt nhat d6 la duyet qua toan bl)- khui nhin cua co sd da li.;\u su dung IDE va sau d6 ki~m tra ket qua phan hdi cua ltJ dung M xern n6 lam cai gi.

7. T~O RA MQT KHUNG NHIN co sCI nu LltU (DATABS] VIEWER) VdI VISUAL STUDIO vA ADO.NET

Ban can thuc hien cAn th~n nhirng bl16"c sau M tao ra ling dung: 1. Tao ra mot dl! an Windows Forms rndi, d~t ten cho no la DBBind

2. Keo mot DataGrid W toolbox va dinh vi n6 tren form. Chon thul)-c til DataGrid va thiet l~p thunc tinh Dock 13 Fill bang cac kfch chu!)t vao gii1a n nhan trong cua sd soan thao danh cho thuQc tinh Dock.

3. Tu thanh cong cu chon 01eDbDataAdapter tu bang Data. Khi d~t no len for ban se nhin thiiy hop thoai Data Adapter Configuration Wizard

CHl1dNG 3·3: Rang buoc da lieu

303~

4. Tren trang dau tien cua man hlnh tro giup Wizard, chon co sa da lieu NorthWind. C6 the ban cAn nhap vao muc New Connection, chon Microsoft Jet 4.0 OLE DB Provider trong tab Provider. Nhan Next, va duyet tim northwind.mdb. Khi ban tim thay northwind.mdb, hoac co sa da Iieu nao d6 ma ban quen thuoc, nhan nut Connection M bao dam di.ng co sa da lieu c6 tM sil dung duoc. Nhan Ok trong h(\p thoai New Connection va nhan Next tren man hmh Wizard.

5. Chon nut radio danh dau Use SQL Statements. Nhan Next.

6. NMp cau truy van ma ban biet hoac chon bi;) xay dung truy van dEl tao ra cau truy van til cac bang trong co sa da Iieu ket n6i n6i. Trong vi du tren, chung ta su dung b';' xay dung truy van, them vao bang Customers til NorthWind, chon 0 checkbox danh dau All Columns tren bang hien ra, va nhan nut Ok trong hQp thoai.

7. Nhan Next se cho ban thay viec tao bi;) tiep hop va ket n6i thanh cong, ban c6 the nhan nut Finish luc nay, ban se c6 m';'t form voi hai d6i tucng, mot la OleDbDataAdapter va met la OleDbConnection tren khay bieu tuqng (icon Tray).

8. Chon 01eDbDataAdapter trong khay biElu nrong, Dirdi thuoc tinh browser, ban se thay met lien ket, Generate DataSet. Nhan vao lien ket nay de tao fa dataset.

DOn gian chi can kich OK trong h(\p thoai theo sau; T6t nhat Ia sU' dung cac gia tr] mac dinh hien co. Bay gia ban se c6 ba bieu nrong trong khay.

9. Chon DataGrid tren form hin nua va hi~u chlnh thuoc tfnh DataSource thong qua danh sach combo box. Ban se nhin thay m';'t so' nguon du lieu, Neu ban ti8p tuc lam thea va sU' dung ca sa dtr li¢u NorthWind, chon DataSetl.Customers. Khi lam dieu nay, ban se thay DataGrid tren form biit dliu hien th] tat ca cQt tieu de co s& de li¢u.

10. Burro cu6i cung diroc thuc hien thu congo Ban can slia d6i phuong thirc constructor ella lap doi chut va them vao l~nh Fill. Them van dong rna sau loi goi InitializeComponent trong phuong thuc khdi dung constructor:

this.oleDbDataAdapterl.Fill(this.dataSetll);

Bay gio ban c6 thg bien dich va chay chuang trinh bAng each nhan F5.

Ban se thay man hmh irng dung hiiln th] nhu hinh 3.3·4 n6 cho phep bar duyet xem, slip xep va hieu chinh, n6i chung la moi thao tac vdi bang da lii"u Customers cua NorthWind.

Do dEl hoc tap, hay tra lai b';' soan thao Visual Studio mQt IAn ntra vu tim phuong thirc InitializeComponent. No co tM dvqc d~t narn a nhanh folder nao d6 va ban phai bung rQng chung ra. Xem ky ma lenh them van bdi DataAdapter Wizard do:) thiet l~p ket n6i OleDataAdapter cung vai bon d6i tuong l¢nh khac, Khi

I!!J 304

pHAN III : Windows Forms

thuc hi~n qua cac bt.iac, ban se nhan dt.iqc rna phat sinh, chung toi khong li~t ke chung a day,

Ban c6 tM ro rang nhm tha'y each thuc trrnh Wizard va nhi1ng bo, tro giup Helper htrong dan ban sli dung ADO.NET ngay tren d!iu ng6n tay.

Ana Truimo E Owner Me.leo
MexIco D.F Antonio More Owner Mexico
London Around the H Sales Repres UK AROU
Lulea Berglund~ sn Older Admini Sweden BERG~
Mannneim Blauer See D Sales Repre. German~ BLAU~
StrasboUfg Blondesddsl Ma,keting Ma France BLON!
Madrid Bolido Comid Owner Spain BOLIO
.. ,.
Marseille Bon app' Owner France BONAI.
Tsewassen BoUom·Doliar Accounting M Canada BOTTt
London UK Hinh 3.3-4 KIt qud rang bu'lc phtic hop trong hhung lu:ai

8. NET cmroxc

Trong chong nay. cluing ta dii xem qua nhtrng nguyen tAc co ban CLIa rang buoc dcr Iieu trong ADO.NET. Ban Cling dii thay sire manh cua cac di~u khien .NET co th~ giup chung ta lam vi(ic M tao ra mot rnoi trlii'Jng co hi~u swn cao. Tie"p den, ban cling da nhin tha'y each rang buoc DataGrid lam vi~c <1 ca mo htnh co l~p cac bang CI,lC bo, va voi CrJ sa di1 li~u day du thOng qua ADO. NET. Chung ta se tiep tuc quan tarn den Windows Form trong chuong 3.4 khi xay dung irng dung thuc te mang ten "Scribble. NET" noi ban se c6 dieu kien hoc each sa dung cac thanh phAn dO hca M trang tri giao dien cho ling dung.

Chuclng3.4

xA Y DlJNG UNG Dl)NG WINDOWS FORMS (SCRIBBLE .NET)

Cae vdn di chinh se dUdc d~ cap den:

v" Cdc tai nguy~n trang .NET

Df-a,. plu,,cO"ng huu (LocaUzuttu(l.j /1l.l)-t ciict: Ll~ liang

./ Cac lap (class) quan ly tai nguyen crlaNET ./ Tao l<,!p tai nguyen vdn ban (text)

./ SIZ dung Visual Studio. NET di Qu6c ti hoa (Lnternationaiization) ./ Cac tai nguyen hinh dnh (image)

v' SIZ dlfng cac danh each. hinh. <inh (Image List)

./ Phuong each. l<,!p trinh. truy xudt din ctic tai nguyen ./ D9C va vitt t{jp tin XML RESX

1. cAc TAl NGUYEN TRONG .NET

Khong giong nhu Win32 va MFC, cac ililg dung :1'l"F;,\ khOng phu thuoe nang n~ vao cac tai nguyen cho hi}p thoai (dialog) va trmh bay~wn miiu (form layout). Tuy nhien, cac tai nguyen clin thiet. cho vi~c dia phuong hoa img dung, viec tich hop cac hinh anh va biilu tuung, va cho vi~c sli dung cac da lieu cua nglloi dung lai d~ dang duqc thay d5i rna kh6ng elin den viec bien dich lai m!}t ililg dung.

Cac mau tai nguyen (resource model) trong .NET la cac tai nguyen mac dinh va mot tap hop tuy chon cac tai nguyen btl sung (additional resource) cung cAp kha nang dja phuong hoa, hoac qu6c tor hoa ehinh KaC hen, hoac cac dii' li~u cho mi)t n~n van hoa xac dinh nao d6. Vi du: mQt ililg dung nan co mQt tai nguyen mac dinh v~ van hoa Anh - theo kiilu My (US - English) nhung cling clin dia phuong hoa Anh - theo kiilu truy~n th6ng (UK - English) Mi sV khac nhau v€! bii\u tLfqng ella ti~n ~, hoac PM.p, nci rna cac chu5i ky tv tren thanh thuc don (menu) phai sli dung ngon ngii" phu hop (tierig PMp, chu khOng phai tieng Anh),

Cac tai nguyen mac dinh thi thucng dUQ"c dong goi (assembly) trong cac doan rna chuong trinh. Cac goi ke't hcp assembly chua cac tal nguyen e6 th~ duqc tili len va si't dung' khi din. Phuong each nay tinrng tv nhu viec si't dung cac tiii nguyen DLL trong Win32 va MFC.

M~t ting dung t6t can luen duqc dia phuong hoa va nen luon cung cilp cac tai nguyE!n eho bilt ky nen van hoa nao rna phan mem ay co tM dLfqe sa dung, N6 ciing co nghia la khOng phai tilt ca cac ililg dung d~u can phai lit "C6~g dan cua

~306

pHAN III : Windows Forms

toan edu" , do do ban nen lira chon rmrc dq hB tro ngon ngi1, mire dq nay tuy thuec vao kenh phan phtii san pham va nhu du cua nguai dung rna ban nham Mn.

2. DJA PHUONG HOA sAN PHAM MQT CACH DE DANG

Cach tot nhAt M hi~u v~ tinh dia phinrng hca IA thue hanh xay dung mot irng dung, Di~u quan trong nhat rna ban co tM lam d~ trude tien d6 Ia nho ding dung nhung bat ky ehuBi nao van trong cac doan rna chuang trinh cua ban. Vi du, hay dUng baa gio go:

MessageBox.Show("Hello World!");

Bdi vi khi do ban da nhung chudi "Hello World!" vao trong rna chuang trtnh va n6 se lam cho chuang trinh cling nhac, El~ lam cho chuang trrnh trd thanh "cong dan cua toan cdu", ban co th~ tao lij.p met tai nguyen mac dinh vdi mot chuoi dUQ'e gan gia trio Vi du:

MessageBox.Show((String}resources.GetObject( "MyHellbWorldResourceString"»;

Trong dong tren, cac ky tl)' thuc sl)' cua thong di~p khOng duoc d~t a trong cac dong rna va dugc ta i len ttl mot tai nguyen chubi ky tl)' co dinh danh mang ten "My Hello W orldReso urceString".

Neu n~n van hoa mac dinh cua ban la Anh - ki~u My, chubi se mang n(li dung "Hello World!". Neu (tng dung dn duoc h6 trg trong ruroc Phap, mot goi ngudn tai nguyen gianh cho ngcn ngtr tie'ng Phap se c6 chuBi tuong ung vdi dinh danh "MyHelloWorldResourceString" nhung lai c6 gia tri khac la "Bonjour Le Monde!" ch&ng han.

3. cAe Ldp QUA.N LY TAl NGUYEN eVA .NET

BO khung Framework .Net cung cap mOt ho cac ldp diroc thiet ke' M cho viec quan It cac tai nguyen tnJ nen d~ dang va chac chan. Cac 16p d6 la:

ResourceManager Dung d~ quan Iy tAt co. cac tai nguyen cua ung dung.

Resourceiset Trinh bay mot tij.p hop cac ta.i nguyen cua mQt n~n van hoa xac dinh.

Resourcelieader La lop thi hanh cho giao tiep lResoureeReader. N6 duge dung M doc tai nguyen tl! mot lu6ng da li{lu (stream).

ResourceWriter La lap thi harih cho giao tiep lResoureeWriter. N6 dircc dung i d~ ghi tai nguyen van mOt lu6ng du lieu (stream).

Ung dung cua ban phai dung m¢t ResourceManager de' to.i cac goi nguyen va lam eho chung sAn sang eho phdn con lai cua chuang ResourceManager se tra v~ ResoureeSet cho moi van hoa tuong' U'ng duqe yeu cau.

n

CHUONG 3-4: Xay dung ling dung Windows Forms

307~

3.1. Tim mQt van hoa

Cac nen van hoa va ngon ngi1 khac nhau duoc djnh danh thong qua lop Culturelnfo. Lap nay chua nhi1ng thong tin dan gian ve nen van hoa rna nguai dung lua chon khi anh ta hay co ta cai di).t M dieu hanh. N6 baa g6rn thilng tin v~ ngon ngu, Iich, tien t(j, va cac thong 56 khac co th~ duqc lira chon. Phan mem cua ban se truy xuat cac thong tin nay va biet duoc no e6 kM. nang cung cap cac tai nguyen di).c tntng ve van hoa d6 hay phai dung cac gia trj mac dinh.

Nhilng di).c trung ve van hoa 180 cue ky quan trcng dili vdi thong di~p rna ban eil giing M truyen tai. Nhilng dieu dllai day se rninh hoa tai sao.

MQt chut v~ van hail cite nu{Jc

Milt nba may xa b6ng lan in qtuing cdo v~ milt d6ng qudn. do bdn. dang duac bO va~ mdy gi{lt. Buc htnh thsi hai cho thdy bf)t gi{lt dang duac d6' vao may giat. Va buc thu ba cho th6.y qulin do sach: se duac tay ra kh6i may. Thi nhung, nho. nuiy kh6ng hi~u duoc vi sao s6 lUrmg san phdm bi sut guim nghiem. trong a vai nuac clio din khi bdt rdng sdn luang ban duoc tluip nh6.t La a nhiing nuoc co van hod dQC tit phaisang-trai. Mdu qtuing ctio 6.y, dune lam b&i mot nguoi My, cho tluiy ~do~~W¢~~~~~~~~~~ duac ldy ra khoi may. Ditng boo gia gid szi di~u gi rna ban chua khao sat kyo

Cac thong tin van hoa ve ngon ngiJ duoc cung ea'p bdi mot rna 2-ky-tV va mQt tuy chon dinh danh vung di cung vdi rna do. Vi 0.':1, tieng Anh n6i chung dllqe bi~u thi bling hai ky tu "en". The nhung, bdi VI c6 nhilng su khac nhau trong vi~c dung tieng Anh - tieng Anh ciia mrcc Anh, Canada, My hay nhirng noi khac - dllqc di kern brri nhilng rna phu (subcode) nhu GB, CA, US va nbirng rna khac,

Vi du 3.4-1 dlloi day chi ra each rna mot chuang trmh se la'y Culturelnfo tren may tinh cua ban va nhir d6 dung dung ngon ngtr va vung du'gc ap dung cho may cila ban. N6 se hilln thi ten d&y dil cua van hoa va lich rna nen van hoa cua ban dang sa dung,

Vi du 3.4·1 culture.cs: Hie"n th] Thong tin Van hoa Hi~n t~i

IIculture .cs

1: namespace Sams . .2: { 3:

4: .6: !8: 7:

using System;

using System. Drawing;

using System. Collections; using System.ComponentModel; using System. Globalization;

~308

Label 1 = new Label () ;

I. Location = new Point (3, 5) ; I.Size = new Size (294, 190);

pHAN III: Windows Forma'

8: using System. windows. Forms;

9: using System. Data;

10:

11: class CulturelnfoTest Form 12: {

13:

14: publ.ic CulturelnfoTest ( )

15: {

16: this.Size=newSize(300,200);

17:

18: 19: 20: 21:

22: InputLanguage inL =

InputLanguage.CurrentlnputLanguagei 23:

24: 25:

26: I.Text = String. Format ("Culture identifier =

{O}\n"+ 27:

28:

29:

30:

31:

32:

33: 34:

35: 36: 37: 38: 39: } 40: 41: }

Culture Info info = inL.Culturei

"Display name = {l}\n"+ "Calender = {2} \n", info.ToString(),

info. DisplayName,

info.Calendar.ToString(»; this.Controls.Add{l);

}

static void Main ()

{ Application.Run(newCulturelnfoTest(»; }

4. T~O ~P CAC TAl NGUYEN vAN: BAN

C6 nhieu each d~ ban e6 th@ tao ra tAi nguyen van ban eho chuang trl cua ban. Cach don gian nhat la tao mot t1j.p tin van ban c6 mot tap hop cac ten - gia tri (name - value). B1I.ng each nay chung ta se de dang chon ra gill. cua tai nguyen van ban lien ke"t vdi ten rna ban dung trong rna chuang trinh ban.

Khi hoan tift viec tao tij.p tin, ban phai chuyen n6 thanh mOt tap tin d. tAi nguyen .resx hay resource bang' each dung cong cu RESGEN.EXE cua .NET. du tiep sau se chi rii each lam.

CHtJdNG 3-4: Xay d\lllg U'ng dung Windows Forms

3091l4l

4_1. Chutii titi nguyen van ban

Tij.p tin van ban dan gian sau day cho thay ro mOt t~p cac cap ten ~ gia tri cho m9t tai nguyen se dugc dung lam cac chudi mac dinh cho mqt U'ng dung. Luu y ding da'u nhay khong c~n thiet dil bi€u dien chuei. Neu dung dau nhay, no se bi hieu Iii. mOt thilnh phan cua chudi.

#Default culture resources

WindowText == Internationalization example LabelText : Hello World! ! !

Tij.p tin van ban co the dugc chuyen thanh mot trong hai dang: dang co s6'XML (XML-based) dircc luu trong tij.p tin .resx hoac true tie"p thanhdang da dugc bien dich .Resources, Tij.p tin .resx la mot tij.p da li~u XML dugc dung dil n6i tiep cac thong tin tai nguyen trong qua trlnh phat trien .. S!! chuyen d6i dang cua tai nguyen duoc thirc hien nho' cong CI,I Resgen. Go nhtrng dong tren vii. 1u'U thanh tij.p tin firstresource.txt, Sau d6 ban tao thanh tij.p tin .resx bi\ng each dung l~nh sau:

Reagen first resource. txt firstresource. resx

Ung dung se bien dich tij.p tin tren vii. bao cho ban bie't rAng hai tai nguyen dB. dUQ'c chuyen d6i. Vi du 3.4-2 se gi6i thieu tij.p tin XML.

Vi du 3.4-2 firstresource.resx: T~p tin 'I'a i nguyen d£:\ du'gc chuy~n sang lh.lngXML

<?xml version:"l.O" encoding="utf-S"?> <root>

<xad:schema id="root" targetNamespace= .... xmlns= .... xmlns:xsd:''http://www.w3.org/2000/10/XMLSchema'' xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:element name="data',,>

<xsd: compleXType mixed="true" >

<xsd:all>

,,,. <xsd:element name="value" minOccurs=" 0 "

,~ype="x5d:string"/>

. </xsd:all>

<xsd:attribute name="name" type:"xsd: string"'> <xsd:attribute name e "type" type="xsd:string"/> <xsd:attribute name = "mimetype" type="xsd:string"/>

t-: </xsd:complexType> </xsd:element>

<xsd:element name: "resheader" >

(.0' -: <xsd:complexType mixed:"true">

11i '<xsd: all>

<xsd:element name="value" minOccurs="O" . type::: "xsd: string" / >

</xsd:all>

~ 310 PHAN III : Windows Forll

<xsd:attribute name = "name 11 use="required" type="xsd: string 11 I>

</xsd:complexType>

</xsd:element>

<xsd:element name = 11 root 11 msdata:IsDataSet:lttruelt> <xsd:complexType>

<xsd: choice maxoccu r se It unbounded" > <xsd:element ref="data"/> <xsd:element ref="resheader" I> </xsd:choice>

</xsd:complexType>

</xsd:element>

</xsd:schema>

<data name="WindowText"> <value>Internationalization example</value> </data>

<data name=" LabelText 11 > <value>HelloWorld!! !</value> </data>

<resheader name = "ResMimeType" > <value>text/microsoft-resx</value> </resheader>

<resheader name="version"> <value>1.0.0.0</value> </resheader>

<resheader name = " Reader" > <value>System.Resources.ResXResourceReader</value> </resheader>

<resheader name="Writer" > <value>System.Resources.ResXResourceWriter</value> < 1 resheader >

</root>

Ban e6 tM thay trong vi du 3.4·2 ding co tM day kh6ng phai lit u;.p t.in ban muiln go bling tay. PM.n thu nhat cua t4p tin lit Ia m.Qt luge diS (schema) I nghta n/?i dung cua t~p tin XML. Moi thanh to (element) duge chu-a trong rn/?t (node) XML. Vi d1,l:

<data name="some-name">

Neu ban nhln rn/?t lugt h~t ~p tin, ban se thily hai tai nguyen dug, dinh trong t~p tin van ban va gia tr] cua n6. Day lit dang .resx cua tai nguyei Visual Studio duy tri khi ban tao ll\ip tai nguyen trong aug dung cua minh.

D~ dung \.4p tin tai nguyen trong chuang trinh mau, ban cAn chuy~ sang dang da duge bien dich, Ban eo tM tao ra no tU tl\ip tin van ban hay tI\i XML bltng each dung mQt trong cac dong l~nh sau:

Resgen first resource . txt firstresource. resources

.8 h it

26: 27: 2B: 29: 30: 31: 32: 33:

Hay:

CHUONG 3·4: XAy dung U'ng dung Windows Forms

31l~

Resgen firstresource. resx firstresource. resources

4.2. MQt chuong trinh miu dtra trim tili nguyen

D~ thi'i t~p tin tai nguyen trongvi du 3.4·2, ban co tM tao mQt U'ng dung "Hello World" don gian nhu vi du 3.4·3. Chircng trinh nay dua tren t~p tin firstresource.resources da diroc tao ra trllcrc day d~ cung cap van ban cho nhan (label) va thanh tieu de cua crra s8:

Vi du 3.4·3 hellores.cs: 8u dung' chu6i t.a i nguyen don gh\n

1: namespace Sams 2: {

3: using System;

4: using System. Drawing;

5: using System. Collections;

6: using System.ComponentModel;

7: using System.Globalization;

B: using System.Windows . Forms;

9: using System.Data;

10: using System. Resources; 11:

12: class hellores: Form

13: {

14:

15: public hellores ()

16: {

17: ResourceManager rm=new

ResourceManager("firstresource", this.GetType().Assembly);

18: 19: 20: 21: 22: 23: 24: 25:

tc IA

16

In

this.Size == new Size(40Q, 100); this.Text=rm.GetString("WindowText")i

Labell = new Label ();

I. Location = new Point (3,5) i 1. Size = new Size (394,90) ; 1.Font = new

Font("Tahoma",36F,FontStyle.Bold); 1.Text=rm.GetString("LabelText"); this.Controls.Add(l);

}

static void Main() {

Application.Run (new hellores () ) ;

[1312 PuAN III : Windows Forms

34: }

35: }

36:

37:}

Dean ma trong vi du 3.4-3 la met ang dung "cong dan toan cau" tot. N6 khong nhung bllt kY· chu6i nao rna ve tilt ca van han tit tai nguyen duqc cung cap. Dong thl1 17 eho ta thllym9t bQ quan Iy tai nguyen dB. duqc tao ra 'nhu the nao, Dong 20 va 26 chi ra each rna met chudi U'ng voi m.;.t ten dLll;1e tai len tU tai nguyen cua bi) g6i assembly duqe dira vao cac thanh to cua Windows Form's nhu the nao,

D~ dich tap tin nay va chay no, ban se can go vao dong l~nh sau tU dau nhac l~nh:

Csc lout:hellores.exe /t:winexe /res:firstresource.resourceshellores.cs

LLIu y rang tham 56 Ires: cua dong lenh dung dii' nhung dang da dich roi cua tai nguyen da duqe tao ra trttuc d6.

Chay chuang trinh se cho ta ket qua nhu hinh 3.4-1.

H'inh 3.4-1 Chuang trinh. dang chq..y

4.3. 'I'ao l~p va su d~ng goi ke't bc;lp

Vi du toan c&u tren chua sit dung bQ tai nguyen thay the. Trong vi du tiep sau, ta se them van vi~c dung g6i tai nguyen chua tij.p hop tai nguyen lien quan Mn ngon ngl1 tie-ng Phap,

Ghi chu: G6i kit hqp la ml)t file thu vifn DLL (Dynamic Link Library), ' chua mii chuang trtnh. hotj..c dil lieu, duoc dung ben. mot goi chinh cua chuang trinh:

MOt g6i ket hop, trong truong hop nay, la nlQt DLL chi chua du lieu, Cac g6i ke't hop danh eho viec dia phuong hoa thuong la ciia rieng mlii dng dung, Chung c6 thll dliqc luu trong nhirng thu muc con nao d6 ella thu muc chua chuong trinh chmh. 'I'rong trunng' hop nay, ban se can tao ra rn(\t thu muc goi Ia "fr" M bQ

quan Iy tai nguyen e6 th&' tim thay n6. .

Dil.u tien, tao ra mot tal nguyen van ban dung cung ten nhung c6 cac chuci gia tIi khac, NM rAng, d day chi e6 van ban eua nhan (label) diroc thay d5i. Di~u nay se dllQ'e giai thich ngan gon,

#Version Francaise.

CHUONG 3-4: KAy dung ling dung Windows Forms

313~

LabelText '" Bonjour Ie monde!!!

G9i U!.p tin nay la firstresource.fr.txt. Sau khi hoan tift tij.p tin, ta c6 tM tao ra mot g6i kat hop bang each goi dong l(jnh sau:

Resgen f irstresource. f r , txt firstresource. fr. resource Al lout: fr/hellores2 .Resources. DLL Ic: fr lembed: firstresource.fr.resources

Chuang trlnh ling dung duoc dung cr dong thtr 2 101 B(i lien k8't G6i (AL - Assembly Linker). AL c6 th~ diroc dung M tao ra g6i cho tift ca cac dang, nhirng iJ day chung ta ehl quan tam den kha nang dong goi tai niuyen cua no. Luu y fling tham so lout: di).t goi hay file ,DLL VaG thu muc can "fr",

BAy gic ta eo thEi' dich ra chuang trlnh helloresz.exe. No hoan toan tunng tv nhu nguyen ban ngoai tru co tuy chon dong lenh eho phep ta chon n~n van hoa bAng each go vao dinh danh cua no. Vi du 3.4·4 chi 1'0 dieu nay,

Vi du 3.4-4 hellores2.cs: D~a phu'dng hoa vi du Hello World

1: namespace Sams 2: { 3 : 4: 5: 6: 7: 8: 9':

10 : 11: 12: 13: 14: 15: 16: 17 : 18: 19:

20: 21: 22:

using System;

using System_Drawing;

using System.Collections; using System. ComponentModel; using System. Globalization; using System. Windows. Forms; using System. Data;

using System. Resources; using System. Threading;

class hellores: Form

{

private Labell;

private ResourceManager rm;

public hellores (string culture) (

Thread.CurrentThread.CurrentUICulture '" new Culturelnfo(culture);

23: 24:

rm",new ResourceManager (" firstresource", this.GetType().Assembly);

25: 26: 27 :

this. Size = new Size (400,100) ; this.Text=:rm.GetString("WindowText");

I!J 314
28:
29:
30:
31:
32:
33:
34:
35:
36:
37 :
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49: }
50:
51 : } pRAN III: Windows Forms

1 = new Label () i

1. Location = new Point (3, 5) ; 1. Size = new Size (394,90) ; l.Font = new

Font{"Tahoma",36F,FontStyle.Bold); 1.Text=rm.GetString("LabelText"); l.Anchor = (AnchorStyles . Top I AnchorStyles. Left 1

AnchorStyles . Bottom I AnchorStyles.Right);

this.Controls.Add{l);

}

static void Main (string [] args) {

string culture ="" ; if (args. Length == 1) culture", args [0] i

Application. Run (new hellores (culture»;

}

Co mi)t vai thay d6i nho trong vi d1,l 3.4-4. Dong 22 thiet lap giao dien vil.n, hoa hi~n hanh dua tren cac gia tri dliqc nhap W dong l~nh. Cac thuoc tinh ella nhan diroc sua d5i tran dong 34-37 do d6 kich co cua nhan se duoc thay dbi cung veri form. Trong vi du nay, ban se can thay d5i kich thirdc form M thay duoe toan hi) ni)i dung cua nhan, Bi~u nay Iii. mi)t di8m cua viec qu6e t{{ hoa rna ban phai lam quen: kich co vat ly cua tai nguyen e6 th~ khac nhau giua cae n~n van hoa. Ban cling co th~ luu lai thong tin v~ kfch co va vi trf cua t.ai nguyen d' trong g6i cac tai nguyen. Visual Studio se lam ta"t ca. nhtrng di~u do c ho ban, va chung ta se thil'yl ngay sau day. M~t khac, viec dung Uti nguyen chu6i cung se timng tV.

Dng dung co th~ duqc bien dich dua VaG l~nh sau:

csc /out:hellores2.exe /t:winexec /res:firstresQurce.resourceshellores2.cs

Bay gii'l ta co th€ chay chuang trinh veri chon lua van hoa "fr" nhu sau:

hellores2 fr

Trong truong' hop nay, ban se thay ding ..rog dung dua ra man hrnh chuai tAi nguyen tie'ng Phap nhu hinh 3.4-2.

CHUONG 3-4: Xay dung Ung dung Windows Forms

, 315\!J

(pMN'.'W!I,.iilmU,(!t;j,j.I,.!.b! •. i.ll;.I!dg~ ):Jonjo9rle.<mOh'de .. !1Ii

. ~",.".

Hinh 3.4-2 Lien kit vm van hod ngon nga Phap

£)0 Iii ly do M chi chinh sua mot tai nguyen trong g6i ke't hc;rp. No minh hoa rang b{l quan Iy tai nguyen dung tili nguyen van ban va cac tai nguyen khac phil hop vai dia phuong va van hoa neu co th~. Con khOng, n6 se .tra lai dung cac thong tin mac dinh, Chuoi "WindowText" khilng co trong g6i ket hop. Bdi vay, mac dinh da diroc dung.

5. DUNG VISUAL STUDIO.NET HE Qu6c TE HOA.

Visual Studio. NET se quan Iy tai nguyen cho ban va giup ban tao cac form va thanh phan (components) duoc dia phuong hoa. Hinh 3.4-3 minh hoa thuoc tinh Localizable dLiqc thiet l~p cho mi)t form. Thie't lap thuoc tinh nay thanh True se lam cho moi trirong thie't ke' hill Iai cac thong tin d.n thie't trong cac t~p tin tai nguyen cho ban.

Hinh 3.4·3 Thiet l{jp cdc thOng s6 dia ph.uong h6a

~316

Pa.AN III : Windows Forms

Plnrorig tlurc (method) InitializeComponent cua Form! se chua cac rna khdi tao met bi? quan ly tai nguyen va tai bdt ky mot tai nguyen nao can khi irng dung duqe chuy~n giira cac dia phuong tit tai nguyen.

Nhu ban da th.1y trong vi du Ct hinh 3.4-2, viee dich chudi van ban lam cho chieu daivat ly cua chudi rQng ra, bci vij.y ta se cAn It1U thong tin v~ vi tri va kich co trong tal nguyen. Phuong thire InitializeComponent cua Forml ducc minh hoa iJ vi du 3.4-5.

Vi du 3.4-5 Form1.cs: Phmrng thuc InitializeComponent

1: private void InitializeComponent () 2: { 3 : 4:

5:

System. Resources. ResourceManager resources = newSystem.Resources.ResourceManager{ typeof(Form1}};

this. AutoScaleBaseSize '" new System.Drawing.Size(5,13); this_ClientSize", «System.Drawing.Size) ( resources.GetObject(": this_ClientSize"»); this. Text", resources. GetString (": this. Text .. );

6:

7 : 8: }

Ban co tM thay ding moi trunng soan thao IDE da tao ra bi? quan ly tai nguyen mdi i'J dong 3, va tai van ban cung kich thuac tai nguyen i'J dong 6 va 7.

Khi mi}t form tri'J thanh co kha nang dia phuong hoa, tilt ea cac thanh phan (component) ban di).t tran form do se cung dU<;1e luu gia tri van ban, thong tin kich co va vi tri vao mot tij.p tin tai nguyen. Vi du 3.4·4 minh hca phunng thirc InitializeComponent sau khi dU<;1c g~n them m{lt nhan van Form!.

Vi du 3.4·4 Forml.cs: Phu"dng t.hrrc InitializeComponent sau khi giin them mQt nhlin

1: private void InitializeComponent () 2: { 3 : 4 :

5 : 6 :

System. Resources .;ResourceManager resources '" newSystem.Resources.ResourceManager( typeof{Form1»;

this .label1 = new System. Windows . Forms . Label () ; this.label1.Location =

«System.Drawing.Point) (resources.GetObject{"label1.Location"»); this • label!. Size =

«System.Drawing.Size) (resources.GetObject("label1.Size"»);

this .label1 ~ Tablndex = ( (int) (resources.GetObject("label1.TabIndex"»);

this .label1. Text = .

8 : 9 :

10:

12:

· CHUONG 3·4: Xay dung lrng dung Windows Forms

3171!!J

resources.GetString("labe11.Text");

13: this .AutoScaleBaseSize = new

System.Drawing.Size(S,13);

14: this .ClientSize=

«system.Drawing.Size)(

resources.GetObject{": this.ClientSize"»)i

16: this.Controls.AddRange(new

System.Windows.Forms.Control[] {

17: this. Text", resources. GetString (" : this. Text ") ;

18:

Bay girr, thanh phan nhan cua form da: hill vi tri, kieh ce. va van ban vao tai nguyen.

6. TAl NGUYEN HINH ANH

V~y la chung ta da: lam vi~e vdi cac tai nguyen van ban, thi'i nhung, cung nhu Win32, cac U'ng dung .NET cho phep htu hinh anh nhu: bitmap, bi~u tuqng, hlnh nen, ". vao trong ta i nguyen. Sau d6, chung ta bien dich cac tai nguyen nay & dang .resource. Tuy nhien, neu ban tao ehung bang Visual Studio hoac bang tay, no dl1qc hru 0 dang XML .resx, DI nhien, viec chinh sua t<tp tin hinh anh nhu la van bin trong XML thi kh6ng phai la vi~c vui ve gL SI,i lua chon nen la di).t hlnh anh trong cac tai nguyen thong qua cac cong cu soan than anh nhu cua VS.NET, cung cap boi Microsoft.

M{lt thanh phan component, vi du, se c6 hmh va nen. Ban co thg di),t thanh phan component len form va chinh saa anh n~n eua thanh phan de dang. Trinh soan thao se cho phep ban Iua chon mOt hinh anh rna sau nay se duqc tl,1 d{lng di).t trong tai nguyen cho ban, Hinh 3.4·4 seminh hoa van d~ nay.

Hinh 3.4-4 EHjt mgt dnh. nen tren form

1J318

PHAN III : Windows Forms

7. sit Dl,TNG DANH SACH HiNH ANH

Ra't nhieu thanh phftn component cft.n hinh dnh cho giao dien cua minh.

Cac lOp ListView va TreeView co th~ dung hlnh anh dil nang cAp di~n mao cua no. Danh sach htnh anh la mi}t t~p hop cua cac anh bitmap duqc giiJ trong mi}t tap tin don. Nhung hmh anh nay co thil c6 mi}t n~n trong su6t (transparent background) d6i v6i mi}t mau nao do. Khi d6, chi e6 m(\t phAn ehinh cua hlnh anh dugc nhin thay.

Chung ta se cung xem doan rna minh hoa cho phdn nay. Sa dung Visual Studio, ban tao mQt lfng dung C# va dJ1,t ten la imagelistdemo. Lan luot lam theo tung bu6e eho Mn cu6i chuong M hoan ta"t cong viec nay.

D~ tao mot danh sach htnh anh vdi Visual Studio, ban nen dung chuot keo (drag) mot thanh phan ImageList tiC h9p cong cu (toolbox) len form. Bay gid hiiy tao ra mot it hinh anh, Nen dung Ms Paint, chi dn nhd hill hlnh anh trong mot thu rnuc chung nao do. Hrnh 3.4-5 hi~n thi mi}t bi€u tuqng 16x16 pixel dang duqc chinh sua trong Ms Paint.

Luu y: D€ chuan bi cho vi du nay, chung toi dil chudn bi b6n bi1\u tuong nho, W icon l.bmp den icon4.bmp

Hinh 3.4-5 Chlnh. srla mgt hinh dnh.

Nen cua bi€u tugng duc;tc to bdi mau Mng (magenta). Mau nay se khOng hien thi bfft cu dau tren anh thuc, do d6 n6 an toan M lam khoa trong suot (transparent key). Dil them nhung hlnh anh nay vao trong d6i tugng ImageList, ban c6 thil chon t.;ip hqp Images trong bang thuQc tinh cua doi tuqng va click vao

CHudNG 3-4: Xay dung ung dung Windows Forms

319~

nut Browse. Mot hnp thoai se hien ra nhu hmh 3.4-6. Ban co th~ dung no M them vao nhung hinh anh rna ban can, Lu'U y ding, phai nho giiI eho t1it ea hinh anh trong cung rn(it danh sach hinh anh e6 cung kich thudc, vi du nhu 16x16.

1SISc 1-38 \} E'"r~ ~C-3!R ":l-"I:I!IJt:(, -1~;

Hinh 3.4-6 Them dnh uQ:o danh sach. hinh. dnh

Ban c6 the th1iy rli.ng nhiIng t1im hinh tren danh sach hmh anh ducc danh 86 tit 1 dgn 3, va thuoe tinh (properties) cua chung co th~ du9'c thay ben canh.

Bay gio, M dung nhirng hinh anh trong danh sach hmh anh, tlf thanh e6ng C1,I, keo (drag) dbi tU9'ng ListView vao form. Chi trong choc lat, chung ta se d~ dang co dl1gc ListView d~ trinh bay nhiIng hinh anh nho nay. Chon d5i tl19'ng listViewl va xern cac thuec tinh cua n6. Thuoc tinh SrnallIrnageList bay gia co tM dl1gc dung vdi irnageListl vita diroc tao ra.

Hay nhin doan rna chuang trlnh cua InistializeComponent (trong vi du 3.4-5) d~ xern nhung viec tren da tao d(ing nhu the' nao de'n cac doan rna chuang trlnh,

Vi du 3.4-5 Forml.cs: InitializeComponent

1: private void InitializeComponent () 2: {

3: this. components = new System.ComponentModel.Container(};

~320

PRAN III : Windows Forms

,,: System. Resources. ResourceManager resources =

5: new System. Resources. ResourceManager (

typeof(Form1»i

this .listView1 ;:: new System.Windows.Forms.ListView()i

7: this. imageList1 = new System.windows.Forms.lmageList(this.component)i 8:this.SuspendLayout();

9: II

10: II listView1

11: II

12; this .listView1. Location = new

System. Drawing. point (8, 8); 13: this.listView1.Name = "listview1";

14: this .listView1. Size = new

System.Drawing.Size{272,200);

15: this .listView1. SmalllmageList = this. imageList1 i 16: this.listView1.TabIndex= 0;

17: II

18: II imageList1

19: II

20: this. imageList1 . ColorDepth = system.Windows.Forms.ColorDepth.Depth8Bit;

21 : this. imageLi st 1. lmageSize = new System.Drawing.Size{16,16);

22: this.imageList1.ImageStream «System.Windows.Forms.lmageListStreamer) (resource.GetObject("imageList1.ImageStream"»); 23: this. imageList1. TransparentColor = System.Drawing.Color.M~genta;

24: II

25: II Form 1

26: II

27: this .AutoScaleBaseSize = new System.Drawing.Size(5,13); 28: this .ClientSize = new System.Drawing.Size(292,273); 29: this.Controls.AddRange(new

System.Windows.Forms.Control[] (

30: t~i •. listVie~l});

31: .this.Name:: "Form1";

32: this. Text = "Form1";

33: this.ResumeLayout(false);

34: }

CHUONG 3-4: Xay dung irng dung Windows Forms

3211!1

Dong 4 va 5 tao ra ResourceManager cho form. Dong 12-16 tao ra ListView va thiet lij.p thong so' SmallImageList M dung thanh phdn imageListl. Dong 20-24 khrii tao mqt danh sach hlnh anh bang 'each l{(y tU bO dinh dong (streamer) danh sach hmh anh, thiet ll%p mau trong suot va kich eo cho hinh anh,

De dung nhirng tai nguyen trong ListView, chon hang thuOc tinh cua d6i tugng ListView, chon tij.p thuQc ttnh Items, click van dau ba cham (. .. ). MOt hop thoai sehii;"\n len nhuhinh 3.4-7 cho phep ban them va chinh saa cac muc trong danh sach.

Luu y: chunng trl.nh cua ban ~ong co thE! them. cac muc van thanh phdn mot each nang dong. Visual Studio cung clip mot each dE! lam viec do.

Hinh 3.4-7 Su dung tai nguy~n hinh. anh trong d6i tUqng Listv'ieuiltem

Mlii muc duqc them van trong cay se co mOt so ky tv va hinh anh M hil!n thi. ListView cOng cung cAp cac sv kii;"\n (event) tuong tv nhu minh hoa trong chuong 3.2 "Thanh phan Giao dien Nguoi dung" .khi ban chon, chinh sua, ... xli If nhiing sv kien nay cho phep ban tac dOng qua lai v~i cac rnuc trong danh sach.

Nao, chung ta hay xem qua vi du 3.4-6 duoiday:

Vi du 3.4-6 Forml.cs: InitializeComponent

1: private void InitializeComponent ()

2: { .

3: this.components = new

System.ComponentModel.Container(); 4 : System. ae sour-ce . ResotirceManager resources = new System. Resource . ResourceManager( typeof(Forml»;

5:

~322

'"

PHAN III : Windows Forms

6: System.Windows.Forms.Listviewltem

7: listViewltem1 = new

System.windows.Forms.ListViewltem

, "Folder",O);

B: System.Windows.For.mS.Listviewltem listViewltem2 =

9: new System. Windows. Forms. ListViewltem (

"Open Folder", 1) ;

10: System.Windows.Forms.ListViewltem

listViewltem3 =

11: new System.Windows.Forms.ListViewltem

("Book",2);

12: System. Windows. Forms . ListViewltem

listViewltem4",

13: new System. Windows. Forms. ListViewltem

. ("Wrench",3);

14: this. listView1 = new

System.windows.Forms.ListView();

15: this. imageList1 = new

System.Windows.Forms. lmageList( this.component);

16: this.SuspendLayout();

17: /I

1B: II imageList1

19: /I

20: this. imageList1.ColorDepth =

System.Windows.Forms.ColorDepth.Depth8Bit;

21: this. imageList1. lmageSize = new

System. Drawing. Size (16, 16};

22: this. imageList1. lmageStream

«System.Windows.Forms.lmageListStreamer)

23: (resource.GetObject(

"imageList1.ImageStream"»);

24: this. imageListl. TransparentColor =

System. Drawing.Color.Magenta;

25: II

26: II listView1

27: I fc

28: listViewltem1. UseltemStyleForSubltems = false;

29: listViewltem2. UseltemBtyleForSubltems = false;

30: listViewltem3. UseltemStyleForSubltems = false;

31: listViewltem4 . UseltemStyleForSubltems = false;

32: this.listView1. Items.AddRange (new

System. Windows ~ Forms. ListViewltem [] {

33: listVlewltem1,

34: listViewltem2,

35: listViewltem3,

CHudNG 3·4: X8.y dung ling dung Windows Forms

323iIJ

36: listviewltem4});

37: this .listViewl. Location = new

System.Drawing.Point (8. 8);

38: this.IistViewl.Name = "listViewl";

39: this. listViewl . Size = new

System.Drawing.Size(272.200);

40: this .Iistviewl. SmalllmageList = this. imageList1;

41: this .listViewl. Tablndex = 0;

42: this. listViewl . View =

43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53 : } System.Windows.Forms.View.Smalllcon;

II

I I Form 1 II

this .AutoScaleBaseSize = new System.Drawing.Size(5,13); this .CIientSize = new System.Drawing.Size(292,273); this.Controls.AddRange(new

System.Windows.Forms.Control[] { this.IistViewl});

this. Name = "Form1";

this .Text '" "Forml"; this.ResumeLayout(false);

Cac dong 6-13 tao ra Mi tuong' ListViewItem, thiet I~p nhan va hmh anh trong ImageList cho cac rnuc. Dong 32-36 them cac muc vao ListView.

8. PHUONG CACH I4P TRINH TRUY XUAT DEN cAc TAl NGUYEN

Ngoai viec tao tai nguyen thong qua Visual Studio hoac cac eong cu phat triln khac, ban con co thl tao, quan Iy, va sll dung tai nguyen thong qua rna chuong trmh. M';'t vi du v~ ta i nguyen kilu nay la luu m!}t vai da li~u ca nhan cho (tng dung cua ban (vi du, kich co cira s6' va vi trt) M tai len Idn nua khi chuang trmh chay lai.

BQc va ghi Uti nguyen dugc thirc hien nho vao cac lap ResourceReader va ResourceWriter. Cac doi tuong nay cho phep ta lam viec vdi tai nguyen luu trong eac lu6ng (stream) hay trong cac t~p tin.

Trong vi du dudi day, chung ta se chuan bi mot ling dung Windows Forms dan gian M hilfi thi hai qua bong; mQt do va mgt vang tren M mat cua form. Ban e6 th(l' nhat mot qua b6ng bAng ehugt va di chuyen n6. Khi chuang trrnh d6ng lai, n6 ghi cac thOng tin hien hanh tren form vao file tI1i nguyen gQi la baIUoeations.resourees. Tai nguyen nay lUll lai vi tri tren man hmh ciia hai qua b6ng, nhrr the Mn sau khi duqe tai I~n, tffig d\mg ve n6 Iai a nai ma trlf6c day ban da tMy.

~324

pHAN III : Windows Forms

Them V3.0 d6, ling dung nay cQng minh hoa mot vai each xl! ly chuot, dan gian cung nhu vi~c slt dung ImageList M ve hinh anh tren M m.\l.t form.

Vi dlJ. 3.4·7 Resourcerw.cs: (fng d~ng doc/ghi ta i nguyen

1: using System;

2: using System.Drawing;

3: using System. Collections;

4: using System. ComponentModel; 5: using System'. Windows. Forms; 6: using System. Data;

7: using System. Resources;

8: using System.Globalization; 9:

10:

11:

12: namespace resourcerw 13: {

14: III <summary>

15: III Summary description for DataForm.

16: III </summary>

17: public class Formi : System.Windows.Forms.Form

18: {

19 : private System. Windows. Forms. ImageList

imageList1;

20: private System.ComponentModel. IContainer

components;

21: private System.Drawing.Point[]

BallAlocations; 22:

23: private bool _mousedown;

24: private int _grabbed;

25:

26: public Form1 ()

27: {

28: II

29: II Required for Windows Form Designer support

30: 1/

31: InitializeComponent();

32:

33: II

34 : II TO DO : Add any cons t ructor code aft er

I I InitializeComponent call

35: l/

36:

37: this. BallLocations = new

System.Drawing.Point{2];

38:

CHUdNG 3·4: Xay dung ling dung Windows Forms

325~

39: }

40:

41: / I / <summary>

42: / I I Clean up any reources being used.

43: I I / </summary>

44: protected overide void Dispose (bool disposing)

45: {

46 :if (disposing)

47: {

48: if (components != null)

49: {

50: components.Dispose();

51: }

52 :

53: base.Dispose(disposing);

54:

55:

56: #region Web Form Designer generated code

57: I I I <summary>

58: / / I Required method for Designer support do not Illmodify

59: / I I the contents of this method with the code

II/editor.

60: / I I </summary>

61: private void InitializeComponent ()

62: {

63: this . components = new

System.ComponentModel.Container();

64: System. Resource. ResourceManager resources =

65: new System. Resource. ResourceManager (

typeof(Forml»;

66: this. imageListl =

67: new System. Windows-. Forms. lmageList (

this.component);

68: //

69: / I imageListl

70: //

71: this.imageListl.ColorDepth =

72: System.Wlndows.Forms.ColorDepth.Depth8Bit;

73: this. imageListl. ImageSize = new

System.Drawing.Size(64,64);

14: this. imageList 1. I.mageSt.ream =

75: (System.Windows.Forms.ImageListStreamer)

76: (resource.GetObject(

"imageListl.ImageStream"»);

77: this. imageListl. TransparentColor =

System.Drawing.Color.Magenta;

78: 1/

1M1326

PlIAN III : Windows Forms

79: 80: 81:

82:

83:

84: 85: 86: 87 :

88: 89:

90: 91: 92: 93:

94: 95:

96: 97:

98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117:

1/ Form 1 II

this .AutoScaleBaseSize = new System.Drawing.Size(5,13); this. BackColor =

System. Drawing. Color.Greeni this .ClientSize = new

System. Drawing. Size (376, 301); this.Name = "Form1";

this .Text = "Resource read-write"; this . MOuseDown += new

System.Windows.Forms.MouseEventHandler( this.Form1~MouseDown)i

this .C1osing += new System.ComponentModel.CancelEventHandler( this.Form1_Closing);

this. Load += newSystem.EventHandler(this.Form1~Load} t.his . MouseUp += new System.Windows.Forms.MouseEventHandler( this.Form1_MouseUp);

this. Paint += new System.Windows.Forms.PaintEventHandler( this.Form1_Paint);

this • MouseMove += new System.windows.Forms.MouseEventHandler( this.Form1_MouseMove};

} #endregion

III <summary>

III The main entry point for the application. III < I summary>

[STAThread]

static void Main()

(

Appication.Run(new Form1(»;

}

pri vate void Form1_MouseMove (obj ect sender, System.Windows.Forms.MouseEventAgrse)

{

if (_mousedown && (_grabbed != -1» {

if (e.X>31&&e.Y>31&& e.X«this.Size.width-32» &&

327l!J

CHUdNG 3·4: Xliy dung ung dung Windows Forms

118: 119: 120: 121: 122: 123 : 124 : 125: 126: 127: 128: 129 : 130: 131: 132: 133: 134: 135 : 136: 137: 138: 139: 140: 141: 142:

143: 144 : 145 : 146 : 147 : 148: 149: 150: 151: 152: 153: 154:

e.Y«this.Size.Height-32)

BallLocations[_grabbed].X=e.Xi BallLocations[_grabbed] .Y=e.Yi

this.Invalidate();

}

}

}

pri vate void Form1_MouseUp (obj ect sender, System.Windows.Forms.MouseEventAgrs e)

{

_mousedown = false;

}

pri vate void Form1_MouseDown (obj ect sender, System.Windows.Forms.MouseEventAgrse)

_mousedown =.true; int index = 0; _grabbed = -1

foreach (Point p in this .BallLocations) {

if (Math.Abs (e.x-p.X) <32&& Math.Abs { e.Y-p.Y)<32

_grabbed = index; index ++;

}

}

private void Form1_Paint (object sender, System. Windows. Forms. PaintEventAgrse)

{

int index = 0;

f oreach (Point p in thi s . BallLocat ions) {

this.imageList1.Draw(e.Graphics, p.X-32, p.Y-32, 64, 64, index++);

155: }

156: }

157 :

158: private void Form1_Load(object sender,

System. EventAgrs e)

159: {

160:

161: ResourceSet rs;

162:

.I!J 328
163:
164:
165:
166:
167 :
168:
169:
170:
171:
172:
173:
174:
175:
176:
177 :
178 :
,179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192: }
193: r

PHAN Ill: Windows Forms

try {

rs = new ResourceSet("ball_locations.resources"); BallLocations[O] = (Point)

rs . GetObject ("RedBall", false) i BallLocations [1] = (Point)

rs . GetObject ("YellowBall", false); rs.Close();

}

catch (System. Exception) {

BallLocations [OJ '" new Point (100, 100) i BallLocations[l] =newPoint(100, 100);

}

}

private void Form1~Closing{object sender, System.ComponentModel.CancelEventAgrse)

{

/1 Luu. v# tri qua b6ng vao file tai nguyen

/ I ta chi cdn ghi loi toan bQ cae doi tuong iii dii ResourceWri,ter rw= new ResourceWriter {

"ball_locations.resources"}; rw.AddResource{ "RedBall", this.BallLocations[O]); rw.AddResource("YellowBall", this.BallLocations[l]); rw.Generate();

rw. Close () ;

}

Dong 61-99 eho' thay phuong thee InitializeComponent can cho Visual Studio.Dong 63-65 rno mot tai nguyerr Hlnh anh bang d6i tirong IrnageList, va dong 66-77 khrri tao ImageList b~ng each tai vao luang dcr Iiiju anh (image stream) va thi€t lap cac thong so ve kich co va mau trong su6t. Dong 86-97 them cac xiily chuot va ve anh.

Wi v6'i cac h9 xii ly sl,! kien (event handler), hai su kien quan trong nhat Iii nap va d6ng form. Dong 158-175 la bQ xli Iy sl,! kien tlii form. N6 se mer tai nguyen va la'y ra vi trt ella cac qua b6ng. Neu n6 tha't bai vi M"tcu If do gt, mQt bQ xii ly ngoai Ii) (exception handler) se don gian cho rang t~p tin khtlng ton tai va khoi

CHlJONG 3·4: Xay dung img dung Windows Forms

32911}

tao hai qua bong iJ vi tri mac nhien cua no. Dong 179-188 dL!Q"e goi khi form da san sang de dong lai. d day, rna chiarng trinh se tao ra rnQt ti!.p tin tai nguyen va luu tat ca vi tri ella cac qua b6ng VaG do. L.4n ke' tiep chuang trinh chay, tap tin dB. t6n tai, va bq xii ly tai form se tim duoc vi tri da dL!qe luu.

Bq xii ly MouseUp (dong 128-132) dan gian khci tao lai gia tr] cua co M biift ding khong e6 viec keo bong dBn vi tri khac, B¢ xii ly MouseDown (dong 134- 146) quyet dinh xem qua bong nao trong 2 qua, neu co, dang i'J vi tri ella ehuQi, va danh dau co chon no.

BQ xli ly MouseMove kiii'm tra xem co qua bong nao dUQ"e chon va kiem tra xern chuot dang i'J trong vung man hmh xii ly kh6ng M ngan khOng eho ng\Joi dung di chuyeri bong ra ngoai, Neu tat ca d~u dung, no se thay dbi vi tri hien thoi cua qua bong. Phuong thtrc nay eo tM tim thay tU dong 112 den 126.

euoi cung, d dong 148:156, b6 xii ly Paint se ve qua b6ng tren M mat cua

form.

9. DQC vA vrtT T~P TIN XML RESX

Cac t?P tin tai nguyen, nhu chung toi da nhac ngay tU d.4u chrrong, c6 nhieu loai: t~p tin .resources va t~p tin .resx, Tap tin resx la tap tin XML tho va chua dliqe dich, ducc dung nhu dang dan gidn cua tai nguyen. d vi du trL!6"e, chung ta da n6i v~ cac lap ResoureeReader va ResourceWriter. Chung ta cung co cac lap RexsResourceReader va RexsResourceWriter dl1qc dung dt; xu ly dang tai nguyen XML.

Trong vi du cuoi cua chuong nay, chung ta se tao ra mqt ((ng dung dan gian eho phep ban tili cac ti!.p tin hinh anh, van ban, bieu nrong va chuyen dili chung sang thanh t~p tin tai nguyen ki~u .REXS (Xem vi du 3.4-8). 81/ phirc tap cua nhiem vu nay va sir dan gian cua chuong trmh se minh hoa met so sue manh ti~m tang cua kien true Windows Form.

Vi du 3.4-8 ResxUtilForm.cs: Til$n Ich Ghi RESX

1: using System;

2:using System. Drawing; 3:using System.Collections;

4: using System _ ComponentModel; 5: using System. Windows. Forms; 6: using System_Data;

7: using System. 10;

B:

9: /* 10:

* Luu oj: mot 16i trim cdc phien. bdn truce cua .NET co tlli lam '" chuang trinh ggp mot xilly ngoai l~ hhi chlnh siia·

* cac tai nguyen. Trang tQP tin nay co 2 doan duac luac clui '" ooi muc dinh. clio IzO tra gidi quyet l8i do.

11: 12 : 13:

~ ~ r

= 330 PHAN III : Windows Forms I

14: * Niu do~n mii nay kh6ng ch~y duac, hay bo cdc d6u chu. thich cua I

15: * nh.iing' doan duoc danh. d6u BUGFIXER va dicti l~i i

16: ,..'*/ l

17: I

,

18:

19: 20: 21: 22: 23: 24:

namespace ResxUtil {

I I I < summary>

I I I Summary description for Formi. I I I < I summary>

public class ResxUtilForm :

System.Windows.Forms.Form

25:

26: private System. Windows. Forms. ListView

listView1;

27: private System. Windows. Forms. Button button1;

28: private System. Windows . Forms . B~tton button2;

29: private System. Windows. Forms. ImageList

imageList1;

30 : pr i va te SYS t em. Windows. Forms. Col umnBeader

. columnHeader2;

31: private System.Windows.Forms.ColumnHeader

columnHeader1;

32: private System.ComponentModel. IContainer

components;

33:

34: public ResxUtilForm()

35: {

36: II

37: I I Required for Windows Form Designer support

38: I I

39: InitializeComponent{);

40:

41: I I BUGFIXER uncommment the line below

42: I Ithis .listViewl. LabelEdit = false;

43: }

44:

45: I I I <summary>

46: I I I Clean up any reources being used.

47: I I I < I summary>

48: protected overide void Dispose (bool disposing)

49: {

50: if (disposing)

51: {

52: if (components 1= null)

53: {

54: components.Dispose{);

55: }

CHudNG 3·4: X3.y dung U'ng dung Windows Forms

331~

56: }

57: base.Dispose(disposing);

58: }

59:

60: #region Web Form Designer generated code

61: III c aummaz y»

62: III ReqUired method for Designer support do not Illmodify

63: III the contents of this method with the code

Illeditor.

64: III </summary>

65: private void InitiallzeComponent ()

66: (

67: this. components = new

System.ComponentModel.Container();

68: System. Resource. ResourceManager resources =

newSystem.Reaource.ResourceManager( typeof(ResxUtilForm»;

69: this .colurnnHeader2 = new

System.Windows.Forms.ColurnnHeader();

70: this. colurnnHeaderl = new

System.Windows.Forms.ColumnHeader();

71: this.imageListl '" new

System.Windows.Forms.lmageList( this.component);

72: this .1istViewl = new

System.Windows.Forms.ListView();

73: this .buttonl = new

System.Windows.Forms.Button();

74: this .button2 "" new

System.Windows.Forms.Button();

75: this.SuspendLayout();

76: II

77: II columnHeader2

78: II

79: this.columnHeader2.Text = "File Name";

80: this.columnHeader2.Width = 545;

81: II

82: II columnHeaderl

83: II

84: this.columnHeaderl.Text = "Resource Name";

85: this.columnHeader1.Width = 220;

86: II

87: II :imageListl

88: II

89: this. imageListl. ColorDepth =

System.Windows.Forms.ColorDepth.Depth8Bit;

90: this. imageListl. ImageSize = new

l!!j332

91:

pHAN III : Windows For

92:

93: 94: 95: 96:

97 : 9B:

99: 100: 101: 102:

103: 104:

105:

106: 107 :

lOB:

109: 110: 111: 112: 113:

114: 115:

116: 117: 11B:

119: 120:

System.Drawing.Size(16.16};

this. imageList1. ImageStream "" «System.Windows.Forms.lmageListStreamer) (resource.GetObject(

"imageList1. lmageStream",) ) ); this. imageList 1. TransparentColor = System. Drawing.Color.Magenta;

1/

II lis,tView1 1/

this. ~istView1.Anchor = «System.windows.Forms.AnchorStyles.Top System.Windows.Forms.AnchorStyles.Left)I System.Windows.Forms.AnchorStyles.Right);

this .listView1 . Columns. AddRange (new

System.Windows. Forms.ColumnHeader [] { this.columnHeaderl. this.columnHeader1}};

this .listView1 . FullRowSelect = true; this .listView1. Location = new

System. Drawing. Point (B. B); this.listView1.Name = "listView1"; this.listViewl.Size =- new System.Drawing.Size(792, 304); this.listView1.SmalllmageList = this.imageList1;

this. listView1. Tablndex = 0; this .listView1 . View =-

System. Windows,. Forms . View.Details; this .listView1. KeyDown += new System.Windows.Forms.KeyEventHandler

(this.listView1_KeyDown); this .listView1. LabelEdit = true; 1/

II buttonl 1/

this.button1.Location = new System.Drawing.Point (696, 32B); this. button1.Name = "button1";

this .button1. Size = new

System.Drawing.Size(104,32); this. button1. Tablndex .. 1;

this. button1. Text = "Save";

this. button1. Click += new

System. EventHandler ( this.buttonl_Click);

1/

/ / button2

CHUdNG 3·4: Xay dung tmg dung' Windows Forms

333~

121: . 122:

123 : 124 :

125: 126: 127 :

128: 129: 130 : 131: 132:

133 :

134 :

135: 136 : 137 : 138:

139: 140: 141: 142 :

,143 : 144:

US: 146: 147: 148 : 149: 150: 151: 152 : 153: 154: 155:

/I

this.button2 . Location = new System.Drawing.Point (8. 328); this .button2 . Name = "button2" i

this .button2. Size = new

System.Drawing.Size(8B.32); this .button2 • Tablndex = 1; this.button2.Text;;;; "Add •.. "; this.button2 .Click += new

System. EventHandler ( this.button2_Click);

II

II ResxtJtilForm /I

this.Allow.Drop = true;

this .AutoScaleBaseSize = new System.Drawing.Size{S.13); this .ClientSize = new system.Drawing.Size{B16.373); this.Controls.AddRange(new

System.windows.Forms.Control[] { this.buttonl,

this.button2,

this.listViewl});

this . FormBorderStyle ;;;; System.Windows.Forms.

FormBorderStyle.FixedOialogi this. Name :::"ResxUt ilForm" ;

this . Text = "Resx Utility"; this.ResumeLayout(false)i

} #endregion

II I -c summary>

III The main entry point for the application. II I < I summary>

[STAThread]

static void Main ()

{

APpication.Run(new ResxUtiIForm(»;

}

private void button2_Click (object sender.

System. EventAgrs e)

156: {

157: int icon = -1;

15B: OpenFileDialog dIg = new OpenFileDialog ( ) ;

~334

PHAN III : Windows Form

159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172 : 173: 174: 175 : 176: 177 : 178: 179: 180: 181: 182: 183: 184: 185: 186: 187:

188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204:

if (dIg. ShowDialog () == DialogResult. OK) {

string s = dIg. FileName;

string[] d = s.Split (new char[] {'. '}) i string resname = "Unidentified";

if (d. Lengt h < 2) return;

switch (d[d.Length-l] .ToLower(» {

case "bmp"; icon=O; break; case "txt":

icon=l; break; case "ico": icon=2; break;

}

/ / BUGFIXER

/ / code below.

/* Form f = new Form ( ) ; f.Size = new Size (350,110); f. Text = "Resource name";

f . FormBorderStyle =

FOrmBorderStyle.FixedDialog; Button ok = new Button ( ); ok.Dialog.Result = DialogResult.OK;

ok . Location = new Point (5,32) ;

ok . S i z e = new S i z e (75, 22);

ok.Text = "OK" j

f.Controls.Add(ok);

Button can new Button ( ) ; can.Dialog.Result = DialogResult.Cancel; can.Location = new Point(260,32) j can.Size=newSize (75,22);

can. Text = "Cancel"; f.Controls.Add(can);

TextBox tb = new Textbox ( ) ;

tb. Location:;: new Point (5, 5) ;

tb.Size = new Size (330, 25);

tb.Text:;: "Resource" +

«object) (this.listView1.Items.Count +1» .ToString();

CHl1dNG 3·4: Xay dung (ffig dung Windows Forms

335~

205: 206:

f.Controls.Add(tb);

if (f. ShowDialog () == DialogResul t • Cancel II tb.Text.Trim() == "")

207 : 208: 209: 210: 211: 212 : 213: 214:

return;

restname = tb.Text .Trim{); */

if (Lcons o) (

ListViewltem item = new

ListViewltem(resname, ico);

215: item.Subltem.Add(s);

216: this.listView1.Items.Add(item);

217: }

218: }

219: }

220:

221: private void button1_Click (object sender,

System. EventAgrs e) 222:

223: if (this.listView1.ItemB.Count > 0)

224: (

225 : II Kitm tra ten erla· tat cd resource

226: foreach(ListViewltem item in

this. listViewl. Items)

227 : 228: 229: 230:

{

if (item.Text == "Undefined") {

Mes sageBox. Show ( "All resources must have names" ) ;

231: 232: 233: 234: 235: 236: 237 : 238: 239 :

return;

}

II Ldy ten file resx

SaveFileDialog dIg = new SaveFileDialog () ; dIg.Title = "Save .resx file";

dlg.Filter = "XML resource files I .resx"; if (dlg.ShowDialog() ==

DialogResult.Cancel)

240: 241: 242: 243: 244:

return;

I I Too lap ghi Uti nguyen

System. Resources. ResXResourceWri ter rw = new System.Resources.

ResXResourceWriter (dlg.FileName);

245:

'Ii 336

PHAN III : Windows FOI

246: 247:

/ / Duy~t qua cac muc trong danh sach foreach (ListViewItemitem

in this. listView1. Items)

248: 249: 250: 251: 252: 253: 254: 255: 256: 257 : 258: 259: 260: 261: 262: 263: 264:

{

switch (item. ImageIndex) {

case 0: Ilbi tmap images goto case 2;

case 1: Iltext files

System. IO.StreamReader sr '" new System. IO. StreamReader (

item.SubItems[1].Text); string inputline;

do

{

input line", sr. ReadLine ( ) ; if (inputline ! ee null)

{

string[] splitline '"

inputline. Split (new char [1 { I", I } 2) ;

265: 266: 267 : 268:

if (splitline.Length "'''' 2) {

269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289:

rw.AddResource( tem.Text.TrimEnd(}.TrimStart() +"." + eplitline [0] .

TrimEnd().TrimStart(), splitline[l] );

}

}

}

while (inputline ! '" null) ; break;

case 2: II icons

System. Drawing. Image im '" System.Drawing.Image.FromFile( item.SubItems[1].Text); rw.AddResource(item.Text, im);

break; }

}

rw.Generate·() ; rw.Close(};

}

}

CHudNG 3"4: Xay dvng tmg dung Windows Forms

33711J

290: 291: 292: 293: 294: 295:

296: 297: 298: 299: 300:

301: }

302: 303: }

private void listViewl_KeyDown(object sender, System. Windows .. Forms. KeyEventAgrs e)

{

if (this.listViewl.SelectedIndices.Count == 0) ret\lrn;

if (e. KeyCode • Equals (Keys. Delete) ) this.listViewl.Items.RemoveAt( this.listViewl.SeletedIndices[O]);

}

Ghi chu: Ciui y ding kiiu ciia b6 tri (layout) a day vd a cdc danh sach. khdc ad duoc thay d6i d~ phil h'lP ooi dinh. d'7ng 80 c¢t.

Bay gic, chung ta nen di thoing vao phuong thrrc InitializeComponent va tim hifi'u xern chuyen gi dang di~n ra, chung ta 8e nAm duoc nhung difi'rn ehinh y€u ella chuang trinh.

Dong 79-80 tao ra mot tij.p cac tieu de cua ei)t (column header) Mdung cbo ListView khi a che do xern chi ti€t (gQi III Detail View). Chung ta dil. chon M hifi'n thj bifi'u tirong cua mqt muc tren ImageLisl cung vai tencua tai nguyen va ten cua tij.p tin chua tal nguyen.

Dong 89-92 thiet lij.p ImageList, dem Mn lu6ng di1 lieu hlnh anh (image stream), thiet lij.p kich co, rnau trong suat cho anh.

Dong 98-100 them t.ieu de cot (collumn header) van dieu khifi'n ListView.

Dong 93-100 thiet, lap cac thuoc tinh cua List.View cho phep sU' dung hra chon cac muc (nhO' vij.y ban c6 thfi' xoa mQt muc trong danh sach), thay diSi nhan, va cuai cung hi bQ dieu khifi'n sl,! kien Key Down (chi tra leti cho phim Delete).

Dong 110-128 Ia cac nut nhan (button). MQt nut dl1qc dung dfi' rna lai tai nguyen, con nut khac luu tai nguyen van tij.p tin RESX tra lai.

Dong 155-219 xU' Iy nut nhan Add. No cho phep ban duyet cac tij.p tin (dong 154 - 155) bitmap, van ban va bieu tuong. Sau khi ban tim dl1qc tAi nguyen can thiet, dong 168-179 quyet dinh chon dung bi~u tirong cho t~p tin d6. Cuoi cung, dong 212-217 sa dung bieu tinrng rna ban chon de' tao ra ListViewltem c6 mqt nhiin (thoat ddu la "Undefined") va cac muc phu (sub-item), cac muc nay se dung c¢t th(r hai cua di~u khifi'n danh sach (list control) dif chira ten tij.p tin.

Nut Save tren dong 221-184 sa kiern tra nhanh xem tilt ea cac tai nguyen Mu dii dl1qe dl).t ten hay chua (226-233) va lay ra ten tap tin cua t~p tin dich (dong 236-240). Dong 243-244 se tao ra mot d6i tuong ResxResourceWriter va gm n6 Mn vong 11j.p foreach M duyet tat ca cac muc va tao ra ta i nguyen.

~338

PHAN III: Windows Forms

Cau l~nh switch (dong 249) co 3 truong hop (case). Truong hop 0 va 2 diroc xli Iy tuong tv bi'li vi, theo cau true dinh dang cua XML, kh6ng co sV khac nhau giaa bitmap va icon. Trlfil'ng hop 1 (dong 254-276) d9C ti).p'tin van ban mot dong moi Ian va chia dong ay ra thanh cac ~p ten - gia tr i va 1u'U vao nhu Uti nguyen van tan. Ten duoc d{1t vdi tien to (prefix) la ten ban gAn cho ti).p tin van ban tren hop danh sach (listbox). Luu y r(lng chuang trmh minh hoa nay chi higu cac ti).p , tin van ban co cau true "<ten chuiii>=<gia tri chudie-". Cac tap tin khac se sinh ra liii khi xU" IY. Sau khi chay xong, dong 286-287 se ghi va dong ti).p tin RESX.

Cuoi cung, dong 292-300 xfr ly khi phim Delete dU<;lc nhan va xoa mot muc (item) ra khoi danh sach,

Luu y ve liii: Dong 42 va kh6i rna til dong 184-208 xfr Iy nhirng van dli tiem tang co the' gap tren cac phien ban trudc cua kien true .NET. Neu ban chinh sira ten ella tai nguyen chuang trinh c6 thg sup diS hay b6 dau ghi chu (comment) ella hai doan rna chuang trtnh vdi nhtrng dong duqe danh dIlu "BUGFlXER" va dich lai chuang trinh. N6 se hoat di?ng, va ban se thay hoi khac mot chut, nhirng no se khiing bi liii.

Cung hay hru y each doan rna bugfix t1.\O ra mot hi?p thoai khi chuang trinh dang chay (on-the-fly) cho ban.

10. KET CHUONG

Trong chuang nay, ban da hoc each lam the nao dEl tao mot Uti nguyen van ban bll.ng tay, lam the nao M quoc te hoa mi?t U"ng dung dung g6i ket hop, biet lam the nao dg xay dung mot ling dung c6 hinh anh va cac tai nguyen khac, nang di?ng sang tao va dung cac tap tin tEti nguyen trong chuang trmh cua ban, Trong chuang t6i, chung ta se cung tim hi~u vii cac clurc nang dIS hOI;! manh me ella GDI+_

Chridng 3.5

,." ~ ?

GDI+: GlAO DI~N DO HQA eUA .NET

Cae van d~ ehinh se dude d~ cap den

.,/ Cdc nguyen Iy C(J ban ctia GDI+ .,/ D6i tuang Graphics

.,/ Cdc h~ toa d¢ d6 hoa

.,/ Ve duong th.dng va cdc h inh. dan. gidn . .,/ Su dung but ve va CQ ve chuyen mau

.,/ But ve va C9 ve c6 chdt hell

.,/ Lam Iran cdc ddu milt cua du:i'1n.g tllling v' Duang cong va cae duans; do th.i

.,/ D6'i tuong GraphicsPath

.,/ Ky tluuit edt b/ing Path va vung v' Cdc phep bien. d6'i

.,/ St: ph6i mall vai giri tri alpha

.,/ Sv ph6i mall oai giri tri alpha clio anli

.,/ Nhrlng thao tac hluic trong kh6ng gian mall

Trong chuang nay, chung ta se xem xet giao dii)n thi€t hi d6 hoa (GDI - Graphic Device Independence). Windows Forms sll' dung n6 d~ tao d6 hoa, Chu y ten is GDI+ khong Is GDI.NET Do la vi GDI+ khiing Ill. t~p API duy nhat cua kien true Framework .NET. No cung co thll duqc sli dung bai mii khong duqc quan ly, Tuy nhien voi muc dich cua chuang nay, chung ta se sli dung no rieng biet vat Windows Forms.

1. cAc NGUYEN LY CO BAN CVA GDI+

Giong nhu GDI, GDI+ la che dQ de> hoa kieu tUc thi. Di~u nay c6 nghia la khi chung ta g&i nhung menh Ji)nh den giao dien do hoa, nhung tac d(lng d6 ngay lap We duqc tM'y tren b~ mat thict bi hay trong b(l nho hilln thi, Met killu eho§' dQ do hoa khac la duy tri, kiiiu nay thl1i1ng duy tri tinh k€ thira cua cac dot Wang de" chung biet each tl/ ve.

GDI+ dung co ve (brush) va but ve (pen) M ve len M mat cua do hoa, nhu chinh GDI da lam. Mac du kh6ng nhu GDI, ban e6 th€ sli dung bat elc doi tl1qng d6

1M1340

pHAN III: Windows Forms 11 hoa nao tren bilt ky b~ mat nao vao bilt err luc nao, GDI yeu cau ban tao mot d6i ttlgng dB hoa, chon no M S11 dung trong ngu canh thiilt bi (Device Context hay DC), dung deli tugng nay, bO chon deli tuqng nay ra kh6i DC, va sau d6 huy d6i tinrng nay. Neu ban kh6ng lam theo thu tv d6, ban c6 thil bi nhirng 16 h6ng trong tAi nguyen cua M th6ng ma cuo] cung la se lam cho tat ca bo nhd duqc cap phat trong M thong cua ban milt di ya M th6ng can phai khoi dOng lai, Noi chung 811 dung GDI+ th) tien Iqi hon vi ban kh6ng phai 10 li\ng v~ vi~e chon hay huy bO viec chon tai nguyen thea thu tv can phai c6.

Nhu ban mong doi, s1,l phat trii\n cua GDI+ phan anh nhi~u s1,I thay d6i gan day theo til'lm nang cua card dB hoa, Mot so' tinh nang mrii duqc them vao bao g6m ph6i mau voi gia tri alpha (Alpha Blending) hay sl,t' trong su6t d6i vrri anh (image transparency), lam tron (antialiasing), nhung phep bien d6i (transformation) nhu phep quay (rotation) va phep co dan (scaling), them vao nhieu phirong phap mdi trong viec hieu chinh mau va thao tac vung,

2. DOl Tu'QNG GRAPHICS

Vai .NET, d6i tuqng Graphics Iii nrri phat sinh cua tat cii cac kha nang d6 hoa cua GDI+. £)il'lu nay tuang tu voi Win32 DC va chung ta e6 th~ lay doi tuong nay mOt each tirong' minh tU bQ quan handle cua cira s6 hoac no 'duge truyen de'n ling dung W su kien OnPaint. Chang han M c6 dmrc dui tuong Graphics trong C++, chung ta se phai vie't dean rna sau:

HDC de; PAINTSTRUCT ps; Graphics *pGraphics;

Dc=BeginPaint(hWnd,&ps); PGraphics=new Graphics (dc) ;

1/ su dung Graphics .. EndPaint(hWnd,&ps);

V6'i nhung muc dich cua chucng nay, cluing ta se giii. sU' rang nhtrng thao tac cua GDI+ se xay ra trong pharn vi cua trng dung Windows Forms va chung ta c6 th~ lay doi nrong Graphics trong qua trinh chuyen giao (delegate) su kien. Vi du, chung ta co duoc doi tuong Graphics trong s~ kien PaintEventArgs nhu sau: public void OnPaint (object sender,PaintEventArgs e)

{

II su dung e.Graphics.Someidethods.J i'J day

}

3. cAc H:¢ TQA DO D6 HQA

C6 khong it hon ba M th5ng tea dt) duqe sa dung M ve cac deli tuqhg len tren man hlnh. £)6 la M thong toa dQ the' gidi thue (World Coordinate system), day Ia khai niern ly thuyet ve kh6ng gian trong hi) thong db hoa, hi) th6ng toa d¢ tren giay (Page Coordinate system) la khai niem ly thuyet khac vil chieu vat 1y

CHUdNG 3·5: GDI+: Giao dien do hoa cua .NET

341~

mang tinh chat gia thuyet, va M th6ng toa d¢ thiet, bi (Device Coordinate system) gan li~n· vai thui)e tinh v~t ly cua man hmh hay may in rna tren do do hQ8 duqc tao ra. B@: hi€n thj bat elf dil!u gi tren man hmh, d(1li~u do hoa rna ban ghi vao d6i tLf<;1ng do hoa trong GDI+ phai duqe bien diSi m¢t vai lil.n. Ly do vI! di~u nay la cho phep ban xi'r iy do hoa di)e l~p vdi thifi't bi (device-independent). Chling han, nfi'u ban di\it mi)t hlnh hay mi)t van ban trong tea d¢ the' giai thuc, chile co Ie ban mu6g rl\ng Mt qua do hoa duqe hi€n thi nhuIa tren mi,it to giAy A4 cl:luiin. Hinh anh pMi trong nhu the' tren A4 ca tren mail hinh 11ln tren may in e6 de? phan gia.i nao do. Cho nen toa dQ thfi' gioi thirc diroc anh xa vao toa dQ tren giay (Page Coordinate) rna n6 tuong ltng vdi ktch thuoc 8 V:!" x 11". Khi h~ thong hi€n thi trang A4, man hmh nen eo dl) phan giai 72 di~rn cho mbi inch (DPI) - may in A c6 dl) phan giiii 300 DPI va may in B co de) phan gi8i 400 DPI. Kfi' do khong gian trang giay can duQ'c anh xa vao khong gian thie't bi, mi)t each chinh xac, man hinh anh XI;! 8.5 inch tren trang giay thanh 612 digm anh (pixel) tren man hlnh - 2550 di~m anh tren may in A va 10200 di~m anh tren may in B.

GDI+ cho phep ban cai dat each rna cac doi tU<;1ng duoc bien diSi tit tM gi6i thirc vao trang giay si'r dung nhtrng thuoc tinh PageUnit, Pageseale. Ban khong co quyen dieu khiiln phep bie'n diSi trsn khong gian thiet bi. Tat ca nhii'ng dil!u do xay ra trong cac drivers thiet bi cua chung, Tuy nhien ban co th~ doc DPI cua t.hiet bi bling cac thuQc tinh DpiX va DpiY.

Chung ta se khao sat cac phep bien deli toa dQ mot each chi tie't trong chuang nay.

4. vE DU<'JNG TH.ANG vA cAe HINH DON GIAN

Chung t~ sli dung but VB (pen) d~ ve cac ducng thAng hay duong vien cua mot hinh, va CQ ve (brush) d~ to mot vung nam ben trong cua mot, hinh, Vi du 3.5- 1 dudi day se cho thay nhung thao tac nay.

Chri j: Vi! vifC qudn lj cac d6i tuang dd hila trong GDl+. Nhu ban. da biet trong .NET, b(i thugom rae GC (Garbage Collection) th.uc hien uifC quiiri lj b(i nho cho bgn. Vi! mQt ky thuat, bgn khOng cdn. phdi thu hdi edc d6i tuqng Mng each. hlly cluing boi vi cu6i cung thi. b(i don dep rae (garbage collector) Sf! lam dieu nay.

Bieu nay cung dung eho cac thao tac tao but ve (pen) va CQ ve (brush). Tuy nhien viec gai cac hinh ve voi tan suat cao co thil tao ra hang ngan but ve (pen) va CQ ve (brush) trong suot moi chu ky ve, va trongnhung tinh hu6ng nhu v~y bQ don dep rae GC khong tM thu h6i tilt ca cac dOi tUQ'ng mot each rihanh chong, va ket qua la mot s6 hl<;1ng tan cac thanh phan da chet con if lai tren heap' trong mQt khoang thai gian dang k@'.

B€ giam thi~u s6 lirong cong viec cua bi) don dep rae GC, bat Clf khi nao c6 tM ban nen goi phuong thuc Disposer) mQt each tLtCtng minh d6i voi cac but ve (pen), cac co ve (brushes), va nhirng d6i tuqng db hoa mang tinh chat uxrng tlj. Bieu nay se thu h6i b(\ nM cua d6i tugng va thOng bao Mn bQ don dep rae GC khOng c.4n danh thai gian cho ehung.

(8J 342

PaAN III : Windows Forms

Trong mot so' vi du, ban se thay doi urong duoc khai bao inline, chang han:

DrawReetangle (new Pen (Color. Ree), ..• Dieu nay se kh6ng gay ra 16 Mng trong b(1 nhd cua doi tuong pen, don gian chi la trt hoan viec thu h6i d6i tinmg khi n6 khong con trong pham vi ni1a. Trong mot sO' vi du khac, ban se thay ro rang vii;lc sit dung phuorig thrrc nay, chAng han: myPen.DisposeO. £)~ b(1 nho dat hi~!U sua't cao nhat, chung ta nen sit dung phucng thirc nay,

Vi d~ 3.5·1 DrawLines.cs: Vii Duong th<'ing va to Hlnh Chii' Nh~t

~: using System;

2: using System. Drawing;

3: uSing System. Windows. Forms; 4:

5: class drawlines 6: { 7: 8: 9 : ~O:

System.Windows.Forms.Form

Timer t;

bool BackgroundDirty;

publ ic void TickEventHandler (obj ect sender, EventArgs e)

~~:

12: Invalidate();

13: }

14 :

15: public void OnPaint (object sender,

PaintEventArgs e)

~6: {

L 7 : ! ! do"i tuong graphics hi~n h.anh. cho

L 8 : ! ! window nay a trong PaintEuentArgs

~9:

20: Random r=new Random ( ) ;

2~:

22 : Color c = Color. FrornArgb ( r. Next (255) ,

r.Next(255), r.Next(255»;

23: Penp=newPen(c, (float)r.NextDouble()*lO);

24: e.Graphics.DrawLine(p,

r.Next(this.ClientSize.Width),

25: r.Next(this.C1ientSize.Height),

26: r.Next(this.ClientSize.Width),

27: r.Next(this.ClientSize.Height)

) ;

28: p.Dispose();

29:

30:

31: protected override

void OnPaintBaekground (PaintEventArgs e)

CHUONG 3-5: GDI+: Giao di~n do hoa cua ,NET

343~

32: {

33 : II Khi cluing ta thay deli kich thuac

II hay choy tan

34: / / ddu tien. Chung ta si! vi! miui nen, nguoc lai

35 : / I no se lam md: cdc duong thdng dii ve

36: if (BackgroundDirty)

37: {

38: Backgl;"oundDirty = false;

39: II Chung ta c6 the 99i

Ilbase.OnPaintBackground{e);

40: Iinhung di~u d6kh6ng dua ra

Ilhinh crnr nh~t dang to

41: e.Graphics.FillRectangle(

newSolidBrush(this.BackColor),

42: this.ClientRectangle);

43: }

44:

45: }

46:

47: public void OnSized(object sender, EventArgs e)

48: {

49: BackgroundDirty=true;

50: Invalidate{);

51: }

52:

53: public drawlines ()

54: {

55: t=new Timer();

56: t.Interval=300;

57: t. Tick+=new System. EventHandler (

TickEventHandler);

58: t.Enabled=true;

59,: this .Paint+=new Paint EventHandler (OnPaint);

60: this. SizeChanged+=

new EventHandler (OnSized);

61: this . Text::o"Lines and lines and lines";

62: BackgroundDirty = true;

63: }

64:

65: static void Main()

66: {

67: Application. Run {new drawlines (});

68: }

69: };

Bien djch vi du 3.5-1 bling each sti dung dong I~nh sau: esc /c:winexe drawlines.cs

~344

pHAN III : Windows Forms

Dong 53-62 tao ra mot bi] dinh thai (timer) va them bi) xli Iy (handler) OnPaint vao danh sach cac sl,l' kien cua dOi tll<;lng Paint. No cung them met bi] xu If SI! kien cho SI,I' kien SizeChanged, M rna chung ta co thE! biet diroc khi nao mQt n~n (background) moi c!n phai ve 1!1.i.

Nhi1ng dong 10-13 IA mi)t b(i xli If SI,I' ki~n Tick dan giiin chi thuc hi:i)n thao tac dj.p nhat ni;ii dung etia sil. Cac dong 15-29 180 bo;; xli ly ve dung t!1.0 ra but ve (pen) va ve mo;;t dlftmg thdng gii1a hai diii'm ngAu nhien tren man hinh,

Nhi1ng dong 31-43 ve rnau n~n cho chiing tao Ly do co nhtrng dong nay la M cho nhirng dllt'Jng th~ng dii diroc vekhong' bj mft"t di bai viec cl).p nhat man hinh. Neu ban mu6u tha'y di~u'nay xay ra thl ban ell x6a doan rna nay. N6 mo tii each mi;it CQ ve (brush) to htnh chtr nhat.

5. SU D1)NG BUT vE (PEN) vA CQ vE· (BRUSH) CHUYEN MAuGAM MAu

But ve (pen) va CQ ve (brush) da tien xa trong mi;it thai gian ngan. GD!;. cho phep ban ve cac dllcmg thang va to cac vung bang chuyen dili cua mau silcgam mau (gradient) hay mOt day nhieu mau. Sira d6i doan rna trong vi du 3.5-1 se cho phep chung ta sa dung cac but vii chuyen mau (gradient pens) thay cho nhung dirong li~n hay sli dung nhi1ng tinh chft"t til chuy~n mau (gradient fills) thay cho nhirng mau to dong nhit (solid colors).

Til mau nen cua cua s6 kha dil,chung ta chi can xac dinh CII to chuyen mau, B6i tirong LinearGradientBrush la mot thanh vien trong khOng gian ten (namespace) System.Drawing.Drawing2D. Vi du 3.5-2 la hai dean rna dircc chon ra tU vi du 3.5-1 ma ban can thay dSi. No chi chua hai phuong thuc OnPaint va OnPaintBackground da dircc sua ddi. Tuy nhien, ban cung nho them khai bao sau vao rna ngudn cua ban

1:

2 : publ ic void OnPaint (obj ect sender.

PaintEventArgs e) 3: {

4: / / d6i tU'Qng graphics hi~n nanb cho

5: / / window nay 0 trong PaintEventArgs

6 :

7: Random r"'new Random ( ) ;

8:

9: Color cA '" Color_FromArgb( r.Next (255),

r.Next(255),

r.Next(255»i

Using System. Drawing. Drawing2D;

Vi du 3.5·2 DrawLines2.es: Ma dlide sua ,16i tit vi du 3.5-1

CHUdNG 3·5: GDI+: Giao dien do hoa cua .NET

345~

10: Color cB = Color. FromArgb ( r. Next (255) ,

r.Next(255), r.Next(255»;

11: Point pA = new Point (

r.Next(thie.C1ientSize.Width),

12:

r.Next(thie.ClientS ize.Height» ;

13: Point pBB= new Point (

r.Next(thie.ClientSize.Width),

14:

r.Next(thie.ClientS ize.Height)};

15: LinearGradientBrush brush =

new LinearGradientBrush(pA,pB,CA,CB);

16: Pen r=

new pen(brush, (float) r .N'extDoub1e () *10);

17: e.Graphics.DrawLine(p,pA,pB);

18: p.Dis~osa();

19: }

20:

21: protected override

void OnPaintBackground (PaintEventArgs e)

22: {

23: II Khi chung ta thay doi kich thuoc hay ch9-Y Ian

24: II dau tien. Chung ta se ve mau n~n, nguQc 19-i

25: II n6 se lam mat c ao duong thang da ve

26: if (BackgroundDirty) .

27: {

28: BackgroundDirty = false;

29: LinearGradientBrush gb =

30: new LinearGradientBrush(

this.ClientRectangle,

31: Color. Navy,

32: Color. Aquamarine,

33: 90) ;

34: e.Graphics;FillRectangle(gb,

this.ClientRectangle);

35: gb.Dispose();

36:

37:

38: }

Hinh 3.5 -1 cho thay ung d\1ng dangch~y trong hao Cruang ch6i 19i

1Ml346

pRAN III : Windows Forms

Hinh 3.5-1 Chuang trinli DrawLines da duoc stia

Image i = Image. FromFile ("stone. bmp") ; TextureBrush b = new TextureBrush (i) i Penp=newPen(p, 10); e.Graphics.DrawLine(p,O,O,100,100); p.Dispose();

Chit y: Ban n en ch a j dlng d6i tur;ng pel/ tlf ban than n6 su dung mgt cQ vi (brush) di! to mtiu n¢i tai ctia chin}, n6. Ban cting c6 tId sil dung CQ ve theo m(it mau pattern di! ve mot duang tluing, »u« nay thr'jt su rat manh,

6. nUT vE vA CQ vE co CHAT LI:¢U

Nhu ban da thay trong vi du truoc, mot but ve co th€ duoc dua cho mot C9 ve de vii ducng thang. C9 vi! coth~ Ill. net li~n (solid), chuyen mall (gradient), cMt Iieu (texture), hay mftu to. Mqt co vii co chat lieu (textured brush) eo thil duoc su dung d€ vi) nhung duang thang rna nhirng duong thang nay duge vii bang anh bitmap. Dil thirc hien dieu nay, ban c6 thll tao mot d6i tuong bang each nap mOt bitmap W tap tin hay W mot tai nguyen, ke do ban truyen d6i tuong nay vao d51 tirong pen, va cu6i cung ve cac duang thang bang but vi! nay. Doan rna sau trmh bay tien trinh nay:

CHUONG 3·5: GDI+: Giao dien dEl hoa ella .NET

347~

7. LAM TRON CAe DAU MUT CUA DuCfNG THANG

Nhirng doan thang duoc vii trong hinh 3.5-1 e6 nhung dau mut vu6ng vitn va cO Iii kh6ng dep dOi voi viee vii cac da giac, Htnh 3.5-2 cho tha'y met ngoi sao dan gian duqc vii bang nhli'ng dean thaug co dQ rong vrii cac dAu mut vuong vAn.

Hinh 3.5-2 Nhiing drill mut lorn. cham trong da giac

Nhu ban c6 th~ thay, cac dinh dau mut thang him eho di~m n6i cua cac dliCrng thang lorn chirm. f),§ him gon , chung ta c6 th~ chi ra dinh diiu mut duoc lam tron vrii cac dirong thang. Lap but vii (Pen) co hai thuoe tinh: StartCap va EndCap. Hai thuoc tinh nay co th~ diroc gan M vii cac dilu mut cua duong thang thea mot ki~u cu th~. Trong vi du 3.5-3, chung ta co chuang trinh vii ng6i sao va chuang trinh nay cho phep chung ta bat hoac titt cac dinh d:lu rnut bAng mot nut (button) ii' tren form.

Vi du 3.5-3 DrawStar.cs: Vi du v~ d~u muf cua dtidng thiing

1: using System;

2: using System_ Drawing;

3: using System. Drawing. Drawing2D; 4: using System_ Windows _ Forms;

5 ;

6; class drawstar : System. Windows. Forms. Form 7: {

8 : Bu t t on bu t toni; 9 :

10 : bool EndCap;

11 r

~348

PHAN III : Windows Fotnll

12:

public void OnPaint (object sender, PaintEventArgs e)

13: 14: 15: 16: 17: 18: 19 : 20: 21: 22:

23: 24:

25: 26: 27:

28:

29: 30:

31: 32:

33:

34: 35: 36: 37: 38:

39: 40: 41: 42: 43:

Pen pen=new Pen{Color. Black, (float) 20.0) ; if (EndCap)

{

pen.StartCap=LineCap.Round; pen. EndCap=LineCap. Round;

}

float r36 = (float) (36. 0 * 3.1415926 I 180) ; Point Center=new Point ( this.ClientRectangle.Width/2, this.ClientRectangle.Height/2); float Pointsize =( float) 0.8 *Math.Min(Center.X,Center.Y); for(int i=O; i<10; i++)

{

float d1= (i&1) ==1 ? Pointsize I 2 : Pointsize; float d2 = (i&;L) ==0 ? Point size I 2 : Pointsize;

e.Graphics.DrawLine(pen,

new Point ( (int) Cd1 *Math. Cos (r36*i) ) +Center.X,

(int) (d1*Math.Sin(r36*i»+Center.Y), new Point ( (int)(d2*Math.Cos(r36*(i+1») +Center.X,

(int) (d2*Math.Sin(r36*(I+l» +Center.Y»);

} pen.Dispose();

}

public void OnSizeChanged(objec·t sender, EvantArgs e)

Invalidate();

}

public void OnClickedButtonl (obj ect sender, EventArgs e)

44:

45 : EndCap = ! EndCap;

46: Invalidate();

47: }

48:

CHtfdNG 3-5: GDI+: Giao dien d6 hoa cua .NET

349l!J

49:
50.:
51:
52:
!;i3 :.>
54:
55:
56:
57 :
58:
59:
60 :
61:
62:
63:
64 :
65:
66:
67 :
68: } ; public draws tar ( ) {

this. Paint+:;new PaintEventHandler (OnPaint); this.Text="Star";

th;l,.s •. Si~eChange4+:;

new EventHandler (OnSizeChanged) ;

button1 = new Button{);

button1. Location=new Point (5 t 5) ; buttonl. Size=new Size (50 t 20) ; buttonl.Text = "Caps";

button!. Click+=' .

newEventHandler{OnClickedButton1); this.Controls.Add(buttonl);

}

static void Main{) {

Application. Run(new drawstar () );

Bien dich chuong trlnh nay voi dong lenh sau: esc It :winexe drawstart .cs

Khi ban chay chucng trrnh, ban se thay mot nut nhan il' goc tren ben trai eua etta 85, bam len nut nay d~ thay d6i dlnh dau rnut thanh tron. Co t<i't cit 11 kiii'u dinh dirong thang khac nhau, kif ca kieu tuy thich.

Ban da co thil th<i'y ding GDI+ Iii mqt S\f cai tie'n tuyet vai han ca GD! dang tin cay xira kia, vii chung ta chi rndi that su xern xet dliGng thAng vii hinh chu nhat, Bay giG chung ta hay xem xilt dliGng cong, dliGng d& thi

8. DlJC1NG CONG vA cAc DuC1NG D6 THJ

Vao hie co GD! da co dli<'rng cong Bezier va cac dunng db thi, GDI+ md rong nhtrng kha nang nay bang each cung cap mot tlj.p chtrc nang phong phu cho cac dtlCfng ccng vii doi tutmg dliC1ng d6 thi.

Ve duong' cong tu mot mang (array) cac djgm Iii hinh thirc dan gian nhat, 8uCfng cong diroc ve nhu the' se di qua moi diem cua mango DQ cang cua dliong cong d6i vai diem cu tM nao d6 dliqc kiem soat boi vi trf cua nhi1ng diem 0' hai ben canh n6 trong mango Dliong cong Bezier dung chuan c6 hai diem lien ke't vci mili nut (node) - mOt diem cho vi tri vii mqt di~m M kiem soat, BQ ding cua dl1Cfng cong diroc xac dinh bdi m6i quan M cua diern kil\m soat vci huang cua dliCfng thdng.

~350

PHAN III : Windows Forms

Vi du 3.5-4 minh hoa each dung phuong thuc Graphics.DrawCurve Mn~ each tao mQt ti,ip cac vi tri trong pham vi cua hinh chu nhat tren man hlnh. M¢t dudng cong co sd duqc ve doc 'theo mang cac di1)m nay, va ban co th€ chon d(i can! ciia dudng cong bang m{lt thanh trirot (slider).

Vi du 3.5.4 DrawCurve.cs: SU dung hu'dng thuc DrnwCur-ve i

1: using System;

2 : us ing System. Drawing;

3: using System. Drawing. Drawing2D; 4: using System. Collections;

5: using System,ComponentModel; 6: using System. Windows. Forms; 7 : using System_ Data;

8 :

9: namespace Curves

10: { 11: 12: 13: 14: 15: 16:

17 : 18: 19: 20: 21:

/ / / < summary>

/ / / This simple object bounces points / / / around a rectangular area.

/ / / < / summary>

class Bouncer

{

int dirx; int diry; int X; int Y;

22: Size size;

23:

24: public Bouncer ()

25: {

26: dirx=diry=l;

27: }

28:

29: public void Move ()

30: {

31: X+=dirxi

32: Y+=diry;

33:

34: if (X<=O II X>=size .Width)

35: dirx*=-l;

36:

37: if (Y<=O I I Y>=size. Height)

38: diry*=-l;

39: }

40:

41:. public Point position

.~ %.\ 4., >-'*

CHudNG 3·5: GDI+: Giao dien d& hoa cuaNET

351 {MJ

42: {

43: get {return new Point (X, Y) ;}

44: set{X=value.X; Y=value.Y;}

45: }

46:

47: public Size Size

48: {

49: get { return size;}

50: set{size=value;}

51:

52: }

53:

54: / I I <summary>

55: I I I Sununary description for Form1.

56: III </sununary>

57: public class Curves: System. Windows. Forms. Form

58: {

59:

60: Timer bounce, paint;

61: TrackBar trk;

62:

63: Bouncer [] bouncers;

64:

65: void OnTickBounce (object sender, EventArgs e)

66: {

67: foreach(Bouncer b in bouncers)

68: b.Move(};

69: }

70:

71: void OnTickPaint (obj ect send~r, EventArgs e)

72: {

73: Invalidate{);

74: }

75:

76: public void OnPaint (object sender,

PaintEventArgs e) 77:

78: Pen p=new Pen(Color.Red, 10);

79: SolidBrush br=new SolidBrush(Color.Blue) i

80: Point [] points = new Point [bouncers. Length] ;

81: int i=O;

82 : 1/ din chuy~n bouncers t.harih m¢t mang cac di~m

83: foreach{Bouncer b in bouncers)

84: points[i++J=b.Positioni

85: liVe duong cong

86: e.Graphics.DrawCurve{p,points,Q,

points. Length-I,

~352

PHAN III : Windows Forms

87 : 88: 89:

90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100:

101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114:

115: 116: 117 : 118: 119: 120:

121: 122: 123: 124: 125: 126: 127: 128: 129:

(float)trk.Value);

I IBay gio va cac nut trong d\1bng cong. foreach(point pn in points) e.Graphics.FillEllipse(br,pn.X-5,

pn.Y-5,10,10); p.Dispose(); br.Dispose{); .

}

publ ie Curves ( ) {

this.Paint+~newPaintEventHandler(OnPaint); I I Be? d~nh thai de quan ly bouncing. bounce~new Timer ( ) ;

bounee.lnterval~5i

bounce.Tick+=

new EventHandler (OnTickBounee) ; / / B¢ d:j.nh thai de quan ly vi~c va +~i . paint=new Timer ( ) ;

paint. Interval=100j

paint. Tick+=new EventHandler (OnTickPaint) i II B9 t9-0 so ng§.u nhien cho nhung v:j. tri ban diiu Random r =new Random ( ) j

/ I Kich thuoc ban di1u cua Form this.Size=newSize(BOO,600);

IIk:h6i t~o mang chua cac diem bouncing bouncers == new Bouncer [6] ;

for{int i~0;i<6;i++)

{

bouncers [iJ =new Bouncer ( ) ; bouncers[i].Position=

new Point (r . Next (800), r . Next (600) ) ; bouncers [i) .Size=newSize(800,600)i

}

I I B~ t c ao b¢ d:j.nh thoi bounce.Enabled=true; paint.Enabled=truej

Ilt9-o thanh tru<;!t de diE§u khitlln I I d¢ cong cua duong

trk :::; new TraekBar ( ) ; trk:.Location:::;new Point (5, 25) j trk. Size",new Size (100,20) ; trk.Minimum=lj trk.Maximum;::10j

trk.Value~2; this.Controls.Add(trk)j

I Iva dan nhari cho nguoi su d\lng Label Ib=new Label ( ) i

CHUaNG 3-5: GDI+: Giao dien do hoa cua .NET

353~

130: 131: 132: ·133 : 134: 135: 136: 137 :

lb. Location=new Point (5,5) ; lb. Size",new Size (100,20) ; lb. Text"," Curve tens ion II ; this.Controls.Add(lb);

}

static void Main ( ) {

138: Application. Run (new Curves (»;

139: }

140: } 141: }

Bien djch vi du 3.5-4 vdi dong lenh sau: esc It :winexe drawcurve. cs

Cong viec nay duqe lam bdi hai bQ dinh thai (timer) va mot hQ "U" ly paint.

B9 dinh thai so 1 (dong 98 va 65-69) tao ra vi trf cua nhii'ng nut (node) tren duang cong trong pham vi man hrnh. BQ dinh thai so 2 (dong 102 va 71-74) cap nhat man hmh d!\ eho viec vi) khong xay ra qua thirong xuyen. BI) xU" ly (handler) paint (dong 76--90) tao ml)t mang cac di~m tit d6i tuong bounce; tuy nhien, Point la mot I6p bi "d6ng kin" nen ban khOng th€ k€ thua n6 duoc. Sau d6 dong 86 vi! ducng cong, dl) cang cua duang cong phu thuoc van vi tri cua di~u khi€n Trackbar. D€ minh hoa nhung di!\m d~c hiet & dau, dong 88 va 89 vi) chung b!ng mau xanh. Vi du nay cho thii'y mot each ro rang hieu chinh dl) cang cua duang duong cong dan gian.

Hl.nh 3.5-3 cho thay irng dung DrawCurves dang chay

Hinh 3.5·3 Vi? duang cong ooi d9 cang

Duang eong Bezier thl hoi kho. D6i vdi mlii doan thil.ng, ngoai hai di!\m xac dinh ddu va cuoi eua duang thAng, con co hai di€m ki€m soat khac d€ tang them

liJ 354

r

PRAN III : Windows Forms I

dQ cang va d(l eong cua duO'ng thang. Vi du 3.5-5 eho tha'y dirong cong Bezier dligc dung nhu the' nao,

Vi du 3.5·5 Beziercurves.cs: Sa dl,lng duung cong Bezier

1: using System;

2: using System. Drawing;

3: using System. Drawing. Drawing2D; 4: using System. Collections ;

5: using System.ComponentModel; 6: using System. Windows. Forms; 7 : using System. Data;

8:

9; namespace Curves 10; {

11: III <summary>

12: III This simple object bounces points 13: III around a rectangular area.

14: 11/ < I summary>

15: class Bouncer

16: {

17: int dirx;

18: int diry;.

19: public int X;

20: public int Y;

21:

22: Size size1

23:

24: public Bouncer ()

25: {

26: dirx=diry=1i

27: }

28:

29: public void Move ()

30: {

31: X+=dirx;

32: Y+=diry;

33:

34; if (X<",O I I X>"'size. Width)

35: dirx*=-1;

36:

37: if(Y<",OIIY>=size.Height)

38: diry*=-1;

39: }

40:

41: public Point Position

42: {

43: get {return new Point (X, Y) ; }

I

CHUdNG 3·5: GDI+: Giao dien d6 hoa cua .NET

355~

441 45: 46: 47: 48: 49: 50: 51:

set {X=value .X; Y=value. Y; }

}

public Size Size {

get { return size;} set {size '" value;}

}

52: } 53:

54: III <summary>

55: II I Summary description for Form1. 56: I I I < I summary>

57; public class BezierCurves

: System. Windows. Forms. Form 58: {

59:

60: Timer bounce, paint;

61: Bouncer [1 bouncers;

62:

63: void OnTickBounce (object sender, EventArgs e)

64: {

65: foreach{Bouncer b in bouncers)

66: b.Move();

67: }

68:

69: void OnTickPaint (object sender, EventArgs e)

70: {

71: Invalidate();

72: }

73:

74: publicvoidOnPaint(object sender,

PaintEventArgs e) 75:

76: Pen p=new Pen (Color. Red, 10) ;

77; p. StartCap=LineCap. DiamondAnchor;

78: p.EndCap=LineCap.Ar~owAnchor;

79: SolidBrush br=new SolidBrush(Color .Blue);

80 : / IVa duong cong

81: e.Graphics.DrawBezier(p,

new Point (550,300) ,

82: bouncers [OJ .Position,

83: bouncers [1] .Position,

84: newPoint(50,300»;

85: I Ib4y gio va cac nut tren duong cong.

86: foreach (Bouncer b in bouncers)

87: e.Graphics.FillEllipse(br,b.X-S,

b. Y-5·,10,10);

1Ml356

PHAN III : Windows Forms

88: 89 : 90: 91: 92:

93:

94: 95: 96: 97 : 98: 99: 100: 101: 102: 103:

104: 105: 106: 107 : 108:

109: 110: 111: 112: 113: 114: 115: 116: 117 :

118: 119: 120: 121: 122 : 123: 124: 125: 126: 127 : 128:

I Iva cho thily m6i quan h~ giua nut bouncing I Iva dil!im da.u mut cua duong cong bezier. p.::new Pen (Color. Black, 1) i p.DashStyle=DashStyle.DashDotDot; e.Graphics.DrawLine(p,

bouncers[O].Position, new point ( 550, 300) ) ; e.Graphics.DrawLine(p, bouncers [1] .Position, new Point (50,300) ) ; p.Dispose();

}

public BezierCurves ( ) {

this.Paint+.::newPaintEventHandler(OnPaint); I I A timer to manage the bouncing

bounc e enew Timer ( ) ;

bounce.Interval~5;

bounce.Tick+=

new EventHandler(OnTickBounce);

II B¢ d;i.nh thoi d~ quan ly vi/i!c ve La L paint=new Timer () ;

paint.Interval=100i paint.Tick+=newEventHandler(OnTickPaint); I I Be:> t ao s6 ng&u nhHm cho nhung v:j. tri

I I ban dAu

Random r=new Random ( ) ;

I Ikich thu:oc ban dilu eua form this.Size=new Size(800,600) i

Ilkhai t.ao m¢t mang chua c ao di~m bouncing. bouncers = new Bouncer [ 2] ;

for{int i=O; i<2; i++)

{

bouncers [i] =new Bouncer ( ) ; bouDcers[i).Position=

new Point. ( r , Next (800) , r .Next (600) ) ; bouncers[i] .Size=newSize(800,600)i

}

IIB~t be:> d;i.nh thoi bounce.Enabled=true; paint.Enabled=true;

}

static void Main ( ) {

Application.Run(new BezierCurves (»;

}

r III : Windows

--------"'NG 3·5: GDI+: Giao dien da hoa cua .NET

3571MJ

it bouncing

~: }

) : }

·bezier.

Dot;

PhAn chu ye'u cua irng dung nay thi that sl! tinrng tv val cai da duoc trlnh ng vi du 3.5·4. Nhi1ng di&m dang chu y la nhung dong 83-86 vi! dLil1ng cong va nhirng dong 92-96 trrnh bay cho ban each vi! nhirng duo-ng thAng net rh trong hinh 3.5·4 101 anh cua m(it man hinh cua (tng dung va n6 cho thay di€m kiern soat cua duong eong Bezier duqc slt dung nhu the nolo d€ tang' uang vii di) cang dbi vdi met nut C\I the.

(OnTickPaiIll ng vi tri

Ldler (OnPail ng

noe ) i ve l~i

Hinh 3.5·4 Duang cong Bezier dang hoat dQng

[(It mang nhirng dillm dIng c6 th& ducc Slt dung dll tao mot duo-ng cong i.em bouncin.j6 nhieu dean. Mang nay phai co mi)t bQ b6n di€m va duoc sdp xep nhu

oint[O] = Diem Mu cua doan thhg 1 ointl l ] = Dil\m kiern soat cho di€m ddu • Next ( 600 ) ) pint[2] '" Dillm kiern soat cho di&m eu6i

[800, 600) i ointl S] '" Diem cuci cua doan th<ing 1 va Iii di&m dllu cua doan tMng 2 oint] 4J = Di~'rn kiern scat cho diem dau ella doan thang 2

ho 4 diem rna d&u cong them 3 dillrn cho m6i doan thang theo sau.

: TDQNG GRAPHICSPATH

Ilrves () ) ; ic duong do thi do hoa trong GDI+ l!\ mQt each thich hqp de tij.p hop cac hoa lai, hoac toi thieu cling Iii cac dinmg' bien cua chung, vao mqt dan vi ;. Khi mot ducng d6 thi da dinrc tao, chUng ta c6 tM van dung no to mau,

~350

PHA.N III : Windows For

Vi du 3.5-4 rninh hoa each dung phuong thirc Graphics.DrawCurve bl each tao mot t~p cac vi trt trong pham vi cua hmh chu nhat tren man hinh. ~ dLl6'ng cong co sCi dLl<;le ve doc theo mang cac diem nay, va ban c6 thEi: chon dQ ci cua duong cong b{[ng met, thanh tntqt (slider).

Vi du 3.5-4 Ds-awCur-ve.cst Su d~ng phuong thlfc DrawCurve

1: using System:

2; using System. Drawing:

3: using System. Drawing. Drawing2D: 4: using System. Collections:

5: using System. ComponentModel; 6; us ing System. Windows. Forms; 7: using System_ Data;

8:

9: namespace Curves 10; {

11 : / / / < summary>

12: / / / This simple object bounces points

13: / / / around a rectangular area_

14; / / / </summary>

15; class Bouncer

16: {

17: int dirx;

18; int diry:

19: int X:

20; intY;

21:

22: Size size;

23:

24: public Bouncer ( )

25: {

26: dirx=diry=1;

27: }

28:

29: public void Move ()

30: {

31: X+=dirx:

32: Y+=dirYi

33:

34: if(x<=O I I X>=size.Width)

35: dirx*=-1;

36:

37: if (Y<=O II Y>=size.Height)

38: diry*=-li

39: }

40:

41 ~ public Point Position

)li.ng. M~t cang,

CHl10NG 3-5: GDI+: Giao dien db hoa cua .NET

351~

42 : 43: 44 :

get {return new Point (X, Y);} set {X=value. x; Y=value. Y;}

45: }

46:

47: public Size Size

48: {

49: get { return size; }

50: set{size=value;}

51: }

52: }

53:

54: / II <summary>

55: III Sununary description for Form1 .

. 56: I I I < I aummaz y»

57: public class Curves: System. Windows. Forms. Form

58: {

59 :

60: Timer bounce, paint;

61: TrackBar trk;

62 :

63: Bouncer [] bouncers;

64 :

65: voidOnTickBounce(object sender, EventArgs e)

66: {

67: foreach (Bouncer b in bouncers)

68: b.Move();

69: }

70:

71: voidOnTickPaint{object send~r, EventArgs e)

72: {

73: Invalidate();

74: }

75:

76: public void OnPaint (object sender,

PaintEventArgs e)

77: {

78: Pen p=new Pen (Color .Red, 10) ;

79: SolidBrush br=new SolidBrush (Color. Blue) ;

80: Point (] points = new Point [bouncers. Length] ;

81: int i=O;

82: II din chuyen bouncers thanh m¢t mng cac diem

83: foreach{Bouncer b in bouncers)

84: points [i++)=b.Position;

85: /IVe duong cong

86: e.Graphics.DrawCurve{p,points,0,

points.Length-1,

352

PHAN III : Windows For

87 : 88: 89:

90: 91: 92: 93: 94: 95: 96: 97 : 98: 99: 100:

101: 102: 103: 104: 105: 106: 107 : 108: 109: 110: 111: 112: 113: 114:

115: 116: 117: 118: 119: 120:

121: 122: 123: 124: 125: 126: 127: 128: 129:

(float)trk.Value);

IIBay gio VEl cac nut trong duong cong. foreach(Point pn inpoints) e.Graphics.FillEllipse(br,pn.X-5,

pn.Y-5,10,10)i p.Dispose();

br. Dispose (); .

}

public Curves () {

this. Paint+;::new PaintEventHandler{OnPaint); / / B9 d:j.nh thoi de quan ly bouncing. bounce=new Timer ( ) ;

bounce. Interval;::5;

bounce.Tick+;::

new EventHandler (OnTickBounce) ;

/ I B9 d:j.nh thoi de quan 1y vi$c ve l.~i. paint=new Timer ( );

paint.lnterval=100; paint.Tick+;::newEventHandler(OnTickPaint}; / / B9 t.ao s6 ngil.u nhiE!on cho nhung v:j. tri ban dll\l Random r=new Random ( ) ;

1/ Kich thUC1C ban dliu cua Form this. Size=new Size (800,600) ;

/ /kh6i t~omang chua ce c diem bouncing

bouncers =:: new Bouncer I 6] ; .

for(int i=::0;i<6;i++)

{

bouncers (i J =new Bouncer ( ) ; bouneers[iJ .Position=

new Point (r . Next (800) , r . Next (600) ) ; bouncers[i].Size=newSize(BOO,6DO)i

}

I / B~t e ac b9 d.:i,nh thoi bounce. Enabled=truei paint.Enabled=truej

/ /t<;l.O thanh trugt de dieu khien / / d9 cong cua duong

trk = new TrackBar ( ) ;

trk. Location=new Point (5,25) ; trk.Si'ze=new Size(100,20); trk.Minimum=l; trk.Maximum==10;

trk.Value=2; this.Controls.Add(trk);

/ Iva dim nhan cho nguoi su dv.ng Label lb=new Label () ;

15

130: 131: 132 : ~U3:

134: 135 : 136 : 137 : 138: 139 : 140: } 141: }

CHUdNG 3-5: GDI+: Giao dien dB hoa ella .NET

353~

lb. Location=new Point (5,5) i lb. Size=new Size (100,20) ; lb. Text="Curve tension"; this.Controls.Add(lb);

}

static void Main () {

Application.Run(new Curves (»;

}

Bien dich vi du 3,5-4 vdi dong l~nh sau: esc /t:winexe drawcurve.cs

Cong viec nay duqe lam bd"i hai bQ dinh thai (timer) va mQt bQ xli Iy paint.

B(\ dinh thai siS 1 (dong 98 va 65-69) tao ra vi tri ella nhO'ng nut (node) tr€.n dinrng' eong trong pharn vi man hmh. BQ dinh thai siS 2 (dong 102 va 71-74) cap nhat man hinh dEl cho viec ve khong xay ra qua thirong xuyen, BQ xli If (handler) paint (dong 76-90) tao m(it mang cac di~m tir diSi tirorig bounce; tuy nhian, Point la mQt lop bi "d6ng kin" nen ban khOng tM ke" thira n6 duoc. Sau d6 dong 86 vii dliang cong, dQ cang ella du'ang cong phu thuoc vao vi tri ella di~u khiii'n Trackbar. Dii' minh hoa nhO'ng diii'm dac biet Ct dau, dong 88 va 89 vii chung bang mau xanh. Vi du nay cho thily mot each ri'i rang hieu ehinh d(i cang ella du'Crng dliang eong dan gian.

Hinh 3.5-3 eho thay Ung dung DrawCurves dang chay

Hinh 3.5-3 Vi'! duong cong v6i d? edng

Duang cong Bezier thi hoi kh6. D6i vdi mM doan thling, ngoai hai diE!m xac djnh ddu va cu6i ella dtnrng thang, con c6 hai diE!m kiii'm soat khac M tang them

~354·

PHAN III : Windows Forms

dQ cang va dQ eong cua duong thAng. Vi du 3.5-5 eho thay dUong eong Bezier duqc dung nhu the nao,

Vi du 3.5-5 Beziercurves.cs: Sli' dung duong cong Bezier

1: using System;

2: using System. Drawing;

3: using System. Drawing. Drawing2D; 4: using System.Collections;

5: using System_ ComponentModel; 6: using System. windows. Forms; 7: using System.Data;

8 :

9: namespace Curves 10: {

11: / / / <summary>

12: / / / This simple object bounces pOints 13: / / / around a rectangular area.

14: / / / </summary>

15: class Bouncer

16: {

17: int dirx;

18: int diry;

19: public int X;

20: public int Y;

21 :

22: Size size;

23:

24: public Bouncer ()

25: {

26: dirx=diry=l;

27: }

28:

29: public void Move ()

30: {

31: X+=dirx;

32: Y+=diry;

33:

34: if (X<=O I I X>=size. Width)

35: dirx*=-l;

36 :

37: if (Y<=O I I Y>=size .Height)

38: diry*=-l;

39: }

40 :

41: public Point Position

42: {

43: get {return new Point (X, Y) ; }

dU'qc



CHUONG 3·5: GDl+: Giao di$n d6 hoa cua .NET

355~

441 45: 46: 47 : 48: 49:

. 50: 51:

set {X=value .X; Y=value. Y;}

}

public Size Size {

get { return size; } set {size = value;}

}

52: } 53:

54: / / / <summary>

55: / / / Summary description for Forml. 56: / / / </summary>

57: public class BezierCurves

: System. Windows. Forms. Form 58: {

59:

60: Timer bounce,paint;

61: Bouncer [] bouncers;

62 :

63: void OnTickBounce (object sender, EventArgs e)

64: {

65: foreach (Bouncer b in bouncers)

66: b.Move{);

67: }

68:

69: void OnTickPaint (object sender, EventArgs e)

70: {

71: Invalidate 0;

72: }

73:

74: public void OnPaint (object sender,

PaintEventArgs e)

75: {

76: Pen p=new Pen (Color. Red, 10) ;

77: p.StartCap=LineCap.DiamondAnchori

78: p.EndCap=LineCap.Ar~owAnchor;

79: SolidBrush br=new SolidBrush (Color. Blue);

80: / rv« duong cong

81: e.Graphics.DrawBezier(p,

new Point (550,300) ,

82: bouncers [0] .Position,

83: bouncers [1] .Position,

84: newPoint(50,300»;

85: / /b§.y gio ve cac nut tren duong cong.

86: foreach (Bouncer b in bouncers)

87: e.Graphics.FiIIEllipse(br,b.X-5,

b. Y-5·, 10,10) ;

~356

PHAN III : Windows Forms

88: 89: 90: 91: 92:

93:

94: 95: 96: 97 : 98: 99: 100: 101: 102: 103:

104: 105: 106: 107: 108:

109: 110: 111: 112: 113: 114 : 115: 116: 117 :

118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128:

Ilva cho thii:y moi quan h~ giua mit bouncing Ilva di~m dau mut, cua duong cong bezier. p=new Pen (Color. Black, 1) ; p.DashStyle=DashStyle.DashDotDot; e.Graphics.DrawLine(p,

bouncers [0] .position, new Point (550,300) ); e.Graphics.DrawLine(p, bouncers [1] .Position, new Point (50,300) ) ; p.Dispose();

}

public BezierCurves ( ) {

this.Paint+=newPaintEventHand1er{OnPaint)i II A timer to manage the bouncing

bounce",new Timer ( ) ;

bounce. Interva1",5;

bounce.Tick+=

new EventHand1er (OnTickBounce) i

II B9 d~nh thai de quan ly vi~c ve 190i paint=new Timer ( ) ;

paint.lnterval=100; paint.Tick+=newEventHandler(OnTickPaint)i II B9 t900 so ng;§.u nhHm cho nhung v~ tri

Ilban dau

Random r=new Random ( } ;

Ilkich thu6'c ban dau cua form this. Size=new Size (800,600) i

IIkh61 t900 m¢t mang chua ca.c di~m bouncing. bouncers = new Bouncer [ 2] ;

for(int i=0;i<2;i++)

(

bouncers [i] =new Bouncer ();

bouncers[i] .position= newPoint(r.Next(800),r.Next(600»; bouncers[i] .Size=newSize(800,600);

}

IIB~t b9 d~nh thai bounce.Enab1ed=true; paint.Enabled=truei

}

static void Main ( ) {

Application. Run (new BezierCurves ( ) ) ;

.:

CHUdNG 3·5: GDI+: Giao di~n de. hoa ella .NET

3571!j

129: } 130:}

Phan chu yeu ella Lffig dung nay thi that sl,C urong tl,C vdi cai dll dU'qe trinh bay trong vi du 3.5-4. Nhirng di€m dang chu y 11\ nhung dong 83-86 ve dU'ong eong Bezier, va nhi1ng dong 92-96 trinh bay eho ban each ve nhfrng duerng thang net dirt. Anh trong hmh 3.5-4 la anh ella mot roan hinh ella irng' dung va n6 cho thay nhung diem kiem soat cua dU'ong eong Bezier dU'qe sli dung nhu the nao dg tang them huang va d(\ cang d6i vdi ro(\t nut cu tM.

Hinh 3_5-4 Duong cong Bezier dang hoat d()ng

Mot mang nhirng dillm cung e6 th~ diroc sil dung dE) tao met duong cong Bezier eo nhieu dean. Mang nay phdi e6 ml?t bl? b6n di~ro va dU'qc s:ip xep nhu sau:

Point[O} = DiE\ro doiu cua doan thAng 1 Point[l} = Di€m kiii'm soat eho diE\m dau Point[2] = Diii'm kiii'm soat cho dh~m cu6i

Pointf Sl = Diii'm euoi cua doan th.lng 1 va la diE\m dau cua doan tMng 2 Pointj-t] = Diii'm kiii'm soat cho diE\m diiu cua doan thAng 2

Cho 4 diii'm md dau ccng them 3 diem cho m6i dean thang thea sau.

9. DOl TUONG GRAPHICSPATH

Cac duang de. thj do hoa trong GDI+ IA m(lt each thfch hqp d~ t~p hop cac hinh de. hoa lai, hoac t6i thiii'u cling la cac dinrng bien ella chung, VaG m(>t dan vi duy nhat. Khi mot duong de. thi da duqc tao, chung ta co tM van dung no to mau,

1)358

PHAN III : Windows Forms

ve net, hoac co tht! sli dung M tlnrc hien nhung thao tac db hoa khac, chdng han nhu sli dung M tao mot vung cat,

Bat ell ttl hen> nao cua cac thanh phan de hoa co han d/lu co tM di!-t trong d6i tl1gng dl1Crng d6 thi Path:

Cung (Arcs)

Duong cong Bezicr Duong cong cO ban Ellipses

DUCrng th<lng (Lines) Duong de thi

Hlnh quat (Pie segments) Da giac (Polygons)

Hmh chil nhat (Rectangles) Hmh anh cua ky tv W chuoi

DOl1-n rna du6i day eho ra kt1t qua nhu trong htnh 3.5-5.

void OnPaint (Object sender, PaintEventArgs e) {

GraphicsPath p ;: new GraphicsPath ( ) ; p.AddEllipse(~O,10,lOO,100)i p.AddRectangle(newRectangle(O,O,120,120); Pen pen;: new Pen (Color. Black, 1); e.Graphics.DrawPath(pen,p);

pen.Dispose(};

}

Hinh 3.5-5 Hai hinh trong d6i t uong GraphicsPath

To duong path bang each sa dung mot CQ ve thich hop va phuong thiic cho ra ket qua nhu trong hmh 3.5-6.

SolidBrush brush;: new SolidBrush(Color.Blue); e.Graphics.FillPath(brush,p);

.s

Hinh 3.5-7 K€t h'1P hai duong d6 th]

CHUdNG 3-5: GDI+: Giao di~n deS hoa cua .NET

359~

n

g

Hinh 3.5-6 Path duoc to

Ph!in hmh vuong etta dU'Crng deS thi da dLigc to va dLierng trim thi kh6ng. D6 La vi thuoc tinh FillMode cua d6i tU'qng Path duoc gan mac dinh La Alternate.

Dr; to hoan toan ben trong du'erng bien xa nhat cua hmh, ta gan cho FillMode gia trj Winding.

9.1. Them van ban (Text) va eac du'(1ng d5 thi khac

Ta co the them m(lt dLii'1ng d6 thi khac vao rnQt dU'iYng dU'C1ng d6 thi co sAn kha de dang bang each goi phuong thll'c AddPath. Doan rna du'Cii day tao ra dLi<rng deS thi thu- hai va them no vao duong dUC1ng deS thj da dLige trinh bay trong hlnh 3.5-5 void OnPaint (object sender, PaintEventArgs e)

{

Graphicspath p = new GraphicsPath ( ) ; p.AddEllipse(10,10,100,100);

p . AddRectangle (new Rectangle (0,0,120,120) ) ; Pen pen = new Pen (Color. Black, 1) ; GraphicsPath p2 = new GraphicsPath ( ) i

Point [] tripoint new Point [3] ;

tripoint [0] = new Point (80,10) ;

tripoint [1] = new Point (80,110) ;

tripoint [2] = new Point (150, 60); p2.AddClosedCurve(tripoint, (float)O); p2.AddPath(p, true);

SolidBrush brush = new SolidBrush(Color.Blue); e.Graphics.FillPath(brush,p2)i e.Graphics.DrawPath(pen,p2);

}

Hmh anh hien thi hie nay geSm eli hai dU'Crng deS thi. Htnh 3.5-7 eho thay ke"t xuat tU viec chung ta da sua doi bl} xli ly OnPaint.

to

rl!l360

pHAN III : Windows Forms'

Chuyen cac ky tv trong van ban (text) thanh dang hinh anh do hoa co cac duang do thi. Day hi each tao cac hieu ling van ban (text effects) tuyet vai. MQt duang d6 thi cua van ban (text path) chi chua cac duang vUm hinh anh cua cae ky W ducc si'! dung. Chung ta sil dung nhi1ng duc'!ng vi~n nay d~ tao cac dul'1ng c~t (clip paths), M to vdi cac mau to hoac mau, de' co dan thea ty 1(\, d€ quay, hay dung phep bien d5i d~ tao nen mQt vai hieu ling kha §n tinrng.

Si'!a d6i trong bi) xi'! 1,9 OnPaint cua cluing ta se minh hoa lai dii'lu nay dW~ hoan thanh nhu the nao,

void OnPaint (object sender, PaintEventArgs e) {

GraphicsPath p = new GraphicsPath ( ) ; p. AddString ("AYBABTU",

FontFamily. GenericSanserif,

0, (float)7 2, new Point (0,0) , StringFormat.GenericDefault);

SolidBrush brush = new SolidBrush(Color.Blue) ; e.Graphics.FillPath(brush,p); brush.Dispose();

}

Chung ta se ti€p tuc thao I u~n dii'lu nay trong phan ke bdi vi no dan de'n mot v§n dEi thu vi.

10. KY THU!T CAT BANG DUONG D6 THI vA vUNG (REGION)

M9t vung (region) la mot hinh khep kin rna co tM dUQ'c su dung nhu IDOt mat na d~ thuc hien cac thao WC do hoa, Vung co th~ la nhii'ng hlnh dllu, nhu hinh chi! nhat hay elip; va cling co thf 19. nhii'ng hinh khong dEiu, nhii'ng hinh nay e6 th~ dLlqc tao W nhii'ng duang cong hoac cac anh eua van ban (text glyphs). VI vung co th~ duqc tao W cac duong, cac duong nay co th~ rdt phirc tap, hay cac hlnh dil bi cAt. Tro 1\Ii vi du v.§ text path trlidc do, chung ta e6 the 410 IDOt vung cAt (clipping region) tLr text path nay va sli dung n6 cho nhung dieu thu v1 khac.

Trong vi du 3.5-6, chung ta su dung IDOt duang d6 th], dugc to bang ffi9t chuoi van ban.

Vi du 3_5-6 ClipToPath_cs: 811 dung path de' dt vung dang ve

1: using System;

2: using System. Drawing; 3:usingSystem.Drawing.Drawing2D; 4: using System.Colletcion;

5: using System. ComponentModel;

.-

)

c t Y

CHudNG 3-5: GDI+: Giao di~n d6 hca cua .NET

361~

6: us ing System. Windows. Formi 7: using System. Data;

8:

9: namespace Clipping 10: {

11: public class ClipToPath

;System.Windows.Forms.Form

y

c

n

re rc li

rt



12: 13: 14: 15: 16: 17 : 18: 19: 20: 21: 22 ; 23: 24 : 25: 26: 27: 28: 29: 30: 31: 32 : 33: 34: 35: 36: 37 : 38: 39:

40: 41: 42: 43 ; 44:

45:

{

Timer timer; GraphicsPath p; bool dirty;

void OnPaint (Object sender,PaintEventArgs e) {

Random r = new Random ( ) ; SolidBrush brush = new SolidBrush ( Color.FormArgb(r_Next(255), r.Next(255), r.Next(255»); e.Graphics.SetClip(p);

e.Graphics.FillEllipse{brush, r.Next(500), r.Next(200), r.Next(20), r.Next(20»;

brush.Dispose();

)

void OnTick(object sender, EventArgs e) (

Invalidate();

}

protected override

void OnPaintBackground (PaintEventArgs e) {

if(dirty) {

e.Graphics.ResetClip(); SolidBrush b =

new SolidBrush(this . BackColor) ; e.Graphics.FillRectangle(b, this.ClientRectangle);

dirty = false;

b.Dispose();

46: 47:

48: }

49: }

~362
50:
51:
52:
53:
54:
55:
56:
57 :
58:
59:
60:
61:
62:
63:
64:
65:
66:
67 :
68:
69:
70:
71:
72:
73:
74:
75:
76:
77: }
78: } PHAN III : Windows Forms

void OnSized{object sender, EventArgs e) {

dirty = true; Invalidate{);

}

public ClipToPath ( ) {

p=new GraphicsPath(); p.AddString{IAYBABTU", FontFamily. GenericSansSerif,

0, (float) 72, new Point CO, 0) , StringFormat.GenericDefault(),

dirty=true, this.Paint+=

new PaintEventHandler (OnPaint) ; this.SizeChanged+=

new EventHandler (OnSized) , timer", new Timer ( );

timer. Interval ::: 10,

timer . Tick+=new EventHandler (OnTick) ; timer.Enabled=true,

}

static void Main() {

Application.Run (new ClipToPath () ) ,

}

Ehri'1ng d6 thi duoc tao m(it Mn tren nhung' dong 59-62 va dllqc gill lai dii' stt dung sau d6_ Ke. Mn h(i dinh thci (timer) duqc khoi tao d~ c6 tM va lai thea m(it chu ky nao do.

Nhung dong 39-48 xU- If viec va lai n£n neu chung ta thay diSi kich thudc (resize) window hoac do 1:'1 Ian ve dfru tiEm.

Cuei cung. dong 25 chon dUGng cAt (clip-path) cho doi tunng Graphics.

Nhung dong ke d6 d~t nhtrng gi9t nude mau trsn ciia s6 form; ban co th~ thay hoac kh6ng thay nhilng giot nude nay ph.,. thuoc vao Sl,i ngdu nhien cua n6 vai duo-ng cAt (clipping path).

Trong hinh 3.5-8 Iii ket xuftt cua vi du 3,5-6.

CHudNG 3-5: GDl+: Giao di$n d6 hoa cua .NET

363[!J

H'inh 3.5-S Buc tranh bi edt Mi elU(Jng elf, thi

Nhimg thao tile tren vung (region) khac vui tren duang d6 thi. MQt ouang dO thi chi ra met t~p cac dinmg bien, mot vung (region) chi ra mQt khu vue hay mQt nhorn cac khu vue duoc sa dung nhu mQt mat, na (mask). Cac vung co thi'i duge ket hop theo nhieu each. Nhtrng thao tac nay duqc quy dinh bdi nhung gia tr] cua CombineMode. Vi du 3.5~7 minh hoa each sa dung vung trong bon each khac nhau.

Vi du 3.5·7 Regions.cs: Ke't hQ"p vung thea nb ie u each khric

1: using System;

2: using System. Drawing;

3: using System. Drawing. Drawing2D; 4: using System. Collections;

5: using System.ComponentModel; 6: using System. Windows. Forms i 7: using System. Data;

8:

9: namespace regions

10: { 11:

12 :

13 : 14:

/ / / < summary>

/ / I Summary description for Form1. / / / < / summary>

public class RegionsTest :System.windows.Forms.Form

15: {

16: void PaintRegions (Graphics g,

CombineMode m, Point offset, string text)

17: {

18: Region ra, rb;

19: GraphicsPath p=new GraphicsPath();

20: p.AddRectangle(

new Rectangle (60, 60, 120,120) ) i

21: ra=newRegion(p}i

22: p=new GraphicsPath ( ) ;

23: p.AddEllipse(O,O,120,120);

24: rb=new Region (p) ;

25: ra.Translate(offset.X,offset.Y);

26: rb.Translate(offset.X,offset.Y);

1!j364

pHAN III : Windows Forms

27: 28: 29:

g.SetClip(ra,CombineMode.Replace); g.SetClip(rb,m);

SolidBrush brush=

new SolidBrush(Color.Black); g.FillRectangle(brush, this.ClientRectangle); g.ResetClip(); g.DrawString(text,

new Font (" Ariel" , (float) 16} , brush, (float)offset.X+60, {float)offset.Y+220};

30:

31: 32: 33: 34:

35: 36: 37:

}

void onPaint (obj ect sender, PaintEventArgs e)

38: {

39. : I I hgpcua hai vu.ng ...

40: PaintRegions(e.Graphics,

CombineMode.Union,

41: newPoint(O,O},"Union");

42: I I giao c'ua hai vu.ng.

43: PaintRegions(e.Graphics,

CombineMode.lnterSect,

44: new Point (250, 0), "Intersect");

45: I I vu nq rieng bi~t

46: PaintRegions(e.Graphics,CombineMode.Xor,

47: new Point (500, 0), "Xor");

48: I I phAn bli cua hai vu.ng

49: Paint Regions {e.Graphics,

CombineMode.Complement,

50: new Point (0,250), "Complement");

51: II Hi¢u.

52: PaintRegions(e.Graphics,

CombineMode.Exclude,

53: new Point (250,250), "Exclude");

54: }

55:

56: public RegionsTest ( )

57: {

58: this.Paint+=

newPaintEventHandler(OnPaint);

59: this. Size = new Size (BOO, 800);

60: }

61:

62: static void Main()

63: {

64: Application.Run(new RegionsTest (»;

65: }

LS

CHUONG 3-5: GDl+: Giao di~n d6 hoa cua .NET

365~

66: }

67: }

OnPaint goi lien tuc phucng tlurc PaintRegions voi cac gia tr] rieng biet cua CombineMode, thong tin v~ 'i tri, va met chubi ten cua ki~u k€t hop, Phuong thirc Paintltegions (dong 16-35) Mt d/l.u biing hai khai bao bien kiE!u Region, ra va rb, va to chung bang mi)t duo-ng tron va ml)t htnh chu nhat. Dong 25 va 26 bao dam rAng hai vung nay da duqc di chuyen vao dung vi tri cho viec hien thi, ke tiep dong 27 chon vung c!i.t (clip region) tha nha't, thay the' cai c6 slin trong doi tuong Graphics. d dong 28, vung tbt1' hai duoc ket hop mot tham so CombineMode, va toan bl) khu vue client du'qc to b1i.ng mau den. Chu y rang chi khu vue ben trong vung bj dl.t la diroc to. Ke do {j dong 31 chuang trtnh di chuyen vung c!i.t (clipping region) d€ ve van ban Ci nhirng dong 32-34.

Trong hinh 3.5-9 la k€t xuat cua vi dl,l

Hinh 3.5-9 Khdo sat cdc ki€u Mt hqp uung

11. cAc PHEP BIEN DOl (TRANSFORMATIONS)

Co Ie trong VI du trurrc, ban da nMn ra vai dong lenh ap dung phep bien d5i d~ di chuyen cac vung (region) Mn mi)t vi t.ri khac. C6 hai each co ban trong viec ap dung cac phep bien d6i cho cac d6i tuqng d6 hca trong kien true (Framework). Ban c6 thE! sli dung cac phirong thirc san co, chang han nhu Translate hay Rotate, hay ban c6 thE! dinh ro m(it rna tran (matrix) cua phep bien d5i se duqc sli dung.

Cach tot nhat hen han moi each khac M xli If cac phep bien d3i nay la sli dung cac phuong thuc rna n6 baa nhtrng thao tac rna tran {j phia duai cho ban.

~366

PHAN III : Windows Form

Nhirng phep bien hinh nay cho phep ban him cac di~u sau:

Phep tinh tien (Translate) - Tjnh tien mQt d6i tl1gng.

Phep quay (Rotate) - Xoay mQt d6i tinrng xung quanh mot g6c toa dQ. Phep quay thea toa dQ (RotateAt) - Xoay mot d6i tirong xung quanh m! diem khac vai g6c toa de).

Phep co dan (Seale)- Ph6ng to hay thu nh6 deli tl1gng.

Phep bien dang (Shear) - B6p meo mot d6i tuong ba:ng each thay di hinh chu nhat bao cua n6 thanh mOt hinh binh hanh baa.

Mot rna tran bi~u di~n cac phep bien ddi nay bfing each thuc hien phi toan tren rna tran, chang han cong, trir, hay nhan vci phep bien d5i d6 hoa hi~ hanh Chung ta da d~ cap ngay a d1\.u chirong nay rAng nhirng \t)nh d6 hoa d phai thong qua mOt vai phep bien d5i gil1a viec dl1gc ve trong M th6ng d& hoa , cu6i cung duoc thify tren man hinh, Diilu nay duqc xem nhir 11\ graphics pipelin Hay tUCIng urcng nhl1ng menh l~nh di vao mQt d1\.u, dLiqc thay d6itheo dl1o-ng on va xuat hien adaokia trong mQt trang thai hoi khac,

Mati~n se bien d6i rihung tQadQ rieng bi~t ella d6i tl1gngd6 hoa, M6i m di~m (pixel) duge ve tran man hinh_i,dtigc bien d5i trong d\1()ng O"ng mQt vai Ii trurrc khi 1,l6 x~;,\'t hien tren man hinh'hay may in. Nhilng ttl:a tr~n duuc sll dui trong kien truc nay Iii me)t rna tr~n hai chieu 3x3. Ma tr4hnay duqc xay dung nl trong hmh 3.5-10.

,......-
1 0 0
0
0 1
0 011
'--
Linear part I
T ra ns lati on part Always 0,0,1

Hinh 3_5-10 Ma tr(in dun vi 3x3

Ma tran rna ban tha'y trong hmh duoc goi 18 rna tran dan vi (ident matrix). MQt rna tran dan vi co tM dl1qc ap dung nhir mot phep bien d6i len n deli tuqng va n6 kh6ng bi anh hl1O-ng. Ma tran dan vi thunng la di~m bdt dAu ( tlit ca cac phep bien Mi. Ma tr~n dl1qc sa dung trong GDI+ c6 ml}t vai gia trong cQt phai th(( nhat Iii cO" dinh. Phan rna luon luon la 0,0,1 trong rna tr~n ~

caudNG 3-5: GDI+: Giao dien do hoa ella .NET

367~

thi duqe dung M cho tiep theo phep bien dbi phirc hcp (chang han nhu tinh toan tuyen tinh, quay, co dan) e6 phep tinh tien trong cung phep nhan, Di~u nay duoc biet nhu 180 rnQt phep tinh cua rna tran affine. D~ thuc hien mot phep tinh affine tren rna tr~n n chieu, rna tran nhan phai la (n+l)x(n+l). Vi vay rnQt phep toan hai chi~l1 cAn rn{lt rna tr~n 3x3. Vi ly do nay, cQt thli' ba ella rna tran Iuon luon duoc gan la 0,0,1, va ban khong tM thay dbi n6.

C6 nhieu sach ve do hoa nhung, VI muc dich cua tinh toan ven, cac phep bien d6i duoc thuc hien beri rna tr~n tren h~ 19a dQ hoat di)ng nhu sau, VI du sau thuc hien rni)t phep tinh tien don gian vrii mot gia tri X va Y.

MQt toa dQ diroc bien thanh mot vector bang' each them vao thanh phan thu ba, do h\ cQt z. Vi du,

[10,5] trd thanh [10,5,lJ

Gia t11 tinh tien dx, dy cua rna tr4n 180 10,30

Ma tran se nhan vdi vector nay theo each sau:

[10, 5, 1]

nhan ...

100 010

dX dY 1

bang ...

1 *x O*x O*x

+++

O*y l*y O*y

+++

l*dX l*dY 1*1 Mng ...

dx s- x dy s- y I bAng ...

2035 1

Lay thanh phan tha ba ra, va ban con lai [20,35]. D6 la ket qua rna [105) duqe tinh tie'n bdi [10,30).

Phep quay quanh giSe toa di) ding ducc thuc hien thea mot each tuong W.

Chung ta se sli dung 90°, bai vi sin va cos 90° d~ ttnh. Ma tran cho phep quay ducc khdi tao nhu sau:

~368

PHAN III: Windows Fore

cosO sinO 0 -sinO cose 0

001

Do cos(90) = 0 va sin(90) = 1, nen phep tfnh tren rna trii,n gi6ng nhu sau: [10, 5 1]

nhan ...

010

-1 0 0

001

bang ...

O*x 1 "x O"x

+++

-1 *y O*y O*y

+++

1*01*01*1 Mng [-5,10, 11

B6 phan rna rorig, ban duoc [-5, 10)

Lay hai rna tr~n c(\ng hay nhan chung vdi nhau tao ra mot rna tran ket ql Cong hay nhan lien tiep tao ra mot rna trij.n rna no hl t6ng hcp cua tilt ca cac ph bien d6i duoc thuc hien. Di~u nay muon n6i rang ban c6 tho§' thuc hi~n vai ph bien d6i tren rna tran va tilt ell. chung ttch lGy lai, va sau d6 phep bien d5i tro rna trij.n duoc ap dung cho rnM diem (pixel) rna lenh ve tao fa d€ co dugc nhirng tri cua chung trong ket xuat cuoi cung,

'Thu tl,l" cac phep bien d6i cung ni"t quan trong, Vi du, Phep quay - Phep dan - Phep tinh tien kh6ng cung mot y nghia vdi Phep co dan - PMp tinh tiel Phep quay. Dieu nay ngl,l y rang ban cnng d.n phai suy nghi v~ nhil'ng l~nh ( API ap dung vao nhung rna trij.n rna ban trao eho chung nhu the nao, Ban co nh rna trij.n hi~n hanh vdi rnQt rna trij.n rna ban vita moi dira ra hay mdt rna tran ban co? That may man, nhirng lo-i goi Rotate, Scale, va van van, co m(\t cO- (fl rna ban co tM sa dung M di~u khien each rna nhirng rna tran lam viec. M~c djl MatrixOrder.Prepend ap dung vao rna trij.n rna ban truyen vao d§.u tien, va sau hi rna tran hien hanh, MatrixOrder.Append ap dung vao phep bien d6i dliqc : cau sau khi rna tran hien hanh diroc ap dung.

Doan rna sau minh hoa nlji dung cua rnQt rna trij.n khi n6 tien trien (

nhieu phep bien d6i.

Matrix m = new Matrix () II Tao mQt rna trij.n dan vi 100

010

is

p p g

o

a n a ~ )

r,

6

u

a

CHUONG 3·5: GDI+: Giao dien d6 hoa cuaNET

369~

001

m.Rotate(30,MatrixOrder.Append); /I quay 30"

0.8660254 0.50

-0.5 0.8660254 0

001

II Keo dai 3 hin theo true Y

m.Scale( (float) 1 ,(float)3, MatrixOrder. Append); 0,8660254 1.5 0

-0.5 2.598076 0

001

II di chuyen 100 theo true X va 130 thea true Y m.Translate«float)100,(float)130,MatrixOrder.Append); 0.8660254 1.50

-0.5 2.598076 0

100 130 1

Vai sl,i bien dili lien tiep nay, b:;10 c6 the thay rna tran tich luy nlurng phep bie'n dili voi m6i I(li gni M tiep nhu the' nEW.

Chu y rang viec theo doi rna tran d6 hoa lit riii quan trong, dl!,c bi~t ne'u ban mu6n dl!,t nhieu doi tuong khac nhau len man hinh, m6i doi tinrng c6 phep bien d6i ella chinh n6. Doi khi dung rna tran hien hanh vao mot trang thai da biet thl th~t la huu it, eo tM vai su bat dilu trong mot noi khac hay ph6ng to hay thu nho bang phep co dan, va sau d6 thuc hi{in cac phep bien dili khac, MOi phep bien d6j tl! hanh xii va M lai rna tran hi{in hanh nhu ban dii thily. Vi,;,c luu trang thai cua dOi tuqng Graphics trong doi urong GraphicsState c6 the lam di~u nay. Doi tircng GraphicsState diroc ghi thong tin vao bdi phuong thuc Graphics.SaveO vit ducc phuc h6i bdng phuong thirc Graphics.Restore(state). Vi du nhu;

GraphicsState gs '" theGraphics. Save ( ) ; Ilthl1c hi~n thao t ac 0 dAy theGraphies.Restore(gs);

liD?> h9a tro ve trc;tng thai g6e cua chung

Vi du 3.5-8 minh hoa mot day cac phep bien d6i truac day, cling nhu Slr dung GraphicsState va nhirng thao tac rna tran khac trong ngii' canh ella mOt viti hinh d6 hoa dan gian.

Vi du 3.5-8 MatrixElements.cs

1: using System;

2: using System. Drawing;

3: using System_ Drawing. Drawing2D; 4: using System_ Drawing. Text;

5: using System. Collections;

6: using System.ComponentModeli 7: using System. Windows . Forms; 8: using System. Data;

9: using System. Text;

10:

11: namespace matrixelements 12: {

13: public class MatrixElements

: System. Windows. Forms. Form

~370

14:

15: void DumpMatrix (Graphics g, Matrix m,

Point p)

16: {

17: StringBuilder sb=new StringBuilder ( ) ;

18 : sb . AppendFormat ( " { 0 } , { 1} , 0 \n {2 } ,

{3},0\n{4}, {5},1",

19:

m.E1ements [0],

m. Elements [1] , m.Elements[2] , m.Elements[3] , m.Elements[4] , m.Elements[5]); GraphicsState s=g. Save ( ) ;

g.ResetTransform(); g.DrawString(sb.ToString(),

new Font ("Ariel", (float) 16),

24: new SolidBrush (Color. Black) ,p,

23:

20:

21: 22:

StringFormat.GenericDefault);

25: g.Restore(s)1

26: }

27:

28: vQid On~ize (object sender, EventArga e)

29: {

30: Invalidate();

31: }

32:

33: void OnPaint (object sender,

19

CHU(jNG 3-5: GDl+: Giao dien db hoa cua .NET

371~

PaintEventArgs e)

34: {

35: GraphicsState gSi

36: Matrix rn=new Matrix () i

37:

38: Ilxac d~nh vttriva va cac t ruo bclng each

Ilt:t.nh tien cua s6 de rna g6c t.oa d¢ 6 giua

39: liman hinh.

40: e.Graphics.TranslateTransforrn(

(float)this.ClientRectangle.Width/2,

41: (f1oat)this.ClientRectangle.Height/2);

42: e.Graphics.DrawLine(

new Pen(Co]'or.Black, (float) 1), 0,-1000,0,1000);

43: e. Graphics. DrawLine (

new Pen (Color. Black, (float) 1} , ~100,O,1000,O)i

44: 45: 46:

liVe rn¢t hinh vuong. e.Graphics.DrawRectangle(

new Pen (Color. Black, (float) 3) , ~50,~50,100,100};

DurnpMatrix (e .Graphics, m, new Point (0, a) } i

47: 48: 49: 50: 51:

rn.Rotate(30,MatrixOrder.Append}i DurnpMatrix{e.Graphics,rn,

new Point (0, 100»;

52: 53: 54 : 55:

gs=e.Graphics.Save()i e.Graphics.MultiplyTransform(rn); e.Graphics.DrawRectangle(

new Pen(Color.Red,3), ~50,-50,100,100)i e.Graphics.Restore(gs);

56: 57: 58: 59: 60:

rn.Scale(1,3,MatrixOrder.Append)i OUrnpMatrix(e.Graphics,rn,

new Point (0, 200});

1M1372
61:
62:
63:
64:
65:
66:
67 :
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79 :
80:
81:
82:
83:
84 :
85:
86:
87 :
BB: }
89: } PaAN III : Windows For:

gs=e.Graphics.Save(); e.Graphics.MultiplyTransfor.m(m); e.Graphics.DrawRectangle(

new Pen (Color. Green, 3) r -50,-50,100,100); e.Graphics.Restore(gs);

m.Translate(100,130,MatrixOrder.Append); DumpMatrix(e.Graphics,m,

new Point (0,300»;

gs=e.Graphics.Save(); e.Graphics.MultiplyTransform(m); e.Graphics.DrawRectangle(

new Pen{Color.Blue,3) , -50,-50,100,100); e.Graphics.Restore(gs);

}

public MatrixElements ( ) {

this.Paint+= newPaintEventHandler(OnPaint); this.SizeChanged+=

new EventHandler (OnSize);

}

static void Main()

Application.Run(newMatrixElementS(»i

}

Dong 40 va 41 tao mot rna tran thay d6i g6c toa dQ thanh tam cua ei'!~ Dong 42 va 43 ve cac true va dua ra nhung con so de' tharn khao.

s

.e so.

CHUONG 3-5: GDI+: Giao dien di\ hoa ella .NET

373~

Dong 46 va 47 vii hinh vuong, Di8u nay gi6ng nhu lenh vii dlige Sle dung cho tat ca nhirng deii tligng khac tren man hinh, va sau do dong 48 dlia ra ngoai rna trandon vi.

Dong 50 quay rna tran do, no lai dune dua ra ngoai vdi van ban, va sau d6 dong 53 luu trang thai di\ hoa d~ eho khOng lam hu g6c tea de.. Dong 54 dung rna tran, dong 55 va 56 vii hlnh vuong mdi duoc quay, va dong 57 phuc hi'li lai phep bien d6i cua the gidi thuc eho trang thai g6e toa dQ nAm a gifia.

Dong 59 ph6ng to rna tran, lam cho b~ cao han ba li\n b~ rong, va keo dai ket xuat thea true Y. Dong 62-66 dung phep bien dbi, vii hinh vuong, va tra v~ phep bien dili the' gi6'i thuc diroc chon mac dinh.

Ke do dong 68 tinh tie'n ma tran di qua phai va xuong dudi, Dong 69 dua ra nhung cai di;it cua ma tran va tren cac dong 71-75 chung ta lam trim viec ve keo dai, quay, phong to, va tjnh ben hmh vuong.

Be rna tran dG' Iieu tt,t ve, cac dong 15-26 luu trfi trang thai d6 hoa va dat lai phep bie'n d6'i, dua van ban len man hmh, va sau do tra lai phep bien. dbi g6c eua no truce khi tra v~.

Form ket xuat cu6i eimg du'qc dua ra trong hinh 3.5-11

Hinh 3.5·11 Cae phep biind6i rna trt)n cho kink vuong dan guin

~374

pHAN III : Windows Forms

12. SV PH61 MAu VOl GlA TRl ALPHA (ALPHA BLENDING)

Ta.'t ca cac mau trong GDI+ co mot thanh phan thu tv dl1qc them van cac gil! trj mau thong thuong red, green vablue. £)6 Iii gia trj "alpha" vii no dieu chinh gi~ tTi thuc ma rnau nen (background) tM hien qua d6i tuqng vua duqc thie't lap trsn man hinh,

Alpha blending e6 the· duqc ap dung cho ta"t ca cac hinh dang d6 hoa, nhi ducng thAng va van ban. N6 cling co th€ duoc ling dung eho hinh anh, hoac Iii ffii)1 gia tri toan cue anh huong den dien mao cua toan bo;. anh, hoac Iii m(it gia tri chi moi pixel rieng le, no tao ra phan hlnh anh trong su6t hon nhtrng cai khac,

£)€ tao mot mau vci mOt thanh phan alpha, ban co th€ dung phirong thi/ Color.FromARGBC . .) va cung cRpalpha la mo;.t gill. trj tlI 0, hoan toan trong suo (transparency) tOi 255 hoan toan mo due (opaque).

Vi du 3.5-9 minh hoa tac dong nay bAng each tao mot day hinh ellipse m su th~ hienmau nen (background) hoan toan tuy theo gia tri alpha.

Vi du 3.5·9 AlphaBlend.cs: sa durig' cq ve voi de;, trong su6t Alpha

1: using System;

2: using System. Drawing;

3 : using Sys tern. Drawing. Drawing2D i 4: using System. Collections;

5: using System.ComponentMode~; 6 : us ing Sys t em. Windows. Forms; 7: using System. Data;

8:

9: namespace Alphablending 10: {

11: public c Laa s Alphablending

:System.Windows.Forms.Form

12: {

13:

14: void OnPaint (object sender I

PaintEventArgs e)

15: 16: 17 : 18: 19: 20: 21:

SolidBrush b,.new SolidBrush(Color .Red) ; Rectangle r,.this .ClientRectang~e; GraphicsPath pth=new GraphicsPath(); for (int c:::1; c<10; c++)

{

22: 23: 24: 25:

r.Inflate( -(this.ClientRectangle.Width/20),

-(this.ClientRectangle.Height/20)};

pth.AddRectangle(r);

} e.Graphics.FillPath(b,pth);

rs

26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37 :
38:
39:
40:
41:
42:
43:
44:
45:
46:
47 :
48:
49:
50:
51:
52 :
53:
54:
55:
56:
57 :
58:
59:
60: }
61: } CHUdNG 3·5: GDI+: Giao di(in d6 hoa cua .NET

375~

.Ii Ii

n

L1.1 ?t

to

JC 5t



Random rnd=new Random ( ) ; for(int y=O;y<S;y++)

{

for( int x=O;x<S ;x++) {

b. Color= Color. FromArgb (

(int) ««5"'x)+y)*10.63)), (byte)rnd.Next(255), (byte)rnd.Next(255), (byte)rnd.Next(255»;

e.Graphics.FillEllipse(b,

this.ClientRectangle.Width/5*x, this.ClientRectangle.Height/S*y, this. ClientRe.ctangle. Width/5, this.ClientRectangle.Height/S);

}

}

}

void OnSize (object sender, EventArga e)

( ..

Invalidate{);

}

public Alphablending ( ) {

this.Paint+=

new PaintEventHandler (OnPaint) ; this.SizeChanged+=

new EventHandler{OnSize); thia.BackColor=Color.White;

}

static void Main ( ) {

Application.Run(new Alphablending O ;

Bien dich vi du 3.5-9 bang dong l(inh sau: csc /t:winexe alphablend.ca

Ke:t xudt cua VI du 3.5·9 d1.1gc trinh bay ij hinh 3.5-12 va tM hien ph6ng n~n m(lt each ro rang, nhung hinh chu nhat d6ng tam mau s§.m, d1.1gc him rna dan bdi alpha blends dllgc tAng dan cua nhtrng hlnh ellipes.

l!j376

PHAN III: Windows Forn

13. su PHOr MAu vor GrA TRJ ALPHA CHO HINH ANH

Hrnh 3.5-12 Phep ph6i mau vai gia tri alpha dang c6 tac dung

Corig viec nay cung de dang thirc hien thong qua viec sa dung deli tli~ ColorMatrix. Chung ta dii xem Cr phan thao tac rna tr~n rna rna tran c6 the dl dung de thuc hi~n thao tac trong kh6ng gian hai chieu cho nhtrng dOi tl1Q'ng dil I Stl' dung rna tr~n 3x3. Mgt ColorMatrix lien quan Mn khai niem bon chieu, khi gian mau, cac chieu ciia kh6ng gian mau la R,G,B va A wang trng vdi Red, Gre Blue va Alpha. Thirc hien nhi1ng thao tac rna tr~n tuy y tren doi tuung bon ch yeu du rni)t rna tran 5x5. Giang vi du rna tran 3x3 cho khong gian ba chieu (3 ColorMatrix duy trt mdt cet gill d6 la bl} 0,0,0,0,1.

Anh i'J hinh 3.5-13 la rna trij.n dan vi cho d6i ttJqng ColorMatrix

- -
-
1 000 0
01 00 0
001 0 0
00 01 0
I 0000 I 1
n@.~P3~ I t--
nslation pa~
W3 00 1- t.i Tra .Ill \'$ • !Jfj.

Hinh 3.5·13 Ma trg,n dan ui eua kh6ng gian. mau

11: {
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22: CHUdNG 3-5: GDI+: Giao dien d6 hoa cua .NET

377~

Lap ColorMatrix, gi6ng rna tr~n danh cho thao tao 2D, c6 cac thuoc tinh cho nhung phan tli cua n6 c6 tM duoc truy c~p rieng biet, D~ thiet lap alpha cho mOt hinh anh, ban chi can d~t gia tr] alpha VaG thuoc tinh Matrix33 nhu sau:

IIT~o m9t identity matrix ColorMatrix cme new ColorMatrix (1 ; m.Matrix33=(float)AlphaValue;

Ma tran mau nay sau d6 diroc chuyen de'n lap ImageAttributes:

ImageAttributes ia = new ImageAttributes (1 ; ia.SetColorMatrix(mli

D6i tuqng ImageAttributes duoc khci tao sau d6 duoc su dung bifi phurrng thuc Graphics.DrawImageO di'l to hinh vrri m(it alpha blend cu thf

Vi du 3.5-10 trtnh bay each dung nhilng d~c tinh alpha blend cua GDI+ voi bat ky anh bitmap nao W may cua ban, Chuang trmh co mot nut nhan cho phep ban chon II/a met file anh va mot thanh truot {track bar) cho phep ban chon dQ trong su6t voi hinh anh duoc hii'ln thj,

Vi du 3.5·10 ImageAlpha.cs: Alpha Blendin cho anh

1: using System;

2:using System. Drawing;

3: using System. Drawing. Drawing2D; 4: using System. Drawing. Imaging;

5: using System. Collections;

6: using System. ComponentModel; 7 : UB ing Sys t em. Windows. Forms; 8:using System.Data;

9:

10: namespace ImageAlpha

I),

class Forml : Form {

Button b; TrackBar t; Image i;

void OnPaint (obj ect Sender, PaintEventArgs e) {

Sol idBrush b=new SolidBrush (Color. Red) i Rectangle r=thi s . ClientRectangle;

~
~378
23:
24:
25:
26:
27 :
28:
29:
30:
31:
32:
33 :
34:
35:
36:
37 :
38: GraphicsPath pth:::;new Graphicsl?ath ( ) ; for(int c=1;c<10;c++) {

PaAN 1lI , Windows Forms 1

r.Inflate( -(this.ClientRectangle.Width/20),

-(this.ClientRectangle.Height/20»;

pth.AddRectangle(r);

} e.Graphics.FillPath(b,pth);

if(i!=null) {

ColorMatrix m==new ColorMatrix(); m.Matrix33={float) (1.0/256*t.Value); lmageAttriputes ia=

new ImageAttributes (); ia.SetColorMatrix(m); e.Graphics.Drawlmage(i,

this.ClientRectangle, 0,0, i.width,i.Height, GraphicsUnit.Pixel,ia);

39: }

40: }

41:

42: voidOnClickB(object sender, EventArgs e)

43:

44: OpenFileDialog dlg=new OpenFileDialog ( ) ;

45: dlg. Filter="Bitmap fi les (* .bmp) 1* .bmp";

46: if (dlg.ShowDialog()==DialogResult.OK)

47: {

48: i=Image.FromFile(dlg.FileName);

49: Invalidate();

50: }

51: }

52:

53: void OnTrack(object sender, EventArgs e)

54: {

55: Invalidate();

>8

CHUdNG 8·5: GDI+: Giao dio?n de. hoa cua .NET

3791!!J

56: }

57 :

58: void OnSize (object sender I EventArgs e)

59: {

60: Invalidate();

61: }

62:

63: public Form1 ( )

64: {

65: this.Paint+=

new PaintEventHandler (OnPaint) i

66:

67 : 68: 69: 70: 71: 72: 73: 74: 75: 76 : 77: 7B: 79:

BO: 81: 82: 83:

this.SizeChanged+=

new EventHandler (OnSize);

b=new Button {} i

b.Click+=newEventHandler(OnClickB);

b. Locat ion=new Point ( 5 I 5) i b. Size=new Si,ze (60 ,22) i b.Text="Image •.. "i

this.Contro1s.Add(b);

t=new TrackBar ( ) i

t. Location=new Point (100,5) ; t. Size=new Size (200,22) ; t.Maximum=255;

t.Minimum=O; t.ValueChanged+:;:

new EventHandler (OnTrack) ;

84 :

85: this.Controls.Add(t);

86: }

87 :

BB: static void Main()

89:

90; Application.Run(new Form1 (»;

~ 380 PHAN III : Windows FOTr

91: }

92: }

93: }

'f !

Bien dich file nay bii.ng dong llimh sau: esc It ;winexe imagealpha.cs

Nhung dong quan trong hi 34-38. Dong 34 tao rnQt rna tr~n dan vi. Dong dung gia tr i a thanh truct (track bar) de' cap nhat thanh phan alpha cua anh tro rna tran, Dong 36 tao lap IrnageAttributes rna no su dung ColorMatrix a dong:

Sau cung dong 38 vii anh len man hinh, cho phep anh nen cua chung ta ci" gi thay xuyen qua hay khong, tuy thuoc VaG gia tr] cua thanh truqt (track bar).

Hinh 3.5-14 th& h ien ket qua nay voi thanh trinrt (track bar) duoc g. khoang 70%. Ban se ngac nhien, Do la mot chiec Triumph Bonneville 750.

Hinh 3.5-14 Ph6i mau v6i. gia tri alpha cho dnh bitmap

14. NHUNG THAO TAc XU LY KHAC TRONG KHONG GIA MAu

C6 mot rna tri).n toan ven rieng bi~t cho alpha blending dirong nhu Itt c sue, cho den khi ban nhan thay ding thao tac nao do trong kh6ng gian mau Itt tM thuc hi~n duoc vci rnQt c6ng CI,I. Ky thuat thao tac mot rna tran nham n dich thay d6i kh6ng gian rnau duqc goi [a recoloring (tai tao mau) va cung d~ da thuc hien vrii GDI+. MQt !:in nua, c6ng cu ducc dung la ColorMatrix. Dang tiec kh6ng co nhung phuong thirc trong ColorMatrix d~ th1,1C hien viec luan phien v~ mau, nhttng chung co th& da dira ra gia tri dung trong phan tuyen tinh cua tran. Dudi day Iii vi du:

CHl1dNG 3-5: GDl+: Giao dien d6 hoa ella .NET

381~

Vi du 3.5-11 ColorS aeel.es: Nhilng thao hie khdc trong khong gian mau

1: using System;

2: using System. Drawing;

3: using System. Drawing. Drawing2D; 4:usingSystem.Drawing.Imaging; 5: using System.Collections;

6: using System.ComponentModel; 7: using System. Windows . Forms; 8: using System. Data;

9 :

10: namespace ImageAlpha 11: {

12: class Forml : Form

13: {

14:

15: Button b;

16: TrackBar tr. tg, tb;

17 : Image i;

18:

19: void OnPaint (obj ect Sender, PaintEventArgs e)

20: {

21: SolidBrush b=new SolidBrush(Color .Red);

22: 23: 24: 25: 26: 27 : 28: 29: 30:

Rectangle r=this .ClientRectangle; GraphicsPath pth=new GraphicsPath ( ) ; if(i!=null)

{

33:

ColorMatrix m=new ColorMatrix() i m.MatrixOO=(float) (1.0/256*tr.Value); m.Matrix11={float) (1.O/256*tg.Value); m.Matrix22=(float) (1.0/256*tb.Value); ImageAttributes ia=

new ImageAttributes (); ia.SetColorMatrix(m); e.Graphics.Drawlmage(i, this.ClientRectangle,

O,O,i.Width,i.Height, GraphicsUnit.Pixel,ia);

31: 32:

~382

pHAN III : Windows Forn

34: 35: 36: 37:

}

}

void OnClickB(object sender, EventArgs e}

38: {

39: OpenFileDialog dlg=new OpenFileDialog();

40: 41: 42: 43: 44: 45 :

46: }

47:

48: void OnTrack(object sender, EventArgs e)

dIg. Filter="Bitmap files (* .bmp) 1*. bmpll; if (dlg.ShowDialog()==DialogResult.OK)

{

i=Image.FrOmFile(dlg.FileName};

Invalidate();

}

49:

50: Invalidate();

51: }

52:

53: void OnSize (object sender, EventArgs e)

54:

55: Invalidate();

56: }

57 :

58: public Forml ()

59: {

60: this.Paint+=

new PaintEventHandler (OnPaint) ;

61: this.SizeChanged+=

new EventHandler(OnSize);

62: 63: 64: 65: 66: 67: 68: 69:

b=new But ton ( ) ;

b. Click+=new EventHandler (OnClickB) ;

b.Locatiofi=new Point (5,5); b. Size=new Size (60,22); b.Text=IImage ... ";

s

CHUdNO 3-5: GDI+: Giao dien db hoa cua .NET

383~

70: 71: 72: 73: 74: 75: 76: 77: 78:

this.Controls.Add(b};

tr=new TrackBar ( ) ;

tr. Location=new Point (100,5) ; tr. Size=new Size (200,22) ; tr.Maximum=255;

tr.Minimum=O; tr.ValueChanged+=

new EventHandler (OnTrack);

79: 80: 81: 82: 63: 84: 85: 66: 87 : 88:

this.Controls.Add(tr);

tg=new TrackBar ( ) ;

tg. Locatiorl=new Point (100,55) ; tg.Size=new Size (200, 22); tg.Maximum=255;

tg.Minimum=O; tg.ValueChanged+=

new EventHandler (OnTrack);

89 : 90: 91: 92: 93: 94 : 95: 96: 97 : 96:

this.Controls_Add(tg};

tb",new TrackBar ( ) ;

tb. Location=new Point (100,105) ; tb. Size=new Size (200,22) ; tb.Maximum=255;

tb.Minimum=O;

tb.ValueChanged+=

new EventHandler (On Track) ;

99: 100:

101: this.Controls.Add(tb);

102: }

103:

104: static void Main ( )

I!J 384

PuAN III : Windows Forms

105: 106:

107: }

108: } 109: }

{

Application. Run (new Forml (»;

Bien dich file nay bang dong l~nh sau:

esc It: winexe colorspacel . cs

File nay v~ co ban gi6ng vdi vi du 3.5-10 trtr thanh truct (track bars) cho red, green, va blue da sli dung thay cho alpha. Ma trandircc thiet lap a dong 27· 29 d~ dieu chinh cuong do m6i kenh mau R, G va B rieng biet.

15. KET CHUONG

Co nhieu van d~ trong GDI+ can khao sat rna chuong nay co th~ len den hang tram trang nua, chung t6i nghi nhung gi a day se dem lai cho ban sl,f tin C~) de' thir nghiem sau han va se cho ban hieu h~u het nhung quy uac duqc yeu cil.l chuyen tiep tU GDl cu rna ban biet va yeu thtch co kha nang ton tai ij GDl+ Chung ta se hoc tiep M kharn pha nhisu hon v~ ling dung Windows Forms trorq chuang sau "Nhirng ling dung CI,I the tren Windows Forms"

o

n

y U

g

Chuang 3.6

THljC HANH UNG Dl,JNG WINDOWS FORMS

Ctic vein d~ chinh se dUdc d~ cap den:

./ Sll dung thuoc tinh va doc tinh Attribute ./ Gidi thich zing dlfng FormPaint.exe

Phan nay ella giao trinh chung ta se hoc qua cac nen tang, til nhtrng yeu to C(J ban cua Windows Forms trri VI~C si't dung GDI+ trorig nhimg irng' dung cua ban, Trong chuang cuo], chung ta se khao sat ti mi khia canh tao nhung irng' dung val Windows Forms. Phan quan trong cua kien true .NET la kha nang cua inbi deli tuong e6 tM mo til chfnh n6 va cho ban truy su6t nhirng thuoc tinh cua n6. Kha nang nay co thg duoc si't dung trong chinh nhilng chuang trinh cua ban d&giup do ngliai su dung va cung cap mot giao di~n rii rang nhat quan.

Trong nhimg narn gan day, cac M dif!u hanh Windows dii gia tangviae si't dung thuoc tinh (property). Theo each thong. thttlmg th) ban co th~ nhap chuot phai tren muc chon va chen nhirng thuoc tinh til menu ngu canh. Thong thuong ngoJC1i l~p trinh ho tri Iai thuoc tinh M thong cho rnoi o.ffig dung thong qua hop hoi thoai hay cira 56. Gia day, .NET cung cap mot phuong phap C(J ban cho viec tao va sa dung nhtrng thuoc tinh giao tiep duoc chuan hoa ..

1. SU Dl,JNG THUQC TINH

Lap don gian duoc hign thj trong vi du 3.6-1

Vi du 3.6-1 LO'p Sim leObject

1: Public class SimpleObject 2: {

3: pri vate int _int;

4: private string _string;

5: pri vate Color _color;

6:

7: public SimpleObject ()

8: {

9: 1/

10: II Khoi d¢ng bi~n 0 da.y.

11: 1/

12: }

13:

I!J 386

PHAN III : Windows Form

14 : 15: 16: 17 : 18: 19: 20: 21: 22: 23: 24: 25: 26: 27 : 28: 29.:

public int The Integer {

get {

return _inti

}

set

{

_int == value;

}

}

public string TheString {

get {

30: return _string;

31: }

32: set

33: {

34: _string == value;

35: }

36: }

37:

38: PUblic' Color TheColor 39: {

40: get

41: {

42: return _color;

43: }

44: set

45: {

46: _color = value;

47: }

48: } 49: }

;CHlJONG 3-6: 'I'huc hanh U'ng dung Windows Forms

387\MJ

Ban co thEl tha'y rAng lap tren co 3 thanh vien di1 lieu cue bQ " _int, _string, 301or, Co 3 phuong thirc toan cue truy xuat nhi1ng thuoc tinh - Thelnteger, TheString, va TheColor. Day la mQt ke' hoach thiet ke tot bai vi no co L~p vi~c dong goi dcr lieu va no dua ra mQt giao tiep ro rang va khOng rna M,

Vit;\c slt dung dili tllqng (object) cua chung ta trong ltng dung thikha dun gian, Sau day la nhung buoc tuan tu tao ltng dung C# thong qua Visual Studio .NET.

Chu j .. MOt trong nluing thunli pluin giao dien. (component) huu dung nluit irong h¢p cong CIf (toolbox) La dr'fi tuong khung luai tliuoc tinh. (grid) - Mgc dinh. thi thu¢c tinli nay kh6ng h.ien thi, bon. pluii them n6 UCLO bring tay. Df/ ctjp nhtjl h¢p cong cu, nluip pluii chuot trim no vii chon. Customize Toolbox, ban se thay h¢p h¢i thoai hie" tlii nltu hinh. 3.6·1.

Durii .NET Framework Components tab, chon PropertyGrid

System.Wlndows.Forms Sys-eem.wrdows.fol'rrtS (1.0.2411.0)

System,Web,UI,WebCootrcb 5y~tom,Web (l.0.2411 ,0)

~-osoft. Visual6ask:.ComP .. , ~rosott.llisu~Bi:lsic, Compd;it:dty (7.0 ...

Svstem.web.tn. WebControis Sy:;:eem,Web (l.O.2411.0)

System. Web.u1. WebContrds

Hinh 3.6-1 H¢p cong c~ Customize (Customize Toolbox)

Del dua mot thanh phan di~u khien vao tffig dung, ta phai lam nhi1ng buac

sau:

r. Keo ListBox.tlt hOp eong C\I tha len tren form. Dlj,t thuQc tinh Dock cua no thanh Left.

2, Keo Splitter tlt hQp cong cu tha Len tren form, no se tl,i dQng gil:n vao canh ben phai nha"t cua ListBox.

3, Keo dieu khien (control) PropertyGrid vao form va d1!-t no VaG ben phai cua thanh Splitter. Dlj,t thuQc tinh Dock cua no thanh Fill.

4, Keo MainMenu len tren form va dlj,t n6 trenfhanh cong C1,l (toolbar), dij,t ten no la Object va d~t ten cho muc menu dau tien La New.

Tai thai diilm nay, ban nen co mQt form gi6ng nhu hmh 3.6-2

~388

pHAN III: Windows Forms

Htnh 3.6·2 Form Object mal u~a tao u6i ListBox, Splitter, va PropertyGrid Chon du an trong ci'ta s6 Solution Explorer. Nhap chuot phai tren no va chon Add New Item. Chon C# class - dugc chi ra bdi bieu tugng sau :

Class

Tao ra lop Simple Object, nhu trong vi du 3.6-1. Bao dam sao lai mi)t each chinh xac noi dung rna nguon.

Bay gic'J, them vao mot bi) xaly (handler) cho Object, muc menu New, nba'p chuot 2 Ian tren muc menu New trong form thiet ke . Visual Studio .NET se dua vao bi,} xli ly (handler) cho ban, Di~n rna VaG bi) xU'ly nhu duQ'c hi8'n thi trong vi du 3.6·2

Vi dl,l 3.6·2 B(> xu I ' Object Mpnu

1: aprivate void menultem2_Click (object sender I

System. EventArgs e) 2: {

3: SimpleObject 0 = new SimpleObject () i 4: this.listBoxl.ltems.Add(o);

5: }

Cu6i cling, tao ra bi) xi't Iy cho ListBox.

Chon ListBox trong form thie't ke', sau d6 chon billu tircng su kien (Event) trong Property Browser, va nhap chuot 2 Ian tren muc selectedIndexChanged.

IS

manh.

CHudNG 3·6: Thvc hanh ling dung Windows Forms

3891Ml

MQt bln nua ban se thay Visual Studio .NET se them vao bQ xli ly cho ban, Dua rna vao bQ xa ly nhir vi du 3.6-3.

Vi du 3.6-3 Bo xii' ly SelectedlndexChanged

1: pri vate void listBoxl~SelectedlndexChange (

object sender, System_EventArgs e)

2: {

3: this. ptopertyGridl. SelectedObj ect = this.listBoxl.Selectedltem;

4: }

Bay gia, chung ta sAn sang chay chuang trinh. Nhan phirn 1"5 va dQ'i cho viec bien dich hoan tii't.

Ban co tM them nhieu SimpleObject vao Listbox bang viec sa dung muc menu. Sau khi them vao, chon rnuc menu trong Iistbox se hiii'n th] nhieu thuoc tinh trong dieu khien PropertyGrid. Chu y PropertyGrid se giiip ban trong viec soan thao nhirng thuQe tinh nhu th€ nao, ThuQc tinh mau duQ'c chung ta dac biet quan Lam den, bdi vi no se cho phep ban chon W bang mau, vao mot ten mau da biet (vi du, mau do (Red)] hoac danh vao nhung gia tr] riang bi¢t cho mau do (90), mau xanh 180 cay( 180), mau xanh(240) nhu hinh 3.6-3

. ~ Object

New

ch

ap va d\l



i :

fil~' ~~I ~ If. .. -

1r'~:;;:;L~~-;-iS7-c------" ................... ---"""-. !(._~ __ ~~l,I!9.I!l.~'!= ._._J

II 111 •••••••

I Thelnteger • • •••• • •

Thestring •• III II ......

I .aa •••••

I .00 tJO'trn 90

I

I

i

1

Hinh 3.6·3 Ung dung Property Browser.

Doi vdi 1 so luong cong viec nho nhu vay, qua thuc day 18. mQt irng dung

~390

PHAN III : Windows Forms

2. NANG CAP THUQC TINH EXPERIENCE

N€u ban nhln cilnthlj,n trong hinh 3.6-3 Ban se nhin thay 2 dieu 1I.IU y dlfg~ cung cilp biri Framework v!lPropertyGrid. BAu WIn, hop feedback tai day cu~ PrapertyGrid co van ban trong no. Day la thong tin phan Mi giup do nginri s~ dung hi~u vi(\c ho dang lam. Thtr hai , danh sach cua nhung thuoc tinh trong khung duoc nhorn vao mQt phan loai goi la Misc. Neu ban nhln van VS.NET hoac nhirng (tng dung Windows Forms khac, ban se thay nhung loai khac nhu Behavior hoae Appearance.

Ban c6 th~ sap xep cac thuoc tinh ella ban thea phan loai va lam cha chung cung cap nhfrng thong tin phan Mi bang each sii dung nhung thong tin co san duoc cung cap b&i Framework. Nhirng lap dac thu si't dung la Category Attribute va Description Attribute. Khi sii dung chung trong doan rna cua ban, ten duoc viet ngAn Ia Category hay Description. Trtnh bien dich (compiler) se them phi\n I Attribute cho ban.

Chung ta hay xern Iai lap simp1eObject 1 lfin nua. Doan mii. sau hi en thi nhung dac ttnh (attribute) duoc them vao 1 trong nhtrng thuoc tinh (Property).

[Category( "Appearance")]

(Description{ "controls the color of your moods")] public Color TheColor

{

get {

return _color;

} set

{

_color = value i

}

Khi thuQc tinh nay duqc xem trong PropertyGrid, no se thuoc v~ phan loai Appearance, va viec mo ta se diroc hien thi trong 0 feedback tai day cua ~j. PropertyGrid. !

Lap cung co th€ co nhung l1~c tinh giup ban xay dung PrapertyGrid. [DefaultProperty("propertyname")] se chon nhtrng thuoc tinh nao hi€n thi d§.u tien trong Property Grid. Vi du : hay xem 'dong 12 cua vi du 3.6-4

-?:~...G"~<'.J';:.~~-

~ -CC_-"'~_-=~~:;;;''''-_

18'

31: 32 : 33: 34: 35: 36:

CHudNG 3·6: 'I'huc hanh Ung dung Windows Forms

391~

3: using System. Drawing. Drawing2D; 4:usingSystem.wondows.Forms.Design~ 5: using System. ComponentModel;

6:

7: namespace simpleprops ad

9: / / / <summary>

10: 11: 12: 13: 14: 15:

/ / / summary description for SimpleObject / / / < / summary> [DefaultProperty{"TheInteger")]

public class Simp1eObject

private int _intI

16: private string _string;

17: private Color _color;

18:

19: public SimpleObject ()

20:

21: / /

22: / /Kh6i d9n9 bien 6 dAy.

23: II

24: }

25:

26:

~i 6

[Category { "Nothing Special") 1 [Description ("Yes guy 's' n gal's, its an integer") ]

29: public int Thelnteger

27: 28:

d. 30:

in



get {

return _int;

}

set

Ilj 392

_int = value;

37: 38:

39: }

40:

PHAN III : Windows Fonili

}

41: [Category( "A peice of string")]

42: [Description( "This string does absolutely

nothing but tie up your time") 1

43: public int 'l'heString

44:

45: 46: 47: 48: 49: 50:

get

return _string;

set

{

51: _string = value;

52: }

53: }

54:

55: [Category( "Appearance") 1

5 6 : [Description (" controls the color of

your moods" ) ]

57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67: .
68: }
69: } public int TheString

get

return _color;

}

set

color = value;

}

rili

CHUdNG 3·6: 'I'huc hanh ung dung Windows Forms

393~

Nhung d~c tinh attribute cung co thg ngan can kha nang nhin thay cua thuQc tinh trong khung. Dieu nay kha hcru dung neu ban khai baa thuoc tfnh toan cue (public) cho nguoi lap trinh nhirng gift no ttl ngiroi SLt dung. Dg lam di~u nay, ta sl1' dung dac tinh [Browsablerfalsej].

Nhung dac tinh attribute khac cho cac thuoc tinh chi luru dung neu ban dang vie't nhtrng thanh phan dieu khien (cantrall duqc dung trong moi truong thie't ke, nhu la VS.NET.

3. GIAI THicH UNG Dl}NG : FORMPAINT.EXE

Ung dung nay ket hop nhieu yeu to ca ban lai voi nhau, chung toi se huong d~n ban xay dung n6 va se trmh bay mot vai tinh nang cua Windows Forms trong 1 U"ng dung ngft canh d~y duo

Form Paint la mQt Ung dung giao tiep da tai Ii lim (Multi Document Interface) MDI cho phep ban ve nhftng hinh anh veri C9 vi;! (brush) va cac dang hmh h9C (shape). No co nhftng menu tuy bien (customize) va cung minh hoa kha nang lam viec ella GDI+.

PhAn 1 : Khung Framework cd ban

BAt d~u, tao mQt rrng dung trong VS.NET va ngay dat thuoc tinh [sNDIContainer cua form bang true Thao tac nay khien cho form lam etta s6 cha cho nhirng form co sa duoc giu trong n6.

Ten Formi phai duoc d6i thanh MainForm va t.ieu de cua cira siS d6i thanh FormPaint. Nh6" ding khi ten cua MainForm thay doi , thl ban cung phai thay d6i bang tay phuong thirc ttnh Main nhir sau:

[STAThread]

static void Main ( ) C

Application. Run (new MainForm( »; / / d6i ten ung dl,lng

}

Keo MainMenu W hop cong CI,I len tren Main Form, Danh VaG W &File nhu ten menu va them VaG 3 muc menu la &New, &Open va &Exit.

Keo OpenFileDialog va SaveFileDialog tU hop cong C\I tha len tren MainForm. OpenFileDialog va Savcf'ilclfialog se xuat hien trong khay bigu tucng (icon tray) du{ii form.

Nhap d6i chuot len muc menu Open trong menu chinh va danh doan rna sau VaG b¢ xli Iy :

This.openFiledialogl.Filter = "Bitmap flles(*.BMP) I*.bmp";

I!!J 394

PHAN III : Windows Forn

This.openFileDialogl.ShowDialog();

Tao ra mot menu thir hai goi la Windows. Menu nay dung M thea doi nhin form can MDI trong ling dung, Bi~u nay dlfqc lam tv dqng cho ban neu ban d: thuoc tinh MDIList cua menu Mng true.

Budc ke tiep, them van 1 cira s6 form moi vao du an (project) , g9i no Child Form. Dat BackColor bang' green.

Them mot bien cue bQ goi la myImage kieu Image vao form can va m phirong thuc truy xuat toan C1,lC nhu sau :

private Image myImage; public Image Image

{

set {myImage = value;} get { ret urn myIrnage i }

}

Bay gio; nhap chuot doi len OpenFileDialog trong khay bieu tuong ben dL1 form. Hanh dong nay se tao ra bQ xu Iy FileOK cho ban, Danh doan rna sau vao I xu ly :

Chi 1 dForm c = new Chi 1 dForm ( ) ;

c.MdiParent == this;

c. Image = Image.FromFile(this.openFileDialogl.Filenarne); c. Text = this. openFileDialogl. FileName; c.Show() ;

Nhi1ng thao tac trong doan ma tren se me t~p tin, tao ra mQt form can, 1 tai anh V,01O form con. Form con bay giu can hien th] anh, Chon ChildForm trot trang thiet ke, nhap chuot tren nut nhan Events trong Property Browser, va nhi d6i chuot len sV kien Paint. Thao tac nay tao ra rna hmh chuyen giao (delegat PaintEventHandler eho ChildForm va rnd trtnh soan thao Code Editor. Danh do~ rna sau vao bQ xU'IY.

e.Graphics.DrawIrnage(myImage,Q,Q, myImage.Width,myImage.Height);

Bay 1:3. noi tot nhat de ngirng va danh gill. du an. Dich va chay chtrong trir bAng each nhan phim F5. Ban se thay ung dung tai va hien thi hlnh anh trot nhieu cua so. Hinh :3.6-4 h ien th] ling dung nay.

Phlin 2 : CUQn cda 56 va tao ra nhtrng htnh moi

Neu ban chay chuang trinh FormPaint va tai len vai hinh anh, ban chu nhung cua s6 se thay doi kich thunc. Nhung, khi nhung cira s6 nay tro nen ql nho de' hien thi hinh anh, don gian nhung cira so se cat dlrt hrnh anh rna khoi

CHudNG 3·6: Thuc hanh ling dung Windows Forms

395~

dua cho ban C(/ hQi dil nhin thay nhrrng phan con lai bi che hi canh ctia s6 chinh tro di, Chung ta sEl sua van d~ nay m9t each nhanh ch6ng bAng each them doan rna dan gian sau vao ChildForm.

Hinh 3.6·4 (fng dung co ban MDI.

BAu tien, trong thuoc tinh Image di).t bl) truy xuAt (accessor) cho ChildForrn, chung ta se them mot l~nh d€ dat thuoc tirih AutoScrollMinSize Mug kich thUGC cua hinh trong bien mylmage. Doan rna sau chi each them vao chirc nang nay (dong 6).

1: public Image Image 2: {

3 : 4:

set {

5: myImage = value;

6: this.AutoScrollMinSize = myImage.Size;

7: }

8: get { return myIrnage;} 9: }

Bay gio, ba't cd' khi nao kich tbuoc hlnh chu nhi)t cua viing client bj giilm duai kich thu6'c nho uh:ft trong m6i huang, thi thanh cudn umng ling xuat hi~n.

~396

PuAN III : Windows Forlll4

Thu hai, viec thay d6i phai tao cho bQ xu Ii OnPaint xac dinh vi trl CU~ nhung thanh cuon. a day, chung ta can xac dinh vi tri tuong deli cua hinh bang gi4 tr] cua vi tri thanh cuon, vi vay hinh se duoc ve ra rnQt each chinh xac, Form cuna cung cap thuoc tinh vi trf thanh cuon dUQ"c hien thi trong doan rna sau :

1: private void Chi1dForm_Paint (object sender,' System. Windows. Forms. PaintEventArgs e)

2: {

3: e. Graphics. Drawlmage (mylmgae,

4: this.AutoScrollPosition.x,

5: this.AutoScrollPosition.y,

6: mylmage.Width,

7: mylmage. Heightd) ;

B: }

Tren dong 4 va 5, ban co thE'! nhin thay nhU"ng gia trj X va Y cua thuoc tin] AutoScrollPosition cua form Iii vi to bAt dau cua anh,

Cho den bay gii1 chuang trinh chl co the tai ll1Qtanh t6n tal tren dra. Churn ta can tao rnQt anh, bAng kich thll6c anh duoc chon, va cho phep anh do dliqc lu xuong dia.

Viec tao anh co the thirc hien nhu sau: sil dung trang thiet ke MainForm chon va nhap doi chuot tren muc menu New trong menu File. Thao tac nay S< sinh ra bQ xii If (handler) rna chung ta se di,§n rna vao sau.

Bay gio, nhan phai chuot tren du an FormPaint va chon Add New Iterr Chon mot form mrri va goi no la NewlmageDialog.cs. Keo 3 nut chon (Radi button) va 2 nut nhan (button) W hQp cong CI,I (toolbox) len tren hQp hQi thoai, Sa do sAp xep chung nhu hinh 3.6·5.

q



: r: 800'SOO

- - ... ,,'

. • '." • :~ ,,; . 0' ,=.' •

OK

: r: 1024"768

Cancel"

Hinh 3.6-5 Nut nluin. sdp xep tren h{)p h{)i thoai

Thuoc tinh DiaJogResult eua nut OK va Cancel phai di).t ban DialogResult.OK va DialogResult.Cancel rieng tung cai, Dti lay th6ng tin cai cat t nhirng nut chon, chung ta co th~ them van mQt thuoc tinh dan gian tra v,§ kic thuoc. Soan thao bi'tng tay doan mil. ella t~p tin NewlmageDialog.cs va them va thuec tinh toan CI,lC sau :

J u

s li

h

o

CHUONG 3·6: 'I'hirc hanh ling dung Windows Forms

397~

public Size ImageSize {

get {

if (this.radioButton2.Checked) return new Size (800,600) i

if (this.radioButton3.Checked) return new Size (1024,768) ; return new Size (640,480) j

Bay gia chung ta c6 the quay lai hi} xli Iy da tao ra tntoc day va dien rna van n6 de tao ra anh rClng. Tim hi} xli 1.9 trong tap tin MainForm.cs va them vao nhung rna can thie't sau:

1: private void menultem2_Click(object sender, System. EventArgs e)

2: { 3:

4 :

5 : 6:

7 :

8 :

9 :

/ / Tc;to ra t~p tin m6i ...

NewImageDiaIog dIg = new NewImageDiaIog ( ) ; if (dIg. ShowDialog () == DiaIogResult. OK)

{

ChiIdForm c = new ChiIdForm(); c • MdiParent = this;

c. Image = new Bitmap (dIg. ImageSize .Width, dlg.ImageSize.Height); Graphi c s g = Graphi c s . Fromlmage ( c . Image) ; g~FillRectangle(new SolidBrush(Color.White),O,O,

c.lmage.Width,c.Image.Height); c.Show() ;

10 : 11:

12: 13 : 14:

}

}

Them. vao chuc nang hm t;lp tin

Viec IIiU tap tin (Save) hay la hru nhu tap tin khac (Save As) se duoc thuc hien thong qua menu chinh File. Ban them vao muc chon menu Save va Save As, NM sli dung ky hieu "&" trttoc nhtrng ky tl,l chinh - Vi du: &Save va Save &As. Doi vai nhtrng ly do thiirn my, ban co the muon di)"i nhl1ng muc chon menu vao nci d~ nhan thay tren menu va dua mot thanh phan each giira nhtrng chuc nang cua File va Exit.

Khi ban tao ra nhung muc nay, tie'p tuc Hin lLiqt nhap d6i chuot cho rn6i muc de tao ra nhung hi} xli Iy eho chung, Dean mil sau hien t.hi 2 bi} xu ly luu tij."p tin.

.i&lj398

pHAN III: Windows Forms

1: private void menuItem6_Click(object sender, Sys tern. EventArgs e)

2: {

3: / / Liru t~p tin anh .

4: ChildForm child = (ChildForm) this .ActiveMdiChildi 5: child. Image. Save (child. Text ) ;

6: }

7 :

8: private void menuItem7_Click(object sender,

System. EventArgs e) 9: {

10: / / Ltru t~p tin arih ra mQt t~p tin khao

11: ChildForm child ;;;

(ChildForm)this.ActiveMdiChild;

12: this.saveFileDialogl.FileName = child.Text;

13: if (this. saveFileDialogl.ShowDialog()

DialogResult.OK)

14: {

15: child. Image.Save(

this.saveFileDialog1.FileName);

16: child.Text = this.saveFileDialog1.FileName;

17: }

18: }

Ti1 dong 1 tdi dong 6 la be? xi't ly hill t(ip tin dan gian. Ten t~p tin da dune biet, vi vi),y viec luu tap tin diroc thuc hisn bang' each si't dung van ban: cua thanh tieu eM ChildForm.

Tu dong 13 tdi dong 18 ta si't dung ten ti.iP, tin tra v~ tU Uri trieu goi SaveFileDialog (h{ip thoai SaveFileDialog cho phep nguai si':i dung chon ten ti),p tin mrii df luu file).

Hanh vi nay tot niu ban co the baa dam ri1ng ChiIdForm luon lu6n rna. Neu ban sli dung xir ly tren mot form chinh ding, tht mi)t ngnai I~ (exception) se xay ra bO'i kh6ng eo cira 56 con MDT hoat di)ng (active). Van de nay co thii' khac phuc bang mot trong hai each. Hoac la viet rna xli ly ngoai 1~, si':i dung khrii try ... catch vao trong 2 bi) xir ly hoac, kh6ng bao gia cho phep be? xii ly ducc g9i neu kh6ng co cua s6 can MDI. Phuong phap thu 2 kha tot cho trudng hcp cua ta bdi no cho phep chung ta sli dung nhung su kien menu popup 1 each chinh xac.

d chuang 3.1 "Gidi Thieu Windows Forms", ban da h9C sl! kien menu popup duqc kich hoat khi nguci sli dung chon menu a mire cao tren thanh ding c~ (toolbar) truck khi menu dU'qc ve. Ditm nay dua cho chung ta ca hi)i sua d6i hanh vi menu phu hop vdi nhtrng hoan canh hian hanh. Doan rna sau hilln thj bi) xli ly Popup cho muc menu File.

1 : private void menuIteml_Popup (obj ect sender, System. EventArgs e)

u a

CHUONG 3-6: 'I'huc hanh ling dung Windows Forms

399~

.S

2: {

3: if (this.MdiChildren.Length != 0)

4: {

5: menultem6 . Enabled = true;

6: menultem7 . Enabled = true;

7: }

8: else 9: {

10: menultem6. Enabled = false;

11: menultem7 . Enabled = false;

12: }

13: }

Tai dong 3, bq xu ly kiern tra xern form chinh co cira s6 con nao khong. Neu co, thi no se cho phep st't dung rnuc menu Save (tai dong 5 va 6). N~u khong co bilt ky cira s5 con nao, no khong cho phep hay vo hieu hoa (disable) nhirng muc menu nay (dong 10 va 11) .

Phdn 3 ; Giao di~n (User Interface).

Vai viec tai anh, hi.:\n thi, va luu anh vao mot nci, chung ta co th.:\ xuc tie'n cong' viec them vao phan con lai nhirng muc giao dien rna se duqc sil dung M chay chuong trmh, Chung ta can mot bang cong CI,I (palette tool); trong trui'rng hop TIllY, bang cong' CL,I don gian se du giai thich nhtrng y~u to' Co' ban, thanh trang thai

'c (status bar), xu ly chuot, va ldp nut nhan tuy bien (custom control) duoc dan xuat

h tren UserControl.

Tao ra mQt Custom User Control

)1.

h o p

M(jt thuan ti~n quan trong cua nhung user control trong .NET 18. tinh de sti" dung lai cua chung. Nhung control nay duqc chay trong m6i trui'rng thie't k~ va co tM duqc ban nhu nhiJ'ng b(j phan Hlp rap neu ban muon.

D€! them vao du an thu vi~n mc;.t control C# moi. Ban chon nut Add to Current Solution tren h(jp hQi thoai wizard. D~t ten du an la FormPaintControl. Ban se diroc dua ra voi mi;lt wizard de chon ki.:\u control them vao. Chon UserControl moi va d~t ten no 18. Customlmagebutton.cs.

Vi du 3.6·5 hiii'n thi dil.y du rna nguon cua CustomImageButton control.

n

p

Vi du 3.6·5 CustomlmageButton.cs : L6"p CustomlmageButton

1,1 rj

1; using System;

2: using System.Collections;

3: using Syatem.ComponentModel; 4; using System. Drawing;

5: using System.Drawing.Drawing2D; 6: using System. Data;

~400

pHAN III : Windows Forms

7: using System.Wondows .Forms;

B: using System. Drawing. Imaging i 9 :

10: namespace FormPaintControl 11: {

12: III <summary>

13: III Summary description for CustomImageButton. 14: III </summary>

15: public class CustomlmageButton :

System.Windows.Forms.UserControl

16: {
17 :
18:
19:
20:
21:
22:
23:
24:
25:
26:
27 :
2B:
29:
30:
31:
32:
33:
34: private Image image;

private Color transparentColor; private bool ownerDrawi

private bool down;

Category( "Behavior"} ,

Description ( "Allows external paint delegates to draw he control t1 )

public bool OwnerDraw {

get

return ownerDraw;

}

set {

ownerDraw = value;

35: } 36:} 37 : 38:

39: Category ( "Appearance") ,

4 0: Description ( "The image displayed on the control" ) 41:

42: public bool Image 43: {

cHlfdNG 3-6: Thuc hanh U"ng dung Windows Forms

40111J

44: get

45:

46: return image;

47: }

48: set

49: {

50: image = value;

51: }

52 :

53:

54 :

55: Category ( "Appearance"),

56: Description ( "The transparent color used in the image")

57 :

58: public bool TransparentColor 59:

60: get

61:

62: return transparentColor;

63: }

64: set

65: {

66: transparent Color = value;

67: }

68: } 69:

70: protected override void OnSizeChanged(EventArgs e} 71:

72: if (DesignMode)

73: Invalidate();

74: base.OnSizeChanged(e);

75: }

76:

77: public void DrawFocusRect (Graphics g) 78: {

79: Pen p = new Pen (Color. Black, l) ;

g.DrawRectangle(p,rc);

~ 402 PuAN III • Windows FOflDll

80: p. DashStyle = DashStyle. Dash;

81: Rectangle rc = ClientRectangle;

82: rc.Inflate(-l,-l);

83: 84: }

85:

86: protected override void OnLostFocus (EventArgs e)

. ~

87: {

88: Invalidate();

89: Base.OnLostFocus(e);

90: }

91:

92: protected override void OnPaint (PaintEventArgs e) 93: {

94: 95: 96:

Rectangle rc = ClientRectangle; rc.offset(4,4); e.Graphics.SetClip(ClientRectangle);

97: if(!ownerDraw)

98 : 99: 100: 101: 102:

103:

104: 105:

106:

107: 108:

109: 110: 111:

112:

{

if {image == null II ! (image is Bitmap» {

Pen p = new Pen (Color .Red, 2); e.Graphics.DrawRectangle(p, ClientRectangle};

e.Graphics.DrawLine(p, ClientRectangle.Location.X,

ClientRectangle.Location.Y, ClientRectangle. Location. X + ClientRectangle.width,

ClientRectangle. Location. Y +

ClientREctangle.Height)i

e.Graphics.DrawLine(p, ClientRectangle.Location.X + ClientRectangle.Width, ClientRectangle.Location.Y, ClientRect~ngle.Location,x, ClientRectangle.Location.Y+

ClientREctangle.Height)i

1 1

return;

CHudNG 3-6: Thirc hanh ling dung Windows Forms

403~

113 :
114 :
115 :
116:
117 :
118:
119:
120 :
121 :
122 :
123 ;
124:
125:
126:
127 :
128 :
129 :
130:
131:
132:
133 :
134 :
135 :
136 : }
137 : }

Bimap bm '" (Bitmap) image i bm.MakeTransparent(transparentColor)i if (da:wn I I Focused)

{

e.Graphics_DrawImage(bm, rc.Location_X, rc.Location.Y, bm_Width,bm.Height)i

if (Focused)

DrawFocosRect(e.Graphics);

} else

ControlPaint.DrawImageDisabled( e.Graphics, bm, rc.Location.X,rc.Location.Y,BackColor); e.Graphics. DrawImage (bm, ClientRectangle.Location.X, ClientRectangle.Location.Y,

bm.Width, bm.Height);

}

base.OnPaint(e};

138: I I I <summary>

139: I I I Required designer variable

140: III </summary>

141 : private System. ComponentModel . Container components", nulls;

142:

143: public CustomImageButton(} 144: {

145:

146: InitializeComponent (); 147 :

148: I IThem cac kh6i d¢ng knac sau khi g9i InitForm

~404

PHAN III : Windows FOI

149: 150: } 151:

152: protected override void OnMouseEnter (EventArgs e) 153:{

154:
155:
156:
157: }
158: base.OnMouseEnter(e); down = true; Invalidate{);

159: protected override void OnMouseLeave (EventArgs e) 160: {

161:
162:
163:
164: }
165:
166: base.OnMouseLeave(e); down = false; Invalidate();

167: Browser{true);

168: DesignerSerializationVisibiiity(

DesignerSerializationVisibility.Visible) 169: ]

170: public override string Text 171: {

172:
173 :
174 :
175:
176 :
177:
178:
179:
180: }
181: get

return base. Text;

}

set

{

base.Text = value;

}

182: / / / <summary>

183: / / I Clean up any resource being used. 184: / II </summary>

185: protected override void Dispose (bool disposing)

ms

203:
204 :
205:
206:
207:
20B:
209:
210:
211: }
212: } cauoxc 3-6: 'I'huc hanh irng dung Windows Forms

405~

186: {
187 :
188:
IB9 :
190:
191:
192:
193: }
194: if (disposing) {

if (components!::: null) components.Dispose();

} base.Dispose(disposing);

195: #region Component Designer generated code 196: / / I <summary>

197: / II Required method for Designer support - do not

modify

19B: II/the contents of this method of the code editor. 199: J / I </summary>

200: private void IhitializeComponent ()

201: {

202; /I

/ I CustomImageBu.tton 1/

this . Name ::: "CustomImageButton";

this.Size = new System.Drawing.Size(64, 56);

} #endregion

B:it d<lu vci dong 1, chung ta them vito viec sU' dung nhirng khong gian ten (namespace) cho cac di~u khien (mac dinh chi c6 khong gian ti'm System duQ'C 811 dung).

Dong 10 dinh nghta khbng' gian ten FormPaintControl, dong 15 bAt dAu khai bao lap Customlrnagebutton.

TU' dong 17 Wi dong 20 dinh nghi:a nhirng bien da Iieu thanh vien CI,lC bi) df luu thOng tin sli dung trong viec ve dieu khien control. C6 mi?t bien da lieu thanh viiln image kifu Image, mQt bien da li~u thanh vien transparent'Color kifu Color, hai ca kieu bool cho thuQc tinh ownerDraw va trang thai cua nutnhan la chrm xu6ng hay ndi len (down hay up).

{Ij 406

pHAN III i Windows Ferns

Phuong thuc truy xudt toan C1,lC nhung thuoc ttnh cho nhirng thanh vien lien quan bao dam control se tich hop voi moi trucng thie't ke' va dua ra thong tin phan h5i cho nguai Sl! dung, Chu f nhung di).c tinh Category vii Description co tnfllc thuoc tinh dinh nghla tren nhung dong 26, 42, vii 58.

Dong 70 dinh nghta phuong tlurc OnSizeChanged. Khi control nay dLi9'c su dung trong thie't ke', n6 can ve lai chinh no ba"t cli khi nao kich thuoc ella n6 hi thay d6i. No cling goi phuong thtrc tu ldp co sd di! baa dam rang ba"t ky nhirng mil hinh chuyen giao (delegate) khac duoc them vao Sl,( kien SizeChanged cling se dl1gc g9i.

Dong 77 dinh nghta phuorig thuc rnoi, phuong thuc nay ve mQt dmrng' nhie~ cham (dotted line) xung quanh control khi no nhan duoc tac dQng cua phim hay chuot (con goi Iii focus). Phuong thuc nay dLiqc goi tl1 phuong that OnPaint.

Phuong thirc tren dong 86 bao dam control diroc ve Iai khi trang thai focus bi mat.

Phuong thuc OnPaint, bat dau tai dong 92 phai tranh gianh vci viec ve btnh thuong cua control va viec ve control khi no duc;1c sli dung trong moi trLiang thiet ke'. Dieu nay co nghia Iii trong th~' hien (instance) ban ddu, control se duqc phat minh bdi nguO'i thiet ke' vdi thuoc tmh image rbng. VI vay nhung ngoai l~ (exception) se khong xay ra, control se ve hmh chir nhat mau do vci hmh chl1 th~p mau do trong n6 neu khOng c6 hinh d4 ve. lJi~u nay dLiqc thuc hi~n tren nhil'ng dong tl1 102 tdi 122. N6i each khac, viec ve di~n ra blnh thiarng tren dong llB tm 123 neu nut nhan b] hin xu6ng hay nhan dliqc focus.

Dong ttt 127 Wi 132 ve nut nhan trong vi tri loi len cua n6. ChU y vi~c s~ , dung phuong thtrc ControlPaint tren nhirng dong 127 va 128 M ve mQt hmh bi m~ dang sau anh bitmap chinh nhu la anh mo. Phuong thuc nay cling goi phucng thac err sO- (base) OnPaint d~ bao dam viec va chinh xac khi bi) xli If ve khac diroc them vao sLf ki$n Paint.

Control chuan diroc them vao tat ca nhung dong tU 138 tdi 150, vii chung ta tiep tuc them nhung bi) xl! ly MouseEnter va MouseLeave tren nhirng dong 152 v~ 159. Nhi1ng dong nay lam cho nut nhan a'n xuong bitt eli khi nao chuot lLiat di tren n6.

Tren dong 167, c6 mot dac tinh attribute cho phep thuoc tinh Text dl1qe. nhm thay trong Property Browser. UserControl tir lap nay diroc dan xuat ;:in thu~( tinh, vi vay chUng ta clin dinh nghia chong (override) len no (dong 170 - 180)'va lam cho n6 co th~ nhin thay duoc trong khung nhin. Tren dong 169, di;\t tinll DesignerSerializationVisibility bao dam van ban duoc luu trong phuong tMe InitializeComponent.

Phan con lai cua tap tin 1.3. rae duoc du'a van bdi control wizard va bao g6m phinrng thrrc Dispose va phuong thuc InitializeComponent.

1\ o

'C

CHu'dNGS.6: 'I'hue hanh (mg dung Windows Forms

40711j

Dich control va sau do nhan phai chuot trim hop cong CI,I (toolbox) chon CustomizeToolbox va va banse nhin thay hQp hQi thoai dl1q'c hien thi trong hinh

j: 3.6-6.

u

y

IS

h )'t it l~ .p Ig fi

La lc m

rn

DProce"Thread

&:I Progress6« SY5tem.Windows.forms

fa

fa R1!dioButtOh SY5tem,Wir\d>w>,Forms

fa RadioButtOh System. Web.L1l. WebControis

o RadioButtonArr.ay Mic.rQSOft . ...,isualB~sic.COn'lp.<,

fa RadioButtohust System,Web.lJI. WebControis

fa RMlgeVoI,dotor System.Web.U], WebCont,,*,

Il1l Regul ... Expre"iohV" ' System, Wob.Ul. webControi.

Sy.tem.wind<l ws. Form«10,2411.0) Sy~""w.b (1.0,241 1.0)

Mi,rosoft. '¥'islJoIBa.s,(, Compatibiity (7.0 ... 5y5t"",,Web (1.0.241 1 ,0)

5ySteM.Web (1.0.2411.0)

5ystem.Web (1.0,2411.0)

Htnh 3.6-6 Them control vera toolbox.

De nhin th1iy CustomlnageButton, d;iu tien ban phai tim t~p tin DLL dllqc dich. Tlj.p tin nay 0 trong :

<Ten du an cua ban> \

Formpain t \ FormP aintControl \Debug\Bin \F orrnpai ntCo n troLdll

Bao dam hep kiem tra (check box) phai dllqc danh dau va control se xuat hien trong hop cling CI,I (toolbox) cua ban,

Chuy:

Bati co thi lam control niiy nhu mst c{jng C,! lau ddi dl sit dung trong chuang trinli eua ban. nlu ban chuy~~n sang kilu Realease, dich. 19i control vii sou dO chon. phien. 9dn release cua FormPaintControl.dll. Ban ding co the' chep phi~n ban release niiy tUi mOt nai tren dia cting ciia bq.n, a noi niiy br;m chdc chiintg,p tin dll kh6lig bi x6a.

8u dung CustomlmageButton

im Them mot 6 Panel vao MainForm va gAn n6 vao canh ben phai cua form.

Khu vue nay dung de gii1 bang cOng cu dan gian cua chung tao Keo thanh trang thai (status bar) til hOp cling CI,I len tren form, chon cac khung Panel trong Property Browser, va nhsp chuot tren nut nhan khi combo box xuat hien,

~408

PHAN III: Windows For

Ban se thay mot hop thoai cho phep them vao met hay nhieu dIli tLl~ StatusBarPanel; cho de'"n bay gilt chung ta chi can them mot, NM di!.t nhung tlr tinh Show Panel cua deli tl!!lng StatusBar bang true.

Keo 4 deli tl!!lng CustomlmageControl len tran Panel va silp xB"p chung tl phuong thang dirng d~ tao ra 1 noi cho vi~c chon nhi1ng cong cu vii. Ban diu, I CustomlmageControl se hien thi nhu lit hinh chu nhat mau do vai dau chtl tl trong no.

Sil dung Property Browser, them vao cac hinh cho. thuQc tinh Image cua nhan. Chung ta chon hmh but VEl (paintbrush), hinh chu nhat, hinh Elip, hinh gom cho bang cong cu cua chung ta (tool pallete), Hinh 3.6-7 hi.!in th] 4 hmh n~

Hinh 3.6-7 Anh bitmap sri: dung cho nhilng nut nhan.

Khi 4 anh brush.bmp, rect.bmp, ellipse.bmp, vii. eraser.bmp dircc dira nhi1ng nut nhan cua chung, phuong thac Paint se hien thi chung cho chung ta, ch dang trong moi trunng thiet ke. CU'a s6 thiet ke form khi d6 se trong nhu hmh 3.

CustomlmageControl c6 the giu van ban (text) cho chung ta, vi vay chun c6 th.!i sil dung cotrol nay M tao ra giao dien (UI)' tich hop dan gian vii. err phan h5i thong tin (feedback). Chung ta se luu thong tin trong van ban (text chii giai nut nha"n vdi tooltips va thOng tin phan h6i tren thanh trang thai (st bar). Sau d6, chung ta sU' dung cung co che' phan h6i thong tin M nang cilr rQng menu.

Hinh 3.6-8 Bdng b6 tri thi€t hi eu6i cung eua MainForm.

ns

OHUdNG 3-6: Thuc hanh ang dung Windows Forms

409~

ng li}c

Thuoc ttnh Text cua 4 nut nhan se chua dung caption, tool tip, va status bar.

Chung duoc tach rai bdi m¢t thanh dang (ky tl,f 124). Vi du : dong sau day hien thi dinh dang cua thuQc tinh Text .

. eo lOi ij.p

Caption Text I Status Bar feedback I Tooltip text.

Lan hrot m6i thucc tmh Text, them VaG dong thich hqp stl dung Property Browser:

r.

CustomlmageButtonl. Text II I Apply color with a brush tool

I Paintbrush" CustomlmageButton1. Text 1/ I Draw a rectangle I Rectangle" CustomlmageButton1. Text II I Draw a ellipse I Ellipse" CustomlmageButton1. Text II I Eraser an area I Eraser"

Chit y : kh6ng co thuoc tinh Text mio CD pluin. caption, Mi vi text caption khong cdn thiit.

Status va Tooltips

'ao du ·8.

ta he' M

Tooltip dua cho ngu'ai s0 dung thong tin phan hOi hii'u dung va nhirng muc trong bang cong CI,l (tool pallete) cua chung ta co mot, van ban (text) duqc hi~n thj khi chuot di chuyen tren chung, VI vay chuang trtnh FormPaint sa dung met phircng thuc don gian d~ hi~n thi tooltip va van ban trong thanh trang thai (staus bar), Lqi dung kha nang cua I6"p String chung ta tach chu6i tai nhirng vi tri co ky tu ' I', chung ta co tM' tao ra mot lop dan gian, lap nay se lay tooltip, status bar va caption text cho cluing tao Them mot lap C# mci vao du an va dat ten no la CSTSplit.

Lap CSTSplit Ia lop dan gian va duoc hi~n thi trong vi du 3.6-6

.us no

Vi du 3.6,6 Lop CSTSplit,cs : Lop SCTSolit

1: using System; 2:

3: namespace FormatPaint 4: {

5: III <summary>

6: III CSTSplit divides up a given string into

7: III peices at a " I " delimiter to provide

8: 1// Caption, status, and Tooltip text. 9: /1/ .< I summary>

10: public class CSTSplit 11: {

12: string (] splitString; 13:

14: public CSTSplit(string toSplit) 15: {

16: splitStrings = toSplit.Split(new char[] {' I'};

~410

PHAN III : Windows Forms

17: } 18:

19: public string Caption 20: {

21: get

22: {

23: if (splitStrings.Lenght > 0)

24: return splitStrings[O];

25 : return "" ;

26: }

27: }

28:

29: 30: 31: 32: 33: 34: 35: 36 : 37 : 38: 39: 40: 41 : 42: 43: 44: 45: 46: 47: 48: 49:}

public string Status {

get {

if(splitStrings.Length> 1) return sp1itStrings [1] ; return nil i

}

}

public string Tooltip {

get {

if (splitStrings.Length > 2} return splitStrings[2]; return 1111 ;

}

} }

Phuong thuc khoi dirng' tren dong 10 tach mQt chuoi (string) dl1qc cung ctlp thanh mot mang 3 chuoi dLiqc chia tai nhang thanh phan each.

Nhung thuQc tinh Caption, Status, Tooltip (tai nhilng dong 19, 20 va 39) lAy met chuoi chmh xac hoi[lc dip m/)t chudi r5ng n€!u khong c6 van ban (text) cho phan d6 ella chuM dLiqc dua vao,

Luc d:iu stl dung ldp nay se them nhung tooltip vao cac nut nhAn trong tool palette. Di~u nay dl1qe thuc hien trong phuong thtrc khoi dung cua MainForm, sau khi phiarng thuc InitializeComponent dLigc goi, D~ hien thi too\tip, keo d6i tLiqng tooltip tir hop cong cu len tren trang thiet k€!cua MainForm. Tooltip se xuat, hi~n trong khay bi~u tuung (icon tray) dlid'i cua s6 chinh. Bau do dira dean rna sau vao phinmg thuc kMi tao cua MainForm.

CHudNG 3·6: Thirc hanh irng dung Windows Forms

411~

CSTSplit splitter = new CSTSplit(this.customlmageButtonl.Text); this.toolTipl.SetToolTip(this.customlmageButtonl,spltt er.Tooltip);

splitter = new CSTSplit (this.customlmageButton2.Text) ; this.toolTipl.SetToolTip(this.customlmageButton2,spltt er.Tooltip);

splitter = new CSTSplit (this .customlmageButton3 .Text); <tk!,i iii,. tool Tipl . Set TOQl. T;kp (this. customlmageBu t ton3 , spl t t

er: Tool t'ip-) ;. . .. .

splitter = new CSTSpl.it (this. customlmageButton4. Text) ; this.toolTipl.SetToolTip(this.customlmageButton4,spltt er.Tooltip) ;

Ban co tM thay rAng IAn hrot mM CustomlmageButton bi truy xuat thudc tinh text va thuoc tinh ToolTip tU d6i tunng CSTSplit. CSTSplit tra vi! text chinh xac duoc xU' IS' boi phirong thirc ShowTip cua Tool'I'ip.

Bay gii'f, khi chuot ngirng tren n6 khoang nth giay hoac han, 1 tooltip se xuat hien chua dung nQi dung van ban chinh xac.

M6i control nay cung chua dung van ban (text) cho thanh trang thai (status bar). De tao cho text nay hien thi chinh n6, dilu tien chon control CustomlmageButton trong vung thie"t ke" va danh ten phurrng thuc ShowStatus vao trong su kien MouseEvent trong Properties Browser. BQ xu Iy se duqc tao va di~n rna vao nhu sau :

private void ShowStatus (object sender, System. EventArgs e)

Control c '" (Control) sender;

CSTSplit splitter = newCSTSplit(c.Text); this. statusBarPanell.Text = spl.itter. Status;

Dich va chay chuong trinh se hien thi nhi1ng thong dii,\p cua tooitip va thanh trang thai (status bar) mQt each chinh xac,

Pbdn 4 : Tool properties va dng durrg'

Bay gii'J chuang trinh dii jj trong trang thai rna chung ta c6 the bitt d§.u lam viec thire su, Chung ta can chon nhirng thuoc tinh rieng le cho nhung tool va ap dung chung VaG anh bitmap.

Doi tuong Paintbrush yeu d.u mQt vai thuoc tinh, nhu ia hinh but long, mau sac, va kich thiarc. Cong cu hinh Eiip va hinh chu nhat (Rectangle) chi can dinh nghia mau cua duong net, mau to, va dQ .dfty cua net. Cue gorn (eraser) se c6 kich thudc va hinh anh, gi6ng nhu but vi! (paintbrush), nhung no se luon luon x6a bAng mau trAng.

IIJ 412

PIiAN III : Windows Form

Ban co th~ sil dung PropertyGrid d~' chon nhirng thuoe tinh nay, Chung ti se tao ra mot lap cho m6i cong' CI,I, lap nay se giu lai nhirng chon hra cua ngui1i 51 dung.

D,nh nghIa Tool Properties

Ba lap clIng CI,I rna til. cac dOi tirong duqc trmh bay trong vi du 3,6-7,3,6-8 Vi 3,6-9 sau day

Vi du 3.6-7 T~p tin PaintBrushProperties.cs

1: using System;

2: using System.ComponentModel; 3: using System. Drawing;

4: using System.Globalization; 5:

6: namespace FormPaint 7: {

8:

9: public enum Shape 10: {

11: Round,

12: Square,

13: Tr'iangle

14: } ;

15:

16:

17: public class PaintBrushProperties 18: {

19: private Shape shape;

20: privateintsize;

21: private Color color;

22: private int transparency;

23:

24: public object Clone ()

25: {

26: return new PaintBrushProperties (shape, size, alar, transparency);

27: } 28:

29: protected PaintBrushProperties (Shape _shape, 'int 30 :_size, Color _color, lnt _transparency)

31: { 32: 33: 34: 35: 36:' }

shape = _shape; size = _size; color = _color;

transparency = _transparency;

CHUdNG 3·6: 'I'hirc hanh ling dung Windows Forms

413~

37: 38:

39: Category ( "Brush"),

40: Description( "The brush shape")

\4 kt.'"J(..:;:: ... '." ,

'42':' public Shape Shape

43: { 44: 45: 46: } 47 :

48:

49: 50: 51: 52: public Color Color

{

get {return shape;} set{shape = value;}

Category ( "Brush"), Description ("The brush co Loxv ) 1

53 : 54 : 55 : 56 : 57 :

58:

59: Category ( "Brush") ,

60: Description ( "The size of the brush in pixels" ) 61: ]

62: public int Size 63: {

64: get (return size; )

65: set{size=value;}

66: }

67:

68:

69: Category( "Brush") ,

70: Description( "Percentage of transparency for the brush")

get {return color; } set {color = val ue ; }

}

71:

72: public int Transparency 73: {

74: get {return transparency;}

75: set {transparency = value;}

76: }

77 :

78: public PaintBrushProperties ( ) 79: {

80: color = Color.Black;

81: size = 5;

82: shape = Shape. Round;

~414

PuAN III, W;ndow. Fo<"" 1

83: transparency = 0;

84: }

85: }

86:}

Vi d" 3.6-8 Sha ePro erties.cs: L' Sha ePro erties

1: using System. Drawing; 2 :

3 :

namespace FormPaint 4: { 5 : 6 :

public class ShapeProperties {

7: private Color fillColor;

8: private Color lineColor;

9: private bool line;

10: private boo I fill;

11: private int 1ineWidth;

12:

13: public object Clone ()

14: {

15: return new ShapeProperties (fillColor , lineColor,

16: line,fill,lineWidth);

17: }

18:

19: protected ShapeProperties (Color _fiIIColor,

20: Color _lineColor, bool _line, bool fill,

int _lineWidth)

21:

22: fillColor = fillColor;

23: lineColor = _lineColor;

24: fill = fill i

25: line = line;

26: lineWidth;;;; linewidth;

27: }

28:

29:

30:

31: Category("Geometric Shape"),

32: Description( "The color to fill the shape with") 33: ]

34: public Color FillColor 35: {

36: get{returnfillColor;}

37: set{fillColor = va Lue r }

38: }

39:

40:

415'1

-CHudNG 3-6: Thuc hanh ling dung Windows Forms

41: Category ("Geometric Shape" ) I

42: Description( "The color to outline the shape with") 43: ]

44: public Color LineColor 45: {

46: get {return lineColor; }

47: set {lineColor = value;}

48: }

49:

50:

51: Category( "Geometric Shape") I

52: Description( "The width of the line"). 53: ]

54: public int LineWidth 55: {

56: get {return lineWidth; }

57: set {lineWidth = value;}

58: }

59:

60;

61: Category ("Geometric Shape") , 62; Description ("Draw the outline") 63: 1

64: public bool Line 65: {

66: get {return line;}

67: set{line = value;}

68: }

69 :

70:

71: Category{ "Geometric Shape") I 72: Description("Fill the shape") 73: 1

74: public boo I Fill 75: { 76:

get {return fill;} set{fill = value;}

77: 78: 79: 80: 81: 82: 83: 84: }

}

public ShapeProperties ( ) {

}

Vi du 3_6-9 EraserPro er-tres.cs s Ld EraserPro erties

1: using System;

~416

PHAN III : Windows Form!

2: using System. ComponentModel;

',' .,

3:

4: namespace FormPaint 5: {

6: public class EraserProperties {

7 : 8: 9 : 10: 11: 12:

private Shape shape; private int size;

public object Clone () {

13: return new EraserProperties (shape, size) ;

14: }

15:

16: protected EraserProperties (Shape _shape, int

_size)

17: {

18: shape = _shape;

19: size = _size;

20: }

21:

22:

23: Category ( "Eraser"),

24: Description("The Eraser shape")

25: ]

26: public Shape Shape

27: {

28: get {return shape;}

29: set {sliape = value;}

30: }

31 :

32:

33: Category ( "Eraser" ) ,

34: Description( "The size of the Eraser in pixels")

35: ]

36: public int Size

37: {

38: get {return size;}

39: set{size=value;}

40: }

41:

42: public EraserProperties ( )

43: (

44: shape = Shape. Square;

45: B,ise = 1(:);

46: }

47: } 48:}

CHudNG 3·6: Thue hanh (rng dung Windows Forms

417~

Chit j : Tat ca nhting d6i tuong d~u co phuong thuc Clonet). Phuong thtic nay su dl,mg khi thu{)c tinh duac chlnh. slia trong hf)p thoqi, va nguai sit dung co eu lira chon de nhtip chuot lim nut nhan Cancel. Neu h{)p h{)i thoai nay bi hrly, th: vi~c sao chep 19i d6i tuang bting ph uang thuc Clone() se bj htiy bo.

Soan thao Tool Properties

Vi~c soan thao cho tift ca thuoc tinh cua cong cu ducc thuc hien vdi cung m(\t hop thoai. HQP h(\i thoai ToolProperties duqc tao bang moi trirong thie't ke' IDE nhu sau:

KeD 2 nut nhsn tit thanh cong cu (toolbar) vao hQp thoai, ghi nhan len chung Iii OK va Cancel, va sau do di).t thuoc ttnh DialogResult cua chung bang gia tri tuong' ung.

Keo va xac dinh vi trf dol tuqng PropertyGrid len tren M mat cua ban thiet, ke. Ket qua cuci cun~ nen giong nhu hinh 3.6-9.

Hinh 3.6-9 Hop hf)i thoai ToolProperties

HQp hqi thoai nay cAn dua vao mQt vai hanh vi, vi vay chung ta se them mqt thuoc tfnh d~ d~t va llfy d6i tuqng rna PropertyGrid soan thao. Doan rna sau hi~n thi phuong thirc truy xuat dan gian :

public object Object {

get {return this. propertyGrldl. SelectedObject i } set{this.propertyGrid1.SelectedObject = value;}

}

Sau phuong thuc truy xuat nay, chung ta co th;'j them vao chirc nang cho viec soan thao va sll dung cac thuoc tinh.

MainForm cua ta phai saa d6i d{j giU thuoc tinh va tool hien hanh dang duqc sa dung, Doan rna sau hi~n thi nhirng chirc nang them vao.

Cau true Tool duqe them vao khong gian ten FormPaint va dung d~ dinh nghla tool nao dang duoc sa dung.

~418

PHAN III : Windows Forms

public enum Tool {

Paintbrush, Rectangle, Ellipse, Eraser

}

Sau day 18. nhirng bien thanh vien C1,lC bO diroc them vao ldp FormPaint:

private Tool currentTool;

private PaintBrushProperties paintbrushProperties; private ShapeProperties shapeProperties;

pri vate EraseProperties eraserproperties;

Cac l~nh sau day duqc dua V8.0 phuong thirc khdi dung MainForrn.

paintbrushProperties = new PaintBrushProperties () ; shapeProperties ::: new ShapeProperties () ; eraserProperties = new EraserFroperties ( ) ;

Them vao cae h9 xilly cho Tool Properties

D~ sli dung cong cu, nguai dung se nhap mot Ian chuot len n6. Chung ta cai d~t thi'I tuc sl;! kien cho nut nh.!ln nhu sau

private void ClickPaintbrush(object sender,

Sys tern. EventArgs e)

{

current Tool = Tool. Paintbrush;

}

private void ClickRectangle(object sender,

System. EventArgs e)

{

currentTool = Tool.Rectangle; }

private void ClickEllipse (object sender,

System. EventArgs e)

{

currentTool = Tool. Ellipse;

}

private void ClickEraser (object sender, System. EventArgs e)

{

current Tool = Tool. Eraser i

}

IS

ta

CHl1dNG 3·6: Thuc hanh ung dung Windows Forms

419~

Ban c6 th~ thdy rAng nhilng h(i xtt ly nay dan gian chi thay d6'i nhilng gia trj cea bien thanh vien currentTooI trong Mainf'orm,

Bay gia tat d. bfin nut nhan c<1n phiii glin van cung b(i xi't If DoubIeClick.

Blit d§u bang each tao hi? xtt If goi la OnToolProperties cho roM nut nhan va di~n rna cho chung nhu sau :

private void OnToolProperties (object sender, System. EventArgs e)

ToolProperties dlg = new ToolProperties () ;

switch(currentTool) {

case Tool.Paintbrush:

dlg.Object = paintbrushProperties.Clone(); break;

case Tool. Rectangle:

dIg. Obj ect = shapePropert ies . Clone () ; break;

case Tool. Ellipse:

dIg. Obj ect '" ahapeProperties. Clone () ; break;

case Tool. Eraser:

dIg. Obj ect '" eraserProperties. Clone () ; break;

}

if (dIg. ShowDialog () == DialogResult. OK} {

switch(currentTool) {

case Tool.paintbrush: paintbrushProperties = (PaintBrushProperties)dlg.Object; break;

case Tool.Rectangle:

shapeProperties '" (ShapeProperties) dlg. Obj ect; break;

case Tool.Ellipse:

shapeProperties", (ShapeProperties)dlg.Object; break;

case Tool. Eraser:

eraserProperties = (EraserProperties)dlg.Object; break;

}

}

}

~420

PnAN III : Windows Form

BQ xli If nay quyet dinh thuQc tinh cua nhtrng lap nao diroc sli dung, du mot lap chinh xac VaG trtnh soan thao, tri~u goi trinh soan thao, bo hoac thay th thuoc tinh bi soen thao tat ca phu thuoc VaG gia tri ella DialogResult.

D~ cho phep ChildForm truy xuat nhung bien ella MainForm, nhu Iii tool v hien hanh hoac nhirng thuoc t.Inh cua co ve (brush), hinh anh (shape), chung t them VaG met vai phuong thirc truy xuat, thuoc tinh. C6 ffiQt phuong thirc truy XU! thuoc tinh ChildForm dua van ban text vao trong thanh trang thai (status hal cua MainForm. Di~u nay n1t co ich cho ngl1i'1i sli dung, Dean rna sau chua dun nhung phinrng thuc truy xuat thuoc tinh lap

public Tool Current Tool

{

get {return currentTool;}

}

public ShapeProperties ShapeProperties {

get {return shapeProperties; }

}

public EraserProperties Eraserproper,ties {

get {return eraserPropert ies i }

}

public PaintBrushProperties PaintBrushProperties {

get {return paintbrushProperties;}

public string StatusText {

get {return this. statusBarPanell. Text = value; }

. .

}

Chay U"ng dung 5e cho ban kiem tra cac nut cong cu tool dtiqc chon va hi

chinh cac thuec ttnh. .

Bit ddu vi; anh

Nao, cluing ta se b:it ddu thao tac ve anh, Ta't ca diiiu nay dl1qc thuc hi bai bQ xi'.t If trong lap ChildForm.

Lap nay thuc hien hai thao tac co ban, Thao tac d§u WIn la dua mQt hi d6m rnau xuat hien biit cu khi nao nut chuot bj nhan, Thao tac con lai la cho ph ngiroi sli dung dua vao dang hmh hoc dn ve va chinh lai kieh thuoc cua n6.

Vi du 3.6-10 hien th] ddy du tai nguyen cua lap ChildForm.

Is'

. ,CHUdNG 3-6: Thuc hanh irng dung Windows Forms

421~

Vi du 3.6-10 Lop ChildForm

1 f using System;

2: using System. Drawing; ,"~,;~iidngSystem. Drawing. Prawing2D;

~"f1V.asinif'SYstem. c61l.ectibns'; .

5: using System.ComponentModel; 6: us i ng Sye tern. Windows. Forms;

;a

it r) 19

.$n

nh lep

7 :

8: namespace FormPaint 9: { 10; 11: 12 : 13: 14 : 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:

/ / / <summary>

/ / / Summary description for ChildForm. / / / < / summary>

public class ChildForm : System. Windows. Forms. Form {

private Image myImage; private Bitmap tempBM;

private Pen pen;

private SolidBrush brush; pri vate GraphicsPath path; private Point firstPoint; private Point lastPoint; private Size blitBounds; private Point blitPos;

26: private bool Drawing;

27: private bool dirty;

28 : private bool fill;

29: private bool stroke;

30:

31: private Graphics myGraphics;

32 : private Graphics imageGraphics;

33:

34:

35: 36: 37 : 38: 39: 40: 41:

public Image Image {

set {

myImage = value;

this . AutoScrollMinSize = myImage _Size; tempBM = new Bitmap (myImage. Size. width,

myImage.Size.Height);

42: 43: 44: }

get {return myImage;}

1!j422

pHAN III : Windows Forms

Nhilng biifn dllqc khai bao tren dong tU 15 Mn 32, theosau la phuong th~ truy xu at Image, phuong thuc nay gan m(it anh VaG form con va khdi d(ing lai gi8 tr] AutoSeroll M vua vdi kich thudc anh, Phuong thirc truy xuat nay cling eho phep nhung phuong thirc khac Iffy anh chua trong form.

Vi du 3.6-10 Tie'p theo

45:

46: public boo 1 Dirty 47: {

48: get {return dirty;}

49: set {dirty = value;}

50: }

51:

52: / / / <summary>

53: / / / Required desigQ.er variable. 54: / / / </summary>

55: private System.ComponentModel.Container components = null;

56: 57:

58: public ChildForm()

!:i9: {

60: / /

61: / / Y€!u diu cho Windows Forms

62: / /

63: InitializeComponent dtro'o g<;11

64:

65: II

66: / / Khai d¢ng bi~n

67: / /

68: Drawing'" false;

69: Dirty = false;

70: Text = "Untittle.bmp";

71: }

72:

I

Plunrng thirc khdi dung tren dong tit 58 ten 71 g9i phinrng thrrc quan tr9ng!

InitializeComponent dat nhirng gia trj khdi dQng cho cac cO dung d& xac dinh ne'u vi~e ve bi thay dii'i hoac hanh dQng vi'! dang xay ra, cling voi di:it thucc tinh Text cua form bang untittle.brnp cho trong trllong hop tao mot hinh moi khong cdn tai W~ ,

73: / / / <summary>

74: / / / Clean up any resource being used.

75: / / / </summary>

76: protected override void Dispose (bool disposing)

77: {

I

rt ii

CHUONG 3·6: Thuc hanh Ctng dung Windows Forms

423~

7.8: 79; 80: 8b 82: 83: 84: 85: 86: 87 : 88: 89: 90 : 91:

if (disposing) {

tempBM.Dispose{);

if (components ! = null) {

components.Dispose();

}

}

base.Dispose(disposing);

}

92:

#region Windows Form Designer generated code I I I <summary>

I I I Required method for Designer support - do not I I Imodify

I I I the contents of this method with the code Illeditor.

I I I </summary>

private void InitializeComponent () {

93 : 94: 95: 96: 97 : 98: 99:

1/

IIChildForm 1/

this .AutoScaleBaseSize = new System.Drawing.Size(5,13);

this. BackColor = System. Drawing. Color. Green; this .ClientSize = new System.Drawing.Size(808,565)i

this. Name = "ChildForm";

this. Text = "ChildForm" i

this • MouseDown += new System.windows.Forms.MouseEventHandler( this.OnMouseDown);

this. Closing += new System.ComponentModel.CancelEventHandler( this.ChildFor~_Closing)i

this . MouseUp += new System.windows.Forms.MouseEventHandler( this.OnMouseUp)i

this. Paint += new System.Windows.Forms.PaintEventHandler(

this.ChildForm_Paint);

this • MouseMove += new System.Windows.Forms.MouseEventHandler( this.OnMOUSeMove);

100: 101:

102 : ·103 : 104 :

105:

106:

107:

108:

109:

110: }

111: #endregion

~424

PHANIII: Windows Forms

Phuong thirc Dispose va phuung thuc InitializeComponent duqc them V3.0 bdi IDE. Phuong thuc Dispose phai don dep anh bitmap trung gian, Be- xii ly dUQc them VaG ChildForm tren dong 104 tCii 108. Tren dong 113 tdi 116 sau thu tuc ToRadians don gian dung d6"i tit de- sang radian sii dung tho nhtrng thu tuc toan hoc,

112:

113: private double ToRadians (double angle) 114: {

115: return angle/180*Math.PI; 116: }

117:

118: private void CreateBrushPath(Shape s) 11.9: {

120 :

121: 122: 123: 124:

125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142 : 143 : 144: 145: 146: 147: 148: 149: 150: 151:

path = new Graphicspath ( ) ;

MainForm form = (MainForm) this . Parent Form; int Toolsize = 3;

switch(form.CurrentTool} {

case Tool. Paintbrush:

Toolsize = form. PaintBrushProperties. Size; break;

case Tool. Eraser:

Toolsize = form. EraserProperties. Size; break;

}

if (Toolsize<3) Toolsize '" 3; if(Toolsize>100} Toolsize = 100;

switch(s) {

case Shape. Round: path.AddEllipse(-Toolsize/2, -Toolsize/2, Toolsize,Toolsize);

break;

case Shape. Square:

path.AddRectangle (new Rectangle (Toolsize/2, -Toolsize/2, Toolsize,Toolsize»;

break;

case Shape. Triangle:

Point (] points = new Point [3];

CHUdNG 3·6: Thuc hanh irng dung Windows Forms

425~

152: points [0] = new

153:Point«int) (Math.Cos(ToRadians(90»*Toolsize), (int) (Math.Sin(ToRadians(90»*Toolsize});

154: points [11 = new

155: Point ( (int) (Math. Cos (ToRadians (210).) *Toolsize) ,

(int) (Math.Sin(ToRadians(210»*Toolsize});

156: points 121 = new

157:Point«int)(Math.Cos(ToRadians(330)}*Toolsize), (int) (Math.Sin(ToRadians(330)}*Toolsize»; path.AddEllipse(points);

break;

158: 159: 160: 161:} 162:

Phuong thuc Createljrusb Path phat sinh ra doi ttrorig Path dung de' to mau vung anh. Trorig vi du dcngian nay, mau sac eo the' ap dung cho hinh vuong, hi nh tam giac. Cau l~oh switch va nhung diu I~nh case cua tre n nhi1ng dong 140 - 161 quan ly viec tao ra duong db thj Path. Path duge luu Iai cho moi litn si.1 dung khi nut nhan chuot duqc kich hoat. Tren dong ttl 163 t6i 171, thu tuc Paint khongIam gi het. ngoai vice chep anh nen vao man hinh chinh.

163: private void ChildForrn_Paint (object sender,

164: Systern.Windows.Forms.PaihtEventArgse)

165:

166: 167 : 168: 169: 170: . 171: } 172:

173: pri va te void OnMouseDown (obj ect sender,

174: System. Windows. Forms. PaintEventArgs e)

175 :{

176: this.Dirty = true;

177 : 178 : 179 : 180: 181': la2:

183: 184:

185: 186:

e.Graphics.DrawImage(myImage, this.AutoScrollPosition.X, this.AutoScrollPosition.Y, myImage.width, rnyIrnage.Height};

if (this .MdiParent .ActiveMdiChild == this) {

Color brushColor i

rnyGraphics = this. CreateGraphics ( ) ; imageGraphics =

Graphics.Formlmage(this.Image};

rnyGraphics.SetClip(new Rectangle(O,Q,this.lrnage.width, this. Image.Height));

[tj 426

PuAN III: Windows Forms

187: 188: 189: 190: 191: 192: 193:

194: 195: 196:

197: 198: 199: 200:

201: 202: 203: 204 : 205: 206: 207 : 208: 209:

210: 211:

212: 213: 214: 215: 216: 217: 218: 219:

MainForm form = (MainForm) this • MdiParent; switch(form.CurrentTool)

{

case Tool.Paintbrush: brushColor = Color. FromArgb( 255-(int) (255.0/

100 *

. form.PaintBrushProperties.Tranparency) , form.PaintBrushProperties.Co1or);

brush = new SolidBrush(brushColor) ; CreateBrushPath(

form.PaintBrushPorperties.Shape}; break;

case Tool. Eraser I

brush = new SolidBrush{Color.white}; CreateBrushPath(

form. PaintBrushPorperties. Shape}· i break;

case Tool.Rectangle: goto case Tool. Ellipse;

case Tool. Ellipse:

fill = form.ShapeProperties.Fill; stroke =: form. ShapeProperties. Line; firstPolnt '" new Point (e.X,e. Y) i lastPoint '" new f irstPoint;

pen = new

Pen(forrn.ShapeProperties.LineColor, form.ShapeProperties.LineWidth}; brush = new SolidBrush{form.ShapeProperties.FillColor); break;

}

Drawing = true; OnMouseMove(sender,e);

}

B(l xu 19 OnMouseDown la hanh dQng dil.u Win trong tien trmh ve. No xu Iy 2 trirong hop chinh. Neu nut chuot duoc nhan va eong cu ve (paint tool) hay cong cu gorn (eraser tool) duqc chon, n6 tao ra duo-ng CQ ve mdi chinhxac vdi kich thu6c va dang htnh ve, sau do di;\t rnau cho CQ ve va d(l trong su6t (transparency). Trong truong hop cua cong cu hlnh (tool shape) no 100 diem dau tien trong hmh, thunng Iii diern (; goc trai cao nhat, va sau d6 dinh nghta mau C9 va b~ r(lng CO;>. Cu6i cung, Phuong thirc nay goi b(l xu 19 di chuyen chuot (mouse move) mot l.1n mra de dam baa viec ve ldn dau tien duec ap dung vao vung ve.

CHudNG 3·6: Thuc hanh Ung dung Windows Forms

427l1J

Tren cac dong tit 221 tdi 257, bQ xli ly chuot tha ra (mouse up) chi co lien quan vdi viec ve ra hinh anh mong dqi cuoi cling - hoac Iii hinh chit nhat hoac la hinh Elip - tren buc ve, But vii hay g6m mau duoc ap dung tren moi su kii;n di chuy~n chu(lt. Vi~c ve nay kh6ng nhirng thvc hii;n tran man hinh rna con tren htnh anh duqc giil trong b(l nhd bdi form. Hlnh nay khong bao gia bj cuon, vi vij.y vi tri cua chuot va thanh cuon phai bu cho nhau tren nhung dong 229 -232.

220: 221: 222: 223: 224 : 225: 226: 227: 228: 229:

230: 231: 232: 233:

234: 235: 236: 237 : 238 : 239: 240:

241: 242 : 243:

244:
245:
246:
247:
248:
249:
250:
251:
252:
253: }
254: } private void OnMouseUp(object sender, System.Windows.Forms.MouseEventArgse)

if (this .MdiParent.ActiveMdiChild == this) {

Point topLeft; Size bounds; topLeft = new

point(Math.Min(this.firstPoint.X,e.X), Math.Min(this.firstPoint.Y,e.Y}};

bounds = new Size (Math.Abs (e .x-firstPoint .X) , Math.Abs(e.Y-firstPoint.Y}); toPLeft.Offset(-AutoScroIIPosition.X,

-AutoScroIIPosition.Y}; MainForm form = (MainForm) this. MdiParent; switch(form.CurrentTool)

{

case Tool. Rectangle:

if(fill} imageGraphics.FillRectangle(brush, topLeft. X, topLeft. Y, bounds.Width, bounds.Height); if (stroke) imageGraphics.DrawRectangle(pen, topLeft.X, topLeft.Y,

bounds. width, bounds. He ight ). ; break;

case Tool.Ellipse:

if (fill) imageGraphics.FilIEllipse(brush, topLeft.X,topLeft.Y, bounds.width,bounds.Height);

if(stroke) imageGraphics.DrawEllipse(pen,topLeft.X, topLeft.Y,bounds.Width,bounds.Height); break;

255: Drawing = false;

1Hl428

PHAN III : Windows Forms

256: Invalidate()i 257:}

258:

259 : private vpid OnMouseMove (obj ect sender,

260: System. Windows . Forms . MouseEventArgs e)

261: {

262: 263: 264: 265: 266: 267: 268; 269 270: 271: 272:

273:

274: 275:

276:

278:

279: 280: 281:

282: 283: 284: 285: 286:

287 : 288: 289: 290: 291: 292: 293: 294:

295:

if( !Drawing) return;

if (this . MdiParent . ActiveMdiChild == this) {

Graphics gTemp ::: Graphics. FromImage (tempBM); MainForm form", (MainForm) this . MdiParent ;

if (form. Current Tool 0::= Tool.Ellipse II form.CurrentTool ='" Tool.Rectangle)

{

blitPos ::: new Point ( Math.Min(Math.Min(e.X, firstPoint.X),lastPoint.X), Math.Min(Math.Min(e.Y, firstPoint.Y),lastPoint.Y»; blitBounds = new Size (Math.Max(e .X, M~th.Max(firstPoint.x,lastPoint.X» -blitPos.X,

Math.Max(e.Y,Math.Max(firstPoint.Y, lastPoint. Y) ) - blitPos. Y); blitPos.Offset(-(int) (l+pen.Width/2),

-(int) (1+pen.Width/2»; blitBounds.Width += (int) (2+pen.Width); blitBounds.Height += (int) (2+pen.Width); form.StatusText = blitPos.ToString() + " " +

blitBounds .ToString();

} switch(form.CurrentTool}

{ .

case Tool. paintbr].lsh:

GraphicsContainer ctr :::

myGraphics.BeginContainer(); myGraphics.Transform.Reset(); myGraphics.TranslateTransform(e.X,e.Y); myGraphics.FillPath(this.brush,this.path); myGraphics.EndContainer(ctr);

ctr 0:: imageGraphics. BeginContainer () ; imageGraphics.Transform.;Reset(); imageGraphics.TranslateTransform(e.X-

AutoScrollposition.X, e.YAutoScrollposition.Y); imageGraphics.FillPath(this.brush, this. path) ;

t1S

429\!J

CHu'dNG3-6: Thirc hanh U'ng dung Windows Forms

imageGraphics.EndContainer(ctr);

296: 297 : 298: 299: 300: 301: 302: 303: 304 : 305: 306: 307: 308: 309: 310: 311: 312 : 313: 314: 315: 316: 317: 318: 319: 320 : 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332 : 333: '334 : 335: 336: 337 : 338: 339: 340: 341: 342: 343:

break;

case Tool. Eraser:

goto case Tool. Paintb1:"ush; case Tool. Rectangle:

gTemp.DrawImage(myImage,

new Rectangle (blitPos, bli tBounds) , blitPos.X - AutoScrollposition.X, blitPos. Y - AutoScrollposition. Y, b1itBounds.Width,blitBounds.Height, GraphicsUnit.Pixel);

if(fi11)

gTemp.FillRectangle(brush, Math.Min(this.firstPoint.X,e.X), Math.Min(this.£irstPoint.Y,e.Y), Math.Abs(e~X-firstPoint.x}, Math.Abs(e.Y-firstPoint.Y});

if (stroke) .

gTemp.DrawRectangle(pen, Math.Min(this.firstPoint.X,e.X), Math.Min(this.firstPoint.Y,e.Y), Math.Abs(e.X-firstPoint.X), Math.Abs(e.Y-firstPoint.Y»;

myGraphics. DrawImage (tempBM,

new Rectangle (blitPos; blitBounds) , blitPos.X,blitPos.Y, blitBounds.Width, blitBourtds.Height, GraphicsUnit.Pixel);

break;

case Tool. Ellipse: gTemp.DrawImage(myIrnage,

new Rectangle (blitPos, blitBounds) , blitPos.X - AutoScrollposition.X, blitPos. Y - AutoScrollposition. Y, blitBounds.Width, blitBounds.Height, GraphicsUnit.Pixel};

if (£i11)

gTemp.Fi11Ellipse(brUsh, Math.Min(this.firstPoint.X,e.X), Math.Min(this.firstPoint.Y,e.Y), Math.Abs(e.X-firstPoint.X), Math.Abs(e.Y-firstPoint.Y»;

if(stroke) gTernp.DrawEllipse(pen,

Math.Min (this. firstPoint'.X, e .X) ,

~430

PHAN III : Windows Forms

344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: } 358:}

Math.Min(this.firstPoint.Y,e.Y), Math.Abs(e.X-firstPoint.X), Math.Abs(e.Y-firstPoint.Y»;

myGraphics.Drawrmage(tempBM,

new Rectangle (bli tPos, blitBounds) , blitPos.X,blitPos.Y, blitBounds.Width, blitBounds.Height, GraphicsUnit.Pixel);

break;

}

lastPoint.X = e .X; lastPoint. Y = e. Yi

Phuong thirc di chuyen chuot OnMouseMove tren nhirng dong 259 Uli 358 111 mot thu tuc lam nhieu vi~e trong chuang trinh. No lam vi~c trong hai che d{J (mode), sy' khac nhau do la giITa but ve (paintbrush), nhung thao tac tliy xoa va thao tac ve hlnh. Trong che dQ thu nhat, viec vi) ducc ap dung vao anh bitmap su dung GraphicsPath t1).Q ra trong 51! kien OnMouseDown. Mau s~k duqc dira vao ca bl) nho man hmh va tren anh nQi hI). C6 nghta la thao tac vi'! se xay ra va tac dQng den anh (image) ngay We khac. Di~u nay dien ra tren dong 285 toi 300 vrri dong 289 thue hien vii tren man hlnh va dong 295 d~t mau tren anh n~n.

Nhung thao tae dien ra trong qua trinh ve hmh kha phuc tap. Khi mot hmh duoc vii, ngl1ai sli dung mu6n keo gian hmh xung quanh di! lay kich thudc chinh xac. Dieu do co nghra la viec ve kh6ng th€i dua vao mQt each true tiep tren anh n~n. Ky thuat vung d~m kep (double buffer) ,sU' dung anh trung gian duQ'c dung M ghep mot vung tlt man hinh vdi anh d6 hoa. Anh nay sau do dUQ'c chep vao man hmh, va tien trinh dUQ'C lap Iai cho den khi nut nhan chuQt duqc tha ra. Ky thuij,t nay se tranh duqc nguyen nhan chap gil;'it b6'i viec lam tucri anh va ve 11).i anh true tiep tren man hinh.

Dong 269 kii'im tra xem thao tac ve hinh chi1 nh~t Rectangle hay thao tac ve hinh Elip dang thuc hien, Ne'u di~u d6 dung, thi kich thu6c I6n nhat cua vung man hinh bi anh huang, luu Y t6i vi tri bat dAu, vi tri hien hanh, va vi tri trirdc d6 cua chuot trim nhirng dong 271 va 274. Vung ve d1JQ'c tang len bhng phan nita M rQng dl1ang vii xung quanh M btl vao bil day cua but. vii hien hanh tren nhirng dong 278 t6i 280 va sau d6 ky thu~t bQ dern kep se vii nhi1ng hinh chtr nhat (tren cac dong 301 Wi 326) va hinh Elip (tren nhtrng dong 327 tei 353).

Ban cung chu y dong 281, cap nhat, thanh trang thai vdi vi tri va kich thudc

anh,

359:

360: private void ChildForm_Closing(object sender,

361: System.Windows.Forms.MouseEventArgse)

ns

I' CHUdNG 3·6: Tht!c hanh ung d1,lng Windows Forms

431~

3.62;: {

.363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377 : 378 : 379 : 380: 381: } 382:}

383:

384: protected override void OnPaintBackground( PaintEventArgs e)

385: {

386: Region r = new Region(new Rectangle(O,O,Image.Width,Image.Height}); 387: Region w = new Region (new 388:Rectangle(AutoScrollposition.X,

AutoScrollposition.Y,

389: ClientRectangle.width, 390: ClientRectangle.Height»; 391: r.Complement(w);

392: e.Graphics.FillRegion(new SolidBrush(this.BackColor),r); 393:}

394:

.h h h Iii'

n ,It rc

ic

g 6 ,jl,

g n

rc

if (Dirty) {

DialogResult result = MessageBox.Show(this, "This file has changed, do you wish to save",

"Save file", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); switch{result)

{

case DialogResul t . Cancel:

e. Cancel = true; break;

case DialogResult .No: break;

case DialogResul t • Yes: this.Image.Save(this.Text}; break;

}

395: protected override void OnSizeChanged (EventArgs e) 396: { 397 : 398: 399: } 400: }

401:}

Invalidate(); base.OnSizeChanged(e);

Cu6i cung IS. cac phuong thrrc lien quan Mn vi~c luu 14p tin n6u t~p tin nay bi sua d6i (dong 360 Wi 381). B¢ xlc Iy nay dliqc goi truce khi form d6ng lai Hop thong di~p dllqc dung a dong tlr 365 t6'i 369 xac dinh neu ngliili su dung mu6n luu

1!!j432 PHAN III : Windows Forms 1

hoac bo hinh. Trong truorig hop huy b6 (cancel) CancelEventArgs dugc cung cap

thong qua lui goi delegate c§.n phai dugc cap nhat (dong 373). I

Phuong thirc dinh nghla chong (override) OnPaintBackground dugc cung cap M loai be) viec chop giij.t. Vdi mau n&n xanh hi cay va cac thie't lij.p mac dinh, toan bQ anh bitmap duoc ve tren mau nen xanh la cay trirdc khi anhdircc ve lai, £lieu nay 5e khien man hinh chap giij.t kh6 chiu trll phi ban sa dung phuong phap tinh toan vung man hinh ben ngoai cua anh bilng each sa dung phan bu cua khu vlf.c nay vdi khu vue duuc bao phu brii anh (dong W 386 tai 391) va chi ve lai mau yell cau.

Phuong thuc OnSizeChanged dinh nghta chong phuong th(lc Iap co s& trong cac dong tli 395 Wi 399 bao dam mau nen dircc ve 11:\i mot each ehinh xac,

Anh trong hinh 3.6-10 hiii"n thi k~t qua thuc hien cua FormPaint.

Hinh 3.6-10 Ung dung FormPaint

4. KET CHUdNG

Trong chuang nay, ban da sa dung thuoc tinh luci (PropertyGrid). H9C each tao ra ling dung Window Forms. Hoe each nang cao kinh nghiern nguui dung hOi nhtrng phan hi dieu khieri tuy bien, Hy vcng ding chuang nay se la diem b~t d~u dil ban phat trien M thong Window Forms, va Mt dilu vje't ra nhung ung dung manh me tren nen .NET cho rieng minh.

lS

PhdnIV

p

p n u h

'c u

g

KYTHUATWEB

. .

Trang ph&.n nay: • ASP.NET

• Truy xuat da lieu .NET

• Web forms

• Dich V\I Web

Chztdng 4.1

ASP.NET

Cae van d€ chinh se dude d€ cOp den:

./ Web mQt hen tlur moi

./ Nhiing di~u can thiit cho ASP, NET ./ Hello ASP,NET

./ Them vao chut huang o]

1. WEB MQT HOI THO MdI

Su6t hai nam vira rbi, viec chuyen cac (fng dung truyan th6ng desktop sang cac ling dung Web dang tro thanh m/?t xu hiarng n6ng bong, Kha nang tao lap vii. tri~n khai cac (fng dung Web du sire cung cAp cho nguoi dung nhtrng ti(Jn nghi va cong cu nhu cac ling dung desktop khong phai Iii. mot chuyeri don gian, Khi c6 mot so ky thuat mdi nbi len, vi du nhu ky thuat viet kich ban script cao cap ke"t hop vai DHTML, kha nang tao lap m/?t giao dien ling dung Web manh me bitt dAu tro thanh hien thuc. Nguoi dung khOng chi mu6n dung cac chirc nang cua phan mern rna ho con muon co m¢t san ph§m c6 tinh my thuat,

Ly do chinh ye"u nhat d€ chuyen dan cac ling dung sang giao dien Web Ia vi(Jc de dang trong tri';n khai ling dung. Hay hlnh dung den mQt ding ty co han 10.000 nhan vien khil.p the gidi, Ban e6 muon cai d~t chirong trinh phdn mem mdi nhit tren han 10.000 cai may tinh? Khfmg! Bang each dich chuyen ling dl,l'llg sang hunng phat tri';n vii. tri€n khai theo rna hmh intranetJextranet, khong con mQt ly do nao dg ban phai cai d(j.t phan mern tren may tinh cua nguoi dung euifi. Thay d6i tren ling dung ngay l~p tuc e6 hieu I!!e tren tat ell cac may tinh cua ngllai dung cu6i.

Han che' Ian nhat cua mo hmh phat trign ling dung Web di€n hrnh IA hieu suat (performance). Bai vi cac trang ASP (Active Server Page) chua bao gicr duge bien dich nen cac Web server luon phai thong dich tirng dong rna ASP, Vdi sl! phat trign cua ASP.NET, cac trang va cac thanh phan ASP.NET da dugc bien dich, do do co tM chay a tifc d(l rAt nhanh. ASP.NET cho phep Iij.p trlnh vien sU' dung bat Clf ng6n ng11 .NET nao nhu: C#, VB.NET, Managed c++ va tham chi ca Cobol.

2. y~U CAU CAN THIET CHO ASP.NET

Dg chay cac trang ASP.NET, lIS cdn phai duoc ea"u hinh hop ly vai cac phan rna r(lng (extension) cua FrontPage. Suift qua trtnh cai d~t .NET SDK hay Visual Studio .NET, cac phien ban can thie't cua phan FrontPage rna r(lng ding se

~436

PHAN IV : Ky thuat

ducc cai d1).t. D~ ki~m tra lai, ban rna trinh quan Iy lIS Manager, nhan chuot tren Website, thong thuong la Website mae dinh, chon Check Server Extens tren menu All Task. Menu All Task se du'gc hien thi m5i khi ta nhap chuot tren server C\)C bQ (local). N6 se hien ra m(it menu ngle canh, Hmh 4.1-1 se thieu menu ngle canh.

Vai lIS da dugc cau hinh dung, phan tiep theo phai lam Ia tao ra chi trinh thli "Hello ASP.NET".

Hinh 4.1-1 IlS Configuration Manager

3. HELLO ASP.NET

Khi xay dung mOt Ung dung ASP.NET, ta se thiy Visual Studio. (VS.NET) Ia dang d6ng ti~n bat gao, Vdi VS.NET, tilt ea cac li/.p trinh vien d chung m(it IDE than thien va don gian, Ta't ca nhirng gi dn cho viec ph at VB.NET, C#, VC++, FoxPro, va dl nhien la ca ASP.NET, d~u duoc tich hop \ trq tren m(it IDE duy nhat, Them mra, Intelliense bay giG da co s<in cho I dung ASP.NET.

£)~ tao ra met vi du Hello ASP.NET, hay khdi d(ing va b<'it dftu xay mot ling dung Web mci, Hinh 4.1-2 rninh hoa hop thoai New Project vci t\igng cua "ASP.NET Web Application" duqc chon. HOp thoai cung cap ten dinh cua du an "WebApplication". Hay gilt nguyen ten nay hien tai ta chua eft ten. Khi ducc phat sinh (generate), ten cua du an se III WehApplicationl.

,CHUdNG 4-1: ASP .NET 4371!!J

Hmb 4.1-2 H¢p thoai VS.NETNew Project.

Sau khi VS.NET tao ra mot dV an Web rndi, ban nen md trinh qulin If lIS M xem cau true va cac tap tin duec tao ra b&i VS.NET. Hinh 4.1-3 se eho thay lIS Manager Explorer.

Def .. wit Web Site

ffil" SCript.

ffi, i1SHeip

r±i IISP-dmin

l!I IISSample.

ffi' M5ADC

[,lI:::' _vtU,in

i±J~Rp<

if! Ga Print .. s $'Qi PBS.rver [fl QJ PBSDot.

!l3 !I4I Cr)'>t .. IReportwebFormYlewer rtH:llI a.pnet_cUent

!li'CiJ Im_ [~18.··.i

i±lCi; _vII_bin

:±J @iJ bin

!!I GJ _vtLcnf it) QiI _vti..Jlvt ftj,OiJ _vtUcrlpt

, i*.l Gil vti txt

$~ J!'i~ot; 41 G.:.iI _vti_cnf r+t f;"Iv~ loa

Cii_vti_bin iWIbin

C;lL vti_cnf Q]_\lb~vt CJ_lr'tI_5cript a::JL vtl_txt

[!] Assemblylnfo.c~ [!1 GfoDaI.asax

i GIobol .es ox, cs GIobol, .... x. resx Web.conflQ WebApplM:ation I , , , ,

, ;WObAPPII< .. tlor!l"" WebApplication ~ . , .. WebForml.aspx [!1 WebFormL . espx.es [!l WebForm\.<ISjlx .. "

Hinh 4.1-3 lIS Man.ager Explorer,

Browse Wit!:l ...

~438

PHAN IV : Ky thuat Web

Ben trong thir muc WebApplicationl, ban se thay c6 ~p tin *.csproj cimg vdi *.asplC., *.cs. Cac trang ASPX chua hai phan, HTML va trang nguon, trong truang hop cua chung ta, III t~p tin .cs. St! phan each giua giao di~n (DI) va logic nghiep vu la can thi~t cho s.,t phat tri~n cua t.ft ca cac (tng dl,!ng va dQi ngu pMt tri~n ASP .NET.

Boi voi cac t~p tin duoc tao ra cho moi irng dung ASP.NET, nen chu y:

WebForm1.aspx Trang ASP se duoc yeu cau brri trlnh duyet cua phia may

khach,

WebForm1.aspx.cs Ma nguon C# dung M cai d~t bllt eli logic ngniep vu nao cho trang aspx.

MQt t~p tin cau hlnh bang XML. ASP.NET cho phep ban quan tri de dang b1l.ng XML.

Web.config

Khi mo Solution Explorer trong VS.NET, ban c6 tM se khong thdy t~p tin WebForm1.aspx.cs. B~ thAy nhirng dean rna nam lln dll.ng sau WebForml.aspx, ban can phai chon View Code iJ menu ngff canh nhu hinh 4.1-4.

~olutlon E-·plorer WpbP.opllcatlonl ". »:

~ ,n-!-

• ::f:-!i.-Jt,c;;:/:

Set As Start ~aQe Exdude From Project

;j{, Cu~
~ Cop:.::
X. Qelete Hinh 4.1-4 Solution Explorer

D€ tiep tuc, hay d~t mdt di8u khien nhiin VaG cira 86 WebForml.aspx va thie], I~p cac thuoc tinh nhu hmh 4.1-5.

iy

CHudNG 4·1: ASP .NET

439l!J

)0

in

in

IX,

Hinh 4.1-5 Thu{)c tinh nhiiri

D~ xern cac rna HTML, chon View HTML Source tu menu ng11 canh.

1: <%@ Page language=" c#" Codebehind= "WebForm1 . aspx. cs" AutoEventWireup=" false" Inherits="WebApplication.WebForm1" %>

2 ; < ! DOCTYPE HTML PUBL rc II -IIW3 C I I DTD HTML 4 . 0 TransitionaIIIEN">

3: <html>

4: <head>

5; <meta name = "GENERATOR" Content="Microsoft Visual

Studio 7.0 ">

6: <meta name = "CODE_LANGUAGE " Content="C#">

7: <meta name="vs_defaultClientScript"

Content="JavaScript (ECMAScript) ">

8 : <meta name= "vs_targetSchelma" Content=''http://schemas.microsoft.com/intellisense/ie5

">

9: </head>

10: <body MS_POSITIONING="GridLayout">

11: <form id="Form1" method="post" runat="server" >

12: <asp:Label id=Labe11 style="Z-INDEX: 101; LEFT: 33px; POSITION: absolute; TOP: 108px" runat="server" Hello ASP .NET</asp:Label>

13: </form>

14: </body>

15: </html>

k€

I!!J 440

PHAN IV : Ky thuat Web

V6'i cac thuQc tinh nhan duqc thiet l~p, hay dich va chay thli' du an nay bang' each nhan F5. Lan d~u tien khi trang aspx diroc y~u c~u tri~u goi tit IIS, no Be duoc dich ra mQt t~p rna may (assembly), trong truong hop nay Iii WebApplication1.dll, n6 duQ'c tao ra va Mt van thu muc bin. Trang nhirng I~n dl1qc yeu cau sau, lIS Be ki~m tra xem dll nay da dl1qc c~p nhat, hay chua va se tv bien dich l a i neu rna nguon chuang trrnh c6 sl! thay d5i.

Loi ich Ian nhtit cua ASP.NET va VS.NET la kM nang go r6i (debug) m{lt Ung dung Web bAng trinh go r6i VS.NET; Hay xem doan rna sau:

1: protected void Page_Init (object sender, EventArgs e)

2 :

3: 1/

4 : / / CODEGEN: This call is required by the ASP+

/ I Windows Form Designer.

s . 1/

6: InitializeComponent();

7: }

Dij.t met di';m dUng (break point) tai InitializeComponent. M9t di~m dung c6 tM dat dij.t bang each nhan phim F9. V6'i mQt di(!m dung dl1qc dat, nhir d hlnh 4.1-6, nhan F5 M chay dl,f an (tng dung Web nay va ban se thay IE kh<'ri d(lllg. Quy€m dieu khi1i'n sau d6 Be duQ'C chuy1i'n cho trmh go rai VS.NET khi phirong thuc Page_Init dl1Q'c goi va chay den di1i'm dung 1J dong 6.

Hinh 4.1-6 t» r6i ASP.NET

g h

CHUdNG 4-1: ASP .NET

441~

Lap trmh vien da tUng quen thuQc vci cac phien ban tnrcc cua Microsoft Visual Studio c6 thti thay "tI! nhien nhu a nha" khi xay dung ling dung ASP.NET. Trt.t6"c khi co .NET va VS.NET, viec go ro"i chuang trinh ASP giong nhu la "mo kim trong bong to"i".

4_ THEM CHUT HUONG VJ

Muc dich cua ASP.NET Ill. phat tri&n ling dung Web that, nhanh, Microsoft da phat tri€n han 45 dieu khi~n (control) cho cac nha l~p trinh va phat trien ling dung Web. Cac dieu khien nay chay 6" phia-server (server-side) va tV dl)ng tra 100i cho cac yeu cau tU phia client. HAu het cac Website ngay nay d§u hO tro IE va Netscape, do do cac lap trmh vien Web phai duy tri cimg luc hai bl) rna turmg thich vci chung. Voi su tien bl) cua cac di~u khien phia-sarver. nhirng kh6 khan nay se kh6ng con m1a.

ASP.NET hi'> tro cac di~u kh ien HTML chuii"n ding nhu cac di~u khi&n ASP.NET. T'huc chat, chung co the song chung va tharn chi eo the I6ng VaG nhau.

~.

Mot trong nhung muc dich chinh cua bat ky rn(lt ling dung nao Ill. lAy diJ li~u va trinh dien da Iieu mot each eo y nghta, Hay thii nght v~ mot (eng dung cue bl) dllqc dung M lay thong tin v~ tuy&n dung, Cac thong tin nay se dinrc nhap vao bil"i cac quy trinh HR va luu trong co sa da li~u.

rc

Eli\" bilt diu quy trinh, mot kien thuc nho v~ WebForm la dn thiet, Cac (eng dung ASP bay gii:r dung ki&u RequestJResponse, ASP.NET cling v~y. Hinh thdc nay ·'th6ng qua kieu Form Post truy~n thong.

4.1. Ki~m tra y hiling

each hay nhat M h9C m(lt ngon ngG1kie"n true moi Ii!. thtt xay dung ml)t ling dung co ich nao do dung cang nhieu kien thuc v~ ngon ngiJ cang tot. Trong trierng hop ciia ASP.NET va kien true .NET, nhiem VI,I nay co the thay d6i.

De kham pha v~ ASP.NET, rnl)t eel sa da lieu vi'! nhan vien se diroc dung M minh hoa. Khong quan tam cac van d~ v~ my thuat a day. Chung ta se chi ban v€; cac di~u khi,§n ASP, ADO. NET, cac di~u khien Web, viec tiii cac t~p tin Ien server va nhfrng gt lien quan Mn chung.

D,§ bilt diiu, hay tao ra mc}t ling dung e6 ten DataForm. Thuoc tinh DOCUMENT .pageLayout nen M m~c dinh Ill. GridLayout, no se cho phep ta dinh

[!l442

PHAN IV : Ky thuat \

V! tri tuyet doi toa dQ x, y cua cac di{,u khien. Ngoai ra, thuoc tinh targetSchE nen thi~t I;j.p thanh IE 5.

True True False

DOCUMENT

Properties - / ;,-:1.1 1:

enablelJiew5tateM.,

l'esponseEncodlng

II

l

WebApplicatlonl, WebFo l

j

I

(#

10

GridLayout

10

True

False

Hinh 4.1-7 Cae tliuoc tinli Document

Sau do, tao khuon mdu nhu trong hinh 4.1-8 va dung cac bien n hu bang 4.1-1 sau:

Bang 4.1-1 Bi€n cho trang DataForm.aspx

Kitu Di€u khitn Ten bien Nhiin
asp:label FirstN ameLabel First Name
asp:labeJ LastN ameLabel Last Name
asp.label SSNLabel SSN
asp:label DepartmentLabel Department
asp.label JobTitleTable Job Title
asp:label SalaryLabel Salary
Asp:textbox FirstName
Asp.textbox LastName
Asp:textbox SSN Khi dii co khuon mau, hay thl1 xern eaq doan rna HTML duoc phat sinh nhu

mg th~ nao,

CHlJdNG 4-1: ASP .NET

4431SJ

Web

erna

Asp.textbox Asp.textbox Asp.textbox Asp:textbox

Department JobTitle Salary AddEmployee

Add New Employee

Giao dien cua Form se nhu hmh 4.1-8

. E· .

. Employee Data Form

~irstName r

.iE] ...

Last Name

~SN r

.. ~ ·r'······

, Department

• : ~ob Tittle r'

. Ill' '{J--------

Salary

Hinh 4.1-8 Khu6n mdu. eua DataForm



Vi du 4.1-1 M:l cua DataForm.as x

1: <%@ page language="c#" Codebehind:::lOataForm.cs" AutoEventWireup="false" Inherits",1I0ataForm.EmployeeForm" %>

2: < I DOCTYPE HTML PUBLIC "-I IW3CI IDTO HTML 4. a TransitionalIIEN">

3: <html>

4: <head>

5: <meta name .. "GENERATOR" Content="Microsoft Visual Studio 7.0">

6 : <met a riame e " CODE~LANGUAGE" Cont en t =" C#" >

7: <meta name="vs~defaultClientScript"

Content="JavaScript (ECMAScript)" >

8: <meta name= "vs~targetSchelma" Content="http://schemas.microsoft.com/intellisense/ie5 ">

9: </head>

~444

PHAN IV : Ky thuat VI

10: <body mS--'posi tioning= "GridLayout" >

11: <form id::"Form1" method="post" runat="server">

12: <asp:Label id",FirstNameLabel style="Z-INDEX: 102; LEFT: 80px; POSITION: absolute; TOP: 100px"

runat=" server II Width="100" Height="25">First Name</asp:Label>

13: <asp:Label id=LastNameLabel style="Z-INDEX: 103; LEFT: 80px; POSITION: absolute; TOP: 130px" runat="server" Width=1100" Height="25">Last Name</asp:Label>

14: <asp:Label id=SSNLabel style="Z-INDEX: 104; LEFT: 80px; POSITION: abao Lut.e j TOP: 160px" runat="server" Width="100" Height="25" >SSN</asp :Label>

15: <asp:Label id=DepartmentLabel sty1e="Z-INDEX: 105; LEFT: BOpx; POSITION: absolute; TOP: 190px" runat="server" Width="lOO" Height="25">Department</asp:Label>

16: <asp:Label id=JobTitleLabel style="Z-INDEX: 106; LEFT: 80px; POSITION: absolute; TOP: 220px"

xunat;» II server" Width="100" Height="25">Job Title</asp:Label>

17: <asp: Label id=SalaryLabel style:;" Z-INDEX: 107; LEF~ 80px; POSITION: absolute; TOP: 250px" runat="server" Width="100" Height="25">Salary</asp:Label>

18: <asp:textbox id=Salary style="Z-INDEX: 113; LEFT: 190px; POSITION: absolute; TOP: 250px" runat="Server" width=" 100" height=" 25" >< 1 asp: textbox>

19: <asp :textbox id=JobTitle style="Z-INDEX: 112; LEFT 190px; POSITION: absolute; TOP: 220px" runat="Server" width="100" height="25" ></asp: textbox>

20: <asp:textl::iox id=Dept style="Z-INDEX: 111; LEFT: 190px; POSITION: absolute; TOP; 190px" runat="Server" width=" 100" height=" 25" ></asp: textbox>

21: <asp:textbox id=SSN style="Z-INDEX: 110; LEFT: 190px; POSITION: absolute; TOP: 160px" runat="Server" width="100" height="25" ></asp: textbox>

22: <asp:textbox id=LastName style="Z-INDEX: 109; LEFT 190px; POSITION: absolute; TOP: 130px" runat=IServer" width="100"height="25"></asp:textbox>

23: <asp:textbox id=FirstName style="Z-INDEX: 108; LEF' 190pXi POSITION: absolute; TOP: 100px" runat="Server" width="100" height="25"></asp: textbox>

24: <asp : button id=AddEmployee text="Add New Employee" style="Z-INDEX: 114; LEFT: 80px; POSIT:tON: absolute; TOI 280px" runat="Server" width="200" height="30" I>

25:

26 : 27:

<! -- Danh cho asp:Repeater --> < I body>

CHl1dNG 4·1: ASP .NET

44SI!1J

28: </form> 29: </html>

Windows Form Designer sinh ra nhung doan rna quai qui eire ky kh6 doc dOi vdi ngu'o-i thuong, va WebForms cung vay. Chung tai cia phai eAt dan va get giiia cac doan chuang trinh cho d~ doc, Dang HTML cho DataForm.aspx thuc chat Iii XHTML. Luu y rAng a dong 26 chung toi dd them VaG m{it ghi chu rAng di~u khien asp:repeater se duqc them VaG sau. N6 se dircc dung d~ hien thi cac nhan vien mdi,

Doi tuqng WebForm duoc dAn xuat tlt System.Web.UI.Page va trang DataForm.aspx dtroc dAn xuat tii trang DataForm.DataBehind, n6 duoc dat ten lai trong lap WebForml. Di~u quan trong ban phai 111u y r1l.ng ASP.NET ducng nhu c6 va"n d~ khi lam viec vdi cac lap c6 cung ten voi khOng gian ten (namespace). B&i vi).Y, thuong th) nguai ta khong dat ten trung vai ten t~p tin rna no nam trong d6. VS.NET thunng phat sinh ra nhirng ten chung chung thay VI nhac va yeu cau l~p trinh vien nhap vao, Thuang ph iii ton thai gian d~ d6i ten chung lail

Ben canh vii)c khai bao cac bien trong trang aspx, trang DataForm.aspx.cs ciing chira cac cac khai bao bien. No cho phep ta truy nhap VaG cac thuoc tinh va phuong tlurc ella cac dieu khien trong qua trinh diroc ta i len va trong qua trlnh xl! Iy cac sl! kien cua DataFormBehind. Neu ban dang thac mac xem chuyen gi se xay ra nhir the nao thi ban nen bie't riing ASP.NET da phat sinh ra cac doan rna ehucng trmh khi duoc truy cap Mn liln d§.u tien. Trong thai diE\m do, cac dong rnakeo (glue-code) da dl1qc sinh ra M ket noi cac di~u khien aspx vdi eao bie"n dl1qc khai bao trong trang CodeBehind. Xem I6p DataFormBehind (J vi du 4.1-2 dIJ thay ro han each thuc chung lien ket cau truc trang, rang buec da lii;!u (databinding), tao khuon mAu, ki~m tra gia tIi dAu vao, thVc hi(!n cac logic nghiep vu (business logic).

Vi d~ 4.1-2 Ldp Data'For-mfse hlrid

1: using System;

2: using System. Collections;

3: using System. Component Mode 1 ; 4: using System.Data;

5:using System. Drawing; 6:using System. Web;

7: using System. Web. SessionState; 8: using System. Web. UI;

9: using System. Web. UI . WebControls;

10: using System.Web.UI .HtmlControls; 11:

12: namespace DataForm 13: {

14: / / / <summary>

15: / / / Summary description for DataForm.

16: / / / </summary>

~446

public class DataFormBehind : System.Web.UI.Page {

protectedSystem.Web.UI.WebControls.Label FirstNameLabel; protectedSystem.Web.UI.WebControls.Label LastNameLabel; protectedSystem.Web.U1.WebControls.Label SSNLabel; protectedSystem.Web.U1.WebControls.Label DepartmentLabel; protectedSystem.Web.UI.WebControls.Label JobTitleLabel; protectedSystem.Web.UI.WebControls.Label SalaryLabeli protectedSystem.Web.U1.WebControls.Button AddEmployeei protectedSystem.Web.U1.WebControls.TextBox FirstName; protectedSystem.Web.UI.WebControls.TextBox LastNamei protectedSystem.Web.U1.WebControls.TextBox SSN; protectedSystem.Web.U1.WebControls.TextBox Depti protectedSystem.Web.UI.WebControls.TextBox JobTitlei protectedSystem.Web.U1.WebControls.TextBox Salary;

PHAN IV: Ky thuat Web

17 : 18: 19:

20:

21:

22:

23:

24:

25:

26:

27 :

28:

29:

30:

31:

32: 33:

34: 35: 36: 37:

38: 39: 40:

41: 42: 43: 44: 45: 46: 47: 48:

Protected System. Web. U1. WebControls. Repeater

. EmployeeRepeater;1

public DataFormBehind ( ) (

page.lnit += new System.EventHandler(Page_Init);

}

private void Page_Load (object sender, System. EventArgs e)

if (!this.IsPostBack) {

/ /Create an ArrayList to hold Employees ArrayList employees = new ArrayList (); this. Session [ "employees"] = employees;

.,

} else {

;Veb.

GHUdNG 4·1: ASP .NET

447~

49: 50: 51: 52: 53: 54: 55: 56: 57 : 58:, 59: 60:

c '

, {(ArrayList )this. Session ["employees"] ) . Add (emp) ;

61:, EmployeeRepeeter. DataSource

:: (ArrayList) this. Session I." employees"] ;

62: EmployeesRepeater.DataBind();

63:

64: 65: 66: 67 :

/ /Since only one button exists on the form / / it must have been clicked so add the Iinew employee and update the databinding Employee emp = new Employee ( ) ;

emp. FirstName = FirstName. Text; emp.FirstName=FirstName.Text;

emp. SSN = SSN. Text;

emp . Dept = Dept. Text;

emp.JobTitle = JobTitle.Text;

emp. Salary = Double .Parse {Salary .Text};

}

}

pri vate void Page~:Cni t (obj ect sender I EventArgse)

68: {

69: II

10: / I CODEGEN: This call is recruired by the

ASP. NET Web Form Designer

II

InitializeComponent();

}

#region Web Form Designer generated code / II < summary>

/ I I Required method for Designer support do not modify 1// the contents of this method with the code

editor. 1/1 </summary>

private void InitializeComponent () {

this. Load += new System.EventHandler(this.page_Load);

} #endregion

}

}

! '

~448

PuA.N IV : Ky thu;%t W

d day chung ta da them vai thay d6i vao lap DataFormBehind. Dliu tien khai bao bien EmployeeRepeater. Mqt Repeater cho phep rna rqng mau HT~ (template) trong qua trinh trang duqe xli lY. Trong vi du nay, cac dong se dl them vao bang HTML Ling vci mM nhan vien, Lap Repeater se ket n6i di1 lieu , cac thuoc tinh chung cua d6i nrong, Thay d5i DataForm.cs M phil hop vci nhu thay d6i i'J Vi du 4.1-2

Tie'p theo, ta dung mQt lap M trmh di~n thong tin nhan vien, Tit bay ~ mili khi mot nhan vien dl1qc them vao, anh ta se dl1qe hru trong m9t mang da sach. Mang nay se dl1qc sli dung nhu ngudn di1 lieu (data source) cho di~u khi Repeater. M9t lap rat dan gian se dl1qc xay dung nhu trong vi du 4.1-3 sau

Vi du 4.1·3 LOp Employee

1: namespace DataForm 2: {

3: using System; 4 :

/ I / < summary>

/ / / Summary description for Employee.

II/NOTE: Since the employee class will be used in conjuction with DataBinding, public properties

8: 1// are required. DataBinding makes use of the

System.Reflection API to access the get/set Propertiel

9: //1 < /summary>

10: public class Employee

11: {

12:

13:

14 :

15:

16:

17 :

18:

19:

20: 21: 22: 23 : 24: 25: 26: 27 : 28:

" 29: 30: 31: 32:

5 : 6: 7 :

private string_FirstName; private string _LastName; private string _SSN; private string _Dept; private string _JohTitle; private double _Salary;

public string FirstName { get { return _FirstName; } set { _FirstName = value; }

}

public string LastName { get { return _LastName; } set { _LastName = value; }

}

public string SSN { get { ret urn _SSN; } set { _SSN = value; }

}

public string Dept {

I

33:
34 :
35:
,36 :
37:
38:
39:
40:
41:
42:
43:
44: }
4'5 : }
46: CHUdNG 4·1: ASP .NET

449r!J

get { return _Dept i } set { _Dept", value; }

}

public string JobTitle { get { return _JobTitle; } set{ _JobTitle = value; }

}

public double Salary { get { return _Salary; } set { _Salary:; value; }

}

M~c du ldp nay khOng thuc sl,! lam gi vci dcr li~u, nhung n6 minh hoa cho ta tha'y each rna di~u khien Repeater lam viec. Bat eli diiiu khit!n nao slt dung co che' rang buoc dir li~u (data binding) diiu cdn cac thuQc tmh cua d6i tuqng bound.

De sit dung diiiu khien Repeater, ban them cac dong code'crv! du 4.1-4 vao ti).p tin DataForm.aspx

Vi du 4.1-4 Ma m:lu Em loyeeRepeater

1: <asp:repeater id:;EmployeeRepeater runat="Server"> 2: < HeaderTemplate>

3: <table style::: II BORDER-RIGHT : lightgrey thin ridge;

BORDER-TOP: lightgrey thin ridge; LEFT: 300px; BORDERLEFT: lightgrey thin ridge; BORDER-BOTTOM: lightgrey thin ridge; POSITION: absolute; TOP: 100px">

4: <tr style="FONT-SIZE: large; COLOR: purple;

BACKGROUND-COLOR: lightgrey" >

5: <td>Name</td>

6: <td>Department</td>

7: <td>Job Title</td>

8: </tr>

9: <I HeaderTemplate >

10: < ItemTemplate>

11: <tr>

12: <td>

13: <%# DataBinder _ Eval ( Container. Dataltem,

"LastName" ) %>,

14: <%# DataBinder. Eval ( Container .Dataltem,

"FirstName" ) %>

15: <ltd>

16: <td>

17: <%# DataBinder. Eval ( Container. Dataltem,

"Dept" ) %>

~450

PHAN' IV : Ky thu~t WeI

18: 19: 20:

<ltd> <td>

<%# DataBinder. Eval ( Container. DataItem, "JobTitle") %>

21: <ltd>

22: </tr>

23: <I ItemTemplate >

24: < FooterTemplate>

25: </tbody> </table>

26: < I FooterTemplate >

27: </asp:repeater>

Vai sl,f b6 sung cua rna asp:repeater, mOt dong mai se duc;rc them vao ban m6i khi m(it nhan vien moi dt.tc;rc tao ra. Cac l~p trtnh vien c++ chac hl1n dii quei thuoc vai y tucrng dung mAu template trong qua trinh phat tri.§n. Mil.u eho phe mot kien true tang thEi' c6 thEi' dugc md rOng khi can. Ban nen lam quen vI asp:repeater bdi vi no se tiet ki~m cho ban hang gio l~p trinh. San pham cuoi s nhm gi6ng nhu hinh 4.1-9.

Employee Data Fonn

FirslName

Last Name SSN

Department Job Tilde

Salary

jIfJiI_I~;:t1;.~~

Hinh 4.1·9 Trang minh. hog. y tuong co ban

Nhilng ti~n d~ co ban cua Ilng dung da d\JQ'c thiet lap. Cam giac ban Mu 1 viec phat triEln ASP.NET se dEi' lai trong ban nhtmg cam xuc de chiu va slin sar M tham gia vao mot Ilng dung Web Ian han nita.

5. KET CHu'dNG

Chuong nay da bao quat nhilng di~u co ban v~ phat tri.§n Web sli dur ASP. NET. Trong cac chinrng t6'i, m(lt cai nhin sau han v~ hAu het cac linh VI Web se d\J(1c d~ c~p Mn. M6i cM d~ chung ta se cIS gAng xiiy d"mg va tim hi.§u ! glin li~n vai Ilng dung EmployeeBrowser.

ng J,tc n6

Chuang 4.2

TRUY XUAT mr Lr¢U TREN .NET

C6c vdndi chinh se dudc di cap d~n:

Chuang nay cluing ta se hoc va ban uJ each. truy xutit dil lieu su dung mo hinb. .NET

./ DataLayer

./ Lap Employee va lap Department

Khi hoc mot ngon ngl1 mdi, mgt h~ di~u hanh hay mot kien true mdi, each tiep can t6t nhat la phat tri~n mOt ling dung va sli dung cang nhieu tinh nAng c6 tM d\l<;lc. Khi thiet ke mot ling dung, tien trinh t6ng quat bao gdm viec tao ra tai li(!u chi tiet cung vdi nht7ng nht7ng trirong dO lieu sli dung, Thiet nght mgt danh sach ng<1n ngon se du cho vi du nay. Co s(j da li(!~ cua ling dung nhan, al,! (employee) cua ta ae hI\ trq nhi1ng tinh nang sau :

1. TIm kiern (Search).

a. Bang' phong ban (Department.)

b. Bdng ten (Name)

c. BAng ten ben trong Department.

2. Soan thao (Edit).

3. TMm (Add).

4. Tai hmh anh len (Upload picture).

Vai nhitng yeu ctl.u tren chung ta hoan tcan c6 tM tiep c~n va thuc hanh voi ASP. NET. Chung ta se tim higu v~ thuoc tinh, kha nang phan chieu rna (reflection), cae doan rna trang pagelet, va nht7ng d6i tliqng di~u khign (control) cua ASP. Day la toan bl} muc tieu rna chting ta se nghien cUu ASP va .NET ben trong ng11 canh cua mi)t U'ng dung thuc thu,

1. TANG DU LI~U (DATALAYER)

Cau true dtr lieu ctl.n thiet cho ((ng dung bao g1\m hai bang Department va Employee c6 quan h~ nhu hinh 4.2·1.

Hinh 4.2-1 - Cac bdng cua C(/ si'J da li~u Stingray

452

PHAN IV : Ky thuat

Cac tuy bien thuoc tinh duqc thao luan ngan gon trU6'c day gio: h\ thOi t6t df! slJ dung chung. T~ng dO li~u se djnh nghIa hai thuQc tinh la va DBFieldAttribute. Nhi1ng thuQc tinh nay se chua d\ftlg thong tin d.n thi6t tri~u ggi thu tuc n9i tai stored procedure cua (1 sCr dO li~u. Tap cac ham API c6 tM duqc su dung M xac dinh nQi dung va cau true thuQc tinh cua d6i

MQt lap se lam me hmh cho moi thuc tM trong co sa do li~u. Nhil'ng nay se diroc dil.n xua't tlt 16"p co SCI triru tuqng chung la DBEntity. DBEntity nghla 2 thuoc tinh la IsDirty vii IsNew cung voi phizrng thrrc trli\J FromDataRow. ThuQc tinh IsDirty se duqc su dung M quyet dinh neu cdn duqc c~p nhat trong cc sO' du li~u. ThuQc tinh IsNew duec stc dung M dinh xem Iii dO li~u dung dti cap nhat hoac chen mdi vao, Phuong thUc truu FromDataRow duec dung dti xay dung DBEntity tlt phdn ttc DataRow cua d6i DataSet. Vi du 4.2.1 cho thay each x1l.y dung lap DBEntity.

1. I I I <summary>

2. II I DBEntity defines a basic database entity and

serves as the

3. III base class of all entities with a database 4. II 1< I summary>

5.

6.

7. namespace Stingray. Data

8.

9. using System;

10. using System. Data;

11. 12. 13.

14. II I < summary>

15. III The DBEntity abstractbase9lass

16. III </summary>

17. public abstract class DBEntity { 18.

19. private bool m_blsDirty = false;

CHu'dNG 4·2: Truy xu!:t dtr lieu tren .NET

453~

20. private bool m_bIsNew = true;

21.

22. public virtual bool IsDirty {

23. get { return m_bIsDirtYi }

24. set { m_bIsDirty = valuei }

25. }

26.

27. public virtual boo 1 IsNew {

28. get { returnm_bIsNew; }

29. set { m_hIsNew = value; }

30. }

31.

32. public abstract bool FromDataRow(

System. Data.DataRow data);

33. } 34. 35. }

Cong vi~c tiep theo la phai t~~ ra va tuy bien thuoc tinh cua cac lap DBTableAttribute va DBFieldAttribute. DBTableAttribute se chira t€m bang. chen ten cua thu tuc nQi stored procedure, va cap nhat ten cua stored procedure. DBFieldAttribute dinh nghia ten doi so, ki~u di1 Iieu, va chieu dai ciia dil li~u neu cAn thiet. Nhilng thuc)c tinh nay se dl1qc ap dung cho tung doi tuqng dai dien mQt thuc th~ ben trong ca sa da lieu, Bilng each sa dung Reflection API, nhilng thuoc tfnh nay se dugc dung M xii ly nhilng tac vu nhu chen va cij.p nhat cac th1,lc tM. Vi du 4.2·2 cho tM'y each cai d,,!-t hai lap DBTableAttribute va DBFieldAttribute.

Vi du 4.2.2 : Cac ldp tuy bien thuoc tinh

1: namespace Stingray.Data

2 :

3: using System;

4: using System. Data;

5: using System.Data.SqlClient;

6: using System.Data.SqlTypes;

7 :

PRAN IV : Ky thuat WI

8: 9:

10: ///<summary>

11: / / /The class DBTableAttribute defines the table within which

12: / / /a particular enity reside. In addition, this thuQc tinh

13: / / falso contains properties for the SQL Insert and

Update stored

14: / f /procedures used by the enity 15: /ff</summary>

16: [attributeusage{AttributeTargets.Class)1

17: public class DBTableAttribute : System. Thu<}c tinh { 18:

19: /***** [Fields 1 ***** /

20:

21: private string m_TableName;

22: private string m_SPInsertCommand;

23: private string m_SPUpdateCommand;

24:

25:

26: /***** [Properties 1 ***** /

27 :

28: public string TableName {

29: get { return in_TableName; }

30: set { m_TableName ~ value; }

31: }

32:

33: public string InsertCommand {

34: get { return m_SPInsertComrnand; }

35: set { m_SPlnsertComrnand = value; }

36: }

37:

eb

::

CHtfdNG 4·2: Truy xuat du lieu tren .NET

455~

38: public string UpdateCom,mand {

39: get { return m_SPUpdateCommand; }

40: set { m_SPUpdateCommand = value; }

41: }

42:

43: 1*****[Constructor(s)]*****1

44: public DBTableAttribute ( string TableName ) {

45: m_TableName = TableName;

46: } 47: } 48:

49:

50:

51: 111<sumary>

52: IIIThe DBFieldAttribute is used to map class

properties

53: Illonto SQL stored procedure parameters. 54: III < Isumary>

55: [attributeusage(AttributeTargets.Property)]

56: public class DBFieldAttribute : System. ThuQc tinh

{

57 :

58: 1*****[Fields]*****1

59: 60:

private string

61: private SqlDbType m_DataType;

62: 63: 64 :

private int

65: 1***** [Properties] *****1

66: public string ParameterName {

67 : get { ret urn m_ParamName; }

1lj456

PHAN IV : Ky thuat Webl

68: 69: 70:

71: public SqlDbType DataType {

set { m~ParamName = value;

}

72: get { return m~DataType; }

73: set { m~DataType = value; }

74: }

75:

76: public int Length {

77: get { return m~Length; }

78: set { m~Length :::: value; }

79: }

80:

81: /*****[Constructor{s)]*****/

public DBFieldAttribute ( string ParameterName

82:
)
83:
84:
85: }
'86:
87 : } m~ParamName =·ParameterName;

}

DBTableAttribute dliqc quy bang AttributeUsage. Do DBTableAttribute chi sli dung trong mot lap, Attribute'I'arget enum dliqc sli dung d6 chi ra di~u nay AttributeUsage cho phep ki6m soat each thuQc tinh dliqc sli dung. AttributeTargel enum chua nhung gia tri dlil1c dinh nghta sau:

public enum AttributeTargets { All,

Assembly.

Class,

Constructor, Delegate,

Enum.

eb

:hl Iy.

~et

CHUdNG 4-2: Truy xua't da lieu tren .NET

457~

Event,

Field, Interface, Method, Module,

Parameter,

Property, ReturnValue, Struct

}

Thuc sl,1 mnt thuoc tmh khOng quan trong lAm cho de'n khi n6 du'qc cai d~t.

System. Attribute phuc vl,l nhu Irrp co sa, tlt Idp co sa nay co th~ diln xua't tao nheng lop thuQc tinh con do ngu'~i dung dinh nghta. Cung nhu cac lap do ngirei dung tl,l' dinh nghia khac, chi tie't, each dung va viec cai d~t no se tuy thuQc vao muc dich rna thuec tinh mrii phuc vu,

Vd'i lop DBEntity, DBTableAttribute, va DBFieldAttribute, chung ta co th~ xay dung lap DBAccess. DBAccess se sl.! dung cac ham Reflection API M chen hoac cap nhat, lap dAn xuat DBEntity. DBAccess chira dung 3 phuong thac tInh (static). Phuong thac AcquireConnection la rna chirong trmh cli dinh (hard-code) dung tra v~ mQt k€t noi tai CC1 sO" du li~u 0" may cue be} (Iocalhost), cung vdi thong tin dang nhap may cfin thiet, Ban c6 thg cho phep lily chuoi ket noi tlt tij.p tin cAu hmh vii sau do luu tru cho lfin truy cap gfin nhat, Tuy nhien, thInh thoiing dan gian lai t6t han.

Lap DBAccess cilng cung cap phuong thire Save chung. Phuong thirc nay dung d~ luu cac lap diln xua't DBEntity. Vi du 4.2.3 chua dung danh sach tai nguyen cho lap DBEntity.

Vi du 4.2.3 : DBAcccss

1: namespace Stingray. Data

2: {

3: using System;

4: using System. Reflection;

5: using System. Data;

6: using System. Data. SqlClietn;

7 :

1J458

8:

PuAN IV : Ky thuat Web

9: public class DBAccess

10: 11:

12: III < sumrllary>

13: III Get an active connection to the stingray database 14: III </summary>

15: public static SqlConnection AquireConnection(

(

16: SqlConnection dbCon =

17: new SqlConnection(

18: "userid=sa;password=;initialcata1og=Stingray; data source=.; Connect Timeout=30"

19: 20: 21: 22: 23: 24: 25: 26 :

) ;

try {

dbCon. Open ( );

} catch( Exception) { dbCon.Dispose( ); dbCon = null;

}

27: return dbConi

28: }

29:

30:

31: III <summary>

32: III Save a DBEntity into the Stingray Database 33: III </summary>

34: III <param name="ActiveConnection"> Active Database Connection</param>

35: III <param name="entity" > The Entity to be saved</param>

CHUONG 4-2: Truy xuat dfC li~u tren .NET

459~

36: public static bool Save ( SqlConnection

ActiveConnection, DBEntity entity) (

37:

38: / /Is there anyting to save?

-39: 40: 41:

42: object[] Attributes = entity. GetType(

).GetCustomAttributes(

if( !entity.IsDirty)

return true;

43: typeof(Stingray.Data.DBTableAttribute),

44: false

45: ) ;

46:

47 : 48: 49:

50: System.Data.ADO.SqlClient. SqlCommand Sqlcmd

= new SqlCommand ( );

if (Attributes. Length! = 1 ) return false;

51:

Sqlcmd.ActiveConnection:::: ActiveConnection;

52: Sqlcmd.CommandType =

System_Data.CommandType.StoredProcedure;

53 :

54: / / /

55: II/Do we insert or Update?

56: I II

57: DBTableAttribute TableAttribute ::::

(DBTableAttribute)Attributes[O];

58:

59:

if( entity. IsNew ) {

60: Sqlcmd.CommandText =

TableAttribute.InsertCommand;

61:

} else {

62: Sqlcmd.CommandText =

TableAttribute.UpdateCommand;

~460

PHAN IV : Ky thu~t Web

63: 64: 65: 66: 67 : 68: 69: 70: 71: 72:

}

AddCmdParam( Sqlcmd. entity);

try {

Sqlcmd.ExecuteNonQuery();

return true;

} catch{ Exception) {

73: lIDo something for Heavens sake! !

74: 75:

}

76: IIShould not make it to here unless it go BOOM!

77: return false;

78: }

79:

80: III < summary>

81: III Create the ADOParameter(s) for the DBEnity objec1 82: III </swmnary>

83: III <param riame e "cmd"> The SqlCommand object to add the prameters to</param>

84: III <param name=:"entity">The DBEnity to scrape </param>

85: protected static void AddCmdparam( Sqlcommand

cmd , DBEntity entity) {

86:

87: III

88: 1/ IGet the Public properties and create the SQL Parameters

89: III

90: Type T ,=,entity. Get Type ( ); 91: Propertylnfo [] Properties '='

it Web

~ct

i

cmroxe 4-2: Truy xua't d(1li~u tren .NET

461~

92:

T_GetProperties(

93: BindingFlags.DeclaredOnly

BindingFlags . Instance I BindingFlags. Public

94: ) ;

95:

96: 97: 9B: 99:

false

foreach ( Propertylnfo pi in Properties) { object []Attributes '" pi.GetCustornAttributes( typeof{Stingray.Data.DBFieldAttribute),

100: );

101: if (Attributes .Length "'= 1) {

102: DBFieldAttribute Field '"

(DBFieldAttribute)Attributes[O];

103: Methodlnfo mi = pi . GetGetMethod ( false) ; 104:

105: 106:

object result "'mi.lnvoke( entity, null);

107: SqICmd.Parameters.Add(Field.ParameterName,

Field.DataType);

lOB: SqlCmd.Parameters [Field.ParameterName] . Value = result;

109: 110:

if ( Field. Length> 0 ) {

111: SqlCmd. Parameters [Field. ParameterName] . Size = Field. Length;

112: }

113:
114: }
115:
116: }
117: }
11B: } '~462

pHAN IV : Ky thuat Web

DBAccess hoan toan co thEi' tl,f giai thich di~u rna n6 dang lam. No bAt dau bang viec tim kiem thuoc tinh tuy bien DBTableAttribute. Ne'u tim thay, thi tien trtnh cua vi(lc truy xua't cac thuQc tinh cAn thiet cho viec tuan tl,f h6a (serialization) biit dAu. Phuong thue AddCmdParam tum lay nhirng tM hien cua thuoc tinh hien hanh va tlm kiem thuoc tinh tuy bien DBFieldAttribute. Nhd rling DBFieldAttribute chua dung nhirng thuQc tinh danh cho ten d6i sO', kieu dil Iieu, va chieu dai ella doi so neu co th~ ap dung duoc.

2. LOP EMPLOYEE vA LOP DEPARTMENT

V6"i cau true co sd dil' lieu da co, bimc tiep theo la tao ra cac 16"p Employee va Department cung nhi1ng thu tl,1C nQi (stored procedure) rieng biet cho cac bang da lieu, D~ dt'i; hiElu, stored procedure se kh6ng cai dat cac tac vu kiEi'm tra !Oi. Thay vao d6, cac rang bUQc cua SQLServer se bao dam ril.ng kh6ng eo xung dqt v8 khoa chinh hoac khoa ngoai.

3. STORED PROCEDURES

Employee Browser se chi s11 dung bon stored procedures don gian. SQL Server Enterprise Manager cho phep xem va tao nhilng stored procedure tU cua s6 Management Console. Hinh 4.2-2 hi~n thj trmh soan thao stored procedure chua ben trong SQL Server.

Hinh 4.2-2 - Trinh soc;m thdo stored procedure ella SQL Server.

Sa dung trinh soan thao ella SQL Enterprise Manager ban tao cac store procedure sau:

CREATE PROCEDURE sp_InsertDept

i.

CHUaNG 4-2: Truy xudt dO' lieu tren .NET

463~

.b

@DEP'l'_ID int, @NAME varchar ( 50 ) AS

INSERT INTO DEPARTMENT VALUES (@DEPT_ID,@NAME) GO

.g '9.

.CREA':l'E PROCEDURE sp_UpdateDept

., ·@D'8PT_ID int, .

@NAME varchar (50)

AS

UPDATE DEPARTMENTSET NAME = @NAME WHERE DEPT_ID = @DEPT_ID

.e

,g Go

,~ CREATE PROCEDURE sp_InsertDept

@EMP _ID char ( 9 ) ,

@DEPT_ID int,

@FIRST_NAME varchar (25) @LAST_NAME varchar ( 2 5 )

L @PIC_ID unique identifier

,6 AS

:a INSERT INTO EMPLOYEES

VALUES(@EMP_IO,@DEPT_ID,@FIRST_NAME,@LAST_NAME,@PIC_ID )

GO

CREATE PROCEDURE sp_UpdateEmployee @EMP_ID char ( 9 ) ,

@OEPT_ID int,

@FIRST_NAME varchar ( 25) @LAST_NAME varchar ( 25 )

@PIC_ID uniqueidentifier

AS

UPDATE EMPLOYEE SET DEPT_ID = @OEPT_IO FIRST_NAME = @FIRST_NAME

LAST _NAME = @LAST_NAME

PIC_IO = @PIC 10

WHERE EMP _ID = @EMP 10 GO

Nhung cau I~nh tren kha d~ hit'lu; chung chi la nhtrng C8.U l~nh tao bang TSQL thuan tuy trong SQL Server. NB"u ban can nh ieu thOng tin han v~ TSQL, My sa dung trrnh trq giup (help) ben trong SQL Server.

'e 4. cAl D~T LOP

Cac 16p Employee va Department khong c6 gi khac han ngoai viec anh xa rno hmh thong tin trong or so dit lieu Vi du, 16p cung cap cac thu~c tinh dung M

~464

PHAN IV : Ky thu~t Wei

chen vao hoac viec cl}.p nhat m1)t mau tin cu tM ella bang. MM lap ke' thua tit M co sa tritu tinrng DBEntity va sa dung nheng thuoc tinh tuy bien da dl1gc pha trio§" n trl1O"c day.

Btri vi lop Department don gian nhat, chung ta c6 tM Mt d&u chi Mt n nhu trong vi du 4.2-4 sau:

Vi du 4.2.4: Lop Department

1: namespace Stingray. Data

2 :

3: using System;

4: using System_Data;

5: using System. Data. SqlClient;

6:

7: III <sununary>

8: III Simple class for a Department 9: III </summary>

10:

11: Stingray. Data. DBTableAttribute(

12: "DEPARTMENT",

13: InsertCommand= " sp_InsertDept" ,

14: UpdateCommand= "sp_UpdateDept"

15: 16:

17: public class Department Stingray. Data. DBEntity {

18: 19:

20: 1***** [Department Implementation] *****1

21: 22: 23:

private lnt

private string m_Name;

24: III <summary>

25: III Department Id Property

, CHUdNG 4-2: Truy xu~t dO lieu tren .NET

465~

26:./ II < I summary>

27: [Stingray.Data.DBFieldAttribute("@DEPT_ID",DataTyp e=SqlDbTl'Pe.lnt)]

28: public int Id {

29: get { return m_Id; }

30: set {

31: if( m_Id != (int)value) {

32: m_Id = value;

33: IsDirty = true;

34: }

35: }

36: }

;37:- ; '"

38: III <summary>

39: III Department Name property. 40: III </summary>

41: [Stingray. Data. DBFieldAttribute ( "@NAME" , DataType=S qlDbType.VarChar)]

42: 43: 44 : 45:

46:

47 :

48:

49: }

50: }

51:

public string Name {

get { return m_Name; } set {

if ( m_Name ! = (string)value) {

m_Name = value; IsDirty = true;

52: III <summary> 53: 1/ I

54: III </summary>

55: III <paramname="data"> </param>

'I

~466

pHAN IV : Ky thuat W,

56: public override bool FromDataRow( DataRow data) { this;m_Id = (int.)data["DEPT--,ID"] ; this.m_Name = (string)dataC"NAME"'];

57 :
58:
59:
. 60: )
61:
62: }
63: } return true;

Lap Department cho thay viec anh xa di1 lieu rilt dan gian tll' ba DEPARTMENT vao trong cau true lap. Nhung thuoc tinh tuy bien duoc sil'd", bdi lap DBAccess nh~m chen vao hoac cap nhat mall tin DEPARTMENT khi d 'I'a sil' dung cung ki&u cai dat nay duqc si'i dung di! tao lap Employee trong VI 4.2-5 sau:

Vi du 4_2-5 : Lop Employee

1: namespace Stingray. Data
2 : {
3 :
4: using System;
5: using System_Data;
6: using System.Data.SqlClient;
7 :
B: III <summary>
9: III The Employee Class 10: III < I summary> 11: III

12:

13: Stingray. Data.DBTableAttribute(

14 : "EMPLOYEE" ,

15: InsertCommand="sp_InsertEmployee",

16: UpdateCommand=" sp_UpdateEmployee"}

17:

18: public class Employee DBEntity

g 27:

g 28: 1***** [Properties] ***** 1

CHUdNG 4·2: Truy xuat du lieu tren .NET

467~

19: { 20:

21: 1***** [Data Members] ***** 1

22: pri vate string m_Ernpld; IISSN
23: private int m_Deptld;
24: pri vate string m_FirstName;
25: private string m_LastName;
26: pri vate Guid m_Picld; I

29:

30: Stingray. Data. DBFieldAttribute ("@EMP_ID",

DataType=SqlDbType.Char, Length=9)

31:

32: public string Id {

33: get { return m_Empld; }

34: set

35: if (m_Empld != (string)value)

36: m_Empld = (string)value;

37: IsDirty = true;

3B: }

39: }

40: }

41:

42:

43:

44: Stingray. Data. DBFieldAttribute (';@DEPT_ID",

DataType=SqlDbType.lnt)

45:

46: public int Deptld{

47: get {return m--,Deptld; }

4B: set {

!J468
49:
50:
51:
52: }
53: }
54 : }
55:
56: PHAN IV : Ky thu~t Web

if ( m_Deptld 1 = (tnt) value ) { m_Deptld = (int)value; IBDirty = true;

57: Stingray.Data.DBFieldAttribute("@FIRST_NAME",

DataType=SqlDbType.VarChar)

58:

59: public string FirstName {

60: get { return ULFirstName; }

61: set {

62: if (m_FirstName 1= (string)value)

63: m_FirstName = (string)value;

64: IsDirty = true;

65: }

66! }

67: }

68:

69:

70:

71: Stingray.Data.DBFieldAttribute("@LAST_NAME",

DataType=SqlDbType.VarChar)

72:

73: public string LastName {

74 : get { return m_LastName; }

75: set {

76: if ( m_LastName ! = (string)value) {

77: m_LastName = (string)value;

78: ISDirty = true;

Web

CHO'dNG 4·2: Truy xua:t dii' li~u trim .NET

469~

79: }
BO: }
Bl: }
82 :
B3: 84:Stingray.Data.DBFieldAttribute("@PIC_ID",DataType=

SqlDbType.Uniqueldentifier)

B5:

86: public Guid PictureId {

87: get { return m_P!cId; }

SS: set {

89: if( m __ p!cId != (Guid}value)

90: m_picId = new Guid(

«Guid)value) .ToString( ) );

91: IsDirty = true;

92: }

93: }

94: } 95:

96: III <summary>

97: III Create from a row of data 98: III </summary>

99: III <paramname="data"> </param>

100: public override bool FromDataRow( DataRow

data) {

101: this.Id= (string}data[tlEKP_ID"];

102: this.DeptId = {int)data[".DEPT_ID"];

103: this. FirstName =

(string) data ["FIRST_NAME"];

104: thi a , LastName =

(string) data ["LAST_NAME"] ;

105:

if( data ["PIC_IDOl) .ToString() != "")

106: this.m_PicId=newGuid(

data I " PIC_ID") . ToString ( ) );

1J470

PRAN IV : Ky thu~t We'

107: 108: 109: 110: 111: 112:

this. IsNew '" false;

return true;

}

113: 1*****[Constructor{s)]*****1

114: public Employee () {

115: IIWhat to do??

116: IsNew", true;

117: Isnirty", false;

118: }

119:

120:

121:

N'

5. KIEM TRA (TESTING)

Nht1ng thuc th~ co ban da duoc oai dat, chung ta se sli dung m(>t chuang trinh nl ki~m tra M bao dam ding rna chuang trlnh lam vi~c nhu mong dqi Chuang trlr kigm tra trong vi du 4.2-6 dugc dung cho muc dich nay.

Vi d~ 4.2·6: Chu'dng trinh ki~m tra cac lop

1: namespace TestBed. 2: {

3: using System;

4: usingSystem.Data;

5: using System. Data. SqlClie:nt;

6: using Stingray. Data;

7: usingSystem.Reflection;

8 :

9:

10:

11: public class DSTest

12: {

24:

25: 26: ,27 : 28:

29: '30 : 31:

32: dbCon.Open( );

hi) 33:

CHl.1dN'G 4-2: Truyxudt,da lieu tren .NET

47111jJ

13: li4 : ,15 :

16: 17: 18:

pub.licsta·tic ipt Main (string [J args) {

SqlConnection dbCon '" new SqlConnection(

19: "user id==sa;paseword==; initial catalog==Stingray; data source",.; connect Timeout==30"

20: 21:

22: Department [] Departments == new Department [5] ;

23: string [] names == { "Development" I "Tech Support",

"Sales", "Consulting", "l(ar]{eting" };

) ;

for(int i '" 0; i < 5; i++) {

Department s [i] '", neW' Department ( );

Depar~ments [1]. .:,tsNew·~. true; Departments [i] .Id == (i+1); Department s [ 1 1 • Name ~ names [1] ;

.:"

}



'34 : 35:

. 36':

37 : ,38 :

39: liDo a selec~ and display the results

40: System. Data. SqlClient. SqlDataAdapter dSCmd '" new SqlDataAdapter ( "SELECT * ,FROM DEPARTMENT" I dbCon) ;

41: System. Data. DataSet dataSet = new

System_Data.DataSet ( );

42: dsCmd. Fill (dataSet I "DEPARTMENT" );

IISave the Departments

foreach ( Department dept in Departmerits ) {' DB,Access. Save ( dbCon, dept );

}

43:

44: Iidisplay the records

45: foreach( System. Data. DataRow row in:

dataSet • Tables. ["DEPARTMENT"] _Ro.w:S,)

46: ,Console.WriteLine("{O} : {I}",

1!Ij472

pRAN IV : Ky thu~t Wei

47:

48: row [dataSet • Tables ["DEPARTMENT") • Columns ("DEPT_IDOl ]] ,row[dataSet.Tables["DEPARTMENT") • Columns ["NAME"] ] ) ;

49:

50:
51:
52:
53:
54: }
55: }
56: return 0;

}

N€u tat ca him viec tot, churrng trtnh ki@m tra bed se hi€n thi nQi dun bang DEPARTMENT va nhung k€t qua dl1qe chon, Ban c6 th@ sa dung SQL Serve Query Analyzer, dua ra l~nh SELECT thuc thi se trli v~ tat eli dong cua ban DEPARTMENT, nhu hil!n th] trong hmh 4.2·3.

MERLIN ',0 meoIer V mode~

'~~

Convnon Objecto

IE.uJ CQnfiguJ<>IiOn Functions IE 'Ill CUI'''' F....."iono

00, -c:tJ Oats and Time Func:tiQm OO .. ·(LJ M5hem.!lticlll Funclions 1il.C;] Aggreg..'e Functions

00·· ClII Metadata Functions

$I, CiI SeeUli\v Funco"". $"~ Siring Function.

e··1DiJ Sy.'''''' Ft.O>Ctions

IiI'GilI Syol..,., SI<IIiolio ... Function. tiJ···C;] T ... , end Image f"une''''''' IE .Q:.I Row ....

IE'W 51101"", D<>Ie TlIpes

Hinh 4.2-3 - Nhang mdu tin mai trong bring DEPARTMENT

6. H6 TR(1 TIM KIEM olAN DdN

M¢t trong nhirng y~u eAu cua cosd dilli~u Employee la khli nang tim ki~ m¢t nhAn vien cu th~. Vi~c Urn kie'm nen chu y d€n tim thea tl!n, b¢ phan phor

"

cmroso 4~2: Truy xuat du li~u tren .NET

4731!J

ban (department), boac li~t ki! tat ca nhi1ng nhan vien trong phong ban chi dinh. Thay vi.si'c dung thuoc tinhtuy bien, ldp tim kiem se duqc tao M tnt v~ kilt qua mong dqi, chAng han nhu lap System.Data.DataSet.

Up Search chi cung cAp cac phucng thuc tinh trong cling each nhu lap DBAccess. Ml}t If do M 1I\m nhu vay la do khong lap nao yeu cau bAt ky thOng tin trang thai, do d6 c6 tM tranh dliqc toan bl} ph~n dinh vi d6i tliqng da them vao. Lap Search cua chung ta se cung cAp 2 phuong th(fc: phuang th(fc Find vOiml}t phuong thirc dinh nghia ch6ng va phinrng thirc Retrieve M trich rut thong tin. Phuong thuc Find se tim mot nhan vien rieng Ie Mng each sil dung phat bi~u SQL LIKE. Nhu vay, bAt ky kf tt! dai di~n nao so khop thich hcp se duoc tra v~. Phuong thirc dinh nghia ch6ng Find quan tam de"n rna phong ban <Department ID} chi dinh va stt dung cung menh dI! LIKE cho ten tuong thich. Phirong thuc cuoi cling, Retrieve, lAy rna phong ban Department ID va tra ve tAt eli nhi1ng nhan vien tlt bi? phan phong ban tiarng LIng vdi rna do. Vi du 4.2-7 11\ rna chuang trinh cho lop Search.

Vi du 4.2-7: Lop Search

1: namespace Stingray. Data

2:

3: using System;

4: using System. Data;

5: using System. Data. SqlClient;

6:

7 : / / / < summary>

8: / / / Basic search class 9: / II </summary>

10: public c1ass Search

11: {

12 :

13: III <summary>

14: II/Try and locate an employee 15: 1/1 < I summary>

.m rlg

16: III <paramnarne;;"ActiveConnection"> </param> 17: III <param narne;;"FirstNarne"> </pararn>

~.474

PHAN IV :K.y thuat Wei

18: III <paramname="LastName"> </pax-am>

19:

public static DataSet Find( SqlConnection

ActiveConnection,

20: 21: 22: 23:

st'ring FirstName, string LastName { string SelectStmt = string. Format (

24: "SELECT * FROM EMPLOYEE WHERE FIRST_NAME LIKE' {,O}%' and LAST~NAME LIKE' {l},%''',

25: 26:

FirstName,LastName);

27: return Execute ( ActiveConnection,

SelectStmt, "EMPLOYEE" );

29: 30:

}

31: / / / < summary>

32: I I / Try and locate an employee within a department 33: I I / </summary>

34: III <paramname="ActiveConnection"> </param> 35: I I / <param name="Departmentld" > < Iparam>

36: III <paramname="FirstName"> </param>

37: /1/ <paramname="LastName"> </param>

38:

public static DataSet Find ( ADOConnection

Act iveConnect ion,

39: 40: 41: 42: 43:

int DepartmentId, string FirstName, string LastName ) {

object [] args = { FirstName, LastName,

Departmentld };

44: 45:

string SelectStmt =

CHudNG 4-2: Truy xuatda li~u tren .NET

46:

string. Format (

475iJ

47: "SELECT * FROM EMPLOYEE WHERE FIRST_NAME LIKE ' {O} % ' and LAST_NAME LIKE 1 {1}%' and DEPT_ID '" {2} ",

48: args);

49 :

50: . return Execute ( ActiveConnection,

SelectStmt, "EMPLOYEE" ) i

}

51: 52 :

53: / / / <summary>

54: / / / Retriev~ a list of employees for a given

department

55: / / / </summary>

56: 1// <param name="ActiveConnection" > </param> 57: / / I <paramname="Departmentld"> </param>

58: public static DataSet Retrieve (

SqlConnectionActiveConnection,

59 : 60: 61:

int DepartmentId) { string SelectStmt '" string. Format (

62: "SELECT * FROM EMPLOYEE WHERE DEPT_ID = {O}", 63: DepartmentId ) ;

64:

6~: return Execute ( ActiveConnection,

'SelectStmt, "EMPLOYEE" );

66: 67 :

68: 11/ < summary>

}

69: / / / N~ce and.tidy. Do t~.~ grunt ,,:,:orkin one pl~ca

7tl: 1/1 <isumkiry> . '." ,',

71: / / I <param name="ActiveConnection"> </param> 72: / / / <param name = "Stmt" > < Iparam>

73: / / I <param name="TableName"> </param>

~476

..

PRAN IV : KY thuat Wei

74: private static DataSet Execute ( SqlConnection ActiveConnection,

75: 76: 77:

78: SqlDataAdapter dataAdapter = new SqlDataAdapter ( SelectStmt, ActiveConnection );

string SelectStmt, string TableName ) {

79: DataSet dsResult = new DataSet ( );

80: 81: 82:

TableName );

try {

dataAdapter.Fill( dsResult,

83:

} catch( Exception) {

84: 1100 some magic here

85:
86:
87 ;
88:
89:
90: } }

return dsResult;

}

Vi~c cai d<}t cho lap Search kha d~ hii!u va khOng thuc sV doi hoi co sa di li~u lam qua nhieu viec, Mi'ii phuong thuc yeu cau mQt d6i tllqIlg SqlConnection gia sli d6i tuqng nay dU<;1c ktt noi tai co so dir lieu. Ki~u tra v~ tU" m6i phuong thUi la doi tU<;1ng DataSet. Trong .NET, mQt dOi tuqng DataSet chtra dl,fllg rift nhieu di li~u chung va c6 tM dll<;1c sU' dung trong nhirng ldp dil H~u nhu la lop SqlAdapter Th4t ra khOng quan trong M so sanh 2 dOi tu<;1ng DataSet va RecordSet. Qua thvc DataSet c6 tM dllqc dung M giir nhieu bang (table) noi ma RecordSet chua dl,fnj nhung mdu tin tU" ke"t qua dan (single result set).

Nhu vdi nhung lap ea sa dtr lieu trunc, mQt U'ng dung ki~m tra nho se khie"l ban thay ro han v~ vi~c sli dung lop Search. Hay xem vi dl,l 4.2-8 sau,

Vi O\} 1.2-8: Test2

1: namespace TestBed 2: {

3 :

using System;

4: using System. Data;

CHudNG 4-2: Truy xuat dli' lieu tren .NET

477rgJ

5; using System. Data . SqlClient;

6: using Stingray. Data;

7 :

8: public class TestBed2

9: {

10; public static void Main (

11; {

12; SqlConnection dbCon =

13; new SqlConnection (

14: "user id=sa;password=; initial

catalog=Stingray; data source=.; Connect Timeout=30"

15: );

16:

17: dbCon.Open( );

18:

19: !!Pind me

20: DataSet dsResult = Search. Find { dbCon,

"Richard", "Weeks" );

21: if(dsResult 1= null &&

dsResult. Tables ["EMPLOYEE"] ! = null) {

22; foreach ( DataColumn c in

dsResult.Tables["EMPLOYEE"] .Columns) {

23: Console.writeLine(

dsResult.Tables["EMPLOYEE"] .Rows[O] [c]),

24: }

25: 26:

27: I!Get Development

28; dsResult = Search. Retrieve ( dbCon, 1);

29; if( dsResult != null) {

}

30: foreach ( DataRow row in

dsResult .Tables ["EMPLOYEE") . Rows) {

31:

Console.WriteLine("*********

*************************");

32: foreach ( DataColumn col in

dsResult.Tables["EMPLOYEE"] .Columns) {

33: Console. Wri teLine ( row [col] ) ;

34: 35: 36;

}

}

}

1

~478
37 : }
38:
39: }
40: }
41: PRAN IV : Ky thuat Web

BAng viec cai dlj.t va kiem tra lap Search, tiing da lieu cua chung ta dii hoan tat. Hinh 4.2-4 cho thay tat ca kct qua nhirng gi chung ta da him dugc cho Mn thai di,§"m nay bang kieu bi,§"u d6 UML.

Budc tii'i"p thea trong viec phat tri€n co sa da Iieu Employee Ill. phai tan nhtrng doan chuang trrnh 'ASP,NET goi la pagelet va nhirng trang aspx dung cho vi~chi€n' thi da li~u. Ngoai ra chung ta cilng phai xay dung cac trang cho phep soan thao thong tin nhan vien cung v6i trang tim kiem,

DBEntlty
IsDirty
IsNe'W
DromDffi .. Rovv(Dffi .. Row) 7

~ DDT ableAttribute
-c Uzoz» TableName

Inset1Command
I Dep"rtrnent I Ern..1Jluyee UPd..t~Comm"nd
I Id I
Id
Name J Deptid DBFi,,'''Attribut ..

FlrstName Pes-emetertqerne
DOII"!ype
. Leettqeme
Length
Pictureld
« UIliIOll:>)o. Aquin>Q)nnec.tion
DBAcc8es
saye(Connection,DBEnt~y)
AddCmdPar<.m(Command DBEntrty)
AQ"l.,JireConnection()
Search
Fin~(Connection First,Last) 0--- -,
flnd(Connectlon ,First ,Last ,Deptld) 0 - ...;-- ---jExecute(COnnection,storte
Retrieve(Conneclion Deptld) 0-- j
Execute(Connectton,stBlement, T ",ble) mere.r .. ble) I

Hinh 4.2-4 - M6 hinh. d6i tuong hi~n luuih,

7. KET CHUONG

D6i voi hau hi'i"t cac irng dung, kha nang M lam viec v6i Co sa da li,¢U la y~1 ciiu chung. Kien true .NET cung cap ra't nhie~ t",,-p hop cling nhirng ham API d truy xua't co sO da lieu, 'I'rong cac chirong sau chung ta se sli dung tiing da li~u dl1l gian nay d~ phat tri~n ung' dung Employee Browser,

In on

Chuung 4.3

WEB FORMS

C6c vdn d~ chink se dUf!c d~ cap difn

./ Giai thi~u ASP. NET WebForms ./ Cac Usertlontrol

./ HeaderControl

./ Cae trang ASPX

10

~p 't~j~'4'

l.·Gt~I THl~U ASP.NET WEB.;F0RMS

Vai viec th~m vao kien truc.\VebForms, ASP.NET cung cap mOtmoi truong tMt 51! huang vao-nguot phat tdtn., :kM n"'h.ng .tach bi~t:,Ilil"'rakb.oi phan trlnh bay cuaHTML thg hien trnh mem deo ;a destc dung lai cao h~~ vll phia nhtrng nboi phat trie'n Web. ASP.NET chu y Mn viec tao cac dieu khien cua ngtnri dung gQi la User Controls. cung vdi kha nang ke't hop nhilng doan mil. nho goi Iii. pagelete. NhCing UserControl nj).y ~i6~ nhu <;lit than? phi1n di~ukhiE!"n (control) tuy bien cua Windows Forms'Nhilt1g: ngUiYi'.plaat tri~n· Web My gia co tM tao cac control tuy bien va de dang SlC dung Iai chung thong qua cac ~g dung Web khac nhau. Chuang nay se khao sat mOt so phuongphap tao cac UserC(Jntt-olsV'A cung ~p mil cungvrii cac trang ASP~ sit dyng nQ.~g control nay.

1.1. Cac UserControl

ASP.NET chu y den vi~c tao UserControl co thg nhung vao ben trong cac UserControl hay nhtrng trang aspx khac. Hiiy nghi den mot UserControl nhu la IQ.~t thanh phan nho c6 tM sa dung lai, duoc hinh thanh brri mil ASP.NET va HTML. Ben trong mOt trang Web diii'n hinh, co nhieu thu thuong duqc lap lai, chl1ng han nhu vung th'~ hien nOi dung cho trang Web, cac control phu giup eho VI~C tim kiem, cac tiell d~ trang {page headed: Nhtrng thuc tM nhir the' nen tro thanh nhung irng ctc vien 1y tl1dng cho vi~e tao' Ciie Uset'Control.

L2. HeaderControl

Vi viec phat tri~n User'Control Ia kha d~ dang, nen mOt thanh pharr header tuy bien vai hai thuQc tinh Ia du M lam ducc, Thanh phan header dttge phat tri~n M'tinh den su tuong tac va-i cac thanh.phan khac tren trang ASP. Situ nay, mot each tie"p can khac se dl1gc .dua ra, chUng to rAng co han mOt cach. M hoan thanh viec nay.

Thanh phan. header, dl1gc Minh hoa trong hinh 4.3-1, se dl1qc phat tri~n barrg each sa dung cac WebControls sau;

• asp:tahle Turmg tlJ'vdi tag tahle trong HTML

i!J, 480 psAN IV : Ky th~t

~ .

• asp.image'I'uong t'! vdi tag irng trong HTML

• asp.label Tao met span trong HTML

M(it trong nhilng ti~n I'li cua viec sa dung cac thanh phdn cua asp:* Iii nang tao rna HTML t'! d(ing.

Thanh phan header g&m co . hai tlj.p tin - HeaderControl.aspx HeaderControl.ascx.cs. T!j.p tin c6 phdn ma r(ing .aspx bi~u thi mt)t thuc th~ dAn xuat tit UserControl. Day la mt}t trong nhtrng ti~n 19i dliqe dua ra ASP.NET.

Employee Browser

~:

Hinh 4.3-1 Thanh ph6.n header

D€ xay dung' thanh phan header. rna thuc te IA toan bi) dl,l' an v~ We diroc thiet ke, ban hay tao mdi mi)t (rng dung Web ASP.NET trong Visual S [).,c an dliQ'c d~t ten la ErnployeeBrowser.

Thanh phiin control chi IA m(it bang nM c6 hai 6 - mi)t thanh phAl (image control) vA mQt cai nhan (label). Ma M tao control nay kha nho. D!u ta tao mt)t thu muc ben trong giiii phap (Solution) EmployeeBrowser c6 t Pagelets; Thu muc nay danh cho vi~c t6 chirc rna ben trong dy an. Nhdp chuQt vao thu muc d6 va chon Add/Add Web User Control tit trinh don tM 11 N6 se hien ra hi)p thoai Add New Item, nhu hinh 4.3-2.

p

9:

CHU'dNG 4·3: WEBFORMS

web Form

Class

Li~ ~

Data Form Wizard

Component Class

Data Set

i~:::1 l!!:J

WebOW' ~~;r

HTMl Page

frameset

,An ASP.NET Server .cOntr40~ed,ti5ftj .•. ··. ;Oc~1Vr$O~rif8~

P"fW"f

"'<~Ji,; c;;,;i~ >hTJ~'>t l~~/f'I ,.

'~\*-_+ ~ " t

.1

Hinh 4.3·2 H¢p thoai New Item

Gan ten HeaderPagelet vao UserControl mdi, Mi'1 t4P tin HeaderPagelet.ascx M soan thao dang HTML va nhap vao doan rna trong vi du 4.3-1 sau:

I.

1: <%@ Control Language="c#" codebehind-uHead~rPagelet.ascx.cs" Inherits="EmployeeBrowser.Pagelets.

HeaderPagelet" %>

2: <asp: table id="HeaderTable" runat="server" Width="100%" Height="25%" BorderColor="purple" BackColor="LightGrey" BorderStyle="Groove" BorderWidth=" 2px" Hori zontalAl ign=" Center" >

3: <asp:tablerow>

4: <asp: tablecell Width="l" VerticalAligne="Middle" HorizontalAlign="Center">

5: <!--The Image for the control-->

h

t,

a ri

6 :

<asp: Image runat="Server" id="headerImage" I> </asp:TableCell>

<asp :TableCell VerticalAlign="Middle" HorizontAllign='Center">

<aBp:Label runat="server"

7 : 8 :

~482

..

PHAN IV : Ky thu~t Web

id=" HeaderLable" runat =" server" Font-Size="XX-Large" Font-Bold="True" Font -Names="Times New Roman Width="317px" Height="55px" ForeColor="Black" I>

10: </asp:TableCell>

11: </asp:TableRow>

12: </asp:Table>

TnJ~c khi di sau vao rna cua C# (i phia sau trang ascx nay, cluing ta nen danh it thai gian d~ xem chi ti€t viec tao nhan. Trong truong hop nay, ta da tao tat ell. cac lcp dAn xuAt tll UserControl trong khong gian ten EmployeeBrowser.Pagelets. NM r~ng khong gian tim IA each hau ich d~ ttl chtrc cay rna ngudn (source tree) eua ban. Bang each gill toft ca cac pagelets trong khong gian ten rieng hij);t, nhilng nguai phat tri€!n,khac khi sli dung rna cua ban c6 tM nhanh ch6ng lien Mt khOng gian ten vdi cac muc hay doi ttfgng chua trong n6.

Dong 1 cua vi du 4.3-1 khai bao'day la m.;.t thanh phan di8u khi€!n va chi rO Iii ngf>n ngi1 C# dllgc sli dung M xay dung trang CodeBehind, va cling cho bitt thanh phan di~u khi€!n nay k€ thira tit lap ErnployeeBrowser.Pagelets.HeaderPagelet. ASP.NET sil dung trang CodeBehind M tao rna di~u khi4n viec lien k€t cac thanh to va cac bie'n cua ASP trong trang nguon.

Cac the asp:tahle, asp:image, va asp.label sil dung thuoc tinh runate'Berver". Di~u nay cho phep vi~c xi'tly cac thanh phan va dll Iieu k€t nol gilla cac thAnh phan va ma dien ra d server. Chi co cac thii asp:image va asp:label sli dung id=X, x la ti'ln bitn dl1ge djnh nghra ben trong ma ngudn cua CodeBehind. Vi du 4.3-2 chea ma nguon CodeBehind cho HeaderControl.

Vi au 4.3-2 lIeadcrConh·ol.ascx.cs

16;

1: namespace EmpoyeeBrowser. Pagelets 2: { 3 : 4 : 5: 6: 7 : 8 : 9 : 10: 11: 12: 13 :

using System;

using System. Data; using System. Drawing; using System. Web;

using System. Web. UI. WebControls; using System. Web. UI _HtmlControls;

14: 15:

I II < summary>

IIIT6m tilt s\'C mO ta HeaderPagelet. I II < I summary>

public abstract class HeaderPagelet:

System.Web.UI.UserControl {

protectedSystem.Web.UI.WebControls.Table HeaderTable; prcrectedS~stem.Web.UI.WabControls.Image

.-"""'"

b

CHl1dNG 4-3: WEBFORMS

483~

17 :
18:
19:
20:
21:
22:
h 23:
24:
.C 25:
cr 26:
a 27:
g 28:
g 29:
30:
5 31:
h 32:
33:
c. 34:
h 35:
36:
h 37:
ii 38:
~l .39:
l. 40:
41:
I 42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52 :
53:
54:
55 :
56:
57: Header1mage;

protected System. Web. U1. WebControls . Label HeaderLable;

public string 1mageUr1 {

set {

HeaderImage _ 1mageUr1 = value;

}

public string Text {

set {

HeaderLable .Text = valuei

}

}

/ / I < summary>

public HeaderPagelet ( {

.. this.Init += newSystem.EventHandler(Page_Init); }

protected void Page_Load ( obj ect sender, System. EventArgs e)

{ }

IINgU'oi dung d~t code khai d¢ng trang a dAy

private void Page_Init (object sender, EventArgs e)

{

/I

IICODEGEN: Loi 99i nay dugc y~u cau Ilbai the ASP. NET Web From Designer.

II

InitializeComponent();

}

#region Web Form Designer Generated code

/ I I Phuong th~c y~ucAu nguoi th!At kA hO trg - / / /diIng sua d61 D¢l dUDg eva pbuong t;bue Day

I IId6i vo L vi~c so~n thao code.

~484

PuAN IV! Ky thuat Web

58: 59: 60: 61:

///<summary>

private void InitializeComponent () {

this. load +=

new System. EventHandler (this. Page_Load) i

62:

63: }

64: #endregion

65: }

66: }

Ma cua HeaderControl kha ngan gon, 0 day ta dinh nghla hai thuoc tinh - Text va ImageUrl. Nhirng thuoe tinh nay c6th~ diroc thao tac ben trong thanh phan ascx hay trang aspx khac, Thuc t8', HeaderControl cua chung ta chi xuat hien nhu the n6 la mQt phan cua ASP.NET.

Bift ctr mQt lap diln xuat nao til UserControl cling deu co th~ phan hOi lai cac su kien (event) cua ASP.NET gi6ng nhu cac trang aspx. Khi EmployeeViewPagelet duqc phat trien, chung ta se thay dit~u nay trong each lam.

£)~ chay thir HeaderControl, ban them mQl Web Form moi van du an vdi ten Iii default.aspx. lIS lu6n Urn rnQt trang bitt dau rnang ten index.aspx hoac default.aspx; d6i voi trtrong hop cua ASP.NET, ta se sa dung default.aspx. Vi du 4.3-3 chua rna cua HTML cho tap tin default.aspx.

Vi du 4.3·3 default.aspx

1: <%@ Register 2:

3:

TagPrefix=:"EmployeeBrowser" TagName="EmployeeView" Src="Pagelets/HeaderPagelet.ascx"

%> 4:

5: <%@ Page language = "c#"

Codebehind="default.aspx.cs"

6: AutoEventWireup="false"

7: Inherits="EmployeeBrowser.MainPage" %>

8:

9 : < ! DOCTYPE HTML PUBLIC II -//W3C //OTO HTML 4 • 0

Transitional//EN"> 10: < HTML >

11: <HEAD>

12: <meta name="GENERATOR" Content="Microsoft

Visual Studio 7 .0">

13: <meta name = "COOE_LANGUAGE " Content="C#" >

14: <meta name=lvs_defaultClientScript"

content="JavaScript(ECMAScript)">

15: <meta name="vs_targetSchema" content:llhttp:

J/chema.microsoft.com/intellisense/ie5">

16: </HEAD>

CHudNG 4-3: WEBFORMS

485~

>:i1.i"

18:

:' <:body MS---,POSITIONtNG="Gr :l,dLayou t" > <form id="Form1" me t.hod.e v po at;"

runat="server">

19: <1-

20: Show off the newly created header control

21: -->

22: <EmployeeBrowser:HeaderControl

runat="server"

23: ImageUr1="- / images/logo. jpg" Text="

24: Employee Browser" />

25: </form>

26: </body>

27: </HTML>

Dong 1 girii th ieu khai niern v~ vi~c dang ky rnQt the. HeaderCantraI c6thil duoc gan vao TagPrefix hay TagNarne neu ban muon, Cuoi cung dong 22 la khai baa cua HeaderControL Chu y S\l' ket hop TagPrefix:TagName diroc sti' dung M nhan biet mQt th~ hien cua thanh phan header. CU phap nay co ve 11;1 - hoigiong voi asp:label hay asp:image phai khOng? Yang, asp 1;\ TagPrefix va label hay image la TagName.

1.3. Employee'Vlew'Pag'elett MQt each tie'p c~n lchac

Thay cho vi~c thao tac caccontrcl ella ASPrnQt each true tiep vao rna ngudn ella CodeBehind, EmployeeViewPageIet se sIT dung ti@ri trrnh xtr If ?J phia server M thiet lap cac thuoc tinh khac nhau cho de thanh to' chua ben trong n6. Hinh 4.3-3 cho thay ket qua hien thi hoan chinh ella EmployeeViewPagelet.

1'J1111111 Weeks ..

Richard

Hinh 4.3-3 Thanh pluin. EmployeeViewPagelet

Thanh phan EmployeeViewPagelet diroc s11 dung dii' hien thi rna so' nhan vien, ten, hmh, va nut nhan Edit lien ket vdi trang Edit. Viec hmh thanh rna ella ASP.NET va HTML kha dan gian, nhirng co mQt su khac bi~t kha tinh vi giUa vi~c thuc hien ella thanh phan nay vdi cai hien e6 trong HeaderControl. Vi du 4.3-4 trinh bay rna HTML cho Employee ViewPagelet ..

~486

"

PHAN IV : Ky thuat Web

Vi du 4.3-4 EmployeeVi(·wPagclet.ascx

1: <%@ Control Language="c#"

2: AutoEventWireup="false"

3: Codebehind=

"EmployeeviewPagelet.ascx.cs" Inherites= "EmployeeBrowser.Pagelets.

EmloyeeViewPagelet"%>

4:

5 :

6: <asp: Table id::IEmpViewTab1e"

7: runat="server"

8: BackColor="LightGray"

9: BorderColor="Purple"

10: BorderStyle="Ridge"

11: BorderWidth="2px"

12: Height="100px"

13: Width="25%"

14:

15: 16: 17 : 18: 19: 20: 21: 22:

23:

24: <asp: Image runat="server"

25: lmageUrl = I <%# "-/images/employees!"

+DataBinder. Eval (this, " lma"geName" )%>' ID="Image1"!> 26:

27: 28: 29: 30: 31: 32:

33: 34: 35: 36:

37: 38:

39: 40:

<asp:TableRow>

<asp :TableCell BorderStyle="Ridge" BorderWidth="2px" VerticalAlign="Middle" BackColor="Black"

HorizontalAlign="Center" BorderColor="Qray" ID="EmpicCell">

</asp:TableCell>

<asp: TableCe1l BorderStyle=" Sol id" BorderWi9-th="2px" BorderColor="Red"

ID="EmDataCell">

<asp:Table id="EmpDataTbl"

runat="server" width="100%"

<asp: TableRow> ~asp:TableCell VerticalAlign="Middle" HorizontalAlign="Center" style="FONT-WEIGHT:boldi FONT-SIZE:medium;

cm1dNG 4-3: WEBFORMS

48711J

41:

COLOR: purple" BorderStyle:::"Ridge" BorderWidth="2px" Text="Employee ID" / >

42~"' 43:

<asp:TableCell VerticalAlign="Middle"

44:

HorizontalAlign="Center" 45:

WEIGHT:bold;

style="FONT-

46:

FONT-SIZE:medium; COLOR:purple" BorderStyle:::"Ridge" BorderWidth="2px"

<%#

47 :

DataBinder.Eval(this,

48: 49: 50: 51: 52:

"Employeeld"}%> </asp:TableCell> </asp:TableRow>

53: 54:

<asp:TableRow> <asp:TableCell VerticalAlign="Middle" HorizontalAlign="Center" style="FONT-WEIGHT:bold; FONT-SIZE:mediumi

COLOR:purple" BorderStyle="Ridge" BorderWidth",I'2px" Text="Employ.e Name"/>

55:

56: 57 :

<asp:TableCell VerticalAlign=IMiddle"

58:

HorizontalAlign="Center" 59:

WEIGHT:bold;

style="FONT-

60:

FONT-SIZE:medium; COLOR:purple" BorderStyle="Ridge" BorderWidth="2px"

<%#

61:

DataBinder.Eval{this,

62: 63: 64:

"FullName"} %> </asp:TableCell>

</aap:TableRow>

~488

PnAN IV: Ky thu4t Web

65: 66: 67 :

6B: 69: 70:

<asp:TableRow> <asp:TableCell/> <asp:TableCell HorizontalAlign="Right">

<asp :Button id="btnEdit"

71: 72:

runat="server" onclick= "OnEdit_Click" Text =" Edi t"

CommandArgument= "Employeeld")%>'/> </asp:TableCell> </asp:TableRow> </asp:Table> </asp:TableCell>

</asp:TableRow>

</asp:Table>

'<%# DataBinder . Eval (this, 73:

74:

75: 76: 77: 78:

Nhung dong th1j.t sl,i cAn quan tam a day Iii 25, 47,61, va 72. Chu it <%# DataBinder. Eval (this, "Employee") %> treri dong 47. DAn huang nay tuong tu vdi mQt kh6i script duqc bigu thi bi'ri <;~p <% %>. Tuy nh ien, kh6i nho nay tao nen sl,i ke't n6i di1li~u giUa thuoc tinh Employeeld vai cai du'qc dinh nghfa ben trong EmployeaView.ascx.cs. KiE)"u kat nbi da li~u nay c6 thg duoc sU- dung thay cho vif;\e phai thao tac tUng .thuQc ttnhcua control. Lop EmployeeView dinh nghia nhfrng thuoc.tinh c6 th~ rang buec vdi cac thanh to' ella asp. Trong suot qua trinh nap trang chua thanh phan di~u khign EmployeeViewPagelet, ta't ca cac d:l.n huang ke't nbi diJ li';m se duqc teae hrong. Ky thuat nay lam eho viec phat trign d~ dang hun vi n6 khong cAn quan tam den u(t cit cong viec a ben trong.

Mot trong nhii'ng dongthu vj nha't trong vi du 4.3-4 la dong 72: 72: <asp: Button oncLi.c ke t on ad i t_Click" runatoc" Server" Textoc"Edit"

Commandargumentc:"<%#DataBinder.Eval(this, "Employeeld") % >"

d day, ta khai bao mi)t asp: Bu t ton cung vci su kien onclick dugc lien ke't vrri phucng thuc OnEdi t_C 1 i c k. Bat cu khi nao mot control a phi a server diroc kioh hoat, mi)t 91,1 kien PostBack duqc goi den server cung vdi thong tintrang thai chua trong cac trudng An tren form. as p : Bu t t on co thuQe tmh commandargument c6 th~ dung d{; cung cap thong tin phu trn, chang han ngu canh cua nut nhan (button) duoc sU' dung nhu the' nao. Trong truong hop nay, Employeeld dang diroc sa dung nhu commandargument. Vi du 4,3-5 chua rna cho EmployeePagelet dudi hinh thuc cua m9t trang Code Behind mang ten Employee View.cs.

Vi du 4,3·5 EmployeeViewPagelet.ascx.cs

1: name space EmployeeBrowser.pagelets 2; {

CHUONG 4·3: WEBFORMS

489\IJ

3: using System;

4: usingSystem.Data;

5: using System. Drawing; 6: using System. Web;

7: using System. Web. UI. WebControls; 8: using System. Web. UI. HtmlControls; 9 :

10: III <summary>

11: I I IT6m tAt au mo ta EmployeeListing.

12: I I I c z summa.ry»

13: public abstract class EmployeeViewPagelet

System.Web.UI.UserControl

14: {

15: protect System. Web. UI. WebControls. Button

btnEdit;

16:

17 : private string ernployeeld;

18: private string FirstName;

19: private string LastName;

20: protect System.Web.UI.WebControls.Table

ErnpviewTable;

21: private Guid Pictureld;

22:

23:

24: public string Employeeld

25: {

26: get

27: {

28: return employeeld;

29: }

30: set

·31: {

32: ernployeeld = value i

33: }

34: }

35:

36: public string FirstName

37: {

38: get

39: {

40: return fi~stName;

41: }

42: set

43: {

44: firstName = value;

45: }

46: }

47:

il490

public string LastName {

48: 49: 50: 51: 52: 53: 54 : 55: 56: 57 : 58: 59 : 60: 61: 62: 63: 64:

65: 66: 67 : 68: 69: 70: 71: 72: 73: 74: 75: 76:

77: 78 : 79: 80: 81: 82: 83 : 84:

85: 86: 87: 88: 89: 90: 91:

PHAN IV : Ky thu~t V

get {

return lastName;

}

set {

lastName = value;

}

public string FullName {

get {

returnstring.Format("{O}, (1}", lastName, firstName );

}

public GuidPictureId {

get {

return pictureId;

} set {

pictureId = new Guid ( value. ToString ( ) ;

}

public string ImageName {

get {

return string. Format (" {OJ .jpg", pictureId.ToString( »;

}

}

///<summary>

prblic EmployeeViewpagelet ( {

this. Init += new System. EventHandler ( Page_Ini t ) ;

4911!J

CHUdNG 4-3: WEB FORMS

92: 93: 94:

95: 96: 97 : 98: 99:

100: 101: 102:

103: 104: 105: 106: 107 : 108:

109: 110: 111: 112: 113:

}

private void Page_Load(object sender, EventArgs e)

I I Nguai dung d~t code khai dQng trang 6 d&y

}

private void Page_Init (object sender, EventArgs e)

{

1/

IICODEGEN: CUQc 99i nay duqc yeu diu Ilboi the ASP .NET Web From Designer. 1/

InitiaIizeComponent();

}

111<sununary>

IIIBQ xU: Iy sll ki~n cho nut nhAn Edit. Phuong Illthuc nay dAn d~n mQt trang aoari thao va Illtruy"Em Employedld nhu mQt d6i B6 URL

I I I d~n trang

111<sununary>

111<param name="sender"></param> I I I<param name="e"></param>

protected void OnEdit_Click( object sender, EventArgs e )

114: {

115: Response.Redirect(

116: string.Format( "-/EmployeeEdit.

aspx?Empld={O}",

117 :

btnEdit.ConunandArgument)

118: );

119: }

120:

121 : 122: 123:

124 : 125 : 126: 127 :

#region Web Form Designer Generated code

II I Phuong thuc yeu cau nguoi thiElt ke ho trq III-dling sua d6i nQi dung cua phuong thuc

II I nay dOi voi vi$c e oan thao code. 111</summary>

private void InitiaIizeComponent () {

this .1oad += new System. EventHandler ( this.Page_Load);

128:

129: }

~492

PHAN IV : Ky thuat 1

I

J ...

130; 131: 132: }

#endregion

Lap EmployeeViewPagelet that sl! chi la mot t~p hop cac thuoc tfnh ~ nhau cling v6'i bi? xli If cho SlJ kien click cua asp:Button. Khi su kien click I sinh. EmployeeId duoc lay tl1 thuoc tinh Command.Argument. Ke den, phuong I Response.Redirect duoc sli dung d~ chuyen sang trang Edit va Employeeld ( truyen thea ki~u dac thu cua plunrng thuc GET trong HTTP.

Den luc nay, chung ta da tao diroc hai control. Moi cal sli dung mot each d.;it khac cua ASP.NET M thuc hien chirc nang theo yeu diu.

2. cAe TRANG ASPX

Bay gier chung ta co hai UserControl, da den hie de tao viii trang aspx ( cac control nay. Trang Mu tie n la Employee Edit. Trang nay cho phep thanh p ErnpIoyeeViewPagelet tuong lac qua lai voi trang soan thao. Trang soan thao 1 cho phep thay diSi ten nhan vien, phorig ban, va tai binh.

2.1. EmployeeEdit

M(Jt trong nhung yeu cau d6i vdi site ErnployeeBrowser la kha nang, thao thong tin cua nhan vien va gf\n hinh vao. Thay cho vi$c xay d UserControl khac, chrrc nang nay se thuc hien ben trong ngii' canh cua mot tr aspx.

Hinh 4.3-4 cho tha'y trang EmployeeEdit vdi m(Jt mau tin (record) da ( soan thao.

Browse ... ,

Emplogee Id 11111 n 1111

First Name Last Name Department

IRichard

]Development o::t

Hrnh 4.3-4 Trang EmployeeEdit

Control diu tien dEl xern Iii danh sach so xuong (drop-down list) dU'l1 dung dEl gia ten cua cac phong ban khac nhau, Can cac gia tri cO' dinh vao danh sach (list box) hay trinh dan so xuorig' (drop-down menu) la cAn thiet. V 4.3-6 cho thay khai baa cua asp:dropdownList se dircc k€t n6i vao met bien trong rna nguon cua EmployeeEdit.cs.

'ClllfdNG 4-3: WEBFORMS

493~

Vi dl.J4.3-6 Doan trieh dropdownlist tu trong EmployeeEdit.aspx

l:<tr>

2: <td>Department</td>

lac 3: <td>

lat 4.: <asp:dropdownlist runat","Server"

,~ id="Departments" />

~ 5: <ltd> 6:</tr>

;ai Thay vi khai baa cac muc danh sach Listiterns trong trang aspx, rno i

WebControl trong ASP.NET cung cap each rang buoc di1 Iieu tucng tv voi cac controL cua Windows Form. Trang dean rna cung cap eho trang EmployeeEdit.aspx, 11 d6 se ti\n tai doan rna M thiet lij,p dii' Ii~u rang buoc cho control. Cac phong ban duoc gii1 trong mot mang danh sach nhu sau:

~n ArrayList Depts '" new ArrayList ( ) ;

,iii FillDepts (Depts);

Departments. DataSource '" Depts; Departments.DataBind();

Thiet, Li!.p mot thanh phan rang bU9C du li~u khbng can nh ieu cong sue cua

~n ngL16"i phat tri~n. Dl nhien, nhu bat ky WebControl nao khac, viec truy xuat thuc

'lg til luon luon la tuy chon. Neu vii)c rang buoc du lieu khcng phu hop yeu cau, tht co

'lg the viet rna bAng ngon ngu Cit Mdii;u khien toan bQ qua trtnh rang buoc.

Control ke tiep cAn quan tam la thanh phan nhap \i~u (input) co thuoc tinh

gc type diroc gan Iii. "file". No cho phep nginri dung duyet chon mot file hinh tren dia va tai len Web server.

<input type="file" id="EmplmageFile" name="EmplmageFile" runat="server" >

Day kh6ng ph iii La thanh phan (control) co kieu asp:", hay xern no co the duge truy xuat' 11 phia sau rna trang nhu the nao? ASP.NET cung cap viec rang bUQc cac thanh phan ella HTML giong nhu cac WebControl. Khi the input du'gc chi ro vdi type = "file", ban se dligc sinh rna M tao mot bien eo kieu nhu sau:

System.Web.UI.HtmlControls_HtmllnputFile

Di§u nay cho phep trang rna truy "uAt nguoc lai cac thanh to cua HTML. Vi du 4.3-7 cho thay chuang trinh C# cho EmpLoyeeEdit.aspx.es

Vi du 4.3-7 EmployeeEdit.as x.cs

'P lu ·n

1: using System;

2: using System. Collections i

3: using System.ComponentModel; 4: using System_Data;

5: using System. Data. SqlClient; 6: using System. Drawing;

~494

PuAN IV : Ky thui).t WejJ

7 : using System. Web;

8: using System. Web. SessionState; 9: using System. Web. UI;

10: using System.Web.UI.WebControls; 11: using System.Web.U1.HtmlControls; 12:

13: using Stingray. Data; 14 :

15: namespace EmployeeBrowser

16: {

17: III <sununary>

18: IIIT6m t<'lt mo ta cho EmployeeEdit.

19: III < I sununary>

20: public class EmployeeEdit : System.Web.UI.Page

21: {

22: protected System. Web. U1. WebControls. Image

Ernployeelmage;

23: protected System. Web. U1. WebControls. Label

Employee1d;

24: protected System. Web. U1. WebControls. TextBox

FirstName;

25: protected System. Web. U1. WebControls. TextBox

LastName;

26: Protected System. Web. U1 . WebControls.

DropDownList Department;

27: protected System. Web. U1 . WebControls. But ton

btnUpdate;

28: protected System. Web. U1. HtmlControls.

Html1nputFile Emp1mageFile; .

'to,!!

'.d

29:

30: public EmployeeEdit ()

31: {

32: Page.lnit += new System. EventHandler (

Page_1nit);

33: }

34:

35: protected void Page_Load (object sender,

EventArgs e)

36: (

37 : I I Nguai dung d~t code kh6i d¢ng trang 6 day

38:

39: IICho phep k~t n6i du: li$u

40: DataBind( );

41:

42: if (!IsPostBack)

43: PopulateForm( );

44: else

45: UpdateEmployee ( );

CHUONG 4-3: WEBFORMS

495\!J

46: 47 : 48: 49: 50: 51:

}

private void PopulateForm( {

string Empld = this. Request. QueryString [" Emp1d n] . ToString ( ); SqlConnection dbCon::; DBAccess.

. AcquireConnection ( ); SqlDataAdapter cmd '" new SqlDataAdapter ( string. Fortmat ("SELECT'" FROM EMPLOYEE WHERE EMP _1D '" {O}", Emp1d), dbCon) i DataSet dsResult = new DataSet ( ); Employee emp = new Employee ( );

52:

53:

54: 55: 56: 57 : 58: 59:

cmd.FillDataSet ( dsResult, "EMPLOYEE" ); if ( dsResult. Tables ["EMPLOYEE"] !;; null) emp. FromDataRow( dsResult. Tables [" EMPLOYEE"] • Rows [ 0] );

60:

61: liGan gia tr:j. vao ca c field

62: this. Employeeld. Text = emp. Id;

63: this.FirstName.Text = emp.FirstName;

64: this. LastName. Text ::; emp. LastName;

65: this. Employeelmage . ImageUrl =

66: string.Format("-/images/employees/{O}.

jpg",emp.pictureId.ToString( »;

67 :

68: I /T"9-o danh sach phong ban

69: cmd. SelectCommand. CommandText =

"SELECT'" FROM DEPARTMENT";

70: cmd.FillDataSet( dsResult, "DEPARTMENT");

71: Hashtable ht = new Hashtable ( );

72:

73: foreach( DataRow row in dsResult .Tables ["

DEPARTMENT"].Rows)

74: {

7 5: int nValue = (int) row [ "DEPT_ID"] ;

76: string Name = (string)row["NAME");

77: ht .Add( Name, nValue ) i

78: thi s .1bDepartment . Items. Add ( Name ) ;

79: }

80:

81: this.Session{"DEPT_MAPPING") =hti

82: this.Session["CACHE:EMP"] ::; emp;

/ /luu nh4n vi~m

83:

84: }

~496
85:
86:
87;
88:
i 89:
;
;1
90:
91:
92 :
93 :
94 :
95:
96:
97 :
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
lID: PHAN IV : Ky thu~t ~

private void UpdateEmployee ( {

Employee emp = (Employee)Session[" CACHE:EMP"I;

emp. FirstName = this. FirstName. Text; emp.LastName = this.LastName.Text;

/ /Hl:y Department m6i

Hashtable ht = (Hashtable) Session [" DEPT_MAPPING" I; int DeptId = (int) ht [ this .1bDepartment.

SelectedItem.Text Ii

emp. DeptId = DeptId;

/ /Lflyhinh

if ( this. EmpImageFile. PostedFile ! = null &&this.EmpImageFile.PostedFile.FileName

Length >0 ) {

/ ra« b6 hinh ell string strFileName = string.Format(

Ill:

"C:/Inetpub/wwwroot/ErnployeeBrowser! images/employees! {O} • jpg", emp.PictureId.ToString{ ) ;

112: 113: 114: 115: 116: 117 : 118: 119:

System.IO.File.Delete( strFileName);

emp.PietureId = System.Guid.NewGuid( ) J strFileName =

string. Format {

120: 121: 122 : 123:

"C:/Inetpub/wwwroot/EmployeeBrowser/ images/employees/{O}.jpg", emp.PictureId.ToString( ) i

this.EmpIrnageFile.PostedFile.SaveAs( strFileName ) i

CIllfONG 4·3: WEBFORMS

497~

124:
125:
126:
127:
128:
129:
130:
131:
132 :
133:
134:
135:
136:
137:
138 :
139:
140:
141:
142.:
143:
144:
145:
146:
147:
148:
149:
150:
151 :
152:
153:
,154 :
155:
156:
157:
158: }
159: } I IC~p nh~t nhan viEm

DBAccess.Save( DBAccess.AquireConnection( ), emp );

string strUrl = string.Format(

" EmployeeListing.aspx?Deptld={O}& FirstName={1}&LastNarne={2},

emp.Deptld, emp -. FirstName, emp.LastName

) ;

Response.Redirect( strUrl);

}

private void Page_lnit (object sender.

EventArgs e)

II

IICODEGEN: CUQc 99i nay dUQ'c yeu c§.u Ilboi the ASP . NET Web From Designer.

II lnitializeComponent();

}

#region web Form.Designer Generated code II I <summary>

III

I I I dung sua deli n9i dung cua phuong thuc

I I I nay d6i vof, vi~c sO<;ln thao code. 111<summary>

private void lnitializeComponent () {

this.load += new.

System.EventHandler(this.Page_Load);

} #endregion

Trang EmployeeEdit duqc thie"t ke' M nhan m/?t chuM truy van chua Employee ID; Ban My nho lai vi du ve EmployeeViewPagelet va doan rna chua ben trong phuang thirc OnEdit_Click trong vi du 4.3-5 c6 nQi dung:

~498

pHAN IV : Ky thuij.t Wei

113:

protected void OnEdit_Click{ object sender, EventArgs e )

114: 115: 116:

{

Response.Redirect(

string.Format( "-/EmployeeEdit. aspx?Empld={O} ",

117: btnEdit.CommandArgument)

118: ) ;

119: }

Khi nut nhan Edit se khien phat sinh sl,1 kien nbap chuot (click), thuoc tin CommandArgument chua Employee ID. Employee ID nay du~c dung d€ tao mt yeu cau GET cua HTTP. Dong 115 cho thay cu phap d~ cac tham so truyen 1 trang nay sang trang khac,

Phuong thuc PopulateForm, a vi du 4.3-7 truy xufit den thanh ph~ QueryString cua d6i urong Request. d day chung ta bO qua vii;c kii1m tra 16i \ dan hudng den trang 1M. Employee ID clnra tat ca cac thong tin trang thai d thiet d~ dua cac di~u khien dol tao van bEm trong trnng.

B€ luu gift thOng tin, chang han nhu thong tin trang thai hay cac d6i tugn c6 hai tuy chon hi dung Session hoac Cache, Trang ErnployeeEdit sli dung d1\ h trft moi loai du Iieu cdn thiet, MQt Session vAn c6 th~ ton tl;li neu !IS bi hong : tien trinh cong viec khdi tao lai, nhung Cache tht khong, Khi quyet dinh thong t nen dugc hru trft ij dau, ban se cdn phai khao sat mire dQ can thiet cua dft li~u ' bao dam rang n6 an toano

Ca hai doi tuong Session va Cache d~u chLta mQt bang bam (hash) dil al xa mot khoa van dol tugng rna ban mu6n luu tru, Trang EmployeeEdit luu tru bang bam (hash) Ian doi tuong Employee trong Session.

Khi nut nhan Update phat sinh 511 kien click (nhap chuot), trang dl1Q'c n lai cung viti viec gan cho IsPostBack ia true. Page_Load ki€m tra di~u kien nay g9i Updatehbnployee thay cho PopulateForm.

2.2; EmployeeListing

Chung ta ct1ng dang blit dii.u vdi (eng dung Web EmployeeBrowser. Sau ~ hoan thanh He~derControl, EmployeeVlew, va trang EmployeeEdit, dol d?ln I phai tao trang Listings. Trang Listings hi€n th; mot hoac nhii\u thanh phan di khien EmployeeView va k& ca viec phan trang tdi lui duyet qua danh sach ( nhan vien,

Htnh 4.3·5 cho thay thanh phan di~u khi&n co ban cua danh sach Listi hi~n thj hai dong cho mOi trang man hinh. B<,In cilng nen chu y di'in nut nh Next» a cu6i cua form. Khi viec phan trang xay ra, EmployeeListing.aspx Be 1 dinh xem c6 cac mdu tin trudc d6 hay khong, va hi~n thi mQt nut nhsn «Prev I

:'"'
hi
.ic
~u
k
19
In
ac
hi CHUdNG 4-3: WEBFORMS

499~

thich hqp (hinh 4.3-5). Tunng tl! nhu vl).y d6i vai mit nhan Next». N~u c6 them mtiutin, nut nhan nay se hien len; neu kh6ng, nut nhan Next» se bi giAu di.

. Nhu ban c6 tM thAy, d day khOng doi hoi bAt cd rang buoc nao v~ kich

thliac anh, Cach don gian nhat la xac dinh kieh thlf6'c anh cho phep va loai hi) bat ky anh nao khong phu hop voi cac tieu chuan v~ kieh thucc,

Viiy trang EmployeeListing hi~n thjEmployeeViewPagelets nhu the nao?

Kha dan gian. Di~u bi mij.t d day la phai sli dung di~ukhi~n asp:repeater. EmployeeListing sli dung repeater dEl hi€n thi danh sach .cua. cac nhan 'vi~n mM trang g6m m(it siS nguai. Vi du 4.3-8 cho thdy viec rang buoc voi di~u khign

h Employee View.

t U

h :a

n

a

n

u a

n a

Hinh 4.3-5 Employeeliisting hUn th] hai nluin oien.

~:

!.

Employee Listing

5~;r~:

1".~lj·

fi~:,:

I£..:E.,.].

Hinh 4.3-6 Employeel.isting hie'n tlii hai nluin. uien ua nut Preu duqc b~

Vi dlJ4.3·8 Do~n trich til EmployeeListing.aspx

1: <asp: repeater id=EmployeeRepeater runat=

"server">

2: <template name = "ItemTemplate " >

3: <tr>

4: <td>

5: <stingray: EmployeeView runat="server"

6 : Employeeld= r <%# DataBinder. Eval ( Container. Dataltem, "Id" ) %>'

7 : FirstName=' <%# DataBinder. Eval ( Container. Dataltem, "FirstNarne" ) %>,

8: LastNarne=' <%# DataBinder. Eva:a. (

cmJdNG 4-3: WEBFORMS

501~

Container.Dataltem, "LastName" ) %>'

9: Pictureld=' <%# DataBinder. Eval (

Container. Dataltem, "PictureId" ) %>'

10: </EmployeeBrowser:EmployeeViewControl>

11: <ltd>

12: </tr>

13: < I ItemTemplate>

14: </asp:repeater>

EmployeeListing S11 dung diiiu khien rang buoc da lieu WebControl M thiet lap cac thuoc tfnh khac nhau cua thanh phan ErnployeeViewPageleL Chuy rAng m6i thuoc tinh cua thanh phan EmployeeViewPagelet duqc,gan gia trj qua viec sli d\lng

DataBinder. Eval ( Container. Dataltem, X )

d day x la ten cua mQt trirong trong bang da lii,iu ngu6n (datasource). Mil. nguon lin phia sau trang se tao mot mang ArrayList chua cac doi tLiqng Employee rang bucc danh sach nay vdi thanh phan di§u khien Employeeftepeater, Sli dung kj thu~t nay se khien cho viec rang buoc cac gia trj thuQc tinh rit nhe nhang! Trim thuc te, dean rna d vi du 4.3-8 la phan quan trong thuc su cua trang aspx. Phan con lal chi la cac rna trang trl HTML (k~ ca Header-Control),

Cho den luc nay cung nhu vdi moi trang aspx, tra\tg EmployeeListing thuc hien vi~c phan trang trong file nguon cn. Sau khi da liQu dLiqc lien ket vao repeater control, chi muc hi~n hanh duoc dify vao ngan xep 'va ngan xep d6 duqc luu vao Session. Khi nut Next hay Prev dircc nhan, chi muc dLiqe tinh cho rnuc ke' tiep hoac cho chi muc truce d6 dLiqe lay ra kh6i ngan xe'p. Vi du 4.3-9 trinh bay rna ngu6n cua trang EmployeeListing.

Vi dl.l4.3·9 Emofoyee Listfng.aspx.cs



1: using System; 2:usingSystem.Collections;

3: using System.ComponentModel; 4: using System. Data; ,

5: using System. Data. SqlClient; 6: using System. Drawing;

7: using System. Web; 8:usingSystem.Web.SessionState; 9: using System. Web_ UI;

10: using System. Web. UI . WebControls; 11: using System. Web. UI. HtmlControls; 12:

13: using Stingray. Data; 14 :

15: nameapace EmployeeBrows'er 16: {

17 :

18: class ViewerState

~502

PuA.N IV : Ky thui).t Web

19: 20:

{

21: 22: 23: 24: 25: 26: 27 : 28: 29: 30: 31:

32: 33:

34:

35:

36: 37: 38: 39: 40: 41: 42: 43:

44: 45: 46:

public static string VIEW_STATE_SESSION_KEY

= "EMPLOYEE_VIEWER_STATE";

public DataSet m_EmployeeCache;

public int m_RowCount = 0;

public int m_MaxPerPage = 5;

public int m_CurrentIndex = 0;

public Stack m_IdxStack = new Stack ( ) i

}

III <summary>

111~6m t;!lt mO tel EmployeeListing. I II < I summary>

public class EmployeeListing :

System.Web.UI.Page {

protectedSystem.Web.UI.WebControls.Button btnNexti protectedSystem.Web.UI.WebControls.Button btnPrev;

protected System. Web. U1. WebControls.

Repeater EmployeeRepeater;

private ArrayList m_EmployeeList;

private ViewerState m_ViewerState;

public EmployeeListing ( ) {

Page. 1nit+= new System. Event Hand ler{ Page_1nit)i

}

prrvate void Page_Load(object sender, EventArgs e)

47: {

48: if (! 1sPostBack)

49: {

50:

51: int Dept:rd = 0;

52: string FirstName;

53: string LastName;

54 :

55:

56: m_ViewerState = new ViewerState ( ) i

57: this.Session.Add(

ViewerState.VIEW_STATE_SESS10N_KEY, m~ViewerState);

CHUdNG 4-3: WEBFORMS

5031!!1

58:

59: GetParams ( out FirstName, out LastName,

ref DeptId,

ref m_ViewerState_m_MaxPerPage );

60:

61: LoadDataSet ( FirstName, LastName,

DeptId );

62 : 63:

64: 111uu chi muc hiEiln hanh

65: m_ViewerState.m_IdxStack.Push( 0);

66: int Index = this.CalcNextlndex( );

67: m_ ViewerState .m_Currentlndex = Index;

68: this.DisplayData( 0,

m_ViewerState_m_Currentlndex};

69: UpdateNavigationButtons( );

70:

71: }else{

72:

73: m_ ViewerState =

(ViewerState)this.Session[ ViewerState.VIEW_STATE_SESSION_KEY];

74: }

75:

76: }

77:

78: private void Page_Init (object sender,

EventArgs e)

79: {

80: 1/

81: IICODEGEN: Lai g<;>1 nay duqc yeu diu

II boi ASP. NET Web Form Designer.

B2: II

B3: InitializeComponent();

84: }

85:

86: protected void GetParams (out string

FirstName, out string LastName,

ref int DeptId, ref int MaxPerPage )

87: {

88: Deptld = this. Request . QueryString I."

Deptld"] == null?

89: -1 : Int32.FromString(

this.Request.QueryString[" DeptId"1 .ToString( »;

90:

91: FirstName = this. Request. QueryString l " FirstName"] == null?

~504

PHAN IV: Ky thuat Web

92:

"" : this. Request. QueryString l " FirstName"].ToString();

93: 94 :

95 :

96: 97 :

98:

99: 100: 111:

102: 103: 104: 105: 106:

107 : 108:

109: 110: 111:

112: 113: 114: 115:

116: 117 : 118: 119: 120: 121: 122: 123:

LastName = this. Request. QueryString [ "LastName"] == null?

"" :thi s . Request. QueryStr ing [ " LastName"] . ToString ( ) ;

MaxPerPage =this.Request.QueryString[ "MaxPerPage"l == null?

5 : Int32.FromString( this.Request.QuerYString[" MaxPerPage"] . ToString ( »;

}

protected void LoadDataSet (string FName, string LName, int Deptld )

(

if( Deptld!= -1) {

m~ViewerState.m_EmployeeCache= Search.Find( DBAccess.AquireConnection( ),

Dept Id, FName, LName);

} else (

m_ViewerState .m_EmployeeCache '" Search. Find( DBAccess.AquireConnection( ), FName, LName);

}

m_ViewerState .m~RoWCount = rn~ViewerState.m~EmployeeCache. Tables ["EMPLOYEE"] .Rows.Count; }

protected void DisplayData ( int Start Index, Lnt; Stoplndex )

{

m_EmployeeList = new ArrayList ( ) i

for(lnt 1 = Startlndex; i < Stoplndex; i++) {

Employee e = new Employee ( ); e. FromDataRow ( m~ ViewerState.

CHUdNG 4-3: WEBFORMS

5051t!l

124: 125: 126: 127: 128:

129: 130: 131: 132 : 133: 134:

135: 136: 137: 138: 139:

140:

141 : 142: 143: 144: 145:

146: 147:

148:

149: 150: 151: 152: 153: 154: 155: 156:

157:

158:

m_EmployeeCache.Tables[" EMPLOYEE" J . Rows [iJ ); m_EmployeeList . Add ( e );

}

/ /Rang bu¢c du li$u. EmployeeRepeater.DataSource= m_EmployeeList; EmployeeRepeater. DataBind ( );

protected void OnNext_Click{ object sender, EventArgs e )

{

/ /luu chi m\1C hiE1m hanh

int nLast· = m_viewerState.m_Currentlndex; m_ViewerState.m_IdxStack.Push( nLast);

m_ ViewerState .m_Currentlndex =

CalcNextIndex( );

Di!;lplayData ( nLast, m_ViewerState.m_Currentlndex ); UpdateNavigationButtons( );

}

protected void OnPrev_Click( object sender, EventArgs e )

{

int nStop = (int)rn_ViewerState.m_IdxStack.Pop( ); int nStart =

(int)m_ViewerState.m_IdxStack.Peek( ); Disp!ayData ( nStart, nStop ) ; m_ViewerState .m_CurrentIndex = nStop; UpdateNavigationButtons( );

}

protected int CalcNextlndex ( {

return (m_viewerState . m_Current Index + rn_ViewerState.m_MaxPerPage) > m_ViewerState.rn_RowCount

? rn_ ViewerState .m_RowCount : (rn_ViewerState . m_Current Index + m_ViewerState.m_MaxPerPage);

If!j506

pHAN IV : Ky thu~t We

}

159: 160: 161: 162: 163:

164:

165: 166: 167: 168: 169: 170 : 171 :

172:

173: 174: 175 : 176 :

177 : 178: 179 : 180: }

protected void UpdateNavigationButtons ( {

this .btnNext. Visible = m_ViewerState.m_Currentlndex < m_.ViewerState. m_RoWCount;

this .btnPrev. visible = (int)rn_ViewerState.m_IdxStack.Peek( ! '" 0;

}

#region Web Form Designer Generated code 111<summary>

I I I Phuong thuc din thH~t cho vi~c hO trq III dung sUa d6i n¢i dung cda

I I I phuong thuc nay doi voi vi~c SOi;ln thao

II I <summary>

private void InitializeComponent () {

this . load += newSystem.EventHandler(this.Page_Load); }

#endregion

}

Dil' xem viee rang buoc du li~u duoc thiet lap nhu the' nao, hay xem phum thirc DisplayData i'J dong 115. Mang ArrayList da dugc khi'Ji dung va cac doi turn Employee duQ'c them vao dira tren cac d6i s6 Start.Index va StopIndex truy~n cl phirong thee, Sau khi ArrayList duQ'c Hip dAy cac d6i tugng, thanh phi EmployeeRepeater dUQ'c rang buoc vito ArrayList. Vi~c rang buoc nay diroc th hien qua li(lnh:

<%# DataBinder. Eva! ( Container. Dataltern, X) %>

DEl duy trt thong tin trang thai cua khung nhm, chung ta tao ra mQt 1, nho ViewerState. ViewerState duy tri met DataSet tuang ling vai cac tham s6 du truyen vao trang. Ngoai ra ViewerState cung duy trt chi rnuc hien hanh va c tuong ngan xep M chua cac chi rnuc truac d6. Ngan xep nay duoc sa dung nh~ giup cho viee danh s6 trang dtiQ'c thuan ti~n. Phan ma con lai c EmpIoyeeListing g6m c6 viec nap dii: Iieu, tfnh chi muc, va xU If 51! kien OnCli cho cac nut btnNext va btnPrev cua WebControL

CHudNG 4-3: WEBFORMS

507~

2_3. Trang tim kie'm: Ndi b~t d~u tim thong tin

Ben trong ling dung Web EmployeeBrower chung ta cAn mot di~m tiep c?n va cung cap thong tin. M(it trang tim kiem dan gian se phu hop vrri yeu cau cho phep nglioi dung chon phong ban, ho ten, s6 trang cua danh sach cAn xern. Cac chon lua nay sau d6duqc truy~n nhu tharn s6 den trang Employee1..isting.aspx xli IY·

Giao di~n trang Search diroc trlnh bay nhu hinh 4.3-7 se duqc dung d~ bat dftu irng dung Web EmployeeBrowser.

Employee Search

r:

Hinh 4.3-7 Trang tim kiem (search).

Cho den luc nay day duoc xem La phan nho nhat trong tAt ca cac vi du d:l trinh bay. V~ co ban, trang nay cho phep nginri dung chon phong ban, ho ten, va so cua dong liet ke trong danh sach a m6i trang. MOt Ian ntra, thay cho vi~c tao mot pagelet duqc d§.n xua."t tU UserControl, trang aspx dUQ'c dung dEl t?P hop du lieu nhap dAu vao va tao met loi yeu cAu cr dang URL gQi trang EmployeeListing. Vi du 4.3·10 chua rna nguon HTML cho trang EmployeeSearch.aspx.

Vi d\l4.3·10 EmployecSearch.aspx

1: <%@ Register TagPrefix="EmployeeBrowser"

~508

PRAN IV : Ky thu~t Web 1 TagName::;: '.'Hea.derControl."

Src=" - /Pagelets/HeaderPagelet. ascx" %> i

2: <%@ Page language="c#"

Codebehind=" EmployeeSearch. aspx. cs'" AutoEventWireup=" false" Inherits="EmployeeBrowser.EmployeeSearch"%>

3: <IDOCTYPE HTML PUBLIC "-/ /W3C/ /DTD HTML 4.0

Transitional//EN"> 4: <HTML>

5: <HEAD>

6: <meta name = "GENERATOR" Content="Microsoft Visual Studio 7 . 0" >

7: <meta name="CODE_LANGUAGE" Content="C#">

8: . <meta name = "vb_defaultClientScript .. content="JavaScript (ECMAScript) I'>

9: <meta name="vs_targetSchema" content,,,''http://schemas.microsoft.com/ intellisense">

10: <HEAD>

11: <body MS_POSITIONING= "GridLayout II >

12: <form id",IIEmployeeSearch" method="post"

runat="server">

13:

14: </--

15: Chem m¢t header control tuy bi/l!:n

16: -->

17: <EmployeeBrowser:HeaderControl

runat="server" Text="Employee Search" ImageUrl="-/images/logos/logo.jpg" ID="Headercontrol1" NAME="Headercontrol1" />

18:

19: <!--

20: BAt dau phan giao di~n cua trang tim kiEim

21: -->

22: <table style="BORDER-TOP-STYLE: outset;

BORDER-RIGHT-STYLE: outset; BORDER-LEFT-STYLE: outseti BACKGROUND-COLOR: 1 ightgrey;

BORDER- BOTTOM-STYLE: outset" >

23: <tbody>

24: <tr>

25: <td>Department</td>

26: <td>

27: <asp:dropdownl.ist id","

lbDepartments" runat="server"· I »

28: <ltd>

29: -c Is:»:»

CHlfONG 4·3: WEBFORMS

509~

30:

3i: <tr>

32: <td>First Name < ltd>

33: <td>

34: <asp:textbox runat="serv&"

id=" txtFirstName" I>

35: <ltd>

36: < Itr>

37 :

38: <tr>

39: <td>LastName</td>

40: <td>

41: <asp:textbox z une.t. .... server"

id;:"txtLastName" I>

42: <ltd>

43: </tr>

44:

45: <tr>

46: <td>Max Per Row</td>

47: <td>

48: <asp: textbox runat=" server"

id=" txtMaxPerRow" I>

49: <ltd>

50: </tr>

51:

52: <tr>

53: <td> <! --D€! mot; khoang trAng dedq..t mit nhan vao c¢t thu hai --></td>

54: e t d align=right>

55: <asp:button id="btnGO"

onclick="OnSearah_Click" text="GO!" runatc"server" I>

56: <ltd>

57: </tr>

58:

59: </tbody>

60: </table>

61: < I form>

62: </body>

63: </HTML>

Nhu ban co th~ thay, viec tao giao dien .kha dan gian. D€ Y su pha trQn cua chuan HTML va ASP.NET. Neu khong co nhu cau cdn den cac control i1 phia server (server-side), thl nhtrng thanh ph an HTML chu§n hoan toan phu hop veri muc dlch cua chuang trmh, SI! thuan lqi cua cac thanh phan i1 phia server do ASP.NET cung cap la kha nang dieu khien tham chi ngay ca phia trlnh duyet,

Cho den hie nay rna cua EmployeeSearch.cs (xem vi dl,l 4.3-11) vAn ap dung cac ky thuat xay dirng' trang truce day. D6i tugng Section duoc dung M chua thong

~510

PuAN IV : Ky thuat \

tin dung cho viec anh xa, asp:dropdownbox sit dung rang buoc di1 lieu, va PostBack duqc tien hanh, di1 li~u thanh phan duqc Iffy ra tCr lenh HTTP GET trang EmployeeListing.aspx.

Vi d'u 4.3-11 Em loyeeSearch.cs

1: using System;

2: using System. Collections ;

3: using System. Component Mode 1 ; 4: using System. Data;

5: using System.Data.SqlClient; 6: using System. Drawing;

7: using System. Web;

8: using System. Web. SessionState; 9: using System. Web. ur;

10: using System. Web. ur . WebContro1s; 11: using System. Web. ur. HtmlControls; 12:

13: usingStingray.Data; 14 :

15: namespace EmployeeBrowser 16:

17 : / / / < summary>

18: / / /T6m tilt m6 ta ErnployeeSearch.

19: / / / < /summary>

20: public class EmployeeSearch

Systefu.Web.Ur.Page

21: {

22: protected System. Web. ur. WebControls.

DropDownLi s t Department s ;

23: protected System. Web. ur. WebControls.

TextBox FirstName;

24: protected System. Web. nr , WebControls.

TextBox LastName;

25: protected System. Web. ur. WebControls.

TextBox MaxPerRow;

26: protected System. Web. nr . WebControls.

Button btnGO;

27:

CHlfdNG_ 4·3; WEBFORMS

511~

28: protected ArrayList DepartmentList;

29: protected Hashtable htDeptMapping;

30:

31:

32: public EmployeeSearch()

33: {

34 : Page. Ini t += new Sys tern. EventHandler (

Page_Init);

35: }

3~:

37: protected void Page_Load(object sender,

System. EventArgs e)

38: 39: 40: 41 : 42: 43: 44:

if ( ! this. IsPostBack ) {

htDeptMapping '" new Hashtable ( ); LoadData ( );

45:

this. Session. Add ( "SEARCH_HT_MAPPING", htDeptMapping );

Departments. DataSource '" DepartmentList;

Departments.DataBind( );

46: 47 : 48: 49: 50:

} else {

51: 52:

53: }

54 :

55: private void Page_Init (object sender,

htDeptMapping", (Hashtable)this.

Session ["SEARCH_HT_MAPPING"] ; }

EventArgs e)

56: {

57: 1/

58: I/CODEGEN: Lai 99i nay dugc y€!u diu

/ / hoi ASP . NET Web Form Designer.

1Mi5l2

pRAN IV : Kj thu~t WE

59: 60: 61: 62: 63:

64: {

65:

66:

67 :

68:

69:

70: 71: 72: 73: 74:

75: 76: 77: 78: 79: 80: 81: 82:

83: 84 : 85: 86: 87 : 88: 89: 90: 91:

/I InitializeComponent();

}

protected void OnSearch_Click( object sender, EventArgs e )

IIL:i.y cac d6i s6 duoc ob.on

if (this. ht DeptMapp ing """ null) {

Response.Redirect{ "EmployeeListing. aSpx?MaxPerPage=5" );

}

else

int DeptId = (int) this. htDeptMapping [ Departments.SeleetedItem.Text];

string FirstName := this. FirstName. Text, string LastName = this. Las t Name • Text i

int iMaxPerRow '" 5;

if ( MaxPerRow. Text ! '" .... ) {

iMaxPerRow =. Int32 Parse ( this.MaxPerRow.Text);

}

IlxfJ.y dl.,Ing request URL string request i

it( DeptId != 0) {

obj ect [] args '" { DeptId, FirstName I LastName, iMaxPerRow } ;

CHudNG 4·3: WEBFORMS

513~

92:

93: 94:

95:

96: 97: 98:

request = string.Format("DeptId={O}& FirstName={1}&LastName={2}& MaxPerPage={3}", args);

} else {

object[] args = {FirstName, LastName, iMaxPerRow } ;

request = string. Format (" FirstName={0)&LastName={1}& MaxPerPage={2}", args);

}

Response. Redirectxz( string.Format(" EmployeeListing. aspx? {O}", request) ) i

99: }

100; }

101:

102: protected void LoadData (

103: {

104:

105: SqlConnection dbCon = DBAccess.

AquireConnection( );

106: SqlDataAdapter coo = new SqlDataAdapter(

"SELECT * FROM DEPARTMENT", dbCon ) ;

107: DataSet dsResult = new DataSet ( );

108: cmd.Fill( dsResult, "DEPARTMENT" };

109:

110: 111: 112: 113: 114:

115: 116: 117 : 118 : 119: 120:

DepartmentList = new ArrayList ( ); DepartmentList .Add( "All Departments" ) i htDeptMapping .. Add( "All Departments", 0 );

foreach( DataRow row in dsResult.

Tables ["DEPARTMENT"] .Rows ) {

Department d = new Department ( ); d.FrornDataRow( row); DepartmentList . Add ( d.Name ); htDeptMapping.Add( d.Name, d.Id);

}

~514

PHAN IV : Ky thu~t We

121: 122: 123: 124: 125: 126: 127 : 128: 129: 130: 131:

132: 133: 134: 135 :

136:
137:
138:
139: }
140: } dbCon. Close ( ); dbCon.Dispose( ); dsResult.Dispose{ );

}

#regoin Web Form Dsigner generated code I 11< summary>

III

I I I dung sua d6i no L dung cu a phuong thu:c nay /II

111<summary>

private void InitializeComponent ()

this . load +=

new System. EventHandler (this . Page_Load) ;

} #endregion

Vai vi~c hoan thanh trang EmployeeSearch, U'ng dung EmployeeBrowser san sang hoat dOng. ChU(1ng trmh khong di sau van thanh phan giao dien nhu ban vAn co thli' tv minh thirc hien cong viec con lai nay.

3. KET eHUONG

ASP.NET WebForms mang lai cho moi truGng phat trili'n Web truyen thO mQt luang sinh khi mal. WebFroms chu y den cac U'ng dung Web dong va rna dil dien dat hieu qua, de phat trili'n va phu hop vdi nhu cau ngay cang cao ( Internet hon. Vai tren 45 thanh phan ASP chuyen giao cho Visual Studio.Nl ban c6 thli' xay dirng cac U'ng dung Web (Web Applications) vdi tat ca chirc n~ rna nguni dung cu6i c6 tM hai long Wi da cling nhu tMa man nhtrng nguci dt U'ng dung desktop truyen thong truac day. Kha nang t!1-0 cac thanh phan co th4 dung lai cling se tang nang suat cua ngtroi phat trien va khien irng dung de baa hon,

Chuung4.4

cAe nrcn VlJ WEB (WEBSERVICES) Cae v6n de chinh se dude de c9p d~n

./' Dicit VIj Echo

./' Trd V~ Kilu Nguai Dung Dinh. Nghia ./' Cac Thu9C Tinh XML

C6 rat nhieu kY thu~t khac nhau cho vi';'c truy xuat dcr lieu bang' c~c Ung dung ph an bo (distributed application) tU nhiau nam nay. Tv co che goi ham tl:t xa (Remote Procedure Protocol > RPC) nhu XML-RPC, den nhung d6i t\fqng phan b6 dang phat tri~n manh nhu COREA va DCOM. Mil hinh dich V1,I Web (WebServices) dua tren gia thuyet dan gian cua vi~c rna r{)ng co c.he XML-RFC d~ cho phep cac cUQc goi ham tU xa qua Internet dung cac nghi thltc truyen thOng md

nhu HTTP thong qua cac kElt neli TCPIIP. .

.NET hi) trq vi~c goi WebServices thong qua HTTP POST, HTTP GET, va nghi thue truy xuat doi tuqng dan gian (Simple Object Access Protocol - SOAP). Trude khi co s\f hi) trq WebServices trong .NET, M phat tri~n Ung dung Iien ket mot may chu (host), mot proxy, va may khach (client) thOng quadich vu cua Web Ill. mot corig vi~c kh6 khan. Microsoft da dua ra bQ c6ng cu SOAP cho Visual Studio 6 cho phep nguoi phat tri~n dua met d6i tuo'ng COM VaG Internet. B(i congcu nay chua dat toi mac h5 trq tot nhu trong .NET va C#. Vi~c.phat tri@n m(it WebService doi hoi nhieu han vi~c dinh nghia m(it tllp cac phuong thu'C dung chung M dua ra cho cac may khach client, cung voi cac ki~u tra ;'e thfch hop ap dung WebMethodAttributes dan gian cho cac phircng thuc d6.

Trong chuang nay, mot aug dung EchoService nM se ditqc dung nhu Ill. ditim khi5'i ddu M giUp ban lam quen vdi khai niern WebServices va sau cung chung ta se them m(it giao tiep WebService vao EmployeeBrowser ASP WebApplication.

1. DJCH VlJ ECHO (ECHO SERVICE)

Xay dung cae trng dung client/server giong nhu van d~ con ga vdi qua trung, Ban can mot sever M chay thi't client va mot client de" chay thl1 server. Mot echo server se ph an h6i lai bilt cu thong tin rna n6 nhan duqc tLt client. Cac Echo server cho phep m(it irng' dung client chay thir ket nbi cua n6 va dam bao rang dcr Iieu dang gill di la dung. Thuc thi mot EchoService dung WebServices .NET se l!\ mOt 91,1' khCri dau t6t lanh,

VS.NET M trq viec 40 WebServices true tiep tLt IDE. VS.NET se ket neli vao server lIS chuyen bi~t dung FrontPage Extension M rna mot thu muc Web, gielng nhu WebApplication duqc phat tri~n a cac chuang trudo. Hinh 4.4-1 cho thAy m(it hop thoai du an (project) mdi dung M 40 mot WebService.

~516

PuAN IV: Ky thuat Web

WebServices, duoc tao bi'ti VS.NET, g6rn 2 tap tin - tij.p tin asmx va tij.p tin nguon C#. Tuy nh ien , chi co tap tin asrnx la can thiet vi tat ca rna nguon C# c6 tM a trong tij.p tin asmx.: Nhung day khOng phai Iii huang di duqc dung d~' phat trign cac vi du trong chuang nay. Vi du 4.4-1 cho thay rna nguon C# cho Web Service EchoService. Ngoai ra, chtfugtlli cung da diSi ten cua lap mac dinh tit Servicel thanh EchoServer cho d~ hieu,

'0 Employe.Browser - M,crosaft Ylsual [#.i'i£T (deOlgnJ- Sta,t Pal!" .: .'" ."~

Ellt,tdI!: "'~' flOjoct: 'pq ~"laOls ~. !:jelp

~. 'GI' ~ iii (I i .~ R~ e~) - '"" - Jill' •• I· • Deb~ • "*

.. ·.rn~ GliJ!tro

Hinh 4.4-1 WebService VS.NET project

9: namespace EchoService

10: {

Vi du 4.4-1 Mii ngu6n Echo Se r-vico.a srnx

1: using System;

2: using System.Collections; 3: using System. Data;

4: using System_ComponentModel; 5: using System. Diagnostics;

6: using System. Web;

7: using System.Web.Services; B:

I

CHUdNG 4·4: Cac dich V\I Web (WEBSERVICES)

517~

11: III <surnxnary>

12: III Summary description for EchoServer. 13: III </summary>

14: public class EchoServer :

System.Web.Services.WebService 15: (

IICODEGEN: This call is required by the ASP.NET Web Services Designer

19: InitializeComponent();

20: }

21:

22: #region Component Designer generated code

23: I I I <summary>

24: I I I Required method for Designer support - do not

25: llmodify the contents of this method with the code

editor.

26: III </summary>

27: private void InitializeComponent ()

28: {

29: }

30: #endregion

31:

32 : 33: 34: 35: 36: 37 : 38: 39:

40: 41: 42: 43: 44 : 45: 46:

II The HelloWorld () example service returns the string Hello World

47; I I To build, uncomment the following lines then save

and build the project

48: I ITo test this WebService, press F5

49:

50: 51: 52 : 53 :

16: 17': 18:

public EchoServer () {

I II «.slJ.ItUllB.ry> ..... '

ill 'Cl~anup anyre~()urOesbeing uaed ; I I I < I summary>

protected override void Dispose (bool disposing) {

}

[WebMethod]

public string Echo ( string Message) {

return Message;

}

I I WEB SERVICE EXAMPLE

II [WebMethod]

Ilpublic st'ring helloWorld ( ) II{ II

return "Hello World"j

~518

..

PHAN IV: Ky thuat Web

54: II}

55: }

56: }

Echoflervice.asmx trong vi du 4.4-1 minh hoa m9t Web'Service co" ban. Ldp EchoServer kg' thira tit ldp co" siJ System.Web.Services.WebService, Lap co sa WebService khong doi hoi lap dAn xua't phai ghi chang ba't ky phuong thuc nao; thay vao d6, lap co" sd WebService chi cung cap nhirng cai d~t d.n thig't M h6 trq viec g9i phuong thuc,

Ban than lap EchoServer chi cung cap rn9t phuong thLtc duy nha't cho phia trinh khach client tri~u goi- d6 la phuong thuc Echo. Luu y tai thuoc tinh duoc dung trong phuong thuc nay. Thuoc tinh nay [WebMethodl duqc dung vao luc service thuc thi, Muc dich la,M xac dinh cac phuorig thuc rna lOp nay cho phep cac trinh khach client duqc goi, N 6 timng tv nhu each rna lap DBAccess thuc hien trong vi du EmployeeBrowser, vaothoi di~m service thvc thi, ta dung Reflection API d~xac dinh phuong thuc c6 d~c tmh WebMethod va goi n6 vdi nhirng thong so thfch hop,

D~ lIS c6 th~ sa dung duqc WebService, chung ta d.n c6 san tl}P tin asmx trong thu muc Web ao chira EchoService. Tap tin asmx nay dl.fqc dung dii' neli doan rna WebService vao t~p tin .dll va lCtp cung cAp WebService thuc su, Vi~c ket noi co ban cua tij.p tin asmx nay bang rna C# duqc trinh bay trong vi du 4.4-2 sau:

Vi du 4.1-2 EchoService.asmx

1: <%@WebSe:rvice Language:::"c#"

2: Codebehind="EchoService.asInX_cs"

3: Class="EchoService.EchoService" %>

4 :

Ban c6 tho!; tha'y tij.p tin nay rAt don gian. Dili vai cac trang aspx, chung ta di;1t them chi dAn ngon ngiJ' dung vig't rna la C#, chi thj Codebehind cho big't trang asmx cai d~t rna, chi th] Class chi dinh ten chudn cua lap cung cap vi~c cai d~.t WebService.

Vi EchoService nay diroc cai d~t nhu Ia t~p tin c6 rna ngudn vig't bang C# va n6 khong phai la script nQi (inline), tap tin Echoficrvice.asmx.cs cAn duoc bien dich ra t~p tin .dll sau d6 copy vao thu muc bin cua thu muc ao 'hien hanh dung cho dich V\1 EchaService. VS.NET se tv dong lam di~u nay trongqua trtnh bien dich, Vi~c killm tra dich vu nay chi doi hoi truy xuAt vito t;j.p tin asmx voi trinh duyet Web Internet Explorer, nhu d trong hinh 4.4~2.

H~ thong WebServices tlj tao ra mot form HTML don gian, chung ta se dung form nay M killm tra cac phuong thirc cua Webfservice, Chon 0 nhap li~u va nhap mot dean van ban, sau d6 nhAn nut Invoke. N6 se goi phuong thuc Echo va doan XML tra ve se duqc hiiln thi trong trinh duyet (xern hinh 4.4-3).

CHl1dNG 4-4: Cae dich VI,l Web (WEBSERVICES)

Message

To test, click the 'Invoke' button. Parameter v .. lu.

The lollowing is a samppl. SOAP reque.t and response. The placeholder shown need 10 be ,ept.cod with ac'u~1 values.

Hinh 4.4-2 EchoService.asmx ben trong Internet Explorer.

Hinh 4.4-3 Kit qua cua Echo v&i "Hello World"

- ~520

PHAN IV : Ky thuat w€

2. xAy nljNG Ldp PROXY

B€ gQi mot WebService tli C#, can phai c6 lap proxy. Mot lap proxy dai di~ cho mot cBng kfft n6i vao doan rna thuc sl! tran server. Tai phien n6, server nay, e6 mot stub thay m~t server giao tiep vai proxy. Hlnh 4.4-4 la mot minh hoa do gian cho eo chff proxy-stub.

r--------l

i Server

~J~._. __ ,

Client

, Proxy j----------

I ~ _~

i ---==r---

Hinh 4.4-4 M{fi quan hf proxy-stub

f).§ tao mot proxy, ban d.n xac djnh nghi thuc giao tiep, Cac nghi thire gis tiep hien eo ella Web va Internet la HTTP POST, HTTP GET hoac SOAP. DLJa tre dii\u nay, proxy e6 th~ dl!gc dAn xudt tit lap eo sa System.Web.Services.Protoeols.: trong do X dai diiiln eho nghi thire tirong ling.

Cac vi du W 4.4-3 cho d6n4.4-5 eho thay each coli di1-t ella nghi thl,ic gis ti€p SOAP, HTTP POST va HTTP GET. Cau true co ban cho moi cai d~t la nh nhau. 81/ khac bi~t d6 la lap co sa va nhi1ng thucc ttnh cung voi thong s6 danh ct phtrong thuc Echo. Dung d6i tw;rng proxy khong e6 gi khac LAmao vol su dun nhllng d6i tl1gng thilng thliong. Ban gian La khdi tao mot tM hien d6i tl!gng va gl phirong tlurc thich hop cua d6i tlic;rng proxy kern theo tham s6 neu c6.

Vi dv 4.4-3 Lo-p Proxy EchoService cd sO': SOAP

1:11------------~------------------------------------

2:11 <autogenerated>

3 : II This code was generated by a tool. 4: II Runtime Version: 1.0.2914.11

5: I I

6: II Changes to this file may cause incorrect behavior 7: I I and will be lost if the code is regenerated.

8:11 </autogenerated>

9:11------------------------~------------------------

10:

11: I I

12: II This source code was auto-generated by wsdl, Version=1.0.2914.11.

13: / /

14: using System.xml.Serialization; 15: using System;

16: using System. Diagnostics;

17: using System. Web. Services. Protocols;

CHUdNG 4·4: Cac dich vu Web (WEBSERVICES)

521 k!I

18: ' using System. Web. Services; 19:

20:

21: (System.web.Services.WebServiceBindingAttribute(

Name = "EchoServerSoap " , Namespace=''http://tempuri .org/")]

22: public class EchoServiceSoapProxy System.Web.Services. Protocols. SoapHttpClientProtoco!{ 23:

24: [System.Diagnostics.DebuggerStepThroughAttribute( ) ]

25: public EchoServer () {

26: this. UrI =

''http://localhost/EchoService/EchoService.asmx'';

27: }

28:

29: ) ] 30: [System.Web.Services.Protocols. SoapDocumentMethodAttribute(''http://tempuri.org/Echo'', use:System.Web.Services.Description.SoapBindingUse.Lit eral, ParameterStyle=System.Web.Services.Protocols.SoapParam eterStyle.Wrapped)]

31: public string Echo (string Message) (

32: object[] results = this. Invoke("Echo", new

33: object[] (Message});

34: return ({string) (results[O] »;

35: }

36:

37: )]

38: public System.IAsyncResult BeginEcho(string

Message, System. AsyncCallback callback,

object asyncState) {

39: return this . Beginlnvoke ("Echo", new object [] (

40: Message}, callback, asyncState);

41: }

42 :

43: )] 44:

[System.Diagnostics.DebuggerStepThroughAttribute(

[System.Diagnostics.DebuggerStepThroughAttribute(

[System.Diagnostics.DebuggerStepThroughAttribute(

45: 46: 47: 48:

.,

public string EndEcho (System. IAsyncResult asyncResult) {

obj ect [J resul ts =this. Endlnvoke (asyncReaul t) ; return «string) (results[O));

}

}

~522

PuAN IV: Ky thu~t Web

Vi du 4.4·4 Lop Proxy EchoService co sit: HTTP POST

1: //-------------------------------------------------

2: // <autogenerated>

3: // This code was generated by a tool. 4: // Runtime Version: 1.0.2914.11

5: /I

6: // Changes to this file may cause incorrect behavior

and will be lost if

7 : // the code is regenerated. 8: // </autogenerated>

9: //-------------------------------------------------

10:

11: /I

12: // This source code was auto-generated by wsdl, Version=1.0.2914.11.

13: //

14: 15: 16: 17: 18: 19: 20:

21: public class EchoServer:

System.Web.Services.Protocols. HttpPostClientProtocol{

22:

23: ) ] 24: 25:

using System.Diagnostics; usingSystem.Xml.Serialization; using System;

using System. Web. Services. protocols; using System. Web. Services;

[System.Diagnostics.DebuggerStepThroughAttribute(

public EchoServer () { this. Url =

''http://localhost/EchoService/EchoService. asrnx";

26: }

27 :

28: [System.Diagnostics.DebuggerStepThroughAttribute( ) ]

29: [System.Web.Services.Protocols. HttpMethodAttribute(typeof(System.Web.Services. Protocols.XmlReturnReader), typeof(System.Web.Services.Protocols. HtmlFormParameterWriter»]

30.: .[return: System.Xrnl.Serialization.

XmlRootAttribute ("string", Namespace=''http://tempuri. org / ", I sNullable",true ) ]

31: public string Echo (string message) {

CHUdNG 4-4: Cae dieh VI,l Web (WEBSERVICES) 523 ~

32: return «string) (this. Invoke ("Echo", (this.Url

+ 11 /Echo"), new object [] {

33: message}»);

34: }

35: 36: } ] 37 :

[System.Diagnostics.DebuggerStepThroughAttribute(

public System. IAsyncResul t BeginEcho (string message, System. AsyncCallback callback, object asyncState) {

38: return this . BeginInvoke ("Echo", (this. UrI +

"/Echo" ), new obj ect [] {

39: message}, callback, asyncState);

40:

41:

42 :

J ] 43:

[System.Diagnostics.DebuggerStepThroughAttribute(

44:

public string EndEcho (Systell\. IAsyncResult asyncResult) {

return ( (string) (this. EndInvoke (asyncResult}});

}

45: 46:

Vi du 4.4-5 Lo Proxy EchoService co so: HTTP GET

1://-------------------------------------------------

2:// <autogenerated>

3: 1/ This code was generated by a tool. 4:// Rl),ntimeVersion: 1.0.2914.11

5: //

6: // Changes to this file may cause incorrect behavior

and will be lost if

7: // the code is regenerated. 8:// </autogenerated>

9://-------------------------------------------------

10:

11: //

12: // This source code was auto-generated by wsdl, Version=1.0.2914.11.

13: //

14: using System. Diagnostics;

15: using System.XlnI. Serialization; 16: using System;

17: using System. Web. Services .Protocols; 18: using System. Web. Services;

19:

20:

\1j 524

PuAN IV : Ky thu~t Web

21: public class EchoServer System.Web.Services.Protocols.

HttpGetClientProtocol{

22:

23: [System.Diagnostics.DebuggerStepThroughAttribute( ) ]

24: public EchoServer () {

25: this. UrI", ''http://localhost/EchoService/ EchoService.asmx";

26: }

27 :

28: [System.Diagnostics.DebuggerStepThroughAttribute( ) ]

29: [System.Web.Services.Protocols.

HttpMethodAttribute(typeof(System.Web. Se rvi ce s . Prot oo'o L s • xml Ret urnReade r ) , typeof(System.Web.Services.Protocols. UrlParameterWriter»]

30: [return: System.xml.Serialization.

xmlRootAttribute ( "string", Namespace= ''http://tempuri . org I", IsNullable=true)]

31: public string Echo (string message) {

32: return ({string) (this.lnvoke("Echo", (this.Url

+ "/Echo"), new object [] { I

33 ~ message} ) ) ) ; j

34: }

35:

36: [System.Diagnostics.DebuggerStepThroughAttribute( ) ]

37: public System. IAsyncResult BeginEcho (string

message, System. AsyncCallback callback,

obj ect asyncState) {

38: returnthis.Beginlnvoke("Echo", (this.Url +

"/Echo"), new object [1 {

39: message}, callback, asyncState);

40: }

41:

42: [System.Diagnostics.DehuggerStepThroughAttribute( ) ]

43: public string EndEcho (System. IAsyncResult

asyncResu1t) {

44: return ( (string) (this. Endlnvoke

(asyncResu1t»);

45: }

46: }

CHUdNG 4·4: Cac dich Vl,I Web (WEBSERVICES)

525~

Tin vui cho ban lit khong phai go doan rna nay bling tay. Kern theo b{:l .NET SDK la mot ccng cu-hay chirong trinh WSDL.EXE. Dang co ban cua dong Ienh goi chuang trinh WSDL.EXE nhu sau:

WSDL -curl or wsdl document> <language> <protocol>

Web Services co thil duoc goi dang b(> hoac khong dang b(>. Truong hop thong dung la goi phuong thuc dang b(>. Viec goi phirong thuc khOng dang bo chi huu ich trong cac truong hop rna phuong thuc gQi nay doi hoi m(>t khoang thci gian dai de xli ly, no se cho phep trrnh khac client tie'p tuc lam viec trong khi cho dQ'i nhung phan hai khong d6ng bq (async-response) tnt v~. No cho phep cac cong viec khac tiep tuc diroc thuc hien rna khong bi bo buoc vao ling dung client.

Cac lien ke't khac - SOAP, HTTP POST va HTTP GET - dua ra co hQi M phat trien ling dung phia client dung m(>t err che t6ng quat hoa Factory M tao va tra v~ rang buoc ducc yeu cau. Mot Web Service co kha nang dua ra nhieu d6i tucng, va mbi doi tuong do co tM du'c!c quan sat dUai dang mot, giao tiep chung (public interface). Day la truong' hop mot giao tiep djnh nghla chung cae phuong thuc cuamot WebService, va sau do tung' proxy se cai d~t giao tiep nay.

Doi vdi EehoService, giao tiC'p cho ban than WebService co the duoc 'diiin gilli nhu sau: .

Public interface IechoService {

string Echo{ string Message);

3. PROXYFACTORY

Mo hinh Factory se lam co li).p cae lai goi tU iing dung khach client khoi rang bu{:lc v~ kieu do Factory tao ra. Factory tra v~ m9t kieu thong dung - trong tnfang hop nay, lit giao tiep IEchoService _ M6i proxy, nhu trong cac vi du 4.4-3, 4.4-4 va 4.4-5, se phai cai d~t giao tiep IEchoService.

Lap ProxyFactory nay se nhan dOi sO' en urn de xac dinh dOi tl1qng ben duai khi tao va tra vil. Vi du 4.4-6 cho thay vi~c cai di).t lrrp nay.

'Vi du 4.4·6 Proxyfactory.cs

1: namespace ProxyFactory 2: {

3: using System; 4 :

5 :

6: ///<summary>

7: / / / Generalize the WebService as an interface to be implemented by each proxy

8: / / /</sununary>

~526

PHAN IV: Ky thuat Web

9: public interface IEchoService

10: {

11: string Echo ( string Message) ;

12: }

13:

14:

15: ///<summary>

16: / / /Enumerate the Various Bindings

17: ///</summary>

18: public enum ProxyProtocol

19: {

20: SOAP,

21: HttpGet,

22: HttpPost

23: }

24:

25:

26: ///<summary>

27: / / /The Factory pattern can be used to construct a

proxy for the requested binding.

28: / / /The Factory will then return a well known

interface to the web service

29: ///</summary>

30: public class ProxyFactory

31: {

32: public static IEchoService ConstructProxy(

ProxYProtocol protocol )

33: 34:

35: switch( protocol)

36: {

37: case ProxyProtocol. SOAP:

38: return (IEchoService) new

EchoServiceSoapProxy();

39: break;

40:

41: caae ProxyProtocol.HttpGet:

42: return (IEchoService) new

EchoServiceHttpGetProxy();

43: break;

44:

45: case ProxyProtocol.HttpPost:

46: return (IEchoService)new

EchoServiceHttpPostProxy();

47: break;

48:

49: default:

50: throw new System. Exception ( "Invalid

CHudNG 4-4: Cac dich vu Web (WEBSERVICES)

Argument" );

5271!l

break;

51: 52:

53: }

54: }

55:

56:

}

Lap Proxyf'actory nay bao g6m ca viec 40 ra doi nrong proxy dua vao rang bUQc truyen cho phucng thirc ConstructProxy. VI giao tiep IEchoService diroc coli d~t nho vao cai d~t cua tung proxy ben dirdi, nen lap ProxyFactorychi cdn xay dung lap proxy thich hop va tra v~ giao tiep IEchoService la du.

4. cAc CHU<1NG TRINH WINDOWS FORMS SU DVNG WEBSERVICE

De kiem tra WebService, Chuong trrnh WinForms sau day cung dip mot giao dien nguni dung cho EchoService. Ban sa dung VS.NET M tao mQt U'ng dung C# Windows Forms va cau hmh form nay nhu hmh ve 4.4-5 .

.. ~ .... ~ s., ~'~j~. : ~ra' ·Q:ebi.~roi~.~!;~~; 1 fiiJ· '@ • ~ III cI i X lii§ B i I<) • ,. ~ ~~!ij.T "D~bug

0,0 Folse True 0,0 (none) True 0,0 100% No True

Hrnh 4.4-5 Client WinForms

~528

pHAN IV : Kythu~t Web

Do b¢ thiet ke' form da phat sinh ra glln nhu toan bQ rna chuang trmh nen i'1 day chung ta chi xern qua nhung dean rna quan trong. Trude het, ban them vao bie'n duqc bao v~ (protected) biing khai bao sau:

Private ProxyProtocol SelectedProtocol=ProxyProtocol.SOAP

N6 cho phep ling dung theo doi nghi thuc giao tiflp (protocol) rna trmh khach client muon g9i dfln phuong thuc cua WebService. Hay di),t them khai bao using proxyFactory iJ dfru churmg trrnh. Sau do ta ke't n6i m6i nut chon cua di~u khien trong phuong thuc OnOpt_Click nhu sau:

Protected void OnOpt_Click (obj ect sender I EventArgs e) {

if (sender == optSOAP)

this. Selectedprotocol = ProxyProtocol. SOAP; else if (sender == optHttpPost)

this. SelectedProtocol := ProxYProtocol. HttpPosti else

this. SelectedProtocol = ProxyProtocol. HttpGet;

}

Doan rna nay cap nhap bie'n SelectedProtocol d~a tren nut chon hien hanh.

Ban tham khao them cac chuang v& WinForms M biet each sa dung nhirng di~u khien nay.

Sau cung, WebService sil duoc g9i khi c6 sl,f kien Click tren nut nhan Invoke phat sinh.

protected void btnInvoke_Click (obj ect sender I System.EventArgs e)

this. txtMessage.Text =

II".

I

{

II Get an IEchoService interface

IEchoService echo = ProxyFactory.ConstructProxy{this.SelectedProtocol); this .lblResponse; Text =

echo.Echo(this.txtMessage.Text);

}

Hinh 4.4-6 cho thAy ung dung client dii san sang cho viec goi Echo WebService. Hmh 4.4-7 cho thAY ke't qua cua vi~c goi Web Service hien thj nOt dung phan h6i do server tra v& trong ii Response

10

Oi

5291!J

1 o a

Hinh 4.4·6 Truac khi nhdn. chon. nut Invoke WebService.

1. U

Hlnh 4.4~7 Sau khi nluin chon. nut Invoke WebService.

Chung ta vua xern qua each goi phuong thuc dilng be), ke' tie-p la goi phuong thirc khong dong bi? each goi WebService khong d6ng bl,i doi hoi phai cochi dmh uy nhiern bAng ky hieu phuong thuc sau day:

:e

<access modifier> void <name> (System. IAsyncResult)

Qua trrnh co ban M g«;>i phirong tlnrc tuong tv nhu i!J mo hlnh dong be), cluing ta chi tao them ffii?t tuyen (thread) di~u khien qua trinh gili va nhan yeu e!lu. Sau khi yeu cAu duoc ho~n thanh, mOt 8V kien xua't hien va phirong tlurc uy nhiern kern thea se duoc goi.

Hay xem lai cac proxy WebService dugc phat sinh trong cae vi du 4.4-3, 4.4- 4 va 4.4-5; moi proxy dinh nghia mot phuong thue co khai baa nhir sau:

Public System. IasyncResult BeginEcho (

string message, System.AsyncCallback callback, obj ect asyncState)

Phuong thirc nay yeu cau tharn s6 chu5i nhu phuong thuc Echo. Ngoai ra, phuong thirc BeginEcho yeu cdu mOt phunng thiro uy nhiem phuc 'vu cho viec goi lQ:I'i'y;A·.mQt.<t5'! ttig.rlg.chO y@ul!~ukh~I\g.d6ng bl) ph~tb'u~c vao n6.Tl}ayvl ,Uy dung mot ling dung hoan chinh M gol phuong thuc nay, doan rna ngudn trong vi dI,l4.4-7 sau se minh hoa each goi phucng thirc khOng dong hl,i.

111530

PHAN IV :Ky thuat Web

Vi du 4.4·'7 Goi m6t WebSt'rvie(' kh6ng: tIr;ng b6

1: I ICreate the proxy anf invoke the BeginEcho method

2: EchoServiceSoapProxy sp = new EchoServiceSoapProxy(); 3: Sp. 8eginEcho {"Hello", new System. AsyncCallback

(this .CaIIBack), sp);

4 :

5: I I The callback for the asynchronous result

6: protected void CallBack (System. IasyncResult ar) {

7: EchoServiceSoapProxy sp = (EchoServiceSoapProxy)

ar.AsyncState;

8: this.buttonl.Text = sp.EndEcho{ar) ;

9: }

Saukhi ham CallBack dinrc goi, d6i h.rqng g6c EchoServiceSoapProxy duqc lay v~ ttl giao tiep IasyncResult. Ke tiep, phuong thirc EndEcho duqc goi M lay ke't qua tra v~ tit lbi gQi ham khi'mg dong be? WebService.

5. TRA vE KIEU DO NGUOI DUNG DJNH NGHiA

Tra v~ ki~u do ngt10i dung dinh nghia thuong thay trong cac ham, chang han ki~u danh cho nhan vian hay phong ban. Khi lam di~u nay, WebService se thuc hien co che twin tI! h6a diJ li¢u (serialization) tao ra mQt dai dien chung cua du lieu can tra vEl cho client. Dieu htu y la Web Services duqc dung M tnt vtJ du lieu chu khong phai cac d6i tuqng. Trong truong hop doi tuqng nhan vien, cac thong tin co ban nhu rD, ten, phong ban, va hinh se dai dien cho diJ li~u lien quan Mi nhan vien nay.

Qua trioh tuil.n tI! h6a se sAp xep cac trirong' va thuoc tinh chung (public) cua dOi tuqng vao ml)t g6i dl1 li~u phu hqp vdi each truy x~t dit li¢u cua lenh HTTP GET. D~ h6 trc qua trlnh ngiroc lai (khong tudn tir), cac thuoe tinh tuong ling nhu set va get cung phai cai d~t. Moi trinrng hoac thuQc tinh se dinrc anh xa thanh mot phdn tli XML. Cach hanh xli m~c dinh nay c6 th~ phuc VI) dll t6t cho cac service dan gian va cung cap di4m khdi dilu cho viec dung cac ki~u do ngtnri dung dinh nghta ben trong ngO canh cua ml)t WebService.

1: namespace UDTWebService

6. Ti).O SERVICE

Hay bat ddu bilng viec tao ra mQt WebService ten la UDTWebService. Ban dung VS.NET tao m6'i du an Web va d6i ten mac dinh Servicel.asrnx thanh UDTService.asmx. WebService nay se cung cap phinrng tlure xac dinh mot ngirci nho vao ho ten cua nguoi d6; ten cua phuong thac nay 180 LocatePerson. Truce khi thuc hien cai d~t phuong thue nay, ban nen tao mQt ldp Person dung dE\" td v~ thong tin cho mot WebService client nhu vi du 4.4-8 sau:

Vi d~ 4.4-8. Lop UDTPerson

I

. CHUdNG 4·4: Cac dich vu Web (WEBSERVICES)

531~

I

2: {

3: using System; 4:

5: III < summary>

6: III The Person Class represents a basic UDT ( User Defined Type)

7: III < I summary>

8: public class UDTPerson

9: { 10: 11:

12 :
13 :
14 :
15:
16:
17 :
18:
19:
20:
21:
22 :
23:
24:
25:
26:
27 :
28:
29:
30:
31:
32:
33:
34 :
35:
36:
37 :
38:
39: }
40: }
41: IllPrivate Fields

private string m_FirstName; private string m_LastName;

IIPublic Properties public string FirstName {

get { return m_FirstName; } set { m_FirstName '" value; }

}

public string LastName {

get { return m_LastNarne; } set { m_LastName '" value; }

}

IIConstructor(s) public UDTPerson ( {

IIDefault Constructor

}

public UDTPerson( string FName, string LNarne ) {

rn_FirstName = FNarne; m_LastNarne = LNarne;

}

Lap nay dai dien cho mQt lap C# co ban va khong sa dung thuec tinh. Vij.y him each nao dt'! twin tv h6a (serialization) dttgc d6'i tuong? Hay nhd lai Reflection API. Day la co eM duqc dung d~ tuiin tl;! h6a lop nay. WebService se dung Reflection M lay thong tin tU lap d6'i tttqng va twin tl! h6a thong tin d6. Chi e6 cac trUCrng va thuoc tinh chung moi duqc thuc hien tuAn tl! hoa,

[!!j 532

PHAN IV : Ky thu~t Web

Sau khi hoan tat viec cai d~t UDTPerson, buoc ke' tie'p la them phinmg thUc LocatePerson vao lop UDTService. £)~ cap nhat lop nay, ban them van doan mil nhu trong vi du 4.4-9 sau:

Vi dt,I 4.4-9 UDTService

1: using System;

2: using System. Collections;

3: using System.ComponentModel; 4: using System. Data;

5: using System. Diagnostics; 6: using System. Web;

7: using System.Web.Services; 8:

9: namespace UDTWebService 10: {

11: III < summary>

12: III Summary description for UDTService.

13: III </summary>

14: public class UDTService :

System.Web.Services.WebService

15: {

IICreate a Hashtable to hold some People

16: private Hashtable htPeople;

17 :

18: public UDTService ()

19: {

20: IICODEGEN: This call is required by the

ASP. NET Web Services Designer

21: InitializeComponent();

22:

23: IILoad the hashtable

24: / /Add some people to the hashtable

25: htPeople = new Hashtable () ;

26: htPeople . Add ( "Powell", new UDTPerson(

"Bob", "Powell" ) );

27: htPeople .Add( "Weeks", new UDTPerson{

"Richard", "Weeks" ) );

28: htPeople.Add{ "Martschenko", newUDTPerson(

"Bill", "Martschenko" ) );

29: htPeople.Add{ "Schumacher", newUDTPerson{

"Greg", "Schumacher" ) );

30: htPeople.Add( "Pitzer", newUDTPerson(

"Jay.", "pitzer" ) );

31:

32: }

33:

34: #region Component Designer generated code

CHuclNG 4-4: Cac dich VI,l Web (WEBSERVICES)

5331!J

3Si III <summary>

36: III Required method for Designer support - do

not modify

37: III the contents of this method with the code

editor.

38: 39: 40: 41: 42: 43: 44: 45: 46: 47 : 48: 49: 50:

51:

52 :

{ 53 :

54 : try {
55:
56:
57:
58:
59:
60: }
61: } I I I < / summary>

private void InitializeComponent () {

}

#endregion

/ / / <summary>

1// Clean up any resources being used. / / I < I summary>

public override void Dispose () {

}

[WebMethodl

public UDTPerson LocatePerson( string LastName)

return (UDTPerson}htpeople[ LastName]; } catch ( Exception) {

/ /something went wrong

}

return null;

}

Thay VI liy v~ thong tin tit m(>t co sa dll lil;m, VI du nay tao ra rnQt bang barn d~ h.IU gill th6ng tin cua mQt s6 it ngl1ai dl1qe dung cho muc dich tim kiern, Phuong thuc LoeatePerson 0' dong 52 lily ten LastName nhu 18. mot deli s6 chuoi, CAn h.IU y ding phuong thuc nay trong kh6ng c6 gl khac biet so vai WebMethod iT trong EehoService.

7. T~O RA cAc RANG BUQc CHO CLIENT

MOt IAn nua, cong' cu WSDL.exe dl1t;lc dung M tao ra lap proxy client cAn thiet cho viec goi phuung thuc LocatePerson. Cling vai lap proxy. WSDL.exe se phat sinh ra mot lap dan gian dai dien cho ki~u tra v~ UDTPerson. Ly do la hltu het nguai dung WebServiee cua ban se kh6ng truy xuii"t vao doan rna phia sau service nay. Thay vao do, ho se nhC! vao mo tii WSDL cua site d~ tao ra doan mii client goi de""n bit ky service nao eho truce. Vi dl,l 4.4-10 cho thii"y doan rna tang quat dime tao fa bai cong CI,l WSDL.exe cho UDTService.

c_ ~534

PuAN IV: Ky thuat Web

Vi du 4.4·10UDTService Proxy

1://-------------------------------------------------

2: II <autogenerated>

3: /1 This code was generated by a tool. 4:11 Runtime version: 1.0.2914.11

5: 1 I

6: 1/ Changes to this file may cause incorrect behavior

and will be lost if

7: lIthe code is regenerated. B:/I </autogenerated>

9:11-------------------------------------------------

10:

11: II

12: II This source code was auto-generated by wsdl, Version=1.0.2914.11.

13: /1

14: using System. Diagnostics;

15: using System. xml. Serialization; 16: using System;

17: usingSystem.Web.Services.Protocols; 18: using System.Web.Services;

19:

20:

21: [System.Web.Services.WebServiceBindingAttribute (Name", "UDTServiceSoap " ,Namespace="http: Iltempuri.org/" ) ]

22: public class UDTService :

23: System.Web.Services.Protocols.

SoapHttpClientProtocol {

24: 25: 26:

public UDTService () {

,

this. Url = ''http://localhost IUDTWebServicel

UDTService.asmx";

27: }

28 :

29: [System. Diagnostics.DebuggerStepThroughAttribute ( ) )

30: [System.Web.Services.Protocols.

CHUONG 4·4: Cae djch vu Web (WEBSERVICES)

53511J

SoapMethodAttribute("http://tempuri.org/ LocateE'erson",l]se=System.Weh.Services. Description.SoapBindingUse.Literal, ParameterStyle= System.Web.Services. Protocols.SoapParameterStyle.Wrapped)}

31: public UDTPerson LocatePerson(string LastName)

32: object [] results", this. Invoke ("LocatePerson",

new object [] (LastName});

33: return ( (UDTPerson) (results [0] ) );

34: }

35:

36: [System.Diagnostics.DebuggerStepThroughAttribute( ) ]

37: public System. IAsyncResul t BeginLocatePerson (

string LastName, System.AsyncCallback callback, object asyncState) {

38: return this . BeginInvoke ("LocatePerson", new

39: object[] {LastName}, callback, asyncState);

40: }

41:

42: [System.Dlagnostlcs.DebuggerStepThroughAttribute( ) ]

43: public UDTPerson EndLocatePerson(System.

IAsyncResult asyncResult) {

44: object[] results = this.EndInvoke(

asyncResult);

45: return { (UDTPerson) (results [0] » ;

46: }

47: } 48:

49:

50: public class UDTE'erson { 51:

52: public string FirstName;

53:

54: public string LastName;

55: }

i!\lS36

PHAN IV : Ky thu~t Web

v« co ban, doan rna 40 boi WSDL.EXE tuong tt,t nhu nhi1ng vi du mii. ban da thify trutic day; cai mdi cttn luu y la lap UDTPerson tao ra cac thucc tinh FirstName vii. LastName nhu la nhClng trttO'ng chung (public) thay vi rieng (private). WSDL.EXE khOng co each nao bie't vi¢c cai di!,t thuc sl,i cua UDTPerson vi no nam tren server; thay vao d6, WSDL.EXE phai dung thong tin tim thay trong tai Iieu WSDL M xay dung cac ki~u proxy va tham chieu,

Qua trinh .gQi UDTService.LocateJ;>erson tlt Internet Browser se tao ra mi)! goi da Iieu XML va the hien no tren trmh duyet, nhu trong hinh 4.4-8. XML nay dai dien cho thOng di¢p tra vI!. W WebService.

~.~

»

<?xml vorsion="l Ol.l 1>

.« UDTP .. rson xrnlns ""l="h ttp Ifwww w3orgl2000110IXMLSch"m .. ·in~tan""" xmln~:,,~l= "http://www. w30rgr2000110/X),'lLSch .. rna"

xmlnse "http./lt..mpun.oC!;;r>

"Flrst:N arne> Riehard« lFu ~t:N"lilmQ>

<Ls.stN"li.m.:a," W~&k!i<' /Las-tN amec-

«IUDTP .. "on> .

Hinh 4.4-8 Kit qua XML til Locateherson

8. cAe THUQC TINH XML

Cho tdi gio, chung ta da thify cac ki~u tra va ben trong va UDTs W mOl WebService. Qua trinh tuAn tV h6a eC1 ban duqc eung cap bdi WebServices no chung la du, nhirng dEli khi chung ta cung din ditlu khiii'n va xli If cac phan ti XML duqe tra va nay. MQt tai Iieu XML chi co tM co m9t nut g6c (root). Mi)t XMI root c6 the duqc dinh nghia bang each dung XMLRootAttribute. XMLRootAttributE diroc dung d~ di).c ta cac thuQc tinh sau trong bang 4.4-1.

Bang 4.4-1 Cac thuoc tinh minh hoa XMLRootAttribute

Thuoc tinh Nghia

DataType Kieu da lieu XML cua phan tli goc

ElementName Ten cua phan tli g6c

Form Ten cua phan tli g6c c6 dat yeu cau hay khong

IsNullable Xac dinh coi XmISerializernen duqc sap x~p ne'u thie't lfj.p n6 va null

Namespace Namespace cho phlln tli g6c

cmroso 4·4: Cae dich vu Web (WEBSERVICES)

53711J

MQt phan tl'r g6e XML root c6 th~ chua N s6 phan tlf con, va m6i con LI!-i co kha nang chua N phan tl'r con khac, SI,f dinh nghia dl:l quy nay cho phep long cac pMn ttt con vao nhau nhieu tuy y thea nhieu cap d¢.

Cung voi phan tlt g6c, mdt tai lieu XML con chua cac phll.n til va thuoc tinh

. con. MQt phan tl'r c6 th~ dliqe xem la 1 ki~u chua dung toan the van ban.

XMLElementAttribute duoc dung de m6 ta nhtmg phan tu nay. Chung e6 the La mot lap hoac thanh vien cua m(lt lop, De b6 sung vao viec Me ta XMLElementAttributes, cac phdn tu co th~ co cac thuoc tinh ap dung cho chung ba.ng each dung 16p XMLAttributeAttribute,

Cho Uri gio, chi co cac d6i tirong don do WebServices tao ducc tra v~.

XmlSerializer hoan toan co the tra v8 cac diu true XML phirc tap vdi cac !Up l&ng vao nhau. Chung ta cung e6 thEl dung cac thuoc tinh XML khac nhau ehung vdi cac e~u true (struct) va tr(ln trong cac thirc th~ khiing co thuoc tinh XML.

DEl biet kha nang cua XmlSerializer, chung ta se tao m!)t WebServiee don gian dung tni v~ m(lt Employee chua 2 d6i tliqng long nhau khac ~ mQt d6i tirong Address vii m(lt cau true Department. Vi du 4.4-11 eho thay each cai d~t cua thuc th~ Employee, Address va Department,

Vi d~ 4.4·11 Entities.cs

1: namespace XML 2: {

3: using System;

4: using System.Xml;

5: using System.Xml.Serialization;

6: 7:

8: [XmlRoot ("employee") ] 9: public class Employee 10: { 11:

12 :

13 : 14: 15: 16:

17 : 18: 19:

pri vate string m_FirstName;

private string m_LastName;

private Address m_Address;

private Departmentm_Dept;

IIProperties [XmlAttribute("first_name")] public string FirstName

{

20: get{returnm_FirstName;}

21: set { m_FirstName = value; }'

22: }

23:

24: [XmlAttribute ("last_name")]

25: public string LastName

26: {

~538
27 :
28:
29:
30:
31:
32:
33:
34:
35:
36:
37 :
38:
39:
40:
41:
42:
43:
44:
45:
46:
47 :
48:
49:
50:
51:
52:
53:
54:
55:
56:
57 :
58:
59:
60:
61:
62:
63 :
64 :
65:
66:
67 :
68:
69:
70:
71:
72: }
73: PHAN IV : Ky thu~t Web

get { return m_LastName; } set { m_LastName .. value; }

}

[xmlElement ("address")] public Address Address

{

get { return m_Address; } set { m_Address ., value; }

}

[xmlElement ("department")] public Department Department {

get { return m_Dept i } set { m_Dept '" value; }

}

public class Address {

I IUse Public Fields with XmlAttributes [XInlAttribute ("line1")]

publ ic string Linel;

[XInlAttribute ("city")] public string City;

[XInlAttribute("state")] public string State;

[xm1Attribute (" zip") ] public string Zip;

I IUse a simple struct public struct Department {

I IFields with no XML attributes public string name;

public int building_number;

}

CHUdNG 4-4: Cac dich vu Web (WEBSERVICES)

539r!J

Cac thue th~ trong vi du 4.4-11 ke"t hop cac thuoc tinh XML khac nhau va tao ra lap ket hop. Ca Employee va Address d~u dung cac thuoe tinh XML, trong khi cau true Department chi dung cac tnJ<tng public. M~c dinh, tAt ca cac trli<tng public eua mQt lop hoac struct se diroc twin tIJ hoa bdi doan rna WebService XML. ){ha nang ket hop nay cung cap mot nang luc an tinmg cho phep ban, nguoi phat trilln, co quyen dieu khien hoan toan trsn qua trinh twin t!,l h6a.

Ke't qua cua lop Employee ke't hop sau khi da tuAn tIJ hoa se nhu hinh 4.4-9.

< ?xml ..... r.ion="l O' 1,.

. '" .mpioyal> xrnlnsxsl« "http://www.w3.ori'I2000110IXMLSch .. ma-inseanca"

l<ITllns·x..t= "http://www w30rgl2000 110lXMLSchema • first_Ram"=" John" 1 ... t_n .. m .. :"Don&· xmlnse "http.llI<ompuflorg!',.

-ceddress lin.g.l="123 Anywh8-I"8- Lane" city=I.ICar-ylil s .: tat&=:NNorth Ce roline" zip=1II27513Hb ·<dl>p"rtm.ni:>

<n:l1rnQ.>-De.n-lopm~nt< /nllme> ",rulldini'_numbeor:o-20",lrullding_nurnbeor,. <ld<>partm"ni:>

'" I"mploya",.

Hinh 4.4-9 Hien. tlii dang XML eua lap Employee

Luu y den cac thuoc tinh XML khac nhau va each chUng anh huang len ket qua XML diroc tao ra trong suot qua trinh tuan tIJ hoa thue thii' Employee. Ban luu y Mn do~n rna proxy tao bdi WSDL.EXE trong vi du 4.4·12 sau.

Vi du 4.4·12 Doan rna phnt sinh bo'i Client Proxy

1:// <autogenerated>

2: / / This code was generated by a tool. 3: / / Runtime Version: 1.0.2615.1

4://

5: / / Changes to this file may cause incorrect behavior

and will be lost if

6: / / the code is regenerated. 7:// </autogenerated>

8:

9: II

10: / / This source code was auto-generated by wsdl, Version=1.0.2615.1.

11: / /

12: using System.Xml. Serializationi

~540

PHAN rv : Ky thuat Web

13: using System;

14: using System. Web. Services. Protocols; 15: using System. Web. Services;

16:

17 :

18: [

19: System.Web.Services.WebServiceBindingAttribute(

20: Name="ServicelSoap".

21: Namespace=''http://tempuri.org/'')

22:

23: public class Servicel : System. Web. Services.

Protocols. SoapHttpClientProtocol { 24: public Servicel () {

25: this.Url = ''http://localhost/XML/Servicel.

asrnx" ;

26: }

27 :

28:

29: System.Web.Services.Protocols.

SoapMethodAttribute(

30: ''http://tempuri.org/

GetEmployee", MessageStyle=System. Web. Services.Protocols.SoapMessageStyle. ParameterslnDocument}

31: ]

32: [return: System.xml. Serialization.

xmlElementAttribute ("employee", .

ISNullable=false)]

public Employee GetEmployee () {

object[] results = this.lnvoke("GetEmployee", new obj ect [0] ) ;

return «Employee) (results [01»;

33:
34:
35:
36:
37:
3B:
39:
40:
41:
42:
43:
44:
45:
46: } }

public System. IAsyncResult BeginGetEmployee ( System. AsyncCallback callback,

obj ect asyncState) {

return this .Beginlnvoke ("GetEmployee", new object [0] , callback, asyncState);

}

public Employee EndGetEmployee (System.

IAsyncResul t asyncResul t) {

object [] results = this. Endlnvoke ( asyncResult) ; return «Employee) (results [0] »;

}

reb

CHu'dNG 4-4: Cae dich Vl,I Web (WEBSERVICES)

541~

47 :

48: public class Employee { 49:

50: [System.Xml.Serialization.XmlElementAttribute

(IsNullable=false)J 51: public Address address; 52 :

53: [System.Xml_Serialization.XmlElementAttribute

(IsNullable~false)J

54: public Department department; 55:

56: [system.Xml.Serialization.XmlAttributeAttribute

( ) J

57: public string first~name; 58:

59: [System.Xml.Serialization.XmlAttributeAttribute

OJ

60: public string last~name; 61: }

62 :

63: public class Address 64:

65: [System.Xml.Serialization.XmlAttributeAttribute

OJ

66: public string line1; 67 :

68: [System.Xml.Serialization.XmlAttributeAttribute

( ) ]

69; public string city; 70:

71: [System.Xml.Serialization.XmlAttributeAttribute

()J

72: public string state; 73:

74: [System.Xml.Serialization.XmlAttributeAttribute

OJ

75: public string zip; 76: }

77 :

78:

79: System.Xml.Serialization.XmlTypeAttribute(

80: Namespace=''http://tempuri .org/")

81:

82: public class Department { 83:

84: public string name; 85:

86: public int building~number;

~542

PuAN IV : Ky thUl),t

B7: } BB:

('.

Nhu thucng le, WSDL.EXE tao ra doan rna proxy cdn thi€t de gQi Web Service theo yell duo Cung voj rna proxy. WSDL.EXE ciing tao ra cac thl!1 Employee, Address va Department nhu dugc mo ta bdi tai li~u wsdl WebSen LI1U y hi 81,1' khac biet giUa Employee, Address va Department duqc phat truac day va cong CI,I WSDL.EXE.

Du mbi class/struct dung mot huang khac nhau M tao ra dang tuan tl, thich hop, ca 2 each thuc hien nay true giao lil.n nhau. v~ co ban, chi co ti thay dbi trong cac trinrng va thuec tinh duoc bo tri lai, D€ hi~u qua, WSDL. dua vao cac thuoc tinh XML khac nhau va cong dung cua Reflection M tao ra twin tu thich hop.

9. KET CHUONG

Chuang nay chung ta da thLt nghiem va tim hi€u vil WebSen WebServices dai dien cho rn!)t mo hinh phat tri~n mdi trong viec tach da Hi each the hien logic chuang trinh. WebServices la mot d~ tai kh6 hi,§u n~u chua tang tiep can veri mo hinh J<).p trinh phan tan tru6"c day. Tuy nhien, chu tarn dang dil Uti WebServices i'; day de chuan bi tim hi1\u vil kien true ben 1 ella cac goi (tng dung .NET trong chuang sau.

':

·ll

~: ~

v.

I.

I

as. va

Phdn V GOIKETHOP



eb

~S. ~n

.oa 11\ (E

ng

l).n ta ng

Trong phdn. nay:

• Cac g6i k€t hqp(ASSEMBL Y)

• Cha ky 86 va phien ban

• Turrng tae vai the gidi COM

• Cac ti~u trmh (THREADS)

Chitung 5.1

cAe GOI KET H(jP(ASSEMBLY)

Ccic vdn d~ chinh se dudc d~ cap d€n: ,/ G6i ket liop (assembly) lit, gi?

,/ G6i kit hop (assembly) trong m¢t tQP tin dun ,/ G6i ket hgp (assembly) trong nh.ieu. tQP tin

,/ Cac thu¢e tinh. ctia g6i kfft hop

,/ Tdi ngp g6i ket hgp (assembly) khi ch.uong trinh. dang chay

1. GO! KET H(:iP(ASSEMBLY) LA GI?

Khai niem "goi ke't hop" am chi m(it hay nhieu t~p tin diroc nh6m lai mot each luan If (logic) c6 th€ sa dung ben trong kie'n true .NET. M6i g6i ket hop (assembly) c6 tM 18 mot t~p tin DLLlEXE dan Ie hay mot nh6m DLLlEXE lien quan,

Truce thai cua .NET, cac doan rna diroc g6i bEm trong cac DLL, EXE va neu nhu c6 nglioi trong cac ban con nhd: d6 la nhrrng thu vien overlay. Bllng each chia dt cac doan ma chuang trrnh da diroc bien dich thanh cac doan nho, ta co th€ sli dung lai nhung rna da bien dich r6i cho cac ung dung khac, Dinhien, each thee nay lam cho cac DLL quy quai gay ra bie't bao nhieu tranh cai va giAy muc, Dia nguc DLL chi dan thuan Ia nntrng vAn d~ se nay sinh khi thay mot phien bin cua DLL biing mqt phien ban khac mdi han, khi do, ket qui la chuang trinh dqt nhien ngirng hoat dqng. Ly do cua viec nay khOng phai hie nao cling d~ thay, nhung thuc s\1 d6 Ie bdi viec ki€m tra y€u kern v~ quan If phien bin cua DLL.

Bllng vi~e sa dung cac g6i k€t hop .NET, chung ta co tM luu giil' nhieu phien ban cua chung tren moi g6i rieng reo MQt ll'ng dung e6 th€ lua chon viec sli dung phien ban goi ket hop (assembly) rna n6 dime bien dich chung hay dung g6i ke't hop c6 phien ban moi nhat, SlJ ket noi dqng nay ducc dii\u khien hili t~p tin cAu hmh cua ung dung, T~p tin nay nam cr cung thu muc vdi ll'ng dung, Chung ta se xem xet vg q.p tin cau hlnh nay trong chuang 5.2 "Chft ky so' va phien ban hoa".

1.1. Nc)i dung g6i ktt hc;lp

Moi g6i ket hop (assembly) chua mqt bing Manifest cung v(j"i cac doan rna da dugc bien dich, MQt Manifest la mOt bang cac t~p tin phu trg cho g6i ket hop g6m mOt hay nhi~u t<j.p tin, Manifest cang dung 100 giU cac thong tin v~ phien ban, ten, va cac thOng tin khac v~ mOt g6i ket hcp c~ th.§. Sli dung ILDASM, ban c6 tM th!iy ro nQi dung cua bang Manifest c6 trong g6i ket bop .NET. Hlnh 5.1-1 180 nqi dung Manifest cua g6i mscorlib.dll.

~546

PHAN V : G6i ket hop

. mo u e extern kerne 32 .

• module ex~ern oleaue32.dll .module ex~ern mscore~.dl1 .module ex~ern ole32.dll

:~g~~~~ :~i~~~ :~~~~~;:~~~

.module eXeern user32.dll . assembly mscorlib

{ .custom instance void .custom 1nstance void .custom instance vo1d

sys~em~Resource5.NeutralResource5LanguageAt~ribute:: syseem.Reflec~ion.AssemblyOelaysingActioute::.ctor(1 sy5eem.Reflection.AssemblYDes~ript{onAttibute: :.etor

Cac grii Mt hop (assembly) .NET da tI! gi6i thieu ddy du v~ minh, do Iii, tat d. cac thong tin v~ n(\i dung cua g6i ket hop (assembly) d~u c6 tM duqc truy xua't den trong khi chuong trlnh dang thvc thi hoac tli cac ling dung .NET khac. Gi6ng nhu each rna cac chuang trinh COM client do tim nhirng dO'i tinrng phuc VI,! COM server v~ cac giao tiep duqc M trq, n6 c6 th~ lay tat ea cac thong tin cua mot g6i ke"t hop. Phan cuoi cua chuang nay se tao ra mot trlnh doc n(\i dung cua g6i ke't hop bao g6m nhililg thong tin dan gian .

.custom instance void 5yStem.ReSDurces.satellitecDntractver$iDnA~tribuee:: .CUseom instance void system.Refl~ction.AssemblyKeyFileAttibut.::.ctor(int

.custom ins~~nce void system.Runt1me.lnteropserv1ces~GuidAttr1bu~e::.ctor(

.custom instance void system.cLscompliantAttribuee: :.ctor(bool) • (01 00 0 II --- The following custom attribuee is added automatically, do not uncomplishmenJ.:J

Hinh 5.1-1 Manifest cho goi mscorlib.dll

1.2. Djnb vi goi ket hqp

MI,lC dich cua cac g6i ket hop (assembly) .NET 11\ cho phep de dang cai d~t cac thanh phAn d6i tugng (component). C6 th~ cai d~t mOt ling dung chi dan gian bil.ng phong each XCOPY ling dung Mn mOt thu muc khac tren may khach, Kh6ng cAn phai dang ky cac thanh phdn, khong cAn cac m.!tu registry cho COM. The' thl lam sao dinh vi duec mQt g6i ket hop khi chuang trinh dang chay? H(l thong .NET se dinh vi cac g6i k€t hop (assembly) cdn thie't theo nhililg tuy chon sau:

• Dttemg dAn cua Ung dung

• Thu muc bin duoi duang dAn cua Ung dung

• 'I'hu rnuc assembly duoi dttang dAn cua (tug dung (vi du: C:/program files \myapp \myassembly\myassembly .dll)

• Cache noi luu tru tam thai cac g6i k€i't hop chung eua h~ thong (xem chucng 5.2)

Ban c6 th~ tim thay chi tiet CI,! th~ han v~ each dinh vi g6i ket hop (assembly) trong tai li(\u MSDN, kg ca cac chu d~ v~ thuat toan do tim cling nheng th(C Iinh tinh khac.

, ,CHUdNG 5-1: Cac goi kit hop (ASSEMBLY)

547~

Voi phdn Ion cac irng dung, ta dung dung cac g6i ket hop rierig (private assembly). M(it g6i ket hop (assembly) rieng la mOt g6i Mt hop chi duqc dung rieng cho m(lt irng dung nao d6 thOi. Bai VI khOng irng' dung nao kMc cdn biet v~ 8\1" t6n tai cua chung, chung c6 thi! duqc d~t trong thu rnuc h,;\ th6ng hoac thu muc ron cua U'ng dung. Chi khi cong ty cua ban phat trien met b{i san phdm phai chia ,~~ ,cac g6i ket hqp thi ban mdi nan nght den viec dung cache b(J d~m chung nci ~iitli cac g6ik€t hop thunng dung trong chuang trinh.

2. GOI KET HQP LUU TRONG MQT T~P TIN DdN

M~c du co tM ban khong cdn Mn no, cac vi du a day d~u xet de'n g6i ket bqp dan. Hay nhe rang g6i ke't hop la cac tij.p tin EXE hay DLL. Vi~c nay co tM lam cho Iy thuyet v~ g6i ket hop (assembly) co ve kh6 nu6t m{it chut. M(Jt g6i k€t hop don.Ia ke't quii cua vi~c bien dich rna chuang trinh, va cac tai nguyen khac cho ket qua Ia mot DLL hay m(it EXEI

3. GOI KET HQP LUu THONG NHIEU T~P TIN

Quy trinh tao mot goi ket hop luu trong nhieu tij.p tin dinrc thl!c hien thOng qua cac tien ich dong lenh, Diem chu chct cdn phai giiii thich la cac g6i ket hop luu trong nhieu ti).p tin chi c6 the chua m1)t difi"m vao. D6 la each n6i ve viec chi mOt lap (class) trong g6i ke't hop ducc phep chua phuong th11"c Main. Dr nhien, neu g6i ket hop da tij.p tin Ia mOt DLL thi viec nay la khOng c§.n c6, Tuy nhien, neu g6i ket hop da tij.p tin la mQt file EXE thi n6 khong ducc phep c6 nhieu han mi,lt diem vao,

De tao ra g6i ket hop luu trong nhieu tij.p tin, ban c§.n tao ra hai tij.p tin ngufin va dich chung thanh cac doan rna .netmodule. Vi du: 5.1-1 va 5.1-2 chua rna , chltang trinh cho m(it lap rat dan gidn ket hop trong nhieu tij.p tin.

~I.

Vi du :1.1.1 Lop ClassOne • !{6i kP't hop hiu trong nhieu t;}p tin

'1: using System; ~;using FileTwo; ~:

[4: ·namespace FileOne {

public class ClassOne {

public static void Main ( ) {

ClassTwo ct ;; new Class'l'wo ( ); ct. SayHello ( );

1

(HJ 548

12:

13: }

14: }

15: }

Vi du 5.1-2 ClassTwo eua g6i ke't hop Itru trong nhi~u t~ tin

1: using System; 2:

3:

4: name ape.oe FileTwo { 5:

6:

7: public class ClassTwo {

8:

9: public void SayHello ( ) {

10:

11: Console _ WriteLine ( "Hello From

FileTwo_ClassTwo" );

}

12: 13: 14: }

}

D,g tao ra mot g6i ke't hop moi, trudc h6t ciin dich mM tij.p tin thanh module. LItU y den thu W cac budc cua quy trmh:

1. esc It:module two.cs

2. esc laddmodule:module two.netmodule It:module one.cs

3. al one.netmodule two.netmodule Imain:FileOne.ClassOne.Main lout:MultiAsm.

Itarget:exe

Buoc dAu tien cua qua trmh la tao lij.p module tl1 t~p tin rna ngudn tM I S& dl ta lam nhu vay la vi tap tin thu nhat can dung Mn FileTwo.ClassTwo. 1 d6, tao lij.p module tir tij.p tin rna ngudn thu nhat c6 dung de'n cac module rna dLlgc tao lap & bucc trudc, ELl6c cu6i SU" dung Mn Cong CI,I d6ng g6i ket hop al. M tao ra g6i ket hqp tit nhieu tij.p tin. LItU y rang neu ban xoa cac tij.p .netmodule va c6 chay MultiAsm.exe thl se co mot loi thuc thi do cac fang bU9' thieu, Hmh 5.1-2 cho thay ni)i dung manifest cua MultiAsm.exe; ILIU y rang eh tham chieu den one.module va two.module.

Bang each dong g6l nhieu tij.p tin v6i nhau trong ml)t g6i ket hop, chum c6 tM chdc chan duoc v~ st,i chinh xac cua cac tham chieu va phien ban cua chuong trinh se d\!qc thuc thi.

ta rul

CHUdNG 5·1: Cac g6i ke't hop (ASSEMBLY)

549~

I MANIFE5T " "', ~.{!k •

~~-~~~-.--~- ... ----~- - .. ~~.~ "-~-~--- -~ ~~~ --,~",,-.:;;.., ---"

I

.publicke~token = (81 lA 5C 56 19 3_ EO 89 )

.hash - (C3 83 Dl 6A BE BC lE 48 1A A5 _1 AC 39 C9 52 13 2A 80 96 0_ )

.uer 1;0;2411;0 }

.assembly HuHiAS .. {

/I .z··

/I j .. "'11 •• G.!

/I * .

.nodule extern onl'.nl't~odull' .assemblyextern IIIscorlib

{

II --- The following custom attribute is added automatically, do not unco .. r II .custom instance void [mscorlib]System.Diagnostics.OebuggableAttrlbute: /I

.hash algorithlll Ox00608004 .uer 0:0:0:6

}

.file one.netlllOdule

.hash = (DA C9 1E 60 36 5C E1 1E 99 35 DB AA )

.file two.netmodule

. hash = (31 DO ED liE 5E 02 86 91 9E E3 G6 92 )

.class extern public FileOne.ClassOne

7C 18 911 02 18 21 55 10 /I •.. ·6\·~1 ..
/I .5 ..
1:1 A8 5F B_ 65 Al 41 F5 /I 1. .. -
.a .•.
~ Hinh 5.1·2 Manifest cua MultiAsm.exe

4.cAc THU()e TINH eVA GOI KET HQP

Tat ca cac g6i ke't hop (assembly) deu chua nhieu thuoc tinh khac nhau, bao g6m ten cua g6i ket hop, cong ty, phien ban, van hoa, ban quyen, va cac di~n giai khac, Vi du 5.1-3 se cho thAy tap tin mac dinh Assemblylnfo.csdiroc them vao tLc bit cu du an C#.NET nao.

lc

Vi du 5.1·3 AssemblyInfo.cs

1: using System. Reflection;

2: using System.Runtime.CompilerServices; 3:

4: 1/

5: / / General Information about an assembly is controlled through the following

6: / / set of attributes. Change these attribute values to modify the information

7: / / ae aoc Lat ed wi th an assembly. 8: 1/

9: [assembly: AssemblyTitle {" ") 1

10: [assembly: AssemblyDescription ("")] 11: [assembly: As semblyConf igurat ion (,', II)] 12: [assembly: AssemblyCompany ("" ) ]

13: [assembly: AssemblyProduct ("" ) ]

14: [assembly: AssemblyCopyright (" ") 1

15: [assembly: AssemblyTrademark( 1111)]

16: [assembly: AssemblyCulture ("11)]

d. IP iii

~550

PaAN V : G6i k€t hcp

17: 18:/1

19: II Version information for an assembly consists of the following four values:

20: II 21: II 22: II 23: II 24: II 25: II

Major Version Minor Version Bui Id Number

Revision

26:11 You can specify all the values or you can default the Revision and Build Numbers

27: II by using the '*' as shown below: 28:

29: [assembly: AssemblyVersion ( "1.0. *" ) ] 30:

31: /I

32: II In order to sign your assembly you must specify a key to use. Refer to the

33: II Microsoft . NET Framework documentat ion for more information on assembly signing.

34: II

35: II Use the attributes below to control which key is used for signing.

36: II

37: II Notes:

38: II (*) If no key is specified, the assembly is not signed.

39: II (*) KeyName refers to a key that has been inliJtalled in the Crypto Service

40: II Provider (eSP) on your machine. KeyFile refers to

a file which contains

41: II (*) If the KeyFile and the KeyName values are both specified, the

42: II following processing occurs:

43: II (1) If the KeyName can be found in the CSP, that key

is used.

44: II (2) If the KeyName does not exist and the KeyFile

does exi s t, the key

45: II in the KeyFile is installed into the CSP and

used.

46: II (*) Delay Signing is an advanced option - see the Microsoft . NET Framework

47: II documentation for more information on this.

48:11

49: [assembly: AssemblyDelaySign(false)] 50: [assembly: AssemblyKeyFile ("")]

51: [assembly: AssemblyKeyName ( "" ) 1

'f

CHUONG 5-1: Cac goi ket hop (ASSEMBLY)

551~

Cac thuOc tinh dang kyt8n mOt gai Mt hqp (AssemblyDelaySign, AssemblyKeyFile, va AssemblyKeyName) da duqc trinh bay il chuang 5.2. Cac thuQc tinh con lai S8 rilt quen thuoc viti cac li).p trinh vi~n Win32. MOi g6i k6t hqp c6 thg c6 cac thong tin v~ cong ty cung cap, kg ca cac thong tin v~ ban quyen va phien ban hien tai,

5_ TAl N4--P G61 KET HQP KHI CHU<1NG TRiNH DANG THljC THI

H~ thong .NET se tai tilt ciI. cac goi kilt hop khi c~n thiilt va tham chieu Mn nhITng goi kilt hop khac dua VaG nOi dung trong cac Manifets. Vi du mOt ang dung Windows Forms thuo-ng tham chieu den goi System.Windows.Forms.dlL 'fuy nhien, doi khi chung ta cung c~n den viec tai d(Jng (dynamic) cac goi ket hqp (assembly) .NET khi dang thuc thi. Co' che' tai d(lng S8 cho chiing ta kha nang tai cac thanh phan .NET dil dung VaG bat ky hie nao chuang trinh c6 nhu cfiu va vOi ba't ky g6i nao rna chuang trinh mong muOn S11 dung.

Tai cac g6i kElt hop trong khi chuang trinh dang chay la m(Jt Co' che' manh M rna rong mot 11ng dung, Hay nght den mOt irng dung cho phep cac form dinrc them VaG a met thai digm b<ft kyo Vi du: Microsoft Management Console (MMC) cho phep phat trien cac snap-in, chung la dan gian chi la cac thanh phan COM dugc goi trong shell do MMC cung cap.

5.1. D~ an FormHost

Nham minh hoa nhUng buac co' ban di'l tai cac goi kilt hop trong khi chuang trinh dang chay voi muc dich rna r(lng m(Jt aug dung, chung ta S8 tao ra m(Jt du an minh ho ... nho. Cac 11ng dung minh hoa 58 tim cac goi kilt hop trong mOt thu muc con xac dinh. Moi goi kilt hop se duqc tai len, va kieu cua cac g6i kilt hop se. diroc thea doi, Neu mQt kiilu trong goi ke'"t hop nao do diln xuift w ldp System.Windows.Forms.Form va kii'lu ay ho trq mot giao tiep mil rOng, trong vi du eua chung ta la IFormHostClient, thi form 8e duoc tai len va mdt muc chon menu 8e duqc them VaG form chu,

D~ xay dung vi du minh hoa nay, ban hay lam cac buoc sau:

1. Tao mot giai phap (Solution) tr6ng co ten DynamicAsmLoad.

2. Sau khi da co mot giai phap trting, bii.t dAu bang each them VaG giai phap mQt du an thu vien lap C#. D~t ten thu vien fiy la FormHostSDK (DV an FormHostSDK se khong lam gi ngoai vil1ic cho phep mot giao tiep dan dung trong vi du minh hoa),

3. Them mQt lop moi VaG FormHostSDK va dat ten la I FormHostClient.

Vi du 5.1-4 dudi day se chi ra cac dinh nghia giao tie'p dVoc dung ca trong dl,i an FormHost Iiin dV an FormOne.

-.

1J552

PHAN V : G6i ket

Vi dl! 5.1·4 Giao tie'p IFormHostClicnt

1: IllSimple Interface for forms 2: 11/

3: using System; 4:

5: namespace FormHostSDK 6: {

7: public interface IFormHostClient {

8:

9: string MenuText {

'10: get;

11: }

12: }

13: }

Giao thirc IFormHostClient chi d.n cai di).t met thuoc tinh. Thuoc MenuText dircc dung d€ them mot rnuc menu cho FormHost (dircc tao trong I sau) ..

Ban them met, Windows Application C# VaG du an voi ten For ml Windows Application nay se phuc vu nhu met ling dung chua cac form MOl chung se duqc d~t nam trong cac g6i (assembly) va duqc ta i dQng hoi ung I ForrnHost. Vi du 5.1~5 se cho thay cac doan rna cua ling dung ForrnHost.

Vi dl! 5.1·5 FormHost

1: using System;

2: using System. Drawing;

3: using System. Collections;

4: using System. ComponentModel; 5: using System. Windows. Forms; 6: using System. Data;

7: using System.Reflection; 8: using System. IO;

9: using FormHostSDK; 10:

11:namespace FormHost

12: { 13: 14: 15: 16: 17: 18: 19: 20: 21:

1// <summary>

1/1 Summary description for MainForm. / / / < I summary>

public class MainForm : System. Windows. Forms. Form {

/ II < summary>

III Required deaigner variable.

III </summary> privateSystem.ComponentModel.Container

components = null;

CHlfdNG 5-1: Cac g6i ket hop (ASSEMBLY)

553~

22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
I 41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63: privateSystem.Windows.Forms_MdiClient mdiClientl;

private System. Windows . Forms . MainMenu mainMenul; privateSystem.Windows.Forms.Menultem FileMenultem;

private System. windows. Fbrms.Menultem FormsMenultemi private System. Windows . Forms _Menultem ExitMenultem;

private Hashtable forms = new Hashtable ( ) ;

public MainForm() {

II

I I Required for Windows Form Designer support II

InitializeComponent();

II

I I TODO: Add any constructor code after InitializeComponent call

II

LoadForms ( );

I I I < summary>

I I I Clean up any resources being used. I I I < I summary>

protected override void Dispose ( bool disposing {

if ( disposing) {

if (components! = null) {

components.Dispose();

}

base _ Dispose ( disposing) ;

}

#region Windows Form Designer generated code I I I < summary>

I I I Required method for Designer support - do not modify I I I the contents of this method with the code editor.

I I I </summary>

private void InitializeComponent ()

1Il554
64: {
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:.
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100;
101 :
102:
103:
104: pHAN V : G6i Mt hop

this. mdiClient 1 = new System.Windows.Forms.MdiClient()i this .m.ainMenul '" new System.Windows.Forms.MainMenU()i this. FileMenuItem = new System.Windows.Forrns.MenuItem()i this. FormsMenuItem = new

System. Windows . Forms .MenuItem( ); this . ExitMenuItem = new

System.Windows.Forms.MenuItem(); this.SuspendLayout();

1/

// mdiClientl 1/

this .mdiClient1.Dock =

System.Windows.Forms.DockStyle.Fill; this .mdiClientl.Name = "mdiClientl";

this. mdiCl ient 1. • Tablndex = 0 i

1/

1/ mainMenul

1/ this.mainMenul.Menultems.AddRange{

new System. Windows . Forms .Menultem[l { this.FileMenuItem, this. FormsMenuItem }

) ;

//

/1 FormsMenuItem 1/

thi s . FormsMenultem. Index = 1.;

this. FormsMenultem.Text = "F&OrmS";

1/

// FileMenultem 1/

this. FileMenultem. Index = 0;

this. FileMenultem.Text = "&File"; this.FileMenuItem.Menultems.Add(

this.ExitMenultem) ;

1/

/ I menultemExit 1/

this.ExitMenuItem.lndex = 0;

this • ExitMenultem. Text = "E&xit"; 1/

CHudNG 5·1: Cac g6i ket hop (ASSEMBLY)

555~

105: II MainForm

106: II

107: this .AutoScaleBaseSize '" new

108: System. Drawing. Size (5, 13);

109: this .ClientSize = new

110: System.Drawing.Size(576, 429);

111: this .Controls . AddRange (

112: new System. Windows. Forms. Control [] {

113: this .mdiClientl

114: }

115: ) ;

116: this. IsMdiContainer '" true i

117: this . Menu = this .mainMenul;

118: this.Name = "MainForm";

119: this. Text = "MainForm";

120: this. ResumeLayout (false) i

121:

122: }

123: #endregion

124:

125:

126: III <summary>

127: III load any dynamic forms

128: III </sununary>

129: protected void LoadForms ( ) {

130: string FormsDir ::: string. Format (

131: "{O} \ \ Dynamic Forms " •

132: Application. StartupPath

133: ) ;

134:

135: IILocate all Assemblies (DLL' s only)

136: string [] Files = Directory. GetFiles (

FormsDir, "·.dll" );

137:

138: foreach ( string strFile in Files) {

139: System. Reflection. Assembly curAsm =

System.Reflection.Assembly.LoadFrom( strFile}; 140:

141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151:

IILook at the exposed types

System.Type[] types::: curAsm.GetTypes( ); foreach ( Type T in types ) {

if ( T. IsSubclassOf ( typeof ( Form) ) ) { IICreate an instance and add to main menu Form frm =

(Form) curAsm.Createlnstance ( T.FuIIName); this.forms.Add(

( (IFormHostClient) frm) . MenuText, T ) ;

Menultem newltem = new Menultem (

\!9J 556
152:
153:
154:
155:
156:
) ;
157:
158:
159:
160:
161 :
162:
163:
164:
165:
166:
167:
168:
169:
170:
171 :
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185: }
186: } pRAN V : G6i Mt hql

{(IFormHostClient)frm) . MenuText,

new EventHandler (

this .OnFormSelectMenu ) ); FormsMenultem.Menultems.Add( newltem

} }

}

}

11/ <summary>

III Create an instance of the requested form I / / < / summary>

/11 <paramname=="sender"></param> I / I -cpa r am name="e"></param>

protected void OnFormSelectMenu ( obj ect sender I EventArgs e ) {

Menultem mi == (Menultem) sender;

if( this.forms.ContainsKey( mi.Text ) )

Type T = (Type) this. forms [ mi .Text ] ;

Form frmChild == (Form)Activator.Createlnstance{ T);

frmChild.MdiParent "" this; frmChild.Show( );

}

}

1/1 < summary>

III The main entry point for the application. / II < / summary>

[STAThread]

static void Main ( )

{

Application.Run(newMainForm(» ;

}

Ben trong cac doan rna cua FormHost, thirc sl! chi c6 hai phuong thuc dang quan tam. Phuong thirc tha nhat, LoadForm, bih dau cr dong 127, chiu trs nhiem dinh vi cac goi ket hop (assembly) chira cac form co the duoc g9i ben trr shell. Phuong tlurc LoadForm bat dau bang viec la'y m9t danh sach cac g6i ket I co th~ c6 va duyet qua chung. Meli goi ke"t hop sau do se dl1gc tai len bang phu( thuc tInh Assembly. LoadForm. Lap Assembly nam ben trong khOng gian System. Reflection.

Sau khi mQt g6i ket hop duoc tai len, budc tie'p thea Ia trfch rut cac kieu sau do so sanh cac ki~u ay vai hai btlae ki~m tra dan gian, BucJc kiern tra thu n

catroso 5-1: Cac goi ket hop (ASSEMBLY)

557~

la ki§m tra xem ki§u dinrc tM len co phai la d§n xuat cua ki~u ca s& System.Windows.Forms.Form hay khong. Neu kieu dircc tai len ia dung, ten cua n6 se duoc them van trong menu cua Form va cac thong tin kieu se dime luu trong bang bam.

Khi chon form ducc tai len tren menu, kieu se duqc tai tU bang bam va sii dung lap Activator, mQt th~ hien mdi se duqc tao ra va hien th] tren cua s6 MDL

De ke't thucphan minh hoa, chung ta se them m{it dV an lap thu vien C# van du an DynamicAsmLoad hien tai va di).t ten n6 la FormOne. Thu vien FormOne se chua met lop dan dl1qc dan xul'lt tU System. Windows. Forms va cung se dl1qc cai dij.t giao tiep can thiet IFormHostClienL Ban nhrr tham chieu vao dV an FormHostSDK hoac DLL. Them van d6, irng dung FormHost tim kiern cac g6i ket hop nam trong thu m\1C con DynamicForms, vi the' phai chac chdn ding du an FormOne se duoc bien dich trong thu muc nay. each de nhit la thiet l~p cac thuoc tinh bien dich cua dir an vi! thu muc nay. Hinh 5.1-3 I! hop thoai Project Properties va cac thiet l?p cho thong tin bien dich,

Oebugg~ng Advonced

Hinh 5.1-3 Cric thuoc tinh ctia du an FormOne Vi du 5.1-6 la cai di:\t cua 16p FormOne

Vi dl!c 5.1·6 FormOne

1: using System;

2: using System. Drawing;

3: using System. Collections;

4: using System.ComponentModel; 5: using System.windows.Forms;

rIJ 558

PuAN V : G6i ket

6:

7: using FormHostSDK; 8:

9: namespace FormOne 10: { 11:

12: 13: 14:

III <summary>

III Summary description for FormOne. III < I summary>

public class FormOne : System. Windows. Forms. Form, FormHostSDK.IFormHostClie

15: {

16:

17: III <summary>

18: III Required designer variable.

19: III < I summary>

20: private System. ComponentModel. Container

components = null;

21: 22:

23: II Implement the IFormHostClient interface

24: public string MenuTaxt {

25: get {

26: return "Form One";

27: }

28:

29:

30:

31: public FormOne ()

32: {

33: II

34: II Required for Windows Form Designer support

35: II

36: InitializeComponent () ;

37:

38: II

39: II TODO: Add any constructor code after

Ini t ia liz eComponent call

40: II

41: }

42:

43: III < summary>

44: 1/1 Clean u~ any resources being used.

45: 111< I summary>

46: protected override void Dispose ( bool disposinl

47: {

48: if ( disposing)

49: {

50: if (component s ! = null)

51: {

559l!J

CHlfdNG 5·1: Cac g6i ke"t hop (ASSEMBLY)

52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70: }
71: } components.Dispose()i

}

}

base. Dispose ( disposing) i

#:region Windows Form Designer generated code / / / < summary>

/ / / Required method for Designer support - do not modify / / / the contents of this method with the code editor.

/ / / </summary>

private void InitializeComponent () {

this. components = new System.ComponentMod.l.Container(); this .Size :: .new System. Drawing .Size (300,300) i this . Text = 11 FormOne 11 i

} #endregion

Vai slJ hoan tilt lap FormOne, chi coin bien dich toan be} giai phap va chay thli U'ng dung FormHost. Neu n6 chay tot, mgt menu se hien ra tren form, va khi dlCqc chon, ciia s5 FormOne se xua't hien nhu hlnh 5.1·4.

Hinh 5.1·4 FormHost uai FormOne

m!l560

PHAN V : G6i k€t hop

M<).c du vi du nay khong An tuqng Him, nhimg no dem den cho ban nhirng co sCi du de hilt diu mut ling dung lon vdi nhieu tinh nang han.

5.2. Trinh duy~t g6i (Assembly Viewer) don gian

Su6t cu6n sach nay, cac Reflection API da duoc dung de hrorn l<:it nhung thong tin v~ kieu va cac g6i Mt hop. Cac goi Mt hqp .NET tv mo ta v~ minh kha day du Mn nlii ban co tM dich nguoc mot .NET assembly ttl' IL sang Ct. Cac qui trmh de phat sinh C# tit IL se mat mOt it cong sac, tuynhien, phat sinh cac cau true dan gian cua lop .NET W cac mo ta duoc tim thay ben trong mot g6i thl lai dan gian han rat nhieu,

Assembly Viewer, nhu trong htnh 5.1-5, da duqc xay dung trong khoang 30 phut va khong t6n mQt cong sue nao ca. Mac du Assembly Viewer khling nhan V30 IL va dich nguoc n6 nhung viec them vao tinh nang nay la hoan toan co the,

Hinh 5.1-5 Assembly Viewer

Thay vi trinh bay wan b<) rna chuang trinh d dAy, chi cac doan eo traeh nhiern phat sinh rna C# tit System.Type moi duqc trlnh bay nhu trong vi du 5.1-7.

cHlfdNG 5-1: Cac g6i kilt hop (ASSEMBLY)

5611!J

Vi du 5.1-7

1: using System;

2: using System.Collections; 3: using System. Reflection; 4:

5: namespace AssemblyViewer. ASMContent 6:

7: / / / < sununary>

B: / / / Sununary description for TypeSourceEngine.

9: / / / < / sununary>

10: public class TypeSourceEngine

11: (

12: public static BindingFlags BF =

BindingFlags.public BindingFlags.NonPublic BindingFlags. Instance I BindingFlags. Static I

BindingFlags.DeclaredOnlYi

13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
ch 32:
7. 33:
34:
35: / / / < summary>

/ / / Generate C# code from a given Type / / / < / summary>

/ / / <paranfname=lT">Type used for code generation</param> / / / <param name="stream">Stream object to write to</param> public static void GenerateCode( Type T.

System. IO. Stream stream) {

System. IO. StrearnWriter BW = new

System. IO. StreamWriter ( stream);

if ( T. IsEnum ) GenerateEnum( T. sw ); else

GenerateClassOrlnterface ( T. sw );

}

/ / / < summary>

Ilj 562

"

PHAN V : G6i ket h~

II/If the Ty];>e.is. ac'lass.or interface"generate th proper code

37: 38: 39: 40:

41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:

/ / I < / summary>

/ I / <param name="T"></param> / / / cpaz-am name = " sw" >< /param>

private static void GenerateClassOrlnterface ( Typ

, T, System. IO.StreamWriter sw) {

ArrayList Fields;

ArrayList Properties;

ArrayList Methods;

ArrayList Events;

GenerateFields ( T, out Fields ) i GenerateProperties( T, out Properties}; GenerateEv:ents ( T, out Events ); GenerateMethods (T, out Methods);

sw.Write( GenerateTypeStmt( T) ); sw.write ( "\r\n" );

Inject ( sw, Fields, "Fields" ) i

Inject ( sw, Properties, "Properties" ); Inject ( sw, Events, "Events" );

Inject ( aw, Methods, "Methods" ); aw.Write{"}")i

sw.Flush() ;

}

1/1 <summary>

/ / / Generate code for an Enum type / / / < / summary>

/ / / <param name="T" ></param> / / / -cpaxarn :q.ame:::" swn >< /param>

private static void Gene rat eEnurn( Type T, System. 10. StreamWriter sw )

67: {

68: ArrayList Fields;

69: GenerateFields ( T, outFields );

70: sw. write ( GenerateTypeStmt ( T ) );

71: 72: 73: 74:

sw.write( "\r\n" );

Inject ( sw, Fields, "Fields" ); sw.Write("}");

sw. Flush{ );

CaUdNG 5·1: Cac g6i ket hop (ASSEMBLY)

563k!J

75: }

76:

71: III < summary>

78: III Creates a type declaration statement:

79: III (public I private) [abstract I sealed]

[interface I class I struct I TypeName [: [Base Class I , [Interfaces] ]

80: I II < I summary>

81: III <paramname="T"></param>

8~ III <returns></returns>

83: private static string GenerateTypeStmt ( Type T ) {

84: string stmt = "" i

85:

86: if ( T. IsPublic )

87: stmt = "public";

88: else if ( T. IsNotPublic )

89: stmt = "private" i

90:

91: if( T.IsAbstract)

92: stmt += "abstract" i

93: else if ( T. IsEnum )

94: stmt += "enum ";

95: else if ( T. IsInterface

96: stmt += "interface";

97: else if ( T. IsSealed )

98: stmt += "sealed" i

99:

100: if( T.IsClass )

101: stmt += "class";

102: else if (T. IsInterface )

103: stmt += "interface";

104: else

105: stmt += "struct ";

106:

107: bool bHasBase = false;

108: stmt += string. Format ( "(O} ", T.Name);

109: if ( T. BaseType ! = null) {

110: stmt+=string.Format(": (O}",

T.BaseType.Name);

111: bHasBase = true;

112: }

113:

lMJ 564

PHANV: G6i

114: 115: 116: 117: 118: 119: 120: 121:

System.Type[] Interfaces = T.GetInterfacee if ( Interfaces. Length! = 0 ) {

if( !bHasBase)

stmt += ": ";

foreach( Type ttin Interfaces) { stmt += tt .Name;

stmt += ", ";

}

122: stmt = stmt. Substring (0, stmt. Length -

123: )

124: stmt += " {";

125: return stmt;

126: }

127:

128: I 1/ <summary>

129: I I I Inject source into StreamWriter

130: I I I < I summary>

131: III <paramname="al"></param>

132: III <paramname="EntryType"></param>

133: private static void Inject (

System. IO. StreamWri ter s

134: ArrayList a L,

135: string EntryType ) {

136:

sw.write("\tlllllllllllllllllllllllllllll/IIII,

) ; 137:

sw. Write (string. Format (" \tl / CO) \r\n", EntryTyp

138: sw.Write("\tllllllllllllllllllllllllllllllllll

) ; 139: 140: 141: 142: 143:

foreach ( string s in al ) { sw.Write("\t"); sw.Write( s ); sw.Write( "\r\n" );

}

144: sw.Write{"\r\n");

145: }

146:

147:

148: I I I <summary>

149: I / I Generate Field declarations

CHUONG 5-1: Cac g6i ket hop (ASSEMBLY)

565~

150: I I I < I summary>

151: III <paramname="T"></param>

152: I I I <param name="fieldList"></param>

153: private static void GenerateFields ( Type T, out

ArrayList fieldList )

154: {

155: fieldList = new ArrayList ( );

156: FieldInfo [] fields = T. GetFields ( BF ) ;

157: foreach( FieldInfo fi in fields) {

158: fieldList . Add ( GenerateFieldStmt ( fi ) );

159: }

160: }

161:

162: I I I <summary>

163: I I I Generate the actual field stmt

164: I I I ie : private int someFieldMember;

165: I I I < I summary>

166: III <paramname",IIfi"></param>

167: I I I <returns></returns>

168: private static string GenerateFieldl;1tmt (

FieldInfo fi ) {

169: 170: 171 : 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185:

string stmt;

if ( fi. IsPublic

stmt = "public"; else if ( f1. IsPrivate stmt = "private "; else

stmt = "protected";

if ( f1. IsStatic ) stmt += "static";

stmt += fLFieldType.Name; stmt += .. ";

stmt += fi.Name; stmt += "; 11;

186: return stmt;

187: }

188:

189: private static void GenerateProperties ( Type T,

1!!1566

PRAN V : G6i Mt hop

190: 191:

192: 193: 194: 195: 196:

197: }

198:

199: private static string GeneratePropStmt (

PropertyInfo pi ) {

200: string stmt = "public";

201: stmt += pi. PropertyType . Name;

out ArrayList propertyList ) {

PropertyInfo [] props = T. GetProperties ( ) i propertyList = new ArrayList ( );

for each ( PropertyInfo pi in props )

propertyList .Add( GeneratePropStmt ( pi ) );

202: stmt += 11 ";

203: stmt += pi . Name;

204: stmt += " { ";

205: if ( pi. CanRead )

206: stmt += "get; ";

207: if( pi.CanWrite)

208: stmt += "set i ";

209: stmt += " }; "i

210: return stmt;

211:

212:

213:

214: private static void GenerateMethods ( Type T I

215: out ArrayList methodList ) {

216: Methodlnfo [] Methods = T. GetMethods ( BF ) i

217: methodList = new ArrayList ( );

218: foreach ( Methodlnfo mi in Methods)

219: methodList . Add ( GenerateMethodStmt ( mi ) );i

220:

221: }

222:

223: private static string GenerateMethodStmt (

, Methodlnfo mi )

224: string stmt;

225:

226: if ( mi. IsPublic

227: stmt = "public";

228: else if ( mi. IsPrivate

229: stmt = "private";

CHudNG 5-1: Cac g6i ke't hop (ASSEMBLY)

567!J

230;
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
.250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
261:
262:
263:
264:
265:
266:
:~ :. else if ( mi. IsFamily ) stmt = "protected"; else

stmt = "protected internal" ;

if ( mi. IsVirtual )

stmt += "virtual"; else if { mi. IsAbstract stmt += "abstract";

stmt += string.Format("{O} {1}( ",

mi. ReturnType. Name, mi . Name ) ; Parameter Info [] Params = mi. GetParameters ( ); if ( Params. Length> 0 ) {

int i;

for ( i = 0; i < Params. Length - 1; i++ stmt += string. Format (" {O},

II ,GenerateParamStmt ( Params [il) ); stmt += string. Format (" {O} ", GenerateParamStmt ( Params [ i 1 ) ) ;

}

stmt += ,,) ; " ; return stmt;

}

private static string GenerateParamStmt ( Parameterlnfo pi ) {

string stmt = "";

if ( pi. IsIn )

stmt =" [in] It; else if { pi. IsOut stmt = "[out] "; else if (pi.IsRetval stmt = "[refl ";

stmt += string. Format ( "{ O}

{1} " ,pi. ParameterType . Name, pi. Name ); return stmt;

}

private static void GenerateEvents ( Type T, out ArrayList eventList ) {

Eventlnfo[J Events = T.GetEvents( BF );

~568

PHAN V : G6i k€t hq:

267: 268: 269: 270: 271: 272:

eventList= new ArrayList ( ) ; foreach( Eventlnfo ei in Events

eventList .Add( GenerateEventStmt ( ei ) );

}

273:
274: }
275:
276: }
277: } private static string GenerateEventStmt ( Eventlnfo ei ) { returnstring.Format("public {OJ {l};",

ei . EventHandlerType . Name, ei. Name) ;

Doan rna phat sinh C# tren day kha dan gian, chung ta c6 thil cai tie'n VI dl 5.1-7. Ciii tien thu nhat la loai bo tat ca cac cau true C# dti<?"C g5 bAng tay van VI dung lap CodeDorn, narn (; Systern.CodeDorn M thay the. Sau do, di nhien, Iii nil-I rn(lt IL ttf rn(lt goi ket hqp .NET va phat sinh cac cau I/!lnh chmh xac bang ngol ngfi' da duqc chon,

6_ KET CHDc1NG

Cac g6i Mt hqp .NET la co che rat manh d~ dong g6i khong chi cac rna II rna con cac thong tin v~ kit~u rna nho do g6i ket hop co tM tv giai thieu diiy du V. no. Trong chuang tiep theo, chu d§ v§ chu ky 56 va phien ban hoa cac goi ket hill se duqc trinh bay. Sa dung cac g6i k€t hop .NET va cac Reflection API se chUnI minh chung lit nhtrng ta.i nguyen vo gia d~ rna f(lng dai song cua cac aug dung vi khien chung de thay d6i, bao tri, nang cap han.

HAu nhu ta.'t ca chung ta deu biet, mut trong nhung muc dich khi t1).O ra Win32 DLLs la d€ dung lai rna d~ dang. Chung ta cung biift rl!.ng cac phien ban (version) cua nhl1ng DLLs khac nhau c6 tM giup nang cap m(lt dng dung tilt han nhung cung c6 th~ d~ dang lam hong chuang trinh hien hanh dang chay tot. Cac nguyen tilc cua mil hmh do'i tinrng COM da co' gAng khac phuc va.'n d~ nay thong qua nhtrng qui lu~t khac khe, nhung nhung qui luat nay duoc lip dung bdi cac nha phat t~i~n va khong bi blit buoc trong ba.'t ca thu vien thuc thi (runtime) nao, Vi v~y, ngay ea cacrrng dung dung cac thanh phan COM (COM component) cling chi ra rling kh6ng phai ta.'t ell cac nha phat tri§n COM deu theo cac qui tile nay, va phdn

p m8m se sup dii' khi sll' dung cac version DLL khac nhau cho 1 component chung,

g

it Wii .NET, Microsoft da chon mot huang mdi M giai quyet va.'n d~ dang sq v8

DLL nay, .NET runtime ton trong version cua cac component va con cho phep cai d~t cac component theo nhirng version khac nhau. Tu nay, cac aug dung khach client hoan toan co tM chon I01).i version DLL dfl dung; theo m~c dinh, mqt dng dung se nap version cua DLL rna n6 da rang buoc vao hie bien dich ban dau. Neu c6 sAn 1 version mci cua mOt thanh phan component dung chung, ling dung nay c6 th~ dliqc cau hmh 11).i M dung version mdi cua DLL hoac tiep tuc dung DLL cu hi~n hanh,

C~uclng 5.2

eHU Kt s6 vA PHIEN BAN

Cae v/£n d~ chinh se dUde d~ cap d€n: .r DLL hell

.r 89 r#m (cache) toan ClfC danh. cho g6i k€t hop

.r Qudn ly phien ban .r Cau hinh cZng dlfng

1. DLL HELL

2. BQ DtM (CACHE) ToAN cue DANH CHO G61 KET HOP (GLOBAL ASSEMBLY CACHE)

Global Assembly Cache (GAC) c6 nghta la sv thay the cho cac component dung chung. Trong the gioi COM, mbi khai niem ve COM nhu coclass, interface,

progid, v.v ... duqc dang ky trong bq Registry cua h~ th6ng. H!$ th6ng phu COM dung thOng tin nay d~ xac dinh component COM va nap dOi t~g nay. Trong .NET, GAC hoat dC)ngnhu la eha {j cho tift ca component dung chung. Ba.'t ctc component .NET nao cang dLiqc cai di:lt trong GAC nho ti~n Ich gacutil.exe dicung voi .NET runtime hoac co tM dung Windows Explorer va keo component nay b6 vao trong thu

~570

PRAN V : G6i ket hop

muc GAC. GAC nam trong 1 thu muc con cua thu rnuc system co s6';trong Windows 2000, utt ca component dung chung nam trong c: \ WINNT\assembIy ne'u ban chon cai d~t m~c dinh. Hinh 5.2-1Ia nl,ii dung cua GAC.

M6i component .NET c6 1 bang mo ta Manifest nhu la 1 phdn cua tij.p tin goi; bang mo ta nay g6m tMng tin ve version diroc dung trong bl,i nap CLR dE! buoc version component .NET phai tuan theo. Con so bi~u di~n version g6m nhung thong tin sau:

• Major (thong tin chinh)

• Minor (thong tin phu)

• Revision (thong tin khi duyet la i component nay)

• Build Number (thong tin khi bien dich component nay)

2.7.0,0 b03f5f7f 11dsOa3a
],0.0,0 4f3430cffl54i:24c
9,1,0.0 4f3430cff 154c24(
9,1.0,0 4I'3430cffl54C24c
9,1.0,0 4f343Ocff 1.54<24<
9.1.0,0 4f343Ocff 154c24c
9.1.0,0 <lf343Ocff 154c21<
],0.0.0 4f343Ocff 1 51<24c
1.0.0,0 4i3430d'fl51<24c
1.0,0.0 4f3430cff 154c24C Hinh 5.2-1 NQi dung cua thu muc GAG

Cac thong tin ve version i1 tren duoc dung d'; dam bao nap dung component ,NET cho 1 irng dung client cho truce. Neu ling dung client yeu cAu 1 version khong c6 sii:n, bo? nap CLR se that bai va n6 se baa cao lai thong tin v~ I3i nay.

3. PHIEN BAN (VERSION) eUA COMPONENT

C6 1 s6 hudc phai tuan thea dil tao cac component dinrc phien ban h6a. Vao thtri di';m vi€t bai nay, VS.NET chua ho trg kha nang tao t\1' dQng cac component da duc:tc ky nhan b~ng chtr ky 86. Budc dau tien la phat sinh 1 kh6a ky nhan s6 (signing key) nho ti~n Ich SN,exe di cung vai hi? SDK .NET. N6i chung, 1 cong ty se tao ra 1 khoa nhu tren va tf(t ca thanh phan component .NET rna ho tv 410,

CHUdNG 5·2: OM ky s6 va phien ban

571~

ddng thai dung kh6a nay d~ ky nhan cho component. D~ tao ra 1 c~p kh6a public/private, ta dung l~nh sau:

, en.exe -k sams.snk

Lenh nay tao ra 1 i4P tinkh6a dliqc dung d4'1 ky nhan g6i ke't hep chua nhilng thanh phan component. Voi t~p tin khoa vira tao, ta tao mdi 1 du an (project) VS.NET cho thu vien Jap C# va dij.t ten dlf an nay la SharedComponent. K€ til!p, ban them '1 lap mm mang teD SharedServer, cho dl,l an Day va nhap vao doan rna nhu trong vi du 5.2-1 dl1ai day.

Vi du 5.2-1 M5. ngu6n SharedServer

1: using System; 2 :

3: namespace SharedComponent 4: { 5: 6: 7: 8 :

9 : 10: 11: 12 : 13 : 14: 15: 16: 17 :

III <summary>

III Summary description for Classl. I I I. < I summary>

public class SharedServer {

IISingle method to return version information public string WhoAmI ( ) {

string me = "Hello from version 1.1" ; return me;

}

} }

Sau d6 lop nay se dliqc dung M kit!mtra vi(ic h6 tro version dinrc cung cap brri b{l nap CLR. Dti 40 ra 1 dl! an M tro viec ky nhan, ta sira tap tin Assemblylnfo.cs va them thong tin kh6a, nhir trong vi du 5.2-2 sau:

Vi du 5.2-2 Asscmbl Info,cs

, .

1: (assembly: AssemblyDelaySign(false)]

2: [assembly: AssemblyKeyFile ("D: \ \SAMS\ \SAMS. SNK")] 3: [assembly: AssemblyKeyName ("")]

LI1U Y rAng thuQc tinh [assembly: AssemblyKeyFile(. .. )] dligc dung M chi dinh t~p tin kh6a cho viec ky nhan g6i assembly nay. D6 Ia cac bircc phai lam. Bay gier, ta bien dich g6i vira tao va keo DLL dii dliqc bien dich van trong thu muc GAC mang ten c:\WINNT\assembly bang Windows Explorer. Hlnh 5,2-2 cho thily Windows Explorer cua thu muc GAC va SharedComponent.dll mdi duqc cai dij.t.

~572

PHA.N V : G6i ke't hi

1.0,2411.0 [,0,0,0 2,0,0,0

PreJit 1.0,2411.0 1.0,2411.0 1.0,2411.0 1.0,2411.0

PreJit 1.0,2411.0 1.0,2411.0 1.0,2411.0

~System.Drawing PreJit 1.0,2411.0 D03f~7flld5Da3i1

rll~Bi,S*":V,S"",t:,.,.;."",Dr,=a~.,.....:o""""_>_~~ __ """':"'I'=:,;,""i~!"""~""",: •.. _.1 .... ;~~~~"......,:I1,r7.11~l~:i:~3~::!

J

I

b03f5f7fud50a3a
b03f5f7flldSOa3a
b77 aSc561934e089
b77a5c561934e089
b03fsf7f 11 d50a3a
.'~.
b 77 aScS61934eOB9
b03fSf7flldSOa3a ~
b03fSf7flld50a3a
D03f5f7flldSDa3a Hinh 5.2·2 SharedComponent.dll trong thu muc GAC

Sau khi d?t g6i assembly chung dung eM, ta c6 thg tao ra mi?t trlnh khae client si't dung SharedComponent.dll nay, Ban tao mci 1 du an Windows Forms, them 1 tham chieu t6i g6i SharedComponent bling each chon dl! an, nhan phi phai chuQt vachon Add Reference tli menu tAt shortcut.

Dg kigm tra SharedComponent nay hoat dO-ng, .bl;ln d/!;t mi}t nhan vao for chuang trmh sau do them doan rna nhir vi du 5.2~3 van trong phuong thuc kh dl!llg ella form nay,

Vi du 4.4.1 Kii'im tra SharedComponl°nt

1: public Forml () 2: { 3: 4: 5: 6:

1/

Ii Required for Windows Form Designer support II

InitializeComponent();

7 :

8: I I

9 : II TODO: Add any constructor code after

InitializeComponent call

CHtfdNG 5-2: Chi1 ky s6 va phien ban

5731!J

10: /I
11,:
12:
13: } SharedComponent . SharedServer ss = new SharedComponent.SharedServer( }; this .labell . Text = ss. WhoAmI ( );

Cac dong 11, 12 tao d1Si tugng SharedServer mdi va gan thuQc tinh Text cua nhan cho chuoi tra v~ cua ham WhoAmL Bay gic, bien dich va chay ling dung client d~ kiem tra sl,f ke't noi cua g6i assembly nay. Ke't qua chay se hi~n th] nhu hlnh 5.2-3.

Hinh 5.2-3 Caa 56 chuang trinh tlui nghi~m

Ung dung client tren dugc rang buoc vai version hien hanh cua g6i assembly dung chung nha van thong tin version c6 san khi bien dich client. Trong phan tai, 1 version mai han cua component, nay se dugc tao va cai d~t van trong GAC. Sau khi lam xong di~u nay. ling dung client v§.n dung version d:1u tien cua DLL cho Wi khi no dligc cau hinh M dung version rndi hon.

4. cAe GOI ASSEMBLY sn DQNG NHIEU PHI~N BAN

f)~ minh hoa kha nang hO trg cac phien ban lien tiep nhau cua cac g6i assembly .NET, ban hay rna lai dl,f an ShareCornponent va thuc hien cac thay d6'i sau:

L C~p'nh!J.t thuQc tinh versiontrong Assemblylnfo.cs thanh 1.1.

2. Thay d6i chujii tra v~ cua ham WhoAmI d~ phan anh thOng tin version mal.

3. Bien dich va tao g6i assembly maio

4. Cai d~t version mdi cua assembly DfIY van trong thu muc GAC.

Sau khi hoan tat cac bl1&c tren, hai phienMn version cua ShareComponent.dll se xuat hien trong GAC nhu hinh 5.2·4.

1.0,2411.0
1.0.0.0 b03f5f7flld50a3a
2,0.0,0 b03f:Sf7f Ild50a3a
PreJit 1.0,2411.0 b77a5C561934e089
1.0,2411.0 b77a5c561934eOB9
1.0,2411.0 b03f5f7f11d50a3a
1.0.2411.0 b77a5c56193'1eOB9
PreJit 1.0,2411.0 b03f5f7f l1d5oa3a
1.0.2411.0 b03fSf7fl1d50a3a
PreJit Hinh 5.2·4 ' Cdc version hi tiep nhau ella ShareComponent.dll

Chay lai irng dungclient va luu y rAng thong bao tni v~ vAn Ia "Hello fror version 1.0.". Biiiu quan trong i'J day la khling phai bien dich lai (eng dung client ~ s1,l' tham chieu giCt day se Iii version rndi han cua DLL nay.

5. RANG BUQC TUY BIEN: CAD HINH ifNG DVNG

BG (eng dung client dung ducc g6i assembly mdi bien dich nay. ban phai t~ 1 t~p tin dung dg cau hlnh (eng dung dilit nam trong thu muc (eng dung, T~p tin ca hmh se co cung ten voi ten img dung, bao gorn IUDn ea phan rna rQng. Tron tniClng hop cua chuang trinhSharedClient.exe, t~p tin cAu htnh se c6 ten I SharedClient.exe.config.NQi dung t~p tin cfiu hlnh nay dllc;1c th~ hi~n trong vi d 5,2-4, n6 cho thity cac di~tn can thiflt M hll6ng vi~c ket n6i W version 1.0 san version 1.1 cua SharedCornponent.dlL

Vi du 5.2-4 SharedClicnt.exe.config

1: <?xml version="1.0" ?> 2: <configuration>

3: <runtime>

4: <assemblyBinding xmlns="urn: schemas-microsoft-

com:asm.vl">

I

CHUdNG 5-2: Chuky s6 va phien ban

575~

5: < dependentAssembly>

6: <assemblyIdenti ty name = "SharedComponent"

7: publicKeyToken="9ab72e2bd01f38e8" t »

8: <bindingRedirect oldVersion=" 1. 0.547.38856"

9: newVersion="1.1.547.38908" t »

10: </dependentAssembly>

11: </assemblyBinding> 12: </runtime>

13: </configuration>

Trang phiin assemblyBinding, tilt ea goi assembly phu thuoc duqc li~t ke ra M ket n6i lai, M6i assembly duqc dinhhuong lai se co 1 di~m nhap maio Cac di~m nhap nay baa g6m pMn dependentAssembly di~n dat chi tiet su d6ng nhilt cua goi assembly va cac thOng tin ket n6i. T~p tin config la 1 t~p tin XML dan gian duqc dung trong thai gian ch1:LY d4 thay d6i moi trirong' cho bilt ell' aug dung nao, B1:Ln tao 1 tl.j.p tin van ban ten la SharedClient.exe.config va chap vao vi du 5.2-4 {j tren; nho kigm tra ISLi cac can s6 version vi chung trong' tuong tV nhau, Thong tin version duoc lily tU viec duyet thu muc GAC bang Windows Explorer, nhu trong hlnh 5.2-4.

Sau khi dg t~p tin cau hlnh dung chO, Chl1-Y (rng dung SharedClient.exe va hru y dong chu hien trong nhiin bay gia Iii "Hello from version 1.1" (hinh 5.2-5). C6 duqc di~u nay Ia nho vi~c ket n6i lai cac assembly hie chay chuang trinh.

Hinh 5.2-5 SharedClient.exe v6i kit no"i dd duac dinh: hu&ng lq-i

Thay vi tao tl.j.p tin cau hinh bli.ng tay, aug dung framework .NET di cung vai MMC snap-in cho phep ban cau hinh cac aug dung, bao g6m eil vi~c ket n6i lai assembly. Thuc sl,i a day chung ta dung ·MMC snap-in .NET Admin Tool (mscorcfg.msc) M tao t~p tin cau hrnh cho chuong trtnh SharedClient.exe. Hmh 5.2-6 cho tha'y .NET Admin Tool duqe nap trong MMC.

: ·OOJ ComlButed A~.cmblie~ :Ij, R<:motiJlB Services

$ II Runtime SeC1Jrily Policy i [RW Enterprise

ffi.e Machine a fj Ilser

a ... __

8· ~ SbareClient.e~

, .~ Auembly Depead.""" • . 'W Confieurcd Ammblie~ : .. t;a Rcmoting S ervioes

View and oonfisure manased applications prc-iou.!y oonfieurcd by this wl.

Nore : The.N liT framwor\:oonfuBuralion tcoldoe. 001 ~ taU manased applications installed on lhis oomputer, DOC doe~ ~t all mamsed applications lbat ba-c oonfisuration file s.

applicaliolllOin this 1001. Once the application ba~ been added, you can edit i~ in-idualoonfisured ••• cmblie. and rclllOtms to cv ice s;

Hinh 5.2-6 .NET Admin Tool

.NET Admin Tool cua Microsoft cho phep soan thao GAC, cac assembly d; cf(u hinh, cac dich vu tit xa, cac chinh sach an toan hie chay, va ke't nBi assembly Ban than cong cu nay kha dil dung. Birdc dAu tien la them 1 (ffig dung M cau hint trong trlic'1ng hop nay la SharedClient.exe. Sau khi them, 1 nut mdi se xuat hii;\ ben dliai nhanh Applications (xern hrnh 5.2-7).

D~ cau hinh lai viee ke't n6i cho assembly, chon nut Configured Assemblie va sau d6 chon Configure an Assembly a 6 ben phai, HQP thoai Wizard Style 9 xuat hien M giup ban lam cong vi~c nay. Hinh 5.2-8 cho thf(y hOp thoai chon gl assembly cung vui g6i assembly SharedComponent dliqc chon tr1Jek D~ U'ng dun client dung 1 assembly rnrri han, client phai dugc lien ke"t lai vdi assembly na hoac phai c6 sAn cf(u hmh ke't nBi cho client nay. Trong COM nguyen thuy, CE client thong thliung dung cac d6i tliqng COM moi nhilt vi COM yeu cftu tiit ca gia tie'p phai bilt bie-n. Trong .NET, 1 (tng dung client se co gAng nap assembly d1J( rang buoc ke't nbi luc ban d<lu trU' khi t~p tin cau hmh (ffig dung chi dinh rat bUQc ke't nBi vui 1 goi assembly khac.

1 •

'I c o c

g

CHUONG 5·2: ChIT ky 86 va phien ban

577~

U CoDi.iQ'UR=d A:5.!I.c=.blic:&. ~ .R.emot.m" Se['ViCltl~

l~l ~ R.1,,:a.ti.mc Scc::uri17 PollCJI' ~B' " .Einterpt.i:i.c:

'.ff-Gil Maoou.. ~"OUs..r

. t5lliI.-Jl!!II

:'':~ ~ Shl.rcCllen,.c:lUC'

CJ As:r.cmbl" DepcJ:XICIOQM Gil Con£.ij:ured As. .. cmblies. U R.omotms Soru.i.ce,

Tb.ls..pplGlj,oU:caD.a.~ 11S. OWlI.oQOa.fis'U~d .s~b1~s. .and n:motiDQ: s.ecvioci_ These !l.c:lttiD,ss. ~7 afrea Ibis. Oa.c ... .P.PliQUOD. U'-c tho tn,1I=!. bI::~oW' 'ZogclS-tlne~.

Vimw theE IQoUc;iltiog Pro";,;

Ute -cbo a.pplic:LUoU'5. pro~ri:ic .. dialo6 boJL to ma.b c;b.D4C'," to ia.rta.QC col18C1i.o, pubtis.bcr ,pcliJ'. and the pr.iv.atD plI'b.usod '10 l.it:ld addi.on.a.l;u~om.bHes..

Vi.ew tho Anembly PsoondCR9Pi

As.:Lcmbl:r dopeDdcQc.i.c5.'iI~ .IlS.$omblicli 1hu maD 'Up dw iLpplica,ioll.. Tbese UIiO:m.b!:ieS QJ:I. be tJt.Cd 10 crea:1a oonf~ured OI5.5.lIlmblJ.CIs..

CqllfJAAw jp Mwmbh

CoDf.i.Jv~ iI'io-s.emblies. iLtl:I tba set or 1.s,s.emblMH. {min ,he :au.emblie~g,,,he t~, ~vc :i.:nu.oclawd s.e1oi C'Ule$.. 1b.cS.e t'lJ1cs. can dele: [mine w hj,;h vc n,jon of ,b.c ancmbly ;leIS. 1oG!J.. ted and tbe Ioca lion 'Uted !O Io ... d tlu, ;u.~mbl,..

AdlY\1 &emotip,g S:C[1J\oes.

U5,C the Rc:::m.ot~ Se 1"1 ic:os. (Li.3.loB b;;.:-.. to adju:n o::Jmmuruc.:.tIon t::ballDCllt a:a.d obj&C.=Jd~int5.

Hinh 5.2·7 Shared.Client.exe trong nh6m Applications

Confogure an Assembly " ,:.' ". qIL4j

Confugure an Assembly

Choose an existing assembly or enter the assembly information manually

Hinh 5.2-8 Hop thoai chon. Assembly

iJJ578

PIIAN v : G6i k€t hop

Khi nhan nut Finish, hOp thoa] Properties se xuat hi~n. HOp thoai nay dung M chi dinh co cM' rang bu~c ket no'i d6i vdi 1 U'ng dung cho trl1dc. Hinh 5.2-9 cho thay h~p thoai Properties vdi tab Binding Policy du:gc chon va thong tin ke1 n6i cho SharedComponent nay.

Hmh 5.2-9 Binding Policy tab

Ket qua thu du:gc tit .NET Admin Tool la hilt du:gc ti).p tin cAu htnh U'ng dui trong cung t~u: muc cua U'ng dung, Ti).p tin cau hmh nay d .... gc dung nhu 1 ph§.n CI vi~c nang cAp M giti cho cac client cung vdi phien ban version mni cua bat component dung ehung nao,

6. dTcmfdNG

Cac chuong 5.1 va 5.2 vira minh hoa each .NET giao tiep vdi cac I assembly thong thlC?lng va g6i assembly dung chung. Thui).t ngll "dia nguc DL gia day dii trl1 thanh van d~ qua kha khi giao tiep vai cac g6i assembly du chung vi GAC c6 kha nang' t6 chuc cac phien ban version ke tiep nhau d~ ( component hoat dOng khong bi xung dOt. Do do, n6 cho phep cac U'ng dung clie dung dung version cua 1 component cho tr .... dc. Ngoai ra, cac t~p tin cau hmh u dung con cho phep thay d6i Mt n6i rnA khong phai bien dich va philn pMi Il(1.i U dung, TAt ca chI din tap tin cau hlnh va mOt phien ban version mdi ( component dung chung, sau d6 cac client c6 th~ tai rang buOc ket n6'i M dung assembly mdi nay.

Chuung5.3

T11dNG TAc VOl THE cror COM

Cae v6n d~ chinh se duuc d~ cOp d€n: v" The gi&i cua COM

v" .NET h6 trq COM

v" Dua ra nhl1ng thanh. ph6.n ella .NET nhu nhang d6i tuong COM.

1. THE cror eVA COM

C6 tU lau dai v€ t§.m nhin rQng cua nhi~u ngon ngtr trong viec chia se nh)1ng component dung chung. Trang the' gi~i Windows, tAm nhm rQng nay diroc thuc hi~n bdi COM (Component Object Model). Ml,lc dich duy nhat cua COM la cho phep bat ky ngdn ngi1 nao hi~u dl!\1c chuan nhj phan ella COM se sli dung dl!qc deli tuqng component c6 trong h~ th6ng. Voi s1,l' xuAt hi~n ella .NET, nhi1ng van M nay kMng xuat hien bdi vi tat ca ngon ngi1 .NET co th~ thoai mai tuong tac vdi ngon ngtl khac d~ dang. 81,1' phffi hop cua CLS va CLR tao ra tinrng tac nhu vay,

Trude khi mao hi€m vao the gidi ella COM, chuang nay eho rAng ban da co chut it quen thuec vdi COM. Nhtrng chu d~ nhu giao tiep (interface) <IUnknow, IDispatch, va IEnumVARIAN), coclass, Connection Points va COM threading da phAn nao biet qua .. NET cung cap nhieu di~u ki~n thuan lQ'i cho trlnh tffi.g dung khach hoat dQng trong ehe dQ quan Iy (Managed COM) d~ dang tuong tac vdi nhtmg thanh phlin COM kMng dl!qc quan Iy (Unmanaged COM) va nhtrng d6i tU\1ng Managed COM dl!qc si't dung nhu th€ Ia chinh chung la nhung thanh phdn COM kinh di6n.

2 .• NET HO TR<J COM

Vi cac doan rna tl)' quan Iy (Managed code) sli dung nhung dich vu dllQ'c cung cap bdi thanh phdn COM, ban se khDng tim thay Colnitialize va CoCreatelnstance ben trong kien true .NET. Moi truong .NET gioi thieu khai ni~m gl,li COM tMng qua lop v6 boc - Runtime Callable Wrapper mCW). Cac doan rna cua .NET se gl,li d6i tl!Q'ng COM thong qua RCW va Managed component. Hinh 5.5-1 mo ta toan canh nhln chung ella cac t1ng dung dl!qc .NET quan If (Managed client) v€ viec sli dung RCW d~ tltang tac vdi thanh phan COM kinh di~n.

IUnl:1IO

COM

Comp::>DCllt IFoo

I-------{

lBaT

Hinh 5.3-1 - T6'ng quai cua m6 hink RCW.

IJS80

PHAN V : Goi ket hop

RWC co trach nhiem bao v~ ngliai phat tri~n tlt nhtrng tac VI,! nhu tham

chieu bl;l Mm (reference counting), tv dl;lng cAp phat hoac gilii ph6ng bQ nhd,

Trach nhiem cua RCW bao g6m nhi1ng cong vi~c sau:

• Bao dam viii\c nban dien doi tugng

• Duy tri thai gian song cua d6i tugng

• Giao tiifp trung gian giea doi ttJgng vdi COM vii. .NET

• G9i cac phuong thrre Marshaling.

• Cho phep goi cac giao tiep COM hien c6

Mbi d6i tuong COM chi co m9t lap bao boc RCW. Di~u nay cho phep RCW bao dam viec nhan dien doi ttJqng COM bang each so sanh d6i tugng vdi giao tiep lUnknown. RCW duoc dung M che gia'u cac lai goi Mn QueryInterface cua COM. Khi ep ki~u (casting) cho mot giao tiep, RCW se ki~m tra giao tiifp ;in cua kie'u yeu c&u vii. tra ve n6 neu tim thay; ngugc Iai, khi mot QI dU<;1e trieu goi, RCW se trieu goi QI tren dOi tirong COM n1i.m dudi, giao tiep tra ve dtJc;lc dua vao noi vung d~m tru (cache) duy tri bdi RCW. Neu giao tiep yeu e&u khong tim thay, mOt ngoai l~ chutln InvalidCastExeeption se duoc RCW nern ra,

Mi)t tM hien dan cua RCW dn thiet eho vi~c quan Iy thai gian s6ng thich hop cua doi tucng COM nam dirdi. RCW xu ly nhirng lai goi cAn thie't Mn 2 phucng thuo AddRef() va ReleaseO, vii. bao dam tham chieu bl;l Mm (reference counting) thich hop danh cho dOi tugng COM. Nhu vdi bAt ky cac dOi tugng duqc quan ly Managed Object khac, RCW cung c6 co che don rae. Khi phuong thirc finalize cua RCW diroc triii\u g9i he'li GC, tht RCW se goi phuong thee ReleaseO tren tift ca nhirng giao tiep luu tru dung cho dOi tuqng COM nb-m dirdi, Dieu nay lam giup cho ngiroi phat tri€n thoai mai, khong phai 10 lang ve 2 phuong thuc AddRef() va ReleaseO, bdi vi RCW chiu trach nhiem toan bO v~ tham chieu bl;l dem (reference counting).

Du 180 RCW qulin If thai gian song cua dOi tugng COM nam dinii, doi khi n6 cung cAn ep buOc giai phong dOi tinrng COM. Vi du nhu nhung dOi tirong COM yeu cAu nhirng tAi nguyen qui gia nhir ket n6i mang (Socket connection), ket n6i co so du li~u (database connection), hoac hI) nha dung chung (shared memory). Khi GC kh6ng chu dong quy6t dinh khi nao cham dttt. va bUy dOi tugng ben trong .NET RCW se e6 trach nhiem giai ph6ng d6i tUQ'ng COM n1i.m dudi.

RCW cung cap m9t so' co che' cho phep nhi1ng chuong trmh quan If M .NET truy xuat vao cac giao tiep kh6ng dl.lqc quan ly cua COM. Nhu the, RCV. xuAt hien M thl,tc thi tat ca nhung giao tiep dugc eung cifp bi'li doi tuong COM Qua thuc, di~u nay cho phep phuong thUc giao tie'p triii\u goi mol kh6ng dn phai el ki~u tuang minh cho giao tiep do. Xem xet vi du sau:

Dua vao mOt d6i tiamg COM mo ta trong vi du 5.3·1, trinh irng dung dl .NET quan Iy (Managed client) co th~ tri¢u goi bAt ky phutrng thirc giao tiep nil,

Trinh Tlblmp.exe duqc dung M sinh ra lop vo boc cho dOi unrng COM. Cu phap ca ban sti dung TlbI rnp.exe nhu sau:

Tlblrnp.exe TypeLibName [lout: <Ten t~p tin»]

do D~ hi~u t6t han ve quan M giUa COM va .NET RCW, ban hay xem vi du ve

.ao d6i tunng COM sau:

CHl1dNG 5-3: Ttnrng tac vdi th€J gidi COM

581 (!J

rna khengphai .ep kiil'utudng rninh cho giao tie'p d6. Vi du 5.3-2 gilii thich each tuong tac vdi d6i tirong COM.

Vi du 5.3·1 : D~nh nghia thanh philn COM

1: [uuid ( . _ . ) ]

2: interface IFoo : IDispatch {

3: rid ( ... )] HRESULT FooMethod ( . __ );

4: }

5 :

6: [uuid ( ... ) ]

7: interface IBar : IDispatch {

8 : [id ( ... )] HRESULT BarMethod ( ... ) i 9: }

10:

11: [uuid ( ... ) ]

12: coclass FooBar {

13: [default] interface IFoOi 14: interface lBar;

15: }

Vi du 5.3-2 : Mana ed Wrap er Code

'I c n

u

1 : FooBar fb = new FooBar ( ) ; 2: !!Invoke lFoo,FooMethod

3: !!No need for explicit IFoo cast 4: fb.FooMethod;

5:

6: !!Invoke IBar.BarMethod

7: / !Na need for explicit IBar cast 8: fb.BarMethod();

6

C

r,

&i W VI. ep

2~1. Trinh Tlblmp.exe

ilj 582

PHAN V : G6i k€t hQI

Vi du 5.3-3 : SimpleObj{~ct_h

21:
22:
23:
24:
25:
26:
27:
..
28:
29:
30:
31:
32:
33:
34: 1:
2 :
3 :
4 :
5:
6:
7:
8 :
9 :
10:
11:
12:
13:
14:
15:
16: II S.impleqbject. h : Declaration of the CSimpleObject

#pragma once

iinclude "resource.h"

II main symbols

II ISimpleObject [

object, , uuid("6D854C55-4549-44FB-9CDF-6079F56B232E"), dual, helpstring ( "ISimpleObj ect Interface") , pointer~default(unique)

__ interfaceISimpleObject IDispatch {

17 :

18: t s.e r i i ; helpstring("methodSayHello")]

HRESULT SayHello( (in] BSTRName, (out,retval] BSTR*

Message);

19: };

20:

II CS impleObj ect

coclasB,

threading ( "apartment" ) ,

aggregatable ( "never" ) , vi-progid("SimpleATL.SimpleObject"), progid("SimpleATL.SimpleObject.l"), version{l.0), uuid("D82A38B8-5392-4D3D-ADEC-516C18E6A092"),

helpstring ( 11 SimpleObj ect Class" )

CHl1dNG 5-3: Tuong tac vdi tM giai COM

583111

35: class ATL_NO_VTABLE CSimpleObject 36: public ISimpleObject

37: {

38: public:

39: CSimpleObject()

40: {

41: }

42:

43:

44: DECLARE_PROTECT_FINAL_CONSTRUCT() 45:

46: HRESULT FinalConstruct ( )

47: {

48; return S_OK;

49: }

50:

51: void FinalRelease ( )

52: {

53: }

54:

55: public: 56:

57 :

58: STDMETHOD(SayHello) (BSTR Name. BSTR* Messag~); 59: };

60:

SimpleObject.h dinh nghla mi)t giao ti.rp dan ISimpleObject va mot, lap coclass CSimpleObject, CSimpleObject cai Mt giao ti.rp ISimpleObject. ISimpleObject djnh nghia mQt phuong thuc dan SayHello, phuong ,thac nay nhan tham so truyen vao ki~u BSTR va tni ra ki~u BSTR. RCW sa ki~m soat ki~u BSTR va chuyen dBi n6 thanh ki~u chubi CLR cua .NET. Vi du 5.3-4 duai day eho thay each cai datphuong thac SayHello.

Vi d~ 5.3·4 : SimpleObject.cpp

1: / / Simp1eObject .cpp Implementation of

CSimpleObject

2: #include "stdafx.h"

3: #include "SimpleObject .h" 4:

'1584

PHAN V : G6i ket hop

5: I I CSimpleObject

6:

7: STDMETHODIMP CSimpleObject: : SayHello (BSTR Name, BSTR* Message)

8: {

9: I I TODO: Add your implementation code here

10; CComBSTR Msg ( "He110 " ); Msg += Name;

11: *Message = : ; SysAllocString ( Msg. m_str ) ; 12:

13: return S_OK; 14: }

15:

Phuong thuc SayHello dan thuan 13. cai ~t phep Mt n6i chuoi, Mau ATL do VS.NET W dQng tao rae Dt§ tao RCW cho SimpleATL.dll, ban stl' dung dong l~nh sau :

TlbImp SimpleATL. dll lout: SimpleATLlrnp. dll

L~nh tren se tao ra lap RCW can thiet cho vii)c sil dung boi cac chuang trrnh diroc quan ly cua .NET. Ban c6 tM kiern tra lop boc nay bang trinh ILDASM; nhu duoc rna ta trong hinh 5.3-2.

O:\SHARE_POlNT\5AMS\CP ;)nd the .!'IET framewOrk\Parl: $\r. ".

F~ •.. ·.~·' ... HeIp·.·.

8 ... D;'\SHAA.i._"OINT\sJ.MS,\C. s.od 1bA . }J.61 rmm.WOlW .. n 5\Cb1p!Q1 :!i'lmdEl\.C~MToro1}l'&i\s.lmplaATL\Dllbus\S.b. • MJ>J]4Ji6S1

5 • S .... ~AIUmp

H ., CSilO.plaObjoCl

... clJ.u public .. U.10 :lB,:;:l an~C1

• Implom.e." :;ilO.plaAIUmI' lSimplaObjoCl

~ C"II110m .&ns1'8.llOt void [mo;;collibl S~ll!:m, 1l1LD.'im._lD.1Q:ID~e N»:e'S_C1J.1:5:1:a.I.dl.CIi!A"ti.blI.II!~~C"1o(.i.II.'J.6) = ..... .C1J,3;;om. ~ll.~ lIO.Id (m-:lcodibl S7nll::Dl.1t.UlI.11m_Ia,etO'ps. rvd:s. IJ'p .. LibTr peAn~bu.\t: ::C'lO[(,in116) g. ( .. c'\ISlOm j.D.:n.~"VOid [m-s.coll.&.'bl S:rnem.KWLliln_I.mitQpSQ 1'W'ice::s,QuiA.n tibILla::ClQ(in116) ~ (OJ Om) • ces : vo.ldO

...• s."",u.. "~"""')

:3 IE lSimploObjeo

... 0:1151 .ill.1@i;fIce ,P'II-~ Jb:nClo ail10 I.ml.Lm.pHI

~ .C1Cilom ~ll.lIIOI!! wid (msatclib-l SYS1Im, fllUltim_In1ll!:coj6* ",.Io!1..GWAll ub'we::C1o (.anll6) .. LOL ocr.! ~ .C'US1<!1m ..iml~ void [msO:IEli.b] S,slem.1t1ll111m_lD.tellD¢-1 tv.iC8:s, ComS1Lb5.u"1L'I."bleAml.DU\e::

.. '. .00000om ills, .... ..:q.~ (d.lcO~b] Sr=-, •• :1'.VlLli.1ll._we DOISe·'tY'i.aes.. IypeLi'b'[Ypl:All~b»."::C''--oc(.I,I'l6) III { ->: .• -" ~.ttRp'lh <::1;;'Tli:li'o::,t ... .a. .. ··

Hinh 5.3-2 - Managed Wrapper trong ILDASM.

CHUdNG 5-3: Turmg tac vci tM gioi COM

5851!J

2.2. Rang bUQC 80m (Early Binding)

Voi RCW dinrc tao tren day, viec sii dung deli tirong COM Ia mot van d~ dan gian cua viec them van mot tham chieu (reference) thich hop Wi du an (project). Khi mot reference duoc them vao rll,l' an, thi doi tirong siln sang cho co chi)' rang buoc sam. Rang buoc sam yeu cau kiern tra ve kieu khi bien djch, Cac d6i tLiqng COM hqp l~ d6i vOi ca che' rang buoc sam deu phai h8 trq giao tiep kep (dual interface). Duoi day la vi du minh hoa.

Vi du 5.3-5 : Rang bUQc sdm

1: namespace EarlyBinding 2: {

3: using System;

4 :

5: class Early

6: {

7: static void Main (string[ 1 args)

8 :

9: SimpleATLlmp _ CSimpleObj ect 0 =

new SimpleATLlmp. CSimpleObject ( );

10 : Console. Wri teLine ( 0 • SayHello ( II Ri chard II »;

11:

12 :

13: }

14:

Vai RCW duqc sinh ra, sit dung d6i tLiqng COM khOng doi hoi rna chirong trinh btl sung cho tai khi trmh ling dung cua .NET quan tam. de'n n6.

2.3. Rang bUQc mUQn (Late binding)

Rang buec muon lien quan de'n viec s11 dung giao tiep IDispath cua cac doi tuqng COM, giao tie'p nay dLiqc dung d€ phat hien nhung djch vu trong thrri gian chay do COM cung cap. MI,lC dich cua giao tiep IDispath la cung cap mot giao tie'p phu hop cho viec sii dung voi nhung scripting client (Scripting client 18. VBScript hoac JScript), Scripting client khong duqc phep s11 dung giao tiep tho (raw interface) va yeu cau rang buoc muon cua IDispath .

. NET cling cung cap kha nang' S11 dung rang buoc muon thOng qua giao tiep IDispath cua deli tuqng COM (vi du 5.3-6). Lam nhu vfj.y th) khong chu y den kieu kiem tra thai gian dich. Ngirci phat trien phai sii dung Reflection API dil truy xua't nhi1ng phuong thirc tM hien va nhirng thuoc tinh hien co cua d6i tuqng COM.

14586

PHA.N V : G6i Mt hup

Vi du 5.3·6 : Rang bUQC munn

1:
2 : {
3:
4:
5:
6:
7 :
8:
9 :
10:
11:
12:
13: namespace LateBinding

using System;

using System. Reflection;

using System. Runtime .InteropServices;

class Late {

static void Main( string [1 args)

{

try {

Type SimpleObjectType = Type.GetTypeFromProgID{ISimpleATL.SimpleObject");

14: object SimpleObjectInstance =

Activator .CreateInstance ( SimpleObjectType ); 15:

16: Console. WriteLine ("SimpleObjectType =

{O}",

SimpleObjectType.ToString( ) };

17: Console.writeLine("SimpleObjectInstance

Type = {O}",

18: SimpleObjectInstance.GetType( ).ToString(

) ;

19:

20: I I Invoke the SayHello Instance Method

21: string Message =

(string)SimpleObjectType.InvokeMember("SayHello",

22: BindingFlags.Default I

BindingFlags.lnvokeMethod,

23: null,

24: SimpleObjectlnstance,

25: newobject[] {"Richard"});

26: IIDiditwork?

27: Console.WriteLine(Message);

28: }

29: catch( COMException e )

~588

pHAN V : G6i Mt hop

void OnSomeEvent ( [in] BSTR Message) i 12: }i

13:

Phuong thuc su ki$n OnSomeEvent, nang 11, se chuyen thanh cap SI/ kieri I bQ ch.uyen giao SI/ kien (event/delegate) khi RCW duoc tao ra. BQ chuyan giao su kien co ten nhu sau: _ISourceObjectEvent_OnSomeEventEventHandler

BQ chuyen giao s1,i ki$n nay sau d6 c6 th€ diroc tao ra va g.:\n VaG su kien OnSomeEvent n hu vi du 5.3-9 sau:

Vi du 5.3·9 : M:i chiron trinh ella Sim Ie Sink

1: namespace CSharpSink 2 :

3: using System;

4: using ATLSourcelrnpi

5:

6: / I / <summary>

7: / II Summary description for Class1.

8: 11/ < /summary>

9: class SirnpleSink

10: {

11: static void Main(string[] args)

12: {

13 :

14: 15:

CSourceObject source", new CSourceObject ( ) ; source.OnSomeE'Vei':\t +=

16: new

_ISourceObjectEvents_OnSomeEventEventHandler(OnSomeE vent);

17 :

18: source . MakeEventFire ( "Hello" ) ;

19: }

20:

21: public static void OnSomeEvent ( string Message)

22: {

23: Console .WriteLine ("Have Event: {O}" I Message) i

24: }

25: }

CHU<1NG 5·3: Tuong tac v(ri the gi6'i COM

589~

26: } 27:

SI,i kien rang bUQc khOng eo gi khac so voi cap SI{ ki~n/ bg chuyin giao S/j ki~n ella .NET. Lap CSimpleObjeet S8 trii;lu ggi OnSomeEvent bat eli khi nao phurrng thirc cua doi tinrng bi trieu goi.

2.5. Nhii'ng vtn d~ v~ ti~u trinh (Thread)

COM dua ra qua thira thai ella nhtrng kieu tieu trrnh (threading). Cac thanh phdn COM eo tM Iii. Apartment, Both, Free, MTA, Single, hoac STA - qua nhieu sl,i chon lua, vi vay cfing' eo tM co qua nhieu ba't Jqi. Neu ban khong baa gia di sau vao nhflng kieu threading ella COM va khOng baa giCi hieu nhirng Apartment cua COM, thi eoi nhir do Iii. may man cua ban. Tuy nhien, khi ban can lam viee v6'i nhflng doi tuqng COM kinh dien, day lai Ia di~u quan trong de hieu moi quan he mat thiet cua nhung ki€u threading khac nhau.

Cac trmh trng' dung duqc .NET quan ly (Managed client) tao ra nhtrng thread ben trong STA. Khi sli dung d6i tuong COM cling Iii STA, kh6ng c6 sl! ba't Jqi khi nhi1ng phinrng thirc dang tri(ju gQi tren nhtrng giao tiep khac nhau. Tuy nhien, Neu dbi tirong COM la MTA, thi do 1ft hie dOi tirong COM dang ra chiu moi t6n phi. May man, Managed client co the thay d6i rno htnh threading hien hanh, tao ra doi tuong COM va tiet kiem dl1qe rnijt so' bl1oe.

De thay dii'i rn6 hinh threading, ban truy xuat CurrentThread va d,;lt tra ng thai cho ApartmentState khi cAn. Chu y ding ApartmentState chi co the d~t met IAn. Vi du 5.3-10 du(ri day S8 thay doi ApartrnentState ella thread hisn hanh hang vrii MTA de wong ang vdi MTAObjeet dang diroc truy xuat,

Vi du 5.3-10 : Thay do'i A artment cua thread

1: Thread. Current. ApartmentState = Apartmentstate. MTAi 2: !!Create MTA Obj eet

MTAObjeet 0 = new MTAObjeet ();

3: a. Faa () ;

Sli dung mo hinh thread mdi thay d6i t6ng chi phi cua cac cuoc g9i COM lien tiep thong qua nhung apartment khac nhau thea huang giam. Mil chuong trlnh ben phan Server rat cAn toc dQ, vi vay vi(jc dii: gianh tcing chi phi la m¢t viec het B~C quan trong, vii. viec doi tuqng COM sli dung me. hlnh thread cho phep t6i da Iai gQi dOi tliqng nlthi~u qua.

2.6. So sarih ki~m .NET va COM

Vii;lc ehuyen cae kieu tir COM sang cac kiii:u cua .NET hoan toan d~ dang.

Bang 5.3-1 h6 trq chuyen d6i nhirng kieu cua COM thong dung sang cac kieu trong .NET tunng ling.

CHudNG 5-3: Tuang tac vdi the giai COM

589~

26: 27:

Su kien riing buoc khOng c6 gt khac so vdi e~ p sl/ ki{!n / bf) chuyen giao su ki{!n cua .NET. Lap CSimpleObjectse tri,;lu goi OnSomeEvent bat eli khi nao phuong thirc cua d1'ii tuqng hi tri,;lu goi.

2.5. Nhilng vitn d€ v€ ti~u trinh (Thread)

COM dua ra qua thua thai cua nhirng ki~u ti~u trlnh (threading), Cac thanh phan COM e6 tM Iii Apartment, Both, Free, MTA, Single, hoac STA - qua nhleu sl! chon lua, vI. vay cung e6 the e6 qua nhieu bat loi. N~u ban kh6ng baa gia di sau vao nhirng kieu threading cua COM vii khong bao gia hif\u nhung Apartment ella COM, thi eoi nhu do Iii may man cua ban. Tuy nhien, khi ban can lam vi$c vtri nhirng d6i tuqng COM kinh dien, day lai Iii dif)u quan trong M hieu moi quan M mat thie't cua nhung kitiu threading khac nhau,

Cac trmh irng' dung dinrc .NET quan Iy (Managed client) tao ra nhi1ng thread hen trong STA. Khi stl dung dOi tliqng COM cling Iii STA, khong c6 su bat Iqi khi nhung phuong thuc dang tr ieu goi tren nhi1ng giao tiep khac nhau. Tuy nhien, Neu doi tuorig COM Iii MTA, tht do lil Iuc d6i tuqng COM dung ra chiu moi t6n phi. May man, Managed client co the thay d6i mo hmh threading h ieri hanh, tao ra deli tuong COM va tie't kiern duqe mot so biroc.

De thay d5i mo hinh threading, ban truy xuat CurrentThread va di).t trang thai cho ApartmentState khi dn. Chu y rAng ApartmentState chi co the di).t mQt lan. Vi du 5.3-10 duai day se thay doi ApartmentState ella thread hien hanh bang vai MTA de tuong rmg voi MTAObject dang duqc truy xuat.

Vi du 5.3-10 : Thay d6i Apartment cua thread

1: Thread. Current • ApartmentState = ApartmentState .MTA; 2: I lCreate MTA Obj ect

MTAObject 0 = new MTAObject () i

3: o.Foo ();

Sa dung mo hinh thread mci thay dlli t6ng chi phi cua cac cuoc goi COM lien tiep thong qua nhtrng apartment khac nhau thso hVang giarn. Ma chuang trmh hen phan Server rat cttn toe dl), vi v~y viec M gianh t5ng chi phi Iii mot viec Mt s(ie quan trong, va vi~c deli tuqng.COM sa dung mo hmh thread cho phep t6i da lai goi d1'ii tuqng nit .hieu qua.

2.6. So sanh ki~m .NET va COM

Vi~c chuyen cac kie'u tU COM sang cac ki~u cua .NET hoan to fin dl2! dang.

Bang 5.3-1 hii trq chuyen dlli nhung kie'u ella COM thong dung sang cac kieu trong .NET turrng ung,

l!!J 590

pHAN V : G6i ket hop

Bang 5.3-1 : Anh xa ki~u cua COM va .NET

Ki~uCOM

Kit$'u .NET

BSTR
VARIANT
SAFE ARRAY
I1
12
14
18
un
UI2
CHAR char
UI4
H4
H8 IUnknow** IDispatch**

I <Some Interface>

string object array() sbyte short

int

long byte

ushort

uint

float double

object

object I<Somelnterface>

M~ au bang 5.3-1 chua hoan chinh, no da chuyen d5i cac kieu CCf ban va dao ngLtge cua chung, Ban tham khao them MSDN de co danh sach hoan chinh v~ cac kiliu ngich dao khac nhau.

3. XEM cAc THANH PHAN .NET NHU LA cAc D6I TUQNG COM

Trong khi cac Managed client eo tM dung nhiau l~ d6i tugng COM, kh ni1ng M tao lap bao bee M CaMeo tM gc.>i dugc cac d6i t1fgng .NET cung cAn du:~ xem xet Mn - COM Callable Wrapper (CCW). NhU'ng co hOi cua viec tao cac than phan .NET va tM hi~n chung nhu III cac d6i tircng COM eo th~ khong theo kip I phat trien n6i chung. Vi v~y, a day chung ta chi xem qua cac Mng ky 1 thar phan .NET nhu lii dOi tugng COM va cac tht1 tl,lc lien quan d~ lam chuyen d6.

CHUONG 5-3: Tttong tac vdi the giai COM

591 bIl

3.1. Trinh RegAsm_exe

.NET SDK cung cap m(jt bi? cong cu RegAsm.exe dU\1c dung M tao cac phan til can thiet cho M th6ng Registry. RegAsm cling c6 tM tao 1 thu vien kiiiu, t!}.p tin . tlb dung M mo ta cac ki€u trong g6i k~t hop assembly. Cac phan tlI Registry giang turrng tlJ nhu ben dai tL1Q'ng COM va cho phep tai 1 g6i dUQ'c.NET quan ly (Managed Assembly). Ngoai vi~c dung RegAsm.exe M dang ky Managed Assembly, n6 con dung M them g6i assembly nay van GAC, hoac Global Assembly Cache. Ban sU' dung chuang trlnh gacutil.sxe M thl!c hi~n ding viec nay.

3.2. COM Callable Wrapper

Phan trai ngliqc vai RCW la COM Callable Wrapper (CCW). Giong nhu RCW, CCW xli If nhU'ng van d~ Wang tlJ nhau, nhu duy trl nhan dang d6i tuqng, quan ly chu ky sang, v.v ... CCW cling chiu trach nhiem cung cap cac giao tiep, nhu la !Dispatch va IUnknown, bai vi cac giao tiep nay kh6ng thuoc Managed component. Giao tiep IDispatch cho phep cac client dang kich ban (scripting client) dung nhClng Managed component, trong khi chung c6 th€ dung ta."t ca nhung d6i tuqng COM !Dispatch khac. Hinh 5.3-3 mo ta co chi! lam vi~c va tri~u goi cua CCW.

Managed Component

Hinh 5.3-3 - Go chi lam uiec ella GGW.

CCW hoat dQng nhu 18. m(it nha moi giai trung gian (proxy) gii1a nhung doi tliqng dllQ'c quan If b&i .NET va cac d6i tuong COM thong thinmg;

4.·cAc VAN HE KIll DUNG CHUNG .NET vA COM VdI NHAU

COM c6 nhU'ng qui dinh nghiem ngat quan ly viec cai d.;lt d6i tllQ'ng. D.§ COM sli dung duQ'C cac phuong thirc cua d6i tucng .NET mQt each hi~u qua, chung ta can phai tuan theo cac quy lu~t cua COM. Vi du hay xem xet l6'p sau:

'C 1: class Foo{

:h 2: public Foo (string s) { __ .}

;I! 3: public static void Bar() { ... }

.h 4: }

Vi~c chuy~n I6'p Foo thanh COM se khong thanh cong vi 2 Iy do sau:

\ \

~592

pHAN V : Goi kilt h

• COM khong he, tro nhtrng phuoug thirc khdi tao (constructor) co thong s6.

• COM khOng he, trq xay dung nhung phuong thuc phi th€ hien (ru instance) kigu phuong thirc static.

Lap Foo dligc xern la khong than thien vrri mo hinh COM. Nen bo cac hi khoi tao co thong s6 va sau do cung cap vai ham khO'i tao thong thuorig. Chi t nay phai diroc tuan thea M truyen cac d6i t\ic;lng Managed qua COM co hieu qua

COM hO trq xay dirng kieu gia trio .NET cung lam dieu nay. Tuy nhien ki€u gia tri trong COM khong co cac th€ hien ciia phuong thire nhu trong .NET ngay ca trong C++.

1: Public struct Point { 2: int x;

3: inty;

4: void SetXY (int x, int y) { •.. } 5: }

Khi kigu gia trj Point duoc truyen cho doi tuong COM, phuong tlurc tM 11 SetXY se bi bO, bci vi cac bien thanh vien x va y Ia private, kieu gia tr] Poin' tro nen kh6ng co gia trio

Triroc khi Mt dau VaG 1 du an de tao cac thanh phan .NET vdi y d t.ruyen chung qua cac COM client, ban phai dam bao viec cai dat cac doi tircng tuan thea cac qui tAe cua COM.

5. KET CHUaNG

Nhieu vifn de ve COM da duqc ban Mn trong chuang nay. Vi du nhu cac dEl ve dieu phoi COM trong mot Managed Client, m6 hinh thread COM moi, I goi doi tirong COM W .NET va nguoc lai. M6 hmh COM c6 dien se t6n tal tl nhieu nam ntra, VI vay hau he't cac ngtiai ph at trign deu yeu cau hau phai nhirng dieu co ban ve each COM tircng tac vdi rna ur quan (Managed code) .NET Vdi nhitng du an trong tuong lai, ban nen W bo dan rna hinh COM. 1 VaG d6 hay t~p trung't6i da van dung cac ti~n nghi dinrc cung cap bJi C# V€ tuong .NET.

Chr.tung 5.4

cAe TIED TRINH (THREADS)

C6c van d~ chinh se drt(jc d~ cap de'n:

./ Da tdu trinh.

./ D6ng br; hod tUlu trinh (Thread Syncronization) ./ MrJ rQng ctic tdu trinh. .NET

1. DA TI1~U TRiNH

M6i Ung dung se co mot ti~u trrnh thuc thi chlnh. Tieu trinh chtnh nay se

'thVl;ihi cac Il).<l l1ngdl,ln;gtheo mOt th(( tI! cl,Ith8 dua tren cac tUQng tae v.ai ngIJai t1t'llighay tr!iiO-ictic th6l'lg di~p{message) cua Windows. Chuyen g1 sexay ra khi nhieu han mQt tac vu hoac doan rna can dinrc thirc thi, Thu tt! thuc hien phu thuoc vao vi~c cac ling dung dan ti€u trinh (single-thread application) IlY da dliQ'c xay dung nhu the' nao, the' nhung tai mQt thoi diem vitn chi co mQt tao vu C\I the dircc thuc thi.

Trong moi trinmg Windows, cac Ung dung co the tao sinh (spawn) nhieu .lieu trlnh va dieu khien viec giao tiep giUa cac tieu trinh ay vai nhau, MQt Lcng dung co the quan Iy nhieu tac Vl,I (task) cung Iuc. Hay thu nght ve trinh duyet Web cua ban, Khi download mot t~p tin, chung se tao sinh ra mQt tieu trlnh quan Ii tac vu download trong khi cung luc fly ban vitn co the duyet Web. Neu khong co kha nang tao sinh va dieu khien nhieu tieu trrnh trong ung dung, viec download t~p tin se dung het ti8u trrnh chinh cua Ung dung. Trong nhirng tru'ang hop do, trlnh duyet Web se khOng the lam gt cho den khi viec download t~p tin hoan tf'It.

Vi~c taoracac ling dung da tieu trlnhco tM cai thien nang SUllt cua mQt ling dung, nhirng viec co them cac tieu trrnh da lam cho mire dQ phirc tap cua vio?c thiet ke, phat trien, va go r6i ung dung tang len: Them VaG do, khong phai nang suA't chi co nhe vao viec them vao mot tieu trinh rna con nho VaG viec sii dung kie'n true cua ling dung.

1.1. Ti~u trinh ung durig' (Application Thread)

Kien true .NET tao ra mOt. tie'u trinh don trong vung danh rieng de thirc thi Ung dung, Phuong thuc Main cua mot lap bieu di~n mOt 16i VaG cho chuang trlnh .; va cling la 16i VaG cho ti~u trlnh, M6i tieu trtnh diroc tao ra tlt mot tieu trlnh Lcng dung se du'qc goi la ti~u trrnh con (child thread) cua ti~u trinh cha (parent thread). Khi Ung dung cha het heat dong, t;ft ca cac ti~u trinh con cung se cham dut, Di~u ,d~t biet clin luu y la phai kiern tra ding tat cll. cac tieu trmh con dugc huy dung . each va cac tai nguyen ducc giai phong truoc khi huy tien trlnh cha me.

~594

PRAN V : G6i ktl:t h

1.2. Ti~u trinh lam' vi~c hay ti~u trinh th~ (Work.

Thread)

Dang thong dung nhat cua tiSu trmh la ti8u trinh tho. M.;.t ti~u trmh t dl1qc dung M lam mot s6 kiSu thao tac n~n (background), nhi.Yng thao tae c6 t chi€rn giu ti~u trtnh ung dung, Nhirng vi du cua cac loai thao tac nen nay bao gc ca viec download t~p tin, in n~n, va W d';'ng 100. Khi dtiqc sa dung hop ly, ti trlnh tho cho phsp ti.§u trinh chinh cua U'ng dung tra loi cac thOng di~p cua u dung va khien ((ng dung hoat di,Jng suon se hon.

1.3. Tao mQt ti~u trinh thc;t

Gi6ng nhu cac ti.§u trinh irng dung, rni,Jt tiSu trinh the se thuc thi mot do rna chuong trtnh trong ung dung cua ban, Vi du 5.4-1 eho tha"y each xay dung n cau true cua ti~u trinh tho.

Vi dV 5.1·] Tieu trinh thq

1: using System;

2: using System. Threading; 3:

4: namespace BasicWorkerThread 5: {

6:

7: class Class!

8: {

9:

10: static void WorkerThread ( )

11:

12: Console. WriteLine ("Hello from WorkerThread") ;

13: }

14:

is: static void Main(string[J args) {

16:

17:

I/Create the Worker Thread

18: System.Threading.Thread WT = new Thread ( new

ThreadStart ( WorkerThread ) );

19:

20: 21: 22: 23: 24:

I/Start the Thread WT . Start ( );

Ilend the application

Console. WriteLine ("Press enter to exit") ;

t.

CHUaNG 5-4: Cae ti~u trinh (THREADS)

595~

25:
26:
27: }
28: }
29:}
30: Console.ReadLine( );

Di~u dilti tien pha i hill Y trong vi du 5.4-1 la vi~c Sll dung Using M "nhap khdu~ thu vien hay kh6ng gian ten (namespace) System. Threading. Tat ca ldp lien quan de'n ti~u trinh Mu {J trong namespaee nay. £)8 tao ra mQt ti~u trinh, cdn phai co mot phuong thtre lam viec nhu mQt dai dio?n chuy~n giao (delegate) tHlU trlnh, Di~u do dung: ti~u trinh .NET dung dai dien d8 djnh nghta phuong thirc rna ti~u trlnh rndi se dung. Trong vi du tren, phuong thuo static WorkerThread da dong vai tro dai dien, dinh nghia cho ti~u trinh. d dong 18, mQt d6i tLlgng Thread dugc tao ra. Nho ra.ng, constructor cho mQt Thread se la mQt thOng so eho dai dien ThreadStart. Nhu da noi truce, dai dien ThreadStart dinh nghta cac phuong thirc rna w~u trtnh mdi dLlqc tao thanh SEl thi hanh. Dai di~n cua tigu trinh chi co duy nhat rnQt chu ky don (single signature) chua mQt gia tri trd v~ void va danh sach tham s6 rling.

Nhieu ngiroi trong so cac ban quen thuoc voi cac tigu trlnh Win32 truyen thong, hoae cae ti~u trinh POSIX, e6 tM se thAc mac v~ vi~c tai sao khong co tham s6 cho ti~u trtnh, Trong Win32, mot ham tieu trmh dung mQt LPVOID (con tro kieu LONG VOID) lam tham so. f)i~u nay eho phep bat cu tham s6 nao dLlgc chuyen de'n phuong thee static ella mQt dbi tl1gng d~u co tM dLlqc dung cho ti~u trinh. Khong nhu cac ti8u trinh Win32, cac tillu trinh ,NET co th~ dVa van tM hien (instance) ella doi tuqng. Di~u nay c6 nghta la mbt phuorig thirc khong phai static cung c6 thg duuc dung cho tieu trmh, Khi chung dLlgc Sll dung, phuong thirc va tieu trinh fly se co truy nh~p Mn tift ea cac tnrong (field) va cac thuge tinh eua dbi tLlqng thi!' hien, Chung cho tha'y mOt khac bi~t nho so vai cac ti~u trmh ki~u Win32. Vi du 5.4·2 dLlai day SEl cho tMly vi~e ti8u trlnh truy xua't dO' lieu trong m9t lop.

Vi d\l 5.4-2 Tht; hi~n ella Tie'u trinh

1: using System;

2: using System_ Threading; 3:

4: namespace InstanceThread 5: {

6: class Bank

7: {

8:

9: p];"ivate string bankName = "First Bank";

10:

IJ 596 PHAN V : Goi ket hq

11: public void WorkerThread{ )

12: {

13: //Access instance member bankName

14: Console.WriteLine("BankName = {O}",

this .bankName ) ;

15: }

16:

17: public void Run (

18:

19: Thread WT = new Thread ( new ThreadStart (

this.WorkerThread) )i

20: WT.Start ( );

}

21:
22:
23:
24:
25:
26:
27:
28:
29: }
30: } static void Main( string [] args)

Bank b = new Bank ( ); b. Run( );

}

Doan rna trong vi du 5.4-2 khong khac nhiou voi vi du 5.4-1. Trong v nay, dai dien ti~u trinh WorkerThread co mQt truy xuat to cap dQ the hien) truong private bankName. Nhi1ng tieu trmh kieu doi tuorig nhu the la m(lt bitt tiit tu cac tieu trmh kieu Win32 truyen thong. Nen .NET cung cap met each can g~n han vdi cac quy uoc ve tieu trmh kieu d.oi tirong So vdi truce day, nhien, no khOng phai 1?- hoan hao Iarn, No khong co san mQt lap co so M cac dAnxu·!tt to" n6 c6th~ tam vi~(j'nhlt cacti€!~· tri.rlh. Trang kii!n true .NET, lap ( System.Threading.Thread da dliqc phong kin lai, va nhu vay, no khong the i phuc vu nhu mQt 16p co sa.

1.4. ThuQc tinh ThreadStatic

Thuoc tinh ThreadStatic eung cap ml)t co che de tao ra cac trircng. stati tieu trmh can tdi. Moi tieu trlnh dtroc tao ra se co ban sao chep rie ng cho trucng da duoc chon vai thuoc tinh ThreadStatie se la 0 rna khong quan tan gill. tri da duqc khci tao truce do. Cac trucng static se chi gill lai cac gill. t dircc khrri tao cho cac tieu trmh chinh cua ung dung. Vi du 5.4-3 minh hoa dung thuoc tinh ThreadStatic va cac tac d;)ng len cac trucng static,

CHlJ'ONG 5·4: Cae tieu trlnh (THREADS)

597~

Vi du 5.4·3 ThuQc Hnh ThreadStatic

1: using System;.

2: using System. Threading; 3:

4:

5:

6: public class Task { 7:

8: [ThreadStatic] static int m_nld '" 10;

9:

10: public string m_strThreadName; 11 :

12: public void Run ( string ThreadName ) { 13: this .m_strThreadName = ThreadName;

14: Thread T = new Thread ( new ThreadStart ( threadProc ) );

15: T. Start ( );

16: }

17:

18:, publiq void threadPl':Oc ( ){ 19:

20: Console.writeLine( "Thread {OJ is running",

m_strThreadName ) ;

21:

22: / /loop and increment the m_nld static field

23: for(int i '" 0; i < 10; i++ }

24: Console.writeLine ("Thread {OJ : m_nld", {1}",

25: this .m_strThreadName, m_nld++ ) ;

26: }

27: }

28:

29:

30:publ ic class ThreadApp { 31:

32: public static void Main( 33:

34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:}

rM ;ung

M~ '\~

cadi ·8

{

I/Create 2 worker Tasks Task t1 '" new Task ( ); Task t2 = new Task ( );

t1.Run{"Workei: 1" ); t2.Run( "Worker 2" );

/ /Execute on the Main thread Task t3 = new Task ( );

t3 .m_strThreadName = "Main Thread"; t3.threadProc( ):

}

\ I

~598

PHAN V : Goi ke't b

K€t xul!t ciia vi dl,l 5.4-3phl,l thu(>e VB-O thit t., l~p Iich thucthi cac ti~u tr'i va bat eli ti~u trtnh ~ao cung se c6 tM nhay vao chiern cM. Tuy nhien, ban co 1 thay mlii tii\u trinh, khi chay, d~u co thanh vien static m_nId vaigia tIi duQ'c k. tao la O. Khi thanh vien threadProc duoc thuc thi tU ngCl canh eua ti~u trinh chi cua ling dung (dong 44), tnrcng static gii1 Iai gia trj 10 cua no. Thuoc t:

ThreadStatic cho phep mOi ti~u trinh gii1 lay gia trj di1 li~u thanh phan cua riE n6. Neu kMng co du hi~u qua nhu mong muon, khong nen dung thuoc t ThreadStatic, trong trub'ng hop nay, tat cll. thanh vien static cling d~u sAn Sl cho cac tieu trinh va cac gia trj cua no dliQ'c chia xe IAn nhau.

1.5. Lien ke't - Dem cac ti~u trinh l~i ben nhau

Thuong thi chung ta d.n sinh ra met hay rihieu tie-u trinh va co mi)t . trinh cha cho' cho cac ti~u trinh con ket thuc tnroc khi tiep tuc thuc thi. Vi/i:c co tM hoan thanh mi)t each d~ dang nho van viec sil dung phuong thuc Join th~ hi~n ti~u trtnh. Khi phircng thuc Join duoc goi, tigu trinh goi se tarn ng cho den khi tigu trinh thq hoan tAt. Sau khi ti~u trinh thq dll kat thuc, viec 1 thi se duqc tiep tuc vdi tigu trinh goi (xem vi du 5.4-4).

VI du 5.4-4 Sri' dl!ng' -Jo ln

1: us ing Sys tem;

2: using System.Threading; 3:

4:

5:

6: public class JoinTest { 7:

8:

9: public static void ThreadProc ( ) {

10:

11: Console .WriteLine ("Thread Active");

12:

13: Thread.Sleep( 30 * 1000 );

14:

15: Console. WriteLine ("Thread Exiting") ;

16: }

17:

18:

19: publicstaticvoidMain() {

20: Thread T = new Thread ( new ThreadStart ( ThreadProc

21: T.Start();

22: T . Join ( );

23: Console. WriteLine ("After Join") ;

24: }

25: }

CHudNG 5·4: Cac ti€u trmh (THREADS)

599~

2. DONG B<) TIEU TRINH (THREAD SYNCRONIZATION)

Nhu dii mo ta a tren, cac ti€u trinh co tM dttqc lap Iich M chay bilt ca luc nao va theo bilt ky thu tu nao, Thong thl1Ctng ehung ta dn diiiu ph6i cac tiifu trinh dil chia xe tai nguyen gi(1a chung, Moit diiiu phai luu y: ui't ca cac irng dung da ti€u trinh diiu lam viec tot ache' dl;) get lai (debug), no chi thirc sl! bAt d§u gay reli rAm khi chay ache' dQ phat hanh (release). Vii1>c get r6i cac U'ng dung da ti8u trl.nh <multi-threaded) cAn nhiiiu thai gian va kinh nghiern; khong co di~u gt co thg lam cho cuoc s6ng de dang hen khi ban phai dbi ddu vai mQt con quai v~t nhieu ddu kiifu nhu ti~u trlnh va ((ng dung. Vi nhi1ng Iy do khong ro hay khong tM giai thich , vii1>c l~p Iich cho ti~u trinh ache' dQ get roi khong gi6ng chut gi vdi viec l~p lich tieu trlnh ache' dQ img dung hoan chlnh.

2.1. Tit khoa lock

C# dung them til khoa lock. Lock duoc sll' dung cho viec d6ng bQ hoa cac truy xua"t ca the hien llin cac t.nnmg static eua mot d6i tl1qng. Btl d6ng bl> hoa truy xuat de'n mot trl1ang a ca"p th8 hien, U'ng dung se dung lock (this) vdi this chi den dili tucng hien tai, Be d6ng bQ hoa truy xu;it den cac trinrng static, tu khoa static co the dung ben canh til khoa typeof nhir sau:

lock ( typeof (class»

B~ minh hoa each dung tli khoa lock va cac anh huang co tM gi'!.p khi khong dung no, vi du 5.4·5 5e cho tha"y ml>t each don gian de truy xuf(t mang' a ca"p tM hien, Hai tieu trinh se dugc tao l~p va mai ti~u trinh diiu c6 gang ~t cac gia tti bam cua no van mQt 0 ben trong mango Khi cau lenh lock dang hoat doing, chuong trinh khong gay 16i. The' nhung, neu loai bii cac cau l~nh lock, ban se ~p lai.

Vi du 5.4·5 Tit kho,j lock

1: using System;

2: using System. Threading; 3:

4:

5: public class ThreadLockTest { 6:

7: private int [J m_Array = new int [10];

private int

m_CurrentIndex = 0;

8: 9:

10:

11: public void ThreadProc ( ) { 12:

13: int ThreadId = Thread. Current Thread . GetHashCode {

} ;

14:

ill 600

PHAN V : -G6i ke't hqp

15: 16: 17: 18: 19: 20:

1000 );

21:

22:

23:

24:

Ii

fore int i = 0; i < 10; i++ )

I I comment out lock statement I land watch the exception fly lock ( this ) {

if ( m_Currentlndex < 10 ) {

Thread. Sleep ( (new Random ( ) ) • Next ( 2 ) *

m_Array[m~Currentlndex++] = Threadld;

}

}

}

25:

26: public void PrintArray( ) {

27: fore int i = 0; i < 10; i++

28: Console .Wri teLine ( "m_Array [ {O}] = {1}", i,

m_Array[iJ );

29: }

30:

31 :

32:

33: public static void Main( ) { 34:

35: ThreadLockTest tlt = new ThreadLockTest ( );

36: Thread tl = new Thread ( new ThreadStart ( --

tIt. ThreadProc ) );

37: Thread t2 = new Thread ( new ThreadStart (

tIt. ThreadProc ) );

38:

39:
40:
41:
42:
43:
44:
45: }
46: } tl.. Start ( ); t2.Start( ); t1.Join( ); t2.Join( );

tlt.PrintArray( );

Mi}t Mn nita, voi cau l!}nh lock, chuong trrnh 8e chay t6t va moi vi tri CI mang d~u chua gia tr] bam cua ti!\u trrnh da gan chung vao, Tuy nhien, neu loai cac cau lenh lock, chung ta 8e gap 16i ngoai le IndexOutOfRangeException. Ly nam i'J dong 19. Sau khi m_CurrentIndex dA duqc kiern tra, ti~u trl.nh hien tai

, j

CHudNG 5-4: Cac ti~u trinh (THREADS)

601~

t!;\ID ngu (sleep) trcng mot khoang thai gian ngAu nhien nan d6. Trang giai doan nay, co tM co mot ti€u trmh khac chay va khOng thay d6i m_CurrentIndex bang each tang gia trj cua n6 len tren 10.

2.2. Mutex

Tucng tl,( nhu ttI khoa lock, mot mutax bi~u dien doc quyen truy xuat, qua lai vao mot hay nhieu tai nguyen. Kh6ng nhu mien gang, mfrt mutex la mot d6i tuqng clip h~ thong kernel, va nhu vay no co th~ chia se giua cac tie'n trinh. Mat trai cua n6 la thai gian can d€ gt;'i mutex dai han so vai viec SI1 dung mien gang qua ttI khoa lock.

Thay vi tao mQt chuong trinh dong lenh nho dll minh hal). Mutex, a day chung ta se tao mot ling dung Windows Forms nho. No minh hoa each chi a se cung mot mutex giua hai tien trmh. B~ nhieu tie'n trinh truy xuat vao cung mot mutex, ta d.n mQt 56 co che'. Trong thuc tEl, ra"t d~ d€ co chung bli.ng each tao mQt mutex c6 cung ten i'I dang hmh thuc trong mot tham s6 string. Tham 86 string co th~ duoc dung cho n hieu tie'n trmh d~ nhan duqc mutex c1lp kernel.

Hrnh 5.4·1 bieu di~n hai the hien cua ling dung WinMutex. Khi mot tie'n trlnh nhan duoc mutex, mot hinh tron xanh 8e duoc ve. Khi mutex da duoc giai ph6ng hay dang dqi M nhan dl1qc mutex, hinh tron 5e co mau do.

Hinh 5.4-1 Ung dung WinMutex

Vi du 5.4·6 trlnh bay cai di).t cua WinMutex. Luu y d~e bi~t den cau true ciia deli tircng mutex se dl1qc truy xuat den hoi nhieu th~ hien cua ling dung nay.

Vi du 5.4-6 Dng durrg WinMutex

1: using System;
2: using System. Drawing;
3: using System. Collections;
1a 4: using System. ComponentModel;
06
do 5: using System. Windows. Forms;
se 6: using System. Data; 1!J602

PaAN v : G6i ket

7: using System. Threading; 8:

9: namespace WinMutex 10: {

11 :

12: public class MainForm : System. Windows. Forms. Form 13:

14:

15: private System.ComponentModel. IContainer

components;

16:

17: private Mutex m = new Mutex ( false, "WinMutex" );

18; private boo I bHaveMutex = false;

19:

20: public MainForm()

21: {

22: InitializeComponent{);

23:

24: II

25: II TODO: Add any constructor code after

InitializeComponent call

26: II

27: Thread T = new Thread ( new ThreadStart (

Threadl?roc ) );

28: T. Start ( );

29:

30: }

31:

32: II I < summary>

33: III Clean up any resources being used.

34: I I I </summary>

35: public override void Dispose ()

36: {

37; if (components l=null)

38: {

39: components.Dispose();

40: }

41: base. Dispose ( ) ;

42: }

CHu'dNG 5·4: Cac ti~u trinh (THREADS)

603~

43:

44: #region Windows Form Designer generated code

45: / / / < sununary>

46: / / / Required method for Designer support - do not

modify

47: / / / the contents of this method with the code

editor.

48: / / / < / summary>

49: private void InitializeComponent ()

50: {

51: this.components = new

System.ComponentModel.Container();

52: / /

53: / I MainForm

54: / I

55: this .AutoScaleBaseSize = new

System.Drawing.Size(5,13);

56: this. BackColor =

System.Drawing.SystemColors.Window;

57: this .ClientSize = new System. Drawing. Size (292,

273) ;

58: this . Name = "MainForm";

59: this .Text = IWinMutex";

60:

61: }

62: #endregion

63:

64: protected override void OnPaint ( PaintEventArgs e )

{

65:

66: if ( this. bHaveMutex)

67: DrawCircle( System.Drawing.Color.Green);

68: else

69: DrawCircle( System.Drawing.Color.Red );

70: }

71:

72: protected void DraWCircle ( System. Drawing. Color

color) {

73: Brush b = new SolidBrush ( color);

74:

~604
75:
76:
77:
78:
79:
80:
81:
82:
'.I 83:
r
I
I: 84:
,,·1
1: 85:
86:
I 87:
I
i 88:
I 89:
I
90:
91 :
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111: PHAN V : G6i Mt hql

System. Drawing.Graphics g =: this.CreateGraphics( ); int x'" this. Size. Width / 2;

int v= this.Size.Height / 2;

g.FillEllipse( b, 0, 0, this.ClientSize.Width, this.ClientSize.Height );

b. Dispose ( ); g. Dispose ( );

}

protected void ThreadProc ( ) {

while ( true) {

m. WaitOne ( ) i bHaveMutex = true; Invalidate ( ); Update ( );

Thread. Sleep ( 1000 ) ; m.ReleaseMutex( ); bHaveMutex '" false; Invalidate ( ) i

Update ( );

}

/ / / < summary>

/ / / The main entry point for the application. / / / < / summary>

[STAThread]

static void Main ()

Application. Run (new MainForm()};

}

}

COu'dNG 5·4: Cac ti~u trlnh (THREADS)

605~

Co vai cJi~m can phai ducc chi ra trong ling dung tren ben canh viec chung dung chung mutex. d dong 87 cua VI du 5.4-6 Iii thu tuc ti~u trinh ThreadProc. Phuong thirc nay dinrc dung de lily mutex va lam milt hi¢u lire cua form cha, d6ng thdi giup cho vong tron ve ra co mau hop IY. Tai sao khong dan thuan goi phuong thuc DrawCircle trong phuong thuc ThreadProc? Cau tra Idi narn (j co che' quan ly bang rna cira s6 (handle map) cua ban than Windows dang dinrc sll dung boi WindowsForms. Khi c6 tao ra mQt nQi dung htnh anh bdi mQt tieu trtnh khac, mQt xu Iy ngoai Ii): se duqc dung vi sl,1' vi pham handle map. V~ ban chill, khong the tao ra mQt ban sao cho handle cua met, clia s6, d6 la chinh xac nhirng gi xay ra khi m(it t.ieu trmh con dinh tao ra mQt nui dung hlnh anh. De tranh ngoai Ii): nay, cac titiu trinh tho nen nan thuan lam mat hieu lire cua form, cai rna khi de'n luqt no. se sinh ra mot message WM_PAINT va d~t tren hang doi thong diep cua ung' dung, Tieu trmh chinh cua chuang trmh se xli Iy thOng dieP d6 sau nay.

Chay hai the hien cua WinMutex canh nhau va ban se thay ding cac hinh tron khong bao gid cung xanh. Do la ket qua cua viec dung Mutex va SLr dung d6ng b(i hoa xuyen tien trrnh,

2.3. AutoResetEvent

Mot dang khac cua d6ng bQ hoa xuyen tieu trtnh la cac su kien (event). Kien true .NET cung cap ca AutoResetEvents va ManualResetEvents. MQt SI! kien cling tuong tl,1' nhu mot su kien trong Windows Forms, noi rna ung dung cho doi mi?t hanh dQng nao do cua ngiroi dung de sinh ra mgt 81,1' kien va sau do tra ldi SI! kien do. Cling nhu vay, "I! kien c6 th~ duqc dung de d5ng bq hoa ca che xU' Iy da tieu trmh. Cai ten AutoResetEvent co du'qc ti1 thuc te Iii. su kien se duoc khoi dqng (reset) lai tV d(ing moi khi tieu trinh dang chay du'qc thong bao c6 sl! kien phat sinh.

Xern vi du sau: MQt tii~u trinh c6 trach nhiem san xuat vai thu linh tinh vii. sau d6 mot tieu trinh khac tim each s11 dung hatchLing. Ki~u van de nay duqc goi Iii. bai toan san xuat/tieu thy vii. la mot vi du kinh di~n v~ d5ng bi? hoa tieu trinh. Trang vi du nay, tieu trinh san xuat, se phat sinh mot sl! kien moi khi mot vat duqc san xuat. De dap img la i sl,1' kien do, tieu trinh tieu thy se lam gi d6 voi v~t mdi du'qc tao ra d6. Vi du 5.4-7 trrnh bay nhang diem co ban cua AutoResetEvent.

Vi dl! 5.4-7 AutoResetEvent

1: using System;

2: using System_ Threading; 3:

4: narnespace ProducerConsurner { 5:

6: 7: 8: 9:

public class Factory {

10:

private int [1 Widgets = new int [100]; . private int WidgetIndex = 0;

private AutoResetEvent NewWidgetEvent = new AutoResetEvent ( false) ;

11:

~606

PHAN V : G6i k€t hop

12:

13: protected void Producer ( ) {

14:

15: while ( true) { Ilrun forever

16:

17: lock ( this) {

18: if ( Widget Index < 100 ) {

19: Widgets [ WidgetIndex] = 1;

20: Console. WriteLine ("Widget {O} Produced",

WidgetIndex++ );

21: 22: 23: 24: 25:

NewWidgetEvent.Set( );

}

}

Thread. Sleep ( (new Random { ) ) .Next { 5 } * 1000 ) ;

26: }

27: }

28:

29:

30: protected void Consumer ( ) {

31:

32: while ( true) (

33: NewWidgetEvent.waitOne( );

34: int iWidgetIndex '" 0;

35:

36: lock ( this) {

37: iWidgetIndex = - -this. Widget Index;

38: Console. WriteLine ("Consuming widget {O}",

iWidgetIndex ) i

39: widgets [ iWidgetlndex-- ] = 0;

40: }

41: }

42: }

43:

44: public void Run ( ) {

45: IICreate 3 producers

46: for(inti=0;i<3;i++){

47: Thread producer = new Thread ( new ThreadStart (

Producer) );

48: 49:

producer.Start( );

}

50: IICreate 3 consumers

51: for ( lnt i = 0; i < 3; i + + ) {

52: Thread consumer = new Thread ( new ThreadStart (

Consumer ) ) i

53: consumer. Start ( );

54: }

55:

CHUdNG 5·4: Cac ti~u trinh (THREADS)

6071!!J

56: .}

57:

58: public static void Main( ) {

59: Factory factory = new Factory ( );

60: factory. Run ( );

61: }

62: } 63:}

2.4. ManualResetEvent

TU<1ng tl! nhu AutoResetEvent, ManualResetEvent cilng co thi'i dircc dung d€ thOng bao di.ng ti~u trlnh hien t~i da ph at sinh met sl! kien, Sl,t khac nhau gura chung la ManualResetEvent phai dLiqc khdi dong lai nho vao viae go] rnut phurrng thirc khac thay vi. co th€ tu khci dQng Ia-y. Do la khac nhau duy nhat v~ mat co che. Cach slt dung khac nhau giua chung thi thuc sV phu thuoc vao ki~u cua d6ng bO hoa rna ban can. Vdi ManualResetEvent, ta c6 th~ thea dtii tinh trarig cua mot sV kien de xac dinh dvqc khi nao su kien se can khdi dQng lai.

2.5. Cac ti~u trinh dung chung (Thread Pools)

C6 nhieu ling dung dung cac ti\"lu trinh M xu If cac yeu co1u cua nguoi dung.

Cac ling dung nhu v~y g6m co: cac may chu Web, cac may chu Co sd du lieu, va cac may chu irng dung. Thay vi phat sinh ra cac ti~u trinh mrii m6i khi nhan ducc yeu cAu cua ngtari dung, Thread Pools cho phep cac tieu trmh dLiqc dung lai, cac chi phi cho viec tao I~p va huy cac ti€iu trinh dvqc giam thieu. M<,!-c du chi phi de tao I~p met ti~u trinh thq Ia nho, chi phi M tao l~p va huy bO hang tram ti€iu trrnh thi se la mQt van di! anh hl.!dng de"n hieu nang.

MQt tieu trinh dung chung c6 the dinrc tao ra trong ba tinh hu6ng: trnh hu6ng thl1 nha't la dung QueueUserWorkItem. Hang dqi thai gian (timer queue) hay hang dol thao tac dang ky hien cho la mot ham callback. Ttnh hu6ng thir hai 11\. s6 hrcng cac Wi"u trinh se duQ"c tao ra va quan If nho vao Thread Pool, chung phu thuoc vao sO' lLiqng bQ nho con tr6ng tren M th6ng va tinh hu6ng thu ba 13 viec cai d~t mOt quan If tiilu trinh dung chung.

2.6. QueueUserWorkItem

Dil minh hoa each dung QueueUserWorkItem, hay nghi vi! nhu cau mot cong' ty bao hiem trong xlt If cac yeu cau b6i thinmg bao hi~m. SU dung ti&u trlnh dung chung, m6i yeu cau se diroc coi 13 mQt viec cho mot tieu trinh Xlt ly. Khi co mQt yeu cau mrri, ling dung c6 thE\' xep n6 trong hang dci nhu mQt mau viec danh cho tieu trrnh dung chung, Phuong thuc QueueUserWorkltem 18. mot phuong thirc static cua ldp ThreadPool va co dang nhir sau:

ThreadPool.QueueUserWorkItem (WaitCallbackcallback, object state)

Tham s6 ddu la dai dien callback cua tiilu trmh dung M thuc thi. Khong gi6ng nhu dai dien tieu trinh trong vi du trunc, mot dai di~n WaitCallback cho

lIlS08

PHAN V : G6i k€t hgp

1: using System;

2: using System. Threading; 3:

4:

5: liThe InsClaim represents

6: Iia work item for a particular 7: II thread.

8: public struct InsClaim {

9: public string Claimld;

10: public double Amount; 11: }

12:

13:

14:public class App 15:

16: public void ProcesslnsuranceClaim( object state) {

17: Ilunbox the InsClaim passed in

18: I[lsClaim theClaim = (InsClaim) state;

19:

20: IIProcess the claim and sleep to simulate work

21: Console.WriteLine("ProcessingClaim to} for {1}

amount" I theClaim.Claimrd, theClaim.Amount );

22: Thread. Sleep ( 5000 ) ;

23: Console.WriteLine{"Claim {O} processed" I

theClaim.Claimld};

phep mQt tham so hinh thuc cua ki~u object. Tham so object cho phep thong tin duoc gtri den tifiu trinh thg. Cho den bay gic, chung ta van chua thli glii thong tin den tifiu trinh thg. Vi du 5.4-8 dudi day se trmh bay vi du v~ bang bao hifim su dung ti~u trmh dung chung Mxi11y C;)C y~u du.

Vi du 5.4·8 Thread Pools va QueueUserWorkItem

24: }

25:

26:

27: pub Ld,o static void Main( }{

28: App app '" new App ( );

29:

30: IICreate 100 insurance claims

31: Random r := new Random ( );

32: fore int i = 0; i < 100; i++ ) {

COlfONG 5·4: Cac ti~u trinh (THREADS)

609~

33: 34: 35:

InsClaim claim;

claim. ClaimId = string. Format ("INS (O}". i); claim.Amount =: r.NextDouble ( ) * 5000;

36: ThreadPool.QueueUserWorkItem( new

Wai tCallback ( app. ProcessInsuranceClaim ) I claim) ;

37: System. Threading.ThreadStart

}

38:
39:
40:
41:
42: }
43:} Iiallow threads in pool to run Console.ReadLine( );

Vi du bao hi~rn tren kha ro rang. Vong I~p for duoc dung M tao ra 100 yeu ci1u cAn xl! 19, Mt Mu Cr dong 33. Moi yeu du sau do se narn trong hang dqi va chO doi tillu trinh trong vung luu gift tiii'u trinh dung chung. Nhd phai luu y cac ke""t xu!it dugc chen vao bai vi du, Khi cac yeu cAu dang bAt diiu duoc xl! ly, cac yeu cau khac se dlfqc xilly Mi cac tiGu trinh da ket thuc viec xli Iy trlfOc do. Tiii'u "trinh dung chung la mOt cong CIJ hiii\u qua cho cac tac vu nen, dac biet khi no dbi hoi thci gian chrr dqi.

3. M(1 RQNG cAc TIEU TRiNH .NET

M~c du .NET da cung cap mot phuong each th6ng nhat cho cac tillu trtnh cua tAt ca cac ngon ngi1 dung kien truc .NET, nhung duong nhir vdn thie"u mnt su ket n6i va dong goi cac d6i tl.l'qng tiii"u trinh. Bang viec tao ra rni)t rni)t lop co sa trltu tI.lgng nho (abstract) d~ bieu dien ti8'u trinh tho, kha nang mo "r{jog cac h1\ tro ti~u trinh co ban se chUng minh su huu Ich khi phat trilln cac Ung dung len han.

3.1. LOp WorkerThread

Vi~c tao m(jt ldp trim tuong' dan gian dii' biii'u di~n eac tiii"u trmh thq thi khong c6 gi kh6 khan. C6 rnl,it cap Iy thuyet co ban cAn dlfqc cung cap, dAu tien la khli nang giin ket di1li~u viii mi)t tillu trinh xac dinh, Di~u nay cho phep tao ra cac tillu trinh tho va 40 lij.p cac dflli~u cho chung, DiElu tiEi"p theo la kha nang dirng rnl,it ti&! trinh tb.q b~g mQt 56 each nao do. Cach dE'! nhat d~ co diroc dieu d6 la cung efrp mOt phuong thirc Stop eo the tao ra met ngoai l~ ThreadAbortException khi chay phuong thirc Run cua tieu trinh tho. Vi du 5.4-9 mo. ta each cai d~t lap tiii"u trmh thg eo sa.

VI du 5.'1-8 Lop tritu tu'qng WorkerThread

1: using System;

2: using System. Threading; 3:

~610

PHAN V : G6i Mt hop

4: namespace SAMS. Threading 5: {

6:

7:

8: III <summary>

9: III Encapsulate a worker thread and data 10: III </summary>

11: public abstract class WorkerThread { 12:

13: private object ThreadData;

14: private Thread thisThread;

15:

16:

17: IIProperties

18: public obj ect Data {

19: get { return ThreadData; }

20: set { ThreadData = value; }

21: }

22:

23: public object IsAlive {

24: get { return thisThread == null? false

thisThread.lsAliye; }

25: }

26:

27: III < summary>

28: III Constructors

29: III < I summary>

30:

31: public workerThread( object data) {

32: this.ThreadData = data;

33: }

34:

35: public WorkerThread( ) {

36: ThreadData = nUll;

37: }

38:

39: III <summary>

40: III Public Methods

41: III </summary>

CHUdNG 5·4: Cac ti~u trinh (THREADS)

6111.!J

42:
43:
44:
45:
46:
47:
48:
49:
50:
51 :
52:
53:
54:
55:
56:
57:
58:
59:
60:
61 :
62:
63:
64:
65:
66: }
67:} I I I <summary>

I I I Start the worker thread I I / < I summary>

public void Start ( ) {

thisThread::: new Thread( new ThreadStart ( this .Rhn ) );

thisThread.Start();

}

I I / <summary>

I I / Stop the current thread. Abort causes

I I / a ThreadAbortException to be raised within 1// the thread

/ I I < / summary>

public void Stop ( ) {

thisThread.Abort ( ); while ( thisThread.IsAlive thisThread= null;

}

1// <summary>

I I I To be implemented by derived threads I I / < I summary>

protected abstract void Run ( );

Cai d~t cua lap WorkerThread cho tha'y su d~ dang khi tao ra mot lop b9C cho cac hCi trq tieu trinh da ton tai, MQt lop b9C la m(it thuat ngil chi m(it lap c6 cac tinh nang co' ban da duqc b9C M rna r(ing nhu la mot kigu chung hay lrrp chung. Phuong tlure quan trong nhat ben trong lop WorkerThread la phuong thuc truu tl1qng Run dung dEl bat dau tieu trinh.

3.2. Btta t6i cua cae nha trie't hoe

Do§" lam vi$c vdi lop WorkerThread, m(it van d,§ d6ng bQ hoa kinh dicn, duoc bi€t Mn nhu la "BUa t6i cua cac nha tri€t h9C", sa dliqc chung ta tim hieu va cai d!)t dmri day. Trong bai toan nay, m(\t nh6m cac nha triilt h9C ng6i quanh mQt chi€c ban tron. H9 vua an vira suy right. D~ an, mOi nguoi phai la'y duoc mot chisc nta u ben trai hay ben phai cM ngoi. Hinh 5.4~2 tho tha'y su sap x€p cua cac nha trie't h9C va nhung cai nia.

~612

PHAN V : O6i k€t h

Hinh 5.4·2 Baa t6i ella cdc nh.a trie: hoc

Dt nhien, van d~ 180 khi mOi nha tri€t hoc co mQt cai nia thi phai ng6i dgi co dugc cai nta khac rura. Tinh hu6ng nay duoc goi 180 deadlock. Trong til hu6ng deadlock, nhi~u ti~u trmh cimg cho doi cac nguon tai nguyen kh6ng th~ diroc do bi kh6a (lock) vong tron [;in nhau. Vi vay, muc dich cua cac nha tri€t h la cam eli hai nia hay khong cam gt ca chu kh6ng bao giG cdm gill m.]t nla. Vi ' 5.4-9 trinh bay ky thuat va each xtr ly nay vdi vi~c sli dung lcp co WorkerThread.

Vi du 5.4-9 Bua t6i cun cac n ha trie't hoc

1: using System;

2: using System. Threading; 3: using SAMS.Threading;

4:

5: namespace DinningPhilosophers 6: {

7:

8: publi? struct PhilosopherData {

9: public int PhilosopherId;

. public MUtex public MUtex public int public int

RightChopStick; LeftChopStick; AmountToEat;

. TotalFood;

10: 11: 12: 13:

14: }

15:

16:

17:

18: public class Philosopher: WorkerThread

19: {

cmroxo 5-4: Cae W~u trlnh (THREADS)

613~

20: public Philosopher ( object data) : base (. data) { }

21:

22: IIImplement the abstract Run Method

23: protected override void Run ( ) {

24:

25: PhilosopherData pd = (PhilosopherData)Data;

26: Random r = new Random ( pd. PhiloBopherld ) i

27: Console. Wri teLine· ( "Philosopher {O} ready",

pd.Philosopherld )i

28: WaitHandle [] chopSticks = new WaitHandle [) {

pd. LeftChopStick, pd.RightChopStick};

29:

30: while( pd. TotalFood > 0 ) {

31: IIGet both chop sticks

~: WaitHandle.WaitAll( chopSticks);

33: Console.WriteLine("Philosopher {OJ eating {1}

of {2} food", pd.Philosopherld, pd.AmountToEat, pd.TotalFood );

34: pd. TotalFood -= pd.AmountToEat;

35: Thread. Sleep ( r. Next (1000,5000) );

36:

37: IIRelease the chopsticks

38: Console.WriteLine("Philosopher {O}

thinf=.ing", pd. PhiloBopherld) i

39: pd.RightChopStick.ReleaseMutex( );

40: pd.LeftChopStick.ReleaseMutex( );

41:

42: //Think for a random time length

43: Thread.Sleep( r.Next(1000,5000) )i

44: }

4~ Console.WriteLine{"PhiloBopher {OJ finished",

pd. Philosopherld ) ;

46: }

47: }

48:

49:

50: public class Restaurant { 51:

52: public static void Main( ) {

53: Mutex[J chopSticks = new Mutex[5};

~614
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72: }
73: }
74: } pHAN V : Goi ket hop

f finit the chopSticks for ( int i = 0; i < 5; i++

chopSticks [i] = new Mutex{ false) i

f fOreate the Five Philosophers for(int i = O;i < 5; i++ ) { PhilosopherData pd; pd.Philosopherld = i + 1;

pd. RightChopStick. = chopSticks ( i - 1 >= O? ( i -1):4J;

pd.LeftChopStick = chopSticks [i]; pd.AmountToEat = 5;

pd. TotalFood = 35;

Philosopher p = new Philosopher ( pd ) ; p. Start ( );

}

Console.ReadLine( );

Vi du "Bua an t6i cua cac nha triet hQC" cho thay each dung pbuong thtrc static WaitHandle.WaitAlI M co ca hai cai nia. Mt)t each hieu qua, phuong thirc WaitAll se khong trd ve cho den khi n6 co tM lay ducc eli hai dOi tinrng duqc ddn xuat tl1 WaitHandle, trcng trircng hop nay la mot cap cua mutax cho moi chiee nia. Phuong thrrc WaitAll con cung cap hai the hi.[)n chong cho phep thiet, lap thi'li gian chc dci va met ca Boolean M xac dinh cac pham vi. WaitAlI chirng minh each giai quyet khi si't dung chung nguon tai nguyen va tranh trircng' hop deadlock do chi'! dqi vong tron.

4. KET CHUONG

Nhirng dieu thao luan d day g6i gon trong khil. nang hb tro tieu trinh cua ki€n true .NET. MQt M.n rura, mac du caclop tieu trinh va cac CrJ che du<,1c cung cap khOng han luc nao cung du M dung, ban phai luon nghi trong Mu rAng kien true .NET dinh huang den da ng6n ngli'. Va nhu vay, mot cai dl\it d.fty du cac chirc nang manh la dieu kh6ng phai luc nao cung c6 the, va nhu the, cac lij,p trtnh vien can W md rOng nhi1ng co sO' dil. duoc cung cap sii:n cho ng6n ngu cua minh khi can, Sa dung lop truu tllqng crJ So' WorkerThread, ban c6 the md rt)ng no cho cac nhu ciiu dij.c trung va tiep tuc cai tien va sang IQc qua thai gian sau nay.

\IlSACH DA XUAT BAN

~PTRiNH :

1. Sai t~p ngon ngu C tlt A den Z

2. Giao trinh If thuye't va bai tap ngon ngct C [t~p 1 & 2)

3. Lap trmh Windows (BAng Visual C++)

4. Thiet kif do hoa dinh huang dOi tU<1ng vdi C++

5. Giao trinh Iy thuyet va bai t~p Pascal [tap 1 & 2)

6. Giao trinh Iy thuyet va bai q.p Foxpro [t~p 1J

7. Si.'r dung va khai thac Visual Foxpro 6.0

8. Access 2000 lap trlnh li'ug dung co sa dil

li~u [taP 1 & 2)

9. Giao trinh ly thuyet va bai t~p Oracle

10. Giao trmh Iy thuyet va hal t~p Java

11. Java lij.p trmh mang

12. Giao trinh Ii thuye't va bai t~p visual J++6

13. T\l' hoc I~p trlnh co sa dff lieu vrri VB6

trong 21 ngay [t~p 1 & 2J

14. Visual Basic 6.0 - Lap trtnh co so dtr li~u

15. Cac ky xao l~p trinh voi VB6 va Delphi

16. Giao trmh If thuyet va hili tij.p Delphi

17. Hep ngfl va Iap trinh (tug dung [tij.p1&2]

18. Lap trinh Linux [tap 1)

19. Bo hca vi tinh [tap 1 & 2)

20. Giao trtnh trf tu~ nhan tao - Mang Ncfton phuong phap va li'ug dung

21. Giao trinh trf tu~ nhan tao - CAu true dff li~u + T'huat, giai di truyen = Lap trinh ti€n h6a

, 22. Giao trinh trf tu~ nhan tao - May hoc

23. TV hoc l(tp trinh hAng vi du vdi VISUAL C++MFC

24. Lap trinh li'ug dung chuyen nghiep SQL

Server 2000 (taP 1 & 2)

25, TUng hlldc h9C l~p trmh voi VB.NET 26. Lap trinh vdi Windows C#,NET

27, Til' hoc I~p trinh chuyen sau vdi

VB,NET trong 21 ngay INTERNET & VIEN THONG ·28. Internet Explorer toan t~p

29. Internet working voi TCPIIP [tij.p 1&2) 30, Thtre hanh thiift ke trang web vdi

Frontpage 2000

31. Frontpage 2000 toan tij.p

___ .32. Thiet kif hoat hmh cho web voi Macromedia Flash

33. Huang dAn thiet ke trang web tllClng tac bllng Java Script

34. Su dung E-mail va tin h9C van phong' tren mang vcri Outlook 2000

35. Modem' trlly~n s6 li~u

36. Co sa ky thuat chuyen mach va tilng dai [tij.pl&2)

37. XM:L - Nen tang va li'ug dung

38. Xay duug li'ug dung web voi JSP,

servlet, Javabeans.

39. ASP 3.0 I ASP.NET

40. Thiet k€ trang WEB dQng voi DHTML.

41. Lap trinh li'ug dung WEB vdi JSP servlet

42. Ky thuat truyen so Mu.

43. Thiet kif web vCri Macromedia Dreamweaver

4.0

THIET KE DO HQA

44. Ve minh hoa vdi Corel Draw 9.0

45. Ve minh hoa voi Corel Draw 10.0

[t~p 1,2 & 3)

46. Autocad 2000 [t!j.p 1 & 2J

47. Thiet ke 3 chieu v(ii 3D Studio Max 3.0

48. Thiet ke 3 chieu voi 3D Studio Max 4.0 49, Adobe Photoshop 5.5 va Imageready 2.0

50. Adobe Photoshop 6.0 va lmageready 3.0

51. Adobe Photoshop bai tap va ky'Xao

52. Adobe Illustration 8.0

53. Adobe lIlustration vci cac ky thuat thiet

kii' nang cao

54. Adobe InDesign

55. Dan trang vdi Quarkxpress

56. Thiet kif 3 chieu vdi 3DS MAX4 H~ DIEU HANH vA M~NG

57. Van hanh va khai thac Windows 98

58. Lam chi! Windows 2000 Server

[tap 1 & 2J

59. Giao trmh rnang Novell Netware 5.0

60. Giao trlnh cAu true may tinh

61. Vi mach va mach tao song

62. H9 vi xuJy 8051

63. Tim hiii'u cAu true va huang dan sua chua, bao tri may PC [~p 1 & 2)

64. Giao trtnh M th6ng mang may tinh CCNA Semester I

65. NAm vtrng Windows XP professional [tap 1)

66. Bao mat va tai uu h6a Linux

67. Giao trlnh I,;' thuyet va thuc hanh Linux

[t~p 1J VANPHONG

68. Microsoft Word 2000

69. 1)0 hoa va Multimedia trong van phong voi M8 Power Point 2000

LA-P TRINH WINDOWS VOl C#.net

NHAxukr HAN LAO n<)N(i - xA H()I 418 Ly Thai Tit - Hil N(H

Tt>I: H.241706 - Fax: 9.34H2H3

***

Ch]u trach nhiem XlltJ't han

", ,

N( iUYEN HlNH THIEM

THANH nuv

Bil'n t(ip kf thudt:

DIeU NGOC

8Lf'l1 han in .'

NG()C AN

Trinh bUy hill :

NHO nlNH N( JOAN

T 6ng phat hanh tal NHA SACH MINH KHAI 249 Nguy~n Th] Minh Khai - Ouan ,

, TP. He Chf Minh

DT:(08) 8250590 - (08) 9250591 - Fax:(08) 8331124 E-mail(CLBbandoc):mk.pub@::inet.vnnews.com E-mail{thuongmai):mk.book@::inet.vnnews.com

Web site -. www.minhkhai.com.vn

,In L()()() eutln kh6 16 x 2~(em)tIli Xi l1ghi~p In MACHINC() 21 Bni Thi Xuan , I (;j,j'y ('NtH<'KH \ult ban .+/62.+ XB·QLXB l:lia (\Ie Xufft Biln C[lp ngay 01/06/200:

In xon g vii n9P hru chi2u thuug 0712002.

You might also like