ユーザーフォームとPropertyプロシージャと私
ユーザーフォームにプロパティを追加する
フォームモジュールにPropertyプロシージャを書いてみる
なんかこう、クラスモジュールとフォームモジュールの違いが分からなくなってきている私です。
コチラに、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プロパティの値をイミディエイト・ウインドウに出力する。
実行結果
ユーザーフォームが表示されて、
イミディエイトにはsecretNameプロパティの値が表示された。
フィールドやプロパティまで持たせられるなんて、ますますクラスモジュールとの区別が分からなくなってきたなあ。いや、分かるけどw