Thiết kế UserForm bài số 12: Tạo bảng chọn màu

Euler

Mod
Thành viên BQT
Bài học thiết kế số 01
Bài học thiết kế số 02
Bài học thiết kế số 03 .
Bài học thiết kế số 04 .
Bài học thiết kế số 05 .
Bài học thiết kế số 06 .
Bài học thiết kế số 07 .
Bài học thiết kế số 08 .
Bài học thiết kế số 09 .
Bài học thiết kế số 10 .
Bài học thiết kế số 11 .
=========================
Mục đích của bài học này:
Bạn cần đăng nhập để thấy đính kèm


1. Tạo Class có tên là: ColorPicker
Mục đích: Trên UserForm chọn màu (frmColorPicker) có 56 nút bấm. Khi click vào mỗi nút bấm sẽ lấy màu của nút bấm gán cho Label trên UserForm test (frmMain). Chúng ta không thể viết 56 thủ tục click cho chúng, quá mất thời gian. Ta sẽ dùng để giản tiện việc làm này.
Mã:
Public WithEvents lab As MSForms.CommandButton
Public idx As Long

Private Sub lab_Click()
    frmMain.SetColor (idx)
    frmColorPicker.Hide
End Sub
Dòng code số 5 sẽ phải thay đổi tùy thuộc vào tên UserForm của bạn. Ở đây tôi đặt tên UserForm test là frmMain.
2. Trong UserForm frmMain bạn viết code:
Mã:
Public Sub SetColor(colorIndex)
    lblColor.BackColor = ActiveWorkbook.Colors(colorIndex)
    lblColor.Caption = colorIndex
    lblColor.ForeColor = ActiveWorkbook.Colors(colorIndex)
End Sub

Private Sub CommandButton1_Click()
    frmColorPicker.Show (vbModal)
End Sub
Bạn cần đăng nhập để thấy đính kèm


3. UserForm frmColorPicker. Tôi không muốn bạn thay đổi nó. Bạn có thể Export nó vào file của bạn để sử dụng luôn.
Cách Export bạn có thể tham khảo .
Các thông số chính của nó mang tính chất tham khảo, các bạn Export thì không cần quan tâm:
Bạn cần đăng nhập để thấy đính kèm

Code tham khảo, các bạn Export theo hướng dẫn trên thì không cần quan tâm:
Mã:
Dim clsClrs(1 To 56) As ColorPicker

Private Sub UserForm_Initialize()
    
    Dim i As Long, c As Long, r As Long
    Dim pal, clrs
    Dim lt As Double, tp As Double
    Dim hwnd&, sUnicode$
    
    pal = GetPal
    clrs = ActiveWorkbook.Colors
    For r = 0 To 6
        For c = 0 To 7
            i = i + 1
            Set clsClrs(i) = New ColorPicker
            clsClrs(i).idx = pal(i)
            Set clsClrs(i).lab = Controls.Add("forms.commandbutton.1")
            With clsClrs(i).lab
                           .Left = 15 * c + 3
                           .Top = 15 * r + 3
                           .Width = 15
                           .Height = 15
                           .BackColor = clrs(pal(i))
            End With
        Next
     Next

End Sub

Private Function GetPal()
     GetPal = Array( _
                        0, 1, 53, 52, 51, 49, 11, 55, 56, _
                        9, 46, 12, 10, 14, 5, 47, 16, _
                        3, 45, 43, 50, 42, 41, 13, 48, _
                        7, 44, 6, 4, 8, 33, 54, 15, _
                        38, 40, 36, 35, 34, 37, 39, 2, _
                        17, 18, 19, 20, 21, 22, 23, 24, _
                        25, 26, 27, 28, 29, 30, 31, 32)
End Function
4. Download file demo:

Topic này được viết dựa trên cảm hứng từ topic
 

ongke0711

Thành viên mới
1. Tạo Class có tên là: ColorPicker
Mục đích: Trên UserForm chọn màu (frmColorPicker) có 56 nút bấm. Khi click vào mỗi nút bấm sẽ lấy màu của nút bấm gán cho Label trên UserForm test (frmMain). Chúng ta không thể viết 56 thủ tục click cho chúng, quá mất thời gian. Ta sẽ dùng để giản tiện việc làm này.
Theo ý kiến cá nhân thì đây là phần nên học hỏi để lấy ra dùng khi thiết kế các ứng dụng kiểu như: quản lý quán ăn, quán cafe..., dùng trong việc thiết kế sơ đồ bàn ăn từng sảnh. Khi ứng dụng đem qua các quán khác nhau, số lượng bàn khác nhau thì sử dụng class này để tạo ra số lượng bàn tuơng ứng của quán, khỏi phải vẽ tay.
Riêng về phần lấy bảng màu thì đối với tôi, tôi sẽ tận dụng công cụ có sẳn của hệ thống để giảm số lượng code trong ứng dụng, nhẹ phần nào đỡ phần nấy. Tôi sẽ dùng: Color Palette Dialog Box của Excel.
Ví dụ:

Mã:
Private Sub cmdSetColor_Click()
    Dim lcolor As Long
    If Application.Dialogs(xlDialogEditColor).Show(5, 15, 150, 150) = True Then 'Tham so 1: màu can edit (không >56). Tham so 2,3,4: màu RGB mac dinh khi open
        'Nguoi dùng bam OK
        lcolor = ActiveWorkbook.Colors(5)
        Me.lblSelectedColor.BackColor = lcolor
    Else
        'Nguoi dùng bam Cancel
    End If
End Sub

Tôi dùng file của bạn Euler demo luôn.
Link:
 

tuhocvba

Administrator
Thành viên BQT
Cảm ơn các bạn rất nhiều. Làm cái video cho sinh động:
Bạn cần đăng nhập để thấy đa phương tiện
Link download dự phòng cho file demo v2:
 
Top