コピー・コンストラクターおよび代入演算子

このオブジェクトは、コピー構築および割り当てをサポートします。このことは、 後で処理するためにホスト画面でフィールドを簡単に確保したいアプリケーションには 役に立ちます。テキスト・バッファーを割り振ったりフィールドのストリングの内容を コピーするよりも、アプリケーションは専用 ECLField オブジェクトにフィールドを 単純に保管することができます。保管されたコピーには、フィールドのテキスト値、属性、開始位置、長さなどを含む ECLField オブジェクトのすべての機能が保存されます。例えば、画面の最初の入力フィールドを確保するのに必要なアプリケーションを考えてみてください。表 1 は、これが達成できる 2 つの方法を示しています。
表 1. コピー構築および割り当ての例
ストリングとしてフィールドを保管 ECLField オブジェクトとしてフィールドを保管
#include "eclall.hpp"
 
{
   char *SavePtr;  // Ptr to saved string
   ECLPS Ps('A'); // PS object
   ECLFieldList *List;
   ECLField       *Fld;
 
   // Get fld list and rebuild it
   List = Ps->GetFieldList();
   List->Refresh();
 
   // See if there is an input field
   Fld = List->GetFirstField(GetUnmodified);
   if  (Fld !=NULL) {
      // Copy the field's text value
      SavePtr=malloc(Fld->Length() + 1);
      Fld->GetScreen(SavePtr, Fld->Length()+1);
  }
 
  // We now have captured the field text
 
#include "eclall.hpp"
 
{
   ECLField SaveFld;  // Saved field
   ECLPS Ps('A');      // PS object
   ECLFieldList *List;
   ECLField       *Fld;
 
   // Get fld list and rebuild it
   List = Ps->GetFieldList();
   List->Refresh();
 
   // See if there is an input field
   Fld = List->GetFirstField(GetUnmodified);
   if  (Fld !=NULL) {
      // Copy the field object
      SaveFld = *Fld;
  }
 
  // We now have captured the field text
  // including text, position, attrib
 
フィールドを保管するのに、ストリングの代わりに ECLField オブジェクトを使用すると 次のようないくつかの利点があります。
  • ECLField オブジェクトは、フィールドのテキスト・バッファーのストレージ管理を すべて行います。アプリケーションは、テキスト・バッファーを割り振ったり、解放したり、 または、必要なバッファー・サイズの計算をする必要はありません。
  • 保管されたフィールドには、属性および開始位置を含むオリジナル・フィールドの特性の すべてが保存されています。通常の ECLField メンバーの機能のすべては、SetText() 以外の 保管されたフィールドで使用することができます。保管されたフィールドはオリジナルのコピーであり、その値はホスト画面の変更、あるいは ECLFieldList::Refresh() 関数が呼び出された場合にも更新されないことに注意してください。結果として、このフィールドは 保管することが可能であり、後でアプリケーションで使用することができます。
代入演算子のオーバーライドは、 文字ストリングおよび Long integer 値型にも提供されます。このオーバーライドによって、 新しいストリングまたは数値を無保護フィールドに割り当てやすくなります。例えば、 次の例は、画面の最初の 2 つの入力フィールドを設定します。
ECLField *Fld1; //Ptr to 1st unprotected field in field list
ECLField *Fld2; // PTR to 2nd unprotected field in field list
 
Fld1 = FieldList->GetFirstField(GetUnprotected);
Fld2 = FieldList->GetNextField(Fld1, GetUnprotected);
if ((Fld1 == NULL) || (Fld2 == NULL)) return;
 
*Fld1 = "Easy string assignment";
*Fld2 = 1087;
Notes:
  1. コピー構築または割り当てにより初期化された ECLField オブジェクトは、 オリジナル・フィールド・オブジェクトの読み取り専用コピーです。SetText() メソッドは、 このようなオブジェクトには無効であり、ECLErr 例外が発生する原因となります。これらのオブジェクトはコピーであるため、オリジナル・フィールド・オブジェクトが 更新あるいは削除されたときに、更新あるいは削除されることはありません。アプリケーションは、フィールド・オブジェクトが不必要になった場合に、 これらのオブジェクトのコピーを削除しなければなりません。
  2. 初期設定されていない ECLField オブジェクトでメソッドを呼び出すと、 未定義の結果が戻されます。
  3. アプリケーションにより作成された ECLField オブジェクトは、何度でも 再割り当てすることができます。
  4. 別の ECLField オブジェクト、文字ストリング、 または Long integer 値からのみ、割り当てを行うことが できます。ECLField オブジェクトに対して、他のデータ型を割り当てるのは無効です。
  5. 現在 ECLFieldList の一部である ECLField オブジェクトに割り当てを行っても、 フィールドのテキスト値を更新するだけです。これは、フィールド・オブジェクトが 無保護フィールドである場合にのみ許可されます。例えば、次の例では、最初の 入力フィールドから値をコピーすることにより、画面の 2 番目の入力フィールドを変更します。
    ECLField *Fld1;   // Ptr to 1st unprotected field in field list
    ECLField *Fld2;   // Ptr to 2nd unprotected field in field list
     
    Fld1 = FieldList->GetFirstField(GetUnprotected);
    Fld2 = FieldList->GetNextField(Fld1, GetUnprotected);
    if ((Fld1 == NULL) || (Fld2 == NULL)) return;
     
    // Update the 2nd input field using text from the first
    FLD2 = * Fld1;
     
    Fld2 は ECLFieldList の一部であるため、上記の割り当ては以下の例と同じです。
    { char temp[Fld1->GetLength()+1];
      Fld1->GetText(temp, Fld1->GetLength()+1);
      Fld2->SetText(temp);
      delete []temp;
    }
     

    Fld2 が保護されている場合は、ECLErr 例外がスローされることに注意してください。また、Fld2 のテキストだけが更新され、その属性、位置、または長さは更新されない ことにも注意してください。

  6. ストリングをフィールド・オブジェクトに割り当てることは、 SetText() メソッドを呼び出すことと同じです。数値は、ストリングへの最初の変換なしに、割り当てることができます。
    *Field = 1087;
    これは、数をストリングに変換した後で SetText() メソッドを呼び出すことと同じです。