Lp trình trc quan
115
BÀI 15. DÙNG LIST CONTROLS
Có hai loi List controls dùng trong VB6. Ðó là Listbox và Combobox. C hai đều hin th
mt s dòng để ta có th la chn. Listbox chiếm mt khung ch nht, nếu chiu ngang nh
thì có khi không hin th đầy đủ mt dòng, nếu chiu dài không đủ để hin th tt c mi dòng
thì Listbox t động cho ta mt vertical scroll bar để cho biết còn có nhiu dòng b che và ta có
th xem các dòng y bng cách dùng vertical scroll bar.
Combobox thường ch hin th mt dòng, nhưng ta có th chn hin th bt c dòng nào
khác. Combobox ging như mt tp hp ca mt Textbox nm phía trên và mt Listbox nm
phía dưới.
Listbox có rt nhiu công dng vì nó rt uyn chuyn khi s dng. Trong bài này chúng ta s
xem xét các ng dng sau ca Listbox :
- Hin th nhiu s la chn để người s dng có th chn bng cách click hay drag-drop
- Nhng cách dùng Property Sorted
- Cách dùng Multiselect
- Dùng để hin th Events
- Dùng để Search hay x lý text
- Cách dùng Itemdata song song vi các Items ca danh sách
- Dùng làm Queue
Lp trình trc quan
116
15.1. Listbox
15.1.1 Hin th nhiu s la chn
Ta hãy bt đầu viết mt chương trình gm có mt Listbox tên lstNames nm trong mt
Form. Trong lstNames ta đánh vào tên ca by người, mi ln xung dòng nh đánh Ctrl-
Enter, thay vì ch Enter, nếu không VB6 ngm hiu đã đánh xong nên t đóng ca s
Property List. Các tên này là nhng dòng s hin ra trong Listbox khi ta bt đầu chy chương
trình.
Ngoài lstNames ta cho thêm mt Label vi Caption STUDENTS để trang trí, và mt Label
khác tên lblName. Mi khi người s dng click lên dòng tên nào ta mun hin th dòng tên y
trong lblName. Sau cùng ta cho vào mt CommandButton tên CmdExit để cho dùng dng
chương trình. Ta s có chương trình như sau:
Private Sub lstNames_Click()
lblName.Caption = lstNames.List(lstNames.ListIndex)
End Sub
Private Sub CmdExit_Click()
End
End Sub
Lp trình trc quan
117
Gi s ta click vào tên John Smith trên Listbox, ta s thy tên y cũng đuc hin th trong
Label lblName.
Trong ví d này, Listbox lstNames có 7 dòng (Items). Con s Items này là Property
ListCount ca Listbox. Các Items ca Listbox được đếm t 0 đến ListCount-1. Trong trường
hp này là t 0 đến 6.
Khi người s dng click lên mt dòng, Listbox s generate Event lstNames_Click. Lúc
by gi ta có th biết được người s dng va mi Click dòng nào bng cách hi Property
ListIndex ca lstNames, nó s có value t 0 đến ListCount-1. Lúc chương trình mi chy,
chưa ai Click lên Item nào ca Listbox thì ListIndex = -1.
Nhng Items trong Listbox được xem như mt mng xâu ký t. Array này được gi là List.
Do đó, ta nói đến Item th nht ca Listbox lstNames bng cách viết lstNames.List(0) , và
tương t như vy, Item cui cùng là lstNames.List( lstNames.ListCount-1).
Ta có th nói đến item va được Clicked bng hai cách:
- lstNames.List(lstNames.ListIndex)
- lstNames.text.
15.1.2 Save content ca Listbox
Bây gi để lưu tr ni dung ca lstNames, ta thêm mt CommandButton tên CmdSave. Ta
s viết code để khi người s dng click nút CmdSave chương trình s m mt Output text file
và viết mi items ca lstNames vào đó:
Lp trình trc quan
118
Private Sub CmdSave_Click()
Dim i, FileName, FileNumber
FileName = App.Path
' Make sure FileName ends with a backslash
If Right(FileName, 1) <> "\" Then FileName = FileName & "\"
FileName = FileName&"MyList.txt" 'output text file MyList.txt
' Obtain an available filenumber from the operating system
FileNumber = FreeFile
' Open the FileName as an output file
Open FileName For Output As FileNumber
' Now iterate through each item of lstNames
For i = 0 To lstNames.ListCount - 1
' Write the List item to file
Print #FileNumber, lstNames.List(i)
Next
Close FileNumber ' Close the output file
End Sub
App là mt Object đặc bit đại din cho chính chương trình đang chy. đây ta dùng
Property Path để biết lúc chương trình đang chy thì thc thi module EXE ca nó nm đâu.
Lý do là ta thường để các files liên h cn thiết cho chương trình ln qun hoc ngay trong
folder ca chương trình hay trong mt subfolder, chng hn như data, logs, .v.v..
App còn có mt s Properties khác cũng rt hu dng như PrevInstance, Title, Revision
..v.v.
Nếu mi khi động mt chương trình mà thy App.PrevInstance = True thì lúc by gi cũng
có mt copy khác ca chương trình đang chy. Nếu cn ta End program này để tránh chy 2
bn sao ca chương trình cùng mt lúc.
App.Title và App.Revision cho ta tin tc v Title và Revision ca chương trình đang chy.
Ð viết ra mt Text file ta cn phi Open nó trong mode Output và khai báo t đây tr đi s
dùng mt con s (FileNumber) để đại din tp tin thay vì dùng chính FileName. Ð tránh dùng
mt FileNumber đã hin hu, tt nht ta hi xin h điu hành cung cp cho mình mt con s
chưa ai dùng bng cách gi Function FreeFile. Con s FileNumber này còn đuc gi là
FileHandle (Handle là tay cm). Sau khi ta Close FileNumber con s này tr nên FREE và h
điu hành s có th dùng nó li.
Lp trình trc quan
119
Do đó chúng ta phi tránh gi FreeFile liên tiếp hai ln, vì OS s cho chúng ta cùng mt
con s. Tc là, sau khi gi FreeFile phi dùng nó ngay bng cách Open mt File ri mi gi
FreeFile ln kế để có mt con s khác.
Ð ý cách dùng ch Input, Output cho files là relative (tương đối) vi v trí ca chương
trình (nó nm trong memory ca computer). Do đó t trong memory viết ra đĩa cng thì gi là
Output. Ngược li đọc t mt Text file nm trên hard disk vào memory cho chương trình ta thì
gi là Input.
15.1.3 Load mt Text file vào Listbox
Trong bài này, thay vì đánh các Items ca Listbox vào Property List ca lstNames ta có th
populate (làm đầy) lstNames bng cách đọc các Items t mt Text file. Ta th thêm mt
CommandButton tên CmdLoad. Ta s viết code để khi người s dng click nút CmdLoad
chương trình s m mt Input text file và đọc tng dòng để b vào lstNames:
Private Sub CmdLoad_Click()
Dim i, FileName, FileNumber, anItem
' Obtain Folder where this program's EXE file resides
FileName = App.Path
' Make sure FileName ends with a backslash
If Right(FileName, 1) <> "\" Then FileName = FileName & "\"
FileName = FileName & "MyList.txt"
' Obtain an available filenumber from the operating system
FileNumber = FreeFile
' Open the FileName as an input file
Open FileName For Input As FileNumber
lstNames.Clear ' Clear the Listbox first
' Now read each line until reaching End-Of-File
Do While NOT EOF(FileNumber)
Line Input #FileNumber, anItem ' Read a line from the file
lstNames.AddItem anItem ' Add this item to the lstNames
Loop
Close FileNumber ' Close the input file
End Sub
Ð đọc t mt Text file ta cn phi Open nó trong mode Input.