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 |