Classes prédéfinies

11. Classes prédéfinies
C++ Builder fournit plusieurs bibliothèques de classes prédéfinies dont l'utilisation peut s'avérer précieuse pour construire une application. Ces classes ont principalement deux origines : - Les classes standardisées du langage C++ ; - Les classes spécifiques à l'environnement C++ Builder.

La STL ( Standard Template Library ) est une bibliothèque standardisée contenant des dizaines de classes différentes, la plupart génériques ( classes patrons ou template ). Ces classes ont diverses fonctions : - Classes conteneurs ( vecteurs, listes, piles, etc. ) ; - Classes contenant des algorithmes ; - etc. Il n'est pas question d'étudier l'ensemble de ces classes, dont certaines ne sont utilisées que dans des cas très particuliers. Nous nous limiterons à celles qui sont "incontournables".

11.1 : Classe AnsiString
11.11: Généralités
C++Builder implémente le type AnsiString sous forme de classe. Cette classe, appelée AnsiString offre les caractéristiques de gestion de chaînes qui sont nécessaires pour l'appel à des fonctions de type VCL basées sur le type de chaîne propre au Pascal utilisé par Delphi. Elle permet de réaliser : - Le comptage des références ; - Le calcul de la longueur de chaîne ; - Les conversions de et vers les chaînes AZT.

Page XI.1

Classes prédéfinies La classe AnsiString, en adoptant un mode de manipulation proche de celui des chaînes Pascal ( et Basic ) permet de se démarquer des problèmes dues aux manipulations de chaînes en langage C/C++ ( fonctions <string.h> ).

Si aucune valeur initiale n'est spécifiée, les variables AnsiString sont initialisées à zéro lors de leur instanciation.

Comme toute classe, la classe AnsiString contient différentes méthodes, permettant la manipulation des chaînes ) ainsi que des redéfinitions d'opérateurs. La plupart de ces méthodes sont publiques mais la classe contient également une donnée privée, appelée Data – de type char *, qui pointe sur la chaîne de caractère classique associée à l'objet instancié.

La donnée privée Data peut être utilisée, via des méthodes publiques adéquates, lorsqu'il s'agit de fournir un paramètre "chaîne de caractères" à une fonction qui ne reconnaît pas le type AnsiString et manipule les chaînes AZT.

11.12 : Principales méthodes
11.121 / Constructeurs :
Constructeur créant une chaîne vide AnsiString ( ) Constructeur créant une chaîne initialisée AnsiString ( char * ) AnsiString ( AnsiString& ) Constructeur créant une chaîne par recopie d'une

AnsiString ( int ) AnsiString ( double )

autre chaîne préexistante. Constructeur créant une chaîne en convertissant la valeur entière passée en paramètre. Constructeur créant une chaîne en convertissant la valeur de type double passée en paramètre.

AnsiString s1 ; // Déclaration d'une chaîne vide AnsiString s2 ( "Bonjour" ) ; // Déclaration- initialisation AnsiString s3 = s2 ; // Déclaration et recopie AnsiString s4 ( 123 ); // Déclaration et initialisation avec conversion

11.122 / Manipulations :
¤ int Length ( ) Retourne la longueur de la chaîne.
AnsiString s2 ( "Bonjour" ) ; n = s2.Length ( ) ; // n vaut 7

¤ bool IsEmpty ( ) Retourne true si la chaîne est vide ¤ AnsiString LowerCase ( ) AnsiString UpperCase ( ) ; Convertit la chaîne en caractères minuscules ou majuscules. ¤ AnsiString Trim ( ) Retourne une chaîne dans laquelle les espaces de tête et de fin ont été supprimés.
Page XI.2

Classes prédéfinies Trimleft ( ) élimine les espaces de tête, TrimRight ( ) ceux de queue.

¤ AnsiString Substring ( int index, int count ) Retourne une sous-chaîne contenant count caractères à partir du déplacement index ( 1 pour le premier caractère de la chaîne ).
AnsiString s1 ( "Bonjour" ) , s2 ; s2 = s1.Substring ( 3,3 ) // s2 = "njo"

¤ int ToInt ( ) Convertit une chaîne en un entier. Est susceptible de provoquer une exception EconvertError si la chaîne ne peut être convertie. ¤ double ToDouble ( ) Convertit une chaîne en un double. Est susceptible de provoquer une exception EconvertError si la chaîne ne peut être convertie. ¤ void Insert ( AnsiString& str , int index ) Insère la chaîne str à partir du déplacement index
AnsiString s1 ("Bjour" ), s2 ; s2.Insert ( "on", 2 ) ; // s2 vaut "Bonjour"

¤ void Delete ( int index, int count ) Supprime count caractères à partir du déplacement index. ¤ int AnsiCompare ( AnsiString& ) Compare deux chaînes entre elles. Renvoie : 0 >0 <0 en cas d'égalité. si la chaîne invoquant la méthode est supérieure à la chaîne passée en paramètre. dans le cas contraire.

Les caractères accentués sont gérés ( e < é < è < f ).
AnsiString s1 ( "Bonjour" ), s2 ( "Au revoir" ) ; int comp ; comp = s1.AnsiCompare ( s2 ) ; // comp est positif

La méthode AnsiCompareIC ( ) réalise la même comparaison mais ne différencie pas les majuscules et les minuscules. ¤ char* __fastcall c_str( ) const Cette fonction permet la conversion d'une chaîne de type AnsiString en chaîne AZT. En fait c_str ( ) renvoie un pointeur sur la donnée membre de la classe AnsiString contenant la chaîne manipulée. Cette fonction est particulièrement utile lorsque l'on souhaite réaliser des manipulation "caractère par caractère" sur la chaîne. Elle est aussi utilisée pour passer des paramètres de types "chaines AZT" aux fonctions qui ne reconnaissent pas les chaînes AnsiString.

Page XI.3

Classes prédéfinies

Exemple : char Tampon [ 31 ] ; ..... strcpy ( Tampon , ( ESaisie -> Text ).c_str ( ));
/* ESaisie -> Text est une chaîne AnsiString. c_str ( ) renvoie la valeur du pointeur sur la chaîne AZT qu'elle contient. On peut alors réaliser une copie de cette chaîne dans Tampon afin de manipuler la chaîne comme souhaité. */

11.13 : Opérateurs redéfinis
¤ L'opérateur ' + ' est redéfini. On peut donc "concaténer" rapidement les chaînes de type AnsiString. AnsiString s ; s = s + "X vaut : " + x + " et Y vaut : " + y ;
/* noter que les valeurs x et y ont été automatiquement en valeurs alphanumériques. */ converties

¤ Les opérateurs de comparaison sont redéfinis ( <, >, ==, != ainsi que += ). ¤ Les opérateurs [ ] sont redéfinis. AnsiString s ( "Bonjour" ); char C = s [ 1 ] ; // C vaut 'B'

11.2 : Classe Currency
La classe Currency est proposée par C++ Builder pour garantir que les manipulations de nombres réels seront valides en éliminant les principales causes d'erreurs dues aux approximations réalisées dans le codage des ces nombres.

En contrepartie, le nombre de décimale géré par un objet de type Currency est limité à 4 décimales. Mais c'est amplement suffisant pour de nombreuses applications.

Les opérateurs mathématiques du langage C++ ont été redéfinis pour manipuler des objets de type Currency.
Page XI.4

Classes prédéfinies

11.21 : Constructeurs
Currency ( ) Currency ( double val )
Constructeur initialisant une valeur à 0. Création d'une variable à partir d'une valeur de type double. Création d'une variable à partir d'une valeur de type Currency ( int val ) int. Currency ( AnsiString val ) Création d'une variable à partir d'une chaîne de caractères

Currency Nb1 ; Nb = Currency ( "3.14" )

// variable de type Currency // variable réelle

11.22 : Affichages
La manipulation des nombres de type Currency ne pose pas de problème puisqu'elle est réalisée par les opérateurs redéfinis. Il faut cependant utiliser des méthodes particulières pour afficher un nombre de type Currency. Cela est réalisé via la méthode CurrToStr ( variable de type Currency ).
Currency Cur ( "3.14" ) ; AnsiString Chaine ; Chaine = Cur // transtypage automatique

ou Chaine = CurrToStr ( Cur ) ;

L'appel de la méthode CurrToStrF ( ), équivalente à CurrToStr ( ) permet de réaliser certains formatages à l'écran en fonction de variables prédéfinies ( voir aide en ligne à ce sujet ).

11.3 : Classe TDateTime
La classe TDateTime permet de manipuler des dates, contenant des valeurs d'années, de mois, de jour et/ou d'heures, de minutes et de secondes.

 

Pour manipuler à la fois des années/mois/jour et des heures/minutes/secondes, il est préférable de construire deux objets distincts. La classe TDateTime est dérivée de la classe TDateTimeBase qui manipule un champ, de type double, appelé Val. Cette valeur contient le nombre de jour depuis le 30 décembre 1899 ainsi que, dans sa partie décimale, le nombre d'heure – en vingt-quatrièmes d'heures. Page XI.5

Classes prédéfinies

11.31 : Constructeurs
TDateTime ( ) TDateTime ( double Val ) TDateTime ( AnsiString& sour, flag )
Constructeur sans argument. L'objet créé est initialisé à 30/12/1899 à midi. La date est spécifiée sous forme de chaîne de caractères dans le format ( en France ) : jj/mm/aaaa et hh:mm:ss. Les valeurs possibles pour flag, qui peut être absent, sont Date, Time, DateTime. Les paramètres sont de type unsigned short. Les paramètres sont de type unsigned short.

TDateTime ( Annee, Mois, Jour ) TDateTime ( Heure, Min, Sec, Millis ) Exemples :

TDateTime ("30/10/2000", Date ) ; TDateTime ( 08, 25, 30, 0 ) ;

11.32 : Méthodes
¤ TDateTime CurrentDate ( ) : Retourne la date du jour. ¤ TDateTime CurrentTime ( ) : Retourne l'heure courante. ¤ int DayOfWeek ( ) : Retourne le jour de la semaine. ¤ void DecodeDate ( unsigned short *Annee, unsigned short *Mois, unsigned short *Jour ) : Décompose une date en ses trois composantes Année, Mois, Jour. ¤ void DecodeTime ( unsigned short *Heure, unsigned short *Min, unsigned short *Sec, unsigned short *Millisec ) : Décompose une heure en ses quatre composantes Heure, Minute, Seconde, Milliseconde. ¤ AnsiString DateString ( ) : Convertit une date en une chaîne de caractères. ¤ AnsiString TimeString ( ) : Convertit une heure en chaîne de caractères. ¤ AnsiString DateTimeString ( ) : Convertit en une chaîne au format jj/mm/aaaa hh:mm:ss. ¤ AnsiString FormatString ( AnsiString Format ) : Retourne une chaîne en spécifiant un format.

Page XI.6

Classes prédéfinies

11.33 : Redéfinition d'opérateurs
La classe TDateTime redéfinit certains opérateurs ( +, -, et leurs dérivés ainsi que ++ et – et les opérateurs de comparaisons ) de manière à pouvoir réaliser facilement des calculs sur les dates. Exemple :
TDateTime UneDate ( "1/10/00" ) ; UneDate = UneDate + 20 ; // UneDate vaut 21/10/00.

11.4 : Gestion des exceptions :
Toutes les méthodes, contenues dans les classes de C++ Builder, susceptibles de générer une exception sont conçues pour lancer celle-ci, via l'opérateur throw. C++ Builder implémente par ailleurs toute une hiérarchie de classes spécialement conçues pour gérer ces exceptions. La hiérarchie démarre avec la classe de base TException.

Les exceptions lancées au sein des méthodes le sont donc sous la forme : throw ( Exception ( ) ) Où Exception ( ) ( ou un constructeur d'une classe dérivée ) crée l'objet transmis au gestionnaire d'exception.

L'utilisateur des classes de C++ Builder ( composants ou classes internes ) n'a donc plus qu'à : Se renseigner sur l'objet Exception susceptible d'être transmis par les méthodes qu'il invoque ; Réaliser le gestionnaire d'exception adéquat.

11.41 : Mécanisme mis en œuvre
Il doit donc créer des blocs de gestion d'exceptions, lorsque le cas se présente, sous la forme :
void __fastcall TForm1::Button2Click(TObject *Sender) { int Val ; AnsiString Chaine ; Chaine = Edit1 -> Text ; Page XI.7

Classes prédéfinies
try { Val = Chaine.ToInt ( ) ; } catch ( EConvertError& err ) { ShowMessage ( "La numérique" ) ; }

saisie

n'est

pas

une

valeur

} /* Le message d'erreur s'affichera si l'utilisateur entre dans Edit1 autre chose que des valeurs numériques */

Pour que le processus s'exécute normalement, et que l'exception soit réellement gérée au sein de l'environnement de développement, il faut aller dans le menu Outils / Options du debogueur et décocher, dans l'onglet "Exceptions du langage", les cases "Arrêter sur exceptions de Delphi et de C+ +". En effet, par défaut, C++ Builder se prémunit des exceptions et affiche son propre gestionnaire d'exception avant que celui du programme en cours de test soit lancé.

Si le programme est susceptible de générer plusieurs exceptions, il faut créer plusieurs blocs catch ( ).

Il est possible de créer un bloc catch ( Exception &err ), susceptible de gérer tous les types d'erreur, puisque la classe TException est la mère de toutes les classes de gestion d'exception ), mais alors ce bloc doit se situer le dernier dans la liste des blocs catch ( ).

On peut aussi utiliser un bloc catch( ... ) qui traite de toutes les exceptions, y compris celles qui ne sont pas dues à l'utilisation de la bibliothèque VCL.

11.42 : Principales exceptions gérées par la bibliothèque VCL
Les principales exceptions gérées sont : EMathError
Erreurs sur les nombres réels Les classes dérivées sont : EInvalidOP : Le nombre n'est pas un réel ; EZeroDivide : Division réelle par zéro ; EOverflow : Dépassement de capacité. Erreurs sur les nombres réels. Classe dérivée : EDivByZero : Division entière par zéro. Plus assez de mémoire Pointeur mal initialisé Erreur d'entrées /sortie sur fichier Erreur de transtypage Dépassement de la capacité de la pile Erreur dans une conversion entier   chaîne de caractères Page XI.8

EIntError EOutOfMemory EInvalidPointer EIntOutError EInvalidCast EStackOverflow EConvertError

Classes prédéfinies EAssertionfailed
Erreur d'assertion

Page XI.9

Sign up to vote on this title
UsefulNot useful