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
_______________
Khi phải sử dụng nhiều nút bấm trên UserForm, các bạn sẽ phải làm thế nào bây giờ? Nếu cho hết các nút bấm lên UserForm, thì sẽ làm tốn diện tích.
Vì vậy, ở bài viết này, chúng ta sẽ xây dựng Menu Button như dưới đây:
Chúng ta có một dãy 5 nút bấm. Mỗi lần ấn nút ▲ và ▼ thì dãy nút bấm này sẽ được thay đổi.
Chúng ta tạo:
Class có tên là : PagedButtons.
Class có tên là: SelectButton .
Code cho class SelectButton là:
Code cho class PagedButtons là:
Bạn cần đăng nhập để thấy link
Bài học thiết kế số 02
Bạn cần đăng nhập để thấy link
Bài học thiết kế số 03
Bạn cần đăng nhập để thấy link
.Bài học thiết kế số 04
Bạn cần đăng nhập để thấy link
.Bài học thiết kế số 05
Bạn cần đăng nhập để thấy link
.Bài học thiết kế số 06
Bạn cần đăng nhập để thấy link
.Bài học thiết kế số 07
Bạn cần đăng nhập để thấy link
._______________
Khi phải sử dụng nhiều nút bấm trên UserForm, các bạn sẽ phải làm thế nào bây giờ? Nếu cho hết các nút bấm lên UserForm, thì sẽ làm tốn diện tích.
Vì vậy, ở bài viết này, chúng ta sẽ xây dựng Menu Button như dưới đây:
Bạn cần đăng nhập để thấy đính kèm
Chúng ta có một dãy 5 nút bấm. Mỗi lần ấn nút ▲ và ▼ thì dãy nút bấm này sẽ được thay đổi.
Chúng ta tạo:
Class có tên là : PagedButtons.
Class có tên là: SelectButton .
Code cho class SelectButton là:
Mã:
Option Explicit
Public WithEvents btn As MSForms.CommandButton
Public Parent As PagedButtons
Private Sub btn_Click()
Parent.callBack btn.Caption
End Sub
Public Property Let Enabled(e As Boolean)
btn.Enabled = e
End Property
Public Property Let Caption(x As String)
btn.Caption = x
End Property
Public Property Get Self() As Object
Set Self = Me
End Property
Public Sub ReleaseObject()
Set btn = Nothing
Set Parent = Nothing
End Sub
Mã:
Option Explicit
Private WithEvents previousButton As MSForms.CommandButton
Private WithEvents nextButton As MSForms.CommandButton
Private pageNumber As Long
Private selectButtons As Collection
Private menuItems As Collection
Public Event Selected(x As String)
Sub callBack(x As String)
RaiseEvent Selected(x)
End Sub
Sub Init(previous_button As MSForms.CommandButton, _
next_button As MSForms.CommandButton, _
ParamArray select_buttons())
Set previousButton = previous_button
Set nextButton = next_button
Set selectButtons = New Collection
Dim b
For Each b In select_buttons
With New SelectButton
Set .Parent = Me
Set .btn = b
selectButtons.Add .Self
End With
Next
Set menuItems = New Collection
pageNumber = 1
End Sub
Sub addMenuItem(menu_caption As String)
menuItems.Add menu_caption
End Sub
Sub DrawCaptions()
previousButton.Enabled = pageNumber <> 1
nextButton.Enabled = pageNumber < maxPage
Dim itemCursor: itemCursor = selectButtons.Count * pageNumber - selectButtons.Count
Dim i As Long
For i = 1 To selectButtons.Count
If itemCursor + i <= menuItems.Count Then
selectButtons(i).Enabled = True
selectButtons(i).Caption = menuItems(itemCursor + i)
Else
selectButtons(i).Enabled = False
selectButtons(i).Caption = "-"
End If
Next
End Sub
Private Property Get maxPage() As Long
maxPage = roundUp(menuItems.Count / selectButtons.Count)
End Property
Private Function roundUp(x As Double) As Long
roundUp = Int(x + 0.999)
End Function
Private Sub nextButton_Click()
pageNumber = pageNumber + 1
DrawCaptions
End Sub
Private Sub nextButton_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Call nextButton_Click
If pageNumber >= maxPage - 1 Then
Cancel = True
End If
End Sub
Private Sub previousButton_Click()
pageNumber = pageNumber - 1
DrawCaptions
End Sub
Private Sub previousButton_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Call previousButton_Click
If pageNumber <= 2 Then
Cancel = True
End If
End Sub
Public Sub ReleaseObject()
Dim b As SelectButton
For Each b In selectButtons
b.ReleaseObject
Next
Set menuItems = Nothing
Set selectButtons = Nothing
End Sub