Chương Bảy Dùng List Controls (bài thứ

Một phần của tài liệu Khóa hàm thụ visual basic 6 0 (Trang 69 - 72)

hai)

Listbox

Cách dùng MultiSelect

Cho đến giờ User click vào Listbox để chọn chỉ một Item. Khi một Item

được chọn thì hàng ấy trở nên highlighted với background màu xanh đậm. Nếu kế đó ta click một hàng khác thì hàng cũ được display trở lại bình thường và hàng mới đuợc selected sẽ trở nên highlighted. Listbox cho ta có thể select nhiều Items cùng một lúc bằng cách set

Property MultiSelect = Extended

Ðối với MultiSelected Listbox, ta chọn một nhóm Items liên tục bằng cách click Item đầu rồi nhấn nút Shift trong khi click Item cuối. Ta cũng có thể

tiếp tục Select/Deselect thêm bằng cách ấn nút Ctrl trong khi click các Items. Nếu ta click một Item chưa được selected thì nó sẽ trở nên selected (highlighted màu xanh), nếu ta click một Item đã được selected rồi thì nó sẽ trở nên deselected (không còn màu xanh nữa). Thí dụ trong program bạn click "Peter Jones", kế đó ấn nút Shift trong khi click "Sue Rose", kế đó buông nút Shift ra để ấn nút Ctrl trong khi click "Kevin White", bạn sẽ

Ngoài ra bạn cũng có thể MultiSelect nhiều Items trong một Listbox bằng cách dùng mouse để drag, tức là bạn click lên Item đầu rồi tiếp tục đè mousebutton trong khi kéo mousepointer đến Item cuối cùng mới buông mousebutton ra.

Cái Bug ác ôn

Bây giờ giả sử ta muốn delete tất cả những Items vừa được selected (highlighted). Bạn hãy đặt một CommandButton mới tên CmdDeleteSelectedItems vào Form. Ta sẽ dùng Event Click của Button nầy để delete những selected Items. Một selected Item của lstNames sẽ

có property Selected của nó bằng True. Tức là nếu Item thứ ba (ListIndex=2) được selected thì ta có lstNames.Selected(2) = True. Ta có ý định sẽ iterate through mọi Items của lstNames, để xem Item nào

được selected thì mình sẽ delete nó bằng cách dùng method RemoveItem. Ta sẽ viết 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

Bạn hãy chạy chương trình, click Load để populate lstNames với các tên

đọc từ text file, rồi MultiSelect các tên như trong hình phía trên. Kế đó click button DeleteSelectedItems. Program sẽ té (crash) và có hình như

Nếu bạn click nút Debug, program sẽ ngừng tại dòng code gặp error và highlight nó với background màu vàng. Ðể mousepointer lên trên chữ i của lstNames.Selected(i), VB6 sẽ popup message nho nhỏ i = 4.

Bạn để ý thấy trong hình lúc nầy lstNames chỉ còn có 4 Items (Ron, Trevor, John và Alan), vì các Items kia đã bị removed. Bạn có biết tại sao program crashed không? Ðó là vì program đang refer

đến property Selected của Item thứ năm ( ArrayIndex i = 4) của lstNames trong khi lstNames bây giờ chỉ còn có 4 Items. Vì vậy program crashed với message "Runtime error '381': Invalid property array index". Thủ phạm của cái Bug ác ôn nầy là statement For i = 0 To lstNames.ListCount - 1. VB6 chỉ tính value của lstNames.ListCount -1

một lần lúc khởi sự For..Loop mà thôi (tức là lstNames.ListCount -1 = 6), nó không lưu ý là ListCount giảm value mỗi lần một Item bị Removed. Ngoài ra ta thấy tên "Trevor Kennedy" cũng không bị removed, tức là nó bị lọt sổ nếu ta dùng For..Loop theo cách nầy. Lý do là sau khi ta Remove "Peter Jones" (Item thứ hai), "Trevor Kennedy" bị đẩy lên và trở thành Item thứ hai mới. Kế đó ta increment value của i thành 2 rồi process Item thứ ba, tức là "Sue Rose", nên "Trevor Kennedy" không hề được processed.

Bạn có thể download program có bug nầy để chạy thử cho biết. Sub CmdDeleteSelectedItems_Click cần phải được viết lại để dùng While ... Loop, thay vì For...Loop. Trong While...Loop, lstNames.ListCount - 1

thì ta không increment i, vì Item ngay dưới removed Item được đẩy lên. Listing mới như sau:

Private Sub CmdDeleteSelectedItems_Click()

Dim i

Một phần của tài liệu Khóa hàm thụ visual basic 6 0 (Trang 69 - 72)

Tải bản đầy đủ (PDF)

(185 trang)