-
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.
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 Design:
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 Form, ByRef x1 As Long, ByRef y1 As Long, ByRef x2 As Long, ByRef y2 As Long)
Dim rct As FormCoords
GetWindowRect frm.Hwnd, rct
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 Integer, Shift 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) + 1, 0)
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 'T or t = 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 Long, lpRect As FormCoords)
Declare PtrSafe Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal Hwnd As Long, ByVal hdc As Long) As Long
Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal 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:
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.(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 Long, lpRect As FormCoords)
Declare PtrSafe Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal Hwnd As Long, ByVal hdc As Long) As Long
Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal 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)
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.
Đâ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.
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. -
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á...!