• Hàm kiểm tra các Textbox Null, Highlight textbox và Custom Calendar
  • Hàm kiểm tra các Textbox Null, Highlight textbox và Custom Calendar

    ongke0711 > 19-07-17, 04:54 PM

    Hôm nay rảnh rỗi post lên cái Form Demo có một số thiết kế cơ bản và bẫy lỗi null của Textbox trước khi Lưu như sau:

    1. Thông thường trước khi lưu một form nhập liệu nào đó, bạn phải kiểm tra các trường (Field) cần thiết có nhập dữ liệu hay chưa rồi mới cho lưu, để tránh việc sai, lỗi dữ liệu. Demo này sẽ dùng hàm CheckNullEmpty() để check tất cả các Control trên Form mà bạn yêu cầu phải check (Control.Tag = “required”). Nếu Textbox nào Null thì nó sẽ được đánh dấu màu xanh.

    2. Thêm một tính năng làm đẹp cũng như hỗ trợ người dùng dễ tập trung khi nhập liệu là Highlight Textbox. Mỗi khi con trỏ trỏ tới textbox nào thì nó sẽ làm nổi bật đường viền của textbox đó màu cam.

    3. Tạo lịch chọn ngày tháng, không sử dụng lịch (Date picker) của chương trình Access. Lịch này sẽ có tính năng tùy chọn tháng, năm riêng biệt tiện lợi hơn lịch của hệ thống (mỗi lần di chuyển là 1 tháng). 

    Hình minh họa:

    [/url][url=https://flic.kr/p/27s7tDn][Hình: 42302325715_dd6f2b4aeb_b.jpg]

    [Hình: 35979175766_a91c0dcc2b_b.jpg]

    Copy các đoạn code sau vào Module.
    - Code cho hàm Highligh Textbox:
    Mã PHP:
    Option Compare Database
    Option Explicit

    Public Function SetFocusHandlers(ByRef frm As Form)
       Dim ctl As Control
       On Error 
    GoTo 0
       For Each ctl In frm
           If ctl
    .Tag "HighlightOnFocus" Then
               ctl
    .OnGotFocus "=HandleFocus([" ctl.Name "], True)"
               ctl.OnLostFocus "=HandleFocus([" ctl.Name "], False)"
           End If
       Next
    End 
    Function


    Public Function 
    HandleFocus(ByRef ctl As ControlByVal blnFocus As Boolean)

       If blnFocus True Then
           
    'ctl.BackColor = RGB(200, 237, 248) 'RGB(222239229)
           ctl.BorderColor RGB(&HF9, &HCB, &H8E)
           ctl.BorderWidth 2
       Else
           
    'ctl.BackColor = RGB(255, 255, 255)
           ctl.BorderColor = RGB(&H98, &HBD, &HE0)
           ctl.BorderWidth = 1
       End If

    End Function 

    - Code kiểm tra các textbox có Null hoặc Empty hay không. Muốn textbox nào cần kiểm tra, bạn vào Property của textbox đó, mục Other -> kiếm menu Tag (ở cuối cùng) và thêm đoạn text "required".

    [Hình: 36021077615_1c56014800_z.jpg]

    Mã PHP:
    Option Compare Database
    Option Explicit

    Public str As String
    Public colCtlName As New Collection

    Function IsNullOrEmpty(tbx As Control) As Boolean
       If IsNull
    (tbx.Value) Or _
          Len
    (Nz(tbxvbNullString)) = Or _
          Len
    (Nz(tbx vbNullString)) = 0 Then
           IsNullOrEmpty 
    True
       Else
           IsNullOrEmpty 
    False
       End 
    If
    End Function

    Function 
    CheckNullEmpty(frm As Form) As Boolean
       Dim ctl 
    As Control
       str 
    = Empty

       For Each ctl In frm.Controls
           If ctl
    .ControlType acTextBox Or ctl.ControlType acComboBox Or ctl.ControlType acCheckBox Then
               If Right
    (ctl.Tag8) = "required" Then
                   If IsNullOrEmpty
    (ctlThen
                       
    'Debug.Print IsNullOrEmpty(ctl) & " - " & ctl.Name'
                       colCtlName.Add ctl.Name  'De setFocus vao control dau tien trong danh sách collection'
                       ctl.BackColor RGB(255255153)
                       str str "- " ctl.Controls(0) vbNewLine
                   End 
    If
               End If
           End If
       Next

       If Len
    (str) = 0 Then
           CheckNullEmpty 
    False
       Else
           CheckNullEmpty 
    True
       End 
    If

    End Function

    Function 
    ClearControlFormatting(ctl As Control)
       ctl.BackColor vbWhite
    End 
    Function 

    - Khi chạy phần Calendar tự tạo, tránh việc cái lịch mặc định của Access cùng hiển thị đè lên cái icon lịch của bạn khi bạn để con trỏ vào Textbox có định dạng DateTime, bạn phải chạy 1 cái thủ tục để vô hiệu hóa cái lịch mặc định của Access. Cái Sub DisableDatePicker () này tôi lấy trên mạng của Daniel Pineault.
    Bạn chỉ cần chạy hàm này 1 lần (ở cửa số Immediate) khi khởi động ứng dụng là được rồi.

    [Hình: 36004508596_6fc04d90c3_z.jpg] 


    File làm trên Access 2010.
    Link file demo: http://www.mediafire.com/file/htm252v7af...tbox.accdb
  • RE: Hàm kiểm tra các Textbox Null, Highlight textbox và Custom Calendar

    ongke0711 > 19-07-17, 09:24 PM

    Bổ sung điểm khiếm khuyết bài trên.
    Khi hàm CheckNullEmpty() chạy thì nó chỉ đánh dấu đổi màu nền Control (textbox) nào không có dữ liệu (Null hoặc Empty) nhưng không tự động chuyển con trỏ đến control đầu tiên bị Null (SetFocus) như các cách làm thủ công từng textbox.
    - Để biết Control nào là control đầu tiên bị Null để sau đó SetFocus thì tôi chỉ mới nghĩ ra cách dùng Collection thôi (nó tiện hơn dùng Array trong trường hợp này).
    - Khi vòng lập For…Next phát hiện control (ctl) đầu tiên Null, nó sẽ Add ctl.Name vào Collection (biến colCtlName) và cứ tuần hết vòng lặp. Vậy cái Collection này sẽ chứa tất cả ctl.Name bị Null (Tôi chưa biết cách chỉ Add mỗi cái ctl.Name đầu tiên thôi rồi thoát ra). Lưu cái Collection này vào biến toàn cục sau đó chỉ cần sử dụng cái phần tử (element) đầu tiên của Collection thôi - colCtlName(1).
    - Sau đó ở sự kiện bấm nút [Lưu] sẽ chạy hàm kiểm tra nếu phát hiện textbox Null (CheckNullEmpty = True) thì sẽ lấy phần từ đầu tiên trong Collection để SetFocus.

    Mã PHP:
    Controls(colCtlName(1)).SetFocus

    Set colCtlName 
    Nothing
    Exit Sub 

    - Mình dùng Set colCtlName = Nothing để xóa nội dung biến để Collection có thể bắt đầu thêm các phần từ ctl.Name vào lại vị trí đầu tiên khi bạn bấm nút Lưu lần 2, 3... Cách này nhanh hơn thay vì dùng đúng bài là Collection.Remove (i).  007

    Đã cập nhật lại file .accdb.
  • RE: Hàm kiểm tra các Textbox Null, Highlight textbox và Custom Calendar

    thanhtruong > 21-07-17, 08:44 PM

    Cái này mình học được 1 cái rồi
    Khi con trỏ đến đâu thì viền màu vàng sẽ chạy theo đó,
    Còn 2 cái kia mình sẽ ngâm cứu tiếp, hay ghê thật, cảm ơn Anh đã chia sẻ.