VB6 ImageList Frm Code Generation - PullRequest
       14

VB6 ImageList Frm Code Generation

0 голосов
/ 19 марта 2010

Примечание : Вероятно, это выстрел в темноте, и это просто из любопытства, о котором я спрашиваю.

При использовании элемента управления 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 не существуют для типов IImages, но GUID, связанный с этими свойствами, указывает тип ListImage, который реализует интерфейс IImage. Этот тип также имеет смысл, так как IImages фактически является коллекцией IImage.

Что не имеет смысла для меня, так это то, как VB6 создает эти ассоциации. Как VB6 узнает, что связь между именем Images -> ListImages связана исключительно из-за связанного типа (предоставляемого GUID) - возможно, потому что это единственное свойство этого типа? Во-вторых, как он разрешает ListImage1, ListImage2 и ListImage3 в дополнения к коллекции IImages, и использует ли он метод Add? Или, может быть, свойство ControlDefault?

Возможно, VB6 обладает определенными знаниями об этом элементе управления, и логическое разрешение не существует?

Ответы [ 2 ]

2 голосов
/ 20 марта 2010

Вы можете увидеть, что происходит с этим довольно надуманным примером. Начните с проекта 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, который передает frm. Нет ничего, что требовало бы, чтобы имена открытых свойств совпадали с именами внутренних пакетов свойств. Лично я бы использовал короткие идентификаторы только для того, чтобы минимизировать раздувание (если вообще возможно с VB6).

0 голосов
/ 19 марта 2010

Я предполагаю, что GUID ({2C247F25-8591-11D1-B16A-00C0F0283628}) указывает на связанный элемент управления ImageList, а ListImage1, ListImage2 и т. Д. Просто для перечисления всех изображений.

Это похоже на раннюю версию связанных элементов управления WPF (например, TextBox может ссылаться на свою сетку для размещения).

...