C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.77150 の関連記事表示

<< 0 >>
■77150  Re[10]: 親フォームから子フォームのメソッドへアクセス
□投稿者/ 魔界の仮面弁士 -(2015/09/17(Thu) 11:06:09)
    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 値しか扱わないのなら、
    あえてそういう実装にすることもあるとは思いますが、ちょっと気になりました。
記事No.77125 のレス / END /過去ログ130より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -