モジュールで
Public F1 As Form1
Public F2 As Form2
のようにグローバルで宣言しておいて
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim n As Short
F1 = Me
のようにしておけば
モジュール内で
F1.TextBox1.Text = ""
のようにすることはできますが
フォームから
Call HogeHoge(Me)
のようにしてモジュールからF1の部分を引数としてわたすにはどうしたらよいでしょうか?
あまりよろしくない仕様ですね。
まあ、それはそれとして...
Public な変数を持っているのですから、その変数を使うだけですよね。
> F1 = Me
なことをする必要はなく、エントリ ポイントでインスタンス化して、
唯一の変数を使えば良いだけの話ではないのでしょうか?
# エントリポイントから起動せず、Form1 から直接起動してるような気がしたもので...
>フォームから
>Call HogeHoge(Me)
>のようにしてモジュールからF1の部分を引数としてわたすにはどうしたらよいでしょうか?
この意味がどうしてもわかりません。
『F1の部分』とは?
どちらからどちらへ?
>Public F1 As Form1
>Public F2 As Form2
となっているので、Form2からForm1を、Form1からForm2を参照したいのでは?
わかりにくくて申し訳ございません。
フォームが2つあり、同じ名前のテキストボックスがあります。
開いているほうのフォームからモジュールを呼び出して処理をする。
その際にどのフォームなのかという引数をモジュールに渡して
1つのコードで処理を行いたい。
case 1
form1.TextBox1.text = ""
form1.TextBox2.text = ""
case 2
form2.TextBox1.text = ""
form2.TextBox2.text = ""というコードを
xxx=form1 または x=フォームのIDなど?
xxx.TextBox1.text = "" または form(x).TextBox1.text=""
xxx.TextBox2.text = ""
のようにしたいと思っています。
ということです。よろしくお願いします。
基本的なことですが
Form1,Form2は共にクラス名でインスタンスではありません。
従って
Form1.TextBox1.text = ""
Form1.TextBox2.text = ""
は出来ません。
" Windows フォーム デザイナで生成されたコード "
の中の
MyBase.New()
でForm1のインスタンスが作られています。
インスタンスの名前はMeです。
Form2のインスタンスはForm1の中で作ります。
Module Module1
Public F1 As Form1 'F1をグローバルに宣言します。
Public F2 As Form2 'F2をグローバルに宣言します。
End Module
Dim F2 As New Form2
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
F1 = Me 'Form1のインスタンスをF1に設定
F2.Show()
End Sub
これで
Form1からForm2のTextBox1は
F2.TextBox1.Text = "hoge2"
Form2からForm1のTextBox1は
F1.TextBox1.Text = "hoge1"
などと参照できます。
多分いいと思いますが、眠くて頭が回りません、
なんか変なことを書いているかな。
と言いながら投稿してしまう。。。。
丁寧な説明ありがとうございます。
もう一歩なんですがやりたいことは
最初に処理対象を変数に入れて
その後の処理は共通のコードを使うという感じです。
そこがうまくいきません。
このようなことですかね。
'Form1側
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
Dim F2 As New Form2
F2.Show()
F2.SetForm1(Me)
End Sub
'Form2側
Friend Sub SetForm1(ByVal F1 As Form1)
F1.TextBox1.Text = "hogehoge"
End Sub
モジュール
Module Module1
Public F1 As Form1
Public F2 As Form2
Public Sub TextClear(ByVal form As Form)
form.TextBox1.Text = ""
form.TextBox2.Text = ""
End Sub
End Module
Form1内での呼び出し
Call TextClear(Me) 'F1を引数で渡す
Call TextClear(F2) 'F2を引数で渡す
ってことでしょうか
あ、これ(↑)できるわけないし…。すみません忘れてください。
Handles 句が使用されているので[VB.NET]として判断します。今後、質問時は
開発環境を明記して下さい。
過去に似たような質問に答えた事がありますが、
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200408/04080006.txt
クラスについて考えて下さい。Form クラスは[VB.NET]が用意したフォームに関する
基本的な機能(メソッドやプロパティ)を含み、Base クラスと呼ばれます。これに対し、
Form1, Form2 は Form クラスを継承した全く別のクラスです。これはユーザが
フォームを追加した時に自動で作られます。この関係は Form クラスが親で、Form1,
Form2 クラスが子といったイメージです。これが意味する所は、質問の処理が
例えば『コンボボックスとテキストボックスを同じ引数で渡して、同じコードで
処理したい』といった内容と同レベルの難易度です。
基本的に、同じ変数に入れて処理できるのは同じ種類(クラス)の処理のみです。
リンク先の
>特攻隊長まるるう 2004/08/04(水) 12:00:47
で書いている通り、Form1.TextBox1.Text と Form2.TextBox1.Text は名前が
同じだけで全く別の存在だという事を認識して下さい。
これを実現するには、TextBox1 を標準装備した Base クラスを用意して
それを Form1, Form2 で継承するとか、Interface を利用するとか、それなりの
実力を必要とします。
テキストボックスの初期化のみなら、テキストボックスを引数に渡せば
共通関数で処理できます。もう一度仕様を検討すべきかと思います。
…勉強のため、こういった仕様を実現させたいのであれば、上であげた
キーワードについて知識を付けてきて頂くことをお勧めします。
ごめんタイトルに書いてあった(ー人ー)
>開発環境を明記して下さい。
ウーンと
>>TTさんの例は
Module Module1
Public Sub TextClear(ByVal F As Object)
Dim F1 As Form1
Dim F2 As Form2
If TypeOf (F) Is Form1 Then
F1 = DirectCast(F, Form1)
F1.TextBox1.Text = ""
ElseIf TypeOf (F) Is Form2 Then
F2 = DirectCast(F, Form2)
F2.TextBox1.Text = ""
End If
End Sub
End Module
TextClear(Me)
こうかな。
ツイート | ![]() |