You are on page 1of 222

Chng Mt - Hoan nghnh n vi VB6

Cho mng bn n vi Visual Basic 6


Dng VB6 l cch nhanh v tt nht lp trnh cho Microsoft Windows. Cho d bn l chuyn nghip hay mi m i vi chng trnh Windows, VB6 s cung cp cho bn mt b cng c hon chnh n gin ha vic trin khai lp trnh ng dng cho MSWindows. Visual Basic l g? Phn "Visual" cp n phng php c s dng to giao din ha ngi dng (Graphical User Interface hay vit tc l GUI) . C sn nhng b phn hnh nh, gi l controls, bn tha h sp t v tr v quyt nh cc c tnh ca chng trn mt khung mn hnh, gi l form. Nu bn tng s dng chng trnh v chng hn nh Paint, bn c sn cc k nng cn thit to mt GUI cho VB6. Phn "Basic" cp n ngn ng BASIC (Beginners All-Purpose Symbolic Instruction Code), mt ngn ng lp trnh n gin, d hc, c ch ra cho cc khoa hc gia (nhng ngi khng c th gi hc lp trnh in ton) dng. Visual Basic c ra t MSBasic, do Bill Gates vit t thi dng cho my tnh 8 bits 8080 hay Z80. Hin nay n cha n hng trm cu lnh (commands), hm (functions) v t kha (keywords). Rt nhiu commands, functions lin h trc tip n MSWindows GUI. Nhng ngi mi bt u c th vit chng trnh bng cch hc ch mt vi commands, functions v keywords. Kh nng ca ngn ng ny cho php nhng ngi chuyn nghip hon thnh bt k iu g nh s dng ngn ng lp trnh MSWindows no khc. Ngi mang li phn "Visual" cho VB l ng Alan Cooper. ng gi mi trng hot ng ca Basic trong mt phm vi d hiu, d dng, khng cn phi ch n s tinh xo ca MSWindows, nhng vn dng cc chc nng ca MSWindows mt cch hiu qu. Do , nhiu ngi xem ng Alan Cooper l cha gi ca Visual Basic. Visual Basic cn c hai dng khc: Visual Basic for Application (VBA) v VBScript. VBA l ngn ng nm pha sau cc chng trnh Word, Excel, MSAccess, MSProject, .v.v.. cn gi l Macros. Dng VBA trong MSOffice, ta c th lm tng chc nng bng cch t ng ha cc chng trnh. VBScript c dng cho Internet v chnh Operating System. D cho mc ch ca bn l to mt tin ch nh cho ring bn, trong mt nhm lm vic ca bn, trong mt cng ty ln, hay cn phn b chng trnh ng dng rng ri trn th gii qua Internet, VB6 cng s c cc cng c lp trnh m bn cn thit.

Cc n bn Visual Basic 6
C ba n bn VB6: Learning, Professional v Enterprise. Chng ta hy gt qua n bn Learning. Bn c th dng n bn Professional hay Enterprise. n bn Professional cung cp y nhng g bn cn hc v trin khai mt chng trnh VB6, nht l cc control ActiveX, nhng b phn lp trnh tin ch v rt hu dng cho cc chng trnh ng dng (application programs) ca bn trong tng lai. Ngoi a compact chnh cho VB6, ti liu nh km gm c sch Visual Studio Professional Features v hai a CD Microsoft Developer Network (MSDN). n bn Enterprise l n bn Professional cng thm cc cng c Back Office chng hn nh SQL Server, Microsoft Transaction Server, Internet Information Server.

Ci t VB6
ci t VB6, my tnh ca bn cn phi c mt a CD-ROM (CD drive) . Bn cn t nht 32 MB RAM, 2 GB hard disk v CPU Pentium II. Khi b VB6 CD vo CD drive, n s t khi ng display menu cho bn chn nhng th g cn Setup, hy click Install Visual Basic 6.0 ci VB6.

Ngoi tr cc file h iu hnh (Operating System) trong th mc (folder) \Os, cc file trong a compact u khng b nn. V th, bn c th s dng chng trc tip t a. V d, c nhiu cng c v thnh phn trong folder \Tools vn c th c ci t trc tip t CD-ROM. Ngoi ra, bn c th chy Setup khi no cn thit. V d, bn c th chy Setup ci t li Visual Basic trong folder khc, hoc ci t thm bt cc phn ca VB6. Nu v l do g h thng khng install cc a compact MSDN (bn s khm ph ra iu ny khi thy Help khng c mt lc chy VB6), bn c th ci t chng trc tip t a s 1 ca b MSDN. b xung v xa cc thnh phn VB: 1. B a compact vo CD drive. 2. Nu menu khng t ng hin ln th chy chng trnh Setup c sn tong folder gc trn a compact. 3. Chn nt Custom trong hp thoi (dialog) Microsoft Visual Basic 6.0 Setup. 4. Chn hay xa cc thnh phn bng cch check hay uncheck cc hp danh sch Options ca dialog Custom. 5. Thc hin cc ch dn Setup trn mn hnh. Ghi ch: Trong lc ci VB6, nh chn Graphics nu khng bn s thiu mt s hnh nh nh icons, bitmaps v.v... ng l Microsoft cho t ng ci t Graphics, tc l Default (khng c ni g) th ci t Graphics.

Integrated Development Environment (IDE) ca VB6


Khi khi ng VB6 bn s thy m ra nhiu ca s (windows), scrollbars, v.v.. v nm chng ln l New Project dialog. y VB6 cho bn chn mt trong nhiu loi cng trnh.

Chn Standard EXE. Mt lt sau trn mn nh s hin ra giao din ca mi trng pht trin tch hp (Integrated Development Environment - IDE ) ging nh di y:

IDE ca VB6 bao gm cc yu t sau:

Menu Bar
Cha y cc commands m bn s dng lm vic vi VB6, k c cc menu truy cp cc chc nng c bit dnh cho vic lp trnh chng hn nh Project, Format, hoc Debug. Trong Menu Add-Ins c Add-Ins Manager cho php bn gn thm nhng menu con nhim chy cc chng trnh li ch cho vic lp trnh.

Trong Add-Ins Manager dialog bn chn mt Add-In ri check mt hay nhiu hp trong khung Load behavior:

Toolbars (Debug, Edit, form Editor, Standard)

Cc toolbars c hnh cc icons cho php bn click thc hin cng vic tng ng vi dng mt menu command, nhng nhanh v tin hn. Bn dng menu command View | Toolbars (click ln menu command View cho popupmenu hin ra ri click command con Toolbars) lm cho cc toolbars hin ra hay bin mt i. Bn c th thay i v tr mt toolbar bng cch nm vo hai gch vertical nm bn tri toolbar ri di toolbar i ch khc (nm y ngha l pointer ca mouse ln ch chm trong hnh pha di ri bm xung v gi nt bn tri ca mouse, trong khi ko pointer i ni khc).

Ngoi ra bn cng c th sa i cc toolbars theo thch bng cch dng Menu command View | Toolbars | Customize...

Toolbox
y l hp ngh vi cc cng c, gi l controls, m bn c th t ln cc form trong lc thit k (design). Nu Toolbox bin mt, bn c th display n tr li bng cch dng menu command View | Toolbox. Bn c th khin toolbox display nhiu controls hn bng cch chn Components... t context menu (chn Toolbox ri bm nt phi ca mouse display context menu) hay dng menu command Project | Components. Ngoi vic trnh by Toolbox mc nh, bn c th to cch trnh by khc bng cch chn Add Tab... t context menu v b sung cc control cho tab t kt qu.

Project Explorer
S lit k cc forms v cc modules trong project hin hnh ca bn. Mt project l s tp hp cc files m bn s dng to mt trnh ng dng. Tc l, trong VB6, khi ni vit mt program c ngha l trin khai mt project.

Properties window

Lit k cc c tnh ca cc forms hoc controls c chn. Mt property l mt c tnh ca mt object chng hn nh size, caption, hoc color. Khi bn sa i mt property bn s thy hiu qu ngay lp tc, th d thay i property Font ca mt Label s thy Label y c display bng Font ch mi. Khi bn chn mt Property ca control hay form trong Properties window, pha bn phi ch value ca property c th display ba chm (. . .) hay mt tam gic cha xung. Bm vo display mt dialog cho bn chn value. Th d di y l dialog chn mu cho property ForeColor ca control Label1.

Form Layout
Bn dng form Layout chnh v tr ca cc forms khi form hin ra ln u lc chng trnh chy. Dng context command Resolution Guides thy nu dng mt mn nh vi mn (resolution) t hn, th d nh 640 X 480, th n s nh nh th no.

Form Designer
Dng thit k giao din lp trnh. Bn b sung cc controls, cc ha (graphics), cc hnh nh v mt form to s ma st m bn mun. Mi form trong trnh ng dng ca bn c designer form ring ca n. Khi bn maximise mt form designer, n chim c khu lm vic. Mun lm cho n tr li c bnh thng v ng thi thy cc form designers khc, click nt Restore Window gc bn phi, pha trn.

Immediate Window
Dng g ri (debug) trnh ng dng ca bn. Bn c th display d kin trong khi chy chng trnh ng dng. Khi chng trnh ang tm ngng mt break point, bn c th thay i gi tr cc variables hay chy mt dng chng trnh.

View Code button


Click ln nt ny xem code ca mt form m bn chn. Window ca code ging nh di y:

Trong Code window bn c th chn display tt c Sub ca code cng mt lc nh trong hnh hay display mi ln ch mt Sub bng cch click button c hnh ba dng nm gc bn tri pha di.

View form button


Click ln nt ny xem form ca mt form m bn chn. Ghi ch: Nhiu windows trong IDE nh Toolbars, Toolbox, Project Explorer .v.v..c th tri lnh bnh (floating) hay u bn (docked). Bn c th thay i v tr chng bng cch nm vo Title Bar ca window ri di i. D nhin bn cng c th m rng hay lm nh mt window bng cch di mt cnh vertical hay horizontal ca n. Khi mt window ln trn mt window khc chng c th tm cch dnh nhau. Trong hnh di y, Properties Window v Form Layout c ko ra ngoi cho floating.

Nhn tr gip trong khi ang lm vic


Trong khi lp trnh bn c th cn tm hiu cc thng tin lin quan n cc commands, functions .v.v.. ca VB6. Bn c th khi ng Microsoft Developer Network | MSDN Library Visual Studio 6.0 t nt Start, hay click Help | Contents t Menu Bar ca VB6, hay chn mt keyword (highlight keyword) ri n F1 c Help.

Ni dung Help bao gm nhiu c im c thit k thc hin vic tm kim thng tin d dng hn. Bn c th da trn Contents c ti liu nh mt quyn sch, Index c nhng on c nhc n mt keyword hay Search tm mt ti liu nhanh hn. V d, vic g ri thng tin bt ngun t nhiu c tnh khc nhau ph thuc vo loi n m bn ang lm vic. Cc lin kt c

m t trong phn n y thc hin vic tm kim d dng hn. Ngoi ra, bn cng c th click See Also di tiu ca ch im xem cc tiu ca cc ch im m bn c th i n hoc lin h n nhiu thng tin.

Context Sensitive Help (tr gip trong ng tnh hung)


Nhiu phn ca VB6 l context sensitive, c ngha l lc bi ri ch cn n nt F1 hoc highlight keyword ri nhn F1 l c thng tin nhng g lin h trc tip vi tnh hung hin gi ca bn. Bn c th nhn F1 t bt k phn context sensitive no ca giao din VB6 display thng tin Help v phn . Cc phn context sensitive l:

Cc Windows ca VB6 nh Properties, Code .v.v.. Cc control trong Toolbox. Cc Object trn mt form hoc Object ti liu. Cc c tnh trong Window Properties. Cc keywords ca VB6 Cc thng bo li (error messages)

Ngoi ra, trong Help thng c Example. Bn click ln ch Example display mt th d minh ha cch dng mt function hay property.

Microsoft on the Web


Web site ca Microsoft cha nhiu thng tin cp nht cho nhng ngi lp trnh VB6. Trang ch Visual Basic t ti URL http://www.microsoft.com/vbasic/. Thng tin c sn ti a ch ny bao gm:

Cp nht cc c tnh mi, cc phin bn sn phm, cc sn phm lin h, cc thuyt trnh (seminar) v cc hot ng (event) c bit. Thng tin b sung trn cc c tnh VB6 cha trong cc bi vit gi l White Papers, cc mch nc (tips) v cc trnh tr gio, ngun o to. Sn phm mi ti xung (download) bao gm s cp nht n cc file chng trnh, cc cp nht tr gip, cc trnh iu khin, v cc file lin h khc ca VB6.

truy cp Web site ca Microsoft, t menu Help chn Microsoft on the Web ri chn menu con ty thch nh di y.

Ghi ch: Mt s ni dung trn Web site ca Microsoft c ti u ha dnh cho Microsoft Internet Explorer v khng th display y trong mt b trnh duyt (browser) khc. Do bn nn ch dng Internet Explorer lm browser trn my bn m thi.

Chng Hai- Vit chng trnh u tin


Bn ang lm quen vi mi trng trin khai lp trnh (Integrated Development Environment - IDE) ca MS VB6 v rt nng rut mun vit nhng dng m u tin cho mng th gii. Ta th n li mt s vn m c l bn bit ri. Mt chng trnh Visual Basic gm c phn m lp trnh v cc hnh nh (visual components). Bn c th thit k phn hnh nh bng cch dng nhng ngh (Controls hay Objects) t Ti ngh (Toolbox) nm bn tri. Nu bn khng thy ci Ti ngh th dng mnh lnh Menu View|Toolbox bt n hin ra. Khi bn bt u thit k mt chng trnh bng cch chn Standard EXE, mi trng trin khai lp trnh (IDE) cho bn sn mt Form tn l Form1. Bn c th i tn (Name) n trong ci ca s Propeties nm pha di bn phi (trong hnh di y ta edit Name property ca Form1 thnh ra frmMainForm). Bn cng c th sa ta (Title) ca form ra ci g c ngha hn bng cch i Caption ca form cng trong ca s Propeties (trong hnh di y ta edit Caption property ca form thnh ra "Chi tiet cua ban toi").

Sp t cc vt dng ln Form
Mun t mt Control ln Form, click hnh ci Control trong Toolbox ri Drag (bm nt tri ca con chut ri ko cho thnh hnh ch nht trc khi bung nt tri ra) con chut trn Form v thnh c ca Control. Nhng Controls bn s dng thng nht t Toolbox l Label (nhn), Textbox (hp nh ch vo) v CommandButton (nt bm mnh lnh).

Trong hnh trn ta c ba Label v ba Textbox. Mun sa ch Label1 ra "Ten" th edit Property Caption. Cn Textbox khng dng Property Caption m dng Property Text. Ta cng c th thay i cc Property Caption v Text trong khi chy chng trnh (at run-time). Trong lc thit k (design time) bn c th sa i kiu ch ca nhng Controls bng cch edit Property Font ca chng trong ca s Properties (click bn phi ca Property Font trong Properties Window, IDE s pop-up ci Font dialog bn la chn nhng c tnh ca Font nh trong hnh di y).

Nu bn thy bc mnh ti sao ci c ch t c (default size) ca cc Control hi nh, bn c th gii quyt bng cch sa c ch ca chnh Form cho n ln hn. V khi mt Control c t ln mt Form, n tha k c ch ca Form. sp xp cho mt s Control thng hng vi nhau bn chn c nhm ri dng mnh lnh Menu Format|Align|Lefts .v.v..Nu bn cha bit cch chn mt nhm Control th c hai cch. Cch th nht bn nt Shift trong khi click cc Control bn mun chn. Ci Control m bn chn sau cng s l ci chun cc Control khc s lm ging theo. Cch th hai l Drag cho si dy thun (rubber band) bc chung quanh cc Control. Trong trng hp cc Control ny nm trong mt container, th d nh mt khung (Frame) hay PictureBox, th bn phi click Form trc, ri nt Ctrl trong khi Drag rubber band bao cc Control.

Cha mi th ca mt d n VB
Ti y bn thy trong ca s bn phi, pha trn, gi l Project Explorer, c hnh ging nh mt ci cy (tree) cho thy ta c mt Form trong mt Project (d n). Project l mt cch tin dng ta sp xp nhng g cn thit cho mt d n. Thng th mt d n c nhiu Form v c th cn nhng th khc. Mi Form s c cha vo a di dng "frmMainForm.frm". Bn save mt form bng menu command File | Save formfilename.frm. Nu trong Form1 c cha hnh nh (th d bn dng Properties Window chn mt icon hnh gng mt ci lm icon cho frmMainForm) th cc hnh nh ca frmMainForm s uc t ng cha trong h s "frmMainForm.frx". Lu l khng nht thit tn ca h s (file) m bn phi cho bit khi cha (save) phi ging nh tn ca Form m bn dng trong chng trnh. Tuy nhin bn nn dng cng mt tn cho c hai sau ny d tm h s nu c tht lc. Theo qui c thng thng, cc Form c t tn bt u bng "frm", th d nh "frmMainForm". Khi bn save mt Project th c ngha l save tt c h s dng cho d n, k c cc Form v mt h s cho chnh Project, th d nh "MyFirstProg.vbp" ("vbp" l vit tt ch Visual Basic Project). Bn save Vb6 project bng menu command File | Save Project. , mun i tn Project, bn click ln hng trn cng bn phi trong ca s Project Explorer (Project1 (Project1.vbp)), ri edit tn ca Project trong ca s Properties pha di. Bn nn cha tt c nhng h s dng cho cng mt Project trong cng mt tp (Folder/Directory). Bn c th dng Notepad m ra xem chi, coi trong "frmMainForm.frm" c g. Bn s thy trong y gm c hai phn: phn u l din t cc Control nm trong Form, phn cn li l m lp trnh m bn vit. Bn cng s ch l cc properties m bn sa cho cc Control u c ghi li trong phn u ni trn. VB da vo phn din t cc Control thit lp li (reconstruct) hnh nh ca Form.

10

Sau ny, khi lo luyn VB, bn c th dng mt chng trnh t ng ch (generate) ra nhng hng din t cc Control cho mt Form. l k thut dng trong cc Wizards ca VB ch mt s chng trnh khi u cho chng ta t cc bng km (Template).

Thm m lp trnh x l mt s c
Hu ht lp trnh trong Visual Basic l vit m x l cc s c (Event). Th d mun chm dt chng trnh, ngi s dng s click nt "Xuat". thc hin iu ny trong khi trin khai chng trnh bn doubleClick (click lin tip 2 ln) nt "Xuat". VB IDE s vit sn cho bn ci v ca mt Subroutine:
Private Sub cmdXuat_Click() End ' Bn ch vit thm dng ny kt thc chng trnh End Sub

l tn (Name) ca nt Xuat l "cmdXuat" ("cmd" l vit tt ch CommandButton), VB gn thm du gch di v Event Click lm thnh tn cmdXuat_Click ca Sub, chng trnh nh s c x l khi ngi s dng click nt Xuat. Chng trnh nh hay Subroutine ny cn c gi l Event Handler cho Event Click. Hng ch xanh l cy l dng gii thch cho lp trnh vin (gi l Comment), VB s hon ton khng ch n n khi x l Sub cmdXuat_Click. Comment c ngha l ch thch. Trong VB ch thch bt u bng du single quote '. Khi VB thy du ny l n b qua nhng g cn li trn dng m.

11

L Lp trnh vin chuyn nghip bn nn tp thi quen dng Comment mi ni gip ngi khc v chnh bn hiu chng trnh ca mnh. Nn nh l tin ph tn bo tr mt chng trnh th t nht l tng ng vi s tin b ra ln u trin khai. Bo tr c ngha l thm ving li chng trnh sa li (fix bug) v thm cc c im cho hay hn (enhancement). Ni chung h bn lm iu g b him hay cc c th lm n gii thch r rng. Nu mun ct mt dng m VB ra lm hai dng th chm dt dng th nht bng du gch di _. Tip theo, bn doubleClick nt "Viet vao dia" v vit nhng hng m sau:
Private Sub cmdViet_Click() Open "myFriends.txt" For Output As #2 ' M mt h s vit ra v gi l cng s 2 ' Vit vo cng s 2: Tn, a ch v Tui, ngn cch nhau bng du chm phy Print #2, txtTen & ";" & txtDiachi & ";" & txtTuoi Close #2 ' ng cng s 2 End Sub

Trong Sub cmdViet_Click, trc ht ta m mt h s tn l "myFriends.txt" v gi n l cng s 2. Sau khi m h s vit ra ta rp Tn, a ch v Tui li, ngn cch bng du chm phy (;) nh du nh sau ny ta mun g ring ba th ra tr li. Du "&" l operator rp (concatenate) hai dng ch (text string) li vi nhau. Print #2 c ngha l vit ra cng s 2, tc l h s "myFriends.txt". Th chng ta vit ra cng 2 l Tn, a ch v Tui (txtTen & ";" & txtDiachi & ";" & txtTuoi).

Nhng rc ri ca vic m mt h s
Ci cng s 2 trn l ta t chn (arbitrary). Tht ra mun gi cng s my cng c, min l cha c phn no khc trong cng chng trnh ny ang dng cng s y. y l mt cch VB lm vic cho tin thay v gi nguyn mt ci tn h s di. Nu mun chc chn khng trng s cng vi ch no khc, ta c th lm nh sau:
fileNo = freefile

Ri thay th s 2 bng ch fileNo trong Sub cmdViet_Click. freeFile l mt Function (chng trnh nh dng tnh ra mt th g) nh VB cp pht cho mt con s i din h s cha ai dng. Ch Output trong cu ( Open "myFriends.txt" For Output As #2 ) dng y ni t CPU (Central Processing Unit) ta mun "vit ra" mt h s. Khi m mt h s vit ra kiu ny th nu h s cha c n s c dng nn (created). Nu h s c ri th n s b xo b (delete) v ng thi mt h s trng v mi s c dng nn. ng t chuyn mn l "vit chng ln" (overwrite). Nu ta m mt h s "c vo" th dng ch "Input" thay v "Output". Cn nu "vit thm" vo mt h s c sn (ch khng overwrite h s y) th dng ch "Append" thay v "Output". Trong trng hp y bn phi kim xem h s "myFriends.txt" c sn cha. Bn c th vit nh sau:
If Dir("myFriends.txt") <> "" then ' Nu h s "myFriends.txt" hin hu Open "myFriends.txt" For Append As #2 ' M mt h s vit thm v gi l cng s 2 Else Open "myFriends.txt" For Output As #2 ' M mt h s vit ra v gi l cng s 2 End If

Function Dir("myFriends.txt") dng trn s cho ta tn ca h s nu h s hin hu, ngc li n s cho mt dng ch trng (empty string), biu hiu l "". Ti y, nu lanh bn s hi h s "myFriends.txt" nm folder no. Cu tr li l khng bit chc. Nu bn cha cha (save) chng trnh vo da (v mi vit) th n nm folder ca VB6.EXE. Cn nh cha chng trnh ri th c l n nm folder ca chng trnh bn. Mun h s "myFriends.txt" lun lun i cng vi chng trnh, bn c th lm nh sau: 12

MyLocalFolder = App.path ' Ly folder ca chng trnh x l ca bn If Right(MyLocalFolder,1) <> "\" then ' Nu ch cui cng khng phi l backslash MyLocalFolder = MyLocalFolder & "\" ' th gn thm mt backslash cui End If ' M mt h s vi tn c folder (full pathname) vit ra v gi l cng s 2 Open MyLocalFolder & "myFriends.txt" For Output As #2

Cui cng ta ng h s li bng cu Close #2.. T ry VB c th cp s 2 lm cng cho ch khc trong chng trnh.

Default Property ca mt Control


"txtTen" c dng y l vit tt cho "txtTen.text", v Default Property ca mt TextBox l text ca n. Default Property ca mt Control l Property c VB dng khi bn ch cho tn ca Control m thi. Trong khi Default Property ca Label l Caption. V txtTen c dng nh txtTen.txt ni n mt dng ch, nn trong chng trnh ta nhc n n y nh mt variable (m s) dng cho mt string. Do vi qui c dng ba ch u "txt" cho tn ca mt Textbox gip ta nhn din ngay n khng phi l mt string variable bnh thng. Hy lu s khc bit khi gi mt Sub trong hai trng hp sau:
Call CheckmyTextbox vn CheckmyTextbox dng ch txtDiachi ' txtDiachi c xem l txtDiachi.text, mt (txtDiachi) ' txtDiachi c xem l Textbox trn

Th t cc Control trn mt Form


Trong chng trnh ny ta mun ngi x dng cho vo d kin theo th t "Tn, a ch, Tui". Khi mi vo, ta mun ci du chp tt (cursor ) nm trong txtTen ngay ngi x dng khi mt cng click vo Textbox y khi mun mang cursor tr li . Ta ni l txtTen c ci Focus. Sau khi ngi x dng cho tn vo ri, c s nh nt Tab di chuyn cursor qua Control tip theo, m ta mun l txtDiachi. sp th t cc Control cho s di chuyn ca cursor khi ngi x dng nh nt Tab ta edit Property TabIndex ca cc Control. TabIndex bt u bng s 0. Nhiu khi ngi x dng thch dng nt Enter thay v Tab di chuyn Cursor qua Control tip theo, bn c th lm nh sau cho Textbox txtTen:
Private Sub txtTen_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then ' Nu nt bm l Enter SendKeys "{TAB}" ' gi mo gi nt Tab KeyAscii = 0 ' Nut trng nt Enter Windows khng cn lo cho n End If End Sub

Cho cc Textbox khc nh txtDiachi, txtTuoi bn cng lm tng t nh vy. Khi bn doubleClick txtTen ln u vit m, VB cho bn Private Sub txtTen_Change(). Bn phi click ci Combobox bn phi, pha trn ca Code Window, cho n m ra v chn Event KeyPress.

13

Nu bn mun chng trnh mnh cn chuyn nghip hn, bn cho php ngi x dng bm nt Alt+o (bm nt Alt xung trong khi bm nt o) mang Cursor v txtTuoi hay Alt+d mang Cursor v txtDiachi. Mun th bn phi thm vo du "&" pha trc cc ch T, D v o trong Caption ca cc label lblTen, lblDiachi v lblTuoi. K bn phi cho gi tr TabIndex ca lblTen, txtTen, lblDiachi, txtDiachi, lblTuoi, txtTuoi lin tip l 0,1,2,3,4,5. Khi ngi x dng nh Alt+o, VB s mang Cursor v nhn lblTuoi, nhng v khng c ch cho n p trong label nn n phi p vo Control k , tc l txtTuoi. Khi ta cho TabIndex ca cc Control nhng gi tr k trn th khi Form hin ra Cursor s nm trong TextBox txtTen v mc du lblTen c TabIndex nh nht(0), n khng phi l ch Cursor p ln c, nn Cursor phi p ln textbox c TabIndex value k , tc l 1. Nu bn khng mun Cursor ngng li mt TextBox no th edit Property TabStop ca TextBox cho bng False. Trong trng hp y ngi s dng vn c th click vo TextBox v sa dng ch c nh thng. Nu bn tht s khng mun cho php ngi s dng sa g TextBox th edit Property Enabled bng False hay Property Locked bng True. Khi Enabled ca mt TextBox bng False th TextBox tr nn m i. Nhn tin ta edit thm du "&" pha trc cc ch X v V trong Caption cc CommandButton "Xuat" v "Viet vao dia". Sau ny ngi s dng c th bm Alt-X coi nh tng ng vi click nt "Xuat". Nu nh trong Form bn c nhiu Textbox qu, i nt Enter ra nt Tab cho tng Textbox mt th mt cng qu. Bn c th lm mt ci chung cho c Form. Tc l ni rng bn khng cn bit nt Enter va mi c nh TextBox no, bn c nhm mt i n ra nt Tab. Trc ht bn phi chn (select) Form ri edit Property KeyPreview ca n thnh True. Bn lm vic ny dn Form git ci nt ngi s dng nh (keystroke) trc khi TextBox thy. Form s tro nt Enter thnh Tab ri lng lng trao cho TextBox. Bn c th thay th tt c cc KeyPress event handler ca cc TextBox bng on m nh sau:
Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then ' Nu nt bm l Enter SendKeys "{TAB}" ' gi mo gi nt Tab KeyAscii = 0 ' Nut trng nt Enter Windows khng cn lo cho n End If End Sub

Khi bn doubleClick ln bt c ch no trn Form khng c Control nm, ln u vit m, VB cho bn Private Sub Form_Load(). Bn phi click ci Combobox bn phi, pha trn ca Code Window, cho n m ra v chn Event KeyPress.

em ra trnh lng
lm thnh mt h s p dng EXE, bn dng mnh lnh Menu File|Make MyFirstProg.exe. Cho thm cht hng v ca cuc i ti click Form ri edit Property Icon, chn cho n t folder:

14

D:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc mt icon hnh gng mt ci. Ri bm mnh lnh Menu File|Save Project. Khi dng Explorer xem cc h s ca MyFirstProg.vbp bn s thy nh di y:

ng l ti dng mt folder khc thay v VB98 cha d n MyFirstProg.vbp. H s MyFirstProg.vbw l Workspace (ch lm vic) dnh cho VB, ta khng nn ng ti. Bn c th lm mt Shortcut cho MyFirstProg.exe vi ci icon hnh gng mt ci t ln Desktop chy bn ngoi IDE ca VB. C l bn mun Download h s:MyFirstProg.zip, nn chung tt c cc h s ni trn trong d n MyFirstProg.vbp. By gi ngay trong VB IDE bn c th chy chng trnh bng cch dng mnh lnh Menu Run|Start hay bm F5.

Bn cng c th Click ln du tam gic ch v bn phi (nt Play ca cassette) nm trong toolbar ngay pha di VB menu.

Cch nn cc files trong mt folder thnh mt zip file duy nht


gi nhiu files bng cch nh km (attach) mt Email trn Internet ta cn phi nn cc files y thnh mt file duy nht, gi l Zip file. Trc ht, trong Window Explorer bn chn nhng files bn mun Zip chung li. Bn chn nhiu files bng cch nt Ctrl trong khi click ln tn tng file mt. Nu bn ln nt Shift, thay v nt Ctrl, th c mi lc bn click, Window Explorer s select c mt dc tn cc files nm gia tn hai files bn click mi nht. Ngoi ra bn cng c th dng Menu Command Edit | Select All, hay Ctrl+A select tt c cc files trong mt folder. y l trng hp bn s dng khi Zip tt cc cc files trong mt VB6 project gi qua Thy/C. Sau khi select cc file ri, bn right click ln cc file y context menu pop-up. Chn Add to Zip. Nu bn khng thy pop-up command Add to Zip th l bn cha install chng trnh Winzip. Trong trng hp y, download Winzip t Internet v install.

15

By gi bn th khi ng VB6, i do quanh n th bit cc phn ca VB6 IDE, v th lm theo nh bi ny. Nu c thc mc g th hi Tutor ca bn.

Chng Ba - Form v cc Controls thng thng

Hu ht cc chng trnh VB6 u c t nht mt Form. Khi ta chy chng trnh, Form ny s hin
ra trc ht ta ra lnh n lm chuyn g. Ci Form trng khng ch lm c g nhiu, nn ta t ln Form nhng controls nh Textbox(hp nh ch vo), Label(nhn), Commandbutton(nt bm mnh lnh), .v.v.. Cc controls cho ta enter cc d kin chng trnh dng x l, v cc controls cng hin th (display) kt qu cho chng ta xem.

Sp t controls ln Form
Ta hy bt u thit k mt chng trnh mi (New Project) bng cch chn Standard EXE, mi trng trin khai lp trnh (IDE) cho bn sn mt Form tn l Form1. Mun t mt Control ln Form, click hnh ci Control trong Toolbox ri Drag (bm nt tri ca con chut ri ko cho thnh hnh ch nht trc khi bung nt tri ra) con chut trn Form v thnh c ca Control. Mt cch khc t mt control ln Form l doubleclick ci Control trong Toolbox, mt hnh control s hin ra trn Form. K bn di control i n ch mnh mun v resize n. Nu bt c lc no bn khng thy Ti ngh (Toolbox) nm bn tri, bn c th dng mnh lnh Menu View|Toolbox bt n hin ra. C mt cch khc l click ln toolbox icon trn toolbar chnh ca VB6.

Nn nh rng Toolbox cng l mt window nh cc window khc. Khi n hin ln ri bn c th nm (bm nt tri ca con chut v gi nh vy ch khng bung ra) title n di i ni khc. Bn c th ng n bng cch click ln du x gc phi pha trn. Nu right click trn Toolbox, n s display context sensitive menu, trong c property dockable (c th u bn) . Nu mt window l

16

dockable, sau khi bn di n i khi vi tr docked bnh thng ca n, bn c th dock n li nh c bng cch double click ln title ca n.

Resize v di chuyn control


Khi bn select mt control (click ln n), chung quanh control s hin ra resize handle, 8 nt en dc theo chu vi ca control.

Click ln cc nt en ca resize handle, bn c th resize control. C mt cch khc resize control l dng Shift + ArrowKey. Bm nt Shift trong khi bm mt arrow key, control s ln ra hay thu hp theo chiu ca ArrowKey. Lu : Mt s control c kch thc ti thiu, bn khng th lm cho n nh hn c. Th d nh Combobox, n phi cao display mt hng text. Tng t nh th, bm nt Ctrl trong khi bm mt arrow key, control s di chuyn theo chiu ca ArrowKey. Ngoi ra, nn nh rng trong lc chng trnh chy (at run-time), trong code ta c th thay i kch thc v v tr cc controls d dng, thm ch c th lm cho chng hin ra hay bin mt bng cch sa i value cc property left, top, width, height v visible ca cc controls.

Alignment Grid
gip bn sp t ngay ngn cc controls trn mt form, VB6 cho bn Alignment Grid. N l nhng du en ca cc hng dc v xui trn form. Bn c th lm cho cc du en ca grid trn form bin mt bng cch dng menu command Tools | Options display Option Dialog, k chn Tag General v clear checkbox "Show Grid":

17

Bn cng c th nhn dp ny thay i khong cch chiu rng (Width) v chiu cao (Height) ca cc chm en ca grid. Kch thc nh nht ca Width hay Height l 24. Hy so snh hai trng hp form c v khng c Show Grid nh di y:

Control Locking
Mt khi bn sp t kch thc v v tr ca cc control trn form ri, rt d ta tnh c thay i cc c tnh y v v click ln mt control. Do VB6 cho ta Menu command Format | Lock Controls kha chng li. Sau khi kha, ci hnh ng kha trn menu b chm xung.

Nu sau ny bn mun thay i kch thc hoc v tr ca chng th nh dng Menu command Format | Lock Controls li. Sau khi m kha, ci hnh ng kha trn menu hin ra bnh thng.

Ci t cc Properties ca Form
Nhiu property ca mt form nh hng n din mo vt l (physical appearance) ca n. Property Caption s quyt nh text c hiu th trong title. Nu Property BorderStyle ca form khng phi l Sizable th User khng th resize form at run-time. Property Icon quyt nh hnh icon uc dng trong title ca form, nht l khi form thu nh (minimized). Nu bn khng mun cho php User minimize hay maximize form th set value ca property MinButton, MaxButton ra False. Nu property ControlBox l False th form s khng c nt minize, maximize hay close (x) trn gc phi ca n, ng thi form cng khng display c icon bn gc tri title nh trong hnh di y:

18

V tr u tin (top,left) ca form c th c thay i trong design time bng cch di chuyn hnh nh ca n trong window Form Layout:

Property WindowState xc nh Form s c kch thc bnh thng (normal=0), hay minimized (=1), maximized =(2). Lu l property Font ca Form s c cc control nm trn n tha k. Tc l khi bn t mt control ln form, property Font ca control y s t ng tr nn ging y nh ca form.

Vi Event thng dng ca Form


Nhn t mt phng din, Form cng ging nh Control. Ta c th instantiate mt form nhiu ln c nhiu form tng t nhau. Trong th d di y, ta instantiate Form2 hai ln c MyForm v YourForm:
Private Sub CmdCreateForms_Click() Dim MyForm, YourForm Set MyForm = New Form2 MyForm.Caption = "This is My Form" MyForm.Show MyForm.Move 1000, 1000 Set YourForm = New Form2 YourForm.Caption = "YOUR FORM IS HERE" YourForm.Show YourForm.Move 2000, 2000 End Sub

Mt Form cng c nhiu Events rt hu dng.

F orm_Initialize: Event ny xy ra trc nht v ch mt ln thi khi ta instantiate form u tin. Ta dng Form_Initialize event thc hin nhng g cn phi lm chung cho tt c cc instances ca form ny.

F orm_Load: Event ny xy ra mi ln ta instantiate mt form. Nu ta ch dng mt instance duy nht ca mt form trong chng trnh th Form_Load coi nh tng ng vi Form_Initialize. Ta dng Form_Load event initialise variables, controls v.v. cho instance ny. Bn trong Form_Load bn khng th dng Setfocus cho mt control no trn form v form cha

19

hn thnh hnh (ra i). Mun lm vic y bn phi delay (tr hon) mt cht xu bng cch dng Control Timer i cho Form_Load c hon tt. Th d:

Private Sub Form_Load() Timer1.Interval = 500 Timer1.Enabled = True End Sub Private Sub Timer1_Timer() Timer1.Enabled = False ' Timer1_Timer only execute once txtName.Setfocus ' Make Tab Cursor start at TextBox txtName End Sub

F orm_Activate: Mi ln mt form tr nn active (current) th n generate mt Activate event. Ta c th dng event ny refresh display trn form.

F orm_QueryUnload: Khi User click du x pha trn bn phi close form th n generate QueryUnload event. Syntax ca Sub ny nh di y:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) End Sub

Event ny cho ta mt dp cancel Close action ca form (tc l khng cho User close form) bng cch set Cancel bng 1. UnloadMode cho ta bit ai, task hay form no mun close form ny. Ngoi ra, bn cng nn bit rng mt form t ng Load hay tr nn active nu bn nhc n n, th d nh dng Form2.List1. Khi mt form c loaded ri bn c th hide (lm cho bin mt) n. K , khi bn show form ra tr li th form khng c g thay i. Nhng nu bn Unload mt form (th d bng cch dng Unload Form2 ), ri sau load tr li bng cch dng Form2.Show chng hn, th Form phi tri qua qu trnh Form_Load, v d nhin form mt tt c nhng g c trc y. Ngoi ra, Hide/Show mt form c loaded ri th rt nhanh, cn Unload/Load th mt th gi hn. Khi bn Show mt Form cha hin hu th form s c loaded v show. i khi bn mun Load mt form, ri lm vic vi n trc khi Show, trong trng hp bn dng Load Form2 ri mt chp sau dng Form2.Show.

MDI Form
i khi bn mun c mt MDI form, tc l mt form c th cha nhiu form con bn trong. Dng MDIform ny thng c dng trong cc application nh wordprocessor c th m nhiu document cng mt lc, mi document c hin th trong mt form con. c mt MDIForm bn cn phi dng menu command Project | Add MDI Form. Mi VB6 project ch c th c ti a mt MDIform. Mun mt form tr thnh mt form con bn set property MDI Child ca n thnh True. At run-time bn khng th hide (bin n thnh invisible) mt MDIChild form, nhng c th minimize n. Nu bn tht s mun hide n th phi dng mnh li l cho n v tr (top,left) s m ln hn kch thc n n nm ngoi tm hin th ca form. Trong mt chng trnh dng MDI Form, khi bn click MDI Form n khng nhy ra pha trc v che cc form con, nhng vn lun lun nm di.

20

Controls l g?
Controls va c hnh, va c code chy bn trong mt window nho nh, ging nh mt form. Khi ta lp trnh VB6 ta lp rp cc controls (l nhng vt dng tin ch) trn mt hay nhiu form c mt chng trnh nhanh chng. Ta giao dch vi mt control qua ba c tnh ca control:

P roperties: tp hp cc c tnh ca control m ta c th n nh lc design time hay run-time. C nhiu properties v din mo, nu ta thay i at design time s thy kt qu hin ra lp tc, th d Font hay mu sc.

M ethods: nhng g control thc hin uc, tc l nhng kh nng ca n. E vents: nhng s c m control s thng bo cho chng ta bit khi n xy ra vi control. Khi mt event xy ra VB6 s x l mt Event Handler (th d nh Sub Command1_Click()), min l chng ta vit code sn trong . Nu khng c code th coi nh chng ta khng thm bit n cc event loi . C mt s Events m chng ta thng x l l:

C lick : xy ra khi user click ln control. Ta thng dng n cho CommandButton v Listbox. M ouseDown, MouseUp : mi khi User bm mt mouse button l c mt MouseDown Event, khi User bung n ra th c mt MouseUp Event. Ta thng dng MouseDown Event Popup context sensitive menu hay bt u mt din bin Drag. Th d:

Private Sub Foods_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbRightButton Then ' if Right button was pressed PopupMenu mnuActions ' popup a menu End If End Sub Private Sub DrinkList_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) DrinkList.drag ' Displaying a drag icon to start the drag process End Sub

l Click khng cho chng ta thm chi tit g v s c, trong khi MouseDown/MouseUp cho ta bit v tr ca cursor, button no ca Mouse c bm v lc y User c bm nt Shift, Ctrl hay Alt khng. Mi Click l i i vi mt cp MouseDown/MouseUp. Nu bn mun x l va Click ln MouseDown th phi cn thn. Th d bn mun va handle Click event va handle Mouse Drag th phi lm sao phn bit hai trng hp. Nu khng User ch mun thy kt qu ca Click m li thy control bt u display mt Drag icon th s bc mnh.
o

K eyPress : xy ra khi user Press mt key. Ta thng dng n cho TextBox loi ra (filter out) cc keystrokes ta khng chp nhn. KeyPress cho ta ASCII value, mt con s c gi tr t 1 n 255, ca key. Trong th d di y, mt Enter key s c coi nh mt TAB key:

21

Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ' Swallow the character to avoid side effect SendKeys "{TAB}" ' Emulate entering a TAB End If End Sub
o

K eyDown, KeyUp : mi KeyPress event l cho ta mt cp KeyDown/KeyUp event. KeyDown/KeyUp cho ta KeyCode v Shift value. detect Function key ta cn dng KeyDown event. Trong th d di y, ta display Function key User bm:
Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer) If (KeyCode >= 112) And (KeyCode <= 123) Then MsgBox "You pressed the Function key: F" & Trim(Str(KeyCode - 111)) End If End Sub

G LotFocus : Control tr nn active khi n nhn c Focus. N s generate mt GotFocus Event. Ta c th dng n i mu background ca mt text box nh trong th d di y:
Private Sub Text2_GotFocus() Text2.BackColor = vbYellow End Sub

L LostFocus : Thng thng h mt Control GotFocus th trc c mt Control LostFocus. Ta c th dng Event ny Validate entry data hay thu xp cng chuyn cho mt control va mt Focus. Trong th d di y, nu User khng nh vo mt con s trong Textbox Text1 th s c thng bo v Tab Cursor s tr li Textbox Text1.
Private Sub Text1_LostFocus() If Not IsNumeric(Text1.Text) Then MsgBox "Please enter a number!" Text1.SetFocus End If End Sub

r DagDrop : xy ra khi ta drop mt ci g ln control . Parameter Source cho ta bit Control no c Drag v Drop. Nhiu khi mt control c th nhn drop t nhiu control khc nhau. Trong trng hp ta phi test xem hoc Control Type, hoc Name hoc Tag value ca Source control l g ty nghi x l.

22

Trong th d di y, khi User drop mouse xung Textbox Text2, nu Source l mt Listbox, khng cn bit Listbox no, th ta copy dng c chn trong Listbox y qua Textbox Text2.
Private Sub Text2_DragDrop(Source As Control, X As Single, Y As Single) If TypeOf Source Is ListBox Then Text2.Text = Source.Text End If End Sub

TextBox
TextBox l control uc dng nhiu nht display text v nhn keystroke ca User sa i text c sn hay cho vo text mi. Property chnh v default ca Textbox l text, tc l thng thng Text2.text c th c vit tt l Text2. Ta c th disable (khin n bt lc, khng phn ng g ht v khng cho sa i) mt text box bng cch set Property Enable ra False (ch s b m i), hay Lock (khng cho sa i) mt text box bng cch set Property Locked ra True (ch khng b m). Text c th c Align (Alignment Property) display bn tri, chnh gia hay bn phi ca hp n.

Bn c th chn BackColor v ForeColor cho background v text ca TextBox. Dng Tag Palette khi chn mu c ng mt mu bn mun.

D nhin bn c th la chn Font v c ch cho Text vi Font Property. Bn gii hn s characters m User c th enter cho TextBox bng cch set MaxLength Property. Nu Property Multiline l True th User c th enter nhiu hng. At Design time, nu bn mun enter multiline th phi nh bm nt Ctrl khi press Enter mi khi xung hng. Nu khng VB6 IDE tng rng bn kt thc editing.

23

Mun assign cho text box multiline text th phi nht vo mi cui hng CarriageReturn v LineFeed characters. Th d nh:
Private Sub Command1_Click() Dim TextStr TextStr = "Bau ra bau lay ong cau" & vbCrLf ' Note: vbCrLf = chr(13) & chr(10) TextStr = TextStr & "Bau cau ca bong ngat dau kho tieu" Text1.Text = TextStr End Sub

Nu bn mun mch nc cho User v cch dng mt textbox no th c th dng Property ToolTipText n display mch nc mi khi mouse cursor nm ln textbox.

Dng Property TabIndex n nh th t cho Tab Cursor dng mi khi User bm nt TAB di TAB Cursor n Textbox k tip. Nu bn khng mun Tab Cursor dng mt TextBox no th set Property TabStop n thnh False. Tab Cursor khng dng Textbox c Property Enabled bng False, nhng vn dng Textbox c property Locked bng True. Nu bn mun dng Textbox lm mt Password field th set Property PasswordChar bng "*". Lm nh th s p buc Textbox display mi character bng PasswordChar, tc l "*", ngi khc khng c c trong khi User enter mt Paswword.

Properties SelLength, SelStart v SelText Nu bn mun bit c tnh hnh hin thi ca Textbox: SelText cho bn dy ch ang c selected. SelStart cho bn v tr ca insertion point (ch cursor flashing). SelLength cho bit con s characters c selected. Nu bn mun sa i text trong Textbox: SelText cho bn nht vo mt dy ch. SelStart cho bn n

24

nh v tr bt u ca dy ch bn sp select. SelLength n nh s characters bn mun chn, bt u t SelStart. Di y l mt th d trong ta highlight text tm c:


Private Sub Form_Click () Dim Search, Where ' Declare variables. ' Get search string from user. Search = InputBox("Enter text to be found:") Where = InStr(Text1.Text, Search) ' Find the given string in Text1.Text. If Where > 0 Then ' If found, Text1.SelStart = Where - 1 ' set selection start and Text1.SelLength = Len(Search) ' set selection length. Else MsgBox "String not found." ' Notify user. End If End Sub

CommandButton
CommandButton rt tin cho ta dng vo vic x l mt chuyn g khi User click ln button. Event ta dng thng nht cho CommanButton l Click. Ta dng Property Caption ca CommandButton enter ci g ta mun display trn button. Nu mun cho php User dng ALT+E ( nt Atl trong lc bm nt E) generate event click th nht du "&" trc ch E trong Caption ca button. Caption s display ch E vi mt gch di. Ngoi ra ta cng c th cho thm mt ci hnh vo CommandButton bng cch chn mt icon cho property Picture v set Property Style ra Graphical, thay v Standard.

Lc Run-time bn c th thay i hnh hay Caption ca CommandButton. Trong th d di y, Caption ca CommandButton CmdOperation flip-flop gia hai values Stop v Start:
Private Sub CmdOperation_Click() If CmdOperation.Caption = "&Stop" Then CmdOperation.Caption = "St&art" Else CmdOperation.Caption = "&Stop" End If End Sub

Label
Mc ch chnh ca Label l display, khng cho User Edit nh Textbox. Do ta c th dng Property Font, ForeColor v Backcolor lm cho n p. Ngoi ra Property BorderStyle c th cho Label lm xung nu bn set n bng Fixed Single. Nu set property BackStyle bng Transparent s

25

trnh trng hp Backcolor ca Label lm cho khng p. Label cng c Property Tabindex. Nu bn mun dng ALT key mang Tab Cursor v mt Textbox, hy mt Label vi TabIndex bng TabIndex ca TextBox tr 1. Gi s Label c Caption l "&Address" th ALT+A s mang Tab Cursor v TextBox mu vng nh trong th d di y:

Ngoi ra nh rng bn c th thay i Caption ca Label lc run-time.

CheckBox
CheckBox c dng User xc nhn c c tnh no mt cch nhanh chng. Property Value ca CheckBox c th l Checked (lm cho hp vung c du, bng 1), Unchecked (lm cho hp vung trng khng, bng 0) hay Grayed (lm cho hp vung c du mu nht, bng 2). Mt khi bit rng CheckBox c Value bng 1, ta c th c Caption ca CheckBox dng nu cn.

Bn c th dng Property Alignment lm cho Caption ng bn phi (Left Justify) hay bn tri (Right Justify) ca hp vung.

OptionButton
OptionButton ( cn gi l RadioButton) c hnh trn vi mt chm gia, thay g hnh vung vi mt gch gia nh CheckBox. OptionButton lun lun c qui t thnh mt nhm, cha trong mt container. Container l mt Control c kh nng cha cc controls khc. Frame, PictureBox, hay chnh Form u l Container. Sau khi t mt Container ln Form, nu mun mt OptionButton ln Container, trc ht ta phi Select container, ri k chn OptionButton. S d, tt c OptionButtons phi nm trong mt container l v bt c lc no, nhiu nht l mt OptionButton trong container c value True (vng trn c chm gia). Mun bit mt OptionButton c tht s nm trong mt container, bn th ko ci container i ch khc. Nu OptionButton b di theo container th n nm trong container. Mt cch khc l th ko OptionButton ra khi container. Nu ko ra c th n khng nm trong container.

26

Mun di chuyn mt OptionButton t container ny sang container khc, bn Cut OptionButton ri Paste n v container kia.

i khi mt container nm che trn mt control khc. Mun mang mt container ra pha sau cc controls khc bn Select container ri dng Menu command Format | Order | Send to Back.

Chng Bn - Vit Code

Trong ba chng u chng ta hc qua ba b phn chnh ca mt chng trnh Visual Basic 6.0.
l:

Forms l ci nn hay khung ta xy dng User Interface. Controls l nhng vin gch ta dng xy dng User Interface. Event procedures l code nm pha sau nhng hnh nh, n l cht keo dng dn cc Controls li vi nhau to thnh chng trnh p dng ca ta.

Nh ta thy, tt c cc code c x l (executed) khi c mt Event xy ra. Th d nh khi User click mt CommandButton (Event Click) hay type nt Tab di chuyn Cursor t Textbox ny (Event Lostfocus) qua Textbox khc (Event GotFocus). Cc nhm code x l l :
Private Sub Command1_Click() ...

27

End Sub Private Sub Text1_LostFocus() ... End Sub v Private Sub Text2_GotFocus() ... End Sub

Trong khi lp trnh, mi ln ta double click ln mt Control ca mt Form l VB6 IDE t ng generate cho ta ci v t hng Private Sub Control_Event() cho n End Sub chng ta in nhng hng code ca mnh vo chnh gia.

iu khin th t x l cc dng code


Gi d ta vit mt chng trnh Vb6 n gin nh trong hnh ny vi hai Textbox tn txtName, txtAge v mt nt tn CmdEnter nm trong mt form tn Form1:

Thng thng cc dng code c x l theo th t t trn xung di. Th d nh kim xem cc d kin va c cho vo cc Textbox c tng i hp l hay khng, khi User click nt CmdEnter, ta x l Sub di y:
Private Sub CmdEnter_Click() ' Make sure the Name field is not blank If txtName.Text = "" Then MsgBox "Please enter Name" Exit Sub ' Terminate this Sub End If ' Make sure a number is supplied for Age If Not IsNumeric(txtAge.Text) Then MsgBox "Please enter a number for Age" Exit Sub ' Terminate this Sub End If End Sub

Ci Sub ni trn c ch Private nm pha trc, ni ch ni trong cng mt form cha Control CmdEnter (tc l Form1 trong trng hp ny) ta mi c th gi (dng) Sub CmdEnter_Click(). Th d ta mun khi User bm key "Enter" trn bn phm sau khi cho vo chi tit Textbox txtAge th coi nh User click nt CmdEnter. Ta vit nh sau:
Private Sub txtAge_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ' swallow Key Enter to avoid side effect

28

CmdEnter_Click ' Call Private Sub CmdEnter_Click from the same form End If End Sub

Khi ta dng cu CmdEnter_Click lm mt dng code (cn gi l gi Sub CmdEnter_Click) th coi nh tng ng vi nht tt c 10 dng codes gia hai hng Private Sub CmdEnter_Click() v End Sub ti ch cu CmdEnter_Click, nh vit li di y:
Private Sub txtAge_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ' Swallow Key Enter to avoid side effect ' Make sure the Name field is not blank If txtName.Text = "" Then MsgBox "Please enter Name" Exit Sub ' Terminate this Sub End If ' Make sure a number is supplied for Age If Not IsNumeric(txtAge.Text) Then MsgBox "Please enter a number for Age" Exit Sub ' Terminate this Sub End If End If End Sub

C mt cch ni khc l khi execution i n hng CmdEnter_Click th n nhy vo Private Sub CmdEnter_Click() execute cho n ht ri nhy tr li hng k tip trong Private Sub txtAge_KeyPress(KeyAscii As Integer) Trong Private Sub CmdEnter_Click() nu User khng nh g vo Textbox txtName th chng trnh s display message "Please enter Name" ri Exit Sub. y l cch nhy ngay ra khi Sub ch khng i phi execute xung ti hng cht.

Dng IF....THEN statement


Trong Private Sub CmdEnter_Click() trn ta thy c hai ch dng IF...THEN th xem mt iu kin g c c tha mn khng. Nu iu kin l ng vy, tc l True th ta thc hin nhng g uc vit t hng IF...THEN cho n hng END IF. Ngc li, nu iu kin khng ng th execution nhy xung ti dng code nm ngay di dng END IF. Tc l c khi execution s i ngang qua, c khi khng i ngang qua nhng dng code gia cu IF...THEN v cu END IF. iu kin trong IF Statement l phn nm gia hai ch IF v THEN. N uc gi l Logical Expression. Ta c:
txtName.text = "" ' content of Textbox txtName is nothing, i.e. an empty string v NOT IsNumeric(txtAge.text) ' content of TextBox txtAge is not a number

Trong Logical Expression th nh ta dng Function IsNumeric c cho bit rng txtAge.text c phi l mt con s hay khng. V ta ch than phin khi txtAge khng phi l mt con s nn ta phi thm ch NOT pha truc. Tc l khi
IsNumeric(txtAge.text) = False th NOT IsNumeric(txtAge.text) = True

Nu gia IF...THEN v END IF ch c mt dng code bn c th nhp dng code ln vi IF...THEN v khng dng END IF. Tc l:

29

If theColorYouLike = vbRed Then MsgBox "You 're a lucky person!" End If is equivalent with If theColorYouLike = vbRed Then MsgBox "You 're a lucky person!"

Mt Logical Expression c th n gin (simple) nh trong cc th d trn hay rc ri hn nu ta rp nhiu simple Logical Expression li vi nhau bng cch dng nhng t OR v AND. Khi hai Logical Expression c rp li bng ch OR (HAY) th ch cn t nht mt trong hai Expression l TRUE l Logical Expression tng hp cng l TRUE. Ci TRUE Table cho OR nh sau:
A B A OR B

FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE

FALSE TRUE TRUE TRUE

Trong th d di y nu mt ngi 25 tui tr ln HAY c li tc trn 30 ngn la mt nm th cho mn tin c :


If (PersonAge >= 25) Or (PersonIncome >= 30000) Then LendPersonMoney End If

cch dng cc du ngoc n ging nh trong ton i s. Thng thng h ci g nm trong ngoc th mnh tnh trc. Nu c nhiu lp du ngoc th tnh theo th t t trong ra ngoi. Nh trong bi trn ta tnh xem PersonAge >= 25 xem l TRUE hay FALSE, ri tnh xem PersonIncome >= 30000 xem l TRUE hay FALSE, trc khi tnh kt qu tng hp, da vo ci TRUE table cho OR. Khi hai Logical Expression c rp li bng ch AND (V) th ch khi no c hai Expression u l TRUE, Logical Expression tng hp mi l TRUE. Ci TRUE Table cho AND nh sau:
A B A AND B

FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE

FALSE FALSE TRUE TRUE

Trong th d di y nu hc sinh 18 tui tr ln v cha m kim 100 ngn tr ln mt nm th ng k hc sinh mt i hc t:


If (StudentAge >= 18) And (ParentIncome >= 100000) Then EnrollStudentAtPrivateUniversity End If

30

Mt Logical Expression c th tp hp c OR ln AND nh trong th d di y nu hc sinh 18 tui tr ln v cha m kim 100 ngn tr ln mt nm HAY hc sinh c Intelligent Quotient cao hn 160 th ng k hc sinh mt i hc t:
If ((StudentAge >= 18) And (ParentIncome >= 100000)) Or (StudentIQ > 160) Then EnrollStudentAtPrivateUniversity End If

Hai du ngoc n nm bn ngoi ca:


((StudentAge >= 18 ) And (ParentIncome >= 100000))

khng cn thit v theo qui c, ta tnh AND expression trc khi tnh OR expression, nhng n gip ta c d hn.

Dng IF....THEN..ELSE statement


Hy xem th d:
If (StudentPassmark > 75) Then ' Part A EnrollStudentAtPublicSchool Else ' Part B EnrollStudentAtPrivateSchool End If

Nu hc sinh u vi s im trn 75 th cho hc trng cng, NU KHNG th phi hc trng t. Tc l nu StudentPassmark > 75 l TRUE th x l phn A, nu khng th x l phn B. phn A gm nhng dng code nm gia dng If (StudentPassmark > 75) then v else. Cn phn B gm nhng dng code nm gia dng else v end if. Ta c th rp ch ELSE vi ch IF dng nh trong th d sau y: <
If (StudentPassmark > 75) Then EnrollStudentAtPublicSchool ElseIf (StudentPassmark >= 55) Then EnrollStudentAtSemipublicSchool Else EnrollStudentAtPrivateSchool End If

Nu hc sinh u vi s im trn 75 th cho hc trng cng, NU t 55 im n 75 im th cho hc trng bn cng, nu khng (tc l im u di 55) th phi hc trng t. Nu tnh nh, khng c trng t, ta khng c quyt nh cho hc tr u di 55 im hc u th b phn ELSE trong th d trn. Phn chng trnh tr thnh:
If (StudentPassmark > 75) Then EnrollStudentAtPublicSchool ElseIf (StudentPassmark >= 55) Then EnrollStudentAtSemipublicSchool End If

Ta c th dng ELSEIF nhiu ln nh sau:

31

If (TheColorYouLike = vbRed) Then MsgBox "You 're a lucky person" ElseIf (TheColorYouLike = vbGreen) Then MsgBox "You 're a hopeful person" ElseIf (TheColorYouLike = vbBlue) Then MsgBox "You 're a brave person" ElseIf (TheColorYouLike = vbMagenta) Then MsgBox "You 're a sad person" Else MsgBox "You 're an average person" End If

Execution i ln lt t trn xung di, nu mt iu kin IF l TRUE th x l phn ca n ri nhy xung ngay di dng END IF. Ch khi mt iu kin IF khng c tha mn ta mi th mt iu kin IF bn di k . Tc l nu bn thch mu lu mu tm (magenta) th chng trnh s display "You're a lucky person", v khng h bit "You're a sad person".

Dng SELECT CASE statement


Th d c nhiu ELSEIF nh trn c th c vit li nh sau:
Select Case TheColorYouLike Case vbRed MsgBox "You 're a lucky person" Case vbGreen MsgBox "You 're a hopeful person" Case vbBlue MsgBox "You 're a brave person" Case vbMagenta MsgBox "You 're a sad person" Else MsgBox "You 're an average person" End Select

Cch vit ny tng i d c v t nhm ln khi vit code hn l dng nhiu ELSEIF. Phn ELSE trong Select Case statement th optional (nhim ), tc l c cng c, khng c cng khng sao. H khi iu kin ca mt Case c tho mn th nhng dng code t cho n dng Case k di hay Else c x l v tip theo execution s nhy xung dng nm ngay di dng End Select. Nh l di cng ta vit End Select, ch khng phi End If. Cc Expression dng cho mi trng hp Case khng nht thit phi n gin nh vy. bit thm chi tit v cch dng Select Case, bn highlight ch Case (doubleclick ch Case) ri bm nt F1.

Dng FOR statement


Trong lp trnh, ni v Flow Control (iu khin hng i ca execution) ta dng hai loi statement chnh: Branch statements nh IF..THEN..ELSE (k c Select Case) v Iterative statements (lp i, lp li) nh FOR v WHILE LOOP (Vng). Ta s ni n WHILE Loop trong phn k tip. Trong khi Branch statement cho php ta execute trong nhnh ny hay nhnh kia ty theo value ca Logical Expression th Iterative statement cho ta execute mt phn code lp i, lp li nhiu ln cho n khi mt iu kin c tha mn. Gi d ta vit mt chng trnh n gin tnh tng s cc con s gia bt c hai con s no (coi chng ln qu). Ci form ca chng trnh ging nh di y:

32

Sau khi cho hai con s From (T) v To (Cho n) ta click nt Calculate v thy kt qu hin ra trong Textbox txtTotal. Ci Sub tnh tng s c lit ra di y:
Private Sub CmdTotal_Click() Dim i, FromNo, ToNo, Total FromNo = CInt(txtFromNumber.Text) ' Convert Text string ra internal number b?ng Function CInt ToNo = CInt(txtToNumber.Text) ' Convert Text string ra internal number b?ng Function CInt Total = 0 ' Initialise Total value to zero For i = FromNo To ToNo ' Iterate from FromNo to ToNo Total = Total + i ' Add the number to the Total Next txtTotal.Text = CStr(Total) ' Convert internal number ra Text string End Sub

Trong th d trn, FOR loop bt u t dng For i = FromNo To ToNo v chm dt dng Next. Khi execution bt u Total bng 0, i bng FromNo. Execution s i qua ht nhng dng trong FOR loop ri value ca i s c tng ln 1, ri execution s bt u li u loop. Trong th d ny v FromNo=4 v ToNo=6 nn execution s i qua ci FOR loop 3 ln. Ln th nht i=4, ln th nh i=5 ,v ln th ba th i=6. Sau , khi i=7 th n ln hn ToNo (=6) nn execution nhy ra khi FOR loop. Kt qu l Total=15 v c display trong Textbox txtTotal, sau khi c converted t internal number ra text string vi Function CStr. Nu ta ch mun cng nhng s chn t 4 n 16 ta c th lm cho i tng value ln 2 (thay v 1) mi khi n cui loop. Tc l i=4,6,8 .v.v..Ta s thm ch STEP trong FOR statement nh sau:
For i = 4 To 16 Step 2 ' Iterate from 4 to 16 with Step=2 Total = Total + i ' Add the number to the Total Next

Total s bng 4+6+8+10+12+14+16= 70. Trong th d trn ta cng c th dng STEP s m nh sau:
For i = 16 To 4 Step -2 ' Iterate from 16 to 4 with Step=-2 Total = Total + i ' Add the number to the Total Next

Trong trng hp ny FOR loop bt u vi i=16. Khi n cui loop ln th nht value ca i b bt 2 v tr thnh 14. Sau i b gim gi tr dn dn n 4. K i=2 th nh hn s cui cng (=4) nn execution nhy ra khi FOR loop. Gi d ta mun ly ra tt c nhng blank space trong mt text string. Ta bit con s characters trong mt text string, cn gi l chiu di ca text string c th tnh bng cch dng Function Len(TString). V ni n character th i trong mt Text string ta dng Mid Function.

33

Khi User click button Remove Blank Spaces chng trnh s execute Sub di y:
Private Sub CmdRemoveBlankSpaces_Click() Dim i, TLen, TMess TMess = "" ' Initialise temporary String to null string For i = 1 To Len(txtOriginalString.Text) ' Iterate from the first chracter to the last character of the string ' Check if chracter is NOT a blank space If Mid(txtOriginalString.Text, i, 1) <> " " Then ' Character is not a blank space - so append it to TMess TMess = TMess & Mid(txtOriginalString.Text, i, 1) End If Next txtResultString.Text = TMess ' Disaplay TMess by assigning it to txtResultString.text End Sub

Thng thng, ta dng FOR loop khi bit trc execution s i qua loop mt s ln nht nh. Nhng thnh thong, khi mt iu kin c tha mn ta c th p execution nhy ra gia chng khi FOR loop, ch khng i cho n s ln i qua loop. Th d nh ta mun bit phi cng bao nhiu s k tip t 1 tr ln c tng s va ln hn hay bng 76.

Khi User click button Work Out, Sub di y s c x l:


Private Sub cmdWorkOut_Click() Dim i, Total, WantedTotal WantedTotal = CInt(txtWantedTotal.Text) ' Convert Text string ra internal number b?ng Function CInt Total = 0 ' Initialise Total value to zero For i = 1 To 30

34

Total = Total + i ' Add the number to the Total If Total >= WantedTotal Then Exit For ' Jump out of FOR loop Next txtActualTotal.Text = CStr(Total) ' Display the Actual Total txtUptoNumber.Text = CStr(i) ' Display the highest number End Sub

Dng DO WHILE Loop statement


Khi ta khng bit chc l execution s i qua loop bao nhiu ln th tt nht l dng DO WHILE Loop statement. Khc vi FOR Loop, trong DO WHILE Loop ta phi t lo initialisation (tc l mi v u i bng bao nhiu) v t lo tng value ca parameter i. Nu Logical Expression l True th execute nhng dng code t DO WHILE cho n Loop. Th d mi va qua c th vit li bng cch dng DO WHILE Loop nh sau:
Private Sub cmdWorkOut_Click() Dim i, Total WantedTotal = CInt(txtWantedTotal.Text) ' Convert Text string ra internal number b?ng Function CInt Total = 0 ' Initialise Total value to zero i = 1 ' Intialise at the first character Do While (Total < WantedTotal) ' Logical Expression is (Total < WantedTotal) Total = Total + i ' Add the number to the Total i = i + 1 ' Increment the vakue of i Loop txtActualtotal.Text = CStr(Total) ' Display the Actual Total txtUptonumber.Text = CStr(i - 1) ' Display the highest number End Sub

TRong khi Total hy cn nh hn WantedTotal th ta tip tc i qua While Loop. Gi d ta c cc hng text cha gi tin cc th c th b vo bnh m tht vi gi nh sau:
Chicken Roll Roast Beef Tomato Sauce 45c 55c 5c

By gi ta mun vit code ly ra gi tin t nhng hng Text string nh trn. Ta s i t bn phi ln ln qua tri cho n khi tm c mt blank space.
Private Sub WorkOutPrice_Click() Dim i, TStr, PriceInCents, Price TStr = "Chicken Roll 45c" i = Len(TStr) ' Starting from the rightmost character of the text string ' Going from right to left, look for the first blank character Do While (Mid(TStr, i, 1) <> " ") i = i - 1 ' Keep walking to the left Loop PriceInCents = Mid(TStr, i + 1) ' String including character "c" ' Discard the rightmost character which is "c" and convert the price string to single number Price = CSng(Left(PriceInCents, Len(PriceInCents) - 1)) txtPrice.Text = CStr(Price) ' Display the highest number

35

End Sub

Dng Function
Function l mt dng subroutine ging ging nh Sub. Ch khc ch Function cho ta mt kt qu, cho nn cch dng Function hi khc vi Sub. Ta vit mt variable bn tri du =, c assigned kt qu ca mt Function. Th d nh ta dng Trim Function loi b nhng blank space hai u ca text string TString:
ResultString = Trim(TString)

Ta a cho Function Trim mt text string called TString. Sau khi Function Trim c executed, ta c kt qu nhng TString khng h thay i. Ngc li, khi ta gi mt Sub, tt c nhng parameter ta a cho Sub u c th thay i tr khi ta tuyn b mt parameter no l ByVal. Trong th d sau, mt copy ca StringA c a cho Sub nn sau khi execute ProcessString, StringA khng h b thay i.
Sub ProcessString (ByVal StringA, ConditionA, ConditionB)

Public Sub v Function


Khi ta dng ch Public (thay v Private) pha trc mt Sub hay Function, ta cho php code nm mt Form hay Basic Module khc c th gi (hay dng) Sub hay Function . Th d trong Form2 ta c nh ngha DisplayData l:
Public Sub DisplayData .... End Sub

Trong Form1, ta gi DisplayDta nh sau:


Form2.DisplayData

Chng Ba - Form v cc Controls thng thng

Hu ht cc chng trnh VB6 u c t nht mt Form. Khi ta chy chng trnh, Form ny s hin
ra trc ht ta ra lnh n lm chuyn g. Ci Form trng khng ch lm c g nhiu, nn ta t ln Form nhng controls nh Textbox(hp nh ch vo), Label(nhn), Commandbutton(nt bm mnh lnh), .v.v.. Cc controls cho ta enter cc d kin chng trnh dng x l, v cc controls cng hin th (display) kt qu cho chng ta xem.

Sp t controls ln Form
Ta hy bt u thit k mt chng trnh mi (New Project) bng cch chn Standard EXE, mi trng trin khai lp trnh (IDE) cho bn sn mt Form tn l Form1. Mun t mt Control ln Form, click hnh ci Control trong Toolbox ri Drag (bm nt tri ca con chut ri ko cho thnh hnh ch nht trc khi bung nt tri ra) con chut trn Form v thnh c ca Control. Mt cch khc t mt control ln Form l doubleclick ci Control trong Toolbox, mt hnh control s hin ra trn Form. K bn di control i n ch mnh mun v resize n. Nu bt c lc no bn khng thy Ti ngh (Toolbox) nm bn tri, bn c th dng mnh lnh Menu View|Toolbox bt n hin ra. C mt cch khc l click ln toolbox icon trn toolbar chnh ca VB6.

36

Nn nh rng Toolbox cng l mt window nh cc window khc. Khi n hin ln ri bn c th nm (bm nt tri ca con chut v gi nh vy ch khng bung ra) title n di i ni khc. Bn c th ng n bng cch click ln du x gc phi pha trn. Nu right click trn Toolbox, n s display context sensitive menu, trong c property dockable (c th u bn) . Nu mt window l dockable, sau khi bn di n i khi vi tr docked bnh thng ca n, bn c th dock n li nh c bng cch double click ln title ca n.

Resize v di chuyn control


Khi bn select mt control (click ln n), chung quanh control s hin ra resize handle, 8 nt en dc theo chu vi ca control.

Click ln cc nt en ca resize handle, bn c th resize control. C mt cch khc resize control l dng Shift + ArrowKey. Bm nt Shift trong khi bm mt arrow key, control s ln ra hay thu hp theo chiu ca ArrowKey. Lu : Mt s control c kch thc ti thiu, bn khng th lm cho n nh hn c. Th d nh Combobox, n phi cao display mt hng text. Tng t nh th, bm nt Ctrl trong khi bm mt arrow key, control s di chuyn theo chiu ca ArrowKey. Ngoi ra, nn nh rng trong lc chng trnh chy (at run-time), trong code ta c th thay i kch thc v v tr cc controls d dng, thm ch c th lm cho chng hin ra hay bin mt bng cch sa i value cc property left, top, width, height v visible ca cc controls.

Alignment Grid
gip bn sp t ngay ngn cc controls trn mt form, VB6 cho bn Alignment Grid. N l nhng du en ca cc hng dc v xui trn form. Bn c th lm cho cc du en ca grid trn form bin mt bng cch dng menu command Tools | Options display Option Dialog, k chn Tag General v clear checkbox "Show Grid":

37

Bn cng c th nhn dp ny thay i khong cch chiu rng (Width) v chiu cao (Height) ca cc chm en ca grid. Kch thc nh nht ca Width hay Height l 24. Hy so snh hai trng hp form c v khng c Show Grid nh di y:

Control Locking
Mt khi bn sp t kch thc v v tr ca cc control trn form ri, rt d ta tnh c thay i cc c tnh y v v click ln mt control. Do VB6 cho ta Menu command Format | Lock Controls kha chng li. Sau khi kha, ci hnh ng kha trn menu b chm xung.

38

Nu sau ny bn mun thay i kch thc hoc v tr ca chng th nh dng Menu command Format | Lock Controls li. Sau khi m kha, ci hnh ng kha trn menu hin ra bnh thng.

Ci t cc Properties ca Form
Nhiu property ca mt form nh hng n din mo vt l (physical appearance) ca n. Property Caption s quyt nh text c hiu th trong title. Nu Property BorderStyle ca form khng phi l Sizable th User khng th resize form at run-time. Property Icon quyt nh hnh icon uc dng trong title ca form, nht l khi form thu nh (minimized). Nu bn khng mun cho php User minimize hay maximize form th set value ca property MinButton, MaxButton ra False. Nu property ControlBox l False th form s khng c nt minize, maximize hay close (x) trn gc phi ca n, ng thi form cng khng display c icon bn gc tri title nh trong hnh di y:

V tr u tin (top,left) ca form c th c thay i trong design time bng cch di chuyn hnh nh ca n trong window Form Layout:

Property WindowState xc nh Form s c kch thc bnh thng (normal=0), hay minimized (=1), maximized =(2). Lu l property Font ca Form s c cc control nm trn n tha k. Tc l khi bn t mt control ln form, property Font ca control y s t ng tr nn ging y nh ca form.

Vi Event thng dng ca Form


Nhn t mt phng din, Form cng ging nh Control. Ta c th instantiate mt form nhiu ln c nhiu form tng t nhau. Trong th d di y, ta instantiate Form2 hai ln c MyForm v YourForm:
Private Sub CmdCreateForms_Click() Dim MyForm, YourForm Set MyForm = New Form2 MyForm.Caption = "This is My Form" MyForm.Show

39

MyForm.Move 1000, 1000 Set YourForm = New Form2 YourForm.Caption = "YOUR FORM IS HERE" YourForm.Show YourForm.Move 2000, 2000 End Sub

Mt Form cng c nhiu Events rt hu dng.

F orm_Initialize: Event ny xy ra trc nht v ch mt ln thi khi ta instantiate form u tin. Ta dng Form_Initialize event thc hin nhng g cn phi lm chung cho tt c cc instances ca form ny.

F orm_Load: Event ny xy ra mi ln ta instantiate mt form. Nu ta ch dng mt instance duy nht ca mt form trong chng trnh th Form_Load coi nh tng ng vi Form_Initialize. Ta dng Form_Load event initialise variables, controls v.v. cho instance ny. Bn trong Form_Load bn khng th dng Setfocus cho mt control no trn form v form cha hn thnh hnh (ra i). Mun lm vic y bn phi delay (tr hon) mt cht xu bng cch dng Control Timer i cho Form_Load c hon tt. Th d:

Private Sub Form_Load() Timer1.Interval = 500 Timer1.Enabled = True End Sub Private Sub Timer1_Timer() Timer1.Enabled = False ' Timer1_Timer only execute once txtName.Setfocus ' Make Tab Cursor start at TextBox txtName End Sub

F orm_Activate: Mi ln mt form tr nn active (current) th n generate mt Activate event. Ta c th dng event ny refresh display trn form.

F orm_QueryUnload: Khi User click du x pha trn bn phi close form th n generate QueryUnload event. Syntax ca Sub ny nh di y:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) End Sub

Event ny cho ta mt dp cancel Close action ca form (tc l khng cho User close form) bng cch set Cancel bng 1. UnloadMode cho ta bit ai, task hay form no mun close form ny. Ngoi ra, bn cng nn bit rng mt form t ng Load hay tr nn active nu bn nhc n n, th d nh dng Form2.List1. Khi mt form c loaded ri bn c th hide (lm cho bin mt) n.

40

K , khi bn show form ra tr li th form khng c g thay i. Nhng nu bn Unload mt form (th d bng cch dng Unload Form2 ), ri sau load tr li bng cch dng Form2.Show chng hn, th Form phi tri qua qu trnh Form_Load, v d nhin form mt tt c nhng g c trc y. Ngoi ra, Hide/Show mt form c loaded ri th rt nhanh, cn Unload/Load th mt th gi hn. Khi bn Show mt Form cha hin hu th form s c loaded v show. i khi bn mun Load mt form, ri lm vic vi n trc khi Show, trong trng hp bn dng Load Form2 ri mt chp sau dng Form2.Show.

MDI Form
i khi bn mun c mt MDI form, tc l mt form c th cha nhiu form con bn trong. Dng MDIform ny thng c dng trong cc application nh wordprocessor c th m nhiu document cng mt lc, mi document c hin th trong mt form con. c mt MDIForm bn cn phi dng menu command Project | Add MDI Form. Mi VB6 project ch c th c ti a mt MDIform. Mun mt form tr thnh mt form con bn set property MDI Child ca n thnh True. At run-time bn khng th hide (bin n thnh invisible) mt MDIChild form, nhng c th minimize n. Nu bn tht s mun hide n th phi dng mnh li l cho n v tr (top,left) s m ln hn kch thc n n nm ngoi tm hin th ca form. Trong mt chng trnh dng MDI Form, khi bn click MDI Form n khng nhy ra pha trc v che cc form con, nhng vn lun lun nm di.

Controls l g?
Controls va c hnh, va c code chy bn trong mt window nho nh, ging nh mt form. Khi ta lp trnh VB6 ta lp rp cc controls (l nhng vt dng tin ch) trn mt hay nhiu form c mt chng trnh nhanh chng. Ta giao dch vi mt control qua ba c tnh ca control:

P roperties: tp hp cc c tnh ca control m ta c th n nh lc design time hay run-time. C nhiu properties v din mo, nu ta thay i at design time s thy kt qu hin ra lp tc, th d Font hay mu sc.

M ethods: nhng g control thc hin uc, tc l nhng kh nng ca n. E vents: nhng s c m control s thng bo cho chng ta bit khi n xy ra vi control. Khi mt event xy ra VB6 s x l mt Event Handler (th d nh Sub Command1_Click()), min l chng ta vit code sn trong . Nu khng c code th coi nh chng ta khng thm bit n cc event loi . C mt s Events m chng ta thng x l l:

C lick : xy ra khi user click ln control. Ta thng dng n cho CommandButton v Listbox. M ouseDown, MouseUp : mi khi User bm mt mouse button l c mt MouseDown Event, khi User bung n ra th c mt MouseUp Event. Ta thng dng MouseDown Event Popup context sensitive menu hay bt u mt din bin Drag. Th d:

Private Sub Foods_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbRightButton Then ' if Right button was pressed PopupMenu mnuActions ' popup a menu End If

41

End Sub Private Sub DrinkList_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) DrinkList.drag ' Displaying a drag icon to start the drag process End Sub

l Click khng cho chng ta thm chi tit g v s c, trong khi MouseDown/MouseUp cho ta bit v tr ca cursor, button no ca Mouse c bm v lc y User c bm nt Shift, Ctrl hay Alt khng. Mi Click l i i vi mt cp MouseDown/MouseUp. Nu bn mun x l va Click ln MouseDown th phi cn thn. Th d bn mun va handle Click event va handle Mouse Drag th phi lm sao phn bit hai trng hp. Nu khng User ch mun thy kt qu ca Click m li thy control bt u display mt Drag icon th s bc mnh.
o

K eyPress : xy ra khi user Press mt key. Ta thng dng n cho TextBox loi ra (filter out) cc keystrokes ta khng chp nhn. KeyPress cho ta ASCII value, mt con s c gi tr t 1 n 255, ca key. Trong th d di y, mt Enter key s c coi nh mt TAB key:
Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ' Swallow the character to avoid side effect SendKeys "{TAB}" ' Emulate entering a TAB End If End Sub

K eyDown, KeyUp : mi KeyPress event l cho ta mt cp KeyDown/KeyUp event. KeyDown/KeyUp cho ta KeyCode v Shift value. detect Function key ta cn dng KeyDown event. Trong th d di y, ta display Function key User bm:
Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer) If (KeyCode >= 112) And (KeyCode <= 123) Then MsgBox "You pressed the Function key: F" & Trim(Str(KeyCode - 111)) End If End Sub

G LotFocus : Control tr nn active khi n nhn c Focus. N s generate mt GotFocus Event. Ta c th dng n i mu background ca mt text box nh trong th d di y:
Private Sub Text2_GotFocus() Text2.BackColor = vbYellow End Sub

42

L LostFocus : Thng thng h mt Control GotFocus th trc c mt Control LostFocus. Ta c th dng Event ny Validate entry data hay thu xp cng chuyn cho mt control va mt Focus. Trong th d di y, nu User khng nh vo mt con s trong Textbox Text1 th s c thng bo v Tab Cursor s tr li Textbox Text1.
Private Sub Text1_LostFocus() If Not IsNumeric(Text1.Text) Then MsgBox "Please enter a number!" Text1.SetFocus End If End Sub

r DagDrop : xy ra khi ta drop mt ci g ln control . Parameter Source cho ta bit Control no c Drag v Drop. Nhiu khi mt control c th nhn drop t nhiu control khc nhau. Trong trng hp ta phi test xem hoc Control Type, hoc Name hoc Tag value ca Source control l g ty nghi x l. Trong th d di y, khi User drop mouse xung Textbox Text2, nu Source l mt Listbox, khng cn bit Listbox no, th ta copy dng c chn trong Listbox y qua Textbox Text2.
Private Sub Text2_DragDrop(Source As Control, X As Single, Y As Single) If TypeOf Source Is ListBox Then Text2.Text = Source.Text End If End Sub

TextBox
TextBox l control uc dng nhiu nht display text v nhn keystroke ca User sa i text c sn hay cho vo text mi. Property chnh v default ca Textbox l text, tc l thng thng Text2.text c th c vit tt l Text2. Ta c th disable (khin n bt lc, khng phn ng g ht v khng cho sa i) mt text box bng cch set Property Enable ra False (ch s b m i), hay Lock (khng cho sa i) mt text box bng cch set Property Locked ra True (ch khng b m). Text c th c Align (Alignment Property) display bn tri, chnh gia hay bn phi ca hp n.

Bn c th chn BackColor v ForeColor cho background v text ca TextBox. Dng Tag Palette khi chn mu c ng mt mu bn mun.

43

D nhin bn c th la chn Font v c ch cho Text vi Font Property. Bn gii hn s characters m User c th enter cho TextBox bng cch set MaxLength Property. Nu Property Multiline l True th User c th enter nhiu hng. At Design time, nu bn mun enter multiline th phi nh bm nt Ctrl khi press Enter mi khi xung hng. Nu khng VB6 IDE tng rng bn kt thc editing.

Mun assign cho text box multiline text th phi nht vo mi cui hng CarriageReturn v LineFeed characters. Th d nh:
Private Sub Command1_Click() Dim TextStr TextStr = "Bau ra bau lay ong cau" & vbCrLf ' Note: vbCrLf = chr(13) & chr(10) TextStr = TextStr & "Bau cau ca bong ngat dau kho tieu" Text1.Text = TextStr End Sub

Nu bn mun mch nc cho User v cch dng mt textbox no th c th dng Property ToolTipText n display mch nc mi khi mouse cursor nm ln textbox.

44

Dng Property TabIndex n nh th t cho Tab Cursor dng mi khi User bm nt TAB di TAB Cursor n Textbox k tip. Nu bn khng mun Tab Cursor dng mt TextBox no th set Property TabStop n thnh False. Tab Cursor khng dng Textbox c Property Enabled bng False, nhng vn dng Textbox c property Locked bng True. Nu bn mun dng Textbox lm mt Password field th set Property PasswordChar bng "*". Lm nh th s p buc Textbox display mi character bng PasswordChar, tc l "*", ngi khc khng c c trong khi User enter mt Paswword.

Properties SelLength, SelStart v SelText Nu bn mun bit c tnh hnh hin thi ca Textbox: SelText cho bn dy ch ang c selected. SelStart cho bn v tr ca insertion point (ch cursor flashing). SelLength cho bit con s characters c selected. Nu bn mun sa i text trong Textbox: SelText cho bn nht vo mt dy ch. SelStart cho bn n nh v tr bt u ca dy ch bn sp select. SelLength n nh s characters bn mun chn, bt u t SelStart. Di y l mt th d trong ta highlight text tm c:
Private Sub Form_Click () Dim Search, Where ' Declare variables. ' Get search string from user. Search = InputBox("Enter text to be found:") Where = InStr(Text1.Text, Search) ' Find the given string in Text1.Text. If Where > 0 Then ' If found, Text1.SelStart = Where - 1 ' set selection start and Text1.SelLength = Len(Search) ' set selection length. Else MsgBox "String not found." ' Notify user. End If End Sub

CommandButton
CommandButton rt tin cho ta dng vo vic x l mt chuyn g khi User click ln button. Event ta dng thng nht cho CommanButton l Click. Ta dng Property Caption ca CommandButton enter ci g ta mun display trn button. Nu mun cho php User dng ALT+E ( nt Atl trong lc bm nt E) generate event click th nht du "&" trc ch E trong Caption ca button. Caption s display ch E vi mt gch di. Ngoi ra ta cng c th cho thm mt ci hnh vo CommandButton bng cch chn mt icon cho property Picture v set Property Style ra Graphical, thay v Standard.

45

Lc Run-time bn c th thay i hnh hay Caption ca CommandButton. Trong th d di y, Caption ca CommandButton CmdOperation flip-flop gia hai values Stop v Start:
Private Sub CmdOperation_Click() If CmdOperation.Caption = "&Stop" Then CmdOperation.Caption = "St&art" Else CmdOperation.Caption = "&Stop" End If End Sub

Label
Mc ch chnh ca Label l display, khng cho User Edit nh Textbox. Do ta c th dng Property Font, ForeColor v Backcolor lm cho n p. Ngoi ra Property BorderStyle c th cho Label lm xung nu bn set n bng Fixed Single. Nu set property BackStyle bng Transparent s trnh trng hp Backcolor ca Label lm cho khng p. Label cng c Property Tabindex. Nu bn mun dng ALT key mang Tab Cursor v mt Textbox, hy mt Label vi TabIndex bng TabIndex ca TextBox tr 1. Gi s Label c Caption l "&Address" th ALT+A s mang Tab Cursor v TextBox mu vng nh trong th d di y:

Ngoi ra nh rng bn c th thay i Caption ca Label lc run-time.

CheckBox
CheckBox c dng User xc nhn c c tnh no mt cch nhanh chng. Property Value ca CheckBox c th l Checked (lm cho hp vung c du, bng 1), Unchecked (lm cho hp vung trng khng, bng 0) hay Grayed (lm cho hp vung c du mu nht, bng 2). Mt khi bit rng CheckBox c Value bng 1, ta c th c Caption ca CheckBox dng nu cn.

46

Bn c th dng Property Alignment lm cho Caption ng bn phi (Left Justify) hay bn tri (Right Justify) ca hp vung.

OptionButton
OptionButton ( cn gi l RadioButton) c hnh trn vi mt chm gia, thay g hnh vung vi mt gch gia nh CheckBox. OptionButton lun lun c qui t thnh mt nhm, cha trong mt container. Container l mt Control c kh nng cha cc controls khc. Frame, PictureBox, hay chnh Form u l Container. Sau khi t mt Container ln Form, nu mun mt OptionButton ln Container, trc ht ta phi Select container, ri k chn OptionButton. S d, tt c OptionButtons phi nm trong mt container l v bt c lc no, nhiu nht l mt OptionButton trong container c value True (vng trn c chm gia). Mun bit mt OptionButton c tht s nm trong mt container, bn th ko ci container i ch khc. Nu OptionButton b di theo container th n nm trong container. Mt cch khc l th ko OptionButton ra khi container. Nu ko ra c th n khng nm trong container. Mun di chuyn mt OptionButton t container ny sang container khc, bn Cut OptionButton ri Paste n v container kia.

i khi mt container nm che trn mt control khc. Mun mang mt container ra pha sau cc controls khc bn Select container ri dng Menu command Format | Order | Send to Back.

47

Chng Bn - Vit Code

Trong ba chng u chng ta hc qua ba b phn chnh ca mt chng trnh Visual Basic 6.0.
l:

Forms l ci nn hay khung ta xy dng User Interface. Controls l nhng vin gch ta dng xy dng User Interface. Event procedures l code nm pha sau nhng hnh nh, n l cht keo dng dn cc Controls li vi nhau to thnh chng trnh p dng ca ta.

Nh ta thy, tt c cc code c x l (executed) khi c mt Event xy ra. Th d nh khi User click mt CommandButton (Event Click) hay type nt Tab di chuyn Cursor t Textbox ny (Event Lostfocus) qua Textbox khc (Event GotFocus). Cc nhm code x l l :
Private Sub Command1_Click() ... End Sub Private Sub Text1_LostFocus() ... End Sub v Private Sub Text2_GotFocus() ... End Sub

Trong khi lp trnh, mi ln ta double click ln mt Control ca mt Form l VB6 IDE t ng generate cho ta ci v t hng Private Sub Control_Event() cho n End Sub chng ta in nhng hng code ca mnh vo chnh gia.

iu khin th t x l cc dng code


Gi d ta vit mt chng trnh Vb6 n gin nh trong hnh ny vi hai Textbox tn txtName, txtAge v mt nt tn CmdEnter nm trong mt form tn Form1:

48

Thng thng cc dng code c x l theo th t t trn xung di. Th d nh kim xem cc d kin va c cho vo cc Textbox c tng i hp l hay khng, khi User click nt CmdEnter, ta x l Sub di y:
Private Sub CmdEnter_Click() ' Make sure the Name field is not blank If txtName.Text = "" Then MsgBox "Please enter Name" Exit Sub ' Terminate this Sub End If ' Make sure a number is supplied for Age If Not IsNumeric(txtAge.Text) Then MsgBox "Please enter a number for Age" Exit Sub ' Terminate this Sub End If End Sub

Ci Sub ni trn c ch Private nm pha trc, ni ch ni trong cng mt form cha Control CmdEnter (tc l Form1 trong trng hp ny) ta mi c th gi (dng) Sub CmdEnter_Click(). Th d ta mun khi User bm key "Enter" trn bn phm sau khi cho vo chi tit Textbox txtAge th coi nh User click nt CmdEnter. Ta vit nh sau:
Private Sub txtAge_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ' swallow Key Enter to avoid side effect CmdEnter_Click ' Call Private Sub CmdEnter_Click from the same form End If End Sub

Khi ta dng cu CmdEnter_Click lm mt dng code (cn gi l gi Sub CmdEnter_Click) th coi nh tng ng vi nht tt c 10 dng codes gia hai hng Private Sub CmdEnter_Click() v End Sub ti ch cu CmdEnter_Click, nh vit li di y:
Private Sub txtAge_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ' Swallow Key Enter to avoid side effect ' Make sure the Name field is not blank If txtName.Text = "" Then MsgBox "Please enter Name" Exit Sub ' Terminate this Sub End If ' Make sure a number is supplied for Age

49

If Not IsNumeric(txtAge.Text) Then MsgBox "Please enter a number for Age" Exit Sub ' Terminate this Sub End If End If End Sub

C mt cch ni khc l khi execution i n hng CmdEnter_Click th n nhy vo Private Sub CmdEnter_Click() execute cho n ht ri nhy tr li hng k tip trong Private Sub txtAge_KeyPress(KeyAscii As Integer) Trong Private Sub CmdEnter_Click() nu User khng nh g vo Textbox txtName th chng trnh s display message "Please enter Name" ri Exit Sub. y l cch nhy ngay ra khi Sub ch khng i phi execute xung ti hng cht.

Dng IF....THEN statement


Trong Private Sub CmdEnter_Click() trn ta thy c hai ch dng IF...THEN th xem mt iu kin g c c tha mn khng. Nu iu kin l ng vy, tc l True th ta thc hin nhng g uc vit t hng IF...THEN cho n hng END IF. Ngc li, nu iu kin khng ng th execution nhy xung ti dng code nm ngay di dng END IF. Tc l c khi execution s i ngang qua, c khi khng i ngang qua nhng dng code gia cu IF...THEN v cu END IF. iu kin trong IF Statement l phn nm gia hai ch IF v THEN. N uc gi l Logical Expression. Ta c:
txtName.text = "" ' content of Textbox txtName is nothing, i.e. an empty string v NOT IsNumeric(txtAge.text) ' content of TextBox txtAge is not a number

Trong Logical Expression th nh ta dng Function IsNumeric c cho bit rng txtAge.text c phi l mt con s hay khng. V ta ch than phin khi txtAge khng phi l mt con s nn ta phi thm ch NOT pha truc. Tc l khi
IsNumeric(txtAge.text) = False th NOT IsNumeric(txtAge.text) = True

Nu gia IF...THEN v END IF ch c mt dng code bn c th nhp dng code ln vi IF...THEN v khng dng END IF. Tc l:
If theColorYouLike = vbRed Then MsgBox "You 're a lucky person!" End If is equivalent with If theColorYouLike = vbRed Then MsgBox "You 're a lucky person!"

Mt Logical Expression c th n gin (simple) nh trong cc th d trn hay rc ri hn nu ta rp nhiu simple Logical Expression li vi nhau bng cch dng nhng t OR v AND. Khi hai Logical Expression c rp li bng ch OR (HAY) th ch cn t nht mt trong hai Expression l TRUE l Logical Expression tng hp cng l TRUE. Ci TRUE Table cho OR nh sau:
A B A OR B

FALSE FALSE FALSE FALSE TRUE TRUE

50

TRUE TRUE

FALSE TRUE TRUE TRUE

Trong th d di y nu mt ngi 25 tui tr ln HAY c li tc trn 30 ngn la mt nm th cho mn tin c :


If (PersonAge >= 25) Or (PersonIncome >= 30000) Then LendPersonMoney End If

cch dng cc du ngoc n ging nh trong ton i s. Thng thng h ci g nm trong ngoc th mnh tnh trc. Nu c nhiu lp du ngoc th tnh theo th t t trong ra ngoi. Nh trong bi trn ta tnh xem PersonAge >= 25 xem l TRUE hay FALSE, ri tnh xem PersonIncome >= 30000 xem l TRUE hay FALSE, trc khi tnh kt qu tng hp, da vo ci TRUE table cho OR. Khi hai Logical Expression c rp li bng ch AND (V) th ch khi no c hai Expression u l TRUE, Logical Expression tng hp mi l TRUE. Ci TRUE Table cho AND nh sau:
A B A AND B

FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE

FALSE FALSE TRUE TRUE

Trong th d di y nu hc sinh 18 tui tr ln v cha m kim 100 ngn tr ln mt nm th ng k hc sinh mt i hc t:


If (StudentAge >= 18) And (ParentIncome >= 100000) Then EnrollStudentAtPrivateUniversity End If

Mt Logical Expression c th tp hp c OR ln AND nh trong th d di y nu hc sinh 18 tui tr ln v cha m kim 100 ngn tr ln mt nm HAY hc sinh c Intelligent Quotient cao hn 160 th ng k hc sinh mt i hc t:
If ((StudentAge >= 18) And (ParentIncome >= 100000)) Or (StudentIQ > 160) Then EnrollStudentAtPrivateUniversity End If

Hai du ngoc n nm bn ngoi ca:


((StudentAge >= 18 ) And (ParentIncome >= 100000))

khng cn thit v theo qui c, ta tnh AND expression trc khi tnh OR expression, nhng n gip ta c d hn.

Dng IF....THEN..ELSE statement


Hy xem th d:
If (StudentPassmark > 75) Then ' Part A

51

EnrollStudentAtPublicSchool Else ' Part B EnrollStudentAtPrivateSchool End If

Nu hc sinh u vi s im trn 75 th cho hc trng cng, NU KHNG th phi hc trng t. Tc l nu StudentPassmark > 75 l TRUE th x l phn A, nu khng th x l phn B. phn A gm nhng dng code nm gia dng If (StudentPassmark > 75) then v else. Cn phn B gm nhng dng code nm gia dng else v end if. Ta c th rp ch ELSE vi ch IF dng nh trong th d sau y: <
If (StudentPassmark > 75) Then EnrollStudentAtPublicSchool ElseIf (StudentPassmark >= 55) Then EnrollStudentAtSemipublicSchool Else EnrollStudentAtPrivateSchool End If

Nu hc sinh u vi s im trn 75 th cho hc trng cng, NU t 55 im n 75 im th cho hc trng bn cng, nu khng (tc l im u di 55) th phi hc trng t. Nu tnh nh, khng c trng t, ta khng c quyt nh cho hc tr u di 55 im hc u th b phn ELSE trong th d trn. Phn chng trnh tr thnh:
If (StudentPassmark > 75) Then EnrollStudentAtPublicSchool ElseIf (StudentPassmark >= 55) Then EnrollStudentAtSemipublicSchool End If

Ta c th dng ELSEIF nhiu ln nh sau:


If (TheColorYouLike = vbRed) Then MsgBox "You 're a lucky person" ElseIf (TheColorYouLike = vbGreen) Then MsgBox "You 're a hopeful person" ElseIf (TheColorYouLike = vbBlue) Then MsgBox "You 're a brave person" ElseIf (TheColorYouLike = vbMagenta) Then MsgBox "You 're a sad person" Else MsgBox "You 're an average person" End If

Execution i ln lt t trn xung di, nu mt iu kin IF l TRUE th x l phn ca n ri nhy xung ngay di dng END IF. Ch khi mt iu kin IF khng c tha mn ta mi th mt iu kin IF bn di k . Tc l nu bn thch mu lu mu tm (magenta) th chng trnh s display "You're a lucky person", v khng h bit "You're a sad person".

52

Dng SELECT CASE statement


Th d c nhiu ELSEIF nh trn c th c vit li nh sau:
Select Case TheColorYouLike Case vbRed MsgBox "You 're a lucky person" Case vbGreen MsgBox "You 're a hopeful person" Case vbBlue MsgBox "You 're a brave person" Case vbMagenta MsgBox "You 're a sad person" Else MsgBox "You 're an average person" End Select

Cch vit ny tng i d c v t nhm ln khi vit code hn l dng nhiu ELSEIF. Phn ELSE trong Select Case statement th optional (nhim ), tc l c cng c, khng c cng khng sao. H khi iu kin ca mt Case c tho mn th nhng dng code t cho n dng Case k di hay Else c x l v tip theo execution s nhy xung dng nm ngay di dng End Select. Nh l di cng ta vit End Select, ch khng phi End If. Cc Expression dng cho mi trng hp Case khng nht thit phi n gin nh vy. bit thm chi tit v cch dng Select Case, bn highlight ch Case (doubleclick ch Case) ri bm nt F1.

Dng FOR statement


Trong lp trnh, ni v Flow Control (iu khin hng i ca execution) ta dng hai loi statement chnh: Branch statements nh IF..THEN..ELSE (k c Select Case) v Iterative statements (lp i, lp li) nh FOR v WHILE LOOP (Vng). Ta s ni n WHILE Loop trong phn k tip. Trong khi Branch statement cho php ta execute trong nhnh ny hay nhnh kia ty theo value ca Logical Expression th Iterative statement cho ta execute mt phn code lp i, lp li nhiu ln cho n khi mt iu kin c tha mn. Gi d ta vit mt chng trnh n gin tnh tng s cc con s gia bt c hai con s no (coi chng ln qu). Ci form ca chng trnh ging nh di y:

Sau khi cho hai con s From (T) v To (Cho n) ta click nt Calculate v thy kt qu hin ra trong Textbox txtTotal. Ci Sub tnh tng s c lit ra di y:
Private Sub CmdTotal_Click() Dim i, FromNo, ToNo, Total FromNo = CInt(txtFromNumber.Text) ' Convert Text string ra internal number b?ng Function CInt ToNo = CInt(txtToNumber.Text) ' Convert Text string ra internal number b?ng Function CInt

53

Total = 0 ' Initialise Total value to zero For i = FromNo To ToNo ' Iterate from FromNo to ToNo Total = Total + i ' Add the number to the Total Next txtTotal.Text = CStr(Total) ' Convert internal number ra Text string End Sub

Trong th d trn, FOR loop bt u t dng For i = FromNo To ToNo v chm dt dng Next. Khi execution bt u Total bng 0, i bng FromNo. Execution s i qua ht nhng dng trong FOR loop ri value ca i s c tng ln 1, ri execution s bt u li u loop. Trong th d ny v FromNo=4 v ToNo=6 nn execution s i qua ci FOR loop 3 ln. Ln th nht i=4, ln th nh i=5 ,v ln th ba th i=6. Sau , khi i=7 th n ln hn ToNo (=6) nn execution nhy ra khi FOR loop. Kt qu l Total=15 v c display trong Textbox txtTotal, sau khi c converted t internal number ra text string vi Function CStr. Nu ta ch mun cng nhng s chn t 4 n 16 ta c th lm cho i tng value ln 2 (thay v 1) mi khi n cui loop. Tc l i=4,6,8 .v.v..Ta s thm ch STEP trong FOR statement nh sau:
For i = 4 To 16 Step 2 ' Iterate from 4 to 16 with Step=2 Total = Total + i ' Add the number to the Total Next

Total s bng 4+6+8+10+12+14+16= 70. Trong th d trn ta cng c th dng STEP s m nh sau:
For i = 16 To 4 Step -2 ' Iterate from 16 to 4 with Step=-2 Total = Total + i ' Add the number to the Total Next

Trong trng hp ny FOR loop bt u vi i=16. Khi n cui loop ln th nht value ca i b bt 2 v tr thnh 14. Sau i b gim gi tr dn dn n 4. K i=2 th nh hn s cui cng (=4) nn execution nhy ra khi FOR loop. Gi d ta mun ly ra tt c nhng blank space trong mt text string. Ta bit con s characters trong mt text string, cn gi l chiu di ca text string c th tnh bng cch dng Function Len(TString). V ni n character th i trong mt Text string ta dng Mid Function.

Khi User click button Remove Blank Spaces chng trnh s execute Sub di y:
Private Sub CmdRemoveBlankSpaces_Click() Dim i, TLen, TMess TMess = "" ' Initialise temporary String to null string For i = 1 To Len(txtOriginalString.Text) ' Iterate from the first chracter to the last character of the string ' Check if chracter is NOT a blank space

54

If Mid(txtOriginalString.Text, i, 1) <> " " Then ' Character is not a blank space - so append it to TMess TMess = TMess & Mid(txtOriginalString.Text, i, 1) End If Next txtResultString.Text = TMess ' Disaplay TMess by assigning it to txtResultString.text End Sub

Thng thng, ta dng FOR loop khi bit trc execution s i qua loop mt s ln nht nh. Nhng thnh thong, khi mt iu kin c tha mn ta c th p execution nhy ra gia chng khi FOR loop, ch khng i cho n s ln i qua loop. Th d nh ta mun bit phi cng bao nhiu s k tip t 1 tr ln c tng s va ln hn hay bng 76.

Khi User click button Work Out, Sub di y s c x l:


Private Sub cmdWorkOut_Click() Dim i, Total, WantedTotal WantedTotal = CInt(txtWantedTotal.Text) ' Convert Text string ra internal number b?ng Function CInt Total = 0 ' Initialise Total value to zero For i = 1 To 30 Total = Total + i ' Add the number to the Total If Total >= WantedTotal Then Exit For ' Jump out of FOR loop Next txtActualTotal.Text = CStr(Total) ' Display the Actual Total txtUptoNumber.Text = CStr(i) ' Display the highest number End Sub

Dng DO WHILE Loop statement


Khi ta khng bit chc l execution s i qua loop bao nhiu ln th tt nht l dng DO WHILE Loop statement. Khc vi FOR Loop, trong DO WHILE Loop ta phi t lo initialisation (tc l mi v u i bng bao nhiu) v t lo tng value ca parameter i. Nu Logical Expression l True th execute nhng dng code t DO WHILE cho n Loop. Th d mi va qua c th vit li bng cch dng DO WHILE Loop nh sau:
Private Sub cmdWorkOut_Click() Dim i, Total WantedTotal = CInt(txtWantedTotal.Text) ' Convert Text string ra internal number b?ng Function

55

CInt Total = 0 ' Initialise Total value to zero i = 1 ' Intialise at the first character Do While (Total < WantedTotal) ' Logical Expression is (Total < WantedTotal) Total = Total + i ' Add the number to the Total i = i + 1 ' Increment the vakue of i Loop txtActualtotal.Text = CStr(Total) ' Display the Actual Total txtUptonumber.Text = CStr(i - 1) ' Display the highest number End Sub

TRong khi Total hy cn nh hn WantedTotal th ta tip tc i qua While Loop. Gi d ta c cc hng text cha gi tin cc th c th b vo bnh m tht vi gi nh sau:
Chicken Roll Roast Beef Tomato Sauce 45c 55c 5c

By gi ta mun vit code ly ra gi tin t nhng hng Text string nh trn. Ta s i t bn phi ln ln qua tri cho n khi tm c mt blank space.
Private Sub WorkOutPrice_Click() Dim i, TStr, PriceInCents, Price TStr = "Chicken Roll 45c" i = Len(TStr) ' Starting from the rightmost character of the text string ' Going from right to left, look for the first blank character Do While (Mid(TStr, i, 1) <> " ") i = i - 1 ' Keep walking to the left Loop PriceInCents = Mid(TStr, i + 1) ' String including character "c" ' Discard the rightmost character which is "c" and convert the price string to single number Price = CSng(Left(PriceInCents, Len(PriceInCents) - 1)) txtPrice.Text = CStr(Price) ' Display the highest number End Sub

Dng Function
Function l mt dng subroutine ging ging nh Sub. Ch khc ch Function cho ta mt kt qu, cho nn cch dng Function hi khc vi Sub. Ta vit mt variable bn tri du =, c assigned kt qu ca mt Function. Th d nh ta dng Trim Function loi b nhng blank space hai u ca text string TString:
ResultString = Trim(TString)

Ta a cho Function Trim mt text string called TString. Sau khi Function Trim c executed, ta c kt qu nhng TString khng h thay i. Ngc li, khi ta gi mt Sub, tt c nhng parameter ta a cho Sub u c th thay i tr khi ta tuyn b mt parameter no l ByVal. Trong th d sau, mt copy ca StringA c a cho Sub nn sau khi execute ProcessString, StringA khng h b thay i.
Sub ProcessString (ByVal StringA, ConditionA, ConditionB)

Public Sub v Function

56

Khi ta dng ch Public (thay v Private) pha trc mt Sub hay Function, ta cho php code nm mt Form hay Basic Module khc c th gi (hay dng) Sub hay Function . Th d trong Form2 ta c nh ngha DisplayData l:
Public Sub DisplayData .... End Sub

Trong Form1, ta gi DisplayDta nh sau:


Form2.DisplayData

Chng Ba - Form v cc Controls thng thng

Hu ht cc chng trnh VB6 u c t nht mt Form. Khi ta chy chng trnh, Form ny s hin
ra trc ht ta ra lnh n lm chuyn g. Ci Form trng khng ch lm c g nhiu, nn ta t ln Form nhng controls nh Textbox(hp nh ch vo), Label(nhn), Commandbutton(nt bm mnh lnh), .v.v.. Cc controls cho ta enter cc d kin chng trnh dng x l, v cc controls cng hin th (display) kt qu cho chng ta xem.

Sp t controls ln Form
Ta hy bt u thit k mt chng trnh mi (New Project) bng cch chn Standard EXE, mi trng trin khai lp trnh (IDE) cho bn sn mt Form tn l Form1. Mun t mt Control ln Form, click hnh ci Control trong Toolbox ri Drag (bm nt tri ca con chut ri ko cho thnh hnh ch nht trc khi bung nt tri ra) con chut trn Form v thnh c ca Control. Mt cch khc t mt control ln Form l doubleclick ci Control trong Toolbox, mt hnh control s hin ra trn Form. K bn di control i n ch mnh mun v resize n. Nu bt c lc no bn khng thy Ti ngh (Toolbox) nm bn tri, bn c th dng mnh lnh Menu View|Toolbox bt n hin ra. C mt cch khc l click ln toolbox icon trn toolbar chnh ca VB6.

Nn nh rng Toolbox cng l mt window nh cc window khc. Khi n hin ln ri bn c th nm (bm nt tri ca con chut v gi nh vy ch khng bung ra) title n di i ni khc. Bn c th ng n bng cch click ln du x gc phi pha trn. Nu right click trn Toolbox, n s display context sensitive menu, trong c property dockable (c th u bn) . Nu mt window l dockable, sau khi bn di n i khi vi tr docked bnh thng ca n, bn c th dock n li nh c bng cch double click ln title ca n.

Resize v di chuyn control


Khi bn select mt control (click ln n), chung quanh control s hin ra resize handle, 8 nt en dc theo chu vi ca control.

57

Click ln cc nt en ca resize handle, bn c th resize control. C mt cch khc resize control l dng Shift + ArrowKey. Bm nt Shift trong khi bm mt arrow key, control s ln ra hay thu hp theo chiu ca ArrowKey. Lu : Mt s control c kch thc ti thiu, bn khng th lm cho n nh hn c. Th d nh Combobox, n phi cao display mt hng text. Tng t nh th, bm nt Ctrl trong khi bm mt arrow key, control s di chuyn theo chiu ca ArrowKey. Ngoi ra, nn nh rng trong lc chng trnh chy (at run-time), trong code ta c th thay i kch thc v v tr cc controls d dng, thm ch c th lm cho chng hin ra hay bin mt bng cch sa i value cc property left, top, width, height v visible ca cc controls.

Alignment Grid
gip bn sp t ngay ngn cc controls trn mt form, VB6 cho bn Alignment Grid. N l nhng du en ca cc hng dc v xui trn form. Bn c th lm cho cc du en ca grid trn form bin mt bng cch dng menu command Tools | Options display Option Dialog, k chn Tag General v clear checkbox "Show Grid":

Bn cng c th nhn dp ny thay i khong cch chiu rng (Width) v chiu cao (Height) ca cc chm en ca grid. Kch thc nh nht ca Width hay Height l 24. Hy so snh hai trng hp form c v khng c Show Grid nh di y:

58

Control Locking
Mt khi bn sp t kch thc v v tr ca cc control trn form ri, rt d ta tnh c thay i cc c tnh y v v click ln mt control. Do VB6 cho ta Menu command Format | Lock Controls kha chng li. Sau khi kha, ci hnh ng kha trn menu b chm xung.

Nu sau ny bn mun thay i kch thc hoc v tr ca chng th nh dng Menu command Format | Lock Controls li. Sau khi m kha, ci hnh ng kha trn menu hin ra bnh thng.

Ci t cc Properties ca Form
Nhiu property ca mt form nh hng n din mo vt l (physical appearance) ca n. Property Caption s quyt nh text c hiu th trong title. Nu Property BorderStyle ca form khng phi l Sizable th User khng th resize form at run-time. Property Icon quyt nh hnh icon uc dng trong title ca form, nht l khi form thu nh (minimized). Nu bn khng mun cho php User minimize hay maximize form th set value ca property MinButton, MaxButton ra False. Nu property ControlBox l False th form s khng c nt minize, maximize hay close (x) trn gc phi ca n, ng thi form cng khng display c icon bn gc tri title nh trong hnh di y:

V tr u tin (top,left) ca form c th c thay i trong design time bng cch di chuyn hnh nh ca n trong window Form Layout:

59

Property WindowState xc nh Form s c kch thc bnh thng (normal=0), hay minimized (=1), maximized =(2). Lu l property Font ca Form s c cc control nm trn n tha k. Tc l khi bn t mt control ln form, property Font ca control y s t ng tr nn ging y nh ca form.

Vi Event thng dng ca Form


Nhn t mt phng din, Form cng ging nh Control. Ta c th instantiate mt form nhiu ln c nhiu form tng t nhau. Trong th d di y, ta instantiate Form2 hai ln c MyForm v YourForm:
Private Sub CmdCreateForms_Click() Dim MyForm, YourForm Set MyForm = New Form2 MyForm.Caption = "This is My Form" MyForm.Show MyForm.Move 1000, 1000 Set YourForm = New Form2 YourForm.Caption = "YOUR FORM IS HERE" YourForm.Show YourForm.Move 2000, 2000 End Sub

Mt Form cng c nhiu Events rt hu dng.

F orm_Initialize: Event ny xy ra trc nht v ch mt ln thi khi ta instantiate form u tin. Ta dng Form_Initialize event thc hin nhng g cn phi lm chung cho tt c cc instances ca form ny.

F orm_Load: Event ny xy ra mi ln ta instantiate mt form. Nu ta ch dng mt instance duy nht ca mt form trong chng trnh th Form_Load coi nh tng ng vi Form_Initialize. Ta dng Form_Load event initialise variables, controls v.v. cho instance ny. Bn trong Form_Load bn khng th dng Setfocus cho mt control no trn form v form cha hn thnh hnh (ra i). Mun lm vic y bn phi delay (tr hon) mt cht xu bng cch dng Control Timer i cho Form_Load c hon tt. Th d:

60

Private Sub Form_Load() Timer1.Interval = 500 Timer1.Enabled = True End Sub Private Sub Timer1_Timer() Timer1.Enabled = False ' Timer1_Timer only execute once txtName.Setfocus ' Make Tab Cursor start at TextBox txtName End Sub

F orm_Activate: Mi ln mt form tr nn active (current) th n generate mt Activate event. Ta c th dng event ny refresh display trn form.

F orm_QueryUnload: Khi User click du x pha trn bn phi close form th n generate QueryUnload event. Syntax ca Sub ny nh di y:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) End Sub

Event ny cho ta mt dp cancel Close action ca form (tc l khng cho User close form) bng cch set Cancel bng 1. UnloadMode cho ta bit ai, task hay form no mun close form ny. Ngoi ra, bn cng nn bit rng mt form t ng Load hay tr nn active nu bn nhc n n, th d nh dng Form2.List1. Khi mt form c loaded ri bn c th hide (lm cho bin mt) n. K , khi bn show form ra tr li th form khng c g thay i. Nhng nu bn Unload mt form (th d bng cch dng Unload Form2 ), ri sau load tr li bng cch dng Form2.Show chng hn, th Form phi tri qua qu trnh Form_Load, v d nhin form mt tt c nhng g c trc y. Ngoi ra, Hide/Show mt form c loaded ri th rt nhanh, cn Unload/Load th mt th gi hn. Khi bn Show mt Form cha hin hu th form s c loaded v show. i khi bn mun Load mt form, ri lm vic vi n trc khi Show, trong trng hp bn dng Load Form2 ri mt chp sau dng Form2.Show.

MDI Form
i khi bn mun c mt MDI form, tc l mt form c th cha nhiu form con bn trong. Dng MDIform ny thng c dng trong cc application nh wordprocessor c th m nhiu document cng mt lc, mi document c hin th trong mt form con. c mt MDIForm bn cn phi dng menu command Project | Add MDI Form. Mi VB6 project ch c th c ti a mt MDIform. Mun mt form tr thnh mt form con bn set property MDI Child ca n thnh True. At run-time bn khng th hide (bin n thnh invisible) mt MDIChild form, nhng c th minimize n. Nu bn tht s mun hide n th phi dng mnh li l cho n v tr (top,left) s m ln hn kch thc n n nm ngoi tm hin th ca form. Trong mt chng trnh dng MDI Form, khi bn click MDI Form n khng nhy ra pha trc v che cc form con, nhng vn lun lun nm di.

Controls l g?

61

Controls va c hnh, va c code chy bn trong mt window nho nh, ging nh mt form. Khi ta lp trnh VB6 ta lp rp cc controls (l nhng vt dng tin ch) trn mt hay nhiu form c mt chng trnh nhanh chng. Ta giao dch vi mt control qua ba c tnh ca control:

P roperties: tp hp cc c tnh ca control m ta c th n nh lc design time hay run-time. C nhiu properties v din mo, nu ta thay i at design time s thy kt qu hin ra lp tc, th d Font hay mu sc.

M ethods: nhng g control thc hin uc, tc l nhng kh nng ca n. E vents: nhng s c m control s thng bo cho chng ta bit khi n xy ra vi control. Khi mt event xy ra VB6 s x l mt Event Handler (th d nh Sub Command1_Click()), min l chng ta vit code sn trong . Nu khng c code th coi nh chng ta khng thm bit n cc event loi . C mt s Events m chng ta thng x l l:

C lick : xy ra khi user click ln control. Ta thng dng n cho CommandButton v Listbox. M ouseDown, MouseUp : mi khi User bm mt mouse button l c mt MouseDown Event, khi User bung n ra th c mt MouseUp Event. Ta thng dng MouseDown Event Popup context sensitive menu hay bt u mt din bin Drag. Th d:

Private Sub Foods_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbRightButton Then ' if Right button was pressed PopupMenu mnuActions ' popup a menu End If End Sub Private Sub DrinkList_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) DrinkList.drag ' Displaying a drag icon to start the drag process End Sub

l Click khng cho chng ta thm chi tit g v s c, trong khi MouseDown/MouseUp cho ta bit v tr ca cursor, button no ca Mouse c bm v lc y User c bm nt Shift, Ctrl hay Alt khng. Mi Click l i i vi mt cp MouseDown/MouseUp. Nu bn mun x l va Click ln MouseDown th phi cn thn. Th d bn mun va handle Click event va handle Mouse Drag th phi lm sao phn bit hai trng hp. Nu khng User ch mun thy kt qu ca Click m li thy control bt u display mt Drag icon th s bc mnh.
o

K eyPress : xy ra khi user Press mt key. Ta thng dng n cho TextBox loi ra (filter out) cc keystrokes ta khng chp nhn. KeyPress cho ta ASCII value, mt con s c gi tr t 1 n 255, ca key. Trong th d di y, mt Enter key s c coi nh mt TAB key:
Private Sub Text1_KeyPress(KeyAscii As Integer)

62

If KeyAscii = 13 Then KeyAscii = 0 ' Swallow the character to avoid side effect SendKeys "{TAB}" ' Emulate entering a TAB End If End Sub
o

K eyDown, KeyUp : mi KeyPress event l cho ta mt cp KeyDown/KeyUp event. KeyDown/KeyUp cho ta KeyCode v Shift value. detect Function key ta cn dng KeyDown event. Trong th d di y, ta display Function key User bm:
Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer) If (KeyCode >= 112) And (KeyCode <= 123) Then MsgBox "You pressed the Function key: F" & Trim(Str(KeyCode - 111)) End If End Sub

G LotFocus : Control tr nn active khi n nhn c Focus. N s generate mt GotFocus Event. Ta c th dng n i mu background ca mt text box nh trong th d di y:
Private Sub Text2_GotFocus() Text2.BackColor = vbYellow End Sub

L LostFocus : Thng thng h mt Control GotFocus th trc c mt Control LostFocus. Ta c th dng Event ny Validate entry data hay thu xp cng chuyn cho mt control va mt Focus. Trong th d di y, nu User khng nh vo mt con s trong Textbox Text1 th s c thng bo v Tab Cursor s tr li Textbox Text1.
Private Sub Text1_LostFocus() If Not IsNumeric(Text1.Text) Then MsgBox "Please enter a number!" Text1.SetFocus End If End Sub

r DagDrop : xy ra khi ta drop mt ci g ln control . Parameter Source cho ta bit Control no c Drag v Drop. Nhiu khi mt control c th nhn drop t nhiu control khc nhau. Trong trng hp ta phi test xem hoc Control Type, hoc Name hoc Tag value ca Source control l g ty nghi x l. Trong th d di y, khi User drop mouse xung Textbox Text2, nu Source l mt Listbox, khng cn bit Listbox no, th ta copy dng c chn trong Listbox y qua Textbox Text2.

63

Private Sub Text2_DragDrop(Source As Control, X As Single, Y As Single) If TypeOf Source Is ListBox Then Text2.Text = Source.Text End If End Sub

TextBox
TextBox l control uc dng nhiu nht display text v nhn keystroke ca User sa i text c sn hay cho vo text mi. Property chnh v default ca Textbox l text, tc l thng thng Text2.text c th c vit tt l Text2. Ta c th disable (khin n bt lc, khng phn ng g ht v khng cho sa i) mt text box bng cch set Property Enable ra False (ch s b m i), hay Lock (khng cho sa i) mt text box bng cch set Property Locked ra True (ch khng b m). Text c th c Align (Alignment Property) display bn tri, chnh gia hay bn phi ca hp n.

Bn c th chn BackColor v ForeColor cho background v text ca TextBox. Dng Tag Palette khi chn mu c ng mt mu bn mun.

D nhin bn c th la chn Font v c ch cho Text vi Font Property. Bn gii hn s characters m User c th enter cho TextBox bng cch set MaxLength Property. Nu Property Multiline l True th User c th enter nhiu hng. At Design time, nu bn mun enter multiline th phi nh bm nt Ctrl khi press Enter mi khi xung hng. Nu khng VB6 IDE tng rng bn kt thc editing.

64

Mun assign cho text box multiline text th phi nht vo mi cui hng CarriageReturn v LineFeed characters. Th d nh:
Private Sub Command1_Click() Dim TextStr TextStr = "Bau ra bau lay ong cau" & vbCrLf ' Note: vbCrLf = chr(13) & chr(10) TextStr = TextStr & "Bau cau ca bong ngat dau kho tieu" Text1.Text = TextStr End Sub

Nu bn mun mch nc cho User v cch dng mt textbox no th c th dng Property ToolTipText n display mch nc mi khi mouse cursor nm ln textbox.

Dng Property TabIndex n nh th t cho Tab Cursor dng mi khi User bm nt TAB di TAB Cursor n Textbox k tip. Nu bn khng mun Tab Cursor dng mt TextBox no th set Property TabStop n thnh False. Tab Cursor khng dng Textbox c Property Enabled bng False, nhng vn dng Textbox c property Locked bng True. Nu bn mun dng Textbox lm mt Password field th set Property PasswordChar bng "*". Lm nh th s p buc Textbox display mi character bng PasswordChar, tc l "*", ngi khc khng c c trong khi User enter mt Paswword.

Properties SelLength, SelStart v SelText Nu bn mun bit c tnh hnh hin thi ca Textbox: SelText cho bn dy ch ang c selected. SelStart cho bn v tr ca insertion point (ch cursor flashing). SelLength cho bit con s characters c selected. Nu bn mun sa i text trong Textbox: SelText cho bn nht vo mt dy ch. SelStart cho bn n nh v tr bt u ca dy ch bn sp select. SelLength n nh s characters bn mun chn, bt u

65

t SelStart. Di y l mt th d trong ta highlight text tm c:


Private Sub Form_Click () Dim Search, Where ' Declare variables. ' Get search string from user. Search = InputBox("Enter text to be found:") Where = InStr(Text1.Text, Search) ' Find the given string in Text1.Text. If Where > 0 Then ' If found, Text1.SelStart = Where - 1 ' set selection start and Text1.SelLength = Len(Search) ' set selection length. Else MsgBox "String not found." ' Notify user. End If End Sub

CommandButton
CommandButton rt tin cho ta dng vo vic x l mt chuyn g khi User click ln button. Event ta dng thng nht cho CommanButton l Click. Ta dng Property Caption ca CommandButton enter ci g ta mun display trn button. Nu mun cho php User dng ALT+E ( nt Atl trong lc bm nt E) generate event click th nht du "&" trc ch E trong Caption ca button. Caption s display ch E vi mt gch di. Ngoi ra ta cng c th cho thm mt ci hnh vo CommandButton bng cch chn mt icon cho property Picture v set Property Style ra Graphical, thay v Standard.

Lc Run-time bn c th thay i hnh hay Caption ca CommandButton. Trong th d di y, Caption ca CommandButton CmdOperation flip-flop gia hai values Stop v Start:
Private Sub CmdOperation_Click() If CmdOperation.Caption = "&Stop" Then CmdOperation.Caption = "St&art" Else CmdOperation.Caption = "&Stop" End If End Sub

Label
Mc ch chnh ca Label l display, khng cho User Edit nh Textbox. Do ta c th dng Property Font, ForeColor v Backcolor lm cho n p. Ngoi ra Property BorderStyle c th cho Label lm xung nu bn set n bng Fixed Single. Nu set property BackStyle bng Transparent s trnh trng hp Backcolor ca Label lm cho khng p.

66

Label cng c Property Tabindex. Nu bn mun dng ALT key mang Tab Cursor v mt Textbox, hy mt Label vi TabIndex bng TabIndex ca TextBox tr 1. Gi s Label c Caption l "&Address" th ALT+A s mang Tab Cursor v TextBox mu vng nh trong th d di y:

Ngoi ra nh rng bn c th thay i Caption ca Label lc run-time.

CheckBox
CheckBox c dng User xc nhn c c tnh no mt cch nhanh chng. Property Value ca CheckBox c th l Checked (lm cho hp vung c du, bng 1), Unchecked (lm cho hp vung trng khng, bng 0) hay Grayed (lm cho hp vung c du mu nht, bng 2). Mt khi bit rng CheckBox c Value bng 1, ta c th c Caption ca CheckBox dng nu cn.

Bn c th dng Property Alignment lm cho Caption ng bn phi (Left Justify) hay bn tri (Right Justify) ca hp vung.

OptionButton
OptionButton ( cn gi l RadioButton) c hnh trn vi mt chm gia, thay g hnh vung vi mt gch gia nh CheckBox. OptionButton lun lun c qui t thnh mt nhm, cha trong mt container. Container l mt Control c kh nng cha cc controls khc. Frame, PictureBox, hay chnh Form u l Container. Sau khi t mt Container ln Form, nu mun mt OptionButton ln Container, trc ht ta phi Select container, ri k chn OptionButton. S d, tt c OptionButtons phi nm trong mt container l v bt c lc no, nhiu nht l mt OptionButton trong container c value True (vng trn c chm gia). Mun bit mt OptionButton c tht s nm trong mt container, bn th ko ci container i ch khc. Nu OptionButton b di theo container th n nm trong container. Mt cch khc l th ko OptionButton ra khi container. Nu ko ra c th n khng nm trong container. Mun di chuyn mt OptionButton t container ny sang container khc, bn Cut OptionButton ri Paste n v container kia.

67

i khi mt container nm che trn mt control khc. Mun mang mt container ra pha sau cc controls khc bn Select container ri dng Menu command Format | Order | Send to Back.

Chng Nm - Cc loi d kin


Cng vic chnh ca tt c cc chng trnh VB6 chng ta vit l ch bin cc d kin trnh by. Th d mt thy gio dng mt chng trnh tnh im trung bnh ca hc sinh trong mt mn thi. Thy tun t cho im ca tng hc sinh vo v sau cng bm mt nt bo chung trnh tnh im trung bnh cho c lp. Chng trnh s display im thi ca tng hc sinh bn cnh tn ca hc sinh y, tng s hc sinh, tng s im, im thp nht, im cao nht v im trung bnh: Tn h L Quang Vinh Trn vn Thnh Nguyn Th Hng V T Cng Phm Vn Kh Cao Xun Tin im 15.50 16.00 17.50 14.00 18.00 13.00 Tng s hc sinh: 6

68

Tng s im: 94.00 im thp nht: 13.00 im cao nht: 18.00 im trung bnh: 15.66 Ta c th tm chia qu trnh x l ca mt chng trnh ra lm ba giai on: 1. Tip nhn d kin: y l giai on ta cho d kin vo chng trnh (Input data) hoc bng cch in vo mt form, hoc c d kin t mt c s d kin (Database) hoc nhn d kin qua ng dy vin thng, .v.v.. 2. Ch bin d kin: Mt khi c d kin y ri ta s sp xp, cng, tr, nhn, chia theo cch nh trc i n kt qu. 3. Trnh by, bo co: Kt qu cn phi c display trn mn nh cch gn gh, th t hay c in ra, ta cn gi l Report. Nh vy trong mi giai on ca chng trnh ta u lm vic vi d kin. Trong th d ni trn ta lm vic vi hai loi d kin: "dng ch" (text string) cho tn hc sinh v "s" (number) cho cc im. S d ta phi phn bit cc data types v mi loi data c nhng chc nng ring ca n. Th d ta khng th cng hai text string li vi nhau nh hai con s, nhng ta c th ghp hai text string li vi nhau, th d nh ghp ch house vi ch wife thnh ra ch housewife. Chc na ta s bn thm v data types, nhng by gi ta th tm hiu data c cha trong computer nh th no. D kin c cha theo quy c Rt cuc li, tt c data u c cha di dng cc con s. Mi con s i din cho mt th g , ty theo quy c ca ngi dng. Chng ta bit b tr nh (memory) ca computer cha nhng byte data, th d nh computer ca bn c 32MB, tc l khong hn 32 triu bytes. Tht ra mt byte gm c 8 bits, mi bit i din mt trong hai tr s: 1 v 0, hay Yes v No , dng in chy qua c hay khng c .v.v.. Bit l n v tr nh nh nht ca memory. Mt byte c th cha mt con s t 0 n 255, tc l 2^8 -1 (2 ly tha 8 bt 1) . Khi dng bits ta m cc s trong h thng nh phn. Nu bn cha bit nhiu th hy c bi H thng s nh phn. Th d, khi bn n nt A trn keyboard, keyboard s gi v computer con s 65 (01000001 trong nh phn) . Nu bn ang dng mt Notepad chng hn, bn s thy ch A hin ra. Bn hi ti sao letter A c biu din bng s 65? Xin tr li rng l quy c quc t. Quy c uc p dng cho tt c cc keys ca bn phm uc gi l ASCII. Theo quy c ny digit "1" c biu din bng con s 48 (00110001) v nt Enter bng s 13 (00010011). Chc c l bn on ra rng theo quy c ASCII, mi pattern (dng) ca 8 bits (1 byte) s biu din mt text character. By gi ta th tnh xem cc mu t alphabet v digits s chim bao nhiu patterns trong s 256 patterns ta c th biu din bng 1 byte. T A n Z c 26 characters. Nhn i tnh cho lowercase (ch thng) v uppercase (ch hoa) thnh ra 52. Cng vi 10 digits t 0 n 9 thnh ra 62. Cng thm chng ba mi ngoi cc symbols ta dng ch n chng 100 patterns m thi. Tc l ni mt cch khc nu s patterns ta dng di 128 th ch cn 7 bits (ch khng n 8 bits) cng ri. Tht ra t ny gi ta ch ni n cc characters c th display hay in ra uc (printable characters). Cc con s ASCII t 1 n 31 khng in ra uc nhng uc dng mt cch c bit, th d nh 7 l BELL (ting bp), 12 l qua trang mi, 10 l xung hng, 13 l Enter/CarriageReturn, .v.v.. Chng uc gi l cc Control Characters.

69

Khi xem qua cc Font ch trong Windows, bn s thy cho cng mt con s 65, khng phi Font no cng display ch A. Th d nh Font Symbol n display th du hiu. im ny nhc chng ta li rng mi lin h gia mt con s bn trong (internal number) v mt du hiu c display chng qua l mt quy c m thi. Gi s chng ta dng nhng con s ASCII cn trng biu din cc ch Vit Nam c du v chu kh ngi v thm cc Vietnamese characters cn thit trong Font th ta c th display ch Vit uc. ng vy, l cch cc khoa hc gia Vit Nam dng display ting Vit trong MSWindows, in hnh l VPS, VISCII. Khng phi memory ca computer ch cha data thng m thi. N cn cha chnh chng trnh, gi l executable code trong machine language (ngn ng ca my). Ngy xa, khi memory ca computer cn t, ngi ta c th cho vo tng byte ca code mt chng trnh. H lp trnh bng Assembly language. Mi hng code trong Assembly language c th uc dch thng ra code trong machine language. CPU ca mi manufacturer c mt assembly language khc nhau. Cc cng ty Computer ni ting ngy xa l IBM, Digital, CDC. n thi bui Microcomputer ta c Motorola, Intel, nhng tu trung, nu khng bit trc code ca machine language no, ta khng th nhn ra g c khi nhn vo memory dump (in ra snapshot ca memory) ca mt computer. Text String Nu ta ghp nhiu characters li vi nhau ta c mt Text String. Trong VB6, Text String c vit thnh mt dy ch vi du ngoc kp hai u, th d: "Hello, world" Tng tng ta ghp ba mu t alphabet u tin li vi nhau: ABC, trong memory Text String ny c biu din bng con s 010000010100001001000011 (trong binary) hay 414243 (trong Hex, mi nhm 4 bits tng ung vi mt Hex digit). VB6 cho ta nhng Function rt tin li lm vic vi Text String. ghp hai Text String li vi nhau ta dng operator &. Th d: FirstWord = "Hello" SecondWord = "World" Greeting = FirstWord & SecondWord ' Greeting by gi l "HelloWorld" nu mun c mt blank space gia hai ch trn ta vit nh sau: Greeting = FirstWord & " " & SecondWord Mun bit mt Text String ang cha bao nhiu characters ta dng Function Len. Th d: Greeting = "Hi John!" iLen = Len(Greeting) ' iLen by gi bng 8 trch ra mt phn ca Text String (tc l trch ra mt SubString) ta dng cc Functions Left, Right v Mid. Today = "24/05/2001" ' Ly ra 2 characters t bn tri ca String Today StrDay = Left(Today,2) ' StrDay by gi bng "24" ' Ly ra 4 characters t bn phi ca String Today StrYear = Right(Today,4) ' StrYear by gi bng "2001" ' Ly ra 2 characters bt u t character th t ca String Today, character u tin t bn tri l th nht StrMonth = Mid(Today,4,2) ' StrMonth by gi bng "05"

70

' Ly ra phn cn li bt u t character th t ca String Today StrMonthYear = Mid(Today,4) ' StrMonthYear by gi bng 05/2001" Trong tt c cc trng hp trn Text String Today khng h b thay i, ta ch trch ra mt SubString ca n m thi. Nu ta mun thay i chnh Text String Today ta c th assign value mi cho n hay dng Function Mid bn tri du Assign (=), th d: Today = "24/05/2001" ' Thay th character th 3 ca Today bng "-" Mid(Today,3,1) = "-" ' Thay th 2 characters bt u t character th 4 ca Today bng "10" Mid(Today,4,2) = "10" ' Thay th character th 6 ca Today bng "-" Mid(Today,6,1) = "-" ' Today by gi bng "24-10-2001" Ta cng c th t c kt qu nh trn bng cch lp trnh nh sau: Today = "24/05/2001" Today = Left(Today,2) & "-10-" & Right(Today,4) Ngoi ra c hai Function rt thng dng cho Text String l Instr v Replace. Instr cho ta v tr (position) ca mt pattern trong mt Text String. Th d ta mun bit c du * trong mt Text String hay khng: myString = "The *rain in Spain mainly..." Position = Instr(myString,"*") ' Position s l 5 Nu trong myString khng c du "*" th Position s bng 0 By gi ta th tch ra Key v Value trong th d sau: KeyValuePair = "BeatlesSong=Yesterday" Pos = Instr(KeyValuePair, "=") Key = Left(KeyValuePair, Pos-1) Value = Mid(KeyValuePair, Pos+1) Mun thay i tt c du "/" thnh du "-" trong mt Text String ta c th dng Function Replace nh sau: Today = "24/05/2001" Today = Replace (Today, "/", "-") Mun bit tr s ASCII ca mt character ta dng Function Asc v ngc li c mt Text Character vi mt tr s ASCII no ta dng Function Chr. ASCIINumberA = Asc("A") ' ASCIINumberA by gi bng 65 LineFeedChar = Chr(10) StrFive = Chr(Asc("0") + 5) ' ta c digit "5" Text String trong VB6 dng mt byte cho mi ASCII character. Sau ny khi ta lp trnh trong VB7, mt character c th l Unicode character, trong trng hp n c biu din bng 2 bytes. VB6 khng support Unicode nn khng phi l mi trng thch hp lp trnh cho Unicode ting Vit. Trong VB7 mi loi Text String c Encoding method ring ca n ym tr Unicode nu cn.

71

Cc loi s T ny gi ta ch bn v Text String v cch cha ca n trong memory. Nn nh rng "123" l mt Text String v n c biu din trong memory bng con s 001100010011001000110011 trong Binary hay 313233 trong Hex. Nh vy c cch no biu din con s 123 m khng dng Text String khng? D nhin l c. Con s 123 l 7B trong Hex hay 01111011 trong Binary, v ta c th cha con s ny va tin li lm ton, va t tn memory hn l cha Text String "123". Nh l ta cn Text String display hay in ra, cn khi lm ton cng, tr, nhn, chia ta li cn ci dng raw number hay internal number ca n. convert mt Text String ra Internal number ta c th dng cc Functions Val, CInt(ra Integer) hay CSng(ra Single). Ngc li, convert t internal number ra Text String ta c th dng Function CStr. Dollars = "500" ExchangeRatePerDollar = "7000" tempValue= Val(Dollars) * Val(ExchangeRatePerDollar) VNDong = CStr(tempValue) MsgBox "Amount in VN Dong is " & VNDong Tht ra VB6 support nhiu loi data dng cha nhng con s. Trc ht ta c s nguyn (Integer v Long). Cng l s nguyn nhng Integer dng 2 bytes trong memory cha mt con s nguyn t -32768 n 32767. l 32768 = 2^15 (2 ly tha 15) , tc l trong memory cc con s t 32768 n 65535 c dng biu din cc s m. Mt ln na, nh rng mt con s trong memory biu din mt th g chng qua ch l theo quy c m thi. Cn Long dng 4 byte cha mt con s nguyn t -2147483648 n 2147483647. Nu bn dng Integer m b Oveflow error khi lm ton nhn th assign cc con s vo mt Long variable (s ct ngha variable sau ny) TRC KHI lm ton nhn ch ng kt qu mt bi ton nhn qu ln trc khi Assign n vo mt Long variable. Th d: ' Thay g vit Dim Result as Long Result = 30345 * 100 ' s b overflow error ' Hy vit nh sau: Dim Result as Long Result = 30345 Result = Result * 100 ' khng b overflow error

tnh ton cho chnh xc ta cn mt loi data c th cha s sau decimal point. VB6 cho ta Single v Double. Single dng 4 bytes, Double dng 8 bytes. Thng thng, bn s him khi cn nhc n Double. Khi display mt s Single hay Double bn cn dng Function Format convert t Single ra Text String mt cch uyn chuyn. Th d Dollars = "500.0" ExchangeRatePerDollar = "7000.0" 'Dng Function CSng convert String ra Single tempValue= CSng(Dollars) * CSng(ExchangeRatePerDollar) 'Dng Function Format c cc du phy ngn v triu v phi c 2 digits sau decimal point. VNDong = Format (tempValue, "#,###,###.00") MsgBox "Amount in VN Dong is " & VNDong

72

VB6 cho ta hai cch chia, l / dng cho Single/Double v \ dng cho Integer. 5 / 3 cho ta 1.6666666 5 \ 3 cho ta 1

Function Round uc dng b bt cc con s nm pha sau decimal point. Th d: Round ( 12.3456789, 4 ) ch gi li 4 con s sau decimal point v cho ta 12.3457

Numeric data type Currency ch cha nht nh 4 s sau decimal point. N khng c ch li c bit g. Variable Variable l nhng ch cha data tm thi trong memory ta dng trong qu trnh bin ch data ca chng trnh. Khi ta Declare (khai bo) mt variable loi data g l ta dnh ra mt ch trong memory cha mt ming data loi y. Nh l ty theo loi data ta s cn nhiu hay t memory, mt Interger ch cn 2 bytes, cn mt Single cn n 4 bytes, trong khi mt String th cn nhiu memory hn na. Th d nh: Dim strFullName as String Dim ICount as Integer Dim sRate as Single

Khi bn tm cch cho hai data type khc nhau lm vic, th d nh lm ton chia mt Text String bi mt con s th c th b Mixed mode error. Tuy nhin nu Text String y gm nhng digits th c th VB6 s t ng convert Text String ra mt con s trc khi dng n trong mt bi ton. Ngc li, d nhin ta khng th ghp mt con s vo mt Text String, nhng VB6 c th convert con s ra mt Text String of digits trc khi ghp Text String y vo String kia. Mc du VB6 rt t nh trong vic on ra nh ca chng ta trong khi coding nhng ta phi thn trng trong cch dng Data type trnh gp phi nhng bt ng. Vn t tn cho variable rt quan trng. Bn nn t tn variable v cc Function, Sub nh th no khi c code ta thy d hiu nh c mt bi lun vn. Thng thng, d nhn din data type ca mt variable ngi ta gn pha trc tn variable cc prefix nh str cho String, I cho Integer, s cho Single ..v.v.. Khi rp nhiu ch ri thnh tn mt variable, thng thng ngi ta lm cho letter u tin ca mi ch thnh ra Hoa (Capital), th d nh TotalSalesOfTheMonth. C mt Tip nho nh l ng ngi t tn variable qu di. Khi nh my na chng tn ca mt variable bn c th nh Ctrl-Space IDE nh nt phn cn li ca tn variable, nu khng c s trng hp vi mt tn variable/Sub/Function no khc. Nu cng tc lp trnh ging nh nu n, bn c th ngh n variable nh cc ci r, thau ta cn c vic chun b thc n c tin li. Trc khi bt tay vo cng tc ta xin vi ch nh cho mnh bao nhiu ci r, thau, thn .v.v..( l Declare variables). Ta mi loi thc n vo mt r hay thau khc nhau, ch khng tht chung vi rau ci (cng nh khng th cng Text String vi con s). Khi ta b thm mt tri c vo r c th s tri c trong r tng ln 1. Mt lt sau ta ly ra vi tri c dng th s tri c trong r b gim i. Khi khng cn dng na ta b hay ct my tri c cn li ri dp ci r i ch khc.

73

Tr gi ca mt variable thng hay thay i trong qu trnh x l data. n mt lc no variable khng cn hin hu. Phm vi hot ng ca mt variable c gi l scope. Nu code nm ngoi phm vi ca mt variable th khng th dng n variable y c. Di y l listing ca mt chng trnh VB6 ngn: Option Explicit Dim iCount As Integer Dim X As Integer Dim Y As Integer Private Sub CmdIncreX_Click() iCount = iCount + 1 X=X+1 If X = 80 Then X=0 Y=Y+1 End If End Sub Private Sub CmdIncreY_Click() Dim Y iCount = iCount + 1 Y=Y+1 End Sub Trong listing trn Scope ca iCount, X, Y l ton b listing, tc l u cng c th ni n, dng, thy cc variables . Tuy nhin trong Sub CmdIncreY-Click() c declare mt variable Y. Scope ca variable ny l ch ni b, tc l bn trong Sub CmdIncreY-Click() m thi. Chng nhng th, ci local (a phng) variable Y ny cn che ci global variable Y na, tc l bn trong Sub CmdIncreY-Click() ta ch thy local variable Y m khng thy global variable Y. Mt khi execution trong Sub CmdIncreY-Click() kt thc th local variable Y cng bin mt lun. Nu bn mun khi tr li execute Sub CmdIncreY-Click() m local variable Y vn cn y nguyn vi gi tr g n c t trc, bn nn Declare rng n Static, nh: Static Y as Integer Ni tm li, Local variable ca Sub hay Function ch hot ng v hin hu bn trong Sub/Function. Global variable ca mt Form hay Module th p dng cho c Form/Module tr khi b che li bi mt local variable c cng tn bn tron mt Sub/Function. Ngoi ra khi ta Declare mt Global variable l Public th cc Form/Module khc cng thy v dng n c lun. Theo nguyn tc ca Software Engineering th v l do an ninh ta ch cho php ngi khc thy ci g cn thy thi. Do , ta khng nn Declare cc variable Public ba bi, nh khi c mt variable b thay i value mt cch b mt m ta khng on uc th phm l ai. Nh rng Declare Public cng ging nh nh khng ng ca vy. Ngoi ra, cu Option Explicit u Listing c dng tuyn b rng tt c mi variables dng trong Form/Module u cn phi c Declare. Nh l VB6 khng i hi ta phi Declare mt variable trc khi dng n. Thng thng, ty theo tnh hung, VB6 c th on ra c Data Type ca variable khi ta dng n ln u tin. Nu code i hi value ca mt variable khi n uc dng ln

74

u th VB6 t ng coi n nh mt Empty String (String khng c character no c, vit l "" ) nu n l Text String Data type hay con s 0 nu n l mt con s. iu ny rt l tin li. Tuy nhin, nu ta s nh vn ln mt variable th VB6 t ng initialise n ra Empty String hay 0. y c th khng phi l iu ta mun. Nu c dng Option Explicit th vic ny s b l ty ngay v tt c mi variable u phi uc tuyn b chnh thc. Do , l VB6 programmer, bn hy xem vic dng Option Explicit nh l mt iu rn ca Cha, hy vng gi cch trung tn. Ngy v Gi C mt loi data type uc dng ch c ngy ln gi, l Date. Ta c th bit hin thi l ngy no, my gi bng cch gi Function Now. Sau ta dng cc Function Day, Month v Year ly ra ngy, thng v nm nh sau: Private Sub CmdCheckDate_Click() Dim dDate As Date If IsDate(txtDate.Text) Then ' eg: txtDate = "26/12/01" dDate = CVDate(txtDate.Text) ' convert a Text String to internal Date using Function CVDate ' Day, Month and Year are automatically converted to String MsgBox "Day = " & Day(dDate) & ", Month = " & Month(dDate) & ", Year = " & Year(dDate) Else MsgBox "Invalid date. Please try again." End If End Sub Trong Listing trn ta dng Function IsDate kim xem txtDate.text c hp l khng. Lu l IsDate khng phn bit ngy theo M (dng mm/dd/yy) hay theo u Chu (dng dd/mm/yy), do dng IsDate trong cng vic kim sot ny khng an ton lm. display ngy gi theo ng cch mnh mun bn c th dng Function Format nh sau:

MsgBox "NOW IS " & Format (Now, "ddd dd-mmm-yyyy hh:nn:ss") ' will display NOW IS Fri 08-Jun-2001 22:10:53 Bn c th dng mm display thng bng mt con s. S d ta dng nn thay v mm cho pht l v mm c dng cho thng. Ta c th thm bt cc n v ca ngy, thng, v.v. bng cch dng Function DateAdd. Th d:

Private Sub CmdNextMonth_Click() txtDate.Text = Format(Now, "dd/mm/yy") ' 08/06/01

75

txtNextMonth.Text = DateAdd("m", 1, CVDate(txtDate.Text)) ' txtNextMonth.text will show 8/07/2001 End Sub

Di y l cch tnh ra ngy cui ca thng ny:

Private Sub CmdLastDayOfMonth_Click() Dim dNextMonthDate, dFirstDayNextMonth dNextMonthDate = DateAdd("m", 1, Now) ' Add one month to get same day next month ' Get first day of next month dFirstDayNextMonth = 1 & "/" & Month(dNextMonthDate) & "/" & Year(dNextMonthDate) ' Subtract one day to get Last day of this month txtLastDayOfMonth.Text = DateAdd("d", -1, CVDate(dFirstDayNextMonth)) End Sub

Ta c th tnh khong cch gia hai ngy theo n v ngy, thng v.v.. bng cch dng Function DateDiff. Kt qu c th l m, dng hay 0 ty theo ngy no tr hn. Th d khong cch gia hai ngy theo n v thng:

DateDiff("m", Now, CVDate(dNextMonthDate))

Trong chng ti ta s hc v Data types Boolean, Variant v Data Array.

Chng Su - Dng d kin


Trong chng 5 ta hc qua cc im cn bn v vic dng variables. V cng vic chnh ca mt chng trnh l x l data cha trong variables, cho nn nu VB6 cho ta cng nhiu phng tin lm vic vi variables th cng tin li. Trong chng ny ta s hc:

Boolean variable, ti sao n hu dng Variant variable, cch lm vic vi n. Cch bin i (convert) t loi data type ny qua loi data khc Arrays ca variables v Arrays ca controls Cch to mt data type theo mnh

Boolean Variables

76

Boolean l loi data ch c th ly mt trong hai values: True hay False. Khi hc v Statement IF...THEN trong chng 4, ta ni s qua v Boolean data type. Ci phn gia hai ch IF v THEN c gi l Logical Expression v kt qu ca mt Logical Expression l mt Boolean value. Nu iu kin uc tha mn th value l True, nu khng th l False. Bn hi nu mt variable ch c th c hai values, ti sao ta khng th dng Integer v gii hn cch dng trong vng hai values 1 v 0 thi, cn g phi t ra Boolean data type. Lm nh vy cng c, nhng ci khc bit chnh l khi ta operate trn 2 variables ta phi bit r rng lm vic vi Integer ta dng +, -, *, \ trong khi vi Boolean ta dng OR, AND, NOT, XOR. Th xem th d di y: ' Use Integer with values 1 or 0 Dim IAnumber As Integer Dim IBnumber As Integer Dim IAge As Integer Dim sPersonalWorth As Single If (IAge >= 18) Then IAnumber = 1 Else IAnumber = 0 End If If (sPersonalWorth > 1000000) Then IBnumber = 1 Else IBnumber = 0 End If If (IAnumber = 1) And (IBnumber = 1) Then StandForTheElection End If '================================== ' Use Boolean Dim bAdult As Boolean Dim bRich As Boolean Dim IAge As Integer Dim sPersonalWorth As Single bAdult = (IAge >= 18) bRich = (sPersonalWorth > 1000000) If bAdult And bRich Then StandForTheElection End If Trong th d trn, ta lp trnh nu mt ngi tha mn hai iu kin: va trng thnh (18 tui tr ln) , va giu c (c trn 1 triu bc) th c th ra ng c Nu ta dng Integer, th nht chng trnh c kh hiu, th hai ci Logical Expression ca IF statement vn phi lm vic vi operator AND. Trong khi nu dng Boolean th chng trnh c v t nhin v d c nh ting Anh thng thng.

77

Variant Variables Variant variable c th cha Text String, Number, Date, thm ch c mt Array (mt lot nhiu variables cng data type). Nhn thong qua n rt tin dng, nhng khi mt Variant variable c dng nhiu ch, trong nhiu tnh hung khc nhau, bn phi thn trng. L do l v variant variable c th cha nhng loi data types khc nhau, nn khi bn operate hai variable c data type khc nhau, Visual Basic 6 c gng bin i mt trong hai variable thnh data type ca variable kia lm vic, kt qu l thnh thong bn s b kt. Cc tay Software Engineers thun ty rt ght lp trnh vi data khng uc Declare r rng. H khng mun b h v v tnh. Th rng Language Compiler bt gp trc nhng trng hp bn v tnh operate trn hai variables c data type khc nhau. C khi ta bc mnh v Compiler kh tnh, nhng s trnh b nhng surprise (ngc nhin) tn km sau ny. Cc ngn ng lp trnh gt gao y uc gi l strongly typed languages, chng hn nh Pascal, C++, Java .v.v.. Sau ny nu ta dng .NET th cc ngn ng C#, VB.NET (VB7) u l strongly typed. Trong VB7, Microsoft cho lu i bit tch Variant variables ca VB6. Cng vic Declare mt Variant variable cng ging nh Declare mt data type khc. Ch c iu ta c th bit data type tht s ang c cha bn trong mt Varaint variable bng cch dng Function VarType nh di y: Private Sub cmdShowDataTypes_Click() Dim sMess As String Dim vVariant As Variant vVariant = "Nguoi Tinh khong chan dung" ' Assign a String to vVariant sMess = VarType(vVariant) & vbCrLf ' use vbCrLF to display the next string on a new line vVariant = 25 ' Assign an Integer to vVariant sMess = sMess & VarType(vVariant) & vbCrLf vVariant = True ' Assign an Boolean value to vVariant sMess = sMess & VarType(vVariant) & vbCrLf ' Assign an Date to vVariant vVariant = #1/1/2001# ' enclose a Date string with #, instead of " as for normal Text String sMess = sMess & VarType(vVariant) MsgBox sMess End Sub Khi ta click button ShowDataTypes chng trnh s display gi tr ca cc Data Types trong mi trng hp:

78

Sau y l bng lit k nhng VarTypes thng dng:

Gi tr VarType 0-vbEmpty 1-vbNull 2-vbInteger 4-vbSingle 7-vbDate 8-vbString 9-vbObject 11-vbBoolean

Ch thch Khng c g trong variant Khng c valid (hp l) data trong variant Variant cha Integer Variant cha Single Variant cha Date/Time Variant cha String Variant cha mt Object Variant cha Boolean

lm vic vi loi VarTypes bn c th dng Select Case nh sau: Private Sub Process_Click() Select Case VarType(vVariant) Case vbString ' ... Case vbBoolean ' ... Case vbInteger ' ... Case vbDate ' ... End Select End Sub Constants (Hng s)

79

Variables rt tin dng chng ta dng cha cc data c th bin i value trong sut qu trnh x l ca chng trnh. Nhng i khi chng ta mun c mt loi variable m value khng bao gi thay i, VB6 cho ta Constant dng vo vic ny. Th d nh thay g dng trc tip mt con s hay mt Text String nhiu ch trong chng trnh, ta t tn Constant v cho n mt value ti mt ch nht nh. Th d ta vit chng trnh cho 5 chic xe chy ua. khi hnh cc chic xe ta dng mt FOR...LOOP n gin nh: For ICar = 1 To 5 Call StartCar (ICar) Next Tng t nh vy nhiu ni khc trong chng trnh, mi ln ni n con s cc xe ta dng s 5. Nu sau ny mun thay i con s cc xe thnh ra 10, ta phi tm v thay i tt c cc con s 5 ny thnh ra 10. Nu khng thn trng ta c th thay i mt con s 5 dng cho chuyn g khc, ch khng phi cho con s cc xe, thnh ra 10 - nh vy ta v tnh to ra mt bug. trnh vn ny ta c th dng Constant nh sau: Const NUMBER_OF_CARS = 10 For ICar = 1 To NUMBER_OF_CARS Call StartCar (ICar) Next Sau ny mun thay i con s cc xe, ta ch cn edit value ca Constant. Trong khp chng trnh, ni no nhc n con s cc xe ta dng ch NUMBER_OF_CARS, va d hiu, va trnh lm ln. Bin i (convert) t loi data type ny qua loi data khc Nhiu lc ta cn phi convert data type ca mt variable t loi ny qua loi khc, VB6 cho ta mt s cc Functions di y. Xin lu rng khi call cc Functions ny, nu bn a mt data value bt hp l th c th b error.

Conversion Function CBool () CByte () CDate () CDbl () CInt () CSng () CStr ()

Ch thch i parameter ra True hay False. Nu Integer value khc 0 th c i thnh True i parameter ra mt con s t 0 n 255 nu c th c, nu khng c th l 0. i parameter ra Date i parameter ra Double precision floating point number i parameter ra Integer i parameter ra Single precision floating point number i parameter ra String

Ngoi cc Function ni trn bn cng c th dng Function Val convert mt String ra Number. Lu l khi Function Val process mt String nu n gp mt character no khng phi l digit hay decimal point th n khng process tip na. Do nu Input String l "$25.50" th Val returns con s 0 v $ khng phi l mt digit. Nu Input String l "62.4B" th Val returns 62.4. CDbl l Function dng convert mt String ra s an ton nht. Input String c th cha cc du , v .

80

(th d: 1,234,567.89) ty theo ni bn trn th gii (th d nh u Chu hay M). CSng cng lm vic ging nh CDbl nhng nu con s ln hn 1 triu n c th b bug. Ci bug bc mnh nht ca CSng l nu Input String khng c g c (tc l InputString="") th Function CSng cho bn Type Mismatch Error. Do khc phc ci khuyt im ny bn c th vit cho mnh mt Function tm t tn l CSingle dng th cho CSng nh sau: Function CSingle(strNumber) As Single If Trim(strNumber) = "" Then CSingle = 0# Else CSingle = CSng(strNumber) End If End Function Arrays Khi bn c nhiu variables tng t nhau, th d nh im thi ca 10 hc sinh, nu phi t tn khc nhau cho tng variable (th d: HoaMark, TaiMark, SonMark, TamMark, NgaMark, HuongMark .v.v..) th tht l cc nhc v bt tin. Bn c th dng Array c mt tn chung cho c nhm, ri ni n im ca tng ngi mt bng cch dng mt con s gi l ArrayIndex. Bn s Declare nh sau: Dim myStudentMarks(10) as Integer K bn ni n im ca mi hc sinh bng cch vit myStudentMarks(i), m i l ArrayIndex. Gi d ta mun tnh tng s im: Sub CmdCalculateTotal_Click() Dim myStudentMarks(10) As Integer ' Declare array, assuming students' marks are Integers Dim TotalMark As Integer ' Use this variable to accumulate the marks Dim i As Integer ' Use i as ArrayIndex myStudentMarks(1) = 6 ' First student's mark myStudentMarks(2) = 7 ' Second student's mark myStudentMarks(3) = 5 myStudentMarks(4) = 9 myStudentMarks(5) = 6 myStudentMarks(6) = 8 myStudentMarks(7) = 9 myStudentMarks(8) = 10 myStudentMarks(9) = 6 myStudentMarks(10) = 7 TotalMark = 0 ' This statement is not required as VB6 initialises TotalMark to 0 ' Go through all students and add each student's mark to the Total For i = 1 To 10 TotalMark = TotalMark + myStudentMarks(i) Next txtTotal.Text = CStr(TotalMark) ' Convert to String for display by assigning to

81

Textbox txtTotal End Sub

Khi ta Declare Dim myStudentMarks(10) as Integer tht ra ra ta c mt Array vi 11 Array Elements ch khng phi 10, v Array bt u vi ArrayIndex value=0. C iu trong th d trn ta c khng nhc n ArrayElement 0. Nu tht s mun c chnh xc 10 Elements thi, ta c th Declare nh sau: Dim myStudentMarks (1 To 10 ) As Integer Loi Array ta va dng qua l Single Dimention. Nu trong th d trn ta mun tnh im ca hc sinh trong 3 lp hc, ta c th Declare Double Dimention Array nh sau: ' Four classes, each has up to 6 students Dim myStudentMarks(3, 5) As Integer ' Note that each dimension starts at 0 ' or ' Three classes, each has up to 5 students Dim myStudentMarks(1 To 3, 1 To 5) As Integer Nhn tin ni chuyn v Array cho variables, ta cng c th dng Array cho controls cng mt loi trong mt Form. Nu ta c nhiu Label controls (hay Textbox controls ) vi nhng chc nng ging nhau trong chng trnh, ta c th dng cng mt tn cho cc controls, nhng khc Property Index value ca chng. Bn c th create mt Array of Labels bng cch Copy ci Label ri Paste n ln Form. VB6 s hi nu bn mun c mt Array of controls. Nu bn tr li Yes, VB6 s t ng cho Label th nht Index value=0 v Label mi va c Pasted Index value=1. Sau nu bn tip tc Paste ci Label c Index ri th VB6 khng hi na v vui v tng Index value ln cho cc Labels sau. Do nu bn gi Label th nht l lblClass ri Copy v Paste n 2 ln bn s c mt Array of 3 Labels tn lblClass v cc Index values 0, 1, 2. Trong th d sau y, ta create mt Array of Labels tn lblClass v mt Array of Textboxes tn txtClassMark. Trong Sub Form_Load ta generate Captions ca cc Labels. Private Sub Form_Load() Dim i As Integer For i = 0 To 2 ' Label Index starts at 0, but Class number starts at 1 lblClass(i) = "Mark of Class " & CStr(i + 1) Next End Sub Sub CmdCalculateTotal_Click() ' Three classes, each has up to 5 students

82

Dim myStudentMarks(1 To 3, 1 To 5) As Integer Dim TotalMark As Integer Dim ClassMark As Integer Dim i As Integer ' Use as ArrayIndex for Class Dim j As Integer ' Use as ArrayIndex for StudentMark ' Students' marks of first class myStudentMarks(1, 1) = 6 myStudentMarks(1, 2) = 7 myStudentMarks(1, 3) = 5 myStudentMarks(1, 4) = 9 myStudentMarks(1, 5) = 6 ' Students' marks of second class myStudentMarks(2, 1) = 8 myStudentMarks(2, 2) = 8 myStudentMarks(2, 3) = 6 ' Students' marks third class myStudentMarks(3, 1) = 5 myStudentMarks(3, 2) = 7 myStudentMarks(3, 3) = 8 myStudentMarks(3, 4) = 6 For i = 1 To 3 ClassMark = 0 ' Intialise ClassMark of class i to 0 ' Now go through each Student in Class i For j = 1 To 5 ClassMark = ClassMark + myStudentMarks(i, j) ' Accumulate ClassMark of class i TotalMark = TotalMark + myStudentMarks(i, j) Next ' Display ClassMark of class i. Note that txtClassMark Index starts at 0, NOT 1 txtClassMark(i - 1).Text = CStr(ClassMark) Next txtTotal.Text = CStr(TotalMark) ' Display TotalMark End Sub Ghi ch: Nu bn c mt Array of Textboxes gm ch c 2 Textboxes, ri sau bn Delete mt Textbox v mun dng Textbox cn li lm ci Textbox duy nht, bn vn phi refer (nhc n n) bng cch dng Index (th d: txtClassMark(0) ), d rng by gi n l Textbox duy nht mang tn y. Nu bn mun dp ci v Index th bn phi vo Properties Window Delete ci Index value ca ArrayTextbox. Nu bn khng lu im ny th c khi bn s bt tc khng hiu ti sao mnh dng ng tn m VB6 vn nht nh rng ci Textbox bn ni n khng hin hu, v VB6 cn Index value ca Textbox.

83

Thnh thong, khi Declare Array bn khng bit r mnh s cn bao nhiu Elements cho mi dimension. Trong trng hp y bn c th dng Dynamic Arrays v Declare mt Array nh sau: Private myStudentMarks() As Integer V bn khng mt con s gia hai du ngoc n nn VB6 bit l bn mun dng Dynamic Array v dimension ca n c th s thay i trong tng lai. Khi no mun thay i dimension ca Dynamic Array bn dng ReDim keyword: ReDim myStudentMarks(10) ReDim Preserve myStudentMarks(10) C hai statements trn u i dimension ca Array myStudentMarks thnh 11 (t Element 0 n Element 10), nhng trong statement th nh ch Preserve gi nguyn values ca cc Elements ca Array. Khi lm vic vi Array thnh thong bn cn bit cc Elements thp nht v cao nht bng cch dng LBound v UBound. Private MyArray(10 to 20) As String LowestNum = LBound(MyArray) ' LBound returns 10 HighestNum = UBound(MyArray) ' UBound returns 20 Private YourArray( 2 to 5, 10 to 15) As Integer LowestNumOfFirstDimension = LBound(YourArray,1) ' LBound returns 2 HighestNumOfSecondDimension = UBound(YourArray,2) ' UBound returns 15 Ngoi ra nu dng Dynamic Array, bn c th assign mt Array ny cho mt Array khc, thay v phi dng FOR ...LOOP copy tng Array Element. MyArray = HisArray

Data Type ca bn Bn c th gom cc mnh Data ca cng mt vt no thnh mt nhm v t tn cho loi Data Type y nh sau: Type EmployeeRec ' EmployeeRec as name of this new Data Type Firstname As String Surname As String

84

Salary As Single DateOfBirth As Date End Type ' Now declare a variable of the new data type Dim MyEmployee As EmployeeRec MyEmployee.Firstname = "David" MyEmployee.Surname = "Smith" MyEmployee.Salary = 25000 MyEmployee.DateOfBirth = #14/6/1963# Trong Software Engineering, ngi ta gi loi Data Type ny l Structured Data Type phn bit n vi cc loi Simple Data Type nh Integer, Boolean, Single .v.v.. Bn cch ni n mt mnh data, MyEmployee.Firstname, ging nh l Property Firstname ca mt control tn MyEmployee. C mt cch vit khc trnh typing nhiu ln ch MyEmployee bng cch dng keyword With nh sau: With MyEmployee .Firstname = "David" .Surname = "Smith" .Salary = 25000 .DateOfBirth = #14/6/1963# End With Mc du nh ngha v dng Structured Data Type cch ny rt tin li, nhng sau ny ta c th dng Class t c cng mt mc tiu m cn hu hiu hn na. Trong Class chng nhng ta nh ngha nhng mnh data m cn ra cch x l chng na.

Chng By - Dng List Controls


C hai loi List controls dng trong VB6. l Listbox v Combobox. C hai u display mt s hng ta c th la chn. Listbox chim mt khung ch nht, nu chiu ngang nh th c khi khng display y mt hng, nu chiu di khng display tt c mi hng th Listbox t ng cho ta mt vertical scroll bar cho bit cn c nhiu hng b che v ta c th xem cc hng y bng cch dng vertical scroll bar. Combobox thng thng ch display mt hng, nhng ta c th chn display bt c hng 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. Trong chng ny ta s hc qua cc p dng sau ca Listbox:

85

Display nhiu s la chn User selects bng cch click hay drag-drop Nhng cch dng Property Sorted Cch dng Multiselect Dng display Events Dng Search hay process text Cch dng Itemdata song song vi cc Items ca List Dng lm Queue

Listbox

Display 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 hng nh nh Ctrl-Enter, thay v ch Enter, nu khng VB6 tng ta nh xong nn close property List. Cc tn ny l nhng hng s hin ra trong Listbox khi ta bt u chy program.

Ngoi lstNames ta cho thm mt Label vi Caption STUDENTS trang hong, v mt Label khc tn lblName. Mi khi User click ln hng tn no ta mun display hng tn y trong lblName. Sau cng ta cho vo mt CommandButton tn CmdExit cho User phng tin Stop ci program. Ta s c chng trnh nh sau: Private Sub lstNames_Click() ' Assign the selected line of Listbox lstNames to Caption of Label lblName lblName.Caption = lstNames.List(lstNames.ListIndex) ' or = lstNames.text End Sub Private Sub CmdExit_Click() End End Sub Gi s ta click vo tn John Smith trn Listbox, ta s thy tn y cng uc display trong Label lblName.

86

Trong th d ny, Listbox lstNames c 7 hng ( 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 User click ln mt hng, Listbox s generate Event lstNames_Click. Lc by gi ta c th bit c User va mi Click hng no bng cch hi Property ListIndex ca lstNames, n s c value t 0 n ListCount-1. Lc program mi chy, cha ai Click ln Item no ca Listbox th ListIndex = -1. Nhng Items trong Listbox c xem nh mt Array ca String. 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: hoc l lstNames.List(lstNames.ListIndex), hoc l lstNames.text.

Save content ca Listbox


By gi lu tr content ca lstNames, ta thm mt CommandButton tn CmdSave. Ta s vit code khi User click nt CmdSave program s m mt Output text file v vit mi items ca lstNames vo : Private Sub CmdSave_Click() Dim i, FileName, FileNumber ' 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" ' name output text file MyList.txt ' Obtain an available filenumber from the operating system FileNumber = FreeFile ' Open the FileName as an output file , using FileNumber as FileHandle 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. Make sure you use symbol # in front of FileNumber Print #FileNumber, lstNames.List(i) Next Close FileNumber ' Close the output file End Sub

87

App l mt Object c bit i din cho chnh ci program ang chy. y ta dng Property Path bit lc program ang chy th execute module EXE ca n nm u. L do l thng thng ta cc files lin h cn thit cho program ln qun hoc ngay trong folder ca program 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 started mt program m thy App.PrevInstance = True th lc by gi cng c mt copy khc ca program ang chy. Nu cn ta End program ny trnh chy 2 copies ca program cng mt lc. App.Title v App.Revision cho ta tin tc v Title v Revision ca program ang chy. vit ra mt Text file ta cn phi Open n trong mode Output v tuyn b t ry tr i s dng mt con s (FileNumber) i din ci File thay v dng chnh FileName. trnh dng mt FileNumber hin hu, tt nht ta hi xin Operating System 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 Operating System s c th dng n li. Do bn phi trnh gi FreeFile lin tip hai ln, v OS s cho bn 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 program (n nm trong memory ca computer). Do t trong memory vit ra hard disk th ni l Output. Ngc li c t mt Text file nm trn hard disk vo memory cho program ta th gi l Input.

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 User click nt CmdLoad program s m mt Input text file v c tng hng 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 , using FileNumber as FileHandle Open FileName For Input As FileNumber lstNames.Clear ' Clear the Listbox first ' Now read each line until reaching End-Of-File, i.e. no more data Do While NOT EOF(FileNumber) Line Input #FileNumber, anItem ' Read a line from the Text file into variable anItem lstNames.AddItem anItem ' Add this item to the bottom of lstNames Loop Close FileNumber ' Close the input file End Sub

88

c t mt Text file ta cn phi Open n trong mode Input. Trc khi populate lstNames ta cn phi delete 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 hng vo trong Listbox. By default, nu ta khng ni nht vo ch hng no th AddItem nht Item mi vo di cht ca Listbox. Nu mun nht hng mi vo ngay trc item th 5 (ListIndex = 4), ta vit: lstNames.AddItem newItemString, 4 ' newItemString contains "Ross Close", for example ' To insert a new Item at the beginning of the Listbox, write: lstNames.AddItem newItemString, 0 Nh l mi ln bn Add mt Item vo Listbox th ListCount ca Listbox increment by 1. Mun delete mt item t Listbox ta dng method RemoveItem, th d nh mun delete item th ba (ListIndex=2) ca lstNames, ta vit: lstNames.RemoveItem 2 Mi ln bn RemoveItem t Listbox the ListCount ca Listbox decrement by 1. Do nu bn dng ci 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 hng 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 program 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 t hng v b vo Listbox. Ging nh "Trong khi cha tr ht n nh v th phi tip tc r".

Drag-Drop
Ta hc qua Click Event ca Listbox. By gi dng Drag-Drop cho Listbox bn 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 bn Array ca hai lblRoom labels. cho lstNames mt DragIcon, bn click lstNames, click Property DragIcon pop-up mt dialog cho bn 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 User Drag 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 assign property Text ca Source (tc l lstNames, ci control t n pht xut Drag action) vo Property Caption ca lblRoom. Lu v

89

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 Label's Caption lblRoom(Index).Caption = Source.Text End Sub Kt qu sau khi Drag hai tn t Listbox qua Labels l nh sau:

Dng Property Sorted


Trong th 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. Bn c th set Property Sorted = True thc hin chuyn ny. C mt gii hn l bn phi cho Property Sorted mt value (True hay False) trong lc design, ch trong khi chy program bn 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. Bn 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 hng 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

90

' Add the lstNames item to lstTemp 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. Bn hy t ln pha trn lstName hai cl 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 hng ngay ngn ta i Font ca lstNames ra Courier New. Courier New l mt loi Font m chiu ngang ca ch m bng ch i, trong khi hu ht cc Fonts khc nh Arial, Times Roman ..v.v. l Proportional Spacing, c ngha l ch m rng hn ch i. Listing mi ca Sub CmdLoad_Click tr thnh nh sau: Private Sub CmdLoad_Click() Dim i, Pos Dim FileName, FileNumber, anItem Dim sFirstName As String * 10 ' fixed length string of 10 characters Dim sSurName As String * 10 ' fixed length string of 10 characters ' 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

91

FileNumber = FreeFile ' Open the FileName as an input file , using FileNumber as FileHandle Open FileName For Input As FileNumber lstNames.Clear ' Clear the Listbox first ' Now read each line until reaching End-Of-File, i.e. no more data Do While Not EOF(FileNumber) Line Input #FileNumber, anItem ' Read a line from the Text 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 unwanted blank spaces ' The part after "," is SurName sSurName = Mid(anItem, Pos + 1) sSurName = Trim(sSurName) ' Trim off any unwanted 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 User click Label lblFirstName ta ch cn gi CmdSort_Click nh sau: Private Sub lblFirstName_Click() CmdSort_Click End Sub 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 b v li lstNames ta li nh hon chuyn FirstName v SurName chng nm ng li v tr. Tc l, ci mnh ca ta l mun bit Item no phi nm u trong lstNames, ch d nhin khi display mi Item u c FisrtName bn tri. Code sort tn theo SurName cng ging nh CmdSort_Add nhng thm tht cht t nh sau: Private Sub lblSurName_Click() Dim i, anItem Dim sFirstName As String * 10 ' fixed length string of 10 characters Dim sSurName As String * 10 ' fixed length string of 10 characters 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)

92

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) ' Identify FistName and SurName 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:

Nhn tin y ta sa ci Sub CmdSave_Click li mt cht 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 as FileHandle

93

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 Trong bi ti ta s hc thm cc p dng khc ca ListBox. Listbox

Cch dng MultiSelect


Cho n gi User click vo Listbox chn ch mt Item. Khi mt Item c chn th hng y tr nn highlighted vi background mu xanh m. Nu k ta click mt hng khc th hng c c display tr li bnh thng v hng mi uc selected s tr nn highlighted. Listbox cho ta c th select nhiu Items cng mt lc bng cch set Property MultiSelect = Extended

i vi MultiSelected Listbox, ta chn mt nhm Items lin tc bng cch click Item u ri nhn nt Shift trong khi click Item cui. Ta cng c th tip tc Select/Deselect thm bng cch n nt Ctrl trong khi click cc Items. Nu ta click mt Item cha c selected th n s tr nn selected (highlighted mu xanh), nu ta click mt Item c selected ri th n s tr nn deselected (khng cn mu xanh na). Th d trong program bn click "Peter Jones", k n nt Shift trong khi click "Sue Rose", k bung nt Shift ra n nt Ctrl trong khi click "Kevin White", bn s c nhng selected Items nh trong hnh di y:

94

Ngoi ra bn cng c th MultiSelect nhiu Items trong mt Listbox bng cch dng mouse drag, tc l bn click ln Item u ri tip tc mousebutton trong khi ko mousepointer n Item cui cng mi bung mousebutton ra.

Ci Bug c n
By gi gi s ta mun delete tt c nhng Items va c selected (highlighted). Bn hy t mt CommandButton mi tn CmdDeleteSelectedItems vo Form. Ta s dng Event Click ca Button ny delete nhng selected Items. Mt selected Item ca lstNames s c property Selected ca n bng True. Tc l nu Item th ba (ListIndex=2) c selected th ta c lstNames.Selected(2) = True. Ta c nh s iterate through mi Items ca lstNames, xem Item no c selected th mnh s delete n bng cch dng method RemoveItem. Ta s vit code cho Sub CmdDeleteSelectedItems_Click() nh sau: Private Sub CmdDeleteSelectedItems_Click() Dim i For i = 0 To lstNames.ListCount - 1 If lstNames.Selected(i) = True Then lstNames.RemoveItem i End If Next End Sub Bn hy chy chng trnh, click Load populate lstNames vi cc tn c t text file, ri MultiSelect cc tn nh trong hnh pha trn. K click button DeleteSelectedItems. Program s t (crash) v c hnh nh sau:

95

Nu bn click nt Debug, program s ngng ti dng code gp error v highlight n vi background mu vng. mousepointer ln trn ch i ca lstNames.Selected(i), VB6 s popup message nho nh i = 4.

Bn thy trong hnh lc ny lstNames ch cn c 4 Items (Ron, Trevor, John v Alan), v cc Items kia b removed. Bn c bit ti sao program crashed khng? l v program ang refer n property Selected ca Item th nm ( ArrayIndex i = 4) ca lstNames trong khi lstNames by gi ch cn c 4 Items. V vy program crashed vi message "Runtime error '381': Invalid property array index". Th phm ca ci Bug c n ny l statement For i = 0 To lstNames.ListCount - 1. VB6 ch tnh value ca lstNames.ListCount -1 mt ln lc khi s For..Loop m thi (tc l lstNames.ListCount -1 = 6), n khng lu l ListCount gim value mi ln mt Item b Removed. Ngoi ra ta thy tn "Trevor Kennedy" cng khng b removed, tc l n b lt s nu ta dng For..Loop theo cch ny. L do l sau khi ta Remove "Peter Jones" (Item th hai), "Trevor Kennedy" b y ln v tr thnh Item th hai mi. K ta increment value ca i thnh 2 ri process Item th ba, tc l "Sue Rose", nn "Trevor Kennedy" khng h c processed.

Sub CmdDeleteSelectedItems_Click cn phi c vit li dng While ... Loop, thay v For...Loop. Trong While...Loop, lstNames.ListCount - 1 c evaluated (tnh) test mi iteration. Khi no ta Remove mt Item th ta khng increment i, v Item ngay di removed Item c y ln. Listing mi nh sau: Private Sub CmdDeleteSelectedItems_Click() Dim i i = 0 ' Initialise value of i to start from first Item ' Note that lstNames.ListCount is evaluated freshly at each iteration Do While i <= (lstNames.ListCount - 1) If lstNames.Selected(i) = True Then lstNames.RemoveItem i ' No need to increment i here because the item below is pushed up Else i = i + 1 ' increment i to process the next item End If Loop End Sub

96

Dng Listbox display Event Log


Trong th d sau y ta mun display input t mt serial COM port ( c data tht qua serial COM port ta phi dng control MsCOMM c hnh telephone mu vng trong ToolBox). Nhng tin vic biu din, thay v c mt message t mt serial COM port, ta s emulate n bng cch dng mt ComboBox. Khi user select mt hng t ComboBox cboInput th ta xem cboInput.text nh data c t serial COM port. Lp tc lc y ta s display input message trong hai dng: ASCII v HEX. Mi hng input message c prefix vi ngy v gi trc khi c cho vo hai Listboxes lstASCII v lstHexadecimal. Hnh di y cho thy Form ang display trong ASCII mode.

Nu bn click button Display in HEX th caption ca button i thnh Display in ASCII, lstASCII tr nn v hnh v lstHexadecimal s hin ra nh sau:

Di y l listing ca Function HexDisplay convert t ASCII string ra Hexadecimal string. Function HexDisplay(InASCII) As String ' Convert an ASCII string to HEX string Dim InLen, i, msg, HexStr InLen = Len(InASCII) ' Get length of input string ' Convert each ASCII character to Hex For i = 1 To InLen HexStr = Hex(Asc(Mid(InASCII, i, 1))) ' If HEX has only one digit then prefix it with 0 If Len(HexStr) = 1 Then HexStr = "0" & HexStr msg = msg + HexStr & " " Next i HexDisplay = msg ' Return result string for Function End Function Trong program ny, khi Listbox t n 1000 items th mi ln mt hng mi c thm vo, hng c nht s b removed. cho hng mi nht khng b du ta phi nh cho ListIndex ca Listbox bng

97

Listcount-1 Listbox t ng scrollup v highlight hng cui. Mi khi ta thm mt hng vo Listbox lstHexadecimal, ta cng ng thi vit n vo mt LogFile. Tn ca LogFile ny da vo ngy ly t Computer System v c dng nh Hex30Jun01.log. Tc l ta s dng mt LogFile khc cho mi ngy. Mi khi qua ngy mi, program t ng dng mt LogFile mi. Nh l khi mun vit vo mt text file theo tn g , nu file cha hin hu th ta phi create n v vit vo, nu file hin hu ri ta ch cn append hng mi vo cui file (phi cn thn ch ny, v nu khng, ta v overwrite ci file v mt ht nhng g n cha trc y). Sub DisplayInHEX(inString) Dim Mess, LogFileName ' Convert ASCII to Hex Mess = HexDisplay(inString) ' Prefix with date and time and add it to the bottom of Listbox lstHexadecimal.AddItem Format(Now, "dd/mm/yyyy hh:nn:ss") & " " & Mess ' Keep only the latest 1000 events If lstHexadecimal.ListCount >= 1000 Then ' Remove the first Item, i.e. the oldest item lstHexadecimal.RemoveItem 0 End If ' Highlight the lattest item in the Listbox lstHexadecimal.ListIndex = lstHexadecimal.ListCount - 1 ' Use different log file each day. Filename has format like Hex15Jun01.log LogFileName = "Hex" & Format(Now, "ddmmmyy") & ".log" ' Log to file including Date and Time LogEvent LogFileName, Mess, False, 2 End Sub

In ra content ca Listbox
Di y l mt p dng ca Listbox MutiSelect in ra c Listbox hay ch nhng hng c selected. Sub PrintList nhn:

Listbox m ta mun in mt Boolean value m nu True th in c Listbox Title ca Printout

Sub PrintList(theList As ListBox, PrintAll as Boolean, Title As String) ' Print the whole lot or only selected lines in a listbox ' PrintAll = True means printing the whole content of the listbox Const MaxLinesPerPage = 50 Dim msg, i, j, PageNo, NumLines, HasSome, Margin HasSome = False ' Flag indicating existence of data Margin = Space(10) ' Make a margin of 5 characters Title = vbLf & vbLf & Title + vbCrLf & vbLf

98

NumLines = 0 ' Init number of lines on this page PageNo = 1 ' init Page number msg = Title ' Msg will contain everything starting with Title Printer.FontName = "Courier New" ' Initialise Printer Fontname Printer.FontSize = 10 ' Initialise Printer FontSize Screen.MousePointer = vbHourglass ' Change mousepointer shape to Hourglass. If theList.ListCount > 0 Then ' get here if the listbox is not empty For i = 0 To theList.ListCount - 1 ' Go thru each line of text in the listbox If theList.Selected(i) Or PrintAll Then ' print a line of text if it's selected or PrinAll is true DoEvents ' Let other processes have a chance to run HasSome = True NumLines = NumLines + 1 ' Increment count of lines If Left(theList.List(i), 1) = "'" Then ' if first character is "'" then use this as an indication to force a new page If NumLines > 0 Then ' Add extra blank lines to make up a page before inserting page number For j = NumLines - 1 To MaxLinesPerPage msg = msg & vbCrLf Next j ' Insert Page number at end of page msg = msg & Space$(35) & "Page-" & CStr(PageNo) Printer.Print msg Printer.NewPage ' Send new page. NumLines = 1 ' reset Number of lines, counting this current line PageNo = PageNo + 1 ' Increment Page number msg = Title ' Reset Msg to contain Title for new page ' Append this current line, ignoring character "'" msg = msg & Margin & Mid(theList.List(i), 2) & vbCrLf Else ' Blank page so far - so just appending this line, ignoring character "'" msg = msg & Margin & Mid(theList.List(i), 2) & vbCrLf End If Else ' Normal line - just keep appending it to Msg msg = msg + Margin & theList.List(i) & vbCrLf End If theList.Selected(i) = False ' Clear highlight of selected line, ie. deselect it If NumLines > MaxLinesPerPage Then ' Start new page if page already full If PageNo > 1 Then ' Insert page number at the bottom, except for first page

99

msg = msg + vbCrLf & Space$(35) & "Page-" & CStr(PageNo) End If Printer.Print msg ' Output all data of this page Printer.NewPage ' Send new page. NumLines = 0 PageNo = PageNo + 1 msg = Title End If End If Next i End If ' Get here after going thru all lines in the listbox If NumLines > 0 Then ' complete the last page by inserting page number For i = NumLines To MaxLinesPerPage msg = msg & vbCrLf Next i If PageNo > 1 Then msg = msg + vbCrLf & Space$(35) & "Page-" & Str$(PageNo) End If Printer.Print msg ' Output all data of this page End If If HasSome Then Printer.EndDoc ' Initiate the actual Print. Else Beep MsgBox "Nothing to print, try selecting a range of lines first" End If Screen.MousePointer = vbDefault ' Change mousepointer shape back to normal End Sub Ta gi PrintList in nhng Items c selected trong Listbox lstNames nh sau: Private Sub CmdPrint_Click() PrintList lstHexadecimal, True, "*** EVENT LOG IN HEX ***" End Sub

Thm Horizontal Scrollbar vo Listbox


C l bn thy c hai Listboxes lstASCII v lstHexadecimal u c Horizontal Scrollbar pha di. By default, Listbox khng c Horizontal Scrollbar. Mun to ra n bn phi thm hai cu di y vo mt Basic module: Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Global Const LB_SETHORIZONTALEXTENT = &H194

100

K trong Sub Form_Load gi Function SendMessage qua Application Programming Interface (API) yu cu Listbox cho hin ra Horizontal Scrollbar. Dim VLong As Long ' make a horizontal scrollbar for both Listboxes VLong = SendMessage(lstAscii.hwnd, LB_SETHORIZONTALEXTENT, lstAscii.Width, ByVal 0) VLong = SendMessage(lstHexadecimal.hwnd, LB_SETHORIZONTALEXTENT, lstHexadecimal.Width, ByVal 0) Bn c th download source code ca program Eventlog.zip ny c y . Trong bi ti ta s hc thm cc p dng cn li ca ListBox. Listbox

Search trong Text File


Ta bit rng ListBox c th cha rt nhiu hng text (con s hng ti a l 65535). Ta quen vi vic hin th content ca mt text file trong mt Listbox. Ta dng ListBox display cc Events (s c) xy ra trong real-time. Gi d, ta ghi li tt c mi Events xy ra trong real-time ca mt h thng an ninh, tc l ta bit ai ra, vo ca no, lc my gi. Cc Events ny va uc log xung mt Text file, va c cho vo mt ListBox lun lun hin th Event mi nht cui ListBox. Khi c mi Events nm trong ListBox, ta c th Search (tm kim) xem mt ngi no i qua nhng ca no ca building bng cch iterate qua tng hng trong ListBox v nhn din mt Text Pattern hng vi Function InStr. Trong bi mu di y, ta nh tn ca mt ngi vo trong TextBox ri click nt Find v sau Find Next highlight nhng Events trong ListBox cho thy nhng lc tn ngi xut hin. Trong khi tm kim mt Text Pattern ta c th cho php c ch Hoa , ln ch Thng bng cch covert mi text ra Uppercase trc khi lm vic vi chng.

101

Listing ca Sub Find_Click nh sau: Private Sub CmdFind_Click() Dim i, ALine, FText ' Get out if the Listbox is empty If EventList.ListCount = 0 Then MsgBox "There 's no text available" Exit Sub End If ' Check if user has entered the Text Pattern If Trim(txtFind) = "" Then MsgBox "Please enter the Text Pattern to search for" Exit Sub End If ' Clear all selected lines For i = 0 To EventList.ListCount - 1 EventList.Selected(i) = False Next ' Convert the Text Pattern to Uppercase FText = UCase(txtFind.Text) ' Iterate through every line in the ListBox For i = 0 To EventList.ListCount - 1 ' Convert this line to Uppercase ALine = UCase(EventList.List(i)) ' If pattern exists in this line then highlight it If InStr(ALine, FText) > 0 Then EventList.Selected(i) = True ' Highlight the line ' Mark Current line as the Starting line for FindNext operation If i < EventList.ListCount - 1 Then CurrentLine = i + 1 ' get out Exit Sub End If Next ' Only get here if Not found MsgBox "Not found!" End Sub Trong bi ny ta c dng mt DriveListBox cho User chn mt Disk drive, mt DirListBox user chn mt Folder/Directory v mt FileListBox hin th tn ca nhng Files trong mt Folder. C ba loi ListBoxes ny lin kt nhau cho ta thy s thay i n nhp mi khi User i t Disk Drive ny qua Disk Drive khc, hay t Folder ny qua Folder khc. Cc hng codes thc hin vic ny rt n gin nh sau: Private Sub Drive1_Change()

102

' Make Path of Folder same as new Drive Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() ' Make Path of FileList same as new Path of Folder ' The filenames in the Folder will be displayed automatically in FileListBox FileList.Path = Dir1.Path End Sub

Ta c th ch n l a ch nh ng Filenames c m t Extension no (th d nh log) b ng cch cho Property Pattern c a FileListBox value "*.log". M i khi User click ln tn c a m t File, program s load content c a File y vo ListBox EventList bn ph i. Sau khi selected m t s hng r i, User c th ho c Print chng ra b ng cch Click nt Print, ho c Copy chng vo Clipboard b ng cch Click nt Copy. Dng ItemData
Nu Property List ca ListBox c xem nh mt Text Array th ItemData l mt Number Array, v List1.ItemData(i) i cp vi List1.List(i). Tc l trong khi List1.List(i) hin th nh mt trc ca mt tm bn th List1.ItemData(i) c coi nh nm mt sau ca tm bn y. Khi mt List item thay i v tr trong Listbox v c s bin i trong ListBox (th d Items b removed hay c cho thm vo) th ItemData ca List item cng i theo vi n. Ta th xem th d sau. Cho vo mt Sorted Listbox tn ca cc nhn vin trong s. Ngay sau khi tn mt nhn vin c cho vo Listbox th Property NewIndex cha v tr ca item mi c cho vo y trong ListBox. Ta dng gi tr NewIndex assign ItemData vi S nhn vin ID. Khi User clicks ln mt tn trong Listbox, program s hin th c S nhn vin ID ln tn nhn vin. th th d ny, bn c th Paste phn code di y vo phn Declaration ca mt Form c cha mt Listbox v mt Label. Nh set property Sorted ca List1 ra True.

Private Sub Form_Load() ' Fill List1 and ItemData array with ' corresponding items in sorted order. List1.AddItem "John Green" ' Add an employee name ' Use NewIndex to synchronise with Employee ID ' Assign Employee ID to ItemData of the List Item

103

List1.ItemData(List1.NewIndex) = 62310 List1.AddItem "Tran The Tam" List1.ItemData(List1.NewIndex) = 42859 List1.AddItem "Alan Bradshaw" List1.ItemData(List1.NewIndex) = 63732 List1.AddItem "Peter Costello" List1.ItemData(List1.NewIndex) = 34127 End Sub Private Sub List1_Click() ' Fetch the employee number Msg = List1.ItemData(List1.ListIndex) & " " ' Concatenate it with the employee name. Msg = Msg & List1.List(List1.ListIndex) ' Assign string to Label to display Label1.Caption = Msg End Sub

Dng ListBox lm Queue


Khi i coi ht, ta thng phi ng sp hng mua v. Ci hng gi l Queue. Mc ch ca vic dng Queue l cho s ngi ng cn mt dch v s c phc v ln lt theo th t ai n trc s c gii quyt trc. Nguyn tc ca Queue nh th c gi l First-In-First-Out ( vo trc nht, ra trc nht). Ngc li, nu ai cng mun c phc v trc nht ta s c s no lon, v rt cuc c th chng c ai c gii quyt. Th d ta c mt Form tn frmServer, m trong c mt Listbox tn List1. Nu c nhiu Forms khc trong cng mt chng trnh mun nh frmServer phc v mt chuyn g, chng s Queue bng cch Add mt Item vo cui List1. Trong Item c cha nhng chi tit m frmServer s cn bit phc v. Private Sub CmdAddToQueue_Click() Dim myRequest As String Dim PersonId As String * 5 Dim PersonName As String * 20 ' Assign PersonId to fixed length text PersonId = txtPersonId.Text ' Assign PersonName to fixed length text PersonName = txtPersonName.Text ' Concatenate Id and Name myRequest = PersonId & PersonName ' Queue the request frmServer.List1.AddItem myRequest End Sub Bn frmServer, c mi 3 giy n s Remove Item trn ht ( tc l Index=0) trong List1 v x l Item y. Trong bi ny ta ch Remove Item 0 ri Add n vo List2.

104

Private Sub Timer1_Timer() Dim Item If List1.ListCount > 0 Then ' Look at the item at the head of the queue Item = List1.List(0) ' Process Item - just add it to List2 here List2.AddItem Item ' Remove item from queue List1.RemoveItem 0 End If End Sub

CheckBox Listbox
Nu bn chn value ca Property Style ca Listbox l CheckBox thay v Standard th mi items trong Listbox s c mt hp vung pha trc User c th chn lc chy program. Hp vung ca item no c checked (nh du) th Item y c Selected. Gi s ta c mt Listbox List1 vi Style Checkbox v c nhiu Items mua trong siu th. Khi chy progarm user chn mt s items ri click nt Process, program s hin th cc item c chn. Listing ca Sub CmdProcess_Click nh sau: Private Sub CmdProcess_Click() Dim Mess As String ' get out if there's nothing in the list If List1.ListCount = 0 Then Exit Sub ' Iterate through every item of the checkBox Listbox For i = 0 To List1.ListCount - 1 ' If item is selected then include it in the shopping list If List1.Selected(i) Then ' Append Item and a Carriage Return-LineFeed Mess = Mess & List1.List(i) & vbCrLf End If Next

105

' Display shopping list MsgBox Mess, vbInformation, "Selected Shopping Items" End Sub

Listbox vi nhiu ct
Listbox c mt Property gi l Columns. Bnh thng, Property Columns c gi tr 0. Nhng nu bn cho n bng 3 chng hn, th Listbox s c gng hin th 4 ct trong phm vi chiu ngang ca Listbox. Nu nh th vn khng hin th ht mi Items trong Listbox th s c mt Horizontal Scrollbar hin ra, v khi bn click n qua bn phi Listbox s cho hin th thm cc columns cn li.

Combobox Combobox rt ging nh Listbox. N l tp hp ca mt Textbox nm pha trn User cho vo data v mt Listbox cha cc items m User c th la chn khi m n ra. Combo box cng c nhng methods nh Clear, AddItem v RemoveItem. Tuy nhin, Combobox khng c Property Selected, v khi User chn Item no th Item y c hin th trong Textbox pha trn. Combobox c 3 styles. Drop-down Combo Style l thng dng nht. N cho User nhim hoc chn mt Item t List hoc nh data vo Textbox. Trong hnh di y User nh vo ch Elephant thay v chn t cc Items c sn.

106

Drop-down List bt buc User phi chn mt trong nhng Item nm trong List, ch khng c nh data mi vo Textbox. Ngay c trong lc chy program (at run-time) bn cng khng th Assign mt value vo property Text ca Combobox loi ny. Nhng bn c th lm cho Combobox hin th Item th 3 chng hn bng cch set property ListIndex ca Combo bng 2

Chng Tm - T to Object
T 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 Users click mt Button hay Listbox, .v.v.. Ni chung, cch y cng hu hiu trin khai, nhng nu ta c th hng c cc li ch sau y th cng tt hn na: 1. 2. 3. 4. 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

Mi ln dng li code, nu y nguyn xi con l l tng. Vic y c gi l Reusability. Ni cho ng ra, dng li c tht s l khi ta ch cn dng object code, l code c compiled ri, tc l hon ton khng ng n source code. V h cho php User sa source code l to c hi cho bugs xut hin, ri li phi debug mt ln na. S thch chnh ca vic trin khai mt d n phn mm ln l thc hin ng thi hn (on time), khng l ti kha (within budget) v d bo tr (ease of maintenance). Mun t c cc mc tiu y, ta phi trin khai nhanh v lm sao cho chng trnh t c bugs, d bo tr. Gi d bn ng ra t chc mt m ci. Th tng tng bit bao nhiu chuyn phi lm: t danh sch quan khch, thip mi, m thc, xe c, chp hnh, quay phim, vn ngh cho n th tc nghi l, tip tn, hot no vin ..v.v.. Nu ch mt mnh bn lo tht khng bit lm sao nh cho ht. Cng may l nh hng s m trch lun c vic in n thip mi, ban nhc vn ngh v c hot no vin. Th tc nghi l th khng ai qua c bc Su t, v bc nhn li mua qu cp, lo v tip tn, xe c v th tc, nghi l. Bc cng s lin lc vi Mc s ch l dn ch nh th v sp t ngi git chung v ngi n. Anh T Thng c ngi bn lm ch tim hnh, nn anh nhn trch nhim mn ngi lo chp hnh, quay phim. Nh th vic bn t chc ci m ci nay rt li ch cn son danh sch quan khch, cc bi din vn, sp ch ngi v dn ch cho cp v chng mi i hng tun trng mt. S d bn cm thy trch nhim t chc khng nng n v nh hng, bc Su t v anh T Thng t lo gnh vc cc khu rc ri. Ci hay y l nhng ngi ny t lo quyt nh mi chi tit ca nhng g cn phi lm trong khu ca h. Ch khi no cn lm, h mi lin lc ly kin ca bn. H ging nh nhng ngi thu ca bn. Chc bn lu rng ci th d t chc m ci ny cho thy ni chung mun trin khai d n ln no ta cn phi nh nhng ngi thu gip . Qu tht, l cch cc qun tr vin nhng cng trnh lm t xa n nay. By gi tr li chuyn lp trnh, phi chi ta c th t chc cch trin khai d n phn mm ging nh t chc ci m ci ni trn th tt qu. Tht ra, khng phi cc l thuyt gia phn mm khng ngh

107

n chuyn y trc y, nhng thc hin c vic y ngi ta cn trin khai cc phng tin, dng c thch hp. Ch trong vng 15 nm tr li y, vic y mi tr nn c th qua cc Operating Systems tinh vi, nht l dng Windows, v cc ngn ng lp trnh nh Eiffel, SmallTalk, C++ .v.v.. Lp trnh theo hng i tng (Object Oriented Programming) Ni mt cch nm na, 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 ngi thu ngoi i vy. Chc c l bn s hi th th cc Sub hay Function m bn tng vit x l tng giai on trong chng trnh c th m trch vai tr ca mt thu khng? Ngi thu chng nhng c th lm c cng tc (Subs v Functions) g m cn chu trch nhim lun c mi th vt dng cn thit (data) cho vic y na. 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 t khi gim th chng, 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 dng lu nay. Ly th 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. Cng ging nh B T Cho Lng v D Su Bnh Tm l cc thc th ca Class u Bp. 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 Trong trng hp ny tht ra frmMyForm tuy l mt Class nhng c dng y nh mt Object. Ch nu mun, ta c th to ra hai, ba Objects ca Class frmMyForm cng mt lc 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 trn ta declare 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 bn thy trong VB6 t dng hai t Class v Object ln ln nhau. u ny cng khng quan trng, min l bn nm vng ngha ca chng.

108

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 User 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. Bn 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.

Bn 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:

109

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

110

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) Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), Canvas.BackColor, B End Sub Class clsBox c 4 Properties: X, Y, Width v Height. Ta s instantiate mt Box t clsBox. Mi Box c ta (X,Y) v kch thc chiu rng v chiu cao (width, height) ca n. Tht ra ta c th dng Public statement declare 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 (th d: myBox.X = 80 ). Nhng khi chng trnh x l assignment statement y, n s execute mt loi method (ging nh Sub) gi l Property Let X (vValue). Ta thy y vValue c assigned cho mX (i.e. mX = vValue ), 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. Bn c nh trong khi thit k mt Label, mi ln bn 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 redisplay.

111

Ngc li, khi ta dng property X ca Object myBox, khng phi ta ch c tr s thi m cn execute c ci method Property Get X. Ni tm li, Property cho ta c hi execute mt method mi khi User c hay vit tr s variable y. Th d nh nu ta mun kim 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. Th 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, bn c th sa Sub DrawBox li mt cht nhn mt Optional draw color nh sau:

112

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 th 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:

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.

113

cho chng trnh th v hn, khi user clicks nt Animate, ta s cho mt box mu chy t tri qua phi. Khi user 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.

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

114

Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), fColor, B End If RaiseEvent Draw(mX, mY) End Sub

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 s ip bo co mt hp va c v u.

Khi chy program, mi ln mt clsBox object executes Sub DrawBox ta s thy frmClass display mt message ging nh di y.

115

Nh rng, ta declare mt Object vi WithEvents khi ta mun handle cc Events ca n. Trong th 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 (th d nh TextBox, ListBox, Timer .v.v..), bn cng c th declare Object y WithEvents n c th handle Events ca Object. Trong th d di y ta vit codes ny trong mt Class c giao cho mt Textbox khi form 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 within the Class Object End Sub

Chng Chn - Debug


Bugs l nhng li lm ca program m ta pht hin khi chy n. Debug l cng vic loi tt c nhng li lm trong chng trnh n chy m xui trong mi hon cnh. Thng thng mun fix 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: 1. Hoc l program khng lm ng chuyn cn phi lm v programmer hiu lm Specifications hay c cho tin tc sai lc, hoc l program 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. 2. Program khng thc hin ng nh programmer mun. Tc l programmer mun mt ng m bo chng trnh lm mt ng v v tnh khng vit lp 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.

116

Trong hng xe hi ngi ta dng t Quality Control ni n vic ch ra chic xe khng c li lm g c. t mc tiu y, chng nhng cn c ngi kim phm m chnh cc nhn vin lp rp thn trng cng vic chnh ca ngi kim phm l xc nhn kt qu tt ch khng phi tm li lm. C nhiu yu t nh hng n cht lng ca mt program nh chc nng ca program, 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 trc trong mi giai on trin khai. Chc nng ca chng trnh (Program Specifications) Du program ln hay nh, trc ht ta phi xc nhn 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 programmers hiu lm iu khch hng mun. Kh nht l lc gn giao hng mi khm ph ra c nhiu im trong chng trnh khch mun mt ng m ta lm mt ng. 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). Cu trc cc b phn Program no cng c mt kin trc tng t nh mt cn nh. 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 s 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 k hoch cho nhng trng hp bt ng, in hnh l bad data - khi user bm lung tung hay database cha rc rn. Nu chng trnh chy trong real-time (tc l data thu nhp qua Serial Comm Port, Data Acquisition Card hay mng), bn cn phi lu nhng trng hp 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 (din tin ca nhng hon cnh) c th th tng giai on v tnh hung. Ngy nay vi k thut 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. K thut lp trnh Cn bn ca programmers 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 chnh chn th sau ny bugs li ra khp ni l chuyn t nhin. Dng Subs v Functions

117

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. Th d nh cng vic trong mt tim git i c th gm c cc bc sau: 1. 2. 3. 4. 5. 6. 7. 8. Nhn hng Phn chia tng loi Ty Git i V bao Tnh tin Giao hng

Trong cc bc 1,2,6 v 8 c th l nhng Subs. Cn cc bc 3,4,5 v 7 nhng Functions, th d nh khi ta giao cho Function Git mt ci o d ta s ly li mt ci o sch. 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 pass cho n ByRef. Nhc li l khi ta pass mt parameter ByVal cho mt Sub th ging nh ta a mt copy (bn sao) ca variable cho Sub, Sub c th sa i n nhng n s b b qua, khng nh hng g n original (bn chnh) variable. Ngc li khi ta pass 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 bn nn dng ByVal khi pass n nh mt parameter vo mt Sub/Function. Tht ra, bn c th dng ByRef cho mt parameter pass 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 bn tht s mun vt ngoi qui c thng thng th nn Comment r rng cnh co ngi s c chng trnh bn sau ny. Ngoi ra, mi programmer thng c mt Source Code Library ca nhng Subs/Functions ng . Bn nn dng cc Subs/Functions trong Library ca bn cng nhiu cng tt, v chng c th nghim ri. 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 bn 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 mch nc no khng. Ngh programming ca chng ta s gp Errors nh n cm ba, nn bn phi tp bnh tnh i din vi chng. Dng Comment (Ch thch) Lc vit code nh thm Comment y bt c khi no tr li c on code y trong tng lai bn 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.

118

Nh th khng nht thit bn phi vit rt nhiu Comment nhng h c im no khc thng, b him th bn cn thng bo v gii thch ti sao bn 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 sot chng hn. Tnh ra trung bnh mt programmer ch lm vic 18 thng mi ch. Tc l, gn nh chc chn code bn 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. t tn cc variables c ngha Kh nht l lm vic vi cc variables c tn vn tt nh K, L, AA, XY. Ta khng c mt cht nim chng l ai, hin hu 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 bn mun ni n global variable trong hon cnh y bn s dng lm local variable. Dng Option Explicit Bn nn trung tn dng Option Explicit u mi Form, Class hay Module. Nu c variable no nh vn trt VB6 IDE s cho bn bit ngay. Nu bn khng dng Option Explicit, mt variable nh vn trt c xem nh mt variable mi vi gi tr 0 hay "" (empty string). Ni chung bn nn thn trng khi assign mt data type cho mt variable vi data type khc. Bn phi bit r bn ang lm g khi b phn ng ph (side effect). 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. 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, bn 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. 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 vn tc. Sau khi bn click OK, chng trnh s ngng. Nu bn chy chng trnh trong VB6 IDE, bn c dp bo program ngng trong source code ch c Error bng cch bm button Debug trong Error Dialog. Tip theo bn c th tm hiu tr s cc variables on nguyn do ca Error. Do , nu bn bt u cho dng mt program bn vit trong s, nu tin th trong vi

119

tun u, thay g chy EXE ca chng trnh, bn chy source code trong VB6 IDE. Nu c bug no xy ra, bn c th cho program ngng trong source code debug. Khi bn 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 t ci ch ri bin mt, rt l "qu" vi khch hng. 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 u t u debug. Do , d nhin trong lc debug ta khng nn dng n, nhng trc khi giao cho khch hng bn nn cn nhc k trc khi dng. Dng Breakpoints Cch hay nht theo di execution ca program l dng Breakpoint lm cho program ngng li mt ch ta mun trong code, ri sau ta cho program bc tng bc. Trong dp ny ta s xem xt tr s ca nhng variables coi chng c ng nh d nh khng. Bn on trc execution s i qua ch no trong code, chn mt ch thch hp ri click bn tri ca hng code, ch du chm trn nh trong hnh di y:

Nu bn click ln du chm trn mt ln na th l hy b n. Mt cch khc t mt breakpoint l editor cursor ln hng code ri bm F9. Nu bn bm F9 ln na khi cursor nm trn hng th l hy b break point. Lc program ang dng li, bn 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 bn c th lm trong lc ny. Bn c th nm du chm trn ko (drag) n ngc ln mt hay nhiu hng code n s execute tr li vi hng code. Bn cho program execute tng hng code bng cch bm F8. Menu command tng ng vi n l Debug | Step Into. S c

120

lc bn khng mun program bc vo bn trong mt Sub/Function m mun vic execute mt Sub/Function nh mt bc n gin. Trong trng hp , bn dng Menu command Debug | Step Over hay Shift-F8.

Nh l cho program chy li bn bm F5, tng ng vi Menu command Run | Continue. C khi bn mun program ngng gia mt For Loop khi Iterator value c mt tr s kh ln. Nu ta sn mt breakpoint ri c bm F5 nhiu ln th hi bt tin. C mt mnh li 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 bn dng Menu command Debug | Clear All Breakpoints. tin vic debug, bn 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:

121

Dng Immediate Window Immediate Window cho php ta execute nhng VB statement strong khi program 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" bn cng c th nh "? ICounter". Nh l mi VB Statement bn nh trong Immediate Window s c executed ngay khi bn bm Enter. Bn c th dng li bt c VB statement no trong Immediate Window, ch cn bm Enter cui hng y. Theo du chn chng trnh (Tracing) i khi khng tin ngng program nhng bn vn mun bit program ang lm g trong mt Sub. Bn c th gia code ca mt Sub/Function mt statement ging nh di y: Debug.Print Format ( Now,"hh:mm:ss ") & "(Sub ProcessInput) Current Status:" & Status program hin th trong Immediate Window value ca Status khi n execute bn trong Sub ProcessInput lc my gi. C mt cch khc l thay v cho hin th trong Immediate Window bn cho vit xung (Log) vo trong mt text file. Di y l mt Sub in hnh bn 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

122

' 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 Dng Watch Window i khi bn mun program 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 bn khng bit ti sao mt variable t nhin c mt tr s nh vy. Cu hi: Ai l th phm? . Th d bn mun program ngng li khi ICounter = 15. Bn c th dng Menu command Debug | Add Watch. VB6 IDE s hin th dialog di y. Bn 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 program ngng khi ICounter bng 15.

123

Dng Phng Php Trit Khai (Elimination Method) C mt phng php rt thng dng khi debug l Comment Out nhng hng code nghi ng xem bug c bin mt khng. N c gi l Elimination Method. Nu bug bin mt th nhng hng code c comment out l th phm. Bn c th Comment Out mt s hng cng mt lc bng cch highlight cc hng y ri click Comment Block trn Edit ToolBar.

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

Chng Mi - Dng Menu


Menu trong Windows l ni tt c cc commands ca mt program 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 nh. Nm dc theo chiu ngang l Menu Bar, nu ta click ln mt command trong Menu Bar th program s th xung mt menu vi nhng MenuItems nm dc theo chiu thng ng. Nu ta click ln

124

MenuItem no c du hnh tam gic nh bn phi th program s popup mt Menu nh trong hnh di y (khi ta click Format | Make Same Size):

Main Menu Ta dng Menu Editor to hoc sa mt Menu cho program. 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.

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 , bn 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.

125

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

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

126

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. Nu mun cho User dng Alt key x dng Menu, bn nh thm du & trc character bn mun trong menu Caption. Th d Alt-F s th xung Menu ca Menu Command File. Nu bn t cho MenuItem &Open tn mnuOpen, th khi bn 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 th d trn ta nh thm mt Statement hin th mt message n gin "You clicked mnuOpen". Bn 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. Bn c th nht mt Menu Separator bng cch cho Caption n bng du tr ( - ). Ngoi Alt key ta cn c th cho User dng Shortcut ca menuItem. cho MenuItem mt Shortcut,

127

bn chn cho n mt Shortcut t ComboBox Shortcut trong Menu Editor. Trong hnh di y ta chn Ctrl+O cho mnuOpen.

By default, menuItem c Enabled v Visible. Lc thit k bn c th cho MenuItem gi tr khi u ca Enabled v Visible bng cch dng Checkboxes Enabled v Visible. Trong khi chy program (at runtime), bn 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 user khng dng c. Bn dng cc du mi tn ch ln v xung di chuyn MenuItem c selected ln v xung trong danh sch cc MenuItems. Bn 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.

128

Pop-up Menu i vi User, 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 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 User Right click trn Form, mnuEdit s hin ln. Nu bnh thng bn khng mun cho User dng n trong Main Menu th bn 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:

129

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 bn mun cho mnuEdit bnh thng l invisible, bn 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.

Cha menu Settings trong Registry Gi t program bn cho User mt Option WordWrap nh di y:

Bn mun Program nh Option m User chn, ln ti khi User khi ng program 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. Bn c th Edit trc tip tr s cc Keys trong Registry bng cch dng Registry Editor.

130

Trong program ny ta cng nhn tin bt program nh lun v tr ca Form khi program ngng li, ln ti khi User khi ng program th program 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 Ta ca program. Thng thng n l tn ca VB Project, nhng bn c th sa n trong Project Property Dialog (Tab Make) :

131

Khi cha value ca mt th g (ta gi l Key) vo Registry bn 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 program 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 program 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 (bn nh vo Textbox Index). Ta s dng Captions ca chng hin th tn cc Files.

132

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 |. Th d: "LattestFileName.txt|OldFileName.txt|OldestFilename.txt" Mi ln User 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.

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

133

myRecentFiles.Init Me

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 |. ' Author: Le Duc Hong http://www.vovisoft.com ' 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 = "|" UpdateMenu End Sub

134

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() ' Display the most recent Filenames in the menu Dim i As Integer ' If there is no FileNames to display 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 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

135

Next End If End Sub Bn c th chy Line Command RegEdit sau khi click Start | Run

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

Chng Mi Mt - Dng Dialogs


Dialogs (giao thoi) c dng hin th tin tc v nhn mouse hay keyboard input t users ty theo tnh hung. Chng c dng tp trung s ch ca users vo cng tc ng thi ca program nn rt hu dng trong cc chng trnh ca Windows.

136

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: 1. 2. 3. 4. Message Boxes Input Boxes Common Dialogs Custom Dialogs

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

Trong trng hp ny user c th click mt trong 3 buttons. Nu click Yes th s xc tin vic lu tr h s trc khi kt thc program MSWord. Nu click No th MSWord s lng l kt thc. Nu click Cancel th c ngha user i vic chm dt program 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 th d MSWord bn trn Constant ca icon v buttons l vbExclamation + vbYesNoCancel

137

(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. Khi mt Message Box c m ra, c program ngng li v i user 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 program. Sau khi user click mt button, Message Box s bin mt v program s tip tc chy t hng code ngay di hng MsgBox. Trong th d trn ta dng MsgBox nh mt Sub, nhng ta cng c th dng MsgBox nh mt Function bit user va mi click button no. Function MsgBox returns mt value (tr v mt gi tr) m ta c th th bit theo thi hnh. Th 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:

138

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

Bn c th hin th Text message trong Message Box thnh nhiu hng 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" Nu bn thy mnh thng dng MsgBox vi cng mt icon v nhng buttons, nhng c Text message khc nhau, bn c th vit mt Global Subroutine trong .BAS module dng li nhiu ln. Th d bn 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 bn 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 user mun bn lu tr tt c mi errors xy ra lc run-time, bn ch cn thm vi hng code trong Sub DisplayError vit Error message vo mt text file.

Input Boxes Vi Message Boxes, user ch c th click ln mt button. i khi ta mun user 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 user v khng hin th mt icon. Th d:

139

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 user ch cn click nt OK l . Hai parameters cui cng l Optional (nhim , 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.

Input Box c hai dng Functions:


InputBox$ - returns mt String ng hong InputBox - returns mt String nm trong Variant variable Nu bn click nt Cancel th returned Value l empty string, bn c th test empty string nhn din trng hp ny. Di y l mt th 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"

140

End If Else MsgBox "Oh oh! - please type your age!", vbCritical + vbOKOnly, "Input Error" End If End Sub Khi no nn dng Input Boxes Mc du Input Boxes rt d dng, trn thc t rt t khi ta dng n v nhng l do sau y:

Ta khng th lm g c trong lc user input data, phi i sau khi user 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 user. Input Boxes ch cho ta nh vo mt text string duy nht. Nhiu khi ta mun user nh vo nhiu th nn cn phi c mt form ring. Sau cng, Input Boxes xem khng p mt. Program dng Input Boxes c v nh khng chuyn nghip, do ta cn phi dng Custom Dialogs. Common Dialogs Bn c thy hu nh mi programs trong Windows u c cng nhng dialogs Open v Save files ? V hu nh tt c programs 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 program 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:

141

Tn Open File Save File Color Font Print Help

Method ShowOpen ShowSave ShowColor ShowFont ShowPrinter ShowHelp

Open v Save File Dialogs Bn 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" Exit Sub End If End Sub

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

142

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

Bn c th chn folder no ty bng cch di chuyn t folder ny qua folder khc hay thay i disk drive. Nu bn click vo bn phi ca combobox File of type, n s dropdown cho thy bn c th chn mt trong hai loi Files nh lit k trong statement: .Filter = "Executables (*.exe) | *.exe| Batch Files (*.bat)| *.bat"

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

143

V ta cho .CancelError = True nn nu user click Cancel program 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 th d trn ta nh ngha cc properties ca CommonDialog1 bng code. Bn cng c th dng Properties Windows nh ngha chng nh di y:

144

Ngoi ra, bn 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, bn c th nh cc tin tc nh sau:

145

Color Dialog Color Dialog cho user mt cch chn mu rt d dng. Ngoi nhng mu c sn, user 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.

Bn 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, bn click button Add to Custom Colors, mu y s c cho thm vo nhm Custom Colors nm pha di, bn tri.

146

Ta dng method ShowColor hin th Color Dialog. Sau khi user chn mt mu ri, ta c th trc tip assign n cho property ForeColor hay BackColor ca mt control. Trong th d di y ci mu m user 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 displayed, 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 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 Tr s 1 Hiu qu Ch hin th cc Fonts printer h tr

147

cdlCFPrinterFonts cdlCFBoth cdlCFScalableOnly

2 3 &H20000

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 bn ci vo my

Nu bn mun cho user nhim chn mu th thm 256 vo tr s ca Flags.

Di y l code cho user 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

148

.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 bn qun cho Flags mt trong nhng hng s ni trn program s cho mt Error message nh sau:

Print Dialog Print Font cho ta mt giao din cng ging nh trong Microsoft Office chn nhng nhim 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 trang no ca document v in bao nhiu copies. Ch c iu phi lu l nu user 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 user 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 user chn cc nhim ca Print Dialog l Copies, FromPage v ToPage. cho user cc default values ca nhng properties ny, bn c th sn cc tr s trc khi hin th Print Dialog.

149

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

150

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

Custom Dialogs Nhiu khi Message Box, Input Box hay cc dng Common Dialogs vn khng thch hp cho hon cnh lp trnh. Trong trng hp y bn c th dng mt Form bnh thng lm thnh mt Dialog cy nh, l vn. 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, ni thng ra l cn thm mt t memory. Sau y ta th trin khai mt Login Form tng qut, c th dng trong nhiu trng hp. Khi khi ng, program ny s hin th mt Login form yu cu user nh vo tn v mt khu. Sau , nu tn v mt khu hp l th ci Form chnh ca program mi hin ra. Cch ta thc hin l cho program 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 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

151

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.

Trong tng lai, bn 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 ging mt Common Dialog:

Ta cho property BorderStyle ca frmLogin l Fixed Dialog. Ta cho Property PasswordChar ca textbox txtPassword bng "*" khi user in mt khu, ta ch thy mt hng du hoa th. Ta cho Property StartupPosition ca form l CenterScreen. Property Default ca button cmdOK l True khi user n phm Enter trong form l coi nh tng ng vi click button cmdOK. Tng t nh th, Property Cancel ca button cmdCancel l True khi user n phm Esc trong form l coi nh tng ng vi click button cmdCancel. Tm thi coding ca event click ca cmdOK v cmdCancel ch n gin nh lit k di y: Private Sub CmdCancel_Click() ' Clear txtUserName and txtPassword txtUserName = "" txtPassword = "" ' Hide the Form to get out of Modal mode Me.Hide End Sub Private Sub CmdOK_Click() ' Hide the Form to get out of Modal mode Me.Hide

152

End Sub

Chng Mi Hai - Dng Ha (Phn I)


Tc ng Anh c cu: "Mt hnh nh ng gi mt ngn ch (a picture is worth a thousand words)", ni khi ta dng hnh nh din t s gip ngi xem hiu nhanh hn khi ta ch c ni thi. Visual Basic 6 c cho ta mt s phng tin v ha (graphics) trang im cho cc ca s phong ph, thn thin, d lm vic vi, v th v. D rng cc phng tin v th ny khng nhanh cho ta vit nhng chng trnh tr chi (games) nhng tng i cng kh nng p ng cc nhu cu cn thit thng thng. Khi ni n ha, ta mun phn bit n vi Text thng thng. Th d ta dng Notepad edit mt bi th trong mt ca s. Trong lc bi th ang c hin th ta c th sa i d dng bng cch dng bn phm nh thm cc ch mi vo, dng cc nt Delete, Backspace xa cc ch. l ta lm vic vi Text. By gi, trong khi bi th cn ang hin th, ta dng mt chng trnh Graphic nh PhotoImpact Capture ca ULead chp ci hnh ca s ca bi th (active window) thnh ging nh mt photo, th ta c mt Graphic. Sau , mun sa i bi th t graphic ny ta phi dng mt graphic editor nh MSPaint, PaintShopPro,.v.v.. Cc ch trong hnh cng c cng dng graphic nh ta thy mt photo, nn mun edit phi dng mt c vi mu sn. Di y l graphic ca mt ca s Notepad sau khi c thm ch g v du chm hi cui bng cch dng MSPaint.

Mu (color) v mn (resolution) Ta ni mt tm hnh tt v n c mu sc so v r rng. Bn c cn nh trong ngy L khai mc Th Vn Hi Moscow, ngi ta cho hin th nhiu hnh rt hay bng cch nh khn gi, trong mt khu hnh ch nht, mi ngi cm a ln mt tm ct-tng mu. Hng ngn tm ct-tng a ln rp li thnh ra mt hnh tuyt p. Mt graphic trong Windows cng gm c nhiu m nh, mi m, c gi l mt pixel, c kh nng hin th 16, 256, ... mu khc nhau.

153

mn (resolution) Thng thng mn (resolution) ca mn nh ta dng l 800x600, tc l chiu ngang c 800 pixels v chiu cao c 600 pixels. Sau ny, xem cc hnh r hn ta cn dng mn 1028x768 vi ct SuperVGA v Monitor tt. Ta ni ct SuperVGA c n 2MB RAM, ti sao phi cn n 2MB hin th graphic p? Nu mu ca mi pixel c biu din bi mt byte d kin th vi mt byte ta c th cha mt con s t 0 n 255. Ngi ta ng vi nhau theo mt quy c rng s 0 tng trng cho mu en, s 255 tng trng cho mu trng chng hn. Nu mn ca mn nh l 1024x768 th ta s cn 1024x768=786432 bytes, tc l gn 0,8 MB. Mt byte c 8 bits. i khi ta nghe ni 16 bit color, ni thay v mt byte, ngi ta dng n 2 bytes cho mi pixel. Nh vy mi pixel ny c kh nng hin th 216 = 65536 mu khc nhau. Mun dng 16 bit color cho SuperVGA, ta cn phi c 1024x768x2 =1572864 bytes, tc l gn 1,6 MB. l l do ti sao ta cn 2MB RAM. Lu l RAM ca VGA (Vector Graphic Adapter) card khng lin h g vi RAM ca b nh computer. Khng ng cc c ng-L ngy xa bit Tin Hc nn ni trc:"Mt hnh nh ng gi mt ngn ch". Ch word thi IBM gm c 4 bytes, nn mt mn nh ng gi 400 ngn ch, nh vy cc c khng chnh xc lm, nhng coi nh ng. Nn nh rng cng mt graphic hin th trn hai mn nh c cng mn, th d nh 800x600, nhng kch thc khc nhau, th d nh 14 inches v 17 inches, th d nhin hnh trn mn nh 17 inches s ln hn, nhng n vn c cng mt s pixels, c iu pixel ca n ln hn pixel ca mn nh 14 inches. Ni mt cch khc, nu ta dng mn nh ln hn th graphic s ln hn nhng khng c ngha l n r hn. Mun thy r chi tit, ta phi lm cho graphic c mn cao hn. Tr li cu chuyn Th Vn Hi Moscow, mun c hnh r hn, th trong cng mt din tch, ta phi nh b con ngi xch li gn nhau khong t cha nhiu ngi hn v mi ngi cm mt tm ct-tng nh hn. Ta thay i Display Properties ca mt mn nh bng cch right click ln desktop ri select Properties, k click Tab Settings ri chn Screen resolution v Color quality ging nh hnh di y:

154

Khi ta tng mn ca mn nh, cc hnh nh s nh li v kch thc ca pixel c thu nh li. Do , ta c th cho hin th nhiu th hn trn desktop. Phm cht ca cc graphic vn khng thay i, mc du hnh nh hn. Nh l mun hnh r hn th khi cu to v cha graphic, ta phi dng mt mn cao. Ging nh khi chp hnh, mun hnh p ta cn ci my chp hnh dng phim ln ca th chuyn nghip v focus k lng, thay v dng my r tin t ng, ch a ln l bm chp c. Mu (color) Khi ta dng ch c mt bit (ch c tr s 0 hay 1) cho mi pixel th ta ch c trng hay en. Lc y ta c th dng mt byte (8 bits) cho 8 pixels. Du vy, nu mn ca graphic cao , th hnh cng p. Th xem cc tuyt tc photos trng en ca Cao m, Cao Lnh th bit. Cc my Fax dng nguyn tc scan hnh giy c A4 ra thnh nhng pixels trng en ri gi qua ng dy in thoi qua u kia ti to li hnh t nhng d kin pixels. Visual Basic 6 cho ta ch nh mt con s vo mi mu VB c th hin th, hay chn trc tip mt mu t Dialog. C bn cch:

Bn ch nh trc tip mt con s hay chn mt mu t ci Palette.

155

Bn chn mt trong cc hng s nh ngha sn trong VB, gi l intrinsic color constants (intrinsic c ngha nm na l cy nh l vn hay in-built), chng hn nh vbRed , vbBlue. Danh sch ca intrinsic color constants ly t VB6 online help c lit k di y:

Dng Function QBColor chn mt trong 16 mu. Function QBColor xut pht t thi Quick Basic (QBasic) ca Microsoft. QBsic l tin thn ca Visual Basic. Trong QBasic bn c th dng cc con s 1,2,3 .. ch nh cc mu Blue, Green, Cyan , .v.v..Function QBColor gin tin ha cch dng mu, user khng cn phi bn tm v cch trn ba th mu cn bn Red, Green, Blue. Bn vit code mt cch n gin nh:

Di y l tr s cc mu ta c th dng vi Function QBColor. Tr s Mu Tr s Mu

156

0 1 2 3 4 5 6 7

Black Blue Green Cyan Red Magenta Yellow White

8 9 10 11 12 13 14 15

Gray Light Blue Light Green Light Cyan Light Red Light Magenta Light Yellow Bright White

Dng Function RGB trn ba mu Red, Green v Blue. Trong ci bng lit k cc intrinsic color constants pha trn, nu bn s thy vbWhite(0xFFFFFF) l tng s ca vbRed(0x0000FF), vbGreen(0x00FF00) v vbBlue(0xFF0000). Mt mu c biu din bng s pha trn ca ba thnh phn mu cn bn, mi mu bng mt byte c tr s t 0 n 255. 0 l khng dng mu y, 255 l dng ti a mu y. H thng s ta dng hng ngy l Thp Phn. Tr s 0xFF ca vbRed l con s 255 vit di dng Thp lc phn (Hexadecimal hay Hex cho gn v y c nh du bng 0x trc con s phn bit vi s Thp phn). Trong h thng s Hex ta m t 0 n 9 ri A,B,C,D,E,F ri qua s hng thp lc 10, 11,.., 19, 1A, 1B, ..1E,1F,20,21..v.v. Tc l thay v ch dng 10 symbols t 0 n 9 trong Thp phn, ta dng 16 symbols t 0 n F. Mun bit thm v h thng s Hex hy c bi C s Nh Phn. Trong hnh di y l mt th d cho thy mu xanh nht c chn gm ba thnh phn Blue(0x990000= 153*256*256), Green(0xCC00= 204*256) v Red(0xFF= 255):

157

Ghi ch: Bn c th dng Windows Calculator hon chuyn s gia cc dng Decimal, Binary v Hexadecimal. Chn View|Scientific thay v View|Standard.

Function RGB p dng Function RGB, ta s vit mt chng trnh VB6. Bn hy khi ng mt chng trnh VB6 mi, b vo mt Label tn Label1 vi Caption Red v mt Vertical Scroll tn VScroll1. K select c hai Label1 v VScroll1 ri Copy v Paste hai ln l thm hai cp. i Caption ca hai Label mi ny ra Green v Blue. By gi ta c mt Array ba Vertical Scrolls cng tn VScroll1, vi index l 0,1 v 2. t mt PictureBox tn picColor vo bn phi ba ci VScrolls. Thm mt Label pha di, t tn n l lblRGBValue, nh clear caption ca n, ng c ch Label1 nh di y:

158

By gi select c ba VScrolls v edit value ca property Max trong ca s Properties thnh 255, ni khi ko ci bar ca mt VScroll1 ln xung ta gii hn tr s ca n t Min l 0 n Max l 255.

Chuyn chnh ta phi lm l vit code x l Event Change ca cc VScrolls. V chng l mt Array nn ta c th dng mt Sub duy nht handle events n t c ba VScrolls. Mi lc mt trong 3 VScrolls thay i tr s ta s trn ba mu Red, Green, Blue biu din bi tr s ca 3 VScrolls thnh mu BackColor ca PictureBox picColor. ng thi ta cho hin th tr s ca ba thnh phn mu Red, Green v Blue trong Label lblRGBValue. Bn hy double click ln mt trong 3 VScrolls ri vit code nh sau:

159

Private Sub VScroll1_Change(Index As Integer) ' Use Function RGB to mix 3 colors VScroll1(0) for Red, ' VScroll1(1) for Green and VScroll1(2) for Blue ' and assign the result to BackColor of PictureBox picColor picColor.BackColor = RGB(VScroll1(0).Value, VScroll1(1).Value, VScroll1(2).Value) ' Variable used to prepare display string Dim strRGB As String ' Description of what is displayed strRGB = "picColor.BackColor = RGB(Red, Green, Blue) " & vbCrLf ' Values of Red, Green, Blue in Decimal strRGB = strRGB & " Decimal: " & VScroll1(0).Value & ", " & VScroll1(1).Value & ", " & VScroll1(2).Value & vbCrLf ' Values of Red, Green, Blue in Hexadecimal strRGB = strRGB & " Hex: 0x" & Hex(VScroll1(0).Value) & ", 0x" & Hex(VScroll1(1).Value) & ", 0x" & Hex(VScroll1(2).Value) ' Assign the resultant string to caption of Label lblRGBValue lblRGBValue.Caption = strRGB End Sub Bn hy khi ng chng trnh ri nm cc bar ca 3 VScrolls ko ln, ko xung xem kt qu. Ca s ca chng trnh s c dng ging nh di y:

Color Mapping Nu dng Hex Calculator i con s 0xFFFFFF ra decimal ta s c 16777215, nu k c s 0 ta s c tng cng 16777216 mu. Lc ny ta bn v 8bit (1 byte) v 16bit (2 bytes) color, nhng y ta ni chuyn 3 byte color. Nh th c th mn nh khng kh nng cung cp mi mu m

160

Function RGB tnh ra. Vy VGA card s lm sao? Th d mt ct VGA ch h tr n 8 bits. N s cung cp 256 mu khc nhau. Nu Function RGB i hi mt mu m VGA card c th cung cp chnh xc th tt, nu khng n s tm cch dng hai hay ba m gn nhau trn mu v cho ta o tng mu ta mun. Cng tc ny c gi l Color Mapping v ci mu c lm ra c gi l custom color. Dng Intrinsic Color Constants Mt trong nhng features ca MSWindows l cho ta chn Color Scheme ca Windows theo s thch. Bnh thng, Color Scheme ca Windows l Blue, nhng ta c th chn Olive Green hay Silver, nu ta mun.

Ch kh ni nu ta dng mt mu m hin th tuyt p th g trong chng trnh VB6 m by gi user t nhin thay i Color Scheme thnh Olive Green chng hn khin cho mu m y coi chng ging ai trong ci Color Scheme mi. trnh trng hp y, thay v ni thng ra l mu g (xanh hay ) ta ni dng mu vbActiveTitlebar hay vbDesktop, .v.v. Dng Intrinsic Color Constant s bo m mu ta dng s c bin i theo Color Scheme m user chn khi b trng hp ci mu tr nn chng ging ai. Lc thit k, ta cng c th chn Intrinsic Color Constant t Tab System khi chn mu.

161

Graphic files Khi mt hnh Graphic c lu tr theo dng s pixels vi mu ca chng nh ni trn th ta gi l mt Bit Map v tn file ca n trong disk c extension BMP th d nh House.bmp. Lu tr kiu ny cn rt nhiu memory v rt bt tin gi i hay hin th trn mt trang Web. Do ngi ta dng nhng k thut gim thiu lng memory cn cha graphic nhng vn gi c cht lng ca hnh nh. C hai dng Graphic files rt thng dng trn Web, mang tn vi extensions l JPG v GIF. c bit vi GIF files ta c th cha c hot ha (animation), tc l mt GIF file c th cha nhiu hnh (gi l Frames) chng ln lt thay nhau hin th, cho ngi xem c cm tng mt vt ang di ng. In trn mn nh VB6 c method Print cho ta in thng trn Form, PictureBox hay Printer. Ba loi control ny c coi nh nhng khung vi m ha s v ln. Bn hy khi ng mt chng trnh VB6 mi. t ln form mt PictureBox tn Picture1 v mt button tn CmdPrintTenLines vi Caption Print Ten Lines. DoubleClick ln button ny v vit code di y: Private Sub CmdPrintTenLines_Click() Dim i As Integer ' String variable used for display Dim strLine As String ' Write 10 lines, one under the other For i = 1 To 10 strLine = "This is line " & CStr(i) Me.Print strLine ' Print on Form Picture1.Print strLine ' Print on Picture1 Next End Sub Bn hy chy th program ri click nt Print Ten Lines. Trong trng hp ny ta dng default Font v Color in 10 hng. Sau mi Print, chng trnh t ng xung hng. K , thm mt button tn CmdPrintFontSizes vi Caption Print Font Sizes. DoubleClick ln button ny v vit code di y:

162

Private Sub CmdPrintFontSizes_Click() Dim i As Integer ' Print numbers 1 to 10, one after the other on the same line For i = 1 To 10 ' Define Font size Me.Font.Size = Me.Font.Size + i ' Define Color using Function QBColor Me.ForeColor = QBColor(i) ' Print without moving to next line. Note the semicolon ";" Me.Print Str(i); Next End Sub Trong Sub CmdPrintFontSizes_Click, ta thay i c kiu ch cho cc con s c in ra ln ln dn dn v thay i mu ca cc con s bng cch dng function QBColor. in cc con s lin tc khng xung hng ta dng method Print vi semicolon (;). Bn hy chy chng trnh li. Click nt Print Ten Lines ri click nt Print Font Sizes, kt qu s ging nh di y:

By gi bn th minimize ca s ca chng trnh, k restore n li kch thc c. Bn s thy cc hng ta in lc ny khng cn trong form hay PictureBox na. L do l khi ta Print ln form hay PictureBox, cc hnh y c v trong graphic a phng ch khng c VB6 k l mt phn ca ca s. Mun trnh tr ngi ny ta phi dn VB6 nh v li bng cch set property AutoRedraw ca form v Picture1 ra True.

163

H thng ta Khi t mt Object hay v mt ci g ln mn nh (screen) hay form .v.v.. ta cn phi ch nh Object y nm ch no k t (with reference to) ci gc Trn Tri (Top Left) ca mn nh hay form. Ci gc Trn Tri l Trung tm ta ca screen hay form. ta X v Y u bng 0, ta vit l 0,0. Nu ta i ln qua phi theo chiu rng ca screen th ta X tng ln. Nu ta i dc xung di theo chiu cao ca screen th ta ca Y tng ln. K n l n v o lng ta dng biu din khong cch. Trong bi trc ta ni n mn ca mn nh (screen resolution) da vo pixel. Ta c th dng n v pixel ni mt Object c ta X v Y mi chiu bao nhiu pixels tnh t trung tm ta . Nh th, ngay c trn cng mt mn nh khi ta tng mn n ln th mt Object c t ln mn nh theo n v pixel s xch qua tri v ln trn mt t v kch thc mt pixel by gi nh hn lc trc mt cht. Hnh di y minh ha cc kch thc ca mn nh v Form.

im cn bit l c nhng phn nh title bar v border ca mt form ta khng th v ln c. Do din tch cn li ca form c gi l Client Area. Chiu rng v chiu cao ca Client Area c gi l ScaleWidth v ScaleHeight.

164

Nu mun khong cch t mt Object n trung tm ta , hay kch thc ca chnh Object, khng h thay i d ta c tng, gim mn ca mn nh hay in hnh ra printer (th d ta mun n lun lun di 5cm chng hn) th ta dng h thng ta theo n v twips ca form. Twips l Default Coordinate System ca VB6. Trong h thng ny mi im l tng ng vi 1/567 centimeter. Do , nu bn v mt dng di 567 twips n s hin th di 1cm trn mn nh, v khi bn in n ra, n cng di 1cm trn giy. Tc l di tht ca Object khng ty thuc vo loi mn nh ( mn cao hay thp) hay printer. Ngi ta ni n l Device independent coordinate system (H thng ta c lp vi dng c). Ni mt cch khc Twips cho ta tht s what you see is what you get (WYSIWYG - thy sao c vy), rt thch hp vi Desktop publishing. Bn c th thay i h thng ta ca mt form bng cch edit property ScaleMode qua ca s Properties nh sau:

Ghi ch: Thay i tr s ScaleMode khng c hiu lc ngay m ch nh hng nhng g c thit k sau . Ging nh khi ta Edit Text trong Notepad, Text Cursor (thanh | chp chp) l v tr hin ti, ni s hin th ci ch ta nh sp ti, trong graphic ta c mt Cursor v hnh, ni s hin th ci g ta sp Print. Ta ch nh v tr ca graphic cursor y bng cch cho tr s ca CurrentX v CurrentY. Bn hy khi ng mt d n VB6 mi v vit code cho Event Resize ca form chnh nh sau:

165

Th chy chng trnh v Resize form. Mi khi bn Resize form, ch X s c di n v tr khong chnh gia ca Client Area ca form.

Dng Graphics c mt cht cn bn v graphics ca VB6, by gi ta c th t nhng graphics ln form. C hai cch lm chuyn y:

Dng Graphical Controls: Ta c PictureBox v Image c th cha hnh nh. Trong khi Line v Shape c th v ng thng hay cc hnh ch nht, trn .v.v.. trn form, lc thit k. Dng Graphics Methods: y l nhng mnh lnh cho ta v trc tip ln form lc run-time. Cc mnh lnh VB6 cho ta l Cls, Pset, Point, Line v Circle.

Ty theo hon cnh, bn c th la chn cch no tin dng. PictureBox v Image Dng PictureBox hay Image l cch d nht hin th mt graphic trong form. Lc thit k, bn c th nh thng tn ca graphic vo property Picture trong ca s Properties. Form cng nhn property Picture. Bn cng c th click ln bn phi ch property Picture browse v chn mt graphic, thng l Bitmap hay Icon.

166

S khc bit ch gia Image v PictureBox l Image c property Stretch m ta c th set thnh True ko dn graphic ra cho chim trn din tch ca Image. Image l mt grapgic control lightweight (nh k), tc l n khng i hi nhiu memory v chy nhanh hn PictureBox. L do l PictureBox l mt container, tc l n c th cha cc controls khc. Ngoi ra, PictureBox cng cho php ta v ln trn n ging nh trn form. Trong hnh di y, trong lc thit k ta t mt PictureBox v mt Image cng mt c ln cng mt form. K ta assign cng mt picture hnh happy.bmp cho c hai. Ring vi Image, ta set property Stretch ca n ra True.

Ch nh hnh nh lc run-time Trong lc program ang chy, ta c th thay i hnh nh cha trong PictureBox hay Image bng cch dng Function LoadPicture. Nh l ta khng th assign trc tip vo Property Picture ca hai graphical controls ny. L do l Property Picture ch l mt cch thn thin cho ta ch nh mt graphic trong lc thit k. Khi mt hnh nh c ch nh ri, VB6 cha c hnh y vo file c cng tn vi file ca form nhng vi extension .frx. Tc l nu tn ca form l Form1 th graphic ca Property Picture c cha chung vi cc graphics khc ca form trong file Form1.frx. Do , v VB6 program cha lun graphic chung vi n, ta khng cn phi nhc n tn ca graphic file khi dng hay deploy, tc l khng cn nh km tn graphic file trong Setup file cho ngi ta

167

install. Di y l code mu lc run-time ta load mt graphic tn sad.bmp nm trong Subfolder tn images ca App.path vo Image control tn Image1. Private Sub CmdLoad_Click() Dim LocalDir As String ' Assign Folder where program resides to LocalDir LocalDir = App.Path ' Append right backslash if last character is not "\" If Right(LocalDir, 1) <> "\" Then LocalDir = LocalDir & "\" End If ' Load graphic "sad.bmp" from SubFolder "images" into Image1 Image1.Picture = LoadPicture(LocalDir & "images\sad.bmp") End Sub D nhin, nu ta mun load graphic lc run-time th phi cung cp graphic file ring. Control Shape Control Shape cho php bn v nhng hnh n gin nh ng thng, hp, vng trn trn form, lc thit k. Sau khi DoubleClick ln control Shape trong Toolbox thm mt control Shape vo form, bn chn loi Shape ca n t ca s Properties ri nm vo mt gc ca Shape trn form drag ln nh ty . Mun sn bn trong mt Shape, bn chn mu t property FillColor. Property FillColor cng ging nh BackColor ca cc controls khc, nhng n ch c hiu lc khi bn cho property FillStyle mt tr s khc hn l 1- Transparent (trong sut), th d nh 0- Solid (dy c).

168

Control Line Tng t vi cc properties Fill ca Shape, i vi Line bn c cc properties BorderColor, BorderStyle v BorderWidth. Border color ch nh mu ca chnh ng thng, BorderStyle cho bn la ng lin tc hay gch chm, v BorderWidth lm cho ng dy to hn. Cc properties ny cng p dng cho chu vi (ng bao quanh) ca cc hnh ch nht, trn .v.v.

Graphics Methods

169

Trong khi cc Graphical Controls nh Shape, Line cho ta v hnh lc thit k th Graphics Methods cho ta v nhng th y lc run-time. Ta cng c th chm tng m (pixel) hay copy c mt Picture t ch ny n ch khc. Ch cn mt cht kinh nghim bn c th lm hot ha (animation) hay to visual effects tuyt diu m khng cn phi ng n Windows API (Application Programming Interface) dng Function BitBlt. Method PaintPicture Method PaintPicture cho php bn copy rt nhanh mt khi d kin ha, ni nm na l mt khu vc trong mt hnh graphic trn form, PictureBox hay Printer n mt ni khc. Th d bn copy mt hnh t ch ny n ch khc trong form, hay t form/PictureBox ra Printer Object mt chc sau bn in n ra. Bn hy khi ng mt d n VB6 mi v DoubleClick ln PictureBox Icon trong ToolBox t mt PictureBox ln form. t tn PictureBox y l picGraphic v set property Visible ca n ra False ta khng thy n lc run-time. By gi load mt hnh vo property Picture ca picGraphic bng cch Browse mt Bitmap file t ca s Properties. y ta chn INTL_NO.BMP t folder \Program Files\Microsoft Visual Studio\Common\Graphics\Bitmaps\Assorted

Trong chng trnh ny ta mun h khi nt tri ca Mouse xung v di chuyn Mouse cursor th khi cursor i n u, hnh INTL_NO c v n . Ta s dng mt Flag nh du nt-tri-ca-Mouse-Down, t tn l flgMouseDown. Khi nhn c Event MouseDown ta set flgMouseDown thnh True, v khi nhn c Event MouseUp ta reset flgMouseDown thnh False. Mi ln nhn c Event MouseMove th nu flgMouseDown l True ta s PaintPicture INTL_NO. xa background ca form, ta thm mt button tn CmdClearForm chy graphic method Cls. Di y l lit k code mu:

170

' Flag that indicates that the Mouse's left button is depressed Dim flgMouseDown As Boolean Private Sub Form_Load() ' Initialise flgMouseDown to False flgMouseDown = False End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' Set Flag flgMouseDown flgMouseDown = True End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) ' Paint picGraphic if flgMouseDown is True If flgMouseDown Then ' Paint full-size picGraphic at Mouse cursor location PaintPicture picGraphic.Picture, X, Y, picGraphic.Width, picGraphic.Height End If End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) ' Reset Flag flgMouseDown flgMouseDown = False End Sub Private Sub CmdClearForm_Click() ' Clear the form Cls End Sub

171

Lu l bn phi declare variable flgMouseDown bn ngoi cc Subs mi Sub u thy v c th dng n. Mun bit thm chi tit v cch dng method PaintPicture, trong VB6 IDE DoubleClick ln ch PaintPicture trong code editor highlight ch y ri bm nt F1. Method PSet
Ta dng method PSet (n t ch Point Set) v mt pixel ln form. Ta cn cho bit PSet u v vi mu g, tc l ta cho n ta X,Y ca pixel v mt mu tnh t function RGB. Di y l code v pixels mu ln form mt cch bt chng (randomly) v v tr v mu sc khi user clicks ln form chnh: Private Sub Form_Click() Dim i As Integer ' Variables for pixel coordinates Dim iXCoord As Integer Dim iYCoord As Integer ' Variable for primary colours Dim iRed As Integer Dim iGreen As Integer Dim iBlue As Integer ' Start the Random number generation Randomize ' Plot 2000 dots randomly For i = 1 To 2000 ' get a random XCoord. ' Note that Rnd(1) returns a real number between 0 and 1, eg: 0.384 iXCoord = Int(Rnd(1) * ScaleWidth) ' get a random YCoord. iYCoord = Int(Rnd(1) * ScaleHeight)

172

' Get a random number between 0 and 254 for each primary colour iRed = Int(Rnd(1) * 255) iGreen = Int(Rnd(1) * 255) iBlue = Int(Rnd(1) * 255) ' Plot the pixel at iXCoord,iYCoord PSet (iXCoord, iYCoord), RGB(iRed, iGreen, iBlue) Next MsgBox ("All done!") End Sub Trong th d trn ta dng method Randomize generate sn trong b nh cc con s real bt chng t 0 n 0.999. Sau mi ln ta gi Function Rnd(1) l n s tr v mt con s real ly bt chng t b s do method Randomize generated. Do , Rnd(1) * ScaleWidth s cho ta mt con s real c tr s t 0 n ScaleWidth. Mun i con s real ra Integer, ta dng Function Int. Khi khi ng chng trnh v Click ln form ta s c hnh ging nh di y:

Mch nc: xa mt m bn Pset li ti ch y mt m mi c cng mu vi BackColor ca form. Method Line


Method Line v mt ng thng t mt ta ny n mt ta khc trong mu do ta ch nh. Vi hai methods PSet v Line ta c th lm c rt nhiu chuyn. Th d mun cho mt vt di ng, ta xa vt y bng cch v li n vi cng mu ca BackColor ca form, ri v vt y v tr mi. Mun v mt a gic nh tam gic hay ch nht ta rp nhiu ng thng li vi nhau, u ca mi ng thng l cui ca ng thng va mi c v trc. Mun sn Shade bn trong mt hnh ch nht ta dng PSet..v.v.

173

C ba cch ch nh ta ca hai u ca mt ng thng ta mun v: 1. Cho bit ta ca u v cui ng thng: th d: Line (50, 100)-(3000, 4000) Khi ng ny c v xong th v tr ca graphic cursor c ta l v tr ca cui ng, tc l CurrentX=3000 v CurrentY=4000 trong trng hp ny. Ch cho bit ta cui ng thng: th d: Line -(3600, 4500), vbMagenta Trong trng hp ny v tr ca graphic cursor (CurrentX, CurrentY) c ly lm ta ca u ng thng khi v. Tc l nu trc khi execute dng code ny CurrentX=3000 v CurrentY=4000 th dng code tng ng vi: Line (3000,4000)-(3600,4500), vbMagenta 3. Dng ch Step ni s khc bit t CurrentX v CurrentY: th d: Line Step(400, 600)-Step(800, -500), vbGreen Nu trc khi execute dng code ny CurrentX=3600 v CurrentY=4500 th dng code tng ng vi: Line (4000,5100)-(4800,4600), vbGreen Trong th d di y, mt hnh tam gic c v bng hai cch coding khc nhau. Khi chy program th, bn hy ln lt click Triangle METHOD I v Triangle METHOD II thy c hai cch v u y nh nhau, ch khc mu thi. Private Sub CmdTrianI_Click() ' Drawing a black triangle: METHOD I Line (700, 500)-(2800, 2400) Line (2800, 2400)-(1800, 900) Line (1800, 900)-(700, 500) End Sub Private Sub CmdTrianII_Click() ' Drawing a red triangle: METHOD II ' Draw a red line from Location(700, 500) to Location (2800, 24000) Line (700, 500)-(2800, 2400), vbRed ' Draw a red line from Location(2800,2400) to Location (1800,900) Line -(1800, 900), vbRed ' Draw a red line from Location(1800,900) to Location (700,500) Line -(700, 500), vbRed End Sub v mt hnh ch nht, cch tin nht l dng Step nh di y: Private Sub Rectangle(ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer)

2.

174

' Draw a rectangle Line (X1, Y1)-(X2, Y1) Line -(X2, Y2) Line -(X1, Y2) Line -(X1, Y1) End Sub Ta cn c th v mt hnh ch nht vi bn gc trn nh sau: Private Sub RoundCornerRectangle(ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer) Const Delta = 50 ' Draw a rectangle with round corner Line (X1 + Delta, Y1)-(X2 - Delta, Y1) Line -Step(Delta, Delta) Line -(X2, Y2 - Delta) Line -Step(-Delta, Delta) Line -(X1 + Delta, Y2) Line -Step(-Delta, -Delta) Line -(X1, Y1 + Delta) Line -Step(Delta, -Delta) End Sub Ta cng c th sn Shade bn trong hnh ch nht bng cch dng method PSet chm cc m cch nhau chng 50 pixels nh sau:

Private Sub Shade(ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer) ' Shade a roundcorner rectangle by plotting dots using method Pset Const Delta = 50 Dim i As Integer Dim j As Integer ' Make sure that X1 is less than X2 ' Swap values of X1, X2 if X1 > X2 If X2 < X1 Then Temp = X1 X1 = X2 X2 = Temp End If ' Make sure that Y1 is less than Y2 ' Swap values of Y1, Y2 if Y1 > Y2

175

If Y2 < Y1 Then Temp = Y1 Y1 = Y2 Y2 = Temp End If ' Plotting dots inside the rectangle at 50 pixels apart For i = X1 + Delta To X2 - Delta Step 50 For j = Y1 + Delta To Y2 - Delta Step 50 PSet (i, j) Next Next End Sub Mun Shade m hn, bn c th chm cc m gn nhau hn, th d cho cch nhau 30 pixels thay v 50 pixels. C mt cch khc l tng tr s ca DrawWidth, dy ca ng v hay m. By gi phi hp cch v hnh ch nht vi method Shade ni trn v method Print ta c th vit ch bn trong mt khung mu nht nh sau:

Private Sub CmdDrawFrame_Click() Dim X1 As Integer Dim Y1 As Integer Dim X2 As Integer Dim Y2 As Integer ' Initialise Coordinates of rectangle X1 = 4200: Y1 = 1000 X2 = 6200: Y2 = 2000 ' Draw a roundcorner rectangle RoundCornerRectangle X1, Y1, X2, Y2 ' Shade the rectangle Shade X1, Y1, X2, Y2 ' Position cursor to Print some text CurrentX = X1 + 50 CurrentY = Y1 + 50 ' Define Font Size Font.Size = 18 ' Print the text at cursor location Print "Hello there!" End Sub

176

Khi chy chng trnh ny v click tt c cc buttons trn form, bn s c hnh di y:

Hy nh set property AutoDraw ca form ra True cc graphic chng trnh v khng b mt khi user minimises form. Bn cng c th dng nhng k thut ni trn vi Object Printer in cc mu giy in chi tit. Method Circle
Ta dng Method Circle v hnh trn, hnh bu dc v ng cung, vi bn trong trng rng hay c sn y bng mt mu ta ch nh. Ta phi cho bit ta ca tm im vng trn v bn knh ca n. Bn hy khi ng mt d n VB6 mi, t ln form mt button vi tn frmCircle v caption Circle & Lines. DoubleClick ln button y v vit code sau y: Private Sub CmdCircleLine_Click() ' Draw a circle centered at 2000,1500 with radius equal 800 Circle (2000, 1500), 800 ' Draw a vertical line from center Line (2000, 1500)-Step(0, 800) ' Draw a horizontal line from center Line (2000, 1500)-Step(800, 0) End Sub By gi hy t ln form mt button khc tn CmdArc v caption Draw Arc. Thay v v nguyn mt vng trn, ta s ch v mt hnh vng cung bng mu . ch nh rng ta s v t v tr no trn vng trn n v tr no khc, th d t 45 n 230, ta cn phi i degree ra n v Radian bng cch dng Function Rads nh sau:

177

Private Function Rads(ByVal Degree As Single) As Single ' Convert Degrees to Radian Const PI = 22 / 7 Rads = Degree / 180 * PI End Function Vng cung lun lun c v ngc chiu kim ng h. Di y l code v mt ng vng cung mu bn knh 800, tm im (4000, 2000), t 45 n 230:

Private Sub CmdArc_Click() Circle (4000, 2000), 800, vbRed, Rads(45), Rads(230) End Sub Ta c th cho sn bn trong cc hnh trn, hay Pie Slices (mt phn ca hnh trn) bng cch set FillStyle bng 0 v ch nh mu FillColor. Mt Pie Slice l mt vng cung ng knh bi hai ng thng bn knh hai u. Mun v mt Pie Slice ta nh thm du tr ("-") trc hai tr s Radian, tc l dng -Rads(45), -Rads(230) thay v Rads(45), Rads(230). Di y l code v hai Pie Slices, c tm im lch nhau mt t, ng thi thm ch thch 87.5% v 12.5%.

Private Sub CmdPie_Click() FillStyle = 0 ' Fill inside any closed shaped FillColor = vbYellow ' Draw a Pie Slice from 90deg to 45deg in Yellow Circle (3000, 4000), 800, , -Rads(90), -Rads(45) ' Position the graphic cursor to Print some text CurrentX = 2800: CurrentY = 4400 Print "87.5%" FillColor = vbBlue ' Draw a Pie Slice from 45deg to 90deg in Blue Circle (3050, 3900), 800, , -Rads(45), -Rads(90) ' Position the graphic cursor to Print some text CurrentX = 3400: CurrentY = 3000 Print "12.5%" FillStyle = 1 ' No fill End Sub

178

Cch dng cui cng ca method Circle l v mt hnh bu dc (Elllipse). V hnh bu dc ging nh v mt hnh trn nhng ta cn cho thm mt parameter gi l Aspect. Aspect l s lin h gia bn knh vertical v bn knh horizontal. Th d nu Aspect=2 th chiu cao ca hnh bu dc gp i chiu ngang, ngc li, nu Aspect=0.5 th chiu ngang s gp i chiu cao. Di y l code ta dng v hai hnh bu dc cng c, mt ci mu tm nm thng ng v mt ci mu xanh nm ngang.

Private Sub CmdEllipse_Click() Circle (1400, 3000), 800, vbMagenta, , , 2 Circle (1400, 3000), 800, vbBlue, , , 0.5 End Sub Nu bn khi ng chng trnh v click c bn buttons bn s thy hnh sau y:

Property DrawMode Thng thng khi ta v, tr s default ca property DrawMode l 13- Copy Pen. C mt tr s DrawMode rt thch hp cho p dng hot ha l 7- Xor Pen. Mun xa mt hnh va v xong ta ch cn v li hnh y trong DrawMode Xor Pen, khng cn bit trc background nh th no, n s hin ra tr li.

Chng Mi Ba - C s d liu (Database)


Table, Record v Field

179

Ni n c s d liu, ta lp tc ngh n SQLServer, Access hay Oracle .v.v., nhng ni cha rt nhiu d liu ta c th lu tr hay ly chng ra mt cch tin li v nhanh chng. Hu ht cc chng trnh ta vit u c truy cp c s d liu, v ta dng n nh mt cng c lm vic vi rt nhiu d liu trong khi tp trung vo vic lp trnh phn giao din vi ngi dng (users). Do ta cn c mt kin thc cn bn v kin trc ca c s d liu hiu l do to sao ta thit k hay truy cp n theo nhng cch nht nh. Ta s dng Access Database biblio.mdb, nm C:\Program Files\Microsoft Visual Studio\VB98\biblio.mdb minh ha cc nim cn bit v c s d liu. Trong database ny c 4 tables: Authors (tc gi), Publishers (nh xut bn), Titles ( mc) v Title Author.

Table Authors cha nhiu records. Mi record trong table Authors cha 3 fields: Au_ID, Author v Year Born (nm sanh). Ta c th trnh by Table Authors di dng mt spreadsheet nh sau:

V cng mt field ca cc records hin th trong cng mt ct ca spreadsheet, nn ta cng ni n mt field nh mt column (ct). V v mi data record chim mt row (hng) ca spreadsheet, nn c khi ta cng ni n mt record nh mt row. Tht tnh m ni, ta khng cn phi c mt computer lu tr hay lm vic vi mt table nh Authors ny. Ta c th dng mt hp ct, trn mi ct ta ghi cc chi tit Au_ID, Author v Year Born ca mt Author. Nh th mi tm ct tng ng vi mt record v nguyn ci hp l tng ng vi Table Authors. Ta s sp cc ct trong hp theo th t ca s Au_ID c th truy cp record nhanh chng khi bit Au_ID. Ch kh mt ni, nu mun bit c bao nhiu tc gi, trong s 300 ct trong hp, gi hn 50

180

tui th phi mt vi pht mi c th tr li c. Database trong computer nhanh hn mt h thng bng tay (Manual) l ch . Primary Key v Index trnh s trng hp, thng thng c mt field ca record, th d nh Au_ID trong Table Authors, c dnh ra cha mt tr s c o (unique). Tc l trong Table Authors ch c mt record vi field Au_ID c tr s y m thi. Ta gi n l Primary Key.

Khng phi lc no ta cng mun truy cp mt record Author da vo Au_ID. Nhiu khi ta mun dng chnh tn ca Author truy cp, do ta cng cn phi sort sn cc records theo th t alphabet. Ta cng c th hp nhiu fields li sort cc records. Tht ra, chnh cc records khng cn phi c di i nm ng v tr th t. Ta ch cn nh v tr ca n u trong table l ri. Ci field hay tp hp ca nhiu fields (th d surname v firstname ) dng vo vic sorting ny c gi l Index (ngn tay ch). Mt Table c th c mt hay nhiu Index. Mi Index s l mt table nh ca nhng pointers, cha v tr ca cc records trong Table Authors. N ging nh mc lc index cui mt cun sch cha trang s ch ta n ng phn ta mun tm trong quyn sch. Khi thit k mt Table ta ch nh Datatype ca mi field c th kim tra data cho vo c hp l hay khng. Cc Datatypes thng dng l Number, String ( cha Text), Boolean (Yes/No), Currency ( cha tr s tin) v Date ( cha date/time). Datatype Number li gm c nhiu loi datatypes v con s nh Integer, Long (integer chim 32 bits), Single, Double, .v.v. Di y l Datatypes ca cc fields trong record Author:

181

C loi Datatype c bit tn l AutoNumber. Tht ra n l Long nhng tr s c pht sinh t ng mi khi ta thm mt record mi vo Table. Ta khng lm g hn l phi chp nhn con s y. Relationship v Foreign Key By gi, nu bn ang chy Microsoft Access quan st database biblio.mdb, bn c th dng Menu Command Tools | Relationships nh sau xem s lin h (relationships) gia cc tables.

Access s hin th giao thoi Relationships, trong mi table c cha tn cc fields. Mi table li c mt hay hai si dy ni qua cc tables klhc. Mi si dy l mt mi lin h (relationship), n ni mt field trong mt table vi mt field c cng tn trong table kia. Th d nh gia hai tables Publishers v Titles c mi lin h da trn field PubID (Publisher IDentification - s l lch ca nh xut bn). Hn na, nu bn s thy u dy pha table Publishers c con s 1, cn u dy bn pha table Titles c du v cc (). Ta gi mi lin h (1- ) l one-to-many, ni mt nh xut bn c th pht hnh nhiu mc sch/CD.

182

Tng t nh vy, trong mi lin h one-to-many gia table Authors v Title Author, ta thy mt tc gi (bn u c con s 1) c th sng tc nhiu tc phm c i din bi cc record Title Author. Trong khi gia hai tables Titles v Title Author, ta c mt mi lin h one-to-one, tc l tng ng vi mi record Title ch c mt record Title Author. Cu hi t ra l cc mi lin h one-to-many c ci g quan trng. Tng tng khi ta lm vic vi table Titles (tm gi l Tc phm), nhiu khi ta mun bit chi tit ca nh xut bn ca tc phm y. Tht ra ta c th cha chi tit ca nh xut bn ca mi tc phm ngay trong table Titles. Tuy nhin, lm nh th c im bt li l records ca cc tc phm c cng nh xut bn s cha nhng d liu ging nhau. Mi ln mun sa i chi tit ca mt nh xut bn ta phi sa chng trong mi record Title thuc nh xut bn y. V mun cha chi tit ca mi nh xut bn mt ch duy nht, trnh s lp li, nn ta cha chng trong mt table ring, tc l table Publishers. Nu gi s ta bt u thit k database vi Table Titles, ri quyt nh tch cc chi tit v nh xut bn vo mt table mi, tn Publishers, th k thut y c gi l normalization. Ni mt cch khc, normalization l thit k cc tables trong database lm sao mi loi mnh d kin (khng phi l Key) ch xut hin mt ch. Trong mi lin h one-to-many gia tables Publishers v Titles, field PubID l Primary Key trong table Publishers. Trong table Titles, field PubID c gi l Foreign Key, c ngha rng y l Primary Key ca mt table l (foreign). Hay ni mt cch khc, trong khi lm vic vi table Titles, lc no cn chi tit mt nh xut bn, ta s ly cha kha l (Foreign Key) dng lm Primary Key ca Table Publishers truy cp record ta mun. l chnh Table Titles c Primary Key ISBN ca n. Relational Database Mt database c nhiu tables v h tr cc lin h, nht l one-to-many, c gi l Relational Database. Khi thit k mt database, ta s tm cch sp t cc d liu t th gii tht bn ngoi vo trong cc tables. Ta s quyt nh chn cc ct (columns/fields) no, chn Primary Key, Index v thit lp cc mi lin h, tc l t cc Foreign Key u. Cc li ch Trong s cc li ch ca mt thit k Relational Database c:

Sa i d kin, cho vo records mi hay delete (gch b) records c sn rt hiu qu (nhanh).

183

Truy cp d kin, lm bo co (Reports) cng rt hiu qu. V d kin c sp t th t v c quy c nn ta c th tin cy tnh tnh ca database (khng c ba trn, khi th th ny, khi th th khc - git git). V hu ht d kin nm trong database, thay v trong chng trnh ng dng, nn database t c documentation (ti liu ct ngha). D sa i chnh cu trc ca cc tables.

Integrity Rules (cc quy lut lim chnh) Integrity Rules c dng ni v nhng qui lut cn phi tun theo trong khi lm vic vi database m bo l database cn tt. C hai loi quy lut: lut tng qut (General Integrity Rules) v lut ring cho database (Database-Specific Integrity Rules). Cc lut ring ny thng ty thuc vo cc quy lut v mu dch (Business Rules).

General Integrity Rules


C hai quy lut lim chnh lin h hon ton vo database: Entity (bn th) Integrity Rule v Referential (ch n) Integrity Rule. Entity Integrity Rule ni rng Primary Key khng th thiu c, tc l khng th c tr s NULL. Quy lut ny xc nhn l v mi Primary Key a n mt row c o trong table, nn d nhin n phi c mt tr s ng hong. Lu l Primary Key c th l mt Composite Key, tc l tp hp ca mt s keys (columns/fields), nn nht nh khng c key no trong s cc columns l NULL c. Referential Integrity Rule ni rng database khng th cha mt Foreign Key m khng c Primary Key tng ng ca n trong mt table khc. iu y hm rng:

Ta khng th thm mt Row vo trong mt Table vi tr s Foreign Key trong Row y khng tm thy trong danh sch Primary Key ca table bn pha one (1) m n lin h. Nu c thay i tr s ca Primary Key ca mt Row hay delete mt Row trong table bn pha one (1) th ta khng th cc records trong table bn pha many () cha nhng rows tr thnh m ci (orphans). Ni chung, c ba nhim (options) ta c th chn khi thay i tr s ca Primary Key ca mt Row hay delete mt Row trong table bn pha one (1):

1. Disallow (khng cho lm): Hon ton khng cho php chuyn ny xy ra. 2. Cascade (nh hng dy chuyn): Nu tr s Primary Key b thay i th tr s Foreign Key tng ng trong cc records ca table bn pha many () c thay i theo. Nu Row cha Primary Key b deleted th cc records tng ng trong table bn pha many () b deleted theo.

184

3. Nullify (cho thnh NULL): Nu Row cha Primary Key b deleted th tr s Foreign Key tng ng trong cc records ca table bn pha many () c i thnh NULL, hm ng c i tm thm chi tit u c.

Database-Specific Integrity Rules


Nhng quy lut lim chnh no khc khng phi l Entity Integrity Rule hay Referential Integrity Rule th c gi l Database-Specific Integrity Rules. Nhng quy lut ny da vo chnh loi database v nht l ty thuc vo cc quy lut v mu dch (Business Rules) ta dng cho database, th d nh mi record v tin lng ca cng nhn phi c mt field S Thu (Tax Number) do s Thu V pht hnh cho cng dn. Lu l cc quy lut ny cng quan trng khng km cc quy lut tng qut v lim chnh. Nu ta khng p dng cc Database-Specific Integrity Rules nghim chnh th database c th b h v khng cn dng c.

Microsoft Access Database Management System (MSAccess DBMS) Microsoft Access Database Management System gm c Database Engine v nhng cng c i chung cung cp cho users mt mi trng lm vic thn thin vi database, nh Database Design (thit k cc tables v mi lin h), Data entry v bo co (reports). Km theo vi Visual Basic 6.0 khi ta mua l mt copy ca Database Engine ca MSAccess. Tn n l Jet Database Engine, ci li ca MSAccess DBMS. Cc chng trnh VB6 c th truy cp database qua Jet Database Engine. Nu trn computer ca bn c ci sn MSAccess, th bn c th dng thit k cc tables ca database hay cho data vo cc tables. Properties Required v Allow Zero Length Khi thit k mt table field, lu property Required v nht l property Allow Zero Length ca Text. Nu property Required ca mt field l Yes th ta khng th update (vit) mt record vi field y c tr s NULL. Nu mt Text field c property Allow Zero Length l No th th ta khng th update mt record khi field y cha mt empty string.

Khi ta to mt record ln u, nu khng cho tr s ca mt field, th field y c tr s l NULL.

185

Thng thng, Visual Basic 6.0 khng thch NULL value nn ta phi th mt field vi Function IsNULL() m bo n khng c tr s NULL trc khi lm vic vi n. Nu IsNULL tr v tr s False th ta c th lm vic vi field y. Nh l khi tr s NULL c dng trong mt expression, ngay c khi chng trnh khng cho Error, kt qu cng l NULL. Lm vic vi cc versions khc nhau Nu my bn ang chy MSAccess2002 th bn c th lm vic vi Access database file version 97, 2000 v 2002. Nu cn phi convert t version ny qua version khc, bn c th dng Access DBMS Menu Command Tools | Database Utilities | Convert Database | To Access 2002 File Format.... Nu mun gi nguyn version, bn c th convert database qua File Format 2002 sa i, ri sau convert tr li File Format c.

Access database file ln ln rt nhanh, v cc records b deleted vn cn nm nguyn, nn mi tun bn nn nh nn n li b ht cc records b deleted bng cch dng Access DBMS Menu Command Tools | Database Utilities | Compact and Repair Database... hay dng function DBEngine.CompactDatabase trong VB6. Dng Query vit SQL Mt cch truy cp database l dng ngn ng Structured Query Language (SQL) theo chun do ISO/IEC pht hnh nm 1992, gi tt l SQL92. Tt c mi database thng dng u h tr SQL, mc du nhiu khi chng cn cho thm nhiu chc nng rt hay nhng khng nm trong chun. Cc lnh SQL thng dng l SELECT, UPDATE, INSERT v DELETE. Ta c th dng phng tin thit k Query ca MSAccess vit SQL. Sau khi thit k Query bng cch drag drop cc fields, bn c th dng Menu Command View | View SQL nh sau:

186

Tip theo y l SQL statement ca Query bn trn m bn c th copy paste vo trong code VB6:

Dng Link Table lm vic trc tip vi database loi khc Ta c th dng mt database loi khc, nh DBase, trc tip trong VB6 nh dng mt Access database bnh thng. Mun thit lp mc ni y, bn dng Menu Command File | Get External Data | Link Tables... ri chn loi DBase v chnh file ca table m bn mun dng nht n vo Access database ang m:

187

Database Server v mt s nim D Jet Database Engine l mt relational database rt tt v hiu nng, n thuc loi File Based database, tc l n th ng, khng chy mt mnh nhng phi ty thuc vo chng trnh dng n. File Based database khng thch hp vi nhng ng dng c nhiu ngi dng cng mt lc. Trong khi , mt Database Server nh SQLServer chy ring phc v bt c chng trnh khch (client) no cn. Database Server thich hp cho cc ng dng c nhiu users v ch c mt mnh n chu trch nhim truy cp d liu cho mi clients. N c th cha nhiu routines a phng, gi l Stored Procedures, thc hin cc cng tc client yu cu rt hiu nng. Database Server thng c cch i ph hu hiu khi c s c v phn cng nh a h hay cp in. Ngoi ra, Database Server c sn cc phng tin v an ninh v backup. N cng c thm cc chc nng dng cho mng. Ngy nay ta thu thp d liu di nhiu hnh thc nh Email, Word documents, Speadsheet. Khng nht thit d liu lun lun c cha di dng table ca nhng records v khng nht thit d liu lun lun c lu tr trong mt database ng hong. D vy, chng vn c xem nh database di mt mt chng trnh ng dng. Do , ta dng t Data Store (Kho d liu) thay th cho database ni n ni cha d liu. V i vi chng trnh tiu th d liu, ta ni n Data Source (Ngun d liu) thay v database. Khi lp trnh bng VB6 truy cp database, ta nhn databse mt cch tru tng, tc l du n l Access, DBase, SQLServer hay Oracle ta cng xem nh nhau. Nu c thay i loi database bn di, cch lp trnh ca ta cng khng thay i bao nhiu. Trong tng lai, mt XML file cng c th c xem nh mt database nho nh. N c th ng mt mnh hay l mt table trch ra t mt database chnh huy. XML l mt chun m ta c th dng import/export d liu vi tt c mi loi database h tr XML. Ta c th trao i d liu trn mng

188

Intenet di dng XML. Ngoi ra, thay v lm vic trc tip vi mt database ln, ta c th trch ra vi tables t database y thnh mt XML file. K ta ch lp trnh vi XML file cho n khi kt thc s ha (merge/reconcile) XML file vi database ln. Nu phn ln cc chng trnh p dng c thit k lm vic cch ny, th trong tng lai ta khng cn mt Database Server tht mnh.

Chng Mi Bn - Dng Control Data


Control Data
T VB5, Visual Basic cho lp trnh vin mt control truy cp c s d liu, tn n ch n s l Data. Nh ta bit, c mt c s d liu Microsoft gi km khi ta mua VB6 - l Jet Database Engine. Jet Database Engine l ci "phng my" ca chnh MS Access Database Management System. Cho n thi VB5, Microsoft cho ta ba k thut chnh:

DAO (Data Acess Objects): DAO l k thut b truyn ca Microsoft, ch dng vi Jet Database Engine. N rt d dng, hiu nng v tin, nhng b gii hn trong phm vi MS Access. Du vy, n rt thnh hnh v c li ch thc tin. ODBC (Open Database Connectivity): ODBC c thit k cho php users ni vi loi databases m ch dng mt method duy nht. iu ny ct bt gnh nng cho lp trnh vin, ch cn hc mt k thut lp trnh duy nht m c th lm vic vi bt c loi database no. Nht l khi sau ny nu cn phi thay i loi database, nh nng cp t Access ln SQLServer chng hn, th s sa i v coding rt t. Khi dng ODBC chung vi DAO, ta c th cho Access Database ni vi cc databases khc. C mt bt li ca ODBC l n rc ri. RDO (Remote Data Object): Mt trong nhng l do chnh RDO c thit k l gii quyt kh khn v s rc ri ca ODBC. Cch lp trnh vi RDO n gin nh DAO, nhng tht ra n dng ODBC nn cho php users ni vi nhiu databases. Tuy nhin, RDO khng c thnh hnh lm.

VB6 tip tc h tr cc k thut ni trn, v cho thm mt k thut truy cp database mi, rt quan trng, l ADO (ActiveX Data Objects). Trong mt bi ti ta s hc v ADO vi nhng u im ca n. Tuy nhin, v DAO rt n gin v hiu nng nn ta vn c th tip tc dng n rt hu hiu trong hu ht cc p dng. Do bi ny v bi k s tp trung vo nhng k thut lp trnh ph bin vi DAO. Cch dng gin tin ca control Data l t n ln mt Form ri lm vic vi nhng Properties ca n. Bn hy bt u mt d n VB6 mi, cho n tn DataControl bng cch click tn project trong Project Explorer bn phi ri edit property Name trong Properties Window. DoubleClick ln Icon ca Control Data trong Toolbox. Mt Control Data tn Data1 s hin ra trn Form. Mun cho n nm bn di Form, ging nh mt StatusBar, hy set property Align ca n trong Properties Window thnh 2 - Align Bottom. Click bn phi hng property DatabaseName, k click ln nt browse c ba chm chn mt file Access dabase t giao thoi cho Data1. y ta chn E:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB , trong computer ca bn c th n nm trn disk C hay D.

189

Trong chng trnh ny ta mun lm vic vi table Titles ca database BIBLIO.MDB, xem v edit cc records. property DefaultType ca Data1 c tr s 2- UseJet, tc l dng k thut DAO, thay v dng k thut ODBC. Khi bn click ln property Recordsource ca Data1, ri click ln ci tam gic nh bn phi, mt ComboBox s m ra cho ta thy danh sch cc tables trong database. Bn hy chn Titles. property RecordsetType ca Data1 c tr s l 0 - Table:

Ci t mi m ta s dng thng xuyn khi truy cp d liu trong VB6 l Recordset (b records). Recordset l mt Set of records, n c th cha mt s records hay khng c record no c. Mt record trong Recordset c th l mt record ly t mt Table. Trong trng hp y c th ta ly v tt c records trong table hay ch nhng records tha ng mt iu kin, th d nh ta ch mun ly cc records ca nhng sch xut bn trc nm 1990 (Year Published < 1990). Mt Record trong Recordset cng c th l tp hp cc ct (columns) t hai (hay ba)

190

tables qua cc mi lin h one-to-one v one-to-many. Th d nh khi ly cc records t table Titles, ta mun c thm chi tit tn cng ty (Company Name) v in thoi (Telephone) ca nh xut bn (table Publishers) bng cch dng Foreign Key PubID trong table Titles lm Primary Key trong table Publishers ly cc chi tit y. Nu bn cha nm vng nim Foreign Key th hy c li bi Database. Trong trng hp y ta c th xem nh c mt virtual (o) table l tp hp ca hai tables Titles v Publishers. By gi bn hy t ln Form 4 labels vi captions: Title, Year Published, ISBN v Publisher ID. K cho thm 4 textboxes tng ng v t tn chng l txtTitle, txtYearPublished, txtISBN v txtPublisherID. Chn textbox txtTitle, ri set property Datasource ca n trong Properties Window thnh Data1. Khi click ln property Datafield ca txtTitle v m ComboBox ra bn s thy lit k tn cc Fields trong table Titles. l v Data1 c coi nh trung gian ly table Titles t database. y ta s chn ct Title. Lp li cng tc ny cho 3 textboxes kia, v chn cc ct Year Published (nm xut bn), ISBN (s l lch trong th vin quc t), v PubID (s l lch nh xut bn) lm Datafield cho chng.

Ti y, mc du cha vit mt hng code, ta c th chy chng trnh c ri. N s hin th chi tit ca record u tin trong table Titles nh di y:

191

Bn c th bm cc nt di chuyn Navigator Buttons i n cc record u (first), trc (previous), k (next) v cui (last). Mi ln bn di chuyn n mt record mi l chi tit ca record y s hin th. Nu khng dng cc Navigator Buttons, ta cng c th code lm cng tc tng ong bng cch gi cc Recordset methods MoveFirst, MovePrevious, MoveNext v MoveLast. Khi record cui ca Recordset ang hin th, nu ta gi method MoveLast th property EOF (End-Of-File) ca Recordset tr thnh True. Tng t nh vy, khi record th nht ca Recordset ang hin th, nu ta gi method MovePrevious th property BOF (Begin-Of-File) ca Recordset tr thnh True. Nu mt Recordset khng c cha mt record no c th c hai properties EOF v BOF u l True. c tnh hin th d liu trong cc textboxex theo ng record hin thi (current record) c gi l data binding hay data bound (buc vo d liu) v control TextBox h tr chc nng ny c ni l Data Aware (bit b con d liu). Khi record u tin ang hin th, nu bn edit Year Published i t 1985 thnh 1983 ri click Navigator button Next hin th record th nh, k click Navigator button Previous hin th li record u tin th bn s thy l field Year Published ca record u tin tht s c thay i (updated) thnh 1983. iu ny c ngha rng khi Data1 navigates t record ny n record khc th nu record ny c s thay i v user edited, n lu tr s thay i trc khi di chuyn. Cha chc l bn mun iu ny, do , nu bn khng mun user tnh c edit mt record th bn c th set property Locked ca cc textboxes y thnh True user khng th edit cc textboxes nh trong hnh di y:

192

Ch nh v tr Database lc chy chng trnh


Cch ch nh tn DatabaseName trong giai on thit k (at design time) ta dng trc y tuy tin li nhng hi nguy him, v khi ta ci chng trnh ny ln computer ca khch, cha chc file database y nm trong mt folder c cng tn. Th d trn computer mnh th database nm trong folder E:\Program Files\Microsoft Visual Studio\VB98, nhng trn computer ca khch th database nm trong folder C:\VB6\DataControl chng hn. Do , khi chng trnh khi ng ta nn xc nh li v tr ca database. Gi d ta mun database trong cng mt folder vi chng trnh ang chy, ta c th dng property Path ca Application Object App nh sau:

Dim AppFolder As String Private Sub Form_Load() ' Fetch Folder where this program EXE resides AppFolder = App.Path ' make sure it ends with a back slash If Right(AppFolder, 1) <> "\" Then AppFolder = AppFolder & "\" ' Assign Full path database filename to Data1 Data1.DatabaseName = AppFolder & "BIBLIO.MDB" End Sub

Vi cch code ni trn ta s m bo chng trnh tm thy file database ng ch, khng cn bit ngi ta ci chng trnh bn u trong hard disk ca computer khch. Nu bn ang hc VB6 t xa, khi np bi database cho gim th VB6 m bn hardcode

193

(vit cht cng) v tr ca file database trong lc thit k th gim th (tutor) cng gp cng s kh khn ny v cha chc gim th s cha database trong mt folder c cng tn nh trong harddisk ca bn.

Thm bt cc Records
Chng trnh trn dng cng tm c, nhng n khng cho ta phng tin thm (add), bt (delete) cc records. By gi bn hy vo Form 5 buttons tn: cmdEdit, cmdNew, cmdDelete, cmdUpdate v cmdCancel. Mc du bn khng thy, nhng tht ra Control Data Data1 c mt property Recordset v khi ta dng Navigator buttons l di chuyn t record ny n record khc trong Recordset y. Ta c th ni n n bng Notation (cch vit) Data1.Recordset, v mi ln mun ly Recordset mi nht t database ta dng method Refresh nh Data1.Recordset.Refresh. Lc chung trnh mi khi ng, user ang xem (browsing) cc records th hai buttons Update v Cancel khng cn phi lm vic. Do ta s nhn tin Lock (kha) cc textboxes v disable (lm cho bt lc) hai buttons ny v khng cn dng chng. Trong Sub SetControls di y, ta dng mt parameter gi l Editing vi tr s False hay True ty theo user ang Browse hay Edit, ta gi l Browse mode v Edit mode. Trong Edit mode, cc Textboxes c unlocked (m kha) v cc nt cmdNew, cmdDelete v cmdEdit tr nn bt lc:
Sub SetControls(ByVal Editing As Boolean) ' Lock/Unlock textboxes txtTitle.Locked = Not Editing txtYearPublished.Locked = Not Editing txtISBN.Locked = Not Editing txtPublisherID.Locked = Not Editing ' Enable/Disable buttons CmdUpdate.Enabled = Editing CmdCancel.Enabled = Editing CmdDelete.Enabled = Not Editing cmdNew.Enabled = Not Editing CmdEdit.Enabled = Not Editing End Sub

Trong Browse mode, Form c dng nh sau:

194

Sub SetControls c gi trong Sub Form_Load khi chng trnh khi ng v trong Sub CmdEdit khi user click nt Edit nh sau:
Private Sub Form_Load() ' Fetch Folder where this program EXE resides AppFolder = App.Path ' make sure it ends with a back slash If Right(AppFolder, 1) <> "\" Then AppFolder = AppFolder & "\" ' Assign Full path database filename to Data1 Data1.DatabaseName = AppFolder & "BIBLIO.MDB" ' Place controls in Browse Mode SetControls (False) End Sub Private Sub CmdEdit_Click() ' Place controls in Edit Mode SetControls (True) End Sub

Khi ta Delete mt record trong recordset, v tr ca record hin ti (current record) vn khng thay i. Do , sau khi delete mt record ta phi MoveNext. Kh ni, nu ta va delete record cui ca Recordset th sau khi MoveNext, property EOF ca Recordset s thnh True. Thnh ra ta phi kim tra iu , nu ng vy th li phi MoveLast hin th record cui ca Recordset nh trong code ca Sub cmdDelete_Click di y:

Private Sub CmdDelete_Click()

195

On Error GoTo DeleteErr With Data1.Recordset ' Delete new record .Delete ' Move to next record .MoveNext If .EOF Then .MoveLast Exit Sub End With DeleteErr: MsgBox Err.Description Exit Sub End Sub

Trong lc code, ta Update (cp nht ha) mt record trong Recordset bng method Update. Nhng ta ch c th gi method Update ca mt Recordset khi Recordset ang trong Edit hay AddNew mode. Ta t mt Recordset vo Edit mode bng cch gi method Edit ca Recordset, th d nh Data1.Recordset.Edit. Tng t nh vy, ta t mt Recordset vo AddNew mode bng cch gi method AddNew ca Recordset, th d nh Data1.Recordset.AddNew.

Private Sub cmdNew_Click() ' Place Recordset into Recordset AddNew mode Data1.Recordset.AddNew ' Place controls in Edit Mode SetControls (True) End Sub

Sau khi Recordset gi method Update th Recordset y ra khi AddNew hay Edit modes. Ta cng c th t thot ra khi AddNew hay Edit modes, hay ni cho ng hn l hy b mi pending (ang ch i) Update bng cch gi method CancelUpdate, th d nh Data1.Recordset.CancelUpdate.
Dng DataBound Combo

Trong chng trnh hin ti ta ch hin th l lch nh xut bn (PubID) ca Title, ch khng c thm chi tit. Phi chi mc du chng trnh lu tr PubID, nhng hin th c Company Name ca nh xut bn cho ta lm vic khi phi nh cc con s th

196

hay qu. Ta c th thc hin iu bng cch dng Control DBCombo (Data Bound Combo). Bn hy dng IDE Menu Command Project | Components... chn Microsoft Data Bound List Controls 6.0 ri click Apply.

K , thm mt DBCombo tn DBCombo1 vo Form. V ta cn mt Recordset khc cung cp Table Publisher cho DBCombo1, nn bn hy thm mt control Data th nh tn Data2 vo Form. Cho Data2, hy set property DatabaseName thnh E:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB v property RecordSource thnh Publishers. khng cho ngi ta thy hnh Data2 lc run-time, bn hy set property Visible n thnh False.

Ci mc ch ca chng ta khi dng DBCombo1 l hin th Company Name ca nh xut bn, nhng ng sau lng th khng c g thay i, tc l ta vn lm vic vi PubID cho cc record Title ca Data1. Khi user click ln DBCombo1 chn mt nh

197

xut bn, th ta theo Company Name m cha PubID tng ng trong record Title ca Data1. Do c nhiu th ta phi sp t cho DBCombo1 nh sau:
Property RowSource Value Data2 Ch thch y l datasource ca chnh DBCombo1. N cung cp table Publishers. Khi RowSource pha trn c chn ri, Combo ca property Listfield ny s hin th cc fields ca table Publishers. Company Name l field ca RowSource m ta mun hin th trn DBCombo1. y l datasource ca record m ta mun. edit, tc l record ca table Titles Field (ca record Title) s c thay i. Field trong RowSource (table Publishers) tng ng vi item user chn trong DBCombo1 (Company Name).

Listfield

Company Name

DataSource Datafield BoundColumn

Data1 PubID PubID

Khi trong Edit mode user chn mt Company Name khc trong DBCombo1 ri click nt Update bn s thy Textbox txtPublisherID cng i theo v hin th con s l lch PubID mi. Nu trc khi Update bn mun thy PubID mi hin th trong Textbox txtPublisherID th bn c th dng Event Click ca DBCombo1 nh sau:

Private Sub DBCombo1_Click(Area As Integer) ' Display new PuBID txtPublisherID.Text = DBCombo1.BoundText End Sub

Property BoundText ca DBCombo1 l tr s ca BoundColumn m ta c th truy cp (vit hay c) c. Th d nh bn mun mi khi thm mt record Title mi th default PubID l 324, tc l Company Name= "GLOBAL ENGINEERING". Bn c th assign tr s 324 vo property BoundText ca DBCombo1 trong Sub cmdNew_Click nh sau:

Private Sub cmdNew_Click() ' Place Recordset into Recordset AddNew mode

198

Data1.Recordset.AddNew ' Default Publisher is "GLOBAL ENGINEERING", i.e. PubID=324 DBCombo1.BoundText = 324 ' Place controls in Edit Mode SetControls (True) End Sub

Trong bi ti ta s hc thm v cch coding dng Recordset trong k thut DAO.

Chng Mi Lm - Lp trnh vi k thut DAO


Reference DAO
Trong bi ny ta s hc nhng cch lp trnh cn bn vi MS Access database qua k thut DAO m khng cn dng n Control Data nh trong bi trc. Ta s cn n vi Objects trong th vin DAO, do nu bn m mt d n VB6 mi th hy dng Menu Command Project | References... chn Microsoft DAO 3.51 Object Library bng cch click ci checkbox bn tri nh trong hnh di y. (Mt cch nh tn ca Object ny l nh cu "thng cha cua O 35 con d").

Sau trong code ca Form chnh ta s declare variable myDatabase cho mt instance ca DAO database v variable myRS cho mt DAO recordset. y ta ni r Database v Recordset l thuc loi DAO phn bit vi Database v Recordset thuc loi ADO (ActiveX Data Object) sau ny. l Intellisense gip ta trong lc vit code:

199

By gi bn hy t ln Form chnh, tn frmDAO, 4 labels vi captions: Title, Year Published, ISBN v Publisher ID. K cho thm 4 textboxes tng ng v t tn chng l txtTitle, txtYearPublished, txtISBN v txtPublisherID. iu ta mun lm l khi Form mi c loaded, n s ly v t database mt Recordset cha tt c records trong table Titles theo th t v mu t (alphabetical order) ca field Title v hin th record u tin.

Dng keyword SET


Chuyn trc ht l m mt Database Object da vo tn y (full path name) ca Access database:
' Open main database Set myDB = OpenDatabase(AppFolder & "BIBLIO.MDB")

ch Set trong cu code trn. l v myDB l mt Pointer n mt Object. Mc du t ry v sau ta s dng myDB nh mt Database theo cch ging nh bt c variable thuc data type no khc, nhng khi ch nh ln u l n t u n th ta dng ch Set, ni rng tht ra myDB khng phi l Object Database, nhng l Pointer n Object Database. im ny cng ni n cng kh hiu. i khi l VB6 runtime dynamically allocates (dnh ra cho khi cn) mt phn trong b nh (memory) cha Object Database khi ta nhn c n t execution ca Method OpenDatabase. Du v tr ch cha Object Database trong b nh khng nht nh, nhng v ta nm ci cn ch n v tr y nn ta vn c th lm vic vi n mt cch bnh thng. Ci cn y l value (tr s) ca variable myDB. V value ny khng

200

phi l Object, nhng n cha memory address ch n (point to hay refer to) Object Database, nn ta gi n l Pointer. Lp trnh dng Pointer ni chung rt linh ng l hiu nng trong cc ngn ng nh C, Pascal, C++ ,v.v.. Tuy nhin, lp trnh vin phi nh tr li Operating System phn memory mnh dng khi khng cn cn n na Operating System li allocate cho Object khc. Nu cng vic qun l dng li memory khng n tha th c nhng mnh memory nm lang bang m Operating Sytem khng bit. Ln ln Operating System s khng cn memory d na. Ta gi hin tng y l memory leakage (r). Cc ngn ng sau ny nh Java, C# u khng dng Pointer na. Visual Basic khng mun lp trnh vin dng Pointer. Ch trong vi trng hp c bit VB6 mi l ra cho ta thy tht ra trong hu trng VB6 Runtime dng Pointer, nh trong trng hp ny. Tng t nh vy, v Recordset l mt Pointer n mt Object, ta cng dng Set khi ch nh mt DAO Recordset ly v t Method OpenRecordset ca database myDB.
'Open recordset Set myRS = myDB.OpenRecordset("Select * from Titles ORDER BY Title")

Ci parameter loi String ta dng cho method OpenRecordset l mt Lnh (Statement) SQL. N ch nh cho database ly tt c mi fields (columns) (Select *) ca mi record t Table Titles (from Titles) lm mt Recordset v sort cc records trong Recordset y theo alphabetical order ca field Title (ORDER BY Title). Nh l Recordset ny cng ging nh property Recordset ca mt Control Data m ta dng trong bi trc. By gi c Recordset ri, ta c th hin th chi tit ca record u tin nu Recordset y c t nht mt record. Ta kim tra iu y da vo property RecordCount ca Recordset nh trong code di y:

Private Sub Form_Load() ' Fetch Folder where this program EXE resides AppFolder = App.Path ' make sure it ends with a back slash If Right(AppFolder, 1) <> "\" Then AppFolder = AppFolder & "\" ' Open main database Set myDB = OpenDatabase(AppFolder & "BIBLIO.MDB") 'Open recordset Set myRS = myDB.OpenRecordset("Select * from Titles ORDER BY Title") ' if Recordset is not empty then display the first record If myRS.RecordCount > 0 Then

201

myRS.MoveFirst ' move to first record Displayrecord ' display details of current record End If End Sub

Sau khi dng method MoveFirst ca Recordset position current record Record u tin, ta hin th tr s cc fields ca record bng cch assign chng vo cc textboxes ca Form nh sau:

Private Sub Displayrecord() ' Assign record fields to the appropriate textboxes With myRS ' Assign field Title to textbox txtTitle txtTitle.Text = .Fields("Title") txtYearPublished.Text = .Fields("[Year Published]") txtISBN.Text = .Fields("ISBN") txtPublisherID.Text = .Fields("PubID") End With End Sub

v field Year Publshed gm c hai ch nn ta phi t tn ca field y gia hai du ngoc vung ([]). trnh b phin phc nh trong trng hp ny, khi bn t tn database field trong lc thit k mt table hy dn dnh cc ch li vi nhau, ng ri ra. Th d nh dng YearPublished thay v Year Published.

Cc nt di chuyn
Mun c cc nt Navigators tng ng vi ca mt Control Data, bn hy t ln Form 4 buttons mang tn CmdFirst, CmdPrevious, CmNext v CmdLast vi captions: <<, <, >, >>. Code cho cc nt ny cng n gin, nhng ta phi coi chng khi user mun di chuyn qu record cui cng hay record u tin. Ta phi kim tra xem EOF c tr thnh True khi user click CmdNext, hay BOF c tr thnh True khi user click CmdPrevious:
Private Sub CmdNext_Click() myRS.MoveNext ' Move to next record ' Display record details if has not gone past the last record If Not myRS.EOF Then Displayrecord ' display details of current record Else myRS.MoveLast ' Move back to last record

202

End If End Sub Private Sub CmdPrevious_Click() myRS.MovePrevious ' Move to previous record ' Display record details if has not gone past the first record If Not myRS.BOF Then Displayrecord ' display details of current record Else myRS.MoveFirst ' Move back to first record End If End Sub Private Sub CmdFirst_Click() myRS.MoveFirst ' Move back to first record Displayrecord ' display details of current record End Sub Private Sub CmdLast_Click() myRS.MoveLast ' Move back to last record Displayrecord ' display details of current record End Sub

Khi chy chng trnh bn s thy n hin th chi tit ca Record u tin khc vi trong bi trc y v cc records c sorted:

Bn hy th dng cc Navigator buttons cy nh, l vn ca mnh xem chng lm vic c ng khng. Ti y, khng bit bn c l d user c v tnh sa i mt chi tit no trong cc textboxes, khng c record no b cp nht ha trong database khi user di chuyn t record ny n record khc. L do l cc Texboxes khng c Data Bound vi cc Fields ca Recordset.

203

Thm bt cc Records
Ging nh chng trnh trong bi ri, ta s thm phng tin thm (add), bt (delete) cc records. By gi bn hy vo Form 5 buttons tn: cmdEdit, cmdNew, cmdDelete, cmdUpdate v cmdCancel. Ch no trong chng trnh trc ta dng Data1.Recordset th by gi ta dng myRS. Ta s dng li Sub SetControls vi parameter Editing c tr s False hay True ty theo user ang Browse hay Edit. Trong Browse mode, cc Textboxes b Locked (kha) v cc nt cmdUpdate v cmdCancel tr nn bt lc. Trong Edit mode, cc Textboxes c unlocked (m kha) v cc nt cmdNew, cmdDelete v cmdEdit tr nn bt lc. V y khng c Data Binding nn i cho n khi Update (cp nht ha) ta mi t Recordset vo AddNew hay Edit mode. Do ta ch cn nh l khi user edits l ang Edit mt record hin hu hay thm mt Record mi. Ta cha tr s Boolean y trong variable AddNewRecord. Nu user sp thm mt record mi th AddNewRecord = True, nu User sp Edit mt record hin hu th AddNewRecord = False. Ngoi ra, khi User sp thm mt record mi bng cch click nt New th ta phi t clear (lm trng) ht cc textboxes bng cch assign Empty string vo text property ca chng nh sau:
' If Editing existing record then AddNewRecord = False ' Else AddNewRecord = true Dim AddNewRecord As Boolean Private Sub ClearAllFields() ' Clear all the textboxes txtTitle.Text = "" txtYearPublished.Text = "" txtISBN.Text = "" txtPublisherID.Text = "" End Sub Private Sub cmdNew_Click() ' Remember that this is Adding a new record AddNewRecord = True ' Clear all textboxes ClearAllFields ' Place controls in Edit Mode SetControls (True) End Sub Private Sub CmdEdit_Click() ' Place controls in Edit Mode

204

SetControls (True) ' Remember that this is Editing an existing record AddNewRecord = False End Sub

Nu user clicks Cancel trong khi ang edit cc textboxes, ta khng cn gi method CancelUpdate v Recordset cha b t vo AddNew hay Edit mode. y ta ch cn hin th li chi tit ca current record, tc l hy b nhng g user ang nh vo:

Private Sub CmdCancel_Click() ' Cancel update SetControls (False) ' Redisplay details or current record Displayrecord End Sub

Lc user clicks Update, bn c dp kim tra data xem c field no b b trng (nht l Primary Key ISBN bt buc phi c tr s) hay c g khng valid bng cch gi Function GoodData. Nu GoodData tr li mt tr s False th ta khng xc tin vi vic Update. Nu GoodData tr v tr s True th ta t Recordset vo AddNew hay Edit mode ty theo tr s ca Boolean variable AddNewRecord. Ging nh khi hin th chi tit ca mt Record ta phi assign tng Field vo textbox, th by gi khi Update ta phi lm ngc li, tc l assign property Text ca tng textbox vo Record Field tng ng. Sau cng ta gi method Update ca recordset v cho cc controls tr li Browse mode:

Private Function GoodData() As Boolean ' Check Data here. If Invalid Data then GoodData = False GoodData = True End Function Private Sub CmdUpdate_Click() ' Verify all data, if Bad then do not Update If Not GoodData Then Exit Sub ' Assign record fields to the appropriate textboxes

205

With myRS If AddNewRecord Then .AddNew ' Place Recordset in AddNew Mode Else .Edit ' Place Recordset in Edit Mode End If ' Assign text of txtTitle to field Title .Fields("Title") = txtTitle.Text .Fields("[Year Published]") = txtYearPublished.Text .Fields("ISBN") = txtISBN.Text .Fields("PubID") = txtPublisherID.Text ' Update data .Update End With ' Return controls to Browse Mode SetControls (False) End Sub

Cng v khng c Data Binding, nn khi User Delete mt record, sau khi di chuyn qua record k tip ta phi t hin th chi tit ca record nh sau:

Private Sub CmdDelete_Click() On Error GoTo DeleteErr With myRS ' Delete new record .Delete ' Move to next record .MoveNext If .EOF Then .MoveLast ' Display details of current record Displayrecord Exit Sub End With DeleteErr: MsgBox Err.Description Exit Sub End Sub

Tm mt record
Tip theo y, ta mun lit k cc sch c tiu cha mt ch hay cu no , th d nh ch "Guide". K user c th chn mt sch bng cch select tiu sch y v click nt Go. Chng trnh s locate (tm ra) record ca sch y v hin th chi tit ca n.

206

By gi bn hy cho vo Form mt textbox tn txtSearch v mt Image tn ImgSearch. K t mt frame tn fraSearch vo Form. ln frame ny mt listbox tn List1 hin th tiu cc sch, v hai buttons tn CmdClose v CmdGo, vi caption Close v Go. Sau khi select mt sch trong List1, user s click nt Go hin th chi tit sch y. Nu i , user s click nt Close lm bin mt frame fraSearch. Bnh thng frame fraSearch ch hin ra khi cn, nn lc u hy set property Visible ca n thnh False. Ta s cho ImgSearch hin th hnh mt ng dm nn bn hy click vo bn phi property Picture trong Properties Window chn Icon BINOCULR.ICO t folder E:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc:

Ci Primary Key ca table Titles l ISBN. Khi user select mt sch ta mun bit ISBN ca sch y locate (nh ch) n trong Recordset myRS. Do trong khi thm tiu ca mt sch vo List1, ta ng thi thm ISBN ca sch y vo mt Listbox th hai tn List2. Ta ch s dng List2 sau hu trng, nn hy set property Visible ca n thnh False. Di y l code load tiu sch v ISBN vo cc Listboxes:
Private Sub ImgSearch_Click() ' Show Search Frame fraSearch.Visible = True Dim SrchRS As DAO.Recordset Dim SQLCommand As String ' Define SQL statement SQLCommand = "Select * from Titles where Title LIKE '" & "*" & txtSearch & "*" & "'

207

ORDER BY Title" ' Fetch all records having Title containing the text pattern given by txtSearch Set SrchRS = myDB.OpenRecordset(SQLCommand) ' If Recordset is not Empty then list the books' titles in List1 If SrchRS.RecordCount > 0 Then List1.Clear ' Clear List1 ' We use List2 to contain the Primary Key ISBN corresponding to the books in List1 List2.Clear ' Clear List2 With SrchRS ' Iterate through the Recordset until EOF Do While Not SrchRS.EOF ' Display Title in List1 List1.AddItem .Fields("Title") ' Store corresponding ISBN in List2 List2.AddItem .Fields("ISBN") .MoveNext ' Move to next record in the Recordset Loop End With End If End Sub

Khi user Click ImgSearch vi text pattern l ch Guide, ta s thy hnh di y:

Trong SELECT statement bn trn ta dng operator LIKE trn text pattern, ch Guide, c wildcard character (*) hai bn. Wildcard character l ch c (hay khng c) ch g cng c. Trong trng hp ny c ngha l h c ch Guide trong tiu sch l c, khng cn bit n nm u. Ngoi ra s chn la ny Khng c Case Sensitive, tc l ch guide, Guide hay GUIDE u c c. Khi user clicks nt Go, ta s dng method FindFirst ca Recordset myRS nh ch ca record c tr s Primary Key l hng text trong List2 tng ng vi tiu dc chn trong List1 nh sau:

208

Private Sub CmdGo_Click() Dim SelectedISBN As String Dim SelectedIndex As Integer Dim Criteria As String ' Index of line selected by user in List1 SelectedIndex = List1.ListIndex ' Obtain corresponding ISBN in List2 SelectedISBN = List2.List(SelectedIndex) ' Define Search criteria - use single quotes for selected text Criteria = "ISBN = '" & SelectedISBN & "'" ' Locate the record, it will become the current record myRS.FindFirst Criteria ' Display details of current record Displayrecord ' Make fraSearch disappeared fraSearch.Visible = False End Sub

Lu l trong string Criteria, v ISBN thuc loi text, ch khng phi l mt con s, nn ta phi kp n gia hai du ngoc n.

Bookmark
Khi di chuyn t record ny n record khc trong Recordset, i khi ta mun nh du v tr ca mt record c dp s tr li. Ta c th thc hin iu y bng cch ghi nh Bookmark ca Recordset. Th d khi user clicks nt Go, ta mun nh v tr ca record lc y sau ny quay tr li khi User clicks nt Go Back. Bn hy thm vo Form mt button tn CmdGoBack vi Caption Go Back. Ta s thm mt variable tn LastBookmark loi data type Variant:
Dim LastBookMark As Variant

Lc u button CmdGoBack invisible, v ch tr nn visible sau khi user clicks nt Go. Ta thm cc hng codes sau vo Sub CmdGo_Click() nh sau:

' Remember location of current record LastBookMark = myRS.BookMark CmdGoback.Visible = True

Di y l code quay tr li v tr current record trc y trong Recordset:


Private Sub CmdGoback_Click()

209

' Reposition record to last position myRS.BookMark = LastBookMark ' Redisplay details or current record Displayrecord End Sub

LastModified
LastModified l vi tr ca record va mi c sa i hay thm vo trong Recordset. th iu ny bn hy thm mt button invisible tn CmdLastModified vi caption l Last Modified. Button ny ch hin ra sau khi user clicks Update. Bt c lc no bn Click nt CmdLastModified, record mi va c sa i hay thm vo s hin th:
Private Sub CmdLastModified_Click() ' Reposition record to last position myRS.BookMark = myRS.LastModified ' Redisplay details or current record Displayrecord End Sub

Di y l hnh ca Form lc ang c thit k:

Ta s hc k thut ADO (ActiveX Data Object) trong bi ti.

Chng Mi Su - Lp trnh vi ADO (phn I)


Control Data ADO
210

Visual Basic 6 cho ta s la chn v k thut khi lp trnh vi database, hoc l dng DAO nh trong hai bi trc, hoc l dng ADO (ActiveX Data Objects). S khc bit chnh gia ADO v DAO l ADO cho php ta lm vic vi mi loi ngun d kin (data sources), khng nht thit phi l Access database hay ODBC. Ngun d kin c th l danh sch cc a ch Email, hay mt file text string, trong mi hng l mt record gm nhng fields ngn cch bi cc du phy (comma separated values). Nu trong DAO ta dng thng tn ca MSAccess Database th trong ADO cho ta ni vi (connect) mt database qua mt Connection bng cch ch nh mt Connection String. Trong Connection String c Database Provider (th d nh Jet, ISAM, Oracle, SQLServer..v.v.), tn Database, UserName/Password logon mt database .v.v.. Sau ta c th ly v (extract) nhng recordsets, v cp nht ha cc records bng cch dng nhng lnh SQL trn cc tables hay dng nhng stored procedures bn trong database. Bnh thng, khi ta mi khi ng mt project VB6 mi, Control Data ADO khng c sn trong IDE. Mun c n, bn hy dng Menu Command Project | Components..., ri chn Microsoft ADO Data Control 6.0 (OLEDB) t giao din Components nh di y:

Bn hy bt u mt d n VB6 mi, cho n tn ADODataControl bng cch click tn project trong Project Explorer bn phi ri edit property Name trong Properties Window. Sa tn ca form chnh thnh frmADO, v nh cu ADO DataControl Demo vo Caption ca n. DoubleClick ln Icon ca Control Data ADO trong Toolbox. Mt Control Data ADO tn Adodc1 s hin ra trn Form. Mun cho n nm bn di Form, ging nh mt StatusBar, hy set property Align ca n trong Properties Window thnh 2 - vbAlignBottom. Click bn phi hng property (Custom), k click ln nt browse c ba chm giao thoi Property Pages hin ra. Trong giao thoi ny, trn Tab General chn Radio (Option) Button Use Connection String ri click nt Build....

211

Trong giao thoi Data Link Properties, Tab Provider, chn Microsoft Jet 3.51 OLE DB Provider, ri click nt Next >> hay Tab Connection.

212

ch Select or enter a database name ta chn E:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB, trong computer ca bn c th file y nm trn disk C hay D. Sau , bn c th click nt Test Connection pha di th xem connection c c thit lp tt khng.

Lp connection xong ri, ta ch nh mun ly g v lm Recordset bng cch click property Recordsource ca Adodc1. Trong giao din Property Pages ca n chn 2-adCmdTable lm Command Type, k m Combo box cho Table or Stored Procedure Name chn table Titles.

Ty theo cch ta dng Recordset trong ADO, n c ba loi v c gi l Cursor Type. Cursor chng qua l mt tn khc ca Recordset:

Static Cursor: Static Cursor cho bn mt static copy (bn sao cng ngc) ca cc records. Trong lc bn dng Static Cursor, nu c ai khc sa i hay thm, bt g vo recordset bn s khng thy. Keyset Cursor: Keysey Cursor hn Static Cursor ch trong lc bn dng n, nu c ai sa i record no bn s bit. Nu ai delete record no, bn s khng thy n na. Tuy nhin bn s khng bit nu c ai thm mt record no vo recordset.

213

Dynamic Cursor: Nh ch sng ng (dynamic) hm , trong lc bn ang dng mt Dynamic Cursor, nu c ai khc sa i hay thm, bt g vo recordset bn s thy ht. Bn hy chn tr s 2-adOpenDynamic cho property Cursor Type ca Adodc1:

By gi bn hy t ln Form 4 labels vi captions: Title, Year Published, ISBN v Publisher ID. K cho thm 4 textboxes tng ng v t tn chng l txtTitle, txtYearPublished, txtISBN v txtPublisherID. thc hin Data Binding, bn hy chn textbox txtYearPublished (nm xut bn), ri set property Datasource ca n trong Properties Window thnh Adodc1. Khi click ln property DataField ca txtYearPublished v m ComboBox ra bn s thy lit k tn cc Fields trong table Titles. l v Adodc1 c coi nh trung gian ly table Titles t database. y ta s chn ct Year Published. Lp li cng tc ny cho 3 textboxes kia, v chn cc ct Title (Tiu ), ISBN (s l lch trong th vin quc t), v PubID (s l lch nh xut bn) lm DataField cho chng.

214

n y, mc du cha vit mt hng code no, bn c th chy chng trnh v n s hin th nh di y:

Bn c th ti v chng trnh dng Control Data ADO ny t y ADODatacontrol.zip.

Data Form Wizard


gip lp trnh vin thit k cc data forms nhanh hn, VB6 cho ta Data Form Wizard generate (pht sinh) ra mt form c h tr Edit, Add v Delete records. By gi bn hy khi ng mt standard project VB6 mi, tn ADOClass v copy MS Access file BIBLIO.MDB, tc l database, vo trong cng folder ca d n mi ny. Mun dng Data Form Wizard, trc ht ta phi thm n vo mi trng pht trin (IDE) ca VB6. Bn hy dng IDE Menu Command Add-Ins | Add-In Manager.... Chn VB6 Data Form Wizard trong giao thoi, ri click Checkbox Loaded/Unloaded ch Loaded hin bn phi hng "VB6 Data Form Wizard" nh trong hnh di y:

Nu bn mun mi ln khi ng VB6 IDE l c sn Data Form Wizard trong menu Add-Ins th ngoi option Loaded, bn click thm check box Load on Startup. Mt Add-In l mt menu Item mi m ta c th thm vo mt chng trnh ng dng c sn.

215

Thng thng, ngi ta dng Add-Ins thm chc nng cho mt chng trnh, lm nh l chng trnh c sn chc nng y t u. Bn hy khi ng Data Form Wizard t IDE Menu Command mi Add-Ins | Data Form Wizard...

Khi trang Data Form Wizard - Introduction hin ra, click Next

Trong trang k chn Access lm Database Type.

216

Trong trang Database, click Browse chn mt MS Access database file. y ta chn file BIBLIO.MDB t chnh folder ca chng trnh ny. on click Next.

Trong trang Form, ta chn Single Record cho Form Layout v Class cho Binding Type. on click Next. Nu ta chn ADO Data Control th kt qu s ging ging nh khi ta dng Control Data DAO nh trong mt bi trc.

Trong trang Record Source ta chn table Titles. Listbox ca Available Fields s hin th cc fields ca table Titles. Sau khi chn mt field bng cch click ln tn field y trong Listbox, nu bn click hnh tam gic ch qua phi th tn field y s c di qua nm di cng trong Listbox Selected Fields bn phi. Nu bn click hnh hai tam gic ch qua bn phi th tt c mi fields cn li bn tri s c di qua bn phi. Bn cng c th sp t v tr ca cc selected fields bng cch click ln tn field y ri click hnh mi tn ch ln hay xung di chuyn field y ln hay xung trong danh sch cc fields.

217

Ngoi ra, bn hy chn Title lm Column to Sort By trong ci Combobox ca n cc records trong Recordset c sp xp theo th t ABC (alphabetical order) ca field Tiu (Title).

Trong trang Control Selection, ta s y nguyn c mi buttons. Bn hy click Next.

Khi Data Form Wizard chm dt, n s generate form frmADODataForm. Bn hy remove Form1 v dng Menu Command Project | ADODataControl Properties... i Startup Object thnh frmADODataForm. Th l tm xong chng trnh Edit cc records ca table Titles.

218

Chng ta hy quan st ci Form v phn code c Data Form Wizard generated. Trong frmADODataForm, cc textboxes lm thnh mt array tn txtFields. Mi textbox u c property DataField nh sn tn field ca table Titles. Th d nh txtFields(2) c DataField l ISBN. Form chnh khng dng Control Data ADO nhng dng mt Object ca class clsTitles. Phn Initialisation ca class clsTitles l Open mt Connection v ly v mt Dataset c tn DataMember l Primary nh sau: Private Sub Class_Initialize() Dim db As Connection Set db = New Connection db.CursorLocation = adUseClient ' Open connection db.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=E:\Websites\Vovisoft\VisualBasic\ADOForm\BIBLIO.MDB;" ' Instantiate ADO recordset Set adoPrimaryRS = New Recordset ' Retrieve data for Recordset adoPrimaryRS.Open "select Title,[Year Published],ISBN,Description,Notes,PubID from Titles Order by Title", _ db, adOpenStatic, adLockOptimistic ' Define the only data member, named Primary DataMembers.Add "Primary" End Sub V v tr ca database, nu bn khng mun n cht cng mt folder no th dng App.Path xc nh mi lin h gia v tr ca database v folder ca chnh chng trnh ang chy, th d nh:

db.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=" & App.Path & "\BIBLIO.MDB;" Trong Sub Form_Load, ta c th dng For Each i qua ht cc textboxes trong array txtFields. V property Datasource ca textbox l mt Object nn ta dng keyword Set point

219

n n Object PrimaryCLS. ng thi ta cng phi ch nh tn ca DataMember ca mi textbox l Primary: Private Sub Form_Load() ' Instantiate an Object of class clsTitles Set PrimaryCLS = New clsTitles Dim oText As TextBox ' Iterate through each textbox in the array txtFields 'Bind the text boxes to the data source, i.e. PrimaryCLS For Each oText In Me.txtFields oText.DataMember = "Primary" ' Use Set because property Datasource is an Object Set oText.DataSource = PrimaryCLS Next End Sub Khi s di chuyn t record ny n record khc chm dt, chnh Recordset c raise Event MoveComplete. Event y c handled (gii quyt) trong class clsTitles bng cch li raise Event MoveComplete n c handled trong Form. Mun handle Event trong clsTitles ta phi declare recordset adoPrimaryRS vi WithEvents:

Dim WithEvents adoPrimaryRS As Recordset Private Sub adoPrimaryRS_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _ ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) ' Raise event to be handled by main form RaiseEvent MoveComplete End Sub V trong Form ta cng phi declare (object clsTitles) PrimaryCLS vi WithEvents: Private WithEvents PrimaryCLS As clsTitles Trong Form, Event MoveComplete s lm hin th v tr tuyt i (Absolute Position) ca record bng code di y:

Private Sub PrimaryCLS_MoveComplete() 'This will display the current record position for this recordset lblStatus.Caption = "Record: " & CStr(PrimaryCLS.AbsolutePosition) End Sub

220

Khi user clicks Refresh, cc textboxes s c hin th li vi chi tit mi nht ca record t trong recordset, nh khi c ai khc sa i record. Method Requery ca clsTitles li gi method Requery ca Recordset nh sau:

Private Sub cmdRefresh_Click() 'This is only needed for multi user applications On Error GoTo RefreshErr ' fetch the latest copy of Recordset PrimaryCLS.Requery Exit Sub RefreshErr: MsgBox Err.Description End Sub 'In Class clsTitles Public Sub Requery() ' Fetch latest copy of record adoPrimaryRS.Requery DataMemberChanged "Primary" End Sub

221

You might also like