CH4-Chaines de Carcteres

32
CHAPITRE Les chaîne de caractères A la fin de ce chapitre, vous serez capable de : Utiliser à bon escient les différents types de chaînes de caractères, Utiliser les différentes routines de traitement des chaînes de caractères, Travailler avec les types dse données variant et currency. Travaux dirigés : Exercice n° 1 : Concaténation de chaînes Exercice n° 2 : Recherche de chaînes dans un texte Exercice n° 3 : Manipulation d’une chaîne Exercice n° 4 : Utilisation de listBox Exercice n° 5 : Utilisation de Combobox et CheckBox

description

Chaines de Carcteres

Transcript of CH4-Chaines de Carcteres

  • C H A P I T R E

    Les chane de caractres

    A la fin de ce chapitre, vous serez capable de : Utiliser bon escient les diffrents types de chanes de

    caractres, Utiliser les diffrentes routines de traitement des chanes

    de caractres, Travailler avec les types dse donnes variant et currency.

    Travaux dirigs :Exercice n 1 : Concatnation de chanesExercice n 2 : Recherche de chanes dans un texteExercice n 3 : Manipulation dune chaneExercice n 4 : Utilisation de listBoxExercice n 5 : Utilisation de Combobox et CheckBox

  • 116 Chapitre 4 : Les chanes de caractres 1. Strings, ShortStrings et AnsiStrings

    En ce qui concerne les type caractres et chanes de caractre, Delphi apporte un grand changement par rapport au Turbo Pascal. Ce changement est accompagn d'une confusion due au fait que l'on passe de 2 types de donnes bien connus (char et string) plusieurs types de donnes moins bien connus (Char, AnsiChar, WideChar, PwideChar, String, AnsiString, ShortString, WideString)

    Essayons de mieux comprendre ces nouveaux types. yyyy Type caractre

    Delphi comporte deux types de caractres fondamentaux et un type de caractres gnriques.

    Les types de caractres fondamentaux sont: - AnsiChar pour des caractres (en octets) rangs dans l'ordre du jeu de

    caractres ANSI tendu) jeu de caractres utilis par Windows. - WideChar pour des caractres (en mots) rangs dans l'ordre du jeu Unicode.

    Les 256 premiers caractres du jeu Unicode correspondent aux caractres ANSI. Ce jeu de caractre est amen remplacer, terme, le jeu de caractre habituel en vue d'un meilleur support notamment des langues asiatiques. A long terme il est prvu que toute l'informatique passe au jeu de caractres Unicode.

    Actuellement le type gnrique Char correspond au type AnsiChar, mais

    les implmentations pour d'autres CPU ou systmes d'exploitation peuvent dfinir Char en WideChar. yyyy Type chane de caractres

    Delphi supporte deux types de chanes de caractres. Par dfaut, le type string correspond au nouveau type de chane longue Ansistring. yyyy Les chanes courtes (ShortString)

    Lors de la dclaration d'un type chane courte on peut indiquer une longueur maximum comprise entre 1 et 255 caractres. Les variables d'un type chane courte peuvent contenir des chanes de longueur logique comprise entre 0 et la longueur maximum dclare.

    Le type prdfini ShortString indique un type chane courte d'une longueur maximum de 255 caractres.

  • Chapitre 4 : Les chanes de caractres 117

    Le nombre d'octets de stockage occups par une variable de type chane courte reprsente la longueur maximum du type chane courte plus un octet, le premier, qui contient la longueur logique de la chane de caractres.

    Les fonctions standard Low et High s'appliquer galement une variable de type chane courte. Low retourne zro et High retourne la longueur maximum dclare de la chane courte. yyyy Les chanes longues (AnsiString)

    On peut dfinir une chane longue par le mot rserv String ou par l'identificateur prdfini AnsiString.

    En spcifiant la directive de compilation {$H-} le type string indique une chane courte ShortString (maximum 255 caractres). Par dfaut ou en spcifiant la directive de compilation {$H+} le type String indique une chane longue AnsiString.

    Les chanes longues sont alloues de manire dynamique et n'ont pas de longueur maximum dclare. La longueur maximale thorique d'une variable de type AnsiString est de 2 Gigaoctets.

    Contrairement au langage C la mmoire est alloue dynamiquement une chane longue, et de manire automatique. Voici quelques caractristiques de la gestion des chanes longues: - Une variable AnsiString occupe quatre octets de mmoire. Il s'agit en fait

    d'un pointeur vers une chane alloue dynamiquement. Lorsqu'une variable de type AnsiString est vide (chane de longueur zro), le pointeur est nil et aucune mmoire dynamique n'est associe la variable chane. Pour une variable chane non vide, le pointeur pointe vers un bloc de mmoire allou dynamiquement et contenant la chane de caractres, ainsi qu'un indicateur de 32 bits et un compteur de rfrence 32 bits.

    - Le compteur de rfrence est une astuce permettant d'conomiser la place

    mmoire. En effet lorsqu'une nouvelle valeur est affecte une variable AnsiString, le compteur de sa valeur prcdente (non-vide) est dcrment, et le compteur de sa nouvelle valeur (non-vide) est incrment. Lorsque le compteur d'une variable AnsiString atteint zro, la mmoire alloue la chane de caractres est libre.

  • 118 Chapitre 4 : Les chanes de caractres - Lorsque le contenu d'une variable de type AnsiString est modifi et que le

    compteur est suprieur un, une copie de cette chane est pralablement cre. C'est le principe de "copy-on-write", qui garantit que la modification de la chane n'affectera pas les autres variables AnsiString faisant rfrence la mme valeur. Voyons un exemple:

    Var ch1, ch2: string;

    ch1 := 'sage';ch2 := ch1;ch2[1] := 'r';

    Lors de la premire affectation, le compteur est mis 1 et une chane existe

    en mmoire. Ch1 pointe vers cette chane. Lors de la deuxime affectation, une seule chane existe en mmoire, mais

    les deux variables ch1 et ch2 se la partage. Lors de la dernire affectation une copie de la chane d'origine ('sage') est

    effectue en mmoire et ch2 pointe vers cette nouvelle chane ('rage'). - Les variables de type AnsiString sont toujours initialises vide lors de

    leur cration. - Lorsque des variables de type AnsiString ne sont plus dans le domaine de

    visibilit (par exemple en quittant une fonction ayant des variables AnsiString locales ou en dtruisant un objet contenant des champs AnsiString), le compteur correspondant est automatiquement dcrment

    - Il est possible d'indicer une variable AnsiString non vide avec une

    expression dont la valeur est comprise entre 1 et N, N tant la longueur dynamique actuelle de la chane. L'indice du premier caractre d'une chane AnsiString est 1. Contrairement chanes courtes, les chanes longue n'ont pas d'lment zro pouvant contenir la longueur de la chane. Pour trouver la longueur d'une chane longue, il faut utiliser la fonction standard Length, et pour spcifier la longueur d'une chane longue il faut utiliser la procdure standard SetLength.

    yyyy Chanes longues et chanes zro terminal

    La mmoire alloue pour une chane longue est termine par un caractre null (qui ne fait pas partie de la chane, mais qui est stock immdiatement aprs le dernier caractre de la chane). Grce cette marque de fin de chane, il est

  • Chapitre 4 : Les chanes de caractres 119

    possible de transtyper une variable de type AnsiString en variable de type Pchar (pointeur vers une chane de caractres). Il suffit d'crire PChar(S), o S est une variable AnsiString. Pchar(S) fournit un pointeur vers le premier caractre d'une chane longue.

    Voici un exemple montrant cette possibilit. Si nous voulons affiche une bote de message l'aide des instructions suivantes: var libelle : string;beginlibelle := 'Bonjour';messagebox (0, libelle, 'Message', mb_ok);end;

    Une erreur se produit et le compilateur signale: " Types incompatibles

    'String' et 'Pchar' ". Il suffit alors d'effectuer la modification suivante pour que tout rentre dans l'ordre: var libelle : string;beginlibelle := 'Bonjour';messagebox (0, Pchar(libelle), 'Message', mb_ok);end;

    Cet exemple montre en fait comment passer des chanes longues une

    fonction qui attend des paramtres chane zro terminal. C'est le cas des fonctions de l'API de Windows, tout tant prvu pour le langage C.

    Dans certains cas il convient d'tre prudent lors de transtypages de chanes de caractres. yyyy Mlange de chanes courtes et de chanes longues

    Encore une fois Delphi nous facilite la vie. En cas de tels mlanges, le compilateur gnre automatiquement le code ncessaire aux conversions. Ce qu'il faut retenir

    Une chane courte une longueur limite 255 caractres et son espace mmoire est allou de manire statique. Une chane longue peut avoir une longueur quasi illimite et est alloue de manire dynamique.

    Si on pense l'avenir, de Windows et de Delphi il est prfrable d'utiliser les chanes longues

  • 120 Chapitre 4 : Les chanes de caractres 2. PChar et tableaux de caractres

    Delphi supporte des chanes de caractres appeles les chanes zro terminal (AZT). Ces chanes sont largement utilises par les langages de programmation C et C++, et par Windows lui-mme. Grce au fait que Delphi supporte les chanes zro terminal, ainsi que des fonctions de gestion de ces chanes (dans l'unit SysUtils), il est facile d'interfacer un programme Delphi avec d'autres langages ou avec l'API Windows.

    Une chane AZT est constitue d'une suite de caractres non null, suivis d'un caractre NULL (code ASCII #0). Ces chanes n'ont pas d'indicateur de longueur spar; le premier caractre NULL d'une chane AZT marque la fin de cette chane.

    Une chane AZT se dclare de la manire suivante: array[0..N] of Char

    Un tableau de caractres base zro est compatible avec le type PChar.

    Cela signifie que partout o un PChar est attendu, il est possible d'utiliser la place un tableau de caractres base zro.

    Lorsqu'un tableau de caractres base zro est utilis la place d'une valeur PChar, le compilateur convertit le tableau de caractres en une constante pointeur dont la valeur correspond l'adresse du premier lment du tableau. 3. Le type variant

    Le type variant a t introduit pour la premire fois avec Delphi 2, probablement pour concurrencer des langages comme Visual Basic qui disposent de ce type depuis plusieurs annes. Il s'agit en fait d'un type "polymorphe". On peut affecter une variable de type variant des donnes de n'importe quel type simple: entier, rel, caractre, string, boolen

    La section suivante de code montre l'utilisation des variants et de certaines conversions de type automatique qui sont effectues lorsque des variants sont mlangs d'autres types (tir de l'aide de Delphi). var V1, V2, V3, V4, V5: Variant;I: Integer;D: Double;S: string;begin

  • Chapitre 4 : Les chanes de caractres 121

    V1 := 1; { Integer value }V2 := 1234.5678; { Real value }V3 := 'Bonjour'; { String value }V4 := '1000'; { String value }V5 := V1 + V2 + V4; { Real value 2235.5678 }I := V1; { I = 1 }D := V2; { D = 1234.5678 }S := V3; { S = 'Bonjour' }I := V4; { I = 1000 }S := V5; { S = '2235.5678' }end;

    4. Le type currency

    Pendant des annes les programmeurs se sont heurts un problme: comment traiter des sommes d'argent, des donnes montaires. Les nombres rels ne conviennent pas, pour des raisons de manque de prcision, de troncation et/ou d'arrondi. Les nombres entiers n'ont pas l'indispensable partie dcimale. Des solutions ont bien entendu t dveloppes, mais il est toujours plus agrable de disposer d'un type montaire.

    Delphi dfinit justement un nouveau type montaire appel Currency, qui est un type virgule flottante spcialement prvu pour grer les valeurs avec une grande prcision. Currency est compatible au niveau affectation avec tous les autres types virgule flottante (et les types variants), mais il est stock dans un entier sur 64 bits, comme le type Comp.

    Les valeurs de type montaire ont une prcision de quatre dcimales, c'est--dire que la valeur flottante est stocke dans un format entier dans lequel les quatre chiffres les moins significatifs reprsentent les quatre dcimales. 5. Traitement de chanes de caractres

    Nous n'allons pas dcrire en dtail toutes les routines de traitement de chanes de caractres fournies par Delphi dans l'unit SysUtils. Nous n'en donnons que la liste avec un rsum des fonctionnalits.

  • 122 Chapitre 4 : Les chanes de caractres yyyy Routines de traitement de chane AZT

    Fonction Description StrAlloc Alloue une zone tampon dune taille donne sur la tas.

    StrBufSize Renvoie la taille dune zone tampon de caractre alloue en utilisant StrAlloc ou StrNew. StrCat Concatne deux chanes.

    StrComp Compare deux chanes. StrCopy Copie une chane.

    StrDispose Dispose une zone tampon caractre alloue en utilisant StrAlloc ou StrNew. StrECopy Copie une chane et renvoie un pointeur la fin de la chane.

    StrEnd Rovoie un pointeur la fin dune chane. StrFmt Format une ou plusieurs valeurs dans une chane.

    StrLComp Compare deux chanes sans tenir compte des majuscules / minuscules.

    StrLCat Concatne deux chanes avec une longueur maximum donne de la chane rsultante. StrLIComp Compare deux chanes de longueur maximum donne. StrLCopy Copie une chane jusqu une longueur maximum donne.

    StrLen Renvoie la longueur dune chane.

    StrLFmt Formate une ou plusieurs valeurs dans une chane avec une longueur maximum donne.

    StrLIComp Compare deux chanes pour une longueur maximum donne sans tenir compte des majuscules /minuscules. StrLower Convertit une chane en minuscules. StrMove Dplace un bloc de caractres dune chane sur lautre. StrNew Alloue une chane sur le tas.

    StrPCopy Copie une chane pascal vers une chane zro terminal.

    StrPLCopy Copie une chane pascal vers une chane AZT avec une longueur maximum donne.

    StrPos Renvoie un pointeur sur la premire occurrence dune sous-chane donnes dans une chane.

    StrRScan Renvoie un pointeur sur la dernire occurrence dun caractre donne dans une chane. StrUpper Convertit une chane en majuscules.

  • Chapitre 4 : Les chanes de caractres 123

    yyyy Routines de traitement de chanes ShortString (chanes Pascal)

    Fonction Description

    AdjustLineBreaks Transforme les ruptures de lignes dans une chane en squences CR/LF.

    AnsiCompareStr Comparaison, en tenant compte des majuscules/minuscules, de deux chanes.

    AnsiCompareText Comparaison sans tenir compte des majuscules/minuscules, de deux chanes. AnsiLowerCase Convertit des caractres en minuscules. AnsiUpperCase Convertit des caractre en majuscules.

    CompareStr Comparaison en tenant compte des majuscules/minuscules de deux chanes.

    CompareText Comparaison sans tenir compte des majuscules/minuscules de deux chanes. ConCat Concatne une suite de chanes. Copy Renvoie une sous-chane dune chane. Delete Efface une sous-chane dune chane.

    DisposeStr Libre une chane du tas.

    FmtLoadStr Charge une chane dans la ressource table de chanes dun programme. Insert Insre une sous- chane dans une chane.

    IntToHex Convertit un entier en hexadcimal. IntToStr Convertit un entier en chane.

    IsValidIdent Renvoie true si la chane spcifie est un identificateur valide. Length Renvoie la longueur dynamique de la chane.

    LoadStr Charge la ressource chane depuis le fichier excutable de lapplication. LowerCase Met en minuscules la chane spcifie.

    NewStr Alloue une nouvelle chane dans le tas. Pos Cherche une sous- chane dans une chane. Str Convertit une valeur numrique en chane.

    StrToInt Convertit une chane en entier. StrToIntDef Convertit une chane en entier ou une valeur par dfaut.

    Trim Supprime les espaces de dbut et de fin et les caractres de contrle dune chane donne.

    TrimLeft Supprime les espaces de dbut et les caractres de contrle dune chane donne.

    TrimRight Supprime les espaces de fin et les caractres de contrle dune chane donne.

  • 124 Chapitre 4 : Les chanes de caractres

    Fonction Description UpperCase Met en majuscules la chane spcifie.

    Val Convertit une valeur chane en sa reprsentation numrique. 6. Autres routines de Delphi

    Delphi intgre plusieurs centaines de routines diverses. Les voici, tires de l'aide de Delphi et regroupes par catgories: yyyy Routines arithmtiques

    Fonction Description Abs Renvoie la valeur absolue de largument.

    ArcTan Renvoie larc tangente de largument. Cos Renvoie le cosinus de largument (x est un angle en radians). Exp Lexponentielle de largument. Frac Renvoie la partie fractionnelle de largument. Int Renvoie la partie entire de largument. Ln Renvoie largument naturel de largument. Pi Renvoie la valeur de pi. Sin Renvoie le sinus de largument. Sqr Renvoie le carr de largument. Sqrt Renvoie la racine carre de largument.

    yyyy Routines de date et heure

    Fonction Description Date Renvoie la date en cours.

    DateTimeToStr Convertit une valeur heure en chane. DateTimeToString Convertit une valeur de format date en chane.

    DateToStr Convertit une valeur du format date en chane. DayOfWeek Renvoie le jour de la semaine. DecodeDate Dcode la date spcifie. DecodeTime Dcode lheure spcifie. EncodeDate Renvoie les valeurs spcifies au format date. EncodeTime Renvoie les valeurs spcifies au format date.

    FormatDateTime Formate une date et une heure en utilisant le format spcifi. Now Renvoie lheure et la date en cours.

    StrToDate Convertit une chane en date. StrToDateTime Convertit une chane au format date/heure.

    StrToTime Convertit une chane au format heure.

  • Chapitre 4 : Les chanes de caractres 125

    Fonction Description Time Renvoie lheure en cours.

    TimeToStr Convertit un format heure en chane. yyyy Routines de gestion de fichiers

    Fonction Description ChangeFileExt Change lextension de fichier.

    DateTimeToFileDate Convertit le format de date Delphi en un format de date DOS. DeleteFile Efface un fichier. DiskFree Renvoie lespace disque disponible. DiskSize Renvoie lespace disque disponible

    ExpandFileName Renvoie une chane contenant un nom de chemin daccs complet et un nom de fichier.

    ExtractFileDir Renvoie uniquement la partie lecteur et rpertoire dun nom de fichier. ExtractFileExt Renvoie uniquement lextension de fichier.

    ExtractFileName Renvoie uniquement le nom du fichier. ExtractFilePath Renvoie le chemin daccs du fichier spcifi.

    FileAge Renvoie lge du fichier. FileClose Ferme un fichier donn. FileCreate Cre un fichier de nom donn.

    FileDateToDateTime Convertit un format de date DOS en un format de date delphi. FileExists Renvoie True si un fichier existe.

    FileGetAttr Renvoie les attributs de fichiers. FileGetDate Renvoie lindicateur DOS de date et dheure du fichier.

    FileOpen Ouvre un fichier donn dans les rpertoires. FileRead Lit depuis un fichier spcifique.

    FileSearch Recherche un fichier donn dans les rpertoires. FileSeek Change la position en cours dans le fichier.

    FileSetAttr Dfinit les attributs du fichier. FileSetDate Dfinit lindicateur DOS de date et heure du fichier. FileWrite Ecrit dans un fichier spcifique. FindClose Termine une squence FindFirst / FindNext.

    FindFirst Recherch un nom de fichier et ensemble dattributs spcifis dans un rpertoire.

    FindNext Renvoie la prochaine entre correspondant au nom aux attributs.

  • 126 Chapitre 4 : Les chanes de caractres

    Fonction Description RenameFile Renomme un fichier.

    yyyy Routines de conversion de nombres virgule flottante

    Fonction Description FloatToDecimal Convertit une valeur flottante en reprsentation dcimale.

    FloatToStrF Convertit une valeur flottante en sa reprsentation chane. FloatToStr Convertit une valeur flottante en sa reprsentation chane.

    FloatToText Convertit une valeur flottante en reprsentation dcimale. FloatToTextFmt Convertit une valeur flottante en reprsentation dcimale.

    FormatFloat Formate la valeur flottante en utilisant le format spcifi. StrToFloat Convertit la chane spcifie en une valeur flottante.

    TextToFloat Convertit la chane zro terminal en une valeur flottante. yyyy Routines d'entre/sortie

    Fonction Description AssignFile Assigne le nom dun fichier externe une variable fichier. CloseFile Ferme un fichier ouvert.

    Eof Renvoie le statut de fin de fichier. Erase Efface un fichier externe.

    FilePos Renvoie la position en cours lintrieur du fichier. FileSize Renvoie la taille dun fichier. GetDir Renvoie le rpertoire par dfaut dun lecteur.

    IoResult Renvoie le statut de la dernire opration dentres/ sorties. MkDir Cre un sous-rpertoire.

    Rename Renomme un fichier externe. Reset Ouvre un fichier existant.

    Rewrite Cre et ouvre un nouveau fichier. RmDir Supprime un rpertoire vide.

    Seek Dplace la position lintrieur dun fichier un emplacement donn. Truncate Tronque le fichier sa position actuelle.

  • Chapitre 4 : Les chanes de caractres 127

    yyyy Routines d'ordinaux

    Fonction Description Dec Dcrmente une variable. Inc Incrmente une variable. Odd Teste si largument est un nombre impair. Pred Renvoie le prdcesseur de largument. Succ Renvoie le successeur de largument.

    yyyy Routines de formatage de chanes

    Fonction Description

    FmtStr Formate une srie darguments, le rsultat est renvoy dans le paramtre Result.

    Format Format une srie darguments et renvoie le rsultat sous la forme dune chane pascal. FormatBuf Formate une srie darguments.

    StrFmt Formate une srie darguments.

    StrLFmt Formate une srie darguments, le rsultat contient un pointeur sur le tampon destination. yyyy Routines de fichiers texte

    Fonction Description Append Ouvre en ajout un fichier existant.

    Eoln Renvoie le statut de fin de ligne dun fichier texte. Flush Vide le tampon dun fichier texte ouvert en sortie.

    Read Pour les fichiers typs, lit un composant du fichier dans une variable. Pour les fichiers texte, lit une ou plusieurs valeurs dans une ou plusieurs variables.

    Readln Excute la procdure read puis passe la ligne suivante du fichier. SeekEof Renvoie le statut de fin de fichier dun fichier. SeekEoln Renvoie le statut de fin de ligne dun fichier.

    SetTextBuf Affecte un tampon dentres/ sorties un fichier texte.

    Write Pour les fichiers typs crit une variable dans un composant du fichier. Pour les fichiers texte crit une ou plusieurs valeurs dans le fichier.

    Writeln Excute la procdure Write, puis crit le marqueur de fin de ligne dans le fichier.

  • 128 Chapitre 4 : Les chanes de caractres yyyy Routines de transfert

    Fonction Description Chr Renvoie le caractre de numro dordre spcifi. High Renvoie la plus grande valeur dans lintervalle de largument. Low Renvoie le numro dordre dune valeur de type ordinal.

    Round Arrondit une valeur de type rel en une valeur de type entier. Trunc Tronque une valeur de type rel en une valeur de type entier.

    yyyy Routines de fichiers non-typs

    Fonction Description BlockRead Lit un ou plusieurs enregistrements dans une variable. BlockWrite Ecrit un ou plusieurs enregistrements dans une variable.

    yyyy Routines de gestion des variants

    Fonction Description

    VarArrayCreate Cre un tableau de variants de type et de bornes spcifies.

    VarArrayDimCount Renvoie le nombre de dimensions dun tableau de variants donn.

    VarArrayHighBound Renvoie la borne suprieure pour une dimension donne dun tableau de Variants donn. VarArrayLock Verrouille un variant donn.

    VarArrayLowBound Renvoie la borne infrieure pour une dimension donne dun tableau de variants donn.

    VarArrayOf Renvoie un tableau de variants donn avec les lments spcifis.

    VarArrayRedim Redimensionne un tableau de variants donn en changeant la bome suprieure. VarArrayUnlock Dverrouille un tableau de variants donn.

    VarAsType Convertit un variant au type spcifi. VarCast Convertit un variant au type spcifi et lenregistre. VarClear Efface un variant donn. VarCopy Copie un variant donn dans un variant spcifi.

    VarFromDateTime Renvoie un variant contenant une date/heure donne. VarIsArray Indique si un variant donn est un tableau. VarIsEmpty Indique si un variant donn est unassigned.

  • Chapitre 4 : Les chanes de caractres 129

    Fonction Description VarIsNull Indique si un variant donn est NULL.

    VarToDateTime Convertit un variant donn en une valeur date/ heure. VarType Convertit un variant au type spcifi et lenregistre.

    yyyy Routines diverses

    Fonction Description

    AddExitProc Ajoute une procdure la liste des procdures de sortie de la bibliothque dexcution. ChDir Change de rpertoire en cours.

    Exclude Exclut un lment dun ensemble.

    FillChar Remplit un nombre spcifi doctets contigus avec une valeur spcifie (de type byte ou char) Hi Renvoie loctet de poids fort de largument.

    Include Inclut un lment dans un ensemble. Lo Renvoie loctet de poids faible de largument

    Move Copie les octets dune source dans une destination

    ParamCount Renvoie le nombre de paramtre transmis au programme dans la ligne de commande. ParamStr Renvoie le paramtre spcifi. Random Renvoie un nombre alatoire.

    Randomize Initialise le gnrateur intgr de nombres alatoires avec une valeur alatoire obtenue partir de lhorloge systme. SizeOf Renvoie le nombre doctets occups par largument. Swap Permute les octets de poids fort et de poids faible de largument.

    UpCase Convertit un caractre en majuscule.

  • T r a v a ux d i r i g s n 4 Les chane de caractres

    Exercice 01 : Dans cet exercice : - Utilisation de la fonction length() et la concatnation de chanes Cet exercice vise raliser un programme qui A partir dune chane de caractres saisie, on obtient la mme chane crite

    lenvers. Ce quon doit obtenir : On doit avoir la fentre suivante :

    Exercice 02 Dans cet exercice : - Utilisation du composant Memo. - Recherche de chane dans un texte - Rechercher sa position dans le texte - Slection dun texte a lintrieur dun Memo ( SelStart et SelLength) Cet exercice vise raliser une application qui recherche un mot dans un texte On doit rechercher la premire occurrence du mot dans le texte. Afficher un message si le mot recherch est introuvable.

  • T r a v a u x d i r i g s 131

    Ce quon doit obtenir : On doit avoir la fentre suivante :

    Exercice 03 Dans cet exercice :

    - Utilisation de la fonction length() - Concatnation de chane. - Manipulation sur les chanes de caractres

    Ecrire un programme qui Affiche une zone pour la saisie dun mot. Utiliser un bouton qui permet de vrifier si ce mot est palindrome ou pas. NB : Un mot palindrome est un mot qui est gale a sont reflet miroir, exemple :

    elle, esse... Ce quon doit obtenir : On doit avoir la fentre suivante :

  • 132 T r a v a u x d i r i g s

    Exercice 04 Dans cet exercice :

    - Utilisation du composant ListBox. - Recherche dun mot dans une liste. - Comparaison de deux chanes en utilisant la conversion de chane de

    caractres quelconque vers une chane en majuscule Ecrire un programme qui recherche un mot dans une liste : On doit rechercher le mot sans tenir compte de la diffrence Majuscule/

    Minuscule et on doit afficher son ordre dans la liste. Afficher un message si le mot recherch est introuvable. Ce quon doit obtenir : On doit avoir la fentre suivante :

    Exercice 05 Dans cet exercice :

    - Utilisation de la fonction Length(). - Utilisation des contrles ComboBox et Checkbox. - Manipulation sur les chanes de caractre

    Ecrire un programme qui Affiche une zone pour la saisie dune chane. Utiliser un bouton qui permet de rechercher le nombre doccurrences dune

    lettre dans cette chane. Le choix de la lettre rechercher doit se faire partir dune liste droulante

  • T r a v a u x d i r i g s 133

    lors du choix dune lettre, par exemple B, permettre selon le choix de rechercher :

    uniquement B majuscule, B (majuscule) et b (minuscule)

    Ce quon doit obtenir : On doit avoir la fentre suivante :

  • S o l u t i o n s T D 4 Exercice 01 Ce qui a t demand : On devait avoir la fentre suivante :

    Sur votre micro :

    Suivre les tapes suivantes : ) Ouvrir Delphi, sil nest pas encore ouvert ou choisir dans le menu fichier le

    sous menu Nouvelle Application. Le projet est maintenant constitu dune seule fentre appele Form1. ) Dans linspecteur dobjet, et dans longlet proprit, dfinir la valeur de sa

    proprit Caption en lui attribuant la valeur Reflet Miroir ) Dans la palette des composants choisir longlet Standard, placer deux boutons

    de commande Button sur la fentre Form1. Ces boutons ont pour nom respectivement Button1 et Button2. ) Dans linspecteur dobjet, dfinir la valeur Caption des deux boutons en leurs

    attribuant respectivement les valeurs Inverser et Quitter. ) Dans la palette des composants, placer deux (02) composants Edit sur la

    fentre Form1, comme prsent dans la fentre de lexercice. Ces contrles Edit ont pour nom respectivement Edit1 et Edit2. ) Effacer la valeur de leur proprit Text. ) Toujours dans la palette des composants et dans longlet Standard, placer deux

    composants Label sur la fentre Form1. Ces contrles Label ont pour nom respectivement Label1 et Label2.

  • Corrig des exercices 135

    ) Pour les composants Label dfinir la valeur de la proprit Caption et leur attribuer respectivement, la valeur Saisir une Chane decaractres: et Le reflet miroir de cette chane decaractres:. ) Dimensionnez la fentre pour quelle ait une bonne prsentation.

    Maintenant la maquette ou linterface de lapplication est prte. il est donc ncessaire de rajouter le code correspondant chaque composant. ) Double-cliquez sur le bouton Inverser, Delphi cre la dclaration de la

    procdure correspondante lvnement OnClick du bouton. Et on rajoutant les instructions adquates cette procdure doit tre comme suit :

    procedure TForm1.Button1Click(Sender: TObject);var i,taille: integer;

    chaine: string;begintaille:=length(edit1.text); {1}for i:= 1 to taille dochaine:= edit1.text[i]+chaine; {2}edit2.text:= chaine;end;

    - La fonction Lenght() retourne la taille de la chane. - Lordre dans lopration de concatnation de chanes est important, les

    instructions suivantes donnent des rsultats diffrents. 1. chaine := chaine + edit1.text[i] 2. chaine := edit1.text[i]+chaine

    ) Double-cliquez sur le bouton Quitter et rajoutez linstruction qui ferme lapplication. ) Enregistrer le projet et lunit. ) Enfin Compiler et Excuter le projet en choisissant dans la barre doutils

    Dboguer.

  • 136 Corrig des exercices

    Exercice 02 Ce qui a t demand : On devait avoir la fentre suivante :

    Sur votre micro :

    Suivre les tapes suivantes : ) Ouvrir Delphi, sil nest pas encore ouvert ou choisir dans le menu fichier le

    sous menu Nouvelle Application. Le projet est maintenant constitu dune seule fentre appele Form1. ) Dans linspecteur dobjet, et dans longlet proprit dfinir la valeur de sa

    proprit Caption en lui attribuant la valeur Recherche de chane ) Dans la palette des composants choisir longlet Standard, placer deux boutons

    de commande Button sur la fentre Form1. Ces boutons ont pour nom respectivement Button1 et Button2. ) Dans linspecteur dobjet et dans longlet Proprits dfinir la valeur Caption

    du 1er bouton et lui attribuer la valeur &Rechercher. ) Dfinir la valeur de la proprit Caption du 2me bouton et lui attribuer la

    valeur &Quitter ) Dans la palette des composants choisir longlet Standard, placer un composant

    Edit sur la fentre Form1, comme prsent dans la fentre de lexercice. Ce contrle Edit a pour nom Edit1. ) Effacer la valeur de la proprit Text du composant Edit1. ) Dans la palette des composants choisir longlet Standard, placer un composant

    Label sur la fentre Form1, comme prsent dans la fentre de lexercice. Ce contrle Label a pour nom Label1.

  • Corrig des exercices 137

    ) Pour le composant Label dfinir la valeur de la proprit Caption et lui attribuer la valeur Entrer le mot rechercher. ) Dans la barre doutils des composants et dans longlet Standard placer un

    composant Memo sur Form1, ce composant a pour nom Memo1. Ce composant va servir pour la saisie du texte. ) Dans linspecteur dobjet et dans longlet proprit, slectionner les points a

    cot de la proprit Lines. La fentre Editeur de ligne de chane saffiche pour permettre la saisie du texte qui va safficher dans le composant memo1. ) Entrer alors un texte de votre choix par exemple : le monde de l'informatique est un univers de merveillesle monde de l'conomie est un univers d'argentle monde de la mdecine est un univers d'espoir. ) Dimensionnez la fentre pour quelle ait une bonne prsentation.

    Maintenant linterface de lapplication est prte. Il est donc ncessaire de rajouter le code correspondant chaque composant. ) Double-cliquez sur le bouton Rechercher, Delphi cre la dclaration de la

    procdure correspondante lvnement OnClick du bouton. Et en rajoutant les instructions adquates cette procdure doit tre comme suit :

    procedure TForm1.Button1Click(Sender: TObject);var posM,posL,i,j: integer; {1}

    trouv: boolean;begintrouv := false;for I := 0 to Memo1.Lines.Count do

    beginposL:= pos(edit1.text, memo1.lines[i]); {2}if posL 0 thenbeginposM := 0;for J := 0 to I - 1 do {3}posM := posM + Length(Memo1.Lines[J]);posM := posM + (I*2); {4}posM := posM + PosL - 1; {5}Memo1.SetFocus;Memo1.SelStart := posM; {6}Memo1.SelLength := Length(edit1.Text); {7}trouv:=true;Break; {8}

  • 138 Corrig des exercices

    end;end;

    if trouv = False thenshowmesage ('le mot recherch est

    introuvable');end ; - Les variables posL et posM {1} servent, respectivement pour calculer la position du mot recherch dans la ligne courante et la position du mot recherch dans le composant Memo1.. - La fonction Pos() {2} permet de rechercher un mot dans une ligne, si le mot est trouv, elle retourne sa position dans la ligne, si le mot est introuvable elle renvoie la valeur 0. - Si le mot est trouv, on doit rechercher sa valeur dans le composant Memo1, pour cela on calcule le nombre de caractres le prcdant. - Linstruction Fordo {3} permet dajouter la variable posM le nombre de caractres dans chaque ligne prcdant le mot trouv - Etant donn que chaque ligne se termine par un caractre de fin de ligne et un caractre de retour la ligne, on doit rajouter la variable PosM la valeur (2*Nombre de lignes) {4} - Enfin pour terminer le calcul de posM on lui rajoute la position du mot dans la ligne o on la trouv {5}. - On positionne le curseur sur le mmo et on indique la position de dbut de la slection {6} et la longueur du mot slectionner {7}. - La fonction break {8} permet de mettre fin a la boucle For..do ) Enregistrer le projet et lunit. ) Enfin Compiler et Excuter le projet en choisissant dans la barre doutils

    Dboguer.

  • Corrig des exercices 139

    Exercice 03 Ce qui a t demand : On doit avoir la fentre suivante :

    Sur votre micro : Suivre les tapes suivantes : ) Ouvrir Delphi, sil nest pas encore ouvert, ou choisir dans le menu fichier le

    sous menu Nouvelle Application. Le projet est maintenant constitu dune seule fentre appele Form1. ) Dans linspecteur dobjet, dans longlet Proprit, dfinir la valeur de sa

    proprit Caption en lui attribuant la valeur Palindrome ) Dans la palette des composants choisir longlet Standard, placer deux boutons

    de commande Button sur la fentre Form1. Ces boutons ont pour nom respectivement Button1, Button2. ) Dans linspecteur dobjet, dfinir la valeur Caption de ces boutons en leurs

    attribuant respectivement les valeurs &Vrifier et &Quitter. ) Toujours dans la palette des composants et dans longlet Standard, placer deux

    composants Label sur la fentre Form1. Ces contrles ont pour nom Label1, Label2. ) Pour ces composants Label dfinir la valeur de la proprit Caption et leur

    attribuer respectivement les valeurs Saisir un mot et Resultats. ) Placer deux zones de saisie Edit sur la fentre Form1. Ces composants ont

    pour nom respectivement Edit1, Edit2. ) Dans linspecteur dobjet effacer la valeur de la proprit Text des composants

    Edit1 et Edit2. ) Dfinir la proprit ReadOnly de Edit2 en lui attribuant la valeur True

  • 140 Corrig des exercices

    ) Dimensionnez la fentre pour quelle ait la prsentation de la fentre de lexercice.

    Maintenant la maquette ou linterface de lapplication est prte. Il faut simplement rajouter le code correspondant chaque composant. ) Double-cliquez sur le bouton Verifier, et rajouter les instructions adquates.

    Cette procdure doit tre comme suit : procedure TForm1.Button1Click(Sender: TObject);var i ,taille: integer;

    miroire:string; {1}beginmiroire:='';taille :=length(edit1.text); {2}

    for i:=1 to taille domiroire :=miroire + edit1.Text[taille-i+1];

    if edit1.Text=miroire then {3}edit2.text:= 'mot palindrome'elseedit2.text:= 'mot nom palindrome';

    end; - La variable miroir {1} contient la chane inverse du contenu de Edit1. - La fonction Length() {2} renvoi la longueur de la chane quelle a en argument. - Linstruction de test vrifie si la chane est gale a son reflet miroir et affichage du rsultat correspondant. ) Double-cliquez sur le bouton Quitter, et rajouter linstruction qui mettra fin

    lapplication. ) Enregistrer le projet et lunit. ) Enfin Compiler et Excuter le projet en choisissant dans la barre doutils

    Dboguer.

  • Corrig des exercices 141

    Exercice 04 Ce qui a t demand : On devait avoir la fentre suivante :

    Sur votre micro : Suivre les tapes suivantes : ) Ouvrir Delphi, sil nest pas encore ouvert ou choisir dans le menu fichier le

    sous menu Nouvelle Application. Le projet est maintenant constitu dune seul fentre appele Form1. ) Dans linspecteur dobjet, et dans longlet proprit dfinir la valeur de sa

    proprit Caption en lui attribuant la valeur Recherche mot dansune liste ) Dans la palette des composants choisir longlet Standard, placer deux boutons

    de commande Button sur la fentre Form1. Ces boutons ont pour nom respectivement button1 et Button2. ) Dans linspecteur dobjet et dans longlet Proprits dfinir la valeur Caption

    des boutons en leur attribuant respectivement les valeurs &recherche et &Quitter. ) Dans la palette des composants choisir longlet Standard, placer 2 composants

    Edit sur la fentre Form1, comme prsent dans la fentre de lexercice. Ces contrles Edit ont pour nom Edit1 et Edit2. ) Effacer la valeur de la proprit text des deux composants Edit.

  • 142 Corrig des exercices

    ) Dfinir la valeur de la proprit Readonly de Edit2 et lui attribuer la valeur True. ) Dans la palette des composants choisir longlet Standard, placer deux

    composants Label sur la fentre Form1, comme prsent dans la fentre de lexercice. Ces contrles Label on pour nom Label1 et label2. ) Pour les composants Label dfinir la valeur de la proprit Caption et leur

    attribuer respectivement les valeurs Saisir le Mot rechercherdans la liste et Resultats. ) Dans la barre doutils des composants et dans longlet Standard placer un

    composant ListBox sur Form1, le composant a pour nom ListBox1. Ce composant va servir pour la saisie des mots qui saffiche dans la liste. ) Dans linspecteur dobjet, slectionner la proprit Items. La fentre Editeur

    de ligne de chane saffiche pour permettre la saisie des mots de ce composant. ) Entrer alors un texte des mots de votre choix (chaque mot doit tre crit sur

    une ligne) par exemple : arbre informatique pages pieds processeur tout voiture mots zero . ) Dimensionnez la fentre pour quelle ait une bonne prsentation.

    Maintenant la maquette ou linterface de lapplication est prte. Il est donc ncessaire de rajouter le code correspondant chaque composant. ) Double-cliquer sur le bouton Rechercher, Delphi cre la dclaration de la

    procdure correspondante lvnement OnClick du bouton. Et on rajoutant les instructions adquates cette procdure doit tre comme suit :

    procedure TForm1.Button1Click(Sender: TObject);var i : integer;

    trouv:boolean;Chaine : string;

    begintrouv:=false;chaine:=lowercase(edit1.text); {1}For i:=0 to listbox1.items.Count-1 do {2}beginif lowercase(listbox1.Items.Strings[i])=Chaine

    then begin {3}trouv:=true;break; {4}

  • Corrig des exercices 143

    end;end;if trouv = true then {5}

    edit2.text:='texte trouv la position: ' +inttostr(i+1)

    elseedit2.text:= 'texte introuvable dans la Liste';

    end; - Linstruction lowercase {1} permet, de convertir le mot recherch en majuscule. - Linstruction Fordo{2} permet de rechercher le mot dans la liste en comparant {3} chaque fois la valeur de la variable Chaine avec le texte du composant liste. Et ds que le texte recherch est trouv on sort de la boucle{4}. - Linstruction de test {5} vrifie si le mot recherch est trouv, donc affichage du message correspondant chaque cas. ) Enregistrer le projet et lunit. ) Enfin Compiler et Excuter le projet en choisissant dans la barre doutils

    Dboguer. Exercice 05 Ce qui a t demand:

    On devait avoir la fentre suivante :

  • 144 Corrig des exercices

    Sur votre micro : Suivre les tapes suivantes : ) Ouvrir Delphi, sil nest pas encore ouvert ou choisir dans le menu Fichier le

    sous menu Nouvelle Application. Le projet est maintenant constitu dune seule fentre appele Form1. ) Dans linspecteur dobjet, dans longlet Proprit, dfinir la valeur de sa

    proprit Caption en lui attribuant la valeur Recherche caractre ) Dans la palette des composants choisir longlet Standard, placer deux boutons

    de commande Button sur la fentre Form1. Ces boutons ont pour nom respectivement Button1, Button2. ) Dans linspecteur dobjet, dfinir la valeur Caption de ces boutons en leurs

    attribuant respectivement les valeurs &Rechercher et &Quitter. ) Toujours dans la palette des composants et dans longlet Standard, placer deux

    composants Label sur la fentre Form1. Ces contrles ont pour nom Label1 et Label2. ) Pour ces composants Label dfinir la valeur de la proprit Caption et leur

    attribuer respectivement les valeurs Saisir un texte et Choisirun caractre. ) Placer deux zones de saisie Edit sur la fentre Form1. Ces composants ont

    pour nom respectivement Edit1, Edit2. ) Dans linspecteur dobjet effacer la valeur de la proprit Text des composants

    Edit1 et Edit2. ) Dfinir la proprit ReadOnly de Edit2 en lui attribuant la valeur True ) Dans la palette des composants choisir longlet Standard, placer un composant

    ComboBox sur la fentre Form1. Ce composant a pour nom ComboBox1. ) Dans linspecteur dobjet dfinir la proprit Text du composant Combobox1

    et lui attribuer la valeur a. ) Toujours dans la palette des composants et dans longlet Standard, placer un

    composant CheckBox sur la fentre Form1. Ce composant a pour nom CheckBox1. ) Dans linspecteur dobjet dfinir la proprit Caption du composant

    CheckBox1 et lui attribuer la valeur Differencier majuscule etminuscule. ) Dimensionnez la fentre pour quelle ait la prsentation de la fentre de

    lexercice.

  • Corrig des exercices 145

    Maintenant la maquette ou linterface de lapplication est prte. Il faut simplement rajouter le code correspondant chaque composant. ) Double-clique sur Form1 et rajouter les instructions pour remplir

    automatiquement les valeur qui saffiche dans la liste droulante Combobox1. Cette procdure doit tre comme suit :

    procedure TForm1.FormCreate(Sender: TObject);var Car : Char;beginFor Car:='A' to 'Z' do {1}Combobox1.items.add (Car);For Car:='a' to 'z' do {2}Combobox1.items.add (Car);end;

    - la boucle For ... do {1} permet de rajouter les lettres majuscules et

    la 2me boucle {2} permet de rejouter les lettres minuscules. ) Double-clique sur le bouton Rechercher, et rajouter les instructions

    adquates. Cette procdure doit tre comme suit : procedure TForm1.Button1Click(Sender: TObject);var i,NbOcc :integer;Car,Car2 : char;beginNbOcc:=0;if checkbox1.Checked=true then {1}beginCar:=combobox1.text[1];for i:=1 to length(edit1.text) do {2}if edit1.text[i]= Car then {3}NbOcc:= NbOcc+1;

    endelsebeginCar := combobox1.text[1];if car in ['A'..'Z'] then {4}

    beginCar2:= car;Inc(car2,32); {le caractre minuscule} {5}end

  • 146 Corrig des exercices

    elsebeginCar2:= car;Dec(car2,32);{le caractre majuscule} {6}end;

    for i:=1 to length(edit1.text) do {7}if (edit1.text[i]=car)or(edit1.text[i]=car2)then {8}NbOcc:= NbOcc+1;

    end;if NbOcc= 0 then {9}edit2.text:= 'la lettre( ' + combobox1.text+

    ' )est introuvable dans le texte saisie'elseedit2.text:= 'le nombre d''occurence de la

    lettre( ' + combobox1.text + ' )est: '+inttostr(NbOcc);

    end;- Linstruction de test vrifie {1}, sil faut faire la diffrence par exemple entre un a et un A. - Sil faut faire la diffrence, donc on utilise une boucle {2} a lintrieur de laquelle il y a une instruction de test {3} pour le calcul du nombre doccurrences de la lettre. - Sinon, suivant le caractre saisie {4} on calcule le caractre compos :

    Si le caractre est majuscule on calcule le caractre minuscule {5} Si le caractre est minuscule on calcule le caractre majuscule {6} Et en utilisant une boucle {7} a lintrieur de laquelle il y a une

    instruction de test{8} on calcule du nombre doccurrence de la lettre. - Linstruction de test {9} vrifie si le nombre doccurrence de la lettre est gale zro donc lettre introuvable dans la chane, sinon, il y a affichage du nombre doccurrence de cette lettre. ) Double-cliquer sur le bouton Quitter, et rajouter linstruction qui mettra fin

    lapplication. ) Enregistrer le projet et lunit. Enfin Compiler et Excuter le projet en choisissant dans la barre doutils Dboguer.