tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルユーザイベントを持つ不定個のクラス
記事No7364
投稿日: 2008/04/19(Sat) 16:46
投稿者ダンボ
皆様にお聞きしたいことは、
・オブジェクトインスタンスは必ずオブジェクト変数に割り付けなければならないのか?
・ユーザイベントは必ず対応したオブジェクト変数でしか受け取れないか?
です。言葉が舌足らずと思いますので背景を説明しますと、

ユーザイベントを発生させるPicClassクラスを設計しました。1枚の画像をハンドルするクラスです。
このクラスを利用する側では、
Dim WithEvents Pic As New PicClass
と宣言&生成するわけですが、画像が多数不定個である場合にどうしたらよいかわからなくなりました。

10枚くらいの固定枚数であれば、
Dim WithEvents Pic0 As New PicClass
Dim WithEvents Pic1 As New PicClass
Dim WithEvents Pic2 As New PicClass
という風に宣言&生成するのが楽です。
不定個であってもユーザイベントを扱わなければ、
Dim Pics(n) As PicClass
For i = 0 to n
   Pics(i) = New PicClass
next i
で行けますけど、今度はユーザイベントの受け取り方がわかりません。

[ツリー表示へ]
タイトルRe: ユーザイベントを持つ不定個のクラス
記事No7366
投稿日: 2008/04/20(Sun) 05:47
投稿者Hongliang
AddHandler を調べてください。

[ツリー表示へ]
タイトルRe: ユーザイベントを持つ不定個のクラス
記事No7368
投稿日: 2008/04/20(Sun) 07:28
投稿者ゆうき
ゆうきです。おはようございます。

> 不定個であってもユーザイベントを扱わなければ、
>  Dim Pics(n) As PicClass
>  For i = 0 to n
>    Pics(i) = New PicClass
>  next i
> で行けますけど、今度はユーザイベントの受け取り方がわかりません。

AddHandlerステートメントを使い、
(書式)AddHandler イベント, AddressOf イベントハンドラ

ここで
For i = 0 to n
  Pics(i) = New PicClass
  AddHandler Pics(i).イベント, AddressOf イベントハンドラ
next i

とすれば、
Private Sub イベントハンドラ()
のイベントが発生します。
Private Sub イベントハンドラ() Handles Piccs.イベント
                 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
とする必要はありません。

詳しくは、
http://msdn2.microsoft.com/ja-jp/library/7taxzxka(VS.80).aspx

[ツリー表示へ]
タイトル[解決] ユーザイベントを持つ不定個のクラス
記事No7370
投稿日: 2008/04/20(Sun) 09:04
投稿者ダンボ
Hongliang さん、ゆうき さん、どうもありがとうございます。

> For i = 0 to n
>   Pics(i) = New PicClass
>   AddHandler Pics(i).イベント, AddressOf イベントハンドラ
> next i
で、当面の問題は解決しました。ちょっと初歩的な知識不足だったようで恥。
「VB中学校」さんにも行って再確認してきました。
http://homepage1.nifty.com/rucio/main/dotnet/Samples151/Sample178EventHandle.htm
Handles キーワードと AddHandler ステートメントの2つの方法がある理由のひとつは
この場合のように不定個のインスタンス(動的に生成されるインスタンス)も扱えるように
するためだったんですね。なんで2通りあるかあまり考えていなかった。。。

PicClassのインスタンスはTableLayoutPanelGridに格納して、以後TableLayoutPanelGridの行・列番号で
アクセスします。従ってPics(i)というオブジェクト変数は、このプログラムでは必要ないんです。
TableLayoutPanelGrid.Controls.Add(New PicClass(画像ファイルパス), 2, 1)
TableLayoutPanelGrid.GetControlFromPosition(2, 1)
のような感じです。
ユーザイベントだけのために変数を設定するのもなんだかなぁと思って質問しました。
Pics(i)の部分をTableLayoutPanelGrid.Controlsで表現すれば、特にPics(i)という
オブジェクト変数を作らなくても行けますね。

> ・オブジェクトインスタンスは必ずオブジェクト変数に割り付けなければならないのか?
> ・ユーザイベントは必ず対応したオブジェクト変数でしか受け取れないか?

答えはいずれもノーということで。

[ツリー表示へ]