| 2015/09/17(Thu) 11:23:17 編集(投稿者)
# 解決済みマークついてたか…どうしよう。 # とりあえず解決マーク付け直しておきます。
■No77141 (ゆーきゃん さん) に返信 > pictureBox1.Invalidate(); > pictureBox2.Refresh();
Invalidate と Refresh の違いは把握されていますか? (個人的には、TextChanged した際は Invalidate の方が良いと思います)
> private void textBox1_TextChanged_1(object sender, EventArgs e) > { > fm1.x1 = int.Parse(textBox1.Text); 現在の実装だと、「Text を空欄にした場合」や「非数値が入力された場合」にエラーになりませんか?
.Parse メソッドの代わりに .TryParse を使うことを検討してみて下さい。 これなら、変換できない文字列であったとしてもエラーにはなりません。
また、ユーザーが常に数値を入力するのだとしても、入力途中の値は 必ずしも .Parse できない可能性があることに注意して下さい。たとえば、 「-123.4」という値をキーボードから入力する場合、Text の内容は通常、 "" → "-" → "-1" → "-12" → "-123" → "-123." → "-123.4" と変化していきますよね。"" や "-" は数値に変換できませんので、 現状のコードだと、変換エラーで止まってしまうと思います。 (キーボードから値を入力するたびに TextChanged が発生します)
なお、入力途中の値は使用せず、入力後の値を使用したいのであれば、 TextChanged イベントを使うかわりに Validating / Validated イベントの利用を検討してみて下さい。
それと、数値入力専用ということであれば、TextBox の代わりに NumericUpDown コントロールを使うこともできます。 これを使えば非数値を入力できなくなるので、 上記のような変換エラーに悩まされずに済みますよ。 (NumericUpDown の場合は、Text プロパティではなく Value プロパティを使います)
NumericUpDown の場合、最大値・最小値を指定したり、 小数点以下の桁数を指定するといったこともできます。 今回の要件に合うかどうかは分かりませんけど。
> public void draw(object sender, PaintEventArgs e)
Form1 の pictureBox1 と Form2 の pictureBox2 の役割の違いが良く分かりませんでした。
もし、『pictureBox1 は、子画面が閉じられるまでは描き変わらない』としたいなら、 Form2 はモーダルにし、OK / Cancel ボタンを用意しておくのが良いと思います。
一方、『TextBox で編集すると、両方の PictureBox がリアルタイムに更新される』 という動作を望むなら、Form2 をモードレスにしておくのが良いのでは無いでしょうか。
> Form2からForm1の変数などをもらいに行くとき、 その考えがそもそも間違ってます。
「親画面が、子画面の値を読み書きする」のは OK ですが、 「子画面が、親画面の値を読みに行く」のは、基本的に NG です。
「親画面側が、自身の値を子画面に渡す」とか 「親画面側が、子画面側から値を受け取る」形に書き換えてみましょう。
たとえば、MessageBox.Show するとき、this.textBox1.Text を引数に渡すことはありますが、 MessageBox 側が、呼び出し元画面の TextBox の値を読み書きしたりはしないですよね。
> fm1.x1 = int.Parse(textBox1.Text); 上記の指摘と関連しますが、 「子画面が、親画面のコントロールやプロパティ、変数等を直接操作すること」 は避けてください。
ちなみに「親画面が、子画面のコントロールを直接操作すること」も NG です。 ただし、「親画面が、子画面のプロパティやメソッドを呼ぶこと」は OK です。 ※そのプロパティが public (あるいは internal であること)が前提ですが。
> fm1.y1 = int.Parse(textBox2.Text); 元データが float 型であるのにもかかわらず、 int 型に変換している点に違和感を覚えます。
元データが float なら、編集も float に統一するべきだと 思うのですが、意図的にデータ型を変えているのでしょうか?
データ形式が float なだけで、実データは int 値しか扱わないのなら、 あえてそういう実装にすることもあるとは思いますが、ちょっと気になりました。 |