Sửa code để chạy được trên nhiều Frame

Liên hệ QC

Miccpro

Thành viên thường trực
Tham gia
9/12/10
Bài viết
236
Được thích
10
Mong các anh chị giúp em sửa code để khi kích chuột vào Label ở trên Frame bất kỳ nào thì đều chạy được code trong Class Module. Như trong file đính kèm chỉ chạy được 1 Frame.
Em xin cảm ơn!
 

File đính kèm

  • lblList.xls
    51 KB · Đọc: 12
Thử sửa thế này

Di chuyển dòng sau (trong sub Sub TaoListFrame ...)
Mã:
Dim LabelCount1 As Integer
ra ngoài thành biến toàn cục

Mã:
Option Explicit
Public cLabel() As New clsLabel
Dim LabelCount1 As Integer

Nhưng: code của bạn tôi không hiểu cứ loằng ngoằng thế nào ý, sao không nên đặt luôn 1 frame là 1 class chính. Lập trình class nên rõ ràng mạch lạc về đối tượng không thì dễ rối.
 
Lần chỉnh sửa cuối:
Upvote 0
Thử sửa thế này

Di chuyển dòng sau (trong sub Sub TaoListFrame ...)
Mã:
Dim LabelCount1 As Integer
ra ngoài thành biến toàn cục

Mã:
Option Explicit
Public cLabel() As New clsLabel
Dim LabelCount1 As Integer

Nhưng: code của bạn tôi không hiểu cứ loằng ngoằng thế nào ý, sao không nên đặt luôn 1 frame là 1 class chính. Lập trình class nên rõ ràng mạch lạc về đối tượng không thì dễ rối.
Cảm ơn anh đã giúp đỡ. Tuy nhiên khi Click vào frame khác thì Frame cũ sẽ bị mất màu vàng đánh dấu. Mong anh quy hoạch lại 1 tý file trên được không ạ. Trình viết code em gà lắm. Em xin cảm ơn ạ
 
Upvote 0
Cảm ơn anh đã giúp đỡ. Tuy nhiên khi Click vào frame khác thì Frame cũ sẽ bị mất màu vàng đánh dấu. Mong anh quy hoạch lại 1 tý file trên được không ạ. Trình viết code em gà lắm. Em xin cảm ơn ạ

Ở moulde1 thì sửa sub Farbe thành
Mã:
Sub Farbe(vLB As MSForms.Label)
Dim CB As Control
'For Each CB In Fahrer.Controls
For Each CB In vLB.Parent.Controls ' Fahrer.Controls
    If TypeName(CB) = "Label" Then CB.BackColor = &HFFFFFF
Next CB
End Sub

Trong Class gọi sub Farbe như sau
Farbe Label

Sửa đại kiểu lộ cộ như trên, Còn sửa toàn bộ gốc thì như bài 2 tôi nói trên
 
Upvote 0
Nhưng: code của bạn tôi không hiểu cứ loằng ngoằng thế nào ý, sao không nên đặt luôn 1 frame là 1 class chính. Lập trình class nên rõ ràng mạch lạc về đối tượng không thì dễ rối.
Chỗ này em cũng chưa hiểu lắm. Giả sử file của em có 5 form, mỗi form 5 cái frame thì sinh ra quá nhiều class. Vậy nên em muốn chỉ 1 class để sử dụng được nhiều frame. Mong anh hướng dẫn thêm
 
Upvote 0
Chỗ này em cũng chưa hiểu lắm. Giả sử file của em có 5 form, mỗi form 5 cái frame thì sinh ra quá nhiều class. Vậy nên em muốn chỉ 1 class để sử dụng được nhiều frame. Mong anh hướng dẫn thêm

Tôi nghĩ bạn nên dùng Class collection. Khai báo class cho từng Frame (tất nhiên là chỉ thiết kế 1 class frame) và đưa vào Collection.
 
Upvote 0
Mong anh giúp em 1 ví dụ nhỏ được không ạ. Cái này em hiểu mơ hồ lắm. Em cảm ơn

À hôm trước tôi không đọc kỹ code của bạn. Thấy bạn cũng đã dùng Mảng để lưu các class cho nhiều control rồi, chỉ sửa chút là được thôi.
Tôi thì hay dùng Collection để khỏi khai báo kích thước mảng nên tôi sửa code lại theo cách dùng Collection nhé.

Code cho Class module: clsHighlightLabel
Mã:
Option Explicit

Private mFrm As MSForms.UserForm
Private WithEvents mLabelMN As MSForms.Label    'Menu label
Private blnRet As Boolean

Public Property Set ParentForm(form As Object)
    Set mFrm = form
End Property

Public Property Set MenuLabel(lbl As MSForms.Label)
    Set mLabelMN = lbl
End Property
Public Property Get MenuLabel() As MSForms.Label
    Set MenuLabel = mLabelMN
End Property

Private Sub mLabelMN_Click()
    Dim ctl As Control
    Dim sFraName As String

    'Xoa highligh Label cu da click chon trong Frame
    sFraName = mLabelMN.Parent.Name
    For Each ctl In mFrm.Controls(sFraName).Controls
        If TypeName(ctl) = "Label" Then ctl.BackColor = &HFFFFFF
    Next

    mLabelMN.BackColor = &HFFFF&
    Application.Run "modMain.ExecuteMenu", mLabelMN.Caption
End Sub

Code cho Standard module: modMain

Mã:
Option Explicit

Dim LabelCount1 As Integer
Dim cSelLabel As clsHighlighLabel
Public colLabels As New Collection

Sub TaoListFrame(fra As MSForms.Frame, sArr As Variant)
    Dim LB As Control
    Dim LabelCount1 As Integer
    Dim i As Long
    Dim t As Long
    t = 0

    For i = 1 To UBound(sArr)
        Set cSelLabel = New clsHighlighLabel
        Set LB = fra.Add("Forms.Label.1", "lbl_" & i, True)
        With LB
            .Top = t
            .Left = 0
            .Width = 200
            .Caption = sArr(i, 1)
            '.ForeColor = Range("A" & i).Font.Color
            .Font.Size = 12
        End With
        LabelCount1 = LabelCount1 + 1
        Set cSelLabel.ParentForm = Fahrer
        Set cSelLabel.MenuLabel = LB
        colLabels.Add cSelLabel
        t = t + 18
    Next i
    fra.ScrollHeight = LabelCount1 * 18
End Sub

Public Sub ExecuteMenu(strMenuName As String)
    MsgBox "Ban dang chay menu: " & strMenuName
End Sub

Code gọi trong Userform: Fahrer

Mã:
Option Explicit

Private Sub CommandButton1_Click()
    Unload Me
    Set colLabels = Nothing
End Sub

Private Sub UserForm_Initialize()
    Dim MyArr As Variant
    MyArr = Sheet1.Range("A8:A" & Sheet1.Range("A65536").End(3).Row)
    TaoListFrame Frame1, MyArr
    MyArr = Sheet1.Range("B8:B" & Sheet1.Range("B65536").End(3).Row)
    TaoListFrame Frame2, MyArr
    MyArr = Sheet1.Range("C8:C" & Sheet1.Range("C65536").End(3).Row)
    TaoListFrame Frame3, MyArr
End Sub
 

File đính kèm

  • lblList_sua.xlsb
    31.9 KB · Đọc: 8
Upvote 0
Web KT
Back
Top Bottom