+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-\r
-namespace FDK\r
-{\r
- /// <summary>\r
- /// 一定間隔で単純増加する整数(カウント値)を扱う。\r
- /// </summary>\r
- public class CCounter\r
- {\r
- // 値プロパティ\r
-\r
- public int n開始値\r
- {\r
- get;\r
- private set;\r
- }\r
- public int n終了値\r
- {\r
- get;\r
- private set;\r
- }\r
- public int n現在の値\r
- {\r
- get;\r
- set;\r
- }\r
- public long n現在の経過時間ms\r
- {\r
- get;\r
- set;\r
- }\r
-\r
-\r
- // 状態プロパティ\r
-\r
- public bool b進行中\r
- {\r
- get { return ( this.n現在の経過時間ms != -1 ); }\r
- }\r
- public bool b停止中\r
- {\r
- get { return !this.b進行中; }\r
- }\r
- public bool b終了値に達した\r
- {\r
- get { return ( this.n現在の値 >= this.n終了値 ); }\r
- }\r
- public bool b終了値に達してない\r
- {\r
- get { return !this.b終了値に達した; }\r
- }\r
-\r
-\r
- // コンストラクタ\r
-\r
- public CCounter()\r
- {\r
- this.timer = null;\r
- this.n開始値 = 0;\r
- this.n終了値 = 0;\r
- this.n間隔ms = 0;\r
- this.n現在の値 = 0;\r
- this.n現在の経過時間ms = CTimer.n未使用;\r
- }\r
-\r
- /// <summary>生成と同時に開始する。</summary>\r
- public CCounter( int n開始値, int n終了値, int n間隔ms, CTimer timer )\r
- : this()\r
- {\r
- this.t開始( n開始値, n終了値, n間隔ms, timer );\r
- }\r
-\r
-\r
- // 状態操作メソッド\r
-\r
- /// <summary>\r
- /// カウントを開始する。\r
- /// </summary>\r
- /// <param name="n開始値">最初のカウント値。</param>\r
- /// <param name="n終了値">最後のカウント値。</param>\r
- /// <param name="n間隔ms">カウント値を1増加させるのにかける時間(ミリ秒単位)。</param>\r
- /// <param name="timer">カウントに使用するタイマ。</param>\r
- public void t開始( int n開始値, int n終了値, int n間隔ms, CTimer timer )\r
- {\r
- this.n開始値 = n開始値;\r
- this.n終了値 = n終了値;\r
- this.n間隔ms = n間隔ms;\r
- this.timer = timer;\r
- this.n現在の経過時間ms = this.timer.n現在時刻;\r
- this.n現在の値 = n開始値;\r
- }\r
-\r
- /// <summary>\r
- /// 前回の t進行() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。\r
- /// カウント値が終了値に達している場合は、それ以上増加しない(終了値を維持する)。\r
- /// </summary>\r
- public void t進行()\r
- {\r
- if ( ( this.timer != null ) && ( this.n現在の経過時間ms != CTimer.n未使用 ) )\r
- {\r
- long num = this.timer.n現在時刻;\r
- if ( num < this.n現在の経過時間ms )\r
- this.n現在の経過時間ms = num;\r
-\r
- while ( ( num - this.n現在の経過時間ms ) >= this.n間隔ms )\r
- {\r
- if ( ++this.n現在の値 > this.n終了値 )\r
- this.n現在の値 = this.n終了値;\r
-\r
- this.n現在の経過時間ms += this.n間隔ms;\r
- }\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// 前回の t進行Loop() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。\r
- /// カウント値が終了値に達している場合は、次の増加タイミングで開始値に戻る(値がループする)。\r
- /// </summary>\r
- public void t進行Loop()\r
- {\r
- if ( ( this.timer != null ) && ( this.n現在の経過時間ms != CTimer.n未使用 ) )\r
- {\r
- long num = this.timer.n現在時刻;\r
- if ( num < this.n現在の経過時間ms )\r
- this.n現在の経過時間ms = num;\r
-\r
- while ( ( num - this.n現在の経過時間ms ) >= this.n間隔ms )\r
- {\r
- if ( ++this.n現在の値 > this.n終了値 )\r
- this.n現在の値 = this.n開始値;\r
-\r
- this.n現在の経過時間ms += this.n間隔ms;\r
- }\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// カウントを停止する。\r
- /// これ以降に t進行() や t進行Loop() を呼び出しても何も処理されない。\r
- /// </summary>\r
- public void t停止()\r
- {\r
- this.n現在の経過時間ms = CTimer.n未使用;\r
- }\r
-\r
-\r
- // その他\r
-\r
- #region [ 応用:キーの反復入力をエミュレーションする ]\r
- //-----------------\r
-\r
- /// <summary>\r
- /// <para>「bキー押下」引数が true の間中、「tキー処理」デリゲート引数を呼び出す。</para>\r
- /// <para>ただし、2回目の呼び出しは1回目から 200ms の間を開けてから行い、3回目以降の呼び出しはそれぞれ 30ms の間隔で呼び出す。</para>\r
- /// <para>「bキー押下」が false の場合は何もせず、呼び出し回数を 0 にリセットする。</para>\r
- /// </summary>\r
- /// <param name="bキー押下">キーが押下されている場合は true。</param>\r
- /// <param name="tキー処理">キーが押下されている場合に実行する処理。</param>\r
- public void tキー反復( bool bキー押下, DGキー処理 tキー処理 )\r
- {\r
- const int n1回目 = 0;\r
- const int n2回目 = 1;\r
- const int n3回目以降 = 2;\r
-\r
- if ( bキー押下 )\r
- {\r
- switch ( this.n現在の値 )\r
- {\r
- case n1回目:\r
-\r
- tキー処理();\r
- this.n現在の値 = n2回目;\r
- this.n現在の経過時間ms = this.timer.n現在時刻;\r
- return;\r
-\r
- case n2回目:\r
-\r
- if ( ( this.timer.n現在時刻 - this.n現在の経過時間ms ) > 200 )\r
- {\r
- tキー処理();\r
- this.n現在の経過時間ms = this.timer.n現在時刻;\r
- this.n現在の値 = n3回目以降;\r
- }\r
- return;\r
-\r
- case n3回目以降:\r
-\r
- if ( ( this.timer.n現在時刻 - this.n現在の経過時間ms ) > 30 )\r
- {\r
- tキー処理();\r
- this.n現在の経過時間ms = this.timer.n現在時刻;\r
- }\r
- return;\r
- }\r
- }\r
- else\r
- {\r
- this.n現在の値 = n1回目;\r
- }\r
- }\r
- public delegate void DGキー処理();\r
-\r
- //-----------------\r
- #endregion\r
-\r
- #region [ private ]\r
- //-----------------\r
- private CTimer timer;\r
- private int n間隔ms;\r
- //-----------------\r
- #endregion\r
- }\r
-}
\ No newline at end of file