DOBON.NET DOBON.NETプログラミング掲示板過去ログ

簡易インターフェイス

環境/言語:[XP VB.NET2003]
分類:[.NET]

こんにちわ。
VBと違い、Form1などのオブジェクトをForm型の変数に代入した場合、Form1に定義された独自のプロパティや関数
を呼び出すことはできません。(メンバーではないと言われる)
でも、対象が複数ある場合等で個別の型で宣言できない場合、インターフェイスを用意して派生クラスで作成した
りするのはわかったのですが、難しくてできそうにないのと通知レベルでよいので下記のようなことが実
現できないかと思いました。考えたはよいのですが、特に3.の部分などのやり方がわかりません。
というかそもそも下記のようなことはできるのでしょうか。よろしくお願いします。

1.呼び出し先のフォーム(例えばForm2とします)のTagプロパティにTextBox(非表示)を設定しておく

2.呼び出し元のフォーム(例えばForm1とします)でForm型の変数(例えばobjFormとします)に代入したForm2を開く

3.Form1のなにかしらのイベント(ボタン押下など)でobjFormのTagプロパティのTextBoxの値を変える。

4.Form2のTextBoxのchangeイベントが発生?したらTextBoxの値を参照してForm2の画面表示を変更する(例えばLabelなど)。
簡易インターフェイスというアイデアは面白いですね。

> 3.Form1のなにかしらのイベント(ボタン押下など)でobjFormのTagプロパティのTextBoxの値を変える。

この部分ですが、下記のコードで実験してみたら問題なく通知できました。

Dim tbox As TextBox = CType(objForm.Tag, TextBox)
tbox.Text = "hoge"

-------------
ところで、インターフェイスを定義して、呼び出される側の各Formクラスに実装し、
という正式(?)な方法も、やってみればそんなに難しくはないです。
ただちょっとオオゲサな感じはしますよね。。

なので私は、Form間の通知によくEventを使います。
本当はEventの引数にはEventArgsの派生クラスを使うべきですが、
今回の例のように単純なデータなら、下記のtextArgのように、
そのままEventの引数に渡しちゃったりもします。

Class Form1
 Shared Event MyEvent(ByVal sender As Object, ByVal textArg As String)
 Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  RaiseEvent MyEvent(Me, "hoge")
 End Sub
End Class

Class Form2
 Sub Form2_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  AddHandler Form1.MyEvent, AddressOf MyEventHandler
 End Sub
 Sub MyEventHandler(ByVal sender As Object, ByVal textArg As String)
  Label1.Text = textArg
 End Sub
End Class
あぁ、コードまで載せて頂きありがとうございました。

> ところで、インターフェイスを定義して、呼び出される側の各Formクラスに実装し、
> という正式(?)な方法も、やってみればそんなに難しくはないです。
> ただちょっとオオゲサな感じはしますよね。。

.NETになってVBより簡単にできる部分と難しくなった部分とが混在してるように感じて
います。まだまだ勉強中なので色々と挑戦してみます。

> なので私は、Form間の通知によくEventを使います。

なるほど、イベントにSharedが付けられるんですね。。MDIフォーム等での利用も考えて
いますので早速参考にさせて頂きます。
解決済み!
> なるほど、イベントにSharedが付けられるんですね。。

ほんとかな?。。。(^^;
■No14903に返信(まどかさんの記事)
> ほんとかな?。。。(^^;

できたとしても望ましくはないですよね。
概念上は明らかに、インスタンス メンバでしょう。
> 概念上は明らかに、インスタンス メンバでしょう。

透明人間に肩をたたかれるようなもんですよね。。。
2006/02/08(Wed) 05:21:42 編集(投稿者)

あれれ、Shared Eventって、そんなに気持ち悪いですか?
うーん言われてみれば、FormクラスがSharedなEventを発生するのは変かもです。MonoStateパターンの「イベントマネージャ」みたいなクラスを作って、間に入れるとちょっとはましかな?

Class MyEventManager
 Shared Event MyEvent(ByVal textArg As String)
 Shared Sub RaiseMyEvent(ByVal textArg As String)
  RaiseEvent MyEvent(textArg)
 End Sub
End Class

Class Form1
 Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  MyEventManager.RaiseMyEvent("hoge")
 End Sub
End Class

いや、それならいっそMyEventManagerをSingletonにして
Sharedをなくしてしまうほうがいいのかしらん。。。

DOBON.NET | プログラミング道 | プログラミング掲示板