ロゴ(青) 擬似からの脱却 ロゴ(緑)

  【 擬似からの脱却 】  [ Breakthrough in the Pseudo-Control Arrays ]

[ clsBpca の 軌跡 ] [ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダークラス ] [ 質問はこちら]

  ====================================================================
  §3  コレクション オブジェクトの利用
  ====================================================================

2006/5/29 解説文に、オブジェクト定義時での[New]指定 が残っていました。
                Initialize 時にインスタンス生成(Set ステートメント)するように修正しました。


(前節より‥‥‥)
      でも、[ cmdSun ] [ cmdMon ] ‥‥という名前の方が良いんだけど、それは無理なの?  (;_;)

  Controls コレクションを使う代わりに、曜日ボタン専用のコレクションを作って配列のように使う
方法もありますので、それを使えば出来ます。  o(^-^○

  先ず、モジュール先頭の「宣言セクション」にて、[ Private ]レベルのコレクションオブジェクト
定義します。そして、Initialize イベントの中で、曜日ボタンをコレクションに登録します。
        Private colWeekBtn As Collection

        Private UserForm_Initialize ( )
            Set colWeekBtn = New Collection    ' インスタンスの生成
            With colWeekBtn
                .Add cmdSun
                .Add cmdMon
                .Add cmdTue
                    :
                .Add cmdSat
            End With
        End Sub
このように、コレクションでは「Add メソッドにより追加していく」という方法を採りますので、通番が
付いていなくて、ループ処理に適さない名前のものであっても、さして手間取らずにコーディング
する事ができます。[ cmdWeek + 番号 ]という名前のままならば
        Private colWeekBtn As Collection

        Private UserForm_Initialize ( )
        Dim i As Integer
            Set colWeekBtn = New Collection    ' インスタンスの生成

            For i = 1 To 7
                colWeekBtn.Add Controls ( "cmdWeek" & i )
            Next i
        End Sub

という風に、ループ処理の中で[ Add ]する使い方ができます。

  コレクション内に登録されたオブジェクトは『登録した順に1から振られる番号』で参照できます。
そうすると、先の共通サブの部分は
        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
という書き方になります。

  イベントプロシジャー側のコーディングは、[cmdSun]であっても[cmdWeek1]であっても、前節
で書いたコードと同じです。
        > Private Sub cmdSun_Click ( )            もしくは Private Sub cmdWeek1_Click ( )
        >     Call cmdWeek_Click_Sub ( 1 )
        > End Sub
        >
        > Private Sub cmdMon_Click ( )
        >     Call cmdWeek_Click_Sub ( 2 )
        > End Sub
        >     :
        >     :
        > Private Sub cmdSat_Click ( )
        >     Call cmdWeek_Click_Sub ( 7 )
        > End Sub

  [ Collection ]は「複数のオブジェクトをまとめる集合体」ですので、Addメソッドの繰り返しで
何個でもオブジェクトを追加できます。配列(動的配列を除く)のように上限は有りません。なお、
何個入っているかは、Count プロパティで取得します。

  [ Collection ]の代わりに、特定のオブジェクト(今回はCommandButton )を配列宣言しても
同じ様にコーディングできます。この場合は、[Add ]ではなく、[Set ]ステートメントで代入を行
ないます。
        Private cmdWeekBtn ( 1 To 7 ) As MsForms.CommandButton

        Private UserForm_Initialize ( )
            Set cmdWeekBtn ( 1 ) = cmdSun
            Set cmdWeekBtn ( 2 ) = cmdMon
                        :
            Set cmdWeekBtn ( 7 ) = cmdSat
        End Sub
もしくは、
        Private UserForm_Initialize ( )
        Dim i As Integer
            For i = 1 To 7
                Set cmdWeekBtn ( i ) = Controls ( "cmdWeek" & i )
            Next i
        End Sub

        Private Sub cmdWeek_Click_Sub ( ByVal Index As Integer )
        Dim vntWeekName As Variant
            vntWeekName = Array ( "", "日", "月", "火", "水", "木", "金", "土" )
            MsgBox vntWeekName ( Index ) & "曜日ボタンがクリックされました(" & Index & ")"
            If (cmdWeekBtn ( Index ).BackColor = vbButtonFace ) Then
                cmdWeekBtn ( Index ).BackColor = vbRed
            Else
                cmdWeekBtn ( Index ).BackColor = vbButtonFace
            End If
        End Sub


色々な方法がありますので、その時その時で、一番具合の良い方法を採って下さい。  ヾ(^v^)k

それは良いけど、クリックイベントの方はどうなの? まとめる方法は無いの?  (・・?

  ====================================================================
  次節 : §4  クラスモジュールって、何?
  ====================================================================

[ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダークラス ] [ 質問はこちら]


[ Home へ戻る ]

ロゴ(ゴールド) ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2004 Allrights Reserved.