VB6 ImageList Frm Code Generation
Примечание: это, вероятно, выстрел в темноте, и это просто из любопытства, о котором я спрашиваю.
При использовании элемента управления ImageList из библиотеки Microsoft Common Control (mscomctl.ocx) я обнаружил, что VB6 генерирует код FRM, который не разрешается в имена реальных свойств / методов, и мне любопытно, как выполняется разрешение. Пример сгенерированного кода FRM приведен ниже с ImageList, содержащим 3 изображения:
Begin MSComctlLib.ImageList ImageList1
BackColor = -2147483643
ImageWidth = 100
ImageHeight = 45
MaskColor = 12632256
BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628}
NumListImages = 3
BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "Form1.frx":0054
Key = ""
EndProperty
BeginProperty ListImage2 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "Form1.frx":3562
Key = ""
EndProperty
BeginProperty ListImage3 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "Form1.frx":6A70
Key = ""
EndProperty
EndProperty
End
Исходя из моего опыта, тег BeginProperty обычно означает, что присваивается составное свойство (объект), например объект Font большинства элементов управления, например:
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 10950
ClientLeft = 60
ClientTop = 450
ClientWidth = 7215
BeginProperty Font
Name = "MS Serif"
Size = 8.25
Charset = 0
Weight = 400
Underline = 0 'False
Italic = -1 'True
Strikethrough = 0 'False
EndProperty
End
Который можно легко увидеть, чтобы разрешить в VB.Form.Font.<Имя свойства>.
С ImageList нет свойства с именем Images. GUID, связанный со свойством Images, указывает тип ListImages, который реализует интерфейс IImages. Этот тип имеет смысл, так как элемент управления ImageList имеет свойство ListImages, имеющее тип IImages. Во-вторых, свойства ListImage1, ListImage2 и ListImage3 не существуют в типах IImage, но GUID, связанный с этими свойствами, указывает тип ListImage, который реализует интерфейс IImage. Этот тип также имеет смысл, поскольку IImages на самом деле является коллекцией IImage.
Что не имеет смысла для меня, так это то, как VB6 создает эти ассоциации. Как VB6 узнает, что связь между именем Images -> ListImages связана исключительно из-за связанного типа (предоставляемого GUID) - возможно, потому что это единственное свойство этого типа? Во-вторых, как он разрешает ListImage1, ListImage2 и ListImage3 в дополнение к коллекции IImages, и использует ли он метод Add? Или, возможно, свойство ControlDefault?
Возможно, VB6 обладает конкретными знаниями об этом элементе управления, и логическое разрешение не существует?
2 ответа
Вы можете увидеть, что происходит с этим довольно надуманным примером. Начните с проекта ActiveX и добавьте Class1
и пометить его как Persistable = 1
' Class1
Option Explicit
Private m_sText As String
Property Get Text() As String
Text = m_sText
End Property
Property Let Text(sValue As String)
m_sText = sValue
End Property
Private Sub Class_ReadProperties(PropBag As PropertyBag)
With PropBag
m_sText = .ReadProperty("txt", "")
End With
End Sub
Private Sub Class_WriteProperties(PropBag As PropertyBag)
With PropBag
.WriteProperty "txt", m_sText, ""
End With
End Sub
Добавить UserControl1
' UserControl1
Option Explicit
Private m_oData As Class1
Property Get Data() As Class1
Set Data = m_oData
End Property
Private Sub UserControl_Initialize()
Set m_oData = New Class1
m_oData.Text = "this is a test"
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
With PropBag
Set m_oData = .ReadProperty("rs", Nothing)
End With
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
With PropBag
.WriteProperty "rs", m_oData, Nothing
End With
End Sub
Добавьте Form1 и поместите UserControl1 на него, чтобы сохранить его. Возможно, вы захотите добавить Module1 для Sub Main
' Module1
Sub Main()
With New Form1
.Show
End With
End Sub
Вот мой Form1.frm
файл
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 2400
ClientLeft = 48
ClientTop = 432
ClientWidth = 3744
LinkTopic = "Form1"
ScaleHeight = 2400
ScaleWidth = 3744
StartUpPosition = 3 'Windows Default
Begin Project1.UserControl1 UserControl11
Height = 516
Left = 924
TabIndex = 0
Top = 588
Width = 1020
_ExtentX = 1799
_ExtentY = 910
BeginProperty rs {326250A4-CA0D-4F88-8F20-DAA391CF8E79}
txt = "this is a test"
EndProperty
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Так UserControl1
определяет этот объект m_oData
сохраняется как собственность rs
в его WriteProperty
перегрузки. Class1
определяет, что его m_sText
переменная-член (или Text
государственная собственность) сохраняется как txt
член в IPropertyBag
Фирма проходит. Нет ничего, что требовало бы, чтобы имена открытых свойств совпадали с именами внутренних пакетов свойств. Я бы лично использовал короткие идентификаторы только для того, чтобы минимизировать раздувание (если это вообще возможно с VB6).
Я предполагаю, что GUID ({2C247F25-8591-11D1-B16A-00C0F0283628}) указывает на связанный элемент управления ImageList, а ListImage1, ListImage2 и т. Д. Просто для перечисления всех изображений.
Это похоже на раннюю версию элементов управления, связанных с WPF (например, TextBox может ссылаться на свою сетку для размещения).