プログラムの概要
オーソドックスなユーティリティ『目覚まし時計』を作成する。 プログラムを起動すると、懐かしいアナログの目覚まし時計が、画面 に表示される。 時針、分針、秒針が、現在の時間を知らせる。 一般的に、実用プログラムに比較するとゲームプログラムは、高度な テクニックを要求される事が多い。 此処では、ゲーム感覚のプログラムを作成する事に依り、楽しみ乍ら、 プログラムの制作手順を習得する事を目的として居る。 制作手順としては、実際の作業過程に従い、段階的に機能を追加する方法を採用して居る。 此のプログラムを土台に、更に、各自で機能を追加して行く事が望まれる。目覚まし時計プログラム
VB 2005 ② □ アプリケーション画面のデザイン(標準コントロールの利用) □ プログラムの動作原理(イベント駆動型のプログラム) □ プログラムの構成要素(オブジェクトとプロパティ) □ 値の代入(変数、オブジェクトのプロパティ) □ 演算子の利用(加算 +、減算 -、乗算 *、除算 /) □ 条件に応じた処理(If 文の利用 + If 文のネスト) □ 自動的に行われる処理(タイマーの利用) □ 日付時間(DateTime オブジェクトの利用) □三角関数(Math.Sin、Math.cos) 今回の課題項目コントロールの種類 プロパティ プロパティの設定値 フォーム Name clock BackgroundImage clock.png FormBorderStyle FixedSingle MaximizeBox False Text 目覚まし時計 チェックボックス Name chkAlarm BackColor LightSalmon Text 空白 テキストボックス Name txtAlarm BackColor LightSalmon BorderStyle None Font MS明朝、太字、9 Text 00:00 タイマー Name tmrClock Enabled True ライン1 Name linHour BorderColor Red BorderWidth 3 X1, Y1 192, 174 X2, Y2 192, 234 ライン2 Name linMinute BorderColor Blue BorderWidth 2 X1, Y1 192, 134 X2, Y2 192, 234
オ
オ
ブ
ブ
ジ
ジ
ェ
ェ
ク
ク
ト
ト
・
・
プ
プ
ロ
ロ
パ
パ
テ
テ
ィ
ィ
一
一
覧
覧
チェックボックス タイマー テキストボックスライン3 Name linSecond BorderColor Black BorderWidth 1 X1, Y1 192, 104 X2, Y2 192, 234 ラインの配置時の注意 各コントロールには、表示される順序が有り、此れは、フォームに配置した順番に依り、自動的に 決定される。ラインを配置する時、1~3の順番で配置すると、其の順序で最背面から表示される 事に成り、正しく表示される。 使用コントロール フォーム アプリケーションウィンドウ、又は、ダイアログボックスと成るウィンドウの事を謂う。フォ ームには、コントロールを配置し、フォームとコントロールに関連したプロパティを設定した り、コードを記述する。 チェックボックス オン(チェック)とオフ(未チェック)の設定を行う。同時に複数選択する事が出来る。 テキストボックス テキストの入力や表示を行う。キャレットの移動や文字の削除等の入力に必要な機能を備えて 居る。 シェイプ(ライン) フォーム上に直線、長方形、正方形、楕円、円、角丸長方形、角丸正方形等の基本的な図形を 表示するグラフィカルコントロール。此のコントロールは、コンテナと仕て利用する事は出来 ず、亦イベントは発生しないが、グラフィックスメソッドと異なり、デザイン時に視覚的に確 認する事が出来る。
此のコントロールを使用する為には、Visual Basic 2005 では、Power Packs 2.0 以上を追加 する必要が有る。
タイマー
一定の時間間隔でイベントが発生する様にするコントロール。一定時間毎にプログラムを実行 したい時に使用する。此のコントロールは、実行時には表示されない。
シングルコーテーション( ' )で始まる文章は、プログラムの説明の為のコメントで、プログラムの実 行には、影響が無いので、入力する必要は無い。
Public Class clock
' フォームクラスでグローバルな変数の宣言 Private Const PI As Single = 3.14159 / 180
' タイマーが一定間隔で行う処理
Private Sub tmrClock_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles tmrClock.Tick
' 現在日時の取得
Dim N As DateTime = DateTime.Now
' 秒針の角度の算出
Dim S As Single = N.Second * ( 6 * PI )
' 分針の角度の算出
Dim M As Single = N.Minute * ( 6 * PI )
' 時針の角度の算出
Dim H As Single = N.Hour * ( 30 * PI ) + N.Minute * ( 0.5 * PI ) ' 各針の描画 linSecond.X1 = 192 + (130 * Math.Sin(S)) linSecond.Y1 = 234 - (130 * Math.Cos(S)) linMinute.X1 = 192 + (100 * Math.Sin(M)) linMinute.Y1 = 234 - (100 * Math.Cos(M)) linHour.X1 = 192 + (60 * Math.Sin(H)) linHour.Y1 = 234 - (60 * Math.Cos(H)) ' 日時の表示
Me.Text = N.ToString( "yyyy/MM/dd hh:mm:ss" )
' アラームの処理
If chkAlarm.Checked Then
Dim T( ) As String = txtAlarm.Text.Split( ":" )
If ( Val( T( 0 )) = N.Hour ) And ( Val(T( 1 )) = N.Minute ) Then Beep( ) End If End If End Sub End Class
プ
プ
ロ
ロ
グ
グ
ラ
ラ
ム
ム
リ
リ
ス
ス
ト
ト
1 コード記述画面を表示して 左記のコードを入力する。 2 デザイン画面で、タイマーを ダブルクリックして、コード 画面を表示し、左記のコード を入力する。変数(variable)とは 変数とは、プログラムの実行中に変更出来る特定の型のデータを入れる名前付きの場所を謂 う。通常、適切な名前を付けて宣言し、数値、文字列、其他のデータを代入(格納)したり 演算に使用する。 コンピュータのメモリ(記憶装置)は、夫々の場所を示すアドレス(番地)が割り当てられ て居る。アドレスは、実装されたメモリ空間の特定の場所を指し示す数値で有り、メモリに 記憶(保存)されたデータは、其のアドレスに依り参照される。 併し、BASIC 等の高級言語では、データの記憶場所と変数名が自動的に関連付けられる為、 データが記憶されたアドレスを覚えて置く必要は無く、データを、其の内容を連想し易い名 前で参照する事が出来る。 変数とは、データを入れて置く為の箱の様な物で、其の箱を区別する為に、内容が解り易い 名前(変数名)を付けて居ると考えると良い。 変数は、代入文に依り、何度でも書き換える事が出来る。 代入文(Let 文) (再掲) 左辺の変数やオブジェクトのプロパティに、右辺の式の値を代入する。 Let 変数名 = 式 ※ 但し、Let は省略可能で(通常省略する)、変数名 = 式と記述する事が出来る。 下記の様な式を代入文と呼ぶ。此処で使用して居る=(イコール)は、数学の等号の様に左 辺と右辺が等しいと謂う意味では無く、右辺の計算式の値を左辺の変数等に代入すると謂う 意味で有る。 X = 10 = 10 A = X + Y = + 此の代入文の右辺には数値、変数、式を記述する事が出来るが、右辺には1個の変数、又は オブジェクトのプロパティしか記述する事が出来ない。例えば、X + Y = A と謂う様な記述 は出来ない。 単独の変数や定数も、広い意味での式と看做される。 定 義 解 説 機 能 解 説 X A X 10 Y 20 左辺の値(10)を代入 左辺の値(10 + 20)を代入 書 式
条件分岐(If 文) 論理式(真か偽に収束する条件式)の条件判断を行うステートメント 単一行形式① If 論理式 Then 論理式が真の場合の処理 単一行形式② If 論理式 Then 論理式が真の場合の処理 Else 論理式が偽の場合の処理 ブロック形式① If 論理式 Then 論理式が真の場合の処理 End If ブロック形式② If 論理式 Then 論理式が真の場合の処理 Else 論理式が偽の場合の処理 En If ブロック形式③ If 論理式1 Then 論理式1が真の場合の処理 ElseIf 理式2 hen 論理式2が真の場合の処理 Else 論理式1と論理式2が偽の場合の処理 En If 論理式の条件に依りプログラムの実行を制御する。即ち、論理式が条件を満たす場合(真 True)ならば Then 以下の処理が実行され、満たさない場合(偽 False)ならば Else 以下の 処理が実行される。但し、Else 節が無い場合には、End If の次のコードが実行される。 通常、論理式(条件式)には比較式を指定するが、ブール型(真True か偽 False の孰れか) として評価出来る式で有ればどんな式でも指定する事が出来る。 単一行形式は、短く簡単な条件判断を行う時に使用する。亦、ブロック形式は、単一行形式 の構文に比べ、より構造化された柔軟な記述が出来、コードの読み易さや保守性が向上し、 デバッグも行い易く成る。 ブロック形式かどうかを判断する場合、Then の後に何が続くかで決定する。Then と同じ行 の後ろの部分にコメント以外の記述が有ると、単一行形式として扱われる。
Else 節と ElseIf 節はどちらも必要に応じて定義する。亦、ブロック形式では、ElseIf 節は 幾つ指定しても構わない。但し、Else 節の後ろには ElseIf 節を指定する事は出来ない。 機 能 書 式 解 説 論理式 真の場合の処理 偽の場合の処理 真(True) 偽(False)
演算子 ■ 算術演算子 代入文等の式に使用する演算子には、下記の物が有る。 演算子の意味 記号 使用例 加算(足し算) +(プラス) 5 + 2 → 7 (5 + 2) 減算(引き算) -(マイナス) 8 - 2 → 6 (8 - 2) 乗算(掛け算) *(アスタリスク) 4 * 3 → 12 (4 × 3) 除算(割り算) /(スラッシュ) 9 / 3 → 3 (9 ÷ 3) 冪乗(べき乗) ^(キャレット) 4 ^ 2 → 16 (42) 整数除算(商) \(円マーク、バックスラッシュ) 7 ¥ 3 → 2 剰余演算(余り) Mod 7 Mod 3 → 1 優先順位は、冪乗が最も高く、以下、乗除算、整数除算、剰余演算、加減算の順で有る。優先順位を変 える為に、括弧(丸括弧、パーレン丈が使用可能)を用いる事が出来る。 ■ 比較演算子 If 文等の論理式(条件式)に使用する演算子には、下記の物が有る。 演算子の意味 記号 使用例 等しい =(イコール) A = B (A = B) 等しくない <>(レスザン+グレータザン) A <> B (A ≠ B) 小さい <(レスザン) A<B (A < B) 大きい >(グレータザン) A>B (A > B) 以下 <=(レスザン+イコール) A<=B (A ≦ B) 以上 >=(グレータザン+イコール) A>=B (A ≧ B) ※ 此の場合、=(イコール)は、両辺が等しいか比較する演算子で、代入は行われない。 ■ 論理演算子 If 文等の論理式(複合条件式)に使用する演算子には、下記の物が有る。 演算子の意味 記号 使用例 且つ AndAlso A = B AndAlso B = C 又は OrElse A = B OrElse B = C 否定 Not Not A = B 優先順位は、Not が最も高く、以下、AndAlso、OrElse の順で有る。優先順位を変える為に、括弧(丸 括弧、パーレン丈が使用可能)を用いる事が出来る。 ※ ビット演算子で有る And や Or も使用出来るが、上記の意味で使用する場合は、必ず、AndAlso や OrElse を使用する事を推奨する。 2 7 3 … 1
DateTime 構造体の Now プロパティに依る日時の取得 現在のシステムの日時を返すプロパティ Now 使用して居るコンピュータの現在のローカルな日付と時刻を取得する。 取得される値は、DateTime 型の値で有る。 DateTime 構造体の hour プロパティに依る時間の取得 日付の時間の部分を取得するプロパティ Object.hour DateTime 型のオブジェクトの日付から時間の部分を取り出す。 プロパティ値は、Integer 型の 0 から 23 迄の間の時間で有る。 DateTime 構造体の Minute プロパティに依る分の取得 日付の分の部分を取得するプロパティ Object.Minute DateTime 型のオブジェクトの日付から分の部分を取り出す。 プロパティ値は、Integer 型の 0 から 59 迄の間の時間で有る。 DateTime 構造体の Second プロパティに依る月の取得 日付の秒の部分を取得するプロパティ Object.Second DateTime 型のオブジェクトの日付から秒の部分を取り出す。 プロパティ値は、Integer 型の 0 から 59 迄の間の時間で有る。 DateTime 構造体 通常、日付や時刻として表現される瞬間を表すクラス DateTime 型は、西暦 0001 年 1 月 1 日の午前 00:00:00 から西暦 9999 年 12 月 31 日の午後 11:59:59 迄の間の値で日付と時刻を表す。 時刻値は100 ナノ秒単位(タイマ刻み)で表し、日付は GregorianCalendar 暦の西暦 1 年 1 月 1 日の午前 00:00 からのタイマ刻み数で表す。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 解 説 機 能 書 式 解 説 機 能 書 式 解 説
Math クラスの Sin メソッド 指定された角度のサイン(正弦)値を返すメソッド Math.Sin( 角度 ) 角度は、ラジアンで指定する。度をラジアンに変換するには、π/180 を乗算する。 Math クラスの Cos メソッド 指定された角度のコサイン(余弦)値を返すメソッド Math.Cos( 角度 ) 角度は、ラジアンで指定する。度をラジアンに変換するには、π/180 を乗算する。 Math クラス 三角関数や対数関数等の一般的な数値関数の定数と静的メソッドを提供するクラス 三角関数や対数関数等の手計算では面倒な処理を簡単に利用する事が出来る機能を提供し て居るクラスで有る。 三角関数では、他に、Tan(タンジェント、正接)は勿論、逆三角関数の Asin(アークサイ ン、逆正弦)、Acos(アークコサイン、逆余弦)、Atan(アークタンジェント、逆正接)や 双曲線関数のSinh(ハイパーボリックサイン、双曲正弦)、Cosh(ハイパーボリックコサイ ン、双曲余弦)、Tanh(ハイパーボリックタンジェント、双曲正接)が用意されて居る。 亦、対数関数では、指定した数の自然対数(底e)を返す Log、指定した数の底 10 の対数を 返すLog10 が用意されて居る。 三角関数や対数関数以外にも、数値計算に必要な種々のメソッドが用意されて居る。 Val 関数 文字列の表す数値を返す関数 Val( 文字列 ) 文字列を数値に変換して返す関数で、先頭から数値と仕て解釈出来る処迄を返し、先頭の文 字が+(プラス)、-(マイナス)、&(アンパサンド)、数字でなければ 0 を返す。 過去との互換性の為に残されて居るBasic 固有の関数で有るが、整数と実数の孰れにも使用 する事が出来る丈でなく、数値と仕て無効な文字列を指定しても、例外の発生しない優れ物 で有る(.NET Framework には、此の様なメソッドは存在しない)。 古い物をレガシ(過去の遺物)と仕て切り捨てるのではなく、有用な物は、大いに活用する 事も必要で有る。 機 能 解 説 書 式 機 能 解 説 書 式 機 能 解 説 機 能 解 説 書 式