[もくじへトップページへ前ページへ次ページへ]

                                       


 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宣言されているので、すべてのプロシージャ

    から使用可能です。

    関数の戻り値は通常ひとつですが、このようにして使うと何個でも返すこと

    ができますね。これはスタンダードな使い方ではないでしょうけど。



  ここまでのソースプログラムは、次をクリックすればダウンロードできます。

ソースプログラムのダウンロード 

圧縮されていますので、解凍してから使ってください。



  次回は、ファイル処理の予定です。


質問や感想をお聞かせ下さい。

■お名前

■メールアドレス

■質問


■このページの印象はいかがでしたか?


        

 これでおわります。              


[もくじへトップページへ前ページへ次ページへ]