タイトル | : Re: 複数のフォーム |
記事No | : 12149 |
投稿日 | : 2024/08/23(Fri) 01:15 |
投稿者 | : 魔界の仮面弁士 |
> 現状はフォーム1をロードする時にフォーム2を起動しています。 > dim frm2 As New Form2() > frm2.Show()
「New」は、新しくオブジェクトを作成するためのものです。 そして上記の場合、その生成されたインスタンスは、変数 frm2 によって保持されています。
たとえば、 Dim a As Form2 Dim b As Form2 a = New Form2() b = New Form2() a.Show() b.Show() のようにすると、「New」によって生成された 2 つの Form2 が同時に表示されることになります。
Form2 のタイトルを変更しようとした場合、どちらの Form2 インスタンスを操作したいのかを 指示しなければなりません。今回の場合、それらは変数 a, b に保持されていますので、 a.Text = "画面1" b.Text = "画面2" のようにして指定できます。
つまりモジュールから操作するときも、「フォームのインスタンス変数」を渡して操作させれば良いということです。
フォーム変数は、As Form や As Form2 といった型の引数や変数を通じて Module に渡しておきましょう。
Module Module1 Public Sub Test(f As Form2) f.TextBox1.Text = Now.ToString("HH:mm:ss") f.BackColor = Color.Yellow End Sub End Module
Class Form1 Private Sub Button1_Click(sender As Object, e AS EventArgs) Handles Button1.Click Dim o As New Form2() Test(o) o.Show() End Sub End Class
Class Form2 Private Sub Button1_Click(sender As Object, e AS EventArgs) Handles Button1.Click Test(Me) End Sub End Class
あるいは、My.Forms による「暗黙のフォームオブジェクト」を使う受け渡し方法もあります。 インスタンスを同時に複数 New する必要が無いのであれば、Module レベルの変数や Shared メンバーに そのインスタンスを渡しておくといった手法もあります。下記も参照してみてください。 https://dobon.net/vb/dotnet/form/accessanotherformdata.html
> モジュール内で、フォーム2のテキストへデータを貼り付けしたいのですができない状況です。 > (フォーム1へは貼り付けできる)
VB の場合、TextBox 等の Modifiers プロパティの既定値が Friend になっているので、 同一プロジェクト内であれば、フォーム変数のフィールド変数を通じて a.TextBox1.Text = "新しい文字列1" b.TextBox1.Text = "新しい文字列1" というように、フォーム上のコントロールを直接読み書きできます。 先述の通り、対象のフォームインスタンス(上記の a, b)を明示する必要はありますけれどね。
ちなみに C# の場合は、Modifiers プロパティの既定値が private なので、上記のように 自フォーム以外から直接操作するようなことはできません。 (Modifiers を書き換えれば、VB と同じように操作できますが)
とはいえそもそも自フォーム以外から上記のようにコントロールを直接読み書きするのは あまり良いコードとは言えません。「Form 上のコントロール」を操作して良いのは、本来は そのフォーム自身だけです。(オブジェクト指向における「カプセル化」の概念)
たとえば Form2 上に「自身の TextBox へ文字列をセットするためのメソッドあるいはプロパティ」を Public Sub Example(newText As String) Me.TextBox1.Text = newText End Sub などと用意しておき、外部からはそれを呼び出すようにしてみます。 ' a.TextBox1.Text = "xyz" a.Example( "xyz" )
このようにしておくと、今後、Form2 側で画面仕様の変更が生じた場合も、 Public Sub Example(newText As String) If Me.RadioButton1.Chekced Then Me.TextBox1.Text = newText Else Me.Label1.Text = newText End If End Sub などのように処理をまとめられます。こうしておくと、呼び出し側のコードは修正する必要が無く、 a.Example( "xyz" ) のままで良いことになりますので、仕様変更に強いコードになります。
|