ACCESS LAP TRINH TRUC QUAN

Embed Size (px)

Citation preview

GIO TRNH MN HC

LP TRNH TRC QUANTi liu tham kho

PHN I MICROSOFT ACCESS

iii

iv

Lp trnh trc quan

BI 1. M ULch s pht trin ca Tin hc lun gn lin vi vic tm kim cc phng php lp trnh gip cho ngi s dng trin khai cc ng dng mt cch d dng, nhanh chng v hiu qu. Nh chng ta bit, mi loi my tnh ch c th hiu v thc hin c cc lnh cng nh chng trnh theo mt loi ngn ng dnh ring c gi l ngn ng my. Tuy nhin, nu trin khai cc ng dng trong thc t m phi vit chng trnh trc tip bng ngn ng my th s rt phc tp, i hi thi gian v cng sc rt ln, nhiu khi khng th thc hin c. V vy, ngi ta tm cch xy dng mt ngn ng lp trnh ring gn vi cc ngn ng t nhin, thun li cho vic trin khai cc ng dng. Khi thc hin cc chng trnh bng ngn ng ny phi qua mt bc dch chng trnh sang ngn ng my n c th thc hin. T trc n nay c rt nhiu ngn ng lp trnh c ra i v phc v c lc cho vic khai cc ng dng trn my tnh. Trong giai on u, cc ngn ng lp trnh tuy d s dng hn ngn ng my nhng rt kh vi cc lp trnh vin v c im cha mnh d dng trin khai cc thut ton. Chng trnh cha c tnh cu trc cht ch v mt d liu cng nh t chc chng trnh. V vy, vic trin khai cc ng dng trong thc t bng cc ngn ng lp trnh ny l rt kh khn. Giai on 2 l thi k ca cc ngn ng lp trnh c cu trc. Cc ngn ng lp trnh ny c c im l c tnh cu trc cht ch v mt d liu v t chc chng trnh. Mt lot cc ngn ng lp trnh c cu trc ra i v dc s dng rng ri nh : PASCAL, C, PROLOG... Giai on 3 l thi k ca lp trnh hng i tng v phng php lp trnh c bc bin i mnh. Trong cc ngn ng lp trnh c cu trc th mt ng dng bao gm hai thnh phn ring l d liu v chng trnh. Tuy chng c quan h cht ch nhng l hai i tng ring bit. Trong phng php lp trnh hng i tng th mi mt i tng lp trnh s bao hm c d liu v phng thc hnh ng trn d liu . V vy, vic lp trnh s n gin v mang tnh k tha cao, tit kim c thi gian lp trnh. Tuy nhin, vi cc phng php lp trnh trn u i hi lp trnh vin phi nh rt nhiu cu lnh vi mi lnh c mt c php v tc dng ring, khi vit chng trnh phi t lp ni cc lnh c mt chng trnh gii quyt tng bi ton ring bit. 1

Lp trnh trc quan

Trong xu hng pht trin mnh m hin nay ca Tin hc, s ngi s dng my tnh tng ln rt nhanh v my tnh c s dng trong hu ht cc lnh vc ca i sng nn i hi cc ngn ng lp trnh cng phi n gin, d s dng v mang tnh i chng cao. Chnh v vy phng php lp trnh trc quan ra i. c im ca cc ngn ng lp trnh trc quan l d s dng, trin khai cc ng dng mt cch nhanh chng. Hin nay cc ngn ng lp trnh, h qun tr c s d liu theo hng trc quan thng dng nh : Visual Basic, Visual Foxpro, Visual C, Delphi... Trong chng trnh ny gii thiu mt s chng trnh lp trnh thng dng nh Access, Basic v VB .Net lm quen vi phng php lp trnh trc quan trong vic trin khai mt s cc ng dng. c im ni bt ca phng php lp trnh trc quan l : Cho php xy dng chng trnh theo mt hng khc gi l event - driven programming (lp trnh theo tnh hung), ngha l mt chng trnh ng dng c vit theo kiu ny p ng da theo tnh hung xy ra lc thc hin chng trnh. Tnh hung ny bao gm ngi s dng n mt phm tng ng, chn la mt nt lnh hoc gi mt lnh t mt ng dng khc chy song song cng lc. Ngi lp trnh trc tip to ra cc khung giao din (interface), ng dng thng qua cc thao tc trn mn hnh da vo cc i tng (ojbect) nh hp hi thoi hoc nt iu khin (control button), nhng i tng ny mang cc thuc tnh (properties) ring bit nh : mu sc, Font ch.. m ta ch cn chn la trn mt danh sch cho sn. Khi dng cc ngn ng lp trnh trc quan ta rt t khi phi t vit cc lnh, t chc chng trnh... mt cch rc ri m ch cn khai bo vic g cn lm khi mt tnh hung xut hin. My tnh s da vo phn thit k v khai bo ca lp trnh vin t ng to lp chng trnh.

-

-

-

Nh vy vi lp trnh trc quan ngi lp trnh vin ging nh mt nh thit k, t chc to ra cc biu mu, ngh cc cng vic cn thc hin v my tnh s da vo xy dng chng trnh. Trong chng trnh ny ta s xt cch s dng h qun tr c s d liu Microsoft Access v ngn ng lp trnh Visual Basic.

2

Lp trnh trc quan

BI 2. ACCESS

2.1.

Gii thiu

Microsoft Access l mt phn mm qun l c s d liu rt mnh v c s dng rng ri hin nay. N cho php ngi s dng qun l, bo tr v khai thc s liu c lu tr mt cch c t chc trn my tnh. Access nm trong b Microsoft Office ca cng ty Microsoft. Trong chng trnh ny chng ti gii thiu trn phin bn Access 98, y l phin bn mi c nhiu ci tin so vi cc phin bn trc y. s dng c Access 98, my tnh phi tha mn cc yu cu c bn sau : CPU Pentium tr ln. B nh RAM 32 MB tr ln. H iu hnh Windows 95 tr i.

Trong phin bn ny chng ta c hng mt s cng c b sung so vi cc phin bn c trc y nh : truy cp d liu Access t cc trang Web, qun l cc tp tin c cha cc lin kt n nhng tp tin khc, h tr a ng, qun l d dng cc i tng ha, s dng cc Macro h tr cho t ng ha vic qun l d liu...

2.2.

Khi ng ACCESS

Sau khi ci t Microsoft Office (chn component Access), mi ln lm vic vi Access chng ta khi ng : - Bt my tnh - Chn Start --> Program --> Microsoft Access Hoc nhn p chut ti biu tng ca Access trn Desktop.

3

Lp trnh trc quan

Lc s xut hin lm vic ca ACCESS nh sau :

To c s d liu mi To c s d liu mi theo mu c sn. M c s d liu c

-

2.3.

Khi nim v c s d liu trong Access

C s d liu l mt tp hp cc d liu lin quan n mt ch hay mt mc ch qun l no . Cc thnh phn ca c s d liu Access bao gm : TABLE (bng) : l thnh phn c bn ca c s d liu, n cho php lu tr d liu phc v cng tc qun l. Trong mt Table, s liu c t chc thnh cc trng (Field) v cc bn ghi (Record). QUERY (vn tin) : l cng c truy vn thng tin v thc hin cc thao tc trn d liu. Query cho php lin kt cc d liu t nhiu Table khc nhau, chn la cc thng tin cn quan tm, n l nn tng xy dng cc bo co theo yu cu thc t. FORM (mu) : cho php xy dng cc mu nhp s liu ging nh trong thc t. Ta c th cng lc nhp s liu vo nhiu Table khc nhau thng qua SubForm. REPORT (bo co) : l cc bo co s liu thng bo kt qu cho ngi s dng. Trong Report ta c th kt hp vi Query to cc bo co theo nhng yu cu khc nhau trong thc t. Trn Report bao gm s liu, hnh nh, th... m t cho s liu.

-

-

-

4

Lp trnh trc quan

-

MACRO (lnh ngm) : l mt tp hp cc lnh nhm t ng thc hin cc thao tc thng gp. Khi gi Macro, Access s t ng thc hin mt dy cc lnh tng ng, n c xem l mt c lp trnh n gin, cho php ngi s dng chn la cng vic ty theo tnh hung hin ti. MODULE (n th) : mt dng t ng ha chuyn su hn Macro, l nhng hm ring ca ngi s dng c vit bng ngn ng VBA. Ta ch nn s dng Module trong trng hp cc Macro khng p ng c yu cu .

-

2.4.

Cc php ton

2.4.1 Cc php ton Logic Not : cho kt qu ngc li And : cho kt qu ng ch khi c hai u ng. Or : cho kt qu sai ch khi c hai u sai. Xor : cho kt qu ng khi hai iu kin c gi tr tri nhau. Epv : cho kt qu ng ch khi hai iu kin c cng gi tr. 2.4.2 Cc php ton s hc ^ : ly tha. * : nhn. / : chia \ : chia ly phn nguyn. Mod : chia ly phn d + : cng - : tr

5

Lp trnh trc quan

2.4.3 Cc php ton so snh : >, >=, .................... 60 MsgBox "Bn tui V hu" Case Else MsgBox "Bn khng phi con ngi" End Select End Sub

12.2.

Cu trc lp : cho php t ng lp i lp li nhm lnh nhiu ln.

12.2.1 Cu trc :FOR = [Khi ch th 1] [Exit For] [Khi ch th 2] NEXT TO [STEP n]

-

Bin m : l tn bin dng kim tra s ln lp. Gi tr u : l gi tr khi gn ln u tin cho bin m khi thc hin vng lp.

- Gi tr cui : l gi tr cui cng ca bin m. Khi bin m t n gi tr ny th vng lp thc hin ln cui v dng qu trnh lp. - STEP n : ch nh bc nhy n thc hin thay i gi tr ca bin m sau mi ln lp. Khi ch th : lit k cc ch th cn thc hin trong mi ln lp. Exit For : nu trong vng lp m gp ch th ny th s ngng vng lp. 92

Lp trnh trc quan

Vng lp trn cho php t ng thc hin cc ch th vi s ln lp xc nh trc. V d : vit on lnh in ra cc s nguyn t 1 n 10.FOR so! = 1 Print so! NEXT so! TO 10 'bin s l Single

V d : vit on lnh in ra cc s vi bc nhy 0.25 v t 0 n 10.FOR so! = 0 Print so! NEXT so! TO 10 STEP 0.25 'bin s l Single

12.2.2 Cu trc :WHILE [Khi ch th] Wend

- iu kin : qui nh iu kin thc hin vng lp. Nu iu kin c gi tr True th thc hin khi ch th, gp Wend s quay tr li kim tra iu kin. Qu trnh trn kt thc khi iu kin c gi tr False. Khi ch th : cc ch th cn thc hin trong vng lp.

V d : vit on lnh in ra cc s nguyn t 1 n 10.So! = 1 While so! CX Then ' Set DrawWidth. DrawWidth = ScaleWidth / 25 Else DrawWidth = ScaleHeight / 25 End If For I = 0 To 50 Step 2 ' Set up loop. F = I / 50 ' Perform interim F1 = 1 - F: F2 = 1 + F ' calculations. Line (CX * F1, CY)-(CX, CY * F1) ' Draw upper-left. Line -(CX * F2, CY) ' Draw upper-right. Line -(CX, CY * F2) ' Draw lower-right. Line -(CX * F1, CY) ' Draw lower-left. ForeColor = QBColor(I Mod 15) ' Change color each time. Next I DoEvents ' Yield for other processing. End Sub

13.3.

Cls Method[object.]Cls

C php :

Tc dng : xa mn hnh ca Form. V d :Private Sub Xoa_Click() Dim Msg ' Declare variable. AutoRedraw = -1 ' Turn on AutoRedraw. ForeColor = QBColor(15) ' Set foreground to white.

99

Lp trnh trc quan

BackColor = QBColor(1) ' Set background to blue. FillStyle = 7 ' Set diagonal crosshatch. Line (0, 0)-(ScaleWidth, ScaleHeight), , B ' Put box on form. Msg = "This is information printed on the form background." CurrentX = ScaleWidth / 2 - TextWidth(Msg) / 2 ' Set X position. CurrentY = 2 * TextHeight(Msg) ' Set Y position. Print Msg ' Print message to form. Msg = "Choose OK to clear the information and background " Msg = Msg & "pattern just displayed on the form." MsgBox Msg ' Display message. Cls ' Clear form background. End Sub

13.4.

Hide Method[Object.]Hide

C php :

Tc dng : che ca s Form. V d : che v lm xut hin li ca s Form ang lm vic..Private Sub Chehien_Click() Dim Msg ' Declare variable. Hide ' Hide form. Msg = "Choose OK to make the form reappear." MsgBox Msg ' Display message. Show ' Show form again. End Sub

13.5.

Show Method[Object.]Show

C php :

Tc dng : lm xut hin ca s Form.Private Sub Chehien_Click() Dim Msg ' Declare variable. Hide ' Hide form. Msg = "Choose OK to make the form reappear." MsgBox Msg ' Display message.

100

Lp trnh trc quan

Show End Sub

' Show form again.

13.6.

Item Method[Object.]Item(Index)

C php :

Tc dng : sp xp li cc thnh vin trong Collection theo th t ca kha ch nh trong Index. V d :Dim Dim Set Set SmithBillBD SmithAdamBD SmithBillBD SmithAdamBD As Object As Object = Birthdays.Item("SmithBill") = Birthdays("SmithAdam")

13.7.

Move Method[Object.]Move Left [, Top][, Width][, Height]

C php : -

Object: tn Object cn chuyn dch. Left : qui nh gi tr cn dch chuyn sang bn tri. Top : qui nh dch chuyn ln pha trn. Width : qui nh rng mi ca i tng. Height : qui nh cao mi ca i tng.

Tc dng : cho php di chuyn v iu chnh kch thc ca i tng. V d :Private Sub dichuyen_Click() Dim Inch, Msg ' Declare variables. Msg = "Choose OK to resize and move this form by " Msg = Msg & "changing the value of properties." MsgBox Msg ' Display message. Inch = 1440 ' Set inch in twips.

101

Lp trnh trc quan

Width = 4 * Inch ' Set width. Height = 2 * Inch ' Set height. Left = 0 ' Set left to origin. Top = 0 ' Set top to origin. Msg = "Now choose OK to resize and move this form " Msg = Msg & "using the Move method." MsgBox Msg ' Display message.Move Screen.Width-2*Inch, Screen.Height-Inch, 2*Inch, Inch

End Sub

13.8.

Point Method[Object.]Point (X, Y)

C php : -

X : Honh ca im cn v. Y : Tung ca im cn v.

Tc dng : tr v mt im c toa xc nh. V d : t mu bng cc du chm.Private Sub vediem_Click() Dim LeftColor, MidColor, Msg, RightColor 'Declare variables. AutoRedraw = -1 ' Turn on AutoRedraw. Height = 3 * 1440 ' Set height to 3 inches. Width = 5 * 1440 ' Set width to 5 inches. BackColor = QBColor(1) ' Set background to blue. ForeColor = QBColor(4) ' Set foreground to red. Line (0, 0)-(Width / 3, Height), , BF ' Red box. ForeColor = QBColor(15) ' Set foreground to white. Line (Width / 3, 0)-((Width / 3) * 2, Height), , BF LeftColor = Point(0, 0) ' Find color of left box, MidColor = Point(Width / 2, Height / 2) ' middle box, and RightColor = Point(Width, Height) ' right box. Msg = "The color number for the red box on the left side of " Msg = Msg & "the form is " & LeftColor & ". The " Msg = Msg & "color of the white box in the center is " Msg = Msg & MidColor & ". The color of the blue " Msg = Msg & "box on the right is " & RightColor & "."

102

Lp trnh trc quan

MsgBox Msg End Sub

' Display message.

13.9.

Print Method[Object.]Print OutputList

C php :

Tc dng : cho php in gi tr cc biu thc trong OutputList ra i tng. OutputList l mt danh sch cc biu thc cn in. Object l tn i tng m ta cn in ln . Nu mun in my in th tn Object l Printer. V d :Private Sub Command1_Click() Dim MyVar MyVar = "Chc cc bn lp trnh tht tt vi Visual Basic." Print MyVar End Sub

13.10. PrintForm MethodC php : [Object.]PrintForm

Tc dng : cho php in tt c cc hnh nh ca biu mu ra giy. Nu khng ch r tn Form th Form ang lm vic s c in. Object y l tn Form cn in. V dPrivate Sub Command1_Click() Dim Msg ' Declare variable. On Error GoTo ErrorHandler ' Set up error handler. PrintForm ' Print form. Exit Sub ErrorHandler: Msg = "The form can't be printed." MsgBox Msg ' Display message. Resume Next End Sub

103

Lp trnh trc quan

13.11. PSet MethodC php : [Object.]Pset [Step] (X, Y)[, Color] - Object : An object expression that evaluates to an object in the Applies To list. If object is omitted, the Form with the focus is assumed to be object. - Step : A keyword specifying that the coordinates are relative to the current graphics position given by the CurrentX and CurrentY properties. - (X, Y) : Single-precision values indicating the horizontal (x-axis) and vertical (y-axis) coordinates of the point to set. Color: Long integer value indicating the RGB color specified for point.

Tc dng : tng t nh Point Method. V d : v cc chm im vi mu sc v v tr ngu nhin trn ca s Form.Private Sub Form_Click () Dim CX, CY, Msg, XPos, YPos ' Declare variables. ScaleMode = 3 ' Set ScaleMode to pixels. DrawWidth = 5 ' Set DrawWidth. ForeColor = QBColor(4) ' Set background to red. FontSize = 24 ' Set point size. CX = ScaleWidth / 2 ' Get horizontal center. CY = ScaleHeight / 2 ' Get vertical center. Cls ' Clear form. Msg = "Chc mng nm mi!" CurrentX = CX - TextWidth(Msg) / 2 ' Horizontal position. CurrentY = CY - TextHeight(Msg) ' Vertical position. Print Msg ' Print message. Do XPos = Rnd * ScaleWidth ' Get horizontal position. YPos = Rnd * ScaleHeight ' Get vertical position. PSet (XPos, YPos), QBColor(Rnd * 15) ' Draw confetti. DoEvents ' Yield to other Loop ' processing. End Sub

104

Lp trnh trc quan

13.12. Refresh MethodC php : [Object.]Refresh Tc dng : cho php "lm ti'" li i tng, ngha l n cho php v li hnh nh ca Object. V d :Private Sub Form_Click () Dim FNMA, I, Msg ' Declare variables. File1.Pattern = "TestFile.*" ' Set file pattern. For I = 1 To 8 ' Do eight times. FNMA = "TESTFILE." & I Open FNMA For Output As FreeFile ' Create empty file. File1.Refresh ' Refresh file list box. Close ' Close file. Next I Msg = "Choose OK to remove the created test files." MsgBox Msg ' Display message. Kill "TESTFILE.*" ' Remove test files. File1.Refresh ' Update file list box. End Sub

13.13. Scale MethodC php : [Object.]Scale [(X1, Y1) - (X2, Y2)] Object : tn ca i tng cn nh li h thng ta . (X1, Y1) : ta gc trn bn tri. (X2, Y2) : ta gc phi bn di.

Tc dng : qui nh li h thng ta theo yu cu ngi s dng. Nu khng c (X1, Y1) v (X2, Y2) th tr h thng ta v gi tr ngm nh. V d :

105

Lp trnh trc quan

Private Sub Tile_Click() Dim I, OldFontSize ' Declare variables. Width = 8640: Height = 5760 ' Set form size in twips. Move 100, 100 ' Move form origin. AutoRedraw = -1 ' Turn on AutoRedraw. OldFontSize = FontSize ' Save old font size. BackColor = QBColor(7) ' Set background to gray. Scale (0, 110)-(130, 0) ' Set custom coordinate system. For I = 100 To 10 Step -10 Line (0, I)-(2, I) ' Draw scale marks every 10 units. CurrentY = CurrentY + 1.5 ' Move cursor position. Print I ' Print scale mark value on left. Line (ScaleWidth - 2, I)-(ScaleWidth, I) CurrentY = CurrentY + 1.5 ' Move cursor position. CurrentX = ScaleWidth - 9 Print I ' Print scale mark value on right. Next I ' Draw bar chart. Line (10, 0)-(20, 45), RGB(0, 0, 255), BF ' First blue bar. Line (20, 0)-(30, 55), RGB(255, 0, 0), BF ' First red bar. Line (40, 0)-(50, 40), RGB(0, 0, 255), BF Line (50, 0)-(60, 25), RGB(255, 0, 0), BF Line (70, 0)-(80, 35), RGB(0, 0, 255), BF Line (80, 0)-(90, 60), RGB(255, 0, 0), BF Line (100, 0)-(110, 75), RGB(0, 0, 255), BF Line (110, 0)-(120, 90), RGB(255, 0, 0), BF CurrentX = 18: CurrentY = 100 ' Move cursor position. FontSize = 14 ' Enlarge font for title. Print "Widget Quarterly Sales" ' Print title. FontSize = OldFontSize ' Restore font size. CurrentX = 27: CurrentY = 93 ' Move cursor position. Print "Planned Vs. Actual" ' Print subtitle. Line (29, 86)-(34, 88), RGB(0, 0, 255), BF ' Print legend. Line (43, 86)-(49, 88), RGB(255, 0, 0), BF Scale End Sub

Ch : ta c th thay i n v o trong Visual Basic bng cch thay i tr s ca ScaleMode trong b thuc tnh Properties. 106

Lp trnh trc quan

13.14. SetFocus MethodC php : [Object.]SetFocus Tc dng : cho php tham chiu n Object c tn c ch nh thc hin cc thay i trn nu c. V d : Vehinh.SetFocus

13.15. Show MethodC php : [Object.]Show [Style] Style qui nh trng thi v n c gi tr 0 hoc 1. Tc dng : cho php lm xut hin i tng c tn c ch nh. V d :

Private Sub Hienhinh_Click() Dim Msg ' Declare variable. Hide ' Hide form. Msg = "Choose OK to make the form reappear." MsgBox Msg ' Display message. Show ' Show form again. End Sub

13.16. TextHeight v TextWidth MethodsC php : [Object.]TextHeight (String) [Object.]TextWidth (String) - Object : tn ca i tng c n nh kch c Font ch m ta da vo tnh chiu cao v chiu rng ca on vn bn cn th hin. String : ni dung chui k t m Method s tnh ton chiu cao v chiu rng.

107

Lp trnh trc quan

Tc dng : tnh ton v tr v kt qu l chiu cao v chiu rng ca String. V d :Private Sub Inchu_Click() Dim HalfWidth, HalfHeight, Msg ' Declare variable. AutoRedraw = -1 ' Turn on AutoRedraw. BackColor = QBColor(4) ' Set background color. ForeColor = QBColor(15) ' Set foreground color. Msg = "Visual Basic" ' Create message. FontSize = 48 ' Set font size. HalfWidth = TextWidth(Msg) / 2 ' Calculate one-half width. HalfHeight = TextHeight(Msg) / 2 ' Calculate one-half height. CurrentX = ScaleWidth / 2 - HalfWidth ' Set X. CurrentY = ScaleHeight / 2 - HalfHeight ' Set Y. Print Msg ' Print message. End Sub

108

Lp trnh trc quan

BI 14. HMTrong Visual Basic xy dng sn cc hm phc v cho vic x l d liu mt cch dng v nhanh chng. Trong phn ny ta xt mt s hm thng dng.

14.1.

Cc hm x l chui :LEN(String)

14.1.1 Tm chiu di chui :

Tr v kt qu l s k t c trong String. V d : LEN("ABCD") tr v kt qu l 4. 14.1.2 Chuyn sang ch thng : LCase(String) hoc Lcase$(String) Tr v kt qu l chui k t mi sau khi i chui c sang ch thng. Nu c du $ th tr v kt qu thuc kiu d liu Varian nu c $ kt qu tr v kiu String. V d : LCase("ABCD") tr v kt qu l abcd. 14.1.3 Chuyn sang ch in : UCase(String) hoc Ucase$(String) Tr v kt qu l chui k t mi sau khi i chui c sang ch in. Nu c du $ th tr v kt qu thuc kiu d liu Varian nu c $ kt qu tr v kiu String. V d : UCase("abcd") tr v kt qu l ABCD. 14.1.4 Ly cc k t bn tri : Left(String,n) hoc Left$(String,n) Tr v kt qu l chui k t mi gm n k t bn tri ca chui c. V d : Left("ABCD",2) tr v kt qu l AB 109

Lp trnh trc quan

14.1.5 Ly cc k t bn phi: Right(String,n) hoc Right$(String,n) Tr v kt qu l chui k t mi gm n k t bn phi ca chui c. V d : Right("ABCD",2) tr v kt qu l CD 14.1.6 Ly nhm k t bt k: Mid(String,m,n) hoc Mid$(String,m,n) Tr v kt qu l chui k t mi gm n k t bt u t k t th m ca chui c. V d : Mid("ABCD",2,2) tr v kt qu l BC 14.1.7 B cc k t trng: Trim(String) hoc Trim$(String) Tr v kt qu l chui k t mi sau khi vt b cc k t trng hai u chui c. V d : Trim(" AB ") tr v kt qu l "AB"

14.1.8 B cc k t trng bn tri: LTrim(String) hoc LTrim$(String) Tr v kt qu l chui k t mi sau khi vt b cc k t trng bn tri ca chui c. V d : LTrim(" AB ") tr v kt qu l "AB " 14.1.9 B cc k t trng bn phi: RTrim(String) hoc RTrim$(String) Tr v kt qu l chui k t mi sau khi vt b cc k t trng bn phi ca chui c. V d : RTrim(" AB ") tr v kt qu l " AB"

110

Lp trnh trc quan

14.1.10

i m s sang k t:

Chr(m s) hoc Chr$(m s) Tr v kt qu l mt k t tng ng vi m s trong bng m ANSI. M s l mt s nguyn t 0 n 255. V d : Chr(65) tr v kt qu l "A" 14.1.11 i k t sang m s:

Asc(K t) Tr v kt qu l mt s kiu Integer tng ng vi k t trong bng m ANSI. V d : Asc("A") tr v kt qu l 65. 14.1.12 i chui sang s:

Val(biu thc chui) Tr v kt qu l mt s sau khi i chui dng s (kiu String) sang gi tr s. V d : Val("123") + Val("213") tr v kt qu l 336 14.1.13 i s sang chui:

Str[$](biu thc s) Tr v kt qu l mt chui k t sau khi i s sang.

V d : Str(123) + Str(213) tr v kt qu l "123213" 14.1.14 nh dng chui:

Format[$](biu thc [, dng]) Tr v kt qu l mt chui k t c nh dng theo mt khun mu cho trc. Biu thc y c th l s hoc chui. Cc k t nh dng s :

111

Lp trnh trc quan

# : hin th s nu c cn khng th khng hin g c. 0 : hin th s nu c cn khng th xut hin k t 0. . : hin th du chm v tr khai bo. , : hin th du phy v tr khai bo. % : nhn biu thc vi 100 ri xut hin du %. V d :So! = 1234.5 Format(so, "#.###") Format(so, "###,#.##") Format(so, "0.000") Format(so, "0%") Format(so, "$0.00") kt qu 1234.5 kt qu 1,234.5 kt qu 1234.5000 kt qu 1234500% kt qu $1234.50

-

Cc k t nh dng chui k t : & : hin th k t nu c cn khng th khng hin g c. & : hin th k t nu c cn khng th hin ln mt k t trng. < : i chui sang ch trng. > : i chui sang ch in.

V d :Format("visual basic",">") Format("VISUAL BASIC",">") tr v "VISUAL BASIC" tr v "visual basic"

14.1.15

Tm chui con:

InStr[$]([s,] chui 1, chui 2[, so snh]) Trong : S : nu c th n qui nh v tr bt u tm kim. Khng c th tm t u.

112

Lp trnh trc quan

- So snh : l qui nh phng thc tm. Nu so snh l gi tr 1 th khng phn bit ch in vi ch thng, nu gi tr 0 th c phn bit ch in vi ch thng. Chui 1 : chui m. y l chui c th cha chui cn tm. Chui 2 : chui con. y l chui cn tm xem c c cha trong chui 1 hay khng.

Hm ny tr v kt qu l gi tr s. Nu bng 0 ngha l khng tm thy, nu mt s ln th khng th l v tr xut hin chui 2 trong chui 1. V d : InStr("I Love You", "Love") tr v kt qu l 3

InStr("I Love You", "love", 0) tr v kt qu 0.

14.2.

Cc hm x l s :Tnh sin ca gc. Tnh Cosin ca mt gc Tnh Tang ca mt gc Tnh Arctang ca mt gc Expenential Logarithm Chuyn i mt s v kiu Currency Chuyn i mt s v kiu Integer Chuyn i mt s v kiu Long Chuyn i mt s v kiu Single Chuyn i mt s v kiu Double B phn thp phn i thnh s nguyn Qui trn v s nguyn. 113

1. SIN(gc) 2. COS(gc) 3. TAN(gc) 4. ATAN(s) 5. EXP(s) 6. LOG(s) 7. CCUR(s) 8. CINT(s) 9. CLNG(s) 10. CSNG(s) 11. CDBL(s) 12. FIX(s) 13. INT(s)

Lp trnh trc quan

14. RND[(s)] 15. ABS(s) 16. SGN(s) 17. SQR(s)

To mt s ngu nhin. Tr tuyt i Du m/dng ca mt con s Ly cn bc hai.

114

Lp trnh trc quan

BI 15. DNG LIST CONTROLSC hai loi List controls dng trong VB6. l Listbox v Combobox. C hai u hin th mt s dng ta c th la chn. Listbox chim mt khung ch nht, nu chiu ngang nh th c khi khng hin th y mt dng, nu chiu di khng hin th tt c mi dng th Listbox t ng cho ta mt vertical scroll bar cho bit cn c nhiu dng b che v ta c th xem cc dng y bng cch dng vertical scroll bar. Combobox thng ch hin th mt dng, nhng ta c th chn hin th bt c dng no khc. Combobox ging nh mt tp hp ca mt Textbox nm pha trn v mt Listbox nm pha di.

Listbox c rt nhiu cng dng v n rt uyn chuyn khi s dng. Trong bi ny chng ta s xem xt cc ng dng sau ca Listbox : Hin th nhiu s la chn ngi s dng c th chn bng cch click hay drag-drop Nhng cch dng Property Sorted Cch dng Multiselect Dng hin th Events Dng Search hay x l text Cch dng Itemdata song song vi cc Items ca danh sch Dng lm Queue

115

Lp trnh trc quan

15.1. Listbox15.1.1 Hin th nhiu s la chn Ta hy bt u vit mt chng trnh gm c mt Listbox tn lstNames nm trong mt Form. Trong lstNames ta nh vo tn ca by ngi, mi ln xung dng nh nh CtrlEnter, thay v ch Enter, nu khng VB6 ngm hiu nh xong nn t ng ca s Property List. Cc tn ny l nhng dng s hin ra trong Listbox khi ta bt u chy chng trnh.

Ngoi lstNames ta cho thm mt Label vi Caption STUDENTS trang tr, v mt Label khc tn lblName. Mi khi ngi s dng click ln dng tn no ta mun hin th dng tn y trong lblName. Sau cng ta cho vo mt CommandButton tn CmdExit cho dng dng chng trnh. Ta s c chng trnh nh sau:Private Sub lstNames_Click() lblName.Caption = lstNames.List(lstNames.ListIndex) End Sub Private Sub CmdExit_Click() End End Sub

116

Lp trnh trc quan

Gi s ta click vo tn John Smith trn Listbox, ta s thy tn y cng uc hin th trong Label lblName.

Trong v d ny, Listbox lstNames c 7 dng (Items). Con s Items ny l Property ListCount ca Listbox. Cc Items ca Listbox c m t 0 n ListCount-1. Trong trng hp ny l t 0 n 6. Khi ngi s dng click ln mt dng, Listbox s generate Event lstNames_Click. Lc by gi ta c th bit c ngi s dng va mi Click dng no bng cch hi Property ListIndex ca lstNames, n s c value t 0 n ListCount-1. Lc chng trnh mi chy, cha ai Click ln Item no ca Listbox th ListIndex = -1. Nhng Items trong Listbox c xem nh mt mng xu k t. Array ny c gi l List. Do , ta ni n Item th nht ca Listbox lstNames bng cch vit lstNames.List(0) , v tng t nh vy, Item cui cng l lstNames.List( lstNames.ListCount-1). Ta c th ni n item va c Clicked bng hai cch: lstNames.List(lstNames.ListIndex) lstNames.text.

15.1.2 Save content ca Listbox By gi lu tr ni dung ca lstNames, ta thm mt CommandButton tn CmdSave. Ta s vit code khi ngi s dng click nt CmdSave chng trnh s m mt Output text file v vit mi items ca lstNames vo :

117

Lp trnh trc quan

Private Sub CmdSave_Click() Dim i, FileName, FileNumber FileName = App.Path ' Make sure FileName ends with a backslash If Right(FileName, 1) "\" Then FileName = FileName & "\" FileName = FileName&"MyList.txt" 'output text file MyList.txt ' Obtain an available filenumber from the operating system FileNumber = FreeFile ' Open the FileName as an output file Open FileName For Output As FileNumber ' Now iterate through each item of lstNames For i = 0 To lstNames.ListCount - 1 ' Write the List item to file Print #FileNumber, lstNames.List(i) Next Close FileNumber ' Close the output file End Sub

App l mt Object c bit i din cho chnh chng trnh ang chy. y ta dng Property Path bit lc chng trnh ang chy th thc thi module EXE ca n nm u. L do l ta thng cc files lin h cn thit cho chng trnh ln qun hoc ngay trong folder ca chng trnh hay trong mt subfolder, chng hn nh data, logs, .v.v.. App cn c mt s Properties khc cng rt hu dng nh PrevInstance, Title, Revision ..v.v. Nu mi khi ng mt chng trnh m thy App.PrevInstance = True th lc by gi cng c mt copy khc ca chng trnh ang chy. Nu cn ta End program ny trnh chy 2 bn sao ca chng trnh cng mt lc. App.Title v App.Revision cho ta tin tc v Title v Revision ca chng trnh ang chy. vit ra mt Text file ta cn phi Open n trong mode Output v khai bo t y tr i s dng mt con s (FileNumber) i din tp tin thay v dng chnh FileName. trnh dng mt FileNumber hin hu, tt nht ta hi xin h iu hnh cung cp cho mnh mt con s cha ai dng bng cch gi Function FreeFile. Con s FileNumber ny cn uc gi l FileHandle (Handle l tay cm). Sau khi ta Close FileNumber con s ny tr nn FREE v h iu hnh s c th dng n li.

118

Lp trnh trc quan

Do chng ta phi trnh gi FreeFile lin tip hai ln, v OS s cho chng ta cng mt con s. Tc l, sau khi gi FreeFile phi dng n ngay bng cch Open mt File ri mi gi FreeFile ln k c mt con s khc. cch dng ch Input, Output cho files l relative (tng i) vi v tr ca chng trnh (n nm trong memory ca computer). Do t trong memory vit ra a cng th gi l Output. Ngc li c t mt Text file nm trn hard disk vo memory cho chng trnh ta th gi l Input. 15.1.3 Load mt Text file vo Listbox Trong bi ny, thay v nh cc Items ca Listbox vo Property List ca lstNames ta c th populate (lm y) lstNames bng cch c cc Items t mt Text file. Ta th thm mt CommandButton tn CmdLoad. Ta s vit code khi ngi s dng click nt CmdLoad chng trnh s m mt Input text file v c tng dng b vo lstNames:Private Sub CmdLoad_Click() Dim i, FileName, FileNumber, anItem ' Obtain Folder where this program's EXE file resides FileName = App.Path ' Make sure FileName ends with a backslash If Right(FileName, 1) "\" Then FileName = FileName & "\" FileName = FileName & "MyList.txt" ' Obtain an available filenumber from the operating system FileNumber = FreeFile ' Open the FileName as an input file Open FileName For Input As FileNumber lstNames.Clear ' Clear the Listbox first ' Now read each line until reaching End-Of-File Do While NOT EOF(FileNumber) Line Input #FileNumber, anItem ' Read a line from the file lstNames.AddItem anItem ' Add this item to the lstNames Loop Close FileNumber ' Close the input file End Sub

c t mt Text file ta cn phi Open n trong mode Input.

119

Lp trnh trc quan

Trc khi populate lstNames ta cn phi xa tt c mi items c sn bn trong. thc hin vic ta dng method Clear ca Listbox. Sau ta dng method AddItem cho thm tng dng vo trong Listbox. By default, nu ta khng ni nht vo ch dng no th AddItem nht Item mi vo di cht ca Listbox. Nu mun nht dng mi vo ngay trc item th 5 (ListIndex = 4), ta vit:stNames.AddItem newItemString, 4 ' newItemString contains ' To insert a new Item at the beginning of the Listbox, write: lstNames.AddItem newItemString, 0

Nh l mi ln chng ta Add mt Item vo Listbox th ListCount ca Listbox tng 1. Mun xa mt item t Listbox ta dng method RemoveItem, v d nh mun xa item th ba (ListIndex=2) ca lstNames, ta vit:lstNames.RemoveItem 2

Mi ln chng ta RemoveItem t Listbox the ListCount ca Listbox gim i mt n v 1. Do nu chng ta dng Test da vo ListCount ca mt ListBox nhy ra khi mt Loop th phi coi chng trnh lm cho value ListCount thay i trong Loop v AddItem hay RemoveItem. Ta c tng dng ca mt Text file bng cch dng Line Input #FileNumber. Khi c n cui File, system d cho ta value EOF(FileNumber) = True. Ta dng value y cho chng trnh nhy ra khi While.. Loop. Cu Do While NOT EOF(FileNumber) c ngha Trong khi cha n End-Of-File ca Text File i din bi FileNumber th c tng dng v b vo Listbox.

15.2. Drag-DropTa xem qua Click Event ca Listbox. By gi dng Drag-Drop cho Listbox chng ta hy t 2 Labels mi ln Form. Ci th nht tn g cng c nhng c Caption l Room A. Hy gi Label th hai l lblRoom v cho Property BorderStyle ca n bng Fixed Single. K n select c hai Labels (Click a Label then hold down key Ctrl while clicking the second Label) ri click copy v paste ln Form. VB6 s cho chng ta Array cahailblRoom labels.

120

Lp trnh trc quan

cho lstNames mt DragIcon, chng ta click lstNames, click Property DragIcon popup mt dialog cho chng ta chn mt dragdrop icon t folder C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Dragdrop, chng hn nh DRAG2PG.ICO:

Ta s dng Event MouseDown ca lstNames pop-up DragIcon hnh 2 trang giy cho UserDrag n qua bn phi ri b xung ln mt trong hai lblRoom. Khi DragIcon ri ln lblRoom, lblRoom s generate Event DragDrop. Ta s dng Event DragDrop ny assignproperty Text ca Source (tc l lstNames, mc control t n pht xut Drag action) vo Property Caption ca lblRoom. Lu v y ta dng cng mt tn cho c hai lblRoom nn ch cn vit code mt ch handle Event DragDrop.Private Sub lstNames_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' Start Pop-up DragIcon and start Drag action lstNames.Drag End Sub Private Sub lblRoom_DragDrop(Index As Integer, Source As Control, X As Single, Y As Single) ' Assign Property Text of Source (i.e. lstNames) to Caption lblRoom(Index).Caption = Source.Text End Sub

Kt qu sau khi Drag hai tn t Listbox qua Labels l nh sau:

121

Lp trnh trc quan

15.3. Dng Property SortedTrong v d trn ta c th quyt nh v tr ca mt Item mi khi ta nht n vo Listbox. i khi ta mun cc Items ca Listbox c t ng sp theo th t Alphabet. Chng ta c th set Property Sorted = True thc hin chuyn ny. C mt gii hn l chng ta phi cho Property Sorted mt value (True hay False) trong lc design, ch trong khi chy chng trnh chng ta khng th lm cho Property Sorted ca Listbox thay i. Gi d ta mun sort cc Items ca mt Listbox khi cn. Vy th ta lm sao? Gii php rt n gin. Chng ta to mt Listbox tn lstTemp chng hn. Cho n Property Visible= False ( khng ai thy n) v Property Sorted=True. Khi cn sort lstNames chng hn, ta copy content ca lstNames b vo lstTemp, on Clear lstNames ri copy content ( c sorted) ca lstTemp tr li lstNames. Lu l ta c th AddItem vo mt Listbox vi Property Sorted=True, nhng khng th xc nh nht Item vo trc dng no, v v tr ca cc Items do Listbox quyt nh khi n sort cc Items. Ta hy cho thm vo Form mt CommandButton mi tn CmdSort v vit code cho Event Click ca n nh sau:Private Sub CmdSort_Click() Dim i lstTemp.Clear ' Clear temporary Listbox ' Iterate though every item of lstNames For i = 0 To lstNames.ListCount - 1 ' Add the lstNames item to lstTemp

122

Lp trnh trc quan

lstTemp.AddItem lstNames.List(i) Next lstNames.Clear ' Clear lstNames ' Iterate though every item of lstTemp For i = 0 To lstTemp.ListCount - 1 ' Add the lstTemp item to lstNames lstNames.AddItem lstTemp.List(i) Next lstTemp.Clear ' Tidy up - clear temporary Listbox End Sub

Nhn tin, ta mun c option sort cc tn theo FirstName hay Surname. Vic ny hi rc ri hn mt cht, nhng nguyn tc vn l dng ci sorted Listbox v hnh tn lstTemp. Chng ta hy t ln pha trn lstName hai Labels mi tn lblFirstName v lblSurName v cho chng Caption "FirstName" v "SurName". T y ta Load file "MyList.txt" vo lstNames bng cch Click button CmdLoad ch khng Edit Property List ca lstNames enter Items lc design na. Ngoi ra ta dng du phy (,) tch FirstName khi SurName trong mi tn cha trong file MyList.txt. Content ca file MyList.txt by gi tr thnh nh sau:Peter,Jones Kevin,White Sue,Rose John,Smith Trevor,Kennedy Alan,Wright Ron, Bruno

Ta s sa code trong Sub CmdLoad_Click li khi nht tn vo lstNames, FirstName v SurName mi th chim 10 characters. cc ch trong Items ca lstNames sp dng ngay ngn ta i Font ca lstNames ra Courier New. Courier New l mt loi Font m chiu ngang ca tt c cc ch l nh nhau, trong khi hu ht cc Fonts khc nh Arial, Times Roman ..v.v. l Proportional Spacing, c ngha l rng cc k t l khc nhau. Listing mi ca Sub CmdLoad_Click tr thnh nh sau: 123

Lp trnh trc quan

Private Sub CmdLoad_Click() Dim i, Pos Dim FileName, FileNumber, anItem Dim sFirstName As String*10 ' fixed length string of 10 chars Dim sSurName As String * 10 ' fixed length string of 10 chars ' Obtain Folder where this program's EXE file resides FileName = App.Path ' Make sure FileName ends with a backslash If Right(FileName, 1) "\" Then FileName = FileName & "\" FileName = FileName & "MyList.txt" ' Obtain an available filenumber from the operating system FileNumber = FreeFile ' Open the FileName as an input file , using FileNumber Open FileName For Input As FileNumber lstNames.Clear ' Clear the Listbox first ' Now read each line until reaching End-Of-File Do While Not EOF(FileNumber) Line Input #FileNumber, anItem ' Read a line from the file ' Now separate FirstName from SurName Pos = InStr(anItem, ",") ' Locate the comma "," ' The part before "," is FirstName sFirstName = Left(anItem, Pos - 1) sFirstName = Trim(sFirstName) ' Trim off any blank spaces ' The part after "," is SurName sSurName = Mid(anItem, Pos + 1) sSurName = Trim(sSurName) ' Trim off any blank spaces lstNames.AddItem sFirstName & sSurName ' Add this item to the bottom of lstNames Loop Close FileNumber ' Close the input file End Sub

V FirstName nm bn tri ca mi Item nn sort theo FirstName cng ging nh sort c Item. Vic y ta lm bng Sub CmdSort_Click ri, do khi ngi s dng click Label lblFirstName ta ch cn gi CmdSort_Click nh sau:Private Sub lblFirstName_Click() CmdSort_Click End Sub

124

Lp trnh trc quan

sort theo SurName ta cn phi tm thi SurName qua bn tri ca Item trc khi b vo lstTemp. Ta thc hin chuyn ny bng cch hon chuyn v tr ca FirstName v SurName trong Item trc khi b vo lstTemp. Sau , khi copy cc Items t lstTemp t vo li lstNames ta li nh hon chuyn FirstName v SurName chng nm ng li v tr. Code sort tn theo SurName cng ging nh CmdSort_Add nhng sa i cht t nh sau:Private Sub lblSurName_Click() Dim i, anItem Dim sFirstName As String*10 'fixed length string of 10 chars Dim sSurName As String * 10 ' fixed length string of 10 chars lstTemp.Clear ' Clear temporary Listbox ' Iterate though every item of lstNames For i = 0 To lstNames.ListCount - 1 anItem = lstNames.List(i) ' Identify FistName and SurName sFirstName = Left(anItem, 10) sSurName = Mid(anItem, 11) ' Swap FirstName/SurName positions before adding to lstTemp lstTemp.AddItem sSurName & sFirstName Next lstNames.Clear ' Clear lstNames ' Iterate though every item of lstTemp For i = 0 To lstTemp.ListCount - 1 anItem = lstTemp.List(i) sSurName = Left(anItem, 10) ' SurName now is on the left sFirstName = Mid(anItem, 11) ' Add FirstName/SurName in correct positions to lstNames lstNames.AddItem sFirstName & sSurName Next lstTemp.Clear ' Tidy up - clear temporary Listbox End Sub

Cc Items trong lstNames sorted theo SurName hin ra nh sau:

125

Lp trnh trc quan

Nhn tin y ta sa Sub CmdSave_Click Save Items theo sorted order mi nu cn:Private Sub CmdSave_Click() Dim i, FileName, FileNumber, anItem ' Obtain Folder where this program's EXE file resides FileName = App.Path ' Make sure FileName ends with a backslash If Right(FileName, 1) "\" Then FileName = FileName & "\" ' Call Output filename "MyList.txt" FileName = FileName & "MyList.txt" ' Obtain an available filenumber from the operating system FileNumber = FreeFile ' Open the FileName as an output file, using FileNumber Open FileName For Output As FileNumber ' Now iterate through each item of lstNames For i = 0 To lstNames.ListCount - 1 anItem = lstNames.List(i) anItem=Trim(Left(anItem, 10)) & "," & Trim(Mid(anItem, 11)) ' Write the List item to file. Make sure you use symbol # in front of FileNumber Print #FileNumber, anItem Next Close FileNumber ' Close the output file End Sub

126

Lp trnh trc quan

BI 16. T TO OBJECTT trc n gi, ta lp trnh VB6 bng cch thit k cc Forms ri vit codes x l cc Events ca nhng controls trn Form khi ngi s dng click mt Button hay Listbox, .v.v.. Ni chung, cch y cng hu hiu trin khai chng trnh, nhng nu ta c th hng c cc li ch sau y th cng tt hn : Dng li c code vit trc y trong mt d n khc D nhn din c mt li (error) pht xut t u D trin khai mt d n ln bng cch phn phi ra thnh nhiu d n nh D bo tr

Lp trnh theo hng i tng l thit k cc b phn phn mm ca chng trnh, gi l Objects sao cho mi b phn c th t lo liu cng tc ca n ging nh mt module lm vic c lp. Cu hi t ra l cc Sub hay Function m chng ta tng vit x l tng giai on trong chng trnh c th m trch vai tr ca mt module c lp khng? C mt cch nh ngha khc cho Object l mt Object gm c data structure v cc Subs/Functions lm vic trn cc data y. Thng thng, khi ta dng Objects khng cn gim st chng thc hin nh th no, ngc li nu khi c s c g th ta mun chng bo co cho ta bit. Trong VB6, cc Forms, Controls hay ActiveX l nhng Objects m ta vn s dng. Ly v d nh Listbox. Mt Listbox t qun l cc items hin th bn trong n. Ta bit listbox List1 ang c bao nhiu items bng cch hi List1.ListCount. Ta bit item no va mi c selected bng cch hi List1.ListIndex. Ta thm mt item vo listbox bng cch gi method AddItem ca List1, ..v.v.. Ni cho ng ra, Object l mt thc th ca mt Class. Nu Listbox l mt Class th List1, List2 l cc thc th ca Listbox. Ngay c mt form tn frmMyForm m ta vit trong VB6 chng hn, n cng l mt Class. Thng thng ta dng thng frmMyForm nh sau:frmMyForm.Show

127

Lp trnh trc quan

Trong trng hp ny tht ra frmMyForm tuy l mt Class nhng c dng y nh mt Object. Neu cn thit, ta c th to ra hai, ba Objects ca Class frmMyForm cng mt lc nh trong v d sau:Dim firstForm As frmMyForm Dim secondForm As frmMyForm Set firstForm = New frmMyForm Set secondForm = New frmMyForm firstForm.Show secondForm.Show

Trong v d trn ta khai bo firstForm v secondForm l nhng Objects ca Class frmMyForm. Sau ta lm nn (instantiate) cc Objects firstForm v secondForm bng statements Set... = New... firstForm v secondForm cn c gi l cc instances ca Class frmMyForm. Class ging nh ci khun, cn Objects ging nh nhng ci bnh lm t khun y. Chc chng ta thy trong VB6 t dng hai t Class v Object ln ln nhau. u ny cng khng quan trng, min l chng ta nm vng ngha ca chng. VB6 c ym tr Class m ta c th trin khai v instantiate cc Objects ca n khi dng. Mt Class trong VB6 c cha data ring ca n, c nhng Subs v Functions m ta c th gi. Ngoi ra Class cn c th Raise Events, tc l bo cho ta bit khi chuyn g xy ra bn trong n. Cng ging nh Event Click ca CommandButton, khi ngi s dng clicks ln button th n Raise Event Click cho ta x l trong Sub myCommandButton_Click(), chng hn. Classtrong VB6 khng c h tr Visual components, tc l khng c cha nhng controls nh TextBox, Label .v.v.. Tuy nhin, ta c th ly nhng control c sn t bn ngoi ri a cho Object ca Class dng. By gi chng ta hy bt u vit mt Class. Chng ta hy m mt Project mi loi Standard EXE Visual Basic. Sau dng Menu Command chn Add Class Module:

Khi Add Class Module dialog hin ra chn Class Module v click Open. 128

Lp trnh trc quan

Chng ta s thy m ra mt khung trng v Project Explorer vi Properties Window. Trong Properties Window, hy sa Name property ca Class thnh clsBox nh di y:

K nh vo nhng dng code di y, trong c biu din cch dng Class clsBox.Option Explicit Private mX As Integer Private mY As Integer Private mWidth As Integer Private mHeight As Integer

129

Lp trnh trc quan

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 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)

130

Lp trnh trc quan

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 dng mt v d c th l mt Box t clsBox. Mi Box c ta (X,Y) v kch thc chiu rng v chiu cao (width, height) ca n. Tht ra ta c th dng Public statement khai bo cc bin X, Y, Width v Height. Nhng y ta c declare chng l Private, di dng mX, mY, mWidth v mHeight. Khi ta mun thay i cc tr s ca chng, ta s dng cng mt cch vit code nh bnh thng (v d: myBox.X = 80 ). Nhng khi chng trnh x l assignment statement y, n s thc thi mt loi method (ging nh Sub) gi l Property Let X (vValue). Ta thy y vValue c assigned cho mX (i.e. mX = vValue ), ci Private variable ca X. Nh th cng vic ny cng chng khc g sa i mt Public variable X. Tuy nhin, y ta c th vit thm code trong Property Let X n lm g cng c. Mi ln chng ta dng Property Window edit Font size, forcolor hay backcolor th chng nhng cc 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 thc hiu redisplay. Ngc li, khi ta dng property X ca Object myBox, khng phi ta ch c tr s thi m cn thc thi c ci method Property Get X. Ni tm li, Property cho ta c hi thc thi mt method mi khi ngi s dng c hay vit tr s variable y. V d nh nu ta mun kim sot ch chp nhn tr s ta X mi khi n khng phi l s m. Ta s sa Property Let X li nh sau: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 khng cung cp Property Let. Nu mun mt Property l Write Only th ta khng cung cp Property Get. Ngoi ra nu lm vic vi Object, thay v Data type thng thng, th ta phi dng Property Set, thay v Property Let.

131

Lp trnh trc quan

V d ta cho clsBox mt Property mi, gi l Font dng 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 dng 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 dng BackColor ca mn nh (canvas), nn coi nh xa ci box c sn. Do , nu mun, chng ta c th sa Sub DrawBox li mt cht 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

Trong v d trn, Optional parameter fColor c tested bng function IsMissing. Nu fColor l BackColor ca canvas th ta s c hiu qu ca ClearBox. Trong form chnh ca chng trnh dng test clsBox, mi khi ta refer n mt object thuc class clsBox, IDE Intellisense s hin th cc Properties v Subs/Functions ca clsBox nh trong hnh di y:

132

Lp trnh trc quan

Trong chng trnh ny, mi khi ta click nt Draw th mt Box c instantiate, cho ta X,Y v kch thc Width, Height, ri c v ra ngay trn form. Ch Me trong code ni n chnh ci form frmClass.

cho chng trnh th v hn, khi ngi s dng clicks nt Animate, ta s cho mt box mu chy t tri qua phi. Khi ngi s dng clicks nt Two Boxes ta s v hai boxes, hp trong mu xanh, hp ngoi mu , v cho chng chy t tri sang phi. y ta biu din cho thy mnh mun instantiate bao nhiu boxes t clsBox cng c, v d nhin mi box c mt b properties vi gi tr ring ca n. 133

Lp trnh trc quan

Ta c th lp trnh cho Object bo co chng trnh ch ca n khi c mt bin c (Event) xy ra bn trong Class. Ta th khai bo mt Event tn 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

134

Lp trnh trc quan

By 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 sch cc 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 thng ip bo co mt hp va c v u.

Khi chy chng trnh, mi ln mt clsBox object thc hin Sub DrawBox ta s thy frmClass hin th mt message ging nh di y.

Nh rng, ta declare mt Object vi WithEvents khi ta mun handle cc Events ca n. Trong v d trn frmClass l ch ca myBox v n handles Event Draw ca myBox. Tng t nh vy, ngay c bn trong mt Class, nu Class y c giao cho mt Object c th Raise Events (v d nh TextBox, ListBox, Timer .v.v..), chng ta cng c th khai bo Object y vi cc s kin km theo n c th qun l cc Events ca Object. Trong v d di y ta vit codes ny trong mt Class c giao cho mt Textbox khi form chnh 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 End Sub

135

Lp trnh trc quan

BI 17. DEBUGBugs l nhng li ca chng trnh m ta pht hin khi chy n. Debug l cng vic loi tt c nhng lm trong chng trnh n chy m xui trong mi tnh hung. Thng thng mun sa mt ci bug no trc ht ta phi tm hiu l do khin n xut hin. Mt khi bit c duyn c ri ta s ngh ra cch gii quyt. Ni chung, c hai loi bugs : hoc l chng trnh khng lm ng chuyn cn phi lm v lp trnh vin hiu lm Specifications hay c cho tin tc sai lc, hoc l chng trnh b st chi tit cn phi c. Trng hp ny ta gii quyt bng cch gim thiu s hiu lm qua s nng cp kh nng truyn thng. Chng trnh khng thc hin ng nh lp trnh vin mun, tc l lp trnh vin mun mt ng m bo chng trnh lm mt ng v v tnh khng vit chng trnh ng cch. Trng hp ny ta gii quyt bng cch dng nhng Software Tools (k c ngn ng lp trnh) thch hp, v c nhng qu trnh lm vic c h thng. C nhiu yu t nh hng n cht lng ca mt chng trnh nh chc nng ca chng trnh, cu trc ca cc b phn, k thut lp trnh v phng php debug. Debug khng hn nm giai on cui ca d n m ty thuc rt nhiu vo cc yu t k trn trong mi giai on trin khai.

17.1. c t chng trnh (Program Specifications)Du chng trnh ln hay nh, trc ht ta phi xc nh r rng v t m n cn phi lm g, bao nhiu ngi dng, mng nh th no, database ln bao nhiu, phi chy nhanh n mc no .v.v.. C nhiu chng trnh phi b thay i na chng v lp trnh vin hiu lm iu khch hng mun. Do trong s lin h vi khch hng ta cn phi hi i, hi li, phn hi vi khch hng nhiu ln iu ta hiu bng th t, ti liu, khch xc nhn l ta bit ng h trc khi xc tin vic thit k chng trnh. Nu sau ny khch i , l quyn ca h, nhng h phi tr tin thay i (variation).

136

Lp trnh trc quan

17.1.1 Cu trc cc b phn Chng trnh no cng c mt kin trc tng t nh mt c my. Mi b phn cng n gin cng tt v cch rp cc b phn phi nh th no ta d th. Trong khi thit k ta phi bit trc nhng yu im ca mi b phn nm u ta chun b cch th chng. Ta s khng h tin b phn no hon ho cho n khi th n, d n n gin n u. Nu ta mun dng mt k thut g trong mt hon cnh no m ta khng bit chc n chy khng th nn th ring r n trc. Phng php y c gi l Prototype. Ngoi ra, ta cng nn xy dng nhng kch bn test cho nhng trng hp c bit, in hnh l bad data - khi ngi s dng bm lung tung hay database cha nhiu rc. Nu chng trnh chy trong real-time (tc l data thu nhp qua Serial Com Port, Data Acquisition Card hay mng), chng ta cn phi lu nhng trng hp khc nhau ty theo vic g xy ra trc, vic g xy ra sau. Lc by gi Logic ca chng trnh s ty thuc vo trng thi (State) ca data. Tt nht l ngh n nhng Scenarios c th th tng giai on v tnh hung. Ngy nay vi k thut hng i tng, giai on thit k ny l lc quyt nh cc 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 lm vic (operate) trn data y. Data structure phi cha y nhng chi tit (data fields, variables) ta cn. K l nhng cch chng trnh process data. Subs/Functions no c th cho bn ngoi gi th ta cho n Public, cn nhng Subs/Functions khc hin hu phc v bn trong class th ta cho n Private. 17.1.2 K thut lp trnh Kin thc c bn ca lp trnh vin v cc thi quen ca h rt quan trng. Ni chung, nhng ngi hp tp, nhy vo vit chng trnh trc khi suy ngh hay cn nhc chn chn th sau ny bugs xut hin nhiu l iu t nhin. 17.1.3 Dng Subs v Functions Nu giai on thit k kin trc ca chng trnh ta chia ra tng Class, th khi lp trnh ta li thit k chi tit v Subs, Functions .v.v.., mi th s cn phi th nh th no. Nu ta c th chia cng vic ra tng giai on th mi giai on c th m mt call n mt Sub. Th g cn phi tnh ra hay ly t ni khc th c th c thc hin bng mt Function. 137

Lp trnh trc quan

Nh rng im khc bit chnh gia mt Sub v mt Function l Function cho ta mt kt qu m khng lm thay i nhng parameters ta a cho n. Trong khi , du rng Sub khng cho ta g mt cch r rng nhng n c th thay i tr s (value) ca bt c parameters no ta chuyn cho n ByRef. Nhc li l khi ta chuyn 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, khng nh hng g n original (bn chnh) variable. Ngc li khi ta chuyn mt parameter ByRef cho mt Sub th ging nh ta a bn chnh ca variable cho Sub n c th sa i vy. Do trnh trng hp v tnh lm cho tr s mt variable b thay i v ta dng n trong mt Sub/Function chng ta nn dng ByVal khi chuyn n nh mt parameter vo mt Sub/Function. Tht ra, chng ta c th dng ByRef cho mt parameter chuyn vo mt Function. Trong trng hp d nhin variable y c th b sa i. iu ny gi l phn ng ph (side effect), v bnh thng t ai lm vy. Do , nu chng ta tht s mun vt ngoi qui c thng thng th nn Comment r rng cnh bo ngi s c chng trnh chng ta sau ny. Ngoi ra, mi lp trnh vin thng c mt Source Code Library ca nhng Subs/Functions ng . Chng ta nn dng cc Subs/Functions trong Library ca chng ta cng nhiu cng tt, v chng c th nghim ri.

17.2. Mt s lu 17.2.1 ng s Error Mi khi chng trnh c mt Error, hoc l Compilation Error (v ta vit code khng ng vn phm, ng vng), hoc l Error trong khi chy chng trnh, th chng ta khng nn s n. Hy bnh tnh c ci Error Message xem n mun ni g. Nu khng hiu ngay th c i c li vi ln v suy nghim xem c tm c s hng dn no khng. Khi lp trnh chng ta s gp Errors rt nhiu, nn chng ta phi tp bnh tnh i din vi chng.

138

Lp trnh trc quan

17.2.2 Dng Comment (Ch thch) Lc vit code nh thm Comment y bt c khi no tr li c on code y trong tng lai chng ta khng cn phi da vo ti liu no khc m c th hiu ngay lp tc mc ch ca mt Sub/Function hay on code. Nh th khng nht thit chng ta phi vit rt nhiu Comment nhng h c im no khc thng, b him th chng ta cn thng bo v gii thch ti sao chng ta lm cch y. C th sau ny ta khm ph ra on code c bugs; lc c li c th ta s thy du rng nh v thit k ng nhng cch lp trnh c phn thiu kim sot chng hn. Tnh ra trung bnh mt lp trnh vin ch lm vic 18 thng mi ch. Tc l, gn nh chc chn code chng ta vit s c ngi khc c v bo tr ( debug v thm bt). Do , code phi cng n gin, d hiu cng tt. ng lo ngi l chng trnh s chy chm hay chim nhiu b nh, v ngy nay computer chy rt nhanh v b nh rt r. Khi no ta tht s cn phi quan tm v vn tc v b nh th iu cn c thit k cn thn ch khng phi da vo nhng tiu xo v lp trnh. 17.2.3 t tn cc variables c ngha Trong thc t chng ta gp rt nhiu kh khn khi lm vic vi cc variables c tn vn tt nh K, L, AA, XY. Ta khng c mt cht nim g v chng, mc ch s dng chng lm g. Thay vo , nu ta t cc tn variables nh NumberOfItems, PricePerUnit, Discount .v.v.. th s d hiu hn. Mt trong nhng bugs kh thy nht l ta dng cng mt tn 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 cng tn, nn nu chng ta mun ni n global variable trong hon cnh y chng ta s dng lm local variable. 17.2.4 Dng Option Explicit Chng ta nn trung thnh vi cch dng Option Explicit u mi Form, Class hay Module. Nu c variable no nh vn sai VB6 IDE s cho chng ta bit ngay. Nu chng ta khng dng Option Explicit, mt variable nh vn sai c xem nh mt variable mi vi gi tr 0 hay "" (empty string).

139

Lp trnh trc quan

Ni chung chng ta nn thn trng khi assign mt data type cho mt variable vi data type khc. Chng ta phi bit r chng ta ang lm g khi b phn ng ph (side effect). 17.2.5 Desk Check Kim li code trc khi compile. Khi ta compile code, nu khng c error ch c ngha l Syntax ca code ng, khng c ngha l logic ng. Do ta cn phi bit chc l code ta vit s lm ng iu ta mun bng cch c li code trc khi compile n ln u tin. Cng vic ny gi l Desk Check (Kim trn bn). Mt chng trnh c Desk Checked k s cn t debug v cha t bugs khng ng trc. L do l mi scenarios c tin liu chu o. 17.2.6 Son mt Test Plan Test Plan lit k tt c nhng g ta mun th v cch th chng. Khi th theo Test Plan ta s khm ph ra nhng bug v tm cch loi chng ra. H s ghi li lch s ca Test Plan (trc trc g xy ra, chng ta dng bin php no gii quyt) s b ch trn nhiu phng din. Ta s hc c t kinh nghim Debug v bit r nhng th g trong d n c th theo cch no.

17.3. Cc k thut x l li17.3.1 X l Error lc Run time Khi EXE ca mt chng trnh vit bng VB6 ang chy, nu gp Error, n s hin th mt Error Dialog cho bit l do gy li. Sau khi chng ta click OK, chng trnh s ngng. Nu chng ta chy chng trnh trong VB6 IDE, chng ta c dp bo chng trnh ngng trong source code ch c Error bng cch bm button Debug trong Error Dialog. Tip theo chng ta c th tm hiu tr s cc variables on nguyn do ca Error. Do , nu chng ta bt u cho dng mt chng trnh chng ta vit cho ni b n v, nu tin th trong vi tun u, thay g chy EXE ca chng trnh, chng ta chy source code trong VB6 IDE. Nu c bug no xy ra, chng ta c th cho chng trnh ngng trong source code debug. Khi chng ta dng statement: ON Error Resume Next Th t ch tr i, nu chng trnh gp Error, n s b qua (ignore) hon ton. im ny tin ch gip chng trnh EXE ca ta trnh b treo ngay lp tc ti im xut hin bug. Nhng n cng bt li l khi khch hng cho hay h gp nhng trng hp l, khng gii thch c (v Error b ignored m khng ai ), th ta cng b lun, c th khng bit bt 140

Lp trnh trc quan

u t u debug. Do , d nhin trong lc debug ta khng nn dng n, nhng trc khi giao cho khch hng chng ta nn cn nhc k trc khi dng. 17.3.2 Dng Breakpoints Cch hay nht theo di execution ca chng trnh l dng Breakpoint lm cho chng trnh ngng li mt ch ta mun trong code, ri sau ta cho chng trnh bc tng bc. Trong dp ny ta s xem xt tr s ca nhng variables coi chng c ng nh d nh khng. Chng ta on trc execution s i qua ch no trong code, chn mt ch thch hp ri click bn tri ca dng code, ch du chm trn nh trong hnh di y:

Nu chng ta click ln du chm trn mt ln na th l hy b n. Mt cch khc t mt breakpoint l editor cursor ln dng code ri bm F9. Nu chng ta bm F9 ln na khi cursor nm trn dng th l hy b break point. Lc chng trnh ang dng li, chng ta c th xem tr s ca mt variable bng cch cursor ln trn variable y, tooltip s hin ra nh trong hnh di y:

C mt s chuyn khc chng ta c th lm trong lc ny. Chng ta c th nm du chm trn ko (drag) n ngc ln mt hay nhiu dng code n s thc thi tr li vi dng code. Chng ta cho chng trnh thc thi tng dng code bng cch bm F8. Menu command tng ng vi n l Debug | Step Into. S c lc chng ta khng mun chng trnh bc

141

Lp trnh trc quan

vo bn trong mt Sub/Function m mun vic thc thi mt Sub/Function nh mt bc n gin. Trong trng hp , chng ta dng Menu command Debug | Step Over hay Shift-F8.

Nh l cho chng trnh chy li chng ta bm F5, tng ng vi Menu command Run | Continue. C khi chng ta mun chng trnh 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 phng php hu hiu l dng 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 hnh di y:

Mun hy b mi breakpoints chng ta dng Menu command Debug | Clear All Breakpoints. tin vic debug, chng ta c th dng Debug Toolbar bng cch hin th n vi Menu command View | Toolbars | Debug

VB6 IDE s hin th Debug Toolbar nh sau: 142

Lp trnh trc quan

17.3.3 Dng Immediate Window Immediate Window cho php ta thc thi nhng VB statement trong khi chng trnh ang dng li. Ta c th dng 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 trnh chy li. hin th Immediate Window, dng Menu command View | Immediate Window.

Thay v nh "Print ICounter" chng ta cng c th nh "? ICounter". Nh l mi VB Statement chng ta nh trong Immediate Window s c executed ngay khi chng ta bm Enter. Chng ta c th dng li bt c VB statement no trong Immediate Window, ch cn bm Enter cui dng y. 17.3.4 Theo du chn chng trnh (Tracing) i khi khng tin ngng chng trnh nhng chng ta vn mun bit chng trnh ang lm g trong mt Sub. Chng ta c th gia code ca mt Sub/Function mt statement ging nh di y.

143

Lp trnh trc quan

Debug.Print Format ( Now,"hh:mm:ss ") & "(Sub ProcessInput) Current Status:" & Status chng trnh hin th trong Immediate Window value ca Status khi n thc thi bn trong Sub ProcessInput lc my gi. C mt cch khc l thay v cho hin th trong Immediate Window chng ta cho vit xung (Log) vo trong mt text file. Di y l mt Sub in hnh chng ta c th dng 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 ' 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

144

Lp trnh trc quan

End Select Close FileNo End Sub

17.3.5 Dng Watch Window i khi chng ta mun chng trnh ngng khng phi mt ch no nht nh, nhng khi tr s ca mt variable hay ca mt expression l bao nhiu, c th l chng ta khng bit ti sao mt variable t nhin c mt tr s nh vy. V d chng ta mun chng trnh ngng li khi ICounter = 15. Chng ta c th dng Menu command Debug | Add Watch. VB6 IDE s hin th dialog di y. Chng ta nh ICounter = 15 vo textbox Expression v click option box Break When Value Is True trong hp Watch Type. Lm nh vy c ngha l ta mun chng trnh ngng khi ICounter bng 15.

17.3.6 Dng phng php loi suy (Elimination Method) C mt phng php rt thng dng khi debug l loi b nhng dng code nghi ng xem bug c bin mt khng. N c gi l Elimination Method. Nu bug bin mt th nhng dng code c loi b l th phm. Chng ta c th Comment Out mt s dng cng mt lc bng cch highlight cc dng y ri click Comment Block trn Edit ToolBar.

145

Lp trnh trc quan

Khi dng Elimination Method chng ta phi cn nhc Logic ca code chng ta trong khi quyt nh Comment Out nhng dng no, nu khng, l mt phng php kh nguy him. Ngoi ra, Menu Command View | Locals Window lit k cho chng ta tr s ca tt c variables trong mt Sub/Function v View | Call Stack lit k th bc cc Sub gi ln lt t ngoi vo trong cho n v tr code ang ngng hin thi.

146

Lp trnh trc quan

BI 18. DNG MENUMenu trong Windows l ni tt c cc commands ca mt chng trnh c sp xp th t theo tng loi gip ta dng d dng. C hai loi menu ta thng gp : drop-down (th xung) menu v pop-up (hin ln) menu. Ta dng drop-down menu lm Menu chnh cho chng trnh. Thng thng n nm pha trn chp mn hnh. Nm dc theo chiu ngang l Menu Bar, nu ta click ln mt command trong Menu Bar th chng trnh s th xung mt menu vi nhng MenuItems nm dc theo chiu thng ng. Nu ta click ln MenuItem no c du hnh tam gic nh bn phi th chng trnh s popup mt Menu nh trong hnh di y (khi ta click Format | Make Same Size):

18.1. Main MenuTa dng Menu Editor to hoc sa mt Menu cho chng trnh. Menu thuc v mt Form. Do , trc ht ta select mt Form lm vic vi Designer ca n (ch khng phi code ca Form). K ta dng Menu Command Tools | Menu Editor hay click ln icon ca Menu Editor trn Toolbar lm cho Menu Editor hin ra.

147

Lp trnh trc quan

u tin c mt vt mu xanh nm trong khung trng ca Menu Editor, ni s hin th Caption ca Menu Command u tin ca Form. Khi ta nh ch &File vo Textbox Caption, n cng hin ra trn vt xanh ni trn. K , chng ta c th nh tn ca Menu Command vo Textbox Name. D ta cho Menu Command mt tn nhng ta t khi dng n, tr trng hp mun n visible/invisible (hin ra/bin mt). Bnh thng ta dng tn ca MenuItems nhiu hn.

c mt Menu nh trong hnh di y ta cn phi edit thm vo cc MenuItems Open, Save, Close v Exit.

148

Lp trnh trc quan

Hnh di y cho thy tt c cc MenuItems ca Menu Command File u nm tht qua bn phi vi bn du chm (....) pha trc. Khi ta click du tn ch qua phi th MenuItem ta ang Edit s c thm bn du chm, tc l tht mt bc trong Menu (Nested).

Tng t nh vy, khi ta click du tn ch qua tri th MenuItem ta ang Edit s mt bn du chm, tc l tri mt bc trong Menu.

149

Lp trnh trc quan

Nu mun cho ngi s dng dng Alt key x dng Menu, chng ta nh thm du & trc character chng ta mun trong menu Caption. V d Alt-F s th xung Menu ca Menu Command File. Nu chng ta t cho MenuItem &Open tn mnuOpen, th khi chng ta Click ln Caption n trn Form trong lc thit k, VB6 IDE s hin th ci v ca Sub mnuOpen_Click(), ging nh Sub cmdButton_Click() ca mt CommandButton:Private Sub mnuOpen_Click() MsgBox "You clicked mnuOpen" End Sub

Trong v d trn ta nh thm mt Statement hin th mt message n gin "You clicked mnuOpen". Chng ta c th t cho mt MenuItem tn g cng c, nhng ngi ta thng dng prefix mnu d phn bit mt menuItem Event vi mt CommandButton Event. Do , ta c nhng tn mnuFile, mnuOpen, mnuSave, mnuClose, mnuExit. Ci gch ngang gia MenuItems Close v Exit c gi l Menu Separator. Chng ta c th nht mt Menu Separator bng cch cho Caption n bng du tr ( - ). Ngoi Alt key ta cn c th cho ngi s dng dng Shortcut ca menuItem. cho MenuItem mt Shortcut, chng ta chn cho n mt Shortcut t ComboBox Shortcut trong Menu Editor. Trong hnh di y ta chn Ctrl+O cho mnuOpen.

150

Lp trnh trc quan

By default, menuItem c Enabled v Visible. Lc thit k chng ta c th cho MenuItem gi tr khi u ca Enabled v Visible bng cch dng Checkboxes Enabled v Visible. Trong khi chy chng trnh (at runtime), chng ta cng c th thay i cc values Enabled v Visible nh sau:mnuSave.Enabled = False mnuOpen.Visible = False

Khi mt MenuItem c Enabled=False th n b m v ngi s dng khng dng c. Chng ta dng cc du mi tn ch ln v xung di chuyn MenuItem c selected ln v xung trong danh sch cc MenuItems. Chng ta dng button Delete hy b MenuItem c selected, Insert nht mt MenuItem mi ngay trn MenuItem c selected v Next chn MenuItem ngay di MenuItem c selected.

18.2. Pop-up Menui vi ngi s dng, ang khi lm vic vi mt Object trong Windows tin nht l ta c th lm hin th Context Menu (Menu p dng cho ng tnh hung) bng mt Mouse click. Thng thng l Right Click v ci Context Menu cn c gi l Pop-up Menu. Chnh ci 151

Lp trnh trc quan

Pop-Up menu tht ra l Drop-down menu ca mt Menu Bar Command. Bnh thng Menu Bar Command y c th visible hay invisible (tn hnh). Trong hnh di y, khi ngi s dng Right click trn Form, mnuEdit s hin ln. Nu bnh thng chng ta khng mun cho ngi s dng dng n trong Main Menu th chng ta cho n invisible:

Code lm cho Popup menu hin ln c vit trong Event Mousedown ca mt Object m tnh c y l ca chnh ci Form:Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' Popup the Edit Menu if User clicked the Right Button of the Mouse If Button = vbRightButton Then PopupMenu mnuEdit End If End Sub

Ngay c khi chng ta mun cho mnuEdit bnh thng l invisible, chng ta cng nn cho n visible trong lc u tin b code vo dng x l Click Events ca nhng MenuItems thuc v mnuEdit nh mnuCopy, mnuCut v mnuPaste.

152

Lp trnh trc quan

18.3. Cha menu Settings trong RegistryGi s chng trnh chng ta cho ngi s dng mt Option WordWrap nh di y:

Chng ta mun chng trnh nh Option m ngi s dng chn, ln ti khi ngi s dng khi ng chng trnh th Option WordWrap cn gi nguyn gi tr nh c. Cch tin nht l cha value ca Option WordWrap nh mt Key trong Registry. Registry l mt loi c s d liu c bit ca Windows Operating System dng cha nhng d kin lin h n Users, Hardware, Configurations, ActiveX Components ..v.v. dng trong computer. Trong Registry, data c sp t theo tng loi theo ng cp. Chng ta c th Edit trc tip tr s cc Keys trong Registry bng cch dng Registry Editor.

153

Lp trnh trc quan

Trong chng trnh ny ta cng nhn tin bt chng trnh nh lun v tr ca Form khi chng trnh ngng li, ln ti khi ngi s dng khi ng chng trnh th chng trnh s c v tr lc u ging y nh trc. Ta s dng Sub SaveSetting cha Checked value ca mnuWordWrap v Left, Top ca Form. Code y ta s trong Sub Form_QueryUnload v n s c executed trc khi Form Unload.Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) SaveSettings End Sub Private Sub SaveSettings() ' Save Location of the form SaveSetting App.Title, "Location", "Left", Me.Left SaveSetting App.Title, "Location", "Top", Me.Top ' Save the setting of WordWrap in menu SaveSetting App.Title, "Settings", "WordWrap", mnuWordWrap.Checked End Sub

App.Title l tiu ca chng trnh. Thng thng n l tn ca VB Project, nhng chng ta c th sa n trong Project Property Dialog (Tab Make) :

154

Lp trnh trc quan

Khi cha value ca mt th g (ta gi l Key) vo Registry chng ta c th sp t cho n nm trong Section no ty . y ta t ra hai Sections tn Location cha Top, Left ca Form v tn Settings cha Key mnuWordWrap.Checked. Mun cho chng trnh c cc gi tr ca Keys cha trong Registry khi n khi ng ta ch cn dng Function GetSetting trong Sub Form_Load c vo t Registry nh di y:Private Sub Form_Load() ' Initialise Location of the form by reading the Settings from the Registry Me.Left = Val(GetSetting(App.Title, "Location", "Left", "0")) Me.Top = Val(GetSetting(App.Title, "Location", "Top", "0")) ' Initialise setting of WordWrap in the menu mnuWordWrap.Checked = ( GetSetting(App.Title, "Settings", "WordWrap", "False") = "True" ) End Sub

Lc u khi cha c g trong Registry th "0" (string "0" c converted bi Val ra 0) l default value cho Left v Top, cn "False" l default value ca mnuWordWrap.Checked. Ngoi ra ta cng mun chng trnh nh tn ca ba Files User dng gn y nht. Tc l trong Drop-down ca Menu Command File s c MenuItem Recent Files hin th t mt n ba tn Files, ci mi nht nm trn ht. Trc ht, ta cn to ra 3 SubmenuItem c cng tn mnuRFile nhng mang Index bng 0,1 v 2 (chng ta nh vo Textbox Index). Ta s dng Captions ca chng hin th tn cc Files. Lc cha c Filename no c th MenuItem Recent Files s b lm m i (tc l mnuRecentFiles.Enabled = False ). Ta s cha tn cc Files nh mt String trong Section Settings ca Registry. Ta phn cch tn cc Files bng delimiter character |. V d: "LattestFileName.txt|OldFileName.txt|OldestFilename.txt" Mi ln ngi s dng Open mt File ta s thm tn File y vo trong Registry v bt c lc no ch gi li tn ca 3 Files mi dng nht.

155

Lp trnh trc quan

Di y l code dng thm tn File mi dng nht vo Registry:Private Sub mnuOpen_Click() ' Initialise Folder in Common Dialog CommonDialog1.InitDir = App.Path ' Launch the dialog CommonDialog1.ShowOpen ' Save the Filename in the Registry, using Object myRecentFiles myRecentFiles.AddFile CommonDialog1.FileName End Sub

Code dng trong Sub Form_Load c tn RecentFiles v hin th trong Menu:' Set myRecentFiles = New clsRecentFiles ' Pass the form handle to it ' This effectively loads the most recently used FileNames to menu myRecentFiles.Init Me

156

Lp trnh trc quan

Ta s dng mt Class tn clsRecentFiles c bit lo vic cha tn Files vo Registry v hin th tn cc Files y trong Menu. Bn trong clsRecentFiles ta cng dng clsString, l mt Class gip ta ngt khc String trong Registry ra tn ca cc Files da vo ch cc delimiter character |.' Class Name: clsRecentFiles ' This Class saves the most Recent FileNames used in the Registry ' in form of a String delimited by |. ' Up to MaxFiles Filenames maybe stored. ' You need to pass the Form that contains the menu to it. ' The assumption is that you have created an array of MenuItems ' named mnuRFile to display the FileNames ' Const MaxFiles = 3 ' Maximum number of FileNames to remember Private myForm As Form Private RecentFiles As clsString Public Sub Init(TForm As frmMenu) Set myForm = TForm Set RecentFiles = New clsString ' Read the Most Recent Filename String from the Registry RecentFiles.Text = GetSetting(App.Title, "Settings", "RecentFiles", "") ' Assign the Delimiter character and tokennise the String (i.e. split it) into FileNames RecentFiles.Delimiter = "|"

157

Lp trnh trc quan

UpdateMenu End Sub Public Sub AddFile(FileName As String) ' Add the latest FileName to the list and update the Registry ' Prefix the FileName to the existing MostRecentFileName String RecentFiles.Text = FileName & "|" & RecentFiles.Text ' Discard the oldest FileNames if the total number is greater than MaxFiles If RecentFiles.TokenCount > MaxFiles Then Dim TStr As String Dim i As Integer ' Reconstitute the String that contains only the most recent MaxFiles FileNames For i = 1 To MaxFiles TStr = TStr & RecentFiles.TokenAt(i) & "|" Next ' Remove the last delimiter character on the right RecentFiles.Text = Left(TStr, Len(TStr) - 1) End If ' Update the String in the Registry SaveSetting App.Title, "Settings", "RecentFiles", RecentFiles.Text UpdateMenu End Sub Private Sub UpdateMenu() ' Hin th the most recent Filenames in the menu Dim i As Integer ' If there is no FileNames to hin th then disable the MenuItem entry If RecentFiles.TokenCount = 0 Then myForm.mnuRecentFiles.Enabled = False Exit Sub Else ' Otherwise enable the MenuItem entry myForm.mnuRecentFiles.Enabled = True

158

Lp trnh trc quan

End If ' Assign FileName to Caption of mnuRFile array and make the MenuItem elements visible For i = 1 To RecentFiles.TokenCount myForm.mnuRFile(i - 1).Caption = RecentFiles.TokenAt(i) ' Assign to Caption myForm.mnuRFile(i - 1).Visible = True ' Make the MenuItem visible If i = MaxFiles Then Exit For ' This line maybe unnecessary Next ' Make the rest of the MenuItem array mnuRFile invisible if there are less than MaxFiles If RecentFiles.TokenCount < MaxFiles Then For i = RecentFiles.TokenCount To MaxFiles - 1 myForm.mnuRFile(i).Visible = False Next End If End Sub

Chng ta c th chy Line Command RegEdit sau khi click Start | Run

xem chi tit ca cc Keys m chng trnh cha trong Sections Location v Settings ca Folder HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Menu

159

Lp trnh trc quan

160

Lp trnh trc quan

BI 19. DNG DIALOGSDialogs (hi thoi) c dng hin th tin tc v nhn thng tin t chut hay bn phm t ngi s dng ty theo tnh hung. Chng c dng tp trung s ch ca ngi s dng vo cng vic hin ti ca chng trnh nn rt hu dng trong cc chng trnh ca Windows C nhiu dng Dialogs, mi th p dng cho mt hon cnh ring bit. Trong chng ny ta s bn qua 4 loi Dialogs chnh v nghin cu v khi no v cch no ta dng chng: Message Boxes Input Boxes Common Dialogs Custom Dialogs

19.1. Message BoxesMessage Boxes c dng nhc nh ngi s dng mt chuyn g, v i hi mt phn ng no t ngi s dng. V d nh khi ta chm dt chng trnh MSWord m cha lu tr h s th MSWord s nhc ta lu tr n bng Dialog di y:

161

Lp trnh trc quan

Trong trng hp ny ngi s dng c th click mt trong 3 buttons. Nu click Yes th s xc tin vic lu tr h s trc khi kt thc chng trnh MSWord. Nu click No th MSWord s lng l kt thc. Nu click Cancel th c ngha ngi s dng i vic chm dt chng trnh v tr li tip tc dng MSWord. Ta dng routine MsgBox hin th Message Box nh coding trong hnh di y:

Parameter (thng s) th nht ca MsgBox l text message Close the program down?, parameter th nh l tp hp ca icon (vbQuestion) v s buttons (vbOKCancel) bng cch cng hai constants: vbQuestion + vbOKCancel (hai buttons OK v Cancel), parameter th ba l title (tiu ) ca Dialog. Trong v d MSWord bn trn Constant ca icon v buttons l vbExclamation + vbYesNoCancel (ba buttons Yes, No v Cancel). Ta chn s v loi buttons theo bng di y: Constant vbOKOnly vbOKCancel vbYesNo vbRetryCancel vbYesNoCancel vbAbortRetryIgnore Cc buttons OK OK Cancel Yes No Retry Cancel Yes No Cancel Abort Retry Ignore

Constant ca cc icons ta c th dng l vbCritical, vbQuestion, vbExclamation v vbInformation.

162

Lp trnh trc quan

Khi mt Message Box c m ra, c chng trnh ngng li v i ngi s dng phn ng. Ta ni Message Box c hin th trong Modal Mode, n dnh mi s ch v tm ngng cc execution khc trong cng chng trnh. Sau khi ngi s dng click mt button, Message Box s bin mt v chng trnh s tip tc chy t dng code ngay di dng MsgBox. Trong v d trn ta dng MsgBox nh mt Sub, nhng ta cng c th dng MsgBox nh mt Function bit ngi s dng va mi click button no. Function MsgBox returns mt value (tr v mt gi tr) m ta c th th theo thi hnh. V d nh:Private Sub CmdPrompt_Click() Dim ReturnValue As Integer ReturnValue = MsgBox("Close the program down", vbQuestion + vbOKCancel, "Exit Program") Select Case ReturnValue Case vbOK MsgBox "You clicked OK" Case vbCancel MsgBox "You clicked Cancel" End Select End Sub

Cc tr s Visual Basic intrinsic constants m Function MsgBox returns l: Tr s 1 2 3 4 5 6 7 Tn OK Cancel Abort Retry Ignore Yes No Const vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo

Chng ta c th hin th Text message trong Message Box thnh nhiu dng bng cch dng Constant vbCrLf (CarriageReturn v LineFeed) nh du nhng ch ngt khc nh sau:MsgBox "This is the first line" & vbCrLf & " followed by the second line"

163

Lp trnh trc quan

Nu chng ta thy mnh thng dng MsgBox vi cng mt icon v nhng buttons, nhng c Text message khc nhau, chng ta c th vit mt Global Subroutine trong .BAS module dng li nhiu ln. V d chng ta c mt Global Sub nh sau:Public Sub DisplayError(ByVal ErrMess As String ) MsgBox ErrMess, vbCritical + vbOKOnly, "Error" End Sub

Mi ln mun hin th mt Error message chng ta ch cn gi Sub DisplayError vi Text message m khng s dng lm ln icon. Sau ny mun i cch hin th Error message ch cn edit mt ch. Nu ngi s dng mun chng ta lu tr tt c mi errors xy ra lc runtime, chng ta ch cn thm vi dng code trong Sub Hin thError vit Error message vo mt text file.

19.2. Input BoxesVi Message Boxes, ngi s dng ch c th click ln mt button. i khi ta mun ngi s dng nh vo thm mt t d kin, trong trng hp y ta c th dng Input Boxes. Input Boxes ging ging Message Box, nhng n chuyn nhn input data t ngi s dng v khng hin th mt icon. V d:Private Sub CmdGreeting_Click() Dim strReply As String strReply = InputBox$("Please enter your name", "What 's your name?", "John", 2000, 1000) MsgBox "Hi " & strReply & ", it 's great to meet you!", vbOKOnly, "Hello" End Sub

cc parameters ca Function InputBox$. Parameter th nht l Text message, parameter th hai l Title ca Dialog, parameter th ba l Default Input Value. y l value c hin th sn trong Input Box khi n xut hin, nu l input user thng nh vo th ngi s dng ch cn click nt OK l . Hai parameters cui cng l Optional (ty chn, c cng c, khng c cng khng sao). N l X,Y coordinates ca Input Box trong n v twips. H thng ta ly gc trn bn tri lm chun vi X=0, Y=0.

164

Lp trnh trc quan

Input Box c hai dng Functions: InputBox$ - returns mt String ng hong InputBox - returns mt String nm trong Variant variable

Nu chng ta click nt Cancel th returned Value l empty string, chng ta c th test empty string nhn din trng hp ny. Di y l mt v d dng Function InputBox:Private Sub CmdFortuneTeller_Click() Dim varValue As Variant Dim intAge As Integer varValue = InputBox("Please enter your age", "How old are you?", "18") If IsNumeric(varValue) Then intAge = Val(varValue) If intAge < 20 Then MsgBox "You are a young and ambitious person", vbOKOnly, "Observation" Else MsgBox "You are a matured and wise person", vbOKOnly, "Observation" End If Else MsgBox "Oh oh! - please type your age!", vbCritical + vbOKOnly, "Input Error" End If End Sub

Mc du Input Boxes rt d dng, trn thc t rt t khi ta dng n v nhng l do sau y:

165

Lp trnh trc quan

-

Ta khng th lm g c trong lc ngi s dng input data, phi i sau khi ngi s dng click OK th mi bt u x l input textstring. Ngc li nu ta dng mt Textbox trong mt Form thng thng, ta c th code trong cc Event handlers ca Events KeyPress hay Change kim sot cc keystrokes ca ngi s dng. Input Boxes ch cho ta nh vo mt text string duy nht. Nhiu khi ta mun ngi s dng nh vo nhiu th nn cn phi c mt form ring. Sau cng, Input Boxes xem khng p mt. Chng trnh dng Input Boxes c v nh khng chuyn nghip, do ta cn phi dng Custom Dialogs.

-

-

19.3. Common DialogsChng ta c thy hu nh mi chng trnh trong Windows u c cng nhng dialogs Open v Save files ? V hu nh tt c chng trnh u c cng dialogs chn mu, font ch hay in ? l v cc Dialogs thng dng y thuc v Common Dialog Library ca MSWindows v cho php cc chng trnh gi. Mun dng cc Dialogs y trong VB6 ta phi reference Comdlg32.ocx bng IDE Menu command Project | Components... ri chn v Apply Microsoft Common Dialog Control 6.0.

Microsoft Common Dialog Control 6.0 cho ta su dng Dialogs ty theo gi Method no:

166

Lp trnh trc quan

Tn Open File Save File Color Font Print Help

Method ShowOpen ShowSave ShowColor ShowFont ShowPrinter ShowHelp

19.4. Open v Save File DialogsChng ta hy m mt Project mi vi mt button tn CmdOpen trong Form1 v nh vo code sau y cho Sub CmdOpen_Click:Private Sub CmdOpen_Click() On Error GoTo DialogError With CommonDialog1 .CancelError = True ' Generate Error number cdlCancel if user click Cancel .InitDir = "E:\VB6" ' Initial (i.e. default ) Folder .Filter = "Executables (*.exe) | *.exe| Batch Files (*.bat)| *.bat" .FilterIndex = 1 ' Select ""Executables (*.exe) | *.exe" as default .DialogTitle = "Select a program to run" .ShowOpen ' Lauch the Open Dialog MsgBox "You selected " & .FileName, vbOKOnly + vbInformation, "Open Dialog" End With Exit Sub DialogError: If Err.Number = cdlCancel Then MsgBox "You clicked Cancel!", vbOKOnly + vbInformation, "Open Dialog" Exit Sub Else MsgBox "Error in Dialog's use: " & Err.Description, vbOKOnly + vbCritical, "Error"

167

Lp trnh trc quan

Exit Sub End If End Sub

Hy chy chng trnh y v click button Open, chng trnh s hin th error message di y:

L do l ta qun b mt Microsoft Common Dialog Control 6.0 vo Form1. Vy chng ta hy doubleclick icon ca n trong ToolBox. By gi hy chy chng trnh li v click button Open hin th Open Dialog.

Chng ta c th chn folder no ty bng cch di chuyn t folder ny qua folder khc hay thay i disk drive. Nu chng ta click vo bn phi ca combobox File of type, n s dropdown cho thy chng ta c th chn mt trong hai loi Files nh lit k trong statement: 168

Lp trnh trc quan

.Filter = "Executables (*.exe) | *.exe| Batch Files (*.bat)| *.bat"

Sau khi chn mt Filename c sn hay nh mt tn vo File name textbox, chng ta click Open. Sau , CommonDialog1.Filename s cha tn file chng ta chn hay nh vo.

V ta cho .CancelError = True nn nu ngi s dng click Cancel chng trnh s generate mt Error s 32755 (cdlCancel). y ta bt Error y bng cch dng On Error GoTo DialogError v th Err.Number= cdlCancel hin th Error message di y:

Save Dialog cng tng t nh Open Dialog, ta dng method ShowSave hin th n.

Trong v d trn ta nh ngha cc properties ca CommonDialog1 bng code. Chng ta cng c th dng Properties Windows nh ngha chng nh di y: 169

Lp trnh trc quan

Ngoi ra, chng ta cng c th dng cc trang Properties ca CommonDialog1 nh ngha Properties lc thit k bng cch right click Commondialog1 trn Form1 ri chn Properties:

Properties Pages Dialog s hin th vi Tab Open/Save As c sn lc u, chng ta c th nh cc tin tc nh sau: 170

Lp trnh trc quan

19.5. Cc loi Dialog c sn dng19.5.1 Color Dialog Color Dialog cho ngi s dng mt cch chn mu rt d dng. Ngoi nhng mu c sn, ngi s dng c th t to ra mt mu ri cho n thm vo trong bng mu c cung cp, gi l Windows Palette bng cch click button Add to Custom Colors.

Chng ta to ra mt mu bng cch click ch c mu theo trong bng mu ln hnh vung ri nm hnh tam gic bn phi ko ln, ko xung thay i m ca mu nh hin th trong hp vung Color|Solid. Khi va vi mu hin th, chng ta click button Add to Custom Colors, mu y s c cho thm vo nhm Custom Colors nm pha di, bn tri. 171

Lp trnh trc quan

Ta dng method ShowColor hin th Color Dialog. Sau khi ngi s dng chn mt mu ri, ta c th trc tip assign n cho property ForeColor hay BackColor ca mt control. Trong v d di y ci mu m ngi s dng va chn c assigned cho background ca picturebox Picture1:Private Sub CmdSelectColor_Click() On Error GoTo NoColorChosen With CommonDialog1 .CancelError = True ' Entire dialog box is hin thed, including the Define Custom Colors section .Flags = cdlCCFullOpen .ShowColor ' Launch the Color Dialog Picture1.BackColor = .Color ' Assign selected color to background of Picture1 Exit Sub End With NoColorChosen: ' Get here if user clicks the Cancel button MsgBox "You did not select a color!", vbInformation, "Cancelled" Exit Sub End Sub

172

Lp trnh trc quan

19.5.2

Font Dialog

Font Dialog cho ta chn Font cho mn nh hay printer v chn mu dng cho ch ca Font. Ta dng method ShowFont hin th FontDialog. Cc chi tit trnh by trong Font Dialog ty thuc vo tr s ca Flags nh sau: Constant cdlCFScreenFonts cdlCFPrinterFonts cdlCFBoth cdlCFScalableOnly 1 2 3 &H20000 Tr s Hiu qu Ch hin th cc Fonts printer h tr Ch hin th cc Fonts ca mn nh, cha chc tt c u c printer h tr Hiin th cc Fonts mn nh v printer Ch hin th cc scalable Fonts nh TrueType fonts m chng ta ci vo my

Nu chng ta mun cho ngi s dng ty chn chn mu th thm 256 vo tr s ca Flags.

173

Lp trnh trc quan

Di y l code cho ngi s dng chn Font v mu ca Label1.Private Sub CmdSelectFont_Click() On Error GoTo NoFontChosen CommonDialog1.CancelError = True ' Causes the dialog box to list only the screen fonts supported by the system. CommonDialog1.Flags = cdlCFScreenFonts + 256 ' Add 256 to include Color option CommonDialog1.ShowFont ' Launch the Font Dialog With Label1.Font .Bold = CommonDialog1.FontBold .Italic = CommonDialog1.FontItalic .Name = CommonDialog1.FontName .Size = CommonDialog1.FontSize .Strikethrough = CommonDialog1.FontStrikethru .Underline = CommonDialog1.FontUnderline End With Label1.ForeColor = CommonDialog1.Color Label1.Caption = "Hello world!!!, this is a Font Dialog Demo" Exit Sub NoFontChosen: MsgBox "No font was chosen!", vbInformation, "Cancelled" Exit Sub End Sub

Ch : Nu chng ta qun cho Flags mt trong nhng hng s ni trn chng trnh s cho mt Error message nh sau:

19.5.3

Print Dialog

Print Font cho ta mt giao din cng ging nh trong Microsoft Office chn nhng ty chn v vic in. Vi Print Dialog ta c th chn printer no vi nhng c tnh no bng cch click button Properties hay button Preferences. Ta cng c th quyt nh in t trang no n 174

Lp trnh trc quan

trang no ca document v in bao nhiu copies. Ch c iu phi lu l nu ngi s dng dng Print Dialog chn mt Printer khc m trong Print Dialog ta chn Property PrinterDefault = True th Printer y s tr thnh Default Printer v n cng s c hiu lc vnh vin trong c Windows cho n khi ngi s dng thay i li. Khc vi Color v Font Dialogs, Print Dialog khng i hi ta phi cho mt tr s ca Property Flags. Ta ch cn dng Method ShowPrinter hin th Print Dialog. Ba properties thng c dng nht sau khi ngi s dng chn cc ty chn ca Print Dialog l Copies, FromPage v ToPage. cho ngi s dng cc default values ca nhng properties ny, chng ta c th sn cc tr s trc khi hin th Print Dialog.

Di y l code mu dng print Dialog:Private Sub CmdSelectPrinter_Click() With CommonDialog1 .FromPage = 1 .ToPage = 1 .Copies = 1 .ShowPrinter End With End Sub

175

Lp trnh trc quan

19.5.4

Help Dialog

Ta dng method ShowHelp hin th cc thng tin gip , nhng nh phi cho CommonDialog t nht tr s ca cc properties HelpFile v HelpCommand.Private Sub CmdHelp_Click() CommonDialog1.HelpFile = "YourProgram.hlp" CommonDialog1.HelpCommand = cdlHelpContents CommonDialog1.ShowHelp End Sub

bit thm chi tit v cch dng ShowHelp, highlight ch HelpContext trong source code VB6 ri n phm F1 v chn MsComDlg.

19.6. Custom DialogsNhiu khi Message Box, Input Box hay cc dng Common Dialogs vn khng thch hp cho hon cnh lp trnh. Trong trng hp y chng ta c th dng mt Form bnh thng lm thnh mt Dialog theo yu cu. N hi mt cng hn mt cht, nhng th nht n c nhng mu sc ging nh cc Forms khc trong chng trnh, v th hai ta mun lm g ty . Ch c ci bt li l chng trnh s dng nhiu ti nguyn hn v cn thm mt t b nh. Sau y ta th trin khai mt Login Form tng qut, c th dng trong nhiu trng hp. Khi khi ng, chng trnh ny s hin th mt Login form yu cu ngi s dng nh vo tn v mt khu. Sau , nu tn v mt khu hp l th ci Form chnh ca chng trnh mi hin ra. Cch ta thc hin l cho chng trnh khi ng vi mt Sub Main trong .BAS Module. Sub Main s gi Sub GetUserInfo (cng nm trong cng Module) hin th form frmLogin trong Modal mode n lm vic cng mt cch nh Message Box, Input Box hay Common Dialogs. Khi form frmLogin c du kn bng statement Me.Hide th execution trong Sub GetUserInfo s tip tc chi tit in vo cc textboxes txtUserName v txtPassword c tr v local variables strUserName v strPassword. M ngun ca Sub Main v Sub GetUserInfo c lit ra di y:Sub Main() Dim strUserName As String Dim strPassword As String ' Call local Sub getUserInfo to obtain UserName and Password

176

Lp trnh trc quan

GetUserInfo strUserName, strPassword If strUserName = "" Then MsgBox "Login failed or aborted", vbInformation, "login Aborted" Else MsgBox "User " & strUserName & " logged in with password " & strPassword, vbInformation, "Login accepted" ' Check UserName and Password here ' If valid password then show the Main form of the program which is implemented separately... ' frmMain.Show End If End Sub Private Sub GetUserInfo(ByRef sUserName As String, ByRef sPassword As String) ' Invoke frmLogin form in Modal mode frmLogin.Show vbModal ' As soon as frmLogin is hidden, the execution gets here sUserName = frmLogin.txtUserName ' assign the form's txtUserName to sUserName sPassword = frmLogin.txtPassword ' assign the form's txtPassword to sPassword Unload frmLogin ' Unload form frmLogin End Sub

Login form c hin th nh di y:

Sau khi user in chi tit v click OK, tm thi ta ch hin th mt thng ip xc nhn cc chi tit y.

177

Lp trnh trc quan

Trong tng lai, chng ta c th vit thm code kim tra xem tn v mt khu c hiu lc khng. C mt vi chi tit v form frmLogin n lm vic ging mt Common Dialog: Ta cho property BorderStyle ca frmLogin l Fixed Dialog