You are on page 1of 10

Hng dn lp trnh VB.

NET Chng 11: S dng mng v tp hp

Chng 11:
S dng mng v tp hp (Collection)
--------oOo--------
Ni dung tho lun:
- T chc thng tin d liu c chiu di c nh v mng ng
- D tr mng d liu khi nh ngha li kch thc mng
- X l tp hp cc i tng iu khin trn form
- S dng vng lp For EachNext duyt qua danh sch tp hp cc i tng
- To tp hp ca ring bn qun l d liu chui
Khi chng trnh tr nn ln v lng thng tin v d liu ln, bn khng th ch dng
bin m cn cn n mt cng c lu tr, x l tt hn l mng. Mng cha danh sch
tun t cc phn t cng nh dng.
Chng ta cng c th nhm cc i tng vo thnh tp hp d qun l, dng vng lp
For eachNext duyt qua cc phn t ca tp hp.
Cc tnh nng mi trong VB.NET:
- Mng c ch s c s l 0
- Hm Lbound lun tr v 0 l gii hn thp nht ca mng. Hm Ubound tr v
gii hn trn ca mng. S phn t ca mng l Ubound()-1
- VB.NET dng lp System.Collections x l tp hp
- Bn c th cha cc iu khin trong mng nu mng ca bn khai bo kiu
Object
1. Lm vic vi mng cc bin
Mng gip qun l cc d liu ln ht sc d dng. Vic truy cp cc phn t ca mng
thng qua ch s.
1.1. To mng
Vic khai bo mng tng t nh khai bo bin. Vic khai bo thng cha cc thng tin
nh:
- Tn mng: Tn i din cho mng, vic truy cp mt phn t mng gm tn
mng v ch s mng.
- Kiu d liu: Tt c cc phn t trong mng phi c cng kiu.
- Kch thc mng: L s chiu ca mng.
- S phn t ca mng: S phn t ti a ca mng

Bin son: Phm c Lp -1- Add: cnt-44-dh, VIMARU


Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

1.2. Khai bo mng c nh


C php chung khai bo mng c kch thc l:
Dim ArrayName(Dim1Index, Dim2Index) As DataType
Trong :
- ArrayName: tn mng
- Dim1Index v Dim2Index: l hai chiu ca mng
- Datatype: kiu d liu ca mng. Khi cha xc nh kiu c th, c th dng kiu
Object.
V d:
Khai bo Dim Employee(4) As String khai bo mng mt chiu cha 5 phn t c tn l
Employee c kiu String.
Bn cng c th khai bo mng mt cch ton cc trong module bng t kha Public nh
sau: Public Employee(4) As String.
Mng mt chiu c dng:
Employee
0
1
2
3
4

khai bo mng hai chiu mang tn ScoreBoard bn c th khai bo nh sau:


Dim ScoreBoard(1, 4) As Short

Mng ny gm 2*5 = 10 phn t tng ng vi 10 vung gm hai dng v 5 ct nh s


t 0.
1.3. Lm vic vi cc phn t trong mng
Sau khi khai bo, bn c th s dng mng. Vic truy cp vo mt phn t ca mng nh
tn mng v ch s ca mng t trong ngoc n, ch s l s nguyn, l bin nguyn hay
biu thc c gi tr. duyt qua tt c cc phn t trong mng, dng vng lp ForNext.
V d:
employee(3) = "Thanh Van"

Pht biu trn gn cho phn t c ch s th 3 (ti th 4) tn l Thanh Van.


ScoreBoard(0, 2) = 12

Pht biu trn gn cho phn t dng 0, ct 2 gi tr l 12.

Bin son: Phm c Lp -2- Add: cnt-44-dh, VIMARU


Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

1.4. To v s dng mng c kch thc c nh


By gi ta to v d MyFixedArray s dng mng mt chiu c tn nhietdo ghi li gi
tr nhit cao thp hng ngy trong tun. Mng ny c khai bo u form v c
gn gi tr bng hm InputBox nh vng lp ForNext. Ton b ni dung ca mng sau
li c hin th li vo mt textbox cng nh vng lp ForNext.
Thit k giao din:
To mi mt gii php v thm vo mt d n c cng tn l MyFixedArray. Thit k giao
din nh hnh:

Trong : nt button1 c text l in nhit , button2 l Hin th nhit , button3 l


Thot.
Vit m:
Trc ht ta khai bo mng nhietdo ngay di dng Public Class Form1 nh sau:
Dim nhietdo(6) As Single

Khai bo nh th ny ngha l tt c cc th tc, cc hm u c th s dng mng ny.


Tip theo ta to ra s kin nhp vo cc gi tr nhit trong tun bng cch to th tc
Button1_Click v nhp m nh sau:
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim Prompt, tieude As String
Dim i As Short
Prompt = "in vo nhit ca ngy."
For i = 0 To UBound(nhietdo)
tieude = "Ngy " & (i + 1)
nhietdo(i) = CInt(InputBox(Prompt, tieude))
Next
End Sub

Bin son: Phm c Lp -3- Add: cnt-44-dh, VIMARU


Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

Trong , hm Ubound(nhietdo) l hm ly v ch s trn ca mng nhietdo, trong trng


hp ny l 6.
Sau ta cho hin th cc gi tr nhit trong by ngy trong tun cng nh gi tr nhit
trung bnh bng th tc Button2_Click khi ngi dng click vo nt Hin th nhit
nh sau:
Private Sub Button2_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim ketqua As String
Dim i As Short
Dim tong As Single = 0
ketqua = "Nhit ca tun: " & vbCrLf & vbCrLf

For i = 0 To UBound(nhietdo)
ketqua = ketqua & "Ngy " & (i + 1) & _
vbTab & nhietdo(i) & vbCrLf
tong = tong + nhietdo(i)
Next

ketqua = ketqua & vbCrLf & _


"Nhit trung bnh: " & _
Format(tong / 7, "0.0")

TextBox1.Text = ketqua
End Sub
Th tc ny li s dng vng lp ForNext duyt li cc phn t trong mng sau khi
c gn gi tr th tc button1_Click. Bin ketqua c dng lm chui kt xut
gp cc gi tr phn t mng. Sau mi ln gp ta s dng hng s vbCrLf khin du ngt
dng v du v u dng (tng ng vi hai hm Chr(13) v Chr(10)). Hng vbTab
phn cch gia phn ghi ngy v ghi nhit .
Bn to th thc Button3_Click v nhp pht biu End kt thc chng trnh.
Chy chng trnh:
Bn chy chng trnh v nhp gi tr nhit 7 ngy ri cho hin th gi tr ln xem
sao.
1.5. To mng ng
Vic dng mng l rt thun tin. Tuy nhin khi bn cha bit chnh xc s phn t ca
mng l bao nhiu th sao? V d khi bn mun ngi dng nhp vo bao nhiu nhit
ty thch, nhp cng nhiu th chnh xc cng cao.
VB gii quyt vic ny bng mng ng. Kch thc mng ng ch c ch nh khi
chng trnh thc thi ch khng nh trong lc vit m. Vic khai bo trc kch thc
mng l khng cn thit nhng cng cn dnh ch trc cho mng .
Cc bc to mng ng:

Bin son: Phm c Lp -4- Add: cnt-44-dh, VIMARU


Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

- Ch nh tn v kiu cho mng khi thit k form, v d Dim nhietdo() As


Single

- Thm m xc nh kch thc mng khi chng trnh thc thi. V d khi chng
trnh chy bn hi xem ngi dng mun nhp bao nhiu ngy, v d:
Dim songay As Integer
songay = InputBox("Ban muon nhap bao nhieu ngay?", "Tao mang dong")
- Dng bin songay nh li kch thc mng (tr i 1 v mng tnh t 0). V d
If songay > 0 Then ReDim nhietdo(songay - 1)
- Tip theo ta dng hm Ubound(nhietdo) xc nh s phn t ca mng.
By gi chng ta s lm li v d trn s dng mng ng:
- Trc ht, bn khai bo li mng ng v khai bo bin songay cha s ngy
ngi dng mun nhp bng on m ngay di dng khai bo lp form1:
Dim nhietdo() As Single
Dim songay As Integer
- Sau sa li m ca th tc Button1_Click nh sau:
Dim Prompt, tieude As String
Dim i As Short
Prompt = "in vo nhit ca ngy."

'Nhap so ngay muon ghi nhiet do


songay = InputBox("Ban muon nhap bao nhieu ngay?", "Tao mang
dong")
If songay > 0 Then ReDim nhietdo(songay - 1)

For i = 0 To UBound(nhietdo)
tieude = "Ngy " & (i + 1)
nhietdo(i) = CInt(InputBox(Prompt, tieude))
Next
- Tip theo thay s 7 trong th tc Button2_Click bng bin songay:
ketqua = ketqua & vbCrLf & _
"Nhit trung bnh: " & _
Format(tong / songay, "0.0")
- Bn c th dng pht biu TryCatch bt li nu ngi dng nhp vo mt s
nh hn 0.
- Chy li chng trnh v kt qu r rng linh ng hn.
2. D tr sn mng bng pht biu REDIM
Trong v d trn, chng ta nh li kch thc bng t kha REDIM. Khi nh li kch
thc nh th th d liu c ca mng s mt ht. Cc phn t s c gi tr l 0 hay NULL.
gi nguyn gi tr cc phn t c, bn c th dng t kha Preserve i km pht biu
Redim. V d:
If songay > 0 Then ReDim Preserve nhietdo(songay - 1)

Vi pht biu ny th cc phn t mi nhn gi tr l 0 hay NULL.


Bin son: Phm c Lp -5- Add: cnt-44-dh, VIMARU
Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

V d ta nh ngha mng ng: Dim mangdong() As string


Sau ti nh ngha kch thc mng l 200:
Redim mangdong(200) As String
mangdong(200) = 200
Gi ta m rng mng ny vi cu lnh Preserve:
Redim Preserve mangdong(300)
Khi gi tr ca phn t mangdong(200) vn l 200. Vic ti nh ngha mng a chiu
cng tng t.
3. Lm vic vi tp hp i tng Collection
Tip theo chng ta s lm quen vi tp hp. Tp hp cng tng t nh mng nhng n
dng x l cc phn t kiu i tng, c khi lng v kch thc ln hn. Trong VB,
cc iu khin trong form cng c nhm thnh tp hp gi l Controls Collection tp
hp cc iu khin. Mi thnh phn iu khin khi bn cho vo form u c a vo
trong tp hp iu khin. Mi tp hp trong chng trnh u c mt tn ring ta tham
chiu n n. Bn c th dng Object Browser xem cc tp hp i tng ca h thng,
iu ny s c hng dn c th trong chng 13.
3.1. Tham chiu n i tng trong tp hp
Bn c th tham chiu n mt i tng trong tp hp thng qua ch s nh mng.
Trong VB th cc i tng c a vo tp hp theo th t o ngc, tc l phn t
a vo sm nht c ch s cao nht v ngc li, phn t a vo sau cng c ch s nh
nht l 0. V d, truy cp thuc tnh Text ca i tng phn t sau cng trn form bn
s dng ch s th t l 0 nh sau:
Controls(0).Text="phn t cui cng"

Mun truy cp cc phn t khc trn form, bn s dng ch s khc nh 0, 1,V d vng
lp fornext sau s in ra tiu ca 4 i tng trn form:
For i = 0 To 3
ketqua &= Controls(i).Text & vbCrLf
Next
Bn c th dng vng lp ForNext nh trn, tuy nhin hiu qu v d hiu nht bn nn
dng vng lp For EachNext.
3.2. S dng vng lp For EachNext
Mc d bn c th tham chiu n cc phn t trong tp hp ring l nhng hu nh cc
thao tc trn tp hp u duyt t u n cui tp hp bng vng lp For EachNext.
Cc thao tc thng gp l: di chuyn cc i tng, sp xp, i tn hay thay i li kch
thc ca ton b tp hp. C php ca vng lp nh sau:

Bin son: Phm c Lp -6- Add: cnt-44-dh, VIMARU


Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

Dim CtrlVar As Control


...
For Each CtrlVar in controls
Khi lnh x l i tng trong tp hp
Next
V d sau ta s dng tp hp i tng Controls x l cc i tng trn form, v d
MyControlsCollection.
Tm hiu chng trnh:
Chng trnh c mt form chnh. Trn form chnh c ba nt nhn. Khi ngi dng nhn
vo nt th nht c text i tn th nt nhn ny i text thnh i tn, nt nhn
th hai s di chuyn sang tri 40 n v v i text t Di chuyn thnh di chuyn,
nt nhn th ba c text ng yn khi ngi dng click vo y th nt ny i text thnh
y ng yn cn cc nt khc di chuyn sang tri 40.
Thit k form:
Form c giao din nh sau:

Cc bn to mi mt gii php v thm vo mt d n c cng tn MyControlsCollection


ri thit k form nh hnh.
Vit m:
Khai bo mt bin Ctrl ngay di dng khai bo lp form1 nh sau:
Dim ctrl As Control

To th tc btndoiten_Click v nhp m nh sau ( y nt nhn i tn c thuc


tnh Name l btndoiten):

Private Sub btndoiten_Click(ByVal sender As System.Object, _


ByVal e As System.EventArgs) Handles btndoiten.Click
For Each ctrl In Controls

Bin son: Phm c Lp -7- Add: cnt-44-dh, VIMARU


Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

If ctrl.Name = "btndoiten" Then


ctrl.Text = " i tn"
End If
Next
End Sub
Trong on m trn ta s dng vng lp for each next duyt qua cc phn t trong
tp hp cc iu khin controls ca form. Ta cng dng pht biu if lc ra nhng iu
khin c thuc tnh Name l btndoiten thao tc.
Tng t bn to th tc btnmove_Click v nhp m nh sau (nt nhn c text Di
chuyn c thuc tnh Name l btnmove):
Private Sub btnmove_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnmove.Click
For Each ctrl In Controls
If ctrl.Name = "btnmove" Then
ctrl.Text = " di chuyn"
ctrl.Left = ctrl.Left + 40
End If
Next
End Sub
Th tc btnstatic_Click (btnstatic l tn ca nt ng yn):
Private Sub btnstatic_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnstatic.Click
For Each ctrl In Controls
If ctrl.Name = "btnstatic" Then
ctrl.Text = "y ng yn"
Else
ctrl.Left = ctrl.Left + 40
End If
Next
End Sub
Chy chng trnh:
Cng vic ca bn gi l n F5 chy chng trnh xem thnh qu chng ta lm.
4. T to tp hp ca ngi dng
VB cho php to mt tp hp ca ngi dng lu tr t cc thnh phn iu khin nh
nt nhn, nhn, n cc kiu n gin nh chui, s nguyn v cc kiu c s khc
tng t nh mng.
C php khai bo:
Dim MyCollection As New Collection()

Trong MyCollection l tn ca tp hp, phng thc New khi to vng nh cho tp


hp. Sau khi to tp hp bn c th dng phng thc add thm phn t dl vo tp hp.
duyt tp hp bn dng vng lp for each next nh bit.
Trong v d sau y chng ta s lm quen vi cch s dng tp hp gia danh sch cc a
ch Internet c ngi dng s dng gn y nht. gi trnh duyt IE, bn dng
phng thc System.Dyagnostics.Process.Start.
Bin son: Phm c Lp -8- Add: cnt-44-dh, VIMARU
Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

Tm hiu chng trnh:


Chng trnh c mt form chnh gm mt textbox v hai nt nhn. textbox cho php
nhp vo a ch website, nt nhn th nht ngi dng click vo duyt trang web c
a ch ghi trong textbox, nhn th hai lit k tt c nhng trang web ngi dng
duyt bng cch nhp a ch URL vo trong textbox.
Thit k giao din:
Bn to mt gii php v thm mt d n mi cng tn l MyURLCollection v thit k
giao din nh sau:

Vit m:
Trc ht ta to mt tp hp cha cc tn a ch web m ngi dng thm bng pht
biu sau t ngay di dng khai bo lp form1:
Dim URLsVisited As New Collection()

Vi pht biu ny th tt c cc th tc trong form u c th truy cp n tp hp ny.


Tip theo to th tc Button1_Click v nhp m nh sau:
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
URLsVisited.Add(TextBox1.Text)
System.Diagnostics.Process.Start(TextBox1.Text)
End Sub
Phng thc Add(TextBox1.Text) s thm vo tp hp mt phn t c ni dung l thuc
tnh text ca textbox1.
Sau ta cng to th tc Button2_Click cho php ngi dng lit k tt c cc trang web
duyt bi ngi dng (cc phn t trong tp hp):
Private Sub Button2_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim URLname, AllURLVisited As String

Bin son: Phm c Lp -9- Add: cnt-44-dh, VIMARU


Hng dn lp trnh VB.NET Chng 11: S dng mng v tp hp

For Each URLname In URLsVisited


AllURLVisited = AllURLVisited & URLname & vbCrLf
Next
MsgBox(AllURLVisited, MsgBoxStyle.Information, _
"Websites Visited")
End Sub
Chy chng trnh:
n F5 chy chng trnh. Bn c th nhp cc a ch khc a ch ca localhost nu bn
c kt ni Internet.

5. Tp hp COLLECTION trong ng dng VBA


Bn c th vit cc ng dng macro cho ng dng vn phng bng ngn ng VBA (Visual
Basic for Application). Trong cc ng dng ny th tp hp ng vai tr rt quan trng. C
th tham kho thm trong cc quyn sch ca trang Appress.Com.

6. Tng kt chng
Lm bng tng kt chng nhng g hc. ng thi dng tp hp thay th cho bi tp
v mng trong chng trc.

Bin son: Phm c Lp - 10 - Add: cnt-44-dh,


VIMARU

You might also like