Kiểu dữ liệu Kiểu dữ liệu mà bạn sẽ lưu trữ trong mảng.. Bạn có th ể xác định một trong các kiểu dữ liệu cơ bản hoặr nếu bạn chưa chắc chắn kiểu dữ liệu nào sẽ dược lưu trữ trong m ảng h
Trang 1Th.S: XUÂN THỊNH - NAM THUẬN
và nhóm Un học thực dụng
Kỹ thuật và thủ thuật
lập trình VISUAL BASIC 2010 - 2011
các trường Cao Đẳng và Đ ại Học
♦ M icrosoít V isuaJ B asic 2010-2011 là b ả n n âiig cấp và cải liế n qxian trọ n g ciia ngôn n g ữ lậ p tr in h lâ ê m trìn h
b iê n d ịc h V lsu al B asic p h o b iế n , m ộ t công Iighệ điíỢc
r ắ t n h iề u các n h à lậ p tr ìn li Id iắ p th ế giớ i tin cậy sử diuig
♦ V ớ i cách bố cụ c c h ặ t c h ẽ th e o từ n g c h ủ đ ề chitơng và
rá t Iihiều bài tập thực Ì i ằ i ử ì từng bước và chương trùửi
m ăii, b a n s ẽ n h a n h chóĩig học đ ư ợ c c á c h tạ o các ííng dụncị V isuai Basic
♦ C ác tín h n ăn g m ới n h á t c ủ a Visi.ial B asic s ẽ giiip b ạ n
lậ p tr ìn h n h a n li hơn v à (ĩạ t h iệ u qiiâ cao hơn, n h ấ t là
k h i b ạ n tliíc h s ử d ụiig v à tíc h h ợ p th ô n g tlii từ các cơ
sở d ữ liệ u , các p h ư ơ n g tiệ n g iả i trí» các tra n g W eb và Wcb slte Hy vọng saii k h i học xong các birôc và t h ủ
th u ậ t lậ p tr ìn h tro n g q u y ể n s á c h n ày với V isiial B asic
New Edition
NHÀ XU ẤT BẢN HỒNG ĐỨC
Trang 2L ỜI NỐI ĐẦU
M ic ro so ft V isu a l B a sic 8010-8011 l à b ả n n â n g c ấ p và cả i
t i ế n q u a ii tr ọ n g c ủ a n g ò n Iigữ lậ p t r ì n h ld.êm trìrứ i b iê n d ịc h
V is tia l B a sic p h ổ b iế n , m ộ t công n g h ệ đưỢc r ắ t lủ iiề u cá c n h à
lậ p tr ìiử i Ichắp ứ iế g iớ i ti n cậy s ử d ụ n g V is u a l B a sic 2 0 1 0 -
b ạ n s ẽ n h a n h c h ó n g h ọ c đư ợ c c á c h tạ o cá c ứ n g d tư ig V istial
B a sic 2 0 1 0 -2 0 1 1 c h ấ t lư ợ ng c h u y ê n n g h iệ p d à n h c h o h ệ đ iề u
h à n h W ữ id o w s và n h iề u b ộ t i ì n h d u y ệ t W eb C ác t í n h n ă n g
m ớ i n h ắ t c ủ a V is u a l B asic s ẽ g iú p b ạ n lậ p t r ù ứ i n h a iứ i h ơ n
v à đ ạ t h i ệ u q u ả cao h ơ n , n liấ t là k lii b ạ n tliic h s ử d ự n g v à
t í c h h ợ p th ô iig t i n t ừ cá c cơ sở d ữ liệ u , cá c p h ư ơ n g t i ệ n g iả i
t r í , cá c tr a n g W cb v à W cb sitc
H y v ọ n g s a u k h i h ọ c x o ĩ i g c á c b ư ớ c v à t h ủ t h u ậ t lậ p trìiứ i tro n g q u y ể n sá c li n à y với V isu a l B asic v à V is u a l S tu d io In te -
Trang 3C h ư ơ n g 11: S ử d ụ n g c á c m ảng đ ể quản lý dữ liệu s ố và chuỗi
Lộp trình nâng coo và thiết kế
giao diện người dùng
Chương I I : S ử d ụ n g c á c m ả n g đ ể q u ả n lý
d ừ liệu s ố v à ch u ỗi ChtMĩig 12: Làm v iệ c v ớ i c á c tậ p hợp Chướng 13: K h ả o s ấ t c á c File T e x t v à x ử
lý ch u ỗi Chương 14: Q uản lý c á c ịo r tn Windou)s và
c á c cơntroỉ v à o th ờ i g ia n c h ạ y Chương 15: T bêm đ ồ h ọ a v à c á c h iệ u ứìig
h o ạ t h ìn h
Chươĩtg 16: Thừa k ế c á c f o r m v à tạ o c á c
c la s s c ơ s ở Chương 1 7: Làm v iệ c v ớ i c á c m á y in
Trang 4K G iữ g ìn d ữ liệu m ảng kh i bạn tá i định chiềíi các m ảng.
a S ứ d ụ n g các phĩccmg tbữc Hort và Keverse trong class A rray d ể sáp
M ột phường p h áp n h a n h để quản lý dữ liệu tro n g các chương tr ìn h là lưu trữ và tru y tìm th ô n g tin tro n g các íĩle te x t phụ n h ư b ạ n sẽ th ấ y trong chương 13 Tuy n h iê n , phưcmg p háp to à n diện n h ấ t là lưu tr ữ v à tru y tìm
th ô n g tin b ằn g việc sử dụng các cơ sở dữ liệu v à b ạ n sẽ b ắ t đầu học cách tích hợp các chương tr ìn h với các cơ sd dữ liệu tro n g chương 18-
Trang 5T ro n g chưcmg này, b ạ n sẽ học cách tổ chức các biến và th ô n g tin khác
th à n h các k h u n g chứa hữu dụng được gọi là các m ản g (array) B ạ n sẽ học cách hợp lý h ó a nhữ ng tác vụ quản lý dữ liệu b ằn g các m ản g có kích cỡ cố
đ ịn h v à các m ản g động và cách sử dụng các m ản g tro n g m ã để quản lý các lượng lớn dữ liệu B ạn sẽ học cách tá i đ ịn h chiều các m ản g v à gìn giữ dữ liệu tro n g các m ả n g k h i b ạ n quyết đ ịn h th a y đổi kích cỡ của m ộ t m ảng Để
m in h h ọ a các m ản g lớn có th ể xử lý n hư thê' nào, b ạ n sẽ sử dụng các phương thức S o rt v à R everse tro n g class A rray của M icrosoft NET F ram ew ork để
sắ p xếp lạ i th ứ tự m ột m ản g chứa các giá trị số nguyên 6 chữ sô’ ngầu nhiên Sau cùng, b ạ n sẽ học sử dụng control P ro g ressB ar để cho người dùng biết
m ộ t tiế n tr ì n h (liên quan đến m ảng hoặc nào dó) m ấ t th ờ i gian bao lâu
N hữ ng kỹ th u ậ t m à b ạ n sẽ học m ang lạ i m ột bước khởi đầu làm quen vững chắc với n h ữ n g kỹ th u ậ t lậ p trìn h cơ sở dữ liệu m à b ạn sẽ k h ai th á c sau đó tro n g sách
Làm việc với các mảng của các biến
Trong p h ầ n n ày b ạn sẽ học về các m ản g (array), m ột phương p h áp hữu dụng để lưu trữ h ầu n hư b ấ t kỳ lượng dữ liệu tro n g quá tr in h thực th i chương tr ìn h Các m ản g là m ột cơ cấu m ạ n h và được th ử ng h iệm qua thời
g ia n để lưu tr ữ các giá trị liên quan m ột cách logic tro n g m ột chương trìn h
N hữ ng người p h á t tr iể n r a BASIC, P ascal, c , và nhữ ng ngôn ngữ lập trìn h phổ b iế n k h á c k ế t n h ậ p các m ảng vào các p h iê n b ả n sớm n h ấ t của những
sả n p h ẩ m n à y để th a m chiếu đến m ột nhóm giá tr ị b ă n g việc sử dụng một
tê n và đ ể xử lý nhữ ng giá t n đó m ột cách riê n g lẻ hoặc chung
Các m ả n g có th ể giúp b ạn theo dõi m ột tậ p hợp nh ỏ các giá trị bằng
n h ữ n g cách k h ô n g thực tiễ n sử dụng những biến tru y ền thống Ví dụ, hãy tưởng tượng tạ o m ột b ản g điểm bóng chày chín lượt chơi tro n g m ộ t chương trìn h Đ ể lưu v à gọi lạ i các số điểm cho mỗi ỉược chơi của tr ậ n đấu, có th ể
b ạ n r ấ t m uôn tạo h ai nhóm gồm 9 biến {tổng cộng 18 biến) tro n g chương trìn h Có lẽ b ạ n sẽ đ ặ t cho chúng m ột tê n nào dó n h ư In n in g lH o m eT eam , InninglV istingT eam để làm cho chúng rõ ràn g L àm việc riên g lẻ với
n h ữ n g b iế n n à y đòi hỏi thờ i gian v à không gian đ án g k ể tro n g chưcmg trìn h T h ậ t m ay th a y , với Visual Basic, b ạn có th ể tổ chức các nhóm gồm các biến tương tự th à n h m ột m ản g có m ột tê n chung v à m ột index dễ sử dụng Ví dụ, b ạ n có th ể tạo m ột m ảng hai chiều (cao h a i đơn vị v à rộng 9 đơn vị) được đ ậ t tê n là Scoreboard để chứa các số điểm cho tr ậ n đấu bóng chày H ãy xem diều n ày làm việc n hư th ế nào
C h ư ớ n g 11: s ử dụng các m ảng để quản lý dữ liệu s ố và chuỗi 9
Trang 6Tạo m ột mảng
B ạn tạ o hoặc k h a i báo các m ản g tro n g m â chương tr ìn h tương tự như
b ạn k h ai báo các biến dơn giản N hư thường lệ, vị trí m à b ạ n k h a i báo biến tro n g đó quyết đ ịn h nơi nó có th ể được sử dụng hoặc p h ạm vi (scope) của nó
^ N ếu bạn khai báo m ột m ảng m ột cách pttbỉíc trong m ộtpỉiblỉc, bạn có
t h ể s ủ dụng nó ờ bất cứ ncH nào trong proịecỉ.
K hi b ạ n k h ai báo m ột biến, b ạn thường bao h àm th ô n g tin được trìn h bày tro n g b ả n g 11.1 tro n g câu lện h k h ai báo
Bảng 11.1 Các phẩn tử cú pháp cho một phẩn khai báo m ảng
Các p h ầ n tử cú pháp Mô tà tro n g k h a i b áo m àng
trong chương trình Nói chung, các tên mảng tuân theo các quy tắc y như các tên biến, (Xem chương 5, để biết thêm thông tin về các biến)
Kiểu dữ liệu Kiểu dữ liệu mà bạn sẽ lưu trữ trong mảng
Trong hầu hết các trường hợp tấ t cả biến trong inộL mảug là cùng một kiểu Bạn có
th ể xác định một trong các kiểu dữ liệu cơ bản hoặr nếu bạn chưa chắc chắn kiểu dữ liệu nào sẽ dược lưu trữ trong m ảng hoặc bạn sẽ sử đụng nhiều kiểu hay không, bạn
có thể xác định kiểu Object
là một chiều (raột danh sách các giá trị) hoặc hai chiều (một bảng các giá trị), nhưng bạn
có thể xác định các chiều bổ sung nếu bạn làm việc với một mô hình toán học phức lạp chẳng hạn như một hình dạng ba chiều Số chiều trong một mảng đôi khi được gọi là hạng (rank) của mảng
Trang 7C h ư ơ n g 1 1 : S ử d ụ n g c á c m ả n g đ ể q u ả n !ý d ữ liệ u s ố v à c h u ỗ i 11
• • • • • • •
Thủ thuật
Các mảng chứa một số phần tử được xác lập được gọi là các mảng có kích cỡ cố
th ể m ở rộ n g tro n g quá trìn h thự c th i chương trìn h ) được gọi là các m ảng động (d y n a tĩiic array).
Khai báo m ột m ảng có kích cỡ cố định
Cú p h á p cơ b ản cho m ột m ảng có kích cỡ cô' đ ịn h public là
Dim ArrayNam e(Dim 1lndex, Dim2lndex, ) As DataType
Các đối sô’ sau đây quan trọng:
a D im là từ khóa khai báo mảng, s ứ dụng Public thay ỉ’ì n ếu bạn đặi
m ả n g trong m ột modnỉe.
m A rrayN am e là tên biển của mảng.
p h ầ n tứ trt'c cho 1.
a D im 2 ỉn d e x là giới hạn trên của chiền thứ h a i của m ảng, đ â y là số p h ầ n
tứ tn c cho 1 (Các chiều bổ sung có th ề được đìCa vào n ếu chúng được tách biệt bàng các ảấn phẩy).
M D ataType là m ột tì( khóa ticơng ứng t>ới kiểu d ũ liệu m à sẽ được đìCa vào
m ảng.
Ví dụ để k h a i báo m ột m ảng chuỗi m ột chiều có tê n là Em ployees có chồ
d à n h cho 10 tê n n h â n viên (dược đ án h số từ 0 đ ến 9), b ạn có th ể gõ nh ập dòng m ả sau đây tro n g m ột th ủ tục sự kiện;
Dim Employees{9) As string
T ro n g m ộ t module, p h ần k h ai báo m ảng này trô n g như sau:
Public Employees(9) As string
B ạn cùng có th ể xác đ ịn h m ột cách tường m inh giới h ạ n dưới của m ảng
là zero b ằ n g việc sử dụng m ã tro n g m ột th ủ tục sự kiện:
Dim Employees(0 To 9) As string
Cú p h á p "0 to 9" n ày được đưa vào để làm cho m ã dễ đọc hơn - những nểười m ới đ ế n chương tr ìn h của b ạn sẽ hiểu ngay r a rằ n g m ản g Employees
có 10 p h ầ n tử được đ á n h số từ 0 đến 9 Tuy n h iên , giới h ạ n dưới của m ảng
Trang 812 C h ư ơ n g 11: S ử d ụ n g các m ảng đ ể q u ả n lý dư liệ u s ố và chuỗi
p h ải luôn là zero B ạ n không th ể sử dụng cú p háp n à y để tạ o m ộ t giới h ạn dưới khác cho mảng-
Oành riêng bộ nhớ
K hi b ạn tạo m ột m ảng, Visual Basic d ành riên g chỗ trố n g cho nó tro n g
bộ nhớ Ả nh chụp m à n h ìn h sau đây m inh họa về k h á i n iệm m ả n g Employ- ees 10 p h ần tử được tổ chức n h ư th ế nào Các p h ầ n tử được đ á n h sô' từ 0 đến
9 th a y vì từ 1 đến 10 bdi vì các index m ảng luôn b ắ t đầu với 0
E m p lo y e e s
Đ ể k h a i báo m ột m ản g 2 chiều public có tê n là Scoreboard có chỗ trố n g
đ à n h cho hai h à n g và chín cột dữ Uệu số nguyên S h o rt, b ạn có th ể gõ n h ập
câu lệ n h sau đây tro n g m ột th ủ tục sự kiện hoặc ở p h ầ n trê n cùng của form:
Dim Scoreboard(1, 8) As Short
Sử dụng cú p háp n h ấ n m ạ n h giới h ạ n dưới (zero), b ạn cũng có th ể khai báo m ản g n h ư sau:
Dim Scoreboard(0 To 1, 0 To 8) As Short
Sau k h i b ạn k h a i báo m ột m ả n g hai chiều n hư vậy v à V isual B asic d àn h riê n g chỗ trố n g cho nó tro n g bộ nhớ, bạn có th ể sử dụng m ả n g tro n g chưcmg tr ìn h n h ư th ể nó là m ộ t b ản g các giá tr ị n h ư được m in h h ọ a tro n g
ả n h chụp m à n h ìn h dưới đây (Trong trường hợp n ày các p h ầ n tử m ảng được đ ánh sô' từ 0 đến 1 v à từ 0 dến 8)
Trang 9C h ư ớ n g 11: S ử d ụ n g các m ảng để quản iý dừ liệ u s ố và ch u ỗ i 13
Để th a m chiếu đ ến m ột p h ần tử của m ột m ảng, b ạ n có th ể sử dụng tên
m ảng v à m ột in d ex m ản g được đ ặ t tro n g các dấu ngoặc đơn Index sẽ là m ột
số nguyên hoặc m ột biểu thức vốn tạo n ên m ột số nguyên, Ví dụ, index có
th ể là m ộ t b iế n số nguyên chẳng h ạ n như num , hoặc m ộ t biểu thức chẳng
h ạ n n h ư num -1 (B iến bộ đếm cho m ột vòng lặ p For N ex t thư ờng được sử dụng) Ví dụ, câu lệ n h sau đây gán giá trị "Leslie" vào p h ầ n tử có m ột index
là 5 tro n g ví dụ m ả n g Em ployees tro n g p h ần trưức:
Trang 10Khai báo m ột m ảng và gán cho nó các giá t r ị ban đầu
C ũng có th ể k h a i báo m ột m ả n g và g án cho nó các g iá t r ị b a n đầu cùng
m ộ t lúc Cú p h á p câu lệ n h n à y đôi k h i tư ơ ng đương với n h ữ n g gì b ạ n đã học về việc g á n m ộ t g iá tr ị b an đầu vào m ộ t b iế n t ạ i th ờ i đ iể m k h a i báo
và hừu dụng k h i b ạ n b iế t trước m ộ t m ả n g c ầ n lớ n bao n h iê u v à n ộ i dung của nó là gì
Để tạo m ột m ản g b ằ n g cách này, bạn sử dụng n h ữ n g gì được gọi là một trực kiện m ản g (a rra y liberal) M ột trực kiện m ả n g gồm m ộ t d an h sá c h các giá tr ị dược p h â n cách b ằn g dấu ph ẩy được đ ặ t tro n g các dấu ngoặc (II) Khi
b ạ n sử dụng cú p h áp này, b ạn có th ể cung cấp kiểu m ả n g hoặc đ ể Visual
B asic sử dụng sự suy lu ậ n kiểu (type inference) đ ể quyết đ ịn h m ả n g n ê n có kiểu nào Ví dụ, để k h a i báo m ột m ảng m ột chiều có tê n là W a ite rs có kiểu
S trin g v à điền vào nó 7 tê n , b ạn sử dụng cú p h áp sau đây:
Dim W aiters() As strin g = {"Ben", "Sue", "Lee", "Kim-, "Pat", "Eve", “S a i")
Chú ý rằ n g kích cỡ của m ản g này được tự động q u y ết đ ịn h bởi Visual
B asic k h i W a ite rs được k h ai báo Ngoài ra , nếu b ạn k h ô n g biểu th ị m ột kiểu m ảng, V isual B asic sẽ sử dụng sự suy luận kiểu đ ể q u y ết đ ịn h đúng kiểu dữ liệu m ản g cho bạn Rõ ràng, nếu t ấ t cả dữ liệu có cùng m ột kiểu, trìn h biên dịch sẽ b iế t rõ kiểu dữ liệu nào n ê n được sử dụng cho m ảng
N hưng nếu có m ột hồn hợp các kiểu chẳng h ạ n n h ư n h iề u sô' nguyên, sô' có
độ ch ín h xác đơn v à sô' có độ ch ín h xác kép, M icrosoĩt V isual Studio sẽ chọn
m ột kiểu dữ liệu cho m ả n g đủ lớn để chứa t ấ t cả giá trị T ro n g n h iề u trường hợp, đây sẽ là kiểu dữ liệu Object bởi vì các biến (và các m ản g ) O bject được
th iế t k ế đậc b iệ t để chứa b ấ t kỳ kiểu dữ liệu
Câu lệ n h sau đây k h ai báo m ột m ảng có tê n là In v e s tm e n ts v à sử dụng
m ột trực k iệ n m ả n g d ể th ê m bốn giá trị vào m ả n g k h i nó được tạo Vì kiểu
Trang 11C h ư d n g 1 1 : S ử d ụ n g c á c m ả n g đ ể q u ầ n lý d ữ liệ u s ổ v à c h u ò i _ 15
không được xác định, Visual B asic đ ánh giá các p h ầ n tử m ản g và quyết
đ ịn h rằ n g tro n g trường hợp này kiểu Object th ì th íc h hợp n h ấ t
Dim investm entsO = (5000, 20350, 499.99, 10000}
-Nếu xác lập Option Infer của trình biên dịch được xác lập sang On, kiểu Double sẽ đưỢc xác định khi câu lệnh ở ưên đưỢc thực thi, Xem chương 1 đ ể ^ ^ t r Ợ ^ ú p đ i ề u chỉnh xác lập nàỵ^
M ột m ả n g đ a chiều cũng có th ể được k h a i báo b ằ n g cách n ày m ặc dù bạn cần cẩn t h ậ n liệ t kê các ph ần tử tro n g th ứ tự phù hợp (nghĩa là h à n g 0 trước tiê n rồi đ ến h à n g 1 h àn g 2 ), Ví dụ, câu lệ n h sau đây k h a i báo m ột
m ản g h a i chiều có tê n là Rectangle v à gán bốn giá tr ị sa n g m ảng;
Dim Rectangle = ({10, 20}, {50, 60})
M ảng n à y có h a i h à n g và hai cột P h ầ n tử m ản g (0,0 - đó là h à n g 0 cột 0) b ây giờ chứa m ột giá trị 10 và p h ầ n tử (0,1 ' đó là h à n g 0 cột 1) bây giờ chứa m ột g iá trị 20 C ũng chú ý rằ n g có b a tậ p hợp dấu ngoặc được sử dụng tro n g p h ầ n k h a i báo; những dâu ngoặc n ày làm rõ các p h ần tử nào đang được gán v à giữ chúng tro n g th ứ tự phù hợp
Ả nh chụp m à n h ìn h dưới đây m in h họa V isual Studio Code E d ito r với ba
ví dụ về các p h ầ n k h ai báo trực k iệ n m ảng đâ được tr ìn h bày tro n g ph ần
này Chú ý rằ n g Code E d ito r à c h ế độ debugging (hoặc b re a k m ode) và cửa
sổ W atch x u ấ t h iệ n và h iể n th ị nội dung của m ản g W aiters (C h ế độ Debug- ging mode v à cửa sổ W atch đã được giới th iệu tro n g chưcmg 8) M ột vòng lặp For N ex t cũng đan g được sử dụng để h iể n th ị nội dung của m ảng
W aiters tro n g m ộ t hộp thông báo m ặc dù b ạ n k h ô n g th ể th ấ y k ế t quả của
vòng lập n à y tr ê n m à n h ìn h này Các vòng lặp F o r N e x t là n h ữ n g công
cụ h o àn h ảo để xử lý các m ảng n hư bạn sẽ th ấ y tro n g p h ầ n tiế p theo
Trang 121 6 C h ư ớ n g 11: s ử d ụ n g các m ảng đ ể quản lý d ữ liệ u s ố và chuôi
Tạo m ột m ảng có kích cỡ cố đ ịn h đ ể chứa các n h iệ t độ
B ài tậ p sau đây sử dụng m ột m ả n g m ột chiều có tê n là T em p e ra tu re s để ghi chép các n h iệ t độ cao h à n g ng ày cho m ột tu ầ n lễ 7 ngày Chương trìn h
m inh họa b ạ n có th ể sử dụng m ột m ản g n h ư t h ế nào để lưu tr ữ v à xử lý m ột nhóm các giá tr ị liên q uan tr ê n m ột form B iến m ản g T e m p e ra tu re s được
k h ai báo ở p h ầ n tr ê n cùng của form và sau đó các n h iệ t độ được g án sang
m ả n g b ằn g việc sử dụng m ộ t h à m InputBox và m ột vòng lặ p F or N ex t m à
b ạn đ ã học ở chương 7 Bộ đếm vòng lặp (loop counter) được sử dụng để
th a m chiếu m ỗi p h ầ n tử tro n g m ảng Sau đó các nội dung m ả n g được hiển
th ị tr ê n form b ằn g việc sử dụng m ộ t vòng lặ p For N ext v à m ộ t đô'i tượng hộp tex t N h iệ t độ cao tru n g b ìn h cũng được tín h v à được h iể n th ị
Các hàm UBound và LBound
Đ ể đ ơ n g iả n h ó a v iệ c làm v iệ c v ớ i m ả n g , c h ư ơ n g trìn h F ỉx e d A r r a y sử
đ ụ n g hàm U B o u n d đ ể k iể m tra tìm g iớ i h ạ n tré n h o ặ c giá trị in đ e x c a o n h ấ t
c ủ a m ả n g V ớ i U B o u n d b ạ n c ó th ể x ử lý c á c m ả n g m à th a m c h iế u đ ế n c á c
c â u lệ n h k h a i b á o đ ã đ ịn h n g h ĩa c h ín h x á c b a o n h iê u giá trị m à m ả n g sẽ
c h ứ a H à m L B o u n d c ó m ố i iiê n h ệ c h ặ t c h ẽ x á c n h ậ n g iá trị in d e x d ư ớ i
h o ặ c g iớ i h ạ n d ư ớ i c ủ a m ộ t m ả n g , c ũ n g c ó s ẵ n c h o bạn d ư ớ i d ạ n g m ộ t tính
n ă n g c ủ a c á c p h iê n b ả n irư ớ c đ ó c ủ a V is u a l B a s ic T u y n h iê n , b ở i v l bây
g iờ tấ t c ả m ả n g V is u a l B a s ic c ó m ộ t g iớ i h ạ n d ư ớ i là z e ro (0 ), h à m c h ỉ v iệ c trả v é m ộ t g iá trị là 0 C á c hàm U B o u n d v à L B o u n d c ó cú p h á p
L B o u n d (A rra y N a m e )
U B o u n d (A rra y N a m e )
T ro n g đ ó A rra y N a m e là tê n c ủ a m ộ t m ả n g đ ã đ ư ợ c khai b á o tro n g p ro je c t.
Trang 13C h ư ớ n g 1 1 : S ử d ụ n g c á c m à n g đ ể q u ả n lý dữ liệ u số' v à c h u ỗ i _ 1 7
S ử đụng một mảng có kích cỡ c ố định
1 K hởi động V isuaỉ Studio, và tạo m ột project Visual Basic Windows
F o rm s A pplication mới có tê n là M y F ix e d A r r a y
2 Vẽ m ột đối tượng hộp te x t tr ê n form
3 Xác lập thuộc tín h M ultilìne của đối tượng T extB oxl sa n g T rue sao cho b ạ n có th ể đ ịn h lại kích cỡ đối tượng
4 Đ ịn h lại kích cỡ đô'i tượng hộp te x t sao cho nó lấ p đầy p h ầ n lớn form
5 Vẽ h ai đô'i tượng n ú t rộng trê n form bên dưới đô'i tượng hộp te x t được đ ịn h hướng cái này b ên cạnh cái kia
6 Xác lậ p các thuộc tín h sau đây cho form và các đô'i tượng của nó;
Đ ô i tưỢng T huộc tín h Xác lập
F o rm trô n g giống như form được m inh họa tro n g ả n h chụp m àn
h ìn h dưới đây:
P b ttd A rĩíy T e m p ỉ Ị ' o 1 l r? 1 9 ^ ^
Ertìei Tem;iỉ ỉ D iỉựạyTem ci” ]
7 T ro n g Solution Explorer, n h ấp n ú t View Code để h iể n th ị Code
E ditor,
8 Cuộn đến p h ầ n tr ê n cùng của m ã chương tr ìn h của form , và ngay bên dưới câu lệ n h Public C lass F o rm l, gõ n h ậ p p h ần k h a i báo m ảng sau đây:
Trang 141 8 C h ư ơ n g 11: s ử d ụ n g c á c m ả n g đ ể q u ả n lý d ữ liệ u s ố v à c h u ỗ i
Dim Teperatijres(0 To 6) As Single
Câu lệ n h n ày tạ o m ột m ản g có tê n là T em p e ra tu re s (có kiểu Single) chứa bảy p h ầ n tử dược đ án h số từ 0 đến 6 Bdi vì m ả n g đ ã được k h a i
báo ở p h ầ n tr ê n cùng của form, nó có sẵ n tro n g t ấ t cả th ủ tục sự k iệ n
Vòng lặ p For N ext sử dụng b iế n bộ đ ếm số nguyên s h o r t i là m ột index m ản g để tả i các n h iệ t dộ vào các p h ầ n tử m ả n g 0 d ến 6 T hay
vì sử dụng cú p h áp vòng lặ p F or được đơn g iả n hóa:
For i * 0 to 6
Để xử lý m ảng, m ột cú p h áp hơi phức tạ p được chọn đòi hỏi h àm ƯBound để đ ạ t được sự lin h h o ạt tro n g tưcmg lai Cấu trú c vòng lặp For:
For 1 a 0 To UBound(Temperatures)
Q uyết đ ịn h giới h ạ n trê n của m ảng bằng việc sử dụng cấu trú c Ubounđ
Kỹ th u ậ t này lin h h o ạ t h ơ n bởi vì nếu m ản g được m ở rộ n g hoặc được giảm sau đó, vòng lặp For tự động tự diều ch ỉn h s a n g kích cỡ m ảng mới
Để đ iề n các n h iệ t độ vào m ảng, th ủ tục sự k iệ n sử dụng m ộ t h àm InputB ox, để h iể n th ị ngày h iệ n h à n h b ằn g việc sử dụng bộ đếm vòng lặp For
11 H iển th ị lạ i form , v à sau đó n h ấ p đôi n ú t D isplay T em ps (Button2)
Trang 1512 Gõ n h ậ p các câu lện h sau đây trong th ủ tục sự k iệ n Button2_Click;
Dim Result As string
Dim i As Short
Dim Total As Single = 0
Result = "High temperatures for the week:” & vbCrLí & v b C rư
Result = Result & vbCrLt & _
"Average temperature; “ & Format(Total / 7, “ 0.0")
T e xtB oxl.T ext = Result
C h ư ớ n g 11: S ử d ụ n g các m ảng để quản lý dữ liệu sô' v à chuỗi 19
T hủ tục sự kiện n ày sử dụng vòng lặp For N ext để xoay vòng theo chu k ỳ qua các p h ầ n tữ trong m ảng và nó th ê m m ỗi p h ầ n tữ tro n g
m ả n g vào m ột biến chuỗi có tê n là Resưlt được k h a i báo ở p h ầ n trê n cùng của th ủ tục sự kiện M ột scT chuỗi trực k iệ n , h ằ n g v à to á n tử
g hép chuỗi (&) đã được sử dụng để đệm và đ ịn h d ạn g chuồi b ằn g việc
sử dụng các ký tự tr ở về đầu dòng {vbCrLf), ký tự ta b (vbTab), và các tiê u đề ch ín h (heading).H ằng vbCrLf, được sử dụng ở đây lẩ n đầu tiê n chứa ký tự trở về d ầ u dòng v à ký tự chuyển dòng và là m ột cách hiệu quả để tạo các dòng mới H ằng vbTab của việc sử dụng ở đây
lầ n đầu tiê n để đ ặ t m ột sô' khoảng cách nào đó giữa các giá trị ngày
v à n h iệ t độ tro n g chuỗi Result ở cuối th ủ tục lưu trữ , m ộ t giá trị tru n g b ìn h cho các n h iệ t dộ được quyết đ ịn h và chuỗi sau cùng được
g á n vào thuộc tín h T ext của đô'i tượng hộp tex t, n h ư được m in h họa tro n g câu lệ n h này:
T e xtB oxl.T ext = Result
13 N h ấ p n ú t Save All trê n th a n h công cụ S ta n d a rd đ ể lưu project: Xác
Trang 1614 N h ấp n ú t S ta r t D e b u g g in g trên th a n h công cụ S ta n d a rd đ ể chạy
chương trìn h
15 N h ấp n ú t E n t e r T e m p s , và khi được n h ắc bởi h à m InputB ox, gõ
n h ậ p 7 n h iệ t độ khác nhau
H ộp th o ạ i h à m InputBox trông như sau:
2 0 C h ư ờ n g 11: sử d ụ n(j các m ảng đ ể quản lý d ữ liệ u s ố v à chuỗi
Diyl
Eníet íhe dôy's \'I*QỲỈ lempeta^uie
1 0< í Canceỉ 1
16 Sau k h i b ạ n go n h ập các n h iệt độ, n h ấ p n ú t D i s p l a y T e m p s
Sử dụng m ảng, Visual Basic hiển th ị từng n h iệ t độ tro n g hộp te x t và
in m ột giá trị tru n g bình ỏ cuối M àn h ìn h trô n g tư ơ ng tự n h ư sau:
^ Enieí T cmps i 0 isplây T esTịs
17 N h ấp n ú t C lo s e trê n fortn để k ết th ú c chương trìn h
Visual B asic g iải quyết vấn dề này m ột cách hiệu quả b ằ n g m ột khung chứa co g iã n đặc b iệ t được gọi là một m ản g động (dynam ic array) Các
Trang 17m ảng động được đ ịn h chiều vào thờ i gian chạy khi người dùng xác đ ịn h của
m ảng hoặc k h i logic m à b ạn th êm vào chương trìn h quyết đ ịn h m ột kích cỡ
m ảng dựa vào các điều kiện cụ thể Đ ịnh chiều cho m ộ t m ản g động đòi hỏi
m ột sô’ bước bởi vì m ặc dù kích cỡ của m ảng không được xác đ ịn h cho đến
kh i chương tr ìn h chạy, b ạn cần "giữ chỗ trước" cho m ản g vào thờ i gian
th iế t kế Đ ể tạo m ột m ản g động, b ạn làm theo n h ữ n g bước cơ b ả n sau đây:
1 Xác đ ịn h tê n v à kiểu của m ản g trong chương tr ìn h vào thờ i gian
th iế t kế, bỏ qua sô' p h ần tử tro n g mảng Ví dụ, để tạo m ột m ảng động có tê n là T em peratures, bạn gỗ nhập:
Dim Temperatures{) As Single
2 T h êm m â để quyết định số p h ầ n tử m à sẽ n ằ m tro n g m ản g vào thời
g ia n chạy B ạn có th ể nhắc nhở người dùng b ằ n g việc sử dụng m ột
h à m InputB ox hoặc m ột đối tượng hộp text, hoặc b ạ n có th ể tín h các
n h u cầu lưu tr ữ của chương trìn h bằng việc sử dụng các thuộc tín h hoặc logic khác Ví dụ, các câu lệnh sau đây n h ậ n được kích cỡ m ảng
từ người dùng và gán nó sa n g biến Days có kiểu Short:
Dim Days As Short
Days = lnputBox("How many days?'', "Create Array")
3 Sử d ụng biến tro n g m ột câu lệ n h ReDim để d ịn h chiều cho m ảng, trừ
đi 1 bởi vì các m ảng dựa vào zero Ví dụ, câu lệ n h sau đây xác lập kích cỡ của m ản g T em peratures vào thời gian chạy b ằn g việc sử dụng biến Days:
ReDim Temperatures{Days - 1)
C h ư ớ n g 11: Sử d ụ n g c á c m ảng để quản lý dữ liệu sổ v à chuỗi 21_
Q U A N T R Ọ N G
Vổí ReDim, bọn khỗng nễn cấ thay đổi (ố chiều irong mỗÍ mâng mâ bqn đđ khai báo irước dó
4 Sử dụng h àm UBound dể quyết định giới h ạ n tr ê n m ột vòng lặp For N ext v à xử lý các p h ầ n tử m ảng k h i cần th iế t n hư được m inh
h ọ a ở đây:
For i = 0 to Ubound(Temperatures)
Temperatures(i) = lnputBox(Prompt, Title) Next
Trang 18T rong bài tậ p tiế p th eo b ạn sẽ sử dụng các bước n à y để ch ỉn h sửa chương tr ìn h Fixed A rray sao cho nó có th ể xử lý b ấ t kỳ số n h iệ t độ
Dim Days As Integer
B iến số nguyên D ays sẽ được sử dụng để n h ậ n dữ liệu đầu vào từ người dùng v à để đ ịn h chiều cho m ản g động vào th ờ i gian chạy
5 C uộn xuô'ng tr o n g Code E d ito r đ ể h iể n t h ị th ủ tụ c sự k iệ n
B u tto n l_ C lick và ch ỉn h sửa m ã sao cho nó trô n g giống n h ư sau đây, (Các p h ầ n tử th a y đổi hoặc dược th ê m vào sẽ được tô bóng)
Dim Prompt, Title As strin g
Dim i As Short
Prom pt = "E n te rth e day’s high temperature."
Days = lnputBox("How many days?” , “ Create Array” )
lí Days > 0 Then ReDim Temperatures(Days - 1 )
For i = 0 To UBoiJnd{Temperatures)
Title = “ Day “ & (i + 1) Temperatures(i) = lnpưtBox(Prompt, Title) Next
D òng th ứ tư v à dòng th ứ năm nhắc nhở người dùng về số n h iệ t độ
m à người dùng m uôn lưu v à sau đó dữ liệu đầu vào của người dùng được sử d ụng để đ ịn h chiều cho m ột m ản g động Câu trúc quyết định
2 2 C h ư d n g 11; S ũ dụng c á c m ả ng để quàn íý dO liệ u sò' và chuỗi
Trang 19If T hen dược sử dụng để xác n h ận rằ n g số ngày lớn hơn zero (Đ ịnh chiều tro n g m ột m ảng với m ột số nhỏ h ơ n zero hoặc bằn g zero
sẽ tạ o ra m ột lỗi) Bởi vì index 0 của m ản g được sử dụng để lưu trữ
n h iệ t dộ cho ngày đầu tiên , biến Days được giảm xuống 1 k h i định chiều cho m ảng B iến Days không được cần đến để quyết đ ịn h giới
h ạ n tr ê n của vòng lặ p For N ext - n h ư tro n g ví dụ trước, h àm Ubound được sử dụng th a y vào đó
6 C uộn xuống tr o n g Code E d ito r đ ể h iể n t h ị th ủ tụ c sự k iệ n Button2_Click C hỉnh sửa m ã sao -cho nó trô n g giống n h ư thường
tr ìn h dưới đây (Các p h ần tử được th ay đổi sẽ được tô bóng)
Dim Result As string
Dim i As Short
Dim ĩo ta l As Single = 0
Result = “ High temperatures:” & vbCrLí & vbCrLí
For i = 0 To UBound(Temperatures)
Temperatures(i) & vbCrLí Total = Total + Temperatures(i) Next
Result = Resiilt & vbCrLí & _
“ Average temperature: “ & Format{Total / Days, “ 0.0” )
T e x tB o x U e x t a Result
B iến Days th a y th ế số 7 tro n g phép tín h n h iệ t độ tru n g b ìn h ở cuối
th ủ tục sự kiện Tiêu đề "High tem peratures" m à sẽ h iể n th ị tro n g hộp te x t cũng đã được biên tập
7 H iển th ị form
8 T hay đổi thuộc tín h T ext của F o rm l th à n h "Dynam ic Array",
9 Lưu các th a y đổi sang đĩa
Trang 20b ìn h của chúng M àn h ìn h trô n g tưcmg tự n h ư ả n h chụp m à n h ìn h dưới đây;
« ? D y n a m i e A r r a y ' '
Ki^ ỉempeíâỉưes
O ò ọ \ 72 74
0 ^ 3 71 69
D ^ 5 70
A v e t â g e ( e m p 6 t d t u e 71 2
I Dgpặ^Tgmp!
15 N h ấp n ú t C lo s e trê n form để k ế t thúc chương trìn h
B ạn đ ã thực h iệ n sử dụng h a i loại m ản g phổ b iế n tro n g lậ p trìn h Visual Basic K hi b ạn v iết các chương tr ìn h riê n g của m ìn h chảng bao lâu b ạn sẽ sử dụng các m ản g lớn hơn n h iều n h ư n g n h ữ n g khái niệm th ì y n h ư n h au và b ạn sẽ ngạc n h iê n k h i th â y V isual B asic có
th ể h o àn th à n h các p hép tín h liên quan đến m ả n g n h a n h n h ư th ế nào
Giữ gìn nội dung mảng bằng việc sử dụng ReDim Pre- serve
T rong bài tậ p trước, bạn đã sử dụng câu lệ n h ReDim đ ể xác đ ịn h kích cỡ của m ột m ản g động vào thờ i gian chạy Tuy n h iên , m ộ t k h u y ế t điểm tiềm
Trang 21ẩ n k ế t hợp với câu lệ n h ReDim là nếu bạn tá i đ ịn h chiều tro n g m ột m ảng
đ ã có dữ liệu tro n g đó, tấ t cả dữ liệu h iệ n có bị m ấ t không th ể tru y tìm lại được Sau k h i câu lệ n h ReDim được thực th i, nội đung của m ột m ản g động được xác lập sang giá trị m ặc định của chúng, ch ẳ n g h ạ n như zero hoặc null P hụ thuộc vào quan điểm của bạn, dây có th ể được xem là m ột tín h
n ăn g hữu dụng để làm rỗng nội dung của các m ản g hoặc nó có th ể là một tín h n ă n g gây khó chịu đòi hỏi m ột giải pháp
T h ậ t m ay th ay , Visual B asic cung cấp từ k hóa P re serv e m à b ạn có th ể sử dụng để giừ g ìn dữ liệu tro n g m ộ t m ảng k h i b ạ n th a y đổi các chiều của nó
Cú p háp cho từ khóa P reserv e n hư sau:
ReDim Preserve Arrayname{Dim1Elements, Dim2Elements, .)
T rong m ộ t câu lệnh ReDim như vậy, m ản g p h ải tiế p tục có cùng số chiều
v à chứa cùng m ột kiểu dữ liệu Ngoài ra, có m ộ t diều k iệ n là b ạ n chỉ có th ể định lạ i k íc h cỡ chiều m ảng sau cùng Ví dụ, nếu m ản g có h a i hoặc nhiều chiều, b ạn có th ể th a y đổi kích cỡ của chỉ chiều cuối cùng và vẫn giữ p n nội dung của m ảng (Các m ảng m ột chiều tự động vượt qua cuộc te s t này, do đó
b ạn có th ể tự do mở rộng kích cỡ của m ản g động b ằn g cách sử đụng từ khóa Preserve)
Các ví dụ sau đây m inh h ọ a cách b ạn có th ể sử dụng P re serv e để tà n g kích cỡ của chiều sau cùng tro n g m ột m ản g động m à k h ô n g xóa b ấ t kỳ dữ liệu h iệ n có chứa tro n g mảng
Nếu lúc đầu b ạn đã kh ai báo m ột m ảng chuỗi dộng có tê n là Philoso-
p h ers b ằ n g việc sử dụng cú pháp;
Dim PtìilosophersO As strin g
B ạn có th ể tá i định chiều cho m ảng và th ê m dữ liệu vào nó b ằng việc sử dụng m ã tương tự hư sau:
ReDim Philosophers(200)
Philosophers(200) = 'David P robsr
B ạn có th ể mở rộng kích cỡ của m ảng P hilosophers th à n h 301 p h ầ n tử (0-300), và giữ gìn nội dung h iệ n có b ằng việc sử dụng cú p h áp sau đây:
DeDim Preserve Philosophers(300)
C h ư ơ n g 11: S ử dụng c á c m ảng dể quản lý đữ liệu số v à chuỗi 25
Trang 222 6 _ C h ư d n g 1 1 : S ử d ụ n g cá c m ả n g đ ể q u ằ n lý d ữ liệ u s6' và c h u ỗ i
Sử dụng ReDim cho các mảng ba chiều
M ột ví dụ phức tạ p hơn đòi hỏi một m ản g b a chiều sử dụng m ột cú p háp tương tự H ãy tưởng tượng rằ n g bạn muôn sử dụng m ột m ả n g ba chiều, có
độ ch ín h xác đơn, dấu động có tê n là myCube tro n g chương trìn h B ạn có
th ể k h ai báo m ản g m yCube b ằng việc sử dụng cú p h á p sau đây:
Dim myCube( ) As Single
Sau đó b ạ n có th ể tá i đ ịn h chiều cho m ản g và th ê m dữ liệu vào nó b ằng việc sử dụng m ã sau đây:
ReDim myCube(25, 25, 25)
myCube{10, 1 , 1 ) = 150.46
m à sau đó b ạn có th ể mở rộng kích cỡ của chiều th ứ b a tro n g m ảng (tro n g k h i giũ gìn nội dung cùa m ảng) b ằng việc sử dụng cú p háp sau đây:
ReDim Preserve myCube(25, 25, 50)
Tuy n h iê n , tro n g ví dụ này, chỉ chiều th ứ b a mới có th ể dược mở rộng - chiều th ứ n h ấ t và chiều th ứ hai không th ể được th a y đổi nếu b ạn tá i định chiều cho m ản g b ằn g việc sử dụng từ khóa P reserv e Việc cố th a y đổi kích
cỡ của chiều th ứ n h ấ t hoặc chiều thứ hai tro n g ví dụ này sẽ tạo ra m ột lỗi run-tim e k h i câu lệ n h R eD im Preserve được thực th i
T hử n g h iệm m ộ t ch ú t với ReDim P reserve, v à b ạ n th ấ y b ạn có th ể sử đụng nó n h ư th ế nào đ ể là m cho các m ảng riê n g của b ạ n tr ở n ên lin h h o ạt
v à m ạ n h mẽ
dụng các phương thức trọng class Array
T rong các p h ầ n trước, b ạn đã học về việc sử dụng các m ản g để lưu trữ
th ô n g tin tro n g quá tr ìn h thực th i chương trìn h T ro n g p h ầ n này, b ạn sẽ học về việc sử dụng các phương thức tro n g class A rray của NET Fram e- work, m à b ạ n có th ể sử dụng để n h an h chóng p h â n loại, tìm kiếm và đảo ngược các p h ầ n tử tro n g m ộ t m ảng cũng n hư thực h iệ n n h ữ n g chức n àng khác Chương tr ìn h m ẫu được tạo m inh họa n h ữ n g tín h n ă n g này làm việc đặc b iệ t tố t n hư t h ế nào với các m ảng Tất lớn B ạn cũng sẽ học cách sử dụng control ProgressB ar
Class A rray
K hi b ạ n tạ o các m ản g tro n g Visual Basic, b ạ n sử dụng m ột class cơ sở được đ ịn h n g h ĩa bởi V isual B asic để thực th i các m ả n g b ên tro n g các chương
Trang 23tr ìn h do người dùng tạo ra Class A rray này cũng cung cấp m ột bộ sưu tập các phương thức m à b ạn có th ể sử đụng để xử lý các m ả n g tro n g k h i chúng đang h o ạ t động tro n g các chương trìn h Các phương thức hữu dụng n h ấ t bao gồm A rray.Sort, A rray.Pind, A rray.Reserve, A rray.Copy, v à A rray.C lear
B ạn có th ể đ ịn h vị những phương thức thú vị k h á c b ằn g việc th ử nghiệm với class A rray tro n g Code E ditor {băng cách sử d ụng M icrosoít IntelliS ense)
v à b ằ n g cách th a m k hảo tà i liệu Visual Studio H elp Các phương thức class
A rray h o ạ t động giống nhiều n h ư các phương thức NET F ram ew ork m à
b ạ n đ ã sử dụng tro n g sách này; n g h ĩa là chúng được gọi th eo tê n và (trong trường hợp này) đòi hỏi m ột tê n m ảng hợp lệ dưới d ạng m ột đối số Ví dụ,
để p h â n loại m ột m ản g các n h iệ t độ (chẳng h ạ n n h ư m ảng T em peratures
m à b ạ n đ ã tạo tro n g bài tậ p vừa rồi), bạn sử dụng cú p h áp sau đây:
Array.Short(Temperatures)
B ạn thực h iệ n m ột lện h gọi n h ư vậy sau k h i m ả n g T em p eratu res đã được k h a i b áo và được điền vào dữ liệu tro n g chương trìn h K hi Visual Basic thực th i phương thức A rray.Sort, nó tạo m ột vị tr í lưu trữ tạ m th ờ i cho
m ản g tro n g bộ n h ớ v à sử dụng m ột thường tr ìn h p h â n loại đ ể tá i tể chức
m ản g th eo th ứ tự b ảng chữ cái Sau k h i việc p h â n loại h o àn tấ t, m ản g gốc được xáo trộ n th eo th ứ tự tă n g d ần với giá tr ị nh ỏ n h ấ t ở vị tr í m ả n g 0 và giá tr ị lớn n h ấ t ở vị tr í m ảng sau cùng Với ví dụ T em p e ra tu res ở trê n , việc
p h â n loại tạ o r a m ột m ảng các n h iệ t dộ h àn g ng ày được tổ chức từ m á t n h ấ t đến nóng n h ất
T ro n g b à i tậ p sau đây b ạn sẽ th ấ y các phư ơng th ứ c A rra y S o rt và
A rray.R everse có th ể được sử dụng n hư th ế nào đ ề sá p xếp lại th ứ tự n h a n h chóng m ột m ản g lớn chứa các sô' 6 chữ số được chọn ngẫu n h iê n giữa 0 và 1,000,000 B ạn cũng sẽ th ử nghiệm với control P rogressB ar, control này cung cấp sự p h ả n hồi trực quan hữu dụng cho người dùng tro n g quá trìn h
p h â n loại dài
S ử dụng các phương thức Array cho một m ảng có 3,000 phần tử
1 T rê n m enu File, n hấp o p e n Project v à sau đó m ở project A rray
C lass S orts được đ ặ t tro n g folder C :\V b lO s b s \C h a p ll
2 H iển th ị form nếu nó chưa xuất hiện
M àn h ìn h trô n g tương tự như h ìn h m inh họa dưới đây:
C h ư ơ n g 11: Sử dụng c á c m ảng đ ể quản lý dữ liệu s ố và ch u ỗ i 2 7
Trang 24F orm n ày trô n g tưcmg tự như các project trước tro n g chương n ày và
có m ộ t hộp te s t để h iể n th ị dữ liệu m ảng Tuy n h iê n , nó cũng chứa
b a n ú t đ ể xử lý các m ản g lớn và m ột đối tượng p ro g ress b a r (th a n h tiế n độ cho người dùng sự p h ả n hồi tro n g các th a o tá c m ả n g dài hơn) Sự p h ản hồi trực quan hữu dụng k h i các p h ép tín h xảy ra lâu hơn m ột v ài giây để h o àn th à n h và nếu bạn sử đụng m ã n à y để p h ân loại m ộ t m ản g có 3,000 p h ần tử m ảng, th ì chắc ch ắn sẽ hơi chậm
m ột chút
3 N h ấp th a n h tiế n độ trê n form
Đối tượng P ro g re ss B a rl được chọn trê n form và được liệ t kê trê n cửa
sổ P ro p erties Đối tượng progress b a r được tạ o b ằ n g việc sử dụng control P ro g rcssB ar trê n ta b Common C ontrols tro n g ToolBox Một
th a n h tiế n dộ được th iế t k ế để h iể n th ị tiế n độ của m ộ t sự tín h to án
b ằn g việc h iể n th ị m ột số h ìn h chữ n h ậ t m àu th íc h hợp dược sắp xếp tro n g m ột th a n h tiế n dộ n ằm ngang K hi việc tín h to á n h o àn t ấ t
th a n h chứa đầy các h ìn h chữ n h ậ t (Trong W indows 7 v à W indows
V ista, m ột hiệu ứng làm n h ẫ n được áp dụng sao cho th a n h tiế n độ
d ần dần chứa đầy m ột dãy m àu đồng n h ấ t - m ột hiệu ứng đặc b iệt
h ấ p dần) Có lẽ b ạ n đã th ấ y th a n h tiế n độ n h iề u lầ n tro n g k h i bạn đow nload các ííle hoặc cài đ ặ t các chương tr ìn h tro n g W indows Bây giờ b ạn có th ể tạo m ột th a n h tiế n độ tro n g các chương tr ìn h riên g của bạn
Các thuộc tín h quan trọ n g làm cho m ột th a n h tiế n độ làm việc là các thuộc tín h M inim um , Maximum, và Value và nhữ ng thuộc tín h này thường được xử lý sử dụng m ã chương trìn h (Các thuộc tín h progress
Trang 25C h ư ơ n g 11: s ủ d ụ n g c á c m ảng để quản lý dữ liệu s ố và ch u ỗ i 2 9
b a r k h ác , m à b ạ n có th ể kiểm tr a tro n g cửa sổ P ro p e rties diều k h iển diện m ạo v à chức n ăn g của th a n h tiế n độ) B ạn có th ể kiểm tr a các thuộc tín h M inim um và M aximum được xấc lập n h ư th ế nào b ằng việc x em th ủ tục sự k iệ n F orm l_L oad của chương trìn h này
4 N h ấ p đôi form đê’ hiển th ị th ủ tục sự k iệ n F orm l_L oad
Đ ể m ộ t th a n h tiế n độ hiển th ị m ột chỉ báo ch ín h xác cho b iế t một
tá c vụ tín h to á n sẽ m ấ t bao lâu để h oàn th à n h , b ạn cần xác lập các
số đo tư ơ ng đối cho diểm đầu và điểm cuôl của th a n h Điều này được
h o àn th à n h b ằ n g các thuộc tín h M inim um v à M axim um được xác lập
đ ể tư ơ ng hợp p h ầ n tử cuôl cùng và p h ần tử sau cùng tro n g m ảng m à
b ạ n đ a n g xây dựng N hư đ ã ghi chú, p h ầ n tử m ản g dầu tiê n luôn là zero n h ư n g p h ầ n tử m ản g cuối cùng phụ thuộc vào kích cỡ của m ảng,
do đó h à m ư b o u n d đã được sử dụng để t r ả về số đó v à thuộc tín h
M axim um của th a n h tiế n độ được xác lập m ộ t cách phù hợp M ảng
m à b ạ n đ a n g xử lý tro n g bài tậ p n ày là R andA rray, m ột m ản g số
ng u y ên L ong được k h ai báo ban đầu để chứa 500 p h ầ n tử (0 đến 499)
5 N h ấ p n ú t S t a r t D e b u g g in g để chạy chương trìn h
Chương tr ì n h chạy v à form A rray C lass S orts tnở tr ê n m àn hình
T ro n g th ủ tụ c sự k iệ n F orm l_L oad của nó, chương tr ìn h đ ã k h ai báo
Trang 263 0 C h ư ơ n g 11; S ử d ụ n g các mảng để q u ả n lý d ư liệ u s ố và chuỗi
m ộ t m ản g có tê n là R andA rray và đà đ ịn h chiều cho nó b ằ n g 500
p h ầ n tử M ột đôl tượng progress b a r đã được đ ịn h chuẩn đ ể th e o dõi
m ột ph ép tín h 500 đơn vị (kích cỡ mảng), v à sô' 500 x u ấ t h iệ n ở bên
p h ải th a n h tiế n dộ (công việc của một đối tượng la b el và h à m UBound)
6 N h ấp n ú t F ill A r r a y
Chương tr ìn h tả i R andA rray với 500 số ngẫu n h iê n (được d ẫ n x u ất
bởi h àm Rnd) v à h iể n th ị các số tro n g hộp te x t K h i chương tr ìn h xử
lý m ả n g và đ iề n dữ liệu vào đô'i tượng hoặc te x t, th a n h tiế n độ từ từ lấp đầy m àu x a n h lá cây M àn h ìn h trô n g n h ư h ìn h m in h h ọ a dưới đây k h i tiế n tr ìn h được ho àn tất
705547
533424
573518 289562 774740 14017 760723 814490
7 fm v
45352 414032 8C2613 7S0430
r rểABạy ỉ Ị^_SofỊAỉí4ỵ ' ị_Rev»s6 j
M â tạo r a k ế t quả n à y là th ủ tục sự kiện B u tto n l_ C lick chứa các câu
lệ n h chương tr ìn h sau đây:
‘ Flll tlie array w ỉth ranđom numbers and đỉsplay in text box
Privaíe Sưb Button1_Click{ByVal sender As System.Obịect
ByVaí e As System EventArgs) Handles B ư tto n lC lick Dim i As Integer
Đ ể n h ậ n được các sô" n g ẫu n h iên vôn là các sô" nguyên, các h à m In t
và R nd đ ã được sử d ụ n g cùng với n hau n h ư tro n g chương 2 v à số
Trang 27n gẫu n h iê n được tạo r a bởi R nd được n h â n vứi 1,000,000 để có được các số nguyên vốn là sá u chữ số hoặc ít hơn Việc g á n nhữ ng sô' này vào m ản g được làm đễ d àn g b ằng việc sử d ụ n g m ộ t vòng lặ p For
N ex t với m ột index m ả n g k h ác với bộ đếm vòng lặp (i), Đ iền đầy
m ả n g là m ột th a o tác cực kỳ n h a n h ; việc g iảm tốc độ xuống (và nhu cầu về th a n h tiế n độ) gây r a do gán các p h ầ n tử m ả n g vào đối tượng
hộ p te x t mỗi lầ n m ột p h ầ n tử Điều n ày đòi h ỏ i cập n h ậ t m ột th à n h
p h ầ n giao diện người dùng tr ê n fo n n 500 lầ n v à tiế n tr ìn h m ấ t m ột
v à i giây dể h o àn th à n h Vì đối tượng p ro g re ss b a r đ ã được định chuẩn đ ể sử dụng số p h ầ n tữ m ảng là m mức tố i đ a của nó, việc gán
bộ đếm vòng lặp (i) vào thuộc tín h V alue của th à n h tiê n độ sẽ cho
p h ép th a n h h iể n th ị c h ín h xác bao n h iê u p h ầ n đ ịn h chuẩn đ ã được
h o àn th à n h
7 N h ấ p n ú t S o r t A rray.
C hương t r ì n h tu â n th e o m ộ t tiế n t r ì n h tư ơ n g tự đ ể p h â n loại
R andA rray, lầ n n ày sử dụng phương thứ c A rra y S o rt dể sắ p xếp lại
m ả n g theo th ứ tự tă n g dần (500 p h ầ n tử được liệ t k ê từ th ấ p n h ấ t
đ ến cao n h ất) M àn h ìn h trô n g tương tự n h ư sau:
'Ún' t ' '' ■
C h ư d n g 11: sử d ụ n g c á c m ảng để quản lý dư liệ u s ố v à c h u ô i 31
241
2605 4GỊ9
10Ổ3
ÚÕ17
14ál isea2
157Ũ3 16297 16383 18753 22S29 2824S
28S85
[ f i Ì Ã i t i y Ị S o i l A t t a y f
M ã tạ o r a k ế t quả n ày là th ủ tục sự k iệ n B utton2_C lick chứa các câu
lệ n h chương tr ìn h sau đây:
‘Sort the array using the Array.Sort method and display
Private Sub Button2_Click{By\/al sender As System.Obịect, _
ByVal e As System EventArgs) Handles Button2.Click
Dim i As Integer TextBox1.Text = “ ”
Trang 283 2 _ C h ư d n g 1 1: sử d ụ n g các m ả n g dể q u ả n lý dO liệ u s ố v à chuỗi
Array.Sort(RandArray) For i = 0 To UBound(RandArray)
T e x tB o x U e x í = T e x tB o x U e x t & RandArray{i) & vbC rLí ProgressBarl.Value a i 'move progress ùar
Next í End Sub
Thủ tục sự k iệ n n ày xóa sạch đô'i tượng hộ p te x t k h i người dùng
n h ấp n ú t S o rt A rray v à sau đó p h ân loại m ả n g b ằ n g việc sử dụng phương thức A rray S o rt được mô tả trước đó T iến tr ì n h p h â n loại
r ấ t n h a n h L ần nữa sự giảm tốc dộ duy n h ấ t là tá i tạo đô'i tượng hộp
te x t mỗi lầ n m ột dòng tro n g vòng lặ p For N ext, m ộ t tiế n trìn h được báo cáo bởi đôl tượng P ro g re ssB a rl v à thuộc tín h V alue của nó
H ãy xem sử dụng phương thức A rray S o rt đơn giản n h ư t h ế nào
^ n g các thanh cuộn hoặc các phím mũi tên)
M àn h ìn h trô n g tương tự n hư sau:
A rrs y C l i i ỉ ẳortV
393414 996771 993731 992572 931402 989428
96^
934253
9S404S 980003 97382S 379531 979077
Trang 29C h ư d n g 11: s ử d ụ n g c á c m à n g để q u à n lý dữ liệ u s ò v à c h u ỗ i _ w
M ã tạo r a k ế t quả là th ủ tục sự kiện B utton3_Click chứa các câu lện h chương trìn h sau đày:
‘ Reverse the order of array elements using Array.Reverse
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Hanđles ButtonS.CIick Dim i As Integer
TextBoxl ,Text = Array.Reverse(RandArray) For i * 0 To UBound(RandArray)
T e x tB o x U e x t = T e x tB o x U e x t & RandArray(i) & vbCrLí
P rogressBarlValue = i ‘ move progress bar Next i
Dim RandArray(0 To 499) As Long
11 T hay t h ế 499 tro n g câu lệnh k h ai báo m ản g b ằn g 2999
Bây giờ câu lệ n h trô n g như sau:
Dim RandArray(0 To 2999) As Long
12 C hạy lại chương trìn h để xem việc k h a i báo v à điền vào m ột m ảng 3,000 p h ầ n tử ả n h hưởng đến hiệu su ấ t chương tr ìn h n h ư th ê nào.Bởi vì xử lý 3,000 p h ần tử đòi hỏi nỗ lực hơn nhiều, V isual B asic mâ't
m ột chút th ờ i gian để cập n h ậ t lại đối tượng hộp te x t lặp đi lặp lại nhiều lầ n k h i b ạn điền đầy, p h â n loại v à đảo ngược R andA rray Tuy
n h iê n , th a n h tiế n độ th ô n g báo cho b ạ n b iế t tin tức v à b ạ n có th ể
Trang 30th ấ y rằ n g với chỉ m ộ t th a y đổi nhỏ, b ạn có th ể điều ch ỉn h n h ữ n g p
b ạ n đ à học tro n g chương này theo những tìn h huống k h á c n h a u (bí quyết là sử dụng h àm ƯBound để báo cáo kích cỡ của m án g cho các
th ủ tục sự k iệ n của chương trìn h thay vì "mâ hóa cứng" giới h ạ n trê n
tạ i 499)
B ạn có th ể th ử ng h iệm nhiều hơn nữa với chương tr ì n h n à y bằn g
v iệ c th ê m m ộ t câu lệ n h R andom ize v ào m ộ t th ủ tụ c sự k iệ n
F o rm l_ L o ad (để làm cho k ế t quả th ậ t sự ngẫu n h iê n mỗi lầ n bạn chạy chương trìn h ) hoặc bằng cách th ử các kích cỡ m ả n g và các kiểụ
p h ải th a n h tiế n độ) của chương trìn h B ạn sẽ ngạc n h iê n k h i th ấ y các h o ạ t động m ản g chạy n h a n h như th ế nào k h i k ế t q u ả không cần
h iể n th ị tr ê n form (M ột m ảng 100,000 p h ầ n tử tả i chỉ tro n g m ộ t vài giây)
Tham khảo nhanh chương 11
Đ ể Thực h iện đ iều sau đ ây
Tạo một m ảng (array) Định chiều cho m ảng bằng việc sử dụng từ
khóa Dim Ví dụ;
Dim Employees(9) As String
Tạo một m ảng public Định chiều cho m ảng bằng việc sử dụng từ
khóa Public trong một module Ví dụ:
Public Employees(9) As string
Tạo một m ãng publíc xác định Định chiều cho m ảng như được mô tả trước giới h ạn trê n và giới h ạn dưới đó, nhưng cũng sử dụng từ k hóa To Ví dụ:
Public Employees(Ũ To 9) As string
3 4 C h ư ớ n g 11: Sử dụng các mảng để quản lý d ữ liệ u số và chuỗi
_& ( ^ h ^ _ ^ ^ C Ị jạ jn ạ n g phải luôn là zero (0)
Trang 31Đ ịnh dạng các chuỗi tex t bằng Sử dụng các hàng vbC rLfvà vbTab bẽn trong
ký tự quay trở về dầu dòng và m ã chương trình {Để thêm các giá trị này
Tạo một mảng động Xác định tê n và kiểu của mảng, nhưng bỏ(dynamic array) qua sô' phần tử (Nếu m ảng có nhiều chiều,
chèn các đấu phẩy, nhưng không phải các sô' giữa các chiều Trong mã chương trìn h , xác định kích cỡ của m ảng bằng việc sử dụng câu lệnh ReDim Ví dụ:
ReDim Preserve myCube(25, 25, 50)
Sắp xếp lại thứ tự nội dung
của một mảng
Sử dụng các phương thức trong class Array của -NET Fram ew ork Để p h á n loại một mảng có tê n là RandA rray theo thứ tự tăng dần, sử dụng phương thức A rray.Short như sau;
Array.Sort(RandArray)
Trang 323 6 C h ư ơ n g 11: Sử d ụ n g các m ảng để q u ả n lý d ư liệu s ố và chuỗi
Array.Reserve(RandArray)
Để cung cáp cho người dùng
sự phản hồi trực quan trong
các phép tín h dài
Để dảo ngược thứ tự cùa m ột m ảng có tê n là
R a n d A rra y , SIÌ d ụ n g p h ư ơ n g th ứ c Array.Reserve như sau:
Thêm một control ProgressB ar vào form (Bạn có thể tìm th ấ y control ProgressB ar trên tab Common Controls của ToolBox) Xác lập các thuộc tín h M inimum, Maximum, và Value cho controi bằn g việc sử dụng mã chưcmg trình Biến bộ đếm trong một vòng lặp For N ext thường là m ột cách tố t để xác lập thuộc tín h Value
Trang 33C h ư ớ n g 12: Làm v iệ c với các tập hợp 3 7
Lòm việc với các tập hợp
Sau k h i h oàn th à n h chương này, b ạ n s ẽ có thế:
K X ử lý lập hợp Controls trên m ột/orin
^ Sử d ụ n g m ột vòng lặp For Each N ext đ ể x o a y I>òng theo cbỉi kỳ các đối tỉtợn^ trong m ột íâp hợp
u Tạo các tập hợp riêng củ a bạn đ ể q iiả n lý các URL ĩvebsite và thông tin khác
Trong chương này b ạn sẽ học cách sử dụng được gọi là các tậ p hợp (collection) tr o n g m ộ t chương tr ìn h cá c nhóm đối tượng
M icrosoít Visual Basic B ạn học cách q uản lý th ô n g tin với các
tậ p hợp v à xử lý các đối tượng tậ p hợp b ằng việc sử dụng các vòng lặp For
E ach N ext K hi b ạn k ế t hợp nhữ ng kỹ n àn g xử lý tậ p hợp với những gì
b ạ n đã học về các m ản g (array) tro n g chương 11, b ạ n sẽ có n h iều nhữ ng gì
m à b ạn cần b iế t về việc quản lý hiệu quả dữ liệu tro n g m ộ t chương tr ìn h và
b ạ n sẽ đi nhữ ng bước đi đầu tiê n tro n g việc xử lý các tậ p hợp đối tượng được phơi bày bởi M icrosoft Visual Studio 2010 và các ứng dụng W indows thông dụng
Trang 34Làm việc với các tập hợp đối tượng
T rong p h ầ n n ày b ạn sẽ học về các tậ p hợp (collection), m ộ t cơ cấu m ạ n h
để điều k h iể n đối tượng và dữ liệu khác tro n g m ột chương t r ì n h Visual Basic M icrosoft.N ET F ram ew ork duy trì m ột số tậ p hợp đối tư ợ ng chuẩn
m à b ạn c6 th ể sử dụng k h i bạn viết các chương trìn h B ạ n có t h ể sử dụng Visual Studio đ ể duyệt hệ thông nhằm tìm các tậ p hợp v à dối tư ợ ng úng dụng khác
B ạn đã b iế t rằ n g các đối tượng trê n m ột form được lưu tr ữ cùng với n hau tro n g cùng m ột file N hưng b ạn có b iết rằn g Visual B asic cũng xem nhữ ng đối tượng là các th à n h viên của cùng m ột nhóm h ay không? T ro n g th u ậ t
ngữ V isual Studio, to à n bộ tậ p hợp ăối tượng trê n m ột form được gọi là tậ p
hợp C ontrols T ập hợp Controls được tạo tự động k h i b ạ n m ở m ộ t form mới
và k h i b ạ n th ê m các đối tượng vào form, chúng trở th à n h m ộ t p h ầ n của tậ p hợp đó
Mỗi tậ p hợp tro n g m ột chương trìn h có tê n riên g của nó đ ể b ạ n có th ể
th a m chiếu nó dưới d ạn g m ột đơn vị riêng b iệ t tro n g m ã chương trìn h , Ví
dụ, b ạ n sử dụng tê n C ontrols dể th am chiếu các tập hợp đôl tư ợ ng tr ê n m ột form P hương p háp k ế t nhóm này tương tự n h ư cách các m ả n g k ế t nhóm
m ộ t d a n h sách các p h ẩ n tử lại với nhau bên dưới m ộ t tê n và giống n h ư các
m ản g V isual Basic, tậ p hợp Controls cũng dựa vào zero
N ếu có n h iề u form tro n g m ột project, bạn có th ể tạ o các b iế n public được
k ế t hợp với các tê n form và sử dụng các biến đó để p h â n b iệ t m ộ t tậ p hợp
C ontrols với m ột tậ p hợp C ontrols khác {Bạn sẽ học th ê m về việc sử dụng các biến public để lưu tr ữ dữ liệu form trong chương 14), T h ậ m chí b ạn có
th ể th ê m các control b ằn g lập trìn h vào tập hơp C ontrols tro n g m ộ t form
Tham chiếu các dôi tượng trong một ỉập hợp
B ạn có th ể th a m chiếu các đối tượng trong một tậ p hợp hoặc các th à n h
p h ầ n riê n g lẻ của tậ p hợp b ằng việc xác đ ịn h vỊ tr í in d ex của đối tượng tro n g nhóm V isual B asic lưu trữ các đối tượng tậ p hợp th e o th ứ tự đảo ngược với th ứ tự m à chúng đã được tạo, đo đó bạn có th ể sử dụng "thứ tự ra đời" của m ột dối tượng đ ể th a m chiếu đối tượng một cách riê n g lẻ hoặc bạn
có th ể sử dụng m ột vòng lặp để bước qua m ột số đòi tượng, Ví dụ, để n h ận dạng đối tượng sau cùng được tạo trê n một form , b ạn có th ể xác đ ịn h inđex
0 (zero) n h ư dược m in h họa tro n g ví đụ này:
Controls{0).Text = "Business"
3 0 C h ư ơ n g 12: Làm v iệ c v ớ i c á c tậ p hợp
Trang 35Câu lệ n h n ày xác đ ịn h thuộc tín h T ext của đối tượng sau cùng trê n form
sa n g "B usiness" (Đối tượng k ế cuối dược tạo có m ột index là 1, đối tượng k ế cuối được tạ o có m ộ t in d ex là 2 ) Xem xét logic n ày là điều quan trọ n g là
b ạn k h ô n g luôn luôn k ế t hợp m ột đối tượng cụ th ể tr ê n form với m ột đối tượng index, bởi vì n ếu m ột đối tượng được th êm vào tậ p hợp, đối tượng mới
m a n g vỊ t r í in d ex 0 v à các đối tượng index còn lại được tă n g lê n 1
Vòng lặ p F or N ext sau đây sử dụng m ột hộp th ô n g báo để h iể n th ị các
tê n của 4 control sau cùng được th êm vào m ột form:;
Dim i As Iníeger
For i = 0 To 3
M sgBox(Controls(i).Nam e) Next i
C hú ý r ằ n g vòng lặ p này được r a lệnh xoay vòng th eo chu kỳ từ 0 đến 3 bởi vì đối tượng control sau cùng được th êm vào m ộ t form n ằm ở vị tr í 0
T ro n g p h ầ n tiế p theo b ạn sè học m ột phương p h áp hiệu quả hơn để v iết
m ộ t vòng lặp,
V iế t các vòng lặp For Each Next
M ặc dù b ạ n có th ể th a m chiếu các th à n h viên của m ột tậ p hợp m ột cách riê n g lẻ, n h ư n g cách hữu dụng n h ấ t dể làm việc với các đối tượng tro n g m ột
tậ p hợp là xử lý chúng dưới dạn g m ột nhóm Thực tế , lý do các tậ p hợp h iệ n hữu là để b ạ n có th ể xử lý các nhóm đối tượng m ột cách hiệu quả Ví dụ, có
th ể b ạn m uốn h iể n th ị, di chuyển, p hàn loại, đổi tê n hoặc đ ịn h lại kích cỡ
cả m ộ t tậ p hợp đối tượng cùng m ột lúc
Đ ể g iải q u y ết loại tá c vụ này, bạn có th ể sử dụng m ột vòng lặp đặc b iệt được gọi là F o r E ach N ext để xoay vòng theo chu k ỳ qua các đối tượng tro n g m ộ t tậ p hợp m ỗi lầ n m ột đối tượng Một vòng lặ p F o r E ach N ext tương tự n h ư m ộ t vòng lặp For.- N ext Khi m ột vòng lặ p F o r E ach N ex t được sử d ụ n g với m ột tậ p hợp Controls, nó trô n g n h ư sau:
Dim C trlVar As Control
For Each CtrlVar In Controls
process object Next CtrlVar
C h ư d n g 1 2 : Làm v iệ c v ớ i các tậ p hợp ^
Trang 364 0
B iến C trlV ar được k h a i báo là m ột kiểu C ontrol v à đ ạ i d iệ n cho đối tượng h iệ n h à n h tro n g vòng lặ p For Each N ext C ác C o n tro l là các tậ p hợp được giới th iệ u trước đó đại diện cho tấ t cá đối tư ợ ng control tr ê n form
h iệ n h à n h P h ầ n th â n của vòng lập được sử dụng để xử lý các đối tượng riê n g lẻ của tậ p hợp Ví dụ, có th ể bạn thay đổi thuộc tín h E n ab le đ , Left, Top, T ext, hoặc V isible của các đôi tượng trong tậ p hợp, hoặc có th ể bạn
m uôn liệ t kê tê n của m ỗi đối tượng trong một hộp d a n h sách
_ ChUOng 12: L à m v iệ c v ớ i c á c tậ p hợp
Thử nghiệm với các đối tượng trong tập hợp C on trols
T rong các b ài tậ p sau đây b ạn sẽ sử dụng m ã chương tr ì n h đ ể xử lý các
từ tr ê n m ột form b ằn g việc sử dụng tập hợp Controls P ro je ct m à b ạ n sẽ tạo
sẽ có b a đối tượng n ú t (button) v à b ạn sẽ tạ o các th ủ tục sự k iệ n th a y đổi các thuộc tín h T ex t của mỗi đô'i tượng, di chuyển các đối tượng s a n g bên phải
v à xử lý đối tượng tro n g nhóm m ột cách đặc biệt Chương tr ì n h sẽ sử dụng
b a vòng lặp F o r E ach N ext d ể xử lý các đối tượng m ồi lầ n người dùng
2 Sử dụng control B utton d ể vẽ ba đối tượng n ú t n ằ m ở p h ía bẽn trá i
form n h ư được m in h h ọ a ở đây;
Trang 37C h ư ơ n g 1 2 : L à m v iệ c v ớ i c á c tậ p h ợ p 41
4 N h ấ p đôi đối tượng n ú t đầu tiê n (B u tto n l) tr ê n form
T h ủ tục sự kiện B uttonl_C lick x u ất h iệ n tro n g Code E ditor
5 Gõ n h ậ p các câu lện h chương tr ìn h sau đầy:
For Each Ctrl In Controls
ctrl.T ext = ■Click M e!’
Next
Vòng lặp F or E ach N ext sau đây bước qua tậ p hợp C ontrols trê n
fo rm mỗi lầ n m ột control và xác lậ p thuộc tín h T ex t của control sang
"Click Me!” Vòng lặp sử dụng Ctrl dưới d ạn g m ộ t b iế n đô'i tượng tro n g vòng lặp m à b ạn sẽ k h a i báo ở bước tiế p theo
6 Cuộn đến p h ần trê n cùng của m ản g chương tr ìn h của form và ngay
ở t r ê n câu lệ n h Public C lass F o rm l, gõ n h ậ p câu lệ n h sau đây:
Optìorì Iníer Off
C âu lệ n h n ày cho trìn h biên dịch b iế t rằ n g nó không n ê n cố suy luận kiểu của các biến Vì b ạn sẽ k h a i báo b iế n m ộ t cách tường m in h , tùy chọn suy lu ậ n n ày không cần th iế t N ếu O ption In fe r được b ậ t và
b ạ n cố chạy m à tro n g chương này, có th ể b ạn th ấ y m ột cản h báo cho
b iế t rằ n g kiểu cho m ột biến m à b ạn đ an g sử đụng không th ể được suy luận (Để b iế t th ê n th ô n g tin , xem chương 1)
7 N gay bên dưới câu lệ n h Public C lass F o rm l, gõ n h ậ p com m ent và
p h ầ n k h a i báo biến sau đây;
Dim Ctrl As Control
P h ầ n k h a i báo biến to àn cục n ày tạo m ột b iế n tro n g kiểu class
C ontrol đại diện cho các control của form h iệ n h à n h tro n g chương
tr ìn h B ạn k h ai báo b iế n n ày tro n g vùng các p h ầ n k h a i báo k h ái
q u át của form sao cho nó hợp lệ xuyên suốt qua t ấ t cả th ủ tục sự kiện của form
B ây giờ b ạn s ẵ n sàng chạy chương tr ìn h v à th a y đổi thuộc tín h T ext cho mỗi n ú t tr ê n form
8 N h ấ p n ú t S t a r t D e b u g g ỉn g tr ê n th a n h công cụ S ta n d a rd để chạy chương trìn h
Trang 384 2 C h ư ơ n g 12: Làm v iệ c v ớ i các tập hợp
9 N h â p n ú t đầu tiê n tr ê n form (B uttonl)
T hủ tục sự k iệ n B uttonl_C lick th ay đổi thuộc tín h T ext cho mỗi control tro n g tậ p hợp Controls Form của bạn trô n g tương tự n hư sau:
th uộc tín h cô’t lòi c ủ a chương trình.
11 N h ấp n ú t S a v e A ll tr ê n th a n h công cụ S ta n d a rd đ ể lưu các thay đổi Xác lậ p folder C :\V b l0 s b s \C h a p l2 làni vị trí
Bây giờ b ạn sẵn s à n g th ử m ột cuộc thứ nịíhiệm k h ác với tậ p hợp
C ontrols: sử dụng thuộc tín h L eft để di chuyển mỗi control tro n g tập hợp C ontrols sa n g b ên trá i
S ử đ ụ n g m ộ t v ò n g l ặ p F o r E a c h N e x t d ể d i c h u y ể n c á c c o n tro l
1 H iển th ị lạ i form v à sau đó n h ấp đôi đối tượng n ú t th ứ h a i (Button2)
2 Gõ n h ập m ã chương tr ìn h sau đây trong th ủ tục sự kiện Button2_Click:
c trl.L e tt = ctrl.L e ữ + 25 Next
Trang 39C h ư ơ n g 1 2 : Làm v iệ c với c á c lặ p hợp 4 3
Mỗi lầ n người dùng nh ấp n ú t th ứ hai, vòng lặ p F o r E ach N ext bước qua các đối tượng tro n g tậ p hợp C ontrols lầ n lượt từng đối tượng m ột và di chuyển chúng sang bên p h ả i 25 pixel (Để di chuyển các đôl tượng sa n g b ên trá i 25 pixel, b ạn trừ đi 25) M ột pixel là m ột đơn vị đo độc lậ p với th iế t bị m à qua dó b ạ n có th ể d ịn h vị trí các đối tượng tr ê n m ột form m ột cách chính xác
N h ư tro n g th ủ tục sự kiện trước m à b ạn đã gõ n h ập , b iế n Ctrl là m ột
"người đóng t h ế vai" cho đối tượng h iệ n h à n h tro n g tậ p hợp v à chứa các xác lậ p thuộc tín h giống y n hư đối tượng m à nó đại diện Trong vòng lặ p n à y b ạ n có th ể điều ch ỉn h thuộc tín h L eft để quyết đ ịn h vị
tr í của m ộ t đối tượng tưcmg ứng với p h ía b ên t r á i form
3 N h ấ p n ú t s t a r t D e b u g g in g
Chương tr ìn h chạy và ba n ú t xuất h iệ n ở p h ía b ên tr á i form
4 N h ấ p n ú t đầu tiê n và sau đó n h ấp n ú t th ứ h a i m ộ t vài lần
Các n ú t tr ê n form th ay đổi th à n h "Click Me!" v à sau đó m ỗi lầ n bạn
n h ấ p n ú t th ứ h ai, các đối tượng trê n form dần d ân di chuyển sang
b ên p h ải M àn h ìn h trô n g n h ư sau sau 5 lầ n n h ấp :
Trang 40Sử đụng thuộc tín h Name trong m ột vòng lặp For Each N ext
Nếu b ạ n m uôn xử lý m ột hoặc nhiều thành viên của m ộ t tậ p hợp m ột cách k h ác với b ạn xử lý những th à n h viên, bạn có th ể sử d ụ n g thuộc tín h
N am e, thuộc tín h n ày n h ậ n dạng duy n h ấ t mỗi đòl tượng tr ê n form B ạn đà xác lậ p thuộc tín h th eo định kỳ trong sách này để làm cho m ã chương tr ìn h
dê đọc hơn, nhưĩig N am e cũng có th ể được sử dụng b ằn g lậ p tr ì n h để n h ậ n
d ạn g các đô'i tượng riê n g b iệ t tro n g chương trình
Đ ể sử dụng thuộc tín h N am e bằng lập trình, chọn r a các đối tượng m à
b ạn m uốn xử lý đặc b iệ t và sau đó ghi chú các thuộc tín h N am e của chúng Sau dó k h i b ạ n lặ p lạ i qua các đôì tượng trê n form b ằ n g việc sử dụng m ột vòng lặ p F o r Each N ext, bạn có th ể sử dụng một hoặc n h iề u câu lệ n h I f để
te s t các thuộc tín h N am e quan trọ n g và xử lý những đô'i tượng đó m ộ t cách
k h ác nhau Ví dụ, b ạ n m uốn tạo một vòng lặp For E ach N e x t di chuyển
m ột đô'i tượng qua form chậm hơn những đối tượng khác B ạ n c6 th ể sử dụng m ộ t câu lệ n h I f T hen để n h ậ n ra thuộc tín h N am e của đô'i tượng chậm hơn v à sau đó di chuyển đối tượng đó với khoảng cách n g ắ n hơn b ằng cách không g ia tă n g thuộc tín h L eít của nó nhiều b ằng thuộc tín h L eft của nhữ ng đối tượng khác
Thủ thuật
Nếu bạn dự đ ịn h xử lý m ột số đối tượng một các đặc b iệ t tro n g m ộ t vòng lập For Each N ext, bạn có th ể sử dụng các câu lệnh Elseíí với câu lệnh ĩ f
Then, hoặc bạn có th ể sử dụng một cấu trú c quyết địn h Select Case.
T rong bài tậ p sau đây b ạn sẽ te s t thuộc tín h Name của đối tư ợ ng n ú t thứ
b a (btnM oveO bjects) đ ể xử lý n ú t đó một cách đặc b iệ t tro n g m ộ t vòng lặp
F or E ach N ext K ết quả R ẽ là một th ủ tục điều k iệ n di ch u y ển h a i n ú t
tr ê n cùng sa n g b ên p h ả i nhưng giữ cố định mít dưứi cùng
Thủ thuật
Ngoài thuộc tín h Name, hầu hết các đối tưụng hỗ trợ thuộc tín h Tag, Tưcfng lự như thuộc tín h Name, thuộc tính Tag là 1 vị trí trong đó bạn có th ể luU trữ dữ lỉệu chuỗi về đôi tượng Theo mặc định, (huộc tính Tag rỗng, n h irtig bạn có th ể gán thông tin cho nó và test nó để nhận dạng duy nhât các đôì tượng trong chương trìn h mà bạn muốn xử lý một cach khac nhau.
S ử dụng thuộc tính Name để xử lý một đôi tượng trong tập hợp Con trols m ột cách đặc biệt.
1 H iển th ị form và sau đó n hấp đôi đôi tượng n ú t th ứ ba