プログラムの概要
年月をテキストボックスで指定した後、表示ボタンをクリック して、指定した年月のカレンダーを表示する。 画面上部のグループボックスでは、現在の年月日と時間をリア ルタイムで表示する。此の場合、時間丈でなく、日付が変われ ば、日付もリアルタイムで変化する。 指定した年月のカレンダーを表示するには、日付と時間を扱う 組込関数を使用し、亦、日付と時間をリアルタイム表示するに は、一定時間間隔で日時の変化を監視する為に、タイマーを使 用する。万年暦プログラム
VB 2005 ⑦ □ 単純変数の宣言(Private、Dim) □ 標準コントロールの利用(Label、GroupBox、TextBox、Button、Timer) □ プロパティの値の取得と設定(Year、Month、Day、Text、Enabled、BackColor) □ イベントの利用(Load、Click、Tick) □ 組込関数(型変換)の利用(Val) □ 組込関数(日付時間)の利用(DateSerial、Weekday、DateAdd) □ 組込関数(整形出力)の利用(Format、StrConv) □ 演算子(代入演算子、算術演算子、比較演算子、Like 演算子) □ 制御構造構文(条件分岐、ループ処理) □ サブルーチン(ジェネラルプロシージャ、引数) 今回の課題項目 □ 変数の適用範囲(スコープ:フォームモジュールレベル、サブプロシージャレベル) □ If 文に依る条件分岐(If ~ Then … Else … End If)□ For 文に依るループ処理(For counter=start To end : … : Next counter) □ For Each 文に依るループ処理(For Each element In group : … : Next) □ Do … Loop 文に依るループ処理(Do : … : Loop)
□ 日付と時間を扱う関数(Year、Month、Day、DateSerial、DateAdd、Weekday) 今回の重点項目
□ 画像を貼り付けられる様にしてビジュアルな面を改良する。
□ テキストボックスへの入力に於けるマンマシンインターフェイスを改良する。 今回の応用項目
■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム Name calendar FormBoardStyle FixedSingle MaximizeBox False StartPosition CenterScreen Text 万年暦 Font MS明朝,太字,12(基準と成るフォント) ラベル1 Name lblTitle Text、Font 万年暦プログラム(MS明朝,太字,18) グループボックス1 Name grpNow Text 空白 ラベル2 Name lblToday Text、Font 空白(MS明朝,太字,12) AutoSize、TextAlign False、MiddleCenter ラベル3 Name lblTime Text、Font 空白(MS明朝,太字,12) AutoSize、TextAlign False、MiddleCenter ラベル4 Name lblEra Text、Font 西暦(MS明朝,太字,12) ラベル5 Name lblYear Text、Font 年(MS明朝,太字,12) ラベル1 ラベル2 ラベル3 テキストボックス2 グループボックス1 タイマー ボタン1 ラベル4 ラベル5 ラベル6 テキストボックス1 ボタン2 ラベル7 ~ ラベル13 グループボックス2 ラベル14 ~ ラベル50
コントロールの種類 プロパティ プロパティの設定値 ラベル6 Name lblMonth Text、Font 月(MS明朝,太字,12) テキストボックス1 Name txtYear Text、Font 空白(MS明朝,太字,10) TextAlign Right テキストボックス2 Name txtMonth Text、Font 空白(MS明朝,太字,10) TextAlign Right ボタン1 Name btnDisp Text 、Font 表示(MS明朝,太字,9) グループボックス2 Name grpCalendar Text 空白 ラベル7 Name lblWeek0 Text、Font 日(MS明朝,太字,12) AutoSize、TextAlign False、MiddleCenter … ※ 同様に、火~金を作成 ラベル13 Name lblWeek6 Text、Font 土(MS明朝,太字,12) AutoSize、TextAlign False、MiddleCenter ラベル14 Name lblDay0 Text、Font 空白(MS明朝,標準,9) AutoSize、TextAlign False、MiddleRight … ※ 同様に、lblDay1~lblDay35 を作成 ラベル50 Name lblDay36 Text、Font 空白(MS明朝,標準,9) AutoSize、TextAlign False、MiddleRight ボタン2 Name btnFinish Text 、Font 終了(MS明朝,太字,12) タイマー Name tmrTimer ラベル テキストを表示するコントロール。此のテキストは、ユーザーが直接入力したり変更したりす る事は出来ない。 テキストボックス テキストの入力や表示を行うコントロール。此のテキストボックスは、ユーザーが直接入力し たり変更したりする事が出来る。 グループボックス 外観を整えたり、機能別にコントロールをフレーム内に配置してグループ分けするコンテナと 仕て使用する。パネルと異なり、キャプションを表示する事が出来る。 ボタン ユーザーが選択したコマンド(命令)や操作を実行するコントロール。OKボタンや実行ボタ ン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールで有る。 ボタンが押し下げられた様に外観が変わる為、プッシュボタンとも謂う。 タイマー 一定の時間間隔でイベントが発生する様にするコントロール。一定時間毎にプログラムを実行 したい時に使用する。此のコントロールは、実行時には表示されない。
■ プログラムリスト ■
Public Class calendar
' フォームレベルでグローバルな変数の宣言 Private LI(36) As Integer
Private Y As Integer Private M As Integer Private D As Integer ' フォームが読み込まれた時の処理
Private Sub calendar_Load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load Dim C As Control Dim N As Integer Dim I As Integer ' 起動した時の日付の取得 Y = Now.Year M = Now.Month D = Now.Day ' ラベルとテキストボックスに日付の表示
lblToday.Text = StrConv( Format( Now, "yyyy 年 MM 月 dd 日" ), VbStrConv.Wide ) txtYear.Text = Format( Now, "yyyy" )
txtMonth.Text = Format( Now, "%M" ) ' ラベルの背景色の透明化
For Each C In Me.grpNow.Controls C.BackColor = Color.Transparent Next
For Each C In Me.grpCalendar.Controls C.BackColor = Color.Transparent
Next
' 日付表示用ラベルのインデックスの取得 For Each C In Me.grpCalendar.Controls If C.Name Like "lblDay*" Then N = Val( C.Name.Substring( 6 ) ) LI( N ) = Me.grpCalendar.Controls.IndexOf( C ) End If Next ' 日曜日と土曜日の表示色の設定 For I = 0 To 35 Step 7
Me.grpCalendar.Controls( LI( I ) ).ForeColor = Color.Red Next
For I = 6 To 34 Step 7
Me.grpCalendar.Controls( LI( I ) ).ForeColor = Color.Blue Next
' カレンダーを表示するサブプロシージャの呼出 Call DispCalendar( DateSerial( Y, M, 1 ) ) ' タイマーの有効化 tmrTimer.Enabled = True End Sub 此処で宣言した変数は同じフォー ム内の総てのサブプロシージャで 値の参照と設定を行う事が出来 る。 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 書式を指定した形式に変換するに は、Format 関数を使用すると便 利である。 此のループ処理ではカウンターI の値を0 から 35 に 7 ずつ変化さ せて、Next 迄の処理を繰り返す。 色を指定するには、Color 構造体 で定義されて居る定義色を使用す ると解り易い。 Call は、Sub プロシージャ等に制 御を渡すステートメント。引数が 必要なプロシージャを呼び出す場 合は、引数リストを括弧で囲む必 要が有る。 For Each…Next は、配列やコレ クションから、総ての要素を1個 宛取り出す構文で有る。
' ボタン(表示)がクリックされた時の処理
Private Sub btnDisp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnDisp.Click ' 年月をテキストボックスより取得 Y = Val( txtYear.Text ) M = Val( txtMonth.Text ) ' カレンダーを表示するサブプロシージャの呼出 Call DispCalendar( DateSerial( Y, M, 1 ) ) End Sub
' ボタン(終了)がクリックされた時の処理
Private Sub btnFinish_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnFinish.Click tmrTimer.Enabled = False Me.Dispose( ) End End Sub ' タイマーが一定間隔で行う処理
Private Sub tmrTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles tmrTimer.Tick
' 時間をラベルに表示する
lblTime.Text = StrConv( Format( Now, "HH 時 mm 分 ss 秒" ), VbStrConv.Wide ) ' 日付が変更した場合の処理
If Not Now.Day = D Then
lblToday.Text = StrConv( Format(Now, "yyyy 年 MM 月 dd 日" ), VbStrConv.Wide ) End If
End Sub
' カレンダーを表示するジェネラルプロシージャ Private Sub DispCalendar( ByVal F As Date ) Dim W As Integer
Dim P As Integer Dim I As Integer
' カレンダー表示用ラベルのテキストの消去 For I = 0 To 36
Me.grpCalendar.Controls( LI( I ) ).Text = "" Next ' 当月の第1日の曜日の取得 W = Weekday( F ) P = W - 1 ' カレンダーの表示 I = 0 Do
Me.grpCalendar.Controls( LI( P ) ).Text = CStr( I + 1 ) P += 1 : I += 1
Loop Until DateAdd( DateInterval.Day, I, F ).Day = 1 End Sub End Class 此の場合のイコール(=)記号は、 代入演算子で有り、右辺の値を左 辺に代入する働きをする。 同じ処理を複数の箇所で行う時は ジェネラルプロシージャ化すると 記述の手間を省ける丈でなく、メ ンテナンス面でも有効で有る。 アプリケーションを終了する場 合、正しくプログラムをメモリか ら消去して終了する。 アプリケーションを終了する場 合、使用したタイマーは無効にし て終了する事が望ましい。 Not 演算子は、否定を意味する。 Not A = B : AとBは異なる DispCalendar は、Date 型の引数 をF と謂う変数名で受け取るユー ザ定義のプロシージャで有る。 回数を指定しないでループ処理を 行う時にはDo…Loop 構造を使用 する。 アルファベットのIと数字の1を 間違え無い様に! 此のループ処理ではカウンターI の値を0 から 36 に 1 宛変化させ て、Next 迄の処理を繰り返す。 変数P は、何番目の日付用コント ロールから表示を開始するかを示 すポインタで有る。 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。
カレンダー表示のアルゴリズム ジェネラルプロシージャCalendar の引数 F には表示する年月の1日目が渡される。初期値を 0に設定した変数I の値を、1日表示する毎にインクリメントして、DataAdd 関数を用いて、 引数F に加えると、関数の戻り値は、引数 F から変数 I 日後を表す事に成る。其の値の日の部 分をDay 関数で抽出した値が1に成れば、月が変わった事を意味する。 猶、変数P は、表示する初日が何曜日かを Weekday 関数で求めた後、コントロール配列の要 素番号が0スタートで有る為、デクリメントした値を初期値に設定して居る。 日付表示に関する注意 タイマーの Tick イベントに於いて、日付が変更した場合の処理は、当該プログラムを、0時 を挟んで、2日に跨り使用した場合に而巳実行される処理で有るが、実際に其の様な状況で使 用した場合、日付が変更され無いのは、明らかに不都合な事で有る為、滅多に発生し無い様な 事でも、可能性が有る限り、其れに対応して置く必要が有る。 サブルーチン化の効用 ジェネラルプロシージャ(新規プロシージャ)は、主に、複数のイベントプロシージャで同じ 様な処理が必要と成る場合に、共通コードを記述する為に使用する事が多いが、当該ルーチン に訂正や追加等を行う場合、複数箇所を書き直すのではなく、一箇所而巳を書き直す丈で済む 等、メンテナス面でも有用である。此の様な手法を『サブルーチン化』と呼ぶ。
DateTime 構造体の Now プロパティに依る日時の取得 現在のシステムの日時を返すプロパティ Now 使用して居るコンピュータの現在のローカルな日付と時刻を取得する。 取得される値は、DateTime 型の値で有る。 DateTime 構造体の Today プロパティに依る日時の取得 (参考) 現在のシステムの日付を返すプロパティ Today 使用して居るコンピュータの現在のローカルな日付を取得する。 取得される値は、DateTime 型の値で有る。 DateTime 構造体の Year プロパティに依る年の取得 日付の年の部分を取得するプロパティ Object.Year DateTime 型のオブジェクトの日付から年の部分を取り出す。 プロパティ値は、1 から 9999 迄の間の年で有る。 DateTime 構造体の Month プロパティに依る月の取得 日付の月の部分を取得するプロパティ Object.Month DateTime 型のオブジェクトの日付から年の部分を取り出す。 プロパティ値は、1 から 12 迄の間の月で有る。 DateTime 構造体の Day プロパティに依る日の取得 日付の日の部分を取得するプロパティ Object.Day DateTime 型のオブジェクトの日付から年の部分を取り出す。 プロパティ値は、1 から 31 迄の間の日で有る。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
Weekday 関数に依る曜日の取得 指定した日付の曜日を取得して返す関数 Weekday(日付, [週の最初の曜日]) 引数で与えられた日付の曜日を調べる。 引数の日付には、日付を表す値、数式、文字列式等を指定し、省略する事は出来ない。 引数の週の最初の曜日には、週の第1日目の曜日(日曜日なら1:規定値)を指定し、省略可能で有る。 戻り値は、日曜日なら1、月曜日なら2、火曜日なら3、水曜日なら4、木曜日なら5、金曜日なら6 土曜日なら7で有る。 DateSerial 関数に依る Date 型の日付の取得 数値を日付に変換して返す関数 DateSerial(年, 月, 日) 引数で指定した年、月、日に対応する日付を得る。個々に入力された値から日付を作成する 時に使用する。 引数の年には、年を表す値(1~9999の範囲)を指定し、省略する事は出来ない。 引数の月には、月を表す値(1~12の範囲の整数値)を指定し、省略する事は出来ない。 引数の日には、日を表す値(1~31の範囲の整数値)を指定し、省略する事は出来ない。 上記以外の値を指定した場合、及び、引数の年に0~99の値を指定した場合や、各引数に0や負の値 を指定した場合は、特別な解釈が為される為、注意が必要で有る(詳細に付いてはヘルプを参照)。 DateAdd 関数に依る Date 型の日付の取得 日時を加減して返す関数 DateAdd(インターバル, 数値, 日付) 指定された時間間隔を加算した日付と時刻をDate 型の値で返す。 引数のインターバルには、加算する時間間隔を表すDateInterval 列挙値を指定し、必ず指定する。 引数の数値には、加算する間隔数を表す浮動小数点数式を指定し、必ず指定する。 引数の日付には、起算する日付と時刻を表す式を指定し、必ず指定する。 猶、引数のインターバルは、DateInterval 列挙体の値の他に、年を表わす "y"、月を表わす "m"、日を 表わす "d"、週を表わす "ww" 等の文字列で指定する事も出来る。 亦、引数の数値には、将来の日時を取得するには正の数を指定し、過去の日時を取得するには負の数を 指定する。猶、引数のインターバルで時、分、秒が指定されて居る場合は、小数部分を含む事が出来る が、其他の場合は、引数の数値の小数部分は無視される。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
StrConv 関数に依る文字列の変換 文字列を変換する関数 StrConv(文字列, 変換タイプ, [ロケール]) 指定に従って変換された文字列型の値を返す 引数の文字列には、変換元と成る文字列を指定し、必ず指定する。 引数の変換タイプには、Microsoft.VisualBasic.VbStrConv 列挙型の値を指定し、必ず指定する。 引数のロケールには、LocaleID 値を指定し、省略可能で有る。 変換タイプを示すMicrosoft.VisualBasic.VbStrConv 列挙型の代表的な値は、下記の通りで有る。 列挙型メンバ 説明 VbStrConv.None 変換は行われない。 VbStrConv.UpperCase 文字列を大文字に変換する。 VbStrConv.LowerCase 文字列を小文字に変換する。 VbStrConv.ProperCase 文字列の各単語の先頭の文字を大文字に変換する。 VbStrConv.Wide* 文字列内の半角文字を全角文字に変換する。 VbStrConv.Narrow* 文字列内の全角文字を半角文字に変換する。 VbStrConv.Katakana** 文字列内のひらがなをカタカナに変換する。 VbStrConv.Hiragana** 文字列内のカタカナをひらがなに変換する。 * アジアロケールに適用される。** ロケール設定が日本の場合而巳有効で有る。 Format 関数に依る文字列の整形 文字列を整形する関数 Format(式, [書式]) 書式指定文字列式の指示に従って書式設定された文字列を返す。 引数の式には、数値や日付の任意の有効な式を指定し、必ず指定する。 引数の書式には、既定、又は、ユーザー定義の書式指定文字列式を指定し、省略可能で有る。 引数の書式を指定せずに数値書式を指定する場合、ロケール情報に対応して居る点以外は、Format 関 数はStr 関数と同様に機能する。但し、Str 関数を使用して変換された正の数値には先頭にスペースが 付くが、Format 関数で文字列と仕て設定された正の数値には、先頭にプラス記号を表示する為のスペ ースは付かない。 引数の書式の作成方法に付いては、ヘルプの下記の項目を参照され度い。 書式指定の対象 方法 数値 定義済み数値書式、ユーザー定義の数値書式 日付/時刻 定義済みの日付/時刻書式、ユーザー定義の日付/時刻書式 機 能 書 式 解 説 機 能 書 式 解 説
Do文に依るループ処理 指定した条件が真の間、又は真に成る迄、一連の処理を行うステートメント 書式①(前判定型) Do {While|Until} 論理式 一連の処理 Loop 書式②(後判定型) Do 一連の処理 Loop {While|Until} 論理式
Do…Loop ステートメントは、Do ステートメントから Loop ステートメントの間に記述され た一連の処理を、論理式(条件式)が真(0以外)の間(While の場合)、又は、真に成る 迄(Until の場合)繰り返し(ループ)実行する。 前判断型では論理式が、While の場合には偽(0)の場合、亦、Until の場合には真の場合、一連の処 理は一度も実行されず、ループの次の処理に進む。其れに対して、後判定型では論理式の如何に拘わら ず少なくとも一度は一連の処理が実行される。猶、論理式を省略した場合には、無限ループと成る。 Exit Do ステートメントを使用すると、ループから強制的に抜け出す事が出来る。 Like 演算子に依る文字列の比較 文字列を比較する関数 結果 = 文字列 Like パターン 文字列とパターンを比較し、マッチする場合はTrue、マッチしない場合は False を返す。 戻り値の結果には、ブール型の変数を指定し、必ず指定する(条件式と仕て使用する場合は不要)。 引数の文字列には、比較の対象と成る任意の文字列を指定し、必ず指定する。 引数のパターンには、パターン一致規則に適合させる任意の文字列式を指定し、必ず指定する。
Like 演算子の動作は、Option Compare ステートメントの設定で決まる。各モジュールの既定の文字列 比較方法は、Option Compare Binary で有る。
パターン一致機能では、文字列比較にワイルドカード文字、指定文字の一覧、文字の範囲を組み合わせ て使う事が出来る。引数のパターンに使用出来る文字と、其れに一致する文字を、下記の表に示す。 引数のパターン内の文字 引数の文字列の一致 ? 任意の1 文字 * 0 個以上の文字 # 任意の1 桁(0~9) [charlist] charlist に含まれる任意の 1 文字 [!charlist] charlist に含まれない任意の 1 文字 機 能 書 式 解 説 機 能 書 式 解 説
Call ステートメントに依るサブルーチン呼出 他のプロシージャに制御を渡すステートメント Call プロシージャ名([引数リスト]) Sub プロシージャや Function プロシージャや DLL プロシージャを呼び出して実行する。実 行後は、Call ステートメントの次に記述されたステートメントに復帰する。 プロシージャ名には、呼び出すプロシージャの名前を指定し、必ず指定する。亦、プロシージャに引数 リストが定義されて居れば、其れに合わせて、引数リストを指定する。 プロシージャを呼び出す時、Call ステートメントは必ずしも記述する必要は無い。Call ステートメント を使用して、引数が必要なプロシージャを呼び出す場合は、引数リストを括弧(パーレン)で囲む必要 が有る。Call ステートメントを省略する時は、引数リストを囲む括弧も省略しなければ成らない。
For Each … Next 文に依る Contorols コレクションの操作
Visual Basic 6.0 の Controls コレクションは、フォームやコンテナコントロール上のコントロールを表 す要素を持つコレクションだったが、Visual Basic.NET 以降では、Controls コレクションの代わりに System.Windows.Forms.Control.ControlCollection クラスを使用する。フォームには、Me.Controls と謂う構文でアクセス出来る既定のControlCollection クラスが有る。
亦、Visual Basic 6.0 の Controls コレクションのメンバは、インデックスとコントロール名の孰れを使 用しても参照する事が出来たが、Visual Basic.NET 以降では、ControlCollection クラスはインデック ス而巳をサポートし、コントロール名での参照は出来ない(非常に不便で有る)。
Visual Basic 6.0 以前 Me.Controls("txtTitle").Text
Visual Basic.NET 以降 Me.Controls(Me.Controls.IndexOf(txtTitle)).Text
Visual Basic 6.0 では、コントロール配列が使用して、配列変数と同様に、同じ名前のコントロールを インデックスで区別して使用する事が出来たが、Visual Basic .NET 以降では、コントロール配列はサ ポートされて居ない。其の為、デザイン時に作成した一連のコントロールを、従来のコントロール配列 の様に操作するには、For Each … Next 文に依るコレクションの操作が必要と成る。
下記に、フォームに配置されたlbl と謂うプレフィックスを持つコントロール(ラベル)総てに対して 同じ処理を行う例を示す。
Dim C As Control
For Each C In Me.Controls ' フォームのコントロールのコレクションから要素を取り出す。 If C.Name Like "lbl*" Then ' オブジェクト名が lbl で始まるか判別する
処理 End If Next ' 次の要素に進む。 猶、デザイン時にコントロールを作成するのでは無く、実行時にコードでコントロールを生成する場合 は、此等をControl 型の配列変数に参照を格納する事に依り、従来のコントロール配列と同様に扱う事 も出来る。 機 能 書 式 解 説
日時操作に関するVisual Basic 言語の関数等 (参考) 日時を操作するVisual Basic 言語のキーワードとランタイムライブラリメンバを、目的と使用方法別に 示す。 処理 言語要素 現在の日付・時刻の取得 Today、Now、TimeOfDay 日付計算の実行 DateAdd、DateDiff、DatePart 日付の取得 DateSerial、DateValue、MonthName、WeekDayName 時刻の取得 TimeSerial、TimeValue 日付・時刻の設定 DateString、TimeOfDay、TimeString、Today 処理時間の計測 Timer 算術演算子 比較演算子 論理演算子 1.^ 冪乗 1.= 等しい 1.Not 否定 2.- 負数 2.<> 等しくない 2.And 論理積 3.*、/ 乗算と除算 3.< より小さい 3.Or 論理和 4.¥ 整数除算 4.> より大きい 4.Xor 排他的論理和 5.Mod 剰余 5.<= 以下 5.Eqv 同値 6.+、- 加算と減算 6.>= 以上 6.Imp 包合 算術演算子と論理演算子では、複数の演算子が使用されて居る場合には、頭に付けた番号の順序で 演算が行われる(上に書かれて居る演算子程優先順位が高い)。
Visual Basic 6.0 以前では、Date 型は、8 バイトを使用して Double 形式で格納されたが、Visual Basic.NET 以降では、Date 型は共通言語ランタイムの DateTime 型を使用する。此の型は、8 バ イトの整数値で有る。此等の表現の相違の為、Date 型と Double 型の間で暗黙の型変換は行われな い。Double と Visual Basic 6.0 表記の Date の間で型変換を実行するには、System 名前空間の DateTime 構造体の ToOADate メソッドと FromOADate メソッドを使用する。
DateTime 値型は、紀元 1 年 1 月 1 日の 00:00:00 から紀元 9999 年 12 月 31 日の 23:59:59 迄の間 の値で、日付と時刻を表す。時刻値は100 ナノ秒単位(タイマ刻み)で表し、日付はグレゴリオ暦 の 紀 元 1 年 1 月 1 日 の 00:00 か ら の タ イ マ 刻 み 数 で 表 す 。 例 え ば 、 タ イ マ 刻 み 値 31241376000000000L は、紀元 100 年 1 月 1 日(金曜日)の 00:00:00 を表す。 DateTime 値は、 常に、明示的な暦、又は、既定の暦のコンテキストで表される。 DateTime 構造体には、日時を扱う上で有用な数多くのプロパティやメソッドが定義されて居る。 此の型の総てのメンバの一覧に付いては、『DateTime メンバ』を参照され度い。
.NET Framework 対応 ■ 年月日の取得 従来の記述法 Y = Now.Year M = Now.Month D = Now.Day .NET Framework の記述法 Y = DateTime.Now.Year M = DateTime.Now.Month D = DateTime.Now.Day
.NET Framework では、年月日を取得するには、モジュールメンバの Now プロパティではなく、 DateTime 構造体の Now プロパティを使用する。
従来の記述法では、Microsoft.VisualBasic 名前空間の DateAndTime モジュールの Now プロパティが 使用され(アセンブリは、Visual Basic Runtime Library - Microsoft.VisualBasic.dll)、.NET Framwork の記述法では、System 名前空間の DateTime 構造体の Now プロパティが使用される(アセンブリは、 mscorlib - mscorlib.dll)。同じ名前でも、両者は、異なる物で有る。
■ 日付の書式設定 従来の記述法
lblToday.Text = StrConv(Format(Now, "yyyy 年 MM 月 dd 日"), VbStrConv.Wide) txtYear.Text = Format(Now, "yyyy")
txtMonth.Text = Format(Now, "%M") .NET Framework の記述法
lblToday.Text = StrConv(DateTime.Now.ToString("yyyy 年 MM 月 dd 日"), VbStrConv.Wide) txtYear.Text = DateTime.Now.ToString("yyyy")
txtMonth.Text = DateTime.Now.ToString("%M")
.NET Framework では、日付の書式設定には、Format 関数ではなく、DateTime 構造体の ToString メソッドを使用する(タイマーの処理ルーチンも同じ)。
猶、.NET Framework では、StrConv 関数の様に、半角文字を全角文字に変換したり、全角文字を半 角文字に変換する手段は提供されて居ない(此の様な事を行う必要が有る場合には、従来の関数やAPI 関数を使用するか、又は、自作のコードで対処する必要が有る)。 ■ タイマーの始動・停止 従来の記述法 tmrGame.Enabled = False tmrGame.Enabled = True .NET Framework の記述法 tmrGame.Stop() tmrGame.Start()
.NET Framework では、タイマーの始動・停止には、Start メソッドや Stop メソッドを使用するも出 来る(孰れも、結果は同じで有る)。
■ 文字列の部分一致
従来の記述法
If C.Name Like "lblDay*" Then .NET Framework の記述法
If C.Name.StartsWith("lblDay") Then
.NET Framework では、文字列の部分一致の検証には、String クラスの様々なメソッドを使用するが 出来る。 前方一致の場合は、上記の StartsWith メソッド、後方一致の場合は、EndsWith メソッド、部分一致 の場合は、Contains メソッドが提供されて居る。 猶、.NET Framework には、種々のパターン(例えば、メールアドレスや電話番号等)に合致するか検 証するには、Regex クラスが提供されて居る。 此の正規表現を簡易に行う事が出来るのが、Like 演算子で有り、Basic 固有の演算子では有るが、有用 な演算子で有り、Visual Basic でプログラミングして居る場合、特に書き直す必要は無い。 ■ 文字列の数値化 従来の記述法 N = Val(C.Name.Substring(6)) .NET Framework の記述法 N = Integer.Parse(C.Name.Substring(6))
.NET Framework では、文字列を数値化するには、変換後のデータ型を表すクラスの Parse メソッド を使用する。 但し、Val 関数は、文字列を先頭から評価して行き、数値と仕て評価出来る処迄を数値化して返し、数 値と仕て評価出来ない場合は0 を返すと謂う柔軟性が有るが、Parse メソッドでは、文字列が、変換後 のデータ型と合致しない場合は、例外(エラー)が発生する。 其の為、入力された文字列を数値化する場合等では、入力された文字列が、変換後のデータ型と合致す るか検証する為、TryParse メソッドを使用する必要が有る場合が多い。 但し、上記では、コントロール名を正しく付けて居れば、7 文字目(インデックスは 6)以降は、必ず 整数値なので、変換後のデータ型と合致するかの検証は、必要が無いが、下記では、ユーザーの入力の 検証を行う必要が有る。 従来の記述法 Y = Val(txtYear.Text) M = Val(txtMonth.Text) .NET Framework の記述法
If Not Integer.TryParse(txtYear.Text, Y) Then Exit Sub If Not Integer.TryParse(txtMonth.Text, M) Then Exit Sub
■ 日付の作成 従来の記述法
Call DispCalendar(DateSerial(Y, M, 1)) .NET Framework の記述法
Call DispCalendar(New DateTime(Y, M, 1))
.NET Framework では、日付を作成するには、DateSerial 関数ではなく、DateTime 構造体のコンス トラクタを使用する。 ■ 日付の曜日の取得 従来の記述法 W = Weekday(F) .NET Framework の記述法 W = F.DayOfWeek
.NET Framework では、配列の最大要素番号を取得するには、Weekday 関数ではなく、DateTime オ ブジェクトのDayOfWeek プロパティを使用する。 孰れも、日曜日を最初とする数値を返すが、Weekday 関数が 1 から、DayOfWeek プロパティは 0 から の値を返す事に注意を要する。 ■ 数値の文字列化 従来の記述法 Me.grpCalendar.Controls(LI(P)).Text = CStr(I + 1) .NET Framework の記述法 Me.grpCalendar.Controls(LI(P)).Text = (I + 1).ToString()
.NET Framework では、数値の文字列化には、CStr 関数ではなく、各クラスの ToString メソッドを使 用する。
■ 日付の加算 従来の記述法
Loop Until DateAdd(DateInterval.Day, I, F).Day = 1 .NET Framework の記述法
Loop Until F.AddDays(I).Day = 1
.NET Framework では、日付の加算には、DateAdd 関数ではなく、DateTime オブジェクトの AddDays メソッドを使用する。 ■ アプリケーションの終了 従来の記述法 End .NET Framework の記述法 Application.Exit() 現在実行して居るアプリケーションは、Application オブジェクトで表されるので、其の Exit メソッド を用いて、アプリケーションを終了する。