• Demo_Chọn ngày tháng bằng nút (No Calender Tiếng việt)
  • Demo_Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    maidinhdan > 06-08-15, 05:57 PM

    Nhiều lần rắc rối, khi điền ngày tháng vào ô bằng tay, nhập vào 01 tháng 02, nhưng máy lại hiểu là 02 tháng 01 mới ghê chứ. Từ đó quyết định thiết kế bằng nút chọn bằng control Calander như thế này đây.

    [Hình: Choncanlender_1%28Loi%29.png]

    Và bạn nhìn thấy, thật khủng khiếp và cũng ngốn data của tôi. Tôi tự hỏi, chẳng lẽ nếu có 10 ô điền ngày tháng thì tôi vẽ 10 cái Control Calander sau? chưa tính tới việc viết từng đoạn code thật là nhọc nhằn. Không những thế 10 cái control Calander sẽ che đi hết các ô khác làm tôi chả nhìn được gì ngoài một mớ rác bừa bộn. Mặt khác nó là tiếng anh nửa chứ, thao tác thì phức tạp, phải khai báo Thư viện DLL...đủ thứ chuyện

    Chính vì lẽ đó, ngày hôm nay xin giới thiệu các bạn tính ưu việt của Demo đó là "ĐIỀN NGÀY THÁNG BẰNG 1 NÚT NHẤN (Không sử dụng Control Canlender).


    Hình chạy thử:
    [Hình: Choncanlender_1%28Ok%29.png]

    Hình Design:
    [Hình: Choncanlender_2%28Ok%29.png]

    Xin trình bày 2 nút nhấn để các bạn so sánh, áp dụng:
    Nút chọn trong ô Ngày bắt đầu
    Trích dẫn:'---------------------------------------------------------------------------------------
    ' Ten ham   : cmdChonngay_Click
    ' Tac gia   : Admin
    ' Ngay viet : 8/6/2015
    ' Dien giai : De y 2 cho de chinh sua khi ap dung
    ' ---Thu 1: Me.cmdChonngay.Top or Left la nut nhan cua ta
    ' ---Thu 2: Me.FormHeader.Height - Neu tren form khong chon FormHeader thi xoa (+ Me.FormHeader.Height)
    ' ---Thu 3: Me.txtNgaybatdau day la o textbox ma chung ta muon ngay nhay vao o nay.
    '---------------------------------------------------------------------------------------

    Private Sub cmdChonngay_Click()
    Dim x1 As Long, y1 As Long, x2 As Long, y2 As Long
        ToadoForm Me, x1, y1, x2, y2
        x1 = ConvertRes(x1, False, False) + Me.cmdChonngay.Left + 230
        y1 = ConvertRes(y1, True, False) + Me.cmdChonngay.Top + Me.FormHeader.Height + 100
        DoCmd.OpenForm "frmCalendar", , , , , acDialog, x1 & "," & y1
        If gDate <> 0 Then
            Me.txtNgaybatdau = gDate
        End If
    End Sub


    Nút Ngày thứ 2: Để các bạn so sánh khi áp dụng. ( quan sát chỗ tôi tô đậm+Xanh lá cây)


    Trích dẫn:Private Sub cmdChonngay2_Click()
    Dim x1 As Long, y1 As Long, x2 As Long, y2 As Long

       ToadoForm Me, x1, y1, x2, y2
       x1 = ConvertRes(x1, False, False) + Me.cmdChonngay2.Left + 230
       y1 = ConvertRes(y1, True, False) + Me.cmdChonngay2.Top + Me.FormHeader.Height + 100
       DoCmd.OpenForm "frmCalendar", , , , , acDialog, x1 & "," & y1   
       If gDate <> 0 Then                                                                       
       Me.txtngay2 = gDate                                                                  
       End If
    End Sub



    Code Canh vị trí của Form Lịch tiếng việt, Mục đích để khi nào bạn để nút nhấn ở đâu thì Lịch sẽ hiện ở dưới đó.
    - Tên Modules: modToadoform
    - Code chính:
    Mã PHP:
    Public Sub ToadoForm(frm As FormByRef x1 As LongByRef y1 As LongByRef x2 As LongByRef y2 As Long)
    Dim rct As FormCoords
        GetWindowRect frm
    .Hwndrct
        x1 
    rct.lngX1          'left edge
        y1 = rct.lngY1          '
    top edge
        x2 
    rct.lngX2          'right edge (not used)
        y2 = rct.lngY2          '
    bottom edge (not used)
    End Sub 

    * Ghi chú:
    Chúng ta cũng có thể sử dụng bàn phím để thao tác khi đã nhấn nút, cụ thể:
    Sử dụng nút trên bàn phím: (maidinhdan@gmail.com)
    ___________________________
    Mũi tên (Trái)  = Ngày trước đó
    Mũi tên (Phải) = Ngày kế tiếp
    Phím Up     = Tuần trước đó
    Phím Down=Tuần kế tiếp
    Phím PgUp = Tháng trước đó
    Phím PgDn = Tháng kế tiếp
    Phím T       = Hôm nay.
    ___________________________

    Code của Phím tắt là:
    Mã PHP:
    Private Sub Form_KeyDown(KeyCode As IntegerShift As Integer)

        On Error GoTo Err_Handler
        
    'Purpose: Ma hoa cac phim tat tren ban phim
        
        With Me.txtDate
            Select Case KeyCode
            Case vbKeyLeft              '
    1 day left or right.
                .Value = .Value 1
                KeyCode 
    0
                Call ShowCal
            
    Case vbKeyRight
                
    .Value = .Value 1
                KeyCode 
    0
                Call ShowCal
            
    Case vbKeyUp                'up or down cua mot tuan
                .Value = .Value - 7
                KeyCode = 0
                Call ShowCal
            Case vbKeyDown
                .Value = .Value + 7
                KeyCode = 0
                Call ShowCal
            Case vbKeyHome              '
    Home/End first/last cua Thang
                
    .Value = .Value Day(.Value) + 1
                KeyCode 
    0
                Call ShowCal
            
    Case vbKeyEnd
                
    .Value DateSerial(Year(.Value), Month(.Value) + 10)
                KeyCode 0
                Call ShowCal
            
    Case vbKeyPageUp            'PgUp/PgDn = previous/next cua Thang
                .Value = DateAdd("m", -1, .Value)
                KeyCode = 0
                Call ShowCal
            Case vbKeyPageDown
                .Value = DateAdd("m", 1, .Value)
                KeyCode = 0
                Call ShowCal
            Case vbKeyT, vbKeyT + 32    '
    or Hom nay
                
    .Value Date
                KeyCode 
    0
                Call ShowCal
            End Select
        End With
        
    Exit_Handler
    :
        Exit Sub
        
    Err_Handler
    :
        Resume Exit_Handler
    End Sub 

    Hết, không hay xin chọi ít đá.

    Khi sử dụng Demo này, vui lòng tôn trọng tên tác giả. Thấn ái
  • RE: Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    rainkv > 06-08-15, 06:13 PM

    Maidinhdan coi lại Demo xem hay sao mà mình chọn qua ngày thứ 2 nó báo lỗi chỗ này:
    'API Declarations
    Declare Sub GetWindowRect Lib "user32" (ByVal Hwnd As Long, lpRect As FormCoords)
    Declare Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
    Declare Function ReleaseDC Lib "user32" (ByVal Hwnd As Long, ByVal hdc As Long) As Long
    Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
  • RE: Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    maidinhdan > 06-08-15, 09:07 PM

    (06-08-15, 06:13 PM)rainkv Đã viết: Maidinhdan coi lại Demo xem hay sao mà mình chọn qua ngày thứ 2 nó báo lỗi chỗ này:
    'API Declarations
    Declare Sub GetWindowRect Lib "user32" (ByVal Hwnd As Long, lpRect As FormCoords)
    Declare Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
    Declare Function ReleaseDC Lib "user32" (ByVal Hwnd As Long, ByVal hdc As Long) As Long
    Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

    Máy mình chạy bình thường ( Trên WinXp 32bit, Win8 64bit). Do mình thiết kế dùng cho Office 2003 hệ 32bit. Chưa test trên 2007 hoặc hơn.
    Nếu vậy bạn sửa cả 4 đoạn trên thành như sau, để có thể sử dụng trên hệ 64bit.
    Mã PHP:
    Declare PtrSafe Sub GetWindowRect Lib "user32" (ByVal Hwnd As LonglpRect As FormCoords)
    Declare 
    PtrSafe Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
    Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal Hwnd As LongByVal hdc As Long) As Long
    Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As LongByVal nIndex As Long) As Long 

    Nếu không được, thì cài lại Win bản quyền nhé,
  • RE: Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    rainkv > 06-08-15, 10:20 PM

    (06-08-15, 09:07 PM)maidinhdan Đã viết:
    (06-08-15, 06:13 PM)rainkv Đã viết: Maidinhdan coi lại Demo xem hay sao mà mình chọn qua ngày thứ 2 nó báo lỗi chỗ này:
    'API Declarations
    Declare Sub GetWindowRect Lib "user32" (ByVal Hwnd As Long, lpRect As FormCoords)
    Declare Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
    Declare Function ReleaseDC Lib "user32" (ByVal Hwnd As Long, ByVal hdc As Long) As Long
    Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

    Máy mình chạy bình thường ( Trên WinXp 32bit, Win8 64bit). Do mình thiết kế dùng cho Office 2003 hệ 32bit. Chưa test trên 2007 hoặc hơn.
    Nếu vậy bạn sửa cả 4 đoạn trên thành như sau, để có thể sử dụng trên hệ 64bit.
    Mã PHP:
    Declare PtrSafe Sub GetWindowRect Lib "user32" (ByVal Hwnd As LonglpRect As FormCoords)
    Declare 
    PtrSafe Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
    Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal Hwnd As LongByVal hdc As Long) As Long
    Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As LongByVal nIndex As Long) As Long 

    Nếu không được, thì cài lại Win bản quyền nhé,
    Mình chạy trên win 10 64bit, office 2013. Mình mới chạy thử thui vì thấy hay chứ chưa dùng đến. Để cthay code bạn đưa xem thử có cdc ko.
  • RE: Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    tranthanhan1962 > 07-08-15, 02:35 AM

    Hi! Dân! Khi bạn mới post lên mình cũng giật mình. Sao bạn lại có một thiết kế giống y chang mình đến vậy. Hai tư tưởng lớn gặp nhau chăng. Vì trước đây mình cũng thiết kế một cái form gọi ngày cho textbox như thế. Nhưng sau này lười quá nên ít đưa vào sử dụng. Nhưng khi tìm lại thì thấy không phải. Mình post lên cho vui he.

    [Hình: WrLKGtq.png]

    Đây là những điểm khác biệt.
    1. Bạn xử lý thông qua 1 query còn mình chỉ sử dụng code.
    2. Form của bạn có ưu điểm là khi gọi dời theo con trỏ, còn ngày xưa mình chưa biết viết code này nên kéo đâu nó nằm đó khi dời đi lâu thì lần sau lại hiện lên chỗ đó.
    3. Form của bạn khi hiện ra luôn hiện ngày hiện tại, còn Form của mình hiện ngày của textbox được chỉ định đang có giá trị. Cái hay của nó là nếu textbox đã có dữ liệu ngày thì nó hiện theo ngày của texbox đang có. Vì vậy khi chỉnh sửa ngày rất dễ. Cái dỡ của nó là nếu textbox chưa có dữ liệu thì nó hiện ra cái ngày mà mình thiết kế năm một ngàn chín trăm hồi đó, nên phải luôn default là Date().
    Mình đôi khi cũng lười nên có khi thiết kế thêm một nút gọi form nằm bên cạnh textbox có khi click hay double Click tại textbox gọi nó lên luôn.  007

    Lịch
  • RE: Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    maidinhdan > 07-08-15, 10:56 AM

    Em xin bổ sung vài điểm khác biệt nửa.
     
    1. Toàn bộ bài trên đều sử dụng code không có Query.
    2. Lịch của em, tất cả đều kẻ bằng lable ( 41 Lable + 2 Text box: Tháng+Năm). Của anh là sử dụng Control Canlender để vẽ Lịch và em mở xem là mục Value anh để năm 10/12/1998 nếu là ô dữ liệu trống như anh phân tích phía trên.
    - Một điều nửa, Vì anh sử dụng Control Canlender để vẽ Lịch nên nếu chạy trên những office cao hơn mà không có hỗ trợ Control này có thể dính lỗi.
    3. Cái hay của anh là anh không dử dụng hàm API của hệ thống. Bởi vì để xác định vị trí form thì buộc lòng phải sử dụng API.
    4. Code khai báo biến để lấy ngày tháng
    - Của anh: Variant ( biến chưa xác định)
    - Của em: Data ( biến ngày tháng)
    5. Kết luận:
    - Em suy nghĩ nếu kết hợp cả hai lại thì hay quá, nhưng không được. Bởi như ý số 2 em nói.
    - Em sẽ làm thêm 1 cái Canlender khác nửa để bổ sung vào phần này ( Ý tưởng: Thiết kế 492 Lable + 1 Text box: Năm để hiển thị nguyên 1 năm luôn, nằm trên 1 form: anh thấy sao?)
  • RE: Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    tranthanhan1962 > 07-08-15, 01:32 PM

    Hi! Dân. Cái này mình làm hồi 1998 nên mặc định là hồi đó. làm tren access 97. sau này sử dụng luôn. Chạy được trên office 2007 còn sau này mình không có kiểm tra. Dân cứ nghiên cứu, cái gì tốt nhất thì anh em cùng xử dụng.  007
  • RE: Demo_Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    zinzin8x > 25-06-16, 12:44 AM

    tuyệt vời, 2 cao thủ. mình cũng hay dùng control calender để chọn lịch nhưng không căn vị trí forms được như của Dân. Cảm ơn 2 bác cho mình tham khảo được 1 cách trình bày form sáng sủa hơn.
  • RE: Demo_Chọn ngày tháng bằng nút (No Calender Tiếng việt)

    quocbinh77dilang@gmail.com > 09-05-17, 05:27 PM

    hay quá...!