[[BORLAND C++ CWCC]]
RETURN
CWCC#06 CWCC AlphaSecond Revision
とりあえず、現行の進行計画から,(以前の案から若干変更)
α2版:Version 0.4.x タイマ+α
β版:Version 0.5.x グラフィックウインドウ+ とりあえず、計画に有った全機能の取り込み
正式版: Version 1.0.0 β版のバグFIX版

さて、クラスライブラリと言いながら、ユーザから、使えるクラスが無いのでは、クラスライブラリとは言えないのだ。とりあえず、クラスを使っているから、クラスを使ったライブラリ…とは言えるが、クラスライブラリでは無いのである。本当の所を言うと、CwccMain()を、CwccThreadクラスに取り込んで、CwccThread::CwccMain()として記述する案も有ったのだが、これでは、自分が納得行かなかったのである。CwccMain()は、あくまでも、int CwccMain(char *) でなくてはならないのだ。今までの経緯と、互換性を考えても、これは正当な言い分だろう?さて、では、クラスライブラリという名前は捨てるのか??というと、それは違う。現状の流れは変えずに、今後必要になるであろうタイマやグラフィックウインドウについては、ここからクラスにて提供していくのである。

α−2版ライブラリのダウンロード
ライブラリの版数は、0.4.10
※サンプル入(シリアルクラスについてはローカルにて試験した)
(ソースは、暗号化されているので、メールにて、デコーダを入手して下さい)

  • メニューアイテムのコントロール
    実は、これ、前回の入れ忘れなのである。CwccThreadクラスに、メニューのコントロールを追加した。メニューアイテムのグレーアウト方法については、本編の6.にて、小技として書いているので、割愛する。

  • タイマの設計
    タイマに関して、操作方法は、本編の10.にて書いている通りである。精度については、ちょっと??なのであるが、それ程精度を要しない部分には利用出来るだろうか? 問題はタイマファンクションである。Cwcc側で用意したタイマファンクションを利用しても良いが、ユーザがタイマハンドラをデザインしたい…という要望は、必ず有ると思うので、ライブラリとしては、基本クラスを使って設計し、タイマファンクション部分は、仮想関数として、デフォルトのものを用意しておく。ユーザが基本クラスをそのままインスタンス化すれば、デフォルトのタイマファンクションが動作し、ユーザが基本クラスを継承して、この仮想関数をオーバライドして、派生クラスにインスタンス化すれば、ユーザ定義のタイマハンドラが動作する様に設計したい。

    • クラスの外部制御変数
      不正アクセスによる問題を防ぐ為、外部制御変数
      BOOL CwccTimerControlを用意し、WinMainの先頭でFALSEをセットする。この変数は、ユーザプログラムでのタイマインスタンス消し忘れにも、柔軟に対応出来る仕組みである。
    • 少なくとも同時に3本のタイマ発行を有効とする。
      タイマIDは、CWCC側が用意する。
      これ以外のタイマを、ユーザが定義した場合には、タイムアップは無視されるものとする。
    • クラス内で保管する変数
      • 親Windowのハンドル HWND _tpWnd ;
        親Windowは即ち、Cwccのメインコンソールになるのだが、ユーザによる継承にて使用する事を念頭に置いている為、コンストラクタは、引数無しとしたい。従って、コンストラクタ内で、親Windowに対してメッセージを発行し、親Windowのハンドルを登録するのみのメンバ関数を呼ぶ形にしたいと考えたが、PostMessageにも、Hwndが要るじゃないか〜!!仕方ない。今後の事も考えて、若干かっこわるいが、メインウインドウのハンドルはグローバルに持つ事にした。
      • タイマ動作フラグ BOOL _TimerAct[3] ;
        3本までのタイマを許容するので、どのタイマが稼働中であるかを示すフラグを設ける。稼働中の場合は、TRUEが立つものとし、TRUEの場合に、同じタイマを掛ける事を禁止する。
      • タイムアップフラグ BOOL _TimeUp[3] ;
        デフォルトのタイマファンクションにて、タイムアップしたタイマ番号のフラグに、TRUEが立つ仕組みとする。ユーザが拡張した場合は、このフラグは変化しない。
      • ワンショットフラグ BOOL _OneShot[3] ;
        1回のタイムアップで終了するタイマの場合、TRUEが立つものとする。また、このフラグは、該当のタイマがタイムアップした時点で、FALSEにリセットされる。

    • メンバ関数
      コンストラクタ/デストラクタ以外に、以下のメンバ関数を用意する。

      • タイマ開始関数 BOOL Start(int tnb,UINT tup,BOOL Oshot)
        タイマ番号tnbのタイマをスタートさせる。現行、3本までのタイマが掛けられるので、tnbは、0〜2までが許容される。タイムアップまでの時間は、tupにて指定する(単位:ms),ワンショットの場合は、Oshot=TRUE(1)とし、インターバルタイマとして使う場合は、Oshot=FALSE(0)とする。但し、かなり精度が悪いので、50ms以下の短いタイマでは、 かなり、PCのコンディションが良くなければ使えないと思った方が良いだろう。特に、50ms以下の数値をインターバルタイマとして使う場合に、タイマ処理が間に合わず、WM_TIMERのイベントが蓄積してしまう事も想定出来るので、ユーザは注意してタイマを使用しなければならない。

      • タイマ解除関数 BOOL Stop(int tnb)
        タイマ番号tnbのタイマを停止させる。ワンショットタイマは、タイムアップ時に停止するので、インターバルタイマの場合又は、タイムアップ前にタイマを停止したい場合に実行する必要がある。

      • 状態取得関数 BOOL TimerState(int tnb)
        タイマ番号tnbのタイマが稼働中か否かを返す関数であるが、基本的には、ユーザが直接呼ぶ必要は無く、WM_TIMERのタイムアップで、自動で呼び出される関数である。

      • ユーザスタート関数 virtual int UserStart(int xval)
        ユーザの拡張用関数,デフォルトのまま使うと、何もせずに、引数のxvalを返す関数であるが、ユーザが、CwccTimerを継承したクラスにて実装すれば、複数のタイマの同時スタートや、タイマの簡単な管理に使う事も出来る。因みに、引数のxvalは汎用であるので、使いたいタイマ番号として使うとか、タイマ番号は固定として、タイムアップ値を指定する様にデザインしても良いだろう。また、例えば外部で幾つかのタイマパタンに番号を付けて登録しておいて、ユーザスタート関数の引数で、示されたパタンのタイマを掛けるというデザインにする事も出来る。因みに、スタート関数を呼ぶ時は、
        CwccTimer::Start(1,xval,1) ;
        の様に呼び出せば良い。

      • タイマハンドラ virtual void TimerFunction(int tnb)
        タイマがタイムアップすると、この関数が呼ばれる事になる。デフォルトのまま使うと、該当タイマのタイムアップフラグをTRUEにセットする。ユーザが拡張出来る設計となっているので、CwccTimerを継承したクラスにて実装すれば、ユーザのデザインした動作を行う様になる。この場合、tnbは、タイムアップしたタイマ番号(0〜3)が渡されるので、但し、この関数の中で、CwccPrint()等のCwccユーザ関数を使用する事は出来ない(※)ので、フラグや変数値のセット等を素早く行うのみに止めておいた方が良い。
        ※因みに、ここで、CwccPrint等を使うと、メインウインドウのプロシージャの動作の中で、メインウインドウに対してメッセージを発行し、メインウインドウがスレッドを止めてくれるのを待つ…という非常にややこしい状態となるが、メインウインドウのメッセージループに至らないので、発行したメッセージが受け取られないまま、永久ループに入るので、暴走してしまうのである。恐らく、wsprintf()等の関数は使用出来ると思うが、全てを試してはいない。
        また、ユーザタイマハンドラを使用すると、CwccTimerのタイムアップフラグは、タイムアップしないので、ユーザタイマハンドラをデザインした上で、デフォルトの関数も呼びたいという場合は、ユーザタイマハンドラの中で、
        CwccTimer::TimerFunction(tnb) ;
        の様に、デフォルトのタイマハンドラを呼べば良い。

      • タイムアップ監視関数 Watch(int tnb)
        デフォルトのタイマハンドラを使用している場合のみに限り、該当番号tnbのタイマを監視する事が出来る。タイムアップしている場合、TRUEが返るので、これを参照して、タイムアップ処理を行えば良い。この関数についても、拡張が可能であるので、タイマハンドラを拡張した場合には、そのデザインに合わせてデザインを変更する事も出来る。

  • ファイルクラス及びプロファイルクラスの実装
    ファイルダイヤログ及びプロファイルを使用する為の、ファイル及びプロファイルクラスを実装した。両者共、CoolLibのファイルクラスからの流用であるが、CwccFileについては、コマンドラインからの登録及び、ドラッグ&ドロップの機能は削除している。総合して、若干のデチューンとなっているが、コンソールで扱うには、充分な設計になっていると思う。プロファイルクラスは、殆どそのままの流用となる。

  • シリアルポートクラスの実装
    本編の方で紹介した、シリアルクラスをCWCC用にチューニングして搭載した。メンバ関数の引数から、HANDLE型の引数を削除し、内部にて保持する様に改造した以外は、殆ど本編にて紹介したクラス同様となっているが、2〜3メンバ関数名を変更したのと、デフォルトでのセッティングを追加したので、若干使い易くはなっていると思う。

    • メンバ関数名変更
      rs()→RecieveLength()
      RsinStr→RSInPort()
      Rsouts→RSOutPort()
      ※若干直感的に分かりやすい表現に変更

    • 新規追加
      BOOL CwccSerial::DefaultSetting(
      int PortNumb,
      UINT BaudRate,
      BYTE DataBits,
      int StopBit,
      int Parity,
      BOOL CtsFlow,
      BOOL XparameterFlow
      ) ;
      PortNumbで示されたシリアルポートを、以降に続くパラメータにてオープンする。成功した場合はTRUEを、失敗の場合はFALSEを返す。

2002/05/13
HomeSweetHome2
Ozzy's Software