Delphi5 Simple
Delphi5 Simple
Delphi5 Simple
1.1. Introduction
Montres
Toute chose, vivante ou non, peut être
appelé objet.
Abstraction : ignorer les propriétés marginales et concentrer sur les aspects essentiels
1.2.1. Description
En informatique, l'abstraction nous permet de ne considérer que les caractéristiques les plus
importantes des objets que nous manipulons.
nom de l'objet
propriétés
méthodes
1.2.4. Événements
Un objet existe dans un certain environnement. Il est impossible de prévoir ce qui va arriver à l'objet.
Donc, l'objet doit pouvoir réagir à des événements importants.
Événement : fait qui se produit à un certain moment donné et qui peu déclencher une
méthode
Par cycle de développement, on entend les différentes étapes pour réaliser une application selon
l'approche objet.
• Comprendre l'énoncé ;
• Trouver une solution modèle ;
• Identifier les objets nécessaires ;
• Identifier les propriétés et méthodes de chaque objet.
sur papier
1.3.2. Conception orientée objet
2.1. Présentation
Le noyau d'une application Delphi est une fiche, sur laquelle le programmeur pose des objets visuels.
Les propriétés peuvent être modifiés lors de la création d'une fiche, ou en cours d'exécution. Une
méthode peut être affectée à chaque événement prévu. Le corps des méthodes sont rédigés dans le
langage Pascal Objet.
Remarque : Une application Delphi peut être composée de plusieurs fiches. Les fiches sont alors
regroupées dans un projet. Pour nous, un projet = une fiche (projet et fiche ont le
même nom).
Un composant est un objet particulier qui peut être réutilisé dans différents contextes. Ci-dessous une
liste des principaux composants graphiques.
Un objet Panel
La police de caractère
est "Arial"
2.5. Exercices
• Tous les exercices sont à sauvegarder dans le répertoire personnel sous le nom
exact (par exemple : C1E1).
• Tous les objets, méthodes et formulaires portent la désignation appropriée.
• Chaque exercice est sauvegardé dans un répertoire à part (le nom du répertoire est le
même que celui de l'exercice) Une application Delphi a besoin de 6 fichiers
• Utiliser le menu : "save all"
• Réaliser pour chaque exercice la description des objets et la description des
méthodes.
Créer un programme qui permet à l'utilisateur d'entrer son nom. En appuyant sur un bouton pour
soumettre cette entrée, le programme affiche dans une petite zone le message "Bonjour <nom>".
Travail à faire :
a) Ajouter un bouton à la fiche qui porte le nom BtON et le titre "ON". Le bouton BtON se désactive
soi même lors d'un clic (utiliser la propriété "enabled").
b) Ajouter un deuxième bouton BtOFF qui porte le titre "OFF" qui se désactive aussi lors d'un clic.
c) Modifiez les méthodes des deux boutons de façon à ce qu'il y ait toujours un bouton activé et un
bouton désactivé.
d) Remplacez les titres des deux boutons respectivement par "O&N" et "O&FF". Que constatez-
vous?
En Delphi, il existe des fonctions prédéfinies permettant de convertir des chaînes de caractères dans
des nombres et vice versa :
inttostr( ) (Integer to string) conversion d'un nombre entier dans une chaîne de
caractères
floattostr( ) (Floating point number to string) conversion d'un nombre réel dans une chaîne
de caractères
strtoint( ) (String to integer) conversion d'une chaîne de caractères dans un entier.
Uniquement utilisable, si la chaîne de caractères contient la représentation
exacte d'un nombre entier.
strtofloat( ) (String to floating point number) conversion d'une chaîne de caractères dans
un nombre réel. Uniquement utilisable, si la chaîne de caractères contient la
représentation exacte d'un nombre réel.
Exemples :
Button1.Caption := inttostr(1000);
Edit1.Text := floattostr(sqrt(1000));
Label1.Caption := floattostr(0.5 * strtofloat(Edit1.Text));
2.7. Exercices
Développer un programme qui permet à l'utilisateur d'entrer deux valeurs et qui affiche la somme de
ces valeurs.
Faire le programme qui affiche la valeur absolue d'un nombre entier entrée au clavier.
Rappel mathématique :
x si x ≥ 0
forme générale : x = (avec x une valeur lue au clavier)
− x si x < 0
Exemples :
42 = 42
−3 = 3
Réaliser un programme qui permet de résoudre une équation du deuxième degré à une inconnue.
Rappel mathématique :
forme générale : ax 2 + bx + c = 0 (avec a, b et c des nombres lus au clavier)
∆ = b 2 − 4ac
si ∆ < 0, alors pas de solution
−b
si ∆ = 0, alors une solution: x=
2a
−b− ∆ −b+ ∆
si ∆ > 0, alors deux solutions : x1 = et x 2 =
2a 2a
2.7.4. Exercice C2E8
Développer un programme qui calcule la somme de tous les nombres entiers entre deux limites
entrées par l'utilisateur.
• Dans un premier temps, nous supposons que la première limite soit plus petite que la deuxième.
• Dans un deuxième temps, l'exercice est à compléter par un mécanisme de "contrôle de saisie",
c'est-à-dire que le programme échangerait automatiquement les limites entrées, si la première
était plus grande que la deuxième.
Exemple 1 :
fraction initiale : 8/24
résultat : 1/3
Exemple 2 :
fraction initiale : 24/8
résultat : 3
Utiliser des variables intermédiaires au lieu de convertir plusieurs fois une chaîne de
caractères, en principe si cette information est utilisée plus qu'une fois.
Reáliser un programme qui permet d'additionner deux fractions (numérateur et dénominateur sont des
entiers). La fraction résultat est automatiquement simplifié.
3.1. Introduction
Commentaire :
Les quatre boutons Factorielle
effectuent plus ou moins le même
traitement (calcul de la factorielle d'un
nombre).
Remarque :
Plus un programme est long, plus il est complexe à lire et plus il est difficile à trouver d'éventuelles
erreurs.
Solution :
Idée Effet Concept
a) "Factoriser" une partie commune Le programme devient plus court
MODULARITÉ
des quatre méthodes est plus lisible
b) "Réutiliser" pour les quatre boutons Le calcul de la factorielle est
Factorielle le même traitement généralisé est indépendant de RÉUTILISATION
(calcul de la factorielle) l'interface utilisateur
3.2.1. Modularité
Tout système peut être organisé en un ensemble de sous-systèmes moins complexes, afin de le
rendre plus simple à comprendre. L'organisation d'un programme informatique en sous-programmes
est appelée : modularité.
3.2.2. Réutilisation
Un traitement qui est souvent utilisé (par exemple : une fonction mathématique), peut être généralisé.
Au lieu de copier et d'adapter le code pour chaque traitement, il peut être factorisé dans un seul sous-
programme. On parle de : réutilisation.
3.3.1. Différences
Une méthode est un traitement qui appartient à un (ou plusieurs) objets de la forme. Elle est évoquée
suite à un certain événement (par exemple : appuyer sur un bouton, l'événement onClick).
3.3.2. Égalités
3.3.3. La notation
Le symbolisme utilisé pour représenter graphiquement un sous-programme est le même que pour une
méthode.
3.4.1. Définition
appel
résultat
btnFacAClick
btnFacBClick
btnFacCClick
btnFacDClick
btnFacBClick
FAC(N):longint
btnFacCClick
F ! 1
X ! strtoint(edtC.Text) I ! 2
Y ! FAC(X)
tant que I <= N
lblC.Caption ! inttostr(Y)
F ! F * I
I ! I + 1
btnFacDClick
FAC ! F
X ! strtoint(edtD.Text)
Y ! FAC(X)
lblD.Caption ! inttostr(Y)
Remarques :
• Au sein de la fonction :
Le contenu de la fonction FAC est général, c'est-à-dire qu'il représente le calcul général de la
factorielle. Ce traitement est donc indépendant du reste du programme.
La dernière ligne de la fonction est l'affectation du résultat (ici : FAC ! F).
FAC(N) représente donc un nombre concret, celui de la factorielle de N.
Traduction en Delphi :
function FAC(N:integer):longint;
var I,F:integer;
begin
F:=1; La fonction doit être rédigée
I:=2; avant le code des méthodes qui
while I<=N do utilisent le sous-programme.
begin
F:=F*I;
I:=I+1;
end;
FAC:=F;
end;
La notation d'une procédure est identique à celle d'une fonction, sauf le détail de l'affectation du
résultat. Cette ligne n'existe pas dans une procédure.
3.5.3. Exemple
Solution :
Pour réduire le volume de code et pour diminuer
la complexité du programme, il est conseillé
d'utiliser un sous-programme,
Ce sous-programme recevra comme paramètre
la couleur désirée. Le travail fastidieux
(changement de la couleur de chacun des
Panel) sera effectué au niveau du sous-
programme.
Remarque :
L'utilisation d'une fonction n'est pas appropriée,
puisque le sous-programme ne retourne pas de
résultat.
Appel de la procédure
ChgCouleur avec un
btnJauneClick
paramètre
CHGCOULEUR(clYellow)
CHGCOULEUR(C)
btnVertClick
pnl1.Color ! C
CHGCOULEUR(clGreen) pnl2.Color ! C
pnl3.Color ! C
pnl4.Color ! C
pnl5.Color ! C
Traduction en Delphi :
3.6. Exercices
Écrire une fonction ROUND(X,N) qui permet d'arrondir un nombre réel X à N positions décimales.
L'instruction TRUNC peut être utilisée.
Remarque :
Utiliser la fonction ROUND de l'exercice précédent pour
présenter le résultat sous forme propre.
sin x
Développer une fonction TANGENTE, sachant que : tan x =
cos x
Utiliser la fonction ROUND de l'exercice C3E2 pour présenter le
résultat sous forme propre.
Extension possible :
• Réaliser une fonction MIN et une fonction MAX qui retourne
respectivement le plus petit et le plus grand de trois
nombres.
• Écrire un programme permettant de déterminer
le minimum et le maximum de quatre
nombres, en utilisant les fonctions MIN et
MAX.
Extension possible :
Dans le cas où l'utilisateur entre trois valeurs numériques
différentes de 0, il faut vérifier si le théorème de Pythagore
est vérifié pour ces valeurs (utiliser un autre sous-
programme : VERIF_PYTHAGORE). On affiche dans ce un
message adéquat.
Écrire une fonction permettant d'afficher les coefficients binomiaux sous la forme suivante :
p!
C pq =
q!⋅( p − q )!
Développer un sous-programme qui prend en entrée une année et retourne la prochaine année
bissextile.
Réaliser un programme pour le calcul d'intérêts sur un compte bancaire. Un sous-programme prend
en entrée : le capital placé, le taux d'intérêt et la durée du placement en jours. Il retourne l'intérêt
(simple) en Flux.
Réaliser un programme qui permet de diriger un curseur sur 5 champs. Le curseur peut être déplacé
vers la gauche ou vers la droite.
Si le curseur se trouve sur le champs "1", il ne peut pas être déplacé plus vers la gauche. Si le curseur
se trouve sur le champs "5", il ne peut pas être déplacé plus vers la droite.
En cliquant respectivement sur le bouton "<" ou le bouton ">", le curseur est déplacé seulement d'un
champ.
4.1. Introduction
Réaliser de façon autonome un projet de synthèse, seul ou en groupe à deux personnes, selon la
disponibilité des ordinateurs. Il s'agit de réaliser un logiciel opérationnel sous Delphi.
Le projet est évalué comme devoir en classe (sur 60 points). Sauf le code source, aucun rapport écrit
est à remettre.
Il est demandé de développer une calculatrice, permettant d'effectuer les opérations de base
(addition, soustraction, multiplication et division), ainsi que les opérations complémentaires (puissance
y
x , factorielle, carré et racine carré). D'autres fonctions supplémentaires (mémoire, logarithme,
fonctions trigonométriques…) sont considérées comme un bonus dans l'évaluation.
Exemple :
L'utilisateur entre : 12 + 4 *
Après le signe "*", la calculatrice affiche 16, même si cela est mathématiquement incorrect,
puisqu'elle devrait attendre l'entrée du troisième nombre, afin d'effectuer d'abord la multiplication.
• Un programme qui ne fonctionne pas entièrement ou dont certaines des fonctions ne sont pas
implémentées, est considéré comme note insuffisante (note : < 20).
• Un programme, dont les algorithmes sont réalisés de façon propre et optimal, et dont l'interface
est attractive, est considéré comme bon travail (note : > 40.
La recopie d'un programme d'un autre groupe ou la falsification de certaines parties du programme
sont considérées comme faute grave (note : < 10).
L'enseignant effectuera des tests pendant la réalisation du projet et lors de la remise du projet, pour
vérifier si chaque élève dispose de suffisamment de connaissance sur son propre logiciel.
4.4. Contraintes
!
• Le projet sera réalisé dans sa totalité à l'école (et non pas à la maison).
• Il est interdit d'apporter des disquettes ou de copier par un autre moyen des
informations sur le disque local.
Il est permis d'utiliser toute documentation (livre, Internet…) qui n'est pas en contradiction avec un des
points ci-dessus.
4.5. Consignes
• Pour réaliser l'interface, orientez-vous à la calculatrice qui est se trouve sous Windows dans le
menu accessoire.
• Essayer de réutiliser le plus de fonctions qui ont déjà été réalisées pendant l'année (fonction
factorielle, fonction racine carré, fonction puissance…). Cela vous permet de gagner beaucoup de
temps. En plus, vous disposez immédiatement d'un algorithme sans faille.
5.1.1. Introduction
Une liste est un ensemble de lignes, identifiées par un indice. Le contenu d'une ligne est toujours de
type chaîne de caractères (string).
0 Didier Bourdon
1 Pascal Légitimus
2
3 Bernard Campan
4
L'indice de la ligne
Le contenu de la ligne
Attention : L'indice commence avec la valeur 0 (et non pas avec la valeur 1).
5.1.2. Caractéristiques
Chaque ligne d'une liste est un objet du type TItems. Le contenu d'une ligne est toujours une chaîne
de caractères. Seulement, il faut indiquer quelle ligne on veut adresser. Pour cela, il faut indiquer
l'indice de la ligne entre crochets.
L'objet Items (et non pas l'objet ListBox) dispose d'un ensemble de méthodes et de propriétés pour
gérer les lignes d'une liste.
Instruction Résultat
S:=ListBox1.Items[0]; S prend la valeur "Didier Bourdon"
S:=ListBox1.Items[4]; S prend la valeur "Pascal Blaise"
Instruction Résultat
X:=ListBox1.ItemIndex; X prend la valeur 1 (l'indice de la ligne sélectionnée)
S:=ListBox1.Items[X]; S prend la valeur "Pascal Légitimus"
Instruction Résultat
ListBox1.Clear; Efface tout le contenu de la liste.
Rajoute la chaîne de caractère "José" à la
ListBox1.Items.Add('José');
fin de la liste.
Insère la chaîne de caractère "Teresa" à la
ListBox1.Items.Insert(2,'Teresa');
position 2 de la liste
ListBox1.Items.Delete(3); Supprime la quatrième ligne de la liste
Sauvegarde tout le contenu de la liste dans
ListBox1.Items.SaveToFile('T.txt')
le fichier "T.txt".
Chargement du contenu de la liste à partir
ListBox1.Items.LoadFromFile('T.txt')
du fichier "T.txt".
5.3. Exercices
Extensions possibles :
• Ne pas ajouter une ligne vide si l'utilisateur
n'entre aucun nom.
• Permettre de sauvegarder la liste dans un
fichier.
• Permettre de charger la liste à partir d'un
fichier.
• Permettre d'insérer un nom dans à la position
sélectionnée.
Extensions possibles :
• L'utilisateur peut entrer la limite inférieure et la limite supérieure
des nombres aléatoires à générer.
• Prévoir un mécanisme pour assurer que la limite inférieure soit
toujours plus petite que la limite supérieure.
• L'utilisateur peut indiquer le nombre de nombres aléatoires à insérer.
• Prévoir une possibilité pour effacer la liste et pour redémarrer le programme.
Développer un programme pour réaliser des statistiques comme le montre la figure ci-dessous.
Contraintes :
• Seulement des nombres entre 1 et 100 sont acceptées est rajoutées dans le tableau. Sinon, le
programme affiche un message approprié dans une fenêtre de dialogue (MessageDlg).
• Quand la liste est vide, les boutons "Calculer" et "Vider" ne sont pas actifs.
• Le bouton "Calculer" permet d'afficher une statistique sur le contenu du tableau. Si une nouvelle
valeur est rajoutée dans la liste, la statistique qui se trouve éventuellement encore affichée, est
effacée.
• Le bouton "Vider" supprime tout le contenu de la liste est, le cas échéant, efface la statistique.
• Le bouton "Fin" termine le programme.
Extensions possibles :
• Rajouter une option pour ajouter un nombre aléatoire dans la liste.
• L'utilisateur peut entrer la limite inférieure et la limite supérieure des nombres aléatoires à générer.
• Prévoir un mécanisme pour assurer que la limite inférieure soit toujours plus petite que la limite
supérieure.
• L'utilisateur peut indiquer le nombre de nombres aléatoires à insérer.
• Prévoir une possibilité pour effacer la liste et pour redémarrer le programme.
Réaliser un programme qui permet de gérer une liste des membres d'un club.
• L'utilisateur peut remplir une liste avec des noms.
• Il est possible de trier la liste dans l'ordre alphabétique.
• Prévoir un mécanisme pour effacer un nom de la liste (en cliquant sur un bouton "supprimer").
• En double-cliquant sur un nom, celui-ci peut être modifié. Le nom à modifier est d'abord copié
dans une zone d'édition (Edit), où il peut être modifié. Ensuite, il est automatiquement supprimé
de la liste. Pour valider la modification, l'utilisateur actionne un bouton. Le texte modifié est ensuite
rajouté à la liste.
• Une statistique affiche combien de fois un certain nom apparaît dans la liste. Le nom à rechercher
est entré dans une zone d'édition (Edit).
• Il est possible de remplacer toutes les occurrences d'un certain nom dans la liste par un autre
nom. Le nombre de remplacements est affiché.
Extensions possibles :
• Prévoir un mécanisme pour supprimer toutes les occurrences d'un certain nom.
• Permettre de "désactiver" la fonction de tri.
• Il est possible de sauvegarder et de charger le contenu de la liste.
Remplir une première liste avec N nombres aléatoires entre 2 et 5. N étant un nombre entré par
l'utilisateur.
En appuyant sur un bouton, une deuxième liste est remplie avec la factorielle correspondante au
nombre de la première liste. Réutiliser la fonction FAC(N) réalisée au premier trimestre !
Soit deux listes (liste A et liste B). Chacune contient des nombres aléatoires entre 10 et 20. Copier
tous les éléments de A vers B, sachant que l'utilisateur peut indiquer une valeur qui n'est pas à copier.
Mémoriser les résultats de x jets d'un dé, où x est un nombre entré par l'utilisateur (utiliser un
"SpinEdit"). Une statistique peut être demandée, qui affiche le nombre de fois, que chacun des 6
chiffres est apparu dans le résultat.
Remplir une liste avec N nombres aléatoires. L'utilisateur détermine les limites de ces nombres.
Afficher dans une deuxième liste le contenu de la première ainsi que les positions.
Fusionner deux listes A et B, triés par ordre croissant, en une seule liste C, trié par ordre croissant.
suite 1 : 5 7 10 12 13 13 16 suite 2 : 2 3 9 12
Transférer les nombres strictement positifs d'une liste A dans une liste B, et les nombres négatifs ou
nuls dans une liste C.
En général, la boîte à options est manipulée comme une liste (ListBox), sauf qu'elle dispose d'une
boîte de saisie. Les lignes de la boîte à options sont, par analogie à la "ListBox", du type "TItems". Le
chargement et la sauvegarde du contenu de la liste se fait donc de la même façon comme pour la
"ListBox".
Il existe trois boîtes à options standard. Le style est défini par la valeur de la propriété "Style".
Constante Signification
csSimple La liste déroulante n'est pas visible, mais les éléments sont accessibles
par les touches curseur.
csDropDown La liste déroulante apparaît lorsqu'on clique sur le bouton fléché. La
zone d'édition est accessible. C'est le style par défaut.
csDropDownList La zone d'édition n'est pas accessible. La liste déroulante s'ouvre
automatiquement lorsqu'on clique sur la boîte à options.
Deux autres styles sont "csOwnerDrawFixed" et "csOwnerDrawVariable". Ils permettent de définir des
boîtes à options non-standard.
Réaliser un programme qui permet à l'utilisateur de choisir un mois à partir d'une liste. Le mois
sélectionné sera affiché dans un label.
• Le contenu de la liste peut être chargé à partir du fichier "mois.dat".
• Essayer les trois styles (csSimple, csDropDown, csDropDownList) pour la boîte à option.
Reprendre les exercices sur les listes et les modifier de sorte en utilisant que des boîtes à options (si
possible).
Partie 1 : Saisie
a) Mettre en œuvre la description des objets suivante :
speL1 speL2 speN
minValue ! 0 minValue ! 1 minValue ! 1
maxValue ! 10 maxValue ! 20 maxValue ! 99
Value ! 0 Value ! 5 Value ! 1
Consulter le programme exécutable pour apprendre à quel moment les différents boutons sont
respectivement actifs ou pas actifs.
6.1. Introduction
Une chaîne de caractère est appelée "string" en Delphi (et Pascal). On peut considérer une chaîne de
caractère comme liste de caractères.
Attention : la première cellule porte l'indice 1 (et non pas 0, comme chez les listes).
Remarque : Pour insérer un espace entre "Delphi" est "is fun", il suffit d'écrire :
Rappelant qu'une liste est dynamique, c'est-à-dire que sa longueur n'est pas connue d'avance. Par
analogie, la longueur d'une chaîne de caractère n'est pas connue. L'instruction Length retourne la
longueur, c'est-à-dire le nombre de lettres, d'une chaîne de caractères.
Exemple :
Soit la chaîne de caractères X :
En général :
S ! Copy(CHAINE, I, NBR)
nombre de caractères
une chaîne de caractères à extraire
la position à partir de
laquelle on veut extraire
une sous-chaîne
Exemples :
Soit PHRASE une chaîne de caractères contant le texte : "Je me sens en forme".
6.4. Exercices
Exemples :
Salut " non
RADAR " oui
omo " oui
otto " oui
Travail à faire :
• Réaliser une présentation identique à celle montrée dans la figure.
• La zone d'édition de la boîte à options (ComboBox) n'est pas accessible.
• Au moment du démarrage du programme, le contenu de la boîte à options est automatiquement
chargé à partir du fichier "usa.dat".
• En sélectionnant un élément de la liste, le nom et le prénom duquel se compose cette chaîne de
caractères sont automatiquement séparés.
• Écrire un programme qui permet d'afficher dans le sens opposé une liste de noms.
• Le bouton "Charger" permet de charger des noms à partir du fichier "noms.dat".
• Le bouton "Inverser" ajoute tous les noms dans le sens opposé dans la deuxième liste, en utilisant
une fonction INVERSER(S:string):string.
• Le bouton "Fin" termine le programme.
• Le bouton "Effacer" supprime le contenu de la deuxième liste (noms renversés).
• Consulter le programme exécutable pour apprendre le jeu des boutons (quel bouton est actif à
quel moment).
Extension possible :
Afficher la fréquence de tous les
caractères dans une chaîne donnée.
Réaliser la fonction
FREQUENCE(TEXTE:string;
S:string):integer
Extension possible :
• Les mots de la chaîne de caractères
peuvent être séparés d'un ou de plusieurs
espaces.
• Les mots de la chaîne de caractères
peuvent être séparés par d'autres
symboles (p. ex. virgule, points,…).
L'utilisateur peut définir la liste de
séparateurs.
Soit une liste de nombres aléatoires entre –10 et +10. Réaliser une méthode qui permet de transférer
les nombres positifs dans une deuxième liste et les nombres négatifs dans une troisième liste.
Écrire un programme qui calcule la ligne suivante et la rajoute dans une liste. À chaque fois, où
l'utilisateur appuie sur un bouton, la prochaine ligne sera dérivée de la précédente.
Extension possible :
L'utilisateur peut choisir à l'aide d'une boîte à option, si la liste doit être triée dans l'ordre croissant ou
décroissant.
La propriété "Items" de l'objet "MainMenu" permet d'activer une fenêtre pour saisir les différents sous
menus. L'entrée du caractère "-" permet d'insérer une ligne dans le menu actuel.
Chaque option dans le menu est en fait un objet du type TMenuItem. Dans l'exemple ci-dessus,
Delphi a crée les objets "File1", "Open1", "Save1" et "Saveas1". Ces objets ne sont pas visibles
sur la fiche, mais peuvent être modifiés dans l'inspecteur des objets.
Remarque : L'événement OnClick peut très bien pointer sur une méthode déjà existante. Cela se
fait souvent en pratique, d'offrir à l'utilisateur un menu complet, mais aussi quelques
boutons qui regroupent les fonctions essentielles du programme. L'utilisateur a alors
le choix d'actionner le bouton ou le menu, voire même d'utiliser un ShortCut.
Beaucoup d'occasions sont imaginables, où l'utilisateur est demandé d'entrer certaines informations
(par exemple : choix de l'imprimante, choix de la police de caractère, choix du nom de fichier,…). De
tels dialogues sont standardisés en Windows, donc existent sous forme de composants en Delphi. Ci-
dessous, nous nous limitons sur l'explication du dialogue de sauvegarde et du dialogue d'ouverture.
Remarque : Il est possible de tester si l'utilisateur a choisi un nom de fichier, ou s'il a appuyé sur
le bouton "cancel".
Exemple :
if SaveDialog1.Execute=false then
MessageDlg('Cancel',mtInformation,[mbOk],0)
else
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
Remarque : Il est possible de tester si l'utilisateur a choisi un nom de fichier, ou s'il a appuyé sur
le bouton "cancel".
Exemple :
if OpenDialog1.Execute=false then
MessageDlg('Cancel',mtInformation,[mbOk],0);
8.1. Introduction
Réaliser de façon autonome un projet de synthèse, seul ou en groupe à deux personnes, selon la
disponibilité des ordinateurs. Il s'agit de réaliser un logiciel opérationnel sous Delphi.
Le projet est évalué comme devoir en classe (sur 60 points). Sauf le code source, aucun rapport écrit
est à remettre.
Il est demandé de développer un logiciel qui permet de gérer des championnats de Taekwondo.
competiteurs.dat
Bruce Lee;65;M
Chuck Norris;78;M
Jackie Chan;68;M
Master Lee;72;M
• Un programme qui ne fonctionne pas entièrement ou dont certaines des fonctions ne sont pas
implémentées, est considéré comme note insuffisante (note : < 20).
• Un programme, dont les algorithmes sont réalisés de façon propre et optimale, et dont l'interface
est attractive, est considéré comme bon travail (note : > 40).
• Des fonctionnalités supplémentaires sont considérées comme bonus, mais ne sont cependant pas
nécessaire pour obtenir une note positive.
La recopie d'un programme d'un autre groupe ou la falsification de certaines parties du programme
sont considérées comme faute grave (note : < 10).
L'enseignant effectuera des tests pendant la réalisation du projet et lors de la remise du projet, pour
vérifier si chaque élève dispose de suffisamment de connaissances sur son propre logiciel.
8.4. Contraintes
• Le projet sera réalisé dans sa totalité à l'école (et non pas à la maison).
•
Il est interdit de copier le projet sur disquette.
Il est interdit d'apporter des disquettes ou de copier par un autre moyen des
informations sur le disque local.
8.5. Consignes
• Il est conseillé de
s'orienter au programme
exécutable pour réaliser
l'interface graphique.
• Sauvegarder
régulièrement le code
source.
La fiche contient trois boutons ("Up", "Reset'" et "Automatic'") et un panel affichant d'abord la valeur
zéro.
• Par le bouton "Up'" la valeur du panel est augmentée de 1.
• Le bouton "Reset" remet le compteur à zéro.
• Par le bouton "Automatic'" la valeur du panel est augmentée de 1 chaque seconde. Le bouton
"Up" est désactivé. En cliquant sur "Reset" le mode automatique est arrêté et le bouton "Up" est à
nouveau activé.
Extensions possibles :
• Prévoir un bouton "Down" qui diminue la valeur du panel de 1. Attention, dans le mode
automatique, il faut vérifier s'il faut augmenter ou diminuer la valeur du panel.
• Modifier le programme de façon à ce que la valeur du compteur soit augmentée et diminuée par
une valeur entrée dans un champ d'édition.
• Prévoir un mécanisme pour que l'utilisateur puisse modifier la fréquence (par défaut : 1 seconde).
Les composants visibles disposent de deux propriétés intéressantes : "top" et "left". Elles indiquent la
position de l'objet par rapport au bord de la fiche. En se servant de ces deux propriétés, il est
demandé de réaliser le programme suivant :
• Un panel se déplace automatiquement de la gauche vers la droite sur la fiche (utiliser un
composant Timer). Le sens du déplacement du panel change dès que l'image touche au bord de
la fenêtre.
• Intégrer un champ d'édition pour modifier le pas de déplacement du panel.
• Intégrer un champ d'édition pour modifier l'intervalle du Timer.
• Les deux champs d'édition sont regroupés dans une "GroupBox".
• La couleur du texte du panel change de façon aléatoire à chaque déplacement.
Extensions possibles :
• Deux boutons "Left" et "Right" permettent de changer de sens manuellement. Une logique
appropriée est utilisée afin que seulement un des deux boutons soit actif à la fois.
• Modifier l'exercice en ralentissant l'image progressivement lorsqu'elle s'approche des bords de la
fenêtre avant de modifier la direction. (utiliser les fonctions trigonométriques sin ou cos).
Remarque : La propriété picture est un objet du type TPicture qui dispose entre autre de la
méthode LoadFromFile pour charger une image.
Exemple :
Image1.Picture.LoadFromFile('c:\images\lte.jpg');
• La fiche contient deux boutons portant les titres 'Hide' et 'Show' ainsi qu'un composant Image1 du
type TImage.
• Une image est à charger dans Image1. Le cadre de l'image doit s'adapter automatiquement à la
taille de l'image, sans la modifier.
• Les boutons 'Hide' et 'Show' respectivement cachent ou fassent réapparaître l'image.
• Seulement un des boutons 'Hide' et 'Show' est visible à la fois.
Extensions possibles :
• À l'aide de cinq boutons ('Image 1'…'Image 5'), l'utilisateur peut choisir l'image qui sera affichée.
• Prévoir un mécanisme pour que l'utilisateur puisse décider si le cadre de l'image doit s'adapter à
la taille de l'image ou non.
Les images 'pic1.jpg' jusqu'à 'pic5.jpg' se trouvent dans le répertoire de travail. Réaliser le programme
suivant :
• Le bouton 'Start' active un Timer qui affiche à intervalle régulier successivement les différentes
images. Le bouton 'Stop' et 'Start' ne sont pas actifs en même temps.
• L'intervalle de temps peut être sélectionné en cours de route (minimum : 1 seconde et maximum :
5 secondes).
• Le nombre d'images à montrer peut être changé en cours d'exécution.
• L'image est automatiquement adaptée à la dimension du cadre prévu (utiliser la propriété stretch).
• Le bouton 'Fin' termine le programme.
Une fonction est un sous-programme qui retourne une valeur. Cette valeur peut être un nombre, une
chaîne de caractère, mais peut aussi être du type logique : vrai ou faux (en Delphi : true, false). Ce
dernier type, appelé "boolean" est idéal pour retourner le résultat d'un test.
9.3.1. Exemple
TEST_PREM(X) = true
vrai faux
Button1.onClick TEST_PREM(X)
I ! 0 I ! 2
C ! 0
tant que (I <= X) et (X mod I <> 0)
tant que I <= ListBox1.Items.Count-1
I ! I + 1
X ! StrToInt(ListBox.Items[I])
X mod I <> 0
TEST_PREM(X) = true vrai faux
vrai faux
TEST_PREM ! true TEST_PREM!false
C ! C + 1
I ! I + 1
Panel2.Caption ! IntToStr(C)
unit Unit1;
… procedure TForm1.Button1Click(Sender:
… TObject);
… var I,C,X:integer;
begin
implementation I:=0;
C:=0;
{$R *.DFM} while I<=ListBox1.Items.Count-1 do
begin
function TEST_PREM(X:integer):boolean; X:=StrToInt(ListBox1.Items[I]);
var I:integer; if TEST_PREM(X)=true then
begin begin
I:=2; C:=C+1;
while (I<=sqrt(I)) and (X mod I<>0) do end;
begin I:=I+1;
I:=I+1; end;
end; Panel2.Caption:=IntToStr(C);
if X mod I<>0 then end;
begin
TEST_PREM:=true; end.
end
else
begin
TEST_PREM:=false;
end;
end;
Réaliser un programme qui permet d'effectuer une expression numérique contenant deux termes.
L'opérateur (addition, soustraction, division, multiplication, exposant) est à choisir dans une liste
d'édition.
Travail à faire :
• Réaliser une interface identique à celui montré ci-dessus.
• Choisir le type de la liste d'édition, de façon à ce que l'utilisateur ne puisse pas entrer une valeur
dans la zone d'édition de la liste.
• Le bouton "=" fait évaluer l'expression en vérifiant :
– d'abord si les deux termes ne contiennent seulement des chiffres, ou éventuellement le signe
"+" ou "-" au début du terme, sinon un message d'erreur est affiché dans une fenêtre de
dialogue (MessageDlg) ;
– si l'utilisateur a vraiment choisi un opérateur.
• Dans le cas de l'opérateur "^", un sous-programme réalise ce traitement. L'exposant négatif ou nul
est accepté aussi.
Travail à faire :
• L'utilisateur entre une expression correcte.
• Chaque terme est toujours précédé par un signe (+ ou -), même le premier terme.
• Chaque terme a un degré (l'exposant est séparé du coefficient par le symbole ^).
• Le degré n'a pas de signe.
• Le degré 0 est permis.
• Un terme et un degré se compose de 1 ou plusieurs chiffres.
• Utiliser une fonction "EXP" qui calcul la puissance x .
y
Réaliser un programme qui permet de résoudre une équation du premier degré à une inconnue.
Travail à faire :
• L'utilisateur entre une expression correcte (l'inconnue étant toujours "x").
• Chaque terme est toujours précédé par un signe (+ ou -), même le premier terme.
• Réaliser une fonction "TRANSPOSE(S,MEMBRE)", où S est l'expression (par exemple : le membre
de gauche) sous forme de chaîne de caractères, et MEMBRE est l'information, s'il s'agit du membre
de gauche ou de droite.
• Isoler chaque terme.
• Mettre les coefficients dans une liste et les constantes dans une autre. Attention au changement
de signe, si un terme est transposé de membre.
Remarque préliminaire :
Un mot français peut avoir une, deux ou trois traductions.
Étape 1 : Chargement
Au moment du démarrage du programme, le vocabulaire est chargé. Sur le disque se trouve un fichier
"DICO.DAT" qui a la structure suivante :
abaisser;senken
abandonner;verlassen;aufgeben
abattoir;Schlachthof
abri;Schutz;Obdach;Bunker
abruti;Blödian
Étape 2 : Présentation
Le dictionnaire se présente sous forme de quatre listes.
• La première contient le mot français.
• La deuxième la traduction en allemand.
• La troisième et quatrième liste contient une autre traduction si disponible. Sinon, elles ont le
contenu : "---".
Étape 3 : Recherche
Il est possible de rechercher un mot français dans le dictionnaire.
• Si le mot est introuvable, un message approprié est affiché.
• Si le mot a été trouvé, les lignes correspondantes dans les quatre listes sont sélectionnées.
Remarques préliminaires :
• Une fonction "tangente" n'existe pas en Delphi.
• Delphi est un produit américain, donc travaille avec des radians pour exprimer des angles (et non
pas des degrés).
X1
X2
Étape 1 : Saisie
• Une liste peut être remplie avec N nombres aléatoires entre X1 et X2.
• X1 et X2 peuvent varier entre 0 et 360. N peut varier entre 0 et 20.
• Si X1 est plus grand que X2, alors le programme fait automatiquement une permutation.
• La liste est vidée avant de la remplir avec de nouvelles valeurs.
Étape 2 : Calculer
• Utiliser une fonction CONV pour convertir les angles en radians.
• Développer une fonction TAN pour calculer la tangente d'un angle (exprimé en radians).
• La fonction TAN retourne "---" si la tangente n'existe pas, sinon une valeur.
• Les listes sont vidées avant de les remplir avec de nouvelles valeurs.
Divers
• Le bouton "Calculer" est seulement actif, après avoir appuyer sur la touche "Remplir".
• Le bouton "Calculer" se desactif après l'avoir actionner.
• Le bouton "Auteur" affiche le nom du programmeur dans une fenêtre.
• Le bouton "Fin" termine le programme.
pnlAfficheMouseDown pnlAfficheMouseUp
btnBleuClick btnRougeClick
btnOKClick
btnON btnOFF
Caption ! "ON" Caption ! "OFF"
Enabled ! true Enabled ! false
btnONClick btnOFFClick
btnONClick btnOFFClick
btnCalculer
Caption ! "Calculer"
btnCalculerClick
btnCalculerClick
pnlSomme.Caption ! inttostr(strtoint(edtValeur1.Text) +
strtoint(edtValeur2.Text))
btnCalculerClick
X ! strtoint(edtValeur.Text)
X < 0
oui non
X ! - X
pnlAffiche.Caption ! inttostr(X)
btnCalculerClick
A ! strtoint(edtA.Text)
B ! strtoint(edtB.Text)
C ! strtoint(edtC.Text)
DELTA ! B2-4*A*C
DELTA < 0
oui non
S ! "pas de DELTA = 0
solution" oui non
S!floattostr(-B/(2*A)) − B - DELTA
X1 ←
2A
− B + DELTA
X2 ←
2A
S!floattostr(X1)+
floattostr(X2)
pnlResultat.Caption ! S
Remarque :
Les formules peuvent s'écrire de façon naturelle au structogramme. Ce n'est qu'en Delphi, qu'elles
doivent être traduites en forme machine.
btnCalculerClick
L1 ! strtoint(edtL1.Text)
L2 ! strtoint(edtL2.Text)
L1 > L2
oui
non
X ! L1
L1 ! L2
L2 ! X
SOMME ! 0
pour X ! L1
SOMME ! SOMME + X
à L2
pnlS.Caption ! inttostr(SOMME)
btnCalculer
Caption ! "Calculer"
btnCalculerClick
btnCalculerClick
X ! strtoint(edtX.Text)
Y ! strtoint(edtY.Text)
Y = 0
oui
non
P ! 1 P ! X
pour I ! 1
P ! P * X
à Y-1
btnSimplifier
Caption ! "Simplifier"
btnSimplifierClick
btnSimplifierClick
NUM ! strtoint(edtNum.Text)
DEN ! strtoint(edtDen.Text)
I ! 2
DEN = 1
oui non
S ! S ! inttostr(NUM) + "/" +
inttostr(NUM) inttostr(DEN)
lblRes.caption ! S
PUIS(X,Y)
RES ! X
pour I ! 2 à Y
RES ! RES * X
PUIS ! RES
L'instruction TRUNC retourne la valeur entière d'un nombre réel, par exemple : TRUNC(12.34)
retourne 12.
( )
trunc x ⋅ 10 n → 1234
( )
trunc x ⋅ 10 n
→ 12,34
10 n
ROUND(X,N)
N = 0
vrai faux
Y ! trunc(X) Y ! trunc(X*PUIS(10,N)/PUIS(10,N))
ROUND ! Y
Remarque :
En Delphi, le symbole pour les positions décimales peut être la virgule ou le point, selon la
configuration de Windows. Vérifier dans le "Control Panel, Regional Setting, Number".
Rappel mathématique :
π
90° rad
2
0°
0 rad
180° π rad
270° 3
π rad
2
DEG2RAD(X) RAD2DEG(X)
π ⋅ X 180 ⋅ X
DEG2RAD ! RAD2DEG !
180 π
Remarque :
En Delphi (comme en Pascal), tout angle est représenté en radians. Donc, les fonctions prédéfinies
sin() et cos() opèrent avec des radians. Comme l'utilisateur entre l'angle en degrés, il est
nécessaire de faire la conversion.
TANGENTE(X)
btnTangenteClick
X ! speAngle.Value
ANGLE ! DEG2RAD(X)
SINUS ! sin(ANGLE)
COSINUS ! cos(ANGLE)
lblSin.caption ! floattostr(ROUND(SINUS,4))
lblCos.caption ! floattostr(ROUND(COSINUS,4))
ANGLE = 0
vrai faux