ユーザーフォームをクラスっぽく使おう!

ユーザーフォームをクラスっぽく使う

ユーザーフォームのテンプレート(?)

前回の

akashi-keirin.hatenablog.com

で、ユーザーフォームもNewできると分かった。

で、それが何の役に立つのか、イマイチよく分からないんだが、

よく使うパターンのユーザーフォームのひな形を作っておいて、部分的に柔軟性を持たせたらいいんでね?

と思ったので、実験してみた。

ユーザーフォームのひな形を作る

手の込んだものを作るのはメンドクサイので、次のようなものにした。

f:id:akashi_keirin:20170918212932j:plain

オブジェクト名は「UserFormTemplate」とした。

見ての通り、コマンドボタンを3つ設置。

オブジェクト名は、左から順に

f:id:akashi_keirin:20170918212946j:plain

「BtnLeft」。

f:id:akashi_keirin:20170918213006j:plain

「BtnCenter」。

f:id:akashi_keirin:20170918213017j:plain

「BtnRight」。

今まで、ユーザーフォーム上のコントロールのオブジェクト名は「lblPersonName」みたいにキャメル記法を使っていたんだけど、"オブジェクト名"ってことはクラス名みたいなもんだから、パスカル記法の方が良いと思い直した。

んで、UserFormTemplateのモジュールに、次のコードを書いた。

リスト1 フォームモジュール
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
End Sub

おなじみ、擬似コンストラクタのinitメソッド。

ユーザーフォームの_Initializeメソッドも引数を持たせられないから、仕方なくこうした。

(*)からの4行

.Caption = formCaption
.BtnLeft.Caption = btnLeftName
.BtnCenter.Caption = btnCenterName
.BtnRight.Caption = btnRightName

は、いづれもMe、すなわちUserFormTemplateのインスタンスに対する処理。

それぞれ、ユーザーフォーム、左ボタン、中央ボタン、右ボタンのキャプションに引数で渡された文字列をセットする。

Newしてインスタンス化した後は、必ずこのinitメソッドを呼ぶ、という約束にする。

んで、このユーザーフォームを使うコードを標準モジュールに書く。

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

(1)の

Dim uFrm As UserFormTemplate

で、UserFormTemplate型の変数uFrmを宣言。

(2)の

Set uFrm = New UserFormTemplate

でUserFormTemplateをインスタンス化。クラスモジュールの使い方と同じ。

(3)の

.init "アホ", "ボケ", "クズ", "デコスケ"

は、uFrmの擬似コンストラクタinitメソッドを、4つの引数を渡して実行。4つの引数は、前から順に、それぞれフォーム、左ボタン、中央ボタン、右ボタンのキャプションとなる。

initメソッドで初期化をしたら、あとは(4)の

.Show

でフォームを表示しておしまい。

実行。

f:id:akashi_keirin:20170918213028j:plain

ちゃんとそれぞれキャプションが設定された状態で表示された。

最後に

ユーザーフォームを用いたアプリで、似たようなフォームを多用するようなやつを作成するときになら、少しは役に立つかも知れんなあ。

前に予定管理アプリみたいなのを自作した(させられた)ときにこの知識があったら、もう少しラクできていたかも。

akashi-keirin.hatenablog.com

@akashi_keirin on Twitter