親フォームから表示された子フォームから、呼び出し元の親フォームのコントロールをアクセスする方法として以下の記事に在りますが、 今回はそれと似た方法ですが少し違った方法で行います。
⇒親フォームのコントロールを子フォームからアクセスする方法
今回の方法は、親フォームで子フォームを表示する時に、自分自身のフォームをオーナー(所有者)として処理します。 また、子フォームの方では自分自身のオーナーを DirectCast で親フォームだとして、親の持つコントロールへアクセスします。
以下の例では、親フォームから子フォームを呼出した時に、子フォームから親フォームのテキストボックスの 「Text」を取得し、子フォームのテキストボックスの「Text」に初期設定します。
その後、子フォームのボタンを押下することで、親フォームのテキストボックスの「Text」に 子フォームのテキストボックスの「Text」を再設定します。
以下の画像は、親フォームから子フォームを表示し、子フォームのテキストボックスに「ABCD」を入力し「親への設定」ボタンを押下した時の様子です。
以下の今回の処理のソースを示します。子フォームを表示する時に ShowDialog を使いますが、親フォームである自分自身を引数で渡します。 そうすると子フォームの Owner プロパティに親フォームオブジェクトのインスタンスが渡せます。
親フォームのクラス
'''''' 子フォームを呼出す親フォーム2 ''' Public Class frmParentCtrlMain '''''' 「サブフォーム表示」ボタンクリックイベント ''' Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'プロパティテストウインドウ生成 Dim frmParentCtrlSub As New frmParentCtrlSub 'ウインドウ表示(指定した所有者を持つモーダルダイアログとしてフォームを表示) frmParentCtrlSub.ShowDialog(Me) 'プロパティテストウインドウ廃棄 frmParentCtrlSub.Dispose() frmParentCtrlSub = Nothing End Sub End Class
子フォームのクラス
'''''' メインフォームを参照する子フォーム ''' Public Class frmParentCtrlSub '''''' フォームロードイベント ''' Private Sub frmPropTextSub_Load(sender As Object, e As EventArgs) Handles Me.Load 'メイン側のTextBox1の内容を取得し、サブ側に設定 Me.TextBox1.Text = DirectCast(Me.Owner, frmParentCtrlMain).TextBox1.Text End Sub '''''' 「設定(プロパティ)」ボタンクリックイベント ''' Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'メイン側のTextBox1に、サブ側のTextBox1の内容を設定 DirectCast(Me.Owner, frmParentCtrlMain).TextBox1.Text = Me.TextBox1.Text ''自分を閉じる 'Me.Close() End Sub End Class
子フォームで使っている DirectCast は DirectCast 演算子と言われるもので、 指定されたオブジェクトをある型にキャストするための演算子です。
DirectCast(変数, キャスト後の型).「キャストされた型が持つプロパティ、メソッド等」
この DirectCast は「変数」を強制的にキャストされた型と処理するため、 間違った型にキャストすると当然のことながらエラーが発生します。 (存在しないプロパティを参照したり、存在しないメソッドを実行する場合)
DirectCast により直接親フォームの TextBox1 を参照していますが、 これが出来るのはなぜかと言いますと、親フォーム内で TextBox1 が Friend として宣言されているからです。 Friend 宣言のオブジェクトは同じプロジェクト内ならばどこからでも参照可能だからです。 通常フォームのデザイン画面でコントロールを張り付けた時に自動で Friend なオブジェクトとして生成されます。
ここで Friend の様な変数やクラス等の宣言のキーワードについて少し説明します。 宣言には Public, Friend, Protected, Private, Dim 等があります。
宣言キーワード | アクセス可能な個所 | 説明 |
---|---|---|
Public | 全ての箇所からアクセス可能 | 同一プロジェクトに限らず他のプロジェクトからもアクセスできます |
Friend | 同一プロジェクトからアクセス可能 | 同一プロジェクトであればどこからでもアクセスできます。 |
Protected | 自分自身のクラス、及び派生クラスからアクセス可能 | 他のプロジェクトでも派生クラスであればアクセスできます。 |
Protected Friend | 同一プロジェクトからアクセス可能 他のプロジェクトは派生クラスがアクセス可能 |
Protected Friend の両方の機能を併せ持つ。 |
Private | 自分自身のクラスからアクセス可能 | 派生クラスでもアクセス不可なので、純粋にローカルなものとして扱います。 |
Dim | 自分自身のクラスからアクセス可能 | Dim はクラスのメンバー変数や関数内の自動変数として宣言する宣言文です。 |
クラス内の変数はなるべく Private で宣言し、外部から操作するもののみ Public や Friend にする方が 宜しいかと思います。また、変数そのものを Public にするのではなく、プロパティとしてアクセス可能な様にするべきかと思います。
コメント