[.NET]モジュールからフォームを参照する


tm  2005-02-11 03:57:31  No: 119550

モジュールで
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の部分を引数としてわたすにはどうしたらよいでしょうか?


じゃんぬねっと  URL  2005-02-11 04:26:53  No: 119551

あまりよろしくない仕様ですね。
まあ、それはそれとして...

Public な変数を持っているのですから、その変数を使うだけですよね。

> F1 = Me   

なことをする必要はなく、エントリ ポイントでインスタンス化して、
唯一の変数を使えば良いだけの話ではないのでしょうか?

# エントリポイントから起動せず、Form1 から直接起動してるような気がしたもので...


ねろ  2005-02-11 05:06:15  No: 119552

>フォームから
>Call HogeHoge(Me)
>のようにしてモジュールからF1の部分を引数としてわたすにはどうしたらよいでしょうか?

この意味がどうしてもわかりません。
『F1の部分』とは?
どちらからどちらへ?
>Public F1 As Form1    
>Public F2 As Form2
となっているので、Form2からForm1を、Form1からForm2を参照したいのでは?


tm  2005-02-11 06:21:27  No: 119553

わかりにくくて申し訳ございません。

フォームが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 = ""

のようにしたいと思っています。

ということです。よろしくお願いします。


ねろ  2005-02-11 07:18:53  No: 119554

基本的なことですが
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"
などと参照できます。

多分いいと思いますが、眠くて頭が回りません、
なんか変なことを書いているかな。
と言いながら投稿してしまう。。。。


tm  2005-02-11 14:51:57  No: 119555

丁寧な説明ありがとうございます。

もう一歩なんですがやりたいことは

最初に処理対象を変数に入れて
その後の処理は共通のコードを使うという感じです。
そこがうまくいきません。


ねろ  2005-02-11 23:42:48  No: 119556

このようなことですかね。
'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


TT  2005-02-12 10:55:54  No: 119557

モジュール
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を引数で渡す

ってことでしょうか


TT  2005-02-12 11:25:16  No: 119558

あ、これ(↑)できるわけないし…。すみません忘れてください。


特攻隊長まるるう  2005-02-12 11:46:55  No: 119559

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 を利用するとか、それなりの
実力を必要とします。

テキストボックスの初期化のみなら、テキストボックスを引数に渡せば
共通関数で処理できます。もう一度仕様を検討すべきかと思います。
…勉強のため、こういった仕様を実現させたいのであれば、上であげた
キーワードについて知識を付けてきて頂くことをお勧めします。


特攻隊長まるるう  2005-02-12 12:17:19  No: 119560

ごめんタイトルに書いてあった(ー人ー)
>開発環境を明記して下さい。


ねろ  2005-02-12 21:00:38  No: 119561

ウーンと
>>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)
こうかな。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加