• Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"
  • Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    ongke0711 > 01-03-16, 10:41 PM

    Nhờ các bạn chỉ giùm cái thủ thuật này.
    Có thể cái tiêu đề chưa thật sự chính xác nên các bạn xem giùm cái đoạn video dưới đây.
    Đây là chương trình quản lý phòng khám của tác giả Trần Quốc Vinh giới thiệu trên Youtube, tôi thấy cái thủ thuật rất hay là khi gõ một từ nào đó vào textbox thì nó sẽ hiện luôn các kết quả tìm kiếm để chọn và thêm vào cùng 1 dòng textbox đó chuỗi kết quả vừa tìm được. Sau đó gõ từ để tìm tiếp và lại thêm kết qủa nối tiếp chuỗi.
    Video:


    Các bạn hướng dẫn giùm kỹ thuật này nhé.
    Cám ơn cac bạn trước.
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    maidinhdan > 02-03-16, 11:07 AM

    (01-03-16, 10:41 PM)ongke0711 Đã viết: Nhờ các bạn chỉ giùm cái thủ thuật này.
    Có thể cái tiêu đề chưa thật sự chính xác nên các bạn xem giùm cái đoạn video dưới đây.
    Đây là chương trình quản lý phòng khám của tác giả Trần Quốc Vinh giới thiệu trên Youtube, tôi thấy cái thủ thuật rất hay là khi gõ một từ n


    Các bạn hướng dẫn giùm kỹ thuật này nhé.
    Cám ơn cac bạn trước.

    Kỹ thuật này rất đơn giản.

    Xin được ví dụ:

    Ta có những thứ như sau:

    + Tạo 1 TextboxA: tạm gọi là txtA ( nơi sẽ nhập vào như Video được hỏi trên)
    + Tạo 1 form Tạm tên là frTam; trong form này có 1 combox ( tên cbDanhsachtruyxuat, thằng này tham chiếu đến danh sách đang chờ lấy), combobox này sau khi được Enter phải đóng cả form frmTam lại

    Ta bắt tay vào làm thôi.

    Bước 1: Nhúng form frTam vào form chứa txtA
    Bước 2: Tại form chứa txtA Cho rằng cái nháy chuột đang nằm ở ô txtA, ở sự kiện Keypress khi gõ 1 cụm từ nào đó nó sẽ tham chiếu đến frTam và truy xuất thẳng đến cbDanhsachtruyxuat, Sau khi kiếm được từ cần lấy thì Enter để lấy và điền vào txtA.

    Nếu tiếp tục gõ dấu phẩy lại quay về bước 2.

    * Đó là phương thức để viết code theo Video yêu cầu phía trên.


    Chú ý ( cái này có hay không cũng không sao, có thì nó đẹp hơn thôi): phải viết một Modules để cho form frTam cho đúng vị trí hiển thị như một cobo Listbox ( code này bạn có thể tìm hiểu từ Demo chọn ngày tháng bằng Calender của mình trên diễn đàn để lấy mà dùng)

    Vài ngày nửa mình gửi Demo lên để cùng thảo luận cùng Ongke nhé, cần gấp thì để lại Email tối nay mình gửi.

    Thân ái!
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    ongke0711 > 02-03-16, 02:12 PM

    Cảm ơn bác maidinhdan nhiều. Để tôi làm thử theo gợi ý xem sao.
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    tt1212 > 02-03-16, 10:50 PM

    mai dinh dan cho mình vơi nhe: thietgialam@gmail.com
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    MTNQ > 03-03-16, 09:33 AM

    Cái này đơn giản chỉ là thủ thuật tìm kiếm, kết quả hiển thị trên một listbox với chiều cao mặc định  = 0
    -Khi nhập dữ liệu vào textbox ta cho list hiển thị bằng cách set chiều cao cho listbox
    -Khi textbox mất focus thì listbox.Height = 0

    Trước đây MTNQ viết một class: clsAutoSearch nhằm giả lập ComboBox. tuy nhiên muốn đem lên đây thì phải sửa lại khá nhiều (Thêm các bẫy lỗi, các tùy chọn, dự trù thêm nhiều tình huống có thể xảy ra...) do nó mang tính cộng đồng. Mặc dù gọi class chỉ cần 1 hoặc vài dòng lệnh nhưng phải giải thích khá nhiều về cách sử dụng cũng như tùy biến các thuộc tính, giá trị... Nên mình lười up lên  015
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    tt1212 > 03-03-16, 01:50 PM

    Mình vẽ một text box và một combox phai không bác nhỉ.
    Rồi so sánh hay sao nhỉ?
    Chưa hiểu lắm bác a, bác có thể hướng dẫn thêm  ko?Mình vẽ một text box và một combox phai không bác nhỉ.
    Rồi so sánh hay sao nhỉ?
    Chưa hiểu lắm bác a, bác có thể hướng dẫn thêm  ko?
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    MTNQ > 03-03-16, 03:46 PM

    (03-03-16, 01:50 PM)tt1212 Đã viết: Mình vẽ một text box và một combox phai không bác nhỉ.
    Rồi so sánh hay sao nhỉ?
    Chưa hiểu lắm bác a, bác có thể hướng dẫn thêm  ko?

    Mình làm như thế này:
    1/ trên form vẽ một list box với các thông số sau: Left:=0, Top:=0, Width:=0, Height:=0
    Chạy hàm sau đây nó sẽ tự động tạo một list box có tên lstAutoSearch trên form (nhớ thay frmTimkiem bằng tên form của bạn ):

    Mã:
    Sub CreateCtrl_lstAutoSearch()
       Const strForm = "frmTimkiem" 'Thay frmTest bang ten form ban muon tao List Box cho clsAutoSearchData
       Const strCtl = "lstAutoSearch"
       Dim frm As Form
       Dim ctl As Control
       DoCmd.OpenForm FormName:=strForm, View:=acDesign, windowmode:=acHidden
       Set frm = Forms(strForm)
       
       Set ctl = CreateControl(FormName:=strForm, ControlType:=acListBox, Section:=acDetail, _
           Left:=0, Top:=0, Width:=0, Height:=0)
       With ctl
           .Name = strCtl
           '.BorderStyle = 0
           .BorderWidth = 0
           .TabStop = False
           .RowSourceType = "Table/Query"
           .Visible = False
       End With

    ' Save the form, close and reopen it
       DoCmd.Close ObjectType:=acForm, ObjectName:=strForm, Save:=acSaveYes
       DoCmd.OpenForm FormName:=strForm, View:=acNormal
    ' Or Switch to form view
       'RunCommand acCmdFormView
    End Sub

    2/Khi điều khiển nhận focus, ta đưa listbox đến ngay bên dưới với code tương tự như sau:
    Mã:
    With mLstBox
                       .Top = mActiveCtrl.Top + mActiveCtrl.Height
                       .Left = mActiveCtrl.Left
                       .Width = mActiveCtrl.Width
                      Set .Recordset = Nothing
                   End With
    Với mLstBox là lstAutoSearch và  mActiveCtrl là điều khiển đang có focus

    3/Khi người dùng nhập dữ liệu ta bắt đầu tạo Source cho  lstAutoSearch  và dùng thuộc tính Filter của Recordset để lọc theo dữ liệu đang được nhập trên điều khiển. Code sẽ  như sau:
    Mã:
    If Not (rstFiltered.EOF And rstFiltered.BOF) Then
           With mLstBox
               .Height = 1440
               .ColumnCount = miFldsNum
               Set .Recordset = rstFiltered
               .Visible = True
           End With
       End If

    4/Việc lấy dữ liệu từ listbox (Lst) lên điều khiển (Ctrl) dựa vào sự kiện KeyDown của Ctrl và Lst
    Nó tương tự như sau:
    Mã:
    Private Sub mLstBox_KeyDown(KeyCode As Integer, Shift As Integer)
       If KeyCode = 13 Or KeyCode = 9 Then
           BuildLstEvent "PreviousCtrl"
       End If
    End Sub

    Private Sub mLstBox_DblClick(Cancel As Integer)
        BuildLstEvent "PreviousCtrl"
    End Sub

    Private Function BuildLstEvent(strEvent As String, Optional mActiveCtrl As Control, _
                                    Optional blnLstActive As Boolean) As Boolean
    On Error GoTo Err_BuildLstEvent
       ...
    Select Case KeyCode
    ...
            Case "PreviousCtrl"
                On Error Resume Next
                mPreviousCtrl.SetFocus
                With mLstBox
                    .Height = 0
                    Set .Recordset = Nothing
                    .Visible = False
                End With
    End Select
      ...
    End Function

    ...

    5/Việc hiển thị kết quả tìm kiếm nhanh hay chậm phụ thuộc nhiều vào thuật toán và nguồn dữ liệu. Theo kinh nghiệm của mình thì table nguồn lớn hơn 20 000 record sẽ không thực hiện việc tìm kiếm ở các sự kiện như On Change của Ctrl mà hiển thị khi người dùng bấm một phím tắt nào đó
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    MTNQ > 03-03-16, 03:59 PM

    Một vài kinh nghiệm chia sẻ khi dùng sự kiện On Change của điều khiển để hiển thị kết quả tìm kiếm ngay khi người dùng nhập dữ liệu :

    -Không tìm kiếm khi người dùng bấm phím Backspace (tức là  KeyCode = vbKeyBack):

    -> Cái này thì liên quan tới anh chàng Unikey. Vì Unikey bắt tín hiệu từ bàn phím, can thiêp vào các sự kiện KeyDown,KeyUp,KeyPress,Change của Ctrl. 
    Để thay các từ không dấu thành có dấu, trước tiên vbKeyBack được gọi nhằm xóa ký tự không dấu sau đó thay bằng bằng ký tự có dấu 
    VD: Khi nhập từ "đường", một số người nhập "duong" sau đó mới bỏ dấu. Unikey sẽ làm như sau:

    1- Gọi vbKeyBack 5 lần để xóa hết chữ "duong", thay d bằng đ (các sự kiện KeyDown, KeyUp, KeyPress, Change cũng được gọi 5 lần)

    2- Tiếp tục gọi các sự kiện  để nhập lại các ký tự tiếp theo thành chữ "đuong"
    Với "ư" hay "ơ" cũng tương tự như trên

    => Với chữ  "đường" thì On Change được gọi 29  lần và vbKeyBack được gọi 12 lần


    Như vậy để hạn chế việc tìm kiếm dư thừa, ta Không nên tìm kiếm khi  KeyCode = vbKeyBack

     015
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    ongke0711 > 03-03-16, 04:41 PM

    Chưa bắt tay vô làm nhưng thấy bạn phân tích cái vụ phím Backspace đúng là cẩn thận và đã trải nghiệm hay quá. Nhưng cho hỏi lại là Space hay Backspace?
  • RE: Tự động tìm kiếm và điền thông tin trong textbox, cách nhau dấu phẩy " ,"

    MTNQ > 03-03-16, 07:25 PM

    (03-03-16, 04:41 PM)ongke0711 Đã viết: Chưa bắt tay vô làm nhưng thấy bạn phân tích cái vụ phím Backspace đúng là cẩn thận và đã trải nghiệm hay quá. Nhưng cho hỏi lại là Space hay Backspace?

    -Là phím Backspace, có KeyCode = vbKeyBack = 8