Vn-Screen Forum
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.



 
Trang ChínhTrang Chính  GalleryGallery  Latest imagesLatest images  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  
Bài Viết MớiTin NóngThống kê

Share | 
 

 Chương Bảy - Dùng List Controls (Học visual basic 6.0)

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
TjaGoChangLj
Administrator
Administrator
TjaGoChangLj

Thanked : 14


Chương Bảy - Dùng List Controls (Học visual basic 6.0) _
Bài gửiTiêu đề: Chương Bảy - Dùng List Controls (Học visual basic 6.0)   Chương Bảy - Dùng List Controls (Học visual basic 6.0) Empty15/6/2011, 10:09 pm

Khóa Hàm Thụ Visual Basic 6.0


Chương Bảy - Dùng List Controls





Có hai loại List controls dùng trong VB6. Ðó là Listbox và Combobox. Cả hai đều display một số hàng để ta có thể lựa chọn.
Listbox chiếm một khung chữ nhật, nếu chiều ngang nhỏ thì có khi không
display đầy đủ một hàng, nếu chiều dài không đủ để display tất cả mọi
hàng thì Listbox tự động cho ta một vertical scroll bar để cho biết còn
có nhiều hàng bị che và ta có thể xem các hàng ấy bằng cách dùng
vertical scroll bar.
Combobox thường thường chỉ display một hàng, nhưng ta có thể chọn
display bất cứ hàng nào khác. Combobox giống như một tập hợp của một
Textbox nằm phía trên và một Listbox nằm phía dưới.
<blockquote>Chương Bảy - Dùng List Controls (Học visual basic 6.0) ListControls</blockquote>
Listbox có rất nhiều công dụng vì nó rất uyển chuyển. Trong chương nầy ta sẽ học qua các áp dụng sau của Listbox:

  • Display nhiều sự lựa chọn để User selects bằng cách click hay drag-drop
  • Những cách dùng Property Sorted
  • Cách dùng Multiselect
  • Dùng để display Events
  • Dùng để Search hay process text
  • Cách dùng Itemdata song song với các Items của List
  • Dùng làm Queue


Listbox



Display nhiều sự lựa chọn


Ta hãy bắt đầu viết một chương trình gồm có một Listbox tên lstNames nằm trong một Form. Trong lstNames ta đánh vào tên của bảy người, mỗi lần xuống hàng nhớ đánh Ctrl-Enter, thay vì chỉ Enter, nếu không VB6 tưởng ta đã đánh xong nên close property List. Các tên nầy là những hàng
sẽ hiện ra trong Listbox khi ta bắt đầu chạy program.
<blockquote>Chương Bảy - Dùng List Controls (Học visual basic 6.0) ListContent</blockquote>
Ngoài lstNames ta cho thêm một Label với Caption STUDENTS để trang hoàng, và một Label khác tên lblName. Mỗi khi User click lên hàng tên nào ta muốn display hàng tên ấy trong lblName. Sau cùng ta cho vào một CommandButton tên CmdExit để cho User phương tiện Stop cái program. Ta sẽ có chương trình như sau:
<blockquote><blockquote>
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

</blockquote></blockquote>
Giả sử ta click vào tên John Smith trên Listbox, ta sẽ thấy tên ấy cũng đuợc display trong Label lblName.
<blockquote><blockquote>Chương Bảy - Dùng List Controls (Học visual basic 6.0) ListChoice</blockquote></blockquote>
Trong thí dụ nầy, Listbox lstNames có 7 hàng ( Items). Con số Items nầy là Property ListCount của Listbox. Các Items của Listbox được đếm từ 0 đến ListCount-1. Trong trường hợp nầy là từ 0 đến 6.
Khi User click lên một hàng, Listbox sẽ generate Event lstNames_Click. Lúc bấy giờ ta có thể biết được User vừa mới Click hàng nào bằng cách hỏi Property ListIndex
của lstNames, nó sẽ có value từ 0 đến ListCount-1. Lúc program mới
chạy, chưa ai Click lên Item nào của Listbox thì ListIndex = -1.
Nhũng Items trong Listbox được xem như một Array của String. Array nầy được gọi là List. Do đó, ta nói đến Item thứ nhất của Listbox lstNames bằng cách viết lstNames.List(0) , và tương tợ như vậy, Item cuối cùng là lstNames.List( lstNames.ListCount-1).
Ta có thể nói đến item vừa được Clicked bằng hai cách: hoặc là lstNames.List(lstNames.ListIndex), hoặc là lstNames.text.

Save content của Listbox


Bây giờ để lưu trử content của lstNames, ta thêm một CommandButton tên CmdSave. Ta sẽ viết code để khi User click nút CmdSave program sẽ mở một Output text file và viết mọi items của lstNames vào đó:
<blockquote><blockquote>
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

</blockquote></blockquote>
App là một Object đặc biệt đại diện cho chính cái program đang chạy. Ở đây ta dùng Property Path
để biết lúc program đang chạy thì execute module EXE của nó nằm ở đâu.
Lý do là thường thường ta để các files liên hệ cần thiết cho program
lẩn quẩn hoặc ngay trong folder của program hay trong một subfolder,
chẳng hạn như data, logs, .v.v..
App còn có một số Properties khác cũng rất hữu dụng như PrevInstance, Title, Revision ..v.v.
Nếu mới started một program mà thấy App.PrevInstance = True thì lúc bấy
giờ cũng có một copy khác của program đang chạy. Nếu cần ta End program
nầy để tránh chạy 2 copies của program cùng một lúc.
App.Title và App.Revision cho ta tin tức về Title và Revision của program đang chạy.
Ðể viết ra một Text file ta cần phải Open nó trong mode Output
và tuyên bố từ rày trở đi sẽ dùng một con số (FileNumber) để đại diện
cái File thay vì dùng chính FileName. Ðể tránh dùng một FileNumber đã
hiện hữu, tốt nhất ta hỏi xin Operating System cung cấp cho mình một con
số chưa ai dùng bằng cách gọi Function FreeFile. Con số FileNumber nầy còn đuợc gọi là FileHandle (Handle là tay cầm). Sau khi ta Close FileNumber con số nầy trở nên FREE và Operating System sẽ có thể dùng nó lại.
Do đó bạn phải tránh gọi FreeFile liên tiếp hai lần, vì OS sẽ cho bạn
cùng một con số. Tức là, sau khi gọi FreeFile phải dùng nó ngay bằng
cách Open một File rồi mới gọi FreeFile lần kế để có một con số khác.
Ðể ý cách dùng chữ Input, Output cho files là relative (tương
đối) với vị trí của program (nó nằm trong memory của computer). Do đó
từ trong memory viết ra hard disk thì nói là Output. Ngược lại đọc từ
một Text file nằm trên hard disk vào memory cho program ta thì gọi là
Input.

Load một Text file vào Listbox


Trong bài nầy, thay vì đánh các Items
của Listbox vào Property List của lstNames ta có thể populate (làm đầy)
lstNames bằng cách đọc các Items từ một Text file. Ta thử thêm một
CommandButton tên CmdLoad. Ta sẽ viết code để khi User click nút CmdLoad program sẽ mở một Input text file và đọc từng hàng để bỏ vào lstNames:
<blockquote><blockquote>
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

</blockquote></blockquote>
Ðể đọc từ một Text file ta cần phải Open nó trong mode Input.
Trước khi populate lstNames ta cần phải delete tất cả mọi items có sẵn bên trong. Ðể thực hiện việc đó ta dùng method Clear của Listbox.
Sau đó ta dùng method AddItem
để cho thêm từng hàng vào trong Listbox. By default, nếu ta không nói
nhét vào ở chỗ hàng nào thì AddItem nhét Item mới vào dưới chót của
Listbox.
Nếu muốn nhét hàng mới vào ngay trước item thứ 5 (ListIndex = 4), ta viết:
<blockquote><blockquote>
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

</blockquote></blockquote>
Nhớ là mỗi lần bạn Add một Item vào Listbox thì ListCount của Listbox increment by 1.
Muốn delete một item từ Listbox ta dùng method RemoveItem, thí dụ như muốn delete item thứ ba (ListIndex=2) của lstNames, ta viết:
<blockquote><blockquote>
lstNames.RemoveItem 2

</blockquote></blockquote>
Mỗi lần bạn RemoveItem từ Listbox the ListCount của Listbox decrement by
1. Do đó nếu bạn dùng cái Test dựa vào ListCount của một ListBox để
nhảy ra khỏi một Loop thì phải coi chừng tránh làm cho value ListCount
thay đổi trong Loop vì AddItem hay RemoveItem.
Ta đọc từng hàng của một Text file bằng cách dùng Line Input #FileNumber.
Khi đọc đến cuối File, system dẽ cho ta value EOF(FileNumber) = True.
Ta dùng value ấy để cho program nhảy ra khỏi While.. Loop.
Câu Do While NOT EOF(FileNumber) có nghĩa Trong khi chưa đến End-Of-File của Text File đại diện bởi FileNumber thì đọc từ hàng và bỏ vào Listbox. Giống như "Trong khi chưa trả hết nợ nhà vợ thì phải tiếp tục ở rể".

Drag-Drop


Ta đã học qua Click Event của Listbox.
Bây giờ để dùng Drag-Drop cho Listbox bạn hãy đặt 2 Labels mới lên Form.
Cái thứ nhất tên gì cũng được nhưng có Caption là Room A. Hãy gọi Label thứ hai là lblRoom và cho Property BorderStyle
của nó bằng Fixed Single. Kế đến select cả hai Labels (Click a Label
then hold down key Ctrl while clicking the second Label) rồi click copy
và paste lên Form. VB6 sẽ cho bạn Array của hai lblRoom labels.
Ðể cho lstNames một DragIcon, bạn click lstNames, click Property
DragIcon để pop-up một dialog cho bạn chọn một dragdrop icon từ folder C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Dragdrop, chẳng hạn như DRAG2PG.ICO:
Chương Bảy - Dùng List Controls (Học visual basic 6.0) DragIcon

Ta sẽ dùng Event MouseDown của lstNames để pop-up DragIcon hình 2
trang giấy cho User Drag nó qua bên phải rồi bỏ xuống lên một trong hai
lblRoom. Khi DragIcon rơi lên lblRoom, lblRoom sẽ generate Event DragDrop. Ta sẽ dùng Event DragDrop nầy để assign property Text của Source
(tức là lstNames, cái control từ nó phát xuất Drag action) vào Property
Caption của lblRoom. Lưu ý vì ở đây ta dùng cùng một tên cho cả hai
lblRoom nên chỉ cần viết code ở một chỗ để handle Event DragDrop.
<blockquote><blockquote>
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

</blockquote></blockquote>
Kết quả sau khi Drag hai tên từ Listbox qua Labels là như sau:
<blockquote><blockquote>Chương Bảy - Dùng List Controls (Học visual basic 6.0) DragDrop</blockquote></blockquote>

Bạn có thể download chương trình nầy (MyList.zip) để có luôn cả project.

Dùng Property Sorted


Trong thí dụ trên ta có thể quyết định
vị trí của một Item mới khi ta nhét nó vào Listbox. Ðôi khi ta muốn các
Items của Listbox được tự động sắp theo thứ tự Alphabet. Bạn có thể set Property Sorted = True
để thực hiện chuyện nầy. Có một giới hạn là bạn phải cho Property
Sorted một value (True hay False) trong lúc design, chớ trong khi chạy
program bạn không thể làm cho Property Sorted của Listbox thay đổi.
Giả dụ ta muốn sort các Items của một Listbox khi cần. Vậy thì ta làm
sao? Giải pháp rất đơn giản. Bạn tạo một Listbox tên lstTemp chẳng hạn.
Cho nó Property Visible= False (để không ai thấy nó) và Property
Sorted=True. Khi cần sort lstNames chẳng hạn, ta copy content của
lstNames bỏ vào lstTemp, đoạn Clear lstNames rồi copy content (đã được
sorted) của lstTemp trở lại lstNames.
Lưu ý là ta có thể AddItem vào
một Listbox với Property Sorted=True, nhưng không thể xác định nhét
Item vào trước hàng nào, vì vị trí của các Items do Listbox quyết định
khi nó sort các Items.
Ta hãy cho thêm vào Form một CommandButton mới tên CmdSort và viết code cho Event Click của nó như sau:
<blockquote><blockquote>
Private Sub CmdSort_Click()
Dim i
lstTemp.Clear ' Clear temporary Listbox
' Iterate though every item of lstNames
For i = 0 To lstNames.ListCount - 1
' Add the lstNames item to lstTemp
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

</blockquote></blockquote>
Nhân tiện, ta muốn có option để sort các tên theo FirstName hay Surname.
Việc nầy hơi rắc rối hơn một chút, nhưng nguyên tắc vẫn là dùng cái
sorted Listbox vô hình tên lstTemp.
Bạn hãy đặt lên phía trên lstName hai cál Labels mới tên lblFirstName và
lblSurName và cho chúng Caption "FirstName" và "SurName".
Từ đây ta Load file "MyList.txt" vào lstNames bằng cách Click button
CmdLoad chớ không Edit Property List của lstNames để enter Items lúc
design nữa. Ngoài ra ta dùng dấu phẩy (,) để tách FirstName khỏi SurName
trong mỗi tên chứa trong file MyList.txt. Content của file MyList.txt
bây giờ trở thành như sau:
<blockquote><blockquote>
Peter,Jones
Kevin,White
Sue,Rose
John,Smith
Trevor,Kennedy
Alan,Wright
Ron,Bruno

</blockquote></blockquote>
Ta sẽ sửa code trong Sub CmdLoad_Click lại để khi nhét tên vào lstNames, FirstName và SurName mỗi thứ chiếm 10 characters.
Ðể các chữ trong Items của lstNames sắp hàng ngay ngắn ta đổi Font của
lstNames ra Courier New. Courier New là một loại Font mà chiều ngang của
chữ m bằng chữ i, trong khi hầu hết các Fonts khác như Arial, Times Roman ..v.v. là Proportional Spacing, có nghĩa là chữ m rộng hơn chữ i.
Listing mới của Sub CmdLoad_Click trở thành như sau:
<blockquote><blockquote>
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
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

</blockquote></blockquote>
Vì FirstName nằm ở bên trái của mỗi Item nên sort theo FirstName cũng
giống như sort cả Item. Việc ấy ta đã làm bằng Sub CmdSort_Click rồi, do
đó khi User click Label lblFirstName ta chỉ cần gọi CmdSort_Click như
sau:
<blockquote><blockquote>
Private Sub lblFirstName_Click()
CmdSort_Click
End Sub

</blockquote></blockquote>
Ðể sort theo SurName ta cần phải tạm thời để SurName qua bên trái của
Item trước khi bỏ vào lstTemp. Ta thực hiện chuyện nầy bằng cách hoán
chuyển vị trí của FirstName và SurName trong Item trước khi bỏ vào
lstTemp. Sau đó, khi copy các Items từ lstTemp để bỏ vô lại lstNames ta
lại nhớ hoán chuyển FirstName và SurName để chúng nằm đúng lại vị trí.
Tức là, cái mánh của ta là muốn biết Item nào phải nằm ở đâu trong
lstNames, chớ dĩ nhiên khi display mỗi Item đều có FisrtName bên trái.
Code để sort tên theo SurName cũng giống như CmdSort_Add nhưng thêm thắt
chút ít như sau:
<blockquote><blockquote>
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)
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

</blockquote></blockquote>
Các Items trong lstNames sorted theo SurName hiện ra như sau:
<blockquote><blockquote>Chương Bảy - Dùng List Controls (Học visual basic 6.0) SortedList</blockquote></blockquote>

Nhân tiện đây ta sửa cái Sub CmdSave_Click lại một chút để Save Items theo sorted order mới nếu cần:
<blockquote><blockquote>
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
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

</blockquote></blockquote>
Bạn có thể download chương trình nầy (SortedList.zip) để có luôn cả project.
Trong bài tới ta sẽ học thêm các áp dụng khác của ListBox.
Chữ Ký Cá Nhân
Về Đầu Trang Go down
TjaGoChangLj
Administrator
Administrator
TjaGoChangLj

Thanked : 14


Chương Bảy - Dùng List Controls (Học visual basic 6.0) _
Bài gửiTiêu đề: Re: Chương Bảy - Dùng List Controls (Học visual basic 6.0)   Chương Bảy - Dùng List Controls (Học visual basic 6.0) Empty15/6/2011, 10:09 pm

Mệt rồi !!! Chương Bảy - Dùng List Controls (Học visual basic 6.0) 343189 Bữa nào post thêm mấy chương cuối !!!
Chữ Ký Cá Nhân
Về Đầu Trang Go down
 

Chương Bảy - Dùng List Controls (Học visual basic 6.0)

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Vn-Screen Forum :: Công Nghệ Thông Tin :: Khu Lập Trình :: Visual Basic-
VN-SCREEN.DARKBB.COM
Design by N.H.M - Developed by Vn-Screen Member
Free forum | ©phpBB | Free forum support | Báo cáo lạm dụng | Thảo luận mới nhất