副本构造函数和赋值运算符

此对象支持复制-构造和分配。这对于想要在主机屏幕上轻松捕获字段以供以后处理的应用程序非常有用。应用程序不需要分配文本缓冲区并复制字段的字符串内容,只需将字段存储在专用 ECLField 对象中即可。存储的副本会保留 ECLField 对象的所有函数,包括字段的文本值、属性、起始位置、长度等。例如,假设某个应用程序要捕获屏幕的第一个输入字段。 复制-构造和分配示例 显示了实现这一目标的两种方法。
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 对象执行字段文本缓冲区的所有存储管理;应用程序不必分配或自由文本缓冲区,也不必计算所需缓冲区的大小。
  • 保存的字段保留原始字段的所有特性,包括其属性和起始位置。除了 SetText() 之外,所有常用的 ECLField 成员函数都可用于存储的字段。请注意,存储的字段是原始字段的副本。当主机屏幕更改或调用 ECLFieldList::Refresh() 函数时,其值不会更新。因此,该字段可以存储并在以后的应用程序中使用。
还为字符串和长整型值类型提供了分配运算符覆盖。这些覆盖使您可以轻松地为未受保护的字段分配新的字符串或数值。例如,以下设置了屏幕的前两个输入字段:
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;
注释:
  1. 由复制-构造或分配初始化的 ECLField 对象是原始字段对象的只读副本。SetText() 方法对于此类对象无效,将导致抛出 ECLErr 异常。由于对象是副本,因此在更新或删除原始字段对象时不会更新或删除这些对象。应用程序负责删除不再需要的字段对象副本。
  2. 调用未初始化的 ECLField 对象上的任何方法都将返回未定义的结果。
  3. 应用程序创建的 ECLField 对象可以重新分配任意多次。
  4. 只能从另一个 ECLField 对象、字符串或长整型值进行分配。将任何其他数据类型分配给 ECLField 对象无效。
  5. 如果对当前属于 ECLFieldList 一部分的 ECLField 对象进行了分配,则只会更新字段的文本值。仅当字段对象是未受保护的字段时,才允许执行此操作。例如,以下内容将通过复制第一个输入字段中的值来修改屏幕的第二个输入字段:
    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() 方法。