• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Dùng Dictionary và SendMessage kiểm tra trùng

Các thủ thuật liên quan đến việc xử lý ứng dụng, biểu mẫu và control
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Dùng Dictionary và SendMessage kiểm tra trùng

Gửi bàigửi bởi truongphu » T.Sáu 07/09/2012 9:32 am

Thủ thuật: Dùng Dictionary và SendMessage kiểm tra trùng
Tác giả: truongphu
Mô tả: Dùng Dictionary và SendMessage kiểm tra trùng



Bài viết nầy minh họa cho nhiều câu hỏi kiểm tra trùng dữ liệu trên listbox (hay một mảng)
untitled.JPG
untitled.JPG (43.65 KiB) Đã xem 1853 lần

ListBox bên trái là dữ liệu ngẫu nhiên (có trùng)
List2 với Command kèm sẽ dùng Dictionary để loại các số liệu trùng của List1
List3 kèm command sẽ dùng Dictionary để tạo một danh sách số liệu ngẫu nhiên không trùng
và List4 kèm command sẽ dùng SendMessage để tạo một danh sách số liệu ngẫu nhiên không trùng

Code:
  1. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
  2. Const LB_FINDSTRING = &H18F
  3.  
  4. Private Sub Command1_Click()
  5.     If List2.ListCount Then Exit Sub
  6.     Dim Z As Object, i%, en%
  7.     Set Z = CreateObject("Scripting.Dictionary")
  8.     en = 999
  9.     Do Until i > en
  10.         If Z.Exists(List1.List(i)) Then
  11.             List2.AddItem List1.List(i)
  12.             List1.RemoveItem (i)
  13.             en = en - 1
  14.         Else
  15.             Z.Add List1.List(i), ""
  16.             i = i + 1
  17.         End If
  18.     Loop
  19.     MsgBox List1.ListCount & " " & List2.ListCount
  20. End Sub
  21.  
  22. Private Sub Command2_Click()
  23.     List3.Clear
  24.     Dim A As Object, en%, st$
  25.     Set A = CreateObject("Scripting.Dictionary")
  26.     en = 700
  27.     Do Until en = 0
  28.         st = CStr(Int(Rnd * 1000))
  29.         If Not A.Exists(st) Then
  30.             List3.AddItem st
  31.             A.Add st, ""
  32.             en = en - 1
  33.         End If
  34.     Loop
  35.     MsgBox List3.ListCount
  36. End Sub
  37.  
  38. Private Sub Command3_Click()
  39.     List4.Clear
  40.     Dim h&, en%, st$
  41.     en = 700
  42.     Do Until en = 0
  43.         st = CStr(Int(Rnd * 1000))
  44.         h = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal st)
  45.         If h = -1 Then
  46.             List4.AddItem st
  47.             en = en - 1
  48.         End If
  49.     Loop
  50.     MsgBox List4.ListCount
  51. End Sub
  52.  
  53. Private Sub Form_Load()
  54.     Randomize
  55.     Do
  56.         List1.AddItem Int(Rnd * 1000)
  57.     Loop Until List1.ListCount = 1000
  58. End Sub


Bạn sẽ thấy hiện tượng rất thú vị:
Hầu như mọi người đều cho rằng sử dụng các đối tượng chèn (object) sẽ làm việc chậm hơn là dùng các hàm API kinh điển.
Ở đây đối tượng chèn là CreateObject("Scripting.Dictionary") lại hoạt động nhanh hơn hàm API SendMessage, có thể nhận rõ bằng mắt thường!

Project: Đã test trên XP SP3
Kiêm Tra Danh Sách Trùng và loai ra.rar
(2.02 KiB) Đã tải 410 lần


Hay không? :-bd


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Quay về “[VB] Ứng dụng - Form và Control”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách