目覚まし時計プログラム VB 2005 2 プログラムの概要 オーソドックスなユーティリティ 目覚まし時計 を作成する プログラムを起動すると 懐かしいアナログの目覚まし時計が 画面に表示される 時針 分針 秒針が 現在の時間を知らせる 一般的に 実用プログラムに比較するとゲームプログラムは 高度なテクニックを要求される事が多い 此処では ゲーム感覚のプログラムを作成する事に依り 楽しみ乍ら プログラムの制作手順を習得する事を目的として居る 制作手順としては 実際の作業過程に従い 段階的にを追加する方法を採用して居る 此のプログラムを土台に 更に 各自でを追加して行く事が望まれる 今回の課題項目 アプリケーション画面のデザイン ( 標準コントロールの利用 ) プログラムの動作原理 ( イベント駆動型のプログラム ) プログラムの構成要素 ( オブジェクトとプロパティ ) 値の代入 ( 変数 オブジェクトのプロパティ ) 演算子の利用 ( 加算 + 減算 - 乗算 * 除算 /) 条件に応じた処理 (If 文の利用 + If 文のネスト ) 自動的に行われる処理 ( タイマーの利用 ) 日付時間 (DateTime オブジェクトの利用 ) 三角関数 (Math.Sin Math.cos) -1-
オブジェクト プロパティ一覧 チェックボックス テキストボックス タイマー コントロールの種類 プロパティ プロパティの設定値 フォーム 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-2-
ライン3 Name linsecond BorderColor Black BorderWidth 1 X1, Y1 192, 104 X2, Y2 192, 234 ラインの配置時の注意 各コントロールには 表示される順序が有り 此れは フォームに配置した順番に依り 自動的に決定される ラインを配置する時 1~3 の順番で配置すると 其の順序で最背面から表示される事に成り 正しく表示される 使用コントロール フォームアプリケーションウィンドウ 又は ダイアログボックスと成るウィンドウの事を謂う フォームには コントロールを配置し フォームとコントロールに関連したプロパティを設定したり コードを記述する チェックボックスオン ( チェック ) とオフ ( 未チェック ) の設定を行う 同時に複数選択する事が出来る テキストボックステキストの入力や表示を行う キャレットの移動や文字の削除等の入力に必要なを備えて居る シェイプ ( ライン ) フォーム上に直線 長方形 正方形 楕円 円 角丸長方形 角丸正方形等の基本的な図形を表示するグラフィカルコントロール 此のコントロールは コンテナと仕て利用する事は出来ず 亦イベントは発生しないが グラフィックスメソッドと異なり デザイン時に視覚的に確認する事が出来る 此のコントロールを使用する為には Visual Basic 2005 では Power Packs 2.0 以上を追加する必要が有る タイマー一定の時間間隔でイベントが発生する様にするコントロール 一定時間毎にプログラムを実行したい時に使用する 此のコントロールは 実行時には表示されない -3-
プログラムリスト シングルコーテーション ( ' ) で始まる文章は プログラムの説明の為のコメントで プログラムの実行には 影響が無いので 入力する必要は無い 1 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 2 デザイン画面で タイマーをダブルクリックして コード画面を表示し 左記のコードを入力する -4-
変数 (variable) とは 定義 変数とは プログラムの実行中に変更出来る特定の型のデータを入れる名前付きの場所を謂う 通常 適切な名前を付けて宣言し 数値 文字列 其他のデータを代入 ( 格納 ) したり演算に使用する コンピュータのメモリ ( 記憶装置 ) は 夫々の場所を示すアドレス ( 番地 ) が割り当てられて居る アドレスは 実装されたメモリ空間の特定の場所を指し示す数値で有り メモリに記憶 ( 保存 ) されたデータは 其のアドレスに依り参照される 併し BASIC 等の高級言語では データの記憶場所と変数名が自動的に関連付けられる為 データが記憶されたアドレスを覚えて置く必要は無く データを 其の内容を連想し易い名前で参照する事が出来る 変数とは データを入れて置く為の箱の様な物で 其の箱を区別する為に 内容が解り易い名前 ( 変数名 ) を付けて居ると考えると良い 変数は 代入文に依り 何度でも書き換える事が出来る 代入文 (Let 文 ) ( 再掲 ) 左辺の変数やオブジェクトのプロパティに 右辺の式の値を代入する Let 変数名 = 式 但し Let は省略可能で ( 通常省略する ) 変数名 = 式と記述する事が出来る 下記の様な式を代入文と呼ぶ 此処で使用して居る =( イコール ) は 数学の等号の様に左辺と右辺が等しいと謂う意味では無く 右辺の計算式の値を左辺の変数等に代入すると謂う意味で有る X = 10 左辺の値 (10) を代入 X = 10 A = X + Y 左辺の値 (10 + 20) を代入 10 20 A = X + Y 此の代入文の右辺には数値 変数 式を記述する事が出来るが 右辺には 1 個の変数 又はオブジェクトのプロパティしか記述する事が出来ない 例えば X + Y = A と謂う様な記述は出来ない 単独の変数や定数も 広い意味での式と看做される -5-
条件分岐 (If 文 ) 論理式 ( 真か偽に収束する条件式 ) の条件判断を行うステートメント 単一行形式 1 If 論理式 Then 論理式が真の場合の処理 単一行形式 2 If 論理式 Then 論理式が真の場合の処理 Else 論理式が偽の場合の処理 ブロック形式 1 If 論理式 Then 論理式が真の場合の処理 End If ブロック形式 2 If 論理式 Then 論理式が真の場合の処理 Else 論理式が偽の場合の処理 En If ブロック形式 3 If 論理式 1 Then 論理式 1 が真の場合の処理 ElseIf 理式 2 hen 論理式 2 が真の場合の処理 Else 論理式 1 と論理式 2 が偽の場合の処理 En If 偽 (False) 偽の場合の処理 論理式 真 (True) 真の場合の処理 論理式の条件に依りプログラムの実行を制御する 即ち 論理式が条件を満たす場合 ( 真 True) ならば Then 以下の処理が実行され 満たさない場合 ( 偽 False) ならば Else 以下の処理が実行される 但し Else 節が無い場合には End If の次のコードが実行される 通常 論理式 ( 条件式 ) には比較式を指定するが ブール型 ( 真 True か偽 False の孰れか ) として評価出来る式で有ればどんな式でも指定する事が出来る 単一行形式は 短く簡単な条件判断を行う時に使用する 亦 ブロック形式は 単一行形式の構文に比べ より構造化された柔軟な記述が出来 コードの読み易さや保守性が向上し デバッグも行い易く成る ブロック形式かどうかを判断する場合 Then の後に何が続くかで決定する Then と同じ行の後ろの部分にコメント以外の記述が有ると 単一行形式として扱われる Else 節と ElseIf 節はどちらも必要に応じて定義する 亦 ブロック形式では ElseIf 節は幾つ指定しても構わない 但し Else 節の後ろには ElseIf 節を指定する事は出来ない -6-
演算子 算術演算子 代入文等の式に使用する演算子には 下記の物が有る 演算子の意味 記号 使用例 加算 ( 足し算 ) +( プラス ) 5 + 2 7 (5 + 2) 減算 ( 引き算 ) -( マイナス ) 8-2 6 (8-2) 乗算 ( 掛け算 ) *( アスタリスク ) 4 * 3 12 (4 3) 除算 ( 割り算 ) /( スラッシュ ) 9 / 3 3 (9 3) 冪乗 ( べき乗 ) ^( キャレット ) 4 ^ 2 16 (4 2 ) 整数除算 ( 商 ) \( 円マーク バックスラッシュ ) 7 3 2 剰余演算 ( 余り ) Mod 7 Mod 3 1 2 3 7 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 を使用する事を推奨する -7-
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 からのタイマ刻み数で表す -8-
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 には 此の様なメソッドは存在しない ) 古い物をレガシ ( 過去の遺物 ) と仕て切り捨てるのではなく 有用な物は 大いに活用する事も必要で有る -9-