You are on page 1of 32

CHAPITRE

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 :
Exercice n 2 :
Exercice n 3 :
Exercice n 4 :
Exercice n 5 :

Concatnation de chanes
Recherche de chanes dans un texte
Manipulation dune chane
Utilisation de listBox
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.
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.
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.
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.
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.

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;
begin
libelle := '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;
begin
libelle := '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.
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


V1 := 1;
V2 := 1234.5678;
V3 := 'Bonjour';
V4 := '1000';
V5 := V1 + V2 + V4;
I := V1;
D := V2;
S := V3;
I := V4;
S := V5;
end;

{
{
{
{
{
{
{
{
{
{

121

Integer value }
Real value }
String value }
String value }
Real value 2235.5678 }
I = 1 }
D = 1234.5678 }
S = 'Bonjour' }
I = 1000 }
S = '2235.5678' }

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

Routines de traitement de chane AZT


Fonction
StrAlloc
StrBufSize
StrCat
StrComp
StrCopy
StrDispose
StrECopy
StrEnd
StrFmt
StrLComp
StrLCat
StrLIComp
StrLCopy
StrLen
StrLFmt
StrLIComp
StrLower
StrMove
StrNew
StrPCopy
StrPLCopy
StrPos
StrRScan
StrUpper

Description
Alloue une zone tampon dune taille donne sur la tas.
Renvoie la taille dune zone tampon de caractre alloue en
utilisant StrAlloc ou StrNew.
Concatne deux chanes.
Compare deux chanes.
Copie une chane.
Dispose une zone tampon caractre alloue en utilisant StrAlloc
ou StrNew.
Copie une chane et renvoie un pointeur la fin de la chane.
Rovoie un pointeur la fin dune chane.
Format une ou plusieurs valeurs dans une chane.
Compare deux chanes sans tenir compte des majuscules /
minuscules.
Concatne deux chanes avec une longueur maximum donne de
la chane rsultante.
Compare deux chanes de longueur maximum donne.
Copie une chane jusqu une longueur maximum donne.
Renvoie la longueur dune chane.
Formate une ou plusieurs valeurs dans une chane avec une
longueur maximum donne.
Compare deux chanes pour une longueur maximum donne sans
tenir compte des majuscules /minuscules.
Convertit une chane en minuscules.
Dplace un bloc de caractres dune chane sur lautre.
Alloue une chane sur le tas.
Copie une chane pascal vers une chane zro terminal.
Copie une chane pascal vers une chane AZT avec une longueur
maximum donne.
Renvoie un pointeur sur la premire occurrence dune souschane donnes dans une chane.
Renvoie un pointeur sur la dernire occurrence dun caractre
donne dans une chane.
Convertit une chane en majuscules.

Chapitre 4 : Les chanes de caractres

123

Routines de traitement de chanes ShortString (chanes Pascal)


Fonction

Description
Transforme les ruptures de lignes dans une chane en
AdjustLineBreaks
squences CR/LF.
Comparaison, en tenant compte des majuscules/minuscules, de
AnsiCompareStr
deux chanes.
Comparaison sans tenir compte des majuscules/minuscules, de
AnsiCompareText
deux chanes.
AnsiLowerCase Convertit des caractres en minuscules.
AnsiUpperCase Convertit des caractre en majuscules.
Comparaison en tenant compte des majuscules/minuscules de
CompareStr
deux chanes.
Comparaison sans tenir compte des majuscules/minuscules de
CompareText
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.
Charge une chane dans la ressource table de chanes dun
FmtLoadStr
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.
Charge la ressource chane depuis le fichier excutable de
LoadStr
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.
Supprime les espaces de dbut et de fin et les caractres de
Trim
contrle dune chane donne.
Supprime les espaces de dbut et les caractres de contrle
TrimLeft
dune chane donne.
Supprime les espaces de fin et les caractres de contrle dune
TrimRight
chane donne.

124

Chapitre 4 : Les chanes de caractres

Fonction
UpperCase
Val

Description
Met en majuscules la chane spcifie.
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:
Routines arithmtiques
Fonction
Abs
ArcTan
Cos
Exp
Frac
Int
Ln
Pi
Sin
Sqr
Sqrt

Description
Renvoie la valeur absolue de largument.
Renvoie larc tangente de largument.
Renvoie le cosinus de largument (x est un angle en radians).
Lexponentielle de largument.
Renvoie la partie fractionnelle de largument.
Renvoie la partie entire de largument.
Renvoie largument naturel de largument.
Renvoie la valeur de pi.
Renvoie le sinus de largument.
Renvoie le carr de largument.
Renvoie la racine carre de largument.

Routines de date et heure


Fonction
Date
DateTimeToStr
DateTimeToString
DateToStr
DayOfWeek
DecodeDate
DecodeTime
EncodeDate
EncodeTime
FormatDateTime
Now
StrToDate
StrToDateTime
StrToTime

Description
Renvoie la date en cours.
Convertit une valeur heure en chane.
Convertit une valeur de format date en chane.
Convertit une valeur du format date en chane.
Renvoie le jour de la semaine.
Dcode la date spcifie.
Dcode lheure spcifie.
Renvoie les valeurs spcifies au format date.
Renvoie les valeurs spcifies au format date.
Formate une date et une heure en utilisant le format spcifi.
Renvoie lheure et la date en cours.
Convertit une chane en date.
Convertit une chane au format date/heure.
Convertit une chane au format heure.

125

Chapitre 4 : Les chanes de caractres


Fonction
Time
TimeToStr

Description
Renvoie lheure en cours.
Convertit un format heure en chane.

Routines de gestion de fichiers


Fonction
ChangeFileExt

Description
Change lextension de fichier.
Convertit le format de date Delphi en un format de date
DateTimeToFileDate
DOS.
DeleteFile
Efface un fichier.
DiskFree
Renvoie lespace disque disponible.
DiskSize
Renvoie lespace disque disponible
Renvoie une chane contenant un nom de chemin daccs
ExpandFileName
complet et un nom de fichier.
Renvoie uniquement la partie lecteur et rpertoire dun
ExtractFileDir
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.
Convertit un format de date DOS en un format de date
FileDateToDateTime
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.
Recherch un nom de fichier et ensemble dattributs
FindFirst
spcifis dans un rpertoire.
Renvoie la prochaine entre correspondant au nom aux
FindNext
attributs.

126

Chapitre 4 : Les chanes de caractres


Fonction
RenameFile

Description
Renomme un fichier.

Routines de conversion de nombres virgule flottante


Fonction
FloatToDecimal
FloatToStrF
FloatToStr
FloatToText
FloatToTextFmt
FormatFloat
StrToFloat
TextToFloat

Description
Convertit une valeur flottante en reprsentation dcimale.
Convertit une valeur flottante en sa reprsentation chane.
Convertit une valeur flottante en sa reprsentation chane.
Convertit une valeur flottante en reprsentation dcimale.
Convertit une valeur flottante en reprsentation dcimale.
Formate la valeur flottante en utilisant le format spcifi.
Convertit la chane spcifie en une valeur flottante.
Convertit la chane zro terminal en une valeur flottante.

Routines d'entre/sortie
Fonction
AssignFile
CloseFile
Eof
Erase
FilePos
FileSize
GetDir
IoResult
MkDir
Rename
Reset
Rewrite
RmDir
Seek
Truncate

Description
Assigne le nom dun fichier externe une variable fichier.
Ferme un fichier ouvert.
Renvoie le statut de fin de fichier.
Efface un fichier externe.
Renvoie la position en cours lintrieur du fichier.
Renvoie la taille dun fichier.
Renvoie le rpertoire par dfaut dun lecteur.
Renvoie le statut de la dernire opration dentres/ sorties.
Cre un sous-rpertoire.
Renomme un fichier externe.
Ouvre un fichier existant.
Cre et ouvre un nouveau fichier.
Supprime un rpertoire vide.
Dplace la position lintrieur dun fichier un emplacement
donn.
Tronque le fichier sa position actuelle.

Chapitre 4 : Les chanes de caractres

127

Routines d'ordinaux
Fonction
Dec
Inc
Odd
Pred
Succ

Description
Dcrmente une variable.
Incrmente une variable.
Teste si largument est un nombre impair.
Renvoie le prdcesseur de largument.
Renvoie le successeur de largument.

Routines de formatage de chanes


Fonction
FmtStr
Format
FormatBuf
StrFmt
StrLFmt

Description
Formate une srie darguments, le rsultat est renvoy dans le
paramtre Result.
Format une srie darguments et renvoie le rsultat sous la
forme dune chane pascal.
Formate une srie darguments.
Formate une srie darguments.
Formate une srie darguments, le rsultat contient un pointeur
sur le tampon destination.

Routines de fichiers texte


Fonction
Append
Eoln
Flush
Read
Readln
SeekEof
SeekEoln
SetTextBuf
Write
Writeln

Description
Ouvre en ajout un fichier existant.
Renvoie le statut de fin de ligne dun fichier texte.
Vide le tampon dun fichier texte ouvert en sortie.
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.
Excute la procdure read puis passe la ligne suivante du
fichier.
Renvoie le statut de fin de fichier dun fichier.
Renvoie le statut de fin de ligne dun fichier.
Affecte un tampon dentres/ sorties un fichier texte.
Pour les fichiers typs crit une variable dans un composant du
fichier. Pour les fichiers texte crit une ou plusieurs valeurs dans
le fichier.
Excute la procdure Write, puis crit le marqueur de fin de
ligne dans le fichier.

128

Chapitre 4 : Les chanes de caractres

Routines de transfert
Fonction
Chr
High
Low
Round
Trunc

Description
Renvoie le caractre de numro dordre spcifi.
Renvoie la plus grande valeur dans lintervalle de largument.
Renvoie le numro dordre dune valeur de type ordinal.
Arrondit une valeur de type rel en une valeur de type entier.
Tronque une valeur de type rel en une valeur de type entier.

Routines de fichiers non-typs


Fonction
BlockRead
BlockWrite

Description
Lit un ou plusieurs enregistrements dans une variable.
Ecrit un ou plusieurs enregistrements dans une variable.

Routines de gestion des variants


Fonction

Description
Cre un tableau de variants de type et de bornes
VarArrayCreate
spcifies.
Renvoie le nombre de dimensions dun tableau de
VarArrayDimCount
variants donn.
Renvoie la borne suprieure pour une dimension donne
VarArrayHighBound
dun tableau de Variants donn.
VarArrayLock
Verrouille un variant donn.
Renvoie la borne infrieure pour une dimension donne
VarArrayLowBound
dun tableau de variants donn.
Renvoie un tableau de variants donn avec les lments
VarArrayOf
spcifis.
Redimensionne un tableau de variants donn en changeant
VarArrayRedim
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


Fonction
VarIsNull
VarToDateTime
VarType

129

Description
Indique si un variant donn est NULL.
Convertit un variant donn en une valeur date/ heure.
Convertit un variant au type spcifi et lenregistre.

Routines diverses
Fonction
AddExitProc
ChDir
Exclude
FillChar
Hi
Include
Lo
Move
ParamCount
ParamStr
Random
Randomize
SizeOf
Swap
UpCase

Description
Ajoute une procdure la liste des procdures de sortie de la
bibliothque dexcution.
Change de rpertoire en cours.
Exclut un lment dun ensemble.
Remplit un nombre spcifi doctets contigus avec une valeur
spcifie (de type byte ou char)
Renvoie loctet de poids fort de largument.
Inclut un lment dans un ensemble.
Renvoie loctet de poids faible de largument
Copie les octets dune source dans une destination
Renvoie le nombre de paramtre transmis au programme dans la
ligne de commande.
Renvoie le paramtre spcifi.
Renvoie un nombre alatoire.
Initialise le gnrateur intgr de nombres alatoires avec une
valeur alatoire obtenue partir de lhorloge systme.
Renvoie le nombre doctets occups par largument.
Permute les octets de poids fort et de poids faible de largument.
Convertit un caractre en majuscule.

Travaux dirigs n4
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.

Travaux dirigs

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

Travaux dirigs

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

Travaux dirigs

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 :

Solutions TD 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 de
caractres: et Le reflet miroir de cette chane de
caractres:.
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;
begin
taille:=length(edit1.text);
for i:= 1 to taille do
chaine:= edit1.text[i]+chaine;
edit2.text:= chaine;
end;
-

{1}
{2}

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 merveilles
le monde de l'conomie est un univers d'argent
le 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;
trouv: boolean;
begin
trouv := false;
for I := 0 to Memo1.Lines.Count do
begin
posL:= pos(edit1.text, memo1.lines[i]);
if posL <> 0 then
begin
posM := 0;
for J := 0 to I - 1 do
posM := posM + Length(Memo1.Lines[J]);
posM := posM + (I*2);
posM := posM + PosL - 1;
Memo1.SetFocus;
Memo1.SelStart := posM;
Memo1.SelLength := Length(edit1.Text);
trouv:=true;
Break;

{1}

{2}

{3}
{4}
{5}
{6}
{7}
{8}

138

Corrig des exercices

end;
end;
if trouv = False then
showmesage ('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;
begin
miroire:='';
taille :=length(edit1.text);
for i:=1 to taille do
miroire :=miroire + edit1.Text[taille-i+1];
if edit1.Text=miroire then
edit2.text:= 'mot palindrome'
else
edit2.text:= 'mot nom palindrome';
end;

{1}

{2}

{3}

- 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 dans
une 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 rechercher
dans 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;
begin
trouv:=false;
chaine:=lowercase(edit1.text);
For i:=0 to listbox1.items.Count-1 do
begin
if lowercase(listbox1.Items.Strings[i])=Chaine
then begin
trouv:=true;
break;

{1}
{2}

{3}
{4}

Corrig des exercices

143

end;
end;
if trouv = true then
{5}
edit2.text:='texte trouv la position: ' +
inttostr(i+1)
else
edit2.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 Choisir
un 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 et
minuscule.
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;
begin
For Car:='A' to 'Z' do
Combobox1.items.add (Car);
For Car:='a' to 'z' do
Combobox1.items.add (Car);
end;
-

{1}
{2}

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;
begin
NbOcc:=0;
if checkbox1.Checked=true then
begin
Car:=combobox1.text[1];
for i:=1 to length(edit1.text) do
if edit1.text[i]= Car then
NbOcc:= NbOcc+1;
end
else
begin
Car := combobox1.text[1];
if car in ['A'..'Z'] then
begin
Car2:= car;
Inc(car2,32); {le caractre minuscule}
end

{1}

{2}
{3}

{4}

{5}

146

Corrig des exercices

else
begin
Car2:= 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'
else
edit2.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.

You might also like