b. 非ビジュアル・パーツの作成
3.非ビジュアル・パーツQuadを作成する。
非ビジュアル・パーツ |
|
Quadパーツの機能設定 |
|
クラス名 |
Quad |
説明 |
二次方程式の解(Quadratic formula) |
ファイル名 |
moreTwo |
パーツタイプ |
非ビジュアル・パーツ |
基底クラス |
IStandardNotifier |
.hpvファイル |
"Quad.hpv" |
.cpvファイル |
"Quad.cpv" |
インクルード・ファイル |
<istring.hpp> <math.h> |
平方根を計算する関数sqrt()を用いるため、<math.h>をインクルードする。
4.属性・アクションを設定する。
Quadパーツ | ||||
属性 |
タイプ |
説明 |
優先 |
|
num1 |
double |
|
O |
|
num2 |
double |
|
O |
|
num3 |
double |
|
|
|
result1 |
double |
|
|
|
result2 |
double |
|
|
|
アクション |
タイプ |
パラメータ |
説明 |
O |
calc |
IString |
なし |
二次方程式の解 |
O |
5.フィーチャー・ソース・コードを作成する。
6.Quad.cpvファイルを修正する。
IString Quad::calc()
{
double delta=iNumB*iNumB-4.0*iNumA*iNumC;// 解の公式の平方根の中
IString R;
if( iNumA==0.0 )
{
if( iNumB==0.0 ) // c = 0 の場合
{
setResult1( 0.0 );
notifyObservers(INotificationEvent(Quad::result1Id, *this)); 注}
setResult2( 0.0 );
R = "";
}
else // bx + c = 0 の場合
{
setResult1( -iNumC/iNumB );
setResult2( 0.0 );
R = "";
}
}
else
{
if( delta>=0.0 ) // 実数根の場合
{
setResult1( ( iNumB - sqrt(delta) )/2.0/iNumA );
setResult2( ( iNumB + sqrt(delta) )/2.0/iNumA );
R = ",";
}
else // 虚数根の場合
{
setResult1( iNumB/2.0/iNumA );
setResult2( sqrt(-delta)/2.0/iNumA );
R = "±i";
}
}
return R;
}
プログラム中のsetResult1(A)は、Aの値をresult1に代入し、
result1の値が変更されたこと(イベント)を、Quad.cpv中の
のnotifyObservers(INotificationEvent(Quad::result1Id, *this));の行で
接続されている他のクラスに知らせる。
注)numA=0かつnumB=0のとき、result1(0.0)にしている(aResult1=0.0)。
ところが、result1は最初に0.0と設定されるため(iReult1=0.0)
または前回の計算結果が0.0の場合(iReult1=0.0)、
上記のQuad& Quad::setResult1(0.0)ではiResult1==aResult1のため、
notifyObservers(INotificationEvent(Quad::result1Id, *this));
が実行されない。
そのため、この行にnotifyObserversを挿入して、
強制的にイベントresult1IDを発生させている。
7.Mainのコンポジション・エディターに戻り、
「オプション」->「パーツの追加」をクリックする。
8.パーツの追加のダイアログに、Quad*を入力し、「追加」をクリックする。