Delphi PDF

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 47

Graduat I.S.I.

Ms

2ème partie :

laboratoire de programmation :
DELPHI

Année académique 2004-2005


Laboratoire d’informatique
Programmation Pascal et Delphi

Introduction
Laboratoire de programmation Delphi.

I. Introduction à Delphi

Delphi est un AGL (Atelier de Génie Logiciel) permettant de réaliser des applications
s’exécutant sur Windows. Le terme « atelier » vient du faite que Delphi propose un ensemble
d’outils dans un même environnement tel que : un éditeur de code, un compilateur, des outils
de débogages, …

La programmation avec Delphi nécessite la connaissance de ces 3 points :


- Langage Pascal
- Programmation événementielle
- Programmation Orientée Objet

Explicitons ces 3 notions !

I.1 Langage Pascal

Les éléments fondamentaux du langage Pascal ont été vus durant les laboratoires relatifs au
Turbo Pascal. Voici un bref rappel de ces notions.

I.1.1 Déclaration d’une variable :

VAR VAR
Identificateur : Type ; NomDeLaVariable : TypeDeDonnées ;

I.1.2 Les différents types de données

Afin de visualiser le schéma dans son ensemble, celui-ci est repris à la page suivante.

Version 2004 / 2005


Page 1
Laboratoire d’informatique
Programmation Pascal et Delphi

ShortInt [-128..128] 8 bits


Integer [-32768..32767] 16 bits
LongInt [-2147483648..2147483647] 32
Signé bits
Entier
Numériques
Non singé Byte [0..255] 8 bits
Word [0..65535] 16 bits

Réel Real [2,9 10-39 .. 1,7 1038

Alphanumériques Caractère Char : 8 bits

Chaîne de caractères String : 255 caractères :256


octets
Booléennes Boolean : 8 bits (true, false)
Prédéfinies

Type intervalle NomDuType : ValeurMinimale..ValeurMaximale

Construites
Type énuméré NomDuType =(Valeur1, Valeur2, Valeur3)

Simples
Type ensemble Set of type énuméré

Données
Statique Array [intervalle] of type

Structurées Type Tableau

Dynamique Array of type (Delphi)

Pointeur

Enregistrement NomDuType = record


DéclarationDeMembres

Objet

Version 2004 / 2005


Page 2
Laboratoire d’informatique
Programmation Pascal et Delphi

I.2 Programmation événementielle

Programmation linéaire ou procédurale (traditionnelle)

Début Séq. instr. Fin

Au départ le programme initialise certaines variables ( /!\ initialiser une variable, ne signifie
pas lui affecter la valeur 0, mais lui affecter une certaine valeur qui peut être égale à 0). Une
boucle est mise en œuvre afin de réitérer le programme permettant ainsi à l’utilisateur de
recommencer un traitement au tant de fois qu’il le souhaite, tout en lui donnant la possibilité
de quitter le programme. En finalisant l’application, celle-ci doit réaliser certaine tâche
comme par exemple, inviter l’utilisateur à sauvegarder son travail.
=> l’ordre d’exécution des instructions est défini par le programmeur.

Exemple de langage linéaire : TPascal, QBasic, C, …

Principe de la programmation événementielle

L’exemple ci-dessus, illustre le principe de la programmation événementielle. En


effet, lorsque l’utilisateur clique sur le bouton « Oui », ceci entraîne l’exécution de la
procédure associée à l’événement « clic » et à l’objet bouton.
=> l’ordre d’exécution des instructions est défini par l’utilisateur.

Exemple de langage événementiel : Delphi, Visual Basic Visual C++, …

La règle d’or d’un langage événementiel: Les instructions doivent


impérativement se trouver dans un gestionnaire d'événement (ou une
procédure événementielle).

Version 2004 / 2005


Page 3
Laboratoire d’informatique
Programmation Pascal et Delphi

Quelles sont les sources pouvant déclencher des événements ?

Utilisateur : Clique sur un bouton (cf à l’exemple ci-dessus), clique sur un menu,
déplacement la souris, …

Système : composant Timer -> le système d'exploitation déclenche périodiquement


un événement.

Instruction d’appel : une procédure événementielle peut être appelée à partir du


code.

Version 2004 / 2005


Page 4
Laboratoire d’informatique
Programmation Pascal et Delphi

I.3 Programmation Orientée Objet (P.O.O.)

La programmation Orientée Objet facilite l’analyse et la conception d’application


complexe, en modélisant sous forme d’objet informatique les entités rencontrées
dans le monde réel (voitures, livres, …).et abstrait (sécurité sociale, …).
L’objet est une entité informatique qui renferme les caractéristiques suivantes :
• Identité (Identificateur)
• Propriétés (données)
• Méthodes (traitements : procédures et fonctions)

Exemple : modélisation d’une voiture

Quel est l’élément qui permet d’identifier une et une seule voiture ?
=> numéro de châssis.

Quels sont les propriétés qui vont déterminer l’aspect d’une voiture ?
=> marque, modèle, couleur, …

Quels sont les actions que l’on peut effectuées avec une voiture ?
=> démarrer, arrêter, changer de vitesse, …

Nous venons de décrire un modèle(classe) « voiture » qui permettra de construire


des objets voitures. On manipule des objets et non pas des classes. Mais elles
permettent de construire des objets. On dit dans le jargon POO q’un objet est une
instance (copie, occurrence) d’une classe.
=> une classe encapsule à la fois les données et les traitements.

Classe voiture Objet voiture

Voiture Name : SN12345


Marque : Renault
Name : Instance 1 Modèle : Scénic
Propriétés Marque : Couleur : Gris
Modèle :
Couleur
Démarrer Name : SN54321
Méthodes Marque : Peugeot
Arrêter Instance 2
Modèle : 206
Couleur : Bleu

Version 2004 / 2005


Page 5
Laboratoire d’informatique
Programmation Pascal et Delphi

Une application Windows est essentiellement constituée d’une ou de plusieurs fiches


(fenêtres) et d’un ensemble de composant visuel (bouton de commande, zone de
saisie, case à cocher, …).

Les fiches et les composants visuels sont des objets particuliers. En effet, ils héritent
de toutes les caractéristiques des objets et intègrent 2 caractéristiques
supplémentaires, qui sont :
• l’interface graphique,
• les événements.

Tous les composants sont des objets, par contre tous les objets ne sont pas
des conposants.

Clarifions ces notions par deux exemples pratiques :

Fiche

Les fiches, qui deviendront après compilation des fenêtres, constituent les fondations
d’une application sous Windows.
Les fiches serviront à concevoir des fenêtres principales (avec menu, barre d’outils,
barre d’état) et des boîte de dialogue (ou fenêtre secondaire).

Une application peut être construite sur le modèle SDI ou le modèle MDI.

Une application SDI possède une fenêtre Une application MDI est constituée d’une fenêtre
principale et affiche généralement des boîtes principale et de fenêtres enfants.
de dialogue en cas de besoin.
Ex. : WordPad Ex. : Word
Fenêtre principale Fenêtre principale

Fermeture de la fenêtre enfant

Boîte de dialogue

Version 2004 / 2005


Page 6
Laboratoire d’informatique
Programmation Pascal et Delphi

Lors de l’ouverture de Delphi, une fiche est automatiquement mise à disposition.

Une fiche est une instance de la classe TForm.

Pour obtenir un nouvel objet fiche, exécuter la commande « Nouvelle fiche » du


menu « Fichier ».

Identité

La fiche est identifiée, dans le code, par l’identificateur Form1 de la propriété


« Name ». Il est bien attendu que cette propriété peut être modifiée par le
programmeur.

Interface graphique

Propriétés et événements

(*)

Version 2004 / 2005


Page 7
Laboratoire d’informatique
Programmation Pascal et Delphi

(*)

Lorsqu’une fiche se charge à l’écran, l’événement FormCreate se produit. Ce qui


permet par exemple d’initialiser certaines valeurs.

(*) Pour accéder à la procédure événementielle FormCreate ou une autre, Delphi


offre deux possibilités. Soit en réalisant un double clic sur la fiche, soit en choisissant
l’onglet événements de l’inspecteur d’objets et en effectuant un double clic à droite
de l‘intitulé OnCreate.

Version 2004 / 2005


Page 8
Laboratoire d’informatique
Programmation Pascal et Delphi

Contrôle

Zone de saisie -> composant « Edit »

a) Où allons-nous chercher la classe « Edit », qui est nommée dans Delphi


« TEdit »?
dans la palette des composants. Celle-ci reprend un ensemble de classe
prédéfinie dans Delphi.

Classe (TEdit)

b) Comment va-t-on créer l’objet « Edit »


=> en sélectionnant et en dessinant le composant sur la fiche.

Interface graphique

-> ce que l’on voit sur la fiche en mode conception.

Identité

En effet, la zone de saisie est identifiée, dans le code, par l’identificateur Edit1 de la
propriété « Name ».

Version 2004 / 2005


Page 9
Laboratoire d’informatique
Programmation Pascal et Delphi

Propriétés

La valeur d’une propriété peut être modifiée de 2 manières différentes :

1) Soit à partir de l’inspecteur d’objet en 2) Soit à partir du code.


mode conception. => la valeur sera prise en considération
=> la valeur sera prise en considération lors de l’exécution du programme.
par Delphi immédiatement.

Edit1.Color :=ClLime

Syntaxe générale

Objet.Propriété :=valeur ;

Méthodes

La méthode SelectAll de l’objet « Edit » permet de sélectionner le texte.


=> la méthode sera prise en compte lors de l’exécution du programme.

Syntaxe générale :

Objet.méthode

Version 2004 / 2005


Page 10
Laboratoire d’informatique
Programmation Pascal et Delphi

Evénement

A è l’é é t

Version 2004 / 2005


Page 11
Laboratoire d’informatique
Programmation Pascal et Delphi

II. Présentation de l'EDI (Environnement de Développement Intégré.)

Définitions : GUI
Programme
GUI : Interface Utilisateur (Graphique)

/!\ Le Pascal est un langage de programmation.


/!\ Par contre, Delphi n’est pas un langage de programmation, mais un logiciel
permettant de développer des applications sous Windows en faisant appel au
langage Pascal.

Palette des composants


Menu

Inspecteur d’objets Editeur de code


Fiche (Feuille)

Version 2004 / 2005


Page 12
Laboratoire d’informatique
Programmation Pascal et Delphi

III. Elaboration d'un programme

Le développement d’une application passe par les étapes suivantes :

1) Définition de l'interface utilisateur :

GUI = Fiche(s) + contrôle(s) créés à l'aide de la bibliothèque de composants et


le
concepteur de fiche.

* : contrôle
*
Fiche
*
*
*

2) Affecter les valeurs initiales des propriétés de chaque éléments graphiques


à l'aide de l'inspecteur d'objet.

3) Ecrire le code en Pascal Objet.

IIII. Les constituants d'un projet

Fichier projet .DPR (Delphi PRoject)

.PAS (PAScal)
Projet
Unité1 Fiche 1 .DFM (Delphi ForM)

Unité2 Pas de fiche


associée

Version 2004 / 2005


Page 13
Laboratoire d’informatique
Programmation Pascal et Delphi

IIII.1 Anatomie d'une unité

Nom de l’unité

Interface
Section où l’on

déclare les

variables ou les

routines qui

Implémentation
Section contenant le
code des routines.

Version 2004 / 2005


Page 14
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n°1 :
Exercice dirigé en Delphi.

1. Cahier des charges

Première partie

L’application doit permettre à l’utilisateur de saisir deux nombres réels. L’action sur le
bouton de commande « Somme » permet d’afficher la somme des deux nombres
dans une boîte de dialogue.

Deuxième partie

Lors de la saisie des nombres, les caractères invalides (‘t’,’&’,…) doivent immédiatement être
effacés, afin d’obtenir des nombres correctes lors de l’addition.

2. Interfaces utilisateurs

3. Aide à la conception

La fiche « Additionneur » sera constituée :


- d’un cadre (Panel) contenant les contrôles cités ci-
dessous
- de 2 labels « Nombre 1 : » et « Nombre 2 : » (Label),
- de 2 zones de saisie (Edit),
- d’un bouton de commande « Somme » (Button).

La somme sera affichée à l’écran grâce à la procédure ShowMessage (prédéfinie


dans Delphi).

La fonction StrToFloat (prédéfinie dans Delphi) sera utilisée pour convertir une
chaîne de caractères en un nombre réel. Pour effectuer l’opération inverse, il suffit
d’utiliser la fonction FloatToStr (De réel vers chaîne de caractères).

Version 2004 / 2005


Page 15
Laboratoire d’informatique
Programmation Pascal et Delphi

Pour la deuxième partie du cahier des charges

- Les codes ASCII des chiffres de 0 à 9 varient respectivement de 48 à 57.


Pour extraire le code ASCII d’un caractère, on utilise la fonction Ord().

- La procédure Delete (prédéfinie dans Delphi) sera nécessaire pour effacer un


caractère.

- Vous aurez besoin d’utiliser la propriété SelStart de l’objet Edit pour


positionner le curseur dans la zone de saisie.

- La longueur d’une chaîne de caractères est donnée par la fonction length.

Version 2004 / 2005


Page 16
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n°2 :
La calculatrice.

1. Cahier des charges.

Première partie

L’interface graphique (voir l’illustration ci-dessous) représentera la face avant d’une


calculatrice standard. Autrement dit, elle effectuera les opérations arithmétiques de
base (+, -, *, /) ainsi que les opérations trigonométriques. Son fonctionnement sera
similaire à celui de la calculatrice fournie avec Windows.
La touche « <- » permettra de corriger le nombre saisi, en effaçant un chiffre à la fois.

Deuxième partie

La calculatrice-Euro aura les mêmes performances que la calculatrice précédente


mais sera muni d’une fonction supplémentaire qui convertira un montant en FB en €.
L’activation de cette nouvelle fonctionnalité sera assurée par la touche « Euro » et
l’annulation à l’aide de la touche « C » (Cancel).
Le montant en FB sera saisie dans l’afficheur FB et la conversion en € sera affichée
instantanément dans un second afficheur.

Troisième partie

On ajoutera pour finir les conversion binaire, décimal et hexadécimal de la même


manière que la calculatrice Windows.

2. Interface graphique.

Version 2004 / 2005


Page 17
Laboratoire d’informatique
Programmation Pascal et Delphi

3. Aide à la conception

Pour la programmation des boutons, nous allons utiliser l’événement OnClick.

Pour les conversions, nous utiliserons un composant RadioGroup. Les propriétés


intéressantes sont :

• ItemIndex : Position du pointeur ( -1 : rien, 0 : le premier, …)


• Items : Donne la liste des boutons radio du groupe.
• Columns : met la liste en colonne

Pour les fonctions trigonométriques, nous utiliserons directement les fonctions


prédéfinies dans Delphi.

Lorsque le bouton Euro n’est pas utilisé, la fenêtre Edit du haut est inactive.

Version 2004 / 2005


Page 18
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n° 3 :
Calcul électronique.

1. But du programme.

Dans ce programme vous apprendrez à utiliser les objets les plus couramment
utilisés.

2. Cahier des charges.

Ce programme est divisé en deux, une partie calcule la tension de sortie d’un
diviseur de tension. La deuxième partie calcule la fréquence de coupure d’un circuit
RC.

Les composants qui doivent se trouver sur la fenêtre sont les suivants :

7 composants Edit.
• Edit1 : Donne la tension d’alimentation.
• Edit2 : Donne le choix de la valeur de la résistance 1.
• Edit3 : Donne le choix de la valeur de la résistance 2.
• Edit4 : Donne la tension aux bornes de la résistance 2.
• Edit5 : Donne le choix de la valeur de la capacité.
• Edit6 : Donne le choix de la valeur de la résistance.
• Edit7 : Donne la fréquence de coupure du circuit RC.

6 boutons.
• Button1 : On choisi d’utiliser le programme pour le diviseur de tension.
• Button2 : On choisi d’utiliser le programme pour le circuit RC.
• Button3 : Bouton Reset, remise à zéro de tous les composants.
• Button4 : Ferme le programme.
• Button5 : Donne le résultat du diviseur de tension lors du clique.
• Button6 : Donne le résultat de la fréquence de coupure lors du clique.

Au lancement du programme la propriété Enabled des composants Edit et de


button5 et button6 doit être à false.

Lors du clique sur le button1, on utilise la première partie du programme, donc la


propriété Enabled de l’Edit1, Edit2, Edit3 et Button5 passe à true.
Le reste des composants utilisé pour la fréquence de coupure doivent avoir leur
propriété Enabled à False.

Ensuite vous pouvez introduire la tension d’alimentation qui sera de type integer.

Version 2004 / 2005


Page 19
Laboratoire d’informatique
Programmation Pascal et Delphi

En ce qui concerne les résistances, vous devez introduire un chiffre entre 1 et 10 et


en fonction du choix opéré le programme utilisera la résistance correspondant au
tableau suivant :

Chiffre tapé Valeur de la résistance


1 1KOhms
2 1,2KOhms
3 1,5KOhms
4 1,8KOhms
5 2,2Kohms
6 2,7KOhms
7 3,3KOhms
8 3,9KOhms
9 4,7KOhms
10 5,6KOhms

Ensuite vous pouvez cliquer sur le button5 qui donnera dans l’Edit4 la valeur de la
tension de sortie du diviseur de tension.

Vous devez indiquer votre nom et prénom dans la propriété Caption du composant
Form1.

Lors du clique sur le button2, on utilise la deuxième partie du programme, donc la


propriété Enabled de l’Edit5, Edit6 et Button6 passe à true.
Le reste des composants utilisé pour le diviseur de tension doivent avoir leur
propriété Enabled à False.

Le choix de la résistance se fera de la même manière que dans le premier cas, pour
la capacité le choix se fera dans le tableau ci dessous.

Chiffre tapé Valeur de la capacité


1 10 microFarad
2 15 microFarad
3 22 microFarad
4 27 microFarad
5 33 microFarad

Ensuite vous pouvez cliquer sur le button6 qui donnera dans l’Edit7 la valeur de la
fréquence du coupure du circuit RC.

Lors d’un clique sur le bouton Reset, tous les Edit doivent être effacé et la propriété
Enabled des Edit et des Button4 et Button5 doit passer à False.

Version 2004 / 2005


Page 20
Laboratoire d’informatique
Programmation Pascal et Delphi

3. Interface graphique.

Version 2004 / 2005


Page 21
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n° 4 :
Programmation de portes logiques.

1. But du programme.

Dans ce programme, nous allons modéliser toutes les portes logiques en affichant la
table de vérité et les entrées/sorties de la porte choisie.

2. Cahier des charges.

Réalisez l’interface graphique ci-dessous, elle contiendra une image, trois CheckBox,
une StringGrid, un menu ( Fichier et A propos ), un Timer et un ComboBox.

Dessinez les portes logiques : AND, NAND, OR, NOR, XOR, NXOR.

Le menu Fichier contiendra la commande Quitter ( Raccourci : Alt + F4 ), qui quittera


évidemment le programme.
Le menu A propos contiendra la commande Concepteur ( Raccourci :CTRL + X ) qui
affiche une fenêtre avec votre nom, prénom et votre classe.

Le ComboBox contiendra le nom des différentes portes logiques.

En entrées du dessin de la porte logique, nous aurons deux CheckBox symbolisant


les deux entrées. En sortie nous aurons la troisième CheckBox qui logiquement
affichera le résultat de la sortie de la porte.

Le StringGrid affiche la table de vérité de la porte choisie.

Le timer sert à vérifier toutes les 0.5s les entrées de la porte logique et forcément
d’afficher le résultat correspondant. Il doit également lire le ComboBox pour pouvoir
afficher le dessin de la porte choisie et également créer la table de vérité dans le
StringGrid.

3. Interface graphique.

Version 2004 / 2005


Page 22
Laboratoire d’informatique
Programmation Pascal et Delphi

4. Aide à la conception.

La lecture d’un ComboBox se réalise de la même manière que dans un Edit.

Pour charger une image dans un composant Timage vous devez taper :
Nom_composant.Picture.Bitmap.LoadFromFile(chemin_de_image);

Pour écrire dans un StringGrid, utilisez la propriété :


Cells[ACol, ARow: Integer]: string;

Pour accéder à la chaîne contenue dans une cellule donnée. ACol spécifie la
coordonnée en colonne de la cellule et ARow la coordonnée en ligne. La première
ligne et la première colonne correspondent à une valeur nulle.

La valeur des propriétés ColCount et RowCount définissent la taille du tableau de


chaînes.
Pour écrire dans la ligne 2 et la colonne 4 bonjour vous devez taper :
StringGrid.Cells[4,2] :=’Bonjour’ ;

Le composant Timer permet de déclencher un événement (une seule fois ou de


façon répétitive) après un intervalle de temps mesuré. Le code qui sera exécuté au
moment spécifié doit être écrit dans l'événement OnTimer du composant.

Pour spécifier la quantité de temps écoulé avant le déclenchement de l'événement,


utilisez la propriété Interval.
Pour désactiver un composant Timer, mettez sa propriété Enabled à False.

Un composant TCheckBox propose une option à l'utilisateur. L'utilisateur peut activer


la case à cocher pour sélectionner l'option, ou supprimer la coche pour la
désélectionner.

Propriété utile checked :


• True : option sélectionnées
• False : option désélectionnée

Version 2004 / 2005


Page 23
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n° 5 :
Manipulation des images.

But : Réalisation d’un calendrier avec des images différentes pour chaque mois de
l’année.

1. Connaissances théoriques

Ajouter une image :

Pour ajouter une image, un dessin ou une icône, il suffit d’aller dans l’onglet
Supplément et ensuite de cliquer sur l’icône Image.

Le dimensionnement de l’image se réalise simplement avec la souris.

Propriétés utiles.

Name : Nom du composant.

Stretch : False : Le contrôle s’ajuste à la taille de l’image.


True : L’image s’ajuste à la taille du contrôle.

Height : Hauteur de l’image en pixel.


Width : Largeur de l’image en pixel.

Picture : Cette propriété vous permet de charger une image.

Ajouter un panel :

Un panel est un container d’objet.

Pour ajouter un Panel, vous devez aller dans l’onglet Standard et ensuite cliquer sur
Panel.

Propriétés utiles :

Visible : True : Le composant est visible sur la fiche.


False : Le composant est caché.

Controls[word] : Cette fonction est un tableau qui représente tous les contrôles
contenus dans un autre contrôle. Nous pourrons donc accéder aux images
contenues dans le panel. Par exemple Panel1.Controls[0] représente la première
image du container. Pour accéder à ses propriétés, il faut le déclarer comme un objet
en précisant son type avec le mot clé as. L’ensemble doit être entre parenthèses.
Par exemple pour modifier sa propriété picture, il faut écrire
(Panel1.Controls[0] as Timage).Picture.

Version 2004 / 2005


Page 24
Laboratoire d’informatique
Programmation Pascal et Delphi

Dans notre cas pour afficher l’image du mois il faudra taper :


Image1.Picture :=(Panel1.Controls[mois-1] as Timage).Picture.

Ajouter une StringGrid :

Ce composant permet d’afficher des chaînes de caractères sous forme de tableau.

Pour ajouter un composant StringGrid, il faut aller dans l’onglet Supplément et


ensuite cliquer sur l’icône StringGrid.

Propriétés utiles :

Height : Hauteur de la grille en pixel.


Width : Largeur de la grille en pixel.

BorderStyle : bsNone : Pas de contour. BsSingle : Le contour est plus marqué.


ColCount : Nombre de colonnes de la grille.
RowCount : Nombre de lignes de la grille.

FixedCols et FixedRows : nombre de lignes et de colonnes qui ne bougent pas lors


d’un défilement avec les barres horizontale ou verticale.

DefaultColWidth : Détermine la largeur par défaut des cellules de la grille.


DefaultRowHeight : Détermine la hauteur par défaut des cellules de la grille.

ScollBars : SsBoth : Barre de défilement horizontale et verticale.


SsHorizontal : Barre de défilement horizontale.
SsVertical : Barre de défilement verticale.
SsNone : Pas de Barre de défilement.

Cells[colonne,ligne] : Cette propriété permet d’écrire une chaîne de caractère dans la


cellule désignée. La première cellule est la Cells[0,0].

2. Fonctions et procédures utiles dans le programme.

Date

Var :=Date ;
Cette fonction donne la date actuelle du système.
Var doit être de type Tdate.
Var contiendra l’année, le mois et le jour.

FormatDateTime(arg1,arg2)

Var :=FormatDateTime(arg1,arg2) ;
Var doit être de type string.
Cette fonction retourne la date de arg2 dans le format spécifié par arg1.
Si arg1 est ‘yyyy’, var contiendra l’année sur quatre chiffres.
Si arg1 est ‘mmmm’, var contiendra le mois en toutes lettres.

Version 2004 / 2005


Page 25
Laboratoire d’informatique
Programmation Pascal et Delphi

DecodeDate(Date,A,M,J) (procedure)

DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

La procédure DecodeDate sépare la valeur spécifiée par le paramètre Date en


valeurs Année, Mois et Jour.

DayOfWeek(Date)

Var :=DayOfWeek(Date: TDateTime);


Var doit être de type integer.
La fonction DayOfWeek renvoie le jour de la semaine d'une date sous la forme d'un entier
compris entre 1 et 7. Dimanche est le premier jour de la semaine et samedi le septième.

EncodeDate(A,M,J)

Var := EncodeDate(Year, Month, Day: Word);


Var doit être de type Tdate.
La fonction EncodeDate renvoie une valeur de type TDateTime à partir des
paramètres Year, Month et Day.

Pour ajouter une procédure il faut d’abord la déclarer dans la clause type juste au
dessus de Private de la manière suivante : Procedure nom ;
Ensuite il ne reste plus qu’à l’écrire à la fin de l’unité et dans ce cas il faut écrire :
Procedure TForm1.nom ;
Pour appeler une procédure, il suffit de taper son nom à l’endroit voulu.

Version 2004 / 2005


Page 26
Laboratoire d’informatique
Programmation Pascal et Delphi

3. Réalisation du programme.

Pour réaliser votre calendrier, vous devez ajouter sur la fiche :

Un contrôle Image qui affichera une image différente pour chaque mois.

Un panel dans lequel vous ajouterez les 12 images correspondant aux différents
mois.

Un composant StringGrid pour afficher les jours du mois. De 7 lignes et 7 colonnes.

Un label qui nous donne le mois et un label qui nous donne l’année.

Créez un variable globale de type Tdate.

Nom de la variable :

Créez une procédure.

Nom de la procédure :

Cette procédure contiendra toutes les données du calendrier.

Dans cette procédure :

Créez un tableau, comme constante, de type string qui contiendra les jours de la
semaine en commençant par dimanche.

Syntaxe :

Actualisez les labels indiquant le mois et l’année en utilisant la fonction


FormatDateTime.

Syntaxe pour le mois :

Syntaxe pour l’année :

Placez dans trois variables l’année, le mois et le jour en cours en utilisant la


fonction DecodeDate.

Syntaxe :

Version 2004 / 2005


Page 27
Laboratoire d’informatique
Programmation Pascal et Delphi

Placez dans le contrôle Image1, une des images du Panel1 en fonction du mois
actuel. En utilisant la propriété Controls.

Syntaxe :

Placez dans une variable le jour de la semaine du 1e jour du mois. En utilisant la


fonction DayOfWeek et EncodeDate.

Syntaxe :

Placez dans une variable la date du dernier jour du mois. En utilisant la fonction
EncodeDate.
Si le mois actuel est différent de décembre, on prend le premier jour du mois
suivant et on retranche 1.
Sinon, on prend le premier janvier de l’année suivante et on retranche 1.

Q ? De quel type doit être la variable contenant le résultat ?

Syntaxe :

Avec la date du dernier jour du mois et la fonction DecodeDate, on peut


connaître le nombre de jour du mois en cours, que l’on stocke dans une variable.

Q ? De quel type est cette variable ?

Syntaxe :

Version 2004 / 2005


Page 28
Laboratoire d’informatique
Programmation Pascal et Delphi

Modifiez la grille.
Pour ce faire ajoutez dans les cellules de la première ligne les jours de la
semaine. A partir de dimanche. En utilisant la fonction Cells et un For To Do.

Syntaxe :

Placez dans une variable le jour à afficher. Le premier jour du mois à afficher est
le 1 ! ! !

Syntaxe :

Il existe 37 solutions dans un calendrier quand le calendrier commence un


dimanche.

Q ? Pourquoi 37 solutions ?

Pour i = 0 jusque 36
Si i<(var contenant le jour de la semaine du 1e jour du mois)-1 ou
(jour à afficher>nbr de jour du mois)
alors
On affiche dans la cellule la chaîne vide ‘’.
Sinon
On affiche dans la cellule le jour à afficher et on incrémente ce jour.

Pour savoir dans quelle ligne et dans quelle colonne afficher le jour, il faut
utiliser le modulo et la division tronquée.

Pour connaître la colonne on utilisera le modulo.


Pour connaître la ligne on utilisera la division tronquée.

Syntaxe :

Version 2004 / 2005


Page 29
Laboratoire d’informatique
Programmation Pascal et Delphi

4. Utilisation d’images comme boutons.

Pour cet exercice, vous devez ajouter 4 images qui vont être utilisées comme
boutons.

Une image servira à augmenter l’année.

Nom de l’image :

Une image servira à diminuer l’année.

Nom de l’image :

Une image servira à augmenter le mois.

Nom de l’image :

Une image servira à diminuer le mois.

Nom de l’image :

Pour qu’un événement se déroule lors d’un clic sur l’image, il faut la sélectionner et
aller dans l’onglet Evénement de la fenêtre Inspecteur d’objets et ensuite double-
cliquez OnClick.
Vous entrez de cette manière dans la procédure qui sera exécutée lors du clic sur
l’image.

Programme à réaliser pour la première image ( ajout d’année ).

Dans la procédure correspondante mettez dans trois variables l’année, le mois et le


jour actuels, en utilisant DecodeDate.

Syntaxe :

Ajoutez une année à la variable globale contenant la date actuelle, en utilisant


EncodeDate.
Ensuite mettez à jour le calendrier en appelant la procédure générale.

Syntaxe :

Version 2004 / 2005


Page 30
Laboratoire d’informatique
Programmation Pascal et Delphi

Faites de la même manière pour les trois autres images en modifiant les paramètres
utiles.

Syntaxe de la procédure pour la diminution de l’année :

Attention pour la procédure suivante au cas de décembre.

Syntaxe de la procédure pour l’augmentation des mois :

Attention pour la procédure suivante au cas de janvier.

Syntaxe de la procédure pour la diminution des mois :

Version 2004 / 2005


Page 31
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n° 6 :
Les trackbars et les shapes.

1. But du programme.

Dans ce programme, nous allons simuler le fonctionnement de deux tapis roulants


en utilisant des trackbars et des shapes.
Nous terminerons le programme par l’ajout d’un menu ainsi que par l’ouverture d’une
deuxième fenêtre.

2. Cahier des charges.

Créer une fenêtre de la même manière que ci-dessous. Cette fenêtre doit contenir un
menu déroulant, deux TrackBar, quatre timers, six Shapes et un bouton.

Lors du clique sur le bouton Démarrer, le TrackBar1 (celui du dessus, qui portera le
nom tb1) se met en marche, le shape vert s’éteint et le shape jaune s’allume ( shape
horizontal ), ce shape sera allumé pendant toute la durée du déplacement du
curseur. Ensuite lorsque le curseur de tb1 arrive à la fin, le shape rouge(shape à la
fin) s’allume et le jaune s’éteint, le TrackBar2 (celui du dessous, qui portera le nom
tb2) se met en route de la même manière que tb1.

Lorsque le curseur de tb2 arrive au milieu de son parcours, il fait revenir le curseur
du tb1 à sa position initiale, le rouge du tb1 s’éteint et le jaune s’allume en clignotant
jusqu’au moment où il arrive à sa position de départ à ce moment le jaune s’éteint et
le vert s’allume.
On fait la même chose avec tb1 lorsqu’il arrive au milieu, il fait revenir le curseur de
tb2 à sa position initiale.

3. Interface graphique.

Version 2004 / 2005


Page 32
Laboratoire d’informatique
Programmation Pascal et Delphi

4. Aide à la conception.

Les TrackBar se trouvent dans l’onglet Win32 -> TrackBar


Propriétés importantes : Max : Valeur maximale du TrackBar.
Position : Position du curseur. C’est cette propriété qu’il
faudra incrémenter ou décrémenter.

Tb1 aura sa valeur Max à 20.


Tb2 aura sa valeur Max à 40.

V1 : Nom du Shape situé à gauche de tb1.


Y1 : Nom du Shape situé au dessus de tb1.
R1 : Nom du Shape situé à droite de tb1.

V2 : Nom du Shape situé à gauche de tb2.


Y2 : Nom du Shape situé au dessus de tb2.
R2 : Nom du Shape situé à droite de tb2.

Vous allez utiliser quatre timers.

Timer1 : Incrémente la position du curseur de tb1 jusqu’à 20.


Propriété Interval à 1 seconde.
V1 s’éteint, Y1 s’allume.
Quand le curseur arrive à 20, Y1 s’éteint et R1 s’allume. Le timer1
s’éteint et le Timer2 s’allume.
Quand le curseur arrive à 10, il met en marche le Timer4 si le flag
(variable de type integer) est à 1. Le flag est à zéro lors de la création
du programme.

Timer2 : Incrémente la position du curseur de tb1 jusqu’à 20.


Propriété Interval à 0.5 seconde.
V2 s’éteint, Y2 s’allume.
Quand le curseur arrive à 40, Y2 s’éteint et R2 s’allume. Le timer2
s’éteint et le flag passe à 1.
Lorsque le curseur de tb2 arrive à la position 20, il met en route le
timer3 qui sert à faire revenir le curseur de tb1 à sa position de départ.

Timer3 : Décrémente la position du curseur de tb1 jusqu’à 0.


Propriété Interval à 0.45 seconde.
R1 s’éteint et Y1 clignote.
Si Y1 est jaune alors Y1 prend la couleur grise sinon Y1 prend la
couleur jaune.
Quand le curseur de Tb1 arrive à 0, le Timer3 s’éteint, le timer1
s’allume, Y1 devient gris et V1 devient vert.

Version 2004 / 2005


Page 33
Laboratoire d’informatique
Programmation Pascal et Delphi

Timer4 : Décrémente la position du curseur de tb2 jusqu’à 0.


Propriété Interval à 0.2 seconde.
R2 s’éteint et Y2 clignote.
Si Y2 est jaune alors Y2 prend la couleur grise sinon Y2 prend la
couleur jaune.
Quand le curseur de Tb2 arrive à 0, le Timer4 s’éteint, Y2 devient gris
et V2 devient vert.

Contenu du menu déroulant.

Dans le menu Fichier, vous aurez un menu Quitter (Raccourci F10), ce menu comme
son nom l’indique sert à quitter le programme.

Dans le menu A Propos, vous aurez un menu Concepteur, lors d’un clique sur ce
menu apparaîtra une fenêtre avec votre nom, votre prénom et votre groupe.

Pour ouvrir une forme, vous avez le choix entre deux méthodes :
• Show
• Showmodal

Essayez les deux cas et expliquez les différences ?

Version 2004 / 2005


Page 34
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n° 7 :
Utilisation des radiogroups.

1. But du programme.

Le programme que vous devez créer déterminera les caractéristiques d’un shape,
ces caractéristiques seront définies dans une fenêtre supplémentaire.

2. Cahier des charges.

Créer une fenêtre, Dessin, ressemblant à celle ci-dessous. Dans laquelle ce trouve
un menu contenant :
Fichier dans lequel on trouve le menu Quitter avec le raccourci Alt Q.
Forme dans lequel on trouve le menu Configuration avec le raccourci F2.
A Propos dans lequel on trouve le menu Concepteur.
De plus dans cette fenêtre, vous devez rajouter un composant Shape, qui portera le
nom Dessin.

Version 2004 / 2005


Page 35
Laboratoire d’informatique
Programmation Pascal et Delphi

Lorsque vous cliquez sur le menu Configuration, la fenêtre ci dessous doit s’ouvrir.
Dans cette fenêtre se trouvera 2 composants RadioGroup, un des deux donnera la
forme du Shape ce trouvant sur la première fenêtre, l’autre donnera sa couleur. Ceci
doit se passer lors du clique sur le bouton OK qui en plus de donner la couleur et la
forme du shape, doit fermer la fenêtre configuration. Le bouton Cancel ferme
simplement la fenêtre Configuration.

Lors du clique sur le menu Concepteur, doit apparaître une fenêtre dans laquelle
vous indiquerez votre nom, prénom et votre groupe.

Version 2004 / 2005


Page 36
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n° 8 :
Manipulation des fichiers.

1. Cahier des charges

Dans ce programme vous allez apprendre à écrire le plus simplement dans un fichier
texte. Ensuite vous créerai un éditeur de texte avec les options copier et coller.

2. Les fichiers textes

Un fichier peut être accédé sous trois modes: l'écriture, l'ajout ou la lecture. Les
fichiers sont conservés sur des supports de stockage comme les disquettes, disques
durs, cd-rom,... Le DOS exige que la structure d'un nom de fichier soit composée de
1 à 8 caractères et d'une extension facultative de 3 lettres.

Exemple d’un fichier texte :

Les fichiers textes ont la particularité[CR/LF]


de se composer de lignes qui sont terminées[CR/LF]
par un code special: Carriage Return/Line Feed.[CR/LF]
[CR/LF]
Même les lignes vierges ... [CR/LF]
La fin de fichier est, elle, marquée par un code End of File[CR/LF] [EOF]

Avant toute manipulation sur les fichiers, il est nécessaire d'assigner au nom du
fichier une variable logique. Celle-ci servira de référence dans le programme, en lieu
et place du nom de fichier. L’assignation s’effectue via deux instructions.

Var

F : TextFlie;

Begin

AssignFile(F, 'C:\DELPHI\FICHIER.DAT');

End.

Trois procédures sont disponibles selon le mode d'accès.

Version 2004 / 2005


Page 37
Laboratoire d’informatique
Programmation Pascal et Delphi

1.Reset(variable-Logique), ouvre un fichier en mode lecture seule, et positionne le


pointeur à la première ligne du fichier. Toute tentative d'écriture sur un fichier ouvert
en mode reset provoquera une erreur.

2.Rewrite(variable_Logique), ouvre un fichier en mode écriture seule. Si un fichier de


même nom existe déjà, celui-ci est effacé, et remplacé par le contenu du nouveau.

3. Append(variable_Logique), ouvre un fichier en mode écriture seule. Si un fichier


de même nom existe déjà, Append préserve son contenu car il place le pointeur à la
fin du fichier existant.

La procédure Truncate(Variable_Logique), tronque un fichier à la position courante


du ointeur de fichier, c’est-à-dire que la position courante dans le fichier devient la fin
du fichier et tous les enregistrements situés après sont effacés.

La procédure Erase(variable_Logique), efface le fichier sur le disque.

La procédure CloseFile(Variable_Logique) ferme l'accès au fichier.

Le type prédéfini TextFile, repris ici dans la section Var, indique l'utilisation d'un
fichier de caractères structurés en lignes, c.-à-d. texte (avec CR/LF).

Lecture

Pour lire les informations d'un fichier, Delphi offre les instructions Read et ReadLn.

ReadLn(variable_Logique, string) lit les caractères de la ligne courante du fichier et


les place dans une variable de type string. Si la taille de la variable string est
spécifiée, seul le nombre de caractères correspondant à la taille sera lu.

Si l'instruction ReadLn est utilisée, le pointeur de lecture sera replacé, après la


lecture des caractères, à la première position de la ligne suivante, tandis que Read
laissera le pointeur à la position qui suit le dernier caractère lu. A noter que Read
n'effectuera jamais un saut de ligne!

Ecriture

Les instructions Write et WriteLn écrivent dans un fichier.

WriteLn(variable - Logique, string) a pour effet d'écrire dans le fichier désigné par la
variable logique le contenu de la variable, ici, string.

L'instruction WriteLn ajoute un CR/LF après l'écriture du contenu de la variable


spécifiée, au contraire de Write.

Il est possible d'aligner à droite (justification) le contenu de la variable écrite dans le


fichier texte de la manière suivante: WriteLn(f,nom :20) ;
3. Création d’un éditeur.

Version 2004 / 2005


Page 38
Laboratoire d’informatique
Programmation Pascal et Delphi

Ajoutez un composant Mémo.

TMemo

Un composant TMemo affiche du texte et permet à l'utilisateur de saisir du texte dans


l'application. Le composant TMemo permet la saisie et l'affichage de plusieurs lignes.

Le texte du mémo correspond à la valeur de la propriété Text.

Plusieurs propriétés agissent sur l'affichage et sur la saisie du texte dans le mémo, Il
est possible d'inclure des barres de défilement dans le mémo à l'aide de la propriété
ScrollBars. Si vous voulez que le mémo soit automatiquement redimensionné en
fonction des changements de taille du texte, utilisez la propriété AutoSize. Si vous
voulez un retour à ligne du texte, basculez WordWrap à True. Si vous voulez offrir à
l'utilisateur la possibilité d'inclure des tabulations dans le texte, basculez WantTabs à
True.

• Propriété Align = alClient, ce qui lui permet d'occuper la fenêtre complète


quelque soit son redimensionnement.

• Propriété BorderStyle = bsNone, ce qui supprime les bords du composant


Mémo.

• Propriété Name Edition, pour rendre le nom de l'objet plus parlant par la suite.

• Propriété Lines [vide] pour que l'objet ne contienne aucune valeur de départ.

• La propriété WordWrap détermine si le texte dans un contrôle libellé ou mémo


revient à la ligne lorsqu'il atteint la marge droite afin de rester dans les limites
du contrôle.

Créez un menu en ajoutant le composant MainMenu.

Créez un menu Fichier dans lequel il y aura Ouvrir, Enregistrer sous et Quitter.

Pour réagir aux menus Ouvrir et Enregistrer sous, vous devez ajouter les
composants OpenDialog et SaveDialog.

Lorsque l'utilisateur aura choisi son fichier dans la boîte de dialogue ouvrir, ce dernier
sera transféré dans la propriété Lines du composant Memo.

Le code répondant au menu Ouvrir sera:


If OpenDialog.Execute Then
Edition.Lines.LoadFromFile(OpenDialogl.FileName);

La méthode Exécute affiche la boîte de dialogue dans l'application et renvoie True


quand c'est l'utilisateur qui ferme la boîte de dialogue en choisissant le bouton OK. Si

Version 2004 / 2005


Page 39
Laboratoire d’informatique
Programmation Pascal et Delphi

l'utilisateur choisit Cancel ou ferme la boîte de dialogue à l'aide du menu système,


Exécute renvoie False.

Ajoutez les types de fichier dans la boîte de dialogue Ouvrir.

Propriété Filter du composant OpenDialog:

Texte (*.txt) *.TXT


Tous fichiers (*.*) *.*

Faites de même pour la boite de dialogue Enregistrer. Le code répondant au menu


Enregistrer sera:
If SaveDialog.Execute Then
Edition.Lines.SaveToFile(SaveDialog.Filename);

Créez le presse-papiers,

Ajoutez un menu Edition dans lequel il y aura Couper, Coller et Copier.

Pensez à compléter la propriété ShortCut de l'inspecteur d'objet pour les trois


sous-menus du menu Edition.

Le code correspondant aux trois événements sera:

Edition.CutToClipboard;
Edition.CopyToClipboard;
Edition.PasteFromClipboard;

CutToClipboard, CopyToClipboard, PasteFromCIipboard sont des méthodes du


composant TMemo !

Version 2004 / 2005


Page 40
Laboratoire d’informatique
Programmation Pascal et Delphi

Programme n° 9 :
Gestion des fichiers typés - Répertoire téléphonique

1. Cahier des charges

Cette application permettra d’ouvrir et d’enregistrer un répertoire téléphonique


composé d’un ensemble de fiche complétée à l’aide de 3 champs (Nom, Prénom,
Téléphone) et d’une zone image permettant d’insérer une photo de la personne.
De plus, l’application sera capable de retrouver une personne en fonction de son
nom à l’aide d’une commande de recherche.
Une autre commande permettra d’ajouter des nouvelles personnes.

2. Conception

L’application « répertoire téléphonique » sera composée des menus suivants :

Menu Fichier Menu Edition


Nouveau Rechercher
Ouvrir Ajouter

Menu Fichier

La commande « Nouveau » permettra de créer un nouveau répertoire téléphonique


ou d’en écraser un.
Vous devrez songer à :
• Afficher une boîte de dialogue « Enregistrer sous », pour inviter l’utilisateur à
designer le nom du fichier qui contiendra le répertoire qu’il va créer (NB : si le
fichier existe, vous devrez proposer à l’utilisateur de l’écraser ou de le
préserver). Les fichiers enregistrés auront comme extension REP.
• Activer le formulaire.

La commande « Ouvrir » ouvrira un fichier « répertoire téléphonique (*.REP) »


existant.
Le choix du fichier se fera dans la boîte de dialogue « Ouvrir ».
A l’ouverture du fichier, les données de la première fiche s’afficheront dans le
formulaire.

Version 2004 / 2005


Page 41
Laboratoire d’informatique
Programmation Pascal et Delphi

Edition

La commande « Rechercher » donnera la possibilité de rechercher une fiche à partir


du nom de la personne. La saisi du nom recherché se fera à l’aide de la fonction
INPUTBOX.
Une fois que la fiche est trouvée, le programme affichera ses données dans les
champs respectifs et indiquera dans le libellé du cadre le numéro de celle-ci.

La commande « Ajouter » permettra d’ajouter un enregistrement à la fin du fichier.

Formulaire

Les coordonnées de la personne sont saisies à l’aide de champs.


L’utilisateur pourra remplacer l’image par défaut ☺ en cliquant avec le bouton droit
sur celle-ci. Une boîte de dialogue « Ouvrir » permettra de choisir une photo.
Le bouton de commande « Enregistrer » mémorisera la fiche.
Le bouton de commande « Terminer » arrête l’ajout de personne.

Interface graphique

Version 2004 / 2005


Page 42
Laboratoire d’informatique
Programmation Pascal et Delphi

3. Aide à la programmation

Cette section vous donne les mots-clés qui vous serviront à la programmation de
l’application. La syntaxe et la signification de ces mots-clés sont disponibles dans
l’aide en ligne de Delphi.

La manipulation de fichier passe par les phases représentées ci-dessous :

Mots-clés pour les fichiers typés

NomFichier : File of type


Déclaration
Affectation AssignFile

Ouverture Reset / Rewrite

Lire / Ecrire Read / Write

Fermeture CloseFile

Pour la gestion des fichiers typés, je vous invite à consulter l’aide en ligne de Delphi
en recherchant les mots-clés suivants : Seek, FileSize, FilePos.

L’accès aux boîtes de dialogue de Windows se fait à l’aide des composants visuels
suivants :

[ OpenDialog] , [SaveDialog] , [OpenPictureDialog]

Version 2004 / 2005


Page 43
Laboratoire d’informatique
Programmation Pascal et Delphi

Manipulation 10:
Les carrefours.

1. Cahiers des charges

Dans ce programme vous allez apprendre à enchaîner les Timers ainsi qu’à faire
bouger une image.

Vous devez choisir deux carrefours, réaliser les différents feux à l’aide de shape et
ensuite faire passer la voiture entre ces 2 carrefours. La voiture doit évidemment
s’arrêter lorsque le feux est rouge.

2. Interface graphique

3. Aide à la conception.

Pour faire bouger une image, il suffit d’utiliser la propriété « Left » pour la faire
avancer de droite à gauche et la propriété « Top » pour la faire monter ou
descendre.

Version 2004 / 2005


Page 44
Laboratoire d’informatique
Programmation Pascal et Delphi

Manipulation 11 :
Création et utilisation de Dll.

1. But du programme.

Ce programme est divisé en deux parties :


• Création d’une « dll » calculant différentes surfaces, volumes et
périmètres.
• Création d’un programme utilisant cette « dll ».

2. Interface graphique.

3. Aide à la conception.

library surfaces; //nom de la dll

uses SysUtils, Classes;


Exemple de
conception d’une {$R *.res}
« dll ». function surfaces_carre(cote:integer):integer; //déclaration de la fct
begin
result := cote*cote;
end;

exports surfaces_carre; // exporte la fonction

Version 2004 / 2005


Page 45
Laboratoire d’informatique
Programmation Pascal et Delphi

La « dll » que vous devez créer pourra calculer :

• La surface d’un carré.


• La surface d’un rectangle.
• La surface d’un cercle.
• La surface d’un triangle.
• Le périmètre d’un carré.
• Le périmètre d’un rectangle.
• Le périmètre d’un cercle.
• Le périmètre d’un triangle.
• Le volume d’une sphère.
• Le volume d’un cylindre.
• Le volume d’un cube.

Vous devez ensuite créer un programme qui utilisera cette « dll » (cf. interface
graphique).

Version 2004 / 2005


Page 46

Vous aimerez peut-être aussi