1

:これはおそらく暗闇の中でのショットであり、私が求めているのは純粋に好奇心からです。

Microsoft Common Control lib(mscomctl.ocx)のImageListコントロールを使用すると、VB6が実際のプロパティ/メソッド名に解決されないFRMコードを生成することがわかり、解決方法に興味があります。生成されたFRMコードの例を、3つの画像を含むImageListとともに以下に示します。

   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というプロパティはありません。プロパティImagesに関連付けられたGUIDは、インターフェイスIImagesを実装するタイプListImagesを示します。ImageListコントロールにはIImagesタイプのListImagesというプロパティがあるため、このタイプは理にかなっています。次に、プロパティListImage1、ListImage2、およびListImage3はタイプIImagesには存在しませんが、これらのプロパティに関連付けられたGUIDは、インターフェイスIImageを実装するタイプListImageを示します。IImagesは実際にはIImageのコレクションであるため、このタイプも意味があります。

私には意味がないのは、VB6がこれらの関連付けを行う方法です。VB6は、関連付けられたタイプ(GUIDによって提供される)のために、Images-> ListImagesという名前の間の関連付けをどのように知るのですか?おそらくそれがそのタイプの唯一のプロパティであるためですか?次に、ListImage1、ListImage2、ListImage3をコレクションIImagesへの追加にどのように解決し、Addメソッドを使用しますか?または、おそらくControlDefaultプロパティですか?

おそらく、VB6はこのコントロールに関する特定の知識を持っており、論理的な解決策は存在しませんか?

4

2 に答える 2

3

このかなり工夫された例で何が起こっているかを見ることができます。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を追加したい場合があります

' 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ます。frmのメンバーが渡されるときに、そのメンバー変数(またはパブリックプロパティ)が永続化されることを決定します。パブリックプロパティ名が内部プロパティバッグ名と一致する必要があるものは何もありません。私は個人的に、膨満感を最小限に抑えるためにショートIDを使用します(可能であればVB6で)。rsWritePropertyClass1m_sTextTexttxtIPropertyBag

于 2010-03-20T12:41:50.323 に答える
0

GUID({2C247F25-8591-11D1-B16A-00C0F0283628})は関連するImageListコントロールを指し、ListImage1、ListImage2などはすべての画像を列挙するためだけにあると思います。

これは、WPF関連のコントロールの初期バージョンのようなものです(たとえば、TextBoxは配置のために囲んでいるグリッドを参照できます)。

于 2010-03-19T19:26:35.553 に答える