-PR-

解決済みの質問

質問No.1826494
困ってます
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数4
閲覧数12376
クラス間(Form間?)で使える変数の設定方法(VB.NET)
VB.net(Visual Studio)で現在プログラムの勉強をしています。
現在のスキルとしまして、変数,引数,グローバル変数,サブルーチン等を勉強しました。
残念ながら、他のプログラム言語等は勉強した事がありません。

<目的>
現在1つのアプリケーション内でForm1,Form2,Form3と作り
Form1のText.Boxに入力された値を変数としてボタンを押すと各Formのラベルに
変数を渡し表示させたいと考えております。

<問題点>
しかしプログラムを作っても波下線が出てプログラムのデバックが開始できません。
おそらくどこかがおかしいと思うのですが判りません。

<質問内容>
下記のサンプルの中でおかしいコードや根本からやり直す必要なコードがあれば
ご教授願えますでしょうか?

<サンプル>
-----Form1------
Public Class Form1
Public TextBox1noNakami as strig
Private Sub Button1_click(Byval sender As System.Object,Byval e AS System.EventArgs) Handles Button1_click

TextBox1noNakami = TextBox1.text
Form2.show()
Form3.show()


End Sub
End Class

-----Form2-----
Public Class Form2
Public TextBox1noNakami as Form1

Private Sub Form2_Losd(Byval sender As System.Object,Byval e AS System.EventArgs) Handles MyBase.Load
label1.text = TextBox1noNakami
End Sub
End Class


-----Form3-----

Public Class Form3
Public TextBox1noNakami as Form1

Private Sub Form3_Losd(Byval sender As System.Object,Byval e AS System.EventArgs) Handles MyBase.Load
label2.text = TextBox1noNakami
End Sub
End Class
投稿日時 - 2005-12-08 09:49:05

質問者が選んだベストアンサー

回答No.4
VB2005? という事はVisualBasic2005のBetaでも使ってるって事かなぁ?

まず、VBとななんぞやをおさらいしましょう。
VB6.0 1998年 最後の「VB」。私があなたのプログラムから受けた印象はこちら。
VB.NET1.0 2002年 最初の「VB.NET」。ここで大幅に言語仕様というか言語そのものが変わった。
VB.NET1.1 2003年
VB.NET2.0 2005年 これがおそらくあなたが使っているものだ。

> これはVisualBasic的な記述では駄目なのでしょうか?
 年鑑から分かるように、あなたが使っているのはVB.NET2.0で、それに対してVB6.0的な書き方をしているのがまずいわけだ。名前が似ているのが悪いのだが、今後はVB.NET的な書き方をしてあげましょう。

 試してないのであれなのだが、改訂版1って・・・・動く? エラーは出ないと思うのだが、何からも参照されていないインスタンスは危険よ。

 どういう事かというと、
・f2っていう変数があって、Form2のインスタンスAを参照しているよね。
・f2っていう変数は、Private Sub Button1_clickが終了したら消えるよね。
→インスタンスAを参照する変数が無くなる(危険!)

 これは、「インスタンスが作成されるのはNewされた時だが、破棄されるタイミングは分からない(決定できない)」という事に起因する問題だ。

<改訂版2> Form2のみ
-----Form1------
Public Class Form1
Private f2 As Form2 = Nothing ' クラス変数にする事で、Form1が動いている間は変数が消えない
Private Sub Button1_click(Byval sender As System.Object,Byval e AS System.EventArgs) Handles Button1_click
  If Not f2 Is Nothing Then   ' あれば閉じる
    f2.close        ' 実際使う時はTryで囲むべし
  End If
  f2 = New Form2
  f2.Label1.Text = TextBox1.Text
  f2.Show()
End Sub
End Class

-----Form2-----
Public Class Form2
End Class
投稿日時 - 2005-12-11 15:12:10
この回答を支持する
(現在0人が支持しています)
補足
またまたの解答ありがとうございます。
また補足が遅くなり申し訳ございません。
>VB2005?という事はVisualBasic2005のBetaでも使ってるって事かなぁ?

はい、本に付録で付いていたDVDを使ってインストールしました。

VBに関する年鑑は非常にありがたいです。どの本をみても結構VB6からの変更点は....と書いてあり、VB.netとの違いが今ひとつ判っておりませんでした。

>改訂版1って・・・・動く?

はい、今のところ[Hello World!]や[スロットマシーン](Rndをつかう奴)
[電卓]等は作れました、正常に動くかどうかは人に見てもらっていないので判りませんが....

>エラーは出ないと思うのだが、何からも参照されていないインスタンスは危険よ。
上記の教えて頂いた事を今から実行してみます。
今のままでは???な感じですが、ひとつひとつ勉強して行こうと思います。

ありがとうございました。
投稿日時 - 2005-12-12 09:03:50
お礼
今回の回答は本当に勉強になりました、私のつたない質問に
ご丁寧に教えて頂き、ありがとうございました。
投稿日時 - 2005-12-26 08:53:04

ベストアンサー以外の回答 (3)

回答No.3
>私なりのコメント
別におかしくないですよ。
ただ、注意すべき点としては、
(#1の方も指摘されている様に)
変数の(f2とかf3の)寿命ということですね。
それをプログラム上どうするかということを考えておかねばなりません
(どうするかについては、質問文のプログラムからは、なんとも言えません)
投稿日時 - 2005-12-08 18:59:19
この回答を支持する
(現在0人が支持しています)
補足
>ただ、注意すべき点としては、
>(#1の方も指摘されている様に)
>変数の(f2とかf3の)寿命ということですね

解答ありがとうございます。補足が遅くなり申し訳ございません。

まずはForm間での値を渡す事をしたかったので寿命?の事は考えていませんでした。
この寿命という言葉もいろんな所で書かれていますが、
要するに変数に覚えこました情報が消える(無効になる?)までってことですよね。
投稿日時 - 2005-12-12 09:02:30
お礼
教えて頂いた変数の寿命について現在勉強中です。
ご解答ありがとうございました。
投稿日時 - 2005-12-26 08:51:31
回答No.2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim f As Form2 = New Form2
f.Label1.Text = TextBox1.Text
f.Show()
End Sub
'で、Form2のラベルに、TextBox1の内容をセットして表示できるけど…
投稿日時 - 2005-12-08 15:41:03
この回答を支持する
(現在0人が支持しています)
補足
回答して頂きまして、まことにありがとうございます。
教えて頂いたのを少しいじりましたがサックっと作れてしまいました。
下記に私なりのコメントを付けましたので、おかしい解釈をしていれば
お時間のある時で結構ですので教えてください。

<改訂版1>
-----Form1------
Public Class Form1
Public TextBox1noNakami as strig
Private Sub Button1_click(Byval sender As System.Object,Byval e AS System.EventArgs) Handles Button1_click

Dim f2 As Form2 = New Form2   '[変数]f2はForm2の事(Form2はNEWで新たに作成!)
  f2.Label1.Text = TextBox1.Text ’Form1のTextBox1.Textの値をf2.Label1.Text(Form2)に渡す。
  f2.Show()            ’f2(Form2)をshow(画面に出す)
End Sub

  Dim f3 As Form3 = New Form3   '[変数]f3はForm3の事(Form3はNEWで新たに作成!)
  f3.Label1.Text = TextBox1.Text ’Form1のTextBox1.Textの値をf3.Label1.Text(Form3)に渡す。
  f3.Show()            ’f3(Form3)をshow(画面に出す)
 End Sub

End Class

-----Form2-----
Public Class Form2
End Class

-----Form3-----
Public Class Form3
End Class
投稿日時 - 2005-12-08 16:45:02
回答No.1
 申し訳ないが余りにもつっこみどころ満載で何をどうしようとかそんなレベルではない。当方もVB.NET暦1ヶ月ほどなので、的外れな添削があればご勘弁。

> Public Class Form1
> Public TextBox1noNakami as strig
> Private Sub Button1_click(Byval sender As System.Object,Byval e AS System.EventArgs) Handles Button1_click
>
> TextBox1noNakami = TextBox1.text
> Form2.show()
↑VBと違い、VB.NETではこの書き方はできない。詳細は後述。
> Form3.show()
↑同上
>
> End Sub
> End Class
>
> -----Form2-----
> Public Class Form2
> Public TextBox1noNakami as Form1
↑意味不明。これではTextBox1noNakamiはForm1クラスのインスタンスになる。
>
> Private Sub Form2_Losd(Byval sender As System.Object,Byval e AS System.EventArgs) Handles MyBase.Load
> label1.text = TextBox1noNakami
label1.text(string)に対して TextBox1noNakami(Form1)は型がぜんぜん違うので代入できない。しかもTextBox1noNakamiは今Nothingだ。
> End Sub
> End Class
>
> -----Form3-----
Form2と同じ。

 他の言語はやった事ないという事だが、余りにもVisualBasic的な記述ばかりだ。特にForm2.Show。VB6でForm2.Showが可能なのは、裏でVBが
Global Form2 As New Form2
という、フォーム名と同名のインスタンスを作成するからだ。これを暗黙のインスタンスと言う。VB.NETでは、この機能は撤廃されている。

 さて、修正案だが・・・・
案1(Form間に親子関係が無い場合):アプリケーショングローバルな変数を確保する。VB6でいう標準モジュールのPublic変数。→Public Module Common Public TextBox1noNakami As String End Module
案2(完全VB6ライク):→Public Module Common Public Form1 As New Form1 ... End Module
案3(Form間に親子関係):→簡潔に説明できないので割愛

 とにかくもう少し基本からやりましょう。先にオブジェクト指向プログラミングとは何ぞやをやらないと今のままでは難しいです。
投稿日時 - 2005-12-08 15:16:03
この回答を支持する
(現在0人が支持しています)
補足
>他の言語はやった事ないという事だが、余りにもVisualBasic的な記述ばかりだ。
>特にForm2.Show。VB6でForm2.Showが可能なのは、裏でVBがGlobal Form2 As New Form2という、
>フォーム名と同名のインスタンスを作成するからだ。
>これを暗黙のインスタンスと言う。
>VB.NETでは、この機能は撤廃されている。

書き忘れましたが、私のいま使っているアプリケーションは
-----------------------------------------
Microsoft Visual Basic 2005
Visual Basic -> Windwsアプリケーション
------------------------------------------
です。
これはVisualBasic的な記述では駄目なのでしょうか?

>さて、修正案だが・・・・
>案1(Form間に親子関係が無い場合):アプリケーショングローバルな変数を確保する。

申し訳ございませんが親子関係の意味が判りかねます。
私のイメージで言いますとアプリケーションを立ち上げるとForm1が立ち上がり
Form1内にあるボタンを押すとForm2とForm3が立ち上がり、
Form1のTextBoxに入力された数値を変数化しForm2とForm3に渡し表示させたいです。

>VB6でいう標準モジュールのPublic変数。→Public Module Common Public TextBox1noNakami As String End Module
>案2(完全VB6ライク):→Public Module Common Public Form1 As New Form1 ... End Module
>案3(Form間に親子関係):→簡潔に説明できないので割愛

>とにかくもう少し基本からやりましょう。
>先にオブジェクト指向プログラミングとは何ぞやをやらないと今のままでは難しいです。

基本的に独学なので、基本がどれで、今私は応用編をやっている等
まったく判っていません。
本をみてもHPをみてもオブジェクト指向については抽象的な事しか書かれていない事が多く
まずはできる事からやろうと思っています。

もしプログラムの基礎やオブジェクト指向に関する良い本やHPがあれば教えてください。
解答ありがとうございました。
投稿日時 - 2005-12-08 17:06:45
この質問は役に立ちましたか?
2人が「このQ&Aが役に立った」と投票しています
もっと聞いてみる

関連するQ&A

この他の関連するQ&Aをキーワードで探す

回答募集中

同じカテゴリの人気Q&Aランキング

カテゴリ
Visual Basic
-PR-
-PR-

特集

背筋がゾクゾクする心霊体験を要チェック!

お城、ボート、ツリーハウス、ユニークな物件満載!

【期間限定】1ヶ月無料キャンペーン中!

このQ&Aの関連キーワード

同じカテゴリの人気Q&Aランキング

カテゴリ
Visual Basic
-PR-

回答のついた最新のQ&A

カテゴリ
Visual Basic

rss

x001

x-1919

tk_hero

Q_icon作成日の挿入2014-07-29 15:36:14

ピックアップ

-PR-