ユーザーフォームをクラスっぽく使おう!
ユーザーフォームをクラスっぽく使う
ユーザーフォームのテンプレート(?)
前回の
で、ユーザーフォームもNewできると分かった。
で、それが何の役に立つのか、イマイチよく分からないんだが、
よく使うパターンのユーザーフォームのひな形を作っておいて、部分的に柔軟性を持たせたらいいんでね?
と思ったので、実験してみた。
ユーザーフォームのひな形を作る
手の込んだものを作るのはメンドクサイので、次のようなものにした。
オブジェクト名は「UserFormTemplate」とした。
見ての通り、コマンドボタンを3つ設置。
オブジェクト名は、左から順に
「BtnLeft」。
「BtnCenter」。
「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
でフォームを表示しておしまい。
実行。
ちゃんとそれぞれキャプションが設定された状態で表示された。
最後に
ユーザーフォームを用いたアプリで、似たようなフォームを多用するようなやつを作成するときになら、少しは役に立つかも知れんなあ。
前に予定管理アプリみたいなのを自作した(させられた)ときにこの知識があったら、もう少しラクできていたかも。