У меня есть пользовательская форма, которая считывает данные из файла и динамически заполняет элемент управления 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 и кнопкой, нажимаемой для загрузки данных, верно? Я не хочу делать это более сложным, чем нужно, но я также хотел бы создать устойчивое и надежное решение. Любая помощь будет оценена.