|
■No67672 (寅 さん) に返信 > ただ、私は現在、VBの機能を理解しようとしており、機能自体を知りたいのです。 機能…? ですから、DirectCast 等で「キャスト」すれば良いのですよ。
> 何故通常のフォームにはアクセス出来て、Newで作ったフォームにはアクセス出来ないのかが主題です。 アクセス出来ますよ、先の回答の最後の行に書いたように。
DxCam0 や DirectShowIF だと分かりにくいので、少し置き換えて話をしますが:
Form1 も Form2 も、Form 型です(Form を継承して、Form1 や Form2 を作っています)。 Form1 には Button1 がありますが、Form2 には Button1 がありません。
全ての Form に Button1 があるわけでは無いため、Dim f As Form に対して、 f.Button1 のようにアクセスすることはできません。
ですが、変数 f の中身が Form1 であるならば、その Form が Form1 であることを VB に伝えてやれば、Button1 にアクセスすることできます。それが先の DirectCast であり、 具体的には DirectCast(f, Form1).Button1 のようにして処理できます。
この他にも、レイトバインドを使う方法や、リフレクションを用いてアクセスする方法もありますが、 今回は型が分かっているので、(DirectCast や TryCast で)キャストして呼び出すのが良いでしょう。
とはいえ、Form1 にも Form3 にも Button1 があって、それを共通の仕組みとして呼び出したいなら、 If TypeOf f Is Form1 Then DirectCast(f, Form1).Button1.PerformClick() ElseIf TypeOf f Is Form3 Then DirectCast(f, Form3).Button1.PerformClick() ElseIf … … End If のように、インスタンスの種類だけキャストが発生してしまい、共通の Form 型として 管理することができず、汎用化できません。
このような場合には、 Public Interface ICommonForm ReadOnly Property OKButton As Button '☆ Button 型のプロパティを用意する。 End Interface といった Interface を用意しておき、各フォーム(Form1, Form3, …)でそれを Implements するという手が使えます。
Public Class Form1 Inherits Form
Implements ICommonForm '★
Public ReadOnly Property OKButton As Button Implements ICommonForm.OKButton '★ Get Return Me.Button1 End Get End Property End Class
そうすれば呼び出し側では、Form の実際の型にあわせて
If TypeOf f Is Form1 Then DirectCast(f, Form1).Button1.PerformClick() ElseIf TypeOf f Is Form3 Then DirectCast(f, Form3).Button1.PerformClick() ElseIf … … End If
のように呼び分けずとも、共通して
If TypeOf f Is ICommonForm Then DirectCast(f, ICommonForm).OKButton.PerformClick() End If
のように統一化することができます。
もっとも上記の例であれば、Button 等のコントロールそのものを公開するのではなく、
Public Interface ICommonForm Sub OKClick() End Interface
のように、ボタンのクリック機能のみを公開したほうが良いかもしれません。
|