Constructeur de copie et opérateur d'affectation
Cet objet prend en charge la construction de copie et l'affectation. Ceci est utile pour une application qui souhaite capturer facilement des champs sur un écran hôte pour un traitement ultérieur. Plutôt que d'allouer des tampons de texte et de copier le contenu de la chaîne du champ, l'application peut simplement stocker le champ dans un objet ECLField privé. La copie stockée conserve toutes les fonctions d'un objet ECLField, y compris la valeur texte du champ, les attributs, la position de départ, la longueur, etc. Par exemple, supposons qu'une application souhaite capturer le premier champ de saisie de l'écran. Exemples de construction de copie et d'affectation montre deux façons d’y parvenir.
| Enregistrez le champ sous forme de chaîne | Enregistrez le champ en tant qu'objet ECLField |
|---|---|
| |
Il existe plusieurs avantages à utiliser un objet ECLField au lieu d'une chaîne pour stocker un champ :
- L'objet ECLField effectue toute la gestion du stockage du tampon de texte du champ ; l'application n'a pas besoin d'allouer ou de libérer des tampons de texte ni de calculer la taille du tampon requis.
- Le champ enregistré conserve toutes les caractéristiques du champ d'origine, y compris ses attributs et sa position de départ. Toutes les fonctions membres ECLField habituelles peuvent être utilisées sur le champ stocké, à l'exception de SetText(). Notez que le champ stocké est une copie de l'original : ses valeurs ne sont pas mises à jour lorsque l'écran hôte change ou lorsque la fonction ECLFieldList::Refresh() est appelée. Le champ peut ainsi être stocké et utilisé ultérieurement dans l’application.
Des remplacements d'opérateurs d'affectation sont également fournis pour les chaînes de caractères et les types de valeurs entières longues. Ces remplacements facilitent l'attribution de nouvelles valeurs de chaîne ou numériques aux champs non protégés. Par exemple, ce qui suit définit les deux premiers champs de saisie de l'écran :
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 :
- Les objets ECLField initialisés par construction de copie ou affectation sont des copies en lecture seule de l'objet champ d'origine. La méthode SetText() n'est pas valide pour un tel objet et entraînera la levée d'une exception ECLErr. Etant donné que les objets sont des copies, ils ne sont ni mis à jour ni supprimés lorsque l'objet de champ d'origine est mis à jour ou supprimé. L'application se charge de supprimer les copies des objets de champ lorsqu'ils ne sont plus nécessaires.
- L’appel de n’importe quelle méthode sur un objet ECLField unialisé renverra des résultats non définis.
- Un objet ECLField créé par l'application peut être réaffecté un nombre illimité de fois.
- Les affectations ne peuvent être effectuées qu'à partir d'un autre objet ECLField, d'une chaîne de caractères ou d'une valeur entière longue. L'attribution de tout autre type de données à un objet ECLField n'est pas valide.
- Si une affectation est effectuée à un objet ECLField qui fait actuellement partie d'une ECLFieldList, l'effet est de mettre à jour uniquement la valeur texte du champ. Ceci n'est autorisé que si l'objet champ est un champ non protégé. Par exemple, ce qui suit modifiera le 2ème champ de saisie de l'écran en copiant la valeur du 1er champ de saisie :
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;Etant donné que Fld2 fait partie d'un ECLFieldList, l'affectation ci-dessus est identique à :{ char temp[Fld1->GetLength()+1]; Fld1->GetText(temp, Fld1->GetLength()+1); Fld2->SetText(temp); delete []temp; }Notez que cela lancera une exception ECLErr si Fld2 est protégé. Notez également que seul le texte de Fld2 est mis à jour, pas ses attributs, sa position ou sa longueur.
- Attribuer une chaîne à un objet champ équivaut à appeler la méthode SetText(). Vous pouvez également attribuer des valeurs numériques sans les convertir au préalable en chaînes :
Cela équivaut à convertir le nombre en chaîne, puis à appeler la méthode SetText().*Field = 1087;