ユーザーフォームとPropertyプロシージャと私

ユーザーフォームにプロパティを追加する

フォームモジュールにPropertyプロシージャを書いてみる

なんかこう、クラスモジュールとフォームモジュールの違いが分からなくなってきている私です。

akashi-keirin.hatenablog.com

コチラに、id:imihito さんからいただいたコメントへの返信を書いているときにふっと思いついたのが、

フォームモジュールにPropertyプロシージャ書いたらどうなるんだろ?
フォームモジュールにもフィールド持たせたりできんの?


ということだった。

で、実験。

前回記事のリスト1に、次のように追加。

リスト1 フォームモジュール
Option Explicit

Private secretName_ As String    '……(1)'

Public Property Let secretName(n As String)    '……(2)'
  secretName_ = n
End Property

Public Property Get secretName() As String    '……(3)'
  secretName = secretName_
End Property

Public Sub init(ByVal formCaption As String, _
                ByVal btnLeftName As String, _
                ByVal btnCenterName As String, _
                ByVal btnRightName As String)
  With Me
    .Caption = formCaption
    .BtnLeft.Caption = btnLeftName
    .BtnCenter.Caption = btnCenterName
    .BtnRight.Caption = btnRightName
  End With

(1)の

Private secretName_ As String

インスタンス変数。コイツに値(文字列)を持たせることで、インスタンスごとに固有の名前を持たせることができる。(もちろん、あまり実用上意味はないけど、あくまでも説明用のパラメータです。)

(2)からの3行

Public Property Let secretName(n As String)
  secretName_ = n
End Property

はsetterメソッド。「[インスタンス].secretName = "○○"」の形で値を設定することができる。

(3)からの3行

Public Property Get secretName() As String
  secretName = secretName_
End Property

はgetterメソッド。「[インスタンス].secretName = "○○"」の形で値を返す。

生まれ変わったUserFormTemplateオブジェクトを使ってみる。

前回記事のリスト2に次のようにコードを追加する。

スト2 標準モジュール
Public Sub userFormTest()
  Dim uFrm As UserFormTemplate
  Set uFrm = New UserFormTemplate
  With uFrm
    .init "アホ", "ボケ", "クズ", "デコスケ"
    .secretName = "ち~んw"    '……(1)'
    Debug.Print .secretName    '……(2)'
    .Show
  End With
End Sub

追加したのは2箇所。

(1)の

.secretName = "ち~んw"

でUserFormTemplateのインスタンスのsecretNameプロパティに値「ち~んw」を設定。

(2)の

Debug.Print .secretName

でsecretNameプロパティの値をイミディエイト・ウインドウに出力する。

実行結果

f:id:akashi_keirin:20170918213028j:plain

ユーザーフォームが表示されて、

f:id:akashi_keirin:20170918230445j:plain

イミディエイトにはsecretNameプロパティの値が表示された。

フィールドやプロパティまで持たせられるなんて、ますますクラスモジュールとの区別が分からなくなってきたなあ。いや、分かるけどw

@akashi_keirin on Twitter