プログラムの概要
年月をテキストボックスで指定した後、表示ボタンをクリック して、指定した年月のカレンダーを表示する。 画面上部のグループボックスでは、現在の年月日と時間をリア ルタイムで表示する。此の場合、時間丈でなく、日付が変われ ば、日付もリアルタイムで変化する。 指定した年月のカレンダーを表示するには、日付と時間を扱う 組込関数を使用し、亦、日付と時間をリアルタイム表示するに は、一定時間間隔で日時の変化を監視する為に、タイマーを使 用する。万年暦プログラム
C# 2005 ⑦ □ 単純変数の宣言(Private、Dim) □ 標準コントロールの利用(Label、GroupBox、TextBox、Button、Timer) □ プロパティのり様(Year、Month、Day、DayOfWeek、Text、Enabled、BackColor 等) □ イベントの利用(Load、Click、Tick) □ メソッド(型変換)の利用(System.Convert.ToInt32) □ メソッド(日付時間)の利用(DateTime.AddDays) □ メソッド(整形出力)の利用(DateTime.ToString) □ 演算子(代入演算子、算術演算子、比較演算子) □ 制御構造構文(条件分岐、ループ処理) □ 自作メソッド(ジェネラルプロシージャ、引数) 今回の課題項目 □ 変数の適用範囲(スコープ:モジュールレベル、プロシージャレベル) □ if 文に依る条件分岐(if ( ~ ) { … } else { … } )□ for 文に依るループ処理(for( counter=start; condition; increment ) { … } ) □ foreach 文に依るループ処理(foreach ( element In group ) { … }、break ) □ do 文に依るループ処理(do { … } while( ~ ); ) □ 日付と時間の処理(Year、Month、Day、DayOfWeek、AddDays、ToString) 今回の重点項目 □ 画像を貼り付けられる様にしてビジュアルな面を改良する。 □ テキストボックスへの入力に於けるマンマシンインターフェイスを改良する。 今回の応用項目
■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム 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ボタンや実行ボタ ン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールで有る。 ボタンが押し下げられた様に外観が変わる為、プッシュボタンとも謂う。 タイマー 一定の時間間隔でイベントが発生する様にするコントロール。一定時間毎にプログラムを実行 したい時に使用する。此のコントロールは、実行時には表示されない。
■ プログラムリスト ■ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace calendar {
public partial class calendar : Form {
// フォームレベルでグローバルな変数の宣言 private int[ ] li = new int[ 37 ];
private int y, m, d; public calendar( ) { InitializeComponent( ); } // フォームが読み込まれた時の処理
private void calendar_Load( object sender, EventArgs e ) { int n, i; // 起動した時の日付の取得 y = DateTime.Now.Year; m = DateTime.Now.Month; d = DateTime.Now.Day; // ラベルとテキストボックスに日付の表示
lblToday.Text = DateTime.Now.ToString( "yyyy 年 MM 月 dd 日" ); txtYear.Text = DateTime.Now.ToString( "yyyy" );
txtMonth.Text = DateTime.Now.ToString( "%M" );
// ラベルの背景色の透明化
foreach ( Control c in this.grpNow.Controls ) {
c.BackColor=Color.Transparent; }
foreach( Control c in this.grpCalendar.Controls ) { c.BackColor=Color.Transparent; } 此処で宣言した変数は同じフォー ム内の総てのサブプロシージャで 値の参照と設定を行う事が可能。 ネームスペース(名前空間)の使 用を宣言して居る。 此の部分は、エディタが、自動的 に記述して下れる。 クラスを生成する為のコンストラ クタで有る。 此の部分は、エディタが、自動的 に記述して下れる。 配列変数(アレー)の宣言 単純変数(スカラー)の宣言 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 書式を指定した形式に変換するに は、DateTime 構造体の ToString メソッドを使用する。 DateTime 構造体の Nowメンバは 現在の日時を示す。日付丈の場合 はToday を用いる事も出来る。 foreach は、配列やコレクション から、総ての要素を1個宛取り出 す構文で有る。
// 日付用ラベルのインデックス取得
foreach ( Control c in this.grpCalendar.Controls ) { if ( c.Name.Contains( "lblDay" ) ) { n = System.Convert.ToInt32( c.Name.Substring( 6 ) ); li[ n ] = this.grpCalendar.Controls.IndexOf( c ); } } // 日曜日と土曜日の表示色の設定 for ( i = 0; i < 36; i += 7 ) {
this.grpCalendar.Controls[ li[ i ] ].ForeColor = Color.Red; }
for ( i = 6; i < 35; i += 7 ) {
this.grpCalendar.Controls[ li[ i ] ].ForeColor = Color.Blue; }
// カレンダーを表示するメソッド(プロシージャ)の呼出 DispCalendar( new DateTime( y, m, 1 ) );
// タイマーの有効化 tmrTimer.Enabled = true; } // ボタン(表示)がクリックされた時の処理
private void btnDisp_Click( object sender, EventArgs e ) { // 年月をテキストボックスより取得 y = System.Convert.ToInt32( txtYear.Text ); m = System.Convert.ToInt32( txtMonth.Text ); // カレンダーを表示するメソッド(プロシージャ)の呼出 DispCalendar( new DateTime( y, m, 1 ) );
}
// ボタン(終了)がクリックされた時の処理
private void btnFinish_Click( object sender, EventArgs e ) { tmrTimer.Enabled = false; this.Dispose( ); Application.Exit( ); } 此のループ処理ではカウンターi の値を0 から 35 に 7 宛変化させ て、ブロック内の処理を繰り返す。 色を指定するには、Color 構造体 で定義されて居る定義色を使用す ると解り易い。 同じ処理を複数の箇所で行う時は メソッド化すると記述の手間を省 ける丈でなく、メンテナンス面で も有効で有る。 自作メソッドも、組込メソッドと 同様に呼び出す事が出来る。 年月日を指定してDateTime 型の 新しいインスタンスを作成し、其 れを引数に与えて居る。 アプリケーションを終了する場 合、正しくプログラムをメモリか ら消去して終了する。 アプリケーションを終了する場 合、使用したタイマーは無効にし て終了する事が望ましい。
// タイマーが一定間隔で行う処理
private void tmrTimer_Tick( object sender, EventArgs e ) { // ラベルに時間を表示 lblTime.Text = DateTime.Now.ToString( "HH 時 mm 分 ss 秒" ); // 日付が変更した場合の処理 if ( DateTime.Now.Day != d ) {
lblToday.Text = DateTime.Now.ToString( "yyyy 年 MM 月 dd 日" ); d = DateTime.Now.Day;
} }
private void DispCalendar( DateTime f ) { int w, p, i; // カレンダー表示用ラベルのテキスト消去 for ( i = 0; i < 37; i++ ) {
this.grpCalendar.Controls[ li[ i ] ].Text = ""; } // 当月の第1日の曜日の取得 w = System.Convert.ToInt32( f.DayOfWeek ); p = w; // カレンダーの表示 i = 0; do {
this.grpCalendar.Controls[ li[ p++ ]].Text = System.Convert.ToString( ++i ); } while ( f.AddDays( (double)i ).Day != 1 );
} } } サブルーチン化の効用 ジェネラルプロシージャ(ユーザー定義プロシージャ、C#や Java ではメソッド、C/C++では 関数と呼ぶ)は、主に、複数のイベントプロシージャで同じ様な処理が必要と成る場合に、共 通コードを記述する為に使用する事が多いが、当該ルーチンに訂正や追加等を行う場合、複数 箇所を書き直すのではなく、一箇所而巳を書き直す丈で済む等、メンテナス面でも有用である。 此の様な手法を『サブルーチン化』と呼ぶ。 !=演算子は、否定を意味する。 A != B : AとBは異なる DispCalendar は、DateTime 型の 引数をf と謂う変数名で受け取る ユーザ定義のメソッドで有る。 回数を指定しないでループ処理を 行う時にはdo 文を使用する。 此のループ処理ではカウンターi の値を0 から 36 に 1 宛変化させ て、ブロック内の処理を繰り返す。 変数P は、何番目の日付用コント ロールから表示を開始するかを示 すポインタで有る。 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 ++は、値を 1 増加させる単項演算 子で有る。++A の形は式を評価す る前に、A++の形は式を評価した 後、インクリメントする。
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 迄の間の日で有る。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
DateTime 構造体の DayOfWeek プロパティに依る曜日の取得 日付の曜日を取得するプロパティ Object.DayOfWeek DateTime 型のオブジェクトの日付から曜日を取得する。 プロパティ値は、0(日曜日)から 6(土曜日)迄の間の曜日で有る(DayOfWeek 列挙体)。 メンバ名 説明 値 Sunday 日曜日 0 Monday 月曜日 1 Tuesday 火曜日 2 Wednesday 水曜日 3 Thursday 木曜日 4 Friday 金曜日 5 Saturday 土曜日 6 DateTime コンストラクタに依る DateTime 型の日付の生成 年、月、日に依りDateTime 構造体の新しいインスタンスを初期化するコンストラクタ new DateTime(年, 月, 日) 引数で指定した年、月、日に対応する日付のDateTime 型のインスタンスを得る。個々に入 力された値から日付を作成する時に使用する。 年には、年を表す値(1~9999の範囲)を指定し、省略する事は出来ない。 月には、月を表す値(1~12の範囲の整数値)を指定し、省略する事は出来ない。 日には、日を表す値(1~当該月の日数の範囲の整数値)を指定し、省略する事は出来ない。 結果と仕て得られるDateTime の時刻は深夜(00:00:00)と成る。猶、時刻や暦の種類(グレゴリオ暦 和暦等)を指定するオーバーロードも用意されて居る。 DateTime 構造体の AddDays メソッドに依る日数の加算 日時を加減した値を得るメソッド Object.AddDays( 日数 ) 指定された時間間隔を加算した日付と時刻をDateTime 型の値で返す。 日数には、加算する日数を表す浮動小数点数式(double 型)を指定し、必ず指定する。 亦、日数値には、将来の日時を取得するには正の数を指定し、過去の日時を取得するには負の数を指定 する。猶、小数部は、1 日の端数を表わし、例えば、3.5 は 3 日と 12 時間を意味する。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
DateTime 構造体の ToString メソッドに依る書式付き変換 日時を書式付きで文字列に変換するメソッド Object.ToString( 書式 ) 書式指定文字列式の指示に従って書式設定された文字列を返す。 書式には、既定、又は、ユーザー定義の書式指定文字列式を指定する。 日付と時刻の書式指定文字列の代表的な物を、下記に示す。 標準のDateTime 書式指定文字列 書式指定子 名前 d 短い形式の日付パターン D 長い形式の日付パターン t 短い形式の時刻パターン T 長い形式の時刻パターン f 完全な日付と時刻のパターン(短い形式の時刻) F 完全な日付と時刻のパターン(長い形式の時刻) g 一般の日付と時刻のパターン(短い形式の時刻) G 一般の日付と時刻のパターン(長い形式の時刻) M 又は m 月日パターン R 又は r RFC1123 パターン s 並べ替え可能な日付と時刻のパターン(ISO 8601 準拠) u 並べ替え可能な日付と時刻のパターン(世界時刻) U 並べ替え可能な日付と時刻のパターン(世界時刻) Y 又は y 年月パターン 其の他の1 文字 未定義の指定子 カスタムDateTime 書式指定文字列 書式指定子 説明 d 現在の日が1~31 迄の数値で表示される。1 桁の日(1~9)は、1 桁の数値として表 示される。※ dd 現在の日が1~31 迄の数値で表示される。1 桁の日(1~9)の場合、前に 0 が追加さ れた書式(01~09)に設定される。 ddd 指定されて居るDateTime の曜日の省略名が表示される。 dddd 指定されて居るDateTime の曜日の完全な名前が表示される。 g 指定されて居るDateTime の紀元(A.D.等)が表示される。※ h 指定されて居るDateTime の時間が、1~12 の数値で表示される。1 桁の時間(1~9) は、1 桁の数値として表示される。 hh 指定されて居るDateTime の時間が、1~12 の数値で表示される。1 桁の時間(0~9) の場合は、前に0 が追加された書式(01~09)に設定される。 H 指定されて居るDateTime の時間が、0~23 の数値で表示される。1 桁の時間(0~9) は、1 桁の数字として表示される。 HH 指定されて居るDateTime の時間が、0~23 の数値で表示される。1 桁の時間(0~9) の場合は、前に0 が追加された書式(01~09)に設定される。 機 能 書 式 解 説
m 指定されて居るDateTime の分数が、0~59 の数値で表示される。1 桁の分数(0~9) は、1 桁の数字として表示される。※ mm 指定されて居るDateTime の分数が、0~59 の数値で表示される。1 桁の分数(0~9) の場合、前に0 が追加された書式(01~09)に設定される。 M 月が1~12 の数値で表示される。1 桁の月(1~9)は、1 桁の数値として表示される。 ※ MM 月が1~12 の数値で表示される。1 桁の月(1~9)の場合、前に 0 が追加された書式 (01~09)に設定される。 MMM 指定されて居るDateTime の月の省略名が表示される。 MMMM 指定されて居るDateTime の月の完全な名前が表示される。 s 指定されて居るDateTime の秒数が、0~59 の数値で表示される。1 桁の秒数(0~9) は、1 桁の数字として丈表示される。※ ss 指定されて居るDateTime の秒数が、0~59 の数値で表示される。1 桁の秒数(0~9) の場合、前に0 が追加された書式(01~09)に設定される。 t 指定されて居るDateTime の A.M.又は P.M.指定子の 1 番目の文字が表示される。※ tt 指定されて居るDateTime の A.M.又は P.M.指定子が表示される。 y 指定されて居るDateTime の年が、1 桁又は 2 桁の数値として表示される。西暦年の 最初の2 桁は省略される。1 桁の年(1~9)は、1 桁の数値として表示される。※ yy 指定されて居るDateTime の年が、1 桁又は 2 桁の数値として表示される。西暦年の 最初の2 桁は省略される。1 桁の年(1~9)の場合、前に 0 が追加された書式(01~ 09)に設定される。 yyyy 指定されて居るDateTime の年が、最初の 2 桁も含めた 4 桁の形式で表示される。年 が3 桁以下の場合には、4 桁に成る様に年の前に 0 が追加される。 : 時刻の区切り記号。 / 日付の区切り記号。 " 引用符で囲まれた文字列。エスケープ文字( / )の後に続く 2 つの引用符で囲まれた 文字列のリテラル値が表示される。 ' 引用符で囲まれた文字列。2 つの一重引用符( ' )で囲まれた文字列のリテラル値が 表示される。 %c c は標準書式指定子で有ると同時にカスタム書式指定子で有る。此の書式指定子に関連 付けられて居るカスタム書式指定パターンが表示される。※ ¥c c は任意の文字で有る。エスケープ文字の後に指定されて居る文字をリテラルとして表 示する。コンテキスト内でエスケープシーケンス(改行を示す¥n 等)を作成するには、 此のエスケープ文字は使用出来ない。 其他の文字 其他の文字は、リテラルとして結果の文字列に直接書き込まれる。 ※ 此等の書式指定子が、単独で使用されて居り、其他のカスタム書式指定文字列が使用されて居ない 場合には、此等の書式指定子は標準の DateTime 書式指定子として解釈される。此等の書式指定子 が他のカスタム書式指定子、又は、% 文字と共に渡される場合、此等の書式指定子はカスタム書式 指定子として解釈される。 引数の書式の作成方法に付いては、ヘルプの下記の項目を参照され度い。 書式指定の対象 方法 全般 書式設定の概要 日付/時刻 標準のDateTime 書式指定文字列、カスタム DateTime 書式指定文字列
do 文に依るループ処理 指定した条件が真の間、一連の処理を行うステートメント do { 一連の処理; } While( 論理式 ); do ステートメントは、論理式(条件式)が真(true)の間、ステートメント、又は、ステー トメントブロックに記述された一連の処理を繰り返し(ループ)実行する。 while ステートメントとは異なり、do ステートメント本体のループは、式の値に関係無く、最低 1 回は 実行される(後判定型)。猶、論理式を省略した場合には、無限ループと成る。 break、goto、return、throw ステートメントを使用して、ループの外側に制御を移すと、ループから 強制的に抜け出す事が出来る。 亦、ループを終了せずに制御を次の繰り返しに移動させるには、continue ステートメントを使用する。 while 文に依るループ処理 (参考) 指定した条件が真の間、一連の処理を行うステートメント While( 論理式 ) { 一連の処理; } while ステートメントは、論理式(条件式)が真(true)の間、ステートメント、又は、ス テートメントブロックに記述された一連の処理を繰り返し(ループ)実行する。 論理式(条件式)が評価されてからループが実行されるので、while ループは、論理式が最初から偽(false) の場合、1 度もループ内の処理を実行しない。此の点が、最低 1 回はループ内の処理を実行する do ル ープとは異なる。 break、goto、return、throw、continue ステートメントに付いては、do ステートメントに同じ。 機 能 書 式 解 説 機 能 書 式 解 説 goto ステートメントの使用に関する注意 goto ステートメントは、プログラムの制御を指定したラベルに直接移動する無条件分岐命令で有る が、安易に使用すると、プログラムの流れ(フロー)が解り難く成り、所謂『スパゲティプログラ ム』と忌み嫌われるプログラムに成る可能性が大きい。 充分な制御構造が用意されて居なかった初期の言語では、多用されたが、構造化プログラミングが 定着した現在の言語では、goto ステートメントを使用しない方法を考えた方が良い。
foreach 文に依る Contorols コレクションの操作
Visual Studio 6.0 の Controls コレクションは、フォームやコンテナコントロール上のコントロールを 表す要素を持つコレクションだったが、Visual Studio.NET 以降では、Controls コレクションの代わり にSystem.Windows.Forms.Control.ControlCollection クラスを使用する。フォームには、this.Controls と謂う構文でアクセス出来る既定のControlCollection クラスが有る。
亦、Visual Studio 6.0 の Controls コレクションのメンバは、インデックスとコントロール名の孰れを 使用しても参照する事が出来たが、Visual Studio.NET 以降では、ControlCollection クラスはインデッ クス而巳をサポートし、コントロール名での参照は出来ない(非常に不便で有る)。
Visual Studio 6.0 以前 this.Controls("txtTitle").Text
Visual Studio.NET 以降 this.Controls(this.Controls.IndexOf(txtTitle)).Text
Visual Studio 6.0 では、コントロール配列が使用して、配列変数と同様に、同じ名前のコントロールを インデックスで区別して使用する事が出来たが、Visual Studio.NET 以降では、コントロール配列はサ ポートされて居ない。其の為、デザイン時に作成した一連のコントロールを、従来のコントロール配列 の様に操作するには、foreach 文に依るコレクションの操作が必要と成る。 下記に、フォームに配置されたlbl と謂うプレフィックスを持つコントロール(ラベル)総てに対して 同じ処理を行う例を示す。 foreach(Control C in this.Controls ) ' フォームのコントロールのコレクションから要素を抽出 { if ( c.Name.Contains("lbl") ) ' オブジェクト名が lbl で始まるか判別 処理 End If
}
' 次の要素に移行 猶、デザイン時にコントロールを作成するのでは無く、実行時にコードでコントロールを生成する場合 は、此等をControl 型の配列変数に参照を格納する事に依り、従来のコントロール配列と同様に扱う事 も出来る。Visual Basic 6.0 以前では、Date 型は、8 バイトを使用して Double 形式で格納されたが、Visual Basic.NET 以降では、Date 型は共通言語ランタイムの DateTime 型を使用する。此の型は、8 バ イトの整数値で有る。 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 メンバ』を参照され度い。