wrongwrongな開発日記

しんまいさんの忘備録

【VB】自作したコンポーネントをデザイナーに表示する【.Net】

↓の記事の続きです。
wrongwrong163377.hatenablog.com

前回の問題点

コンポーネントをデザイナーで扱えないので、デザインの確認が難しい状態でした。
今回はデザイナーで自作コンポーネントを扱う手順を書きます。かなりバットノウハウなやり方ですが……。

手順

手順は↓の「不要部を削除」~「修正完了」までに上げてあります。
github.com

引数の無いコンストラクタを用意する

コンポーネントをデザイナーで扱うには、引数の無いコンストラクタを用意する必要があります。

Public Class CompornentBase
    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        '別のフォームに設定するための準備
        With Me
            .TopLevel = False
            .Visible = True
        End With
    End Sub
End Class
デザイナーでコンポーネントを宣言する

デザイナーをコードから開き、以下のようにMyCompornentを宣言してControlsにAddします。

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Parent
    Inherits System.Windows.Forms.Form

    'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Windows フォーム デザイナーで必要です。
    Private components As System.ComponentModel.IContainer

    'メモ: 以下のプロシージャは Windows フォーム デザイナーで必要です。
    'Windows フォーム デザイナーを使用して変更できます。  
    'コード エディターを使って変更しないでください。
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.SuspendLayout()
        '
        'Parent
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(800, 450)
        Me.Name = "Parent"
        Me.Text = "Parent"
        Me.ResumeLayout(False)

        Dim MyCompornent As New CompornentBase
        Me.Controls.Add(MyCompornent)
    End Sub
End Class
ビルドする

この状態でビルドすると、デザイナーでコンポーネントが表示できます。
f:id:wrongwrongwrongwrong163377:20180831204251p:plain
が、ここまでではまだ不完全です。

デザイナーで移動させる

この状態からデザイナーで移動を行います。
f:id:wrongwrongwrongwrong163377:20180831204435p:plain
するとVisualStudioが自動でよしなにやってくれるので、コードが以下のように変化します。

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Parent
    Inherits System.Windows.Forms.Form

    'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Windows フォーム デザイナーで必要です。
    Private components As System.ComponentModel.IContainer

    'メモ: 以下のプロシージャは Windows フォーム デザイナーで必要です。
    'Windows フォーム デザイナーを使用して変更できます。  
    'コード エディターを使って変更しないでください。
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.MyCompornent = New UseFormcompornentSample.CompornentBase()
        Me.SuspendLayout()
        '
        'MyCompornent
        '
        Me.MyCompornent.BackColor = System.Drawing.Color.SpringGreen
        Me.MyCompornent.ClientSize = New System.Drawing.Size(200, 100)
        Me.MyCompornent.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
        Me.MyCompornent.Location = New System.Drawing.Point(81, 73)
        Me.MyCompornent.Name = "MyCompornent"
        Me.MyCompornent.Text = "Form1"
        '
        'Parent
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(800, 450)
        Me.Controls.Add(Me.MyCompornent)
        Me.Name = "Parent"
        Me.Text = "Parent"
        Me.ResumeLayout(False)

    End Sub

    Friend WithEvents MyCompornent As CompornentBase
End Class

手順は以上です。