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

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

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

  ====================================================================
  §9  擬似の足枷
  ====================================================================

(前節より‥‥‥)
      ところで、Excel2000から「RaiseEvent 」という命令がサポートされているのを知っていますか?

  前節では、呼び元のUserForm参照を[Object 型]でクラスへ引き継いでおき、クラスモジュール
のイベントルーチンから
          Call  MyCaller.RaiseClick ( MyIndex )      (補) MyCaller は[Object 型]のUserForm参照
という風に、UserForm1内のサブルーチンを指定し、これをCallする事で、ユーザーフォームモジュ
ール内に「イベントルーチンもどき」を実現しましたが、Excel2000から
          クラスモジュールからカスタムイベントを発生させる
事が出来るようになりました。「もどき」ではなく正真正銘の『イベント』です。

  カスタムイベントの生成は下記のようにして行ないます。
=== クラスモジュール ===
(1) 宣言セクション(モジュールの先頭)で
        カスタムイベントの「イベント名」 および 「引数リスト」
    を定義します。イベント名の名前は任意ですが、クリックを処理するイベントですから、やはり
    イベント名は「Click 」にします。引数は普通のサブプロシジャーと同様に記述します。前節
    の「もどき」と同じように、ここでは[ Index ]だけですので、イベント宣言は
    下記のようになります。
        Public Event Click ( ByVal Index As Integer )

(2) 定義したカスタムイベントを実際に発生させる為には「RaiseEvent 」ステートメントを使います。
        Private WithEvents MyCtrl As MSForms.CommandButton

        Private Sub MyCtrl_Click ( )          ← 上のWithEvents 付き [ MyCtrl ] に対するClick イベントプロシジャー
            RaiseEvent Click ( MyIndex )    ← このクラスのカスタムイベント『 Click 』を発生させる
        End Sub

(3) このようにイベント定義をしてあると、このクラスを利用する側のUserFormでは
        ・クラスオブジェクト定義の際に[WithEvents]を付ける
        ・『クラスオブジェクト名アンダーバーカスタムイベント名』という名前の
          サブプロシジャーを用意する
    とする事により、クラス内でカスタムイベントが生成(RaiseEvent)された瞬間に、VBAシステムを
    経由して下記のサブプロシジャーが呼び出されます。
        Private WithEvents cmdWeekBtn As clsWeekCmd

        Private Sub cmdWeekBtn_Click ( ByVal Index As Integer )
            曜日表示の処理
        End Sub

        (補) ここで、仮に クリックイベント の 【イベント名】 を Click ではなく ABC で定義
                  Public Event  ABC ( ByVal Index As Integer )
                  (当然、 RaiseEvent ステートメント も RaiseEvent ABC ( MyIndex ) になります)
              していると、利用側の UserForm 内で記述する クリックイベント の プロシジャー 名
                  Private Sub cmdWeekBtn_ABC ( ByVal Index As Integer )
              となります(参照 : §5 「イベント名の解説」 部分)。


ここまで来ると、極々普通のコマンドボタンのクリックイベントと同じですね。  o(^o^)o  ヤッター♪



  ところで、最初に書いたように、この機能は「Excel2000(1999/6 リリース) からサポート」されてい
ます。だとしたら、
        何故、誰も使わないのでしょう?
        何故、どこの解説本/HPにも書いていないのでしょう?
        私が、この「擬似からの脱却」を書いているのは 2004/5 です。
        まさか、5年もの間、誰も気付かなかった? そんな馬鹿な (oT▽T)ノ彡
と思いませんか?  (・・?  確かに‥‥

  上で「このように書けばカスタムイベントを作れる」と書きましたが、実のところ‥‥‥
        擬似コントロール配列手法では、『このように書く』事が出来ない為に、
        「RaiseEvent」が使えない
のです。もう少し正確に言えば、
        クラス側には「RaiseEvent」を書けるけれども、
        UserForm側で「WithEvents」宣言が書けない
ので『使えない』のです。  (-"-#)  何でやねん!

  WithEventsのヘルプには
            ActiveX オブジェクトによって起動されるイベントに対応する為のオブジェクト変数である
            ことを指定するキーワードです。クラス モジュール内でのみ有効です。
            キーワード WithEvents を使用して任意の数の変数を個別に宣言できます。
            ただし、キーワード WithEvents では、配列は作成できません
            また、キーワード New をキーワード WithEvents と共に使用することはできません
とあります。    (ToT)  そっ、そんな〜〜

  仮に無理に使おうとしても、イベントプロシジャー名
          『 クラスオブジェクト名 + アンダーバー + カスタムイベント名 』
を作ろうとした時に
          cmdWeekBtn(1)_Click
となりますが、このような名前は実際的に作れないし(カッコは名前に使えない)、もし仮にカッコ
が使えたとしても、その時には、"(1)"は名前の一部であって、配列の添え字という解釈にはなり
ませんから‥‥という事を考えれば、[WithEvents ]が配列では使えないという理由が判るでしょう。

  つまり、擬似コントロール【配列】である以上、[ RaiseEvent : WithEvents ]のセットを使った非常
に便利な機能(カスタムイベント)とは『完璧に縁が無い』
という事です。

  これが、今まで、
        誰も使わない、どこの解説本/HPにも書いていない
理由です(こういうのもある、と書いたところで、使えないのでは意味無いですからね)。

  次節では、この「足枷」を取り除いて、VB並みの「コントロール配列」記述を利用できるようにする
手法について解説します。


  ====================================================================
  次節 : §10  擬似からの脱却
  ====================================================================

[ 前頁 , 次頁 , §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.