VB.NETで別のフォームからForm1.TextBox1.Textを参照しようとしてもそのままではTextBox1が見えない。
ガリバー著「VisualBasic.NET基礎300の技」のTips261「他のフォームのコントロールを参照する」をみると、コントロールをSharedキーワードと共に宣言すると出ている。ところがこの通りやってみると、参照は確かにするのだが、フォームデザイン画面からコントロールが消えてしまう。Sharedを外すと復活する。これではたとえ参照できても画面の編集ができないから使いようがない。この本はVB.NET2002を元に書かれたものだからVB.NET2003の仕様が変わったためなのかもしれない。
仕方が無いので自分で調べることにした。そして試行錯誤の上、以下のような方法で実現することができた。
1.クラスモジュールにForm1をPublic Shared で定義
2.上記クラスモジュールのMainプロシージャからForm1を起動。
3.Form2に上記クラスモジュールをimportsで参照
4.Form1から開いたForm2でForm1のコントロールを参照。
サンプルソース(SharedForm.lzh)を用意したので詳しくはそちらを見てもらうとして、サンプルでは、Form1のTextBox1の内容をForm2から参照し、さらにForm2のTextBox1の値をForm1のTextBox2へ直接代入するようになっている。なおスタートアップをMainプロシージャでなくForm1にした場合では参照することはできなかった。
'=== プロジェクト名:SharedForm ===
'--- Class1.vb ---
Public Class Class1
Public Shared f1 As New Form1
Shared Sub Main()
Application.Run(f1)
End Sub
End Class
'--- Form1.vb ---
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim f2 As New Form2
If f2.ShowDialog(Me) = DialogResult.OK Then
'f2側から変更しているので不要
'TextBox1.Text = f2.TextBox2.Text
'TextBox1.BackColor = System.Drawing.Color.Red
End If
f2.Dispose()
End Sub
'--- Form2.vb ---
Imports SharedForm.Class1
Public Class Form2
(中略)
Private Sub Form2_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Me.Left = f1.Left + f1.Width
Me.Top = f1.Top
TextBox1.Text = f1.TextBox2.Text
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
f1.TextBox1.Text = TextBox2.Text
f1.TextBox1.BackColor = System.Drawing.Color.Red
Me.Close()
End Sub
End Class

![]() | Visual Basic.NET基礎300の技 ガリバー ![]() ![]() ![]() ![]() ![]() by G-Tools |
この問題を解こうと何時間費やしたか
分かりません。
本当にどうもありがとうございました。
オブジェクトにしてクラスに取り込まないと、連携がとれないということですね。このクラスをスタートアップにすることで、このクラスがオブジェクトになるから、クラスメンバがSharedでない場合、結局は、オブジェクトにしてオブジェクト間しか連携をとるしかない。クラス自体はSharedにできないが、他のクラスのメンバにすればその際にSharedにでき、その単一オブジェクトらしきものをいろんなオブジェクトからアクセスできる。
上記記事で、Form1をスタートアップにすると、それは1つのオブジェクトになり、Shared宣言したオブジェクトとは異なる。「らしきもの」とは、Shared宣言したオブジェクト以外にもオブジェクトを生成できるという意味です。
奥が深いですね。
form のクラス名.コントロール名
という記述ができてしまうのが、おかしいですよね。
まるで、form がはじめから shared 宣言されてるように見えます。
>まるで、form がはじめから shared 宣言されてるように見えます。
↓ 訂正
まるで、コントロールがはじめから shared 宣言されてるように見えます。
コントロール類は、Friend WithEvent 宣言されていて、Shared などはついていないのに。
なぜ、クラス名.コントロール名というコードが文法エラーにならず、コードインテリセンスで書けてしまうのでしょうね。