2005/ 3/11 解説文・クラスソースにおいて、オブジェクト定義時での[New]指定 を止めて、Initialize 時に
インスタンス生成(Set
ステートメント)するように修正しました。
2020/10/20 [ Property Let / Set ] の違いの解説を追加しました。
(前節より‥‥‥) そんな事より、「使い方」教えて、使い方!ヽ(-.-;)
それでは、前節までに書いた「クリックイベントプロシジャー と 共通サブ」である
> Private Sub cmdSun_Click()
> Call cmdWeek_Click_Sub(1)
> End Sub
>
> Private Sub cmdMon_Click()
> Call cmdWeek_Click_Sub(2)
> End Sub
> ( 以下、省略 )
>
> Private Sub cmdWeek_Click_Sub(ByVal Index As Integer)
> Dim vntWeekName As Variant
> vntWeekName = Array("", "日", "月", "火",
"水", "木", "金", "土")
>
> MsgBox vntWeekName(Index) & "曜日ボタンがクリックされました("
& Index & ")"
> If (colWeekBtn(Index).BackColor = vbButtonFace) Then
> colWeekBtn(Index).BackColor = vbRed
> Else
> colWeekBtn(Index).BackColor = vbButtonFace
> End If
> End Sub
> ・ コマンドボタンのオブジェクトを受け取る
> ・ そのコマンドボタンの曜日を表す値( = Index
)を受け取る
を組み込むには、[ Property Let ]というステートメントでプロシジャーを定義します。これによって、 クラスが値を受け取るプロパティ
というものが、このクラスに作られます。[ Let ]とは、このクラスに対して利用側が「値を代入する」
という意味です。
実際のコードは
Private MyCtrl As MsForms.CommandButton
Private MyIndex As Integer
Public Property LetItem(NewCtrl As MsForms.CommandButton)
Set MyCtrl = NewCtrl
End Property
Public Property LetIndex(NewIndex As Integer)
MyIndex = NewIndex
End Property
となります(プロシジャーレベルの変数を用意して、そこに受け取った内容を保存するコードです)。
(※) Property Let のオブジェクト版 として Property Set というものもあり、その意味からすれば、上記 Item プロパティ は
「Property Set」 を使用するべきでしょうが、ここでは敢えて Let を使用しています (Let
/ Set の違いは 後述 )。
Item および Index が、このプロパティの名前です。外から使ってもらうものですから、当然 [ Public ]で宣言します。
これは[利用側 ⇒ クラス]へと、値を格納して貰う為のインターフェースです。
逆に、クラス内に格納してある値を[クラス ⇒ 利用側]へと取り出すインターフェースには[ Property Get ]という
プロシジャーを使用します。[ Get ]とは、このクラスから利用側が「値を受け取る」という意味です。そのコードは
Public Property GetItem() As MsForms.CommandButton
Set Item = MyCtrl
End Property
Public Property GetIndex() As Integer
Index = MyIndex
End Property
となります。
Let と Get は対であり、同じ名前のプロパティは、Let/Get ともに[As 句]の属性を同じにする
必要があります。Let と Get の定義有無によって
・ Let のみ定義 ⇒ 「値の設定のみ可能」なプロパティ
・ Get のみ定義 ⇒ 「値の取得のみ可能」なプロパティ
・ Let と Get 両方を定義 ⇒ 「値の設定と取得が可能」なプロパティ
となります。
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 7
Set cmdWeekBtn(i) = NewclsCmdWeek ' インスタンスの生成
With cmdWeekBtn(i) .Item = Me.Controls("cmdWeek" & i) .Index = i
End With
Next i
End Sub
Private Sub MyCtrl_Click()
Dim vntWeekName As Variant
vntWeekName = Array("", "日", "月", "火",
"水", "木", "金", "土")
MsgBox vntWeekName(MyIndex) & "曜日ボタンがクリックされました(" & MyIndex & ")"
If (MyCtrl.BackColor = vbButtonFace) Then
MyCtrl.BackColor
= vbRed
Else
MyCtrl.BackColor
= vbButtonFace
End If
End Sub
Private WithEvents MyCtrl As MsForms.CommandButton
Private MyIndex As Integer
Public Property Let Item(NewCtrl As MsForms.CommandButton)
Set MyCtrl = NewCtrl
End Property
Public Property Let Index(NewIndex As Integer)
MyIndex = NewIndex
End Property
Private Sub MyCtrl_Click()
Dim vntWeekName As Variant
vntWeekName = Array("", "日", "月", "火",
"水", "木", "金", "土")
MsgBox vntWeekName(MyIndex) & _
"曜日ボタンがクリックされました(" & MyIndex & ")"
If (MyCtrl.BackColor = vbButtonFace) Then
MyCtrl.BackColor = vbRed
Else
MyCtrl.BackColor = vbButtonFace
End If
End Sub