|
■No77150 (魔界の仮面弁士 さん) に返信
> 2015/09/17(Thu) 11:23:17 編集(投稿者)
お答え頂いていたにも関わらず、お返事が遅くなってしまい申し訳ございませんでした。
> Invalidate と Refresh の違いは把握されていますか?
> (個人的には、TextChanged した際は Invalidate の方が良いと思います)
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200909/09090024.txt
魔界の仮面弁士様が解説しているページを拝見させて頂きました。
大変わかりやすくまとめてくださっていたので、理解できました。
このプログラムですと、「Invalidate」がよさそうですね。
>>fm1.x1 = int.Parse(textBox1.Text);
> 現在の実装だと、「Text を空欄にした場合」や「非数値が入力された場合」にエラーになりませんか?
>
> .Parse メソッドの代わりに .TryParse を使うことを検討してみて下さい。
> これなら、変換できない文字列であったとしてもエラーにはなりません。
.TryParse を使用することで、自動で判断してくれるのはありがたいですね。
しかし、
send_x1 = float.Parse(textBox1.Text); から
send_x1 = float.TryParse(textBox1.Text); と変えたところ、
「error CS1501: 引数を 1 個指定できる、メソッド 'TryParse' のオーバーロードはありません」というエラーが発生してしまいました。
> なお、入力途中の値は使用せず、入力後の値を使用したいのであれば、
> TextChanged イベントを使うかわりに
> Validating / Validated イベントの利用を検討してみて下さい。
入力後に値を使用したほうが、今回の場合、よさそうですね。
Leave : 入力のフォーカスがコントロールを離れた場合に発生する。
Validating : 入力値の検査。
Validated : 入力値の検証終了後に発生する。
Validated・Validating の場合、form2を表示させた際に線が表示されなくなってしまいました、textbox1~4を選択しないと線が表示されなかったので、
今回はそのままにしてあります。
> それと、数値入力専用ということであれば、TextBox の代わりに
> NumericUpDown コントロールを使うこともできます。
> これを使えば非数値を入力できなくなるので、
> 上記のような変換エラーに悩まされずに済みますよ。
> (NumericUpDown の場合は、Text プロパティではなく Value プロパティを使います)
今回のプログラムはサンプルで作ったものなので、このままtextboxで進めようと思います。数字しか入りませんが、空欄・文字などの場合は、if分の条件付けで弾こうと思います。
>>Form2からForm1の変数などをもらいに行くとき、
> その考えがそもそも間違ってます。
>
> 「親画面が、子画面の値を読み書きする」のは OK ですが、
> 「子画面が、親画面の値を読みに行く」のは、基本的に NG です。
>
> 「親画面側が、自身の値を子画面に渡す」とか
> 「親画面側が、子画面側から値を受け取る」形に書き換えてみましょう。
>
この考えを知ることができてよかったです。
今後これを頭にプログラムを組んでいこうと思います。
774RR様に教えて頂いた形式とは、少し変わってしまったのですがいかがでしょうか?
何かお気づきの点など御座いましたらご教授願えませんでしょうか。
以下修正したプログラムとなります。
● Form1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
namespace test1
{
public partial class Form1 : Form
{
// Form2の宣言
Form2 fm2;
public float x1;
public float y1;
public float x2;
public float y2;
public Form1()
{
// Form2にインスタンスを作成してForm1のインスタンスを渡す
fm2 = new Form2(this);
InitializeComponent();
}
public void pictureBox1_Paint(object sender, PaintEventArgs e)
{
draw(sender, e);
}
public void draw(object sender, PaintEventArgs e)
{
yomikomi();
e.Graphics.DrawLine(Pens.Green, x1, y1, x2, y2);
}
public void yomikomi()
{
FileStream fs = new FileStream(@"c:\data\test1.dat", FileMode.Open, FileAccess.Read); // ファイルを開く
BinaryReader br = new BinaryReader(fs); // ファイルの読み取り
x1 = br.ReadSingle(); // 4バイト浮動小数点値を読み取り、4バイト進める
y1 = br.ReadSingle(); // //
x2 = br.ReadSingle(); // //
y2 = br.ReadSingle(); // //
fs.Close(); // ファイルを閉じる
}
private void button1_Click(object sender, EventArgs e)
{
fm2.set_textbox_form2(x1,y1,x2,y2);
if (fm2.ShowDialog() == DialogResult.OK)
{
pictureBox1.Invalidate();
}
}
public void send_textbox_form2(float _send_x1, float _send_y1, float _send_x2, float _send_y2)
{
using (BinaryWriter w = new BinaryWriter(File.OpenWrite(@"c:\data\test1.dat"))) // ファイルの書き込み
{
w.Write(_send_x1);
w.Write(_send_y1);
w.Write(_send_x2);
w.Write(_send_y2);
}
}
}
}
● Form2
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
namespace test1
{
public partial class Form2 : Form
{
//Form1の宣言
Form1 fm1;
public float send_x1;
public float send_y1;
public float send_x2;
public float send_y2;
public Form2(Form1 _fm1)
{
InitializeComponent();
//Form1のインスタンスを代入
fm1 = _fm1;
}
public void set_textbox_form2(float _x1 , float _y1, float _x2, float _y2)
{
textBox1.Text = _x1.ToString();
textBox2.Text = _y1.ToString();
textBox3.Text = _x2.ToString();
textBox4.Text = _y2.ToString();
}
private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
// textbox1~4の値をform1へ渡す
fm1.send_textbox_form2(send_x1, send_y1, send_x2, send_y2);
fm1.draw(sender, e);
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
// private void textBox1_Validating(object sender, CancelEventArgs e) 更新かからず・・・
private void textBox1_TextChanged(object sender, EventArgs e)
{
send_x1 = float.Parse(textBox1.Text);
pictureBox2.Invalidate();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
send_y1 = float.Parse(textBox2.Text);
pictureBox2.Invalidate();
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
send_x2 = float.Parse(textBox3.Text);
pictureBox2.Invalidate();
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
send_y2 = float.Parse(textBox4.Text);
pictureBox2.Invalidate();
}
}
}
|