Avant-Propos

Le Pascal est un langage fortement typé qui sert de support à Delphi. La version utilisé par Delphi est une version enrichie appelée Pascal Objet qui permet la programmation orienté objet dans l'environnement Windows. Ce chapitre propose une présentation du langage Pascal sous Delphi mais n'aborde pas la programmation orintée objet.

1. Les règles de base

Toutes les instructions se termine par un point virgule. Le point n'est utilisé qu'une seule fois par unité pour en marquer la fin.
On peut écrire plusieurs instructions sur une même ligne.
Un bloc d'instruction est délimité par les instructions Begin et End.

1.1. Les directives standard du Pascal Objet

absolute far on published
assembler forward persistent resident
dynamic index private vitual
export name protected external
near public    

1.2. Les mots réservés

and else in or to
asm asm inherited packed try
array except inline procedure type
begin exports interface program unit
case file label record until
const finally library repeat uses
constructor for mod set var
destructor function nil shl while
div goto not shr with
do if object string xor
downto implementation of then  

1.3. La syntaxe

Le Pascal ne tient pas compte de la casse (minuscule/majuscule).
Une ligne de code peut être écrite sur plusieurs lignes.
Le séparateur décimal est le point.

1.4. Le style de codage

Voici quelques conseils pour rendre le code plus lisible :

  • placer les paramètres d'une fonction ou procédure sur des lignes séparées
  • ormatter le code source suivant le standard " bonne impression " : indentation avec deux espace de chaque bloc de code. Ce format est utilisé dans le code source Delphi, les manuels et les exemples d'aide.

1.5. Les commentaires

Exemple :

 
Sélectionnez
{ ceci est un commentaire }
(* un autre commentaire *)
// le reste de la ligne est ignorée (seulement depuis Delphi 2)
				

Pour obtenir les accolades sur un clavier n'en disposant pas, il faut utiliser : Alt 123 et Alt 125.

Remarque : si une accolade ouverte ou la parenthèse-étoile sont suivies du caractère dollar ($), cela devient une directive de compilation car les directives de compilation sont des commentaires.

Exemple :

 
Sélectionnez
{$X+ avec un commentaire} // ceci est autorisé
				

2. Variables et constantes

La déclaration d'une variable se fait dans une clause particulière du programme, identifiée par le mot clé var.

Les contraintes de formation d'un identificateur sont : seul les 63 premiers caracteres sont pris en compte, les caractères accentués sont interdits, la différence minuscule/ majuscule n'est pas pris en compte, il doit commencer par une lettre ou un souligné.

Il est possible de déclarer plusieurs variables du même type en une seule ligne, chacunes étant séparées par une virgule.

Exemple :

 
Sélectionnez
var
  valeur : integer ;
  fin : boolean ;
  car1, car2 : char ;
begin
  valeur :=10 ;
  fin :=True ;
			

2.1. Portée d'une variable

le niveau procédure : les variables sont locales à la procedure ou a la fonction ou elles sont déclarées et sont stockées dans le segment de pile.

le niveau unité : les variables déclarées dans la section var de l'unité sont globales à toutes les procédures et fonctions de l'unité. Elles sont stockées dans le segment de données du programme.

On peut accéder aux variables déclarées dans la section interface d'une unité à partir d'un autre point du programme , ou d'un autre programme, en déclarant la cette unité dans la section uses de l'unité appelante

Le Pascal Objet permet l'utilisation d'expression constantes : l'affectation d'une valeur à une constante s'effectue en même temps que sa déclaration.

 
Sélectionnez
const ident1 : type1 = valeur1; 
				

Exemple :

 
Sélectionnez
const
  tva := 18.6 ;
  initiales : string[2] = 'JM'
  age : byte = 24;
				

2.2. Les types de données

2.2.1. Les types de données prédéfinis

Il existe 3 groupes de types de données : les ordinaux, les réels et les chaines

2.2.1.1. Les types ordinaux

Les types ordinaux sont fondés sur un concept d'ordre qui permet de faire des comparaisons, d'obtenir la valeur suivante ou précédente et de calculer la plus grande et la plus petite valeur possible.

La liste des types ordinaux est la suivante :

  • Integer, Cardinal, Shortint, SmallInt, Longint, Byte, Word
  • Boolean, ByteBool, WordBool, LongBool
  • Char, ANSIChar, WideChar
Type Intervalle Longueur
Shortint -128 .. 127 1 octet (8 bits)
Integer -32768 .. 32767 2 octets
Longint -2147483648 .. 2147483647 4 octets
Byte 0 .. 255 1 octet
Word 0 .. 65535 2 octets
Boolean 0, 1 (ou False, True) 1 octet
Char 0 .. 255 1 octet

Byte et Word réprésentent des valeurs non signées

Integer et Cardinal utilise la représentation native ( 2 octets sur plateforme 16 bits, 4 octets sur 32 bits) signée et non signée respectivement.La taille des entiers varient selon le microprocesseur et le système d'exploitation (ex : un entier est codé avec 2 octets sous Windows 3.x, 4 octets sous Window 95).

Cela peut poser des problèmes lors de la sauvegarde dans un fichier d'un entier sur une plateforme et la relecture sur une autre. Il faut utiliser un type de donnée qui soit indépendant de la plateforme utilisée ( ex : LongInteger ou SmallInteger). Mais pour une utilisation normale il est préférable d'utiliser une représentation native.

Les 4 booléens sont utiless pour la programmation avec les API Windows.

Les 3 types de caractères sont utilisés pour indiquer des caractères 8 bits (ANSI) ou 16 bits(UniCode).

Char correspond à ANSIChar dans les versions 16 et 32 bits.

Contrairement à Windows NT, Windows 95 n'a qu'un support limité de l'Unicode (le nouvel ensemble de caractère capable de représenter les lettres de chacun des alphabets connus en utilisant 16 bits au lieu de 8).

Le type char est un entier compris entre 0 et 255, interpreté comme une lettre selon le code ASCII. Une affectation du type caractère :='q' ; est autorisée. La variable contiendra la valeur ASCII de la lettre sous forme d'entier.

Il existe differentes routines systèmes pour la gestion des types ordinaux :

Routine Rôle
Dec Décrémente la variable passée en paramètre par un ou par la valeur du second paramètre éventuel
Inc Incrémente la variable passée comme paramètre d'un ou de la valeur spécifiée
Odd Retourne vrai si l'argument est un nombre impair
Pred Retourne le prédécesseur de l'argument dans l'ordre déterminée par le type de donnée
Succ Retourn le successeur
Ord Retourne un nombre indiquant l'ordre de l'argument dans l'ensemble des valeurs du type de données
Low Retourne la plus petite valeur du type ordinal passé en paramètre
High Retoune la plus grande valeur du type ordinal passé en paramètre

2.2.1.2. Les types réels

Le type réels representent des nombres en virgule flottante :

  • Single
  • Real
  • Double
  • Extended
  • Comp
  • Currency
Type Intervalle Longueur Nb chiffres pris en compte
Real 2.9 * 10-39 .. 1.7 * 1038 6 octets 11 - 12
Single 1.5 * 10-45 .. 3.4 * 1038 4 octets 7 - 8
Double 5.0 * 10-324 .. 1.7*10328 8 octets 15 - 16
Extended 3.4 * 10-4932 .. 1.1 * 104932 10 octets 19 - 20
Comp -263+1 .. 263-1 8 octets 19 -20

Comp est en fait un type entier traité comme un type réel permettant de décrire de très grands entiers

Currency (disponible uniquement depuis Delphi 2) indique un type en virgule flottante avec quatre chiffres décimaux et une représentation 64 bits pour représenter des valeurs monétaires énormes sans perdre le moindre chiffre significatif.

Remarque : Delphi utilise des nombres réels dans les types de données TDateTime pour stocker jour, mois, heures, minutes, secondes et millisecondes dans une seule variable.

2.2.1.3. Les types de données spécifiques à Windows

Ces types de données ne font partie du langage Pascal mais des bibliothèques de Windows.

Thandle représente un Handle et est un rédéfinition du type Cardinal. Un Handle est un code interne qui est une référence vers un élément spécifique géré par le système. Il est utile pour appeler une API non supportée par Delphi.

TColorRef représente une référence couleur et est une redéfinition du type LongInt.

2.2.1.4. Le type charactère

Le type char qualifie un caractère alphanumérique. Les données de type char sont notées entre 2 apostrophes.

Affectation d'un caractere ASCII à une variable ou une contante de type char : c := #7;

Plusieurs fonctions de l'unité System permettent de manipuler les caractères :

 
Sélectionnez
Chr (X : Byte) : Char;
									
Obtenir un caractère à partir de son code ASCII
 
Sélectionnez
UpCase (c : Char) : Char;
									
Convertir un caractère compris entre 'a' et 'z' en majuscule

2.2.1.5. Le type de donnée Variant

La version 32 bits de Delphi introduit une nouvelle approche pour gérer les variables pour supporter OLE Automation : le type Variant. Ces variables peuvent stocker n'importe quel type de données. Les variants sont vérifiés et calculés en mode exécution.

Exemple :

 
Sélectionnez
var
  v : Variant ;
begin
  v :=10 ;
  v :='Hello' ; ...
						

Une fois la valeur du variant affectée, on peut la copier vers n'importe quel type de données compatible ou non sachant que dans ce dernier cas, Delphi tente une conversion, si c'est possible.

Les variants stockent à la fois le type d'information et les données et permettent un certain nombre d'opérations à l'execution. Ceci peut être pratique mais cela s'avère souvent lent et peut sûr : il faut réserver leurs utilisation pour utiliser OLE Automation.

2.2.2. Transtypage et conversion de types

Pour assigner une variable à une autre variable d'un autre type il faut utiliser le transtypage (Casting).

Exemple :

 
Sélectionnez
var
  n : integer ;
  c : char ;
  b : boolean ;
begin
  n :=Integer(‘X') ;
  c :=Char(n) ;
  b :=Boolean(0) ;
					

On peut généralement effectuer un transtypage entre deux type de données de même taille.

Il est possible d'utiliser une routine système de conversion de type :

Routine But
Chr Convertit un ordinal en caractère
Ord Convertit la valeur d'un type ordinal en nombre indiquant son ordre
Round Convertit la valeur d'un type réel en celle d'un type entier, en arrondissant sa valeur
Trunc Convertit la valeur d'un type réel en celle d'un type entier, en tronquant sa valeur
Frac Renvoie la décimales d'un réel
Int Renvoie la partie entière d'un réel
IntToStr Convertit un nombre en chaine
IntToHex Convertit un nombre en chaine, avec une représentation hexadecimale
StrToInt Convertit une chaine en nombre, en affichant une erreur si la chaine est incorrecte
StrToIntDef Convertit une chaine en nombre, en utilisant une valeur par défaut si la chaine est incorrecte
Val(s : string ; i , j : Integer) Convertit une chaine s en nombre i. j contient en cas d'erreur la position du premier caractère non convertie
Str Convertit un nombre en chaine, en utilisant des paramètres de formatage
StrPas Convertit une chaine terminée par un caractère Null en chaine de type Pascal
StrPCopy Convertit (copie) un chaine de style Pascal en chaine terminée par un caractère Null
StrPLCopy Convertit (copie) une portion de chaine de style Pascal en une chaine terminée par un Null