コントロール配列のイベントを共有したい

解決


hoge  2005-11-09 00:58:19  No: 127472  IP: [192.*.*.*]

こんちわ〜。
無理と知りつつ、もしかしたら、何か裏技があるのであれば知りたいと思い、投稿させてもらいました。

コントロール配列のイベントを共有する裏技ってあるんですか?

ぜーーーたいに、無理なんであれば、あきらめるしかないと思い、UIの部分を作り変えようと思っています。

ただ、かなりの作業量があるので、もし裏技があるのであれば、
ぜひぜひ、知りたいです。

どなたか知っている人いないですか?
開発環境は、XPでVB6です。

よろしくお願いします。

編集 削除
通ってみた  2005-11-09 02:02:33  No: 127473  IP: [192.*.*.*]

具体的に何のイベントをどこでどうしたいのか書くとレスもらえるかもしれず

編集 削除
魔界の仮面弁士  2005-11-09 02:06:02  No: 127474  IP: [192.*.*.*]

コントロール配列の場合、イベント制御については、
  Private Sub aaaa_Click(Index As Integer)
のような、標準のイベントを利用する方法のみであり、WithEvents にて
  Private WithEvents aaaa As コントロール配列
みたいな事をするというのは、残念ながら無理でしょうね。


どうしても実装するというなら、UserContol上にコントロール配列を
構築して、それらのイベントを公開する形態を取るという手法も
ありますが、UIの変更が必要になってしまうので、かえって面倒でしょうし。

編集 削除
hoge  2005-11-09 02:12:19  No: 127475  IP: [192.*.*.*]

まず、回答ありがとうございました。
うーん。やはり。。。

では、質問を変えさせてください。

ショートカットキーを実現するときに、フォーカスがAというオブジェクトにいる場合と、Bというオブジェクトにいる場合で、処理を統一したかったのですが、AもBもコントロール配列として作成されています。

そのため、WithEventsを使用することはできませんでした。
皆さんは、このような場合は、やはり気合で、A_Keydownにも、B_Keydownにも同じショートカットキーを実現する関数をコールするような処理をしているということでしょうか?

同じ内容を2箇所に記述するのを避けたかったのです。

編集 削除
通ってみた  2005-11-09 02:24:31  No: 127476  IP: [192.*.*.*]

ちょっと違うかもしれないですが、参考までに

A(2)というボタンを押した時にB(4)というボタンを押したのと同じ処理をしたい、という時

やり方その1:
Private A_Click(Index As Integer)

If Index = 2 Then
    B_Click(4)
End If

やり方その2:

Private A_Click(Index As Integer)

If Index = 2 Then
    処理ルーチンへ飛ばす
End If

End Sub

Private B_Click(Index As Integer)

If Index = 4 Then
    処理ルーチンへ飛ばす
End If

End Sub

Private 処理ルーチン

処理させる

End Sub

編集 削除
Dental  2005-11-09 03:26:42  No: 127477  IP: [192.*.*.*]

> ショートカットキーを実現するときに、フォーカスがAというオブジェクトにいる場合と、Bというオブジェクトにいる場合で、処理を統一したかったのですが、AもBもコントロール配列として作成されています。

「ショートカットキー」の定義にもよるだろうけど、キー入力は、KeyPreviewなフォーム側のKey系イベントで一括して処理するようにしておいて、フォーカス位置を ActiveControl 経由で取得するようにすれば良いのでは?

編集 削除
通ってみた  2005-11-09 03:36:18  No: 127478  IP: [192.*.*.*]

ちなみに、

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200511/05110028.txt

この人だよね?

編集 削除
ささ  2005-11-09 05:51:22  No: 127479  IP: [192.*.*.*]

>皆さんは、このような場合は、やはり気合で、A_Keydownにも、B_Keydownにも同じショートカットキーを実現する関数をコールするような処理をしているということでしょうか?

Formのキーダウンに記述し、
現在何処のコントロールにフォーカスが当たっているのかを見たほうが速そう。

KeyPre(略 プロパティをTrueにして

編集 削除
hoge(まるちゃん)  2005-11-09 09:42:52  No: 127480  IP: [192.*.*.*]

こんにちわ。

ささ さん、通ってみたさん、Dental さん。
ご助言ありがとうございます。

初めて知ったのですが、Formの「KeyPreview」プロパティを有効にしておけば、
フォーカスを持っているオブジェクトがKeyPressイベントを取得する前に、
FormがKeyPressのイベントを受け取ることが出来るのですね!!
そっか。。。
知らなかった。。。

一生懸命、イベントを共有して、やりくりする方法を試行錯誤してました。
オレ、オバカです。

ありがとうございました。
これで、コード量を1/3くらい減らすことが出来そうです。

編集 削除
ささ  2005-11-09 11:12:58  No: 127481  IP: [192.*.*.*]

このプロパティを有効にして記述するということは

他のキーが入力されたときもつねに先にイベントが発生するので、処理をさせるときの条件式が甘いと、予期しないときにどうさしてしまいますので、
乱用はおすすめしないです
がその事を認識しながら利用する分には良いのではないかと思います

編集 削除