c. 2次元(XY)コレクション用パーツの作成(1997年10月18日改訂)

1.プロジェクト名DataCollのビジュアル・ビルダーを起動する。

2.「パーツ」->「新規作成」をクリックする。

  DataColl.vbbに、これから作成するパーツCollecXYを格納する。

3.CollecXYパーツを作成する。

  DataCollection

非ビジュアル・パーツ

CollecXYパーツの機能設定

クラス名

CollecXY

説明

データ(x,y)リストの計算

ファイル名

DataColl

パーツ・タイプ

非ビジュアル・パーツ

基底クラス

IStandardNotifier

.hpvファイル

"CollecXY.hpv"

.cpvファイル

"CollecXY.cpv"

インクルード・ファイル

"DataXY.hpp" _DATAXY_ 注1)

<ivseq.h> _IVSEQ_

注1)最終的には複数のパーツをまとめてコンパイルするので、同じヘッダー・ファイルの

  インクルードを避けるために、_DATAXY_を"DataXY.hpp"の右横に記入している。

  これは、

   #ifndef _DATAXY_
   #include "DataXY.hpp"
   #endif

  が自動的に記入され、このパーツをコンパイルするとき、DataXY.hppが

  読み込まれていなければ読み込む。

 

CollecXYパーツ

属性

タイプ

コメント

優先

dataX

double

変数(横軸X

O

dataY

double

関数値(縦軸Y

O

minimumDataX

double

変数の最小値

O

maximumDataX

double

変数の最大値

O

number

int

変数の分割数

O

result

IVSequence<DataXY*>*

全データ

O

set関数の引数のconstを削除

アクション

タイプ

パラメータ

 

calc

long

 

O

removeAll

void

 

O

 

4.「ファイル」->「保管および生成」->「フィーチャー・ソース」をクリックし、

  CollecXY.cpvとCollecXY.hpvを自動作成する。

5.CollecXY.cpvのresult()、calc()とremoveAll()を修正する。

long CollecXY::calc()
{
 double delta; // dataXの計算間隔
 long iCount=0; // データ数
 DataXY* iResultXY; // DataXY構造のポインターをiResultXYとする。
 
 // resultの全てのデータを削除する。
 removeAll();
 
 // データ数が1以下の場合、例外処理を行う。
 if( iNumber<=1)
 {
  IString errorText = IString( "データ数が1以下です。" );
  IException exc( errorText, 0, IException::unrecoverable);
  ITHROW( exc );
 } // 例外処理終了
 
 // resultのイベント通知機能を禁止する。
 iResult->disableNotification();
 delta = (iMaximumDataX - iMinimumDataX)/(iNumber - 1); // 計算間隔

 // データ数だけ繰り返す。
 for( int i=0; i<=(iNumber-1); i++ )
 {
  iResultXY = new DataXY; // iResultXYの実体(メモリー領域)を確保する。
  // dataXに数値を代入し、dataXのイベントを発生させる。
  iDataX = iMinimumDataX + delta*i; //
1997年10月30日修正
  notifyObservers(INotificationEvent(CollecXY::dataXId, *this)); //
1997年10月30日修正
  //  1.他のパーツのdataXに対応する属性の値を変更する。
  //  2.dataXのイベントで、他のパーツのdataYに対応する値を計算させる。
  //  3.dataYに対応する値が戻ってくるまで待つ。
  // 変数dataXをiResultXYのdataXに代入する。
  iResultXY->setDataX( iDataX );
  // 関数値dataYをiResultXYのdataYに代入する。
  iResultXY->setDataY( iDataY );
  // シーケンシャルなresultの最後の項に加える。
  iResult->addAsLast( iResultXY );
  iCount++;
 }
 
 // resultのイベント通知機能を回復する。
 iResult->enableNotification();
 // resultが変更されたことを通知する。
 notifyObservers(INotificationEvent(CollecXY::resultId, *this));
 return iCount;
}
 

void CollecXY::removeAll()
{
 // resultの全ての項目がなくなるまで繰り返す。
 while( !iResult->isEmpty() )
 {
  // resultの最初のオブジェクトのポインターを取得する。
  DataXY* iElement = iResult->firstElement();
  // オブジェクトのポインターを削除する。
  iResult->removeFirst();
  // オブジェクトを削除する。
  delete iElement;
  }
return;
}
 
// Feature source code generation ends here.

6.後でパーツCollecXYを使えるように、覚え書きCollecXY.htmlを書く。

 

パーツCollecXYの説明

DataXの最小値、最大値、データ数を指定する。

接続するパーツでDataYに対応する値を計算して、

(x, y)のデータ対をDataXの最小値から順にならべる。

CollecXYパーツ

属性

タイプ

コメント

優先

dataX

double

変数(横軸X

O

dataY

double

関数値(縦軸Y

O

minimumDataX

double

変数の最小値

O

maximumDataX

double

変数の最大値

O

number

int

変数の分割数

O

result

IVSequence<DataXY*>*

全データ

O

アクション

タイプ

パラメータ

 

calc

long

 

O

removeAll

void

 

O

 

calc()はデータ数を戻り値とする。

 例外処理のメッセージが含まれている。

 接続方法:dataXの値からdataYに対応する値を計算するパーツとは、

       1.dataX -> パーツのxに対応する属性

       2.dataX -> パーツの計算に対応するアクション

       3.パーツのyに対応する属性 -> dataY

      と接続する。

      注意:上記の接続1と2の順番は間違えないこと。

 

必要なファイル

DataColl.vbb

CollecXY.cpv

CollecXY.hpv

 

DataXY.cpv

DataXY.hpv