Tải bản đầy đủ (.pdf) (67 trang)

Tự học Visual Basic phần 2

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.1 MB, 67 trang )

T  H C VISUAL BASIC 6.0 - PH N II 1
MC LC
Chng Mt - T to Object ......................................................................2
Chng Hai – Debug ................................................................................13
Chng Ba - Dùng Menu..........................................................................25
Chng Bn - Dùng Dialogs ....................................................................38
Chng Nm - Dùng  Ha (Phn I)....................................................56
T  H C VISUAL BASIC 6.0 - PH N II 2
Chng Mt - T to Object
T trc đn gi, ta lp trình VB6 bng cách thit k các Forms ri vit
codes đ x lý các Events ca nhng controls trên Form khi Users click
mt Button hay Listbox, .v.v..
Nói chung, cách y cng hu hiu đ trin khai, nhng nu ta có th
hng đc các li ích sau đây thì càng tt hn na:
1. Dùng li đc code đã vit trc đây trong mt d án khác
2. D nhn din đc mt li (error) phát xut t đâu
3. D trin khai mt d án ln bng cách phân phi ra thành nhiu d
án nh
4. D bo trì
Mi ln dùng li code, nu đ y nguyên xi con là lý tng. Vic y đc
gi là Reusability. Nói cho đúng ra, dùng li đc tht s là khi ta ch
cn dùng object code, đó là code đã đc compiled ri, tc là hoàn toàn
không đng đn source code. Vì h cho phép User sa source code là to
c hi cho bugs xut hin, ri li phi debug mt ln na.
S thách đ chính ca vic trin khai mt d án phn mm ln là thc
hin đúng thi hn (on time), không l tài khóa (within budget) và d bo
trì (ease of maintenance). Mun đt đc các mc tiêu y, ta phi trin
khai nhanh và làm sao cho chng trình ít có bugs, d bo trì.
Gi d bn đng ra t chc mt đám ci. Th tng tng bit bao
nhiêu chuyn phi làm: t danh sách quan khách, thip mi, m thc, xe
c, chp hình, quay phim, vn ngh cho đn th tc nghi l, tip tân, hot


náo viên ..v.v.. Nu ch mt mình bn lo tht không bit làm sao nh cho
ht. Cng may là nhà hàng s đm trách luôn c vic in n thip mi, ban
nhc vn ngh và c hot náo viên. Th tc nghi l thì không ai qua đc
bác Sáu t, và bác đã nhn li mua quà cáp, lo v tip tân, xe c và th
tc, nghi l. Bác cng s liên lc vi Mc s ch l đ dn ch nhà th và
sp đt ngi git chuông và ngi đàn. Anh T Thông có ngi bn làm
ch tim hình, nên anh nhn trách nhim mn ngi lo chp hình, quay
phim. Nh th vic bn t chc cái đám ci nay rút li ch còn son
danh sách quan khách, các bài din vn, sp ch ngi và dn ch cho cp
v chng mi đi hng tun trng mt.
S d bn cm thy trách nhim t chc không nng 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 rc ri. Cái hay  đây
T  H C VISUAL BASIC 6.0 - PH N II 3
là nhng ngi ny t lo quyt đnh mi chi tit ca nhng gì cn phi
làm trong khâu ca h. Ch khi nào cn lm, h mi liên lc đ ly ý kin
ca bn. H ging nh nhng ngi thu ca bn. Chc bn đã lu ý
rng cái thí d t chc đám ci ny cho thy nói chung mun trin khai
d án ln nào ta cn phi nh nhng ngi thu giúp đ. Qu tht, đó là
cách các qun tr viên nhng công trình đã làm t xa đn nay.
Bây gi tr li chuyn lp trình, phi chi ta có th t chc cách trin khai
d án phn mm ging nh t chc cái đám ci nói trên thì tt quá. Tht
ra, không phi các lý thuyt gia phn mm không ngh đn chuyn y
trc đây, nhng đ thc hin đc vic y ngi ta cn trin khai các
phng tin, dng c thích hp. Ch trong vòng 15 nm tr li đây, vic
y mi tr nên c th qua các Operating Systems tinh vi, nht là dùng
Windows, và các ngôn ng lp trình nh Eiffel, SmallTalk, C++ .v.v..
Lp trình theo hng đi tng (Object Oriented
Programming)
Nói mt cách nôm na, lp trình theo hng đi tng là thit k các b
phn phn mm ca chng trình, gi là Objects sao cho mi b phn có

th t lo liu công tác ca nó ging nh mt ngi thu ngoài đi vy.
Chc có l bn s hi th thì các Sub hay Function mà bn đã tng vit
đ x lý tng giai đon trong chng trình có th đm trách vai trò ca
mt thu không?
Ngi thu chng nhng có th làm đc công tác (Subs và Functions) gì
mà còn chu trách nhim luôn c mi th vt dng cn thit (data) cho
vic y na.
Có mt cách đnh ngha khác cho Object là mt Object gm có data
structure và các Subs/Functions làm vic trên các data y. Thông thng,
khi ta dùng Objects ít khi giám th chúng, ngc li nu khi có s c gì
thì ta mun chúng báo cáo cho ta bit.
Trong VB6, các Forms, Controls hay ActiveX là nhng Objects mà ta
vn dùng lâu nay. Ly thí d nh Listbox. Mt Listbox t qun lý các
items hin th bên trong nó. Ta bit listbox List1 đang có bao nhiêu items
bng cách hi List1.ListCount. Ta bit item nào va mi đc selected
bng cách hi List1.ListIndex. Ta thêm mt item vào listbox bng cách
T  H C VISUAL BASIC 6.0 - PH N II 4
gi method AddItem ca List1, ..v.v.. Nói cho đúng ra, Object là mt
thc th ca mt Class. Nu Listbox là mt Class thì List1, List2 là các
thc th ca Listbox. Cng ging nh Bà T Cháo Lòng và Dì Sáu Bánh
Tm là các thc th ca Class u Bp.
Ngay c mt form tên frmMyForm mà ta vit trong VB6 chng hn, nó
cng là mt Class. Thng thng ta dùng thng frmMyForm nh sau:
frmMyForm.Show
Trong trng hp ny tht ra frmMyForm tuy là mt Class nhng đc
dùng y nh mt Object. Ch nu mun, ta có th to ra hai, ba Objects
ca Class frmMyForm cùng mt 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à nhng Objects
ca Class frmMyForm. Sau đó ta làm nên (instantiate) các Objects
firstForm và secondForm bng statements Set... = New...
firstForm và secondForm còn đc gi là các instances ca Class
frmMyForm. Class ging nh cái khuôn, còn Objects ging nh nhng
cái bánh làm t khuôn y. Chc bn đã đ ý thy trong VB6 t dùng hai
t Class và Object ln ln nhau. u ny cng không quan trng, min là
bn nm vng ý ngha ca chúng.
VB6 có ym tr Class mà ta có th trin khai và instantiate các Objects
ca nó khi dùng. Mt Class trong VB6 có cha data riêng ca nó, có
nhng Subs và Functions mà ta có th gi. Ngoài ra Class còn có th
Raise Events, tc là báo cho ta bit khi chuyn gì xãy ra bên trong nó.
Cng ging nh Event Click ca CommandButton, khi User clicks lên
button thì nó Raise Event Click đ cho ta x lý trong Sub
myCommandButton_Click(), chng hn. Classtrong VB6 không có h tr
Visual components, tc là không có cha nhng controls nh TextBox,
Label .v.v.. Tuy nhiên, ta có th ly nhng control có sn t bên ngoài ri
đa cho Object ca Class dùng.
T  H C VISUAL BASIC 6.0 - PH N II 5
Bây gi chúng ta hãy bt đu vit mt Class. Bn hãy m mt Project
mi loi Standard EXE Visual Basic. Sau đó dùng Menu Command chn
Add Class Module:
Khi Add Class Module dialog hin ra chn Class Module và click Open.
Bn s thy m ra mt khung trng và Project Explorer vi Properties
Window. Trong Properties Window, hãy sa Name property ca Class
thành clsBox nh di đây:
T  H C VISUAL BASIC 6.0 - PH N II 6

K đó đánh vào nhng dòng code di đâ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
mt Box t clsBox. Mi Box có ta đ (X,Y) và kích thc chiu rng và
chiu cao (width, height) ca nó. Tht ra ta có th dùng Public statement
đ declare các bin X, Y, Width và Height. Nhng  đây ta c ý declare
chúng là Private, di dng mX, mY, mWidth và mHeight. Khi ta mun
thay đi các tr s ca chúng, ta s dùng cùng mt cách vit code nh
bình thng (thí d: myBox.X = 80 ). Nhng khi chng trình x lý
assignment statement y, nó s execute mt loi method (ging nh Sub)
gi là Property Let X (vValue). Ta thy  đây vValue đc assigned
cho mX (i.e. mX = vValue ), cái Private variable ca X. Nh th công
vic ny cng chng khác gì sa đi mt Public variable X. Tuy nhiên, 
đây ta có th vit thêm code trong Property Let X đ nó làm gì cng
đc.
Bn có nh trong khi thit k mt Label, mi ln bn dùng Property
Window đ edit Font size, forcolor hay backcolor thì chng nhng các
properties y ca Label thay đi, mà kt qu ca s thay đi đc có hiu
lc ngay lp tc, ngha là Label đc hin th tr li vi tr s mi ca
property. ó là vì trong method Property có c code bo Label redisplay.
Ngc li, khi ta dùng property X ca Object myBox, không phi ta ch
đc tr s thôi mà còn execute c cái method Property Get X. Nói tóm
li, Property cho ta c hi đ execute mt method mi khi User đc hay
vit tr s variable y.

Thí d nh nu ta mun kim soát đ ch chp nhn tr s ta đ X mi
khi nó không phi là s âm. Ta s sa Property Let X li 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. Nu mun mt Property
là Read Only thì ta không cung cp Property Let. Nu mun mt Property
là Write Only thì ta không cung cp Property Get. Ngoài ra nu làm vic
vi Object, thay vì Data type thông thng, thì ta phi dùng Property
Set, thay vì Property Let.
Thí d ta cho clsBox mt Property mi, gi là Font dùng object ca class
stdFont ca VB6. Trong clsBox ta declare mt Private variable mFont và
vit mt 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 ca myBox (thuc 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 cng

v mt box nh DrawBox, nhng nó dùng BackColor ca màn nh
(canvas), nên coi nh xóa cái box có sn. Do đó, nu mun, bn có th
sa Sub DrawBox li mt chút đ nhn mt 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 bng function
IsMissing. Nu fColor là BackColor ca canvas thì ta s có hiu qu ca
ClearBox.
Trong form chính ca chng trình dùng đ test clsBox, mi khi ta refer
đn mt object thuc class clsBox, IDE Intellisense s hin th các
Properties và Subs/Functions ca clsBox nh trong hình di đây:
Trong chng trình ny, mi khi ta click nút Draw thì mt Box đc
instantiate, cho ta đ X,Y và kích thc Width, Height, ri đ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 chng trình thú v hn, khi user clicks nút Animate, ta s cho
mt box màu đ chy t trái qua phi.
Khi user clicks nút Two Boxes ta s v hai boxes, hp trong màu xanh,
hp ngoài màu đ, và cho chúng chy t trái sang phi.  đây ta biu
din cho thy mình mun instantiate bao nhiêu boxes t clsBox cng
đc, và d nhiên mi box có mt b properties vi giá tr riêng ca nó.
Ta có th lp trình đ cho Object báo cáo program ch ca nó khi có mt
bin c (Event) xãy ra bên trong Class.
Ta th declare mt Event tên Draw trong clsBox, và vit code đ mi khi

Sub DrawBox executes thì Class s Raise mt 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 hin ra trong danh sách các Object có h tr Event ca
frmClass. K đó ta s vit code đ handle Event Draw ca myBox, tc là
ta cung cp code cho Private Sub myBox_Draw (X as Integer, Y as
Integer).  đây ta ch hin th mt s đip báo cáo mt hp va đc v
 đâu.
Khi chy program, mi ln mt clsBox object executes Sub DrawBox ta
s thy frmClass display mt message ging nh di đây.
T  H C VISUAL BASIC 6.0 - PH N II 12
Nh rng, ta declare mt Object vi WithEvents khi ta mun handle các
Events ca nó. Trong thí d trên frmClass là ch ca myBox và nó
handles Event Draw ca myBox. Tng t nh vy, ngay c  bên trong
mt Class, nu Class y đc giao cho mt Object có th Raise Events
(thí d nh TextBox, ListBox, Timer .v.v..), bn cng có th declare
Object y WithEvents đ nó có th handle Events ca Object.
Trong thí d di đây ta vit codes ny trong mt Class đã đc giao cho
mt Textbox khi form chính gi Sub InitObject đ đa cho Object mt
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
Chng Hai – Debug
Bugs là nhng li lm ca program mà ta phát hin khi chy nó. Debug
là công vic loi tt c nhng li lm trong chng trình đ nó chy êm
xuôi trong mi hoàn cnh.
Thông thng mun fix mt cái bug nào trc ht ta phi tìm hiu lý do
khin nó xut hin. Mt khi đã bit đc duyên c ri ta s ngh ra cách
gii quyt. Nói chung, có hai loi bugs:
1. Hoc là program không làm đúng chuyn cn phi làm vì
programmer hiu lm Specifications hay đc cho tin tc
sai lc, hoc là program b sót chi tit cn phi có. Trng
hp ny ta gii quyt bng cách gim thiu s hiu lm qua
s nâng cp kh nng truyn thông.
2. Program không thc hin đúng nh ý programmer mun.
Tc là programmer mun mt đàng mà bo chng trình
làm mt ngã vì vô tình không vit lp trình đúng cách.
Trng hp ny ta gii quyt bng cách dùng nhng
Software Tools (k c ngôn ng lp trình) thích hp, và có
nhng quá trình làm vic có h thng.
Trong hãng xe hi ngi ta dùng t Quality Control đ nói đn vic ch
ra chic xe không có li lm gì c.  đt mc tiêu y, chng nhng cn
có ngi kim phm mà chính các nhân viên lp ráp thn trng đ công

vic chính ca ngi kim phm là xác nhn kt qu tt ch không phi
tìm li lm.
Có nhiu yu t nh hng đn cht lng ca mt program nh chc
nng ca program, cu trúc ca các b phn, k thut lp trình và phng
pháp debug. Debug không hn nm  giai đon cui ca d án mà tùy
thuc rt nhiu vào các yu t k trc trong mi giai đon trin khai.
Chc nng ca chng trình (Program Specifications)
Du program ln hay nh, trc ht ta phi xác nhn rõ ràng và t m nó
cn phi làm gì, bao nhiêu ngi dùng, mng nh th nào, database ln
bao nhiêu, phi chy nhanh đn mc nào .v.v..
T  H C VISUAL BASIC 6.0 - PH N II 14
Có nhiu chng trình phi b thay đi na chng vì programmers hiu
lm điu khách hàng mun. Kh nht là lúc gn giao hàng mi khám phá
ra có nhiu đim trong chng trình khách mun mt đàng mà ta làm mt
ngã. Do đó trong s liên h vi khách hàng ta cn phi hi đi, hi li,
phn hi vi khách hàng nhiu ln điu ta hiu bng th t, tài liu, đ
khách xác nhn là ta bit đúng ý h trc khi xúc tin vic thit k
chng trình. Nu sau ny khách đi ý, đó là quyn ca h, nhng h
phi tr tin thay đi (variation).
Cu trúc các b phn
Program nào cng có mt kin trúc tng t nh mt cn nhà. Mi b
phn càng đn gin càng tt và cách ráp các b phn phi nh th nào đ
ta d th. Trong khi thit k ta phi bit trc nhng yu đim ca mi b
phn nm  đâu đ ta chun b cách th chúng. Ta s không h tin b
phn nào hoàn ho cho đn khi đã th nó, dù nó đn s đn đâu.
Nu ta mun dùng mt k thut gì trong mt hoàn cnh nào mà ta không
bit chc nó chy không thì nên th riêng r nó trc. Phng pháp y
đc gi là Prototype.
Ngoài ra, ta cng nên k hoch cho nhng trng hp bt ng, đin
hình là bad data - khi user bm lung tung hay database cha rác rn.

Nu chng trình chy trong real-time (tc là data thu nhp qua Serial
Comm Port, Data Acquisition Card hay mng), bn cn phi lu ý nhng
trng hp khác nhau tùy theo vic gì xy ra trc, vic gì xy ra sau.
Lúc by gi Logic ca chng trình s tùy thuc vào trng thái (State)
ca data. Tt nht là ngh đn nhng Scenarios (din tin ca nhng hoàn
cnh) đ có th th tng giai đon và tình hung.
Ngày nay vi k thut i Tng,  giai đon thit k ny là lúc quyt
đnh các Data Structures (tables, records ..v.v.) và con s Forms vi
Classes. Nh rng mi Class gm có mt Data Structure và nhng
Subs/Functions/Properties làm vic (operate) trên data y. Data structure
phi cha đy đ nhng chi tit (data fields, variables) ta cn. K đó là
nhng cách chng 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 gi thì ta cho nó Public, còn nhng Subs/Functions khác hin hu
đ phc v bên trong class thì ta cho nó Private.
K thut lp trình
Cn bn ca programmers và các thói quen ca h rt quan trng. Nói
chung, nhng ngi hp tp, nhy vào vit chng trình trc khi suy
ngh hay cân nhc chính chn thì sau ny bugs lòi ra khp ni là chuyn
t nhiên.
Dùng Subs và Functions
Nu  giai đon thit k kin trúc ca chng trình ta chia ra tng Class,
thì khi lp trình ta li thit k chi tit v Subs, Functions .v.v.., mi th s
cn phi th nh th nào. Nu ta có th chia công vic ra tng giai đon
thì mi giai đon có th mà mt call đn mt Sub. Th gì cn phi tính ra
hay ly t ni khác thì có th đc thc hin bng mt Function.
Thí d nh công vic trong mt tim git i có th gm có các bc sau:
1. Nhn hàng
2. Phân chia tng loi
3. Ty

4. Git
5. i
6. Vô bao
7. Tính tin
8. Giao hàng
Trong đó các bc 1,2,6 và 8 có th là nhng Subs. Còn các bc 3,4,5
và 7 nhng Functions, thí d nh khi ta giao cho Function Git mt cái
áo d ta s ly li mt cái áo sch.
Nh rng đim khác bit chính gia mt Sub và mt Function là Function
cho ta mt kt qu mà không làm thay đi nhng parameters ta đa cho
nó. Trong khi đó, du rng Sub không cho ta gì mt cách rõ ràng nhng
nó có th thay đi tr s (value) ca bt c parameters nào ta pass cho nó
T  H C VISUAL BASIC 6.0 - PH N II 16
ByRef. Nhc li là khi ta pass mt parameter ByVal cho mt Sub thì
ging nh ta đa mt copy (bn sao) ca variable đó cho Sub, Sub có th
sa đi nó nhng nó s b b qua, không nh hng gì đn original (bn
chính) variable.
Ngc li khi ta pass mt parameter ByRef cho mt Sub thì ging nh ta
đa bn chính ca variable cho Sub đ nó có th sa đi vy.
Do đó đ tránh trng hp vô tình làm cho tr s mt variable b thay đi
vì ta dùng nó trong mt Sub/Function bn nên dùng ByVal khi pass nó
nh mt parameter vào mt Sub/Function.
Tht ra, bn có th dùng ByRef cho mt parameter pass vào mt
Function. Trong trng hp đó d nhiên variable y có th b sa đi.
iu ny gi là phn ng ph (side effect), vì bình thng ít ai làm vy.
Do đó, nu bn tht s mun vt ngoài qui c thông thng thì nên
Comment rõ ràng đ cnh cáo ngi s đc chng trình bn sau ny.
Ngoài ra, mi programmer thng có mt Source Code Library ca
nhng Subs/Functions ng ý. Bn nên dùng các Subs/Functions trong
Library ca bn càng nhiu càng tt, vì chúng đã đc th nghim ri.

ng s Error
Mi khi chng trình có mt Error, hoc là Compilation Error (vì ta
vit code không đúng vn phm, ng vng), hoc là Error trong khi chy
chng trình, thì bn không nên s nó. Hãy bình tnh đc cái Error
Message đ xem nó mun nói gì. Nu không hiu ngay thì đc đi đc li
vài ln và suy nghim xem có tìm đc mách nc nào không. Ngh
programming ca chúng ta s gp Errors nh n cm ba, nên bn phi
tp bình tnh đi din vi chúng.
Dùng Comment (Chú thích)
Lúc vit code nh thêm Comment đy đ đ bt c khi nào tr li đc
đon code y trong tng lai bn không cn phi da vào tài liu nào
khác mà có th hiu ngay lp tc mc đích ca mt Sub/Function hay
đon code.
T  H C VISUAL BASIC 6.0 - PH N II 17
Nh th không nht thit bn phi vit rt nhiu Comment nhng h có
đim nào khác thng, bí him thì bn cn thông báo và gii thích ti sao
bn làm cách y. Có th sau ny ta khám phá ra đon code có bugs; lúc
đc li có th ta s thy du rng ý đnh và thit k đúng nhng cách lp
trình có phn thiu soát chng hn.
Tính ra trung bình mt programmer ch làm vic 18 tháng  mi ch. Tc
là, gn nh chc chn code bn vit s đc ngi khác đc và bo trì (
debug và thêm bt). Do đó, code phi càng đn gin, d hiu càng tt.
ng lo ngi là chng trình s chy chm hay chim nhiu b nh, vì
ngày nay computer chy rt nhanh và b nh rt r. Khi nào ta tht s cn
phi quan tâm v vn tc và b nh thì điu đó cn đc thit k cn thn
ch không phi da vào nhng tiu xo v lp trình.
t tên các variables có ý ngha
Kh nht là làm vic vi các variables có tên vn tt nh K, L, AA, XY.
Ta không có mt chút ý nim chúng là ai, hin hu đ làm gì. Thay vào
đó, nu ta đt các tên variables nh NumberOfItems, PricePerUnit,

Discount .v.v.. thì s d hiu hn.
Mt trong nhng bugs khó thy nht là ta dùng cùng mt 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 nu bn mun nói đn global variable
trong hoàn cnh y bn s dùng lm local variable.
Dùng Option Explicit
Bn nên trung tín dùng Option Explicit  đu mi Form, Class hay
Module. Nu có variable nào đánh vn trt VB6 IDE s cho bn bit
ngay. Nu bn không dùng Option Explicit, mt variable đánh vn trt
đc xem nh mt variable mi vi giá tr 0 hay "" (empty string).
Nói chung bn nên thn trng khi assign mt data type cho mt variable
vi data type khác. Bn phi bit rõ bn đang làm gì đ khi b phn ng
ph (side effect).
T  H C VISUAL BASIC 6.0 - PH N II 18
Desk Check
Kim li code trc khi compile. Khi ta compile code, nu không có error
ch có ngha là Syntax ca code đúng, không có ngha là logic đúng. Do
đó ta cn phi bit chc là code ta vit s làm đúng điu ta mun bng
cách đc li code trc khi compile nó ln đu tiên. Công vic ny gi là
Desk Check (Kim trên bàn). Mt chng trình đc Desk Checked k
s cn ít debug và cha ít bugs không ng trc. Lý do là mi scenarios
đã đc tiên liu chu đáo.
Son mt Test Plan
Test Plan lit kê tt c nhng gì ta mun th và cách th chúng. Khi th
theo Test Plan ta s khám phá ra nhng bug và tìm cách loi chúng ra. H
s ghi li lch s ca Test Plan (trc trc gì xy ra, bn đã dùng bin pháp
nào đ gii quyt) s b ích trên nhiu phng din. Ta s hc đc t
kinh nghim Debug và bit rõ nhng th gì trong d án đã đc th theo
cách nào.

X lý Error lúc Run time
Khi EXE ca mt chng trình vit bng VB6 đang chy, nu gp Error,
nó s hin th mt Error Dialog cho bit lý do vn tc. Sau khi bn click
OK, chng trình s ngng. Nu bn chy chng trình trong VB6 IDE,
bn có dp bo program ngng  trong source code ch có Error bng
cách bm button Debug trong Error Dialog. Tip theo đó bn có th tìm
hiu tr s các variables đ đoán nguyên do ca Error. Do đó, nu bn bt
đu cho dùng mt program bn vit trong s, nu tin thì trong vài tun
đu, thay gì chy EXE ca chng trình, bn chy source code trong VB6
IDE. Nu có bug nào xy ra, bn có th cho program ngng trong source
code đ debug.
Khi bn dùng statement:
On Error Resume Next
thì t ch đó tr đi, nu chng trình gp Error, nó s b qua (ignore)
hoàn toàn. im ny tin  ch giúp chng trình EXE ca ta tránh b té
cái ch ri bin mt, rt là "quê" vi khách hàng. Nhng nó cng bt li
T  H C VISUAL BASIC 6.0 - PH N II 19
là khi khách hàng cho hay h gp nhng trng hp l, không gii thích
đc (vì Error b ignored mà không ai đ ý), thì ta cng bí luôn, có th
không bit bt đu t đâu đ debug. Do đó, d nhiên trong lúc debug ta
không nên dùng nó, nhng trc khi giao cho khách hàng bn nên cân
nhc k trc khi dùng.
Dùng Breakpoints
Cách hay nht đ theo dõi execution ca program là dùng Breakpoint đ
làm cho program ngng li  mt ch ta mun  trong code, ri sau đó ta
cho program bc tng bc. Trong dp ny ta s xem xét tr s ca
nhng variables đ coi chúng có đúng nh d đnh không.
Bn đoán trc execution s đi qua ch nào trong code, chn mt ch
thích hp ri click bên trái ca hàng code, ch du chm tròn đ nh
trong hình di đây:

Nu bn click lên du chm tròn đ mt ln na thì là hy b nó. Mt
cách khác đ đt mt breakpoint là đ editor cursor lên hàng code ri bm
F9. Nu bn bm F9 ln na khi cursor nm trên hàng đó thì là hy b
break point.
Lúc program đang dng li, bn có th xem tr s ca mt variable bng
cách đ cursor lên trên variable y, tooltip s hiên ra nh trong hình di
đây:
T  H C VISUAL BASIC 6.0 - PH N II 20
Có mt s chuyn khác bn có th làm trong lúc ny. Bn có th nm du
chm tròn đ kéo (drag) nó ngc lên mt hay nhiu hàng code đ nó s
execute tr li vài hàng code. Bn cho program execute tng hàng code
bng cách bm F8. Menu command tng đng vi nó là Debug | Step
Into. S có lúc bn không mun program bc vào bên trong mt
Sub/Function mà mun vic execute mt Sub/Function nh mt bc
đn gin. Trong trng hp đó, bn dùng Menu command Debug | Step
Over hay Shift-F8.
Nh là đ cho program chy li bn bm F5, tng đng vi Menu
command Run | Continue.
Có khi bn mun program ngng  gia mt For Loop khi Iterator value
có mt tr s khá ln. Nu ta đ sn mt breakpoint  đó ri c bm F5
nhiu ln thì hi bt tin. Có mt mánh li là dùng mt IF statement đ
th khi Iterator value có tr s y thì ta ngng  breakpoint ti statement
Beep (thay gì statement Print ICounter) nh trong hình di đây:
T  H C VISUAL BASIC 6.0 - PH N II 21
Mun hy b mi breakpoints bn dùng Menu command Debug | Clear
All Breakpoints.
 tin vic debug, bn có th dùng Debug Toolbar bng cách hin th
nó vi Menu command View | Toolbars | Debug
VB6 IDE s hin 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 nhng VB statement strong khi
program đang dng li. Ta có th dùng mt Print statement đ hin th tr
s ca mt variable hay kt qu ca mt Function, gi mt Sub hay thay
đi tr s mt variable trc khi tip tc cho chng trình chy li.
 hin th Immediate Window, dùng Menu command View | Immediate
Window.
Thay vì đánh "Print ICounter" bn cng có th đánh "? ICounter".
Nh là mi VB Statement bn đánh trong Immediate Window s đc
executed ngay khi bn bm Enter. Bn có th dùng li bt c VB
statement nào trong Immediate Window, ch cn bm Enter  cui hàng
y.
Theo du chân chng trình (Tracing)
ôi khi không tin đ ngng program nhng bn vn mun bit program
đang làm gì trong mt Sub. Bn có th đ gia code ca mt
Sub/Function mt statement ging nh di đây:
Debug.Print Format ( Now,"hh:mm:ss ") & "(Sub ProcessInput)
Current Status:" & Status đ program hin th trong Immediate
Window value ca Status khi nó execute bên trong Sub ProcessInput lúc
my gi.
Có mt cách khác là thay vì cho hin th trong Immediate Window bn
cho vit xung (Log) vào trong mt text file. Di đây là mt Sub đin
hình bn có th dùng đ Log mt 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 bn mun program ngng không phi  mt ch nào nht đnh,

nhng khi tr s ca mt variable hay ca mt expression là bao nhiêu, có
th là bn không bit ti sao mt variable t nhiên có mt tr s nh vy.
Câu hi: Ai là th phm? . Thí d bn mun program ngng li khi
ICounter = 15. Bn có th dùng Menu command Debug | Add Watch.
VB6 IDE s hin th dialog di đây. Bn đánh ICounter = 15 vào
textbox Expression và click option box Break When Value Is True
trong hp Watch Type. Làm nh vy có ngha là ta mun program
ngng khi ICounter bng 15.
T  H C VISUAL BASIC 6.0 - PH N II 24
Dùng Phng Pháp Trit Khai (Elimination Method)
Có mt phng pháp rt thông dng khi debug là Comment Out nhng
hàng code nghi ng đ xem bug có bin mt không. Nó đc gi là
Elimination Method. Nu bug bin mt thì nhng hàng code đã đc
comment out là th phm. Bn có th Comment Out mt s hàng cùng
mt lúc bng cách highlight các hàng y ri click Comment Block trên
Edit ToolBar.
Khi dùng Elimination Method bn phi cân nhc Logic ca code bn
trong khi quyt đnh Comment Out nhng hàng nào, nu không, đó là
mt phng pháp khá nguy him.
Ngoài ra, Menu Command View | Locals Window lit kê cho bn tr s
ca tt c variables trong mt Sub/Function và View | Call Stack lit kê
th bc các Sub gi ln lt t ngoài vào trong cho đn v trí code đang
ngng hin thi.
T  H C VISUAL BASIC 6.0 - PH N II 25
Chng Ba - Dùng Menu
Menu trong Windows là ni tt c các commands ca mt program
đc sp xp th t theo tng loi đ giúp ta dùng d dàng.
Có hai loi menu ta thng gp: drop-down (th xung) menu và pop-
up (hin lên) menu. Ta dùng drop-down menu làm Menu chánh cho
chng trình. Thông thng nó nm  phía trên chóp màn nh. Nm dc

theo chiu ngang là Menu Bar, nu ta click lên mt command trong Menu
Bar thì program s th xung mt menu vi nhng MenuItems nm dc
theo chiu thng đng. Nu ta click lên MenuItem nào có du hình tam
giác nh bên phi thì program s popup mt Menu nh trong hình di
đây (khi ta click Format | Make Same Size):
Main Menu
Ta dùng Menu Editor đ to hoc sa mt Menu cho program. Menu
thuc v mt Form. Do đó, trc ht ta select mt Form đ làm vic vi
Designer ca nó (ch không phi code ca Form). K đó ta dùng Menu
Command Tools | Menu Editor hay click lên icon ca Menu Editor trên
Toolbar đ làm cho Menu Editor hin ra.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×