tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 複数のフォーム
投稿日: 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" )
のままで良いことになりますので、仕様変更に強いコードになります。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。