投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/6/11 17:13:37
Visual Basic のどのバージョンをお使いですか?


> 座標 (150,100)(100,200)(300,200)を入力してるんですけれども
それだと、座標が「3 つ」しか無いですよね。

TextBox の数が幾つであろうと、提示頂いたコードにおいては、
最終的に座標を管理しているのは
> Private zahyo(8) As Point
という、zahyo(0)~zahyo(8) の「9 つの座標」であるはずです。


> 実施すると (0,0)(100,200)(300,200)
> の3点を結んだ三角形になっています。
テキストボックスの入力値にとらわれず、
変数 zahyo に代入された 9 つの値を確認してみてください。
その中に、(0, 0) を保存しているデータが混入してはいませんでしたか?

(0, 0) が紛れ込んでいたなら、(0, 0) を結ぶ線分が描画されるのは当然の結果なので、
まずは (0, 0) が含まれていないことを確認するのが先決です。

もし、9 つすべてを使いたいわけのではなく、3 つだけでよいのなら、
 案1) zahyo 配列は 9 つにせず、3 つにしておく(あるいは動的に増減させる)
 案2)「使わない座標」と「(0, 0) という座標」を区別できるよう管理方法を見直す
などを再検討してみてください。



> 予想なんですけれども
『予想』するだけで終えず、きちんと『確認』しておきましょう。

ステップ実行で一行ずつ処理を追い、それぞれの変数に
どのような値が代入されているのか確認すれば、予想が正しいかどうか分かりますよね。
http://rucio.a.la9.jp/main/dotnet/shokyu/standard41.htm


> zahyo(0).X = Val(TextBox1.Text)
「zahyo(0).X = Val(TextBox1.Text)」のような変換は望ましくありません。
Val ではなく、Integer.TryParse を使うようにしましょう。
 If Integer.TryParse(TextBox1.Text, zahyo(0).X)


Val による変換結果は Double 型です。しかし、代入先となる、zahyo(0).X の型は
Integer 型なので、代入式の左右でデータ型が不一致になってしまっているからです。

また、Val 関数をさけるべき利用はもう一つあります。Val 関数は、
Val("99.8%") → InvalidCastException
Val("1.8E308") → OverflowException
のように、引き渡す文字列によってはエラーになってしまう可能性があるためです。


TryParse なら、どのような文字列を渡してもエラーにはなりませんし、
入力値が "" の場合と "0" の場合を区別して処理させることもできます。



> Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
>  Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
>  Dim g As Graphics = Graphics.FromImage(canvas)

このコードも悪手です。Paint イベントで Bitmap や Grapchis を作り直すべきではありません。
Paint イベントを使う場合は、e.Graphics に対して描画を行うようにすべきです。
(先週、るきおさんが書かれたサンプルコードもそうなっていましたよね)


もし、Bitmap を毎回生成するのなら、それは Paint イベントが呼ばれたタイミングではなく、
座標値が変更された場合に行うべきです。座標値が変化しない限りは、
Bitmap を描きなおす必要も無いのですから。


また、Bitmap や Graphics を作り直すにしても、作ったまま放置するのではなく、
未使用になったオブジェクトは、Dispose メソッド(あるいは Using ブロック)を用いて
破棄するようにすべきです。

Call txt()
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Using g As Graphics = Graphics.FromImage(canvas)
  Dim maxIndex As Integer = zahyo.Length - 1
  For i = 0 To maxIndex - 1
    For j = i + 1 To maxIndex
      g.DrawLine(Pens.Black, zahyo(i), zahyo(j))
    Next
  Next
End Using
Dim oldImage = PictureBox1.Image
PictureBox1.Image = canvas
If oldImage IsNot Nothing Then
 oldImage.Dispse()
End If