Delphi First Approche
Delphi First Approche
Delphi First Approche
Introduction
Cette rapidité et cette simplicité de développement sont dues à une conception visuelle de
l’application. Delphi propose un ensemble très complet de composants visuels prêts à
l’emploi incluant la quasi-totalité des composants Windows (boutons, boîtes de dialogue, me-
nus, barres d’outils…) ainsi que des experts permettant de créer facilement divers types
d’applications et de librairies.
Pour maîtriser le développement d’une application sous Delphi, il est indispensable d’aborder
les trois sujets suivants :
Nous complèterons cette approche par la connexion aux bases de données avec Delphi.
souvenir
1. Éléments du langage
a) Identificateurs et instructions
Un identificateur est un nom permettant au compilateur d’identifier un objet donné. Les noms
de variables, par exemple, sont des identificateurs. Un identificateur doit commencer par une
lettre. Les caractères suivants peuvent être des lettres, des chiffres ou le caractère _. Majuscu-
les et minuscules ne sont pas différenciées. Seuls les 63 premiers caractères d’un identifica-
teur sont pris en considération par le compilateur.
Outre les variables, constantes, etc., un programme Pascal contient des mots réservés que
l’utilisateur ne peut pas employer. Ce groupe d’identificateurs particuliers correspond aux
composants du langage Pascal.
And Else In Or To
Asm End Inherited Packed Try
Array Except Inline Procedure Type
Begin Exports Interface Program Unit
Case File Label Record Until
Const Finally Library Repeat Uses
Constructor For Mod Set Var
Destructor Function Nil Shl While
Div Goto* Not Shr With
Do If Object String Xor
Downto Implementation Of Then
b) Opérateurs
Affectation
Ex. resultat:=100;
Opérateurs arithmétiques
Multiplication : *
Division entière : div
*
Ce n’est pas parce que le goto existe en Pascal qu’il faut l’utiliser !
Division : /
Modulo : mod
Addition : +
Soustraction : -
Opérateurs logiques
Et logique : and
Ou logique : or
Ou exclusif : xor
Négation : not
Opérateurs de relation
Égal : =
Différent : <>
Supérieur/Supérieur ou égal : > >=
Inférieur/Inférieur ou égal : < <=
Appartenance à un ensemble : in
c) Commentaires
(* … *) ou { … }
2. Types de données
a) Types prédéfinis
Types tableaux
Array[imin..imax, …] of <type>
b) Types personnalisés
Énumérations
Intervalles
Ensembles
Enregistrements
a) Squelette
Program Nom_du_programme;
Uses {unités}
Const
{Déclarat
ion de
constante
s}
Type
{Déclarat
ion de
types
personnal
isés}
Var
{Déclarat
ion de
variables
b) Notion de bloc
}
Begin
{Bloc principal du
c) Déclaration
programme}des constantes
End.
Ex. Const PI=3.1416;
NOM=’Université Lyon 2’;
a) Lecture au clavier
b) Écriture à l’écran
NB : Ces instructions sont définies dans l’unité Crt de Pascal, qu’il faut appeler en début de
programme par la commande Uses Crt ;.
5. Structures de contrôle
a) Branchements conditionnels
If…then…else
Case…of
Case {variable} of
{valeur1}: {Instruction};
{valeur2}: {Instruction};
…
else {Instruction par défaut};
end ;
b) Boucles
While…do
Ex. i:=1;
While i<=10 do
Begin
Write(i,’
‘);
i:=i+1;
End;
Writeln(‘*’
);
Repeat…until
Exécute des
instructions jusqu’à
ce qu’une condition
soit vérifiée.
Repeat
{instructions}
until
{condition};
Ex. i:=1;
Repeat
Write(i,’
‘); i:=i+1;
Until i=10;
Writeln(‘*’
);
For…to|downto…do
Exécute des instructions un nombre fini de fois suivant un ordre croissant ou décroissant.
6. Procédures et fonctions
Les procédures et les fonctions permettent de diviser un programme en unités plus petites (des
sous-programmes) pour mieux le structurer. La seule différence entre procédure et fonction
est que cette dernière renvoie une valeur au programme ou au sous-programme appelant.
a) Squelette de déclaration
Type Type
{Déclaration de types locaux} {Déclaration de types locaux}
Const Const
{Déclaration de constantes locales} {Déclaration de constantes locales}
Var Var
{Déclaration de variables locales} {Déclaration de variables locales}
Begin Begin
{Corps de la procédure} {Corps de la fonction}
End; NomF:={valeur de retour};
End;
b) Exemples de sous-programmes
Begin Begin
res:=1; res:=1;
For i:=1 to N do res:=res*nombre; For i:=1 to N do res:=res*nombre;
Writeln(res); PN_F:=res;
End; End;
c) Mode de passage des paramètres
Le passage de paramètres fournit des valeurs à un sous-programme lors de son appel (cf.
exemples ci-dessus). Ce passage de paramètres peut s’effectuer :
en faisant une copie des valeurs à passer (passage par valeur), ce qui permet de modi-
fier les copies locales sans influencer la valeur initiale (paramètres en entrée) ;
en fournissant l’adresse des valeurs (passage par adresse ou par référence), ce qui
permet de modifier la valeur initiale (paramètres en sortie ou en entrée/sortie).
Dans les exemples ci-dessus, les paramètres sont passés par valeur.
Const N=25;
Var i: integer;
res: real;
Begin
res:=1;
For i:=1 to N do res:=res*nombre;
nombre:=res;
End;
NB : Un appel de procédure du type PN_P2(n); aura le même effet qu’un appel de fonction
du type n:=PN_F(n);.
Une variable globale est utilisable par tous les sous-programmes du programme. Une varia-
ble locale n’est utilisable que dans le sous-programme où elle est déclarée.
Les procédures et les fonctions sont soumises aux mêmes règles que les variables.
7. Les unités
Une unité est un fichier séparé pouvant contenir des constantes, des types, des variables et des
sous-programmes disponibles pour la construction d’autres applications. L’utilisation des uni-
tés permet de partager des données et des sous-programmes entre plusieurs applications.
a) Squelette d’une unité
Unit Nom_unite;
Interface
{Déclarations publiques}
Implementation
{Déclarations privées}
{Corps des procédures et des fonctions}
Initialization
{Code d’initialisation}
End.
En-tête
C’est le nom de l’unité (8 caractères maxi). Il figure dans la partie uses d’un programme ou
d’une unité qui utilise l’unité.
NB : Éviter les références croisées entre unités (ex. l’unité A inclut l’unité B et vice-versa).
Interface
Tout ce qui est placé ici est visible pour toute entité utilisant l’unité.
Implémentation
Cette partie définit les procédures et les fonctions déclarées dans la partie interface. On peut
également y définir des types, constantes, variables et sous programmes locaux.
Initialisation
Cette partie permet d’initialiser les variables de l’unité si besoin est et d’effectuer des traite-
ments avant de redonner la main au programme principal.
c) Exemple d’unité
Unit stats;
Interface
Const N=100000;
Type echantillon = array[1..N] of real;
Function moyenne(ech: echantillon): real;
Implementation
Function moyenne; {Pas besoin de répéter les paramètres}
Var i: integer;
s: real;
Begin
s:=0;
for i:=1 to N do s:=s+ech[i];
moyenne:=s/N;
End ;
End.
Programme appelant :
Program Calcul_Moyenne;
Uses stats;
Begin
For i:=1 to N do
readln(ech[i]);
{Je ne voudrais pas être l’opérateur de saisie !}
moy:=moyenne(ech);
Writeln(moy);
End.
a) Objectifs
Lier les données et les fonctions qui les manipulent afin d’éviter des accès aux don-
nées par des fonctions non autorisées.
Obtenir une meilleure abstraction en cachant l’implémentation des techniques utilisées
et en ne rendant visible que des points d’entrée. Ainsi, si l’implémentation change, le
code utilisateur n’est pas affecté.
Réutiliser l’existant dans un souci de productivité.
Traiter les erreurs localement au niveau des objets sans que cela ne perturbe les autres
parties du programme.
Faciliter la maintenance.
b) Concepts
Objet
En langage objet, tout est objet ! Un objet contient des données dites données membres ou
attributs de l’objet et des procédures ou fonctions dites méthodes de l’objet.
Ex. Type Personne = class
End;
Attributs
Méthodes
Les méthodes sont des procédures et des fonctions définies pour une classe. Elles ont un
accès complet à tous les attributs de la classe. Il est recommandé de ne pas laisser un
utilisateur de la classe manipuler directement ses attributs, mais d’utiliser une méthode pour
cela.
Le corps des méthodes est défini à l’extérieur de la classe. Le nom de chaque méthode doit
donc être préfixé du nom de la classe à laquelle il appartient.
Si une classe est utilisée par quelqu’un d’autre que son auteur, rien n’empêche ce dernier
d’accéder directement à un attribut de la classe, ce qui la fragilise. En effet, si la méthode as-
sociée à l’attribut en question effectue des tests avant de modifier sa valeur (ex. vérification
qu’une date de naissance est inférieure à la date du jour), ne pas l’utiliser peut provoquer des
erreurs ultérieurement.
Pour se prémunir contre des accès non désirés, il est possible d’associer un niveau de visibilité
auxProtection
attributs et aux méthodes d’une classe. Description
Private Attributs ou méthodes accessibles uniquement par les méthodes de la classe
Protected Attributs ou méthodes accessibles uniquement par les méthodes de la classe
et de ses sous-classes
Public Attributs ou méthodes accessibles par toute procédure, même externe
e) L’héritage
Var p: Personne;
e: Employe;
Begin
p.etat_civil();
e.etat_civil();
p:=e; {NB : l’affectation inverse n’est pas possible}
End.
f) Le polymorphisme
Pour résoudre ce problème, il faut faire appel au polymorphisme en déclarant cette méthode
comme étant virtuelle (mot clé virtual). Le compilateur rajoute alors du code au programme
exécutable afin de pouvoir appeler dynamiquement la méthode appropriée à l’objet manipulé
(ici, un employé). De plus, il faut indiquer que la méthode etat_civil de la classe Employé
surcharge celle de la classe Personne (mot clé override).
g) Constructeurs et destructeurs
NB : Par convention, les constructeurs sont nommés Create et les destructeurs Destroy dans
les classes Delphi.
{Utilisation}
p.Init(‘Darmont’,’Jérôme’,’15/01/1972’);
p.Destroy;
III. L’EDI de Delphi
1. L’interface de Delphi
Une fiche constitue l’interface (ou une partie de l’interface) d’une application. Pour concevoir
une fiche, il suffit d’y insérer des contrôles (ressources Windows prêtes à l’emploi : boutons
de commande, listes, menus…) listés dans la palette des composants. Un clic sur le contrôle,
puis un autre sur la fiche cible suffisent (un double clic insère le composant au milieu de la
fiche active). La palette des composants réunit plusieurs volets. Les principaux sont listés ci-
dessous.
Composants standards
Composants supplémentaires
b) L’inspecteur d’objets
Cet outil est dédié à la gestion des composants. La fenêtre de l’inspecteur contient deux vo-
lets :
la liste des propriétés (attributs) du composant courant,
la liste des événements associés au composant courant.
Propriétés
Les noms des propriétés sont placés dans la colonne de gauche (dans
l’ordre alphabétique) et les valeurs sur la ligne correspondante à droite.
Les propriétés dont le nom est précédé d’un + ont plusieurs niveaux
imbriqués (ex. Font). Lorsqu’une propriété de ce type est « déroulée »,
le signe – apparaît à la place du signe +.
Pour donner une valeur à une propriété, le plus simple est de remplacer
sa valeur par défaut par une nouvelle valeur dans la boîte d’édition pré-
vue à cet effet.
Sur un double clic sur une de ces boîtes, l’éditeur de code s’ouvre et le
curseur se positionne à l’intérieur du gestionnaire d’événements (une
procédure).
c) L’éditeur de code
Les fichiers de code source composant un projet sont rassemblés dans l’éditeur de code. À
chaque fiche est associée une unité identifiée par un onglet situé en haut de la fenêtre de
l’éditeur. L’éditeur permet de modifier le code Pascal de ces unités.
d) Les menus
2. Projets et programmes
L’ensemble des éléments d’un programme exécutable ou d’une librairie DLL (Dynamic Link
Library) se contrôle à partir d’un projet. Concrètement, un projet est un fichier binaire
d’extension .dpr contenant des liens vers tous les éléments du projet (fiches, unités, etc.), eux-
mêmes stockés dans des fichiers séparés. Pour gérer ces fichiers, Delphi met à la disposition
des utilisateurs un outil : le gestionnaire de projets.
a) Le gestionnaire de projets
Le gestionnaire de projets se présente comme une fenêtre composée de trois colonnes et d’une
barre d’outils.
b) Le fichier de projet
Il n’existe qu’un seul fichier .dpr par application. Par défaut, il contient le code suivant.
Program Project1;
Uses Forms,
Unit1 in
‘UNIT1.PAS’;
{Form1}
{$R *.RES}
Begin
Application.CreateForm(TForm1, Form1);
Application.Run(Form1);
End.
Delphi génère automatiquement le code correspondant à de nouvelles fiches ou de nouvelles
unités. Il est déconseillé d’intervenir manuellement sur le fichier de projet.
Delphi permet le paramétrage d’un projet grâce à la boîte de dialogue « Options de projet »
(menu Projet/Options).
Fiches : sélection de la fiche principale de l’application (celle qui est ouverte au dé-
marrage du programme)…
Application : choix d’un titre pour le programme, association avec une icône…
Compilateur : options de compilation (étonnant, non ?)
Lieur : options d’édition des liens
Répertoires/Conditions : chemins sur le disque, alias…
InfoVersion : gestion des versions du projet
Paquets : inclusion de composants externes
3. Experts et modèles
Nouveau
Fiches
Dialogues
Modèles d’application :
• Application Logo Win95 : modèle le
plus simple avec uniquement une
boîte
« à propos »
• Application MDI (Multiple Document
Interface)
• Application SDI (Single Document
Interface), application standard
La bibliothèque d’objets de Delphi est constituée d’une hiérarchie de classes Pascal dont le
sommet est Object. Tous les composants et contrôles sont des objets dérivés de cette classe.
Une (petite) partie de cette hiérarchie est présentée ci-dessous.
Object
Persistent
Com ponent
Bevel I m age L abel S hape Button Check Box Edit List Box Memo RadioButton
a) Objets Delphi
b) Composants et contrôles
Composants
Ce sont des objets descendant de la classe Component, éléments fondamentaux à partir des-
quels sont construites les applications.
Les contrôles représentent l’ensemble des composants visuels manipulables grâce à la palette
des composants. La cohésion des contrôles est basée sur la dérivation de la classe Control.
Les contrôles se subdivisent en deux groupes :
les contrôles fenêtrés, héritiers de la classe WinControl, qui sont capable de recevoir le
focus de l’application, disposent d’un descripteur de fenêtre ou handle Windows et
peuvent contenir d’autres contrôles (ex. boutons de commande, cases à cocher, boîtes
de liste, boîtes d’édition…) ;
les contrôles graphiques, héritiers de la classe GraphicControl, qui ne possèdent pas
de descripteur de fenêtre, ne peuvent pas recevoir le focus de l’application et ne peu-
vent pas contenir d’autre contrôle (ex. cadres biseautés, images, étiquettes, formes
géométriques…).
2. Le scruteur
Le scruteur est un outil visuel servant à examiner la hiérarchie des objets d’une application (y
compris ceux de la bibliothèque). Il s’ouvre par le menu Voir/Scruteur une fois le programme
compilé.
La partie gauche de la fenêtre (volet Inspecteur) présente l’arborescence des objets. La partie
droite (volet Détails) est un classeur possédant trois onglets :
portée des symboles : déclarations et éléments accessibles au niveau hiérarchique de
l’objet sélectionné dans l’inspecteur (méthodes, fonctions, procédures, types…) ;
héritage : situation de l’objet dans l’arbre hiérarchique ;
références : localisation des occurrences des symboles dans l’application (chemin
complet de l’unité + numéro de ligne).
Les informations fournies dans le volet Détails peuvent être filtrées à l’aide des icônes de
couleur placées en haut de la fenêtre. Dans l’ordre, ces filtres sont :
constantes,
fonctions/procédures,
types,
variables,
propriétés,
attributs hérités,
attributs virtuels,
attributs privés,
attributs protégés,
attributs publics,
attributs publiés.
La propriété Parent appartient à tous les contrôles fenêtrés (WinControl) et contient la réfé-
rence du contrôle parent (celui qui le contient). Symétriquement, tous les contrôles contenus
dans un objet fenêtré sont ses enfants. Le cas le plus simple et le plus fréquent d’inclusion de
ce type est celui d’une boîte de groupe (contrôle parent) contenant des boutons radio (contrô-
les enfants).
La propriété Controls est un tableau d’objets Control représentant les enfants d’un objet. La
propriété ControlCount indique le nombre d’enfants. Controls est indexé de 0 à Control-
Count–1.
Le propriétaire d’un objet possède cet objet dans sa liste d’attributs, que cet objet soit un
contrôle ou non. Des boutons radios groupés dans une boîte ont cette boîte comme parent,
mais appartiennent à la fiche sur laquelle ils sont dessinés. La relation de propriété concerne
la structure des objets et non leur imbrication au niveau de l’interface.
La propriété Owner permet de connaître le propriétaire d’un objet. Inversement, la propriété
Components contient la liste des composants déclarés comme attributs. C’est un tableau
d’objets Component. La propriété ComponentCount indique le nombre de composants. Com-
ponents est indexé de 0 à ComponentCount–1.
V. Connexion aux bases de données
Delphi propose en standard des composants pour manipuler des bases de données et des tables
relationnelles. Tous ces composants ont une base commune : le Borland Database Engine
(BDE), un noyau stable, complet et puissant.
Les composants sources permettent d’accéder à des bases de données. Ils sont accessibles
dans l’onglet AccèsBD de la palette des composants.
NB : Ces composants sont « invisibles », i.e., non visuels. Ils apparaissent sur une fiche en
mode création mais pas à l’exécution du programme.
a) Table
Le composant Table permet d’accéder aux données contenues dans une table relationnelle.
Propriétés principales
Propriété Description
Active Ouvre ou ferme la table
DataBaseName Nom de la base de données contenant la table
Exclusive Empêche d’autres utilisateurs d’ouvrir la table si positionnée à true
MasterFields Attributs de la table (détail) liés à une table maître
MasterSource Source de données d’une table maître
ReadOnly Autorise ou non l’utilisateur à modifier la table
TableName Nom de la table
b) Query
Le composant Query (requête) permet d’effectuer une sélection sur une base de données. Il est
identique au composant Table, mis à part la provenance des données.
Propriétés principales
Propriété Description
Active Exécute ou non la requête
DataBaseName Nom de la base de données interrogée
DataSource Origine des valeurs à fournir aux paramètres de la requête
Params Paramètres de la requête
SQL Libellé de la requête SQL
c) DataSource
Le composant DataSource sert à visualiser les enregistrements d’une table ou d’une requête
dans des composants visuels de Delphi. Tous ces composants BD visuels utilisent un compo-
sant DataSource comme source de données.
Propriété principale
Propriété Description
DataSet Indique le composant (Table ou Query) source des données
a) Composants BD visuels
Une fiche Delphi sur laquelle apparaissent des données issues d’une base de données est
conçue à partir de composants similaires aux composants classiques, les composants BD vi-
suels, réunis dans l’onglet ContrôleBD de la palette des composants.
Composants BD principaux
b) Formulaires simples
La façon la plus simple de naviguer dans les données est d’utiliser le composant navigateur
BD (DBNavigator). C’est un composant graphique représentant des boutons type magnéto-
cassette qui permettent de passer d’un enregistrement à l’autre, de sauter en fin de table, etc.
Pour utiliser un navigateur BD, il suffit de l’ajouter à la fiche contenant les données et de don-
ner une valeur à sa propriété DataSource.
Il est possible de visualiser plus d’un enregistrement à la fois à l’aide du composant universel
grille BD (DBGrid), qui permet d’obtenir une vue des données sous forme tabulaire. Ce com-
posant s’adapte à la structure de la table référencée afin d’en montrer tous les champs.
Pour construire un formulaire basé sur une grille, il suffit de reprendre les étapes 1 et 2 du b),
puis d’ajouter un composant grille et de donner une valeur à sa propriété DataSource.
e) Formulaires composés
Les formulaires composés permettent de visualiser des associations 1, N entre deux tables. La
démarche de construction d’un tel formulaire est la suivante.
1. Placer deux composants Table et deux composants DataSource sur la fiche (cf. étapes
1 et 2 du b)). L’une des tables sera la table maître (côté « 1 » de la relation 1, N) et
l’autre la table détail (côté « N » de la relation 1, N).
2. Sélectionner la table détail.
Indiquer dans sa propriété MasterSource le composant DataSource associé à la table
maître.
Éditer la propriété MasterFields pour effectuer le lien entre les tables (apparition
d’une boîte de dialogue). Cliquer dans les parties champ détail et champ maître sur-le-
champ permettant de faire la jointure entre les deux tables, ajouter les champs joints
(bouton ajouter) et valider.
3. Afficher les informations des deux tables à l’aide des composants BD visuels.
L’expert fiche BD est accessible par le menu Base de données/Expert fiche… Il permet de
dessiner facilement, grâce à une série de boîtes de dialogues, des formulaires simples ou com-
posés.
3. Requêtes SQL
Le propos de cette section n’est pas de présenter le langage SQL, mais d’indiquer comment
formuler et exécuter une requête SQL avec Delphi.
La démarche est la même que pour créer un formulaire simple basé sur une table. Il suffit de
remplacer le composant Table par un composant Query et de renseigner la propriété SQL.
b) Requête paramétrée
Soit la requête SQL suivante : SELECT * FROM CLIENT WHERE VILLE = ‘Paris’.
Pour accéder aux habitants de Lyon, une autre requête similaire est nécessaire. Et ainsi de
suite pour toutes les autres villes. Pour remédier à ce problème, Delphi permet l’insertion de
paramètres dans le texte de la requête.
Version paramétrée de la requête initiale : SELECT * FROM CLIENT WHERE VILLE = :ville.
4. Transfert de données
Lorsque Delphi effectue une requête, il utilise une table virtuelle (en mémoire) pour stocker le
résultat. Pour conserver ce résultat sur disque, il faut créer une table réponse et y recopier les
données de la table virtuelle. Pour ce faire, il faut disposer sur une fiche les composants sui-
vants :
un composant Query pour effectuer une requête ;
un composant Table pour désigner la table physique (sur disque) à créer ;
un composant BatchMove (onglet AccèsBD de la palette des composants) pour effec-
tuer le transfert.
Pour transférer des enregistrements d’une table à une autre, il suffit de calquer l’opération
précédente en remplaçant le composant requête par un composant table.
a) Opérations de base
Classe DataSet
Les composants Table et Query héritent indirectement de la classe DataSet, qui permet de
représenter un ensemble de données.
Enregistrement courant
Lorsqu’un DataSet est ouvert, un certain nombre d’enregistrements sont lus sur disque et pla-
cés dans un tampon mémoire. Cependant, un seul enregistrement est considéré comme
l’enregistrement courant. La lecture d’un champ ou la suppression d’un enregistrement se font
toujours par rapport à l’enregistrement courant
Tampon mémoire
Enregistrement
courant
L’accès au contenu d’un champ se fait par la propriété Fields du DataSet, qui est un tableau
de champs. L’accès à la valeur d’un champ peut se faire par sa position dans le tableau ou par
le nom de ce champ, grâce à la méthode FieldByName. Puisqu’un champ peut être de nature
très variée, son contenu est stocké en mémoire sous forme physique. Lorsque cette donnée est
manipulée, elle doit l’être sous forme logique. Par conséquent, il faut indiquer dans quel for-
mat logique on désire accéder à la donnée.
Ex. var a: integer;
Begin
a:=Table1.Fields[0].asInteger;
a:=Table1.FieldByName(‘Numero’).asInteger;
{ Conversion physique-logique :
asBoolean
asFloat
asInteger
asString
Par défaut, le DataSet est en mode édition, c’est-à-dire que ses données peuvent être modi-
fiées via des contrôles. Pour empêcher cela, il faut passer la propriété AutoEdit du composant
DataSource à false. Pour passer le DataSet en mode édition, il faut appeler sa méthode Edit.
Ex. Table1.Edit;
Ajout/insertion d’enregistrements
Ex. Table1.Insert;
Table1.FieldByName(‘Numero
’).asInteger:=100;
Table1.Append;
Table1.FieldByName(‘Numero’).asInteger:=500;
Ex. Table1.Refresh;
b) Navigation dans la base de données
Ex. Table1.First;
Table1.Next;
Table1.Next;
Ex. Table1.First;
While not Table1.EOF do
Begin
Writeln(Table1.FieldByName(‘Numero’).asInteger);
Table1.Next;
End;
c) Requêtes SQL
Requête simple
La propriété SQL d’un composants Query est de type Strings, c’est-à-dire un tableau de chaî-
nes de caractères. Il est donc possible de modifier cette propriété en utilisant les méthodes du
type Strings et ainsi de créer dynamiquement une requête.
Ex. Query1.Database:=’DBDEMOS’;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(‘select * from clients’);
Query1.SQL.Open;
Requête paramétrée
Ex. Query1.Close;
Query1.Params[0].asString:=’Lyon’;
Query1.Open;
d) Recherche d’enregistrements
SetKey positionne le DataSet en mode recherche. La propriété Fields permet alors de fournir
les critères de recherche pour chaque champ indexé. Puis, il suffit d’appeler la méthode Go-
toKey pour activer la recherche. Si aucune correspondance n’est trouvée, GotoKey renvoie
false.
FindKey permet la même opération en une instruction, en précisant le ou les critères de sélec-
tion dans un tableau ouvert.
Ex. Table1.SetRangeStart;
Table1.FieldByName(‘Numero’).asInteger:=50;
Table1.SetRangeEnd;
Table1.FieldByName(‘Numero’).asInteger:=100;
Table1.ApplyRange;
ou Table1.SetRange([100],[300]);
Marqueurs
Les marqueurs sont des objets de type TBookMark. Ils permettent de conserver un pointeur
sur un enregistrement pour pouvoir y revenir rapidement par la suite.
Méthode du DataSet Description
FreeBookMark Détruit un marqueur
GetBookmark Pose un marqueur
GotoBookMark Va au marqueur