いつも参考にさせていただいております。
質問なのですが、
30マスx30マスの画像をつくりたいと思い、
以下のようなプログラムを作りました。
開発環境は、windows2000とVB6.0です。
************************************************
Private Sub Command1_Click()
GR = 56.7 '1グリッドの幅
For x = 744 To 744 + (31 * GR) Step GR
Picture1.Line (x, 744)-(x, (744 + 30 * GR))
Next x
For y = 744 To 744 + (31 * GR) Step GR
Picture1.Line (744, y)-((744 + 30 * GR), y)
Next y
End Sub
************************************************
このプログラムだと、32番目にも線が引かれてしまいます。
ただ「744」の値を「743」に変更すると、
きれいに30x30のマス目ができます。
「743」と「744」で、なぜ出力結果が違ってきてしまうのかが
わかりません。
よろしくお願いいたします。
744はいっぱいあるよね。どこを743にかえるの
ぜんぶかえたところでけっかはいっしょ
たぶん、Toの後ろのことを言っているのだと思うけど、
ステップ実行してみりゃわかる。
すべての「744」と「743」を変更します。
ちなみに、vb2.0で実行したところ、「744」と「743」で
同じ出力結果(32番目の線がひかれる)がでました。
30x30のマス目をつくるということよりも、
「744」と「743」で違う結果がでるということがわかりません。
# For文に小数点を使うのは良くないと思います。
# (違う結果がでるというのもコレが原因だと思います)
# それと使う変数は必ずDim宣言した方が良いです。
# しないと全てVariant型として扱われます。
# モジュールの頭にOption Explicitをつけてください。
で、ますおさんがやろうとしていることは
Private Sub Command1_Click()
Dim GR#, dStart#, dEnd#, x#, y As Double
Dim lCnt As Long
GR = 56.7 '1グリッドの幅
dStart = 743 '開始位置
dEnd = dStart + (30 * GR) '終了位置
For lCnt = 0 To 30
x = dStart + lCnt * GR
Picture1.Line (x, dStart)-(x, dEnd)
y = dStart + lCnt * GR
Picture1.Line (dStart, y)-(dEnd, y)
Next
End Sub
浮動小数点の変数(xとy)をFor〜Nextの条件に使用している為、
誤差が発生しています。この為、ループ回数が自分の思ったと
おりの回数で回っていません。
試しに、以下のコードを実行して見てください。
Private Sub Command3_Click()
Dim I As Double
Dim GR As Double
Dim X As Double
GR = 56.7 '1グリッドの幅
Debug.Print "--- 743の場合 ---"
I = 0#
For X = 743# To 743# + (30# * GR) Step GR
Debug.Print "X(" & Format(I, "00") + ") " _
& CStr(X = 743# + (I * GR))
I = I + 1
Next X
Debug.Print "--- 744の場合 ---" + vbCrLf
I = 0#
For X = 744# To 744# + (30# * GR) Step GR
Debug.Print "X(" & Format(I, "00") + ") " _
& CStr(X = 744# + (I * GR))
I = I + 1
Next X
End Sub
実行結果で、"False"と出ているところは条件が不一致のため
一回分ループが回らないということになります。
対策としては、ループの変数は整数型の変数にして、ループの
中で表示する座標を計算するようにすると良いです。
nanashi様
uchi様
ご返答、ありがとうございます。
「743」と「744」での出力結果の違いの原因がわかり助かりました。
変数の宣言に気をつけなくてはいけないのですね。気がつきませんでした。
教えていただいたサンプルプログラムを元に勉強していきたいと
思います。
本当にありがとうございました。
ツイート | ![]() |