Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Thủ Thuật] Demo_Chọn ngày tháng bằng nút (No Calender Tiếng việt)
#1
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


File đính kèm
.zip   Demo-ChonngaybangCanlender(Tiengviet)_2003.zip (Kích cỡ: 55.44 KB / Tải về: 137)
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn bvchauthanh , rainkv , ongke0711 , tranthanhan1962 , thanhtruong , trungn077 , Che_Guevara , jeck09nt
#2
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
Chữ ký của rainkv rainkv,gia nhập Thủ Thuật Access từ 12-07 -15.
Reply
Những người đã cảm ơn
#3
(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é,
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#4
(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.
Chữ ký của rainkv rainkv,gia nhập Thủ Thuật Access từ 12-07 -15.
Reply
Những người đã cảm ơn
#5
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
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn zinzin8x
#6
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?)
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#7
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
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , zinzin8x
#8
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.
Chữ ký của zinzin8x zinzin8x,gia nhập Thủ Thuật Access từ 19-01 -16.
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Thủ Thuật] [Shared Code- PhầnII]Chọn ngày tháng bằng click chuột [No Calendar] maidinhdan 13 543 30-11-16, 11:45 AM
Bài mới nhất: ongke0711
  [Thủ Thuật] Ẩn record trong table theo ngày tháng tvn_hut 6 495 24-04-16, 01:00 AM
Bài mới nhất: tvn_hut
  Msg Box tiếng Việt Unicode có định dạng chữ đậm tranthanhan1962 13 2,275 30-01-16, 12:39 AM
Bài mới nhất: khanghychu
  [Thủ Thuật] Demo Dọn rác 1 tháng 1 lần (Gửi M.Vương) maidinhdan 9 1,653 27-08-15, 12:42 PM
Bài mới nhất: ledangvan
  Hướng Dẫn Demo Cho tất cả thông báo tiếng việt vào một Macro maidinhdan 3 992 23-07-15, 03:09 PM
Bài mới nhất: maidinhdan

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ