T H C VISUAL BASIC 6.0 - PH N II 1
MC LC
Chng Mt - T to Object ......................................................................2
Chng Hai – Debug ................................................................................13
Chng Ba - Dùng Menu..........................................................................25
Chng Bn - Dùng Dialogs ....................................................................38
Chng Nm - Dùng Ha (Phn I)....................................................56
T H C VISUAL BASIC 6.0 - PH N II 2
Chng Mt - T to Object
T trc đn gi, ta lp trình VB6 bng cách thit k các Forms ri vit
codes đ x lý các Events ca nhng controls trên Form khi Users click
mt Button hay Listbox, .v.v..
Nói chung, cách y cng hu hiu đ trin khai, nhng nu ta có th
hng đc các li ích sau đây thì càng tt hn na:
1. Dùng li đc code đã vit trc đây trong mt d án khác
2. D nhn din đc mt li (error) phát xut t đâu
3. D trin khai mt d án ln bng cách phân phi ra thành nhiu d
án nh
4. D bo trì
Mi ln dùng li code, nu đ y nguyên xi con là lý tng. Vic y đc
gi là Reusability. Nói cho đúng ra, dùng li đc tht s là khi ta ch
cn dùng object code, đó là code đã đc compiled ri, tc là hoàn toàn
không đng đn source code. Vì h cho phép User sa source code là to
c hi cho bugs xut hin, ri li phi debug mt ln na.
S thách đ chính ca vic trin khai mt d án phn mm ln là thc
hin đúng thi hn (on time), không l tài khóa (within budget) và d bo
trì (ease of maintenance). Mun đt đc các mc tiêu y, ta phi trin
khai nhanh và làm sao cho chng trình ít có bugs, d bo trì.
Gi d bn đng ra t chc mt đám ci. Th tng tng bit bao
nhiêu chuyn phi làm: t danh sách quan khách, thip mi, m thc, xe
c, chp hình, quay phim, vn ngh cho đn th tc nghi l, tip tân, hot
náo viên ..v.v.. Nu ch mt mình bn lo tht không bit làm sao nh cho
ht. Cng may là nhà hàng s đm trách luôn c vic in n thip mi, ban
nhc vn ngh và c hot náo viên. Th tc nghi l thì không ai qua đc
bác Sáu t, và bác đã nhn li mua quà cáp, lo v tip tân, xe c và th
tc, nghi l. Bác cng s liên lc vi Mc s ch l đ dn ch nhà th và
sp đt ngi git chuông và ngi đàn. Anh T Thông có ngi bn làm
ch tim hình, nên anh nhn trách nhim mn ngi lo chp hình, quay
phim. Nh th vic bn t chc cái đám ci nay rút li ch còn son
danh sách quan khách, các bài din vn, sp ch ngi và dn ch cho cp
v chng mi đi hng tun trng mt.
S d bn cm thy trách nhim t chc không nng n vì nhà hàng, bác
Sáu t và anh T Thông t lo gánh vác các khâu rc ri. Cái hay đây
T H C VISUAL BASIC 6.0 - PH N II 3
là nhng ngi ny t lo quyt đnh mi chi tit ca nhng gì cn phi
làm trong khâu ca h. Ch khi nào cn lm, h mi liên lc đ ly ý kin
ca bn. H ging nh nhng ngi thu ca bn. Chc bn đã lu ý
rng cái thí d t chc đám ci ny cho thy nói chung mun trin khai
d án ln nào ta cn phi nh nhng ngi thu giúp đ. Qu tht, đó là
cách các qun tr viên nhng công trình đã làm t xa đn nay.
Bây gi tr li chuyn lp trình, phi chi ta có th t chc cách trin khai
d án phn mm ging nh t chc cái đám ci nói trên thì tt quá. Tht
ra, không phi các lý thuyt gia phn mm không ngh đn chuyn y
trc đây, nhng đ thc hin đc vic y ngi ta cn trin khai các
phng tin, dng c thích hp. Ch trong vòng 15 nm tr li đây, vic
y mi tr nên c th qua các Operating Systems tinh vi, nht là dùng
Windows, và các ngôn ng lp trình nh Eiffel, SmallTalk, C++ .v.v..
Lp trình theo hng đi tng (Object Oriented
Programming)
Nói mt cách nôm na, lp trình theo hng đi tng là thit k các b
phn phn mm ca chng trình, gi là Objects sao cho mi b phn có
th t lo liu công tác ca nó ging nh mt ngi thu ngoài đi vy.
Chc có l bn s hi th thì các Sub hay Function mà bn đã tng vit
đ x lý tng giai đon trong chng trình có th đm trách vai trò ca
mt thu không?
Ngi thu chng nhng có th làm đc công tác (Subs và Functions) gì
mà còn chu trách nhim luôn c mi th vt dng cn thit (data) cho
vic y na.
Có mt cách đnh ngha khác cho Object là mt Object gm có data
structure và các Subs/Functions làm vic trên các data y. Thông thng,
khi ta dùng Objects ít khi giám th chúng, ngc li nu khi có s c gì
thì ta mun chúng báo cáo cho ta bit.
Trong VB6, các Forms, Controls hay ActiveX là nhng Objects mà ta
vn dùng lâu nay. Ly thí d nh Listbox. Mt Listbox t qun lý các
items hin th bên trong nó. Ta bit listbox List1 đang có bao nhiêu items
bng cách hi List1.ListCount. Ta bit item nào va mi đc selected
bng cách hi List1.ListIndex. Ta thêm mt item vào listbox bng cách
T H C VISUAL BASIC 6.0 - PH N II 4
gi method AddItem ca List1, ..v.v.. Nói cho đúng ra, Object là mt
thc th ca mt Class. Nu Listbox là mt Class thì List1, List2 là các
thc th ca Listbox. Cng ging nh Bà T Cháo Lòng và Dì Sáu Bánh
Tm là các thc th ca Class u Bp.
Ngay c mt form tên frmMyForm mà ta vit trong VB6 chng hn, nó
cng là mt Class. Thng thng ta dùng thng frmMyForm nh sau:
frmMyForm.Show
Trong trng hp ny tht ra frmMyForm tuy là mt Class nhng đc
dùng y nh mt Object. Ch nu mun, ta có th to ra hai, ba Objects
ca Class frmMyForm cùng mt lúc nh trong thí d sau:
Dim firstForm As frmMyForm
Dim secondForm As frmMyForm
Set firstForm = New frmMyForm
Set secondForm = New frmMyForm
firstForm.Show
secondForm.Show
Trong thí d trên ta declare firstForm và secondForm là nhng Objects
ca Class frmMyForm. Sau đó ta làm nên (instantiate) các Objects
firstForm và secondForm bng statements Set... = New...
firstForm và secondForm còn đc gi là các instances ca Class
frmMyForm. Class ging nh cái khuôn, còn Objects ging nh nhng
cái bánh làm t khuôn y. Chc bn đã đ ý thy trong VB6 t dùng hai
t Class và Object ln ln nhau. u ny cng không quan trng, min là
bn nm vng ý ngha ca chúng.
VB6 có ym tr Class mà ta có th trin khai và instantiate các Objects
ca nó khi dùng. Mt Class trong VB6 có cha data riêng ca nó, có
nhng Subs và Functions mà ta có th gi. Ngoài ra Class còn có th
Raise Events, tc là báo cho ta bit khi chuyn gì xãy ra bên trong nó.
Cng ging nh Event Click ca CommandButton, khi User clicks lên
button thì nó Raise Event Click đ cho ta x lý trong Sub
myCommandButton_Click(), chng hn. Classtrong VB6 không có h tr
Visual components, tc là không có cha nhng controls nh TextBox,
Label .v.v.. Tuy nhiên, ta có th ly nhng control có sn t bên ngoài ri
đa cho Object ca Class dùng.
T H C VISUAL BASIC 6.0 - PH N II 5
Bây gi chúng ta hãy bt đu vit mt Class. Bn hãy m mt Project
mi loi Standard EXE Visual Basic. Sau đó dùng Menu Command chn
Add Class Module:
Khi Add Class Module dialog hin ra chn Class Module và click Open.
Bn s thy m ra mt khung trng và Project Explorer vi Properties
Window. Trong Properties Window, hãy sa Name property ca Class
thành clsBox nh di đây:
T H C VISUAL BASIC 6.0 - PH N II 6
K đó đánh vào nhng dòng code di đây,
Option Explicit
Private mX As Integer
Private mY As Integer
Private mWidth As Integer
Private mHeight As Integer
Public Property Let X(ByVal vValue As Integer)
mX = vValue
End Property
Public Property Get X() As Integer
X = mX
End Property
Public Property Let Y(ByVal vValue As Integer)
mY = vValue
End Property
Public Property Get Y() As Integer
Y = mY
End Property
Public Property Let Width(ByVal vValue As Integer)
mWidth = vValue
End Property
Public Property Get Width() As Integer
Width = mWidth
T H C VISUAL BASIC 6.0 - PH N II 7
End Property
Public Property Let Height(ByVal vValue As Integer)
mHeight = vValue
End Property
Public Property Get Height() As Integer
Height = mHeight
End Property
Public Sub DrawBox(Canvas As Object)
Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), , B
End Sub
Public Sub ClearBox(Canvas As Object)
Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight),
Canvas.BackColor, B
End Sub
Class clsBox có 4 Properties: X, Y, Width và Height. Ta s instantiate
mt Box t clsBox. Mi Box có ta đ (X,Y) và kích thc chiu rng và
chiu cao (width, height) ca nó. Tht ra ta có th dùng Public statement
đ declare các bin X, Y, Width và Height. Nhng đây ta c ý declare
chúng là Private, di dng mX, mY, mWidth và mHeight. Khi ta mun
thay đi các tr s ca chúng, ta s dùng cùng mt cách vit code nh
bình thng (thí d: myBox.X = 80 ). Nhng khi chng trình x lý
assignment statement y, nó s execute mt loi method (ging nh Sub)
gi là Property Let X (vValue). Ta thy đây vValue đc assigned
cho mX (i.e. mX = vValue ), cái Private variable ca X. Nh th công
vic ny cng chng khác gì sa đi mt Public variable X. Tuy nhiên,
đây ta có th vit thêm code trong Property Let X đ nó làm gì cng
đc.
Bn có nh trong khi thit k mt Label, mi ln bn dùng Property
Window đ edit Font size, forcolor hay backcolor thì chng nhng các
properties y ca Label thay đi, mà kt qu ca s thay đi đc có hiu
lc ngay lp tc, ngha là Label đc hin th tr li vi tr s mi ca
property. ó là vì trong method Property có c code bo Label redisplay.
Ngc li, khi ta dùng property X ca Object myBox, không phi ta ch
đc tr s thôi mà còn execute c cái method Property Get X. Nói tóm
li, Property cho ta c hi đ execute mt method mi khi User đc hay
vit tr s variable y.
Thí d nh nu ta mun kim soát đ ch chp nhn tr s ta đ X mi
khi nó không phi là s âm. Ta s sa Property Let X li nh sau:
T H C VISUAL BASIC 6.0 - PH N II 8
Public Property Let X(ByVal vValue As Integer)
If (vValue >= 0) Then
mX = vValue
End If
End Property
Property có th là Read Only hay Write Only. Nu mun mt Property
là Read Only thì ta không cung cp Property Let. Nu mun mt Property
là Write Only thì ta không cung cp Property Get. Ngoài ra nu làm vic
vi Object, thay vì Data type thông thng, thì ta phi dùng Property
Set, thay vì Property Let.
Thí d ta cho clsBox mt Property mi, gi là Font dùng object ca class
stdFont ca VB6. Trong clsBox ta declare mt Private variable mFont và
vit mt Property Set Font nh sau:
Private mFont As StdFont
Public Property Set Font(ByVal newFont As StdFont)
Set mFont = newFont
End Property
Ta s dùng property Font ca myBox (thuc Class clsBox) nh sau:
' Declare an object of Class StdFont of VB6
Dim myFont As StdFont
Set myFont = New StdFont
myFont.Name = "Arial"
myFont.Bold = True
Dim myBox As clsBox
Set myBox = New clsBox
Set myBox.Font = myFont ' Call the Property Set method
Class clsBox có hai Public Subs, DrawBox và ClearBox. ClearBox cng
v mt box nh DrawBox, nhng nó dùng BackColor ca màn nh
(canvas), nên coi nh xóa cái box có sn. Do đó, nu mun, bn có th
sa Sub DrawBox li mt chút đ nhn mt Optional draw color nh sau:
Public Sub DrawBox(Canvas As Object, Optional fColor As Long)
If IsMissing(fColor) Then
Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), , B
Else
Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), fColor, B
End If
End Sub
T H C VISUAL BASIC 6.0 - PH N II 9
Trong thí d trên, Optional parameter fColor đc tested bng function
IsMissing. Nu fColor là BackColor ca canvas thì ta s có hiu qu ca
ClearBox.
Trong form chính ca chng trình dùng đ test clsBox, mi khi ta refer
đn mt object thuc class clsBox, IDE Intellisense s hin th các
Properties và Subs/Functions ca clsBox nh trong hình di đây:
Trong chng trình ny, mi khi ta click nút Draw thì mt Box đc
instantiate, cho ta đ X,Y và kích thc Width, Height, ri đc v ra
ngay trên form. Ch Me trong code nói đn chính cái form frmClass.
T H C VISUAL BASIC 6.0 - PH N II 10
cho chng trình thú v hn, khi user clicks nút Animate, ta s cho
mt box màu đ chy t trái qua phi.
Khi user clicks nút Two Boxes ta s v hai boxes, hp trong màu xanh,
hp ngoài màu đ, và cho chúng chy t trái sang phi. đây ta biu
din cho thy mình mun instantiate bao nhiêu boxes t clsBox cng
đc, và d nhiên mi box có mt b properties vi giá tr riêng ca nó.
Ta có th lp trình đ cho Object báo cáo program ch ca nó khi có mt
bin c (Event) xãy ra bên trong Class.
Ta th declare mt Event tên Draw trong clsBox, và vit code đ mi khi
Sub DrawBox executes thì Class s Raise mt event Draw.
Public Event Draw(X As Integer, Y As Integer)
Public Sub DrawBox(Canvas As Object, Optional fColor As Long)
If IsMissing(fColor) Then
Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), , B
Else
Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), fColor, B
End If
RaiseEvent Draw(mX, mY)
End Sub
T H C VISUAL BASIC 6.0 - PH N II 11
Bây gi, trong frmClass thay vì ch declare Dim myBox as clsBox, ta s
declare Private WithEvents myBox as clsBox. Ngay sau đó, ch
myBox s hin ra trong danh sách các Object có h tr Event ca
frmClass. K đó ta s vit code đ handle Event Draw ca myBox, tc là
ta cung cp code cho Private Sub myBox_Draw (X as Integer, Y as
Integer). đây ta ch hin th mt s đip báo cáo mt hp va đc v
đâu.
Khi chy program, mi ln mt clsBox object executes Sub DrawBox ta
s thy frmClass display mt message ging nh di đây.
T H C VISUAL BASIC 6.0 - PH N II 12
Nh rng, ta declare mt Object vi WithEvents khi ta mun handle các
Events ca nó. Trong thí d trên frmClass là ch ca myBox và nó
handles Event Draw ca myBox. Tng t nh vy, ngay c bên trong
mt Class, nu Class y đc giao cho mt Object có th Raise Events
(thí d nh TextBox, ListBox, Timer .v.v..), bn cng có th declare
Object y WithEvents đ nó có th handle Events ca Object.
Trong thí d di đây ta vit codes ny trong mt Class đã đc giao cho
mt Textbox khi form chính gi Sub InitObject đ đa cho Object mt
TextBox:
Private WithEvents mTextBox As TextBox
Public Sub InitObject(givenTextBox As TextBox)
Set mTextBox = givenTextBox
End Sub
Private Sub mTextBox_KeyPress(KeyAscii As Integer)
' Place your code here to handle this event within the Class
Object
End Sub
T H C VISUAL BASIC 6.0 - PH N II 13
Chng Hai – Debug
Bugs là nhng li lm ca program mà ta phát hin khi chy nó. Debug
là công vic loi tt c nhng li lm trong chng trình đ nó chy êm
xuôi trong mi hoàn cnh.
Thông thng mun fix mt cái bug nào trc ht ta phi tìm hiu lý do
khin nó xut hin. Mt khi đã bit đc duyên c ri ta s ngh ra cách
gii quyt. Nói chung, có hai loi bugs:
1. Hoc là program không làm đúng chuyn cn phi làm vì
programmer hiu lm Specifications hay đc cho tin tc
sai lc, hoc là program b sót chi tit cn phi có. Trng
hp ny ta gii quyt bng cách gim thiu s hiu lm qua
s nâng cp kh nng truyn thông.
2. Program không thc hin đúng nh ý programmer mun.
Tc là programmer mun mt đàng mà bo chng trình
làm mt ngã vì vô tình không vit lp trình đúng cách.
Trng hp ny ta gii quyt bng cách dùng nhng
Software Tools (k c ngôn ng lp trình) thích hp, và có
nhng quá trình làm vic có h thng.
Trong hãng xe hi ngi ta dùng t Quality Control đ nói đn vic ch
ra chic xe không có li lm gì c. đt mc tiêu y, chng nhng cn
có ngi kim phm mà chính các nhân viên lp ráp thn trng đ công
vic chính ca ngi kim phm là xác nhn kt qu tt ch không phi
tìm li lm.
Có nhiu yu t nh hng đn cht lng ca mt program nh chc
nng ca program, cu trúc ca các b phn, k thut lp trình và phng
pháp debug. Debug không hn nm giai đon cui ca d án mà tùy
thuc rt nhiu vào các yu t k trc trong mi giai đon trin khai.
Chc nng ca chng trình (Program Specifications)
Du program ln hay nh, trc ht ta phi xác nhn rõ ràng và t m nó
cn phi làm gì, bao nhiêu ngi dùng, mng nh th nào, database ln
bao nhiêu, phi chy nhanh đn mc nào .v.v..
T H C VISUAL BASIC 6.0 - PH N II 14
Có nhiu chng trình phi b thay đi na chng vì programmers hiu
lm điu khách hàng mun. Kh nht là lúc gn giao hàng mi khám phá
ra có nhiu đim trong chng trình khách mun mt đàng mà ta làm mt
ngã. Do đó trong s liên h vi khách hàng ta cn phi hi đi, hi li,
phn hi vi khách hàng nhiu ln điu ta hiu bng th t, tài liu, đ
khách xác nhn là ta bit đúng ý h trc khi xúc tin vic thit k
chng trình. Nu sau ny khách đi ý, đó là quyn ca h, nhng h
phi tr tin thay đi (variation).
Cu trúc các b phn
Program nào cng có mt kin trúc tng t nh mt cn nhà. Mi b
phn càng đn gin càng tt và cách ráp các b phn phi nh th nào đ
ta d th. Trong khi thit k ta phi bit trc nhng yu đim ca mi b
phn nm đâu đ ta chun b cách th chúng. Ta s không h tin b
phn nào hoàn ho cho đn khi đã th nó, dù nó đn s đn đâu.
Nu ta mun dùng mt k thut gì trong mt hoàn cnh nào mà ta không
bit chc nó chy không thì nên th riêng r nó trc. Phng pháp y
đc gi là Prototype.
Ngoài ra, ta cng nên k hoch cho nhng trng hp bt ng, đin
hình là bad data - khi user bm lung tung hay database cha rác rn.
Nu chng trình chy trong real-time (tc là data thu nhp qua Serial
Comm Port, Data Acquisition Card hay mng), bn cn phi lu ý nhng
trng hp khác nhau tùy theo vic gì xy ra trc, vic gì xy ra sau.
Lúc by gi Logic ca chng trình s tùy thuc vào trng thái (State)
ca data. Tt nht là ngh đn nhng Scenarios (din tin ca nhng hoàn
cnh) đ có th th tng giai đon và tình hung.
Ngày nay vi k thut i Tng, giai đon thit k ny là lúc quyt
đnh các Data Structures (tables, records ..v.v.) và con s Forms vi
Classes. Nh rng mi Class gm có mt Data Structure và nhng
Subs/Functions/Properties làm vic (operate) trên data y. Data structure
phi cha đy đ nhng chi tit (data fields, variables) ta cn. K đó là
nhng cách chng trình process data. Subs/Functions nào có th cho bên
T H C VISUAL BASIC 6.0 - PH N II 15
ngoài gi thì ta cho nó Public, còn nhng Subs/Functions khác hin hu
đ phc v bên trong class thì ta cho nó Private.
K thut lp trình
Cn bn ca programmers và các thói quen ca h rt quan trng. Nói
chung, nhng ngi hp tp, nhy vào vit chng trình trc khi suy
ngh hay cân nhc chính chn thì sau ny bugs lòi ra khp ni là chuyn
t nhiên.
Dùng Subs và Functions
Nu giai đon thit k kin trúc ca chng trình ta chia ra tng Class,
thì khi lp trình ta li thit k chi tit v Subs, Functions .v.v.., mi th s
cn phi th nh th nào. Nu ta có th chia công vic ra tng giai đon
thì mi giai đon có th mà mt call đn mt Sub. Th gì cn phi tính ra
hay ly t ni khác thì có th đc thc hin bng mt Function.
Thí d nh công vic trong mt tim git i có th gm có các bc sau:
1. Nhn hàng
2. Phân chia tng loi
3. Ty
4. Git
5. i
6. Vô bao
7. Tính tin
8. Giao hàng
Trong đó các bc 1,2,6 và 8 có th là nhng Subs. Còn các bc 3,4,5
và 7 nhng Functions, thí d nh khi ta giao cho Function Git mt cái
áo d ta s ly li mt cái áo sch.
Nh rng đim khác bit chính gia mt Sub và mt Function là Function
cho ta mt kt qu mà không làm thay đi nhng parameters ta đa cho
nó. Trong khi đó, du rng Sub không cho ta gì mt cách rõ ràng nhng
nó có th thay đi tr s (value) ca bt c parameters nào ta pass cho nó
T H C VISUAL BASIC 6.0 - PH N II 16
ByRef. Nhc li là khi ta pass mt parameter ByVal cho mt Sub thì
ging nh ta đa mt copy (bn sao) ca variable đó cho Sub, Sub có th
sa đi nó nhng nó s b b qua, không nh hng gì đn original (bn
chính) variable.
Ngc li khi ta pass mt parameter ByRef cho mt Sub thì ging nh ta
đa bn chính ca variable cho Sub đ nó có th sa đi vy.
Do đó đ tránh trng hp vô tình làm cho tr s mt variable b thay đi
vì ta dùng nó trong mt Sub/Function bn nên dùng ByVal khi pass nó
nh mt parameter vào mt Sub/Function.
Tht ra, bn có th dùng ByRef cho mt parameter pass vào mt
Function. Trong trng hp đó d nhiên variable y có th b sa đi.
iu ny gi là phn ng ph (side effect), vì bình thng ít ai làm vy.
Do đó, nu bn tht s mun vt ngoài qui c thông thng thì nên
Comment rõ ràng đ cnh cáo ngi s đc chng trình bn sau ny.
Ngoài ra, mi programmer thng có mt Source Code Library ca
nhng Subs/Functions ng ý. Bn nên dùng các Subs/Functions trong
Library ca bn càng nhiu càng tt, vì chúng đã đc th nghim ri.
ng s Error
Mi khi chng trình có mt Error, hoc là Compilation Error (vì ta
vit code không đúng vn phm, ng vng), hoc là Error trong khi chy
chng trình, thì bn không nên s nó. Hãy bình tnh đc cái Error
Message đ xem nó mun nói gì. Nu không hiu ngay thì đc đi đc li
vài ln và suy nghim xem có tìm đc mách nc nào không. Ngh
programming ca chúng ta s gp Errors nh n cm ba, nên bn phi
tp bình tnh đi din vi chúng.
Dùng Comment (Chú thích)
Lúc vit code nh thêm Comment đy đ đ bt c khi nào tr li đc
đon code y trong tng lai bn không cn phi da vào tài liu nào
khác mà có th hiu ngay lp tc mc đích ca mt Sub/Function hay
đon code.
T H C VISUAL BASIC 6.0 - PH N II 17
Nh th không nht thit bn phi vit rt nhiu Comment nhng h có
đim nào khác thng, bí him thì bn cn thông báo và gii thích ti sao
bn làm cách y. Có th sau ny ta khám phá ra đon code có bugs; lúc
đc li có th ta s thy du rng ý đnh và thit k đúng nhng cách lp
trình có phn thiu soát chng hn.
Tính ra trung bình mt programmer ch làm vic 18 tháng mi ch. Tc
là, gn nh chc chn code bn vit s đc ngi khác đc và bo trì (
debug và thêm bt). Do đó, code phi càng đn gin, d hiu càng tt.
ng lo ngi là chng trình s chy chm hay chim nhiu b nh, vì
ngày nay computer chy rt nhanh và b nh rt r. Khi nào ta tht s cn
phi quan tâm v vn tc và b nh thì điu đó cn đc thit k cn thn
ch không phi da vào nhng tiu xo v lp trình.
t tên các variables có ý ngha
Kh nht là làm vic vi các variables có tên vn tt nh K, L, AA, XY.
Ta không có mt chút ý nim chúng là ai, hin hu đ làm gì. Thay vào
đó, nu ta đt các tên variables nh NumberOfItems, PricePerUnit,
Discount .v.v.. thì s d hiu hn.
Mt trong nhng bugs khó thy nht là ta dùng cùng mt tên cho local
variable (variable declared trong Sub/Function) và global variable
(variable declared trong Form hay Basic Module). Local variable s che
đy global variable cùng tên, nên nu bn mun nói đn global variable
trong hoàn cnh y bn s dùng lm local variable.
Dùng Option Explicit
Bn nên trung tín dùng Option Explicit đu mi Form, Class hay
Module. Nu có variable nào đánh vn trt VB6 IDE s cho bn bit
ngay. Nu bn không dùng Option Explicit, mt variable đánh vn trt
đc xem nh mt variable mi vi giá tr 0 hay "" (empty string).
Nói chung bn nên thn trng khi assign mt data type cho mt variable
vi data type khác. Bn phi bit rõ bn đang làm gì đ khi b phn ng
ph (side effect).
T H C VISUAL BASIC 6.0 - PH N II 18
Desk Check
Kim li code trc khi compile. Khi ta compile code, nu không có error
ch có ngha là Syntax ca code đúng, không có ngha là logic đúng. Do
đó ta cn phi bit chc là code ta vit s làm đúng điu ta mun bng
cách đc li code trc khi compile nó ln đu tiên. Công vic ny gi là
Desk Check (Kim trên bàn). Mt chng trình đc Desk Checked k
s cn ít debug và cha ít bugs không ng trc. Lý do là mi scenarios
đã đc tiên liu chu đáo.
Son mt Test Plan
Test Plan lit kê tt c nhng gì ta mun th và cách th chúng. Khi th
theo Test Plan ta s khám phá ra nhng bug và tìm cách loi chúng ra. H
s ghi li lch s ca Test Plan (trc trc gì xy ra, bn đã dùng bin pháp
nào đ gii quyt) s b ích trên nhiu phng din. Ta s hc đc t
kinh nghim Debug và bit rõ nhng th gì trong d án đã đc th theo
cách nào.
X lý Error lúc Run time
Khi EXE ca mt chng trình vit bng VB6 đang chy, nu gp Error,
nó s hin th mt Error Dialog cho bit lý do vn tc. Sau khi bn click
OK, chng trình s ngng. Nu bn chy chng trình trong VB6 IDE,
bn có dp bo program ngng trong source code ch có Error bng
cách bm button Debug trong Error Dialog. Tip theo đó bn có th tìm
hiu tr s các variables đ đoán nguyên do ca Error. Do đó, nu bn bt
đu cho dùng mt program bn vit trong s, nu tin thì trong vài tun
đu, thay gì chy EXE ca chng trình, bn chy source code trong VB6
IDE. Nu có bug nào xy ra, bn có th cho program ngng trong source
code đ debug.
Khi bn dùng statement:
On Error Resume Next
thì t ch đó tr đi, nu chng trình gp Error, nó s b qua (ignore)
hoàn toàn. im ny tin ch giúp chng trình EXE ca ta tránh b té
cái ch ri bin mt, rt là "quê" vi khách hàng. Nhng nó cng bt li
T H C VISUAL BASIC 6.0 - PH N II 19
là khi khách hàng cho hay h gp nhng trng hp l, không gii thích
đc (vì Error b ignored mà không ai đ ý), thì ta cng bí luôn, có th
không bit bt đu t đâu đ debug. Do đó, d nhiên trong lúc debug ta
không nên dùng nó, nhng trc khi giao cho khách hàng bn nên cân
nhc k trc khi dùng.
Dùng Breakpoints
Cách hay nht đ theo dõi execution ca program là dùng Breakpoint đ
làm cho program ngng li mt ch ta mun trong code, ri sau đó ta
cho program bc tng bc. Trong dp ny ta s xem xét tr s ca
nhng variables đ coi chúng có đúng nh d đnh không.
Bn đoán trc execution s đi qua ch nào trong code, chn mt ch
thích hp ri click bên trái ca hàng code, ch du chm tròn đ nh
trong hình di đây:
Nu bn click lên du chm tròn đ mt ln na thì là hy b nó. Mt
cách khác đ đt mt breakpoint là đ editor cursor lên hàng code ri bm
F9. Nu bn bm F9 ln na khi cursor nm trên hàng đó thì là hy b
break point.
Lúc program đang dng li, bn có th xem tr s ca mt variable bng
cách đ cursor lên trên variable y, tooltip s hiên ra nh trong hình di
đây:
T H C VISUAL BASIC 6.0 - PH N II 20
Có mt s chuyn khác bn có th làm trong lúc ny. Bn có th nm du
chm tròn đ kéo (drag) nó ngc lên mt hay nhiu hàng code đ nó s
execute tr li vài hàng code. Bn cho program execute tng hàng code
bng cách bm F8. Menu command tng đng vi nó là Debug | Step
Into. S có lúc bn không mun program bc vào bên trong mt
Sub/Function mà mun vic execute mt Sub/Function nh mt bc
đn gin. Trong trng hp đó, bn dùng Menu command Debug | Step
Over hay Shift-F8.
Nh là đ cho program chy li bn bm F5, tng đng vi Menu
command Run | Continue.
Có khi bn mun program ngng gia mt For Loop khi Iterator value
có mt tr s khá ln. Nu ta đ sn mt breakpoint đó ri c bm F5
nhiu ln thì hi bt tin. Có mt mánh li là dùng mt IF statement đ
th khi Iterator value có tr s y thì ta ngng breakpoint ti statement
Beep (thay gì statement Print ICounter) nh trong hình di đây:
T H C VISUAL BASIC 6.0 - PH N II 21
Mun hy b mi breakpoints bn dùng Menu command Debug | Clear
All Breakpoints.
tin vic debug, bn có th dùng Debug Toolbar bng cách hin th
nó vi Menu command View | Toolbars | Debug
VB6 IDE s hin th Debug Toolbar nh sau:
T H C VISUAL BASIC 6.0 - PH N II 22
Dùng Immediate Window
Immediate Window cho phép ta execute nhng VB statement strong khi
program đang dng li. Ta có th dùng mt Print statement đ hin th tr
s ca mt variable hay kt qu ca mt Function, gi mt Sub hay thay
đi tr s mt variable trc khi tip tc cho chng trình chy li.
hin th Immediate Window, dùng Menu command View | Immediate
Window.
Thay vì đánh "Print ICounter" bn cng có th đánh "? ICounter".
Nh là mi VB Statement bn đánh trong Immediate Window s đc
executed ngay khi bn bm Enter. Bn có th dùng li bt c VB
statement nào trong Immediate Window, ch cn bm Enter cui hàng
y.
Theo du chân chng trình (Tracing)
ôi khi không tin đ ngng program nhng bn vn mun bit program
đang làm gì trong mt Sub. Bn có th đ gia code ca mt
Sub/Function mt statement ging nh di đây:
Debug.Print Format ( Now,"hh:mm:ss ") & "(Sub ProcessInput)
Current Status:" & Status đ program hin th trong Immediate
Window value ca Status khi nó execute bên trong Sub ProcessInput lúc
my gi.
Có mt cách khác là thay vì cho hin th trong Immediate Window bn
cho vit xung (Log) vào trong mt text file. Di đây là mt Sub đin
hình bn có th dùng đ Log mt Event message:
Sub LogEvent(ByVal GivenFileName, ByVal Msg As String, HasFolder As
Boolean, IncludeTimeDate As Integer)
' Append event message Msg to a text Logfile GivenFileName
T H C VISUAL BASIC 6.0 - PH N II 23
' If GivenFileName is fullPathName then HasFolder is true
' IncludeTimeDate = 0 : No Time or Date
' = 1 : Prefix with Time
' = 2 : Prefix with Time and Date
Dim FileNo, LogFileName, theFolder
If HasFolder Then
LogFileName = GivenFileName
Else
If Right(App.Path, 1) <> "\" Then
theFolder = App.Path & "\"
Else
theFolder = App.Path
End If
LogFileName = theFolder & GivenFileName
End If
FileNo = FreeFile
If Dir(LogFileName) <> "" Then
Open LogFileName For Append As FileNo
Else
Open LogFileName For Output As FileNo
End If
Select Case IncludeTimeDate
Case 0 ' No Time or Date
Print #FileNo, Msg
Case 1 ' Time only
Print #FileNo, Format(Now, "hh:nn:ss ") & Msg
Case 2 ' Date & Time
Print #FileNo, Format(Now, "dd/mm/yyyy hh:nn:ss ") & Msg
End Select
Close FileNo
End Sub
Dùng Watch Window
ôi khi bn mun program ngng không phi mt ch nào nht đnh,
nhng khi tr s ca mt variable hay ca mt expression là bao nhiêu, có
th là bn không bit ti sao mt variable t nhiên có mt tr s nh vy.
Câu hi: Ai là th phm? . Thí d bn mun program ngng li khi
ICounter = 15. Bn có th dùng Menu command Debug | Add Watch.
VB6 IDE s hin th dialog di đây. Bn đánh ICounter = 15 vào
textbox Expression và click option box Break When Value Is True
trong hp Watch Type. Làm nh vy có ngha là ta mun program
ngng khi ICounter bng 15.
T H C VISUAL BASIC 6.0 - PH N II 24
Dùng Phng Pháp Trit Khai (Elimination Method)
Có mt phng pháp rt thông dng khi debug là Comment Out nhng
hàng code nghi ng đ xem bug có bin mt không. Nó đc gi là
Elimination Method. Nu bug bin mt thì nhng hàng code đã đc
comment out là th phm. Bn có th Comment Out mt s hàng cùng
mt lúc bng cách highlight các hàng y ri click Comment Block trên
Edit ToolBar.
Khi dùng Elimination Method bn phi cân nhc Logic ca code bn
trong khi quyt đnh Comment Out nhng hàng nào, nu không, đó là
mt phng pháp khá nguy him.
Ngoài ra, Menu Command View | Locals Window lit kê cho bn tr s
ca tt c variables trong mt Sub/Function và View | Call Stack lit kê
th bc các Sub gi ln lt t ngoài vào trong cho đn v trí code đang
ngng hin thi.
T H C VISUAL BASIC 6.0 - PH N II 25
Chng Ba - Dùng Menu
Menu trong Windows là ni tt c các commands ca mt program
đc sp xp th t theo tng loi đ giúp ta dùng d dàng.
Có hai loi menu ta thng gp: drop-down (th xung) menu và pop-
up (hin lên) menu. Ta dùng drop-down menu làm Menu chánh cho
chng trình. Thông thng nó nm phía trên chóp màn nh. Nm dc
theo chiu ngang là Menu Bar, nu ta click lên mt command trong Menu
Bar thì program s th xung mt menu vi nhng MenuItems nm dc
theo chiu thng đng. Nu ta click lên MenuItem nào có du hình tam
giác nh bên phi thì program s popup mt Menu nh trong hình di
đây (khi ta click Format | Make Same Size):
Main Menu
Ta dùng Menu Editor đ to hoc sa mt Menu cho program. Menu
thuc v mt Form. Do đó, trc ht ta select mt Form đ làm vic vi
Designer ca nó (ch không phi code ca Form). K đó ta dùng Menu
Command Tools | Menu Editor hay click lên icon ca Menu Editor trên
Toolbar đ làm cho Menu Editor hin ra.