[もくじへ|トップページへ|前ページへ|次ページへ]
2.3 距離方向角計算のつづき
標準モジュールは、プロジェクト→標準モジュールの追加で組み込むことがで
きます。
リストを見てみましょう。

図3.3 距離方向角計算フォーム
フォームモジュール(frmEx4.frm)
0010 Option
Explicit
0020 Private Sub
Command1_Click()
0030 Dim
X1, Y1 As Double
0040 Dim
X2, Y2 As Double
0050 Dim T
As Double
0060 Dim
doo, fun, byo As Single
'
'
0070 X1 =
Val(Text1.Text)
0080 Y1 =
Val(Text2.Text)
0090 X2 =
Val(Text3.Text)
0100 Y2 =
Val(Text4.Text)
'
'
0110 T =
Alph(X1, Y1, X2, Y2)
0120 Call
RadDeg(T, doo, fun, byo)
0130 Text5.Text
= doo & "-" & fun & "-"
& byo
0140 Text6.Text
= Str(S)
0150 End Sub
0160 Private Sub
Command2_Click()
0170 Text1.Text
= ""
0180 Text2.Text
= ""
0190 Text3.Text
= ""
0200 Text4.Text
= ""
0210 Text5.Text
= ""
0220 Text6.Text
= ""
0230 End Sub
0240 Private Sub
Command3_Click()
0250 End
0260 End Sub
0270 Private Sub
Form_Load()
0280 Screen.MousePointer
= 0
0290 Me.Left
= (Screen.Width - Me.Width) / 2
0300 Me.Top
= (Screen.Height - Me.Height) / 2
0310 End Sub
0320 Private Sub
Text1_KeyPress(KeyAscii As Integer)
0330 If
KeyAscii = 13 Then
0340 KeyAscii
= 0
0350 Text2.SetFocus
0360 End
If
0370 End Sub
0380 Private Sub
Text2_KeyPress(KeyAscii As Integer)
0390 If
KeyAscii = 13 Then
0400 KeyAscii
= 0
0410 Text3.SetFocus
0420 End
If
0430 End Sub
0440 Private Sub
Text3_KeyPress(KeyAscii As Integer)
0450 If
KeyAscii = 13 Then
0460 KeyAscii
= 0
0470 Text4.SetFocus
0480 End
If
0490 End Sub
0500 Private Sub
Text4_KeyPress(KeyAscii As Integer)
0510 If
KeyAscii = 13 Then
0520 KeyAscii
= 0
0530 Command1.SetFocus
0540 End
If
0550 End Sub
標準モジュール(ex4.bas)
1010 Option
Explicit
1020 Const
PI = 3.14159265358979
1030 Public
S As Double
1040 Sub
RadDeg(r, d, f, b)
1050 Dim
deg As Double
'
1060 deg =
r * 180 / PI
1070 d =
Int(deg)
1080 f =
Int((deg - d) * 60)
1090 If f
< 0 Then f = 0
1100 b =
(deg - d - f / 60) * 3600
1110 If b
< 0 Then b = 0 Else b = Int(b + 0.5)
'
1120 End Sub
1130 Function
Alph(xa, ya, xb, yb) As Double
1140 Dim
DX, DY As Double
1150 Dim
Thi As Double 'Atn(dy/dx)
'
1160 DX =
xb - xa
1170 DY =
yb - ya
'
1180 S =
Sqr(DX ^ 2 + DY ^ 2)
1190 S =
Int(S * 1000 + 0.5) / 1000
'
1200 If DX
= 0 Then
1210 If
DY = 0 Then Alph = 0
1220 If
DY > 0 Then Alph = PI / 2
1230 If
DY < 0 Then Alph = PI * 3 / 2
1240 End
If
'
1250 If DX
<> 0 Then Thi = Atn(DY / DX)
'
1260 If DX
> 0 Then
1270 Alph
= Thi + 2 * PI
1280 End
If
'
1290 If DX
< 0 Then
1300 Alph
= Thi + PI
1310 End
If
'
1320 If
Alph >= 2 * PI Then
1330 Alph
= Alph - 2 * PI
1340 End
If
'
1350 End
Function
※リスト中の番号は説明のためにつけたもので、入力の必要はありません。
これまでのプログラムとの相違点
距離計算と方向角計算のそれぞれのプログラムとの大きな違いは、
(1)テキストボックスが1個増えたこと、
(2)方向角と距離の計算を一つの関数プロシージャにまとめたこと、
(3)ラジアンを度数法に変換するサブルーチンと(2)の関数プロシージ
ャを標準プロシージャの中に移したこと、
などです。
(1)は当然ですね。距離と方向角を一つのフォームに表示しなければなりませ
んから。
(2)については、別にまとめる必要はなかったのですが、距離計算そのものは
簡単で一行で記述できること、さらに距離方向角計算として同時に利用することが
多いからです。
(3)は、今回のプログラミングの目玉で、とにかく標準プロシージャを使って
みるためです。標準プロシージャにしなくてもかまいません。
標準プロシージャには、フォームモジュールに直接関係のないジェネラルプロシ
ージャなどを記述します。
フォームモジュール(frmEx4.frm)の変更箇所
(1)フォームモジュールのジェネラルプロシージャ(サブルーチンや関数
プロシージャ)を、標準モジュールに切り取って貼り付けます。
このとき、Privateを付けたままではフォームモジュールからは呼び出
せないので、Privateは削除します。
Privateの代わりに、次のようにPublicを付けてもかまいません。
Public
Function Alph(xa, ya, xb, yb) As Double
(2)宣言セクション(General-Declarations)で宣言した変数を切り取って、
標準モジュールの宣言セクションに貼り付けます。
すべてのプロシージャから使える変数や定数にするためです。
標準モジュール(ex4.bas)
1010 Option
Explicit
1020 Const
PI = 3.14159265358979
1030 Public
S As Double
宣言部です。
すべてのプロシージャで使える変数にするためです。
1040 Sub
RadDeg(r, d, f, b)
〜
1130 Function
Alph(xa, ya, xb, yb) As Double
〜
ラジアンを度数法に変換するサブルーチンと、方向角と距離を計算する関数
です。
1180 S =
Sqr(DX ^ 2 + DY ^ 2)
1190 S =
Int(S * 1000 + 0.5) / 1000
距離の計算です。変数SはPublic宣言されているので、すべてのプロシージャ
から使用可能です。
関数の戻り値は通常ひとつですが、このようにして使うと何個でも返すこと
ができますね。これはスタンダードな使い方ではないでしょうけど。
ここまでのソースプログラムは、次をクリックすればダウンロードできます。
ソースプログラムのダウンロード
圧縮されていますので、解凍してから使ってください。
次回は、ファイル処理の予定です。

これでおわります。 
[もくじへ|トップページへ|前ページへ|次ページへ]
|