Соединение событий элементов управления внутри фрейма с классами FrameGroup - PullRequest
1 голос
/ 08 апреля 2019

У меня есть пользовательская форма, которая считывает данные из файла и динамически заполняет элемент управления Frame другими элементами управления Frame, которые сами заполняются метками, описывающими эти данные. Итак, есть один большой элемент управления Frame - DisplayFrame, который помещается в пользовательскую форму с помощью панели инструментов, и во время выполнения, когда файл открывается, в элемент управления DisplayFrame добавляются другие меньшие элементы управления Frame - cFrame1, cFrame2 и т. Д. С такими метками, как NameLabel, DateLabel. , добавленный к каждому cFrame.

Я бы хотел, чтобы пользователь мог выбрать любой из cFrames, затем нажать кнопку в пользовательской форме и открыть другое окно со всеми данными внутри меток (плюс дополнительные данные) в этом cFrame.

Под выборкой я подразумеваю, что когда пользователь нажимает на ЛЮБУЮ метку внутри определенного cFrame - или самого cFrame - цвет cFrame и всех его элементов изменяется, и этот конкретный cFrame записывается как текущий выбор. Сложность, на мой взгляд, в том, что цвет любого ранее выбранного cFrame должен измениться на цвет по умолчанию.

Я создал класс с именем FrameGroup для хранения всех созданных cFrames. Я определил событие click класса FrameGroup, чтобы изменить цвет при его выборе и сохранить данные только что выбранного cFrame.

<<Class FrameGroup>>
Public WithEvents FrameGroup As Frame

Private cName As String
Private cDay As String

Private Sub FrameGroup_Click()
    cName = FrameGroup.Controls(0).Caption
    cDay = FrameGroup.Controls(1).Caption

    ' If current cFrame was selected before, then deselect it 
    ' by returning to default color
    If FrameGroup.BackColor = &H8000000D Then
        FrameGroup.BackColor = &H80000005
        FrameGroup.Controls(0).BackColor = &H80000005
        FrameGroup.Controls(1).BackColor = &H80000005
    Else
       ' Select cFrame by changing color
        FrameGroup.BackColor = &H8000000D
        FrameGroup.Controls(0).BackColor = &H8000000D
        FrameGroup.Controls(1).BackColor = &H8000000D
    End If
End Sub
<<Code for UserForm>>
Dim FrameList() As New FrameGroup

Private Sub UserForm_Initialize()
    Dim TextLine As String
    Dim Text() As String
    Dim LineNo As Integer

    ' Open file containing saved Color Scales
    Open file For Input As #1

    LineNo = 0
    Do Until EOF(1)
        Line Input #1, TextLine
        Text = Split(TextLine, ",")

        ' Making CFrame
        Dim currCFrame As Frame
        Set currCFrame = DisplayFrame.Controls.Add("Forms.Frame.1", "cFrame" & LineNo, True)

        ' Adding labels
        Dim NameLabel As Control
        Set NameLabel = currCFrame.Controls.Add("Forms.Label.1", "Name" & LineNo, True)
        Dim DateLabel As Control
        Set DateLabel = currCFrame.Controls.Add("Forms.Label.1", "DateCreated" & LineNo, True)

        ' Increment line number
        LineNo = LineNo + 1

        ' Adding new frame to frame group
        ReDim Preserve FrameList(1 To LineNo + 1)
        Set FrameList(LineNo).FrameGroup = currCFrame

    Loop

    ' Close file once we are done reading color scales from it
    Close #1


End Sub

Что происходит, так это то, что только при нажатии на cFrame происходит что-либо, а не когда щелкает какая-либо из меток внутри. И я не знаю, как сделать так, чтобы при щелчке по cFrame цвет ранее выбранного cFrame также изменялся на цвет по умолчанию.

Я попытался найти способ сделать что-то подобное, и такие решения, как this , похоже, вызывают другой модуль класса для cFrame и его меток, а также промежуточный класс, обрабатывающий связь между двумя классами, но это кажется сложным. Если бы я следовал этой схеме, мне, вероятно, понадобился бы другой посредник между cFrame и кнопкой, нажимаемой для загрузки данных, верно? Я не хочу делать это более сложным, чем нужно, но я также хотел бы создать устойчивое и надежное решение. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Метка Клик вставлен и щелчок в другом кадре дает другим кадрам цвет по умолчанию, Постарался свести к минимуму корректировки вашего кода ниже:

  '<<Class FrameGroup>>
    Public WithEvents FrameGroup As MSForms.Frame
    Public WithEvents LabelGroup As MSForms.Label
    Private cName As String
    Private cDay As String

    Private Sub FrameGroup_Click()
    Dim ctl As MSForms.Control
        cName = FrameGroup.Controls(0).Caption
        cDay = FrameGroup.Controls(1).Caption
         For Each ctl In FrameGroup.Parent.Controls
            ctl.BackColor = &H80000005
         Next
            FrameGroup.BackColor = &H8000000D
            FrameGroup.Controls(0).BackColor = &H8000000D
            FrameGroup.Controls(1).BackColor = &H8000000D
    End Sub

    Private Sub LabelGroup_Click()
    Dim ctl As MSForms.Control
        cName = LabelGroup.Parent.Controls(0).Caption
        cDay = LabelGroup.Parent.Controls(1).Caption
        For Each ctl In LabelGroup.Parent.Parent.Controls
            ctl.BackColor = &H80000005
        Next
            LabelGroup.Parent.BackColor = &H8000000D
            LabelGroup.Parent.Controls(0).BackColor = &H8000000D
            LabelGroup.Parent.Controls(1).BackColor = &H8000000D
    End Sub


    '<<Code for UserForm>>
    Dim FrameList() As New FrameGroup

    Private Sub UserForm_Initialize()
        Dim TextLine As String
        Dim Text() As String
        Dim LineNo As Integer

        ' Open file containing saved Color Scales
       Open file For Input As #1

        LineNo = 0
        Do Until EOF(1)
            Line Input #1, TextLine
            Text = Split(TextLine, ",")

            ' Making CFrame
            Dim currCFrame As Frame
            Set currCFrame = DisplayFrame.Controls.Add("Forms.Frame.1", "cFrame" & LineNo, True)

            ' Adding labels
            Dim NameLabel As Control
            Set NameLabel = currCFrame.Controls.Add("Forms.Label.1", "Name" & LineNo, True)
            Dim DateLabel As Control
            Set DateLabel = currCFrame.Controls.Add("Forms.Label.1", "DateCreated" & LineNo, True)

            ' Increment line number
            LineNo = LineNo + 1

            ' Adding new controls to frame group
            ReDim Preserve FrameList(1 To 3 * (LineNo + 1))
            Set FrameList(3 * (LineNo) + 1).FrameGroup = currCFrame
            Set FrameList(3 * (LineNo) + 2).LabelGroup = DateLabel
            Set FrameList(3 * (LineNo) + 3).LabelGroup = NameLabel

        Loop

        ' Close file once we are done reading color scales from it
        Close #1

    End Sub
0 голосов
/ 08 апреля 2019

Событие Click элемента управления Frame возникает только при щелчке границы указанного кадра или его пустой области .Если вы нажмете Label в пределах Frame, у этого элемента управления будет своя собственная область.Если вы щелкнете эту область, то это событие Click, которое вызывается меткой, а не фрейм.

На следующем рисунке показана область, принадлежащая Label (серая), против области, принадлежащей Frame (красная).

Read area = Frame click event

...