2つのフォーム間での値のやり取りをするには?

解決


むらちゃん  2004-07-15 01:13:54  No: 114781  IP: [192.*.*.*]

MainFormとSubFormがあります。

MainFormのテキストボックスのテキストなどの値を
SubFormで参照することはできるのですが
定義した変数を参照することができません。

またMainformでSubFormの変数やプロパティの値を
使うことができません。

なぜだかよくわかりません。
グローバル変数とかの問題でしょうか?
もしそうならば  どこでグローバル変数を
定義すればいいのでしょうか?


Main側
Dim wkMain1 As Integerで定義
TextBoxMain1:MainFormにあるテキストボックス

Sub側
TextBoxSub1.Text = FormMain.TextBoxMain1.Text   'これはOK
TextBoxSub2.Text = FormMain.wkMain1  'これがコンパイル通りません

逆に

Sub側
Dim wkSub1 As Integerで定義
TextBoxSub1:SubFormにあるテキストボックス

Main側
TextBoxMain1.Text = FormSub.TextBoxSub1.Text   'これもだめ
TextBoxMain2.Text = FormSub.wkSub1  'これもだめ

編集    削除
ken  2004-07-15 01:23:30  No: 114782  IP: [192.*.*.*]

別フォーム間の値の受け渡しをする変数は
DimでなくPublicで宣言してみてください。

編集    削除
nanashi  2004-07-15 01:59:20  No: 114783  IP: [192.*.*.*]

ところでVBのバージョンは?

編集    削除
特攻隊長まるるう  2004-07-15 02:09:54  No: 114784  IP: [192.*.*.*]

同様の質問が過去ログにたくさんあります。
(検索キーワードは『別フォーム』など)
合わせてご覧下さい。

編集    削除
マグ  2004-07-15 20:03:04  No: 114785  IP: [192.*.*.*]

むらちゃんさんが使っているバージョンって
もしかして、VB.NET系
TextBoxSub1.Textの構文の後の.Textは確かVB6にはなかったような気が

編集    削除
むらちゃん  2004-07-15 21:19:39  No: 114786  IP: [192.*.*.*]

VB.NETです。
MicrosoftDevelopmentEnvironment2003 Version7.1.3091
Microsoft  .Net Framework 1.1  Version 1.1.4332
です。

最近VB.netを覚えはじめました。
C++をやっていたのですが
まだまだVB.netがわかりません。

まずは過去ログを調べてみます。

編集    削除
nanashi  2004-07-15 23:18:42  No: 114787  IP: [192.*.*.*]

> TextBoxSub1.Textの構文の後の.Textは確かVB6にはなかったような気が

あるよ。
それはあなたが省略してただけでしょ。


>むらちゃんさん

スコープの問題ですね。
まずはフォームの宣言自体を標準モジュールでPublicでするとイイと思います。

編集    削除
マグ  2004-07-16 00:04:14  No: 114788  IP: [192.*.*.*]

VB6にも存在したんですか?
たしかCaptionだったような気がしたんですが、
違いますか?(VB6はさわり程度しかやっていないので詳しくはわからないんです。)

編集    削除
Dental  2004-07-16 00:58:21  No: 114789  IP: [192.*.*.*]

> VB6にも存在したんですか?
します。

> たしかCaptionだったような気がしたんですが、
それは、FormとかLabelの場合でしょう。
今回は、TextBoxです。

> 違いますか?(VB6はさわり程度しかやっていないので詳しくはわからないんです。)
違います。
# 正しい情報を、間違った情報で訂正されてしまったのでは、混乱の元です。

編集    削除
むらちゃん  2004-07-16 01:27:51  No: 114790  IP: [192.*.*.*]

C++には  Label1.Captionとかあるけど
VBには  Label1.Textなんですよね・・・?

他の人のコメントがよくわからなくなったので改めて質問します。


☆MainForm側

Public aaa As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    aaa = 777
    Label1.Text = aaa
End Sub

Private Sub btnTest1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest1.Click
    Dim frm2 As New Form2
    frm2.Show()
End Sub



☆SubForm側

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    LabelSub1.Text = Form1.Label1.Text
End Sub



SubForm上のLabelSub1.Textに表示させたいのですが
コンパイルが通りません

コンパイルエラーになるのは
    LabelSub1.Text = Form1.Label1.Text
のForm1.Label1のところです

このようにしてみたのですが
ソース上でなにか間違いがあるのでしょうか?

編集    削除
ねろ  2004-07-16 02:26:59  No: 114791  IP: [192.*.*.*]

かなり混乱してる様ですね。
Form1はクラスであって、インスタンスではないので参照できませんよ。
http://www.geocities.co.jp/SiliconValley-SanJose/8756/vbnet.html
の2番目に書いておいたので見てください。

編集    削除
旅禍  2004-07-16 10:11:32  No: 114792  IP: [192.*.*.*]

> C++には  Label1.Captionとかあるけど
> VBには  Label1.Textなんですよね・・・?
VB.NETのLabelの場合は、Textプロパティ、
VB6以下のLabelでは、Captionプロパティです。
TextBoxに関しては、VB.NETもVB6も、Textプロパティです。

> 他の人のコメントがよくわからなくなったので
むらちゃんさんの最初の質問から、話題が脱線して、
「VB6のTextBoxの話」になっている部分がありますね。

VB6の話題になってしまっている部分:
------------------------
マグさん (2004/07/15 11:03:04)
> TextBoxSub1.Textの構文の後の.Textは確かVB6にはなかったような気が

nanashiさん (2004/07/15 14:18:42)
> あるよ。
> それはあなたが省略してただけでしょ。

マグさん (2004/07/15 15:04:14)
> VB6にも存在したんですか?
> たしかCaptionだったような気がしたんですが、

Dentalさん (2004/07/15 15:58:21)
> それは、FormとかLabelの場合でしょう。
> 今回は、TextBoxです。
------------------------


むらちゃんさんの最初の質問に対する回答部分:
------------------------
kenさん (2004/07/14 16:23:30)
> 別フォーム間の値の受け渡しをする変数は
> DimでなくPublicで宣言してみてください。

特攻隊長まるるうさん (2004/07/14 17:09:54)
> 同様の質問が過去ログにたくさんあります。
> (検索キーワードは『別フォーム』など)
> 合わせてご覧下さい。

nanashiさん (2004/07/15 14:18:42)
> スコープの問題ですね。
> まずはフォームの宣言自体を標準モジュールでPublicでするとイイと思います。

ねろさん (2004/07/15 17:26:59)
> Form1はクラスであって、インスタンスではないので参照できませんよ。
> http://www.geocities.co.jp/SiliconValley-SanJose/8756/vbnet.html
> の2番目に書いておいたので見てください。
------------------------

編集    削除
むらちゃん  2004-07-16 23:29:41  No: 114793  IP: [192.*.*.*]

☆MainForm側

Module Module1
    Public F1 As Form1
End Module

Public aaa As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    aaa = 777
    Label1.Text = aaa
End Sub

Private Sub btnTest1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest1.Click
    Dim frm2 As New Form2
    frm2.Show()
End Sub



☆SubForm側

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    LabelSub1.Text = Form1.Label1.Text
End Sub



このようにしたら
コンパイルもとおり
やりたかったことができました。
Labelなどでも同じようにできるみたいです。
ありがとうございました

編集    削除
むらちゃん  2004-07-16 23:30:01  No: 114794  IP: [192.*.*.*]

完了し忘れました汗

編集    削除
マグ  2004-07-18 05:04:39  No: 114795  IP: [192.*.*.*]

上のソースでコントロールを使わずにそのままフォーム間でデータの受け渡しをするにはどうしたらいいでしょうか?

例えば)

Form1の

Private a as String="あいうえお"

のデータを

Form2に送るにはどうすればいいでしょうか?

環境はVB.NETです。

編集    削除
Garura  2004-07-18 05:59:13  No: 114796  IP: [192.*.*.*]

> マグ
> 上のソースでコントロールを使わずにそのままフォーム間でデータの受け渡しをするにはどうしたらいいでしょうか?

Private a as String = "あいうえお"  の場合、そのフォームないでしか変数が使えません!!
この場合、Private ではなくて、Public で宣言したらどうでしょうか?

'(General) (Declarations)
Public a As String

Private Sub Form1_Load()
    a = "あいうえお"
    Form2.Show
End Sub

Private Sub Form2_Load()
    Dim b as String
    b = a
    'こうすれば、bは "あいうえお" となると思いますが。
End Sub

編集    削除
GS  2004-07-19 09:41:43  No: 114797  IP: [192.*.*.*]

こういうやり方もあります。

Public Class Form1

  Private _a As String = "あいうえお"

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  End Sub

    Public Property a() As String
        Get
            Return _a
        End Get
        Set(ByVal Value As String)
            _a = Value
        End Set
    End Property

End Class

編集    削除
マグ  2004-07-21 01:46:33  No: 114798  IP: [192.*.*.*]

ありがとうございます。

編集    削除