Support 1 Delphi
Support 1 Delphi
Support 1 Delphi
Initiation à Delphi
Delphi 7 (1/3): Initiation
1 AVERTISSEMENT
Ce document est distribué uniquement lors d'un cycle de formation Delphi ne peut être
reproduit partiellement ou intégralement: tous droits réservés.
Conventions:
• le texte entre crochets représente une option facultative,
• le texte en italique des lignes de programme
2 INTRODUCTION
Delphi utilise le langage Pascal Orienté Objet (il est toutefois possible d'utiliser
d'anciennes sources en Pascal standard grâce au compilateur en ligne de commande). Ce
langage est facile à apprendre et beaucoup plus simple que le C++ traditionnel. Les objets
utilisés ont des propriétés et des méthodes. Les propriétés sont les caractéristiques de l'objet
(couleur, taille, ...) tandis que les méthodes sont les procédures (classiques ou
événementielles) et fonctions qui y sont rattachées.
Des outils puissants sont rattachés à Delphi. Le canevas facilite les graphismes et évite
l'appel aux API de Windows (cette solution reste évidemment possible). Les principales
boîtes de dialogue de Windows existent en tant qu'objets et sont facilement réutilisables.
L'utilitaire BDE permet la création et l'accès aisé aux bases de données de tous types. La
liaison avec ACCESS se fait directement, grâce à un driver natif intégré.
Il est facile d'écrire des DLL utilisables par n'importe quel autre programme sous
Windows. Ces DLL peuvent contenir des fiches Delphi, des procédures, des données ou des
ressources graphiques (bitmaps, icônes, curseurs).
La création d'objets (visuels ou non) réutilisables est un gain de temps appréciable pour
le développement. L'intégration des objets Active X peut compléter la bibliothèque existante.
3 Nouveautés
Consulter l'aide en ligne sous "nouveautés" On note des:
4.1 PRESENTATION
Sans le savoir, vous utilisez des objets dans votre ordinateur. Par exemple, vous désirez
changer la carte graphique. C'est un objet: vous ne connaissez pas exactement son
fonctionnement interne mais vous désirez des résultats. Vous pouvez interchanger facilement
cet objet puisque l'interface est standard (connecteurs). Vous n'avez donc pas besoin de
changer toute l'unité centrale ou de faire des études poussées en électronique pour ce faire. Il
suffit d'échanger la carte par une autre plus performante.
L'avantage de cette notion d'objet est la possibilité de partager les composants avec
d'autres utilisateurs. Vous pouvez donner votre ancienne carte vidéo à l'un de vos
collaborateurs. D'autre part, il n'est pas nécessaire de connaître le détail du fonctionnement de
l'objet pour l'utiliser. La maintenance est facilitée, il suffit d'échanger l'objet sans toucher au
reste de l'application.
Propriétés
simples
Objet = entité
Procédures
Méthodes
événementielles
Fonctions
4.2.1 Propriétés
Ce sont les composants de l'objet. Sa taille, sa couleur, son nom, ... sont des propriétés.
Les propriétés sont initialisées à la création de l'objet et certaines peuvent être modifiées par
programmation. Delphi possède un éditeur de propriétés qui permet de les modifier en phase
de conception de projet.
4.2.2 Méthodes
Les méthodes relèvent du comportement de l'objet: elles recensent ce que l'objet "sait"
faire. S'il sait par exemple faire une multiplication, le nom du module de programme concerné
est appelé méthode.
4.2.2.1 Fonctions
Les fonctions sont des modules (ou sous-programmes) qui retournent une seule valeur
ou résultat après acceptation d'un certain nombre d'arguments (0 à n).
4.2.4 L'encapsulation
C'est le concept de base de la POO. L'idée est de rassembler les données et les modules
de programme dans une seule et même structure appelée objet. Les données sont appelées
"propriétés" et les modules sont les "méthodes". On peut utiliser des méthodes de l'objet sans
connaître le détail de l'implémentation de chacune d'elle. L'encapsulation protège les données
contre leur utilisation par d'autres modules extérieurs.
4.2.5 L'héritage
Les objets sont capables d'être dérivés à partir d'objets préexistants. Les objets "fils"
héritent les propriétés et méthodes de leur parent de façon automatique. Il suffit alors de
rajouter des propriétés et méthodes spécifiques: ce procédé est appelé programmation par
exception. De plus, tous les changements effectués dans l'objet "parent" sont répercutés
automatiquement sur les objets "descendants" sans manipulation supplémentaire.
4.2.6 Le polymorphisme
Le nom d'une méthode existante peut être réutilisé dans un objet "fils" en déclarant une
implémentation différente. Le polymorphisme est la capacité de désigner des méthodes
différentes (bien que portant le même nom) en fonction de l'objet concerné. Par exemple le
signe "+" peut servir à l'addition, à la concaténation ou à l'incrémentation d'une date.
Dans le cas de redéfinition(OVERRIDE) d'une méthode, il est possible de réutiliser le
code hérité (INHERITED) et d'ajouter simplement quelques lignes (qui pourront par exemple
redéfinir certaines propriétés).
4.3 LEXIQUE
La source principale de confusion pour les débutants en POO est le grand nombre de
nouveaux termes techniques
4.3.3 Instanciation
C'est le processus qui crée en mémoire un objet basé sur une classe.
4.3.10 Propriétaire(OWNER)
Une application est propriétaire des fenêtres qu'elle manipule. Une fenêtre est
propriétaire des objets quelle contient. Un panneau, comme la barre d'outils, est propriétaire
de ses turbo-boutons...
4.3.11 Héritage
Une classe hérite automatiquement des propriétés et méthodes de ses ancêtres.
4.4 CONCLUSION
Le but de la POO est de créer des composants réutilisables pour faciliter la création de
projets par assemblage d'éléments préfabriqués.
6 L'écran de Delphi
On voit la barre de titre, la barre des menus, la barre d'outils (à gauche), la palette des
composants, la fenêtre principale, l'éditeur de code (en dessous) et l'éditeur de propriétés (et la
vue arborescente des objets). Une fiche est créée d'office, c'est la fenêtre principale de
l'application (modifiable).
C'est une barre d'outils de type particulier: on y trouve les objets qui existent déjà dans
Delphi. Les onglets correspondent aux catégories de composants: cliquer sur l'onglet pour
changer de palette. Pour placer un composant dans la fiche, on peut cliquer sur un composant
puis cliquer dans la fiche (cliquer-glisser pour redimensionner de suite). Il est également
possible de double-cliquer sur un composant: il se mettra automatiquement au centre de la
fiche en cours. Pour placer plusieurs composants identiques, sélectionner le type avec maj-
clic.
• visuels: ils sont visibles à l'exécution (sauf indication contraire); certains d'entre eux
peuvent prendre le "focus", c'est à dire être sélectionnés par l'utilisateur
• non-visuels: ne sont visibles qu'en phase de création; ils disparaissent à l'exécution.
Voici les composants les plus utilisés dans une application standard.
Composant Utilisation
Cadre Composant cadre (nouveau): sert de conteneur de composants
MainMenu Menu principal
PopupMenu Menu surgissant
Label Texte en lecture seule pour l'utilisateur (ex: titre)
Edit Texte en lecture-écriture modifiable par l'utilisateur (zone de saisie)
Memo Mémo: comme le composant précédent, mais possibilité d'utiliser plusieurs
lignes de texte
Button Bouton d'action: c'est le composant le plus utilisé
CheckBox Case à cocher. Propose une option que l'utilisateur peut faire passer de Oui à
Non ou de Vrai à Faux. Les cases à cocher peuvent servir à afficher un
groupe de choix qui ne sont pas mutuellement exclusifs. Les utilisateurs
peuvent sélectionner plusieurs cases à cocher dans un groupe.
RadioButton Bouton radio. Propose une option que l'utilisateur peut faire passer de Oui à
Non ou de Vrai à Faux. Les boutons radio peuvent servir à afficher un groupe
de choix qui sont mutuellement exclusifs. Les utilisateurs ne peuvent
sélectionner qu'un seul bouton radio par groupe.
ListBox Boîte liste. Affiche une liste déroulante de choix.
ComboBox Boîte à options. Affiche une liste de choix en combinant une boîte liste et une
boîte de saisie. Les utilisateurs peuvent saisir des données dans la boîte de
saisie ou sélectionner un élément dans la zone boîte liste.
ScrollBar Barre de défilement. Propose un moyen de modifier la zone visualisée d'une
liste ou d'une fiche. Une barre de défilement peut également être utilisée pour
se déplacer par incréments dans un intervalle de valeurs.
GroupBox Boîte groupe. Sert de conteneur à des options associées dans une fiche.
RadioGroup Groupe de boutons radio. Crée une boîte groupe qui contient des boutons
radio sur une fiche.
Panel Volet. Crée dans une fiche des volets pouvant contenir d'autres composants.
Les volets peuvent servir à créer des barres d'outils ou des lignes d'état.
ActionList Composant permettant la centralisation du code événementiel
Composant Utilisation
BitBtn Bouton bitmap. Crée un composant bouton pouvant afficher une image.
SpeedButton TurboBouton. Propose un bouton pouvant afficher une image mais pas un
libellé. Les TurboBoutons sont fréquemment regroupés dans un volet afin
de créer une barre d'outils.
MaskEdit Comme le composant "Edit" mais permet une saisie formatée
StringGrid Grille de chaînes. Crée une grille pouvant être utilisée pour afficher des
données chaînes de caractères en lignes et en colonnes comme dans un
tableur.
DrawGrid Grille d'affichage. Crée une grille permettant d'afficher des données en
lignes et en colonnes. Plus difficile à utiliser que le composant précédent.
Image Image, gère maintenant également les jpeg
Shape Forme. Dessine des formes géométriques : cercle ou ellipse, carré ou
rectangle (arrondi ou non).
Bevel Biseau. Crée des lignes ou des boîtes avec un aspect tridimensionnel
ciselé.
ScrollBox Boîte de défilement. Crée un conteneur redimensionnable affichant
automatiquement des barres de défilement lorsque c'est nécessaire.
CheckListBox Boîte liste de cases à cocher. Affiche une liste déroulante semblable à une
boîte liste, mais avec une case à cocher à côté de chaque élément.
Splitter Diviseur. Placé sur une fiche entre deux contrôles alignés, il permet aux
utilisateurs de redimensionner les contrôles, à l'exécution, en faisant glisser
la ligne de division.
StaticText Texte statique. Un composant texte non modifiable, comme le composant
Label, mais contenant un handle de fenêtre, ce qui est utile quand la touche
raccourci du composant doit appartenir à un contrôle fenêtré. Utilisez le
composant StaticText pour donner à l'utilisateur des informations sur l'état
en cours de l'application.
ControlBar Composant utilisé pour contenir des barres d'outils
Application Contrôle des événements au niveau application (nouveau)
Events
Value List Editor Gère des couples: clé, valeur
Labeled Edit Zone de saisie avec étiquette
ColorBox Liste de couleurs pour choix
Chart Graphique
ActionManager Composant centralisateur de procédures événementielles
ActionMainMenu Barre de menu d'ActionManager
Bar
Composant Utilisation
TabControl Onglets: permet d'accéder à des pages d'informations
PageControl Pages: comme le contrôle précédent, mais il y a de la place pour placer
des composants
ImageList Liste d'images: sert souvent à stocker les images des boutons des barres
d'outils modernes
RichEdit Editeur de texte formaté: créer un logiciel de traitement de textes devient
facile avec ce composant
TrackBar Glissière de réglage: permet à l'utilisateur de définir une valeur
analogique
ProgressBar Barre de progression: sert souvent à indiquer la proportion d'achèvement
du travail
HotKey Raccourci-clavier qui peut être défini par l'utilisateur
Animate Clip vidéo muet
DateTimePicker Boîte liste permettant la saisie de dates ou d'heures.
MonthCalendar Calendrier: l'utilisateur peut sélectionner une date ou une plage de dates
TreeView Vue arborescence
ListView Affichage mode liste
HeaderControl Entête de colonne
StatusBar Barre d'état
ToolBar Barre d'outils nouvelle génération
CoolBar Barres d'outils multiples style "internet explorer'
PageScroller Zone d'affichage pouvant servir aux barres d'outils
ComboBoxEx Liste déroulante avec images
Grâce aux composants de la page Système de la palette des composants, il est possible
d'utiliser dans une application Delphi des contrôles spécialisés du système.
Composant Utilisation
Timer Minuterie: permet de déclencher des événements à intervalles réguliers
PaintBox Boîte à peindre. Spécifie une zone rectangulaire de la fiche constituant la
délimitation des dessins de l'application.
MediaPlayer Multimédia. Affiche un contrôle de style télécommande pour lire ou
enregistrer des fichiers multimédias son ou vidéo.
OleContainer Conteneur OLE. Crée dans une fiche une zone client OLE (Incorporation
et Liaison d'Objet).
DdeClientConv Conversation client DDE. Établit une connexion client avec une
application serveur DDE (Échange Dynamique de Données).
DdeClientItem Élément client DDE. Spécifie les données du client DDE (Échange
Dynamique de Données) à transférer lors d'une conversation DDE.
DdeServerConv Conversation serveur DDE. Établit une connexion serveur avec une
application client DDE (Échange Dynamique de Données).
DdeServerItem Élément serveur DDE. Spécifie les données du serveur DDE (Échange
Dynamique de Données) à transférer lors d'une conversation DDE.
Composant Utilisation
OpenDialog Boîte de dialogue d'ouverture.
SaveDialog Boîte de dialogue d'enregistrement.
OpenPictureDialog Boîte de dialogue d'ouverture d'image avec prévisualisation
SavePictureDialog Boîte de dialogue d'enregistrement d'image avec prévisualisation
FontDialog Boîte de dialogue des polices
ColorDialog Boîte de dialogue des couleurs
PrintDialog Boîte de dialogue d'impression
PrinterSetupDialog Boîte de dialogue de configuration d'impression.
FindDialog Boîte de dialogue de recherche
ReplaceDialog Boîte de dialogue de remplacement
Le tableau suivant indique les contrôles à utiliser à la place des anciens contrôles :
Composant Utilisation
DBLookupList Liste de référence de base de données. Boîte de liste orientée données
pour afficher à l'exécution les valeurs trouvées dans les colonnes d'une
autre table.
DBLookupCombo Boîte à options de référence de base de données. Boîte à options
orientée données pour afficher à l'exécution les valeurs trouvées dans
les colonnes d'une autre table.
TabSet Onglets. Crée des onglets semblables à ceux d'un classeur. Le
composant TabSet peut s'utiliser avec le composant Notebook pour
permettre aux utilisateurs de changer de page.
Outline Arborescence. Affiche des informations sous forme d'arborescences de
différents formats.
TabbedNotebook Classeur à onglets. Crée une zone d'affichage des données. Les
utilisateurs peuvent redimensionner chaque section de cette zone pour y
afficher différentes quantités de données.
Notebook Classeur. Crée un composant pouvant contenir plusieurs pages. Le
composant TabSet peut s'utiliser avec le composant Notebook pour
permettre aux utilisateurs de changer de page.
Composant Utilisation
Header En-tête. Crée une zone d'affichage des données. Les utilisateurs peuvent
redimensionner chaque section de cette zone pour y afficher différentes
quantités de données.
FileListBox Boîte liste de fichiers. Affiche une liste déroulante des fichiers du
répertoire en cours.
DirectoryListBox Boîte liste des répertoires. Affiche la structure des répertoires du lecteur
actif. Les utilisateurs peuvent changer de répertoire dans une boîte liste
des répertoires.
DriveComboBox Boîte à options des lecteurs. Affiche une liste déroulante des lecteurs
disponibles.
FilterComboBox Boîte à options de filtrage. Spécifie un filtre ou un masque afin
d'afficher un sous-ensemble des fichiers.
L'inspecteur d'objets de Delphi est la passerelle entre l'aspect visuel de votre application
et le code qui lui permet de fonctionner.
Le sélecteur d'objet en haut de l'inspecteur affiche est une liste déroulante contenant
tous les composants de la fiche active, ainsi que leur type. Vous pouvez ainsi sélectionner
rapidement différents composants de la fiche active.
Vous pouvez modifier la largeur des colonnes de l'Inspecteur d'objets en faisant glisser
la ligne de séparation vers une nouvelle position.
Des propriétés peuvent être imbriquées: dans ce cas, elle sont précédées par une flèche.
Pour développer l'arborescence, double-cliquez.
UTILISATION EFFET
double-clic à coté de l'événement création automatique d'un entête de procédure
par défaut
introduction d'un nom de procédure création automatique d'un entête de procédure
avec le nom choisi
ouverture d'une liste déroulante (s'il y a choix d'une procédure commune à plusieurs
déjà des procédures compatibles) événements
Dans certains cas, on voit dans la partie de gauche l'explorateur de code. Il facilite la
navigation dans vos fichiers. La fenêtre de l'explorateur de code contient une arborescence qui
montre tous les types, classes, propriétés, méthodes, variables globales et routines globales
définis dans votre unité. Il montre également les autres unités listées dans la clause uses
L'éditeur de code est un éditeur complet. Il vous permet d'accéder au code (source) des
modules de votre projet. De nombreuses commandes sont disponibles dans le menu
contextuel de l'éditeur de code. Pour personnaliser l'éditeur de code, utilisez la boîte de
dialogue "Outils" - "Options d'environnement". Pour obtenir de l'aide sur un élément dans
l'éditeur de code, placez le pointeur de souris sur le terme qui vous intéresse et appuyez sur
F1.
7 Premier projet
7.1 Notions élémentaires
On remarque la barre de titre, la case système comportant une icône et des boutons pour
agrandir, réduire ou fermer la fenêtre.
Il est évident que cette première application n'est pas encore exécutable. Pour ce faire, il
est nécessaire de compiler (traduire en binaire). Nous n'avons pas écrit une ligne de
programme, le système s'en est chargé. Examinons les lignes de code générées (.PAS).
interface entête pour désigner la section qui sera "vue" par les
autres modules
implementation dans cette section seront écrites les méthodes des objets
manipulés
On peut également visualiser le code de la fiche (.DFM), grâce à l'option "voir comme
texte" de son menu contextuel.
Pour enregistrer le projet, choisir "enregistrer projet sous" dans le menu fichier. Il
faudra donner un nom aux différents modules (.PAS) et au projet (DPR).
7.2 Exécution
Si l'on désire des renseignements sur l'erreur, il suffit cliquer sur le message d'erreur ou
d'avertissement et d'appuyer sur la touche F1 (aide en ligne) et on obtient la fenêtre suivante:
Suffixe Signification
dof options de compilation et informations de versions
dpr source du projet
exe programme exécutable compilé
dcu unité compilée
dfm définition de la feuille
pas source pascal
res ressources: icône de l'application
cfg configuration du compilateur
ddp diagrammes
Pour examiner certains de ces fichiers, il est pratique d'utiliser l'explorateur Windows.
Mettre un raccourci vers le bloc-notes (notepad.exe) dans le répertoire SendTo.
8 Modification du projet
Relancer Delphi et ouvrir le projet précédent. Nous désirons à présent installer un
bouton qui change la couleur du fond de la fenêtre en rouge.
Deux propriétés importantes: "caption" qui permet de changer l'affichage du texte sur le
bouton et "name" qui est le nom qui servira à adresser l'objet. Changer le nom du bouton (c'est
indispensable pour les projets importants) avec quelque chose de plus significatif: BtRouge.
On constate que la propriété "caption" est également modifiée. Changer cette propriété pour
que le bouton affiche "Colorer en rouge". Le composant peut être redimensionné grâce à ses
poignées (visibles quand sélectionné).
end;
Remarques:
• quand je tape "Form1.", l'éditeur de code me propose la liste des propriétés,
méthodes et variables de l'objet.
• le séparateur entre objet et méthodes est le point et l'instruction d'affectation est
":=" et non "=" qui est réservé aux tests d'égalité ou à la déclaration des types. Les
lignes d'instruction se terminent par le point-virgule.
8.3 Améliorations
Il est dommage de ne pas avoir de bouton pour remettre la couleur d'origine et un autre
pour quitter le programme. On pourrait double-cliquer sur la fiche pour rétablir la couleur
d'origine.
end;
L'aide nous dit que "clWindow" pour la couleur de fond courante des fenêtres. La
procédure devient donc:
procedure Tform1.FormDblClick(Sender: Tobject);
begin
Form1.color:=clWindow;
end;
Exécuter et tester.
Aligner les deux boutons à gauche grâce à la palette d'alignement (menu "Voir").
Un menu contextuel sur les objets permet également de les rendre de même taille ou de
les changer d'échelle:
Enregistrer et exécuter.
Exercice:
Enlever le bouton "rouge" et placer trois curseurs dans des panneaux de couleur pour
régler l'intensité des 3 couleurs de base: rouge, vert et bleu. Les intensités varient de 0 à 255.
La fonction RGB (voir l'aide en ligne) est utile. Un seul gestionnaire d'événement suffira.
9 Eléments de programmation
9.1 Déclaration de variables
Une variable est un nom qui, dans du code, représente une adresse mémoire dont le
contenu peut changer lorsque le code est exécuté. Vous devez déclarer une variable avant de
l'utiliser. Les étapes requises sont les suivantes :
• Choix du nom d'une variable
• Choix du type d'une variable
Lorsque vous déclarez une variable, vous devez choisir un nom. Pour faciliter la lecture
de votre code, il est préférable de choisir un nom parlant, qui vous rappelle la signification de
la variable. Par exemple, Jour, Nom ou Total sont des noms plus évocateurs que X, Y ou Z.
Conventions d'écriture: nous allons adopter une séparation des significations par
majuscules comme par exemple: TMonObjetPersonnelSecret. Interdiction formelle de mettre
des espaces ou des accents.
Lorsque vous déclarez une variable, vous devez déclarer son type. Le type d'une
variable définit l'ensemble des valeurs qu'elle peut contenir.
En règle générale, vous déclarerez une variable là où vous en aurez besoin. Par
exemple, si vous voulez utiliser une variable dans un gestionnaire d'événements, vous la
déclarerez à l'intérieur de celui-ci. Il s'agit dans ce cas d'une variable locale. Si la variable doit
être visible par plusieurs procédures ou fonctions, elle doit être déclarée avant la section
implémentation: elle sera globale.
Les déclarations de variables doivent toujours être précédées du nom réservé var. La
déclaration elle-même contient deux parties : celle de gauche est le nom de la nouvelle
variable, celle de droite, son type. Ces deux parties sont séparées par le signe deux points ( : ).
Cet exemple contient trois déclarations de variables : Valeur, Somme et Ligne :
var
Valeur: Integer;
Somme: Integer;
Ligne: string;
Comme Valeur et Somme sont toutes deux du type Integer (entier), la déclaration de
variables peut être présentée comme ci-dessous, avec une virgule pour séparer les deux
variables du même type :
var
Valeur, Somme: Integer;
Ligne: string;
Dans l'exemple suivant, nous supposons qu'il existe une boîte de saisie appelée Edit1 et
un bouton appelé BoutonAjouter dans la fiche. Trois variables (X, Y et Somme) sont
déclarées comme étant de type Integer. Lorsque l'utilisateur clique sur BoutonAjouter, des
valeurs Integer sont affectées à deux variables, X et Y, et ajoutées l'une à l'autre. Le résultat,
Somme, apparaît dans la boîte de saisie :
procedure Tform1.BoutonAjouterClick(Sender: Tobject);
var
X, Y, Somme: Integer;
begin
X := 100;
Y := 10;
Somme := X + Y;
Edit1.Text := IntToStr(Somme);
end;
Une expression consiste généralement en deux identificateurs liés l'un à l'autre par un
opérateur. Pour plus d'informations sur les expressions, reportez-vous à l'entrée "expression"
dans l'index de l'aide de la VCL. Comme la propriété Text d'une boîte de saisie est du type
string et la variable Somme du type Integer, une ligne comme celle-ci ne peut pas être
autorisée, car elle provoque une erreur d'incompatibilité de types à l'exécution ou à la
compilation :
Edit1.Text := Somme;
Plusieurs types de données sont intégrés au langage Pascal Objet. Vous pouvez créer
des variables appartenant à n'importe lequel de ces types prédéfinis. Le tableau ci-dessous
donne la liste (non exhaustive) des types de données prédéfinis :
ENTIERS
Il est facile d'utiliser des entiers en base hexadécimale: faire précéder le nombre par le
signe $.
DECIMAUX
BOOLEENS
Boolean Peut contenir les valeurs True ou False. Nécessite un octet de mémoire.
CARACTERES
On peut utiliser le code ANSI du caractère en le faisant précéder par le signe # (ex:
#10).
CHAINES
POINTEURS
Un pointeur est une variable qui contient l'adresse mémoire de l'objet manipulé.
Utilisation:
♦ new(NomPointeur) réserve la mémoire correspondant à l'objet
♦ NomPointeur^ permet de récupérer l'objet
♦ dispose (NomPointeur) détruit l'objet (pointeur à nil)
VARIANTS
Variant Type de données pouvant contenir des valeurs de différents types, et pouvant
convertir sa valeur en d'autres types de données.
Si vous ne voulez pas utiliser les types de données prédéfinis, vous pouvez définir vos
propres types de données. Les types prédéfinis sont généralement suffisants pour la plupart
des applications Delphi.
Alors que les variables contiennent des valeurs qui peuvent changer pendant l’exécution
de votre application, les constantes contiennent une valeur immuable que vous leur attribuez
au moment où vous les déclarez.
De la même manière que vous déclarez les variables dans une déclaration de variable,
les constantes sont à déclarer dans une déclaration de constante. Une déclaration de constante
doit commencer par le mot réservé const. Dans l’exemple ci-dessous, nous avons trois
déclarations de constantes :
const
Pi = 3.14159;
Réponse = 342;
Produit = 'Delphi';
Pi, Réponse, et Produit sont des noms de constantes qui décrivent la valeur de celles-ci.
Les valeurs réelles des constantes, qui ne peuvent être modifiées au cours de l’exécution de
l’application, sont 3.14159, 142 et ”Delphi”.
Il existe différents types de constantes, comme c’est le cas pour les variables. Par
contre, à la différence de ces dernières, les constantes gardent le type de valeur déclaré dans la
déclaration de constante. Par exemple, la constante Pi est de type Real parce que la valeur
3.14159 est un nombre réel, Réponse est de type Integer parce que 342 est un entier et Produit
est de type string, parce que ”Delphi” est une chaîne.
Il convient de noter que le signe égal (=), dans une déclaration de constante, diffère de
l’opérateur d’affectation (:=) des instructions d’affectation. Dans une déclaration de constante,
le signe égal indique que la partie gauche et la partie droite de la déclaration sont des valeurs
égales.
La mauvaise utilisation de l’opérateur “égal” dans le code Pascal objet est une erreur
assez courante. Lorsque le compilateur rencontre un signe égal au lieu d’un opérateur
d’affectation, il suppose que la partie gauche de l’instruction est une constante ou qu’il y a
comparaison de deux valeurs. Si ce n’est pas ce que vous vouliez, Delphi affiche un message
d’erreur de syntaxe.
Si, inversement, vous avez fait l’erreur d’utiliser un opérateur d’affectation dans une
déclaration de constante, il se produit une erreur de syntaxe et un message apparaît, vous
informant que le compilateur attendait le signe égal.
const
Min = 0;
Max = 100;
Centre = (Max - Min) div 2;
Beta = Chr(225);
NombreCar = Ord('Z') - Ord('A') + 1;
Message = 'Pas assez de mémoire';
ChaineErreur = ' Erreur : ' + Message + '. ';
PosErreur = 80 - Length(ChaineErreur) div 2;
Ln10 = 2.302585092994045684;
Ln10R = 1 / Ln10;
Numerique = ['0'..'9'];
Alpha = ['A'..'Z', 'a'..'z'];
AlphaNum = Alpha + Numerique;
Pascal objet est livré avec un certain nombre de types de données prédéfinis, mais vous
pouvez en créer d'autres: énuméré, intervalle, tableau, ensemble, enregistrement, objet.
Une déclaration de type énuméré donne la liste de toutes les valeurs que le type peut
avoir. En voici quelques exemples :
type
TJours = (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche);
TCouleurPrimaire = (Rouge, Jaune, Bleu);
TService = (Finances, Personnel, Ingeniérie, Marketing, Informatique);
TChien = (Caniche, PittBull, Chihuahua, BergerAllemnad, Teckel);
Chaque valeur entre parenthèses dans une déclaration de type énuméré a une valeur de
type entier déterminée par sa position dans la liste. Par exemple, Lundi, dans la déclaration de
type TJours a la valeur 0, Mardi a la valeur 1, et ainsi de suite. Vous pourriez obtenir le même
résultat en déclarant la variable JourSemaine comme étant de type Integer et en affectant
ensuite une valeur Integer pour représenter chaque jour de la semaine. Si ce système donne de
bons résultats pour des séries ordonnées et prévisibles, comme les jours de la semaine ou les
mois de l’année, mais est beaucoup moins utile si l’ordre des valeurs représentées est
arbitraire. Il n’est pas toujours facile de se souvenir de ce que représente un numéro. Par
exemple, l’affectation:
Race := Chihuahua;
est beaucoup plus évocatrice que
Race := 2;
Quand vous listez une valeur dans un type énuméré, vous la déclarez comme
identificateur. Si les déclarations de type énuméré et de variables précédentes étaient dans
votre application, vous ne pourriez pas, de ce fait, déclarer une variable Finances, car cet
identificateur existe déjà.
Un tableau est un ensemble ordonné d’un type de données où chaque élément est
spécifié par sa position par ordre numérique dans l’ensemble. Lors de la création du tableau,
les éléments ne contiennent aucune valeur, mais vous pouvez les remplir avec des données et
manipuler celles-ci à votre guise. Voici un exemple de déclaration de variable pour un tableau
de type Double :
var
Verif : array[1..10] of Double;
Cette déclaration indique que la variable Verif désigne une liste de dix variables de type
réel, chacune ayant un numéro (appelé numéro d’indice) compris entre 1 et 10.
Il est fait référence à chaque élément d’un tableau par le nom du tableau, suivi de son
indice entre crochets ([ ]). Le tableau Verif contient donc les dix variables Verif[1], Verif[2],
Verif[3], Verif[4] et ainsi de suite, jusqu’à Verif[10]. Vous pouvez utiliser n’importe laquelle
de ces variables là où vous utiliseriez une variable Real ordinaire. En outre, la valeur d’indice
ne doit pas nécessairement être une constante. Ce peut être n’importe quelle expression
donnant un entier compris entre 1 et 10. Par exemple,
J := 5; Verif[J] := 0,0;
Ces instructions affectent la valeur 0,0 à la variable Verif[5]. Comme Verif est un
tableau de type Double, la valeur que vous lui affectez doit être de type Real et contenir une
virgule décimale. De plus, les valeurs Double devant commencer par un chiffre, vous ne
pouvez pas écrire 0,0 sous la forme ,0.
Si vous voulez attribuer la valeur zéro à toutes les variables Verif du tableau, vous
pouvez le faire à l’aide d’une boucle for. Comme un indice peut être une variable, il est plus
facile d’utiliser une boucle for que d’affecter une valeur à chaque élément du tableau avec des
instructions d’affectation distinctes. Cette boucle for affecte la valeur 0,0 aux dix variables :
for J := 1 to 10 do Verif(J) := 0,0;
Vous pouvez définir des tableaux en tant que types. Par exemple :
type
TVerif = array[1..100] of Double;
Vous pouvez ensuite déclarer des variables du type tableau. L’exemple ci-dessous
déclare que Compte est une variable de type TVerif, soit un tableau de 100 nombres réels.
var
Compte : TVerif;
Par défaut, le compilateur utilise une chaîne longue pour la déclaration "string". La
longueur de cette chaîne est limitée uniquement par la mémoire disponible qui est allouée de
façon dynamique. Il n'y a donc plus lieu de déclarer la taille de la chaîne.
Exemple:
var
MaChaine: string;
Si l'on désire utiliser les anciennes chaînes courtes, on peut utiliser "shortstring". Dans
ce cas, la longueur est limitée à 255 caractères.
Exemple:
procedure TForm1.Button1Click(Sender : TObject);
type TVoyelles = set of Char;
var Voyelles : TVoyelles
begin
Voyelles := ['A','E','I','O','U','Y' ];
if Edit1.Text[1] in Voyelles
then Label2.Caption := 'Bravo !';
else Label2.Caption := 'Veuillez réessayer...';
end;
Les enregistrements contiennent des champs contenant des valeurs de données. Chaque
champ a un type de données. Les champs du type TEmploy sont Nom, Pren, Embauch,
Salaire et Poste. Vous pouvez accéder à ces champs individuellement ou bien vous référer à
l’enregistrement dans son ensemble. Il est également possible de déclarer des structures
comportant des types variables en fonction de la valeur d'un champ.
Mais votre code peut aussi manipuler l’enregistrement comme une entité à part entière :
EmployPromu := NouvelEmploy;
Note: Le signe ; termine chaque instruction. S'il est omis, l'instruction se poursuit sur la
ligne suivante. Les commentaires peuvent se mettre entre accolades, ou après un double-slash
dans une même ligne.
Exemple:
if age>65 then
showmessage('retraité) // pas de ; car l'instruction n'est pas terminée
else
begin // début de bloc
showmessage('actif');
MessageBeep(MB_ICONEXCLAMATION); // ou beep()
end; // fin de bloc et fin d'instruction
9.2.6 Le sélecteur
Un sélecteur se comporte comme un rotacteur en électronique: il permet de faire un
choix unique parmi un ensemble d'options. Attention, le sélecteur doit faire partie d'un
ensemble ordonné (le système doit connaître le précédent et le suivant).
Syntaxe:
case sélecteur of
cas1: instruction 1;
cas2: instruction 2;
(...)
casn: instruction n
[else
instruction]
end;
Exemple:
case Carac of
'+': Op:='addition';
'-': Op:='soustraction';
'*': Op:='multiplication';
'/': Op:='division';
else
Op:='erreur';
end;
L'instruction if permet de faire des boucles, mais il en existe des "prêtes à l'emploi"
La procédure Continue provoque le passage du contrôle de l'exécution à l'itération
suivante dans une instruction for, while ou repeat.
La procédure Break provoque l'interruption d'une boucle for, while ou repeat.
Exercice: afficher une suite de 1 à 10 dans un mémo (à faire avec les 3 types de
boucles).
Exemple:
while not fini do
begin
travail1;
travail2;
...
travailn;
end;
Il est évident que la variable booléenne "fini" doit être réévaluée (il doit ^y avoir un
moyen de savoir si le travail est terminé) au cours de la boucle, sinon elle ne prendra pas de
fin.
Exemple:
repeat
prendre une pièce;
la mettre dans le distributeur automatique;
until montant_introduit >= prix_article_choisi;
10 Quelques instructions
Voici quelques instructions utiles; il y en a d'autres à découvrir dans l'aide…
10.1 Arithmétiques
Abs Renvoie la valeur absolue de l'argument
Ceil Arrondit à l'entier supérieur
Exp Fonction exponentielle
Flor Arrondit à l'entier inférieur
Frac Renvoie la partie fractionnelle de l'argument
Frexp Renvoie la mantisse et l'exposant
Int Renvoie la partie entière de l'argument
IntPower Calcule la puissance entière d'une valeur de base
Ln Renvoie le logarithme naturel de l'argument
Log10 Calcule le logarithme en base 10
Log2 Calcule le logarithme en base 2
LogN Calcule le logarithme en base N
Max Maximum de 2 valeurs
Min Minimum de 2 valeurs
Pi Renvoie 3.1415926535897932385
Power Renvoie une élévation à la puissance
Round Arrondi entier
Sqr Renvoie le carré de l'argument
Sqrt Renvoie la racine carrée de l'argument
Trunc Partie entière
Toutes les routines de date et d'heure utilisent les variables de formatage Date/Heure.
10.6 Divers
10.7 Ordinaux
11.1 Fonctions
Une fonction renvoie une donnée dont le type est déclaré. Elle accepte généralement
des paramètres. La structure est la suivante:
function NomFonction(para1:type;…):type;
begin
instructions;
end;
Il est nécessaire de déclarer le type des paramètres ainsi que celui de la valeur retournée
par la fonction. Dans le corps de la fonction, cette valeur retournée doit être définie soit en
affectant une valeur au nom de la fonction ou en utilisant le mot-clé "result".
Nous allons créer un programme qui élève au cube la valeur saisie. Utilisons, pour
changer, la fonction "InputBox" (voir dans l'aide en ligne) pour saisir une valeur et la fonction
"ShowMessage" pour afficher le résultat. La fonction écrite dans la partie implémentation
peut avoir le code suivant:
function Cube(valeur:extended):extended;
begin
Cube :=valeur*valeur*valeur;
end;
Le compilateur travaillant du haut vers le bas, il est nécessaire que le code précédent se
situe avant l'utilisation de la fonction. Il est possible de ne pas le faire, soit en déclarant la
fonction (1° ligne du code: prototype) en fin de section "interface" (visibilité par les autres
modules) ou en mettant ce prototype suivi de la directive "forward" au début de la section
"implémentation"
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées}
public
{ Déclarations publiques}
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function Cube(valeur:extended):extended;forward;
function Cube(valeur:extended):extended;
begin
Result :=valeur*valeur*valeur;
end;
end.
1.1 Procédures
Les procédures sont utilisées pour effectuer des actions, mais peuvent également servir
à renvoyer des valeurs. Comme les fonctions, elles peuvent accepter des paramètres transmis
par valeur (option par défaut), par variables en lecture-écriture (précédées par le mot-clé
"var") ou des constantes (précédés par le mot-clé "const"). La syntaxe en est la suivante:
Ecrire une procédure qui génère deux bips à une seconde d'intervalle:
procedure DeuxBips();
begin
beep();
sleep(1000);
beep();
end;
L'appel à cette procédure peut être déclenchée par l'appui d'un bouton:
12 Les menus
12.1 Menu principal
La mise en place d'une barre de menus est simplifiée par le concepteur de menus. Placer
sur la fiche un composant de type "TMainMenu". Double-cliquer sur lui pour accéder au
concepteur de menus. Il suffit alors de taper les noms en validant avec la touche "entrée".
Pour se déplacer, on peut utiliser la souris ou les flèches de direction.
Particularités:
Accès rapide il suffit de placer le signe "&" dans le nom pour que la lettre
suivante apparaisse en souligné
Séparation taper le signe "-" à la place du nom
Touches de raccourci Attribuer la propriété "shortcut" (attention aux doublons!)
Sous-menu Taper Ctrl + flèche à droite
Déplacement d'éléments par cliquer-glisser
On peut utiliser des modèles existants de menu ou créer des modèles personnels (voir
menu contextuel).
Si l'on utilise des gestionnaires d'événements partagés, on peut les attribuer dans la page
événements de l'inspecteur de propriétés.
Placer un composant de type TPopupMenu sur votre fiche. Appeler l'éditeur de menus
par un double-clic sur lui. Compléter comme précédemment. Il faut ici affecter les
événements avant de refermer le concepteur.
Utilisation: Affecter la propriété PopupMenu de l'un des composants de votre fiche avec
le nom de ce menu.
13.3 Info-bulles
Les info-bulles sont faciles à mettre en œuvre pour les boutons (ou autres composants).
Mettre le texte à afficher dans la propriété "Hint" et positionner "ShowHint" à "true".
Il est possible de grouper les boutons et de les rendre mutuellement exclusifs. Les
boutons peuvent rester enfoncés et présenter une image différente dans ce cas.
En utilisant ajouter, vous pouvez charger votre liste. Des bitmaps se trouvent dans le
répertoire "C:\Program Files\Fichiers communs\Borland Shared\Buttons\". Ensuite il suffit de
choisir "nouveau bouton" (ou séparateur) dans le menu contextuel du composant "Toolbar".
La propriété "ImageIndex" du bouton définit l'image utilisée.
La propriété "Flat" de Toolbar permet d'avoir un effet de bouton surgissant comme dans
certains logiciels récents bien connus.
On peut aussi utiliser le composant "Coolbar" et placer des "Toolbar" garnis dans ses
bandes redimensionnables (style internet).
15 Barre d'état
15.2 Exercice
Créer un nouveau projet. Mettre l'heure dans la seconde partie d'une barre d'état à 3
volets. Utiliser pour cela un timer système (voir l'aide en ligne pour l'utilisation). La fonction
TIME donne l'heure (à convertir en texte).
Option: afficher "MAJ" dans la partie de gauche quand le verrouillage des majuscules
est actif. Il faut intercepter la frappe des touches en mettant la propriété "KeyPrev" de la fiche
à "true" (vrai). Le code de la touche est "VK_CAPITAL".
16 Exercices proposés:
• créer un bloc notes amélioré, multi documents
• réaliser une calculatrice simple, puis à bande, enfin scientifique (puissance,
factorielle, sinus, cosinus, tangente, binaire, hexadécimal, …)
17 Où trouver de l'aide?
• Aide en ligne
• Apprentissage en ligne de Delphi3 (S&SM): sur le CD de Delphi3
• Les manuels papier de Delphi4
• PASCAL (Philippe SPOLJAR chez Sybex poche)
• DELPHI Professionnel - Programmation système 32 bits (Dick LANTIM chez
Eyrolles)
• DELPHI2 - Secrets d'Experts (Charles CALVERT chez S&SM)
• Outils de développement Delphi 1&2 (Gilles BETZ chez Sybex Mégapoche)
• DELPHI 3 (Dick LANTIM chez Eyrolles)
• Internet: www.inprise.com et les groupes de News
1 AVERTISSEMENT _____________________________________________________ 2
2 INTRODUCTION ______________________________________________________ 3
3 Nouveautés ____________________________________________________________ 4
4 PROGRAMMATION ORIENTEE OBJET __________________________________ 5
4.1 PRESENTATION ________________________________________________________5
4.2 CONCEPTS DE BASE ____________________________________________________5
4.2.1 Propriétés______________________________________________________________________ 5
4.2.2 Méthodes ______________________________________________________________________ 5
4.2.3 Programmation structurée _________________________________________________________ 6
4.2.4 L'encapsulation _________________________________________________________________ 6
4.2.5 L'héritage ______________________________________________________________________ 6
4.2.6 Le polymorphisme ______________________________________________________________ 7
4.2.7 Développeur ou utilisateur? _______________________________________________________ 7
4.3 LEXIQUE _______________________________________________________________7
4.3.1 Classe (CLASS) ________________________________________________________________ 7
4.3.2 Objet (OBJECT) ________________________________________________________________ 7
4.3.3 Instanciation ___________________________________________________________________ 7
4.3.4 Constructeur (CONSTRUCTOR)___________________________________________________ 8
4.3.5 Destructeur (DESTRUCTOR) _____________________________________________________ 8
4.3.6 Classe ancêtre __________________________________________________________________ 8
4.3.7 Classe parent ___________________________________________________________________ 8
4.3.8 Classe enfant ___________________________________________________________________ 8
4.3.9 Classe descendante ______________________________________________________________ 8
4.3.10 Propriétaire(OWNER) _________________________________________________________ 8
4.3.11 Héritage ____________________________________________________________________ 8
4.4 CONCLUSION __________________________________________________________9
5 Les objets de Windows (rappel) ___________________________________________ 10
6 L'écran de Delphi ______________________________________________________ 11
6.1 La barre d'outils (paramétrable): __________________________________________12
6.2 La palette des composants_________________________________________________13
6.2.1 Les composants de la page Standard _______________________________________________ 14
6.2.2 Les composants de la page Supplément _____________________________________________ 15
6.2.3 Les composants de la page Win32 _________________________________________________ 17
6.2.4 Les composants de la page Système ________________________________________________ 18
6.2.5 Les composants de la page Dialogues ______________________________________________ 19
6.2.6 Les composants de la page Win3.1_________________________________________________ 20
6.3 L'inspecteur d'objets _____________________________________________________22
6.4 Page Propriétés__________________________________________________________23
6.5 Page Evénements ________________________________________________________23
6.6 L'éditeur de code ________________________________________________________24
7 Premier projet _________________________________________________________ 25
7.1 Notions élémentaires _____________________________________________________25
© Maurice GINDENSPERGER (V 5.1) page 63/65
Delphi 7 (1/3): Initiation