新しいフォームにテキストボックスの内容を表示させたい

タグの編集
投稿者 penetrater  (学生) 投稿日時 2008/11/25 22:19:11
初めて質問させていただきます。

メインのForm1があり、TextBoxにテキストを入力させて「実行」を押すと新しいフォームForm2が表示され、そのTextBoxにはForm1で入力させたものと同じ物を表示させたいのです。

Form2のほうに
Me.TextBox1.Text = Form1.TextBox1.Text
と書いてもうまくいきません。


どうぞよろしくお願いします。
投稿者   (社会人) 投稿日時 2008/11/25 22:30:11
Form2からForm1のTextBoxを参照するのではなく、Form2にForm1のTextBoxの値を渡すようにする。
投稿者 penetrater  (学生) 投稿日時 2008/11/25 22:38:55
同じく、Form1に

Form2.TextBox1.Text = Me.TextBox1.Text

とやってもうまくいきませんでした。。。
投稿者   (社会人) 投稿日時 2008/11/25 22:54:08
うーん、ちゃんと伝えると長くなるんだけど・・・。
あるフォームから別フォームのコントロール(今回はTextBox)を触るのはあまり良くないんだよね。

http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard29.htm
このページの3,4あたりを参考にしてみて。
投稿者 にぃや♪  () 投稿日時 2008/11/25 23:20:36
入門者の、にぃや♪といいます。
そこの部分は、結構、難しいですよね。
入門者同士ですので、よろしく。
Option Strict On
'VisualBasic2008 
Public Class Form1
    Public Text_kakikomi As String
    
    Private Sub TextBox1_KeyDown(ByVal sender As ObjectByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            text_kakikomi = TextBox1.Text
            Me.Visible = False
            Form2.Show()
        End If
    End Sub
End Class

Option Strict On
'コメント______VisualBasic2008 
Public Class Form2
    Private text_kakikomi As String

    Private Sub Form2_FormClosing(ByVal sender As ObjectByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Form1.Visible = True
    End Sub

    Private Sub Form2_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
        text_kakikomi = Form1.Text_kakikomi
        TextBox1.Text = text_kakikomi
    End Sub
End Class

投稿者 penetrater  (学生) 投稿日時 2008/11/25 23:54:40
無事完成できました。ありがとうございました!
投稿者 たろ  (社会人) 投稿日時 2008/11/26 02:05:29
>無事完成できました。ありがとうございました! 
どう解決したのかがヒジョーに気になります。
にぃや♪さんのコードをコピったりはしてないですよね…?
投稿者 リスナー  (学生) 投稿日時 2008/11/26 02:40:14
はじめましてpenetraterさん。そして皆さん。
ここで質問に回答する立場になるのは初めてです。
ちょっと嬉しいような、まだまだな自分が答え良いのか恥ずかしいような。
なにぶん初級講座を気になるところだけ辞書的に使うようなやり方な私でして……。


>>メインのForm1があり、TextBoxにテキストを入力させて「実行」を押すと新しいフォームForm2が表示され、そのTextBoxにはForm1で入力させたものと同じ物を表示させたいのです。
Form2のほうに
Me.TextBox1.Text = Form1.TextBox1.Text
と書いてもうまくいきません。


私も実際に試してみましたが、そう難しく考えず、単純な話なのではないでしょうか。
仕様としては1枚目のフォームのテキストボックスに入力した内容を、ボタンを押すことで、
2枚目のフォームが開き、そこのテキストボックス内に反映されている、という理解でよいでしょうか。


だとするならば、1枚目のボタンクリックイベントで、

 Form2.Show()


と入力し、2枚目を開かせます。そして2枚目のフォームロードイベントで、

TextBox1.Text = Form1.TextBox1.Text

と、記述することでお求めの仕様になるのではないでしょうか。


私は「Me」というとcloseぐらいしか思いつかないからか、
フォーム2枚目であえて「Me」を使うロジックが浮かびませんでしたねえ。(汗ふきふき)

変数を設定しての方法はまだ試していませんが同じ要領でできるのではないでしょうか。

他の方のレスをチラと見たところコツのいるコーディングのようで、
私のやり方が正統でないのでしたら、これは受け流してください。
私も後日またこのイベント作法については調べてみたいと思いますが。

では。とりあえず。
投稿者   (社会人) 投稿日時 2008/11/26 10:12:19
nさんも書かれているように、他フォームのコントロールを直接参照するのは好まれなかったりします。
それと、子が親を(この場合はForm2がForm1を)見に行く実装は冗長性に欠けるので、これまた好まれなかったりします。
(あ、これも最初にnさんが書いてますねorz)

ちなみに
リスナーさんの
>と入力し、2枚目を開かせます。そして2枚目のフォームロードイベントで、
>TextBox1.Text = Form1.TextBox1.Text

penetraterさんの
>Form2のほうに
>Me.TextBox1.Text = Form1.TextBox1.Text
の二つの処理に実質違いはありません。

こういう書き方だと、例えばこんな場合に面倒くさくなります。
・Form2の親がForm1からForm3に変わったらどうする?
・TextBox1の名前がTxtBox1とかに変わったらどうする?

今回のように1対1の単純な関係なら、ちょちょいと手直ししてお終いですが、Form2のような「子フォーム」が複数いた場合はどうでしょう。
Form1に修正が入る度に全ての子フォームを手直しするのは現実的ではありません。
ならどうするのかと言うと
例えばForm2に以下のようなプロシージャを実装します。
    Public Sub SetText(ByVal strHoge As String)
        Me.TextBox1.Text = strHoge
    End Sub

そしてこのプロシージャをForm1から呼び出します。
  Dim frm2 AS New Form2
  frm2.SetText(TextBox1.Text)
  frm2.Show()

こうする事で、Form2の親が変わっても、値の取得先が変わっても、柔軟に対応することができます。

※このやり方が王道かどうかは知りませんし、いつでもこのパターンが適応できる訳でもありませんのであしからず。
投稿者   (社会人) 投稿日時 2008/11/26 23:39:30
一応追加。
各フォームのコントロールはPrivate(非公開)だと思ってほしい。
それの意図するところは、「他のフォームからの操作を許さない・させたくない」ということ。

なので、今回のような場合には、あさんが書いてあるようなコード(メソッド)を用意して、
他のフォームから値だけをもらって、自分の中で処理させるようにしたほうがいい。

#VB6なら質問者のような書き方できたんだけど、
#それはそれで大変なことになったりw

あと、質問者とにぃや♪さんが書いてあるコードは「暗黙のインスタンス」って問題があるけど、
そこまで言うとここの趣旨に反するのかなと思ったのでキーワードだけにしておく。
投稿者 にぃや♪  () 投稿日時 2008/11/27 01:47:49
入門者の、にぃや♪です。
質問者は、私と同じ入門レベルと思います。
入門者に、引数のあるサブは、実行不可と考えます。
まず、結果を確かめることが肝要。
将来的に「あ」さんの技術が理解できれば良い、と思います。
インスタンス(確保領域)についても、入門者には、遠い存在と考えます。
では。
投稿者 にぃや♪  () 投稿日時 2008/11/27 02:06:13
Piblicは子フオームに使ってください。
投稿者 葉月  (社会人) 投稿日時 2008/11/27 03:39:52
にぃやさんの取り組みや情熱は、私から見てお世辞を抜きにして見習うところがあります。
 しかし、初心者の方が混同するといけませんので参戦します。
 一参加者として、nさんとあさんの考え方を支持します。

 にぃやさんの考え方がいけない訳ではありませんが……
 nさんのご指摘以外にも、If文とキーイベントを入れてサンプルの難度を上げてしまったり、グローバル変数を使っているのが問題になります。
 (必ずしもグローバル変数を使うなという意味ではありません)

 あさんの説明とサンプルは、参考リンクを紹介したnさんとの連携も取れており、わかりやすく実用度が高いです。
 にぃやさんの指摘どおり、引数などを使っているので入門者で不明な方もいるかも知れませんが、疑問点を質問すれば解答を頂けるはずです。

>>>将来的に「あ」さんの技術が理解できれば良い、と思います。
 初級の第9回でクラスの話に入るので、そこまでに抑えるといいですね。

■第9回 クラスの使い方
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard9.htm
投稿者 にぃや♪  () 投稿日時 2008/11/27 03:48:48
public変数の渡し方は、2008度版の教科書を参照しました。
特に例外に相当はしないと思います。
インスタンス、教科書にかいてありますが、2005とは仕組みが、かなり違うようです。
質問者の環境が2005なら、私のコードも問題があると言えます。
2008であれば、2008の本を推奨したいと思います。
投稿者 にぃや♪  () 投稿日時 2008/11/27 04:55:16
nさん>暗黙。。以下略のトコは、少し勘違いをされていると思います。
同じ変数名ですが、別のフォームに属するメンバ変数です。
教科書に書いてあります。
つまり、名前空間が異なるわけです。
では。
投稿者 にぃや♪  () 投稿日時 2008/11/27 05:26:52
nさんのために解説します。
フォーム1のaとゆう変数があると仮定します。
aの確保領域を&H0000~&H0001に確保したとします。
フォーム2のaとゆう変数があると仮定します。
フォーム2のaとゆう変数は、&H0019~&H0020に確保されたと、仮定できます。
これは暗黙ではなく、正式に領域の確保がされています。
名前空間が違い、まったく違う変数と言えます。
投稿者 るきお(管理者)  (社会人) 投稿日時 2008/11/27 07:58:07
にぃや♪さん、こんにちは。
名前空間とメモリ上の配置は関係ありませんよ。
投稿者   (社会人) 投稿日時 2008/11/27 08:55:28
ええとね、暗黙云々はメンバ変数のことを指してるわけじゃないから。

あと、メモリアドレスとかの話をしてるけど、VB.NETでは意識しなくても
プログラミングできるようになってるから。
(その知識が必要ではないということではない)

君の言い方で説明すると、フォーム1、フォーム2の確保領域が
自分の管理していないところで作られてしまうってこと。
投稿者 にぃや♪  () 投稿日時 2008/11/27 09:37:20
入門者の、にぃや♪です。
気になって寝れないよ。
フォームの宣言はいらない、と書いてあるよ(教科書)
2005以降ですけど。
ただし書きとして
同じフォームを、もう一つ同時に開きたいときは、
2つ目のフォームではDimを使ってクラス名とは別の
名前のインスタンスを宣言する必要がある。
と書いてある。
1つならokでは?
Zzzz・・・
投稿者 るしぇ  (社会人) 投稿日時 2008/11/27 21:59:42
[暗黙云々について]
教科書に書いてあるのは、それで1つの考え方なんだけど、
なぜそうなのか?理由が分かってないよね。
で、使わないほうが良いって言ってる人の理由も理解してない
よね。実際の現場では『仕様変更』というものが発生します。

・最初に1つしかフォームを使いませんでした。
・2つ目のフォームを使うように仕様変更されました。
・1つ目のフォームを使わないように仕様変更されました。

こうなった時、プログラムとしてはフォームは1つしか
使わないのに、手法は2つ目の手法を使うことになってしまいますね。
これは教科書の解釈ではどうなるの?バグは無いの?

実際に現場に関わってバグを生むことを知ってるから
よりよい提案をしているのです。実際に規定のインスタンスと
自分で用意したインスタンスの区別がついてないで質問した
例はあるよ。ほかの掲示板まで探せばかなりの量あります。
それだけ問題を起こしやすいコードなのです。
http://rucio.groupsite.jp/commu/ThreadDetail.aspx?ThreadId=16

[コントロールはPrivate(非公開)について]
これも外部で破棄などの操作ができてしまうという理由が
あるから非公開にした方が良いです。
投稿者 にぃや♪  () 投稿日時 2008/11/27 22:59:45
なるほどね(笑)
個人的に「あ」さんは、先生クラスに格付けしてますが。
他の人に関しては、同じ入門者とゆう感じです
コレ書くと「ムッ」とするかな?
次回以降、質問しても返答0かもしれませんね。
例えば、小3の子が、2*2*2=8
なぜですか?と質問して2^3と回答しても、その生徒は試験で0点です。
2008の教科書はマイクロソフト公認推奨の教科書です。
option Strictの本で、わざわざ、フォームのインスタンスの宣言は、いらない。と書いてあるんです。
私はフォームを10以上使う予定ですが、同時に使用しませんから、宣言も書きません。
投稿者   (社会人) 投稿日時 2008/11/27 23:30:13
各フォームのインスタンスを1つずつしか作らないんだったら問題ないよ。
それができるってところがVBの良い面でもあるし。

教科書は基本的に正しいかもしんないけど、教科書だけが正しいわけじゃないってことは言っとく。
公認推奨の意味はわからんけども。
投稿者 にぃや♪  () 投稿日時 2008/11/28 01:08:31
いろいろアレですね。
falseでフォーム1のオブジェクトを無効にしてますが、アソコのコードがわからないと、
変数のやり取りができない。
「あ」さんの指摘は、正しいと、言えます。
入門者なんで以後も、よろしく。