You are on page 1of 1280

Guide du dveloppeur

Borland

Delphi 6
pour Windows

Reportez-vous au document DEPLOY situ dans le rpertoire racine de votre produit Delphi 6 pour obtenir la liste complte des fichiers que vous pouvez distribuer en accord avec les termes du contrat de licence. Les applications mentionnes dans ce manuel sont brevetes ou en attente de brevet. Ce document ne donne aucun droit sur ces brevets. COPYRIGHT 1983, 2001 Borland Software Corporation. Tous droits rservs. Tous les produits Borland sont des marques commerciales ou des marques dposes de Borland Software Corporation. Tous les autres noms de produits sont des marques dposes de leurs fabricants respectifs. Imprim en Irlande HDE1350WW21001 1E0R0501 0102030405-9 8 7 6 5 4 3 2 1 D3

Table des matires


Chapitre 1

Introduction

1-1

Contenu de ce manuel . . . . . . . . . . . . . . 1-1 Conventions typographiques. . . . . . . . . . . 1-3 Support technique . . . . . . . . . . . . . . . . . 1-3

Partie I

Programmation Delphi
Chapitre 2

Dveloppement dapplications avec Delphi


Environnement de dveloppement Conception dapplications . . . . . Dveloppement dapplications. . . Cration des projets . . . . . . . Edition du code . . . . . . . . . Compilation des applications. . Dbogage des applications . . . Dploiement des applications . intgr. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-1
2-1 2-2 2-3 2-3 2-4 2-5 2-5 2-6

Chapitre 3

Utilisation des bibliothques de composants

3-1

Prsentation des bibliothques de composants 3-1 Proprits, mthodes et vnements . . . . 3-2 Proprits . . . . . . . . . . . . . . . . . . 3-3 Mthodes . . . . . . . . . . . . . . . . . . 3-3 Evnements . . . . . . . . . . . . . . . . . 3-3 Evnements utilisateur. . . . . . . . . . . 3-4 Evnements systme . . . . . . . . . . . . 3-4 Pascal Objet et les bibliothques de classes . . 3-4 Utilisation du modle objet . . . . . . . . . . 3-5 Quest-ce quun objet ?. . . . . . . . . . . 3-5 Examen dun objet Delphi. . . . . . . . . 3-6 Modification du nom dun composant . 3-8 Hritage des donnes et du code dun objet . . . . . . . . . . . . . . . . . . . 3-9 Porte et qualificateurs . . . . . . . . . . . . 3-9 Dclarations prives, protges, publiques et publies. . . . . . . . . . . 3-10 Utilisation de variables objet . . . . . . . . . 3-11 Cration, instanciation et destruction dobjets. . . . . . . . . . . . . . . . . . . . . 3-12

Composants et appartenance . . . . . . . . 3-13 Objets, composants et contrles . . . . . . . . 3-13 Branche TObject . . . . . . . . . . . . . . . . 3-15 Branche TPersistent . . . . . . . . . . . . . . 3-16 Branche TComponent. . . . . . . . . . . . . 3-16 Branche TControl . . . . . . . . . . . . . . . 3-18 Branche TWinControl/TWidgetControl . . 3-19 Proprits communes TControl . . . . . . 3-20 Proprits daction. . . . . . . . . . . . . 3-20 Proprits de position, de taille et dalignement. . . . . . . . . . . . . . 3-20 Proprits daffichage . . . . . . . . . . . 3-21 Proprits du parent . . . . . . . . . . . 3-21 Une proprit de navigation . . . . . . . 3-21 Proprits de glisser-dplacer . . . . . . 3-21 Proprits de glisser-ancrer (VCL seulement) . . . . . . . . . . . . . 3-22 Evnements standard communs TControl . . . . . . . . . . . . . . . . . . 3-22 Proprits communes TWinControl et TWidgetControl. . . . . . . . . . . . . . 3-23 Proprits dinformations gnrales. . . 3-23 Proprits daffichage du style de bordure . . . . . . . . . . . . . . . . 3-24 Proprits de navigation . . . . . . . . . 3-24 Proprits de glisser-ancrer (VCL seulement) . . . . . . . . . . . . . 3-24 Evnements communs TWinControl et TWidgetControl. . . . . . . . . . . . . . 3-25 Cration de linterface utilisateur de lapplication . . . . . . . . . . . . . . . 3-25 Utilisation de composants Delphi. . . . . . 3-26 Initialisation des proprits dun composant . . . . . . . . . . . . . . . 3-27 Utilisation de linspecteur dobjets . . . 3-27 Utilisation des diteurs de proprit . . 3-27 Initialisation des proprits lexcution . . . . . . . . . . . . . . . 3-28 Appel de mthodes . . . . . . . . . . . . . . 3-28 Utilisation des vnements et des gestionnaires dvnements . . . . 3-28 Gnration dun nouveau gestionnaire dvnement . . . . . . . . . . . . . . . 3-28 Gnration du gestionnaire de lvnement par dfaut dun composant. . . . . . . 3-29

Recherche de gestionnaires dvnements . . . . . . . . . . . . . Association dun vnement un gestionnaire dvnement existant . Association dvnements de menu des gestionnaires dvnements . Suppression de gestionnaires dvnements . . . . . . . . . . . . . Composants VCL et CLX . . . . . . . . . . . Ajout de composants personnaliss la palette de composants . . . . . . . Contrles texte . . . . . . . . . . . . . . . Proprits des contrles texte . . . . . Proprits communes aux contrles mmo et de texte format . . . . . . Contrles de texte format (VCL seulement) . . . . . . . . . . . Contrles de saisies spcialises . . . . . Barres de dfilement . . . . . . . . . . Barres gradues . . . . . . . . . . . . . Contrles flches haut-bas (VCL seulement) . . . . . . . . . . . Contrles incrmenteur (CLX seulement) . . . . . . . . . . . Contrles touche daccs rapide (VCL seulement) . . . . . . . . . . . Contrles sparateur . . . . . . . . . . Boutons et contrles similaires . . . . . . Contrles bouton . . . . . . . . . . . . Boutons bitmap . . . . . . . . . . . . . Turboboutons . . . . . . . . . . . . . . Cases cocher . . . . . . . . . . . . . Boutons radio . . . . . . . . . . . . . . Barres doutils . . . . . . . . . . . . . . Barres multiples (VCL seulement) . . Gestion de listes . . . . . . . . . . . . . . Botes liste et botes liste de cases cocher . . . . . . . . . . . . . . . . Botes options . . . . . . . . . . . . . Vues arborescentes . . . . . . . . . . . Vues liste. . . . . . . . . . . . . . . . . Slecteurs Date/Heure et calendriers mensuels (VCL seulement) . . . . . Regroupement de composants . . . . . . Botes groupe et groupes de boutons radio . . . . . . . . . . . . . . . . . . Volets . . . . . . . . . . . . . . . . . . . Botes de dfilement . . . . . . . . . . Contrles onglets . . . . . . . . . . . .

. . 3-29 . . 3-29 . . 3-31 . . 3-31 . . 3-32 . . 3-34 . . 3-34 . . 3-35 . . 3-35 . . . . . 3-36 . 3-36 . 3-36 . 3-36

. . 3-37 . . 3-37 . . . . . . . . . . . . . . . . 3-37 . 3-38 . 3-38 . 3-38 . 3-39 . 3-39 . 3-40 . 3-40 . 3-40 . 3-41 . 3-41 . 3-41 . 3-42 . 3-43 . 3-43

Contrles pages . . . . . . . . . . . . . Contrles en-ttes . . . . . . . . . . . . Rtroaction visuelle . . . . . . . . . . . . . Libells et composants texte statique . Barres dtat . . . . . . . . . . . . . . . Barres de progression . . . . . . . . . . Proprits daide ou de conseil daide Grilles . . . . . . . . . . . . . . . . . . . . . Grilles de dessin . . . . . . . . . . . . . Grilles de chanes . . . . . . . . . . . . Editeur de liste de valeurs (VCL seulement). . . . . . . . . . . . . . Affichage des graphiques . . . . . . . . . Images. . . . . . . . . . . . . . . . . . . Formes . . . . . . . . . . . . . . . . . . Biseaux . . . . . . . . . . . . . . . . . . Botes peindre . . . . . . . . . . . . . Contrles animation (VCL seulement) Dveloppement de botes de dialogue . . Utilisation des botes de dialogue douverture . . . . . . . . . . . . . . . Emploi dobjets utilitaires . . . . . . . . . . . Utilisation des listes . . . . . . . . . . . . Utilisation des listes de chanes . . . . . . Lecture et enregistrement des listes de chanes . . . . . . . . . . Cration dune nouvelle liste de chanes. . . . . . . . . . . . . . . . Manipulation des chanes dune liste . Association dobjets une liste de chanes. . . . . . . . . . . . . . . . Registre Windows et fichiers .INI (VCL seulement). . . . . . . . . . . . . . Utilisation de TIniFile (VCL seulement) . . . . . . . . . . . . Utilisation de TRegistry. . . . . . . . . Utilisation de TRegIniFile . . . . . . . Cration despaces de dessin . . . . . . . Impression . . . . . . . . . . . . . . . . . . Utilisation des flux . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

3-46 3-46 3-46 3-47 3-47 3-48 3-48 3-48 3-48 3-49 3-49 3-50 3-50 3-51 3-51 3-51 3-51 3-52 3-52 3-53 3-53 3-54

. 3-54 . 3-55 . 3-57 . 3-59 . 3-59 . . . . . . 3-60 3-60 3-60 3-61 3-61 3-62

Chapitre 4

. . 3-44 . . 3-44 . . . . . 3-44 . 3-45 . 3-45 . 3-46

Sujets de programmation gnraux


Comprhension des classes . . . Dfinition des classes . . . . . . Gestion des exceptions . . . . . . Protection des blocs de code. Rponse aux exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4-1
. 4-1 . 4-3 . 4-5 . 4-5 . 4-5

ii

Exceptions et contrle dexcution . . . . 4-6 Rponses des exceptions imbriques . 4-7 Protection de lallocation de ressources . . . 4-7 Quelles ressources doivent tre protges ? . . . . . . . . . . . . . . . . . 4-8 Cration dun bloc de protection de ressource . . . . . . . . . . . . . . . . 4-8 Gestion des exceptions RTL . . . . . . . . . 4-9 Quest-ce quune exception RTL ? . . . . 4-10 Cration dun gestionnaire dexception . 4-11 Instructions de gestion des exceptions. . 4-11 Utilisation de linstance dexception . . . 4-12 Porte des gestionnaires dexceptions . . 4-13 Spcification du gestionnaire dexception par dfaut . . . . . . . . . . . . . . . . . 4-13 Gestion des classes dexceptions . . . . . 4-14 Redclenchement de lexception . . . . . 4-14 Gestion des exceptions des composants . . 4-15 Gestion des exceptions et sources externes . . . . . . . . . . . . . . . . . . . . 4-16 Exceptions silencieuses . . . . . . . . . . . . 4-17 Dfinition dexceptions personnalises . . . 4-17 Dclaration dun type objet exception . . 4-18 Dclenchement dune exception . . . . . 4-18 Utilisation des interfaces . . . . . . . . . . . . . 4-19 Interfaces en tant que caractristiques du langage . . . . . . . . . . . . . . . . . . 4-19 Implmentation des interfaces au travers de la hirarchie. . . . . . . . . . 4-20 Utilisation dinterfaces avec des procdures . . . . . . . . . . . 4-21 Implmentation de IInterface. . . . . . . . . 4-22 TInterfacedObject . . . . . . . . . . . . . . . 4-22 Utilisation de loprateur as . . . . . . . . . 4-23 Rutilisation de code et dlgation . . . . . 4-24 Utilisation de implements pour la dlgation . . . . . . . . . . . . 4-24 Agrgation. . . . . . . . . . . . . . . . . . 4-25 Gestion mmoire des objets interface . . . . 4-26 Utilisation du comptage de rfrences. . 4-26 Situations o il ne faut pas utiliser le comptage de rfrences . . . . . . . . 4-27 Utilisation des interfaces dans les applications distribues (VCL seulement) 4-28 Dfinition de variants personnaliss . . . . . . 4-29 Stockage des donnes dun type Variant personnalis . . . . . . . . . . . . . . . . . . 4-30 Cration dune classe pour le type variant personnalis . . . . . . . . . . . . . . . . . . 4-31

Transtypage. . . . . . . . . . . . . . . . . Implmentation doprations binaires . Implmentation doprations de comparaison . . . . . . . . . . . . . Implmentation doprations unaires . . Copie et effacement des variants personnaliss . . . . . . . . . . . . . . . Chargement et enregistrement des valeurs des variants personnaliss . . Utilisation du descendant de TCustomVariantType . . . . . . . . Ecriture dutilitaires fonctionnant avec un type variant personnalis . . . . Support des proprits et des mthodes dans les variants personnaliss . . . . . . Utilisation de TInvokeableVariantType . Utilisation de TPublishableVariantType Utilisation des chanes . . . . . . . . . . . . . . Types caractre . . . . . . . . . . . . . . . . Types chane . . . . . . . . . . . . . . . . . . Chanes courtes . . . . . . . . . . . . . . Chanes longues . . . . . . . . . . . . . . Chanes tendues . . . . . . . . . . . . . Types PChar . . . . . . . . . . . . . . . . Chanes ouvertes. . . . . . . . . . . . . . Routines de la bibliothque dexcution manipulant des chanes. . . . . . . . . . . Routines manipulant les caractres tendus . . . . . . . . . . . . . . . . . . Routines usuelles de manipulation des chanes longues . . . . . . . . . . . Dclaration et initialisation de chanes . . . Mlange et conversion de types chane . . Conversions de chanes en PChar . . . . . Dpendances de chane . . . . . . . . . . Renvoi dune variable locale PChar. . . Transfert dune variable locale comme PChar . . . . . . . . . . . . . . Directives de compilation portant sur les chanes . . . . . . . . . . . . . . . . Chanes et caractres : sujets apparents. . Utilisation des fichiers . . . . . . . . . . . . . . Manipulation de fichiers . . . . . . . . . . . Suppression dun fichier . . . . . . . . . Recherche dun fichier . . . . . . . . . . Modification dun nom de fichier . . . . Routines date-heure de fichier . . . . . . Copie dun fichier . . . . . . . . . . . . . Types fichier et E/S de fichier. . . . . . . .

4-31 4-33 4-35 4-36 4-37 4-38 4-39 4-39 4-40 4-41 4-42 4-42 4-43 4-43 4-44 4-45 4-45 4-46 4-46 4-46 4-47 4-47 4-50 4-51 4-52 4-52 4-52 4-53 4-54 4-55 4-55 4-55 4-56 4-56 4-58 4-58 4-58 4-59

iii

Utilisation des flux fichier . . . . . . . . . Cration et ouverture de fichiers . . . . Utilisation du handle de fichier . . . . Lecture et criture de fichiers . . . . . . Lecture et criture de chanes . . . . . . Dplacements dans un fichier . . . . . Position et taille de fichier. . . . . . . . Copie . . . . . . . . . . . . . . . . . . . . Conversion de mesures . . . . . . . . . . . . . Excution des conversions . . . . . . . . . Excution des conversions simples. . . Excution des conversions complexes . Ajout de nouveaux types de mesure . . . Cration dune famille de conversion simple et ajout dunits . . . . . . . . Utilisation dune fonction de conversion . . . . . . . . . . . . . . Utilisation dune classe pour grer les conversions . . . . . . . . . . . . . Dfinition des types de donnes. . . . . . . .

. 4-60 . 4-60 . 4-61 . 4-61 . 4-62 . 4-63 . 4-63 . 4-64 . 4-64 . 4-64 . 4-64 . 4-65 . 4-65 . 4-65 . 4-67 . 4-68 . 4-71

Chapitre 5

Cration dapplications, de composants et de bibliothques 5-1


Cration dapplications . . . . . . . . . . . . . Applications dinterface utilisateur graphique . . . . . . . . . . . . . . . . . . Modles dinterfaces utilisateur . . . . Applications SDI . . . . . . . . . . . . . Applications MDI. . . . . . . . . . . . . Dfinition des options de lEDI, du projet et de la compilation. . . . . . . Modles de programmation . . . . . . . . Applications console . . . . . . . . . . . . . Applications service . . . . . . . . . . . . . Threads de service . . . . . . . . . . . . Proprits de nom dun service . . . . Dbogage des services . . . . . . . . . . Cration de paquets et de DLL . . . . . . . . Utilisation des paquets et des DLL . . . . Ecriture dapplications de bases de donnes. Distribution dapplications de bases de donnes . . . . . . . . . . . . . . . . . Cration dapplications serveur Web . . . . . Utilisation de lagent Web . . . . . . . . . Cration dapplications WebSnap . . . . . Utilisation dInternetExpress . . . . . . . . Cration dapplications services Web . . . Ecriture dapplications en utilisant COM . . Utilisation de COM et de DCOM . . . . . . 5-1 . . . . 5-1 5-2 5-2 5-2

. 5-3 . 5-3 . 5-4 . 5-4 . 5-6 . 5-8 . 5-9 . 5-10 . 5-10 . 5-11 . 5-12 . 5-12 . 5-13 . 5-14 . 5-14 . 5-15 . 5-15 . 5-16 iv

Utilisation de MTS et de COM+ . . . . . . 5-16 Utilisation de modules de donnes . . . . . . 5-16 Cration et modification de modules de donnes standard . . . . . . . . . . . . 5-17 Nom dun module de donnes et de son fichier unit . . . . . . . . . . 5-18 Placer et nommer les composants . . . . 5-19 Utilisation des proprits et vnements des composants dans un module de donnes . . . . . . . . . . . . . . . . 5-20 Cration de rgles de gestion dans un module de donnes . . . . . . 5-20 Accs un module de donnes depuis une fiche . . . . . . . . . . . . . . . 5-21 Ajout dun module de donnes distant un projet serveur dapplication . . . . . 5-21 Utilisation du rfrentiel dobjets. . . . . . . . 5-22 Partage dlments dans un projet . . . . . 5-22 Ajout dlments au rfrentiel dobjets . . 5-22 Partage dobjets par une quipe de dveloppement. . . . . . . . . . . . . . 5-23 Utilisation dun lment du rfrentiel dobjets dans un projet . . . . . . . . . . . 5-23 Copie dun lment . . . . . . . . . . . . 5-23 Hritage dun lment . . . . . . . . . . 5-23 Utilisation dun lment . . . . . . . . . 5-24 Utilisation de modles de projet . . . . . . 5-24 Modification dlments partags. . . . . . 5-24 Spcification dun projet par dfaut, dune nouvelle fiche et de la fiche principale . . 5-25 Activation de laide dans les applications . . . 5-25 Interfaces avec les systmes daide . . . . . 5-26 Implmentation de ICustomHelpViewer. . 5-26 Communication avec le gestionnaire daide . . . . . . . . . . . . . . . . . . . . . 5-27 Demande dinformations au gestionnaire daide . . . . . . . . . . . . . . . . . . . . . 5-27 Affichage de laide sur un mot cl . . . . . 5-28 Affichage des sommaires. . . . . . . . . . . 5-29 Implmentation de IExtendedHelpViewer. 5-29 Implmentation de IHelpSelector . . . . . . 5-30 Recensement des objets du systme daide . . . . . . . . . . . . . . . . . . . . . 5-31 Recensement des visualiseurs daide . . 5-31 Recensement des slectionneurs daide. 5-31 Utilisation de laide dans une application VCL . . . . . . . . . . . . . . . . . . . . . . . . 5-31 Comment TApplication traite-il laide VCL ? . . . . . . . . . . . . . . . . . . . . . 5-32 Comment les contrles traitent-ils laide ? . 5-32

Utilisation de laide dans une application CLX . . . . . . . . . . . . . . . . . . . . . . . Comment TApplication traite-il laide CLX ?. . . . . . . . . . . . . . . . . . . . . Comment les contrles CLX traitent-ils laide ? . . . . . . . . . . . . . . . . . . . . Appel direct un systme daide . . . . . . . Utilisation de IHelpSystem . . . . . . . . . . . Personnalisation du systme daide de lEDI

. 5-32 . 5-33 . 5-33 . 5-33 . 5-34 . 5-34

Chapitre 6

Conception de linterface utilisateur des applications 6-1


Contrle du comportement de lapplication . Utilisation de la fiche principale . . . . . . Ajout de fiches . . . . . . . . . . . . . . . . Liaison de fiches . . . . . . . . . . . . . Rfrences circulaires dunits . . . . . Cacher la fiche principale . . . . . . . . . . Manipulation de lapplication . . . . . . . Gestion de lcran . . . . . . . . . . . . . . Gestion de la disposition . . . . . . . . . . Rponse aux notifications dvnement . . . Utilisation des fiches . . . . . . . . . . . . . . Contrle du stockage en mmoire des fiches . . . . . . . . . . . . . . . . . . Affichage dune fiche cre automatiquement . . . . . . . . . . . . Cration dynamique de fiche . . . . . . Cration de fiches non modales comme fentres . . . . . . . . . . . . . Utilisation dune variable locale pour crer une instance de fiche . . . Transfert de paramtres supplmentaires aux fiches . . . . . . . . . . . . . . . . . . Rcupration des donnes des fiches . . . Rcupration de donnes dans les fiches non modales. . . . . . Rcupration de donnes dans les fiches modales . . . . . . . . Rutilisation des composants et des groupes de composants . . . . . . . . . . . . . . . . . Cration et utilisation des modles de composants . . . . . . . . . . . . . . . . . Manipulation des cadres . . . . . . . . . . . . Cration des cadres . . . . . . . . . . . . . Ajout de cadres la palette de composants . . . . . . . . . . . . . . . Utilisation et modification des cadres . . . . . . . . . . . . . . 6-1 6-1 6-2 6-2 6-3 6-3 6-3 6-4 6-4 6-5 6-6

. 6-7 . 6-7 . 6-7 . 6-8 . 6-8 . 6-9 . 6-10 . 6-10 . 6-12 . 6-14 . 6-14 . 6-15 . 6-15 . 6-16 . 6-16

Partage des cadres . . . . . . . . . . . . . . Organisation des actions pour les barres doutils et les menus . . . . . . . . . . . . . . Quest-ce quune action ?. . . . . . . . . . . Dfinition des bandes daction . . . . . . . Cration des barres doutils et des menus . Ajout de couleurs, de motifs ou dimages aux menus, boutons et barres doutils . . . . . . . . . . . . . . Ajout dicnes aux menus et aux barres doutils . . . . . . . . . . . . Cration de barres doutils et de menus personnalisables par lutilisateur . . . Cacher les lments et les catgories inutiliss dans les bandes daction . . Utilisation des listes dactions. . . . . . . . . . Dfinition des listes dactions . . . . . . . . Que se passe-t-il lors du dclenchement dune action ? . . . . . . . . . . . . . . . . Rponse par les vnements . . . . . . . Comment les actions trouvent leurs cibles . . . . . . . . . . . . . . . . Actualisation des actions . . . . . . . . . . . Classes dactions prdfinies . . . . . . . . Conception de composants utilisant des actions . . . . . . . . . . . . . . . . . . Recensement dactions . . . . . . . . . . . . Cration et gestion de menus . . . . . . . . . . Ouverture du concepteur de menus . . . . Construction des menus . . . . . . . . . . . Nom des menus . . . . . . . . . . . . . . Nom des lments de menu . . . . . . . Ajout, insertion et suppression dlments de menu . . . . . . . . . . . Ajout de lignes de sparation . . . . . . Spcification de touches acclratrices et de raccourcis clavier . . . . . . . . . Cration de sous-menus . . . . . . . . . . . Cration de sous-menus par dplacement de menus existants . . . Dplacement dlments de menu . . . Ajout dimages des lments de menu. . . . . . . . . . . . . . . . . . Affichage du menu . . . . . . . . . . . . Edition des lments de menu dans linspecteur dobjets . . . . . . . . . Utilisation du menu contextuel du concepteur de menus . . . . . . . . . . Commandes du menu contextuel . . . .

6-17 6-18 6-20 6-21 6-21

6-23 6-23 6-24 6-25 6-26 6-26 6-27 6-28 6-29 6-30 6-30 6-31 6-32 6-33 6-33 6-35 6-35 6-36 6-36 6-37 6-38 6-38 6-39 6-39 6-40 6-41 6-41 6-42 6-42

Dplacement parmi les menus la conception . . . . . . . . . . . . . . 6-42 Utilisation des modles de menu . . . . . . 6-43 Enregistrement dun menu comme modle . . . . . . . . . . . . . . . . 6-44 Conventions de nom pour les lments et les gestionnaires dvnements des modles de menu . . . . . . . . . . 6-45 Manipulation dlments de menu lexcution. . . . . . . . . . . . . . . . . . 6-46 Fusion de menus . . . . . . . . . . . . . . . . 6-46 Spcification du menu actif : proprit Menu . . . . . . . . . . . . . . 6-46 Ordre des lments de menu fusionns : proprit GroupIndex . . . . . . . . . . 6-46 Importation de fichiers ressource . . . . . . 6-47 Conception de barres doutils et de barres multiples . . . . . . . . . . . . . . 6-48 Ajout dune barre doutils en utilisant un composant volet . . . . . . . . . . . . . 6-49 Ajout dun turbobouton un volet . . . 6-49 Spcification du glyphe dun turbobouton . . . . . . . . . . . . . 6-50 Dfinition de ltat initial dun turbobouton . . . . . . . . . . . . . 6-50 Cration dun groupe de turboboutons . 6-50 Utilisation de boutons bascule . . . . . . 6-51 Ajout dune barre doutils en utilisant le composant barre doutils . . . . . . . . . . 6-51 Ajout dun bouton outil . . . . . . . . . . 6-51 Affectation dimages des boutons outil . . . . . . . . . . . . 6-52 Dfinition de laspect et de ltat initial dun bouton outil . . . . . . . . . . . . . 6-52 Cration de groupes de boutons outil . . 6-53 Utilisation de boutons outil bascule . . . 6-53 Ajout dun composant barre multiple . . . . 6-53 Dfinition de laspect de la barre multiple . . . . . . . . . . . 6-54 Rponse aux clics . . . . . . . . . . . . . . . 6-54 Affectation dun menu un bouton outil . . . . . . . . . . . . . 6-55 Ajout de barres doutils masques. . . . . . 6-55 Masquage et affichage dune barre doutils . . . . . . . . . . . . . . . . . . . . . 6-55 Programmes exemple . . . . . . . . . . . . . 6-56

Chapitre 7

Manipulation des contrles


Implmentation du glisser-dplacer dans les contrles . . . . . . . . . . . . . . . . Dbut de lopration glisser-dplacer . . . Acceptation des lments dplacer . . . . Dplacement des lments . . . . . . . . . . Fin de lopration glisser-dplacer . . . . . Personnalisation du glisser-dplacer avec un objet dplacement . . . . . . . . . Changement du pointeur de la souris . . . Implmentation du glisser-ancrer dans les contrles . . . . . . . . . . . . . . . . Transformation dun contrle fentr en un site dancrage. . . . . . . . . . . . . Transformation dun contrle en un enfant ancrable . . . . . . . . . . . . Contrle de lancrage des contrles enfant Contrle du dsancrage des contrles enfant . . . . . . . . . . . . . Contrle de la rponse des contrles enfant aux oprations glisser-ancrer . . . Manipulation du texte dans les contrles . . . Dfinition de lalignement du texte. . . . . Ajout de barres de dfilement en mode excution . . . . . . . . . . . . . Ajout de lobjet Clipboard . . . . . . . . . . Slection de texte . . . . . . . . . . . . . . . Slection de la totalit dun texte . . . . . . Couper, copier et coller du texte . . . . . . Effacement du texte slectionn . . . . . . . Dsactivation des lments de menu . . . . Ajout dun menu surgissant . . . . . . . . . Gestion de lvnement OnPopup . . . . . Ajout de graphiques des contrles . . . . . . Spcification du style dessin par le propritaire . . . . . . . . . . . . . . Ajout dobjets graphiques une liste de chanes . . . . . . . . . . . . Ajout dimages une application . . . . Ajout dimages une liste de chanes . Dessiner des lments dessins par le propritaire . . . . . . . . . . . . Dimensionnement des lments dessins par le propritaire . . . . . . . . . . . . . . Dessin des lments par le propritaire . .

7-1
. 7-1 . 7-1 . 7-2 . 7-3 . 7-3 . 7-3 . 7-4 . 7-4 . 7-5 . 7-5 . 7-6 . 7-7 . 7-7 . 7-7 . 7-8 . 7-8 . 7-9 . 7-9 7-10 7-10 7-11 7-11 7-12 7-12 7-13 7-14 7-14 7-14 7-15 7-15 7-16 7-17

vi

Chapitre 8

Utilisation des graphiques et du multimdia


Prsentation de la programmation relative aux graphiques . . . . . . . . . . . . . . . . Rafrachissement de lcran. . . . . . . . Types des objets graphiques . . . . . . . Proprits et mthodes communes du canevas . . . . . . . . . . . . . . . . Utilisation des proprits de lobjet canevas . . . . . . . . . . . . . . . . . . Utilisation des crayons. . . . . . . . . Utilisation des pinceaux . . . . . . . . Lecture et dfinition de pixels . . . . Utilisation des mthodes du canevas pour dessiner des objets graphiques. . Dessin de lignes et de polylignes . . Dessin de formes . . . . . . . . . . . . Gestion de plusieurs objets de dessin dans votre application . . . . . . . . . . Faire le suivi de loutil de dessin utiliser . . . . . . . . . . . . . . . . Changement doutil en utilisant un turbobouton . . . . . . . . . . . Utilisation des outils de dessin . . . . Dessiner sur un graphique . . . . . . . . Cration de graphiques dfilables . . Ajout dun contrle image . . . . . . Chargement et enregistrement de fichiers graphiques . . . . . . . . . . Chargement dune image depuis un fichier . . . . . . . . . . . Enregistrement dune image dans un fichier . . . . . . . . . . . . Remplacement de limage . . . . . . . Utilisation du presse-papiers avec les graphiques . . . . . . . . . . . Copier des graphiques dans le presse-papiers . . . . . . . . Couper des graphiques dans le presse-papiers . . . . . . . . Coller des graphiques depuis le presse-papiers . . . . . . . Techniques de dessin dans une application. . . . . . . . . . . Rpondre la souris . . . . . . . . . . Ajout dun champ un objet fiche . . Amlioration du dessin des lignes . . Utilisation du multimdia . . . . . . . . . .

8-1
. . 8-1 . . 8-2 . . 8-3 . . 8-4 . . . . . 8-5 . 8-6 . 8-8 . 8-10

Ajout de squences vido silencieuses une application . . . . . . . . . . . . Exemple dajout de squences vido silencieuses . . . . . . . . . . . . . . Ajout de squences audio et/ou vido une application . . . . . . . . . . . . Exemple dajout de squences audio et/ou vido (VCL seulement) . . .

. . 8-31 . . 8-32 . . 8-33 . . 8-35

Chapitre 9

Ecriture dapplications multithreads


Dfinition dobjets thread . . . . . . . . . . . Initialisation du thread . . . . . . . . . . . Affectation dune priorit par dfaut . Libration des threads . . . . . . . . . Ecriture de la fonction thread . . . . . . . Utilisation du thread principal VCL/CLX . . . . . . . . . . . . . . . . Utilisation de variables locales aux threads . . . . . . . . . . . . . . . Vrification de larrt par dautres threads . . . . . . . . . . . . . . . . . Gestion des exceptions dans la fonction thread . . . . . . . . Ecriture du code de nettoyage . . . . . . Coordination de threads . . . . . . . . . . . . Eviter les accs simultans . . . . . . . . . Verrouillage dobjets. . . . . . . . . . . Utilisation de sections critiques . . . . Utilisation du synchronisateur criture exclusive et lecture multiple Autres techniques de partage de la mmoire . . . . . . . . . . . . . Attente des autres threads . . . . . . . . . Attente de la fin dexcution dun thread . . . . . . . . . . . . . . . Attente de lachvement dune tche . Excution dobjets thread . . . . . . . . . . . Redfinition de la priorit par dfaut . . Dmarrage et arrt des threads . . . . . . Dbogage dapplications multithreads. . . . . . . . .

9-1
. 9-2 . 9-3 . 9-3 . 9-4 . 9-4

. . 8-10 . . 8-10 . . 8-11 . . 8-12 . . 8-13 . . . . . . 8-14 . 8-14 . 8-17 . 8-18 . 8-18

. . 9-4 . . 9-6 . . 9-6 . . . . . . . 9-6 . 9-7 . 9-7 . 9-8 . 9-8 . 9-8

. . 8-20 . . 8-20 . . 8-21 . . 8-21 . . 8-22 . . 8-23 . . 8-23 . . 8-24 . . . . . . 8-25 . 8-25 . 8-28 . 8-29 . 8-31 vii

. . 9-9 . . 9-9 . 9-10 . . . . . . 9-10 9-10 9-12 9-12 9-12 9-13

Chapitre 10

Utilisation de CLX pour le dveloppement multiplate-forme

10-1

Cration dapplications multiplates-formes . . 10-1 Portage dapplications VCL vers CLX . . . . . 10-3

Techniques de portage. . . . . . . . . . . Portages propres une plate-forme . Portages multiplates-formes. . . . . . Portages dmulation Windows . . . Portage de votre application . . . . . . . CLX et VCL . . . . . . . . . . . . . . . . . Diffrences de CLX . . . . . . . . . . . . Prsentation visuelle . . . . . . . . . . Styles . . . . . . . . . . . . . . . . . . . Variants . . . . . . . . . . . . . . . . . Registre . . . . . . . . . . . . . . . . . Autres diffrences . . . . . . . . . . . Fonctionnalits manquantes dans CLX . Fonctionnalits non portes. . . . . . . . Comparaison entre les units CLX et VCL . . . . . . . . . . . . . . . . . . . Diffrences dans les constructeurs dobjets CLX . . . . . . . . . . . . . . . Partage des fichiers source entre Windows et Linux . . . . . . . . . . . . Diffrences denvironnement entre Windows et Linux . . . . . . . . . . . . Structure de rpertoires sous Linux . . . Ecriture de code portable . . . . . . . . . Utilisation des directives conditionnelles . . . . . . . . . . . . Terminaison des directives conditionnelles . . . . . . . . . . . . Emission de messages . . . . . . . . . Inclusion de code assembleur inline . Messages et vnements systme . . . . Diffrences de programmation sous Linux. . . . . . . . . . . . . . . . . Applications de bases de donnes multiplates-formes . . . . . . . . . . . . . . Diffrences de dbExpress . . . . . . . . . Diffrences au niveau composant . . . . Diffrences au niveau de linterface utilisateur . . . . . . . . . . . . . . . . . Portage dapplications de bases de donnes vers Linux . . . . . . . . . . . Mise jour des donnes dans les applications dbExpress . . . . . . . . . Applications Internet multiplates-formes. . Portage dapplications Internet vers Linux . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. 10-3 . 10-3 . 10-3 . 10-4 . 10-4 . 10-6 . 10-7 . 10-7 . 10-7 . 10-8 . 10-8 . 10-9 10-10 10-10

Chapitre 11

Utilisation des paquets et des composants


Pourquoi utiliser des paquets ? . . . . . . . . Les paquets et les DLL standard . . . . . Paquets dexcution . . . . . . . . . . . . . . Utilisation des paquets dans une application . . . . . . . . . . . Paquets chargs dynamiquement . . . . . Choix des paquets dexcution utiliser. Paquets personnaliss . . . . . . . . . . . Paquets de conception . . . . . . . . . . . . . Installation de paquets de composants. . Cration et modification de paquets . . . . . Cration dun paquet . . . . . . . . . . . . Modification dun paquet existant . . . . Modification manuelle de fichiers source de paquets . . . . . . . . . . . . . . . . . Prsentation de la structure dun paquet Nom de paquets . . . . . . . . . . . . . Clause Requires . . . . . . . . . . . . . Clause Contains . . . . . . . . . . . . . Compilation de paquets . . . . . . . . . . Directives de compilation propres aux paquets . . . . . . . . . . . . . . . Utilisation du compilateur et du lieur en ligne de commande . . . . . . . . Fichiers paquets crs lors dune compilation russie . . . . . . Dploiement de paquets . . . . . . . . . . . . Dploiement dapplications utilisant des paquets. . . . . . . . . . . . . . . . . Distribution de paquets dautres dveloppeurs. . . . . . . . . . . . . . . . Fichiers de collection de paquets . . . . .

11-1
. 11-2 . 11-2 . 11-3 . . . . . . . . . 11-3 11-4 11-4 11-5 11-5 11-6 11-7 11-7 11-8

. 10-11 . 10-15 . 10-15 . 10-16 . 10-18 . 10-19 . 10-20 . . . . 10-22 10-23 10-23 10-24

. 11-9 . 11-9 . 11-9 .11-10 .11-10 . 11-11 .11-11 .11-13 .11-13 .11-14 .11-14 .11-14 .11-14

. 10-25 . 10-26 . 10-27 . 10-28 . 10-29 . 10-29 . 10-32 . 10-34 . 10-34

Chapitre 12

Cration dapplications internationales


Internationalisation et localisation . . . . . . Internationalisation . . . . . . . . . . . . . Localisation . . . . . . . . . . . . . . . . . Internationalisation des applications . . . . . Codage de lapplication . . . . . . . . . . Jeux de caractres . . . . . . . . . . . . Jeux de caractres OEM et ANSI . . . Jeux de caractres sur plusieurs octets Caractres larges . . . . . . . . . . . . .

12-1
. . . . . . . . . 12-1 12-1 12-2 12-2 12-2 12-2 12-3 12-3 12-4

viii

Inclure des fonctionnalits bidirectionnelles dans les applications . Proprit BiDiMode . . . . . . . . . . . Fonctionnalits spcifiques aux cibles locales . . . . . . . . . . . . Conception de linterface utilisateur. . . . Texte . . . . . . . . . . . . . . . . . . . . Images graphiques . . . . . . . . . . . . Formats et ordre de tri. . . . . . . . . . Correspondances entre claviers . . . . . Isolement des ressources . . . . . . . . . . Cration de DLL de ressources. . . . . . . Utilisation des DLL de ressource . . . . . Basculement dynamique de DLL de ressource . . . . . . . . . . . . . . . . . Localisation des applications. . . . . . . . . . Localisation des ressources . . . . . . . . .

. 12-4 . 12-7 . 12-9 . 12-9 . 12-9 12-10 12-10 12-11 12-11 12-11 12-12 12-13 12-14 12-14

Si vous nutilisez pas de redimensionnement dynamique Si vous redimensionnez les fiches et les contrles dynamiquement . . . . Adaptation des profondeurs de couleurs variables . . . . . . . . Fontes . . . . . . . . . . . . . . . . . . . . Versions des systmes dexploitation . . Termes du contrat de licence logicielle . . DEPLOY . . . . . . . . . . . . . . . . . . README . . . . . . . . . . . . . . . . . . Contrat de licence . . . . . . . . . . . . . Documentation de produits vendus par un tiers . . . . . . . . . . . . . . . .

. 13-13 . 13-14 . . . . . . . 13-15 13-15 13-16 13-16 13-17 13-17 13-17

. 13-17

Partie II

Chapitre 13

Dveloppement dapplications de bases de donnes


Chapitre 14

Dploiement des applications


Dploiement dapplications gnralistes . . . Utilisation des programmes dinstallation Identification des fichiers de lapplication . . . . . . . . . . . . . Fichiers de lapplication . . . . . . . . . Fichiers paquet . . . . . . . . . . . . . . Modules de fusion . . . . . . . . . . . . Contrles ActiveX . . . . . . . . . . . . Applications complmentaires . . . . . Emplacement des DLL. . . . . . . . . . Dploiement dapplications CLX . . . . . . . Dploiement dapplications de bases de donnes . . . . . . . . . . . . . . . . . . . Dploiement dapplications de bases de donnes dbExpress . . . . . . . . . . . Dploiement dapplications BDE . . . . . Le moteur de bases de donnes Borland . . . . . . . . . . . . . . . . . . SQL Links . . . . . . . . . . . . . . . . . Dploiement dapplications de bases de donnes multiniveaux (DataSnap) . . Dploiement dapplications Web . . . . . . . Dploiement pour Apache . . . . . . . . . Programmation pour des environnements htes htrognes . . . . . . . . . . . . . . . Rsolution dcran et profondeur de couleurs . . . . . . . . . . . . . . . . .

13-1
. 13-1 . 13-2 . 13-3 . 13-3 . 13-3 . 13-4 . 13-5 . 13-6 . 13-6 . 13-6 . 13-7 . 13-8 . 13-9 . 13-9 13-10 13-11 13-11 13-12 13-13 13-13

Conception dapplications de bases de donnes

14-1

Utilisation des bases de donnes . . . . . . . . 14-1 Types de bases de donnes . . . . . . . . . 14-3 Scurit des bases de donnes. . . . . . . . 14-4 Transactions . . . . . . . . . . . . . . . . . . 14-5 Intgrit rfrentielle, procdures stockes et dclencheurs . . . . . . . . . . . . . . . 14-6 Architecture des bases de donnes . . . . . . . 14-6 Structure gnrale . . . . . . . . . . . . . . . 14-7 Fiche interface utilisateur. . . . . . . . . 14-7 Module de donnes . . . . . . . . . . . . 14-7 Connexion directe un serveur de bases de donnes . . . . . . . . . . . . . . . . . . 14-9 Utilisation dun fichier ddi sur disque. 14-10 Connexion un autre ensemble de donnes . . . . . . . . . . . . . . . . . 14-12 Connexion dun ensemble de donnes client un autre ensemble de donnes dans la mme application . . . . . . 14-14 Utilisation dune architecture multiniveau . . . . . . . . . . . . . . . 14-15 Combinaison des approches . . . . . . . . 14-16 Conception de linterface utilisateur . . . . . 14-17 Analyse des donnes . . . . . . . . . . . . 14-18 Ecriture de rapports . . . . . . . . . . . . 14-18

ix

Chapitre 15

Utilisation de contrles de donnes

15-1

Fonctionnalits communes des contrles de donnes . . . . . . . . . . . . . . . . . . . . 15-2 Association dun contrle de donnes un ensemble de donnes . . . . . . . . . 15-3 Modification de lensemble de donnes associ lexcution . . . . . . . . . . . 15-4 Activation et dsactivation de la source de donnes. . . . . . . . . . . . . . . . . 15-4 Rponse aux modifications effectues par le biais de la source de donnes . . 15-5 Edition et mise jour des donnes . . . . . 15-5 Activation de ldition des contrles lors dune saisie utilisateur . . . . . . . 15-6 Edition des donnes affiches dans un contrle . . . . . . . . . . . . . 15-6 Activation et dsactivation de laffichage des donnes . . . . . . . . . . . . . . . . . . 15-7 Rafrachissement de laffichage des donnes . . . . . . . . . . . . . . . . . . 15-8 Activation des vnements souris, clavier et timer . . . . . . . . . . . . . . . . . . . . 15-8 Choix de lorganisation des donnes . . . . . . 15-8 Affichage dun seul enregistrement . . . . . 15-8 Affichage de donnes en tant que libells . . . . . . . . . . . . . . . . . . . 15-9 Affichage et dition de champs dans une zone de saisie . . . . . . . . . 15-9 Affichage et dition de texte dans un contrle mmo . . . . . . . . . . . 15-10 Affichage et dition dans un contrle mmo de texte format . . . . . . . . 15-11 Affichage et dition de champs graphiques dans un contrle image . 15-11 Affichage de donnes dans des botes liste et des botes options . . . . . . 15-12 Manipulation de champs boolens avec des cases cocher . . . . . . . . 15-15 Limitation de valeurs de champ avec des boutons radio. . . . . . . . . 15-16 Affichage de plusieurs enregistrements . . 15-17 Visualisation et dition des donnes avec un contrle TDBGrid . . . . . . . . . . 15-18 Utilisation dun contrle grille son tat par dfaut . . . . . . . . . . . . . . . . . . 15-18 Cration dune grille personnalise . . . . 15-19 Prsentation des colonnes persistantes 15-20 x

Cration de colonnes persistantes . . . Suppression de colonnes persistantes. Modification de lordre des colonnes persistantes . . . . . . . . . . . . . . . Dfinition des proprits de colonne en mode conception . . . . . . . . . . Dfinition dune colonne de liste de rfrence. . . . . . . . . . . . . . . Insertion dun bouton dans une colonne . . . . . . . . . . . Restauration des valeurs par dfaut dune colonne . . . . . . . . . . . . . Affichage des champs ADT et tableau . . Dfinition des options de la grille . . . . Saisie de modifications dans la grille. . . Contrle du dessin de la grille . . . . . . Comment rpondre aux actions de lutilisateur lexcution . . . . . . . Cration dune grille qui contient dautres contrles orients donnes . . . . Navigation et manipulation denregistrements . . . . . . . . . . . . . . . Choix des boutons visibles. . . . . . . . . Affichage et dissimulation des boutons en mode conception . . Affichage et dissimulation des boutons lexcution . . . . . . . . . Affichage de panneaux dinformation . . Utilisation dun navigateur pour plusieurs ensembles de donnes .

15-21 15-22 15-22 15-23 15-24 15-25 15-25 15-26 15-28 15-29 15-30 15-31 15-32 15-33 15-34 15-35 15-35 15-36 15-36

Chapitre 16

Utilisation de composants daide la dcision


Prsentation . . . . . . . . . . . . . . . . . . Prsentation des rfrences croises . . . . Rfrences croises une dimension . . Rfrences croises plusieurs dimensions . . . . . . . . . . . . . . . . Instructions relatives lutilisation de composants daide la dcision . . . Utilisation densembles de donnes avec les composants daide la dcision Cration densembles de donnes de dcision avec TQuery ou TTable . Cration densembles de donnes de dcision avec lditeur de requte de dcision . . . . . . . . . . . . . . . . Utilisation des cubes de dcision . . . . . .

16-1
. . 16-1 . . 16-2 . . 16-3 . . 16-3 . . 16-3 . . 16-5 . . 16-6

. . 16-6 . . 16-7

Proprits et vnements des cubes de dcision . . . . . . . . . . . . . . . . . . 16-8 Utilisation de lditeur de cube de dcision . . . . . . . . . . . . . . . . . . 16-8 Visualisation et modification des paramtres de dimensions . . . . . 16-8 Dfinition du maximum de dimensions et de rcapitulations . . . . . . . . . . . 16-9 Visualisation et modification des options de conception . . . . . . . . . . 16-9 Utilisation de sources de dcision . . . . . . . 16-10 Proprits et vnements . . . . . . . . . . 16-10 Utilisation de pivots de dcision . . . . . . . 16-10 Proprits des pivots de dcision . . . . . 16-11 Cration et utilisation de grilles de dcision . . . . . . . . . . . . . . . . . . . 16-11 Cration de grilles de dcision . . . . . . . 16-11 Utilisation de grilles de dcision . . . . . . 16-12 Ouverture et fermeture des champs dune grille de dcision . . . . . . . . 16-12 Rorganisation des lignes et des colonnes dune grille de dcision . . . 16-12 Perforation pour voir les dtails dans les grilles de dcision . . . . . . 16-13 Limite des dimensions slectionner dans les grilles de dcision . . . . . . 16-13 Proprits des grilles de dcision . . . . . 16-13 Cration et utilisation de graphes de dcision . . . . . . . . . . . . . . . . . . . 16-14 Cration de graphes de dcision . . . . . . 16-14 Utilisation de graphes de dcision. . . . . 16-15 Affichage du graphe de dcision . . . . . 16-16 Personnalisation du graphe de dcision . 16-17 Dfinition des modles de graphe de dcision par dfaut . . . . . . . . . . . 16-18 Personnalisation des sries dun graphe de dcision . . . . . . . . . . . 16-19 Utilisation des composants daide la dcision lexcution . . . . . . . . . . . . . 16-20 Pivots de dcision lexcution . . . . . . 16-20 Grilles de dcision lexcution . . . . . . 16-21 Graphes de dcision lexcution . . . . . 16-21 Considrations relatives au contrle de la mmoire . . . . . . . . . . . . . . . . . 16-21 Dfinition du maximum de dimensions, de champs rcapitulatifs, et de cellules . 16-22 Dfinition de ltat des dimensions . . . . 16-22 Utilisation de dimensions pagines . . . . 16-23

Chapitre 17

Connexion aux bases de donnes 17-1


Utilisation de connexions implicites . . . Contrles des connexions . . . . . . . . . Connexion un serveur de bases de donnes . . . . . . . . . . . . . . . Dconnexion dun serveur de base de donnes . . . . . . . . . . . . . . . Contrle de la connexion au serveur . . Gestion des transactions . . . . . . . . . . Dmarrage dune transaction . . . . . Achvement dune transaction . . . . Achvement dune transaction russie . . . . . . . . . . . . . . . . Achvement dune transaction non russie . . . . . . . . . . . . . Spcification du niveau disolement des transactions . . . . . . . . . . . . Envoi de commandes au serveur. . . . . Utilisation densembles de donnes associs . . . . . . . . . . . . . . . . . . . Fermeture densembles de donnes sans dconnexion du serveur . . . . Dplacement parmi les ensembles de donnes associs . . . . . . . . . . Obtention de mtadonnes . . . . . . . . Enumration des tables disponibles . Enumration des champs dune table Enumration des procdures stockes disponibles . . . . . . . . . . . . . . . Enumration des index disponibles . Enumration des paramtres de procdure stocke . . . . . . . . . . . . . . 17-2 . . . 17-3 . . . 17-3 . . . . . . . . . . . . . . . 17-4 17-4 17-6 17-7 17-9

. . . 17-9 . . . 17-9 . . 17-10 . . .17-11 . . 17-13 . . 17-13 . . . . . . . . 17-14 17-14 17-15 17-15

. . 17-15 . . 17-16 . . 17-16

Chapitre 18

Prsentation des ensembles de donnes


Utilisation des descendants de TDataSet . . Dtermination des tats dun ensemble de donnes. . . . . . . . . . . . . . . . . . . Ouverture et fermeture des ensembles de donnes. . . . . . . . . . . . . . . . . . . Navigation dans les ensembles de donnes. Utilisation des mthodes First et Last . . Utilisation des mthodes Next et Prior . Utilisation de la mthode MoveBy . . . . Utilisation des proprits Eof et Bof . . . Eof . . . . . . . . . . . . . . . . . . . . .

18-1
. 18-2 . 18-3 . . . . . . . 18-5 18-6 18-7 18-8 18-8 18-9 18-9

xi

Bof . . . . . . . . . . . . . . . . . . . . . Marquage denregistrements . . . . . . . . La proprit Bookmark . . . . . . . . . La mthode GetBookmark . . . . . . . Les mthodes GotoBookmark et BookmarkValid . . . . . . . . . . . . La mthode CompareBookmarks. . . . La mthode FreeBookmark . . . . . . . Un exemple dutilisation de signets . . Recherche dans les ensembles de donnes . . Utilisation de la m thode Locate. . . . . . Utilisation de la m thode Lookup . . . . . Affichage et dition densembles de donnes en utilisant des filtres. . . . . . . . Activation et dsactivation des filtres . . . Cration de filtres . . . . . . . . . . . . . . Dfinition de la proprit Filter . . . . Ecriture dun gestionnaire dvnement OnFilterRecord . . . . . Permutation entre les gestionnaires dvnements filtre lexcution . . . Dfinition doptions de filtre . . . . . . . . Navigation parmi les enregistrements dun ensemble de donnes filtr . . . . . Modification des donnes . . . . . . . . . . . Modification denregistrements . . . . . . Ajout de nouveaux enregistrements . . . . Insertion denregistrements . . . . . . . Ajout denregistrements la fin . . . . Suppression denregistrements . . . . . . . Validation des donnes . . . . . . . . . . . Annulation des modifications . . . . . . . Modification denregistrements entiers . . Champs calculs . . . . . . . . . . . . . . . . . Types densembles de donnes . . . . . . . . Utilisation densembles de donnes de type table . . . . . . . . . . . . . . . . . . Avantages de lutilisation des ensembles de donnes de type table . . . . . . . . . Tri des enregistrements avec des index . . Obtention dinformations sur les index . . . . . . . . . . . . . . . Spcification dun index avec IndexName . . . . . . . . . . . . Cration dun index avec IndexFieldNames . . . . . . . . . Utilisation dindex pour chercher des enregistrements . . . . . . . . . . . .

18-10 18-11 18-11 18-11 18-11 18-11 18-11 18-12 18-12 18-12 18-13 18-14 18-15 18-15 18-16 18-17 18-18 18-18 18-19 18-20 18-20 18-21 18-22 18-23 18-23 18-24 18-24 18-25 18-26 18-27 18-29 18-30 18-30 18-30 18-31 18-32 18-32

Excution dune recherche avec les mthodes Goto . . . . . . . . . . . . . 18-33 Excution dune recherche avec les mthodes Find . . . . . . . . . . . 18-34 Spcification de lenregistrement en cours aprs une recherche russie 18-34 Recherche sur des cls partielles . . . 18-34 Ritration ou extension dune recherche . . . . . . . . . . . . 18-35 Limitation des enregistrements avec des portes . . . . . . . . . . . . . . . . . 18-35 Prsentation des diffrences entre les portes et les filtres . . . . . . . . 18-35 Spcification de portes. . . . . . . . . 18-36 Modification dune porte . . . . . . . 18-39 Application ou annulation dune porte . . . . . . . . . . . . . . 18-40 Cration de relations matre/dtail . . . . 18-40 Comment faire de la table la partie dtail dun autre ensemble de donnes . . 18-41 Utilisation de tables dtail imbriques 18-43 Contrle des accs en lecture/criture aux tables . . . . . . . . . . . . . . . . . . 18-44 Cration et suppression des tables . . . . 18-44 Cration de tables . . . . . . . . . . . . 18-44 Suppression de tables . . . . . . . . . . 18-47 Vidage des tables . . . . . . . . . . . . . . 18-47 Synchronisation des tables . . . . . . . . . 18-48 Utilisation densembles de donnes de type requte . . . . . . . . . . . . . . . . 18-49 Spcification de la requte . . . . . . . . . 18-50 Spcification dune requte en utilisant la proprit SQL . . . . . . . 18-50 Spcification dune requte en utilisant la proprit CommandText 18-51 Utilisation de paramtres dans les requtes . . . . . . . . . . . . . 18-52 Fourniture des paramtres pendant la conception. . . . . . . . . 18-53 Fourniture des paramtres pendant lexcution . . . . . . . . . . 18-54 Etablissement de relations matre/dtail en utilisant des paramtres . . . . . . . 18-55 Prparation des requtes . . . . . . . . . . 18-56 Excution de requtes qui ne renvoient pas densemble de rsultats . . . . . . . 18-57 Utilisation densembles de rsultats unidirectionnels . . . . . . . . . . . . . . 18-57

xii

Utilisation densembles de donnes de type procdure stocke . . . . . . . . . . Utilisation de paramtres avec les procdures stockes . . . . . . . . . . . . Dfinition des paramtres pendant la conception . . . . . . . . . . . . . . Utilisation des paramtres pendant lexcution . . . . . . . . . . . . . . . . Prparation des procdures stockes . . . Excution de procdures stockes qui ne renvoient pas densemble de rsultats. . Lecture de plusieurs ensembles de rsultats . . . . . . . . . . . . . . . . .

18-58 18-59 18-60 18-62 18-63 18-63 18-64

Chapitre 19

Manipulation des composants champ

19-1

Composants champ dynamique . . . . . . . . . 19-2 Champs persistants . . . . . . . . . . . . . . . . 19-3 Cration de champs persistants . . . . . . . 19-4 Modification de lordre des champs persistants . . . . . . . . . . . . . . . . . . . 19-6 Dfinition de nouveaux champs persistants . . . . . . . . . . . . . . . . . . . 19-6 Dfinition dun champ de donnes . . . 19-7 Dfinition dun champ calcul . . . . . . 19-8 Programmation dun champ calcul . . . 19-9 Dfinition dun champ de rfrence . . 19-10 Dfinition dun champ agrgat . . . . . 19-12 Suppression de champs persistants . . . . 19-12 Dfinition des vnements et des proprits des champs persistants . . . . 19-13 Dfinition des proprits daffichage et ddition en mode conception . . . 19-13 Dfinition des proprits des composants champ lexcution . . . 19-15 Cration des ensembles dattributs pour les composants champ. . . . . . 19-15 Association des ensembles dattributs aux composants champ . . . . . . . . 19-16 Suppression des associations densembles dattributs . . . . . . . . 19-16 Contrle ou dissimulation de la saisie utilisateur . . . . . . . . . 19-17 Utilisation des formats par dfaut pour les champs numriques, date et heure . . . . . . . . . . . . . . . . . . 19-17 Gestion des vnements . . . . . . . . . 19-18

Manipulation des mthodes de champ lors de lexcution . . . . . . . . . . . . . . . . . 19-19 Affichage, conversion et accs aux valeurs des champs . . . . . . . . . . . . . . . . . . 19-20 Affichage de valeurs dans les contrles standard . . . . . . . . . . . . . . . . . . 19-20 Conversion des valeurs de champs. . . . 19-21 Accs des valeurs par la proprit par dfaut dun ensemble de donnes . 19-23 Accs des valeurs par la proprit Fields dun ensemble de donnes . . . . 19-23 Accs des valeurs par la mthode FieldByName dun ensemble de donnes . . . . . . . . . . . . . . . . . 19-24 Dfinition de la valeur par dfaut dun champ . . . . . . . . . . . . . . . . . . 19-24 Utilisation de contraintes . . . . . . . . . . . 19-24 Cration de contrainte personnalise . . . 19-25 Utilisation des contraintes du serveur . . 19-25 Utilisation des champs objet . . . . . . . . . 19-26 Affichage des champs ADT et tableau . . 19-27 Utilisation des champs ADT. . . . . . . . 19-27 Utilisation de composants champ persistant . . . . . . . . . . . . . . . . 19-28 Utilisation de la mthode FieldByName dun ensemble de donnes . . . . . . 19-28 Utilisation de la proprit FieldValues dun ensemble de donnes . . . . . . 19-28 Utilisation de la proprit FieldValues dun champ ADT . . . . . . . . . . . 19-29 Utilisation de la proprit Fields dun champ ADT . . . . . . . . . . . 19-29 Utilisation des champs tableau . . . . . . 19-29 Utilisation de champs persistants . . . 19-29 Utilisation de la proprit FieldValues dun champ tableau . . . . . . . . . . 19-30 Utilisation de la proprit Fields dun champ tableau . . . . . . . . . . 19-30 Utilisation des champs ensemble de donnes . . . . . . . . . . . . . . . . . 19-30 Affichage des champs ensemble de donnes . . . . . . . . . . . . . . . 19-30 Accs aux donnes dun ensemble de donnes imbriqu . . . . . . . . . 19-31 Utilisation de champs de rfrence . . . . 19-31 Affichage des champs de rfrence . . 19-31 Accs aux donnes dun champ de rfrence. . . . . . . . . . . . . . . 19-32

xiii

Chapitre 20

Utilisation du moteur de bases de donnes Borland

20-1

Architecture BDE . . . . . . . . . . . . . . . . . 20-1 Utilisation densembles de donnes BDE . . 20-2 Association dun ensemble de donnes avec les connexions de bases de donnes et de session . . . . . . . . . . 20-3 Mise en cache des BLOBS . . . . . . . . . 20-4 Obtention dun handle BDE. . . . . . . . 20-5 Utilisation de TTable. . . . . . . . . . . . . . 20-5 Spcification du type dune table locale . 20-6 Contrle daccs en lecture/criture aux tables locales . . . . . . . . . . . . . 20-6 Spcification dun fichier dindex dBASE . . . . . . . . . . . . . . . . . . . 20-7 Renommer une table locale . . . . . . . . 20-8 Importation des donnes dune autre table. . . . . . . . . . . . . . . . . . . . . 20-8 Utilisation de TQuery . . . . . . . . . . . . . 20-9 Cration de requtes htrognes . . . 20-10 Obtention dun ensemble de rsultats modifiable. . . . . . . . . . . 20-11 Mise jour des ensembles de rsultats en lecture seule. . . . . . . . 20-12 Utilisation de TStoredProc . . . . . . . . . 20-13 Liaison des paramtres . . . . . . . . . 20-13 Manipulation des procdures stockes redfinies dOracle . . . . . . . . . . . 20-13 Connexion aux bases de donnes avec TDatabase . . . . . . . . . . . . . . . 20-14 Association dun composant base de donnes une session . . . . 20-14 Interactions entre les composants base de donnes et session . . . . . . 20-15 Identification de la base de donnes . . 20-15 Ouverture dune connexion avec TDatabase . . . . . . . . . . . . . 20-17 Utilisation des composants base de donnes dans les modules de donnes. . . . . . . . . . . . . . . . 20-18 Gestion des sessions de bases de donnes . . . . . . . . . . . . . . . . . 20-18 Activation dune session. . . . . . . . . 20-20 Spcification du comportement de la connexion de base de donnes par dfaut . . . . . . . . . . . . . . . . 20-21 Gestion des connexions de bases de donnes. . . . . . . . . . . . . . . . 20-22 xiv

Manipulation des tables Paradox et dBASE protges par mot de passe . . . . . 20-24 Spcification des rpertoires Paradox . 20-27 Manipulation des alias BDE . . . . . . 20-28 Rcupration des informations dune session . . . . . . . . . . . . . . 20-30 Cration de sessions supplmentaires 20-31 Affectation dun nom une session . 20-32 Gestion de sessions multiples . . . . . 20-32 Utilisation des transactions avec le BDE . . 20-34 Utilisation du SQL transparent . . . . . . 20-35 Utilisation de transactions locales . . . . 20-36 Utilisation du BDE pour placer en mmoire cache les mises jour . . . . . . . 20-37 Activation des mises jour BDE en mmoire cache . . . . . . . . . . . . . 20-38 Application des mises jour BDE en mmoire cache . . . . . . . . . . . . . 20-39 Application des mises jour en mmoire cache avec une base de donnes. . . 20-40 Application des mises jour en mmoire cache avec les mthodes de composant base de donnes . . . . . 20-41 Cration dun gestionnaire dvnement OnUpdateRecord . . . 20-42 Gestion des erreurs de mise jour en mmoire cache . . . . . . . . . . . 20-43 Utilisation dobjets mise jour pour mettre jour un ensemble de donnes . 20-45 Cration dinstructions SQL pour les composants mise jour . . . . . . 20-46 Utilisation de plusieurs objets mise jour . . . . . . . . . . . . . . . 20-51 Excution des instructions SQL . . . . 20-52 Utilisation de TBatchMove . . . . . . . . . . 20-55 Cration dun composant action groupe 20-55 Spcification dun mode daction groupe . . . . . . . . . . . . . . . . . . . 20-57 Ajout denregistrements . . . . . . . . 20-57 Mise jour denregistrements . . . . . 20-57 Ajout et mise jour denregistrements . . . . . . . . . . . 20-57 Copie densembles de donnes . . . . 20-58 Suppression denregistrements . . . . 20-58 Mappage des types de donnes . . . . . . 20-58 Excution dune action groupe. . . . . . 20-59 Gestion des erreurs relatives aux actions groupes . . . . . . . . . . . 20-60 Dictionnaire de donnes . . . . . . . . . . . . 20-60

Outils de manipulation du BDE . . . . . . . . 20-62

Chapitre 22

Chapitre 21

Utilisation des composants ADO

21-1

Utilisation densembles de donnes unidirectionnels 22-1


Types densembles de donnes unidirectionnels . . . . . . . . . . . . . . . . . 22-2 Connexion au serveur de bases de donnes. . . . . . . . . . . . . . . . . . . . 22-3 Configuration de TSQLConnection . . . . . 22-3 Identification du pilote . . . . . . . . . . 22-4 Spcification des paramtres de connexion . . . . . . . . . . . . . . . 22-4 Dnomination dune description de connexion . . . . . . . . . . . . . . . 22-5 Utilisation de lditeur de connexion . . 22-5 Spcification des donnes afficher . . . . . . 22-6 Reprsentation des rsultats dune requte . . . . . . . . . . . . . . . . 22-7 Reprsentation des enregistrements dune table . . . . . . . . . . . . . . . . . . 22-7 Reprsentation dune table en utilisant TSQLDataSet . . . . . . . . . . . . . . . 22-7 Reprsentation dune table en utilisant TSQLTable . . . . . . . . . . . . . . . . 22-8 Reprsentation des rsultats dune procdure stocke . . . . . . . . . . 22-8 Rcupration des donnes . . . . . . . . . . . . 22-9 Prparation de lensemble de donnes . . . 22-9 Rcupration de plusieurs ensembles de donnes . . . . . . . . . . . . . . . . . 22-10 Excution des commandes ne renvoyant pas denregistrement . . . . . . . . . . . . . 22-10 Spcification de la commande excuter. . . . . . . . . . . . . . . . . . .22-11 Excution de la commande . . . . . . . . .22-11 Cration et modification des mtadonnes du serveur . . . . . . . . . 22-12 Dfinition de curseurs lis matre/dtail . . 22-13 Accs aux informations de schma. . . . . . 22-14 Rcupration de mtadonnes dans un ensemble de donnes unidirectionnel . 22-14 Lecture des donnes aprs lutilisation de lensemble de donnes pour des mtadonnes. . . . . . . . . . . . 22-15 Structure des ensembles de mtadonnes . . . . . . . . . . . . 22-15 Dbogage dapplications dbExpress . . . . . 22-19 Utilisation de TSQLMonitor pour contrler les commandes SQL . . . . . . 22-20

Prsentation gnrale des composants ADO. . 21-2 Connexion des stockages de donnes ADO . 21-3 Connexion un stockage de donnes avec TADOConnection . . . . . . . . . . . 21-3 Accs lobjet connexion . . . . . . . . . 21-5 Optimisation dune connexion . . . . . . . . 21-5 Connexions asynchrones . . . . . . . . . 21-5 Contrle des dpassements de dlais . . 21-6 Indication des types doprations pris en charge par la connexion . . . . 21-6 Spcification de lexcution automatique des transactions par la connexion . . . 21-7 Accs aux commandes dune connexion . . 21-8 Evnements connexion ADO . . . . . . . . . 21-8 Evnements se produisant pendant ltablissement dune connexion . . . . 21-8 Evnements se produisant pendant la dconnexion . . . . . . . . . . . . . . 21-9 Evnements se produisant pendant la gestion des transactions . . . . . . . . 21-9 Autres vnements . . . . . . . . . . . . . 21-9 Utilisation des ensembles de donnes ADO . 21-10 Connexion dun ensemble de donnes ADO un stockage de donnes . . . 21-11 Utilisation des ensembles denregistrements . . . . . . . . . . . . 21-11 Filtrage denregistrements partir de signets . . . . . . . . . . . . . . . . 21-12 Lecture denregistrements de faon asynchrone. . . . . . . . . . . . . . . . 21-13 Utilisation des mises jour groupes . 21-13 Lecture et enregistrement des donnes dans des fichiers . . . . . . . 21-16 Utilisation de TADODataSet . . . . . . . . 21-17 Utilisation dobjets commande. . . . . . . . . 21-19 Spcification de la commande . . . . . . . 21-19 Utilisation de la m thode Execute . . . . . 21-20 Annulation des commandes . . . . . . . . 21-20 Rcupration densembles de rsultats laide de commandes . . . . . . . . . . 21-21 Gestion des paramtres de commande . . 21-21

xv

Utilisation dun callback pour contrler les commandes SQL . . . . . . . . . . . . 22-21

Chapitre 23

Utilisation densembles de donnes client 23-1


Manipulation des donnes avec un ensemble de donnes client . . . . . . . . . . . . . . . . 23-2 Navigation parmi les donnes des ensembles de donnes client . . . . . . 23-2 Limitation des enregistrements affichs. . . 23-3 Edition des donnes . . . . . . . . . . . . . . 23-6 Annulation des modifications. . . . . . . 23-6 Enregistrement des modifications . . . . 23-7 Dfinition de contraintes pour les valeurs des donnes . . . . . . . . . . . . . 23-8 Spcification de contraintes personnalises . . . . . . . . . . . . . . . 23-8 Tri et indexation . . . . . . . . . . . . . . . . 23-9 Ajout dun nouvel index . . . . . . . . 23-10 Suppression et permutation dindex . . 23-11 Utilisation des index pour regrouper les donnes . . . . . . . . . . . . . . . 23-11 Reprsentation des valeurs calcules . . . 23-12 Utilisation de champs calculs de faon interne dans les ensembles de donnes client . . . . . . . . . . . . . . 23-13 Utilisation des agrgats maintenus . . . . 23-13 Spcification dagrgats . . . . . . . . . 23-14 Agrgats de groupes denregistrements . . . . . . . . . . . . 23-15 Obtention de valeurs dagrgat . . . . . 23-16 Copie de donnes dun autre ensemble de donnes . . . . . . . . . . . . . . . . . 23-16 Affectation directe des donnes . . . . 23-16 Clonage dun curseur densemble de donnes client . . . . . . . . . . . . 23-17 Ajout dinformations dapplication aux donnes . . . . . . . . . . . . . . . . . 23-18 Utilisation dun ensemble de donnes client pour mettre en cache les mises jour. . . . 23-18 Prsentation de lutilisation dun cache pour les mises jour. . . . . . . . . . . . 23-20 Choix du type densemble de donnes pour les mises jour en cache . . . . . . 23-21 Indication des enregistrements modifis . 23-22 Mise jour des enregistrements . . . . . . 23-24 Application des mises jour . . . . . . 23-24

Intervention pendant lapplication des mises jour . . . . . . . . . . . . Conciliation des erreurs de mise jour . . . . . . . . . . . . . Utilisation dun ensemble de donnes client avec un fournisseur . . . . . . . . . . Spcification dun fournisseur. . . . . . . Extraction des donnes dans lensemble de donnes ou le document source . . . Extractions incrmentales. . . . . . . . Extraction la demande . . . . . . . . Obtention de paramtres de lensemble de donnes source. . . . . . . . . . . . . Transmission de paramtres lensemble de donnes source. . . . . . . . . . . . . Envoi de paramtres de requte ou de procdure stocke . . . . . . . Limitation des enregistrements avec des paramtres . . . . . . . . . . Gestion des contraintes lies au serveur . Rafrachissement des enregistrements . . Communication avec des fournisseurs laide dvnements personnaliss . . Redfinition de lensemble de donnes source . . . . . . . . . . . . . . . . . . . . Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers . Cration dun nouvel ensemble de donnes . . . . . . . . . . . . . . . . . Chargement des donnes depuis un fichier ou un flux . . . . . . . . . . . . . Fusion des modifications dans les donnes . . . . . . . . . . . . . Sauvegarde des donnes dans un fichier ou un flux . . . . . . . . . . . . . . . . .

23-25 23-27 23-29 23-30 23-31 23-31 23-32 23-32 23-33 23-34 23-34 23-35 23-36 23-37 23-38 23-39 23-39 23-40 23-41 23-41

Chapitre 24

Utilisation des composants fournisseur

24-1
24-2 24-2 24-3 24-3

Spcification de la source de donnes . . . . . Utilisation dun ensemble de donnes comme source des donnes . . . . . . . . Utilisation dun document XML comme source des donnes . . . . . . . . . . . . . Communication avec lensemble de donnes client . . . . . . . . . . . . . . . . . . . . . . . Dtermination du mode dapplication des mises jour laide dun fournisseur densemble de donnes . . . . . . . . . . . .

24-4

xvi

Contrle des informations places dans les paquets de donnes . . . . . . . . Spcification des champs apparaissant dans les paquets de donnes . . . . . . Initialisation des options contrlant les paquets de donnes . . . . . . . . . . . Ajout dinformations personnalises aux paquets de donnes . . . . . . . . . Comment rpondre aux demandes de donnes des clients . . . . . . . . . . . Comment rpondre aux demandes de mise jour des clients . . . . . . . . . . Modification des paquets delta avant la mise jour de la base de donnes . Comment contrler lapplication des mises jour . . . . . . . . . . . . . Filtrage des mises jour . . . . . . . . . Rsolution des erreurs de mise jour par le fournisseur . . . . . . . . . . . . Application des mises jour des ensembles de donnes reprsentant plusieurs tables . . . . . . Comment rpondre aux vnements gnrs par le client . . . . . . . . . . . . . Gestion des contraintes du serveur . . . . .

. . 24-5 . . 24-5 . . 24-6 . . 24-7 . . 24-8 . . 24-9 . 24-10 . 24-11 . 24-12 . 24-13

. 24-13 . 24-14 . 24-15

Chapitre 25

Cration dapplications multiniveaux


Avantages du modle de base de donnes multiniveau . . . . . . . . . . . . . . . . . . Prsentation des applications multiniveaux bases sur les fournisseurs . . . . . . . . . Prsentation dune application niveau triple . . . . . . . . . . . . . . . . . . . . Structure de lapplication client . . . . . Structure du serveur dapplications . . . Contenu du module de donnes distant . . . . . . . . . . . . . . . . . Utilisation des modules de donnes transactionnels . . . . . . . . . . . . Regroupement des modules de donnes distants . . . . . . . . . . . Slection dun protocole de connexion . Utilisation de connexions DCOM . . Utilisation de connexions Socket . . . Utilisation de connexions Web . . . . Utilisation de connexions SOAP . . . Utilisation de connexions CORBA . .

25-1
. . 25-2 . . 25-3 . . 25-4 . . 25-5 . . 25-5 . . 25-6 . . 25-7 . . . . . . . . 25-9 25-10 25-10 25-10 25-11 25-12 25-12

Construction dune application multiniveau 25-12 Cration du serveur dapplications . . . . . 25-13 Configuration du module de donnes distant. . . . . . . . . . . . . . . . . . . . 25-15 Configuration de TRemoteDataModule . . . . . . . 25-15 Configuration de TMTSDataModule . 25-16 Configuration de TSoapDataModule . 25-17 Configuration de TCorbaDataModule 25-18 Extension de linterface du serveur dapplications . . . . . . . . . . . . . . . 25-19 Ajout de rappels linterface du serveur dapplications. . . . . . . . . 25-20 Extension de linterface dun serveur dapplications transactionnel . . . . . 25-20 Gestion des transactions dans les applications multiniveaux . . . . . . . . 25-21 Gestion des relations matre / dtail . . . 25-22 Gestion des informations dtat dans les modules de donnes distants . 25-23 Utilisation de plusieurs modules de donnes distants . . . . . . . . . . . . . . 25-24 Recensement du serveur dapplications . . . 25-25 Cration de lapplication client . . . . . . . . 25-26 Connexion au serveur dapplications. . . 25-27 Spcification dune connexion laide de DCOM . . . . . . . . . . . 25-28 laide de sockets . . . . . . . . . . . . 25-29 Spcification dune connexion laide de HTTP . . . . . . . . . . . . 25-30 Spcification dune connexion laide de SOAP. . . . . . . . . . . . 25-30 Spcification dune connexion laide de CORBA . . . . . . . . . . 25-31 Courtage de connexions . . . . . . . . 25-31 Gestion des connexions serveur. . . . . . 25-32 Connexion au serveur. . . . . . . . . . 25-32 Fermeture ou changement de connexion serveur . . . . . . . . . . . 25-33 Appel des interfaces serveur . . . . . . . 25-33 Connexion un serveur dapplications qui utilise plusieurs modules de donnes . 25-35 Ecriture des applications client Web . . . . . 25-36 Distribution dune application client en tant que contrle ActiveX . . . . . . 25-37 Cration dune fiche active pour lapplication client. . . . . . . . 25-38 Construction des applications Web avec InternetExpress . . . . . . . . . . . 25-38

xvii

Construction dune application InternetExpress . . . . . . . . . . . . . . . Utilisation des bibliothques javascript . . . . . . . . . . . . . . . . . Droits daccs au serveur dapplications et son lancement . . Utilisation dun courtier XML . . . . . . . Lecture des paquets de donnes XML Application des mises jour partir des paquets delta XML . . . . . . . . Cration des pages Web avec un producteur de page InternetExpress . . . Utilisation de lditeur de pages Web . Dfinition des proprits des lments Web . . . . . . . . . . . . . . Personnalisation du modle dun producteur de page InternetExpress .

25-39 25-40 25-41 25-42 25-42 25-43 25-44 25-45 25-46 25-47

Partie III

Ecriture dapplications Internet


Chapitre 27

Cration dapplications Internet

27-1

Chapitre 26

Utilisation de XML dans les applications de bases de donnes 26-1


Dfinition des transformations. . . . . . . . Correspondance entre les nuds XML et les champs du paquet de donnes . Utilisation de XMLMapper . . . . . . . . Chargement dun schma XML ou dun paquet de donnes . . . . . Dfinition des mappages . . . . . . . Gnration de fichiers de transformation . . . . . . . . . . . Conversion de documents XML en paquets de donnes . . . . . . . . . . . Spcification du document XML source Spcification de la transformation . . . . Obtention du paquet de donnes rsultant . . . . . . . . . . . . . . . . . . Conversion de nuds dfinis par lutilisateur . . . . . . . . . . . . . . Utilisation dun document XML comme source pour un fournisseur. . . . . . . . . Utilisation dun document XML comme client dun fournisseur . . . . . . . . . . . Lecture dun document XML partir dun fournisseur . . . . . . . . . . . . . Application de mises jour dun document XML un fournisseur . . . . . 26-1 . . 26-2 . . 26-4 . . 26-5 . . 26-5 . . 26-6 . . 26-7 . . 26-7 . . 26-7 . . 26-8 . . 26-8 . . 26-9 . 26-10 . 26-10 . 26-11

A propos de lagent Web et de WebSnap . . . 27-1 Terminologie et standard . . . . . . . . . . . . 27-3 Composition dune URL (Uniform Resource Locator) . . . . . . . . 27-3 URI et URL . . . . . . . . . . . . . . . . . 27-4 En-tte de message de requte HTTP . . . 27-4 Activit dun serveur HTTP. . . . . . . . . . . 27-4 Composition des requtes client . . . . . . 27-5 Traitement des requtes client par le serveur . . . . . . . . . . . . . . . . 27-5 Rponses aux requtes client . . . . . . . . 27-6 Types dapplications serveur Web . . . . . . . 27-6 ISAPI et NSAPI . . . . . . . . . . . . . . 27-7 Apache . . . . . . . . . . . . . . . . . . . 27-7 CGI autonome . . . . . . . . . . . . . . . 27-7 Win-CGI autonome . . . . . . . . . . . . 27-7 Dbogage dapplications serveur . . . . . . . . 27-7 Utilisation du dbogueur dapplication Web . . . . . . . . . . . . . . . . . . . . . . 27-8 Dmarrage de lapplication avec le dbogueur dapplication Web . . . . 27-8 Conversion de votre application vers un autre type dapplication serveur Web . 27-9 Dbogage dapplications Web sous forme de DLL . . . . . . . . . . . . . . . . 27-9 Dbogage sous Windows NT . . . . . 27-10 Dbogage sous Windows 2000. . . . . 27-10

Chapitre 28

Utilisation de lagent Web


Cration dapplications serveur Web avec lagent Web . . . . . . . . . . . . . . Module Web . . . . . . . . . . . . . . . . Objet application Web . . . . . . . . . . Structure dune application agent Web . . Rpartiteur Web. . . . . . . . . . . . . . . . Ajout dactions au rpartiteur . . . . . . Rpartition des messages de requte . . Elments daction . . . . . . . . . . . . . . . Choix du dclenchement des lments daction . . . . . . . . . . . . . . . . . . URL de destination . . . . . . . . . . Type de mthode de requte . . . . . . . . . . . . .

28-1
. . . . . . . . 28-1 28-2 28-3 28-3 28-4 28-5 28-5 28-6

. . 28-6 . . 28-6 . . 28-7

xviii

Activation et dsactivation des lments daction . . . . . . . . . . . . . 28-7 Choix dun lment daction par dfaut. 28-7 Rponse aux messages de requte avec des lments daction . . . . . . . . . 28-8 Envoi de la rponse . . . . . . . . . . . . 28-9 Utilisation de plusieurs lments daction. . . . . . . . . . . . . . . . . . . 28-9 Accs aux informations de requtes client . . . 28-9 Proprits contenant des informations den-tte de requte . . . . . . . . . . . . . 28-9 Proprits identifiant la destination . . 28-10 Proprits dcrivant le client Web . . . 28-10 Proprits identifiant le but de la requte. . . . . . . . . . . . . . . 28-10 Proprits dcrivant la rponse attendue . . . . . . . . . . . . . . . . . 28-11 Proprits dcrivant le contenu. . . . . 28-11 Contenu dun message de requte HTTP. 28-11 Cration de messages de rponse HTTP . . . 28-11 Informations den-tte de rponse . . . . . 28-12 Indication du statut de la rponse . . . 28-12 Indication dattente dune action du client . . . . . . . . . . . . . . . . . 28-12 Description de lapplication serveur . . 28-13 Description du contenu . . . . . . . . . 28-13 Dfinition du contenu de la rponse . . . 28-13 Envoi de la rponse . . . . . . . . . . . . . 28-14 Gnration du contenu des messages de rponse . . . . . . . . . . . . . . . . . . . 28-14 Utilisation du composant gnrateur de page . . . . . . . . . . . . . . . . . . . 28-14 Modles HTML . . . . . . . . . . . . . . 28-15 Choix du modle HTML . . . . . . . . 28-16 Conversion des balises HTML transparentes . . . . . . . . . . . . . . 28-16 Utilisation du gnrateur de page depuis un lment daction . . . . . . 28-16 Chanage de gnrateurs de page . . . 28-17 Utilisation des bases de donnes dans les rponses . . . . . . . . . . . . . . . 28-18 Ajout dune session au module Web . . . 28-19 Reprsentation HTML dune base de donnes . . . . . . . . . . . . . . . . . 28-19 Utilisation des gnrateurs de page ensemble de donnes. . . . . . . . . . 28-19 Utilisation des gnrateurs de tableau . . . . . . . . . . . . . . . . 28-20 Choix des attributs de tableau . . . . . 28-20

Choix des attributs de lignes. . . . Choix des attributs de colonnes . . Incorporation de tableaux dans un document HTML . . . . Configuration dun gnrateur de tableau ensemble de donnes Configuration dun gnrateur de tableau requte . . . . . . . . .

. . 28-21 . . 28-21 . . 28-21 . . 28-21 . . 28-22

Chapitre 29

Utilisation de WebSnap

29-1

Cration dapplications serveur Web avec WebSnap . . . . . . . . . . . . . . . . . . 29-2 Type de serveur . . . . . . . . . . . . . . . . 29-2 Types de module dapplication Web . . . . 29-3 Options des modules dapplication Web. . 29-3 Composants dapplication . . . . . . . . . . 29-4 Modules Web . . . . . . . . . . . . . . . . . . . 29-5 Modules de donnes Web . . . . . . . . . . 29-5 Structure de lunit dun module de donnes Web . . . . . . . . . . . . . 29-6 Interfaces implmentes par un module de donnes Web . . . . . . . . 29-6 Modules de page Web . . . . . . . . . . . . 29-6 Composant gnrateur de page . . . . . 29-7 Nom de page. . . . . . . . . . . . . . . . 29-7 Modle de gnrateur. . . . . . . . . . . 29-7 Interfaces implmentes par le module de page Web . . . . . . . . . . 29-7 Modules dapplication Web . . . . . . . . . 29-8 Interfaces implmentes par un module de donnes dapplication Web . . . . . 29-8 Interfaces implmentes par un module de page dapplication Web . . 29-8 Adaptateurs . . . . . . . . . . . . . . . . . . . . 29-8 Champs. . . . . . . . . . . . . . . . . . . . . 29-8 Actions . . . . . . . . . . . . . . . . . . . . . 29-9 Erreurs . . . . . . . . . . . . . . . . . . . . . 29-9 Enregistrements . . . . . . . . . . . . . . . . 29-9 Gnrateurs de page . . . . . . . . . . . . . . . 29-9 Modles. . . . . . . . . . . . . . . . . . . . . 29-9 Utilisation de scripts serveur avec WebSnap . . . . . . . . . . . . . . . . . 29-10 Scriptage actif . . . . . . . . . . . . . . . . 29-10 Moteur de script. . . . . . . . . . . . . . . 29-10 Blocs de script . . . . . . . . . . . . . . . . 29-10 Cration de scripts . . . . . . . . . . . . . .29-11 Experts modles . . . . . . . . . . . . . .29-11 TAdapterPageProducer . . . . . . . . . .29-11

xix

Modification et visualisation des scripts . 29-11 Comment inclure un script dans une page . . . . . . . . . . . . . . . 29-11 Objets scriptables. . . . . . . . . . . . . . . 29-12 Rpartition des requtes . . . . . . . . . . . . 29-13 WebContext . . . . . . . . . . . . . . . . . . 29-13 Composants rpartiteur . . . . . . . . . . . 29-14 Fonctions dun rpartiteur dadaptateur . 29-14 Utilisation de composants dadaptation pour gnrer du contenu . . . . . . . 29-14 Requtes et rponses des adaptateurs . 29-16 Requtes action . . . . . . . . . . . . . . 29-16 Rponse action . . . . . . . . . . . . . . 29-17 Requte dimage . . . . . . . . . . . . . 29-17 Rponse image . . . . . . . . . . . . . . 29-18 Rpartition des lments daction . . . . . 29-18 Fonctions du rpartiteur de page . . . . . 29-19 Tutoriel WebSnap . . . . . . . . . . . . . . . . 29-20 Cration dune nouvelle application . . . 29-20 Etape 1. Dmarrage de lexpert application WebSnap . . . . . . . . . . 29-20 Etape 2. Enregistrement des fichiers gnrs et du projet . . . . . . . . . . 29-20 Etape 3. Spcification du titre de lapplication . . . . . . . . . . . . . 29-20 Cration de la page CountryTable . . . . . 29-21 Etape 1. Ajout dun nouveau module . 29-21 Etape 2. Enregistrement du nouveau module . . . . . . . . . . . . . . . . . . 29-21 Ajout des composants de donnes au module CountryTable . . . . . . . . . . . 29-21 Etape 1. Ajout des composants orients donnes . . . . . . . . . . . . 29-21 Etape 2. Spcification du champ cl . . 29-22 Etape 3. Ajout dun composant adaptateur . . . . . . . . . . . . . . . . 29-22 Cration dune grille pour afficher les donnes . . . . . . . . . . . . . . . . . 29-23 Etape 1. Ajout dune grille . . . . . . . 29-23 Etape 2. Ajout de commandes de modification la grille . . . . . . . 29-23 Ajout dune fiche de modification . . . . . 29-24 Etape 1. Ajout dun nouveau module . 29-24 Etape 2. Enregistrement du nouveau module . . . . . . . . . . 29-24 Etape 3. Utilisation de lunit CountryTableU . . . . . . . . . . . . . 29-25 Etape 4. Ajout des zones de saisie . . . 29-25

Etape 5. Ajout de boutons . . . . . . Etape 6. Liaisons des actions du formulaire la page de la grille . . Etape 7. Liaison des actions de la grille la page formulaire . . . . . Ajout de la gestion des erreurs . . . . . Etape 1. Ajout de la gestion des erreurs la grille. . . . . . . . . . . Etape 2. Ajout de la gestion des erreurs au formulaire . . . . . . . . Etape 3. Test de la gestion derreurs Excution de lapplication . . . . . . . .

. 29-25 . 29-26 . 29-26 . 29-27 . 29-27 . 29-27 . 29-27 . 29-28

Chapitre 30

Utilisation de documents XML

30-1
30-2 30-3 30-3 30-4 30-5 30-5 30-5 30-6 30-7 30-9

Utilisation du modle DOM . . . . . . . . . . Utilisation des composants XML . . . . . . . . Utilisation de TXMLDocument . . . . . . . Utilisation des nuds XML . . . . . . . . . Utilisation de la valeur dun nud . . . Utilisation des attributs dun nud. . . Ajout et suppression de nuds enfant . Abstraction de documents XML avec lexpert liaison de donnes . . . . . . . Utilisation de lexpert Liaison de donnes XML . . . . . . . . . . . . . . Utilisation du code gnr par lexpert Liaison de donnes XML . . . . . . . . . .

Chapitre 31

Utilisation de services Web

31-1

Conception de serveurs grant les services Web . . . . . . . . . . . . . . . . . 31-2 Conception dun serveur service Web . . . 31-2 Dfinition des interfaces invocables. . . 31-4 Utilisation de types complexes dans des interfaces invocables . . . . . 31-5 Cration et recensement de limplmentation . . . . . . . . . . . 31-6 Cration de classes dexception personnalises pour les services Web . 31-7 Gnration de documents WSDL pour une application service Web . . . 31-8 Conception de clients pour les services Web . 31-9 Importation de documents WSDL . . . . . 31-9 Appel des interfaces invocables . . . . . . 31-10

xx

Chapitre 32

Utilisation des sockets


Implmentation des services . . . . . . . . . Description des protocoles de services . Communication avec les applications Services et ports . . . . . . . . . . . . . . Types de connexions par socket . . . . . . . Connexions client . . . . . . . . . . . . . Connexions dcoute. . . . . . . . . . . . Connexions serveur . . . . . . . . . . . . Description des sockets . . . . . . . . . . . . Description des htes . . . . . . . . . . . Choix entre le nom de lhte et son adresse IP . . . . . . . . . . . Utilisation des ports . . . . . . . . . . . . Utilisation des composants socket. . . . . . Obtenir des informations sur la connexion . . . . . . . . . . . Utilisation de sockets client. . . . . . . . Dsignation du serveur souhait . . . Formation de la connexion . . . . . . Obtention dinformations sur la connexion . . . . . . . . . . . Fermeture de la connexion . . . . . . Utilisation de sockets serveur . . . . . . Dsignation du port . . . . . . . . . . Ecoute des requtes client . . . . . . . Connexion aux clients . . . . . . . . . Fermeture des connexions serveur . . Rponse aux vnements socket. . . . . . . Evnements derreurs . . . . . . . . . . . Evnements client . . . . . . . . . . . . . Evnements serveur . . . . . . . . . . . . Evnements dcoute. . . . . . . . . . Evnements de connexions client . . Lectures et critures sur des connexions socket . . . . . . . . . . . . . . . . . . . . . Connexions non bloquantes . . . . . . . Lecture et criture dvnements . . . Connexions bloquantes . . . . . . . . . . . . . . . . . . . .

32-1
. 32-1 . 32-2 . 32-2 . 32-2 . 32-2 . 32-3 . 32-3 . 32-3 . 32-3 . 32-4

. . 32-5 . . 32-5 . . 32-5 . . . . . . . . . . . . . . . . . . . . . . 32-6 . 32-6 . 32-6 . 32-7 . 32-7 . 32-7 . 32-7 . 32-7 . 32-8 . 32-8 . 32-8 . 32-8 . 32-9 . 32-9 . 32-9 . 32-9 32-10 32-10 32-10 32-11 32-11

Interfaces COM . . . . . . . . . . . . . . . Linterface COM de base, IUnknown . Pointeurs dinterface COM . . . . . . . Serveurs COM . . . . . . . . . . . . . . . . CoClasses et fabricants de classes . . . Serveurs en processus, hors processus et distants . . . . . . . . . . . . . . . . Le mcanisme du marshaling . . . . . Agrgation . . . . . . . . . . . . . . . . Clients COM . . . . . . . . . . . . . . . . . Extensions de COM . . . . . . . . . . . . . . Serveurs Automation . . . . . . . . . . . . Pages Active Server . . . . . . . . . . . . . Contrles ActiveX . . . . . . . . . . . . . . Documents Active. . . . . . . . . . . . . . Objets transactionnels . . . . . . . . . . . Bibliothques de types . . . . . . . . . . . Contenu dune bibliothque de types Cration de bibliothques de types . . Quand utiliser les bibliothques de types . . . . . . . . . . . . . . . . . Accs aux bibliothques de types . . . Avantages des bibliothques de types Utilisation des outils de bibliothques de types . . . . . . . . . . . . . . . . . Implmentation des objets COM laide dexperts . . . . . . . . . . . . . . . . . . . . Code gnr par les experts . . . . . . . .

. . . . .

33-3 33-4 33-5 33-5 33-6

. 33-7 . 33-8 . 33-9 33-10 33-10 33-12 33-13 33-13 33-14 33-15 33-16 33-16 33-16 33-17 33-17 33-18 33-19 33-19 33-23

Chapitre 34

Utilisation des bibliothques de types

34-1

Partie IV

Dveloppement dapplications COM


Chapitre 33

Prsentation des technologies COM

33-1

COM, spcification et implmentation . 33-2 Extensions de COM . . . . . . . . . . . . 33-2 Composantes dune application COM . . . . . 33-3

Lditeur de bibliothques de types . . . . . . 34-2 Composants de lditeur de bibliothques de types. . . . . . . . . . . . . . . . . . . . 34-3 Barre doutils . . . . . . . . . . . . . . . 34-4 Volet liste des objets. . . . . . . . . . . . 34-6 Barre dtat . . . . . . . . . . . . . . . . . 34-6 Les pages dinformations de type . . . . 34-6 Elments dune bibliothque de types . . . 34-9 Interfaces . . . . . . . . . . . . . . . . . 34-10 Dispinterfaces . . . . . . . . . . . . . . .34-11 CoClasses . . . . . . . . . . . . . . . . . .34-11 Dfinitions de types . . . . . . . . . . . .34-11 Modules. . . . . . . . . . . . . . . . . . 34-12 Utilisation de lditeur de bibliothques de types. . . . . . . . . . . . . . . . . . . 34-12 Types autoriss. . . . . . . . . . . . . . 34-13

xxi

Utilisation de la syntaxe Pascal Objet ou IDL . . . . . . . . . . . . . . . . . Cration dune nouvelle bibliothque de types . . . . . . . . . . . . . . . . Ouverture dune bibliothque de types existante . . . . . . . . . . . Ajout dune interface une bibliothque de types . . . . . . . . Modification dune interface en utilisant la bibliothque de types . . Ajout de proprits et mthodes une interface ou dispinterface . . Ajout dune CoClasse une bibliothque de types . . . . . . . . Ajout dune interface une CoClasse Ajout dune numration une bibliothque de types . . . . . Ajout dun alias une bibliothque de types . . . . . . . . . . . . . . . . Ajout dun enregistrement ou dune union une bibliothque de types . Ajout dun module une bibliothque de types . . . . . . . . Enregistrement et recensement des informations dune bibliothque de types . . . . . . . . Bote de dialogue Appliquer les mises jour . . . . . . . . . . . . . . Enregistrement dune bibliothque de types . . . . . . . . . . . . . . . . Rafrachissement de la bibliothque de types . . . . . . . . . . . . . . . . Recensement dune bibliothque de types . . . . . . . . . . . . . . . . Exportation dun fichier IDL . . . . . Dploiement des bibliothques de types . .

. 34-15 . 34-21 . 34-22 . 34-23 . 34-23 . 34-24 . 34-25 . 34-26 . 34-26 . 34-26 . 34-27 . 34-27

. 34-28 . 34-28 . 34-29 . 34-29 . 34-29 . 34-30 . 34-30

Utilisation des composants enveloppe . . . 35-7 Enveloppes ActiveX . . . . . . . . . . . . 35-7 Enveloppes des serveurs Automation . 35-7 Utilisation de contrles ActiveX orients donnes . . . . . . . . . . . . . . . . . . . . 35-9 Exemple : impression dun document avec Microsoft Word . . . . . . . . . . . 35-10 Etape 1 : Prparation de Delphi pour cet exemple. . . . . . . . . . . . .35-11 Etape 2 : importation de la bibliothque de types Word . . . . . .35-11 Etape 3 : utilisation dun objet interface VTable ou de rpartition pour contrler Microsoft Word . . . . . . . .35-11 Etape 4 : nettoyage de lexemple . . . 35-13 Ecriture de code client bas sur les dfinitions de la bibliothque de types. 35-13 Connexion un serveur . . . . . . . . 35-13 Contrle dun serveur Automation en utilisant une interface double . . 35-14 Contrle dun serveur Automation en utilisant une interface de rpartition 35-14 Gestion des vnements dans un contrleur Automation . . . . . . . . 35-15 Cration de clients pour les serveurs nayant pas une bibliothque de types. . . 35-17

Chapitre 36

Cration de serveurs COM simples


Prsentation de la cration dun objet COM Conception dun objet COM . . . . . . . . . Utilisation de lexpert objet COM . . . . . . Utilisation de lexpert objet Automation . . Types dinstanciation des objets COM . . Choix dun modle de thread . . . . . . . Ecriture dun objet grant le modle de thread libre . . . . . . . . . . . . . Ecriture dun objet supportant le modle de thread apartment . . . Ecriture dun objet supportant le modle de thread neutre . . . . . . Dfinition de linterface dun objet COM . . Ajout dune proprit linterface de lobjet . . . . . . . . . . . . . . . . . . Ajout dune mthode linterface de lobjet . . . . . . . . . . . . . . . . . . Exposition dvnements aux clients . . .

36-1
. . . . . . 36-1 36-2 36-2 36-4 36-5 36-6

Chapitre 35

Cration de clients COM


Importation des informations dune bibliothque de types . . . . . . . . Utilisation de la bote de dialogue Importation de bibliothque de types . Utilisation de la bote de dialogue Importation dActiveX . . . . . . . . . . Code gnr par limportation des informations dune bibliothque de types . . . . . . . . . . . . . . . . . . Contrle dun objet import . . . . . . . . .

35-1
. . 35-2 . . 35-3 . . 35-4

. 36-8 . 36-9 . 36-9 . 36-9 36-10 .36-11 .36-11

. . 35-5 . . 35-6

xxii

Gestion des vnements dans un objet Automation . . . . . . . . . . . . . . . Interfaces dAutomation . . . . . . . . . . . . Interfaces doubles . . . . . . . . . . . . . . Interfaces de rpartition . . . . . . . . . . . Interfaces personnalises . . . . . . . . . . Marshaling des donnes . . . . . . . . . . . . Types compatibles avec lAutomation . . Restrictions de type pour le marshaling automatique . . . . . . . . . . . . . . . . . Marshaling personnalis . . . . . . . . . . Recensement dun objet COM . . . . . . . . . Recensement dun serveur en processus . Recensement dun serveur hors processus . . . . . . . . . . . . . . . Test et dbogage de lapplication . . . . . . .

36-13 36-13 36-14 36-15 36-16 36-16 36-17 36-17 36-18 36-18 36-18 36-18 36-19

Chapitre 37

Cration dune page Active Server 37-1


Cration dun objet Active Server . . . . . . . Utilisation des lments intrinsques ASP Application . . . . . . . . . . . . . . . . Request. . . . . . . . . . . . . . . . . . . Response . . . . . . . . . . . . . . . . . . Session . . . . . . . . . . . . . . . . . . . Server . . . . . . . . . . . . . . . . . . . Cration dASP pour des serveurs en et hors processus . . . . . . . . . . . . Recensement dun objet Active Server . . . . Recensement dun serveur en processus . Recensement dun serveur hors processus Test et dbogage dune application ASP . . . . 37-2 . 37-4 . 37-4 . 37-5 . 37-5 . 37-6 . 37-7 . 37-8 . 37-8 . 37-8 . 37-9 . 37-9

Personnalisation de linterface du contrle ActiveX . . . . . . . . . . . . . . . . . . . . Ajout de proprits, mthodes et vnements supplmentaires . . . . . Ajout de proprits et de mthodes. Ajout dvnement . . . . . . . . . . Activation de la liaison de donnes simple avec la bibliothque de types . Cration dune page de proprits pour un contrle ActiveX . . . . . . . . . Cration dune nouvelle page de proprits . . . . . . . . . . . . . . . Ajout de contrles une page de proprits . . . . . . . . . . . . . . . Association des contrles de la page de proprits aux proprits du contrle ActiveX . . . . . . . . . . . . . Actualisation de la page de proprits . . . . . . . . . . . . . Actualisation de lobjet . . . . . . . . Connexion dune page de proprits un contrle ActiveX. . . . . . . . . . Recensement dun contrle ActiveX . . . . Test dun contrle ActiveX . . . . . . . . . Dploiement dun contrle ActiveX sur le Web . . . . . . . . . . . . . . . . . . Paramtrage des options . . . . . . . . .

. . 38-8 . . 38-9 . . 38-9 . .38-11 . 38-12 . 38-13 . 38-13 . 38-14

. 38-14 . 38-14 . 38-15 . 38-15 . 38-15 . 38-16 . 38-16 . 38-17

Chapitre 39

Cration dobjets MTS ou COM+


Principe des objets transactionnels . . . . . . Contraintes dun objet transactionnel . . Gestion des ressources . . . . . . . . . . . . Accs au contexte dun objet . . . . . . . Activation juste--temps . . . . . . . . . . Regroupement des ressources . . . . . . . Fournisseurs de ressources base de donnes . . . . . . . . . . . . . . . Gestionnaire de proprits partages . Libration des ressources . . . . . . . . Regroupement dobjets . . . . . . . . . . . Support transactionnel MTS et COM+. . . . Attributs transactionnels . . . . . . . . . . Initialisation de lattribut transactionnel. . . . . . . . . . . . . . Objets avec tat et sans tat . . . . . . . . Contrle de larrt des transactions. . . . Dmarrage des transactions . . . . . . . .

39-1
. . . . . . 39-2 39-3 39-4 39-4 39-4 39-5

Chapitre 38

Cration dun contrle ActiveX


Prsentation de la cration dun contrle ActiveX . . . . . . . . . . . . . . . . . . . . Elments dun contrle ActiveX . . . . . Contrle VCL . . . . . . . . . . . . . . Enveloppe ActiveX . . . . . . . . . . . Bibliothque de types . . . . . . . . . Page de proprits . . . . . . . . . . . Conception dun contrle ActiveX . . . . . Gnration dun contrle ActiveX partir dun contrle VCL . . . . . . . . . . . . . . Gnration dun contrle ActiveX bas sur une fiche VCL . . . . . . . . . . . . . . Licences des contrles ActiveX . . . . . . . . . . . . . .

38-1
. 38-2 . 38-3 . 38-3 . 38-3 . 38-3 . 38-4 . 38-4

. 39-6 . 39-7 . 39-8 . 39-9 . 39-9 39-10 .39-11 39-12 39-12 39-13

. . 38-4 . . 38-6 . . 38-7

xxiii

Dfinition dun objet transaction ct client . . . . . . . . . . . . . . . Dfinition dun objet transaction ct serveur . . . . . . . . . . . . . . Dlais des transactions . . . . . . . . . . Scurit en fonction des rles . . . . . . . . Prsentation de la cration des objets transactionnels . . . . . . . . . . . . . . . . Utilisation de lexpert objet transactionnel . Choix dun modle de thread pour un objet transactionnel. . . . . . . . . . . . Activits . . . . . . . . . . . . . . . . . Gnration dvnements dans COM+ . . . Utilisation de lexpert objet vnement . Dclenchement dvnement en utilisant un objet vnement COM+. . Transfert de rfrences dobjets . . . . . . . Utilisation de la m thode SafeRef . . Callbacks. . . . . . . . . . . . . . . . . Dbogage et test des objets transactionnels Installation dobjets transactionnels . . . . . Administration dobjets transactionnels . .

. 39-13 . 39-14 . 39-15 . 39-15 . 39-16 . 39-17 . . . . . . . . . . . 39-18 39-19 39-20 39-20 39-21 39-21 39-22 39-23 39-23 39-24 39-25

Cration manuelle dun composant Cration dun fichier unit . . . . Drivation du composant . . . . Recensement du composant . . . Test des composants non installs . . . Test des composants installs . . . . . .

. . . . . .

. . . . . .

. . . . . .

40-12 40-12 40-12 40-13 40-14 40-15

Chapitre 41

Programmation oriente objet et criture des composants


Dfinition de nouvelles classes . . . . . . . . Drivation de nouvelles classes . . . . . . Modifier les valeurs par dfaut dune classe pour viter les rptitions. . . Ajout de nouvelles capacits une classe . . . . . . . . . . . . . . . Dclaration dune nouvelle classe de composant . . . . . . . . . . . . . . . Anctres, descendants et hirarchies des classes . . . . . . . . . . . . . . . . . . . Contrle des accs . . . . . . . . . . . . . . . Masquer les dtails dimplmentation . . Dfinition de linterface avec le concepteur des composants . . . . . . . Dfinition de linterface dexcution . . . Dfinition de linterface de conception. . Rpartition des mthodes . . . . . . . . . . . Mthodes statiques . . . . . . . . . . . . . Mthodes virtuelles . . . . . . . . . . . . . Surcharge des m thodes . . . . . . . . Membres abstraits dune classe . . . . . . . . Classes et pointeurs . . . . . . . . . . . . . .

41-1
. 41-1 . 41-2 . 41-2 . 41-3 . 41-3 . 41-3 . 41-4 . 41-5 . 41-6 . 41-6 . 41-7 . 41-7 . 41-8 . 41-8 . 41-9 41-10 41-10

Partie V

Cration de composants personnaliss


Chapitre 40

Prsentation gnrale de la cration dun composant 40-1


VCL et CLX. . . . . . . . . . . . . . . . . . . Composants et classes. . . . . . . . . . . . . Comment crer un composant ? . . . . . . . Modification de contrles existants . . . Cration de contrles fentrs . . . . . . Cration de contrles graphiques . . . . Sous-classement de contrles Windows. Cration de composants non visuels . . Contenu dun composant ? . . . . . . . . . . Suppression des dpendances . . . . . . Proprits, mthodes et vnements . . Proprits . . . . . . . . . . . . . . . . Evnements . . . . . . . . . . . . . . . Mthodes . . . . . . . . . . . . . . . . Encapsulation des graphiques . . . . . . Recensement . . . . . . . . . . . . . . . . Cration dun nouveau composant . . . . . Utilisation de lexpert composant . . . . . . . . . . . . . . . . . . . . . . . 40-1 . 40-2 . 40-3 . 40-3 . 40-4 . 40-4 . 40-5 . 40-5 . 40-5 . 40-6 . 40-6 . 40-6 . 40-7 . 40-7 . 40-8 . 40-9 . 40-9 40-10

Chapitre 42

Cration de proprits
Pourquoi crer des proprits ?. . . . . Types de proprits. . . . . . . . . . . . Publication des proprits hrites . . . Dfinition des proprits . . . . . . . . Dclaration des proprits . . . . . . Stockage interne des donnes . . . . Accs direct . . . . . . . . . . . . . . Mthodes daccs . . . . . . . . . . . Mthode read . . . . . . . . . . . Mthode write . . . . . . . . . . . Valeurs par dfaut dune proprit . Spcification daucune valeur par dfaut . . . . . . . . . . . . . Cration de proprits tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42-1
. . . . . . . . . . . 42-1 42-2 42-3 42-4 42-4 42-4 42-5 42-5 42-6 42-7 42-7

. . . . 42-8 . . . . 42-8

xxiv

Cration de proprits pour les sous-composants . . . . . . . . . . . 42-9 Cration de proprits pour les interfaces . . 42-11 Stockage et chargement des proprits . . . . 42-12 Utilisation du mcanisme de stockage et de chargement . . . . . . . . . . . . . . 42-12 Spcification des valeurs par dfaut . . . . 42-13 Dtermination du stockage . . . . . . . . . 42-13 Initialisation aprs chargement . . . . . . . 42-14 Stockage et chargement des proprits non publies . . . . . . . . . . . . . . . . 42-15 Cration de mthodes pour le stockage et le chargement de valeurs de proprits . . . . . . . . . . . . . . 42-15 Redfinition de la mthode DefineProperties . . . . . . . . . . . . 42-16

Les noms dvnement dbutent par On . . . . . . . . . . . . . . . Appel de lvnement . . . . . . . . . . Les gestionnaires vides doivent tre valides . . . . . . . . . . . . . . Les utilisateurs peuvent surcharger la gestion par dfaut . . . . . . . .

. . 43-9 . . 43-9 . 43-10 . 43-10

Chapitre 44

Cration de mthodes
Eviter les interdpendances . . . . . . . . Noms des mthodes . . . . . . . . . . . . Protection des mthodes . . . . . . . . . . Mthodes qui doivent tre publiques Mthodes qui doivent tre protges. Mthodes abstraites . . . . . . . . . . . Rendre virtuelles des mthodes . . . . . Dclaration des mthodes . . . . . . . . . . . . . . . . . . . . . . . . .

44-1
. . . . . . . . 44-1 44-2 44-3 44-3 44-3 44-4 44-4 44-4

Chapitre 43

Cration dvnements

43-1

Quest-ce quun vnement ?. . . . . . . . . . . 43-1 Les vnements sont des pointeurs de mthodes . . . . . . . . . . . . . . . . . 43-2 Les vnements sont des proprits . . . . . 43-2 Les types dvnements sont des types de pointeurs de mthodes. . . . . . . . . . 43-3 Les types gestionnaire dvnement sont des procdures . . . . . . . . . . . 43-3 Les gestionnaires dvnements sont facultatifs . . . . . . . . . . . . . . . . 43-4 Implmentation des vnements standard . . . 43-5 Identification des vnements standard. . . 43-5 Evnements standard pour tous les contrles . . . . . . . . . . 43-5 Evnements standard pour les contrles standard . . . . . . . 43-5 Rendre visibles des vnements . . . . . . . 43-6 Changement de la gestion des vnements standard . . . . . . . . . . . . . . . . . . . . 43-6 Dfinition de vos propres vnements . . . . . 43-7 Dclenchement de lvnement . . . . . . . 43-7 Deux sortes dvnements. . . . . . . . . 43-7 Dfinition du type de gestionnaire . . . . . 43-8 Notifications simples . . . . . . . . . . . . 43-8 Gestionnaires dvnements spcifiques . . . . . . . . . . . . . . . . . 43-8 Renvoi dinformations partir du gestionnaire . . . . . . . . . . . . . . 43-9 Dclaration de lvnement . . . . . . . . . . 43-9

Chapitre 45

Graphiques et composants
Prsentation des graphiques . . . . . . . . . Utilisation du canevas . . . . . . . . . . . . . Travail sur les images . . . . . . . . . . . . . Utilisation dune image, dun graphique ou dun canevas . . . . . . . . . . . . . . Chargement et stockage des graphiques . Gestion des palettes. . . . . . . . . . . . . Spcification dune palette pour un contrle . . . . . . . . . . . . Rponse aux changements de palette. Bitmaps hors cran . . . . . . . . . . . . . . . Cration et gestion des bitmaps hors cran . . . . . . . . . . . . . . . . . Copie des images bitmap . . . . . . . . . Rponse aux changements . . . . . . . . . .

45-1
. 45-1 . 45-3 . 45-3 . 45-4 . 45-4 . 45-5 . 45-5 . 45-6 . 45-6 . 45-6 . 45-7 . 45-7

Chapitre 46

Gestion des messages


Comprhension du systme de gestion des messages . . . . . . . . . . . . . . . . . Que contient un message Windows ? . . Rpartition des messages . . . . . . . . . Suivi du flux des messages . . . . . . Modification de la gestion des messages . . Surcharge de la mthode du gestionnaire Utilisation des paramtres dun message Interception des messages . . . . . . . . .

46-1
. . . . . . . . 46-1 46-2 46-2 46-3 46-3 46-4 46-4 46-5

xxv

Cration de nouveaux gestionnaires de messages . . . . . . . . . . . . . . . . . . Dfinition de vos propres messages . . . . Dclaration dun identificateur de message . . . . . . . . . . . . . . . Dclaration dun type enregistrement de message . . . . . . . . . . . . . . . Dclaration dune nouvelle mthode de gestion dun message . . . . . . . . .

. 46-5 . 46-6 . 46-6 . 46-6 . 46-7

Modification du comportement suite un double-clic . . . . . . . . . . . . . . Ajout de formats de Presse-papiers. . . . Recensement dun diteur de composants Compilation des composants en paquets . .

47-19 47-20 47-20 47-21

Chapitre 48

Modification dun composant existant


Cration et recensement du composant Modification de la classe composant . . Surcharge du constructeur . . . . . . Spcification de la nouvelle valeur par dfaut de la proprit . . . . .

48-1
. . . . 48-1 . . . . 48-2 . . . . 48-2 . . . . 48-3

Chapitre 47

Accessibilit des composants au moment de la conception


Recensement des composants . . . . . . . . . Dclaration de la procdure Register . . . Ecriture de la procdure Register . . . . . Spcification des composants . . . . . . Spcification de la page de palette . . . Utilisation de la fonction RegisterComponents . . . . . . . . . . Ajout de bitmaps la palette . . . . . . . . . Fournir laide pour vos composants . . . . . Cration du fichier daide. . . . . . . . . . Cration des entres . . . . . . . . . . . Aide contextuelle des composants . . . Ajout des fichiers daide des composants . . . . . . . . . . . . . . . Ajout dditeurs de proprits . . . . . . . . . Drivation dune classe diteur de proprits . . . . . . . . . . . . . . . . Modification de la proprit sous une forme textuelle . . . . . . . . . Affichage de la valeur de la proprit . Dfinition de la valeur de la proprit Modification globale de la proprit . . . Spcification des attributs de lditeur . . Recensement de lditeur de proprits. . Catgories de proprit . . . . . . . . . . . . . Recensement dune proprit la fois . . Recensement de plusieurs proprits en une seule fois . . . . . . . . . . . . . . Spcification de catgories de proprits . Utilisation de la fonction IsPropertyInCategory . . . . . . . . . . . Ajout dditeurs de composants . . . . . . . . Ajout dlments au menu contextuel. . . Spcification dlments de menu . . . Implmentation des commandes . . . .

47-1
. 47-1 . 47-2 . 47-2 . 47-3 . 47-3 . 47-3 . 47-4 . 47-4 . 47-4 . 47-5 . 47-6 . 47-7 . 47-7 . 47-7 . 47-9 . 47-9 . 47-9 47-10 47-11 47-13 47-14 47-14 47-15 47-15 47-16 47-17 47-18 47-18 47-18

Chapitre 49

Cration dun composant graphique

49-1
49-1 49-2 49-3 49-3 49-3 49-4 49-4 49-4 49-5 49-5 49-6 49-6 49-7 49-7 49-8 49-9

Cration et recensement du composant . . . . Publication des proprits hrites . . . . . . . Ajout de fonctionnalits graphiques . . . . . . Dtermination de ce qui doit tre dessin . Dclaration du type de la proprit . . . Dclaration de la proprit . . . . . . . . Ecriture de la mthode dimplmentation . . . . . . . . . . . . Surcharge du constructeur et du destructeur . . . . . . . . . . . . . . Modification des valeurs par dfaut des proprits . . . . . . . . . . . . . . Publication du crayon et du pinceau . . . . Dclaration des champs de classe . . . . Dclaration des proprits daccs . . . Initialisation des classes ayant un propritaire . . . . . . . . . . Dfinition des proprits des classes ayant un propritaire . . . . . . . . . . Dessin de limage du composant . . . . . . Adaptation du dessin de la forme . . . . .

Chapitre 50

Personnalisation dune grille


Cration et recensement du composant Publication des proprits hrites . . . Modification des valeurs initiales . . . Redimensionnement des cellules . . . . Remplissage des cellules. . . . . . . . . Suivi de la date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50-1
. . . . . . 50-1 50-2 50-3 50-4 50-5 50-6

xxvi

Stockage interne de la date . . . . . . Accs au jour, au mois et lanne . Gnration des numros de jours . . Slection du jour en cours. . . . . . . Navigation de mois en mois et danne en anne. . . . . . . . . . . . . . . . . . . . Navigation de jour en jour . . . . . . . . . . Dplacement de la slection . . . . . . . Fourniture dun vnement OnChange . Exclusion des cellules vides . . . . . . .

. . . . . . . . .

. 50-6 . 50-7 . 50-8 50-10 50-10 50-11 50-12 50-12 50-13

Chapitre 51

Contrles orients donnes


Cration dun contrle pour scruter les donnes . . . . . . . . . . . . . . . . . . Cration et recensement du composant . Fonctionnement du contrle en lecture seulement . . . . . . . . . . . . . . . . . Ajout de la proprit ReadOnly . . . Autorisation des mises jour ncessaires . . . . . . . . . . . . . . . Ajout du lien aux donnes . . . . . . . . Dclaration du champ de classe . . . Dclaration des proprits daccs . . Exemple de dclaration des proprits daccs . . . . . . . . . . . Initialisation du lien de donnes . . . Rponse aux changements de donnes .

51-1
. . 51-2 . . 51-2 . . 51-3 . . 51-3 . . . . . 51-4 . 51-5 . 51-5 . 51-5

Cration dun contrle de modification de donnes. . . . . . . . . . . . . . . . . . . Modification de la valeur par dfaut de FReadOnly . . . . . . . . . . . . . . . Gestion des messages lis la souris ou au clavier . . . . . . . . . . . . . . . . Rponse aux messages indiquant la manipulation de la souris . . . . . Rponse aux messages indiquant la manipulation du clavier . . . . . . Mise jour de la classe lien de donnes sur un champ . . . . . . . . . . . . . . . Modification de la mthode Change . . . Mise jour de lensemble de donnes . .

. 51-8 . 51-9 . 51-9 . 51-9 51-10 .51-11 51-12 51-12

Chapitre 52

Transformation dune bote de dialogue en composant


Dfinition de linterface du composant Cration et recensement du composant Cration de linterface du composant . Inclusion de lunit de la fiche . . . Ajout des proprits de linterface . Ajout de la mthode Execute . . . . Test du composant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52-1
. . . . . . . 52-2 52-2 52-3 52-3 52-3 52-4 52-6

. . 51-6 . . 51-6 . . 51-7

Index

I-1

xxvii

xxviii

Chapitre

Chapitre 1

Introduction

Ce manuel aborde des notions de dveloppement intermdiaires et avances. Il traite notamment de la cration dapplications de bases de donnes client/ serveur, de lcriture de composants personnaliss et de la cration dapplications serveurs Web Internet. Il vous permet de construire des applications qui respectent les spcifications de nombreux standards comme SOAP, TCP/IP, COM+ et ActiveX. Nombre de fonctionnalits avances concernant le dveloppement web, les technologies XML de pointe et le dveloppement de bases de donnes ncessitent des composants ou des experts qui ne sont pas disponibles dans toutes les versions de Delphi. Ce guide suppose que lutilisation et les techniques fondamentales de programmation Delphi ont t assimiles. Pour une prsentation de la programmation Delphi et de lenvironnement de dveloppement intgr (EDI), voir le manuel de Prise en main et laide en ligne.

Contenu de ce manuel
Ce manuel comporte cinq parties dcomposes comme suit : La partie I, Programmation Delphi, dcrit la manire de concevoir des applications Delphi gnralistes. Cette partie donne des dtails sur les techniques de programmation utilisables dans toute application Delphi. Elle dcrit, par exemple, la manire dutiliser les objets courants de la bibliothque de composants visuels (VCL) ou de la bibliothque de composants Borland multiplate-forme (CLX) qui simplifient le dveloppement de linterface utilisateur. Ces objets permettent de grer des chanes, de manipuler du texte, dimplmenter des dialogues communs, etc. Cette section contient galement des chapitres dcrivant la manipulation des graphiques et la gestion des erreurs et des exceptions, lutilisation des DLL, lautomation OLE et lcriture dapplications internationales.

Introduction

1-1

Contenu de ce manuel

Un chapitre dcrit comment utiliser les objets de la bibliothque de composants Borland multiplate-forme (CLX) pour dvelopper des applications pouvant tre compiles et excutes sous Windows ou sous Linux. Le chapitre sur le dploiement aborde les oprations ncessaires pour distribuer votre application auprs de ses utilisateurs. Ce chapitre donne des informations sur les options de compilation, lutilisation de InstallShield Express, les problmes de droits de distribution et sur la manire de dterminer les paquets, DLL et autres bibliothques quil faut utiliser pour gnrer la version distribue dune application. La partie II, Dveloppement dapplications de bases de donnes, dcrit comment construire des applications de bases de donnes en utilisant les outils et les composants base de donnes. Delphi vous permet daccder de nombreux types de bases de donnes, notamment des bases de donnes locales, comme Paradox et dBASE, et des bases de donnes serveur SQL en rseau, comme InterBase, Oracle et Sybase. Vous pouvez choisir parmi divers mcanismes daccs aux donnes, dont dbExpress, BDE (moteur de bases de donnes Borland), InterbaseExpress et ADO. Pour implmenter les applications de bases de donnes les plus volues, vous avez besoin de fonctionnalits qui ne sont pas disponibles dans toutes les versions de Delphi. La partie III, Ecriture dapplications Internet, dcrit comment crer des applications distribues sur internet. Delphi comprend une large gamme doutils permettant dcrire des applications serveur web, y compris larchitecture Web Broker pour crer des applications serveur multiplatesformes, WebSnap pour concevoir des pages web dans un environnement GUI, le support de lutilisation de documents XML et une architecture pour utiliser les services web bass sur SOAP. Pour un support de bas niveau de la messagerie dans les applications Internet, cette section dcrit galement la faon de travailler avec des composants socket. Les composants qui implmentent un grand nombre de ces fonctionnalits ne sont pas disponibles dans toutes les versions de Delphi. La partie IV, Dveloppement dapplications COM, dcrit comment construire des applications qui peuvent interagir avec dautres objets API bass sur COM du systme, comme les extensionsdu Shell Windows ou les applications multimdia. Delphi contient des composants qui supportent ActiveX, COM+ et une bibliothque base sur COM pour les contrles COM qui peuvent tre utiliss par les applications gnralistes ou web. Le support des contrles COM nest pas disponible dans toutes les ditions de Delphi. Pour crer des contrles ActiveX, vous devez disposer de ldition Professionnelle ou Entreprise. La partie V, Cration de composants personnaliss, dcrit la manire de concevoir et dimplmenter vos propres composants et de les intgrer la palette des composants de lEDI. Un composant peut quasiment constituer tout lment de programme manipulable la conception. Limplmentation de composants personnaliss ncessite la drivation dune nouvelle classe partir dune classe existante de la bibliothque de classes VCL ou CLX.

1-2

Guide du dveloppeur

Conventions typographiques

Conventions typographiques
Ce manuel utilise les polices et les symboles dcrits dans le tableau suivant pour mettre en vidence des parties particulires du texte :
Tableau 1.1 Polices et symboles utiliss dans ce manuel Signification
Le texte apparaissant avec une police pas fixe sert reprsenter le texte tel quil apparat lcran ou dans du code Pascal Objet. Il indique aussi les valeurs saisir au clavier. Les crochets dans le texte ou dans une syntaxe reprsentent des lments facultatifs. Ces crochets sont omettre lors de la saisie. Les mots en gras dans le texte ou dans le code servent reprsenter les mots rservs du langage Pascal Objet et les options du compilateur. Les mots en caractres italiques reprsentent des identificateurs du langage Pascal Objet comme les variables et les noms de types. Litalique sert aussi faire ressortir certains mots comme les nouveaux termes. Cette police sert indiquer une touche du clavier. Par exemple, Appuyez sur Echap pour quitter un menu.

Police ou symbole
Police pas fixe

[] Gras Italique

Touches

Support technique
Inprise offre galement de nombreuses options de support pour satisfaire les besoins de lensemble de ses dveloppeurs. Pour obtenir des informations sur les services de support, consultez http://www.borland.fr. Dautres documents dinformations techniques Delphi et les rponses aux questions frquentes (FAQ) se trouvent galement sur ce site. A partir de ce site Web, vous pouvez accder de nombreux groupes de discussion o les dveloppeurs Delphi schangent des informations, des astuces et des techniques. Ce site propose galement une liste de livres concernant Delphi.

Introduction

1-3

1-4

Guide du dveloppeur

Partie

Partie I

Programmation Delphi

Les chapitres de cette partie prsentent les concepts et connaissances ncessaires pour crer des applications Delphi avec nimporte quelle dition du produit. Ils introduisent galement des concepts qui seront traits dans dautres sections de ce manuel.

Programmation Delphi

Chapitre

Chapitre 2

Dveloppement dapplications avec Delphi

Borland Delphi est un environnement de programmation visuelle orient objet permettant le dveloppement rapide dapplications 32 bits en vue de leur dploiement sous Windows et sous Linux. En utilisant Delphi, vous pouvez crer de puissantes applications avec un minimum de programmation. Delphi propose une bibliothque de classes complte appele la VCL (Visual Component Library), la bibliothque des composants Borland multiplates-formes appele CLX et une suite doutils de conception rapide dapplications (RAD) comprenant des modles dapplication, des modles de fiche et des experts de programmation. Delphi gre rellement la programmation oriente objet : la bibliothque de classes VCL comprend des objets qui encapsulent lAPI Windows ainsi que dautres techniques de programmation utiles (Windows) la bibliothque de classes CLX comprend des objets qui encapsulent la bibliothque Qt (Windows ou Linux) Ce chapitre dcrit brivement lenvironnement de dveloppement Delphi et comment il sinscrit dans le cycle de dveloppement. Le reste de ce manuel donne des dtails techniques sur le dveloppement dapplications, la gestion des bases de donnes et les applications Internet ou intranet, ainsi que des informations sur la cration de contrles ActiveX ou COM, et sur lcriture de composants personnaliss.

Environnement de dveloppement intgr


Au dmarrage de Delphi, vous tes immdiatement plac dans lenvironnement de dveloppement intgr, appel galement EDI. Cet environnement propose tous les outils ncessaires la conception, au test, au dbogage et au dploiement dapplications.

Dveloppement dapplications avec Delphi

2-1

Conception dapplications

Lenvironnement de dveloppement Delphi contient un concepteur visuel de fiches, linspecteur dobjets, larborescence des objets, la palette des composants, le gestionnaire de projet, lditeur de code source et le dbogueur, entre autres outils. Certains dentre eux ne font pas partie de toutes les versions du produit. Vous pouvez, votre guise, passer de la reprsentation visuelle dun objet (dans le concepteur de fiche ; linspecteur dobjets permettant de modifier ltat initial de lobjet lors de lexcution) lditeur de code source qui permet de changer la logique dexcution de lobjet. La modification de proprits lies au code dans linspecteur dobjets, comme le nom dun gestionnaire dvnement, modifie automatiquement le code source correspondant. De plus la modification du code source, par exemple le nom dune mthode gestionnaire dvnement dans la dclaration de classe dune fiche, est immdiatement reflte dans linspecteur dobjets. LEDI supporte le dveloppement dapplications tous les stades du cycle de vie du produit, de la conception au dploiement. Lutilisation des outils de lEDI acclre le prototypage et rduit la dure du dveloppement. Une prsentation plus complte de lenvironnement de dveloppement est propose dans le manuel Prise en main, livr avec le produit. En outre, le systme daide en ligne offre de laide sur tous les menus, dialogues et fentres.

Conception dapplications
Delphi dispose de tous les outils ncessaires pour commencer concevoir une application : Une fentre vide, appele une fiche, dans laquelle concevoir linterface utilisateur, de lapplication. Des bibliothques de classes contenant de nombreux objets rutilisables. Linspecteur dobjets pour connatre ou modifier les caractristiques des objets. Lditeur de code qui permet daccder directement la logique sous-jacente du programme. Le gestionnaire de projet qui permet de grer les fichiers constituant un ou plusieurs projets. De nombreux outils, comme un diteur dimages accessible dans la barre doutils et un dbogueur intgr accessible par menus, qui permettent de grer le dveloppement de lapplication directement dans lEDI. Des outils en ligne de commande, y compris des compilateurs, des diteurs de liens. Vous pouvez utiliser Delphi pour concevoir tout type dapplication 32 bits, que ce soit un utilitaire de porte gnrale ou un programme complexe de gestion de donnes ou des applications distribues. Les outils de base de donnes de Delphi et ses composants orients donnes permettent de dvelopper rapidement des applications de bases de donnes de bureau ou client/serveur. En utilisant les contrles orients donnes de Delphi, vous pouvez visualiser des donnes relles

2-2

Guide du dveloppeur

Dveloppement dapplications

alors mme que vous concevez votre application et voir immdiatement le rsultat dune requte de base de donnes ou dune modification de linterface de lapplication. Le chapitre 5, Cration dapplications, de composants et de bibliothques, dcrit comment Delphi gre les diffrents types dapplications. De nombreux objets fournis dans la biblioth que des classes sont accessibles dans la palette des composants de lEDI. La palette des composants montre tous les contrles, visuels ou non, que vous pouvez placer sur une fiche. Chaque onglet contient des composants regroups par fonctionnalit. Par convention, les noms des objets de la bibliothque des classes commencent par un T, comme TStatusBar. Ce qui est rvolutionnaire dans Delphi est que vous pouvez crer vos propres composants en utilisant le Pascal Objet. La plupart des composants fournis sont crits en Pascal Objet. Vous pouvez ajouter la palette les composants que vous avez crits et la personnaliser votre convenance en insrant de nouveaux onglets. Vous pouvez galement recourir Delphi pour le dveloppement multiplateforme, sous Linux et Windows, en utilisant CLX. CLX contient un ensemble de classes qui, lorsque vous les utilisez la place de la VCL, permettent votre programme de passer indiffremment de Windows Linux.

Dveloppement dapplications
Alors mme que vous concevez visuellement linterface utilisateur dune application, Delphi gnre le code Object Pascal correspondant pour grer lapplication. D s que vous slectionnez et modifiez les proprits des composants et des fiches, le rsultat de ces modifications apparat automatiquement dans le code source, et vice-versa. Vous pouvez modifier directement les fichiers source avec tout diteur de texte, y compris lditeur de code intgr. Les modifications effectues dans le code sont immdiatement refltes dans lenvironnement visuel.

Cration des projets


Tout le dveloppement dapplications avec Delphi seffectue par le biais des projets. Quand vous crez une application dans Delphi vous crez un projet. Un projet est une collection de fichiers qui constituent une application. Certains de ces fichiers sont crs au cours de la conception. Dautres sont gnrs automatiquement lorsque vous compilez le code source du projet. Vous pouvez voir le contenu dun projet laide dun outil de gestion de projet nomm le Gestionnaire de projet. Le gestionnaire de projet prsente la liste, sous forme dune vue hirarchise, des noms dunits et des fiches contenues ventuellement dans chaque unit, ainsi que les chemins daccs aux fichiers du

Dveloppement dapplications avec Delphi

2-3

Dveloppement dapplications

projet. Vous pouvez modifier directement la plupart de ces fichiers, mais il est plus simple et plus sr dutiliser les outils visuels de Delphi. En haut de la hirarchie, se trouve un fichier groupe. Vous pouvez combiner plusieurs projets dans un groupe de projets. Cela vous permet douvrir plusieurs projets la fois dans le gestionnaire de projet. Les groupes de projets permettent de rassembler des projets lis et de travailler sur eux, par exemple des applications qui fonctionnent ensemble ou font partie dune application multiniveaux. Si vous ne travaillez que sur un seul projet, vous navez pas besoin de fichier groupe de projets pour crer une application. Les fichiers projet, qui dcrivent des projets individuels, des fichiers et des options associes, portent lextension .dpr. Les fichiers projet contiennent des directives pour la construction dune application ou dun objet partag. Quand vous ajoutez et supprimez des fichiers en utilisant le gestionnaire de projet, le fichier projet est mis jour. Vous spcifiez les options du projet dans le dialogue Options de projet, qui contient des onglets pour les divers aspects de votre projet, comme les fiches, lapplication, le compilateur. Ces options de projet sont stockes avec le projet dans le fichier projet. Les units et les fiches sont les blocs de base de la construction dune application Delphi. Un projet peut partager nimporte quel fichier fiche et unit existant, y compris ceux qui se trouvent hors de larborescence des rpertoires du projet. Cela inclut des procdures et des fonctions personnalises, crites sous forme de routines indpendantes. Si vous ajoutez un projet un fichier partag, celui-ci nest pas copi dans le rpertoire du projet en cours ; il reste sa place initiale. Lajout du fichier partag au projet en cours inscrit le nom et le chemin du fichier dans la clause uses du fichier projet. Delphi sen charge automatiquement lorsque vous ajoutez des units un projet Quand vous compilez un projet, lemplacement des fichiers qui constituent le projet n a aucune importance. Le compilateur traite les fichiers partags comme ceux crs par le projet lui-mme.

Edition du code
Lditeur de code Delphi est un diteur ASCII complet. Si vous utilisez lenvironnement de programmation visuel, une fiche est automatiquement affiche dans un nouveau projet. Vous pouvez commencer la conception de linterface de votre application en plaant des objets sur la fiche et en modifiant leur fonctionnement dans linspecteur dobjets. Mais dautres tches de programmation, comme lcriture des gestionnaires dvnements pour les objets, doivent se faire en tapant directement le code. Le contenu dune fiche et toutes ses proprits ainsi que ses composants et leurs proprits peuvent tre modifis sous forme de texte dans lditeur de code. Vous pouvez ajuster le code gnr dans lditeur de code et ajouter dautres composants en tapant du code dans lditeur. Au fur et mesure que vous tapez du code dans lditeur, le compilateur lanalyse constamment afin de changer la

2-4

Guide du dveloppeur

Dveloppement dapplications

disposition de la fiche. Vous pouvez revenir la fiche, voir et tester les changements apports dans lditeur, puis continuer modifier la fiche ellemme. La gnration de code Delphi et le systme de flux des proprits est entirement ouvert lexamen. Le code source de tout ce qui se trouve dans le fichier excutable final (tous les objets VCL, les objets CLX, les sources RTL et tous les fichiers projet Delphi) peut tre visualis et modifi dans lditeur de code.

Compilation des applications


Quand vous avez fini de concevoir linterface de votre application sur la fiche, aprs avoir crit le code supplmentaire souhait, vous pouvez compiler le projet depuis lEDI ou depuis la ligne de commande. Tous les projets ont comme cible un fichier excutable distribuable unique. Vous pouvez voir ou tester votre application divers stades du dveloppement en la compilant, la construisant ou lexcutant : Quand vous la compilez, seules les units qui ont chang depuis la dernire compilation sont recompiles. Quand vous la construisez, toutes les units du projet sont compiles, quelles aient ou non chang depuis la dernire compilation. Cette technique est utile quand vous ntes pas certain des fichiers qui ont t modifis ou quand vous voulez simplement garantir que tous les fichiers en cours soient synchroniss. Il est galement important de construire lapplication quand vous avez chang les directives globales du compilateur, afin dassurer que tout le code se compile de faon correcte. Vous pouvez tester ainsi la validit de votre code source, sans compiler le projet. Quand vous lexcutez, vous compilez lapplication, puis lexcutez. Si vous avez modifi le code source depuis la dernire compilation, le compilateur recompile les modules qui ont t changs et lie nouveau votre application. Si vous avez regroup ensemble plusieurs projets, vous pouvez compiler ou construire tous les projets du groupe en une seule fois. Choisissez Projet| Compiler tous les projets ou Projet|Construire tous les projets, le groupe de projets tant slectionn dans le gestionnaire de projet.

Dbogage des applications


Delphi dispose dun dbogueur intgr qui permet de localiser et de corriger les erreurs dune application. Le dbogueur intgr permet de contrler lexcution du programme, de surveiller la valeur de variables et dlments de structures de donnes ou de modifier la valeur de donnes lors de lexcution. Le dbogueur intgr peut suivre la fois les erreurs dexcution et les erreurs de logique. En excutant le programme jusqu un emplacement spcifique et en visualisant la valeur des variables, les fonctions de la pile des appels et les

Dveloppement dapplications avec Delphi

2-5

Dveloppement dapplications

sorties du programme, vous pouvez surveiller son comportement et trouver les endroits o il ne se comporte pas comme prvu. Le dbogueur est dcrit plus en dtail dans laide en ligne. Vous pouvez galement utiliser la gestion des exceptions pour connatre, localiser et traiter les erreurs. Les exceptions dans Delphi sont des classes, comme les autres classes de Delphi, sauf que, par convention, leur nom commence par E au lieu de T.

Dploiement des applications


Delphi dispose doutils facilitant le dploiement dune application. Par exemple, InstallShield Express (non disponible dans toutes les versions) vous aide crer un programme dinstallation pour votre application qui contient tous les fichiers ncessaires lexcution de lapplication distribue. Pour davantage dinformations sur le dploiement, voir chapitre 13, Dploiement des applications.
Remarque

Les versions de Delphi nont pas toutes des capacits de dploiement. Le logiciel TeamSource (non disponible dans toutes les versions) est galement utilisable disponible pour suivre les mises jour des applications.

2-6

Guide du dveloppeur

Chapitre

Chapitre 3

Utilisation des bibliothques de composants

Ce chapitre prsente les bibliothques de composants et dcrit certains composants que vous pouvez utiliser au cours du dveloppement de vos applications. Delphi comprend la fois la bibliothque de composants visuels (VCL) et la bibliothque de composants Borland multiplate-forme (CLX). La VCL est rserve au dveloppement Windows tandis que CLX permet le dveloppement multiplate-forme Windows et Linux. Ces deux bibliothques de classes sont diffrentes mais prsentent de nombreuses similarits. Les objets, proprits, mthodes et vnements qui ne font pas partie de CLX sont marqu s VCL seulement.

Prsentation des bibliothques de composants


VCL et CLX sont des bibliothques de classes constitu es de nombreux objets, dont certains sont galement des composants ou des contrles, que vous utilisez pour dvelopper des applications. Les deux bibliothques se ressemble beaucoup et contiennent de nombreux objets identiques. Certains objets de la VCL implmentent des fonctionnalits disponibles uniquement sous Windows, comme les objets qui apparaissent dans les onglets ADO, BDE, QReport, COM+, Services Web et Serveurs de la palette de composants. Pratiquement tous les objets CLX sont disponibles la fois pour Windows et pour Linux. Les objets VCL et CLX sont des entits actives qui contiennent toutes les donnes ncessaires ainsi que les mthodes (code) qui modifient ces donnes. Les donnes sont stockes dans les champs et les proprits des objets et le code est constitu de mthodes qui agissent sur les valeurs de ces champs et proprits. Chaque objet est dclar en tant que classe. Tous les objets VCL et CLX descendent de lobjet anctre TObject y compris ceux que vous dveloppez en Pascal Objet.

Utilisation des bibliothques de composants

3-1

Prsentation des bibliothques de composants

Les composants forment un sous-ensemble des objets. Les composants sont des objets que vous pouvez placer sur une fiche ou un module de donnes et manipuler pendant la conception. Les composants apparaissent sur la palette des composants. Vous pouvez spcifier leurs proprits sans crire de code. Tous les composants VCL ou CLX descendent de lobjet TComponent . Les composants sont des objets au vritable sens du terme programmation oriente objets (POO) car ils encapsulent des ensembles de donnes et des fonctions daccs aux donnes, ils hritent des donnes et du comportement des objets dont ils sont drivs, ils oprent de faon interchangeable avec dautres objets drivs dun anctre commun, par le biais dun concept appel polymorphisme. Contrairement la plupart des composants, les objets ne figurent pas sur la palette des composants. A la place, une variable dinstance par dfaut est dclare dans lunit de lobjet, sinon, vous devez en dclarer une vous-mme. Les contrles constituent un type spcial de composants, visibles aux utilisateurs lexcution. Cest un sous-ensemble des composants. Les contrles sont des composants visuels que vous pouvez voir lorsque votre application est excute. Les contrles ont des proprits en commun qui spcifient leurs attributs visuels, comme Height et Width. Les proprits, mthodes et vnements que partagent les contrles sont tous drivs de TControl. Reportez-vous au chapitre 10, Utilisation de CLX pour le dveloppement multiplate-forme , pour avoir des dtails sur la programmation multiplate-forme et connatre les diffrences entre les environnements Windows et Linux. Vous pouvez accder des informations dtailles sur tous les objets VCL ou CLX, en utilisant laide en ligne pendant que vous programmez. Dans lditeur de code, placez le curseur en un endroit quelconque de lobjet et appuyez sur F1 pour afficher de laide sur les composants VCL ou CLX. Si vous utilisez Kylix pour dvelopper des applications multiplates-formes, son Guide du dveloppeur est fait pour lenvironnement Linux. Vous pouvez consulter ce manuel dans laide en ligne de Kylix ou sur la version imprime livre avec Kylix.

Proprits, mthodes et vnements


VCL et CLX sont toutes deux une hirarchie dobjets, intgre lEDI de Delphi, qui vous permet de dvelopper rapidement des applications. Les objets des deux bibliothques sont bass sur des proprits, des mthodes et des vnements. Chaque objet contient des donnes membres (proprits), des fonctions qui oprent sur les donnes (mthodes) et un moyen dinteragir avec les utilisateurs des classes (vnements). La VCL est crite en Pascal Objet, alors que CLX est base sur Qt, une bibliothque de classes C++.

3-2

Guide du dveloppeur

Prsentation des bibliothques de composants

Proprits
Les Proprits sont les caractristiques dun objet, relatives son comportement visible ou aux oprations quil effectue. Par exemple, la proprit Visible dtermine si un objet doit tre vu ou non dans linterface dune application. Des proprits bien conues simplifient lutilisation de vos composants par dautres programmeurs et en facilite la maintenance. Voici quelques fonctionnalits utiles des proprits : Alors que les mthodes ne sont disponibles qu lexcution, vous pouvez accder aux proprits et les modifier au cours de la conception et obtenir une rponse immdiate des composants dans lEDI. Les proprits peuvent tre accdes via linspecteur dobjets dans lequel vous pouvez changer les valeurs visuellement. Dfinir les proprits au moment de la conception est plus simple qu crire directement le code, et ce dernier est plus facile maintenir. Comme les donnes sont encapsules, elles sont protges et prives pour lobjet rel. Les appels effectus pour obtenir ou dfinir des valeurs sont des mthodes, et donc le traitement reste invisible pour lutilisateur de lobjet. Par exemple, les donnes peuvent rsider dans une table, mais apparatre au programmeur comme des donnes membres normales. Vous pouvez implmenter la logique qui dclenche des vnements ou modifier dautres donnes pendant laccs la proprit. Par exemple, changer la valeur dune proprit peut ncessiter la modification dune autre. Vous pouvez effectuer ce changement dans les mthodes cres pour la proprit Les proprits peuvent tre virtuelles. Une proprit nest pas limite un seul objet. Changer une proprit dun objet peut affecter plusieurs autres objets. Par exemple, dfinir la proprit Checked dun bouton radio affecte tous les autres boutons radio du groupe.

Mthodes
Une mthode est une procdure qui est toujours associe une classe. Les mthodes dfinissent le comportement dun objet. Les mthodes de classe peuvent accder toutes les proprits publiques, protges et prives et aux donnes membres de la classe, on les dsigne frquemment par le terme fonctions membres.

Evnements
Un vnement est une action ou une occurrence dtecte par un programme. La plupart des applications modernes sont dites pilotes par vnements, car elles sont conues pour rpondre des vnements. Dans un programme, le programmeur na aucun moyen de prvoir la squence exacte des actions que va entreprendre lutilisateur. Il peut choisir un lment de menu, cliquer sur un bouton ou slectionner du texte. Vous allez donc crire le code qui gre chacun

Utilisation des bibliothques de composants

3-3

Pascal Objet et les bibliothques de classes

des vnements qui vous intressent au lieu dcrire du code sexcutant toujours selon le mme ordre. Quelle que soit la faon dont un vnement a t appel, Delphi recherche si du code a t crit pour grer cet vnement. Si cest le cas, ce code est excut, sinon, le comportement par dfaut se produit. Les types dvnements qui peuvent survenir se divisent en deux grandes catgories : Evnements utilisateur Evnements systme Quelle que soit la faon dont lvnement a t appel, Delphi recherche si vous avez crit du code pour grer cet vnement. Si cest le cas, ce code est excut, sinon rien ne se passe.

Evnements utilisateur
Les vnements utilisateur sont des actions inities par lutilisateur. Les vnements utilisateur sont, par exemple, OnClick (lutilisateur a cliqu avec la souris), OnKeyPress (lutilisateur a appuy sur une touche du clavier) et OnDblClick (lutilisateur a double-cliqu sur un bouton de la souris). Ces vnements sont toujours rattachs une action de lutilisateur.

Evnements systme
Ce sont des vnements que le systme dexploitation dclenche pour vous. Par exemple, lvnement OnTimer (le composant Timer dclenche lun de ces vnements lorsquun intervalle prdfini sest coul), lvnement OnCreate (le composant est en train dtre cr), lvnement OnPaint (un composant ou une fentre a besoin dtre redessin), etc. En rgle gnrale, ces vnements ne sont pas directement dclenchs par des actions de lutilisateur.

Pascal Objet et les bibliothques de classes


Le Pascal Objet, qui est constitu dun ensemble dextensions orientes objet du Pascal standard, est le langage de Delphi. En utilisant la palette des composants Delphi et linspecteur dobjets, vous pouvez placer des composants VCL ou CLX dans des fiches et manipuler leurs proprits sans crire de code. Tous les objets VCL descendent de TObject qui est une classe abstraite dont les mthodes encapsulent des comportements essentiels comme la construction, la destruction et la gestion des messages. TObject est lanctre immdiat de nombreuses classes simples. Les composants de la VCL descendent de la classe abstraite TComponent . Les composants sont des objets que vous pouvez manipuler dans les fiches la conception. Les composants visuels, cest--dire ceux qui comme TForm ou TSpeedButton apparaissent lcran lors de lexcution, sont appels des contrles et descendent de TControl.

3-4

Guide du dveloppeur

Pascal Objet et les bibliothques de classes

En plus des composants visuels, les bibliothques de composants contiennent de nombreux objets non visuels. LEDI vous permet dajouter de nombreux composants non-visuels vos programmes en les dposant dans les fiches. Si, par exemple, vous crivez une application qui se connecte une base de donnes, vous pouvez placer un composant TDataSource dans une fiche. Mme si TDataSource est non-visuel, il est reprsent dans la fiche par une icne qui napparat pas lexcution. Vous pouvez manipuler les proprits et vnements de TDataSource laide de linspecteur dobjets comme pour un contrle visuel. Quand vous crivez vos propres classes en Pascal Objet, elles doivent descendre de TObject dans la bibliothque de classes que vous prvoyez utiliser. Utilisez VCL si vous crivez une application Windows ou CLX si vous crivez une application multiplate-forme. En drivant de nouvelles classes partir de la classe de base approprie (ou de lun de ses descendants), vous fournissez vos classes des fonctionnalits essentielles tout en garantissant quelles peuvent fonctionner avec les autres classes de la bibliothque des classes.

Utilisation du modle objet


La programmation oriente objet (POO) est une extension de la programmation structure qui intensifie la rutilisation du code et lencapsulation de donnes avec des fonctionnalits. Quand vous avez cr un objet (ou, plus prcisment, une classe), vous et dautres programmeurs pouvez lutiliser dans dautres applications ce qui rduit les temps de dveloppement et accrot la productivit. Pour crer de nouveaux composants et les placer dans la palette de composants, voir chapitre 40, Prsentation gnrale de la cration dun composant.

Quest-ce quun objet ?


Un objet, ou classe, est un type de donnes qui encapsule des donnes et des oprations sur ces donn es. Avant la programmation oriente objet, les donnes et les oprations (les fonctions) constituaient des lments distincts. Vous pouvez commencer comprendre les objets si vous comprenez les enregistrements Pascal Objet ou les structures C. Les enregistrements sont constitus de champs qui contiennent des donnes, chaque champ ayant son propre type. Les enregistrements sont un moyen commode de dsigner une collection lments de donnes varis. Les objets sont galement des collections dlments de donnes. Mais les objets, la diffrence des enregistrements, contiennent des procdures et fonctions portant sur leurs donnes. Ces procdures et fonctions sont appeles des mthodes. Les lments de donnes dun objet sont accessibles via des proprits. Les proprits des objets VCL ou CLX ont une valeur qu il est possible de modifier la conception sans crire de code. Si vous voulez modifier la valeur dune proprit lexcution, il vous suffit dcrire un minimum de code.

Utilisation des bibliothques de composants

3-5

Pascal Objet et les bibliothques de classes

La combinaison des donnes et de fonctionnalits dans un seul lment est appele encapsulation. Outre lencapsulation, la programmation oriente objet est caractrise par lhritage et le polymorphisme. Hritage signifie que les objets drivent leurs fonctionnalits dautres objets (appels anctres) ; les objets peuvent modifier leurs comportements hrits. Polymorphisme signifie que diffrents objets qui drivent dun mme anctre grent la mme interface de mthode et de proprit, on dit aussi quils sont interchangeables.

Examen dun objet Delphi


Quand vous crez un nouveau projet, Delphi affiche une nouvelle fiche que vous pouvez personnaliser. Dans lditeur de code, Delphi dclare un nouveau type de classe pour la fiche et gnre le code qui cre la nouvelle instance de fiche. Le code gnr pour une nouvelle application Windows ressemble ceci :
unit Unit1; interface uses Windows, Classes, Graphics, Forms, Controls, Dialogs; type TForm1 = class(TForm) { La dclaration de type de la fiche commence ici } private { Dclarations prives } public { Dclarations publiques } end; { La dclaration de type de la fiche sarrte ici } var Form1: TForm1; implementation { Dbut de la partie implmentation } {$R *.DFM} end.{ Fin de la partie implmentation et de lunit }

Le nouveau type de classe est TForm1, il drive du type TForm qui est galement une classe. Une classe ressemble un enregistrement car tous les deux contiennent des champs de donnes, mais une classe contient galement des mthodes (du code agissant sur les donnes de lobjet). Pour le moment, TForm1 semble ne contenir ni champs, ni mthodes car vous navez ajout la fiche aucun composant (les champs du nouvel objet) et vous navez pas cr de gestionnaires dvnements (les mthodes du nouvel objet). TForm1 contient les champs et mthodes hrits mme sils napparaissent pas dans la dclaration de type. La dclaration de variable suivante dclare une variable nomme Form1 ayant le nouveau type TForm1.
var Form1: TForm1;

Form1 reprsente une instance, ou objet, du type de classe TForm1. Vous pouvez dclarer plusieurs instances dun type de classe ; par exemple, pour crer plusieurs fentres enfant dans une application utilisant linterface dune application documents multiples (MDI). Chaque instance a ses donnes propres, mais elle utilise le mme code pour excuter les mthodes.

3-6

Guide du dveloppeur

Pascal Objet et les bibliothques de classes

Mme si vous navez ajout aucun composant la fiche ni crit de code, vous disposez dj dune application Delphi que vous pouvez compiler et excuter. Elle se contente dafficher une fiche vide. Vous pouvez alors ajouter un composant bouton la fiche et crire un gestionnaire dvnement OnClick qui modifie la couleur de la fiche quand lutilisateur clique sur le bouton. Le rsultat a laspect suivant :
Figure 3.1 Une fiche simple

Quand lutilisateur clique sur le bouton, la couleur de la fiche passe au vert. Voici le code du gestionnaire dvnement pour lvnement OnClick du bouton :
procedure TForm1.Button1Click(Sender: TObject); begin Form1.Color := clGreen; end;

Un objet peut contenir dautres objets dans ses champs de donnes. A chaque fois que vous placez un composant dans une fiche, un nouveau champ apparat dans la dclaration de type de la fiche. Si vous crez lapplication qui vient dtre dcrite, et examinez le code dans lditeur de code, vous trouvez :
unit Unit1; interface uses Windows, Classes, Graphics, Forms, Controls; type TForm1 = class(TForm) Button1: TButton;{ Nouveau champ de donnes } procedure Button1Click(Sender: TObject);{ Nouvelle dclaration de mthode } private { Dclarations prives } public { Dclarations publiques } end; var Form1: TForm1; implementation {$R *.DFM}

Utilisation des bibliothques de composants

3-7

Pascal Objet et les bibliothques de classes

procedure TForm1.Button1Click(Sender: TObject);{ Le code de la nouvelle mthode } begin Form1.Color := clGreen; end; end.

TForm1 possde un champ Button1 qui correspond au bouton que vous avez ajout la fiche. TButton est du type classe, de sorte que Button1 fait rfrence un objet. Tous les gestionnaires dvnements que vous crivez dans Delphi sont des mthodes de lobjet fiche. Chaque fois que vous crez un gestionnaire dvnement, une mthode est dclare dans le type de lobjet fiche. Le type TForm1 contient maintenant une nouvelle mthode, la procdure Button1Click, dclare lintrieur de la dclaration de type de TForm1. Le code qui implmente la mthode Button1Click apparat dans la partie implementation de lunit.

Modification du nom dun composant


Vous devez toujours utiliser linspecteur dobjet pour modifier le nom dun composant. Par exemple, vous pouvez changer le nom par dfaut de la fiche Form1 pour lui donner un nom plus parlant, comme ColorBox. Quand vous modifiez la valeur de la proprit Name de la fiche dans linspecteur dobjets, le nouveau nom est automatiquement reflt dans le fichier .dfm ou .xfm de la fiche (que vous ne devez gnralement pas modifier directement) et dans le code source Pascal Objet gnr par Delphi :
unit Unit1; interface uses Windows, Classes, Graphics, Forms, Controls; type TColorBox = class(TForm){ remplacement de TForm1 par TColorBox } Button1: TButton; procedure Button1Click(Sender: TObject); private { Dclarations prives } public { Dclarations publiques } end; var ColorBox: TColorBox;{ Remplacement de Form1 par ColorBox } implementation {$R *.DFM} procedure TColorBox.Button1Click(Sender: TObject); begin Form1.Color := clGreen;{ La rfrence Form1 na pas t actualise ! } end; end.

3-8

Guide du dveloppeur

Pascal Objet et les bibliothques de classes

Remarquez que le code du gestionnaire dvnement OnClick du bouton na pas t modifi. Comme vous avez crit le code, vous devez le mettre jour et corriger les rfrences la fiche vous-mme :
procedure TColorBox.Button1Click(Sender: TObject); begin ColorBox.Color := clGreen; end;

Hritage des donnes et du code dun objet


Lobjet TForm1 dcrit parat simple. TForm1 semble ne contenir quun seul champ (Button1), une mthode (Button1Click) et aucune proprit. Vous pouvez nanmoins afficher, masquer et redimensionner la fiche, ajouter ou retirer les icnes standard en haut de la fiche ou la configurer pour quelle fasse partie dune application interface de document multiple (MDI). Vous pouvez faire tout cela car la fiche a hrit de toutes les proprits et mthodes du composant VCL TForm. Quand vous ajoutez une nouvelle fiche votre projet, vous partez de TForm que vous personnalisez en lui ajoutant des composants, en modifiant la valeur des proprits et en crivant des gestionnaires dvnements. Pour personnaliser un objet, il faut dabord driver un nouvel objet dun objet existant ; quand vous ajoutez une nouvelle fiche un projet, Delphi drive automatiquement une nouvelle fiche du type TForm :
TForm1 = class(TForm)

Un objet driv hrite de toutes les proprits, vnements et mthodes de lobjet dont il drive. Lobjet driv est appel un descendant et lobjet dont il drive est appel son anctre. Si vous recherchez TForm dans laide en ligne, vous trouverez la liste de ses proprits, vnements et mthodes, y compris ceux que TForm a hrit de ses anctres. Un objet ne peut avoir quun seul anctre immdiat, mais il peut avoir plusieurs descendants directs.

Porte et qualificateurs
La porte dtermine laccessibilit des champs, proprits et mthodes dun objet. Tous les membres dclars par un objet sont accessibles dans lobjet et dans ses descendants. Mme si le code dimplmentation dune mthode apparat hors de la dclaration de lobjet, la mthode reste dans la porte de lobjet car elle est dclare dans la dclaration de lobjet. Quand vous crivez du code pour implmenter une mthode qui dsigne les proprits, mthodes ou champs de lobjet dans lequel la mthode est dclare, vous navez pas besoin de prfixer ces identificateurs avec le nom de lobjet. Si, par exemple, vous placez un bouton dans une nouvelle fiche, vous pouvez crire le gestionnaire dvnement suivant pour lvnement OnClick du bouton :
procedure TForm1.Button1Click(Sender: TObject); begin Color := clFuchsia; Button1.Color := clLime; end;

Utilisation des bibliothques de composants

3-9

Pascal Objet et les bibliothques de classes

La premire instruction est quivalente :


Form1.Color := clFuchsia

Il nest pas ncessaire de qualifier Color avec Form1 car la mthode Button1Click fait partie de TForm1 ; les identificateurs placs dans la mthode sont alors dans la porte de linstance de TForm1 o la mthode a t dclare. Par contre, la seconde instruction dsigne la couleur de lobjet bouton, pas celle de la fiche dans laquelle le gestionnaire dvnement est dclar, elle doit donc tre qualifie. Delphi cre un fichier unit spar (du code source) pour chaque fiche. Si vous souhaitez accder aux composants dune fiche depuis le fichier unit dune autre fiche, vous devez qualifier les noms de composants de la manire suivante :
Form2.Edit1.Color := clLime;

De la mme manire, vous pouvez accder aux mthodes dun composant dune autre fiche. Par exemple,
Form2.Edit1.Clear;

Pour accder aux composants de Form2 depuis le ficher unit de Form1, vous devez galement ajouter lunit de Form2 la clause uses de lunit de Form1. La porte dun objet stend aux descendants de lobjet. Vous pouvez nanmoins redclarer un champ, une proprit ou une mthode dans un objet descendant. De telles redclarations masquent ou surchargent le membre hrit. Pour davantage dinformations sur la porte, lhritage et la clause uses, voir le Guide du langage Pascal Objet.

Dclarations prives, protges, publiques et publies


Quand vous dclarez un champ, une proprit ou une mthode, la visibilit du nouveau membre est indique par lun des mots-cls suivants : private, protected, public ou published. La visibilit dun membre dtermine son accessibilit par dautres objets et units. Un membre priv (private) est accessible uniquement dans lunit dans laquelle il a t dclar. Les membres privs sont souvent utiliss dans une classe pour implmenter dautres mthodes et proprits (publiques ou publies). Un membre protg (protected) est accessible dans lunit dans laquelle la classe est dclare et dans toute classe descendante, quelle que soit lunit de la classe du descendant. Un membre public (public) est accessible partout o lobjet auquel il appartient est accessible, cest--dire dans lunit dans laquelle la classe est dclare et dans toute unit utilisant cette unit. Un membre publi (published) a la mme visibilit quun membre public mais le compilateur gnre des informations de type lexcution pour les membres publis. Les proprits publies apparaissent dans linspecteur dobjets la conception.

3-10

Guide du dveloppeur

Pascal Objet et les bibliothques de classes

Pour davantage dinformations sur la visibilit, voir le Guide du langage Pascal Objet.

Utilisation de variables objet


Vous pouvez affecter une variable objet une autre variable objet si ces variables sont de mme type ou de types compatibles pour laffectation. En particulier, vous pouvez affecter une variable objet une autre variable objet si le type de la variable affecte est un anctre du type de la variable qui est affecte. Par exemple, voici la dclaration du type TDataForm (VCL seulement) et une section dclaration de variables dans laquelle deux variables sont dclares, AForm et DataForm :
type TDataForm = class(TForm) Button1: TButton; Edit1: TEdit; DataGrid1: TDataGrid; Database1: TDatabase; private { Dclarations prives } public { Dclarations publiques } end; var AForm: TForm; DataForm: TDataForm;

AForm est de type TForm et DataForm est de type TDataForm. Comme TDataForm est un descendant de TForm, linstruction daffectation suivante est lgale :
AForm := DataForm;

Supposez que vous remplissiez le gestionnaire dvnement de lvnement OnClick dun bouton. Quand le bouton est choisi, le gestionnaire dvnement de lvnement OnClick est appel. Chaque gestionnaire dvnement a un paramtre Sender de type TObject :
procedure TForm1.Button1Click(Sender: TObject); begin end;

Comme Sender est de type TObject, tout objet peut tre affect Sender. La valeur de Sender est toujours le contrle ou le composant qui rpond lvnement. Vous pouvez tester Sender pour dterminer le type du composant ou du contrle qui a appel le gestionnaire dvnement en utilisant le mot rserv is. Par exemple,
if Sender is TEdit then FaireQuelqueChose else FaireAutreChose;

Utilisation des bibliothques de composants

3-11

Pascal Objet et les bibliothques de classes

Cration, instanciation et destruction dobjets


La plupart des objets que vous utilisez dans Delphi sont des composants qui, comme les boutons ou les zones de saisie, apparaissent la conception et lexcution. Certains, comme les botes de dialogue standard, apparaissent uniquement lexcution. D autres, comme les composants timer ou source de donnes, nont pas de reprsentation visuelle dans lapplication lexcution. Vous pouvez tre amen crer vos propres objets. Vous pouvez, par exemple, crer un objet TEmployee contenant les champs Name, Title et HourlyPayRate. Vous pouvez ensuite lui ajouter la mthode CalculatePay qui utilise les donnes du champ HourlyPayRate pour calculer le montant de la paye. La dclaration du type TEmployee peut prendre la forme suivante :
type TEmployee = class(TObject) private FName: string; FTitle: string; FHourlyPayRate: Double; public property Name: string read FName write FName; property Title: string read FTitle write FTitle; property HourlyPayRate: Double read FHourlyPayRate write FHourlyPayRate; function CalculatePay: Double; end;

Outre les champs, proprits et mthodes que vous avez dfini, TEmployee hrite de toutes les mthodes de TObject. Vous pouvez placer une dclaration de type comme celle-ci dans la partie interface ou dans la partie implementation dune unit et crer des instances de la nouvelle classe en appelant la mthode Create que TEmployee hrite de TObject :
var Employee: TEmployee; begin Employee := TEmployee.Create; end;

La mthode Create est appele un constructeur. Elle alloue la mmoire pour un objet nouvellement instanci et renvoie une rfrence sur lobjet. Les composants dune fiche sont crs et dtruits automatiquement par Delphi. Mais si vous crivez votre propre code pour instancier des objets, vous tes responsable de leur libration. Chaque objet hrite de TObject une mthode Destroy (appele un destructeur). Nanmoins, pour dtruire un objet, vous devez toujours appeler la mthode Free (galement hrite de TObject ) car Free cherche une rfrence nil avant dappeler Destroy. Par exemple,
Employee.Free

dtruit lobjet Employee et libre sa mmoire.

3-12

Guide du dveloppeur

Objets, composants et contrles

Composants et appartenance
Delphi dispose dun mcanisme intgr de gestion de la mmoire qui permet un composant dtre responsable de la libration dun autre composant. On dit que le premier est propritaire du second. La mmoire dun composant appartenant un autre est automatiquement libre quand la mmoire du propritaire est libre. Le propritaire dun composant (valeur de sa proprit Owner) est dtermin par un paramtre transmis au constructeur lors de la cration du composant. Par dfaut, une fiche possde tous les composants placs dedans et elle-mme appartient lapplication. Ainsi, quand lapplication est arrte, la mmoire de toutes les fiches et de leurs composants est libre. La proprit sapplique uniquement TComponent et ses descendants. Si vous crez un objet TStringList ou TCollection (mme sil est associ une fiche), cest vous de librer lobjet.
Remarque

Ne confondez pas le propritaire dun composant avec son parent. Voir Proprits du parent la page 3-21.

Objets, composants et contrles


Le diagramme suivant est une vue trs simplifie de la hirarchie des hritages qui illustre les relations entre objets, composants et contrles.
Figure 3.2 Objets, composants et contrles
TObject

TComponent

TControl

TForm

TButton

TCheckBox

TListBox

Chaque objet hrite de TObject et beaucoup dobjets hritent de TComponent. Les contrles, qui hritent de TControl, ont la capacit safficher eux-mmes lexcution. Un contrle comme TCheckBox hrite de toutes les fonctionnalits de TObject, TComponent et de TControl, et ajoute ses spcificits propres. Le diagramme suivant est un rsum de la bibliothque de composants visuels (VCL) qui montre les principales branches de larbre dhritage. La bibliothque de composants Borland multiplate-forme (CLX) lui ressemble beaucoup ce niveau, mais TWinControl est remplac par TWidgetControl.

Utilisation des bibliothques de composants

3-13

Objets, composants et contrles

Figure 3.3

Diagramme simplifi de la hirarchie

Plusieurs importantes classes de base montres dans la figure sont dcrites dans le tableau suivant :
Tableau 3.1 Classe
TObject

Importantes classes de base Description


Cest la classe de base et lanctre ultime de tout ce qui se trouve dans la VCL ou dans CLX. TObject encapsule le comportement fondamental commun tous les objets VCL/ CLX, en introduisant les mthodes qui effectuent les fonctions de base, comme la cration, la maintenance et la destruction dune instance dobjet. Spcifie la classe de base de toutes les classes relatives aux exceptions. Exception fournit une interface cohrente pour les conditions derreur et permet aux applications de les grer harmonieusement. Spcifie la classe de base de tous les objets qui implmentent des proprits. Les classes issues de TPersistent prennent en charge lenvoi de donnes aux flux et permettent laffectation des classes. Spcifie la classe de base de tous les composants non visuels, comme TApplication. TComponent est lanctre commun de tous les composants. Cette classe permet un composant de figurer sur la palette des composants, de possder dautres composants et dtre manipul directement sur une fiche. Reprsente la classe de base de tous les contrles visibles lexcution. TControl est lanctre commun de tous les composants visuels et fournit les contrles visuels standard comme la position et le curseur. Cette classe fournit galement des vnements qui rpondent aux actions de la souris. Spcifie la classe de base de tous les objets dinterface utilisateur, appels galement widgets. Les contrles issus de TWinControl sont des contrles fentrs qui peuvent capturer la saisie au clavier. (Dans CLX, TWidgetControl remplace TWinControl.)

Exception

TPersistent

TComponent

TControl

TWinControl

Les quelques sections suivantes prsentent une description gnrale des types de classes que contient chaque branche. Pour avoir une prsentation complte de la hirarchie des objets VCL, reportez-vous au poster VCL fourni avec ce produit. Pour avoir des dtails sur CLX, reportez-vous au poster sur la hirarchie des objets CLX, fourni avec ce produit, et la documentation Kylix.

3-14

Guide du dveloppeur

Objets, composants et contrles

Branche TObject
La branche TObject comprend tous les objets qui descendent de TObject mais non de TPersistent. Tous les objets VCL ou CLX descendent de TObject, une classe abstraite dont les mthodes dfinissent des comportements fondamentaux comme la construction, la destruction et la gestion des messages ou des vnements systme. Lessentiel des capacits des objets VCL et CLX est bas sur les mthodes dfinies dans TObject. TObjectencapsule le comportement fondamental commun tous les objets VCL ou CLX, en introduisant des mthodes qui permettent : De rpondre la cration ou la destruction dinstances dobjets. De donner des informations sur le type de classe et dinstance dun objet et des informations de type lexcution (RTTI) sur ses proprits publies. La gestion des messages (VCL seulement). TObject est lanctre immdiat de nombreuses classes simples. Les classes contenues dans cette branche ont une caractristique commune importante : elles sont transitoires. Cela signifie que ces classes ne disposent pas dune mthode pour enregistrer leur tat avant leur destruction ; elles ne sont pas persistantes. Le groupe de classes le plus important de cette branche est constitu par la classe Exception. Cette classe propose un grand nombre de classes dexceptions prdfinies pour grer automatiquement de nombreuses conditions dexception comme les erreurs de division par zro, les erreurs dentres/sorties ou les transtypages incorrects. La branche TObject contient galement un autre groupe de classes qui encapsulent des structures de donnes, comme : TBits, une classe qui stocke un tableau de valeur boolennes. TList, une classe liste lie. TStack, une classe qui gre un tableau de pointeurs du type dernier entr, premier sorti. TQueue, une classe qui gre un tableau de pointeurs du type premier entr, premier sorti. Dans la VCL, vous trouverez aussi des enveloppes pour les objets externes comme TPrinter, qui encapsule linterface imprimante Windows, et TRegistry, une enveloppe de bas niveau pour le registre du systme et les fonctions qui oprent sur le registre. Elles sont spcifiques lenvironnement Windows. TStream est un bon exemple du type de classes contenues dans cette branche. TStream est la classe de base des objets flux qui permettent de lire ou dcrire sur divers types de support de donnes, comme les fichiers disque ou la mmoire vive. Comme vous pouvez le voir, cette branche contient un grand nombre de diffrents types de classes particulirement utiles pour le dveloppeur.

Utilisation des bibliothques de composants

3-15

Objets, composants et contrles

Branche TPersistent
Les objets de cette branche de VCL et de CLX descendent de TPersistent mais pas de TComponent. TPersistent ajoute aux objets la persistance. La persistance dtermine ce qui est enregistr dans un fichier fiche ou un module de donnes et ce qui est charg dans la fiche ou le module de donnes lorsqu il est extrait de la mmoire. Les objets de cette branche implmentent des proprits pour les composants. Les proprits sont uniquement chargs et enregistrs avec une fiche si elles ont un propritaire. Le propritaire doit tre un composant. Cette branche introduit la fonction GetOwner qui vous permet de dterminer le propritaire de la proprit. Les objets de cette branche sont galement les premiers inclure une section publie dans laquelle les proprits peuvent tre automatiquement charges et enregistres. Un mthode DefineProperties vous permet aussi dindiquer la faon de charger et denregistrer les proprits. Voici quelques autres classes de la branche TPersistent de la hirarchie : TGraphicsObject, une classe de base abstraite pour les objets graphiques, par exemple : TBrush, TFont et TPen. TGraphic, une classe de base abstraite pour les objets comme les icnes et les bitmaps qui peuvent stocker et afficher des images visuelles, par exemple : TBitmap et TIcon (et pour le dveloppement Windows seulement : TMetafile). TStrings, une classe de base pour les objets qui reprsentent une liste de chanes. TClipboard, une classe contenant du texte ou des graphiques qui ont t coups ou copis dune application. TCollection, TOwnedCollection et TCollectionItem, classes qui maintiennent les collections indexs dlments spcialement dfinis.

Branche TComponent
La branche TComponent contient des objets qui descendent de TComponent mais pas de TControl. Les objets de cette branche sont des composants que vous pouvez manipuler sur des fiches au cours de la conception. Ce sont des objets persistants aux capacits suivantes : Ils apparaissent dans la palette des composants et peuvent tre modifis dans le concepteur de fiche. Ils peuvent possder et grer dautres composants. Ils se chargent et senregistrent eux-mmes. Plusieurs mthodes de TComponent dictent la faon dont agissent les composants durant la conception et les informations qui sont enregistres avec le composant. La gestion des flux est introduite dans cette branche de la VCL et de CLX. Delphi gre automatiquement la plupart des oprations principales relatives aux

3-16

Guide du dveloppeur

Objets, composants et contrles

flux. Les proprits sont persistantes si elles sont publies et les proprits publies sont automatiquement mises en flux. La classe TComponent introduit galement le concept de possession (proprit) qui se propage dans la VCL et dans CLX. Deux proprits supportent la possession (proprit) : Owner et Components. Chaque composant dispose dune proprit Owner qui rfrence un autre composant comme sont propritaire. Un composant peut possder dautres composants. Dans ce cas, tous les composants possds sont rfrencs dans la proprit Array du composant. Le constructeur dun composant prend un seul paramtre qui est utilis pour spcifier le propritaire du nouveau composant. Si le propritaire transmis existe, le nouveau composant est ajout la liste des composants du propritaire. Outre la liste des composants, pour rfrencer les composants possds, cette proprit fournit la destruction automatique des composants possds. Si le composant a un propritaire, il est dtruit lorsque le propritaire est dtruit. Par exemple, comme TForm est un descendant de TComponent, tous les composants possds par la fiche sont dtruits, et leur emplacement en mmoire libr, lorsque la fiche est dtruite. Cela garantit que tous les composants de la fiche se nettoient euxmmes correctement lorsque leurs destructeurs sont appels. Si un type de proprit est TComponent ou un de ses descendants, le systme de flux cre une instance de ce type lorsquil le lit. Si un type de proprit est TPersistent mais pas TComponent, le systme de flux utilise linstance existante, accessible via la proprit, et lit les valeurs des proprits de cette instance. Quand il cre un fichier fiche (fichier utilis pour stocker les informations relatives aux composants de la fiche), le concepteur de fiche parcourt le tableau de ses composants et enregistre tous les composants dans la fiche. Chaque composant sait comment crire dans un flux (dans ce cas, un fichier texte) ses proprits modifies. Paralllement, lorsquil charge les proprits des composants du fichier fiche, le concepteur de fiche parcourt le tableau des composants et charge chacun deux. Cette branche contient, entre autres, les types de classes suivants : TMainMenu, une classe qui dfinit une barre de menus et les menus droulants associs dans une fiche. TTimer, une classe qui inclut les fonctions de timer. TOpenDialog, TSaveDialog, TFontDialog, TFindDialog, TColorDialog, etc., fournissent les botes de dialogues communes. TActionList, une classe qui gre une liste dactions utilises par des composants et des contrles, comme les lments de menu et les boutons. TScreen, une classe qui mmorise les fiches et les modules de donnes instancis par lapplication, la fiche active et le contrle actif dans cette fiche, la taille et la rsolution de lcran, ainsi que les curseurs et les fontes utilisables par lapplication. Les composants qui nont pas besoin dinterface visuelle peuvent tre directement drivs de TComponent. Pour faire un outil tel quun priphrique TTimer, vous devez le driver de TComponent. Ce type de composant se trouve sur la palette des composants, mais excute des fonctions internes accessibles par le code et qui napparaissent pas, lexcution, dans linterface utilisateur.

Utilisation des bibliothques de composants

3-17

Objets, composants et contrles

Dans CLX, la branche TComponent contient aussi THandleComponent. Cest la classe de base des composants non visuels qui ncessitent un handle sur un objet Qt sous-jacent, comme les dialogues et les menus.

Branche TControl
La branche TControl est constitue de composants qui descendent de TControl mais pas de TWinControl (TWidgetControl dans CLX). Les objets de cette branche sont des contrles, cest--dire des objets visuels que lutilisateur de lapplication peut voir et manipuler lexcution. Tous les contrles ont des proprits, mthodes et vnements communs qui sont propres laspect visuel des contrles, comme la position du contrle, le curseur associ la fentre (au widget dans CLX) du contrle, des mthodes pour dessiner ou dplacer le contrle et des vnements permettant de rpondre aux actions de la souris. Ils ne peuvent jamais recevoir la saisie du clavier. Si TComponent dfinit des comportements communs tous les composants, TControl dfinit ceux communs tous les contrles visuels. Il sagit de routines de dessin, des vnements standard et de la notion de conteneur. Les contrles sont de deux types : Ceux qui ont leur propre fentre (ou widget) Ceux qui utilisent la fentre (ou le widget) de leur parent Les contrles qui ont leur propre fentre sont appels contrles fentrs (VCL) ou bass sur des widgets (CLX) et descendent de TWinControl (TWidgetControl dans CLX). Les boutons et les cases cocher en font partie. Les contrles qui utilisent une fentre (ou un widget) parent sont appels contrles graphiques et descendent de TGraphicControl. Les contrles image et libell en font partie. Dans la VCL, la principale diffrence entre ces types de composants est que les contrles graphiques nont pas de handle de fentre et ne peuvent donc pas recevoir la focalisation ni contenir dautres contrles. Dans CLX, la principale diffrence entre ces types de composants est que les contrles graphiques ne possdent pas de widget associ et ne peuvent donc pas recevoir la focalisation ni contenir dautres contrles. Comme un contrle graphique na pas besoin de handle, ses exigences en ressources systme sont moindre et le dessin dun graphique est plus rapide que celui dun contrle bas sur un widget. Les contrles TGraphicControl doivent se dessiner eux-mmes et comprennent :
Tableau 3.2 Contr le
TImage TLabel TBevel TPaintBox

Contrles graphiques Description


Affiche des images. Affiche du texte dans une fiche. Reprsente un contour biseaut. Propose un canevas dans lequel les applications peuvent dessiner ou restituer une image.

3-18

Guide du dveloppeur

Objets, composants et contrles

Ces classes contiennent les routines de dessin courantes (Repaint, Invalidate, etc.) qui ne peuvent pas recevoir la focalisation.

Branche TWinControl/TWidgetControl
La branche TWinControl (TWidgetControl remplace TWinControl dans CLX) contient tous les contrles qui descendent de TWinControl. TWinControl est la classe de base de tous les contrles fentrs, qui reprsentent un grand nombre des lments que vous utilisez dans linterface utilisateur dune application. TWidgetControl est la classe de base de tous les contrles bass sur des widgets ou widgets. Le terme widget est une combinaison de window (fentre) et de gadget. Pratiquement tout ce que vous utilisez dans linterface utilisateur dune application est un widget. Par exemple, les boutons, les libells et les barres de dfilement. Voici les caractristiques des contrles fentrs et des widgets : Les deux peuvent recevoir la focalisation pendant lexcution de lapplication. Les autres contrles peuvent afficher des donnes mais lutilisateur peut utiliser le clavier pour interagir avec un contrle fentr ou avec un contrle bas sur un widget. Les contrles fentrs ou bass sur des widgets peuvent contenir dautres contrles. Un contrle qui contient dautres contrles est un parent. Seul un contrle fentr ou bas sur un widget peut tre le parent dun ou de plusieurs contrles enfants. Les contrles fentrs disposent dun handle de fentre. Les contrles bass sur des widgets sont associs un widget. Les descendants de TWinControl (TWidgetControl dans CLX) sont des contrles qui peuvent recevoir la focalisation, cest--dire quils peuvent recevoir la saisie au clavier de lutilisateur de lapplication. Cela signifie que beaucoup plus dvnements standard sappliquent eux. Cette branche contient aussi bien les contrles dessins automatiquement (TEdit, TListBox, TComboBox, TPageControl, etc.) et des contrles personnaliss que Delphi doit dessiner (par exemple TDBNavigator, TMediaPlayer (VCL seulement), TGauge (VCL seulement), etc.). Les descendants directs de TWinControl (TWidgetControl dans CLX) implmentent typiquement des contrles standard, comme un champ ddition, une bote option ou un contrle page, et savent donc dj comment se dessiner eux-mmes. La classe TCustomControl est fournie pour les composants qui ncessitent un handle mais nencapsulent pas de contrle standard ayant la capacit de se redessiner lui-mme. Vous navez jamais vous soucier de la faon dont les contrles saffichent ou rpondent aux vnements Delphi encapsule compltement ce comportement pour vous. Les sections suivantes prsentent les contrles. Reportez-vous au chapitre 7, Manipulation des contrles, pour plus dinformations sur lutilisation des contrles.

Utilisation des bibliothques de composants

3-19

Objets, composants et contrles

Proprits communes TControl


Tous les contrles visuels (descendants de TControl) partagent certaines proprits, entre autres : Proprits daction Proprits de position, de taille et dalignement proprits daffichage Proprits du parent Une proprit de navigation Proprits de glisser-dplacer Proprits de glisser-ancrer (VCL seulement)

Ces proprits sont hrites de TControl mais elles ne sont publies (elles apparaissent dans linspecteur dobjets) que pour les composants o elles sont applicables. Ainsi, TImage ne publie pas la proprit Color car sa couleur est dtermine par limage quil affiche.

Proprits daction
Les actions vous permettent de partager du code qui effectue certaines actions (par exemple, un bouton de barre doutils et un lment de menu qui font la mme chose) et fournissent un moyen simple et centralis dactiver et de dsactiver des actions en fonction de ltat de votre application. Action dsigne laction associe au contrle. ActionLink contient lobjet liaison daction associ au contrle.

Proprits de position, de taille et dalignement


Cet ensemble de proprits dfinissent la position et la taille dun contrle dans le contrle parent : Height spcifie la taille verticale. Width spcifie la taille horizontale. Top indique la position du bord suprieur. Left indique la position du bord gauche. AutoSize spcifie si le contrle se redimensionne automatiquement pour sadapter son contenu. Align dtermine comment le contrle saligne dans son conteneur (ou contrle parent). Anchor spcifie comment le contrle est ancr son parent (VCL seulement). Cet ensemble de proprits dtermine la hauteur, la largeur et la taille globale de la zone client dun contrle. ClientHeight indique la hauteur, exprime en pixels, de la zone client du contrle. ClientWidth indique la largeur, exprime en pixels, de la zone client du contrle.

3-20

Guide du dveloppeur

Objets, composants et contrles

Ces proprits ne sont pas accessibles dans les composants non visuels, mais Delphi se souvient de lendroit o vous avez plac les icnes de ces composants dans une fiche. La plupart du temps, vous dfinirez ou modifierez ces proprits en manipulant limage du contrle dans la fiche ou en utilisant la palette Alignement. Vous pouvez galement les modifier lexcution.

Proprits daffichage
Les proprits suivantes dfinissent laspect gnral dun contrle : Color spcifie la couleur de fond dun contrle. Font modifie la couleur, le nom, le style ou la taille du texte. Cursor spcifie limage utilise pour reprsenter le pointeur de la souris lorsquil passe au-dessus de la rgion couverte par le contrle. DesktopFont indique si le contrle utilise la fonte des icnes Windows pour lcriture de texte (VCL seulement).

Proprits du parent
Pour conserver une prsentation homogne dans une application, vous pouvez donner un contrle le mme aspect que son conteneur, appel son parent, en initialisant les proprits du parent True. ParentColor dtermine o un contrle cherche ses attributs de couleurs. ParentFont dtermine o un contrle cherche ses attributs de police. ParentShowHint dtermine comment un contrle dcide sil faut ou non afficher le texte de son conseil spcifi par la proprit Hint

Une proprit de navigation


La proprit suivante dtermine comment les utilisateurs peuvent se dplacer entre les divers contrles dune fiche : Caption contient la chane de texte qui intitule un composant. Pour souligner un caractre dune chane, faites-le prcder dun caractre &. Ce type de caractre est appel un acclrateur. Lutilisateur peut alors accder au contrle ou llment de menu en appuyant sur Alt et sur le caractre soulign.

Proprits de glisser-dplacer
Deux proprits des composants affectent le comportement du glisser-dplacer : DragMode dtermine la manire dont un glisser commence. Par dfaut, DragMode a la valeur dmManual et vous devez appeler la mthode BeginDrag pour commencer un glisser. Si DragMode a la valeur dmAutomatic, le glisser commence ds que le bouton de la souris est enfonc. DragCursor dtermine la forme du pointeur de la souris quand il se trouve audessus dun composant qui accepte un objet en train de glisser (VCL seulement).

Utilisation des bibliothques de composants

3-21

Objets, composants et contrles

Proprits de glisser-ancrer (VCL seulement)


Les proprits suivantes contrlent le comportement de glisser-ancrer : Floating spcifie si le contrle est flottant. DragKind spcifie si le contrle est dplac normalement ou pour un ancrage. DragMode dtermine comment le contrle commence des oprations de glisserdplacer ou glisser-ancrer. FloatingDockSiteClass spcifie la classe utilise pour le contrle temporaire qui hberge le contrle quand il est flottant. DragCursor est le curseur qui saffiche pendant le glissement. DockOrientation spcifie comment le contrle est ancr par rapport aux autres contrles ancrs dans le mme parent. HostDockSite spcifie le contrle auquel ce contrle est ancr. Pour plus dinformations, voir Implmentation du glisser-ancrer dans les contrles la page 7-4.

Evnements standard communs TControl


La VCL dfinit un ensemble dvnements standard pour ses contrles. Les vnements suivants sont dclars comme faisant partie de la classe TControl, et sont donc disponibles toutes les classes drives de TControl : OnClick se produit quand lutilisateur clique sur le contrle. OnContextPopup se produit lors de clics de lutilisateur avec le bouton droit ou sinon lors dappel du menu droulant (comme en utilisant le clavier). OnCanResize se produit quand le contrle est redimensionn. OnResize se produit immdiatement aprs que le contrle ait t redimensionn. OnConstrainedResize se produit immdiatement aprs OnCanResize. OnStartDock se produit quand lutilisateur commence faire glisser un contrle avec DragKind de dkDock (VCL seulement). OnEndDock se produit lorsque le glissement dun objet se termine, soit par lancrage de lobjet soit par labandon du glissement (VCL seulement). OnStartDrag se produit lorsque lutilisateur commence faire glisser le contrle ou un objet quil contient en cliquant dessus avec le bouton gauche de la souris et en maintenant enfonc le bouton gauche de la souris. OnEndDrag se produit lorsque lutilisateur arrte le glissement dun objet, soit en dposant lobjet, soit en annulant le glissement. OnDragDrop se produit quand lutilisateur dpose un objet quil faisait glisser.

3-22

Guide du dveloppeur

Objets, composants et contrles

OnMouseMove se produit quand lutilisateur dplace le pointeur de la souris au-dessus dun contrle. OnDblClick se produit quand lutilisateur double-clique avec le bouton principal de la souris alors que le pointeur de la souris est au-dessus du contrle. OnDragOver se produit quand lutilisateur fait glisser un objet au-dessus dun contrle (VCL seulement). OnMouseDown se produit quand un utilisateur appuie sur un bouton de la souris alors que le pointeur de la souris est au-dessus dun contrle. OnMouseUp se produit lorsque lutilisateur relche un bouton de la souris qui a t enfonc alors que le pointeur de la souris se trouvait au-dessus dun composant.

Proprits communes TWinControl et TWidgetControl


Tous les contrles visuels (descendants de TWinControl dans la VCL et de TWidgetControl dans CLX) partagent certaines proprits, entre autres : Informations sur le contrle Proprits daffichage du style de bordure Proprits de navigation Proprits de glisser-ancrer (VCL seulement)

Ces proprits sont hrites de TWinControl et de TWidgetControl, mais elles ne sont publies (elles apparaissent dans linspecteur dobjets) que pour les composants o elles sont applicables.

Proprits dinformations gnrales


Les proprits dinformations gnrales contiennent des informations sur lapparence du TWinControl et du TWidgetControl, la taille et lorigine de la zone client, les fentres affectes et le contexte daide. ClientOrigin reprsente les coordonnes cran, exprimes en pixels, du coin suprieur gauche de la zone client dun contrle. Les coordonnes cran dun contrle driv de TControl mais non de TWinControl sont en fait les coordonnes cran du parent du contrle ajoutes respectivement ses proprits Left et Top. ClientRect renvoie un rectangle dont les proprits Top et Left sont dfinies par zro et les proprits Bottom et Right sont dfinies respectivement par les proprits Height et Width du contrle. ClientRect est quivalent Rect(0, 0, ClientWidth, ClientHeight). Brush dtermine la couleur et le motif utilis pour dessiner larrire-plan du contrle. HelpContext indique le numro de contexte utiliser pour appeler laide en ligne contextuelle.

Utilisation des bibliothques de composants

3-23

Objets, composants et contrles

Handle donne accs au handle de fentre ou de widget du contrle.

Proprits daffichage du style de bordure


Les proprits de biseau contrlent lapparence des lignes, botes ou cadres biseauts sur les fiches et les contrles fentrs de votre application. Un plus grand nombre dobjets de la VCL publient ces proprits ; ils ne sont pas disponibles dans CLX et les proprits de style de bordure sont publies sur peu dobjets. InnerBevel spcifie si le biseau interne est en relief, en creux ou plat (VCL seulement). BevelKind spcifie le type de biseau si le contrle a des bords biseauts (VCL seulement). BevelOuter spcifie si le biseau externe un aspect en relief, en creux ou plat. BevelWidth sp cifie la largeur, exprime en pixels, des biseaux internes et externes. BorderWidth est utilise pour connatre ou spcifier la bordure du contrle. BevelEdges est utilise pour obtenir ou dfinir les bords biseauts du contrle.

Proprits de navigation
Deux proprits supplmentaires dterminent comment les utilisateurs peuvent se dplacer entre les divers contrles dune fiche : TabOrder indique la position du contrle dans lordre de tabulation du parent : lordre dans lequel les contrles reoivent la focalisation quand lutilisateur appuie sur la touche Tab. Initialement, lordre de tabulation correspond lordre dajout des composants dans la fiche. Vous pouvez le modifier en changeant TabOrder. TabOrder na de sens que si TabStop a la valeur True. TabStop dtermine si lutilisateur peut tabuler sur un contrle. Si TabStop a la valeur True, le contrle est dans lordre de tabulation.

Proprits de glisser-ancrer (VCL seulement)


Les proprits suivantes contrlent le comportement de glisser-ancrer des objets VCL : UseDockManager spcifie si le gestionnaire dancrage est utilis pour les oprations de glisser-ancrer. VisibleDockClientCount indique le nombre de contrles visibles qui sont ancrs au contrle fentr. DockManager spcifie linterface du gestionnaire dancrage du contrle. DockClients numre les contrles ancrs au contrle fentr. DockSite spcifie si le contrle peut tre la cible doprations glisser-ancrer. Pour plus dinformations, voir Implmentation du glisser-ancrer dans les contrles la page 7-4.

3-24

Guide du dveloppeur

Objets, composants et contrles

Evnements communs TWinControl et TWidgetControl


Les vnements suivants existent pour tous les contrles drivs de TWinControl dans la VCL (ainsi que tous les contrles dfinis par Windows) et de TWidgetControl dans CLX. Ces vnements sont en plus de ceux qui existent dans tous les contrles. OnEnter se produit lorsque le contrle est sur le point de recevoir la focalisation. OnKeyDown se produit quand lutilisateur appuie sur une touche. OnKeyPress se produit quand un utilisateur appuie sur une touche alphanumrique. OnKeyUp se produit quand lutilisateur relche une touche enfonce OnExit se produit quand la focalisation passe du contrle un autre contrle. OnMouseWheel se produit quand lutilisateur fait tourner la molette de la souris. OnMouseWheelDown se produit quand lutilisateur fait tourner la molette de la souris vers le bas. OnMouseWheelUp se produit quand lutilisateur fait tourner la molette de la souris vers le haut. Les vnements suivants concernent lancrage et sont disponibles uniquement dans la VCL : OnUnDock se produit quand lapplication essaie de dpiler un contrle ancr un contrle fentr (VCL seulement). OnDockDrop se produit quand un autre contrle est ancr au contrle (VCL seulement). OnDockOver se produit quand on fait glisser un autre contrle par dessus le contrle (VCL seulement). OnGetSiteInfo renvoie les informations dancrage du contrle (VCL seulement).

Cration de linterface utilisateur de lapplication


Tout le travail de conception visuelle de Delphi se passe sur des fiches. Lorsque vous ouvrez Delphi ou crez un nouveau projet, une fiche vierge saffiche lcran. Vous pouvez lutiliser pour commencer construire linterface de votre application, cest--dire les fentres, les menus et les dialogues communs. Vous concevez lapparence de linterface utilisateur graphique dune application en disposant des composants visuels, boutons ou listes, sur la fiche. Delphi prend en charge les dtails sous-jacents de la programmation. Vous pouvez aussi placer des composants invisibles sur les fiches pour capturer les informations issues des bases de donnes, effectuer des calculs et grer dautres interactions. Le chapitre 6, Conception de linterface utilisateur des applications, donne des dtails sur lutilisation des fiches, comme la cration dynamique de fiches modales, la transmission de paramtres aux fiches et la rcupration de donnes partir des fiches.

Utilisation des bibliothques de composants

3-25

Objets, composants et contrles

Utilisation de composants Delphi


De nombreux composants visuels sont fournis par lenvironnement de dveloppement lui-mme, par le biais de la palette des composants. Tout le travail de conception visuelle de Delphi se passe sur des fiches. Lorsque vous ouvrez Kylix ou crez un nouveau projet, une fiche vierge saffiche lcran. Vous slectionnez des composants dans la palette et les dposez sur la fiche. Vous concevez lapparence de linterface utilisateur de lapplication en disposant des composants visuels, boutons ou listes, sur la fiche. Une fois quun composant se trouve sur la fiche, vous pouvez ajuster sa position, sa taille ou dautres proprits de conception. Delphi prend en charge les dtails sous-jacents de la programmation. Les composants Delphi sont regroups par fonctions sur diffrentes pages de la palette des composants. Par exemple, les composants les plus utiliss, comme ceux qui crent des menus, des botes ddition ou des boutons, se trouvent dans la page Standard de la palette. Des contrles VCL pratiques, comme les timer, bote peindre, lecteur de multimdia et conteneur OLE, se trouvent sur la page Systme. A premire vue, les composants Delphi ressemblent aux autres classes. Mais, il existe des diffrences entre les composants de Delphi et les hirarchies de classes standard avec lesquelles travaillent la plupart des programmeurs. Voici certaines de ces diffrences : Tous les composants Delphi descendent de TComponent. Les composants sont la plupart du temps utiliss tels quels et modifis par le biais de leurs proprits, au lieu de servir de classes de base sous-classer pour ajouter des fonctionnalits ou modifier celles qui existent. Quand un composant est driv, on ajoute gnralement du code spcifique aux fonctions membres de gestion des vnements existants. Les composants sont allous uniquement sur le tas et non sur la pile. Les proprits des composants contiennent de faon intrinsque des informations de type lexcution. Des composants peuvent tre ajouts la palette de linterface utilisateur de Delphi et manipuls sur une fiche. Les composants offrent souvent un meilleur degr dencapsulation que les classes standard. Considrez, par exemple, lutilisation dune bote de dialogue contenant un bouton poussoir. Dans un programme Windows dvelopp en utilisant les composants de la VCL, lorsquun utilisateur clique sur le bouton, le systme gnre un message WM_LBUTTONDOWN. Le programme doit intercepter ce message (gnralement dans une instruction switch, une correspondance de message ou une table de rponse) et le diriger vers une routine qui sexcutera en rponse au message. La plupart des messages Windows (VCL) ou vnements systme (CLX) sont grs par les composants de Delphi. Quand vous voulez rpondre un message, il vous suffit de fournir un gestionnaire dvnement.

3-26

Guide du dveloppeur

Objets, composants et contrles

Initialisation des proprits dun composant


Les proprits publies peuvent tre initialises la conception avec linspecteur dobjets ou, dans certains cas, avec des diteurs de proprits spcifiques. Pour spcifier des proprits lexcution, il suffit de leur affecter de nouvelles valeurs dans le code de lapplication. Pour des informations sur les proprits de chaque composant, consultez laide en ligne.

Utilisation de linspecteur dobjets


Quand vous slectionnez un composant dune fiche, linspecteur dobjets affiche ses proprits publies et vous permet (si cest appropri) de les modifier. Utilisez la touche Tab pour vous dplacer entre la colonne des valeurs et la colonne des proprits. Si le curseur est dans la colonne des proprits, vous pouvez vous positionner sur une proprit en tapant les premires lettres de son nom. Pour les proprits de type boolen ou numr, vous pouvez choisir une valeur dans une liste droulante ou parcourir les valeurs en double-cliquant dans la colonne des valeurs. Si un symbole plus (+) apparat ct du nom de la proprit, vous pouvez faire apparatre une liste de sous-valeurs pour la proprit en cliquant sur le symbole plus ou en tapant +. Si un symbole moins (-) apparat ct du nom de la proprit, vous pouvez faire apparatre une liste de sous-valeurs pour la proprit en cliquant sur le symbole moins ou en tapant -. Par dfaut, les proprits de la catgorie Hritage ne sont pas affiches. Pour modifier les filtres daffichage, cliquez avec le bouton droit de la souris dans linspecteur dobjets et choisissez Voir. Pour davantage dinformations, voir catgories de proprits dans laide en ligne. Si plusieurs composants sont slectionns, linspecteur dobjets affiche toutes les proprits, sauf Name, communes aux composants slectionns. Si la valeur dune proprit partage nest pas la mme pour tous les composants slectionns, linspecteur dobjets affiche soit la valeur par dfaut, soit la valeur de la proprit pour le premier composant slectionn. Quand vous modifiez une proprit partage, la modification sapplique tous les composants slectionns.

Utilisation des diteurs de proprit


Certaines proprits, comme Font utilisent des diteurs de proprits spcifiques. Quand une telle proprit est slectionne dans linspecteur dobjets, un bouton points de suspension (...) apparat ct de sa valeur. Pour ouvrir lditeur de proprit, double-cliquez dans la colonne des valeurs, cliquez sur le bouton points de suspension ou tapez Ctrl+Entre quand la focalisation se trouve sur la proprit ou sur sa valeur. Pour certains composants, il suffit de double-cliquer sur le composant dans la fiche pour ouvrir un diteur de proprit. Les diteurs de proprit permettent de dfinir des proprits complexes partir dune seule bote de dialogue. Elles valident les saisies et permettent souvent de prvisualiser les effets dune affectation.

Utilisation des bibliothques de composants

3-27

Objets, composants et contrles

Initialisation des proprits lexcution


Vous pouvez lexcution utiliser votre code source pour affecter une valeur toute proprit accessible en criture. Vous pouvez ainsi, dfinir de manire dynamique le libell dune fiche :
Form1.Caption := MaChaine;

Appel de mthodes
Une mthode sappelle comme une procdure ou une fonction ordinaire. Par exemple, les contrles visuels disposent de la mthode Repaint qui rafrachit limage du contrle lcran. Vous pouvez appeler la mthode Repaint dun objet grille de dessin de la manire suivante :
DrawGrid1.Repaint;

Comme pour les proprits, cest la porte dune mthode qui impose ou pas lutilisation de qualificateurs. Par exemple, pour redessiner une fiche depuis le gestionnaire dvnement de lun des contrles enfant de la fiche, il nest pas ncessaire de prfixer lappel de mthode avec le nom de la fiche :
procedure TForm1.Button1Click(Sender: TObject); begin Repaint; end;

Pour davantage dinformations sur la porte, voir Porte et qualificateurs la page 3-9.

Utilisation des vnements et des gestionnaires dvnements


Dans Delphi, lessentiel du code que vous crivez est excut, directement ou indirectement, en rponse des vnements. Un vnement est un type particulier de proprit qui reprsente une situation lexcution, gnralement une action de lutilisateur. Le code qui rpond directement un vnement, ce quon appelle un gestionnaire dvnement, est une procdure Pascal Objet. Les sections suivantes expliquent comment : Gnrer un nouveau gestionnaire dvnement Gnrer le gestionnaire de lvnement par dfaut dun composant Rechercher un gestionnaire dvnement Associer un vnement un gestionnaire dvnement existant Associer des vnements de menu des gestionnaires dvnements Supprimer un gestionnaire dvnement

Gnration dun nouveau gestionnaire dvnement


Delphi peut crer le squelette de gestionnaires dvnements pour les fiches et les autres composants. Pour crer un gestionnaire dvnement,

1 Slectionnez un composant.

3-28

Guide du dveloppeur

Objets, composants et contrles

2 Cliquez dans la page Evnements de linspecteur dobjets. La page vnement de linspecteur dobjets affiche tous les vnements dfinis pour le composant slectionn. 3 Slectionnez lvnement de votre choix puis double-cliquez dans la colonne valeur ou appuyez sur Ctrl+Entre. Delphi gnre le gestionnaire dvnement dans lditeur de code et place le curseur dans le bloc begin...end. 4 A lintrieur du bloc begin...end, entrez le code que vous voulez excuter lorsque lvnement se produit.

Gnration du gestionnaire de lvnement par dfaut dun composant


Certains composants ont un vnement par dfaut, celui que le composant a le plus souvent besoin de grer. Par exemple, lvnement par dfaut dun bouton est OnClick. Pour crer un gestionnaire de lvnement par dfaut, double-cliquez sur le composant dans le concepteur de fiche, cela gnre le squelette de la procdure de gestion de lvnement et ouvre lditeur de code en plaant le curseur lintrieur du corps de la procdure o il ne vous reste plus qu ajouter du code. Certains composants nont pas dvnement par dfaut. Dautres, comme le biseau (TBevel), nont pas du tout dvnement. Dautres composants encore peuvent ragir diffremment si vous double-cliquez dessus dans le concepteur de fiche. Par exemple, plusieurs composants ouvrent un diteur de proprit par dfaut ou une autre bote de dialogue quand on double-clique dessus la conception.

Recherche de gestionnaires dvnements


Si vous avez gnr le gestionnaire de lvnement par dfaut dun composant en double-cliquant dessus dans le concepteur de fiche, vous pouvez revenir dessus en recommenant. Double-cliquez sur le composant ; lditeur de code souvre, le curseur positionn sur le dbut du corps du gestionnaire dvnement. Pour rechercher le gestionnaire dun vnement qui nest pas lvnement par dfaut,

1 Dans la fiche, slectionnez le composant dont vous recherchez le gestionnaire dvnement. 2 Dans linspecteur dobjets, cliquez sur longlet Evnements. 3 Slectionnez lvnement dont vous recherchez le gestionnaire et doublecliquez dans la colonne des valeurs. Lditeur de code souvre, le curseur positionn sur le dbut du corps du gestionnaire dvnement.

Association dun vnement un gestionnaire dvnement existant


Vous pouvez rutiliser le code en crivant des gestionnaires dvnements qui grent plusieurs vnements de composants. Par exemple, de nombreuses applications proposent des turboboutons qui sont lquivalent de commandes de la barre des menus. Quand un bouton initie la mme action quune commande

Utilisation des bibliothques de composants

3-29

Objets, composants et contrles

de menu, vous pouvez crire un seul gestionnaire dvnement et laffecter lvnement OnClick du bouton et de llment de menu. Pour associer un vnement un gestionnaire dvnement existant,

1 Dans la fiche, slectionnez le composant dont vous voulez grer un vnement. 2 Dans la page Evnements de linspecteur dobjets, slectionnez lvnement auquel vous voulez attacher un gestionnaire. 3 Cliquez sur le bouton flche vers le bas ct de lvnement afin douvrir une liste des gestionnaires dvnements existants. La liste ne propose que les gestionnaires dvnements crits pour des vnements portant le mme nom dans la mme fiche. Slectionnez dans la liste en cliquant sur un nom de gestionnaire dvnement.
Cette manire de procder est un moyen simple de rutiliser des gestionnaires dvnements. Cependant, les listes dactions et dans la VCL, les bandes dactionsconstituent un outil plus puissant permettant de centraliser lorganisation du code rpondant des commandes de lutilisateur. Les listes dactions peuvent tre utilises dans les applications multiplates-formes, alors que les bandes dactions ne le peuvent pas. Pour plus dinformations sur les listes dactions et sur les bandes dactions, voir Organisation des actions pour les barres doutils et les menus la page 6-18.

Utilisation du paramtre Sender


Dans un gestionnaire dvnement, le paramtre Sender indique le composant qui a reu lvnement et qui a donc appel le gestionnaire. Il est parfois pratique de partager entre plusieurs composants un mme gestionnaire dvnement qui doit se comporter diffremment selon le composant qui la appel. Vous pouvez y arriver en utilisant le paramtre Sender dans une instruction if...then...else. Par exemple, le code suivant affiche le nom de lapplication dans le titre dune bote de dialogue uniquement si lvnement OnClick a t reu par Button1.
procedure TMainForm.Button1Click(Sender: TObject); begin if Sender = Button1 then AboutBox.Caption := About + Application.Title else AboutBox.Caption := ; AboutBox.ShowModal; end;

Affichage et codage dvnements partags


Si des composants partagent des vnements, vous pouvez afficher leurs vnements partags dans linspecteur dobjets. Commencez par slectionner les composants en maintenant enfonce la touche Maj et en cliquant dessus dans le concepteur de fiche ; puis, choisissez longlet Evnements de linspecteur dobjets. Dans la colonne des valeurs de linspecteur dobjets, vous pouvez alors crer un nouveau gestionnaire dvnement ou affecter un gestionnaire dvnement existant aux vnements partags.

3-30

Guide du dveloppeur

Objets, composants et contrles

Association dvnements de menu des gestionnaires dvnements


Le concepteur de menus, utilis pour les composants MainMenu et PopupMenu, vous permet de spcifier simplement des menus droulants ou surgissants dans une application. Pour que les menus fonctionnent, il faut nanmoins que chaque lment de menu rponde lvnement OnClick qui se produit chaque fois que lutilisateur choisit llment de menu ou appuie sur sa touche de raccourci. Cette section explique comment associer des gestionnaires dvnements aux lments de menu. Pour plus dinformations sur le concepteur de menus et les composants associs, voir Cration et gestion de menus la page 6-33. Pour crer un gestionnaire dvnement pour un lment de menu,

1 Ouvrez le concepteur de menus en double-cliquant sur un objet MainMenu ou PopupMenu. 2 Slectionnez un lment de menu dans le concepteur de menus. Dans linspecteur dobjets, vrifiez quune valeur est attribue la proprit Name de llment. 3 Dans le concepteur de menus, double-cliquez sur llment de menu. Delphi gnre un gestionnaire dvnement dans lditeur de code et place le curseur dans le bloc begin...end. 4 A lintrieur du bloc begin...end, entrez le code que vous voulez excuter lorsque lutilisateur slectionne la commande de menu.
Pour associer un lment de menu un gestionnaire dvnement OnClick existant :

1 Ouvrez le concepteur de menus en double-cliquant sur un objet MainMenu ou PopupMenu. 2 Slectionnez un lment de menu dans le concepteur de menus. Dans linspecteur dobjets, vrifiez quune valeur est attribue la proprit Name de llment. 3 Dans la page Evnements de linspecteur dobjets, cliquez sur le bouton flche vers le bas ct de OnClick afin douvrir une liste des gestionnaires dvnements existants. La liste ne propose que les gestionnaires dvnements crits pour des vnements OnClick dans la fiche. Slectionnez un gestionnaire dvnement dans la liste en cliquant sur son nom.

Suppression de gestionnaires dvnements


Quand vous supprimez un composant dune fiche en utilisant le concepteur de fiche, Delphi retire le composant de la dclaration de type de la fiche. Mais, il ne supprime pas les mthodes associes car elles peuvent tre appeles par dautres composants de la fiche. Vous pouvez supprimer manuellement une mthode (comme un gestionnaire dvnement) mais si vous le faites, vous devez supprimer la dclaration avance de la mthode (dans la section interface de lunit) et son implmentation (dans la section implementation) ; sinon, vous obtiendrez une erreur de compilation lors de la gnration du projet.

Utilisation des bibliothques de composants

3-31

Composants VCL et CLX

Composants VCL et CLX


La palette de composants contient une slection de composants qui grent une grande varit doprations de programmation. Vous pouvez ajouter, retirer ou rorganiser les composants de la palette et vous pouvez crer des modles de composants et des cadres qui regroupent plusieurs composants. Les composants ayant des fonctions similaires sont regroups en pages dans la palette de composants. Les pages apparaissant dans la configuration par dfaut dpendent de la version de Delphi que vous utilisez. Le tableau suivant numre les pages dfinies par dfaut et les composants disponibles pour la cration des applications. Certaines des pages et des composants ne sont pas multiplatesformes, comme le tableau le souligne. Vous pouvez utiliser certains composants non visuels spcifiques la VCL dans les applications CLX uniquement Windows, cependant, les applications ne seront pas multiplates-formes sauf si vous isolez ces parties du code.
Tableau 3.3
Standard Supplment Win32

Pages de la palette de composants Description


Contrles standard, menus Contrles spcialiss contrles Windows courants

Nom de la page

multiplate-forme ?
Oui Oui sauf ApplicationEvents et CustomizeDlg De nombreux composants identiques figurent sur la page Contrles communs apparaissant la place lors de la cration des applications CLX ; RichEdit, UpDown, HotKey, Animate, DataTimePicker, MonthCalendar, Coolbar, PageScroller et ComboBoxEx ne sont pas multiplates-formes. Timer lest mais pas PaintBox, MediaPlayer, OleContainer ni les composants Dde Oui

Systme

Composants et contrles permettant un accs au niveau du systme, y compris les timers, le multimdia et le DDE. Composants pour le travail avec les donnes des bases de donnes qui ne sont pas lies un mcanisme daccs aux donnes particulier Contrles visuels orients donnes Contrles de bases de donnes qui utilisent dbExpress, une couche multiplate-forme indpendante des bases de donnes qui fournit des mthodes pour le traitement SQL dynamique. Elle dfinit une interface commune permettant daccder aux serveurs SQL.

AccsBD

ContrleBD dbExpress

Oui sauf pour DBRichEdit, DBCtrlGrid et DBChart Oui

3-32

Guide du dveloppeur

Composants VCL et CLX

Tableau 3.3
DataSnap

Pages de la palette de composants (suite) Description


Composants utiliss pour crer des applications de bases de donnes multiniveaux. Composants qui fournissent laccs aux donnes via le Borland Database Engine Composants permettant daccder aux donnes par le biais du modle ADO. Composants fournissant un accs direct InterBase Composants qui sont simultanment une application serveur web et le client dune application de base de donnes multiniveaux Composants pour les protocoles de communication Internet et les applications web Composants pour la construction dapplications serveur Web Contrles Internet NetMasters

Nom de la page

multiplate-forme ?
Non mais peuvent tre utiliss dans des applications CLX Windows Non mais peuvent tre utiliss dans des applications CLX Windows Non mais peuvent tre utiliss dans des applications CLX Windows Oui Non mais peuvent tre utiliss dans des applications CLX Windows Oui sauf pour ClientSocket, ServerSocket, QueryTableProducer, XMLDoc et WebBrowser Non mais peuvent tre utiliss dans des applications CLX Windows Non mais peuvent tre utiliss dans des applications CLX Windows Non mais peuvent tre utiliss dans des applications CLX Windows Oui sauf pour OpenPictureDialog, SavePictureDialog, PrinterSetupDialog et PageSetupDialog Non Non Non

BDE

ADO

InterBase InternetExpress

Internet

WebSnap

FastNet

QReport

Composants QuickReport utiliss pour crer des tats incorpors. Bote de dialogue les plus utilises

Dialogues

Win 3.1 Exemples ActiveX

ancien style des composants Win 3.1 Composants personnaliss exemple Exemples de contrles ActiveX ; voir la documentation Microsoft (msdn.microsoft.com) Composant pour la gestion des vnements COM+ Composants pour crire des applications qui implmentent ou utilisent des services web bass sur SOAP Exemples serveur COM pour Microsoft Excel, Word, etc. (voir la documentation MSDN Microsoft) Composants Internet multiplatesformes pour le client (composants Internet Winshoes code source libre)

COM+

Non mais peuvent tre utiliss dans des applications CLX Windows Non mais peuvent tre utiliss dans des applications CLX Windows Non mais peuvent tre utiliss dans des applications CLX Windows Oui

WebServices

Serveurs

Indy - Clients

Utilisation des bibliothques de composants

3-33

Composants VCL et CLX

Tableau 3.3

Pages de la palette de composants (suite) Description


Composants Internet multiplatesformes pour le serveur (composants Internet Winshoes code source libre) Composants Internet multiplatesformes supplmentaires (composants Internet Winshoes code source libre)

Nom de la page
Indy - Serveurs

multiplate-forme ?
Oui

Indy - Divers

Oui

Laide en ligne propose des informations sur les composants de la palette. Cependant, certains des composants des pages ActiveX, Serveurs et Exemples sont proposs uniquement titre dexemple et ne sont pas documents.

Ajout de composants personnaliss la palette de composants


Vous pouvez installer des composants personnaliss conus par vous ou acquis sparment dans la palette de composants et les utiliser dans vos applications. Pour crire un composant, voir la partie V, Cration de composants personnaliss. Pour installer un composant existant, voir Installation de paquets de composants la page 11-6.

Contrles texte
De nombreuses applications prsentent du texte lutilisateur ou lui permet den saisir. Le type de contrle employer pour contenir les informations dpend de la taille et du format des informations.
Utilisez ce composant :
TEdit TMemo TMaskEdit TRichEdit

Quand lutilisateur doit :


Modifier une seule ligne de texte. Modifier plusieurs lignes de texte. Utiliser un format particulier, par exemple celui dun code postal ou dun num ro de tlphone. Modifier plusieurs lignes de texte en utilisant du texte mis en forme (VCL seulement).

TEdit et TMaskEdit sont de simples contrles texte comprenant une bote texte dune ligne dans laquelle vous pouvez entrer des informations. Quand la bote texte dtient la focalisation, un point dinsertion clignotant apparat. Vous pouvez inclure du texte dans la bote en donnant une valeur chane sa proprit Text. Vous contrlez lapparence du texte dans la bote en donnant des valeurs sa proprit Font. Vous pouvez spcifier la police, la taille, la couleur et des attributs de fonte. Ces attributs affectent tout le texte de la bote et ne peuvent sappliquer individuellement chacun des caractres.

3-34

Guide du dveloppeur

Composants VCL et CLX

Une bote texte peut tre conue pour changer de taille en fonction de la taille de la police quelle contient. Vous faites cela en dfinissant la proprit AutoSize par True. Vous pouvez limiter le nombre de caractres que peut contenir une bote de texte en attribuant une valeur la proprit MaxLength. TMaskEdit est un contrle ddition spcial qui valide le texte entr par le biais dun masque indiquant les formats corrects du texte. Le masque peut galement formater le texte affich lutilisateur. TMemo permet dajouter plusieurs lignes de texte.

Proprits des contrles texte


Voici quelques proprits importantes des contrles texte :
Tableau 3.4 Proprit
Text Font AutoSize ReadOnly MaxLength

Proprits des contrles texte Description


Dtermine le texte qui apparat dans la bote de saisie ou le contrle mmo. Contrle les attributs du texte crit dans le contrle bote texte ou mmo. Permet la hauteur de la bote texte de changer de faon dynamique selon la font slectionne. Spcifie si lutilisateur est autoris modifier le texte. Limite le nombre de caractres dun contrle texte.

Proprits communes aux contrles mmo et de texte format


Les contrles mmo et de texte format, qui grent plusieurs lignes de texte, ont plusieurs proprits en commun. Veuillez noter que les contrles de texte format ne sont pas multiplates-formes. TMemo est un autre type de bote texte, contenant plusieurs lignes de texte. Les lignes dun contrle mmo peuvent stendre au-del de la marge droite de la bote texte ou aller la ligne automatiquement. Vous dcidez du retour la ligne laide de la proprit WordWrap. Les contrles mmo et de texte format possdent dautres proprits, dont : Alignment spcifie comment le texte est align (gauche, droite ou centr) lintrieur du composant. La proprit Text contient le texte du contrle. Votre application peut dterminer si le texte a t modifi en examinant la proprit Modified. Lines contient le texte sous la forme dune liste de chanes. OEMConvert dtermine si le texte du contrle est converti en caractres OEM. Cela savre utile pour valider les noms de fichiers (VCL seulement). WordWrap dtermine si le texte revient la ligne aprs la marge droite. WantReturns dtermine si lutilisateur peut insrer des passages la ligne dans le texte. WantTabs dtermine si lutilisateur peut insrer des tabulations dans le texte. AutoSelect dtermine si le texte est automatiquement slectionn (mis en vidence) quand le contrle devient actif.

Utilisation des bibliothques de composants

3-35

Composants VCL et CLX

SelText contient la partie du texte actuellement slectionne (mise en vidence). SelStart et SelLength indiquent la position des premier et dernier caractres de la partie slectionne du texte. A lexcution, vous pouvez slectionner tout le texte dun mmo en utilisant la mthode SelectAll.

Contrles de texte format (VCL seulement)


Le composant diteur de texte format (TRichEdit) est un composant mmo qui gre le texte mis en forme, limpression, la recherche et le glisser-dplacer du texte. Il vous permet de spcifier les proprits de police, dalignement, de tabulation, dindentation et de numrotation.

Contrles de saisies spcialises


Les composants suivants proposent dautres mthodes pour recevoir des saisies.
Utilisez ce composant :
TScrollBar TTrackBar TUpDown THotKey TSpinEdit

Quand lutilisateur doit :


Slectionner des valeurs dans un intervalle continu. Slectionner des valeurs dans un intervalle continu (visuellement plus parlant quune barre de dfilement). Slectionner une valeur laide dun incrmenteur associ un composant de saisie (VCL seulement) Entrer des squences clavier Ctrl/Maj/Alt (VCL seulement). Slectionner une valeur laide dun widget incrmenteur (CLX seulement).

Barres de dfilement
Le composant barre de dfilement cre une barre de dfilement utilise pour faire dfiler le contenu dune fentre, dune fiche ou dun autre contrle. Le code crit dans le gestionnaire dvnement OnScroll dtermine comment le contrle se comporte quand lutilisateur fait dfiler la barre de dfilement. Le composant barre de dfilement est rarement utilis car la plupart des composants visuels disposent de leurs propres barres de dfilement sans ncessiter de programmation. Par exemple, TForm propose les proprits VertScrollBar et HorzScrollBar qui configurent automatiquement des barres de dfilement pour la fiche. Pour crer une rgion dfilante dans une fiche, utilisez TScrollBox.

Barres gradues
Une barre gradue peut dfinir des valeurs entires dans un intervalle continu. Elle sert ajuster des proprits telle quune coleur, un volume ou une luminosit. Lutilisateur dplace la glissire en la faisant glisser une position donne ou en cliquant dans la barre.

3-36

Guide du dveloppeur

Composants VCL et CLX

Utilisez les proprits Max et Min pour dfinir les bornes suprieure et infrieure de lintervalle de la barre gradue. Utilisez SelEnd et SelStart pour mettre en vidence un intervalle slectionn. Voir la figure 3.4. La proprit Orientation dtermine si la barre gradu e est verticale ou horizontale. Par dfaut, une barre gradue dispose dune ligne de graduations en bas. Utilisez la proprit TickMarks pour modifier leur emplacement. Pour contrler lespacement des graduations, utilisez la proprit TickStyle et la mthode SetTick.
Figure 3.4 Trois vues du composant barre gradu e

Position dfinit une position par dfaut dans la barre gradue et indique lexcution la valeur slectionne par lutilisateur. Par dfaut, lutilisateur peut se dplacer dune graduation vers le haut ou vers le bas en utilisant les touches de dplacement correspondantes. Affectez LineSize pour changer cet incrment. Affectez PageSize pour dterminer le nombre de graduations du dplacement quand lutilisateur appuie sur les touches Pg. Haut et Pg. Bas.

Contrles flches haut-bas (VCL seulement)


Un contrle flches haut-bas ( TUpDown) est constitu dune paire de boutons flchs qui permettent lutilisateur de modifier une valeur entire dun incrment fixe. La valeur en cours est donne par la proprit Position ; lincrment, qui vaut 1 par dfaut, est spcifi par la proprit Increment. Utilisez la proprit Associate pour associer un autre composant (comme un contrle ddition) au contrle haut-bas.

Contrles incrmenteur (CLX seulement)


Un contrle incrmenteur (TSpinEdit) est galement appel widget haut-bas, comme le widget flches ou le bouton incrmenteur. Ce contrle permet lutilisateur de lapplication de changer une valeur entire par incrments fixes, soit en cliquant sur les boutons flchs haut ou bas pour augmenter ou diminuer la valeur affiche, soit en tapant directement la valeur dans la bote de lincrmenteur. La valeur en cours est donne par la proprit Value ; lincrment, qui vaut 1 par dfaut, est spcifi par la proprit Increment.

Contrles touche daccs rapide (VCL seulement)


Utilisez le composant touche daccs rapide (THotKey) pour affecter une squence de touches qui transfre la focalisation un composant. La proprit HotKey contient la combinaison de touches en cours et la proprit Modifiers dtermine les touches disponibles pour HotKey.

Utilisation des bibliothques de composants

3-37

Composants VCL et CLX

Le composant raccourci clavier peut tre affect la proprit ShortCut dun lment de menu. Ensuite, lorsquun utilisateur saisit la combinaison de touches spcifie par les proprits HotKey et Modifiers, Windows active llment de menu.

Contrles sparateur
Un sparateur (TSplitter) plac entre deux contrles aligns permet aux utilisateurs de redimensionner les contrles. Utiliss avec des composants comme les volets ou les botes de groupe, les sparateurs vous permettent de dcomposer une fiche en plusieurs volets contenant chacun plusieurs contrles. Aprs avoir plac un volet ou un autre contrle dans une fiche, ajoutez un sparateur ayant le mme alignement que le contrle. Le dernier contrle doit tre align sur le client afin quil remplisse tout lespace restant quand les autres sont redimensionns. Vous pouvez, par exemple, placer un volet sur le bord gauche dune fiche, initialiser sa proprit Alignment par alLeft, puis placer un sparateur (ayant galement lalignement alLeft) droite du volet, et enfin placer un autre volet (avec lalignement alLeft ou alClient) droite du sparateur. Initialisez MinSize afin de spcifier la taille minimum que le sparateur doit laisser quand il redimensionne le contrle adjacent. Initialisez Beveled True pour donner au sparateur un aspect 3D.

Boutons et contrles similaires


En dehors des menus, les boutons constituent le moyen le plus simple de dclencher une commande dans une application. Delphi propose plusieurs contrles de type bouton :
Utilisez ce composant :
TButton TBitBtn TSpeedButton TCheckBox TRadioButton TToolBar TCoolBar

Pour :
Prsenter des choix de commandes avec du texte dans des boutons Prsenter des choix de commandes dans des boutons contenant du texte et des glyphes Crer des groupes de boutons dans les barres doutils Prsenter des options de type Oui/Non Prsenter un ensemble de choix mutuellement exclusifs Disposer des boutons et dautres contrles en ligne et ajuster automatiquement leur taille et leur position Afficher une collection de contrles fentrs dans des bandes dplaables et redimensionnables (VCL seulement)

Contrles bouton
Les utilisateurs cliquent sur les contrles bouton pour initier des actions. Les boutons sont libells par du texte qui reprsente laction. Vous spcifiez le texte en attribuant une valeur chane la proprit Caption. Vous pouvez aussi slectionner la plupart des boutons en appuyant sur une touche du clavier,

3-38

Guide du dveloppeur

Composants VCL et CLX

appele raccourci clavier. Le raccourci est indiqu sur le bouton par une lettre souligne. Les utilisateurs cliquent sur les contrles bouton pour initier des actions. Vous pouvez associer une action un composant TButton en crant un gestionnaire dvnement OnClick correspondant. En double-cliquant sur un bouton la conception, vous affichez le gestionnaire dvnement OnClick du bouton dans lditeur de code. Set Affectez la valeur True la proprit Cancel pour que le bouton dclenche son vnement OnClick quand lutilisateur appuie sur Echap. Affectez la valeur True la proprit Default pour que la touche Entre dclenche lvnement OnClick du bouton.

Boutons bitmap
Un bouton bitmap (BitBtn) est un contrle bouton qui contient une image bitmap. Pour attribuer un bitmap personnalis votre bouton, affectez la proprit Glyph. Utilisez la proprit Kind pour configurer automatiquement un bouton avec un glyphe et un comportement par dfaut. Par dfaut, le glyphe est gauche du texte. Pour le dplacer, utilisez la proprit Layout. Le glyphe et le texte sont automatiquement centrs dans le bouton. Pour changer leur position, utilisez la proprit Margin. Margin dtermine le nombre de pixels entre le bord de limage et le bord du bouton. Par dfaut, limage et le texte sont spars par 4 pixels. Utilisez Spacing pour augmenter ou rduire cette distance. Les boutons bitmap peuvent avoir 3 tats : haut, bas et enfonc. Affectez la valeur 3 la proprit NumGlyphs pour attribuer un bitmap diffrent chaque tat.

Turboboutons
Les turboboutons, qui affichent gnralement une image, peuvent fonctionner en groupe. Ils sont souvent utiliss avec des volets pour crer des barres doutils. Pour faire fonctionner des turboboutons en groupe, affectez la proprit GroupIndex de tous les boutons la mme valeur non-nulle. Par dfaut, des turboboutons apparaissent ltat haut (non slectionn). Pour afficher un turbobouton ltat slectionn, affectez la valeur True sa proprit Down. Si AllowAllUp a la valeur True, tous les turboboutons dun groupe peuvent tre non slectionns. Affectez la valeur False AllowAllUp pour quun groupe de boutons se comporte comme un groupe de boutons radio. Pour plus dinformations sur les turboboutons, reportez-vous aux sous-rubriques de la section Ajout dune barre doutils en utilisant un composant volet la page 6-49.

Utilisation des bibliothques de composants

3-39

Composants VCL et CLX

Cases cocher
Une case cocher est une bascule qui permet lutilisateur de slectionner un tat activ ou dsactiv. Quand loption est active, la case est coche. Sinon, la case cocher est vide. Vous crez des cases cocher laide de TCheckBox. Affectez True Checked pour que la case soit coche par dfaut. Affectez True AllowGrayed pour que la case cocher puisse prendre trois tats : coche, non-coche et grise. La proprit State indique si la case est coche (cbChecked), non coche (cbUnchecked) ou grise (cbGrayed).
Remarque

Les contrles case cocher affichent un des deux tats binaires. Ltat indtermin est utilis quand les autres choix rendent impossible de dterminer la valeur en cours de la case cocher.

Boutons radio
Les boutons radio proposent un ensemble de choix mutuellement exclusifs. Vous pouvez crer des boutons radio individuels laide de TRadioButton ou utiliser le composant groupe de boutons radio (TRadioGroup) qui regroupe automatiquement des boutons radio. Cela permet lutilisateur de slectionner une option dans un ensemble de choix limit. Voir Regroupement de composants la page 3-44, pour plus dinformations. Un bouton radio slectionn saffiche sous forme dun cercle dont le centre est rempli. Sil nest pas slectionn, le bouton radio affiche un cercle vide. Donnez la valeur True ou False la proprit Checked pour changer ltat visuel du bouton radio.

Barres doutils
Les barres doutils permettent aisment dorganiser et de grer des contrles visuels. Vous pouvez crer une barre doutils partir dun composant volet et de turboboutons, ou utiliser le composant ToolBar puis choisir Nouveau bouton dans son menu contextuel pour chaque bouton ajouter. Le composant TToolBar prsente plusieurs avantages : les boutons dune barre doutils ont automatiquement des dimensions et un espacement homognes, les autres contrles conservent leur position et hauteur relatives ; les contrles peuvent automatiquement passer la ligne sil ny a pas assez de place horizontalement. Le composant TToolBar propose galement des options comme la transparence, les bordures en relief et les espaces et des sparations pour regrouper des contrles. Vous pouvez utiliser un ensemble dactions regroupes sur des barres doutils et des menus, en utilisant des liste dactions ou bandes dactions. Reportez-vous Utilisation des listes dactions la page 6-26, pour savoir comment utiliser les listes dactions avec boutons et barres doutils. Les barres doutils peuvent aussi tre parents dautres contrles, comme les botes de saisie, les botes options, etc.

3-40

Guide du dveloppeur

Composants VCL et CLX

Barres multiples (VCL seulement)


Une barre multiple contient des contrles enfant pouvant tre dplacs et redimensionns de manire indpendante. Chaque contrle se trouve dans une bande indpendante. Lutilisateur positionne les contrles en utilisant la poigne de redimensionnement gauche de chaque bande. A la conception et lexcution, la barre multiple exige une version 4.70, ou ultrieure, de COMCTL32.DLL (qui se trouve gnralement dans le rpertoire Windows\System ou Windows\System32). Les barres multiples ne peuvent pas tre utilises dans les applications multiplates-formes. La proprit Bands contient une collection dobjets TCoolBand. A la conception, vous pouvez ajouter, retirer ou modifier les bandes laide de lditeur de bandes. Pour louvrir, slectionnez la proprit Bands dans linspecteur dobjets puis double-cliquez dans la colonne des valeurs droite ou cliquez sur le bouton Points de suspension (...). Vous pouvez galement crer des bandes en ajoutant de nouveaux contrles fentrs de la palette. La proprit FixedOrder dtermine si les utilisateurs peuvent rorganiser les bandes. La proprit FixedSize dtermine si les bandes ont une hauteur uniforme.

Gestion de listes
Les listes proposent lutilisateur une collection dlments dans laquelle il peut choisir. Plusieurs composants affichent des listes :
Utilisez ce composant :
TListBox TCheckListBox TComboBox TTreeView TListView TDateTimePicker TMonthCalendar

Pour afficher :
Une liste de chanes de texte Une liste avec une case cocher devant chaque lment Une bote de saisie avec une liste surgissante droulante Une liste hirarchique Une liste dlments (dplaables) avec ventuellement des icnes, des en-ttes et des colonnes Une bote liste permettant de saisir des dates ou des heures (VCL seulement) Un calendrier permettant de slectionner des dates (VCL seulement)

Utilisez les composants non-visuels TStringList et TImageList pour grer des ensembles de chanes ou dimages. Pour plus dinformations sur les listes de chanes, voir Utilisation des listes de chanes la page 3-54.

Botes liste et botes liste de cases cocher


Les botes liste (TListBox) et les botes liste de cases cocher affichent une liste dans laquelle lutilisateur peut slectionner des lments. Items utilise un objet TStrings pour remplir le contrle avec des valeurs. ItemIndex indique llment slectionn dans la liste.

Utilisation des bibliothques de composants

3-41

Composants VCL et CLX

MultiSelect spcifie si lutilisateur peut slectionner plusieurs lments la fois. Sorted dtermine si la liste est trie alphabtiquement. Columns spcifie le nombre de colonnes dans le contrle liste. IntegralHeight spcifie si la bote liste naffiche que des entres affiches en entier verticalement (VCL seulement). ItemHeight spcifie la hauteur, exprime en pixels, de chaque lment de la liste. La proprit Style peut neutraliser leffet de ItemHeight. La proprit Style dtermine comment une bote liste affiche ses lments. Par dfaut, les lments sont affichs sous la forme dune chane. En modifiant la valeur de Style, vous pouvez crer des botes liste dessines par le propritaire, dans ce cas les lments peuvent tre graphiques et de hauteur fixe ou de hauteur variable. Pour plus dinformations sur les contrles dessines par le propritaire, voir Ajout de graphiques des contrles la page 7-13. Pour crer une bote liste simple,

1 Dans le projet, faites glisser un composant bote liste sur une fiche depuis la palette de composants. 2 Redimensionnez la bote liste et dfinissez son alignement, si ncessaire. 3 Double-cliquez sur la partie droite de la proprit Items ou choisissez le bouton Points de suspension pour afficher lditeur de liste de chanes. 4 Utilisez lditeur pour entrer des lignes de texte libre comme contenu de la bote liste. 5 Puis, choisissez OK.
Pour permettre aux utilisateurs de slectionner plusieurs lments de la liste, utilisez les proprits ExtendedSelect et MultiSelect.

Botes options
Une bote options (TComboBox) combine une bote de saisie et une liste droulante. Quand les utilisateurs saisissent des donnes, en entrant du texte dans la bote de saisie ou en slectionnant un lment de la liste, la valeur de la proprit Text change. Si AutoComplete est active, lapplication recherche et affiche la correspondance la plus proche dans la liste au fur et mesure que lutilisateur tape des donnes. Les trois types de botes options sont : standard, droulante (par dfaut) et liste droulante. Utilisez la proprit Style pour spcifier le type de bote options que vous souhaitez. Utilisez csDropDown si vous voulez une bote de saisie avec une liste droulante. Utilisez csDropDownList pour que la bote de saisie soit en lecture seule (ce qui oblige les utilisateurs slectionner dans la liste). Initialisez la proprit DropDownCount pour changer le nombre dlments affichs dans la liste. Utilisez csSimple pour crer une bote options avec une liste fixe qui reste toujours ouverte. Prenez soin de redimensionner la bote options pour que les lments de la liste soient affichs.

3-42

Guide du dveloppeur

Composants VCL et CLX

Utilisez csOwnerDrawFixed ou csOwnerDrawVariable pour crer des botes options dessines par le propritaire qui affichent des lments graphiques ou de hauteur variable. Pour plus dinformations sur les contrles dessines par le propritaire, voir Ajout de graphiques des contrles la page 7-13. Pendant lexcution, les botes options CLX fonctionnent diffremment des botes options VCL. Dans CLX (mais pas dans la bote options VCL), vous pouvez ajouter un lment une liste droulante en entrant du texte et en appuyant sur Entre dans le champ ddition dune bote options. Vous pouvez dsactiver cette fonctionnalit en dfinissant InsertMode par ciNone. Il est galement possible dajouter des lments vides (sans chane) la liste de la bote options. De plus, si vous maintenez la flche bas enfonce, vous ne vous arrtez pas au dernier lment de la liste. Vous refaites un tour en recommenant au dbut.

Vues arborescentes
Une vue arborescente (TTreeView) affiche des lments dans une table des matires indente. Le contrle propose des boutons qui permettent de dvelopper ou de rduire les nuds. Vous pouvez inclure des icnes en plus du libell des lments et afficher diffrentes icnes pour indiquer si un nud est dvelopp ou rduit. Vous pouvez galement inclure des lments graphiques, par exemple des cases cocher, afin de reflter des informations sur ltat des lments. Indent dfinit le nombre de pixels sparant horizontalement les lments de leurs parents. ShowButtons active laffichage des boutons + et pour indiquer si un lment peut tre dvelopp. ShowLines active laffichage de lignes de connexion qui montrent les relations hirarchiques (VCL seulement). ShowRoot dtermine si des lignes connectent les lments racine (VCL seulement). Pour lui ajouter des lments au cours de la conception, double-cliquez sur le contrle vue arborescente afin dafficher lditeur dlments TreeView. Les lments ajouts deviennent la valeur de la proprit Items. Vous pouvez modifier les lments pendant lexcution en utilisant les mthodes de la proprit Items, qui est un objet de type TTreeNodes. TTreeNodes possde des mthodes pour ajouter des lments, supprimer des lments et naviguer entre les lments dans la vue arborescente. Les vues arborescentes peuvent afficher des colonnes et des sous-lments semblables aux vues liste en mode vsReport.

Vues liste
Les vues liste, cres laide de TListView, affichent des listes dans divers formats. Utilisez la proprit ViewStyle pour choisir le type de liste utilis : vsIcon et vsSmallIcon affichent chaque lment sous la forme dune icne avec un libell. Les utilisateurs peuvent faire glisser les lments dans la fentre de la vue liste (VCL seulement).

Utilisation des bibliothques de composants

3-43

Composants VCL et CLX

vsList affiche les lments comme icnes libelles qui ne peuvent pas tre dplaces. vsReport affichent les lments raison dun par ligne avec des informations organises en colonnes. La colonne de gauche contient une petite icne et un libell et les autres colonnes contiennent des sous-lments spcifis par lapplication. Utilisez la proprit ShowColumnHeaders afin dafficher des enttes de colonne.

Slecteurs Date/Heure et calendriers mensuels (VCL seulement)


Le composant slecteur date/heure affiche une bote liste permettant de saisir des dates ou des heures. Le composant calendrier mensuel propose un calendrier permettant de saisir des dates ou des plages de dates. Pour utiliser ces composants, que ce soit la conception ou lexcution, vous devez avoir la version 4.70, ou une version ultrieure, de COMCTL32.DLL (normalement dans le rpertoire Windows\System ou Windows\System32). Ils ne peuvent pas tre utiliss dans les applications multiplates-formes.

Regroupement de composants
Une interface utilisateur graphique est plus facile utiliser quand des contrles et les contrles associs sont prsents dans des groupes. Delphi propose plusieurs composants permettant de regrouper des composants :
Utilisez ce composant :
TGroupBox TRadioGroup TPanel TScrollBox TTabControl TPageControl

Pour :
Une bote groupe standard avec un titre Un groupe simple de boutons radio Un groupe de contrles plus flexible visuellement Une zone dfilante contenant des contrles Un ensemble donglets (du type classeur) mutuellement exclusifs Un ensemble donglets (du type classeur) mutuellement exclusifs avec les pages correspondantes, chacune pouvant contenir dautres contrles Des en-ttes de colonne redimensionnables

THeaderControl

Botes groupe et groupes de boutons radio


Une bote groupe (TGroupBox) associe des contrles dune fiche. Les contrles les plus frquemment regroups sont les boutons radio. Aprs avoir plac une bote groupe dans une fiche, slectionnez les composants dans la palette de composants et placez-les dans la bote groupe. La proprit Caption contient le texte qui sert libeller la bote groupe lexcution. Le composant groupe de boutons radio (TRadioGroup) simplifie le regroupement de boutons radio et gre leur fonctionnement en commun. Pour ajouter des boutons radio un groupe, modifiez la proprit Items dans linspecteur dobjets ; chaque chane de Items constitue un bouton radio qui apparat dans le groupe en utilisant la chane spcifie comme libell. La valeur de la proprit

3-44

Guide du dveloppeur

Composants VCL et CLX

ItemIndex dtermine le bouton radio slectionn. Affichez les boutons radio sur une ou plusieurs colonnes en dfinissant la valeur de la proprit Columns. Pour espacer les boutons, redimensionnez le composant groupe de boutons radio.

Volets
Le composant TPanel constitue un conteneur gnrique pour dautres contrles. Les volets sont gnralement utiliss pour regrouper visuellement des composants sur une fiche. Il est possible daligner des volets dans la fiche pour conserver la mme position relative quand la fiche est redimensionne. La proprit BorderWidth dtermine la largeur, en pixels, de la bordure entourant un volet. Vous pouvez aussi placer dautres contrles sur un volet et utiliser la proprit Align pour positionner correctement tous les contrles du groupe ou de la fiche. Vous pouvez choisir pour un volet un alignement alTop, pour que sa position soit maintenue mme si la fiche est redimensionne. S vous voulez que le volet paraisse lev ou enfonc, utilisez les proprits BevelOuter et BevelInner. Vous pouvez varier les valeurs de ces proprits pour crer diffrents effets visuels 3D. Remarquez que si vous voulez seulement un biseau lev ou enfonc, il vaut mieux utiliser le contrle TBevel, moins gourmand en ressources. Vous pouvez aussi utiliser les volets pour construire des barres dtat ou des zones daffichage dinformation.

Botes de dfilement
Les botes de dfilement (TScrollBox) permettent de crer des zones dfilantes lintrieur dune fiche. Souvent, les applications ont besoin dafficher plus dinformations quil ne peut apparatre dans une zone particulire. Certains contrles, comme les botes liste, les mmos ou les fiches mmes, peuvent automatiquement faire dfiler leur contenu. Les botes de dfilement sutilisent aussi pour crer des zones de dfilement (vues) multiples dans une fentre. Les vues sont frquentes dans les traitements de texte, les tableurs et les applications de gestion. Les botes de dfilement vous offrent davantage de souplesse en vous permettant de dfinir arbitrairement une zone dfilante dans une fiche. Comme les volets et les botes groupe, les botes de dfilement contiennent dautres contrles, comme les objets TButton et TCheckBox. Mais, normalement une bote de dfilement est invisible. Si les contrles quelle contient ne peuvent rentrer dans sa partie visible, la bote de dfilement affiche automatiquement des barres de dfilement. A laide dune bote de dfilement, vous pouvez aussi empcher le dfilement dans certaines zones dune fentre, par exemple dans une barre doutils ou dans une barre dtat (composants TPanel). Pour empcher le dfilement dans une barre doutils ou dans une barre dtat, cachez les barres de dfilement, puis placez une bote de dfilement dans la zone client de la fentre, entre la barre doutils et la barre dtat. Les barres de dfilement associes la bote de

Utilisation des bibliothques de composants

3-45

Composants VCL et CLX

dfilement sembleront appartenir la fentre, mais vous pourrez seulement faire dfiler la zone se trouvant lintrieur de la bote de dfilement.

Contrles onglets
Le composant contrle onglets (TTabControl) cre un ensemble donglets semblables aux sparateurs dun classeur. Vous pouvez crer des onglets en modifiant la proprit Tabs laide de linspecteur dobjets ; chaque chane de Tabs reprsente un onglet. Le contrle onglets est un simple volet avec un seul ensemble de composants dedans. Pour changer laspect du contrle quand les onglets sont slectionns, crivez un gestionnaire dvnement OnChange. Pour crer une bote de dialogue multipage, utilisez plutt un contrle pages.

Contrles pages
Le composant contrle pages (TPageControl) est un ensemble de pages utilis pour constituer une bote de dialogue multipage. Un contrle pages affiche plusieurs pages les unes sur les autres, et ce sont des objets TTabSheet. Vous slectionnez une page dans linterface utilisateur en cliquant sur son onglet, en haut du contrle. Pour crer une nouvelle page dans un contrle pages lors de la conception, cliquez avec le bouton droit de la souris sur le contrle pages et choisissez Nouvelle page. A lexcution, vous ajoutez de nouvelles pages en crant lobjet correspondant la page et en dfinissant sa proprit PageControl :
NewTabSheet = TTabSheet.Create(PageControl1); NewTabSheet.PageControl := PageControl1;

Pour accder la page active, utilisez la proprit ActivePage. Pour changer de page active, dfinissez la proprit ActivePage ou la proprit ActivePageIndex.

Contrles en-ttes
Un contrle en-ttes (THeaderControl) est un ensemble den-ttes de colonnes que lutilisateur peut slectionner ou redimensionner lexcution. Modifiez la proprit Sections du contrle pour ajouter ou modifier les en-ttes. Vous pouvez placer les sections den-tte au-dessus des colonnes ou des champs. Par exemple, les sections den-tte peuvent tre places sur une bote liste (TListBox).

Rtroaction visuelle
Il existe plusieurs moyens de donner lutilisateur des informations sur ltat dune application. Par exemple, certains composants, dont TForm, disposent de la proprit Caption qui peut tre dfinie lexcution. Vous pouvez galement crer des botes de dialogue pour afficher des messages. De plus, les composants

3-46

Guide du dveloppeur

Composants VCL et CLX

suivants sont particulirement utiles pour fournir des indications visuelles lexcution.
Utilisez ce composant ou cette proprit :
TLabel et TStaticText TStatusBar TProgressBar Hint et ShowHint HelpContext et HelpFile

Pour :
Afficher du texte non modifiable Afficher une zone dtat (gnralement en bas dune fentre) Afficher le pourcentage effectu dune tche donne Activer les conseils daide (appels aussi bulles daide) Effectuer la liaison avec le systme daide en ligne

Libells et composants texte statique


Les libells (TLabel) affichent du texte, ils sont gnralement placs ct dautres composants. Vous placez un libell sur une fiche lorsque vous avez besoin didentifier ou dannoter un autre composant, comme une bote de saisie, ou lorsque vous voulez inclure du texte dans la fiche. Le composant libell standard, TLabel, est un contrle non-fentr (dans CLX, non bas sur un widget), qui ne peut donc pas recevoir la focalisation ; si vous avez besoin dun libell disposant dun handle de fentre, utilisez la place TStaticText. Les proprits des libells sont les suivantes : Caption contient la chane de texte du libell. Font, Color et dautres proprits dterminent lapparence du libell. Chaque libell ne peut utiliser quune seule police, taille et couleur. FocusControl relie le contrle libell un autre contrle de la fiche. Si Caption comporte une touche acclratrice, le contrle spcifi dans la proprit FocusControl obtient la focalisation quand lutilisateur appuie sur la touche de raccourci. ShowAccelChar dtermine si le libell peut afficher un caractre de raccourci soulign. Si ShowAccelChar a la valeur True, tout caractre prcd dun & apparat soulign et active une touche de raccourci. Transparent dtermine si les lments sur lesquels le libell est plac (par exemple des images) sont visibles. Les libells contiennent gnralement du texte statique en lecture seule, que lutilisateur de lapplication ne peut pas modifier. Vous pouvez modifier le texte lorsque lapplication est excute en attribuant une nouvelle valeur la proprit Caption. Pour ajouter une fiche un objet texte que lutilisateur peut faire dfiler ou modifier, utilisez TEdit.

Barres dtat
Mme si vous pouvez utiliser un volet pour crer une barre dtat, il est plus simple dutiliser le composant barre dtat. Par dfaut, la proprit Align dune barre dtat a la valeur alBottom, ce qui gre la fois la position et la taille.

Utilisation des bibliothques de composants

3-47

Composants VCL et CLX

Si vous voulez afficher une seule chane de texte la fois dans la barre dtat, dfinissez sa proprit SimplePanel par True et utilisez la proprit SimpleText pour contrler le texte affich dans la barre dtat. Vous pouvez aussi diviser une barre dtat en plusieurs zones de texte, appeles volets. Pour crer des volets, modifiez la proprit Panels avec linspecteur dobjets et spcifiez les proprits Width, Alignment et Text de chaque volet laide de lditeur de volets. La proprit Text de chaque volet contient le texte affich dans le volet.

Barres de progression
Quand une application effectue une opration longue, vous pouvez utiliser une barre de progression pour indiquer le pourcentage ralis de lopration. Une barre de progression affiche une ligne pointille qui progresse de gauche droite.
Figure 3.5 Une barre de progression

La proprit Position indique la longueur de la ligne pointille. Max et Min dterminent ltendue des valeurs prises par Position. Pour allonger la ligne, augmentez Position en appelant la mthode StepBy ou StepIt . La proprit Step dtermine lincrment utilis par StepIt.

Proprits daide ou de conseil daide


La plupart des contrles visuels peuvent, lexcution, afficher de laide contextuelle ou des conseils daide. Les proprits HelpContext et HelpFile spcifient un numro de contexte daide le nom du fichier daide pour un contrle. La proprit Hint spcifie la chane de texte qui apparat quand lutilisateur dplace le pointeur de la souris au-dessus dun contrle ou dun lment de menu. Pour activer les conseils, dfinissez ShowHint par True ; linitialisation de ParentShowHint True force la proprit ShowHint du contrle a prendre la mme valeur que celle de son parent.

Grilles
Les grilles affichent des informations disposes en lignes et en colonnes. Si vous concevez une application de base de donnes, utilisez les composants TDBGrid et TDBCtrlGrid dcrits au chapitre 15, Utilisation de contrles de donnes. Sinon, utilisez une grille de dessin ou une grille de chanes standard.

Grilles de dessin
Une grille de dessin (TDrawGrid) affiche des donnes quelconques dans un format tabulaire. Ecrivez un gestionnaire dvnement OnDrawCell pour remplir les cellules de la grille.

3-48

Guide du dveloppeur

Composants VCL et CLX

La mthode CellRect renvoie les coordonnes cran de la cellule spcifie alors que la mthode MouseToCell renvoie la colonne et la ligne de la cellule se trouvant aux coordonnes cran spcifies. La proprit Selection indique les limites de la slection de cellules en cours. La proprit TopRow dtermine la ligne qui apparat en haut de la grille. La proprit LeftCol dtermine la premire colonne visible sur la gauche de la grille. VisibleColCount et VisibleRowCount indiquent, respectivement, le nombre de colonnes et de lignes visibles dans la grille. Vous pouvez modifier la largeur et la hauteur dune colonne ou dune ligne en utilisant les proprits ColWidths et RowHeights. Dfinissez lpaisseur des lignes du quadrillage de la grille avec la proprit GridLineWidth. Ajoutez des barres de dfilement la grille en utilisant la proprit ScrollBars. Vous pouvez spcifier les colonnes ou les lignes fixes (qui ne dfilent pas) laide des proprits FixedCols et FixedRows. Attribuez une couleur aux colonnes et aux lignes fixes en utilisant la proprit FixedColor. Les proprits Options, DefaultColWidth et DefaultRowHeight affectent galement laspect et le comportement de la grille.

Grilles de chanes
Le composant grille de chanes est un descendant de TDrawGrid spcialis afin de simplifier laffichage de chanes. La proprit Cells numre les chanes pour chaque cellule de la grille ; la proprit Objects numre les objets associs chaque chane. Il est possible daccder toutes les chanes et objets associs dune colonne ou dune ligne donne en utilisant les proprits Cols et Rows.

Editeur de liste de valeurs (VCL seulement)


TValueListEditor est une grille spcialise pour la modification des listes de chanes contenant des paires nom/valeur sous la forme Nom=Valeur. Les noms et les valeurs sont stocks dans un descendant de TStrings qui est la valeur de la proprit Strings. Vous pouvez rechercher la valeur dun nom laide de la proprit Values. TValueListEditor ne peut pas tre utilis en programmation multiplate-forme. La grille contient deux colonnes, une pour les noms et une pour les valeurs. Par dfaut, la colonne des noms sappelle Key et la colonne des valeurs Value. Vous pouvez modifier ces titres en dfinissant la proprit TitleCaptions. Vous pouvez omettre ces titres en utilisant la proprit DisplayOptions (qui contrle galement la faon dont se redimensionne le contrle.) Vous pouvez autoriser ou empcher lutilisateur de modifier la colonne des noms en utilisant la proprit KeyOptions. KeyOptions contient des options spares pour autoriser la modification des noms, lajout de nouveaux noms, la suppression de noms, ainsi que pour dterminer si les nouveaux noms doivent tre uniques.

Utilisation des bibliothques de composants

3-49

Composants VCL et CLX

Vous pouvez autoriser ou empcher lutilisateur de modifier les entres de la colonne des valeurs en utilisant la proprit ItemProps. Chaque lment a un objet TItemProp spar qui vous permet de : Fournir un masque afin dimposer la validit de la saisie. Spcifier une longueur maximale pour les valeurs. Marquer les valeurs comme valeurs en lecture seule. Demander que lditeur de liste de valeurs affiche une flche droulante ouvrant la liste des valeurs parmi lesquelles lutilisateur pourra choisir, ou un bouton Points de suspension dclenchant un vnement que vous utiliserez pour afficher un dialogue dans lequel lutilisateur entrera des donnes. Si vous spcifiez une flche droulante, vous devez fournir la liste des valeurs parmi lesquelles lutilisateur peut choisir. Il peut sagir dune liste statique (la proprit PickList de lobjet TItemProp) ou les valeurs peuvent tre ajoutes de manire dynamique lexcution en utilisant lvnement OnGetPickList de lditeur de liste de valeurs. Vous pouvez aussi combiner ces approches et avoir une liste statique modifie par le gestionnaire de lvnement OnGetPickList. Si vous spcifiez un bouton Points de suspension, vous devez fournir la rponse qui est faite lorsque lutilisateur clique sur ce bouton (y compris la dfinition dune valeur, si appropri). Vous fournirez cette rponse en crivant un gestionnaire pour lvnement OnEditButtonClick.

Affichage des graphiques


Les composants suivants facilitent lincorporation dlments graphiques dans une application.
Utilisez ce composant :
TImage TShape TBevel TPaintBox TAnimate

Pour afficher :
des fichiers graphiques des formes gomtriques des lignes et des cadres en 3D des graphiques dessins par lapplication lexcution des fichiers AVI (VCL seulement)

Images
Le composant image affiche une image graphique : bitmap, icne ou mtafichier. La proprit Picture spcifie limage afficher. Utilisez les proprits Center, AutoSize, Stretch et Transparent pour spcifier les options daffichage. Pour davantage dinformations, voir Prsentation de la programmation relative aux graphiques la page 8-1.

3-50

Guide du dveloppeur

Composants VCL et CLX

Formes
Le composant forme affiche une forme gomtrique. Cest un contrle non fentr (dans CLX, non bas sur un widget), il ne peut donc pas recevoir la saisie de lutilisateur. La proprit Shape spcifie la forme du contrle. Pour modifier la couleur de la forme ou lui ajouter un motif, utilisez la proprit Brush qui contient un objet TBrush. Les proprits Color et Style de TBrush contrlent la manire dont la forme est dessine.

Biseaux
Le composant biseau (TBevel) est une ligne qui peut apparatre en relief ou en creux. Certains composants, comme TPanel, disposent de proprits intgres pour crer des contours biseauts. Quand ces proprits ne sont pas disponibles, utilisez un composant TBevel pour crer des contours, des botes ou des cadres biseauts.

Botes peindre
Le composant bote peindre (TPaintBox) permet une application de dessiner dans une fiche. Ecrivez un gestionnaire dvnement OnPaint pour restituer directement limage dans le canevas (Canvas) de la bote peindre. Il nest pas possible de dessiner hors des limites dune bote peindre. Pour davantage dinformations, voir Prsentation de la programmation relative aux graphiques la page 8-1.

Contrles animation (VCL seulement)


Le composant animation est une fentre qui affiche silencieusement une squence vido AVI (Audio Video Interleaved). Une squence AVI est compose dune srie de plans bitmap, comme un film. Les squences AVI peuvent tre sonorises, mais les contrles animation ne fonctionnent quavec les squences AVI silencieuses. Les fichiers utiliss doivent tre des fichiers AVI non compresss ou des squences AVI compresses en utilisant lalgorithme RLE. Les contrles animation ne peuvent pas tre utiliss en programmation multiplateforme. Le composant animation comporte, entre autres, les proprits suivantes : ResHandle est le handle Windows du module contenant la squence AVI sous la forme dune ressource. Initialisez ResHandle lexcution avec le handle dinstance ou le handle du module contenant la ressource animation. Aprs avoir initialis ResHandle, affectez la proprit ResID ou ResName pour spcifier la ressource du module spcifi qui contient la squence AVI afficher dans le contrle animation. Initialisez AutoSize True pour que le contrle animation ajuste sa taille la taille des plans de la squence AVI. StartFrame et StopFrame sp cifient les plans o la squence doit commencer et sarrter. Dfinissez CommonAVI pour afficher lune des squences AVI standard de Windows contenues dans Shell32.DLL.

Utilisation des bibliothques de composants

3-51

Composants VCL et CLX

Spcifiez quand commencer ou arrter lanimation en initialisant la proprit Active True et False, respectivement, et le nombre de rptitions effectuer en initialisant la proprit Repetitions. La proprit Timers permet dafficher les plans en utilisant un timer. Cela permet de synchroniser la squence animation avec dautres actions, par exemple la restitution dune piste sonore.

Dveloppement de botes de dialogue


Les composants bote de dialogue de la page Dialogues de la palette de composants permettent dutiliser dans vos applications diverses botes de dialogue. Ces botes de dialogue donnent vos applications une interface familire et cohrente dans laquelle lutilisateur effectue certaines oprations communes sur les fichiers, comme louverture, lenregistrement ou limpression. Ces botes de dialogue affichent et/ou obtiennent des donnes. Chaque bote de dialogue souvre lorsque sa mthode Execute est appele. Execute renvoie une valeur boolenne : si lutilisateur choisit OK pour accepter les modifications apportes dans la bote de dialogue, Execute renvoie True ; sil choisit Annuler pour quitter la bote de dialogue sans rien modifier, Execute renvoie False. Si vous dveloppez des applications multiplates-formes, vous pouvez utiliser les dialogues fournis avec CLX dans lunit QDialogs. Pour les systmes dexploitation qui proposent des botes de dialogue natives pour les tches communes, comme pour louverture ou lenregistrement dun fichier, ou le changement de police ou de couleur, vous pouvez utiliser la proprit UseNativeDialog. Dfinissez UseNativeDialog par True si votre application doit sexcuter dans un tel environnement et si vous voulez utiliser les dialogues natifs la place des dialogues Qt.

Utilisation des botes de dialogue douverture


TOpenDialog est le composant bote de dialogue le plus couramment utilis. Il est gnralement employ par une option de menu Nouveau ou Ouvrir dans le menu Fichier de la barre de menus principale dune fiche. La bote de dialogue contient des contrles qui vous permettent de slectionner des groupes de fichiers en utilisant un caractre joker et de naviguer dans les rpertoires. Le composant TOpenDialog permet dutiliser une bote de dialogue Ouvrir dans votre application. La fonction de cette bote de dialogue est de permettre lutilisateur de spcifier un fichier ouvrir. Utilisez la mthode Execute pour afficher la bote de dialogue. Quand lutilisateur choisit OK dans la bote de dialogue, le nom du fichier slectionn par lutilisateur est stock dans la proprit FileName de TOpenDialog. Vous pouvez ensuite utiliser cette valeur votre guise.

3-52

Guide du dveloppeur

Emploi dobjets utilitaires

Lexemple de code suivant peut tre plac dans une Action et li la proprit Action du sous-lment dun menu TMainMenu ou plac dans lvnement OnClick du sous-lment :
if OpenDialog1.Execute then filename := OpenDialog1.FileName;

Ce code affiche la bote de dialogue et si lutilisateur choisit le bouton OK, le nom du fichier slectionn est copi dans la variable filename de type AnsiString pralablement dclare.

Emploi dobjets utilitaires


La VCL et CLX proposent divers objets non-visuels qui simplifient les tches courantes de programmation. Cette section dcrit certains objets utilitaires qui facilitent les tches suivantes : Utilisation des listes Utilisation des listes de chanes Modification du registre Windows et des fichiers .INI Utilisation des flux

Utilisation des listes


Les objets suivants permettent de crer et grer des listes :
Tableau 3.5 Objet
TList TObjectList TComponentList TQueue TStack TObjectQueue TObjectStack TClassList TCollection, TOwnedCollection et TCollectionItem TStringList

Composants de cration et de gestion des listes G re


Une liste de pointeurs Une liste, gre en mmoire, dinstances dobjets Une liste, gre en mmoire, de composants (cest--dire dinstances de classes drives de TComponent) Une liste de pointeurs premier entr, premier sorti Une liste de pointeurs dernier entr, premier sorti Une liste dobjets premier entr, premier sorti Une liste dobjets dernier entr, premier sorti Une liste de types de classe Des collections indices dlments dfinis spcialement

Une liste de chanes

Pour davantage dinformations sur ces objets, consultez la rfrence en ligne.

Utilisation des bibliothques de composants

3-53

Emploi dobjets utilitaires

Utilisation des listes de chanes


Souvent les applications ont besoin de grer des listes de chanes de caractres. Par exemple, pour les lments dune bote options, les lignes dun mmo, les noms de fonte ou les noms des lignes et colonnes dune grille de chanes. La VCL et CLX proposent une interface pour toutes les listes de chanes via un objet appel TStrings et son descendant TStringList. TStringList implmente les proprits et mthodes abstraites introduites par TStrings, et introduit les proprits, vnements et mthodes pour trier les chanes de la liste, interdire les chanes en doubles dans les listes tries, rpondre aux changements du contenu de la liste. Outre les fonctionnalits concernant la gestion de listes de chanes, ces objets permettent une interoprabilit simple ; vous pouvez ainsi modifier les lignes dun mmo (instance de TStrings), puis utiliser ces lignes comme lments dune bote options (galement une instance de TStrings). Une proprit liste de chanes apparat dans linspecteur dobjets avec TStrings dans la colonne des valeurs. Double-cliquez sur TStrings pour ouvrir lditeur de liste de chanes qui vous permet de modifier, ajouter ou supprimer des chanes. Vous pouvez galement manipuler les objets liste de chanes lexcution pour effectuer les oprations suivantes : Lecture et enregistrement des listes de chanes Cration dune nouvelle liste de chanes Manipulation des chanes dune liste Association dobjets une liste de chanes

Lecture et enregistrement des listes de chanes


Les objets liste de chanes disposent des mthodes SaveToFile et LoadFromFile qui permettent de stocker une liste de chanes dans un fichier texte ou de charger un fichier texte dans une liste de chanes. Chaque ligne du fichier texte correspond une chane de la liste. En utilisant ces mthodes, vous pouvez, par exemple, crer un diteur de texte simple en chargeant un fichier dans un composant mmo ou enregistrer les listes dlments de botes options. Lexemple suivant charge une copie du fichier WIN.INI dans un champ mmo et en fait une copie de sauvegarde nomme WIN.BAK.
procedure EditWinIni; var FileName: string;{ stocke le nom du fichier } begin FileName := C:\WINDOWS\WIN.INI;{ dfinit le nom du fichier } with Form1.Memo1.Lines do begin LoadFromFile(FileName);{ lit le fichier } SaveToFile(ChangeFileExt(FileName, .BAK));{ enregistre dans un fichier de sauvegarde } end; end;

3-54

Guide du dveloppeur

Emploi dobjets utilitaires

Cration dune nouvelle liste de chanes


Habituellement, les listes de chanes font partie de composants. Nanmoins, il est parfois commode de crer des listes de chanes autonomes qui nont pas de composant associ (par exemple, pour stocker les chanes dune table de rfrence). La manire de crer et de grer une liste de chanes varie selon que la liste est une liste court terme (construite, utilise et dtruite dans une mme routine) ou une liste long terme (disponible jusqu larrt de lapplication). Quel que soit le type de liste de chanes cr, noubliez pas que cest vous de librer la liste quand vous nen navez plus besoin

Listes de chanes court terme


Si vous utilisez une liste de chanes uniquement pour la dure dune seule routine, vous pouvez la crer, lutiliser et la dtruire au mme emplacement. Cest la mthode la plus fiable pour utiliser des objets liste de chanes. Comme lobjet liste de chanes alloue la mmoire pour lui-mme et pour ses chanes, il est important de protger lallocation en utilisant un bloc try...finally afin de garantir que lobjet lib re sa mmoire mme si une exception a lieu.

1 Construire lobjet liste de chanes. 2 Utiliser la liste de chanes dans la partie try dun bloc try...finally. 3 Librer lobjet liste de chanes dans la partie finally.
Le gestionnaire dvnement suivant rpond au choix dun bouton en construisant un objet liste de chanes, en lutilisant puis en le dtruisant :
procedure TForm1.Button1Click(Sender: TObject); var TempList: TStrings;{ dclare la liste } begin TempList := TStringList.Create;{ construit lobjet liste } try { utilise la liste de chanes } finally TempList.Free;{ dtruit lobjet liste } end; end;

Listes de chanes long terme


Si la liste de chanes doit tre disponible tout au long de lexcution de votre application, vous devez construire la liste au dmarrage de lapplication et la dtruire avant la fermeture de lapplication.

1 Dans le fichier unit de la fiche principale de votre application, ajoutez un champ de type TStrings la dclaration de la fiche. 2 Crez un gestionnaire dvnement pour le constructeur de la fiche principale qui sexcute avant que la fiche napparaisse. Ce gestionnaire dvnement doit crer une liste de chanes et laffecter au champ dclar dans la premire tape. 3 Ecrivez un gestionnaire dvnement qui libre la liste de chanes dans lvnement OnClose de la fiche.

Utilisation des bibliothques de composants

3-55

Emploi dobjets utilitaires

Lexemple suivant utilise une liste de chanes long terme pour stocker les clics de la souris dans la fiche principale, puis enregistre la liste dans un fichier avant larrt de lapplication.
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; {Pour CLX : uses SysUtils, Classes, QGraphics, QControls, QForms, Qialogs;} type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Dclarations prives } public { Dclarations publiques } ClickList: TStrings;{ dclare le champ } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin ClickList := TStringList.Create;{ construit la liste } end; procedure TForm1.FormDestroy(Sender: TObject); begin ClickList.SaveToFile(ChangeFileExt(Application.ExeName, .LOG));{ enregistre la liste } ClickList.Free;{ dtruit lobjet liste } end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ClickList.Add(Format(Cliquer (%d, %d), [X, Y]));{ ajoute une chane la liste } end; end.

3-56

Guide du dveloppeur

Emploi dobjets utilitaires

Manipulation des chanes dune liste


Les oprations couramment effectues sur les listes de chanes sont les suivantes : Comptage des chanes dune liste Accs une chane spcifique Recherche de la position dune chane dans la liste Parcours des chanes dune liste Ajout dune chane une liste Dplacement dune chane dans une liste Suppression dune chane dune liste Copie de la totalit dune liste de chanes

Comptage des chanes dune liste


La proprit en lecture seule Count renvoie le nombre de chanes dans la liste. Comme les listes de chanes utilisent des indices de base zro, Count correspond lindice de la dernire chane plus un.

Accs une chane spcifique


La proprit tableau Strings contient les chanes de la liste, rfrences par un indice de base zro. Comme Strings est la proprit par dfaut des listes de chanes, vous pouvez omettre lidentificateur Strings pour accder la liste ; donc
StringList1.Strings[0] := Premire chane.;

est quivalent
StringList1[0] := Premire chane.;

Recherche dlments dans une liste de chanes


Pour rechercher une chane dans une liste de chanes, utilisez la mthode IndexOf. IndexOf renvoie lindice de la premire chane de la liste qui correspond au paramtre transmis et renvoie 1 si la chane transmise en paramtre nest pas trouve. IndexOf recherche uniquement une correspondance exacte ; si vous voulez obtenir des chanes de correspondance partielle, vous devez parcourir la liste de chanes. Vous pouvez, par exemple, utiliser IndexOf pour dterminer si un nom de fichier donn se trouve dans les lments (Items) dune bote liste :
if FileListBox1.Items.IndexOf(WIN.INI) > -1 ...

Parcours des chanes dune liste


Pour parcourir les chanes dune liste, utilisez une boucle for allant de zro Count 1. Lexemple suivant convertit en majuscules chaque chane dune bote liste.
procedure TForm1.Button1Click(Sender: TObject); var Index: Integer; begin

Utilisation des bibliothques de composants

3-57

Emploi dobjets utilitaires

for Index := 0 to ListBox1.Items.Count - 1 do ListBox1.Items[Index] := UpperCase(ListBox1.Items[Index]); end;

Ajout dune chane une liste


Pour ajouter une chane la fin dune liste de chanes, utilisez la mthode Add en lui transmettant en paramtre la nouvelle chane. Pour insrer une chane dans la liste, appelez la mthode Insert en lui transmettant deux paramtres : la chane et lindice laquelle elle doit tre place. Si, par exemple, vous voulez placer la chane Trois en troisime position dans la liste, utilisez :
Insert(2, Trois);

Pour ajouter une liste les chanes dune liste, appelez AddStrings :
StringList1.AddStrings(StringList2); { ajoute StringList1 les chanes de StringList2 }

Dplacement dune chane dans une liste


Pour dplacer une chane dans une liste de chanes, appelez la mthode Move en lui transmettant deux paramtres : lindice en cours de la chane et son nouvel indice. Par exemple, pour dplacer la troisime chane de la liste en cinquime position, utilisez :
Move(2, 4)

Suppression dune chane dune liste


Pour supprimer une chane dune liste de chanes, appelez la mthode Delete de la liste en lui transmettant lindice de la chane supprimer. Si vous ne connaissez pas lindice de la chane supprimer, utilisez la mthode IndexOf pour le dterminer. Pour supprimer toutes les chanes de la liste, utilisez la mthode Clear. Lexemple suivant utilise IndexOf et Delete pour trouver et supprimer une chane :
with ListBox1.Items do begin BIndex := IndexOf(bureaucratie); if BIndex > -1 then Delete(BIndex); end;

Copie de la totalit dune liste de chanes


Vous pouvez utiliser la mthode Assign pour copier les chanes dune liste source vers une liste de destination en remplaant le contenu de la liste de destination. Pour ajouter les chanes sans remplacer la liste de destination, utilisez la mthode AddStrings. Par exemple,
Memo1.Lines.Assign(ComboBox1.Items); { remplace les chanes existantes }

copie les lignes dune bote options dans un mmo (en crasant le contenu du mmo), alors que :
Memo1.Lines.AddStrings(ComboBox1.Items); { ajoute les chanes la fin }

3-58

Guide du dveloppeur

Emploi dobjets utilitaires

ajoute au mmo les lignes de la bote options. Quand vous effectuez une copie locale dune liste de chanes, utilisez la mthode Assign. Si vous affectez une variable liste de chanes une autre :
StringList1 := StringList2;

lobjet liste de chane initial est perdu, ce qui peut donner des rsultats imprvisibles.

Association dobjets une liste de chanes


Outre les chanes stockes dans sa proprit Strings, une liste de chanes peut grer des rfrences des objets dans sa proprit Objects. Comme Strings, Objects est un tableau dindice zro. Le plus souvent, Objects sert associer des bitmaps aux chanes dans des contrles dessins par le propritaire. Utilisez la mthode AddObject ou InsertObject pour ajouter en une seule tape la chane et son objet associ la liste. IndexOfObject renvoie lindice de la premire chane de la liste associe lobjet spcifi. Les mthodes comme Delete, Clear, et Move agissent la fois sur les chanes et les objets ; ainsi, la suppression dune chane supprime galement lventuel objet correspondant. Pour associer un objet une chane existante, affectez lobjet la proprit Objects pour le mme indice. Vous ne pouvez pas ajouter dobjet sans ajouter une chane correspondante.

Registre Windows et fichiers .INI (VCL seulement)


Le registre systme Windows est une base de donnes hirarchique dans laquelle les applications stockent des informations de configuration. La classe VCL TRegistry propose les mthodes permettant de lire et dcrire dans le registre. Avant Windows 95, la plupart des applications stockaient les informations de configuration dans des fichiers dinitialisation, utilisant gnralement lextension .INI. La VCL propose les classes suivantes pour faciliter la maintenance et la migration de programmes utilisant les fichiers INI. TRegistry pour utiliser le registre (VCL seulement). TIniFile (VCL seulement) ou TMemIniFile pour utiliser les fichiers INI. TRegistryIniFile pour utiliser la fois le registre et les fichiers INI (VCL seulement). TRegistryIniFile dispose de proprits et mthodes similaires celles de TIniFile mais il lit et crit dans le registre systme. En utilisant une variable de type TCustomIniFile (lanctre commun TIniFile, TMemIniFile et TRegistryIniFile), vous pouvez crire un code gnrique qui accde soit au registre, soit un fichier INI, selon lendroit o il est utilis. Seul TMemIniFile peut tre utilis en programmation multiplate-forme.

Utilisation des bibliothques de composants

3-59

Emploi dobjets utilitaires

Utilisation de TIniFile (VCL seulement)


Le format des fichiers .INI est toujours utilis ; la plupart des fichiers de configuration de Delphi (comme le fichier DSK de configuration du bureau) sont dans ce format. Comme ce format de fichier tait et est toujours important, la VCL fournit une classe facilitant la lecture et lcriture de ces fichiers. TIniFile ne peut pas tre utilis en programmation multiplate-forme. Quand vous instanciez lobjet TIniFile, il faut transmettre au constructeur un paramtre spcifiant le nom du fichier INI. Si le fichier nexiste pas dj, il est automatiquement cr. Vous pouvez alors utiliser la mthode ReadString, ReadInteger ou ReadBool. Par ailleurs, si vous souhaitez lire une section entire du fichier .INI, vous pouvez utiliser la mthodeReadSection. Vous pouvez, inversement, crire des valeurs en utilisant WriteBool, WriteInteger ou WriteString. Chacune des routines Read attend trois paramtres. Le premier identifie la section du fichier .INI. Le second paramtre identifie la valeur lire et le troisime est une valeur par dfaut utiliser si la section ou la valeur nexiste pas dans le fichier INI. De mme, les routines Write crent la section et/ou la valeur si elles nexistent pas. Lexemple prcdent cre un fichier .INI la premire fois quil est excut, et ce fichier ressemble ceci :
[Form] Top=185 Left=280 Caption=Default Caption InitMax=0

Lors des excutions ultrieures de cette application, les valeurs INI sont lues lors de la cration de la fiche et rcrites dans lvnement OnClose.

Utilisation de TRegistry
La plupart des applications 32 bits stockent leurs informations dans cette base plutt que dans les fichiers .INI, car la base de registres est hirarchique, plus robuste, et ne souffre pas des limitations de taille inhrentes aux fichiers .INI. Lobjet TRegistry contient des mthodes pour ouvrir, fermer, sauvegarder, dplacer, copier et supprimer des cls. TRegistry ne peut pas tre utilis en programmation multiplate-forme. Pour plus dinformations, voir la rubrique TRegistry dans laide en ligne.

Utilisation de TRegIniFile
Si vous tes habitu lutilisation des fichiers .INI, et que vous souhaitiez dplacer vos informations de configuration dans la base de registres, vous pouvez utiliser la classe TRegIniFile. TRegIniFile a t conue pour utiliser les entres de la base de registres de faon similaire celles des fichiers .INI. Toutes les mthodes de TIniFile (lecture et criture) existent dans TRegIniFile. Quand vous crez un objet TRegIniFile, le paramtre que vous passez (le nom du fichier pour un objet IniFile) devient le nom dune cl dans la cl de lutilisateur en cours dans la base de registres, et toutes les sections et valeurs commencent partir de cette racine. En fait, cet objet simplifie considrablement linterfaage

3-60

Guide du dveloppeur

Emploi dobjets utilitaires

avec la base de registres, de sorte que vous pourriez vouloir lutiliser plutt que TRegistry, mme si vous ne portez pas un code existant. TRegIniFile ne peut pas tre utilis en programmation multiplate-forme. Pour davantage dinformations, voir dans la rfrence VCL en ligne la rubrique TRegIniFile.

Cration despaces de dessin


Le TCanvas encapsule un contexte de priphrique Windows dans la VCL et un dispositif de peinture (peintre Qt) dans CLX, qui gre tous les affichages dans les fiches, les conteneurs visuels (comme les volets) et lobjet imprimante (trait dans Impression la page 3-61). En utilisant lobjet canevas, vous navez plus besoin dallouer crayons, pinceaux ou palettes : ils sont allou s et librs automatiquement. TCanvas propose un grand nombre de routines de dessin pour dessiner des lignes, des formes, des polygones, du texte, etc. dans tout contrle contenant un canevas. Par exemple, voici un gestionnaire dvnement de bouton qui dessine une ligne depuis le coin suprieur gauche au milieu de la fiche, et affiche du texte brut sur la fiche :
procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Pen.Color := clBlue; Canvas.MoveTo( 10, 10 ); Canvas.LineTo( 100, 100 ); Canvas.Brush.Color := clBtnFace; Canvas.Font.Name := Arial; Canvas.TextOut( Canvas.PenPos.x, Canvas.PenPos.y,Fin de la ligne); end;

Dans les applications Windows, lobjet TCanvas vous protge galement contre les erreurs graphiques courantes de Windows, comme la restauration des contextes de priphrique, des crayons, des pinceaux, etc. la valeur quils avaient avant lopration de dessin. TCanvas est utilis dans Delphi quand il faut dessiner et il permet de le faire de manire la fois simple et fiable. Pour une liste complte des proprits et mthodes de TCanvas, voir la rfrence en ligne.

Impression
Lobjet VCL TPrinter encapsule les dtails de limpression sous Windows. Pour obtenir une liste des imprimantes disponibles, utilisez la proprit Printers. Lobjet CLX TPrinter est un dispositif de peinture qui opre sur une imprimante. Il gnre du postscript et lenvoie lpr, lp ou toute autre commande dimpression.

Utilisation des bibliothques de composants

3-61

Emploi dobjets utilitaires

Les deux objets imprimante utilisent un TCanvas (similaire au TCanvas de la fiche), ce qui signifie que tout ce qui peut tre dessin dans une fiche peut galement tre imprim. Pour imprimer une image, appelez dabord la mthode BeginDoc, puis les routines des dessins de canevas imprimer (y compris du texte en utilisant la mthode TextOut), et envoyez la tche limprimante en appelant la mthode EndDoc. Cet exemple utilise un bouton et un mmo sur une fiche. Quand lutilisateur clique sur le bouton, le contenu du mmo simprime avec une marge de 200 pixels autour de la page. Pour pouvoir excuter cet exemple, vous devez ajouter Printers dans votre clause uses.
procedure TForm1.Button1Click(Sender: TObject); var r: TRect; i: Integer; begin with Printer do begin r := Rect(200,200,(Pagewidth - 200),(PageHeight - 200)); BeginDoc; for i := 0 to Memo1.Lines.Count do Canvas.TextOut(200,200 + (i * Canvas.TextHeight(Memo1.Lines.Strings[i])), Memo1.Lines.Strings[i]); Canvas.Brush.Color := clBlack; Canvas.FrameRect(r); EndDoc; end; end;

Pour davantage dinformations sur lobjet TPrinter, voir dans laide en ligne la rubrique du mme nom.

Utilisation des flux


Les flux sont simplement des moyens de lire et dcrire des donnes. Ils offrent une interface commune pour la lecture et lcriture dans diffrents supports, tels la mmoire, les chanes, les sockets et les flux de blobs. Dans lexemple suivant, un fichier est copi dans un autre laide de flux. Lapplication comprend deux contrles ddition (From et To) et un bouton pour copier le fichier.
procedure TForm1.CopyFileClick(Sender: TObject); var stream1, stream2:TStream; begin stream1:=TFileStream.Create(From.Text,fmOpenRead or fmShareDenyWrite); try stream2 := TFileStream.Create(To.Text fmOpenCreate or fmShareDenyRead); try

3-62

Guide du dveloppeur

Emploi dobjets utilitaires

stream2.CopyFrom(Stream1,Stream1.Size); finally stream2.Free; finally stream1.Free end;

Utilisez des objets flux spcialiss pour lire, crire dans un support de stockage. Chaque descendant de TStream implmente des mthodes pour accder un support de stockage particulier : fichier disque, mmoire dynamique, etc. Les descendants de TStream sont TFileStream, TStringStream et TMemoryStream. Outre les mthodes de lecture et dcriture, ces objets permettent aux applications de se positionner de manire arbitraire dans le flux. Les proprits de TStream donnent des informations sur le flux, comme sa taille ou la position en cours.

Utilisation des bibliothques de composants

3-63

3-64

Guide du dveloppeur

Chapitre

Chapitre 4

Sujets de programmation gnraux

Ce chapitre dcrit comment effectuer dans Delphi les tches de programmation les plus courantes : Comprhension des classes Dfinition des classes Gestion des exceptions Utilisation des interfaces Dfinition de variants personnaliss. Utilisation des chanes Utilisation des fichiers Conversion de mesures

Comprhension des classes


Une classe est une dfinition abstraite de proprits, de mthodes, dvnements et de membres (comme les variables locales la classe). Lorsque vous crez une instance dune classe, cette instance est appel objet. Le terme objet est souvent utilis de manire inexacte dans la documentation Delphi et, lorsque la distinction entre une classe et une instance de cette classe est sans importance, le terme objet peut galement faire rfrence une classe. Bien que Delphi comprenne de nombreuses classes dans sa hirarchie dobjets, il vous faudra probablement en crer de nouvelles si vous crivez des programmes orients objets. Les classes que vous crivez doivent descendre de TObject ou de lun de ses descendants. La dclaration du type dune classe peut possder trois sections pour contrler laccessibilit de ses champs et de ses mthodes :
Type TClassName = Class(TObject) public {champs publics} {mthodes publiques}

Sujets de programmation gnraux

4-1

Comprhension des classes

protected {champs protgs} {mthodes protges} private {champs privs} {mthodes prives} end;

La section public dclare les champs et les mthodes sans aucune contrainte daccs ; les instances de la classe et les classes drives peuvent accder ces champs et ces mthodes. La section protected inclut les champs et les mthodes comportant certaines contraintes daccs ; les classes drives peuvent accder ces champs et ces mthodes. La section private dclare les champs et les mthodes ayant de fortes contraintes daccs ; ils ne peuvent tre accds ni par les instances de la classe ni par les classes drives. Lintrt de lutilisation des classes est que vous pouvez crer les nouvelles classes en les faisant driver des classes existantes. Chaque classe hrite des champs et des mthodes de son parent et de ses classes anctres. Vous pouvez aussi dclarer des mthodes de la nouvelle classe qui surchargent les mthodes hrites, introduisant ainsi un nouveau comportement plus spcialis. La syntaxe gnrale dune classe drive est la suivante :
Type TClassName = Class (TParentClass) public {champs publics} {mthodes publiques} protected {champs protgs} {mthodes protges} private {champs privs} {mthodes prives} end;

Si aucun nom de classe parent nest spcifi, la classe hrite directement de TObject. TObject ne dfinit que quelques mthodes, ainsi qu un constructeur et un destructeur de base. Pour davantage dinformations sur la syntaxe, les dfinitions du langage et les rgles respecter pour les classes, voir dans laide en ligne du Guide du langage Pascal Objet la rubrique Types de classes.

4-2

Guide du dveloppeur

Dfinition des classes

Dfinition des classes


Delphi vous permet de dclarer des classes implmentant les fonctionnalits de programmation que vous voulez utiliser dans votre application. Certaines versions de Delphi comprennent une fonctionnalit appele achvement de classe qui simplifie le travail de dfinition et dimplmentation des nouvelles classes en gnrant le squelette du code ncessaire aux membres de classe que vous dclarez. Pour dfinir une classe,

1 Dans lEDI, commencez par ouvrir un projet puis choisissez Fichier|Nouveau| Unit afin de crer la nouvelle unit o vous pourrez dfinir la nouvelle classe. 2 Ajoutez la clause uses et la section type la section interface. 3 Dans la section type, crivez la dclaration de la classe. Vous devez dclarer toutes les variables membres, toutes les proprits, toutes les mthodes et tous les vnements.
TMyClass = class; {Descend implicitement de TObject} public . . . . . . private . . . published {Si driv de TPersistent ou dun niveau infrieur} . . . Remarque

Lobjet qui contient les donnes du variant personnalis doit tre compil avec RTTI. Cela signifie quil doit tre compil en utilisant la directive {$M+} ou descendre de TPersistent ou dun descendant. Si vous voulez que la classe drive dune classe particulire, vous devez indiquer cette classe dans la dfinition :
TMyClass = class(TParentClass); {Descend de TParentClass}

Par exemple :
type TMyButton = class(TButton) property Size: Integer; procedure DoSomething; end;

Si votre version de Delphi supporte lachvement de classe : placez le curseur lintrieur de la dfinition dune mthode dans la section interface et

Sujets de programmation gnraux

4-3

Dfinition des classes

appuyez sur Ctrl+Maj+C (ou cliquez avec le bouton droit et slectionnez Complter la classe sous le curseur). Delphi complte toutes les dclarations de proprit inacheves et cre les mthodes vides ncessaires dans la section implementation. (Si vous ne bnficiez pas de lachvement de classe, vous devrez crire le code vous-mme, en compltant les dclarations de proprit et en crivant les mthodes.) Dans le cas de lexemple prcdent, si vous bnficiez de lachvement de classe, Delphi ajoute les spcificateurs read et write la dclaration de votre interface, y compris les champs ou les mthodes de support :
type TMyButton = class(TButton) property Size: Integer read FSize write SetSize; procedure FaireQuelqueChose; private FSize: Integer; procedure SetSize(const Value: Integer);

Il ajoute galement le code suivant la section implementation de lunit.


{ TMyButton } procedure TMyButton.FaireQuelqueChose; begin end; procedure TMyButton.SetSize(const Value: Integer); begin FSize := Value; end;

4 Remplissez les mthodes. Par exemple, pour faire sonner le bouton lorsque vous appelez la mthode FaireQuelqueChose, ajoutez un Beep entre begin et end.
{ TMyButton } procedure TMyButton.FaireQuelqueChose; begin Beep; end; procedure TMyButton.SetSize(const Value: Integer); begin if fsize < > value then begin FSize := Value; FaireQuelqueChose; end; end;

Remarquez que le bouton met galement un bip lorsque vous appelez SetSize pour modifier la taille du bouton. Pour davantage dinformations sur la syntaxe, les dfinitions du langage et les rgles respecter pour les classes et les mthodes, voir dans laide en ligne du Guide du langage Pascal Objet les rubriques Types de classes et mthodes.

4-4

Guide du dveloppeur

Gestion des exceptions

Gestion des exceptions


Delphi propose un mcanisme permettant de grer les erreurs dune manire systmatique. La gestion des exceptions permet lapplication de grer les erreurs si cest possible et, si cest ncessaire, de se fermer sans perdre de donnes ou de ressources. Les conditions derreurs sont indiques dans Delphi par des exceptions. Cette section dcrit les aspects suivants de lutilisation des exceptions pour crer des applications fiables : Protection des blocs de code Protection de lallocation de ressources Gestion des exceptions RTL Gestion des exceptions des composants Gestion des exceptions et sources externes Exceptions silencieuses Dfinition dexceptions personnalises

Protection des blocs de code


Pour rendre vos applications plus fiables, votre code doit reconnatre les exceptions quand elles se produisent et y rpondre. Si vous ne spcifiez pas de rponse, lapplication affiche une bote message dcrivant lerreur. Votre travail consiste donc dterminer o les erreurs peuvent se produire et dfinir des rponses ces erreurs, en particulier dans les situations o une erreur peut entraner une perte de donnes ou de ressources systme. Quand vous crez la rponse une exception, vous le faites pour des blocs de code. Quand une suite dinstructions ncessitent toutes le mme type de rponse aux erreurs, vous pouvez les regrouper dans un bloc et dfinir des rponses aux erreurs qui portent sur la totalit du bloc. Les blocs disposant de rponses spcifiques des exceptions sont appels des blocs protgs car ils sont capables de se prmunir contre les erreurs qui, sinon, provoquent larrt de lapplication ou la perte de donnes. Pour protger des blocs de code, vous devez matriser : Rponse aux exceptions Exceptions et contrle dexcution Rponses des exceptions imbriques

Rponse aux exceptions


Quand une condition derreur se produit, lapplication dclenche une exception : elle cre un objet exception. Une fois lexception dclenche, votre application peut excuter du code de nettoyage, grer lexception ou faire les deux.

Excution de code de nettoyage


La manire la plus simple de rpondre une exception est de garantir que du code de nettoyage est bien excut. Ce type de rponse ne corrige pas la

Sujets de programmation gnraux

4-5

Gestion des exceptions

situation qui a provoqu lerreur mais vous assure que lapplication ne laisse pas lenvironnement dans un tat instable. Gnralement, vous utiliserez ce type de rponse pour garantir que lapplication libre bien les ressources alloues quelle que soit lerreur qui a eu lieu.

Gestion dune exception


Cest une rponse spcifique un type particulier dexception. La gestion dune exception supprime la condition derreur et dtruit lobjet exception, ce qui permet lapplication de poursuivre son excution. Normalement, vous dfinissez des gestionnaires dexceptions pour permettre aux applications de se rtablir aprs des erreurs et de poursuivre lexcution. Vous pouvez grer des types divers dexceptions, par exemple des tentatives douverture dun fichier inexistant, lcriture dans un disque plein ou des dbordements dans des calculs. Certaines dentre elles, comme Fichier non trouv sont faciles corriger et reprendre tandis que dautres, comme linsuffisance de mmoire, sont plus difficiles corriger pour lapplication ou lutilisateur. La gestion efficace des exceptions ncessite la matrise des sujets suivants : Cration dun gestionnaire dexception Instructions de gestion des exceptions Utilisation de linstance dexception Porte des gestionnaires dexceptions Spcification du gestionnaire dexception par dfaut Gestion des classes dexceptions Redclenchement de lexception

Exceptions et contrle dexcution


Le Pascal Objet permet dinclure facilement la gestion des erreurs dans les applications car les exceptions ne rentrent pas dans le droulement normal du code. En fait, en dplaant la vrification et la gestion des erreurs hors du droulement principal de vos algorithmes, les exceptions peuvent simplifier le code que vous crivez. Quand vous dclarez un bloc protg, vous dfinissez des rponses spcifiques aux exceptions qui peuvent se produire lintrieur du bloc. Quand une exception se produit dans le bloc, lexcution sort du bloc, passe immdiatement la rponse que vous avez dfini.
Exemple

Le code suivant comporte un bloc protg. Si une exception se produit dans le bloc protg, lexcution passe la partie gestion dexception qui gnre un bip sonore. Lexcution se poursuit hors du bloc :
try AssignFile(F, FileName); Reset(F); except on Exception do Beep; end; { lexcution reprend ici, hors du bloc protg }

4-6

Guide du dveloppeur

Gestion des exceptions

Rponses des exceptions imbriques


Votre code dfinit des rponses aux exceptions se produisant dans des blocs. Comme le Pascal permet dimbriquer des blocs de code lintrieur dautres blocs de code, vous pouvez mme personnaliser les rponses lintrieur de blocs qui contiennent dj des rponses personnalises. Dans le cas le plus simple vous pouvez, par exemple protger lallocation dune ressource et, lintrieur de ce bloc protg, dfinir des blocs qui allouent et protgent dautres ressources. Conceptuellement, cela peut se reprsenter de la manire suivante :

Vous pouvez galement utiliser des blocs imbriqus afin de dfinir une gestion locale, pour des exceptions spcifiques, qui redfinit la gestion du bloc environnant. Conceptuellement, cela peut se reprsenter de la manire suivante :

Vous pouvez galement mlanger diffrentes sortes de blocs de rponse aux exceptions, par exemple en imbriquant la protection de ressources dans des blocs de gestion dexceptions ou linverse.

Protection de lallocation de ressources


Pour garantir la fiabilit de vos applications, un lment essentiel est de sassurer lors de lallocation des ressources que vous les librez mme si une exception a lieu. Ainsi, quand votre application alloue de la mmoire, vous devez vous assurer quelle la libre bien. De mme, si elle ouvre un fichier, vous devez vous assurer que le fichier est bien ferm ultrieurement. Noubliez pas que votre code nest pas seul gnrer des exceptions. Lappel dune routine RTL ou dun autre composant de votre application peut aussi

Sujets de programmation gnraux

4-7

Gestion des exceptions

dclencher une exception. Votre code doit sassurer que mme dans ces situations les ressources alloues sont correctement libres. Pour protger les ressources de manire fiable, vous devez matriser ceci : Quelles ressources doivent tre protges ? Cration dun bloc de protection de ressource

Quelles ressources doivent tre protges ?


Dans une situation normale, vous pouvez garantir quune application libre les ressources alloues en spcifiant simplement le code dallocation et de libration des ressources. Quand des exceptions ont lieu, vous devez vous assurer que lapplication excute quand mme le code de libration des ressources. Certaines ressources courantes doivent toujours tre libres :
Exemple

Les fichiers La mmoire Les ressources Windows (VCL seulement) Les objets

Le gestionnaire dvnement suivant alloue de la mmoire puis gnre une erreur ; il ne libre donc jamais la mmoire :
procedure TForm1.Button1Click(Sender: TComponent); var APointer: Pointer; AnInteger, ADividend: Integer; begin ADividend := 0; GetMem(APointer, 1024);{ allouer 1Ko de mmoire } AnInteger := 10 div ADividend;{ cela provoque une erreur } FreeMem(APointer, 1024);{ Le code narrive jamais ici } end;

Toutes les erreurs ne sont pas aussi videntes, mais cet exemple illustre un principe important : quand lerreur de division par zro se produit, lexcution sort du bloc, ainsi linstruction FreeMem nest donc jamais excute pour librer la mmoire. Pour tre certain que FreeMem a la possibilit de librer le bloc de mmoire allou par GetMem, vous devez placer le code dans un bloc de protection de ressource.

Cration dun bloc de protection de ressource


Pour garantir que des ressources alloues sont effectivement libres, mme en cas dexception, vous devez intgrer le code utilisant la ressource dans un bloc protg, le code de libration de la ressource tant plac dans une partie spciale du bloc. Voici lorganisation gnrale dune allocation protge de ressource :
{ allocation de la ressource } try { instructions utilisant la ressource } finally

4-8

Guide du dveloppeur

Gestion des exceptions

{ libration de la ressource } end;

Le secret de linstruction try..finally, cest que lapplication excute toujours les instructions places dans la partie finally du bloc mme quand des exceptions se produisent dans le bloc protg. Si du code (mme une routine appele) de la partie try du bloc dclenche une exception, lexcution sinterrompt l. Quand un gestionnaire dexception est trouv, lexcution se poursuit dans la partie finally, qui est appele le code de nettoyage. Une fois la partie finally excute, le gestionnaire dexception est appel. Quand il ny a pas dexception, le code de nettoyage est excut dans lordre normal aprs toutes les instructions de la partie try.
Exemple

Le gestionnaire dvnement dfini par le code suivant alloue de la mmoire et gnre une erreur mais libre quand mme la mmoire alloue :
procedure TForm1.Button1Click(Sender: TComponent); var APointer: Pointer; AnInteger, ADividend: Integer; begin ADividend := 0; GetMem(APointer, 1024);{ allouer 1Ko de mmoire } try AnInteger := 10 div ADividend;{ gnre une erreur } finally FreeMem(APointer, 1024);{ malgr lerreur, lexcution reprend ici } end; end;

Les instructions places dans le bloc finally ne dpendent pas de lapparition dune exception. Si les instructions de la partie try ne dclenchent pas dexception, lexcution se poursuit quand mme par le bloc finally.

Gestion des exceptions RTL


Quand vous crivez du code qui appelle les routines de la bibliothque dexcution (RTL), comme les fonctions mathmatiques ou les procdures de gestion de fichier, la RTL informe votre application des erreurs par le biais dexceptions. Par dfaut, les exceptions RTL g nrent un message affich par lapplication. Vous pouvez dfinir vos propres gestionnaires pour grer diffremment les exceptions RTL. Il existe galement des exceptions silencieuses qui, par dfaut, naffichent pas de message. Les exceptions RTL sont gres comme les autres exceptions. La gestion des exceptions RTL ncessite la matrise des sujets suivants : Quest-ce qu une exception RTL ? Cration dun gestionnaire dexception Instructions de gestion des exceptions Utilisation de linstance dexception

Sujets de programmation gnraux

4-9

Gestion des exceptions

Porte des gestionnaires dexceptions Spcification du gestionnaire dexception par dfaut Gestion des classes dexceptions Redclenchement de lexception

Quest-ce quune exception RTL ?


Les exceptions de la bibliothque dexcution sont dfinies dans lunit SysUtils, elles drivent toutes dun type dobjet exception gnrique appel Exception. Exception dfinit la chane du message, affich par dfaut, par les exceptions RTL. Il existe plusieurs sortes dexceptions dclenches par la RTL, dcrites dans le tableau suivant.
Tableau 4.1 Exceptions RTL Cause
Erreur daccs un fichier ou un priphrique dE/S. Erreur dutilisation de la m moire dynamique. Opration illgale sur des expressions de type entier. Opration illgale sur des expressions de type rel.

Type derreur
Entres/Sorties

Signification
La plupart des exceptions dE/S sont lies des codes derreur renvoys lors de laccs un fichier. Les erreurs de tas se produisent quand il ny a pas assez de mmoire disponible ou lorsquune application libre un pointeur qui pointe hors du tas. Ces erreurs sont la division par zro, les nombres et les expressions hors tendue et les dbordements. Les erreurs dans les calculs virgule flottante proviennent du coprocesseur ou de lmulateur logiciel. Ces erreurs sont les instructions incorrectes, la division par zro et les dbordements. Les objets ne peuvent tre transtyps que dans des types compatibles. Les fonctions de conversion de type comme IntToStr, StrToInt ou StrToFloat dclenchent des exceptions de conversion quand le paramtre ne peut tre converti dans le type souhait. Les exceptions matrielles indiquent que le processeur ou lutilisateur a gnr une condition derreur ou une interruption, par exemple une violation daccs, un dbordement de pile ou une interruption clavier. Des erreurs peuvent se produire dans des expressions faisant rfrence des variants quand le variant ne peut tre forc dans un type compatible.

Tas

Calcul entier

Calcul virgule flottante

Transtypage Conversion

Transtypage incorrect avec loprateur as. Conversion de type incorrect

Matrielle

Condition du systme

Variant

Coercition de type illgale

Pour avoir la liste des types dexception RTL, voir le code de lunit SysUtils.

4-10

Guide du dveloppeur

Gestion des exceptions

Cration dun gestionnaire dexception


Un gestionnaire dexception est le code qui gre une exception spcifique ou toutes les exceptions se produisant dans un bloc de code protg. Dans la programmation multiplate-forme, vous aurez trs rarement besoin dcrire un gestionnaire dexception. La majorit des exceptions peuvent tre gres en utilisant les blocs try..finally comme dcrit dans Protection des blocs de code la page 4-5 et Protection de lallocation de ressources la page 4-7. Pour dfinir un gestionnaire dexception, incorporez le code protger dans un bloc de gestion des exceptions et spcifiez les instructions de gestion des exceptions dans la partie except du bloc. Le code suivant est le squelette dun bloc de gestion des exceptions standard :
try { instructions protger } except { instructions de gestion des exceptions } end;

Lapplication excute les instructions de la partie except uniquement si une exception se produit lors de lexcution des instructions places dans la partie try. Lexcution des instructions de la partie try inclut galement les routines appeles par le code la partie try. Cela signifie que si la partie try appelle une routine ne dfinissant pas son propre gestionnaire dexception, lexcution revient sur le bloc de gestion des exceptions qui gre lexception. Quand une instruction de la partie try dclenche une exception, lexcution passe immdiatement la partie except o elle passe en revue les instructions de gestion dexception spcifies ou les gestionnaires dexceptions, jusqu trouver un gestionnaire sappliquant lexception en cours. Quand lapplication a trouv un gestionnaire dexception qui gre lexception, elle excute linstruction puis dtruit automatiquement lobjet exception. Lexcution reprend ensuite aprs la fin du bloc en cours.

Instructions de gestion des exceptions


Chaque instruction on dans la partie except dun bloc try..except dfinit le code grant un type particulier dexception. Les instructions de gestion des exceptions ont la forme suivante :
on <type dexception> do <instruction>; Exemple

Vous pouvez ainsi dfinir un gestionnaire dexception pour la division par zro qui dfinit un rsultat par dfaut :
function GetAverage(Sum, NumberOfItems: Integer): Integer; begin try Result := Sum div NumberOfItems;{ gre le cas normal } except on EDivByZero do Result := 0;{ gre lexception si cest ncessaire } end; end;

Sujets de programmation gnraux

4-11

Gestion des exceptions

Remarquez que cette organisation est plus claire que de placer un test de nullit chaque appel de la fonction. Voici la mme fonction crite sans tirer profit des exceptions :
function GetAverage(Sum, NumberOfItems: Integer): Integer; begin if NumberOfItems <> 0 then{ tester systmatiquement } Result := Sum div NumberOfItems{ utiliser le calcul normal } else Result := 0;{ grer le cas exceptionnel } end;

La diffrence entre ces deux fonctions rsume trs bien les diffrences entre une programmation utilisant les exceptions et une programmation qui ne les utilise pas. Cet exemple est relativement simple mais vous pouvez imaginer des calculs plus complexes faisant intervenir des centaines dtapes, chacune pouvant chouer si un des paramtres parmi une douzaine est invalide. En utilisant des exceptions, vous pouvez exprimer la forme normale de votre algorithme puis, aprs, dfinir les cas exceptionnels pour lesquels elle nest pas applicable. Sans les exceptions, vous devez effectuer un test chaque fois pour vous assurer que vous avez bien le droit deffectuer ltape suivante du calcul.

Utilisation de linstance dexception


La plupart du temps, un gestionnaire dexception na pas besoin dinformations sur lexception autre que son type, les instructions qui suivent on..do sont donc seulement spcifiques au type de lexception. Nanmoins, dans certains cas vous avez besoin des informations contenues dans linstance dexception. Pour lire dans un gestionnaire dexception les informations spcifiques une instance dexception, vous devez utiliser une variante particulire de la construction on..do qui vous donne accs linstance dexception. Cette forme spciale ncessite la spcification dune variable temporaire utilise pour stocker linstance.
Exemple

Crez un nouveau projet qui contient une seule fiche, ajoutez-lui une barre de dfilement et un bouton de commande. Double-cliquez sur le bouton et dfinissez le gestionnaire de son vnement clic :
ScrollBar1.Max := ScrollBar1.Min - 1;

Cette ligne dclenche une exception car la valeur maximum de ltendue dune barre de dfilement doit tre suprieure la valeur minimum. Le gestionnaire dexception par dfaut de lapplication ouvre une bote de dialogue contenant le message de lobjet exception. Vous pouvez redfinir la gestion de lexception dans ce gestionnaire dvnement afin de crer votre propre bote message contenant la chane de message de lexception :
try ScrollBar1.Max := ScrollBar1.Min - 1; except on E: EInvalidOperation do MessageDlg(Ignorer lexception: + E.Message, mtInformation, [mbOK], 0); end;

4-12

Guide du dveloppeur

Gestion des exceptions

La variable temporaire (ici E) est du type spcifi aprs le caractre deux points (EInvalidOperation dans cet exemple). Vous pouvez, si ncessaire, utiliser loprateur as pour transtyper lexception dans un type plus spcifique.
Remarque

Ne dtruisez jamais lobjet exception temporaire. La gestion de lexception dtruit automatiquement lobjet exception. Si vous dtruisez lobjet vous-mme, lapplication tente nouveau de dtruire lobjet, ce qui gnre une violation daccs.

Porte des gestionnaires dexceptions


Il nest pas ncessaire de spcifier dans chaque bloc des gestionnaires pour toutes les exceptions imaginables. En fait, vous navez besoin que des gestionnaires des exceptions que vous voulez grer dune manire particulire dans un bloc donn. Si un bloc ne gre pas une exception spcifique, lexcution sort de ce bloc et revient au bloc contenant le bloc (ou revient au code qui a appel le bloc), et lexception est toujours dclenche. Ce processus se rpte en augmentant la porte jusqu ce que lexcution atteigne la porte de lapplication ou un bloc qui, un niveau quelconque, gre lexception.

Spcification du gestionnaire dexception par dfaut


Vous pouvez dfinir un seul gestionnaire dexception par dfaut qui g re toutes les exceptions nayant pas de gestionnaire spcifiquement dfini. Pour ce faire, vous devez ajouter une partie else dans la partie except du bloc de gestion des exceptions :
try { instructions } except on ESomething do { code de gestion dexception spcifique }; else { code de gestion dexception par dfaut }; end;

Lajout dune gestion par dfaut des exceptions dans un bloc garantit que ce bloc gre, dune manire ou dune autre, toutes les exceptions. Cela redfinit donc toute gestion effectue par un bloc conteneur.
Attention

Il nest pas conseill dutiliser le gestionnaire dexception par dfaut qui couvre un domaine trop vaste. La clause else gre toutes les exceptions, y compris celles dont vous ne connaissez rien. En gnral, votre code ne doit grer que les exceptions que vous savez comment grer. Si vous voulez la fois faire le mnage et rserver la gestion des exceptions du code disposant de davantage dinformations sur lexception et la manire de la grer, utilisez un bloc try..finally :
try try { instructions } except

Sujets de programmation gnraux

4-13

Gestion des exceptions

on ESomething do { code de gestion dexception spcifique }; end; finally { code de nettoyage }; end;

Pour une autre approche de lamplification de la gestion des exceptions, Redclenchement de lexception.

Gestion des classes dexceptions


Comme les objets exception font partie dune hirarchie, vous pouvez spcifier des gestionnaires pour toute une partie de la hirarchie en spcifiant un gestionnaire pour la classe dexception dont drive cette partie de la hirarchie.
Exemple

Le bloc suivant est le squelette dun exemple grant toutes les exceptions de calcul entier de manire spcifique :
try { instructions effectuant des oprations de calcul entier } except on EIntError do { gestion spciale des erreurs de calcul entier }; end;

Vous pouvez toujours dfinir des gestionnaires plus sp cifiques pour des exceptions plus spcifiques. Vous devez juste placer les gestionnaires spcifiques avant le gestionnaire gnrique car lapplication recherche les gestionnaires dans leur ordre dapparition et excute le premier gestionnaire applicable trouv. Par exemple, le bloc suivant dfinit une gestion spcifique des erreurs dtendue et un autre gestionnaire pour toutes les autres erreurs de calcul entier :
try { instructions effectuant des oprations de calcul entier } except on ERangeError do { gestion des calculs hors tendue }; on EIntError do { gestion des autres erreurs de calcul entier }; end;

Par contre, si le gestionnaire de EIntError est plac avant le gestionnaire de ERangeError, lexcution natteint jamais le gestionnaire spcifique ERangeError.

Redclenchement de lexception
Parfois, quand vous grez localement une exception, vous voulez juste tendre la gestion dfinie par le bloc conteneur et pas la remplacer. Mais, bien entendu, quand votre gestionnaire local en a fini avec lexception, il dtruit automatiquement linstance dexception et le gestionnaire du bloc conteneur ne peut donc pas agir dessus. Vous pouvez nanmoins empcher le gestionnaire de dtruire lexception, ce qui laisse au gestionnaire du conteneur lopportunit dy rpondre.
Exemple

Quand une exception se produit, vous voulez afficher un message lintention de lutilisateur ou enregistrer lerreur dans un fichier historique, puis laisser faire la gestion standard. Pour ce faire, dclarez un gestionnaire local de lexception

4-14

Guide du dveloppeur

Gestion des exceptions

qui affiche le message puis utilise le mot rserv raise. Cest ce que lon appelle redclencher lexception, comme le montre le code suivant :
try { instructions } try { instructions spciales } except on ESomething do begin { ne gre que les instructions spciales } raise;{ redclenche lexception } end; end; except on ESomething do ...;{ gestion effectuer dans tous les cas } end;

Si le code de la partie { instructions } dclenche une exception ESomething, seul le gestionnaire de la partie except extrieure sexcute. Par contre, si cest le code de la partie { instructions spciales } qui dclenche une exception ESomething, la gestion dfinie dans la partie except intrieure est excute suivie par celle, plus gnrale, de la partie except extrieure. En redclenchant des exceptions, vous pouvez facilement dfinir une gestion spcifique dexceptions pour des cas particuliers sans perdre (ou sans dupliquer) les gestionnaires existants.

Gestion des exceptions des composants


Les composants de Delphi dclenchent des exceptions pour indiquer des conditions derreur. La plupart des exceptions de composant signalent des erreurs de programmation qui sinon gnreraient une erreur dexcution. La technique pour grer les exceptions de composants nest pas diffrente de celle utilise pour les exceptions RTL.
Exemple

Les erreurs dintervalles dans les proprits indices sont une source frquente derreur dans les composants. Si, par exemple, pour une bote liste dont la liste contient trois lments (0..2), votre application tente daccder llment numro 3, la bote liste dclenche une exception Indice de liste hors limites. Le gestionnaire dvnement suivant contient un gestionnaire dexception qui informe lutilisateur de laccs un indice invalide de la bote liste :
procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Add(une chane);{ ajoute une chane la bote liste } ListBox1.Items.Add(une autre chane);{ ajoute une autre chane... } ListBox1.Items.Add(encore une autre chane);{ ...et une troisime chane} try Caption := ListBox1.Items[3];{ Affecte la quatrime chane de la bote liste lintitul de la fiche } except on EStringListError do

Sujets de programmation gnraux

4-15

Gestion des exceptions

MessageDlg(La bote liste contient moins de quatre chanes, mtWarning, [mbOK], 0); end; end;

Si vous cliquez sur le bouton, comme la bote liste ne contient que trois chanes, laccs la quatrime chane (Items[3]) dclenche une exception. Si vous cliquez une seconde fois sur le bouton, dautres chanes sont ajoutes la liste et lexception nest donc plus dclenche.

Gestion des exceptions et sources externes


HandleException propose une gestion par dfaut des exceptions au niveau de lapplication. Normalement, quand vous dveloppez des applications multiplatesformes vous navez pas besoin dappeler TApplication.HandleException. Cependant, vous risquez den avoir besoin lorsque vous crivez des fichiers dobjets partags ou des fonctions callback. Vous pouvez utiliser TApplication.HandleException pour empcher une exception de sortir de votre code, en particulier lorsque le code est appel partir dune source externe ne supportant pas les exceptions. Par exemple, si une exception passe au travers de tous les blocs try du code de lapplication, lapplication appelle automatiquement la mthode HandleException qui affiche une bote de dialogue indiquant quune erreur a eu lieu. Vous pouvez utiliser HandleException de la manire suivante :
try { instructions } except Application.HandleException(Self); end;

Pour toutes les exceptions sauf EAbort, HandleException appelle, sil existe, le gestionnaire dvnement OnException. Si vous voulez la fois grer lexception et proposer ce comportement par dfaut, comme les composants intgrs, ajoutez un appel de HandleException votre code :
try { instructions spciales } except on ESomething do begin { ne gre que les instructions spciales } Application.HandleException(Self);{ appelle HandleException } end; end; Remarque

Vous ne devez pas appeler HandleException depuis le code de gestion des exceptions dun thread. Pour plus dinformations, recherchez routines de gestion des exceptions dans lindex de laide.

4-16

Guide du dveloppeur

Gestion des exceptions

Exceptions silencieuses
Les applications Delphi grent la plupart des exceptions qui ne sont pas gres spcifiquement dans votre code en affichant une bote de message qui affiche la chane de message de lobjet exception. Vous pouvez galement dfinir des exceptions silencieuses pour lesquelles, par dfaut lapplication naffiche pas le message derreur. Les exceptions silencieuses sont utiles quand vous ne voulez pas signaler lexception lutilisateur, mais simplement abandonner lopration. Labandon dune opration est semblable lutilisation des procdures Break et Exit pour sortir dun bloc, mais elle permet de sortir de plusieurs niveaux de blocs imbriqus. Les exceptions silencieuses descendent toutes du type dexception standard EAbort. Le gestionnaire dexception par dfaut des applications VCL et CLX Delphi affiche la bote de dialogue de message derreur pour toutes les exceptions quil reoit sauf pour celles qui drivent de EAbort.
Remarque

Dans les applications console, la bote de dialogue derreur est affiche pour toutes les exceptions EAbort non gres. Il y a un moyen rapide de dclencher des exceptions silencieuses : au lieu de construire lobjet manuellement, vous pouvez appeler la procdure Abort. Abort dclenche automatiquement une exception EAbort qui sort de lopration en cours sans afficher de message derreur.

Exemple

Lexemple suivant propose un exemple simple dabandon dune opration. Dans une fiche contenant une bote liste vide et un bouton, attachez le code suivant lvnement OnClick du bouton :
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 1 to 10 do{ boucler dix fois } begin ListBox1.Items.Add(IntToStr(I));{ ajouter un nombre la liste } if I = 7 then Abort;{ arrter au septime } end; end;

Dfinition dexceptions personnalises


Non seulement les exceptions vous permettent de protger votre code des erreurs gnres par la bibliothque dexcution ou par les composants, mais vous pouvez galement utiliser le mme mcanisme pour grer des conditions exceptionnelles dans votre propre code. Pour utiliser des exceptions dans votre code, vous devez suivre ces tapes : Dclaration dun type objet exception Dclenchement dune exception

Sujets de programmation gnraux

4-17

Gestion des exceptions

Dclaration dun type objet exception


Comme les exceptions sont des objets, dfinir un nouveau type dexception est aussi simple que dclarer un nouveau type dobjet. Bien que vous puissiez dclencher toute instance dobjet comme une exception, les gestionnaires dexception standard ne grent que les exceptions qui descendent de Exception. Par convention, les nouveaux types dexception doivent tre drivs de Exception ou de lune des autres exceptions standard. De cette manire, si vous dclenchez votre nouvelle exception dans un bloc de code qui nest pas protg par un gestionnaire spcifique cette exception, lun des gestionnaires standard la grera.
Exemple

Par exemple, examinez la dclaration suivante :


type EMyException = class(Exception);

Si vous dclenchez EMyException sans spcifier pour elle de gestionnaire spcifique, un gestionnaire de Exception (ou un gestionnaire dexception par dfaut) pourra la grer. Comme la gestion standard pour Exception affiche le nom de lexception dclenche, vous pourrez voir que cest votre nouvelle exception qui a t dclenche.

Dclenchement dune exception


Pour indiquer une condition derreur paralysante dans une application, vous pouvez dclencher une exception, ce qui implique la construction dune instance de ce type et lappel du mot rserv raise. Pour dclencher une exception, appelez le mot rserv raise en le faisant suivre par une instance dun objet exception. Cela vous permet dtablir une exception comme issue dune adresse particulire. Quand un gestionnaire dexception gre effectivement lexception, il se termine en dtruisant linstance dexception : vous navez donc jamais le faire vous-mme. Le dclenchement dune exception dfinit dans lunit System la variable ErrorAddr par ladresse laquelle lapplication a dclench lexception. Vous pouvez faire rfrence ErrorAddr dans vos gestionnaires dexceptions, par exemple pour informer lutilisateur de lemplacement de lerreur. Vous pouvez aussi spcifier dans la clause raise la valeur qui apparatra dans ErrorAddr au moment o se produit lexception.
Attention

Nattribuez pas vous-mme la valeur de ErrorAddr. Elle est prvue pour tre en lecture seule. Pour spcifier ladresse de lerreur dune exception, ajoutez le mot rserv at aprs linstance dexception en la faisant suivre dune expression adresse, par exemple un identificateur. Par exemple, tant donn la dclaration suivante :
type EPasswordInvalid = class(Exception);

4-18

Guide du dveloppeur

Utilisation des interfaces

vous pouvez dclencher une exception mot de passe incorrect tout moment en appelant raise avec une instance de EPasswordInvalid, comme suit :
if Password <> CorrectPassword then raise EPasswordInvalid.Create(Mot de passe saisi incorrect);

Utilisation des interfaces


Le mot rserv interface de Delphi vous permet de crer et dutiliser des interfaces dans votre application. Les interfaces constituent un moyen dtendre le modle dhritage simple de Pascal Objet en permettant une mme classe dimplmenter plusieurs interfaces et plusieurs classes nayant pas le mme anctre de partager la mme interface. Les interfaces sont utiles quand les mmes ensembles doprations, par exemple la manipulation de flux, portent sur une gamme varie dobjets. Les interfaces sont galement un aspect fondamental des modles dobjets distribus COM (Component Object Model) et CORBA (Common Object Request Broker Architecture).

Interfaces en tant que caractristiques du langage


Une interface est semblable une classe ne contenant que des mthodes abstraites et une dfinition claire de ses fonctionnalits. Strictement parlant, les dfinitions des mthodes dinterface spcifient le nombre et le type de leurs paramtres, le type renvoy et le comportement prvu. Les mthodes dune interface sont nommes de faon indiquer le rle de linterface. Par convention, les interfaces sont nommes en fonction de leur comportement en prfixant leur nom par une lettre I en majuscule. Par exemple, une interface IMalloc doit allouer, librer et grer de la mmoire. De mme, une interface IPersist peut tre utilise comme une interface de base g nrale pour des descendants, chacun deux dfinissant des prototypes de mthode spcifiques permettant de charger et denregistrer ltat dun objet dans un stockage, un flux ou un fichier. Une interface utilise la syntaxe suivante :
IMyObject = interface procedure MyProcedure; end;

Voici un exemple simple de dclaration dune interface :


type IEdit = interface procedure Copy; stdcall; procedure Cut; stdcall; procedure Paste; stdcall; function Undo: Boolean; stdcall; end;

Comme les classes abstraites, les interfaces ne sont jamais instancies ellesmmes. Pour utiliser une interface, vous devez lobtenir en limplmentant dans une classe.

Sujets de programmation gnraux

4-19

Utilisation des interfaces

Pour implmenter une interface, vous devez dfinir une classe qui dclare linterface dans sa liste danctres, ce qui indique quelle implmente toutes les mthodes de linterface :
TEditor = class(TInterfacedObject, IEdit) procedure Copy; stdcall; procedure Cut; stdcall; procedure Paste; stdcall; function Undo: Boolean; stdcall; end;

Alors que les interfaces dfinissent le comportement et la signature de leurs mthodes, elles nen dfinissent pas limplmentation. D s lors que limplmentation faite dans la classe se conforme la dfinition de linterface, linterface est totalement polymorphique : laccs et lutilisation de linterface restent identiques dans toutes ses implmentations.

Implmentation des interfaces au travers de la hirarchie


Lutilisation dinterfaces permet denvisager une conception qui spare la manire dutiliser une classe de la manire dont elle est implmente. Deux classes peuvent implmenter la mme interface sans descendre ncessairement de la mme classe de base. Cet appel polymorphique de la mme mthode pour des objets sans rapport entre eux est possible dans la mesure o les objets implmentent la mme interface. Par exemple, soit linterface :
IPaint = interface procedure Paint; end;

et les deux classes,


TSquare = class(TPolygonObject, IPaint) procedure Paint; end; TCircle = class(TCustomShape, IPaint) procedure Paint; end;

Que ces deux classes aient ou non un anctre commun, elles sont toujours compatibles pour laffectation avec une variable de type IPaint :
var Painter: IPaint; begin Painter := TSquare.Create; Painter.Paint; Painter := TCircle.Create; Painter.Paint; end;

4-20

Guide du dveloppeur

Utilisation des interfaces

Il est possible dobtenir le mme rsultat en faisant driver TCircle et TSquare dune classe TFigure qui implmente la mthode virtuelle Paint. Dans ce cas TCircle et TSquare doivent surcharger la mthode Paint. IPaint est alors remplace par TFigure. Cependant, considrez linterface suivante :
IRotate = interface procedure Rotate(Degrees: Integer); end;

qui a du sens pour un rectangle, mais pas pour le cercle. Les classes seraient alors dfinies de la manire suivante :
TSquare = class(TRectangularObject, IPaint, IRotate) procedure Paint; procedure Rotate(Degrees: Integer); end; TCircle = class(TCustomShape, IPaint) procedure Paint; end;

Vous pouvez, ultrieurement crer une classe TFilledCircle qui implmente linterface IRotate afin de permettre la rotation du motif utilis pour remplir le cercle sans avoir ajouter la rotation au cercle simple.
Remarque

Dans ces exemples, on suppose que la classe de base immdiate ou une classe anctre a implment les mthodes de IInterface qui grent le comptage de rfrences. Pour plus dinformations, voir Implmentation de IInterface la page 4-22 et Gestion mmoire des objets interface la page 4-26.

Utilisation dinterfaces avec des procdures


Les interfaces permettent galement dcrire des procdures gnriques pouvant grer des objets sans que ces objets descendent dune classe de base particulire. En utilisant les interfaces IPaint et IRotate dfinies prcdemment, vous pouvez crire les procdures suivantes :
procedure PaintObjects(Painters: array of IPaint); var I: Integer; begin for I := Low(Painters) to High(Painters) do Painters[I].Paint; end; procedure RotateObjects(Degrees: Integer; Rotaters: array of IRotate); var I: Integer; begin for I := Low(Rotaters) to High(Rotaters) do Rotaters[I].Rotate(Degrees); end;

RotateObjects na pas besoin que les objets sachent se dessiner par eux-mmes et PaintObjects nexige pas que les objets sachent comment pivoter. Cela permet aux procdures gnriques prcdentes dtre utilises plus frquemment que si elles avaient t crites uniquement pour la classe TFigure.

Sujets de programmation gnraux

4-21

Utilisation des interfaces

Pour des dtails sur la syntaxe, la dfinition du langage et les rgles sappliquant aux interfaces, voir dans le Guide du langage Pascal Objet en ligne, la section Interfaces dobjet.

Implmentation de IInterface
Toutes les interfaces drivent, directement ou non, de linterface IInterface. Cette interface dfinit les fonctionnalits essentielles dune interface, cest--dire linterrogation dynamique et la gestion de la dure de vie. Ces fonctionnalits sont mises en place par les trois mthodes de IInterface : QueryInterface est une mthode dinterrogation dynamique dun objet donn qui obtient les rfrences des interfaces gres par lobjet. _AddRef est une mthode de comptage de rfrences qui incrmente le compteur chaque appel russi de QueryInterface. Tant que le compteur de rfrences est non nul, lobjet doit rester en mmoire. _Release est utilise avec _AddRef pour permettre un objet de connatre sa dure de vie et de dterminer sil peut se supprimer lui-mme. Quand le compteur de rfrences atteint zro, lobjet est libr de la mmoire. Chaque classe qui implmente des interfaces doit implmenter les trois mthodes de IInterface, les autres mthodes dclares dans toutes ses interfaces anctre, ainsi que toutes les mthodes dclares dans linterface mme. Nanmoins, vous pouvez hriter de limplmentation des mthodes dinterface dclares dans votre classe. En implmentant vous-mme ces mthodes, vous bnficiez dun moyen supplmentaire de gestion de la dure de vie dsactivant le mcanisme de comptage de rfrences. Cest une technique puissante qui permet de dcoupler les interfaces du comptage de rfrences.

TInterfacedObject
Delphi dfinit une classe simple, TInterfacedObject qui, pratiquement, sert de classe de base car elle implmente les mthodes de IInterface. La classe TInterfacedObject est dclare de la manire suivante dans lunit System :
type TInterfacedObject = class(TObject, IInterface) protected FRefCount: Integer; function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; public procedure AfterConstruction; override; procedure BeforeDestruction; override; class function NewInstance: TObject; override; property RefCount: Integer read FRefCount; end;

4-22

Guide du dveloppeur

Utilisation des interfaces

Driver directement de TInterfacedObject est trivial. Dans lexemple de dclaration suivant, TDerived est un descendant direct de TInterfacedObject qui implmente une interface hypothtique, IPaint :
type TDerived = class(TInterfacedObject, IPaint) ... end;

Comme TInterfacedObject implmente les mthodes de IInterface, elle gre automatiquement le comptage de rfrences et la gestion mmoire pour les objets interfacs. Pour davantage dinformations, voir Gestion mmoire des objets interface la page 4-26, qui traite galement de lcriture de classes implmentant des interfaces sans utiliser le mcanisme de comptage de rfrences inhrent TInterfacedObject.

Utilisation de loprateur as
Les classes implmentant des interfaces peuvent utiliser loprateur as pour se lier dynamiquement linterface. Dans lexemple suivant :
procedure PaintObjects(P: TInterfacedObject) var X: IPaint; begin X := P as IPaint; { instructions } end;

la variable P, de type TInterfacedObject, peut tre affecte la variable X qui est une rfrence linterface IPaint. La liaison dynamique rend cette affectation possible. Pour cette affectation, le compilateur gnre du code qui appelle la mthode QueryInterface de linterface IInterface de P. Cest parce que le compilateur ne peut dduire du type dclar de P si linstance de P supporte IPaint. A lexcution, soit P se rsout en une rfrence une interface IPaint, soit une exception est dclenche. Dans lun ou lautre cas, laffectation de P X ne gnre pas une erreur la compilation comme se serait le cas si P avait pour type une classe nimplmentant pas IInterface. Quand vous utilisez loprateur as pour une liaison dynamique avec une interface, vous devez respecter les rgles suivantes : Dclaration explicite de IInterface : mme si toutes les interfaces drivent de IInterface, il ne suffit pas quune classe implmente les mthodes de IInterface pour pouvoir utiliser loprateur as. Cela reste vrai mme si la classe implmente galement les interfaces quelle dclare explicitement. La classe doit dclarer explicitement IInterface dans sa liste dinterfaces. Utilisation dun IID : les interfaces peuvent utiliser un identificateur bas sur un identificateur global unique (GUID). Les GUID utiliss pour identifier des interfaces sont appels des identificateurs dinterface (IID). Si vous utilisez loprateur as avec une interface, elle doit avoir un IID associ. Pour crer un

Sujets de programmation gnraux

4-23

Utilisation des interfaces

nouveau GUID dans votre code source, vous pouvez utiliser le raccourci Ctrl+Maj+G de lditeur de code.

Rutilisation de code et dlgation


Une des manires pour rutiliser du code avec les interfaces consiste utiliser un objet contenant un autre objet ou un objet contenu dans un autre objet. Lutilisation de proprits de type objet est un moyen de contenir et de rutiliser du code. Pour exploiter cette caractristique des interfaces, Pascal Objet emploie le mot cl implements qui rend facile lcriture de code pour dlguer tout ou partie de limplmentation dune interface un sous-objet. Lagrgation est un autre moyen de rutiliser le code par contenance et par dlgation. Avec lagrgation, un objet externe contient un objet interne qui implmente des interfaces qui ne sont exposes que par lobjet externe. La VCL et CLX possdent des classes qui supportent lagrgation.

Utilisation de implements pour la dlgation


De nombreuses classes ont des proprits qui sont des sous-objets. Vous pouvez galement utiliser des interfaces comme type dune proprit. Quand une proprit est de type interface (ou dun type de classe qui implmente les mthodes dune interface), vous pouvez utiliser le mot cl implements pour spcifier que les mthodes de cette interface sont dlgu es la rfrence dobjet ou dinterface qui est linstance de la proprit. Le dlgu doit seulement fournir limplmentation des mthodes. il na pas besoin de dclarer quil gre linterface. La classe contenant la proprit doit inclure linterface dans sa liste danctres. Par dfaut, lutilisation du mot cl implements dlgue toutes les mthodes dinterface. Vous pouvez nanmoins utiliser les clauses de rsolution des mthodes ou dclarer des mthodes dans votre classe qui implmentent certaines des mthodes de linterface comme moyen de surcharger ce comportement par dfaut. Lexemple suivant utilise le mot cl implements dans la conception dun objet adaptateur de couleurs qui convertit une valeur de couleur RVB sur 8 bits en une rfrence Color :
unit cadapt; type IRGB8bit = interface [{1d76360a-f4f5-11d1-87d4-00c04fb17199}] function Red: Byte; function Green: Byte; function Blue: Byte; end; IColorRef = interface [{1d76360b-f4f5-11d1-87d4-00c04fb17199}] function Color: Integer; end;

4-24

Guide du dveloppeur

Utilisation des interfaces

{ TRGB8ColorRefAdapter associe un IRGB8bit un IColorRef } TRGB8ColorRefAdapter = class(TInterfacedObject, IRGB8bit, IColorRef) private FRGB8bit: IRGB8bit; FPalRelative: Boolean; public constructor Create(rgb: IRGB8bit); property RGB8Intf: IRGB8bit read FRGB8bit implements IRGB8bit; property PalRelative: Boolean read FPalRelative write FPalRelative; function Color: Integer; end; implementation constructor TRGB8ColorRefAdapter.Create(rgb: IRGB8bit); begin FRGB8bit := rgb; end; function TRGB8ColorRefAdapter.Color: Integer; begin if FPalRelative then Result := PaletteRGB(RGB8Intf.Red, RGB8Intf.Green, RGB8Intf.Blue) else Result := RGB(RGB8Intf.Red, RGB8Intf.Green, RGB8Intf.Blue); end; end.

Pour davantage dinformations sur la syntaxe, les dtails de limplmentation et les rgles concernant le mot cl implements, voir dans laide en ligne du Guide du Langage Pascal Objet, la rubrique Interfaces dobjet.

Agrgation
Lagrgation offre une approche modulaire pour rutiliser du code via des sousobjets qui dfinissent la fonctionnalit dun objet conteneur, mais qui cachent les dtails de limplmentation de cet objet. Dans lagrgation, un objet externe implmente une ou plusieurs interfaces. La seule exigence est quil implmente IInterface. Lobjet ou les objets internes peuvent implmenter une ou plusieurs interfaces, mais seul lobjet externe expose les interfaces. Cela vaut la fois pour les interfaces quil implmente et pour celles qui sont implmentes par les objets quil contient. Les clients ne savent rien des objets internes. Bien que lobjet externe fournisse laccs aux interfaces de lobjet interne, leur implmentation est compltement transparente. Donc, la classe de lobjet externe peut changer le type de classe de lobjet interne avec toute classe qui implmente la mme interface. De mme, le code des classes objet interne peut tre partag par dautres classes qui veulent lutiliser. Le modle dimplmentation de lagrgation dfinit explicitement les rgles pour implmenter IInterface en utilisant la dlgation. Lobjet interne doit implmenter une IInterface sur lui-mme, qui contrle le comptage de rfrences de lobjet interne. Cette implmentation de IInterface surveille la relation entre lobjet externe et lobjet interne. Par exemple, quand un objet de ce type (lobjet interne) est cr, la cration ne russit que pour une interface demande de type

Sujets de programmation gnraux

4-25

Utilisation des interfaces

IInterface. Lobjet interne implmente galement une deuxime IInterface pour toutes les interfaces quil implmente. Ce sont les interfaces exposes par lobjet externe. Cette deuxime IInterface dlgue les appels de QueryInterface, AddRef et Release lobjet externe. Linterface IInterface externe est appele le controlling Unknown. Reportez-vous laide en ligne de MicroSoft pour connatre les rgles de cration dune agrgation. Quand vous crivez vos propres classes dagrgation, vous pouvez aussi vous rfrer aux dtails de limplmentation de IInterface dans TComObject. TComObject est une classe COM qui supporte lagrgation. Si vous crivez des applications COM, vous pouvez aussi utiliser directement TComObject comme une classe de base.

Gestion mmoire des objets interface


Lun des concepts cl de la conception dinterfaces est la gestion de la dure de vie des objets qui les implmentent. Les mthodes _AddRef et _Release de IInterface constituent un moyen dimplmenter la gestion de la dure de vie. _AddRef et _Release surveillent la dure de vie dun objet en incrmentant le compteur de rfrences lobjet quand une rfrence dinterface est transmise un client et quelles dtruisent lobjet quand le compteur de rfrences est nul. Si vous crez des objets COM pour des applications distribues (en environnement Windows seulement), alors vous devez adhrer strictement aux rgles de comptage des rfrences. Mais, si vous utilisez des interfaces dans votre application uniquement en interne, alors vous avez un choix qui dpend de la nature de votre objet et de la faon dont vous avez dcid de lutiliser.

Utilisation du comptage de rfrences


Delphi vous fournit lessentiel de la gestion mmoire IInterface grce son implmentation de linterrogation et du comptage de rfrences de linterface. Cependant, si vous utilisez un objet qui vit et meurt via ses interfaces, vous pouvez aisment utiliser le comptage de rfrences en drivant de ces classes. TInterfacedObject est la non coclasse qui dfinit ce comportement. Si vous choisissez dutiliser le comptage de rfrences, vous devez faire attention ne manipuler lobjet que sous la forme dune rfrence dinterface et tre cohrent dans votre comptage de rfrences. Par exemple :
procedure beep(x: ITest); function test_func() var y: ITest; begin y := TTest.Create; // comme y est de type ITest, le compteur de rfrences vaut 1 beep(y); // lappel de la fonction beep incrmente le compteur de rfrences // et le dcrmente son retour y.something; // lobjet est toujours l avec un compteur de rfrences valant 1 end;

4-26

Guide du dveloppeur

Utilisation des interfaces

Cest la manire la plus claire et la plus prudente de grer la mmoire et, si vous utilisez TInterfacedObject, elle est utilise automatiquement. Si vous ne respectez pas ces rgles, votre objet peut disparatre inopinment, comme lillustre le code suivant :
function test_func() var x: TTest; begin x := TTest.Create; // pas encore de compteur de rfrences pour lobjet beep(x as ITest); // le compteur est incrment par lappel de beep // et dcrment son retour x.something; // surprise ! lobjet nest plus l end; Remarque

Dans les exemples prcdents, la procdure beep, telle quelle est dclare, incrmente le compteur de rfrences (appel de _AddRef) pour le paramtre. Par contre, les dclarations suivantes ne le font pas :
procedure beep(const x: ITest);

ou
procedure beep(var x: ITest);

Ces dclarations gnrent un code plus concis et plus rapide. Vous ne pouvez pas utiliser le comptage de rfrences dans un cas : si votre objet est un composant ou un contrle contenu dans un autre composant. Dans un tel cas, le comptage de rfrences ne peut tre appliqu de manire cohrente : vous pouvez toujours utiliser les interfaces, mais sans utiliser le comptage de rfrence car la dure de vie de lobjet nest pas rgie par ses interfaces.

Situations o il ne faut pas utiliser le comptage de rfrences


Si votre objet est un composant ou un contrle dtenu par un autre composant, votre objet utilise alors un autre systme de gestion mmoire ayant son origine dans TComponent. Vous ne devez pas mlanger lapproche de la dure de vie des objets utilise par les composants VCL ou CLX avec le systme de comptage de rfrences. Si vous voulez crer un objet qui gre les interfaces, vous pouvez dfinir une implmentation vide des mthodes _AddRef et _Release de IInterface afin de court-circuiter le mcanisme de comptage de rfrences. Par exemple :
function TMyObject._AddRef: Integer; begin Result := -1; end; function TMyObject._Release: Integer; begin Result := -1; end;

Vous devez quand mme implmenter normalement QueryInterface afin de permettre linterrogation dynamique de votre objet.

Sujets de programmation gnraux

4-27

Utilisation des interfaces

Comme vous implmentez QueryInterface, vous pouvez toujours utiliser loprateur as pour des interfaces de composant dans la mesure o vous crez un identificateur dinterface (IID). Vous pouvez galement utiliser lagrgation. Si lobjet externe est un composant, lobjet interne implmente le comptage de rfrences comme dhabitude, en dlguant au controlling Unknown. Cest au niveau de lobjet composant externe que la dcision est prise de circonvenir les mthodes _ AddRef et _Release et de prendre en charge la gestion de la mmoire par une approche base sur les composants. En fait, vous pouvez utiliser TInterfacedObject comme classe de base pour lobjet interne dune agrgation qui a un composant comme objet externe contenant.
Remarque

Le controlling Unknown est linterface IUnknown implmente par lobjet externe et pour laquelle le comptage de rfrences de lobjet entier est tenu jour. IUnknown est identique IInterface, mais est utilise la place dans les applications bases sur COM (Windows seulement). Pour plus dinformations sur les diverses implmentations de IUnknown ou de IInterface par les objets internes ou externes, voir Agrgation la page 25 et les rubriques daide en ligne de Microsoft sur le controlling Unknown.

Utilisation des interfaces dans les applications distribues (VCL seulement)


Les interfaces sont des lments fondamentaux des modles dobjets distribus COM, SOAP et CORBA. Delphi fournit des classes de base pour les technologies qui tendent la fonctionnalit dinterface de base de TInterfacedObject, qui implmente simplement les mthodes de linterface IInterface. Quand on utilise COM, les classes et les interfaces sont dfinies en termes de IUnknown plutt que IInterface. Il ny a pas de diffrence smantique entre IUnknown et IInterface ; lutilisation de IUnknown est simplement un moyen dadapter les interfaces Delphi la dfinition COM. Les classes COM ajoutent la fonction dutilisation de fabriques et didentificateurs de classes (CLSID). Les fabriques de classes sont responsables de la cration des instances de classes via les CLSID. Les CLSID sont utiliss pour recenser et manipuler des classes COM. Les classes COM qui ont des fabriques et des identificateurs de classes sont appeles des CoClasses. Les CoClasses tirent profit des capacits de gestion des versions de QueryInterface, de sorte que lorsquun module logiciel est mis jour, QueryInterface peut tre appele lexcution pour connatre les capacits actuelles dun objet. De nouvelles versions danciennes interfaces, ainsi que de nouvelles interfaces ou fonctionnalits dun objet, peuvent devenir disponibles aux nouveaux clients de faon immdiate. En mme temps, les objets gardent lentire compatibilit avec le code client existant ; aucun recompilation nest requise puisque les implmentations des interfaces sont caches (les mthodes et les paramtres restent constants). Dans les applications COM, les dveloppeurs peuvent changer limplmentation pour amliorer les performances ou pour toute autre raison interne, sans perdre le code client bas sur cette interface. Pour plus dinformations sur les interfaces COM, voir chapitre 33, Prsentation des technologies COM.

4-28

Guide du dveloppeur

Dfinition de variants personnaliss

Quand vous distribuez une application en utilisant SOAP, les interfaces sont requises pour transporter leurs propres informations de type lexcution (RTTI). Le compilateur ajoute les informations RTTI une interface uniquement lorsquelle est compile en utilisant le commutateur {$M+}. De telles interfaces sont appeles interfaces invocables. Le descendant de toute interface invocable est galement invocable. Cependant, si une interface invocable descend dune autre interface qui nest pas invocable, les applications client peuvent appeler uniquement les mthodes dfinies dans linterface invocable et dans ses descendants. Les mthodes hrites danctres non invocables ne sont pas compiles avec les informations de type et donc ne peuvent tre appeles par les clients. Le moyen le plus simple de dfinir des interfaces invocables est de dfinir votre interface de sorte quelle descende de IInvokable. IInvokable est identique IInterface, sauf qu elle est compile en utilisant le commutateur {$M+}. Pour davantage dinformations sur les applications Web Service qui sont distribues en utilisant SOAP, et sur les interfaces invocables, voir chapitre 31, Utilisation de services Web. CORBA est une autre technologie dapplications distribues. Lutilisation dinterfaces dans les applications CORBA se fait par le biais de classes stubs sur le client et de classes squelettes sur le serveur. Ces classes stubs et squelettes grent les dtails du marshaling des appels dinterfaces pour que les valeurs des paramtres et les valeurs de retour soient correctement transmises. Les applications doivent utiliser une classe stub ou squelette ou employer la DII (Dynamic Invocation Interface) qui convertit tous les paramtres en variants spciaux (de sorte quelles transportent leurs propres informations de type).

Dfinition de variants personnaliss


Le type Variant est un type puissant intgr au langage Pascal Objet. Les variants reprsentent des valeurs dont le type nest pas dtermin au moment de la compilation. Au contraire, le type de valeur peut changer lexcution. Les variants peuvent se combiner dautres variants ainsi qu des valeurs entires, relles, chanes et boolennes dans les expressions et les affectations ; le compilateur effectue automatiquement les conversions de type. Par dfaut, les variants peuvent contenir des valeurs qui sont des enregistrements, des ensembles, des tableaux statiques, des fichiers, des classes, des rfrences de classes ou des pointeurs. Mais, vous pouvez tendre le type Variant afin de travailler avec tout exemple particulier de ces types. Il suffit de crer un descendant de la classe TCustomVariantType qui indique comment le type Variant effectue les oprations standard. Pour crer un a type Variant,

1 Etablissez une correspondance entre le stockage des donnes du variant et lenregistrement TVarData.

Sujets de programmation gnraux

4-29

Dfinition de variants personnaliss

2 Dclarez une classe qui drive de TCustomVariantType. Implmentez tous les comportements requis (y compris les rgles de conversion de type) dans la nouvelle classe. 3 Ecrivez les mthodes utilitaires permettant de crer les instances de votre variant personnalis et reconnatre son type.
Les tapes ci-dessus tendent le type Variant de sorte que les oprateurs standard puissent fonctionner avec le nouveau type et que ce dernier puisse tre convertit en dautres types de donnes. Vous pourrez ultrieurement amliorer votre nouveau type Variant pour quil supporte les proprits et les mthodes que vous dfinissez. Quand vous crez un type Variant qui supporte les proprits ou les mthodes, utilisez TInvokeableVariantType ou TPublishableVariantType comme classe de base plutt que TCustomVariantType.

Stockage des donnes dun type Variant personnalis


Les variants stockent leurs donnes dans le type enregistrement TVarData. Ce type est un enregistrement contenant 16 octets. Le premier mot indique le type du variant, et les 14 octets restants sont disponibles pour le stockage des donnes. Bien que votre nouveau type Variant puisse fonctionner directement avec un enregistrement TVarData, il est en gnral plus simple de dfinir un type enregistrement dont les membres portent des noms significatifs du nouveau type puis de convertir ce nouveau type en type enregistrement TVarData. Par exemple, lunit VarConv dfinit un type variant personnalis qui reprsente une mesure. Les donnes de ce type contiennent les units (TConvType) de mesure, ainsi que la valeur (un double). Lunit VarConv dfinit son propre type pour reprsenter cette valeur :
TConvertVarData = packed record VType: TVarType; VConvType: TConvType; Reserved1, Reserved2: Word; VValue: Double; end;

Ce type est exactement de la mme taille que lenregistrement TVarData. Quand vous travaillez avec un variant personnalis du nouveau type, le variant (ou son enregistrement TVarData) peut tre convertit en TConvertVarData, et le type Variant personnalis fonctionnera simplement avec lenregistrement TVarData comme sil tait du type TConvertVarData.
Remarque

Quand vous dfinissez un enregistrement qui correspond lenregistrement TVarData, assurez-vous de le dfinir compress. Si votre nouveau type Variant personnalis a besoin de plus de 14 octets pour stocker les donnes, vous pouvez dfinir un nouveau type enregistrement qui contienne un pointeur ou linstance dun objet. Par exemple, lunit VarCmplx utilise une instance de la classe TComplexData pour reprsenter les donnes dans

4-30

Guide du dveloppeur

Dfinition de variants personnaliss

un variant valeur complexe. Il dfinit donc un type enregistrement de mme taille que TVarData contenant une rfrence un objet TComplexData :
TComplexVarData = packed record VType: TVarType; Reserved1, Reserved2, Reserved3: Word; VComplex: TComplexData; Reserved4: LongInt; end;

Les rfrences dobjet sont en ralit des pointeurs (sur deux mots), et ce type est de mme taille que lenregistrement TVarData. Comme prcdemment, un variant personnalis complexe (ou son enregistrement TVarData), peut tre convertit en TComplexVarData, et le type variant personnalis fonctionnera avec lenregistrement TVarData comme il le ferait avec un type TComplexVarData.

Cration dune classe pour le type variant personnalis


Les variants personnaliss fonctionnent en utilisant une classe utilitaire sp ciale qui indique comment les variants du type personnalis effectuent les oprations standard. Vous crez cette classe utilitaire en crivant un descendant de TCustomVariantType. Cela implique de redfinir les mthodes virtuelles appropries de TCustomVariantType.

Transtypage
Le transtypage est une des fonctionnalits du type variant personnalis les plus importantes implmenter. La flexibilit des variants vient en partie de leur transtypage implicite. Il y a deux mthodes implmenter pour que le type Variant personnalis effectue des transtypages : Cast, qui convertit un autre type Variant en votre variant personnalis, et CastTo, qui convertit votre variant personnalis en un autre type Variant. Quand vous implmentez lune de ces mthodes, il est relativement facile de faire les conversions logiques partir des types variant intgrs. Cependant, vous devez envisager la possibilit que le variant vers ou depuis lequel vous transtypez peut tre un autre type Variant personnalis. Pour rsoudre cette situation, vous pouvez essayer, dans un premier temps, une conversion en un des types Variant intgrs. Par exemple, la mthode Cast suivante, de la classe TComplexVariantType, utilise le type Double comme type intermdiaire :
procedure TComplexVariantType.Cast(var Dest: TVarData; const Source: TVarData); var LSource, LTemp: TVarData; begin VarDataInit(LSource); try VarDataCopyNoInd(LSource, Source); if VarDataIsStr(LSource) then

Sujets de programmation gnraux

4-31

Dfinition de variants personnaliss

TComplexVarData(Dest).VComplex := TComplexData.Create(VarDataToStr(LSource)) else begin VarDataInit(LTemp); try VarDataCastTo(LTemp, LSource, varDouble); TComplexVarData(Dest).VComplex := TComplexData.Create(LTemp.VDouble, 0); finally VarDataClear(LTemp); end; end; Dest.VType := VarType; finally VarDataClear(LSource); end; end;

En plus de lutilisation dun Double comme type Variant intermdiaire, il faut remarquer deux ou trois choses dans cette implmentation : La dernire tape de cette mthode dfinit le membre VType de lenregistrement TVarData renvoy. Ce membre donne le code du type Variant. Il est dfinit par la proprit VarType de TComplexVariantType, qui est le code du type Variant affect au variant personnalis. Les donnes du variant personnalis (Dest) sont transtypes depuis TVarData dans le type enregistrement utilis pour stocker ses donnes (TComplexVarData). Cela facilite le travail sur ces donnes. La mthode fait une copie locale du variant source au lieu de travailler directement avec ses donnes. Cela vite les effets secondaires qui pourraient affecter les donnes source. Lors du transtypage depuis un variant complexe vers un autre type, la mthode CastTo utilise galement le type intermdiaire Double (pour tout type de destination autre que chane) :
procedure TComplexVariantType.CastTo(var Dest: TVarData; const Source: TVarData; const AVarType: TVarType); var LTemp: TVarData; begin if Source.VType = VarType then case AVarType of varOleStr: VarDataFromOleStr(Dest, TComplexVarData(Source).VComplex.AsString); varString: VarDataFromStr(Dest, TComplexVarData(Source).VComplex.AsString); else VarDataInit(LTemp); try LTemp.VType := varDouble; LTemp.VDouble := TComplexVarData(LTemp).VComplex.Real; VarDataCastTo(Dest, LTemp, AVarType); finally

4-32

Guide du dveloppeur

Dfinition de variants personnaliss

VarDataClear(LTemp); end; end else RaiseCastError; end;

Remarquez que la mthode CastTo prvoit le cas o les donnes variant source nont pas un code de type qui corresponde la proprit VarType. Ce cas se produit uniquement pour les variants source vides (non affects).

Implmentation doprations binaires


Pour que le type variant personnalis puisse fonctionner avec les oprateurs binaires standard (+, -, *, /, div, mod, shl, shr, and, or, xor de lunit System), vous devez redfinir la mthode BinaryOp. BinaryOp a trois paramtres : la valeur de loprande gauche, la valeur de loprande droit et loprateur. Implmentez cette mthode pour effectuer lopration et renvoyer le rsultat en utilisant la mme variable que celle qui contenait lop rande gauche. Par exemple, la mthode BinaryOp suivante vient de TComplexVariantType, dfinie dans lunit VarCmplx :
procedure TComplexVariantType.BinaryOp(var Left: TVarData; const Right: TVarData; const Operator: TVarOp); begin if Right.VType = VarType then case Left.VType of varString: case Operator of opAdd: Variant(Left) := Variant(Left) + TComplexVarData(Right).VComplex.AsString; else RaiseInvalidOp; end; else if Left.VType = VarType then case Operator of opAdd: TComplexVarData(Left).VComplex.DoAdd(TComplexVarData(Right).VComplex); opSubtract: TComplexVarData(Left).VComplex.DoSubtract(TComplexVarData(Right).VComplex); opMultiply: TComplexVarData(Left).VComplex.DoMultiply(TComplexVarData(Right).VComplex); opDivide: TComplexVarData(Left).VComplex.DoDivide(TComplexVarData(Right).VComplex); else RaiseInvalidOp; end else RaiseInvalidOp; end else RaiseInvalidOp; end;

Sujets de programmation gnraux

4-33

Dfinition de variants personnaliss

Plusieurs remarques importantes sur cette implmentation simposent : Cette mthode ne gre que le cas o le variant du ct droit de loprateur est un variant personnalis reprsentant un nombre complexe. Si loprande gauche est un variant complexe et non loprande droit, le variant complexe force loprande droit tre dabord transtyp en variant complexe. Il le fait en redfinissant la mthode RightPromotion pour quelle exige toujours le type de la proprit VarType :
function TComplexVariantType.RightPromotion(const V: TVarData; const Operator: TVarOp; out RequiredVarType: TVarType): Boolean; begin { Complex Op TypeX } RequiredVarType := VarType; Result := True; end;

Loprateur daddition est implment pour une chane et un nombre complexe (par conversion de la valeur complexe en chane et concatnation) et les oprateurs daddition, soustraction, multiplication et division sont implments pour deux nombres complexes en utilisant les mthodes de lobjet TComplexData qui est stock dans les donnes du variant complexe. On y accde en transtypant lenregistrement TVarData en enregistrement TComplexVarData et en utilisant son membre VComplex. Essayer tout autre oprateur ou combinaison de types force la mthode appeler la mthode RaiseInvalidOp, qui entrane une erreur dexcution. La classe TCustomVariantType contient de nombreuses mthodes utilitaires comme RaiseInvalidOp qui peuvent tre utilises dans limplmentation des types variants personnaliss. BinaryOp ne fonctionne quavec un nombre limit de types : les chanes et dautres variants complexes. Il est possible, cependant, deffectuer des oprations entre des nombres complexes et dautres types numriques. Pour que la mthode BinaryOp fonctionne, les oprandes doivent tre convertis en variants complexes avant que les valeurs ne soient transmises cette mthode. Nous avons dj vu (plus haut) comment utiliser la mthode RightPromotion pour forcer loprande droit tre un variant complexe quand loprande gauche est un complexe. Une mthode similaire, LeftPromotion, force le transtypage de lop rande gauche quand loprande droit est un complexe :
function TComplexVariantType.LeftPromotion(const V: TVarData; const Operator: TVarOp; out RequiredVarType: TVarType): Boolean; begin { TypeX oprateur complexe } if (Operator = opAdd) and VarDataIsStr(V) then RequiredVarType := varString else RequiredVarType := VarType; Result := True; end;

4-34

Guide du dveloppeur

Dfinition de variants personnaliss

Cette mthode LeftPromotion force loprande gauche tre transtyp en un autre variant complexe, sauf si cest une chane et que loprateur est laddition, auquel cas LeftPromotion permet loprande de rester une chane.

Implmentation doprations de comparaison


Il y a deux faons de permettre un type variant personnalis de supporter les oprateurs de comparaison (=, <>, <, <=, >, >=). Vous pouvez redfinir la mthode Compare ou la mthode CompareOp. La mthode Compare est la plus simple si votre type variant personnalis supporte la totalit des oprateurs de comparaison. Compare prend trois paramtres : loprande gauche, loprande droit et un paramtre var qui renvoie la relation entre les deux. Par exemple, lobjet TConvertVariantType de lunit VarConv implmente la mthode Compare suivante :
procedure TConvertVariantType.Compare(const Left, Right: TVarData; var Relationship: TVarCompareResult); const CRelationshipToRelationship: array [TValueRelationship] of TVarCompareResult = (crLessThan, crEqual, crGreaterThan); var LValue: Double; LType: TConvType; LRelationship: TValueRelationship; begin // supporte... // la comparaison entre convvar et un nombre // Compare la valeur de convvar et le nombre donn // convvar1 cmp convvar2 // Compare aprs conversion de convvar2 dans le type de lunit convvar1 // La droite peut aussi tre une chane. Si la chane a des infos dunit alors elle // est traite comme un varConvert sinon elle est traite comme un double LRelationship := EqualsValue; case Right.VType of varString: if TryStrToConvUnit(Variant(Right), LValue, LType) then if LType = CIllegalConvType then LRelationship := CompareValue(TConvertVarData(Left).VValue, LValue) else LRelationship := ConvUnitCompareValue(TConvertVarData(Left).VValue, TConvertVarData(Left).VConvType, LValue, LType) else RaiseCastError; varDouble: LRelationship := CompareValue(TConvertVarData(Left).VValue, TVarData(Right).VDouble); else if Left.VType = VarType then LRelationship := ConvUnitCompareValue(TConvertVarData(Left).VValue, TConvertVarData(Left).VConvType, TConvertVarData(Right).VValue, TConvertVarData(Right).VConvType) else RaiseInvalidOp; end;

Sujets de programmation gnraux

4-35

Dfinition de variants personnaliss

Relationship := CRelationshipToRelationship[LRelationship]; end;

Si le type personnalis ne supporte pas le concept de suprieur ou infrieur et seulement gal ou diffrent de, il est difficile dimplmenter la mthode Compare, car Compare doit renvoyer crLessThan, crEqual ou crGreaterThan. Quand la seule rponse correcte est diffrent de, il est impossible de savoir sil faut renvoyer crLessThan ou crGreaterThan. Donc, pour les types qui ne supportent pas le concept dordre, vous pouvez la place redfinir la mthode CompareOp. CompareOp a trois paramtres : la valeur de loprande gauche, la valeur de loprande droit et loprateur de comparaison. Implmentez cette mthode pour effectuer lopration et renvoyer un boolen qui indique si la comparaison est True. Vous pouvez alors appeler la mthode RaiseInvalidOp quand la comparaison na aucun sens. Par exemple, la mthode CompareOp suivante vient de lobjet TComplexVariantType de lunit VarCmplx. Elle ne supporte quun test dgalit ou dingalit :
function TComplexVariantType.CompareOp(const Left, Right: TVarData; const Operator: Integer): Boolean; begin Result := False; if (Left.VType = VarType) and (Right.VType = VarType) then case Operator of opCmpEQ: Result := TComplexVarData(Left).VComplex.Equal(TComplexVarData(Right).VComplex); opCmpNE: Result := not TComplexVarData(Left).VComplex.Equal(TComplexVarData(Right).VComplex); else RaiseInvalidOp; end else RaiseInvalidOp; end;

Remarquez que les types doprandes qui supportent ces deux implmentations sont trs limits. Comme avec les oprations binaires, vous pouvez utiliser les mthodes RightPromotion et LeftPromotion pour limiter les cas considrer, en forant un transtypage avant que Compare ou CompareOp ne soit appele.

Implmentation doprations unaires


Pour que le type variant personnalis puisse fonctionner avec les oprateurs unaires standard ( -, not), vous devez redfinir la mthode UnaryOp. UnaryOp possde deux paramtres : la valeur de loprande et loprateur. Implmentez cette mthode pour effectuer lopration et renvoyer le rsultat en utilisant la mme variable que celle qui contenait lop rande.

4-36

Guide du dveloppeur

Dfinition de variants personnaliss

Par exemple, la mthode UnaryOp suivante vient de TComplexVariantType, dfinie dans lunit VarCmplx :
procedure TComplexVariantType.UnaryOp(var Right: TVarData; const Operator: TVarOp); begin if Right.VType = VarType then case Operator of opNegate: TComplexVarData(Right).VComplex.DoNegate; else RaiseInvalidOp; end else RaiseInvalidOp; end;

Remarquez que pour loprateur logique not, qui na pas de sens pour des valeurs complexes, cette mthode appelle RaiseInvalidOp pour provoquer une erreur dexcution.

Copie et effacement des variants personnaliss


En plus du transtypage et de limplmentation des oprateurs, vous devez indiquer comment copier et effacer les variants de votre type Variant personnalis. Pour indiquer comment copier la valeur du variant, implmentez la mthode Copy. En gnral, cest une opration simple, mme si vous ne devez pas oublier de librer la mmoire de toute classe ou structure utilise pour contenir la valeur du variant :
procedure TComplexVariantType.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean); begin if Indirect and VarDataIsByRef(Source) then VarDataCopyNoInd(Dest, Source) else with TComplexVarData(Dest) do begin VType := VarType; VComplex := TComplexData.Create(TComplexVarData(Source).VComplex); end; end; Remarque Conseil

Le paramtre Indirect de la mthode Copy signale que la copie doit prendre en compte le cas o le variant contient une rfrence indirecte ses donnes. Si votre type variant personnalis nalloue pas de mmoire pour contenir ses donnes (les donnes tiennent entirement dans lenregistrement TVarData), votre implmentation de la mthode Copy peut simplement appeler la mthode SimplisticCopy. Pour indiquer comment effacer la valeur du variant, implmentez la mthode Clear. Comme avec la mthode Copy, la seule chose complique faire est de librer dventuelles ressources alloues pour stocker les donnes du variant.

Sujets de programmation gnraux

4-37

Dfinition de variants personnaliss

procedure TComplexVariantType.Clear(var V: TVarData); begin V.VType := varEmpty; FreeAndNil(TComplexVarData(V).VComplex); end;

Vous aurez galement besoin dimplmenter la mthode IsClear. De cette faon, vous pourrez dtecter dventuelles valeurs incorrectes ou des valeurs spciales qui reprsentent des donnes vides :
function TComplexVariantType.IsClear(const V: TVarData): Boolean; begin Result := (TComplexVarData(V).VComplex = nil) or TComplexVarData(V).VComplex.IsZero; end;

Chargement et enregistrement des valeurs des variants personnaliss


Par dfaut, quand on affecte au variant personnalis la valeur dune proprit publie, il est transtyp en chane quand la proprit est enregistre dans un fichier fiche, et reconverti partir de la chane quand la proprit est lue dans ce fichier fiche. Vous pouvez cependant fournir votre propre mcanisme de chargement et denregistrement des valeurs des variants personnaliss pour utiliser une reprsentation plus naturelle. Pour ce faire, le descendant de TCustomVariantType doit implmenter linterface IVarStreamable partir de Classes.pas. IVarStreamable dfinit deux mthodes, StreamIn et StreamOut, pour lire et crire la valeur dun variant dans un flux. Par exemple, TComplexVariantType de lunit VarCmplx implmente la mthode IVarStreamable comme ceci :
procedure TComplexVariantType.StreamIn(var Dest: TVarData; const Stream: TStream); begin with TReader.Create(Stream, 1024) do try with TComplexVarData(Dest) do begin VComplex := TComplexData.Create; VComplex.Real := ReadFloat; VComplex.Imaginary := ReadFloat; end; finally Free; end; end; procedure TComplexVariantType.StreamOut(const Source: TVarData; const Stream: TStream); begin with TWriter.Create(Stream, 1024) do try with TComplexVarData(Source).VComplex do begin WriteFloat(Real); WriteFloat(Imaginary); end;

4-38

Guide du dveloppeur

Dfinition de variants personnaliss

finally Free; end; end;

Remarquez comment ces mthodes crent un objet lecteur ou crivain pour que le paramtre Stream gre les dtails de lecture et dcriture des valeurs.

Utilisation du descendant de TCustomVariantType


Dans la section dinitialisation de lunit qui dfinit votre descendant de TCustomVariantType, crez une instance de votre classe. Lorsque vous instanciez votre objet, il se recense automatiquement avec le systme de traitement des Variants afin que le nouveau type Variant soit activ. Par exemple, voici la section dinitialisation de lunit VarCmplx :
initialization ComplexVariantType := TComplexVariantType.Create;

Dans la section de finalisation de lunit qui dfinit votre descendant de TCustomVariantType, librez linstance de votre classe. Cela permet de drecenser automatiquement le type variant. Voici la section finalisation de lunit VarCmplx :
finalization FreeAndNil(ComplexVariantType);

Ecriture dutilitaires fonctionnant avec un type variant personnalis


Une fois que vous avez cr un descendant de TCustomVariantType pour implmenter votre type variant personnalis, il est possible dutiliser ce dernier dans des applications. Mais, sans un petit nombre dutilitaires, ce nest pas si simple. Par exemple, sans fonction utilitaire, le seul moyen de crer une instance de votre type variant personnalis est dutiliser la procdure globale VarCast sur un variant source dun autre type. Cest une bonne ide de concevoir une mthode qui cre une instance de votre type variant personnalis partir dune valeur ou dun ensemble de valeurs appropri. Cette fonction ou ensemble de fonctions remplit la structure que vous avez dfinie pour stocker les donnes de votre variant personnalis. Par exemple, la fonction suivante pourrait tre utilise pour crer un variant valeur complexe :
function VarComplexCreate(const AReal, AImaginary: Double): Variant; begin VarClear(Result); TComplexVarData(Result).VType := ComplexVariantType.VarType; TComplexVarData(ADest).VComplex := TComplexData.Create(ARead, AImaginary); end;

Cette fonction nexiste pas en ralit dans lunit VarCmplx, mais cest une synthse de mthodes existantes, utilise pour simplifier lexemple. Remarquez que le variant renvoy est transtyp dans lenregistrement qui a t dfini pour correspondre la structure TVarData (TComplexVarData), puis rempli.

Sujets de programmation gnraux

4-39

Dfinition de variants personnaliss

Un autre utilitaire crer est celui qui renvoie le code de type de votre nouveau type Variant. Ce code de type nest pas une constante. Il est gnr automatiquement quand vous instanciez votre descendant de TCustomVariantType. Il est donc utile pour fournir un moyen de dterminer facilement le code de type de votre variant personnalis. La fonction suivante de lunit VarCmplx illustre la faon de lcrire, en renvoyant simplement la proprit VarType du descendant de TCustomVariantType :
function VarComplex: TVarType; begin Result := ComplexVariantType.VarType; end;

Deux autres utilitaires standard fournis pour la plupart des variants personnaliss vrifient si un variant donn est du type personnalis et transtypent un variant arbitraire dans le nouveau type personnalis. Voici limplmentation de ces utilitaires partir de lunit VarCmplx :
function VarIsComplex(const AValue: Variant): Boolean; begin Result := (TVarData(AValue).VType and varTypeMask) = VarComplex; end; function VarAsComplex(const AValue: Variant): Variant; begin if not VarIsComplex(AValue) then VarCast(Result, AValue, VarComplex) else Result := AValue; end;

Remarquez quils utilisent des fonctionnalits standard communes tous les variants : le membre VType de lenregistrement TVarData et la fonction VarCast, qui fonctionne cause des mthodes implmentes dans le descendant de TCustomVariantType pour le transtypage des donnes. En plus des utilitaires standard mentionns plus haut, vous pouvez crire un nombre quelconque dutilitaires spcifiques votre nouveau type variant personnalis. Par exemple, lunit VarCmplx dfinit un grand nombre de fonctions qui implmentent des oprations de calcul sur les variants valeur complexe.

Support des proprits et des mthodes dans les variants personnaliss


Certains variants ont des proprits et des mthodes. Par exemple, quand la valeur dun variant est une interface, vous pouvez utiliser le variant pour lire ou crire les valeurs des proprits de cette interface et appeler ses mthodes. Mme si votre type variant personnalis ne reprsente pas une interface, vous pouvez lui donner des proprits et des mthodes quune application pourra utiliser.

4-40

Guide du dveloppeur

Dfinition de variants personnaliss

Utilisation de TInvokeableVariantType
Pour fournir le support des proprits et mthodes, la classe que vous crez pour activer le nouveau type variant personnalis doit descendre de TInvokeableVariantType et non directement de TCustomVariantType. TInvokeableVariantType dfinit quatre mthodes : DoFunction DoProcedure GetProperty SetProperty

que vous pouvez implmenter pour supporter les proprits et les mthodes dans votre type variant personnalis. Par exemple, lunit VarConv utilise TInvokeableVariantType comme classe de base pour TConvertVariantType de sorte que les variants personnaliss rsultant puissent supporter les proprits. Lexemple suivant prsente laccs en lecture pour ces proprits :
function TConvertVariantType.GetProperty(var Dest: TVarData; const V: TVarData; const Name: String): Boolean; var LType: TConvType; begin // supporte... // Value // Type // TypeName // Family // FamilyName // As[Type] Result := True; if Name = VALUE then Variant(Dest) := TConvertVarData(V).VValue else if Name = TYPE then Variant(Dest) := TConvertVarData(V).VConvType else if Name = TYPENAME then Variant(Dest) := ConvTypeToDescription(TConvertVarData(V).VConvType) else if Name = FAMILY then Variant(Dest) := ConvTypeToFamily(TConvertVarData(V).VConvType) else if Name = FAMILYNAME then Variant(Dest) := ConvFamilyToDescription(ConvTypeToFamily(TConvertVarData(V).VConvType)) else if System.Copy(Name, 1, 2) = AS then begin if DescriptionToConvType(ConvTypeToFamily(TConvertVarData(V).VConvType), System.Copy(Name, 3, MaxInt), LType) then VarConvertCreateInto(Variant(Dest), Convert(TConvertVarData(V).VValue, TConvertVarData(V).VConvType, LType), LType) else Result := False; end else Result := False;

Sujets de programmation gnraux

4-41

Utilisation des chanes

end;

La mthode GetProperty vrifie le paramtre Name pour dterminer quelle proprit est demande. Elle rcupre ensuite linformation de lenregistrement TVarData du Variant (V), et la renvoie sous forme du Variant (Dest). Remarquez que cette mthode supporte les proprits dont les noms sont gnrs de faon dynamique lexcution (As[Type]), en se basant sur la valeur en cours du variant personnalis. De mme, les mthodes SetProperty, DoFunction et DoProcedure sont suffisamment gnriques pour que vous puissiez gnrer de faon dynamique les noms des mthodes ou rpondre aux divers nombres et types de paramtres.

Utilisation de TPublishableVariantType
Si le type variant personnalis stocke ses donnes en utilisant linstance dun objet, alors il existe un moyen plus simple dimplmenter des proprits, si ce sont aussi les proprits de lobjet qui reprsente les donnes du variant. Si vous utilisez TPublishableVariantType comme classe de base pour votre type variant personnalis, alors il vous suffit dimplmenter la mthode GetInstance et toutes les proprits publies de lobjet qui reprsente les donnes du variant seront implmentes automatiquement pour les variants personnaliss. Par exemple, comme on la vu dans Stockage des donnes dun type Variant personnalis la page 4-30, TComplexVariantType stocke les donnes dun variant valeur complexe en utilisant une instance de TComplexData. TComplexData possde un certain nombre de proprits publies (Real, Imaginary, Radius, Theta et FixedTheta), qui fournissent des informations sur la valeur complexe. TComplexVariantType descend de TPublishableVariantType et implmente la mthode GetInstance pour renvoyer lobjet TComplexData (de TypInfo.pas) qui est stock dans lenregistrement TVarData du variant valeur complexe :
function TComplexVariantType.GetInstance(const V: TVarData): TObject; begin Result := TComplexVarData(V).VComplex; end;

TPublishableVariantType fait le reste. Il redfinit les mthodes GetProperty et SetProperty pour quelles utilisent les informations de type lexcution (RTTI) de lobjet TComplexData pour lire et crire les valeurs de proprits.
Remarque

Pour que TPublishableVariantType fonctionne, lobjet qui contient les donnes du variant personnalis doit tre compil avec RTTI. Cela signifie quil doit tre compil en utilisant la directive {$M+} ou descendre de TPersistent.

Utilisation des chanes


Delphi dispose de divers types caractre ou chane qui sont apparus au fur et mesure de lvolution du langage Pascal Objet. Cette section offre un aperu de ces types, de leur rle et de leurs utilisations. Pour des dtails sur la syntaxe du langage, voir dans laide en ligne du langage Pascal objet Types de chanes.

4-42

Guide du dveloppeur

Utilisation des chanes

Types caractre
Delphi a trois types caractre : Char, AnsiChar et WideChar. Le type caractre Char provient du Pascal standard, il a t utilis dans Turbo Pascal puis en Pascal Objet. Plus tard, le Pascal Objet a ajout les types AnsiChar et WideChar comme types caractre spcifiques pour grer les reprsentations standard des caractres sous Windows. AnsiChar a t introduit pour grer un jeu de caractres ANSI standard sur 8 bits et WideChar pour grer un jeu de caractres Unicode standard sur 16 bits. Les caractres de type WideChar sont galement appels caractres tendus. Les caractres tendus sont cods sur deux octets afin que le jeu de caractres puisse reprsenter davantage de caractres diffrents. Quand AnsiChar et WideChar ont t implments, Char est devenu le type caractre par dfaut reprsentant limplmentation dont lutilisation est conseille pour un systme donn. Si vous utilisez Char dans votre application, noubliez pas que son implmentation risque de changer dans les futures versions de Delphi.
Remarque

Pour la programmation multiplate-forme : Le caractre tendu de Linux, wchar_t, utilise 32 bits par caractre. Le standard Unicode sur 16 bits gr par les caractres tendus du Pascal Objet est un sous-ensemble du standard UCS sur 32 bits support par Linux et les bibliothques GNU. Les donnes en caractres tendus du Pascal doivent tre traduites en 32 bits par caractre avant dtre transmises une fonction du SE en tant que wchar_t. Le tableau suivant dcrit brivement ces types caractre :
Tableau 4.2 Type
Char AnsiChar WideChar

Types caractre du Pascal Objet Octets


1 1 2

Contenu
Un seul caractre Un seul caractre Un seul caractre Unicode

Utilisation
Type de caractre par dfaut Caractre 8 bits Standard Unicode 16 bits.

Pour davantage dinformations sur lutilisation de ces types caractre, voir dans laide en ligne du Guide du langage Pascal Objet la rubrique Types caractrePour davantage dinformations sur les caractres Unicode, voir dans laide en ligne du Guide du langage Pascal Objet la rubrique A propos des jeux de caractres tendus.

Types chane
Delphi offre trois catgories de types que vous pouvez utiliser lorsque vous travaillez avec des chanes : les pointeurs de caractre, les types chane, les classes chane.

Sujets de programmation gnraux

4-43

Utilisation des chanes

Cette section prsente les types chane et dcrit leur utilisation avec les pointeurs de caractre. Pour des informations sur les classes chane, voir dans laide en ligne la rubrique TStrings. Delphi dispose de trois implmentations de chane : les chanes courtes, les chanes longues et les chanes tendues. Il existe plusieurs types chane qui reprsentent ces implmentations. De plus, le mot rserv string correspond par dfaut limplmentation de chane actuellement recommande.

Chanes courtes
String a t le premier type chane utilis en Turbo Pascal. String tait lorigine implment avec une chane courte. Les chanes courtes allouent entre 1 et 256 octets : le premier octet contenant la longueur de la chane, les octets restants contenant les caractres de la chane :
S: string[0..n]// le type string original

Quand les chanes longues ont t implmentes, string a t modifi pour exploiter par dfaut une implmentation de chane longue et ShortString a t introduit comme type permettant la compatibilit ascendante. ShortString est un type prdfini pour une chane de longueur maximum :
S: string[255]// Le type ShortString

La quantit de mmoire alloue pour un ShortString est statique, cest--dire quelle est dtermine la compilation. Par contre, lemplacement de la mmoire dun ShortString peut tre alloue dynamiquement (par exemple si vous utilisez un PShortString qui est un pointeur sur un ShortString). Le nombre doctets de stockage employs par une variable de type chane courte correspond la longueur maximum du type chane courte plus un. Pour le type prdfini ShortString, la taille est donc de 256 octets. Les chanes courtes, dclares en utilisant la syntaxe string[0..n] et le type prdfini ShortString existent essentiellement pour proposer une compatibilit ascendante avec les versions prcdentes de Delphi et de Borland Pascal. Une directive de compilation, $H, dtermine si le mot rserv string correspond une chane longue ou courte. A ltat par dfaut, {$H+}, string reprsente une chane longue. Vous pouvez le changer en un ShortString en utilisant la directive {$H-}. Ltat {$H-} est surtout pratique pour utiliser du code crit pour des versions prcdentes du Pascal Objet qui utilisaient par dfaut le type chane courte. Cependant, les chanes courtes peuvent tre utiles dans des structures de donnes o vous avez besoin dun composant de taille fixe ou dans des DLL quand vous ne voulez pas utiliser lunit ShareMem (voir aussi dans laide en ligne Gestion de la mmoire). Vous pouvez redfinir localement la signification des dfinitions de type chane pour gnrer des chanes courtes. Vous pouvez aussi changer les dclarations de chanes courtes en string[255] ou en ShortString qui sont dpourvues dambiguts et indpendantes de la directive $H. Pour davantage dinformations sur les chanes et le type ShortString, voir dans laide en ligne du Guide du langage Pascal Objet la rubrique Chanes courtes.

4-44

Guide du dveloppeur

Utilisation des chanes

Chanes longues
Les chanes longues sont des chanes alloues dynamiquement dont la longueur maximum est 2 gigaoctets, mais la limite pratique dpend en gnral de la quantit de mmoire disponible. Comme les chanes courtes, les chanes longues utilisent des caractres Ansi sur 8 bits et un indicateur de longueur. A la diffrence des chanes courtes, les chanes longues nont pas un lment zro contenant la longueur dynamique de la chane. Pour connatre la longueur dune chane longue, vous devez utiliser la fonction standard Length et pour spcifier sa longueur vous devez utiliser la procdure standard SetLength. Les chanes longues utilisent le comptage de rfrences et, comme les PChars, ce sont des chanes zro terminal. Pour davantage dinformations sur limplmentation des chanes longues, voir dans laide en ligne du Guide du langage Pascal Objet la rubrique Chanes longues. Les chanes longues sont dsignes par le mot rserv string et par lidentificateur prdfini AnsiString . Dans les nouvelles applications, il est conseill dutiliser le type chane longue. Tous les composants de la VCL sont compils de cette manire, gnralement en utilisant string. Si vous crivez des composants, ils doivent galement utiliser des chanes longues tout comme doit le faire le code recevant des donnes provenant de proprits de type chane. Si vous voulez crire du code spcifique qui utilise systmatiquement une chane longue, vous devez utiliser AnsiString. Si vous voulez crire du code flexible qui vous permet de changer facilement le type quand une nouvelle implmentation de chane deviendra la norme, vous devez alors utiliser string.

Chanes tendues
Le type WideChar permet de reprsenter des chanes de caractres tendus comme des tableaux de WideChars. Les chanes tendues sont des chanes composes de caractres Unicode sur 16 bits. Comme les chanes longues, les chanes tendues sont alloues dynamiquement avec une longueur maximale de 2 gigaoctets, mais dont la limite pratique dpend en gnral de la quantit de mmoire disponible. Dans Delphi, les chanes tendues nimplmentent pas le comptage de rfrences. Chaque affectation dune chane tendue dans une variable chane tendue cre une copie des donnes de la chane. Dans Kylix, les chanes tendues implmentent le comptage de rfrences. La mmoire alloue dynamiquement qui contient la chane est libre quand la chane tendue sort de la porte. Dans tous les autres domaines, les chanes tendues possdent les mmes attributs que les chanes longues. Le type chane tendue est dsign par lidentificateur prdfini WideString. Comme la version 32 bits de OLE (Windows seulement) utilise Unicode pour toutes les chanes, les chanes doivent tre du type chane tendue dans tous les proprits et paramtres de mthodes OLE automation. En outre, la plupart des fonctions API OLE utilisent des chanes tendues zro terminal. Pour davantage dinformations, voir dans le Guide du langage Pascal Objet la rubrique Chanes tendues.

Sujets de programmation gnraux

4-45

Utilisation des chanes

Types PChar
Un PChar est un pointeur sur une chane zro terminal de caractres de type Char. Chacun des trois types caractre dispose dun type de pointeur prdfini : Un PChar est un pointeur sur une chane zro terminal de caractres 8 bits. Un PAnsiChar est un pointeur sur une chane zro terminal de caractres 8 bits. Un PWideChar est un pointeur sur une chane zro terminal de caractres 16 bits. PChar est, avec les chanes courtes, lun des types chane qui existaient lorigine dans le Pascal Objet. Il a t cr tout dabord comme type compatible avec le langage C et lAPI Windows.

Chanes ouvertes
Le type OpenString est obsolte mais vous pouvez le rencontrer dans du code ancien. Il nexiste que pour la compatibilit 16 bits et nest autoris que dans les paramtres. OpenString tait utilis, avant limplmentation des chanes longues, pour permettre le transfert comme paramtre dune chane courte de taille indtermine. Par exemple, la dclaration suivante :
procedure a(v : openstring);

permet de transmettre comme paramtre une chane de longueur quelconque. En son absence, la longueur de chane des paramtres formel et rel doivent correspondre exactement. Vous navez pas besoin dutiliser OpenString dans les nouvelles applications que vous crivez. Pour dautres informations sur la directive de compilation {$P+/-} voir Directives de compilation portant sur les chanes la page 4-54.

Routines de la bibliothque dexcution manipulant des chanes


La bibliothque dexcution propose de nombreuses routines de manipulation des chanes spcialises pour les diffrents types chane. Il y a des routines pour les chanes tendues, les chanes longues et les chanes zro terminal (cest-dire PChar). Les routines grant les types PChar utilisent le zro terminal pour dterminer la longueur des chanes. Pour davantage dinformations sur les chanes zro terminal, voir Utilisation des chanes zro terminal dans laide en ligne du Guide du langage Pascal Objet. La bibliothque dexcution propose galement des routines de formatage de chane. Il ny a pas de catgorie de routines pour les types ShortString. Nanmoins, certaines routines prdfinies dans le compilateur grent le type ShortString. Cest, par exemple, le cas des fonctions standard Low et High. Comme les chanes longues et tendues sont les plus frquemment utilises, les sections suivantes dcrivent les routines les manipulant.

4-46

Guide du dveloppeur

Utilisation des chanes

Routines manipulant les caractres tendus


Quand vous manipulez des chanes dans une application, vous devez vous assurer que votre code peut grer les chanes rencontres sur les diverses cibles locales. Il est parfois ncessaire dutiliser les caractres tendus et les chanes tendues. En fait, lune des manires de grer les jeux de caractres idographiques consiste convertir tous les caractres vers un schma de codage base de caractres tendus comme Unicode. La bibliothque dexcution contient les fonctions de chanes de caractres tendus suivantes pour faire les conversions entre chanes de caractres sur un seul octet standard (ou les chanes MBCS) et chanes Unicode : StringToWideChar WideCharLenToString WideCharLenToStrVar WideCharToString WideCharToStrVar

Lutilisation dun schma de codage avec des caractres tendus prsente cet avantage que vous pouvez avoir sur les chanes des prsupposs qui ne sont pas valables dans les systmes MBCS. Il y a en effet une relation directe entre le nombre doctets de la chane et son nombre de caractres. Il ny a pas le risque, comme avec les jeux de caractres MBCS, de couper un caractre en deux ou de confondre le deuxime octet dun caractre avec le dbut dun autre caractre. Un inconvnient de lutilisation des caractres tendus est que Windows 95 ne supporte pas les appels des fonctions de lAPI relatives aux caractres tendus. Pour cette raison, les composants de la VCL reprsentent toutes les valeurs de chanes sous forme de chanes sur un seul octet ou MBCS. La conversion entre le systme de caractres tendus et le systme MBCS chaque fois que vous dfinissez une proprit de chane ou lisez sa valeur ncessiterait dnormes quantits de code supplmentaire et ralentirait votre application. Mais, vous pouvez choisir la conversion en caractres tendus pour certains algorithmes de traitement des chanes qui tirent profit de la correspondance 1:1 entre caractres et WideChar.
Remarque

Habituellement, les composants CLX reprsentent les valeurs chane sous forme de chanes tendues.

Routines usuelles de manipulation des chanes longues


Il est possible de regrouper les chanes manipulant des chanes longues dans plusieurs catgories fonctionnelles. Dans ces catgories, certaines routines sont utilises dans le mme but mais varient dans lutilisation de critres particuliers dans leurs calculs. Les tableaux suivants numrent ces routines en les regroupant selon les catgories suivantes : Comparaison Conversion majuscules/minuscules Modification Sous-chanes

Sujets de programmation gnraux

4-47

Utilisation des chanes

Quand cest appropri, les tableaux indiquent galement si la routine satisfait les critres suivants : Diffrence majuscules/minuscules : si les paramtres de localisation sont utiliss, ils dterminent la dfinition des caractres majuscules/minuscules. Si la routine nutilise pas les paramtres de localisation, les analyses sont fondes sur la valeur scalaire des caractres. Si la routine ne tient pas compte des diffrences majuscules/minuscules, il y a une fusion logique des caractres majuscules et minuscules dtermine par un modle prdfini. Utilisation des paramtres de localisation : cela permet de personnaliser votre application pour des localisations spcifiques, en particulier dans le cas des environnements pour les langues asiatiques. Dans la plupart des localisations, les caractres minuscules sont censs tre infrieurs aux caractres majuscules correspondants. Cest loppos de lordre ASCII dans lequel les caractres minuscules sont suprieurs aux caractres majuscules. Les routines qui utilisent la localisation Windows commencent gnralement par Ansi (AnsiXXX). Gestion des jeux de caractres multi-octets (MBCS) : les MBCS sont utiliss pour crire du code pour les localisations extrme-orientales. Les caractres multi-octets sont reprsents par un mlange de codes de caractre sur un deux octets, le nombre doctets ne correspond donc pas systmatiquement la longueur de la chane. Les routines qui grent les MBCS analysent les caractres sur un ou deux octets. ByteType et StrByteType dterminent si un octet donn est loctet de tte dun caractre sur deux octets. Faites attention en manipulant des caractres multioctets ne pas tronquer une chane en coupant en deux un caractre utilisant deux octets. Ne transmettez pas de caractres comme paramtre dune fonction ou dune procdure puisque la taille dun caractre ne peut tre dtermine lavance. Il faut, la place, transmettre un pointeur sur un caractre ou une chane. Pour davantage dinformations sur MBCS, voir Codage de lapplication la page 12-2 au chapitre 12, Cration dapplications internationales.
Tableau 4.3 Routines de comparaison de chanes Utilisation des param tres de localisation
Oui Oui Oui Non Non

Routine
AnsiCompareStr AnsiCompareText AnsiCompareFileName CompareStr CompareText

Diffrence MAJ/min
Oui Non Non Oui Non

Gestion MBCS
Oui Oui Oui Non Non

4-48

Guide du dveloppeur

Utilisation des chanes

Tableau 4.4 Routine

Routines de conversion majuscules/minuscules Utilisation des param tres de localisation


Oui Oui Oui Oui Non Non

Gestion MBCS
Oui Oui Oui Oui Non Non

AnsiLowerCase AnsiLowerCaseFileName AnsiUpperCaseFileName AnsiUpperCase LowerCase UpperCase

Les routines utilises pour les noms de fichier sous forme de chane : AnsiCompareFileName, AnsiLowerCaseFileName et AnsiUpperCaseFileName utilisent la localisation Windows. Vous devez toujours utiliser des noms de fichier portables car la localisation (le jeu de caractres) utilise pour les noms de fichier peut changer selon linterface utilisateur par dfaut.
Tableau 4.5 Routine
AdjustLineBreaks AnsiQuotedStr StringReplace Trim TrimLeft TrimRight WrapText

Routines de modification de chane Diff rence MAJ/min


ND ND prcis par un indicateur ND ND ND ND

Gestion MBCS
Oui Oui Oui Oui Oui Oui Oui

Tableau 4.6 Routine

Routines de sous-chanes Diff rence MAJ/min


ND Oui Oui Oui Oui Non

Gestion MBCS
Oui Oui Oui Oui Oui Non

AnsiExtractQuotedStr AnsiPos IsDelimiter IsPathDelimiter LastDelimiter QuotedStr

Sujets de programmation gnraux

4-49

Utilisation des chanes

Tableau 4.7 Routine

Routines de manipulation de chanes Diff rence MAJ/min


Non Non Non Non Non Non ND Oui Oui ND ND ND ND ND ND ND

Gestion MBCS
Oui Non Oui Oui Non Oui Oui Non Non Non Non Non Non Non Non Non

AnsiContainsText AnsiEndsText AnsiIndexText AnsiMatchText AnsiResemblesText AnsiStartsText IfThen LeftStr RightStr SoundEx SoundExInt DecodeSoundExInt SoundExWord DecodeSoundExWord SoundExSimilar SoundExCompare

Dclaration et initialisation de chanes


Quand vous dclarez une chane longue :
S: string;

il nest pas ncessaire de linitialiser. Les chanes longues sont automatiquement initialises vides. Pour tester si une chane longue est vide, vous pouvez utiliser la variable EmptyStr :
S = EmptyStr;

ou la comparer une chane vide :


S = ;

Une chane vide ne contient pas de donnes utilisables. Donc, essayer daccder par indice une chane vide est similaire laccs nil et provoque une violation daccs :
var S: string; begin S[i]; // cela provoque une violation daccs // instructions end;

4-50

Guide du dveloppeur

Utilisation des chanes

De mme, si vous transtypez une chane vide en un PChar, le rsultat est un pointeur nil. Donc, si vous transmettez un tel PChar une routine qui doit le lire ou lcrire, la routine doit grer la valeur nil :
var S: string; // chane vide begin proc(PChar(S)); // assurez-vous que proc peut grer nil // instructions end;

Si ce nest pas le cas, vous devez initialiser la chane :


S := plus nil; proc(PChar(S)); // proc na plus besoin de grer nil

ou vous devez en spcifier la longueur en utilisant la procdure SetLength :


SetLength(S, 100);// attribue la chane S une longueur dynamique 100 proc(PChar(S));// proc na plus besoin de grer nil

Quand vous utilisez SetLength, les caractres existant dj dans la chane sont prservs mais le contenu de lespace nouvellement allou est indtermin. Aprs un appel SetLength, S rfrence obligatoirement une chane unique, cest--dire une chane dont le compteur de rfrences a la valeur un. Pour connatre la longueur dune chane, utilisez la fonction Length. Noubliez pas quune chane string dclare de la manire suivante :
S: string[n];

est implicitement une chane courte et pas une chane longue de longueur n. Pour dclarer une chane longue ayant spcifiquement la longueur n, dclarez une variable de type string, puis utilisez la procdure SetLength :
S: string; SetLength(S, n);

Mlange et conversion de types chane


Il est possible de mlanger dans des expressions et des affectations des chanes courtes, longues et tendues ; le compilateur gnre automatiquement le code pour effectuer les conversions de type chane ncessaires. Par contre, si vous affectez une valeur chane une variable chane courte, noubliez pas que la valeur chane est tronque si elle excde la longueur maximum dclare de la variable de type chane courte. Les chanes longues sont dj alloues dynamiquement. Noubliez pas que si vous utilisez lun des types de pointeur prdfinis (comme PAnsiString, PString ou PWideString), vous introduisez un niveau dindirection supplmentaire. Vous ne devez le faire quen connaissance de cause. Des fonctions supplmentaires (CopyQStringListToTstrings, Copy TStringsToQStringList, QStringListToTStringList) sont fournies pour la conversion des types de chanes Qt sous-jacents et des types de chanes CLX. Ces fonctions sont localiss dans Qtypes.pas.

Sujets de programmation gnraux

4-51

Utilisation des chanes

Conversions de chanes en PChar


La conversion de chanes longues en PChar nest pas effectu e automatiquement. Certaines diffrences entre les chanes et les PChar peuvent rendre la conversion problmatique : Les chanes longues utilisent le comptage de rfrences, mais pas les PChar. Laffectation dune chane longue copie les donnes alors quun PChar est un pointeur sur la mmoire. Les chanes longues sont zro terminales et contiennent galement la longueur de la chane alors que les PChars sont seulement zro terminal. Cette section prsente ce qui dans ces diffrences peut causer des erreurs dlicates.

Dpendances de chane
Il est parfois ncessaire de convertir des chanes longues en chanes zro terminal, par exemple si vous utilisez une fonction qui attend un PChar. Si vous devez transtyper une chane en PChar, sachez que vous tes responsable de la dure de vie du PChar rsultant. Comme les chanes longues utilisent le comptage de rfrences, le transtypage dune chane en un PChar augmente de un les dpendances de la chane sans augmenter galement le compteur de rfrences. Quand le compteur de rfrences atteint zro, la chane est dtruite mme sil y a encore des dpendances portant dessus. Le transtypage en PChar disparat galement, et ce alors mme que la routine laquelle vous lavez transmis lutilise peut-tre encore. Par exemple :
procedure my_func(x: string); begin // faire quelque chose avec x some_proc(PChar(x)); // transtype la chane en PChar // vous devez maintenant garantir que la chane existe // tant que la procdure some_proc a besoin de lutiliser end;

Renvoi dune variable locale PChar


Une erreur courante quand vous utilisez un PChar est de stocker dans une structure de donnes ou de renvoyer comme rsultat une variable locale. Une fois votre routine acheve, le PChar disparat car cest un simple pointeur mmoire et non une copie de chane utilisant le comptage de rfrences. Par exemple :
function title(n: Integer): PChar; var s: string; begin s := Format(titre - %d, [n]); Result := PChar(s); // A NE PAS FAIRE end;

4-52

Guide du dveloppeur

Utilisation des chanes

Cet exemple renvoie un pointeur sur une donne chane qui est libre lachvement de la fonction title.

Transfert dune variable locale comme PChar


Si vous avez une variable locale chane qui doit tre initialise en appelant une fonction qui attend un paramtre PChar. Une solution consiste crer une variable locale array of char et la transmettre la fonction. Il faut ensuite affecter cette variable la chane :
// version VCL // MAXSIZE est une constante dfinie par ailleurs var i: Integer; buf: array[0..MAX_SIZE] of char; S: string; begin i := GetModuleFilename(0, @buf, SizeOf(buf));// traite @buf comme un PChar S := buf; // instructions end;

Ou, pour les programmes multiplates-formes, le code est presque identique :


// FillBuffer est une fonction dfinie par ailleurs function FillBuffer(Buf:PChar;Count:Integer):Integer begin . . . end; // MAX_SIZE est une constante dfinie par ailleurs var i: Integer; buf: array[0..MAX_SIZE] of char; S: string; begin i := FillBuffer(0, @buf, SizeOf(buf));// traite @buf comme un PChar S := buf; // instructions end;

Cette manire de procder est envisageable si la taille du tampon reste suffisamment petite pour tre alloue sur la pile. Elle est galement fiable car la conversion est automatique entre un type array of char et un type string. A la fin de lexcution de GetModuleFilename (ou de FillBuffer dans la version multiplate-forme), la longueur (Length ) de la chane indique correctement le nombre doctets crits dans buf. Pour liminer le surcot de la copie du tampon, il est possible de transtyper la chane en un PChar (si vous tes certain que la routine na pas besoin que le PChar reste en mmoire). Mais dans ce cas, la synchronisation de la longueur de la chane nest pas effectue automatiquement comme cest le cas lors de laffectation de array of char vers string. Vous devez rinitialiser la longueur (Length) de la chane afin de reflter la longueur relle de la chane. Si vous

Sujets de programmation gnraux

4-53

Utilisation des chanes

utilisez une fonction qui renvoie le nombre doctets copis, une seule ligne de code suffit le faire :
var S: string; begin SetLength(S, MAX_SIZE); // avant de transtyper en PChar, vrifiez que la chane // nest pas vide SetLength(S, GetModuleFilename( 0, PChar(S), Length(S) ) ); // instructions end;

Directives de compilation portant sur les chanes


Les directives de compilation suivantes affectent les types caractre et chane.
Tableau 4.8 Directive
{$H+/-}

Directives de compilation portant sur les chanes Description


La directive de compilation $H contrle si le mot rserv string reprsente une chane courte ou une chane longue. A ltat par dfaut, {$H+}, string reprsente une chane longue. Vous pouvez le changer en ShortString en utilisant la directive {$H-}. La directive $P, propose pour la compatibilit ascendante avec les versions prcdentes, na de sens que pour le code compil ltat {$H-}. $P contrle la signification des paramtres variables dclars en utilisant le mot rserv string en tant ltat {$H-}. A ltat {$P-}, les paramtres variables dclars en utilisant le mot rserv string sont des paramtres variables normaux. Par contre, ltat {$P+}, ce sont des paramtres chane ouverte. Indpendamment de ltat de la directive $P, il est toujours possible dutiliser lidentificateur OpenString pour dclarer des paramtres chane ouverte. La directive $V contrle comment seffectue la vrification de type pour les paramtres chane courte transmis comme paramtre variable. A ltat {$V+}, une vrification de type stricte est effectue et exige que les param tres formel et rel soient exactement du m me type chane. A ltat {$V-}, toute chane courte est autorise comme param tre rel, m me si sa longueur maximum dclare nest pas la mme que celle du paramtre formel. Attention : cela peut entraner une corruption de la mmoire. Par exemple :

{$P+/-}

{$V+/-}

var S: string[3]; procedure Test(var T: string); begin T := 1234; end; begin Test(S); end.

4-54

Guide du dveloppeur

Utilisation des fichiers

Tableau 4.8 Directive


{$X+/-}

Directives de compilation portant sur les chanes (suite) Description


La directive de compilation {$X+} permet de grer les chanes zro terminal en activant des rgles particulires qui sappliquent au type prdfini PChar et aux tableaux de caractres dindice de base zro. Ces rgles permettent dutiliser des tableaux de caractres dindice de base zro ou des pointeurs de caractre avec les routines Write, Writeln, Val, Assign et Rename de lunit System.

Chanes et caractres : sujets apparents


Les rubriques suivantes du Guide du langage Pascal Objet abordent les chanes et les jeux de caractres. Voir aussi chapitre 12, Cration dapplications internationales A propos des jeux de caractres tendus (Aborde les jeux de caractres internationaux) Utilisation de chanes zro terminal (Contient des informations sur les tableaux de caractres) Chanes de caractres Pointeurs de caractres Oprateurs de chanes

Utilisation des fichiers


Cette section dcrit les manipulations de fichier en distinguant entre la manipulation de fichiers disque et les oprations dentres/sorties comme la lecture ou lcriture dans des fichiers. La premire section dcrit les routines de la bibliothque dexcution et de lAPI Windows que vous utiliserez pour des oprations courantes impliquant la manipulation de fichiers sur disque. La section suivante est une prsentation des types fichier utiliss pour les entres/ sorties. Enfin, la dernire section prsente la mthode conseille pour manipuler les entres/sorties de fichier, savoir lutilisation de flux fichier. Au contraire du langage Pascal Objet, le systme dexploitation Linux distingue majuscules et minuscules. Faites attention la casse des caractres lorsque vous travaillez avec des fichiers dans des applications multiplates-formes.
Remarque

Les versions prcdentes du langage Pascal Objet effectuaient les oprations sur les fichiers mmes et non pas sur des paramtres nom de fichier, comme cest le cas aujourdhui. Avec ces types fichier, vous deviez trouver le fichier, laffecter une variable fichier avant de pouvoir, par exemple, renommer le fichier.

Manipulation de fichiers
Plusieurs oprations courantes portant sur les fichiers sont prdfinies dans la bibliothque dexcution Pascal Objet. Les procdures et fonctions manipulant les fichiers agissent un niveau lev. Pour la plupart des routines, il vous suffit de

Sujets de programmation gnraux

4-55

Utilisation des fichiers

spcifier le nom du fichier et la routine fait pour vous les appels ncessaires au systme dexploitation. Dans certains cas, vous utiliserez la place des handles de fichiers. Le Pascal Objet propose des routines pour la plupart des manipulations de fichier. Quand ce nest pas le cas, dautres routines sont dcrites.
Attention

Au contraire du langage Pascal Objet, le systme dexploitation Linux distingue majuscules et minuscules. Faites attention la casse des caractres lorsque vous travaillez avec des fichiers dans des applications multiplates-formes.

Suppression dun fichier


La suppression efface un fichier du disque et retire son entre du rpertoire du disque. Il ny a pas dopration inverse pour restaurer un fichier supprim : les applications doivent donc gnralement demander lutilisateur de confirmer les suppressions de fichiers. Pour supprimer un fichier, transmettez le nom du fichier la fonction DeleteFile :
DeleteFile(NomFichier);

DeleteFile renvoie True si le fichier a t supprim et False sinon (par exemple, si le fichier nexiste pas ou sil est en lecture seule). DeleteFile supprime le fichier du disque nomm NomFichier.

Recherche dun fichier


Trois routines permettent de chercher un fichier : FindFirst, FindNext et FindClose. FindFirst recherche la premire instance dun nom de fichier ayant un ensemble spcifi dattributs dans un rpertoire spcifi. FindNext renvoie lentre suivante correspondant au nom et aux attributs sp cifis dans un appel prcdent de FindFirst. FindClose libre la mmoire alloue par FindFirst . Vous devez toujours utiliser FindClose pour clore une squence FindFirst/FindNext. Si vous voulez simplement savoir si un fichier existe, utilisez la fonction FileExists qui renvoie True si le fichier existe et False sinon. Les trois routines de recherche de fichier attendent dans leurs paramtres un TSearchRec. TSearchRec dfinit les informations du fichier recherch par FindFirst ou FindNext. TSearchRec a la dclaration suivante :
type TFileName = string; TSearchRec = record Time: Integer;// Time contient lindicateur horaire du fichier. Size: Integer;// Size contient la taille, en octets, du fichier. Attr: Integer;// Attr reprsente les attributs du fichier. Name: TFileName;//Name contient le nom de fichier et lextension. ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData;// FindData contient des informations complmentaires // comme lheure de cration du fichier, lheure du dernier accs, les noms de fichier // long et court. end;

Si un fichier est trouv, les champs du paramtre de type TSearchRec sont modifis pour dcrire le fichier trouv. Vous pouvez comparer Attr aux

4-56

Guide du dveloppeur

Utilisation des fichiers

constantes ou aux valeurs dattributs suivantes afin de dterminer si un fichier a un attribut donn :
Tableau 4.9 Constante
faReadOnly faHidden faSysFile faVolumeID faDirectory faArchive faAnyFile

Constantes et valeur dattribut Valeur


$00000001 $00000002 $00000004 $00000008 $00000010 $00000020 $0000003F

Description
Fichiers en lecture seule Fichiers cachs Fichiers systme Fichier ID de volume Fichiers rpertoire Fichier archive Tout fichier

Pour tester un attribut, combinez la valeur du champ Attr et la constante dattribut avec loprateur and. Si le fichier a cet attribut, le rsultat est suprieur 0. Par exemple, si le fichier trouv est un fichier cach, lexpression suivante a la valeur True : (SearchRec.Attr and faHidden > 0). Il est possible de combiner les attributs en combinant avec loprateur OR leurs constantes ou valeurs. Par exemple, pour rechercher les fichiers en lecture seule et les fichiers cachs en plus des fichiers normaux, transmettez (faReadOnly or faHidden) au paramtre Attr.
Exemple :

Cet exemple utilise une fiche contenant un libell, un bouton nomm Search et un bouton nomm Again. Quand lutilisateur clique sur le bouton Search, le premier fichier du rpertoire spcifi est trouv et son nom et sa taille en octets sont affichs dans lintitul du libell. A chaque fois que lutilisateur clique sur le bouton Again, le nom et la taille du fichier correspondant suivant sont affichs dans le libell :
var SearchRec: TSearchRec; procedure TForm1.SearchClick(Sender: TObject); begin FindFirst(c:\Program Files\delphi6\bin\*.*, faAnyFile, SearchRec); Label1.Caption := SearchRec.Name + occupe + IntToStr(SearchRec.Size) + octets; end; procedure TForm1.AgainClick(Sender: TObject); begin if (FindNext(SearchRec) = 0) Label1.Caption := SearchRec.Name + occupe + IntToStr(SearchRec.Size) + octets; else FindClose(SearchRec); end;

Dans les applications multiplates-formes, vous devez remplacer les chemins daccs cods en dur comme c:\Program Files\delphi6\bin\*.* par le chemin daccs correct du systme ou utiliser les variables denvironnement (page

Sujets de programmation gnraux

4-57

Utilisation des fichiers

Variables denvironnement, quand vous avez choisi Outils|Options denvironnement) pour les reprsenter.

Modification dun nom de fichier


Pour changer le nom dun fichier, utilisez simplement la fonction RenameFile :
function RenameFile(const AncienNomFichier, NouveauNomFichier: string): Boolean;

qui renomme le fichier nomm AncienNomFichier, en NouveauNomFichier. Si lopration russit, RenameFile renvoie True. Si le fichier ne peut tre renomm, par exemple parce quil existe dj un fichier portant le nom NouveauNomFichier, elle renvoie False. Par exemple :
if not RenameFile(ANCNOM.TXT,NOUVNOM.TXT) then ErrorMsg(Erreur en renommant le fichier!);

Il nest pas possible de renommer (dplacer) un fichier entre des lecteurs en utilisant RenameFile. Pour ce faire, vous devez commencer par copier le fichier, puis supprimer le fichier original.
Remarque

RenameFile, dans la VCL, est une enveloppe autour de la fonction MoveFile de lAPI Windows, et donc MoveFile ne fonctionne pas non plus dun lecteur lautre.

Routines date-heure de fichier


Les routines FileAge, FileGetDate et FileSetDate agissent sur les valeurs date-heure du systme dexploitation. FileAge renvoie lindicateur de date et dheure dun fichier ou -1 si le fichier est inexistant. FileSetDate dfinit lindicateur de date et dheure du fichier spcifi et renvoie zro en cas de russite ou un code derreur en cas dchec. FileGetDate renvoie lindicateur de date et dheure dun fichier ou -1 si le handle est invalide. Comme la plupart des routines de manipulation de fichier, FileAge utilise un nom de fichier sous forme de chane. Par contre, FileGetDate et FileSetDate attendent un paramtre de type Handle. Pour obtenir laccs un Handle de fichier Windows, au choix Appelez la fonction CreateFile de lAPI Windows. CreateFile est une fonction 32 bits uniquement qui cre ou ouvre un fichier et renvoie un Handle qui peut tre utilis pour accder au fichier. Instanciez TFileStream pour crer ou ouvrir un fichier. Ensuite, utilisez la proprit Handle comme vous le feriez avec un Handle de fichier Windows. Voir Utilisation des flux fichier la page 4-60, pour plus dinformations.

Copie dun fichier


La bibliothque dexcution ne fournit pas de routine pour copier un fichier. Mais, si vous crivez des applications uniquement pour Windows, vous pouvez appeler directement la fonction CopyFile de lAPI Windows pour copier un fichier. Comme la plupart des routines de la bibliothque dexcution Delphi, CopyFile prend comme paramtre un nom de fichier et non un Handle. Faites attention lorsque vous copiez un fichier, car les attributs du fichier existants sont

4-58

Guide du dveloppeur

Utilisation des fichiers

copis dans le nouveau fichier, mais pas les attributs de scurit. CopyFile est galement utile pour dplacer des fichiers dun lecteur un autre, car ni la fonction RenameFile de Delphi, ni la fonction MoveFile de lAPI Windows ne peut renommer ou dplacer des fichiers entre lecteurs. Pour plus dinformations, voir laide en ligne de Windows.

Types fichier et E/S de fichier


Vous pouvez utiliser trois types fichier pour les entres/sorties (E/S) de fichier : les types de fichier Pascal, les handles de fichier et les objets flux fichier. Le tableau suivant les dcrit.
Tableau 4.10 Types de fichiers et E/S de fichier Description
Dans lunit System. Ces types sont utiliss pour les variables fichier, gnralement de la forme F: Text: ou F: File. Il existe trois formes de ces fichiers : typ, texte et sans type. De nombreuses routines de gestion de fichier, comme AssignPrn ou writeln, les utilisent. Ces types de fichier sont obsoltes et incompatibles avec les handles des fichiers Windows. Si vous avez besoin de travailler avec ces types de fichier, consultez le Guide du langage Pascal Objet. Dans lunit Sysutils. Beaucoup de routines utilisent un handle pour identifier le fichier. Vous obtenez le handle lorsque vous ouvrez ou crez le fichier (par exemple, en utilisant FileOpen ou FileCreate). Lorsque vous avez le handle, vous disposez de routines pour travailler sur le contenu du fichier tant donn son handle (crire une ligne, lire le texte, etc.). En programmation Windows, les handles de fichier Pascal Objet sont des enveloppes pour le type handle de fichier Windows. Les routines de gestion des handles de fichier de la bibliothque dexcution qui utilisent les Handles de fichier Windows sont gnralement des enveloppes autour des fonctions de lAPI Windows. Par exemple, FileRead appelle la fonction ReadFile de Windows. Comme les fonctions Delphi utilisent la syntaxe du Pascal Objet et fournissent occasionnellement les valeurs par dfaut des paramtres, elles peuvent facilement servir dinterface lAPI de Windows. Lutilisation de ces routines est imm diate et si vous connaissez bien les routines de fichier de lAPI Windows, vous vous en servirez volontiers pour travailler avec les E/S de fichiers. Les flux fichier sont des instances dobjet de la classe TFileStream utilises pour accder aux informations de fichiers disque. Les flux fichier sont portables et proposent une approche de haut niveau des oprations dE/S de fichier. TFileStream a une proprit Handle qui vous donne accs au handle de fichier. La section suivante dcrit TFileStream.

Type de fichier
Types de fichier Pascal

Handles de fichier

Flux fichier

Sujets de programmation gnraux

4-59

Utilisation des fichiers

Utilisation des flux fichier


TFileStream est une classe permettant aux applications de lire et dcrire dans un fichier rsidant sur le disque. Elle est utilise pour une reprsentation objet de haut niveau des flux fichier. TFileStream offre de nombreuses fonctionnalits : la persistance, linteraction avec dautres flux et les E/S de fichier. TFileStream est un descendant des classes flux. En tant que tel, il hrite de la capacit stocker de manire persistante les proprits des composants. Cest un des avantages de lutilisation des flux fichier. Les classes flux peuvent travailler avec les classes TFiler, TReader et TWriter pour lire des flux dobjets depuis un disque. Quand vous avez un flux fichier, vous pouvez donc utiliser le mme code que celui employ par le mcanisme de flux de composant. Pour davantage dinformations sur lutilisation du systme de flux de composant, voir laide en ligne sur les classes TStream, TFiler, TReader, TWriter, et TComponent. TFileStream peut facilement interagir avec dautres classes flux. Si, par exemple, vous voulez crire sur disque un bloc de mmoire dynamique, vous pouvez le faire en utilisant un TFileStream et un TMemoryStream. TFileStream propose les mthodes et proprits de base pour les entres/ sorties de fichier. Les sections suivantes abordent cet aspect des flux fichier.

Cration et ouverture de fichiers


Pour crer ou ouvrir un fichier et disposer dun handle pour le fichier, il suffit dinstancier un TFileStream. Cela cre ou ouvre le fichier spcifi et propose des mthodes qui permettent de lire ou dcrire dans le fichier. Si le fichier ne peut tre ouvert, TFileStream dclenche une exception.
constructor Create(const filename: string; Mode: Word);

Le paramtre Mode spcifie comment le fichier doit tre ouvert la cration du flux fichier. Le paramtre Mode est constitu dun mode douverture et dun mode de partage relis par un ou logique. Le mode douverture doit prendre lune des valeurs suivantes :
Tableau 4.11 Valeur
fmCreate fmOpenRead fmOpenWrite fmOpenReadWrite

Modes douverture Signification


TFileStream cre un fichier portant le nom spcifi. Sil existe dj un fichier portant ce nom, il est ouvert en mode criture. Ouvre le fichier en lecture seulement. Ouvre le fichier en criture seulement. Lcriture dans le fichier remplace son contenu actuel. Ouvre le fichier pour en modifier le contenu et non pour le remplacer.

4-60

Guide du dveloppeur

Utilisation des fichiers

Le mode de partage peut prendre lune des valeurs suivantes et comporte les limites numres ci-dessous :
Tableau 4.12 Valeur
fmShareCompat fmShareExclusive fmShareDenyWrite fmShareDenyRead fmShareDenyNone

Modes de partage Signification


Le partage est compatible avec la manire dont les FCB sont ouverts. En aucun cas, une autre application ne peut ouvrir le fichier. Les autres applications peuvent ouvrir le fichier en lecture, mais pas en criture. Les autres applications peuvent ouvrir le fichier en criture, mais pas en lecture. Rien nempche les autres applications de lire ou dcrire dans le fichier.

Notez que le mode de partage utilisable dpend du mode douverture utilis. Le tableau suivant montre les modes de partage associs chaque mode douverture.
Tableau 4.13 Modes de partage disponible pour chaque mode douverture
fmShareCompat fmShareExclusive fmShareDenyWrite fmShareDenyRead fmShareDenyNone
Non utilisable Disponible Disponible Disponible Non utilisable Disponible Non utilisable Disponible Disponible Disponible Disponible Disponible Disponible Disponible

Mode douverture
fmOpenWrite fmOpenReadWrite

fmOpenRead Non utilisable

Les constantes douverture et de partage de fichier sont dfinies dans lunit SysUtils.

Utilisation du handle de fichier


Quand vous instanciez TFileStream, vous avez accs au handle de fichier. Le handle de fichier est contenu dans la proprit Handle. Handle est en lecture seule et indique le mode douverture du fichier. Si vous voulez modifier les attributs du handle de fichier, vous devez crer un nouvel objet flux fichier. Certaines routines de manipulation de fichier attendent comme paramtre un handle de fichier de fentre. Quand vous disposez dun flux fichier, vous pouvez utiliser la proprit Handle dans toutes les situations o vous utiliseriez un handle de fichier de fentre. Attention, la diffrence des handles de flux, les flux fichiers ferment le handle de fichier quand lobjet est dtruit.

Lecture et criture de fichiers


TFileStream dispose de plusieurs mthodes permettant de lire et dcrire dans les fichiers. Elles sont diffrencies selon quelles se trouvent dans lune ou lautre des situations suivantes : Renvoi du nombre doctets lus ou crits. Ncessit de connatre le nombre doctets. Dclenchement dune exception en cas derreur.

Sujets de programmation gnraux

4-61

Utilisation des fichiers

Read est une fonction qui lit jusqu Count octets dans le fichier associ un flux fichier en commenant la position en cours (Position) et les place dans Buffer. Read dplace ensuite la position en cours dans le fichier du nombre doctets effectivement lus. Read a le prototype suivant :
function Read(var Buffer; Count: Longint): Longint; override;

Read est utile quand le nombre doctets du fichier est inconnu. Read renvoie le nombre doctets effectivement transfrs qui peut tre infrieur Count si le marqueur de fin de fichier a t atteint. Write est une fonction qui crit Count octets de Buffer dans le fichier associ au flux fichier en commenant la position en cours (Position). Write a le prototype suivant :
function Write(const Buffer; Count: Longint): Longint; override;

Aprs avoir crit dans le fichier, Write avance la position en cours dans le fichier du nombre doctets crits et renvoie le nombre doctets effectivement crits qui peut tre infrieur Count si la fin du tampon a t atteinte. La paire de procdures correspondantes ReadBuffer et WriteBuffer ne renvoient pas comme Read et Write le nombre doctets lus ou crits. Ces procdures sont utiles dans les situations o le nombre doctet est connu et obligatoire, par exemple pour la lecture de structures. ReadBuffer et WriteBuffer dclenchent une exception en cas derreur (EReadError et EWriteError), alors que les mthodes Read et Write ne le font pas. Les prototypes de ReadBuffer et WriteBuffer sont :
procedure ReadBuffer(var Buffer; Count: Longint); procedure WriteBuffer(const Buffer; Count: Longint);

Ces mthodes appellent les mthodes Read et Write pour raliser la lecture ou lcriture.

Lecture et criture de chanes


Si vous transmettez une chane une fonction de lecture ou dcriture, vous devez veiller utiliser la bonne syntaxe. Les paramtres Buffer des routines de lecture et dcriture sont des paramtres, respectivement, var et const. Ce sont des paramtres sans type, les routines utilisent donc ladresse des variables. Le type chane longue est le plus couramment utilis pour la manipulation de chanes. Cependant, la transmission dune chane longue comme paramtre Buffer ne gnre pas le rsultat adquat. Les chanes longues contiennent une taille, un compteur de rfrences et un pointeur sur les caractres de la chane. De ce fait, drfrencer une chane longue ne donne pas seulement llment pointeur. Vous devez tout dabord transtyper la chane en Pointer ou PChar, puis alors seulement la drfrencer. Par exemple :
procedure caststring; var fs: TFileStream; const s: string = Hello; begin

4-62

Guide du dveloppeur

Utilisation des fichiers

fs := TFileStream.Create(temp.txt, fmCreate or fmOpenWrite); fs.Write(s, Length(s));// cela donne un rsultat faux fs.Write(PChar(s)^, Length(s));// cela donne le bon rsultat end;

Dplacements dans un fichier


La plupart des mcanismes dE/S de fichier proposent le moyen de se dplacer lintrieur dun fichier afin de pouvoir lire ou crire un emplacement particulier du fichier. TFileStream propose pour ce faire la mthode Seek. Seek a le prototype suivant :
function Seek(Offset: Longint; Origin: Word): Longint; override;

Le paramtre Origin indique la manire dinterprter le paramtre Offset. Origin peut prendre lune des valeurs suivantes :
Valeur
soFromBeginning soFromCurrent soFromEnd

Signification
Offset part du dbut de la ressource. Seek se dplace sur la position Offset. Offset doit tre >= 0. Offset part de la position en cours dans la ressource. Seek se dplace sur la position Position + Offset. Offset part de la fin de la ressource. Offset doit tre <= 0 afin dindiquer le nombre doctets avant la fin du fichier.

Seek rinitialise la valeur de Position dans le flux en la dplaant du dcalage spcifi. Seek renvoie la nouvelle valeur de la proprit Position, la nouvelle position en cours dans la ressource.

Position et taille de fichier


TFileStream dispose de proprits qui contiennent la position en cours dans le fichier et sa taille. Ces proprits sont utilises par les mthodes de lecture et dcriture et par Seek. La proprit Position de TFileStream est utilise pour indiquer le dcalage en cours dans le flux, exprim en octets, partir du dbut des donnes du flux. Position a la dclaration suivante :
property Position: Longint;

La proprit Size indique la taille en octets du flux. Elle est utilise comme marqueur de fin de fichier afin de tronquer le fichier. Size a la dclaration suivante :
property Size: Longint;

Size est utilise de manire interne par les routines qui lisent et crivent dans le flux. Linitialisation de la proprit Size modifie la taille du fichier. Si la taille du fichier ne peut tre modifie, une exception est dclenche. Ainsi, tenter de modifier la taille dun fichier ouvert dans le mode fmOpenRead dclenche une exception.

Sujets de programmation gnraux

4-63

Conversion de mesures

Copie
CopyFrom copie le nombre spcifi doctets dun flux (fichier) dans un autre.
function CopyFrom(Source: TStream; Count: Longint): Longint;

Lutilisation de CopyFrom vite lutilisateur qui veut copier des donnes de crer un tampon, dy placer les donnes, de les crire puis de librer le tampon. CopyFrom copie Count octets de Source dans le flux. CopyFrom dplace ensuite la position en cours de Count octets et renvoie le nombre doctets copis. Si Count vaut 0, CopyFrom initialise la position dans Source 0 avant de lire puis de copier dans le flux la totalit des donnes de Source. Si Count est suprieur ou infrieur 0, CopyFrom lit partir de la position en cours dans Source.

Conversion de mesures
Lunit ConvUtils dclare une fonction Convert que vous pouvez utiliser pour convertir des mesures entre plusieurs units. Vous pouvez effectuer des conversions entre units compatibles, par exemple des pouces et des pieds ou des jours et des semaines. Les units mesurant les mme types de choses sont dites appartenir la mme famille de conversion. Les units que vous convertissez doivent appartenir la mme famille de conversion. Pour plus dinformations sur les conversions, reportez-vous la section suivante Excution des conversions et Convert dans laide en ligne. Lunit StdConvs dfinit plusieurs familles de conversion et les units de mesure de chacune de ces familles. De plus, vous pouvez crer vos propres familles de conversion et leurs units associes en utilisant les fonctions RegisterConversionType et RegisterConversionFamily. Pour savoir comment tendre les conversions et les units de conversion, reportez-vous la section Ajout de nouveaux types de mesure et Convert dans laide en ligne.

Excution des conversions


Vous pouvez utiliser la fonction Convert pour excuter des conversions simples ou complexes. Elle emploie une syntaxe simple et une syntaxe moins simple rserve aux conversions entre types de mesure complexes.

Excution des conversions simples


Vous pouvez utiliser la fonction Convert pour convertir une mesure dune unit dans une autre. La fonction Convert effectue des conversions entre units mesurant le mme type dobjet (distance, surface, temps, temprature, etc.). Pour utiliser Convert, vous devez spcifier lunit partir de laquelle se fait la conversion et celle dans laquelle elle se fait. Vous utilisez le type TConvType pour identifier les units de mesure. Par exemple, ce qui suit convertit une temprature des degrs Fahrenheit en degrs Kelvin :
TempInKelvin := Convert(StrToFloat(Edit1.Text), tuFahrenheit, tuKelvin);

4-64

Guide du dveloppeur

Conversion de mesures

Excution des conversions complexes


Vous pouvez aussi utiliser la fonction Convert pour effectuer des conversions plus complexes entre des rapports de deux types de mesure. Cest le cas lorsque vous effectuez des conversions de miles par heure en mtres par minute pour exprimer une vitesse ou de gallons par minute en litres par heure pour exprimer un dbit. Par exemple, lappel suivant convertit des miles par gallon en kilomtres par litre :
nKPL := Convert(StrToFloat(Edit1.Text), duMiles, vuGallons, duKilometers, vuLiter);

Les units que vous convertissez doivent appartenir la mme famille de conversion (elles doivent mesurer la mme chose). Si les units ne sont pas compatibles, Convert dclenche une exception EConversionError. Vous pouvez vrifier si deux valeurs TConvType appartiennent la mme famille de conversion en appelant CompatibleConversionTypes. Lunit StdConvs dfinit plusieurs familles de valeurs TConvType. Voir Variables des familles de conversion dans laide en ligne pour avoir la liste des familles dunits de mesure prdfinies et les units de mesure de chaque famille.

Ajout de nouveaux types de mesure


Si vous voulez effectuer des conversions entre units de mesure non encore dfinies dans lunit StdConvs, il vous faut crer une nouvelle famille de conversion pour reprsenter ces units de mesure (valeurs TConvType). Quand deux valeurs TConvType sont recenses dans la mme famille de conversion, la fonction Convert peut effectuer la conversion entre ces mesures en utilisant les units que reprsentent ces valeurs TConvType. Vous devez dabord obtenir les valeurs de TConvFamily recensant une famille de conversion laide de la fonction RegisterConversionFamily. Une fois que vous avez obtenu une valeur de TConvFamily (en recensant une nouvelle famille de conversion ou en utilisant une des variables globales de lunit StdConvs), vous pouvez utiliser la fonction RegisterConversionType pour ajouter les nouvelles units la famille de conversion. Les exemples suivants montrent cela. Pour avoir davantage dexemples, reportez-vous au code source de lunit de conversions standard (stdconvs.pas). (Le source nest pas inclus dans toutes les versions de Delphi.)

Cration dune famille de conversion simple et ajout dunits


Vous pouvez, par exemple, crer une nouvelle famille de conversion et ajouter de nouveaux types de mesure lorsque vous effectuez des conversions entre de longues priodes de temps (mois ou sicles), qui risquent dtre inexactes. Pour mieux comprendre, la famille cbTime utilise le jour comme unit de base. Lunit de base est celle qui est utilise pour effectuer toutes les conversions lintrieur de cette famille. Donc, toutes les conversions doivent tre faites en jours. Une perte de prcision peut se produire lors de conversions utilisant

Sujets de programmation gnraux

4-65

Conversion de mesures

comme units le mois ou plus (anne, dcade, sicle, millnaire), car la conversion entre jours et mois, jours et annes, etc. nest pas exacte. Les mois ont diffrentes longueurs, les annes ont des facteurs de correction pour les annes bissextiles, les secondes supplmentaires, etc. Si vous utilisez uniquement des units de mesure gales ou suprieures au mois, vous pouvez crer une famille de conversion plus prcise en prenant lanne comme unit de base. Cet exemple cre une nouvelle famille de conversion nomme cbLongTime.

Dclaration des variables


Dabord, vous devez dclarer des variables pour les identificateurs. Les identificateurs sont utiliss dans la nouvelle famille de conversion LongTime et les units de mesure qui sont ses membres :
var cbLongTime: TConvFamily; ltMonths: TConvType; ltYears: TConvType; ltDecades: TConvType; ltCenturies: TConvType; ltMillennia: TConvType;

Recensement de la famille de conversion


Ensuite, recensez la famille de conversion :
cbLongTime := RegisterConversionFamily (Longues dures);

Bien que la procdure UnregisterConversionFamily soit fournie, il nest pas ncessaire de d-recenser les familles de conversion sauf si lunit qui les dfinit est supprime lexcution. Elles sont automatiquement nettoyes quand lapplication sarrte.

Recensement des units de mesure


Ensuite, vous devez recenser les units de mesure dans la famille de conversion que vous venez de crer. Utilisez la fonction RegisterConversionType, qui recense les units de mesure dans une famille spcifie. Vous devez dfinir lunit de base, ici lanne, et les autres units en utilisant un facteur indiquant leur rapport avec lunit de base. Le facteur de ltMonths est ainsi 1/12 puisque lunit de base de la famille LongTime est lanne. Vous fournissez galement la description des units dans lesquelles vous effectuez la conversion. Le code de recensement des units de mesure est indiqu ici :
ltMonths:=RegisterConversionType(cbLongTime,Months,1/12); ltYears:=RegisterConversionType(cbLongTime,Years,1); ltDecades:=RegisterConversionType(cbLongTime,Decades,10); ltCenturies:=RegisterConversionType(cbLongTime,Centuries,100); ltMillennia:=RegisterConversionType(cbLongTime,Millennia,1000);

4-66

Guide du dveloppeur

Conversion de mesures

Utilisation des nouvelles units


Vous pouvez maintenant utiliser les units que vous venez de recenser afin deffectuer des conversions. La fonction Convert globale peut effectuer la conversion entre tous les types recenss dans la famille de conversion cbLongTime. Ainsi, au lieu dutiliser lappel Convert suivant,
Convert(StrToFloat(Edit1.Text),tuMonths,tuMillennia);

vous pouvez utiliser celui-ci pour obtenir une meilleure prcision :


Convert(StrToFloat(Edit1.Text),ltMonths,ltMillennia);

Utilisation dune fonction de conversion


Dans les cas o la conversion est plus complexe, vous pouvez utiliser une syntaxe diffrente et spcifier une fonction qui effectue la conversion au lieu dutiliser un facteur de conversion. Par exemple, vous ne pouvez pas convertir des tempratures laide dun facteur de conversion, puisque les chelles de temprature ont des origines diffrentes. Cet exemple, pris dans lunit StdConvs, montre comment recenser un type de conversion en fournissant des fonctions de conversion depuis et vers les units de base.

Dclaration des variables


Dabord, vous devez dclarer des variables pour les identificateurs. Les identificateurs sont utiliss dans la famille de conversion cbTemperature et les units de mesure qui sont ses membres :
var cbTemperature: TConvFamily; tuCelsius: TConvType; tuKelvin: TConvType; tuFahrenheit: TConvType; Remarque

Les units de mesure prsentes ici forment un sous-ensemble des units de temprature rellement recenses dans lunit StdConvs.

Recensement de famille de conversion


Ensuite, recensez la famille de conversion :
cbTemperature := RegisterConversionFamily (Temperature);

Recensement de lunit de base


Ensuite, dfinissez et recensez lunit de base de la famille de conversion, qui est dans lexemple le degr Celsius. Remarquez que dans le cas de lunit de base, nous pouvons utiliser un simple facteur de conversion, car il ny a pas de conversion faire :
tuCelsius:=RegisterConversionType(cbTemperature,Celsius,1);

Sujets de programmation gnraux

4-67

Conversion de mesures

Ecriture des mthodes de conversion vers et depuis lunit de base


Vous devez crire le code qui effectue la conversion pour chaque chelle de temprature vers et depuis les degrs Celsius, car elle ne peut se baser sur un simple facteur. Ces fonctions sont prises dans lunit StdConvs :
function FahrenheitToCelsius(const AValue: Double): Double; begin Result := ((AValue - 32) * 5) / 9; end; function CelsiusToFahrenheit(const AValue: Double): Double; begin Result := ((AValue * 9) / 5) + 32; end; function KelvinToCelsius(const AValue: Double): Double; begin Result := AValue - 273.15; end; function CelsiusToKelvin(const AValue: Double): Double; begin Result := AValue + 273.15; end;

Recensement des autres units


Maintenant que vous avez les fonctions de conversion, vous pouvez recenser les autres units de mesure dans la famille de conversion. Vous incluez galement la description des units. Le code de recensement des autres units de la famille est indiqu ici :
tuKelvin := RegisterConversionType(cbTemperature, Kelvin, KelvinToCelsius, CelsiusToKelvin); tuFahrenheit := RegisterConversionType(cbTemperature, Fahrenheit, FahrenheitToCelsius, CelsiusToFahrenheit);

Utilisation des nouvelles units


Vous pouvez maintenant utiliser les units que vous venez de recenser pour effectuer des conversions dans vos applications. La fonction Convert globale peut effectuer la conversion entre tous les types recenss dans la famille de conversion cbTemperature. Par exemple, le code suivant permet de convertir en degrs Kelvin une valeur exprime en degrs Fahrenheit.
Convert(StrToFloat(Edit1.Text), tuFahrenheit, tuKelvin);

Utilisation dune classe pour grer les conversions


Vous pouvez toujours utiliser des fonctions de conversion pour recenser une unit de conversion. Mais, il existe des cas o il est ncessaire de crer un nombre inutilement grand de fonctions qui font toutes essentiellement la mme chose. Si vous devez crire un ensemble de fonctions de conversion qui diffrent uniquement par la valeur dun paramtre ou dune variable, vous pouvez crer

4-68

Guide du dveloppeur

Conversion de mesures

une classe pour grer ces conversions. Par exemple, il existe un ensemble de techniques standard pour les conversions entre les diffrentes monnaies europennes depuis lintroduction de leuro. Bien que les facteurs de conversion restent constants (contrairement au facteur de conversion entre les dollars et les euros), vous ne pouvez pas utiliser un simple facteur de conversion pour convertir correctement le monnaies europennes pour deux raisons : La conversion doit arrondir un nombre de dcimales spcifique la monnaie. Lapproche facteur de conversion utilise un facteur inverse celui spcifi par les conversions standard en euro. Mais, tout peut tre gr par les fonctions de conversion comme ceci :
function FromEuro(const AValue: Double, Factor, FRound): Double; begin Result := RoundTo(AValue * Factor, FRound); end; function ToEuro(const AValue: Double, Factor): Double; begin Result := AValue / Factor; end;

Le problme est que cette approche ncessite des paramtres supplmentaires pour la fonction de conversion, ce qui signifie que vous ne pouvez pas recenser simplement la mme fonction pour chaque monnaie europenne. Afin dviter dcrire deux nouvelles fonctions de conversion pour chacune des monnaies, vous pouvez utiliser le mme couple de fonctions en les faisant membres dune classe.

Cration de la classe de conversion


La classe doit tre un descendant de TConvTypeInfo. TConvTypeFactor dfinit deux mthodes, ToCommon et FromCommon, pour convertir vers et depuis lunit de base dune famille de conversion (dans ce cas, vers et depuis des euros). Comme les fonctions que vous utilisez directement pour le recensement dune unit de conversion, ces mthodes nont pas de paramtre supplmentaire, et vous devez fournir le nombre de dcimales de larrondi et le facteur de conversion en tant que membres de votre classe de conversion. Cest illustr dans lexemple EuroConv du rpertoire demos\ConvertIt (voir euroconv.pas) :
type TConvTypeEuroFactor = class(TConvTypeFactor) private FRound: TRoundToRange; public constructor Create(const AConvFamily: TConvFamily; const ADescription: string; const AFactor: Double; const ARound: TRoundToRange); function ToCommon(const AValue: Double): Double; override; function FromCommon(const AValue: Double): Double; override; end; end;

Sujets de programmation gnraux

4-69

Conversion de mesures

Le constructeur attribue des valeurs ces membres privs :


constructor TConvTypeEuroFactor.Create(const AConvFamily: TConvFamily; const ADescription: string; const AFactor: Double; const ARound: TRoundToRange); begin inherited Create(AConvFamily, ADescription, AFactor); FRound := ARound; end;

Les deux fonctions de conversion utilisent tout simplement ces membres privs :
function TConvTypeEuroFactor.FromCommon(const AValue: Double): Double; begin Result := SimpleRoundTo(AValue * Factor, FRound); end; function TConvTypeEuroFactor.ToCommon(const AValue: Double): Double; begin Result := AValue / Factor; end;

Dclaration des variables


Maintenant que vous avez une classe de conversion, commencez comme avec toute autre famille de conversion, en dclarant les identificateurs :
var euEUR: euBEF: euDEM: euGRD: euESP: euFFR: euIEP: euITL: euLUF: euNLG: euATS: euPTE: euFIM: euUSD: euGBP: euJPY: TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; TConvType; { { { { { { { { { { { { { { { { Euros } Francs belges } Marks allemands} Drachmes } Pesetas } Francs franais } Livres irlandaises } Lires } Francs luxembourgeois } Florins } Schillings autrichiens } Escudos } Marks finlandais } Dollars US } Livres irlandaises } Yens }

Recensez la famille de conversion et les autres units


Vous tes maintenant prt recenser la famille de conversion et les units montaires europennes, en utilisant votre nouvelle classe de conversion :
cbEuro := RegisterConversionFamily (Monnaie europenne); ... // Types de conversion des diverses monnaies euEUR := RegisterEuroConversionType(cbEuro, SEURDescription, euBEF := RegisterEuroConversionType(cbEuro, SBEFDescription, euDEM := RegisterEuroConversionType(cbEuro, SDEMDescription, euGRD := RegisterEuroConversionType(cbEuro, SGRDDescription,

EURToEUR, BEFToEUR, DEMToEUR, GRDToEUR,

EURSubUnit); BEFSubUnit); DEMSubUnit); GRDSubUnit);

4-70

Guide du dveloppeur

Dfinition des types de donnes

euESP euFFR euIEP euITL euLUF euNLG euATS euPTE euFIM euUSD

RegisterEuroConversionType(cbEuro, SESPDescription, ESPToEUR, ESPSubUnit); RegisterEuroConversionType(cbEuro, SFFRDescription, FFRToEUR, FFRSubUnit); RegisterEuroConversionType(cbEuro, SIEPDescription, IEPToEUR, IEPSubUnit); RegisterEuroConversionType(cbEuro, SITLDescription, ITLToEUR, ITLSubUnit); RegisterEuroConversionType(cbEuro, SLUFDescription, LUFToEUR, LUFSubUnit); RegisterEuroConversionType(cbEuro, SNLGDescription, NLGToEUR, NLGSubUnit); RegisterEuroConversionType(cbEuro, SATSDescription, ATSToEUR, ATSSubUnit); RegisterEuroConversionType(cbEuro, SPTEDescription, PTEToEUR, PTESubUnit); RegisterEuroConversionType(cbEuro, SFIMDescription, FIMToEUR, FIMSubUnit); RegisterEuroConversionType(cbEuro, SUSDDescription, ConvertUSDToEUR, ConvertEURToUSD); euGBP := RegisterEuroConversionType(cbEuro, SGBPDescription, ConvertGBPToEUR, ConvertEURToGBP); euJPY := RegisterEuroConversionType(cbEuro, SJPYDescription, ConvertJPYToEUR, ConvertEURToJPY);

:= := := := := := := := := :=

Remarquez que RegisterEuroConversionType est une fonction enveloppe qui simplifie le recensement des types montaires. Voir lexemple de code pour plus de dtails.

Utilisation des nouvelles units


Vous pouvez maintenant utiliser les units que vous venez de recenser pour effectuer des conversions dans vos applications. La fonction Convert globale peut convertir toutes les monnaies europennes que vous avez recenses dans la famille cbEuro. Par exemple, le code suivant convertit en marks allemands une valeur exprime en lires :
Edit2.Text = FloatToStr(Convert(StrToFloat(Edit1.Text), euITL, euDEM));

Dfinition des types de donnes


Pascal Objet dispose de nombreux types de donnes prdfinis. Vous pouvez utiliser ces types prdfinis pour crer de nouveaux types qui correspondent aux besoins spcifiques de votre application. Pour une prsentation de ces types, voir le Guide du langage Pascal Objet.

Sujets de programmation gnraux

4-71

4-72

Guide du dveloppeur

Chapitre

Cration dapplications, de composants et de bibliothques


Chapitre 5

Ce chapitre donne un aperu de la manire dutiliser Delphi pour crer des applications, des bibliothques et des composants.

Cration dapplications
Lutilisation principale de Delphi est la conception et la gnration des types dapplications suivants : Les applications dinterface utilisateur graphique Les applications console Les applications service (pour les applications Windows seulement) Paquets et DLL

Les applications dinterface utilisateur graphique (GUI) ont en gnral une interface qui facilite leur utilisation. Les applications console sexcutent dans une fentre console. Les applications service sexcutent en tant que services Windows. Ces applications sont compiles en tant quexcutables, avec du code de dmarrage. Vous pouvez crer dautres types de projets, comme les paquets et les DLL, bibliothques de liaison dynamique. Ces applications produisent du code excutable sans code de dmarrage. Reportez-vous Cration de paquets et de DLL la page 10.

Applications dinterface utilisateur graphique


Une application dinterface utilisateur graphique, GUI, est une application conue en utilisant des fonctionnalits graphiques, fentres, menus, botes de dialogue, et

Cration dapplications, de composants et de bibliothques

5-1

Cration dapplications

des fonctionnalits qui rendent cette application facile utiliser. Quand vous compilez une application GUI, un fichier excutable contenant du code de dmarrage est cr. Gnralement, lexcutable fournit les fonctions de base de votre programme et les programmes simples sont souvent composs uniquement dun fichier excutable. Vous pouvez aussi tendre une application en appelant des DLL, des paquets ou dautres bibliothques compltant un excutable. Delphi offre deux modles dinterface utilisateur dapplication : Linterface de document unique (abrg en anglais par SDI) Linterface de document multiple (abrg en anglais par MDI) Outre le modle dimplmentation de votre application, le comportement de votre projet la conception, comme celui de lapplication lexcution, peut tre manipul par des options de projet de lEDI.

Modles dinterfaces utilisateur


Toute fiche peut tre implmente comme une fiche dinterface de document multiple (MDI) ou comme une fiche dinterface de document unique (SDI). Dans une application MDI, plusieurs documents ou fentres enfant peuvent tre ouverts dans une seule fentre parent. Cela est courant dans les applications comme les tableurs ou les traitements de texte. Par contre, une application SDI ne contient normalement quune seule vue de document. Pour faire de votre fiche une application SDI, affectez la valeur fsNormal la proprit FormStyle de votre objet Form. Pour davantage dinformations sur le dveloppement de linterface utilisateur dune application, voir chapitre 6, Conception de linterface utilisateur des applications.

Applications SDI
Pour crer une nouvelle application SDI :

1 Slectionnez Fichier|Nouveau|Autre pour afficher la bote de dialogue Nouveaux lments. 2 Cliquez sur longlet Projets et slectionnez Application SDI. 3 Choisissez OK.
Par dfaut, la proprit FormStyle de lobjet Form a la valeur fsNormal, Delphi suppose que toute nouvelle application est une application SDI.

Applications MDI
Pour crer une nouvelle application MDI :

1 Slectionnez Fichier|Nouveau|Autre pour afficher la bote de dialogue Nouveaux lments. 2 Cliquez sur longlet Projets et slectionnez Application MDI. 3 Choisissez OK.

5-2

Guide du dveloppeur

Cration dapplications

Les applications MDI ncessitent plus de rflexion et sont plus complexes concevoir que les applications SDI. Les applications MDI contiennent des fentres enfant qui se trouvent dans la fentre client ; la fiche principale contient des fiches enfant. Affectez la proprit FormStyle de lobjet TForm pour spcifier si la fiche est un enfant (fsMDIForm) ou si cest la fiche principale (fsMDIChild). Pour viter davoir redfinir plusieurs reprises les proprits des fentres enfant, vous avez intrt dfinir une classe de base pour les fiches enfant et driver chaque fiche enfant de cette classe.

Dfinition des options de lEDI, du projet et de la compilation


Choisissez Projet|Options pour spcifier les diverses options de votre projet. Pour plus dinformations, voir laide en ligne.

Dfinition des options de projet par dfaut


Pour modifier les options de projet par dfaut qui sappliquent tout nouveau projet, dfinissez les options de la bote de dialogue Options de projet, puis cochez la case Dfaut en bas droite de la fentre. Tous les nouveaux projets utiliseront ensuite les options en cours comme options par dfaut.

Modles de programmation
Les modles de programmation sont des structures communment appeles squelettes que vous pouvez ajouter au code source puis remplir. Certains modles de code standard, comme les dclarations de tableaux, de classes ou de fonction, ainsi que de nombreuses instructions, sont livrs avec Delphi. Vous pouvez aussi crire vos propres modles de code pour les structures que vous utilisez souvent. Par exemple, si vous voulez utiliser une boucle for dans votre code, insrez le modle suivant :
for := to do begin end;

Pour insrer un modle de code dans lditeur de code, appuyez sur Ctrl-j et slectionnez le modle que vous voulez utiliser. Vous pouvez ajouter vos propres modles cette collection. Pour ajouter un modle :

1 Slectionnez Outils|Options de lditeur. 2 Choisissez longlet Audit de code. 3 Dans la section Modles, choisissez Ajouter. 4 Saisissez le nom du modle aprs Raccourci et entrez une description brve du nouveau modle. 5 Ajoutez le modle de code dans la bote de saisie Code. 6 Choisissez OK.

Cration dapplications, de composants et de bibliothques

5-3

Cration dapplications

Applications console
Les applications console sont des programmes 32 bits excuts sans interface graphique, gnralement dans une fentre console. Habituellement, ces applications ne ncessitent pas une saisie utilisateur importante et accomplissent un jeu limit de fonctions. Pour crer une nouvelle application console :

1 Choisissez Fichier|Nouveau|Autre puis slectionnez Application console dans la bote de dialogue Nouveaux lments.
Delphi cre alors un fichier projet pour le type de fichier source spcifi et affiche lditeur de code.
Remarque

A la cration dune nouvelle application console, lEDI ne cre pas une nouvelle fiche. Seul lditeur de code est affich.

Applications service
Les applications service reoivent les requtes des applications client, traitent ces requtes et renvoient les informations aux applications client. Habituellement, elles sexcutent en arrire-plan, sans ncessiter de saisie utilisateur importante. Un serveur Web, FTP ou de messagerie lectronique est un exemple dapplication service. Pour crer une application qui implmente un service Win32, choisissez Fichier| Nouveau puis slectionnez Application service dans la bote de dialogue Nouveaux lments. Cela ajoute votre projet une variable globale appele Application de type TServiceApplication. Une fois une application service cre, une fentre apparat dans le concepteur qui correspond un service (TService). Implmentez le service en initialisant ses proprits et ses gestionnaires dvnements dans linspecteur dobjets. Vous pouvez ajouter des services supplmentaires en choisissant Service dans la bote de dialogue Nouveaux lments. Najoutez pas de services une application qui nest pas une application service. En effet, mme si un objet TService est ajout, lapplication ne gnre pas les vnements ncessaires, ni ne fait les appels Windows appropris au service. Une fois que votre application service est construite, vous pouvez installer ses services avec le SCM (Service Control Manager). Les autres applications peuvent alors lancer vos services en envoyant des requtes au SCM. Pour installer les services de votre application, excutez-la laide de loption / INSTALL. Lapplication installe ses services puis quitte, en affichant un message de confirmation si les services sont correctement installs. Vous pouvez supprimer laffichage du message de confirmation en excutant lapplication service laide de loption /SILENT. Pour dsinstaller les services de votre application, excutez-la depuis la ligne de commande laide de loption /UNINSTALL. (Vous pouvez aussi utiliser

5-4

Guide du dveloppeur

Cration dapplications

loption /SILENT pour supprimer le message de confirmation lors de la dsinstallation).


Exemple

Le service suivant contient un TServerSocket dont le port est initialis 80. Cest le port par dfaut des navigateurs Web pour envoyer des requtes des serveurs Web et celui utilis par les serveurs Web pour rpondre aux navigateurs Web. Cet exemple spcifique produit, dans le rpertoire C:\Temp, un document texte appel WebLogxxx.log (o xxx correspond au ThreadID). Il ne doit y avoir quun seul serveur surveillant un port donn, donc si vous utilisez dj un serveur Web, vous devez vous assurer quil nest pas lcoute (le service doit tre arrt). Pour voir les rsultats : ouvrez un navigateur Web sur la machine locale, et pour ladresse, entrez localhost (sans les guillemets). Eventuellement, le navigateur va faire une erreur de dpassement de dlai mais vous devez obtenir un fichier appel weblogxxx.log dans le rpertoire C:\temp.

1 Pour crer lexemple, choisissez Fichier|Nouveau et slectionnez Application Service dans la bote de dialogue Nouveaux lments. Une fentre nomme Service1 apparat. Ajoutez un composant ServerSocket de la page Internet de la palette de composants la fentre service (Service1). 2 Ajoutez ensuite une donne membre prive de type TMemoryStream la classe TService1. La section interface de lunit doit ressembler :
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ScktComp; type TService1 = class(TService) ServerSocket1: TServerSocket; procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure Service1Execute(Sender: TService); private { Dclarations prives } Stream: TMemoryStream; // Ajoutez cette ligne public function GetServiceController: PServiceController; override; { Dclarations publiques } end; var Service1: TService1;

3 Slectionnez ensuite ServerSocket1, le composant ajout ltape 1. Dans linspecteur dobjets, double-cliquez sur lvnement OnClientRead et ajoutez le gestionnaire dvnement suivant :
procedure TService1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var Buffer: PChar;

Cration dapplications, de composants et de bibliothques

5-5

Cration dapplications

begin Buffer := nil; while Socket.ReceiveLength > 0 do begin Buffer := AllocMem(Socket.ReceiveLength); try Socket.ReceiveBuf(Buffer^, Socket.ReceiveLength); Stream.Write(Buffer^, StrLen(Buffer)); finally FreeMem(Buffer); end; Stream.Seek(0, soFromBeginning); Stream.SaveToFile(c:\Temp\Weblog + IntToStr(ServiceThread.ThreadID) + .log); end; end;

4 Slectionnez enfin Service1 en cliquant sur la zone client de la fentre (mais pas sur le composant ServiceSocket). Dans linspecteur dobjets, double-cliquez sur lvnement OnExecute et ajoutez le gestionnaire dvnement suivant :
procedure TService1.Service1Execute(Sender: TService); begin Stream := TMemoryStream.Create; try ServerSocket1.Port := 80; // port WWW ServerSocket1.Active := True; while not Terminated do begin ServiceThread.ProcessRequests(True); end; ServerSocket1.Active := False; finally Stream.Free; end; end;

Quand vous crivez votre application service, vous devez tenir compte des lments suivants : Threads de service Proprits de nom dun service Dbogage des services

Threads de service
Chaque service dispose de son propre thread (TServiceThread), donc si votre application service implmente plusieurs services, vous devez vous assurer que limplmentation de vos services est compatible avec lutilisation de threads. La classe TServiceThread est ainsi conue de faon implmenter le service dans le gestionnaire dvnement OnExecutede TService. Le thread du service dispose de sa propre mthode Execute qui contient une boucle appelant les gestionnaires OnStart et OnExecute du service avant de traiter de nouvelles requtes.

5-6

Guide du dveloppeur

Cration dapplications

Comme le traitement des requtes de service peut prendre longtemps et que lapplication service peut recevoir simultanment plusieurs requtes dun ou de plusieurs clients, il est plus efficace de lancer un nouveau thread (driv de TThread et non de TServiceThread) pour chaque requte et de dplacer limplmentation du service dans la mthode Execute du nouveau thread. Cela permet la boucle Execute du thread du service de traiter continuellement de nouvelles requtes sans avoir attendre la fin du gestionnaire OnExecute du service. Cette manire de procder est illustre par lexemple suivant :
Exemple

Ce service sonne tous les 500 millisecondes depuis le thread standard. Il gre la pause, la reprise et larrt du thread quand on indique au service de se suspendre, de reprendre ou de sarrter.

1 Choisissez Fichier|Nouveau|Autre et slectionnez Application Service dans la bote de dialogue Nouveaux lments. Une fentre nomme Service1 apparat. 2 Dans la section interface de votre unit, dclarez un nouveau descendant de TThread nomm TSparkyThread. Cest le thread qui ralise le travail pour le service. Il doit tre dclar comme suit :
TSparkyThread = class(TThread) public procedure Execute; override; end;

3 Ensuite, dans la section implmentation de lunit, crez une variable globale pour une instance de TSparkyThread :
var SparkyThread: TSparkyThread;

4 Ajoutez le code suivant la section implmentation pour la mthode Execute de TSparkyThread (la fonction thread) :
procedure TSparkyThread.Execute; begin while not Terminated do begin Beep; Sleep(500); end; end;

5 Slectionnez la fentre service (Service1) et double-cliquez sur lvnement OnStart dans linspecteur dobjets. Ajoutez le gestionnaire dvnement OnStart suivant :
procedure TService1.Service1Start(Sender: TService; var Started: Boolean); begin SparkyThread := TSparkyThread.Create(False); Started := True; end;

6 Double-cliquez sur lvnement OnContinue dans linspecteur dobjets. Ajoutez le gestionnaire dvnement OnContinue suivant :
procedure TService1.Service1Continue(Sender: TService; var Continued: Boolean);

Cration dapplications, de composants et de bibliothques

5-7

Cration dapplications

begin SparkyThread.Resume; Continued := True; end;

7 Double-cliquez sur lvnement OnPause dans linspecteur dobjets. Ajoutez le gestionnaire dvnement OnPause suivant :
procedure TService1.Service1Pause(Sender: TService; var Paused: Boolean); begin SparkyThread.Suspend; Paused := True; end;

8 Enfin, double-cliquez sur lvnement OnStop dans linspecteur dobjets. Ajoutez le gestionnaire dvnement OnStop suivant :
procedure TService1.Service1Stop(Sender: TService; var Stopped: Boolean); begin SparkyThread.Terminate; Stopped := True; end;

Dans le cadre du dveloppement dapplications serveur, la dcision de lancer un nouveau thread dpend de la nature du service rendu, du nombre prvu de connexions et du nombre prvu de processeurs dont dispose la machine excutant le service.

Proprits de nom dun service


La VCL propose des classes permettant de crer des applications service sur le plate-forme Windows (non disponible pour les applications multiplates-formes). Il sagit de TService et de TDependency. Quand vous utilisez ces classes, les diverses proprits de nom peuvent tre source de confusion. Cette section dcrit leurs diffrences. Les services ont des noms dutilisateur (appels Nom de dmarrage du service) qui sont associs des mots de passe, des noms daffichage utiliss pour laffichage dans les fentres gestionnaire et diteur et des noms rels (le nom du service). Les dpendances peuvent tre des services ou des groupes dordre de chargement. Elles ont galement des noms et des noms daffichage. De plus, comme les objets service drivent de TComponent, ils hritent de la proprit Name. Les paragraphes suivants dcrivent ces diverses proprits de nom.

Proprits de TDependency
La proprit DisplayName de TDependency est la fois le nom daffichage et le nom rel du service. Elle est presque toujours identique la proprit Name TDependency.

Proprits de nom de TService


La proprit Name de TService est hrite de TComponent. Cest le nom du composant et galement le nom du service. Pour les dpendances qui sont des

5-8

Guide du dveloppeur

Cration dapplications

services, cette proprit est identique aux proprits Name et DisplayName de TDependency. TService::DisplayName est le nom affich dans la fentre du gestionnaire de service. Il diffre souvent du nom rel du service (TService.NameTDependency.DisplayName, TDependency.Name). Remarquez que gnralement le nom daffichage (DisplayName) nest pas le mme pour le service et pour la dpendance. Les noms de dmarrage de service sont distincts du nom daffichage et du nom rel du service. Un ServiceStartName est la valeur saisie du nom dutilisateur dans la bote de dialogue de dmarrage slectionne depuis le gestionnaire de contrle de service.

Dbogage des services


Le dbogage des applications service peut tre difficile car il ncessite des intervalles de temps courts :

1 Lancez dabord lapplication dans le dbogueur. Patientez quelques secondes jusqu la fin du chargement. 2 Dmarrez rapidement le service partir du panneau de configuration ou de la ligne de commande :
start MyServ

Vous devez lancer le service rapidement (dans les 15 30 secondes du dmarrage de lapplication) car lapplication se terminera si aucun service nest lanc. Une autre approche consiste sattacher au processus de lapplication service lorsquelle est dj en excution. (Cest--dire, dmarrer dabord le service, puis effectuer lattachement au dbogueur). Pour effectuer lattachement au processus dapplication service, choisissez Excuter|Attacher au processus et slectionnez lapplication service dans la bote de dialogue rsultante. Dans certains cas, cette seconde approche peut chouer en raison de droits insuffisants. Si cela se produit, vous pouvez utiliser le gestionnaire de contrle de service pour permettre votre service de fonctionner avec le dbogueur :

1 Crez une cl (options dexcution du fichier image) dans lemplacement de registre suivant :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

2 Crez une sous-cl portant le mme nom que votre service (par exemple, MONSERV.EXE). Ajoutez cette sous-cl une valeur de type REG_SZ, nomme Debugger. Utilisez le chemin complet de Delphi32.exe comme valeur de chane. 3 Dans lapplet Services du panneau de configuration, slectionnez votre service, cliquez sur loption de dmarrage et activez loption permettant au service dinteragir avec le bureau.

Cration dapplications, de composants et de bibliothques

5-9

Cration de paquets et de DLL

Cration de paquets et de DLL


Les bibliothques de liaison dynamique (DLL) sont des modules de code compils qui fonctionnent en conjonction avec un excutable pour proposer des fonctionnalits une application. Vous pouvez crer des DLL dans des programmes multiplates-formes. Cependant, sous Linux, les DLL et les paquets sont recompils en tant quobjets partags. Les paquets sont des DLL spciales utilises par les applications Delphi, par lEDI ou les deux la fois. Il y a deux sortes de paquets : les paquets dexcution et les paquets de conception. Les paquets dexcution fournissent des fonctionnalits un programme lors de son excution. Les paquets de conception permettent dtendre les fonctionnalits de lEDI. Les directives de compilation suivantes peuvent tre places dans les fichiers des projets bibliothque :
Tableau 5.1 Directives de compilation pour les biblioth ques Description
Ajoute le prfixe spcifi au nom du fichier de destination. Par exemple, vous pouvez spcifier {$LIBPREFIX dcl} pour un paquet de conception, ou utiliser {$LIBPREFIX } pour liminer totalement le prfixe. Ajoute le suffixe spcifi au nom du fichier de destination, avant lextension. Par exemple, utilisez {$LIBSUFFIX -2.1.3} dans quelquechose.pas pour gnrer quelquechose-2.1.3.bpl. Ajoute une seconde extension au nom du fichier de destination aprs lextension .bpl. Par exemple, utilisez {$LIBVERSION 2.1.3} dans quelquechose.pas pour gnrer quelquechose.bpl.2.1.3.

Directive de compilation
{$LIBPREFIX chane}

{$LIBSUFFIX chane}

{$LIBVERSION chane}

Pour davantage dinformations sur les paquets, voir chapitre 11, Utilisation des paquets et des composants.

Utilisation des paquets et des DLL


Pour la plupart des applications crites avec Delphi, les paquets offrent une plus grande flexibilit et sont plus simples crer que les DLL. Dans certaines situations, les DLL sont mieux adaptes vos projets que des paquets : Votre module de code doit tre appel par une application qui na pas t conue avec Delphi. Vous tendez les fonctionnalits dun serveur Web. Vous crez un module de code qui doit tre utilis par des dveloppeurs extrieurs. Votre projet est un conteneur OLE.

5-10

Guide du dveloppeur

Ecriture dapplications de bases de donnes

Vous ne pouvez pas transmettre des informations de type lexcution (RTTI) entre DLL ou dune DLL un excutable. Cest parce que les DLL maintiennent leurs propres informations sur les symboles. Si vous avez besoin de transmettre un objet TStrings partir dune DLL en utilisant un op rateur is ou as, crez un paquet plutt quune DLL. Les paquets partagent les informations sur les symboles.

Ecriture dapplications de bases de donnes


Remarque

Les versions de Delphi noffrent pas toutes le support des bases de donnes. Un des atouts de Delphi est sa possibilit de crer des applications de bases de donnes sophistiques. Delphi fournit des outils intgrs permettant de vous connecter aux serveurs et bases de donnes SQL, comme Oracle, Sybase, InterBase, MySQL, MS-SQL, Informix et DB2, tout en assurant un partage des donnes transparent entre les diffrentes applications. Delphi comprend de nombreux composants permettant daccder aux bases de donnes et de reprsenter les informations quelles contiennent. Sur la palette de composants, les composants base de donnes sont regroups selon le mcanisme et la fonction daccs aux donnes.
Tableau 5.2 Page de palette
BDE

Page base de donnes de la palette de composants Contenu


Composants qui utilisent le moteur de bases de donnes Borland (BDE), une importante API permettant dinteragir avec les bases de donnes. Le moteur BDE supporte la plus vaste gamme de fonctions et la plupart des utilitaires dont Database Desktop, lexplorateur de base de donnes, le moniteur SQL et ladministrateur BDE. Pour plus de dtails, voir chapitre 20, Utilisation du moteur de bases de donnes Borland. Composants qui utilisent les objets de donnes ActiveX (ADO), dvelopps par Microsoft, pour accder aux informations des bases de donnes. De nombreux pilotes ADO sont disponibles pour la connexion diffrents serveurs de bases de donnes. Les composants ADO vous permettent dintgrer votre application lenvironnement ADO. Pour plus de dtails, voir chapitre 21, Utilisation des composants ADO. Composants multiplates-formes qui utilisent dbExpress pour accder aux informations des bases de donnes. Les pilotes dbExpress fournissent un accs rapide aux bases de donnes, mais doivent tre utiliss avec TClientDataSet et TDataSetProvider pour effectuer des mises jour. Pour plus de dtails, voir chapitre 22, Utilisation densembles de donnes unidirectionnels . Composants qui accdent directement aux bases de donnes InterBase, sans passer par une couche moteur distincte.Pour plus dinformations sur lutilisation des composants InterBase, voir laide en ligne.

ADO

dbExpress

InterBase

Cration dapplications, de composants et de bibliothques

5-11

Cration dapplications serveur Web

Tableau 5.2 Page de palette


AccsBD

Page base de donnes de la palette de composants (suite) Contenu


Composants qui peuvent tre utiliss avec nimporte quel mcanisme daccs aux donnes comme TClientDataSet et TDataSetProvider. Voir chapitre 23, Utilisation densembles de donnes client, pour avoir des informations sur les ensembles de donnes client. Voir chapitre 24, Utilisation des composants fournisseurpour avoir des informations sur les fournisseurs. Contrles orients donnes qui peuvent accder aux informations dune source de donnes. Voir chapitre 15, Utilisation de contrles de donnes, pour plus de dtails.

ContrleBD

Lorsque vous concevez une application de base de donnes, vous devez choisir le mcanisme daccs aux donnes utiliser. Chaque mcanisme daccs aux donnes diffre par lventail des fonctions prises en charge, la facilit de dploiement et la capacit des pilotes grer divers serveurs de bases de donnes. Voir partie II, Dveloppement dapplications de bases de donnes, dans ce manuel, pour plus de dtails sur la faon dutiliser Delphi pour crer des applications base de donnes client ou serveur. Reportez-vous Dploiement dapplications de bases de donnes la page 13-7, pour avoir des informations sur le dploiement.

Distribution dapplications de bases de donnes


Delphi permet de crer des applications de bases de donnes distribues en utilisant un ensemble de composants lis. Il est ainsi possible dcrire des applications de bases de donnes en utilisant divers protocoles de communication, dont DCOM, CORBA, TCP/IP et SOAP. Pour davantage dinformations sur la conception dapplications de bases de donnes distribues, voir chapitre 25, Cration dapplications multiniveaux. Le dploiement dapplications de bases de donnes ncessite souvent le dploiement du moteur de bases de donnes Borland (BDE) en plus des fichiers de lapplication. Pour des informations sur le dploiement du BDE, voir D ploiement dapplications de bases de donnes la page 13-7.

Cration dapplications serveur Web


Les applications serveur Web sont des applications sexcutant sur des serveurs qui fournissent du contenu web, cest--dire des pages HTML ou des documents XML, sur Internet. Les applications serveur Web sont par exemple des applications qui contrlent laccs un site web, gnrent des bons de commande ou rpondent des demandes dinformations.

5-12

Guide du dveloppeur

Cration dapplications serveur Web

Vous pouvez crer diffrents types dapplications serveur Web en utilisant les technologies Delphi suivantes : Agent Web WebSnap InternetExpress Services Web

Utilisation de lagent Web


Vous pouvez utiliser lagent Web (appel aussi architecture NetCLX) pour crer des applications serveur Web comme les applications CGI ou les bibliothques de liaison dynamiques (DLL). Ces applications serveur web peuvent ne contenir aucun composant visuel. Les composants de la page Internet de la palette de composants vous permettent de crer des gestionnaires dvnements, de construire par programme des documents HTML ou XML et de les transfrer au client. Pour crer une nouvelle application serveur Web en utilisant larchitecture agent Web, slectionnez Fichier|Nouveau|Autre et slectionnez Application serveur Web dans la bote de dialogue Nouveaux lments. Choisissez ensuite le type dapplication serveur Web :
Tableau 5.3 Applications serveur Web Description
Les applications serveur Web ISAPI et NSAPI sont des DLL qui sont charges par le serveur Web. Les informations de requte client sont transmises la DLL sous forme de structure et sont values par TISAPIApplication. Chaque message de requte est gr dans un thread dexcution distinct. Slectionner ce type dapplication ajoute len-tte bibliothque des fichiers du projet et les entres ncessaires la liste uses et la clause exports du fichier projet. Les applications serveur Web CGI sont des applications console qui reoivent les requtes des clients sur lentre standard, traitent ces requtes et renvoient le rsultat sur la sortie standard afin quil soit renvoy au client. Slectionner ce type dapplication ajoute les entres ncessaires la clause uses du fichier projet et ajoute au source la directive $APPTYPE approprie. Les applications serveur Web Win-CGI sont des applications Windows qui reoivent les requtes des clients partir dun fichier de paramtres de configuration (INI) crit par le serveur et qui crivent le rsultat dans un fichier que le serveur renvoie au client. Le fichier INI est valu par TCGIApplication. Chaque message de requte est gr par une instance distincte de lapplication. Slectionner ce type dapplication ajoute les entres ncessaires la clause uses du fichier projet et ajoute au source la directive $APPTYPE approprie.

Type dapplication serveur Web


DLL ISAPI/NSAPI

Excutable autonome CGI

Excutable autonome Win-CGI

Cration dapplications, de composants et de bibliothques

5-13

Cration dapplications serveur Web

Tableau 5.3

Applications serveur Web (suite) Description


La slection de ce type dapplication configure votre projet comme une DLL. Les applications serveur Web Apache sont des DLL charges par le serveur Web. Les informations sont transmises la DLL, traites puis renvoyes au client par le serveur Web. La slection de ce type dapplication configure un environnement pour dvelopper et tester des applications serveur Web. Les applications Dbogueur dapplication Web sont des fichiers excutables charges par le serveur Web. Ce type dapplication nest pas destin au dploiement.

Type dapplication serveur Web


Module Apache partag (DLL)

Excutable dbogueur dapplication Web

Les applications CGI et Win-CGI utilisent davantage de ressources systme sur le serveur, les applications complexes sont mieux gres si elles sont cres sous la forme dapplications ISAPI, NSAPI ou Apache DLL. Si vous crivez des applications multiplates-formes, vous devez slectionner autonome CGI ou Module Apache partag (DLL) pour le dveloppement de serveur Web. Vous avez les mmes options lorsque vous crez des applications WebSnap et service Web. Pour plus dinformations sur la construction dapplications serveur Web, voir chapitre 27, Cration dapplications Internet.

Cration dapplications WebSnap


WebSnap fournit un ensemble de composants et dexperts permettant de construire des serveurs Web volus qui interagissent avec les navigateurs web. Les composants WebSnap gnrent du HTML ou dautre contenu mime pour les pages Web. WebSnap est destin au dveloppement ct serveur. WebSnap ne peut pas, pour linstant, tre utilis dans des applications multiplates-formes. Pour crer une nouvelle application WebSnap, slectionnez Fichier|Nouveau| Autre et slectionnez longlet WebSnap dans la bote de dialogue Nouveaux lments. Choisissez Application WebSnap. Ensuite, slectionnez le type dapplication serveur Web (ISAPI/NSAPI, CGI, Win-CGI, Apache). Voir le tableau 5.3, Applications serveur Web, pour plus de dtails. Pour plus dinformations sur WebSnap, voir chapitre 29, Utilisation de WebSnap.

Utilisation dInternetExpress
InternetExpress est un ensemble de composants permettant dtendre larchitecture dapplication serveur Web de base pour qu elle agisse en tant que client dune application serveur. Vous utilisez InternetExpress pour les applications dans lesquelles les clients dans un navigateur peuvent accder aux donnes dun fournisseur, rsoudre les mises jour du fournisseur tout en sexcutant sur un client.

5-14

Guide du dveloppeur

Ecriture dapplications en utilisant COM

Les applications InternetExpress gnrent des pages HTML qui associent HTML, XML et javascript. HTML rgit la disposition et laspect des pages affiches dans le navigateur des utilisateurs finals. XML code les paquets de donnes et les paquets delta qui reprsentent les informations base de donnes. Javascript permet aux contrles HTML dinterprter et de manipuler les donnes des paquets XML sur la machine client. Pour plus dinformations sur InternetExpress, voir Construction des applications Web avec InternetExpress la page 25-38.

Cration dapplications services Web


Les services Web sont des applications modulaires indpendantes qui peuvent tre publies ou invoques sur un rseau (comme le web). Les services Web fournissent des interfaces bien dfinies qui dcrivent les services fournis. Vous utilisez les services Web pour fournir ou utiliser des services programmables sur Internet en faisant appel aux derniers standards comme XML, XML Schema, SOAP (Simple Object Access Protocol) et WSDL (Web Service Definition Language). Les services Web utilisent SOAP, un protocole lger standard permettant dchanger des informations dans une environnement distribu. Il utilise HTTP comme protocole de communication et XML pour coder les appels des procdures distantes. Vous pouvez utiliser Delphi pour construire des serveurs qui implmentent des services Web et des clients qui font appel ces services. Vous pouvez crire des clients pour que des serveurs quelconques implmentent des services Web qui rpondent aux messages SOAP et des serveurs Delphi pour publier des services Web utiliser par des clients quelconques. Pour plus dinformations sur services Web, voir chapitre 31, Utilisation de services Web.

Ecriture dapplications en utilisant COM


COM (Component Object Model) propose une architecture dobjet distribu sous Windows conue pour assurer une interoprabilit des objets en utilisant des routines prdfinies appeles des interfaces. Les applications COM utilisent des objets implments par un processus diffrent ou, si vous utilisez DCOM, sur une machine diffrente. Vous pouvez aussi utiliser COM+, ActiveX et les pages Active Server. COM est un modle de composant logiciel indpendant du langage qui permet linteraction entre des composants logiciels et des applications sexcutant sous Windows. Laspect fondamental de COM est de permettre la communication entre composants, entre applications et entre clients et serveurs, par le biais dinterfaces clairement dfinies. Les interfaces offrent aux clients un moyen de demander un composant COM quelles fonctionnalits il supporte lexcution.

Cration dapplications, de composants et de bibliothques

5-15

Utilisation de modules de donnes

Pour fournir dautres fonctionnalits votre composant, il suffit dajouter une autre interface pour ces fonctionnalits.

Utilisation de COM et de DCOM


Delphi contient des classes et des experts qui simplifient la cration dapplications COM, OLE ou ActiveX. Vous pouvez crer des clients ou des serveurs COM qui implmentent des objets COM, des serveurs dautomatisation (dont les objets Active Server), des contrles ActiveX ou des ActiveForms. COM sert galement de base dautres technologies comme lautomatisation, les contrles ActiveX, les documents Active et les rpertoires Active. Lutilisation de Delphi pour crer des applications bases sur COM offre de nombreuses possibilits, allant de lamlioration de la conception de logiciel en utilisant des interfaces de manire interne dans une application, la cration dobjets qui peuvent interagir avec dautres objets utilisant lAPI COM du systme, comme les extensions du shell Win9x ou la gestion multimedia DirectX. Les applications peuvent accder aux interfaces des composants COM se trouvant sur le mme ordinateur que lapplication ou sur un autre ordinateur du rseau, en utilisant un mcanisme nomm DCOM (Distributed COM). Pour davantage dinformations sur COM et les contrles ActiveX, voir chapitre 33, Prsentation des technologies COM, chapitre 38, Cration dun contrle ActiveX et Distribution dune application client en tant que contrle ActiveX la page 25-37. Pour davantage dinformations sur DCOM, voir Utilisation de connexions DCOM la page 25-10.

Utilisation de MTS et de COM+


Il est possible dtendre les applications COM en utilisant des services spciaux pour grer les objets dans un environnement distribu important. Ces services sont, entre autres, des services de transaction, la scurit et la gestion des ressources proposes par Microsoft Transaction Server (MTS) (pour les versions de Windows antrieures Windows 2000) ou COM+ (pour Windows 2000 ou plus). Pour davantage dinformations sur MTS et COM+, voir chapitre 39, Cration dobjets MTS ou COM+ et Utilisation des modules de donnes transactionnels la page 25-7.

Utilisation de modules de donnes


Un module de donnes ressemble une fiche spciale qui ne contient que des composants non-visuels. Tous les composants dun module de donnes peuvent tre placs dans des fiches ordinaires avec des contrles visuels. Les modules de donnes constituent un moyen dorganisation utile quand vous envisagez de

5-16

Guide du dveloppeur

Utilisation de modules de donnes

rutiliser des groupes dobjets de base de donnes ou systme ou si vous souhaitez isoler les parties dune application qui grent la connexion aux bases de donnes ou les rgles de fonctionnement. Il y a plusieurs types de modules de donnes, dont standard, distant, modules Web, modules applet et services, selon ldition de Delphi que vous avez. Chaque type de module de donnes a une fonction spciale. Les modules de donnes standard sont particulirement utiles aux applications de bases de donnes un ou deux niveaux, mais peuvent tre utiliss pour organiser les composants non visuels de nimporte quelle application. Pour plus dinformations, voir Cration et modification de modules de donnes standard la page 5-17. Les modules de donnes distants constituent la base dun serveur dapplication dans une application de base de donnes multiniveau. Ils ne sont pas disponibles dans toutes les ditions. En plus de contenir les composants non visuels du serveur dapplication, les modules de donnes distants exposent linterface utilise par les clients pour communiquer avec le serveur dapplication. Pour plus dinformations sur leur utilisation, voir Ajout dun module de donnes distant un projet serveur dapplication la page 5-21. Les modules Web constituent la base des applications serveur Web. En plus de contenir les composants qui crent le contenu des messages de rponse HTTP, ils grent la rpartition des messages HTTP issus des applications client. Voir chapitre 27, Cration dapplications Internet pour plus dinformations sur lutilisation des modules Web. Les modules applet constituent la base des applets de panneau de configuration. En plus de contenir les composants non visuels qui implmentent le panneau de configuration, ils dfinissent les proprits qui dterminent la faon dont licne de lapplet apparat dans le panneau de configuration et contiennent les vnements qui sont appels quand les utilisateurs excutent lapplet. Pour plus dinformations sur les modules applet, voir laide en ligne. Les services encapsulent des services individuels dans une application de service NT. En plus de contenir les composants non visuels qui implmentent un service, les services contiennent les vnements qui sont appels quand le service est dmarr ou arrt. Pour davantage dinformations sur les services, voir Applications service la page 5-4.

Cration et modification de modules de donnes standard


Pour crer un module de donnes standard pour un projet, choisissez Fichier| Nouveau|Module de donnes. Delphi ouvre un conteneur module de donnes sur le bureau, affiche le fichier unit du nouveau module dans lditeur de code et ajoute le module au projet en cours. En conception, un module de donnes ressemble une fiche Delphi standard, avec un fond blanc et pas de grille dalignement. Comme avec les fiches, vous

Cration dapplications, de composants et de bibliothques

5-17

Utilisation de modules de donnes

pouvez placer des composants non visuels de la palette dans un module et modifier leurs proprits dans linspecteur dobjets. Vous pouvez redimensionner un module de donnes pour ladapter aux composants que vous lui ajoutez. Vous pouvez aussi cliquer avec le bouton droit sur un module pour afficher son menu contextuel. Le tableau suivant rsume les options du menu contextuel dun module de donnes :
Tableau 5.4
Edition

Options du menu contextuel des modules de donnes Utilisation


Affiche un menu contextuel grce auquel vous pouvez couper, copier, coller, supprimer et slectionner les composants du module de donnes. Aligne les composants s non visuels sur la grille invisible du module (Aligner sur la grille) ouselon des critres que vous indiquez dans la bote de dialogue Alignement (Aligner). Vous permet de changer lordre dans lequel la focalisation parcourt les composants quand vous appuyez sur la touche Tab. Vous permet de modifier lordre dans lequel les composants daccs aux donnes sont crs au dmarrage. Annule les modifications apportes un module hrit dun autre module dans le rfrentiel dobjets, et revient au module tel quil tait lorigine lors de lhritage. Stocke un lien vers le module de donnes dans le rfrentiel dobjets. Affiche la reprsentation textuelle des proprits du module de donnes. Bascule entre les formats (binaire ou texte) dans lesquels est enregistre la fiche.

El ment de menu

Position

Ordre de tabulation Ordre de cration Revenir hrit

Ajouter au rfrentiel Voir comme texte DFM texte

Pour davantage dinformations sur les modules de donnes, voir laide en ligne.

Nom dun module de donnes et de son fichier unit


La barre de titre dun module de donnes affiche le nom du module. Le nom par dfaut est DataModuleN, o N est un nombre reprsentant le plus petit numro dunit non utilis dans le projet. Par exemple, si vous commencez un nouveau projet et si vous lui ajoutez un module avant de faire quoi que ce soit dautre, le nom du module de donnes est par dfaut DataModule2. Le fichier unit correspondant DataModule2 est par dfaut Unit2. Il vaut mieux renommer les modules de donnes et les fichiers units correspondants, pendant la conception, pour quils soient plus descriptifs. En particulier, il faut renommer les modules de donnes que vous ajoutez au rfrentiel dobjets pour viter les conflits de nom avec dautres modules de donnes du rfrentiel ou des applications qui utilisent vos modules. Pour renommer un module de donnes :

1 Slectionnez le module. 2 Modifiez la proprit Name du module dans linspecteur dobjets.

5-18

Guide du dveloppeur

Utilisation de modules de donnes

Le nouveau nom du module apparat dans la barre de titre ds que la proprit Name na plus la focalisation dans linspecteur dobjets. Changer le nom dun module de donnes en conception change son nom de variable dans la section interface du code. Cela change galement toute utilisation du nom dans les dclarations de procdure. Vous devez changer manuellement toutes les rfrences ce module de donnes dans le code que vous avez crit. Pour renommer le fichier unit dun module de donnes :

1 Slectionnez le fichier unit.

Placer et nommer les composants


Vous placez des composants non visuels dans un module de donnes exactement comme vous les placeriez sur une fiche. Cliquez sur le composant voulu dans la page approprie de la palette de composants, puis cliquez dans le module de donnes pour placer le composant. Vous ne pouvez pas placer des contrles visuels, comme les grilles, dans un module de donnes. Si vous essayez de le faire, vous recevez un message derreur. Pour faciliter leur utilisation, les composants dun module de donnes sont affichs avec leur nom. Quand vous placez un composant pour la premire fois, Delphi lui attribue un nom gnrique indiquant le type du composant, suivi de 1. Par exemple, le composant TDataSource prend le nom DataSource1. Cela facilite la slection des composants lorsque vous voulez travailler sur leurs proprits et mthodes. Vous pouvez encore donner un composant un autre nom qui reflte son type et sa fonction. Pour changer le nom dun composant dans un module de donnes :

1 Slectionnez le composant. 2 Modifiez la proprit Name du composant dans linspecteur dobjets.


Le nouveau nom du composant apparat sous son icne dans le module de donnes ds que la proprit Name na plus la focalisation dans linspecteur dobjets. Par exemple, supposons que votre application de base de donnes utilise la table CUSTOMER. Pour accder cette table, vous avez besoin dau moins deux composants daccs aux donnes : un composant source de donnes (TDataSource) et un composant table (TClientDataSet). Quand vous placez ces composants dans votre module de donnes, Delphi leur attribue les noms DataSource1 et ClientDataSet1. Pour reflter le type des composants et la base de donnes laquelle ils accdent, CUSTOMER, vous pourriez changer leurs noms en CustomerSource et CustomerTable.

Cration dapplications, de composants et de bibliothques

5-19

Utilisation de modules de donnes

Utilisation des proprits et vnements des composants dans un module de donnes


Placer des composants dans un module de donnes centralise leur comportement pour lapplication toute entire. Par exemple, vous pouvez utiliser les proprits des composants ensemble de donnes, comme TClientDataSet, pour contrler les donnes disponibles dans les composants source de donnes qui utilisent ces ensembles de donnes. Dfinir la proprit ReadOnly dun ensemble de donnes par True empche les utilisateurs de modifier les donnes quils voient dans un contrle orient donnes se trouvant dans une fiche. Vous pouvez aussi appeler lditeur de champs dun ensemble de donnes, en double-cliquant sur ClientDataSet1, pour limiter les champs dune table ou dune requte qui seront disponibles pour la source de donnes et donc pour les contrles orients donnes des fiches. Les proprits que vous dfinissez pour les composants dun module de donnes sappliquent toutes les fiches de votre application qui utilisent le module. Outre les proprits, vous pouvez crire des gestionnaires dvnements pour les composants. Par exemple, un composant TDataSource peut avoir trois vnements : OnDataChange, OnStateChange et OnUpdateData. Un composant TClientDataSet a plus de 20 vnements possibles. Vous pouvez utiliser ces vnements pour crer un ensemble cohrent de rgles de gestion qui dictent les manipulation de donnes dans toute votre application.

Cration de rgles de gestion dans un module de donnes


Paralllement lcriture de gestionnaires dvnements pour les composants dun module de donnes, vous pouvez programmer des mthodes directement dans le fichier unit du module de donnes. Ces mthodes peuvent tre appliques en tant que rgles de gestion aux fiches qui utilisent le module de donnes. Par exemple, vous pouvez crire une procdure qui tablisse les comptes mensuels, trimestriels et annuels. Vous pouvez appeler cette procdure depuis un gestionnaire dvnement dun composant du module de donnes. Les prototypes des procdures et fonctions que vous crivez pour un module de donnes doivent figurer dans la dclaration de type du module :
type TCustomerData = class(TDataModule) Customers: TClientDataSet; Orders: TClientDataSet; private { Dclarations prives } public { Dclarations publiques } procedure LineItemsCalcFields(DataSet: TDataSet); { Un procdure que vous ajoutez } end; var CustomerData: TCustomerData;

5-20

Guide du dveloppeur

Utilisation de modules de donnes

Les procdures et fonctions que vous crivez doivent suivre la section implmentation du code du module.

Accs un module de donnes depuis une fiche


Pour associer des contrles visuels dune fiche un module de donnes, vous devez tout dabord ajouter le module de donnes la clause uses de la fiche. Pour ce faire, vous pouvez procder de plusieurs manires : Ouvrez le fichier unit de la fiche dans lditeur de code et ajoutez le nom du module de donnes la clause uses de la section interface. Cliquez sur le fichier unit de la fiche, choisissez Fichier|Utiliser lunit, puis entrez le nom dun module ou choisissez-le dans la bote liste de la bote de dialogue Utiliser lunit. Pour les composants base de donnes, cliquez dans le module de donnes sur un composant ensemble de donnes ou requte pour ouvrir lditeur de champs et faire glisser dans la fiche des champs de lditeur. Delphi vous demande alors de confirmer lajout de ce module dans la clause uses de la fiche puis cre des contrles (par exemple, des botes de saisie) pour chaque champ. Par exemple, si vous avez ajout le composant TClientDataSet votre module de donnes, double-cliquez sur lui pour ouvrir lditeur de champs. Slectionnez un champ et faites-le glisser dans la fiche. Une bote de saisie apparat. Comme la source de donnes nest pas encore dfinie, Delphi ajoute un nouveau composant source de donnes, DataSource1, la fiche et dfinit la proprit DataSource de la bote de saisie par DataSource1. La source de donnes dfinit automatiquement sa proprit DataSet par le composant ensemble de donnes, ClientDataSet1, dans le module de donnes. Vous pouvez dfinir la source de donnes avant de faire glisser un champ sur la fiche, en ajoutant un composant TDataSource au module de donnes. D finissez la proprit DataSet de la source de donnes par ClientDataSet1. Une fois que vous avez fait gliss un champ dans la fiche, la bote de saisie apparat avec sa proprit TDataSource dj dfinie par DataSource1. Grce cette mthode, votre modle daccs aux donnes est plus propre.

Ajout dun module de donnes distant un projet serveur dapplication


Certaines ditions de Delphi vous permettent dajouter des modules de donnes distants des projets de serveur dapplications. Un module de donnes distant dispose dune interface laquelle les clients dune application multiniveau peuvent accder au travers dun rseau. Pour ajouter un module de donnes distant un projet :

1 Choisissez Fichier|Nouveau|Autre.

Cration dapplications, de composants et de bibliothques

5-21

Utilisation du rfrentiel dobjets

2 Slectionnez la page Multi-niveaux dans la bote de dialogue Nouveaux lments. 3 Double-cliquez sur le type de module voulu (Module de donnes CORBA, Module de donnes distant ou Module de donnes transactionnel) pour ouvrir lexpert Module de donnes distant.
Une fois le module de donnes distant ajout un projet, vous pouvez lutiliser comme un module de donnes standard. Pour davantage dinformations sur les applications de bases de donnes multiniveaux, voir chapitre 25, Cration dapplications multiniveaux.

Utilisation du rfrentiel dobjets


Le rfrentiel dobjets (Outils|Rfrentiel) vous permet facilement de partager ou de copier des fiches, des botes de dialogue ou des modules de donnes. Il propose galement des modles de projet comme point de dpart pour de nouveaux projets et des experts qui guident lutilisateur dans la cration de fiches ou de projets. Le rfrentiel est stock dans DELPHI32.DRO (plac par dfaut dans le rpertoire BIN), cest un fichier texte qui contient des rfrences aux lments apparaissant dans le rfrentiel et dans la bote de dialogue Nouveaux lments.

Partage dlments dans un projet


Il est galement facile de partager des lments lintrieur dun projet sans avoir les ajouter au rfrentiel dobjets. quand vous ouvrez la bote de dialogue Nouveaux lments (Fichier|Nouveau|Autre), longlet dune des pages porte le nom de votre projet. Cette page numre toutes les fiches, botes de dialogue et modules de donnes de votre projet. Vous pouvez alors driver un nouvel lment dun lment existant et le personnaliser si ncessaire.

Ajout dlments au rfrentiel dobjets


Vous pouvez ajouter vos propres projets, fiches, cadres et modules de donnes ceux qui existent dj dans le rfrentiel dobjets. Pour ajouter un lment au rfrentiel dobjets,

1 Si llment est un projet ou dans un projet, ouvrez le projet. 2 Pour un projet, choisissez Projet|Ajouter au rfrentiel. Pour une fiche ou un module de donnes, cliquez sur llment avec le bouton droit de la souris puis choisissez Ajouter au rfrentiel. 3 Entrez une description, un titre et un auteur. 4 Dcidez dans quelle page cet lment doit apparatre dans la bote de dialogue Nouveaux lments, entrez ou slectionnez la page dans la bote

5-22

Guide du dveloppeur

Utilisation du rfrentiel dobjets

options Page. Si vous entrez un nom de page inexistant, Delphi cre une nouvelle page.

5 Choisissez Parcourir pour slectionner une icne reprsentant lobjet dans le rfrentiel dobjets. 6 Choisissez OK.

Partage dobjets par une quipe de dveloppement


Vous pouvez partager des objets dans un groupe de travail ou une quipe de dveloppement en utilisant un rfrentiel accessible depuis un rseau. Pour utiliser un rfrentiel partag, tous les membres de lquipe doivent slectionner le mme rpertoire de Rfrentiel partag dans la bote de dialogue Options denvironnement :

1 Choisissez Outils|Options denvironnement. 2 Dans la page Prfrences, reprez le volet Rfrentiel partag. Dans le volet bote de saisie Rpertoire, entrez le nom du rpertoire o doit se trouver le rfrentiel partag. Assurez-vous que le rpertoire spcifi est bien accessible pour tous les membres de lquipe.
Lors de lajout du premier lment au rfrentiel, Delphi cre, sil nexiste pas dj, un fichier DELPHI32.DRO dans le rpertoire spcifi par Rfrentiel partag.

Utilisation dun lment du rfrentiel dobjets dans un projet


Pour accder aux lments du rfrentiel dobjets, choisissez Fichier|Nouveau. La bote de dialogue Nouveaux lments apparat et affiche tous les lments disponibles. Selon le type dlment que vous souhaitez utiliser, il y a jusqu trois options pour ajouter un lment votre projet : Copier Hriter Utiliser

Copie dun lment


Choisissez Copier pour obtenir une rplique exacte de llment slectionn et ajouter la copie votre projet. Les modifications ultrieures de llment du rfrentiel dobjets ne sont pas rpercutes sur votre copie. De mme, les modifications apportes la copie naffectent pas llment original dans le rfrentiel dobjets. Copier est la seule option possible pour les modles de projet.

Hritage dun lment


Choisissez Hriter pour driver une nouvelle classe de llment slectionn dans le rfrentiel dobjets et ajouter la nouvelle classe votre projet. Quand vous

Cration dapplications, de composants et de bibliothques

5-23

Utilisation du rfrentiel dobjets

recompilez votre projet, toutes les modifications apportes llment du rfrentiel dobjets sont reportes dans votre classe drive. Les modifications faites dans la classe drive naffectent pas llment partag du rfrentiel dobjets. Hriter est une option propose pour les fiches, les botes de dialogue et les modules de donnes, mais pas pour les modles de projet. Cest la seule option utilisable pour rutiliser les lments du projet en cours.

Utilisation dun lment


Choisissez Utiliser quand vous voulez que lobjet slectionn fasse lui-mme partie de votre projet. Les modifications faites llment apparaissent dans tous les projets dans lesquels llment a t ajout en utilisant loption Hriter ou Utiliser. Soyez prudent si vous choisissez cette option. Loption Utiliser est disponible pour les fiches, les botes de dialogue et les modules de donnes.

Utilisation de modles de projet


Les modles de projet sont des projets prfabriqus que vous pouvez utiliser comme point de dpart pour la cration de vos projets. Pour crer un nouveau projet partir dun modle,

1 Choisissez Fichier|Nouveau|Autre pour afficher la bote de dialogue Nouveaux lments. 2 Choisissez longlet Projets. 3 Slectionnez le modle de projet souhait et choisissez OK. 4 Dans la bote de dialogue Slection du rpertoire, spcifiez le rpertoire des fichiers du nouveau projet.
Delphi copie les fichiers du modle dans le rpertoire spcifi, o vous pouvez ensuite les modifier. Le modle de projet initial nest pas affect par vos modifications.

Modification dlments partags


Si vous modifiez un lment du rfrentiel dobjets, vos modifications affectent tous les projets qui ultrieurement utilisent llment mais galement tous les projets existants qui ont ajout llment en utilisant les options Utiliser ou Hriter. Pour viter de propager des modifications dautres projets, vous avez plusieurs solutions : Copier llment et le modifier uniquement dans le projet en cours. Copier llment dans le projet en cours, le modifier puis lajouter au rfrentiel sous un autre nom.

5-24

Guide du dveloppeur

Activation de laide dans les applications

Crer un composant, une DLL, un modle de composant ou un cadre partir de llment. Si vous crez un composant ou une DLL, vous pouvez le partager avec dautres dveloppeurs.

Spcification dun projet par dfaut, dune nouvelle fiche et de la fiche principale
Par dfaut, quand vous choisissez Fichier|Nouveau|Application ou Fichier| Nouveau|Fiche, Delphi affiche une fiche vide. Vous pouvez changer ce comportement en reconfigurant le rfrentiel :

1 Choisissez Outils|Rfrentiel 2 Si vous voulez spcifier un projet par dfaut, slectionnez la page Projets et choisissez un lment dans Objets. Slectionnez ensuite la case cocher Nouveau projet. 3 Pour spcifier une fiche par dfaut, slectionnez une fiche dans Objets. Pour spcifier la nouvelle fiche par dfaut, (Fiche|Nouveau|Fiche), slectionnez la case cocher Nouvelle fiche. Pour spcifier la nouvelle fiche principale par dfaut des nouveaux projets, slectionnez la case cocher Fiche principale. 4 Choisissez OK.

Activation de laide dans les applications


La VCL et CLX supportent toutes deux laffichage de laide partir dapplications utilisant un mcanisme base dobjets pour transmettre les demandes daide lun des multiples visualiseurs daide externes. Pour supporter cela, une application doit contenir une classe qui implmente linterface ICustomHelpViewer (et, ventuellement, une des nombreuses interfaces qui en descendent), puis se recense elle-mme dans le gestionnaire daide global. La VCL fournit toutes les applications une instance de TWinHelpViewer, qui implmente toutes ces interfaces et fournit un lien entre les applications et WinHelp ; CLX ncessite que les dveloppeurs dapplications fournissent leur propre implmentation. Le gestionnaire daide maintient la liste des visualiseurs recenss et leur passe les requtes dans un processus en deux phases : dabord, il demande chaque visualiseur sil est capable de fournir du support sur un mot cl ou un contexte daide particulier ; ensuite, il passe la requte daide au visualiseur ayant indiqu quil peut fournir un tel support. Si plusieurs visualiseurs supportent le mot cl (comme cest la cas des applications ayant recens des visualiseurs et pour Man et pour Info), le gestionnaire daide peut afficher une bote de slection dans laquelle lutilisateur de lapplication choisit le visualiseur daide invoquer. Sinon, il affiche le premier systme daide lui ayant rpondu).

Cration dapplications, de composants et de bibliothques

5-25

Activation de laide dans les applications

Interfaces avec les systmes daide


Le systme daide permet la communication entre votre application et les visualiseurs daide via une srie dinterfaces. Ces interfaces sont toutes dfinies dans HelpIntfs.pas, qui contient galement limplmentation du gestionnaire daide. ICustomHelpViewer prend en charge laffichage de laide selon le mot cl fourni et laffichage dun sommaire listant toute laide disponible dans un visualiseur particulier. IExtendedHelpViewer prend en charge laffichage de laide selon le numro de contexte fourni et laffichage des rubriques ; dans la majorit des systmes daide, les rubriques fonctionnent comme des mots cls de haut niveau (par exemple, IntToStr pourrait tre un mot cl dans le systme daide, tandis que Routines de manipulation de chanes pourrait tre le nom dune rubrique). ISpecialWinHelpViewer prend en charge la rponse aux messages WinHelp spcialiss quune application sexcutant sous Windows risque de recevoir et qui ne sont pas facilement gnralisables. En principe, seules les applications oprant dans lenvironnement Windows ont besoin dimplmenter cette interface et, mme alors, elle nest ncessaire quaux applications faisant une forte utilisation des messages WinHelp non standard. IHelpManager fournit le mcanisme permettant au visualiseur daide de communiquer avec le gestionnaire daide de lapplication et demande un supplment dinformation. Un IHelpManager est obtenu au moment o le visualiseur daide se recense lui-mme. IHelpSystem fournit le mcanisme permettant TApplication de transmettre les requtes daide au systme daide. TApplication obtient une instance dun objet qui implmente la fois IHelpSystem et IHelpManager au chargement de lapplication et exporte cette instance en tant que proprit ; cela autorise dautres parties du code de lapplication traiter les requtes daide directement lorsque cest possible. IHelpSelector fournit le mcanisme permettant au systme daide dinvoquer linterface utilisateur pour demander quel visualiseur daide doit tre utilis lorsque plusieurs visualiseurs sont mme de grer une requte daide et dafficher un sommaire. Cette capacit daffichage nest pas directement intgre au gestionnaire daide pour permettre lutilisation du mme code du gestionnaire daide, quel que soit lensemble de widgets ou la bibliothque de classes utilis.

Implmentation de ICustomHelpViewer
Linterface ICustomHelpViewer contient trois types de mthodes : les mthodes servant communiquer au gestionnaire daide les informations du niveau systme (par exemple, des informations non lies une requte daide particulire) ; les mthodes servant afficher laide en fonction du mot cl fourni par le gestionnaire daide ; les mthodes servant afficher le sommaire.

5-26

Guide du dveloppeur

Activation de laide dans les applications

Communication avec le gestionnaire daide


ICustomHelpViewer fournit quatre fonctions servant communiquer les informations systme au gestionnaire daide : GetViewerName NotifyID ShutDown SoftShutDown

Le gestionnaire daide appelle ces fonctions dans les circonstances suivantes : ICustomHelpViewer.GetViewerName : String est appele lorsque le gestionnaire daide veut connatre le nom du visualiseur (par exemple, si lapplication doit afficher la liste des visualiseurs recenss). Cette information est renvoye via une chane et celle-ci doit tre logiquement statique (cest--dire quelle ne peut pas tre modifie pendant que lapplication sexcute). Les jeux de caractres multi-octets ne sont pas pris en charge. ICustomHelpViewer.NotifyID(const ViewerID: Integer) est appele immdiatement aprs le recensement pour fournir au visualiseur un cookie qui lidentifie de manire unique. Cette information doit tre conserve pour une utilisation ultrieure ; si le visualiseur sinterrompt de son propre chef (et non pas en rponse une notification du gestionnaire daide), il doit fournir le cookie identificateur au gestionnaire daide pour que celui-ci lib re toutes les rfrences au visualiseur. (Ne pas russir fournir le cookie, ou en fournir un mauvais, peut amener le gestionnaire daide librer les rfrences au mauvais visualiseur.) ICustomHelpViewer.ShutDown est appele par le gestionnaire daide pour signaler au visualiseur daide que le gestionnaire va sinterrompre et que toutes les ressources alloues par le visualiseur doivent tre libres. Il est conseill de dlguer cette mthode la libration de toutes les ressources. ICustomHelpViewer.SoftShutDown est appele par le gestionnaire daide pour demander au visualiseur daide de fermer toutes les manifestations externes visibles du systme daide (par exemple, les fentres affichant des informations daide) sans dcharger le visualiseur.

Demande dinformations au gestionnaire daide


Les visualiseurs daide communiquent avec le gestionnaire daide via linterface IHelpManager, une instance de celle-ci leur est renvoye lorsquils se recensent auprs du gestionnaire daide. IHelpManager permet au visualiseur de communiquer quatre choses : une requte pour le handle de fentre du contrle actif ; une requte pour le nom du fichier daide suppos contenir laide sur le contrle actif ; une requte pour le chemin daccs ce fichier ; la notification que le visualiseur daide va sinterrompre lui-mme en rponse autre chose quune demande issue du gestionnaire daide.

Cration dapplications, de composants et de bibliothques

5-27

Activation de laide dans les applications

IHelpManager.GetHandle : LongInt est appele par le visualiseur daide sil veut connatre le handle du contrle actif ; le rsultat est un handle de fentre. IHelpManager.GetHelpFile: String est appele par le visualiseur daide sil veut connatre le nom du fichier daide suppos contenir laide sur le contrle actif. IHelpManager.Release est appele pour signaler au gestionnaire daide quun visualiseur daide va se dconnecter. Elle ne doit jamais tre appele en rponse une requte via ICustomHelpViewer.ShutDown ; elle sert annoncer au gestionnaire daide uniquement les dconnexions inattendues.

Affichage de laide sur un mot cl


Les requtes daide adresses au visualiseur daide sont soit bases sur un mot cl, auquel cas le visualiseur est charg de fournir de laide en fonction dune chane particulire, soit bases sur un contexte, auquel cas le visualiseur est charg de fournir de laide en fonction dun identificateur numrique particulier. (Les contextes daide numriques sont la forme par dfaut des requ tes daide des applications sexcutant sous Windows et utilisant le systme WinHelp ; bien que CLX les supporte, il nest pas conseill de les utiliser dans les applications CLX car la majorit des systmes daide sous Linux ne les comprennent pas.) Les implmentations de ICustomHelpViewer sont ncessaires pour prendre en charge les requtes bases sur les mots cls, les implmentations de IExtendedHelpViewer sont ncessaires pour prendre en charge les requtes bases sur des contextes. ICustomHelpViewer fournit trois mthodes pour traiter laide par mot cl : UnderstandsKeyword GetHelpStrings ShowHelp
ICustomHelpViewer.UnderstandsKeyword(const HelpString: String): Integer

est la premire des trois mthodes appeles par le gestionnaire daide, qui appellera chacun des visualiseurs daide recenss avec la mme chane pour demander si le visualiseur peut fournir de laide pour cette chane ; le visualiseur est suppos rpondre par un entier indiquant le nombre de pages daide diffrentes quil peut afficher en rponse cette demande. Le visualiseur peut utiliser la mthode quil veut pour le dterminer dans lEDI, le visualiseur HyperHelp maintient son propre index et effectue la recherche. Si le visualiseur ne dispose pas daide sur le mot cl, il doit renvoyer zro. Les nombres ngatifs sont interprts comme zro, mais ce comportement nest pas garanti dans les versions futures.
ICustomHelpViewer.GetHelpStrings(const HelpString: String): TStringList

est appele par le gestionnaire daide si plusieurs visualiseurs peuvent fournir de laide sur une rubrique. Le visualiseur doit renvoyer une TStringList. Les chanes de la liste renvoye doivent correspondre aux pages disponibles pour le mot cl, mais les caractristiques de correspondance peuvent tre dtermines par le visualiseur. Dans le cas du visualiseur HyperHelp, la liste de chanes contient toujours exactement une entre (HyperHelp a sa propre indexation, dupliquer cela ailleurs serait inutile) ; dans le cas du visualiseur de pages Man, la liste de

5-28

Guide du dveloppeur

Activation de laide dans les applications

chanes est constitue de plusieurs chanes, une par section du manuel contenant une page correspondant au mot cl.
ICustomHelpViewer.ShowHelp(const HelpString: String)

est appele par le gestionnaire daide sil a besoin que le visualiseur daide affiche de laide sur un mot cl particulier. Cest le dernier appel de mthode de lopration ; elle nest jamais appele sauf si CanShowKeyword a t invoque au pralable.

Affichage des sommaires


ICustomHelpViewer fournit deux mthodes pour afficher les sommaires : CanShowTableOfContents ShowTableOfContents Leur mode opratoire ressemble beaucoup celui des requtes daide par mot cl : le gestionnaire daide interroge dabord tous les visualiseurs daide en appelant ICustomHelpViewer.CanShowTableOfContents : Boolean , puis invoque un visualiseur daide particulier en appelant ICustomHelpViewer.ShowTableOfContents. Il est raisonnable pour un visualiseur de refuser de prendre en charge les demandes de sommaires. Cest ce que fait, par exemple, le visualiseur de pages Man car le concept de sommaire est trop loign de la faon dont fonctionnent les pages Man ; le visualiseur HyperHelp, en revanche, supporte les sommaires en passant la requte daffichage du sommaire directement HyperHelp. Il nest pas raisonnable, cependant, pour une implmentation de ICustomHelpViewer de rpondre aux requtes CanShowTableOfContents avec une valeur true et dignorer ensuite les requtes ShowTableOfContents.

Implmentation de IExtendedHelpViewer
ICustomHelpViewer est seule fournir un support direct de laide par mot cl. Certains systmes daide (spcialement WinHelp) oprent en associant un nombre (appel ID de contexte) aux mots cls, de manire interne au systme daide et donc de manire invisible pour lapplication. De tels systmes ncessitent que lapplication supporte laide par contexte, o lapplication invoque le systme daide avec un nombre plutt quune chane, et que le systme daide effectue la traduction du nombre. Les applications crites en CLX peuvent communiquer avec les systmes utilisant laide par contexte, en tendant lobjet qui implmente ICustomHelpViewer afin quil implmente galement IExtendedHelpViewer. IExtendedHelpViewer prend aussi en charge la communication avec les systmes daide vous permettant daller directement aux rubriques de haut niveau au lieu dutiliser les recherches par mot cl. IExtendedHelpViewer expose quatre fonctions. Deux dentre elles, UnderstandsContext et DisplayHelpByContext, sont utilises pour supporter laide

Cration dapplications, de composants et de bibliothques

5-29

Activation de laide dans les applications

par contexte ; les deux autres, UnderstandsTopic et DisplayTopic, sont utilises pour supporter les rubriques. Lorsque lutilisateur dune application appuie sur F1, le gestionnaire daide appelle
IExtendedHelpViewer.UnderstandsContext(const ContextID: Integer; const HelpFileName: String): Boolean

et le contrle actif prend en charge laide par contexte et non laide par mot cl. De mme quavec ICustomHelpViewer.CanShowKeyword, le gestionnaire daide interroge tous les visualiseurs daide recenss lun aprs lautre. Mais, au contraire de ICustomHelpViewer.CanShowKeyword, si plusieurs visualiseurs supportent le contexte spcifi, cest le premier visualiseur recens et supportant le contexte qui est invoqu. Le gestionnaire daide appelle
IExtendedHelpViewer.DisplayHelpByContext(const ContextID: Integer; const HelpFileName: String)

aprs avoir consult les visualiseurs daide recenss. Les fonctions de support des rubriques se comportent de la mme faon :
IExtendedHelpViewer.UnderstandsTopic(const Topic: String): Boolean

est utilise pour demander aux visualiseurs daide sils supportent une rubrique ;
IExtendedHelpViewer.DisplayTopic(const Topic: String)

est utilise pour invoquer le premier visualiseur recens indiquant qu il peut fournir de laide sur cette rubrique.

Implmentation de IHelpSelector
IHelpSelector est un compagnon de ICustomHelpViewer. Lorsque plusieurs visualiseurs recenss peuvent assurer le support du mot cl, du contexte ou de la rubrique spcifi, ou peuvent fournir un sommaire, le gestionnaire daide doit faire un choix entre eux. Dans le cas des contextes ou des rubriques, le gestionnaire daide slectionne toujours le premier visualiseur daide prtendant assurer le support. Dans le cas des mots cls ou des sommaires, le gestionnaire daide, par dfaut, slectionne le premier visualiseur daide. Ce comportement peut tre redfini par une application. Pour supplanter la dcision du gestionnaire daide, une application doit recenser une classe fournissant une implmentation de linterface IHelpSelector. IHelpSelector exporte deux fonctions : SelectKeyword et TableOfContents. Les deux acceptent comme argument un TStrings contenant, lun la suite de lautre, soit les correspondances possibles des mots cls, soit les noms des visualiseurs pouvant fournir un sommaire. Limplmenteur est ncessaire pour renvoyer lindice (dans le TStrings) reprsentant la chane slectionne.
Remarque

Le gestionnaire daide risque de se tromper si les chanes sont re-arranges ; il est conseill que les implmenteurs de IHelpSelector ne le fassent pas. Le systme

5-30

Guide du dveloppeur

Utilisation de laide dans une application VCL

daide ne supporte quun seul HelpSelector ; lorsque de nouveaux slectionneurs sont recenss, tout slectionneur existant pralablement est dconnect.

Recensement des objets du systme daide


Pour que le gestionnaire daide communique avec eux, les objets implmentant ICustomHelpViewer, IExtendedHelpViewer, ISpecialWinHelpViewer et IHelpSelector doivent se recenser auprs du gestionnaire daide. Pour recenser les objets du systme daide auprs du gestionnaire daide, il vous faut : Recenser le visualiseur daide Recenser le slectionneur daide

Recensement des visualiseurs daide


Lunit contenant limplmentation de lobjet doit utiliser HelpIntfs. Une instance de lobjet doit tre dclare dans la section var de lunit dimplmentation. La section initialisation de lunit dimplmentation doit assigner la variable dinstance et la transmettre la fonction RegisterViewer. RegisterViewer est une fonction simple, exporte par HelpIntfs.pas, qui prend un ICustomHelpViewer en argument et renvoie un IHelpManager. Le IHelpManager doit tre enregistr pour une utilisation ultrieure.

Recensement des slectionneurs daide


Lunit contenant limplmentation de lobjet doit utiliser HelpIntfs et QForms. Une instance de lobjet doit tre dclare dans la section var de lunit dimplmentation. La section initialisation de lunit dimplmentation doit recenser le slectionneur daide via la proprit HelpSystem de lobjet global Application :
Application.HelpSystem.AssignHelpSelector(myHelpSelectorInstance)

Cette procdure ne renvoie pas de valeur.

Utilisation de laide dans une application VCL


Les sections suivantes expliquent comment utiliser laide dans une application VCL. Comment TApplication traite-il laide VCL ? Comment les contrles traitent-ils laide ? Appel direct un systme daide Utilisation de IHelpSystem

Cration dapplications, de composants et de bibliothques

5-31

Utilisation de laide dans une application CLX

Comment TApplication traite-il laide VCL ?


TApplication dans la VCL fournit quatre mthodes accessibles depuis le code de lapplication :
Tableau 5.5 Mthodes daide de TApplication
Transmet HELP_COMMAND, de style aide Windows, WinHelp. Les demandes daide transmises par le biais de ce mcanisme sont passes uniquement aux implmentations de IspecialWinHelpViewer. Invoque le systme daide en utilisant une requte par contexte. Invoque le systme daide en utilisant une requte par mot cl. Demande laffichage dune rubrique particulire.

HelpCommand

HelpContext HelpKeyword HelpJump

Les quatre fonctions prennent les donnes qui leurs sont transmises et les font suivre via une donne membre de TApplication qui reprsente le systme daide. Cette donne membre est directement accessible via la proprit HelpSystem.

Comment les contrles traitent-ils laide ?


Tous les contrles drivant de TControl exposent trois proprits qui sont utilises par le systme daide : HelpSystem, HelpType, HelpContext et HelpKeyword. La proprit HelpType contient une instance dun type numr qui dtermine si le concepteur du contrle a prvu de fournir laide par mot cl ou par contexte. Si HelpType est dfinie par htKeyword , le systme daide sattend ce que le contrle utilise laide par mot cl et il examine uniquement le contenu de la proprit HelpKeyword. En revanche, si HelpType est dfinie par htContext, le systme daide sattend ce que le contrle utilise laide par contexte et il examine uniquement le contenu de la proprit HelpContext. En plus des proprits, les contrles exposent une seule mthode, InvokeHelp, qui peut tre appele pour transmettre une requte au systme daide. Elle ne prend pas de paramtre et appelle dans lobjet global Application les mthodes qui correspondent au type daide support par le contrle. Les messages daide sont automatiquement invoqu s lors de lappui sur la touche F1 car la mthode KeyDown de TWinControl appelle InvokeHelp.

Utilisation de laide dans une application CLX


Les sections suivantes expliquent comment utiliser laide dans une application CLX. Comment TApplication traite-il laide CLX ? Comment les contrles CLX traitent-ils laide ? Appel direct un systme daide Utilisation de IHelpSystem

5-32

Guide du dveloppeur

Appel direct un systme daide

Comment TApplication traite-il laide CLX ?


TApplication dans CLX fournit deux mthodes accessibles depuis le code de lapplication : ContextHelp, qui invoque le systme daide en utilisant une requte par contexte KeywordHelp, qui invoque le systme daide en utilisant une requte par mot cl Les deux fonctions prennent en argument le contexte ou le mot cl, et fait suivre la requte une donne membre de TApplication, qui reprsente le systme daide. Cette donne membre est directement accessible via la proprit en lecture seule HelpSystem.

Comment les contrles CLX traitent-ils laide ?


Tous les contrles drivant de TControl exposent quatre proprits qui sont utilises par le systme daide : HelpType, HelpFile, HelpContext et HelpKeyword. HelpFile est cense contenir le nom du fichier o se trouve laide du contrle ; si laide se trouve dans un systme daide externe ne reconnaissant pas les noms de fichiers (par exemple, le systme des pages Man), la proprit doit tre laisse vierge. La proprit HelpType contient une instance dun type numr qui dtermine si le concepteur du contrle a prvu de fournir laide par mot cl ou par contexte ; les deux autres proprits lui sont lies. Si HelpType est dfinie par htKeyword, le systme daide sattend ce que le contrle utilise laide par mot cl et il examine uniquement le contenu de la proprit HelpKeyword. En revanche, si HelpType est dfinie par htContext, le systme daide sattend ce que le contrle utilise laide par contexte et il examine uniquement le contenu de la proprit HelpContext. En plus des proprits, les contrles exposent une seule mthode, InvokeHelp, qui peut tre appele pour transmettre une requte au systme daide. Elle ne prend pas de paramtre et appelle dans lobjet global Application les mthodes qui correspondent au type daide support par le contrle. Les messages daide sont automatiquement invoqu s lors de lappui sur la touche F1 car la mthode KeyDown de TWidgetControl appelle InvokeHelp.

Appel direct un systme daide


Pour les fonctionnalits des systmes daide non fournis par la VCL ou par CLX, TApplication fournit une proprit, accessible en lecture seulement, qui donne un accs direct au systme daide. Cette proprit est une instance dune implmentation de linterface IHelpSystem. IHelpSystem et IHelpManager sont implmentes par le mme objet, mais une interface est utilise pour permettre

Cration dapplications, de composants et de bibliothques

5-33

Utilisation de IHelpSystem

lapplication de communiquer avec le gestionnaire daide, et lautre est utilise pour permettre aux visualiseurs daide de communiquer avec le gestionnaire daide.

Utilisation de IHelpSystem
IHelpSystem permet lapplication VCL ou CLX de raliser trois choses : Fournir au gestionnaire daide les informations de chemin daccs Fournir un nouveau slectionneur daide Demander au gestionnaire daide dafficher laide Assigner un slectionneur daide permet au gestionnaire daide de dlguer la prise de dcision au cas o plusieurs systmes daide externes peuvent apporter laide pour le mme mot cl. Pour plus dinformations, voir la section Implmentation de IHelpSelector la page 30. IHelpSystem exporte quatre procdure et une fonction utilises pour demander au gestionnaire daide dafficher laide : ShowHelp ShowContextHelp ShowTopicHelp ShowTableOfContents Hook

Hook est entirement destine la compatibilit WinHelp et ne doit pas tre utilise dans une application CLX ; elle permet le traitement des messages WM_HELP qui ne peuvent pas tre directement traduits en requtes daide base sur un mot cl, un contexte ou une rubrique. Les autres mthodes prennent chacune deux arguments : le mot cl, lID de contexte ou la rubrique pour lequel laide est demande, et le fichier daide dans lequel on sattend la trouver. En gnral, sauf si vous demandez une aide par rubrique, il est aussi efficace et plus clair de transmettre les requtes au gestionnaire daide via la mthode InvokeHelp de votre contrle.

Personnalisation du systme daide de lEDI


LEDI de Delphi supporte les visualiseurs daide multiples exactement comme le fait une application VCL ou CLX : il dlgue les demandes daide au gestionnaire daide, qui les fait suivre aux visualiseurs daide recenss. LEDI utilise le mme visualiseur daide WinHelpViewer que VCL. Pour vous objet pour vous installer un nouveau visualiseur daide dans lEDI, faites exactement ce que feriez dans une application CLX une diffrence prs. Vous crivez un qui implmente ICustomHelpViewer (et, ventuellement, IExtendedHelpViewer) faire suivre les requtes daide au visualiseur externe de votre choix, et recensez le ICustomHelpViewer avec lEDI.

5-34

Guide du dveloppeur

Personnalisation du systme daide de lEDI

Pour recenser un visualiseur daide personnalis avec lEDI,

1 Assurez-vous que lunit implmentant le visualiseur daide contient HelpIntfs.pas. 2 Construisez lunit dans un paquet de conception recens avec lEDI, et construisez le paquet en activant loption Paquets dexcution. (Cest ncessaire pour garantir que linstance du gestionnaire daide utilise par lunit est la mme que celle utilise par lEDI.) 3 Assurez-vous que le visualiseur daide existe comme instance globale lintrieur de lunit. 4 Dans la section initialisation de lunit, assurez-vous que linstance est transmise la fonction RegisterHelpViewer.

Cration dapplications, de composants et de bibliothques

5-35

5-36

Guide du dveloppeur

Chapitre

Chapitre 6

Conception de linterface utilisateur des applications

Delphi vous permet de crer une interface utilisateur en slectionnant des composants de la palette de composants et en les dposant dans des fiches. Vous faites faire aux composants ce que vous voulez en dfinissant leurs proprits et en crivant le code de leurs gestionnaires dvnements.

Contrle du comportement de lapplication


TApplication, TScreen et TForm sont les classes qui constituent la base de toutes les applications Delphi en contrlant le comportement de votre projet. La classe TApplication sert de fondation une application en fournissant les proprits et les mthodes qui encapsulent le comportement dun programme standard. La classe TScreen est utilise lexcution pour grer les fiches et les modules de donnes chargs, ainsi que pour maintenir des informations spcifiques au systme comme la rsolution cran ou les fontes utilisables laffichage. Des instances de la classe TForm servent construire linterface utilisateur de votre application. Les fentres et les botes de dialogue dune application sont bases sur TForm.

Utilisation de la fiche principale


TForm est la classe essentielle dans la cration dapplications disposant dune interface utilisateur graphique. Lorsque vous ouvrez Delphi, ce qui affiche un projet par dfaut, ou lorsque vous crez un nouveau projet, une fiche est affiche pour vous permettre de dmarrer la conception de votre interface utilisateur.

Conception de linterface utilisateur des applications

6-1

Contrle du comportement de lapplication

La premire fiche cre et enregistre dans un projet devient, par dfaut, la fiche principale du projet : cest la premire fiche cre lexcution. Quand vous ajoutez dautres fiches dans vos projets, vous pouvez en choisir une autre pour servir de fiche principale votre application. Par ailleurs, faire dune fiche la fiche principale est le moyen le plus simple de la tester lexcution : moins de changer explicitement lordre de cration, la fiche principale est la premire fiche affiche lors de lexcution dune application. Pour changer la fiche principale dun projet :

1 Choisissez Projet|Options et slectionnez la page Fiche. 2 Dans la bote liste Fiche principale, slectionnez la fiche utiliser comme fiche principale du projet et choisissez OK.
Dsormais, si vous excutez votre application, la fiche choisie comme fiche principale saffiche.

Ajout de fiches
Pour ajouter une fiche votre projet, slectionnez Fichier|Nouvelle fiche. Toutes les fiches dun projet ainsi que les units correspondantes sont affiches dans le gestionnaire de projet (Voir|Gestionnaire de projet) et vous pouvez afficher la liste des fiches en choisissant Voir|Fiches.

Liaison de fiches
Lajout dune fiche au projet ajoute au fichier projet une rfrence cette fiche mais pas aux autres units du projet. Avant dcrire du code faisant rfrence la nouvelle fiche, vous devez ajouter une rfrence cette fiche dans les fichiers unit des fiches y faisant rfrence. Cela sappelle la liaison de fiche. La liaison de fiche est frquemment utilise pour donner accs aux composants contenus dans une autre fiche. Par exemple, la liaison de fiche est souvent employe pour permettre une fiche contenant des composants orients donnes de se connecter aux composants daccs aux donnes dun module de donnes. Pour lier une fiche une autre fiche :

1 2 3 4

Slectionnez la fiche qui fait rfrence une autre. Choisissez Fichier|Utiliser lunit. Slectionnez le nom de lunit de la fiche qui doit tre rfrence. Choisissez OK.

Lier une fiche une autre signifie simplement que les clauses uses de lunit dune fiche contiennent une rfrence lunit de lautre fiche. Ainsi la fiche lie et ses composants rentrent dans la porte de la fiche.

6-2

Guide du dveloppeur

Contrle du comportement de lapplication

Rfrences circulaires dunits


Quand deux fiches doivent se rfrencer mutuellement, il est possible de gnrer une erreur Rfrence circulaire lors de la compilation du programme. Pour viter une telle erreur, utilisez lune des mthodes suivantes : Placez les deux clauses uses, avec les identificateurs dunits, dans la section implementation de leur fichier unit respectif. (Cest ce que fait la commande Fichier|Utiliser lunit.) Placez lune des clauses uses dans la section interface et lautre dans la section implementation. (il est rarement ncessaire de placer lidentificateur de lunit dune autre fiche dans la section interface). Ne placez pas les deux clauses uses dans la section interface de leur fichier unit respectif. Cela provoque lerreur Rfrence circulaire la compilation.

Cacher la fiche principale


Vous pouvez empcher laffichage de la fiche principale lors du dmarrage de lapplication. Pour ce faire, vous devez utiliser la variable globale Application (dcrite dans la rubrique suivante). Pour masquer la fiche principale au dmarrage :

1 Choisissez Projet|Voir le source pour afficher le fichier du projet principal. 2 Ajoutez les lignes suivantes aprs lappel de Application.CreateForm et avant lappel de Application.Run.
Application.ShowMainForm := False; Form1.Visible := False; { le nom de votre fiche principale peut tre diffrent } Remarque

Vous pouvez initialiser la valeur de la proprit Visible de la fiche False en utilisant la conception linspecteur dobjets au lieu de la dfinir lexcution comme indiqu ci-dessus.

Manipulation de lapplication
La variable globale Application de type TApplication se trouve dans chaque application utilisant la VCL ou CLX. Application encapsule lapplication et propose de nombreux services fonctionnant en arrire-plan du programme. Ainsi, Application gre la manire dappeler un fichier daide depuis les menus de votre programme. La comprhension du fonctionnement de TApplication est plus importante pour le concepteur de composants que pour le dveloppeur dapplications autonomes, mais vous devez dfinir les options gres par Application dans la page Application de la bote de dialogue Options de projet (Projet|Options) quand vous crez un projet. De plus, Application reoit de nombreux vnements qui sappliquent lapplication dans son ensemble. Par exemple, lvnement OnActivate vous permet de raliser des actions au dmarrage de lapplication, lvnement OnIdle vous permet dexcuter des traitements en arrire-plan lorsque lapplication nest

Conception de linterface utilisateur des applications

6-3

Contrle du comportement de lapplication

pas occupe, lvnement OnMessage vous permet dintercepter les messages Windows (sous Windows uniquement), lvnement OnEvent vous permet dintercepter des vnements, etc. Bien que vous ne puissiez pas utiliser lEDI pour examiner les proprits et les vnements de la variable globale Application, un autre composant, TApplicationEvents, intercepte les vnements et vous permet de fournir les gestionnaires dvnements laide de lEDI.

Gestion de lcran
Une variable globale de type TScreen, appele Screen, est cre lors de la cration dun projet. Screen encapsule ltat de lcran dans lequel lapplication sexcute. Parmi les fonctions imparties Screen, il y a la gestion de laspect du curseur, la taille de la fentre dans laquelle sexcute lapplication, la liste des fontes disponibles pour le priphrique cran. le comportement si plusieurs crans (non disponible en programmation multiplate-forme)

Si votre application Windows sexcute sur plusieurs moniteurs, Screen gre une liste des moniteurs et leurs dimensions afin que vous puissiez effectivement grer la disposition de linterface utilisateur. Lors de lutilisation de CLX pour la programmation multiplate-forme, le comportement par dfaut est le suivant : les applications crent un composant cran en fonction des informations concernant le priphrique dcran en cours et lassigne Screen.

Gestion de la disposition
A son niveau le plus lmentaire, vous contrlez lorganisation de votre interface utilisateur par la manire de disposer les contrles dans les fiches. Le choix des emplacements est reflt par les proprits Top, Left, Width et Height des contrles. Vous pouvez modifier ces valeurs lexcution afin de modifier la position ou la taille des contrles dans les fiches. Les contrles disposent de nombreuses autres proprits qui leur permettent de sadapter automatiquement leur contenu ou leur conteneur. Cela vous permet dorganiser les fiches de telle manire que les diffrents lments forment un tout unifi. Deux proprits contrlent la position et la taille dun contrle relativement celle de son parent. La proprit Align vous permet dobliger un contrle sadapter exactement un ct spcifi de son parent ou occuper toute la place disponible de la zone client du parent une fois les autres contrles aligns. Quand le parent est redimensionn, les contrles aligns sont automatiquement redimensionns et restent positionns le long dun ct donn du parent. Si vous voulez quun contrle reste positionn relativement un ct particulier de son parent sans toucher ce bord ou tre redimensionn pour occuper la totalit du ct, vous pouvez utiliser la proprit Anchors.

6-4

Guide du dveloppeur

Rponse aux notifications dvnement

Pour vous assurer qu un contrle ne devient ni trop grand ni trop petit, vous pouvez utiliser la proprit Constraints. Constraints vous permet de spcifier la hauteur maximum, la hauteur minimum, la largeur maximum et la largeur minimum du contrle. Initialisez ces valeurs afin de limiter la taille (en pixels) de la hauteur et de la largeur du contrle. Ainsi, en initialisant les contraintes MinWidth et MinHeight dun objet conteneur, vous tes certain que ses objets enfant sont toujours visibles. La valeur de Constraints se propage le long de la hirarchie parent/enfant de telle manire que la taille dun objet peut tre restreinte car il contient des enfants aligns qui ont des contraintes de taille. Constraints peut galement empcher un contrle dtre mis lchelle dans une dimension particulire lors de lappel de sa mthode ChangeScale. TControl introduit un vnement protg, OnConstrainedResize, de type TConstrainedResizeEvent :
TConstrainedResizeEvent = procedure(Sender: TObject; var MinWidth, MinHeight, MaxWidth, MaxHeight: Integer) of object;

Cet vnement vous permet de surcharger les contraintes de taille lors dune tentative de redimensionnement du contrle. Les valeurs des contraintes sont transmises comme paramtres var, elles peuvent donc tre modifies dans le gestionnaire dvnement. OnConstrainedResize est publi pour les objets conteneur (TForm, TScrollBox, TControlBar et TPanel). De plus, les concepteurs de composants peuvent utiliser ou publier cet vnement dans tout descendant de TControl. Les contrles dont le contenu peut changer de taille ont une proprit AutoSize qui force le contrle adapter sa taille lobjet ou la fonte quil contient.

Rponse aux notifications dvnement


Le systme dexploitation envoie une notification votre application lorsquun vnement se produit (un clic de souris, la frappe de touches, etc.) pendant son excution. La faon dont les notifications dvnement sont gres par les objets VCL et CLX est diffrente, mais la faon dont vous devez traiter ces notifications au niveau du composant est la mme. Les composants possdent des vnements et des mthodes intgrs pour rpondre aux vnements les plus frquents. Vous pouvez utiliser les mthodes fournies avec les composants dans la majorit des cas. Si vous avez besoin de grer des vnements supplmentaires, vous pouvez remplacer une mthode existante et crire la vtre. Sauf si vous crez vos propres composants, vous naurez pas modifier le schma de notification des vnements sous-jacent.
VCL

Si vous dveloppez des applications uniquement pour Windows, il vous faut comprendre que Windows est un systme dexploitation bas sur les messages. Les messages systme sont grs par un gestionnaire de message qui traduit le message en un vnement ou un gestionnaire dvnement. Le message luimme est un enregistrement transmis par Windows un contrle. Par exemple, quand vous cliquez sur un bouton de la souris dans une bote de dialogue,

Conception de linterface utilisateur des applications

6-5

Utilisation des fiches

Windows envoie au contrle actif un message et lapplication contenant ce contrle ragit ce nouvel vnement. Si vous avez cliqu sur un bouton, lvnement OnClick peut tre activ la rception du message. Si vous avez juste cliqu dans la fiche, lapplication peut ne pas tenir compte du message. Le type enregistrement transmis par Windows lapplication est appel un TMsg . Windows prdfinit une constante pour chaque message, ces valeurs sont stockes dans le champ de message de lenregistrement TMsg. Chacune de ces constantes commence par les lettres wm. La VCL gre automatiquement les messages sauf si vous surchargez le systme de gestion des messages et crez vos propres gestionnaires dvnements. Pour davantage dinformations sur les messages et la gestion des messages, voir Comprhension du systme de gestion des messages la page 46-1, Modification de la gestion des messages la page 46-3 et Cration de nouveaux gestionnaires de messages la page 46-5.
CLX

Pour la programmation multiplate-forme : La notification du systme dexploitation quil sest produit un vnement est envoye la couche widget Qt sous-jacente o il est traduit en un vnement et ventuellement en des objets vnement par HookEvents. EventFilter est appele automatiquement lorsquun vnement Qt li la souris ou au clavier doit tre gr par un contrle CLX. EventFilter ragit aux notifications dvnement en apportant la rponse par dfaut. Gnralement, cette rponse implique la transmission de lvnement la mthode virtuelle approprie (telle que la mthode Click, qui gnre un vnement OnClick).

Remarque CLX

Lors de la redfinition de la mthode EventFilter, vous devez appeler la mthode hrite afin que le traitement dvnement par dfaut puisse intervenir.

Utilisation des fiches


Quand vous crez une fiche Delphi dans lEDI, Delphi cre automatiquement la fiche en mmoire en ajoutant du code au point dentre principal de votre application. Cest gnralement le comportement souhait et vous navez donc rien y changer. Ainsi, la fiche principale existe pour toute la dure du programme, il est donc peu probable que vous changiez le comportement par dfaut de Delphi quand vous crez la fiche de votre fentre principale. Nanmoins, il nest pas toujours ncessaire de conserver en mmoire toutes les fiches de votre application pour toute la dure de lexcution du programme. Si vous ne souhaitez pas avoir tout le temps en mmoire toutes les botes de dialogue de votre application, vous pouvez les crer dynamiquement quand vous voulez les voir apparatre. Une fiche peut tre modale ou non modale. Les fiches modales sont des fiches avec lesquelles lutilisateur doit interagir avant de pouvoir passer une autre fiche (par exemple une bote de dialogue impose une saisie de lutilisateur). Les fiches non modales sont des fentres visibles tant qu elles ne sont pas masques par une autre fentre, fermes ou rduites par lutilisateur.

6-6

Guide du dveloppeur

Utilisation des fiches

Contrle du stockage en mmoire des fiches


Par dfaut, Delphi cre automatiquement en mmoire la fiche principale de lapplication en ajoutant le code suivant au point dentre principal de lapplication :
Application.CreateForm(TForm1, Form1);

Cette fonction cre une variable globale portant le mme nom que la fiche. Ainsi, chaque fiche dune application a une variable globale associe. Cette variable est un pointeur sur une instance de la classe de la fiche et sert dsigner la fiche durant lexcution de lapplication. Toute unit qui inclut lunit de la fiche dans sa clause uses peut accder la fiche par lintermdiaire de cette variable. Toutes les fiches cres de cette manire dans lunit du projet apparaissent quand le programme est excut et restent en mmoire durant toute lexcution de lapplication.

Affichage dune fiche cre automatiquement


Il est possible de crer une fiche au dmarrage, mais de ne lafficher que plus tard dans lexcution du programme. Les gestionnaires dvnements de la fiche utilisent la mthode ShowModal pour afficher une fiche dj charge en mmoire :
procedure TMainForm.Button1Click(Sender: TObject); begin ResultsForm.ShowModal; end;

Dans ce cas, comme la fiche est dj en mmoire, il nest pas ncessaire de crer une autre instance ou de dtruire cette instance.

Cration dynamique de fiche


Toutes les fiches de votre application nont pas besoin dtre en mmoire simultanment. Pour rduire la quantit de mmoire ncessaire au chargement de lapplication, vous pouvez crer certaines fiches uniquement quand vous en avez besoin. Ainsi, une bote de dialogue na besoin dtre en mmoire que pendant le temps o lutilisateur interagit avec elle. Pour spcifier dans lEDI que la fiche doit tre cre un autre moment pendant lexcution, procdez de la manire suivante :

1 Slectionnez Fichier|Nouvelle fiche dans le menu principal afin dafficher la nouvelle fiche. 2 Retirez la fiche de la liste Fiches cres automatiquement dans la page Fiches de Projet|Options.
Cela supprime lappel de la fiche. Vous pouvez galement retirer manuellement la ligne suivante au point dentre principal du programme :
Application.CreateForm(TResultsForm, ResultsForm);

3 Appelez la fiche au moment souhait en utilisant la mthode Show de la fiche si la fiche est non modale ou la mthode ShowModal si la fiche est modale.

Conception de linterface utilisateur des applications

6-7

Utilisation des fiches

Un gestionnaire dvnement de la fiche principale doit crer et dtruire une instance de la fiche appele ResultsForm dans lexemple prcdent. Une manire dappeler cette fiche consiste utiliser la variable globale comme dans le code suivant. Remarquez que ResultsForm tant une fiche modale, le gestionnaire utilise la mthode ShowModal :
procedure TMainForm.Button1Click(Sender: TObject); begin ResultsForm:=TResultForm.Create(self); try ResultsForm.ShowModal; finally ResultsForm.Free; end;

Dans lexemple prcdent, notez lutilisation de try..finally. Placer la ligne ResultsForm.Free; dans la clause finally garantit que la mmoire alloue la fiche est libre mme si la fiche dclenche une exception. Dans cet exemple, le gestionnaire dvnement supprime la fiche aprs sa fermeture, la fiche doit donc tre recre si vous avez besoin de ResultsForm ailleurs dans lapplication. Si la fiche tait affiche en utilisant Show, vous ne pourriez la supprimer dans le gestionnaire dvnement car, aprs lappel de Show, lexcution du code du gestionnaire se poursuit alors que la fiche est toujours ouverte.
Remarque

Si vous crez une fiche en utilisant son constructeur, assurez-vous que la fiche napparat pas dans la liste Fiches cres automatiquement de la page Fiches de la bote de dialogue Options de projet. En effet, si vous crez une nouvelle fiche sans avoir dtruit la fiche de mme nom dans la liste, Delphi cre la fiche au dmarrage et le gestionnaire dvnement cre une nouvelle instance de la fiche, ce qui remplace la rfrence linstance auto-cre. Linstance auto-cre existe toujours mais lapplication ny a plus accs. A la fin du gestionnaire dvnement, la variable globale ne pointe plus sur une fiche valide. Toute tentative dutiliser la variable globale entranera probablement le blocage de lapplication.

Cration de fiches non modales comme fentres


Vous devez vous assurer que les variables dsignant des fiches non modales existent tant que la fiche est utilise. Cela signifie que ces variables doivent avoir une porte globale. Le plus souvent, vous utiliserez la variable globale rfrenant la fiche qui a t cre quand vous avez ajout la fiche (le nom de variable qui correspond la valeur de la proprit Name de la fiche). Si votre application a besoin dautres instances de la fiche, dclarez des variables globales distinctes pour chaque instance.

Utilisation dune variable locale pour crer une instance de fiche


Un moyen fiable de crer une seule instance dune fiche modale consiste utiliser une variable locale du gestionnaire dvnement comme rfrence la nouvelle instance. Si une variable locale est employe, il importe peu que ResultsForm soit

6-8

Guide du dveloppeur

Utilisation des fiches

ou non auto-cre. Le code du gestionnaire dvnement ne fait pas rfrence la variable fiche globale. Par exemple :
procedure TMainForm.Button1Click(Sender: TObject); var RF:TResultForm; begin RF:=TResultForm.Create(self) RF.ShowModal; RF.Free; end;

Remarquez que linstance globale de la fiche nest jamais utilise dans cette version du gestionnaire dvnement. Habituellement, les applications utilisent les instances globales des fiches. Cependant, si vous avez besoin dune nouvelle instance dune fiche modale alors que vous utilisez cette fiche dans une portion rduite de votre application (par exemple dans une seule fonction), une instance locale est normalement le moyen le plus rapide et le plus fiable de manipuler la fiche. Bien entendu, vous ne pouvez pas utiliser de variables locales pour les fiches non modales dans les gestionnaires dvnements car elles doivent avoir une porte globale pour garantir que la fiche existe aussi longtemps quelle est utilise. Show rend la main ds que la fiche est ouverte, donc si vous utilisez une variable locale, la variable locale sort de porte immdiatement.

Transfert de paramtres supplmentaires aux fiches


Gnralement, vous crez les fiches de votre application en utilisant lEDI. Quand elle est cre ainsi, la fiche a un constructeur qui prend un argument, Owner, qui est le propritaire de la fiche cre. (Le propritaire est lobjet application ou lobjet fiche appelant.) Owner peut avoir la valeur nil. Pour transmettre dautres paramtres la fiche, crez un constructeur diffrent et instanciez la fiche en utilisant ce nouveau constructeur. La classe fiche exemple suivante utilise un constructeur supplmentaire proposant le paramtre supplmentaire whichButton. Il faut ajouter manuellement ce nouveau constructeur la fiche.
TResultsForm = class(TForm) ResultsLabel: TLabel; OKButton: TButton; procedure OKButtonClick(Sender: TObject); private public constructor CreateWithButton(whichButton: Integer; Owner: TComponent); end;

Voici le code, cr manuellement, de ce constructeur qui passe le paramtre supplmentaire whichButton. Ce constructeur utilise le paramtre whichButton pour initialiser la proprit Caption dun contrle Label de la fiche.
constructor CreateWithButton(whichButton: Integer; Owner: TComponent);

Conception de linterface utilisateur des applications

6-9

Utilisation des fiches

begin inherited Create(Owner); case whichButton of 1: ResultsLabel.Caption := Vous avez choisi le premier bouton.; 2: ResultsLabel.Caption := Vous avez choisi le deuxime bouton.; 3: ResultsLabel.Caption := Vous avez choisi le troisime bouton.; end; end;

Quand vous crez une instance dune fiche disposant de plusieurs constructeurs, vous pouvez slectionner le constructeur le mieux adapt vos besoins. Par exemple, le gestionnaire OnClick suivant dun bouton de la fiche cre une instance de TResultsForm en utilisant le paramtre supplmentaire :
procedure TMainForm.SecondButtonClick(Sender: TObject); var rf: TResultsForm; begin rf := TResultsForm.CreateWithButton(2, self); rf.ShowModal; rf.Free; end;

Rcupration des donnes des fiches


La plupart des applications relles utilisent plusieurs fiches. Bien souvent, il est ncessaire de transmettre des informations entre ces diffrentes fiches. Il est possible de transmettre des informations une fiche sous la forme des paramtres du constructeur de la fiche destination ou en affectant des valeurs aux proprits de la fiche. La mthode utiliser pour obtenir des informations dune fiche change selon que la fiche est ou non modale.

Rcupration de donnes dans les fiches non modales


Il est facile dextraire des informations de fiches non modales en appelant des fonctions membre publiques de la fiche ou en interrogeant ses proprits. Soit, par exemple, une application contenant une fiche non modale appele ColorForm qui contient une bote liste appele ColorListBox contenant une liste de couleurs (Rouge, Vert, Bleu, etc.). Le nom de couleur slectionn dans ColorListBox est automatiquement stock dans une proprit appele CurrentColor chaque fois que lutilisateur slectionne une nouvelle couleur. La dclaration de classe pour la fiche est la suivante :
TColorForm = class(TForm) ColorListBox:TListBox; procedure ColorListBoxClick(Sender: TObject); private FColor:String; public property CurColor:String read FColor write FColor; end;

6-10

Guide du dveloppeur

Utilisation des fiches

Le gestionnaire dvnement OnClick de la bote liste, ColorListBoxClick, initialise la valeur de la proprit CurrentColor chaque fois quun nouvel lment est slectionn. Le gestionnaire dvnement obtient la chane dans la bote liste qui contient le nom de couleur et laffecte CurrentColor. La proprit CurrentColor utilise la fonction daffectation, SetColor, pour stocker la valeur relle de la proprit dans la donne membre prive FColor :
procedure TColorForm.ColorListBoxClick(Sender: TObject); var Index: Integer; begin Index := ColorListBox.ItemIndex; if Index >= 0 then CurrentColor := ColorListBox.Items[Index] else CurrentColor := ; end;

Supposons maintenant quune autre fiche de lapplication, appele ResultsForm, a besoin de connatre la couleur actuellement slectionne dans ColorForm chaque fois quun bouton (nomm UpdateButton) de ResultsForm est choisi. Le gestionnaire dvnement OnClick de UpdateButton doit avoir la forme suivante :
procedure TResultForm.UpdateButtonClick(Sender: TObject); var MainColor: String; begin if Assigned(ColorForm) then begin MainColor := ColorForm.CurrentColor; {faire quelque chose avec la chane MainColor} end; end;

Le gestionnaire dvnement commence par vrifier que ColorForm existe en utilisant la fonction Assigned. Ensuite, il obtient la valeur de la propri t CurrentColor de ColorForm. En procdant autrement, si ColorForm a une fonction publique appele GetColor, une autre fiche peut obtenir la couleur en cours sans utiliser la proprit CurrentColor (par exemple, MainColor := ColorForm.GetColor;). En fait, rien nempche lautre fiche dobtenir la couleur slectionne dans ColorForm en examinant directement la valeur slectionne dans la bote liste :
with ColorForm.ColorListBox do MainColor := Items[ItemIndex];

Nanmoins, lutilisation dune proprit rend linterface avec ColorForm trs claire et simple. Tout ce qu une fiche a besoin de savoir sur ColorForm, cest comment rcuprer la valeur de CurrentColor.

Conception de linterface utilisateur des applications

6-11

Utilisation des fiches

Rcupration de donnes dans les fiches modales


Tout comme les fiches non modales, les fiches modales contiennent souvent des informations ncessaires dautres fiches. Dans le cas de figure la plus classique, une fiche A lance la fiche modale B. Lors de la fermeture de B, la fiche A a besoin de savoir ce que lutilisateur a fait dans la fiche B pour dcider comment poursuivre les traitements de la fiche A. Si la fiche B est toujours en mmoire, il est possible de linterroger via ses proprits et ses fonctions membres tout comme les fiches non modales de lexemple prcdent. Mais comment faire si la fiche B est retire de la mmoire une fois ferme ? Comme une fiche ne renvoie pas explicitement de valeur, il est ncessaire de prserver les informations importantes de la fiche avant de la dtruire. Pour illustrer cette manire de procder, considrez une version modifie de la fiche ColorForm conue comme une fiche modale. Sa classe est dclare de la manire suivante :
TColorForm = class(TForm) ColorListBox:TListBox; SelectButton: TButton; CancelButton: TButton; procedure CancelButtonClick(Sender: TObject); procedure SelectButtonClick(Sender: TObject); private FColor: Pointer; public constructor CreateWithColor(Value: Pointer; Owner: TComponent); end;

La fiche contient une bote liste nomme ColorListBox contenant une liste de noms de couleur. Quand il est choisi, le bouton nomm SelectButton mmorise le nom de la couleur slectionne dans ColorListBox puis ferme la fiche. CancelButton est un bouton qui ferme simplement la fiche. Remarquez lajout la dclaration de la classe dun constructeur dfini par lutilisateur qui attend un argument Pointer. Normalement, ce paramtre Pointer pointe sur une chane gre par la fiche qui dclenche ColorForm. Ce constructeur a limplmentation suivante :
constructor TColorForm(Value: Pointer; Owner: TComponent); begin FColor := Value; String(FColor^) := ; end;

Le constructeur enregistre le pointeur dans une donne membre prive FColor et initialise la chane avec une chane vide.
Remarque

Pour utiliser ce constructeur dfini par lutilisateur, la fiche doit tre cre explicitement. Ce ne peut pas tre une fiche auto-cre au dmarrage de lapplication. Pour davantage dinformations, voir Contrle du stockage en mmoire des fiches la page 6-7. Dans lapplication, lutilisateur slectionne une couleur dans la bote liste puis clique sur le bouton SelectButton pour enregistrer son choix et fermer la fiche. Le

6-12

Guide du dveloppeur

Utilisation des fiches

gestionnaire dvnement OnClick du bouton SelectButton doit avoir la forme suivante :


procedure TColorForm.SelectButtonClick(Sender: TObject); begin with ColorListBox do if ItemIndex >= 0 then String(FColor^) := ColorListBox.Items[ItemIndex]; end; Close; end;

Remarquez comment le gestionnaire dvnement stocke le nom de couleur slectionn dans la chane rfrence par le pointeur qui a t transmise au constructeur. Pratiquement, pour utiliser ColorForm, la fiche appelante doit transmettre au constructeur un pointeur sur une chane existante. Supposons par exemple que ColorForm est instancie par une fiche appele ResultsForm en rponse au choix dun bouton de ResultsForm nomm UpdateButton. Le gestionnaire dvnement de ce bouton doit avoir la forme suivante :
procedure TResultsForm.UpdateButtonClick(Sender: TObject); var MainColor: String; begin GetColor(Addr(MainColor)); if MainColor <> then {faire quelque chose avec la chane MainColor} else {faire autre chose car aucune couleur na t slectionne} end; procedure GetColor(PColor: Pointer); begin ColorForm := TColorForm.CreateWithColor(PColor, Self); ColorForm.ShowModal; ColorForm.Free; end;

UpdateButtonClick cre une chane nomme MainColor. Ladresse de MainColor est transmise la fonction GetColor qui cre ColorForm en transmettant comme argument au constructeur un pointeur sur MainColor. D s que ColorForm est ferme, elle est dtruite mais le nom de la couleur slectionne, sil y en a une, est prserv dans MainColor. Sinon, MainColor contient une chane vide, ce qui indique clairement que lutilisateur est sorti de ColorForm sans slectionner une couleur. Cet exemple utilise une variable chane pour stocker des informations provenant de la fiche modale. Il est possible dutiliser des objets plus complexes en fonction de vos besoins. Noubliez jamais quil faut laisser la fiche appelante un moyen de savoir que la fiche modale a t ferme sans modification, ni slection (dans lexemple prcdent en attribuant par dfaut MainColor une chane vide).

Conception de linterface utilisateur des applications

6-13

Rutilisation des composants et des groupes de composants

Rutilisation des composants et des groupes de composants


Delphi offre diffrentes possibilits denregistrer et de rutiliser le travail ralis avec les composants : Les modles de composants procurent une faon simple et rapide de configurer et denregistrer des groupes de composants. Voir Cration et utilisation des modles de composants la page 6-14. Vous pouvez enregistrer les fiches, les modules de donnes et les projets dans le Rfrentiel. Vous disposez ainsi dune base de donnes centrale compose dlments rutilisables et vous pouvez utiliser lhritage de fiche pour diffuser les modifications. Voir Utilisation du rfrentiel dobjets la page 5-22. Vous pouvez enregistrer des cadres sur la palette de composants ou dans le rfrentiel. Les cadres utilisent lhritage de fiche et peuvent tre incorpors dans des fiches ou dans dautres cadres. Voir Manipulation des cadres la page 6-15. Crer un composant personnalis est la manire la plus complexe de rutiliser du code, mais cest celle qui procure le plus de souplesse. Voir chapitre 40, Prsentation gnrale de la cration dun composant.

Cration et utilisation des modles de composants


Vous pouvez crer des modles composs dun ou de plusieurs composants. Aprs avoir organis les composants sur une fiche, dfini leurs proprits et crit du code pour eux, enregistrez-les sous la forme dun modle de composant. Par la suite, en slectionnant le modle dans la palette de composants, vous pouvez placer les composants prconfigurs sur une fiche en une seule tape ; toutes les proprits et tout le code de gestion dvnement associs sont simultanment ajouts votre projet. Une fois que vous avez plac un modle sur une fiche, vous pouvez repositionner les composants indpendamment les uns des autres, redfinir leurs proprits et crer ou modifier Les gestionnaires dvnements qui leur sont associs comme si vous placiez chaque composant un par un. Pour crer un modle de composant,

1 Placez et organisez des composants sur une fiche. Dans linspecteur dobjets, dfinissez leurs proprits et leurs vnements comme souhait. 2 Slectionnez les composants. La manire la plus simple de slectionner plusieurs composants consiste faire glisser le pointeur de la souris au-dessus deux. Des poignes grises apparaissent dans les coins de chaque composant slectionn. 3 Choisissez Composant|Crer un modle de composant. 4 Spcifiez un nom pour le modle dans la bote texte Nom de composant. Le nom propos par dfaut est le type du premier composant slectionn ltape 2 suivi du mot Template. Par exemple, si vous slectionnez un libell

6-14

Guide du dveloppeur

Manipulation des cadres

puis une bote texte, le nom propos est TLabelTemplate. Vous pouvez modifier ce nom, en veillant ne pas utiliser un nom de composant existant.

5 Dans la bote texte Page de palette, spcifiez la page de la palette de composants dans laquelle vous souhaitez placer le modle. Si vous spcifiez une page qui nexiste pas, une nouvelle page est cre lorsque vous enregistrez le modle. 6 Sous Icne de palette, slectionnez une image bitmap pour reprsenter le modle sur la palette. Limage bitmap propose par dfaut est celle utilise par le type du premier composant slectionn ltape 2. Pour rechercher dautres images bitmap, cliquez sur Changer. Les dimensions de limage bitmap que vous choisissez ne doivent pas dpasser 24 pixels sur 24 pixels. 7 Choisissez OK.
Pour supprimer des modles de la palette de composants, choisissez Composant|Configurer la palette.

Manipulation des cadres


Un cadre (TFrame), comme une fiche, est un conteneur pour dautres composants. Il utilise le mme mcanisme de possession que les fiches lorsque les composants y sont instancis et dtruits automatiquement, et la mme relation parent-enfant pour la synchronisation des proprits de composants. A divers gards, un cadre sapparente davantage un composant personnalis qu une fiche. Les cadres peuvent tre enregistrs sur la palette de composants pour en faciliter la rutilisation et imbriqus dans des fiches, dans dautres cadres ou autres objets conteneur. Une fois quun cadre a t cr et enregistr, il continue de fonctionner comme une unit et dhriter des modifications des composants quil contient (y compris dautres cadres). Lorsquun cadre est incorpor dans un autre cadre ou dans une fiche, il continue dhriter des modifications apportes au cadre dont il drive. Les cadres servent organiser les groupes de contrles utiliss en plusieurs endroits de votre application. Par exemple, si vous avez un bitmap utilis par plusieurs fiches, vous pouvez le placer dans un cadre afin qu une seule copie de ce bitmap soit incluse dans les ressources de votre application. Vous pouvez galement dcrire un ensemble de champs de saisie servant modifier une table avec un cadre et lutiliser chaque fois que vous souhaitez entrer les donnes de la table.

Cration des cadres


Pour crer un cadre vide, choisissez Fichier|Nouveau cadre, ou Fichier|Nouveau et double-cliquez sur Cadre. Vous pouvez alors dposer des composants (y compris dautres cadres) sur le nouveau cadre.

Conception de linterface utilisateur des applications

6-15

Manipulation des cadres

Il est gnralement prfrable, bien que non ncessaire, denregistrer les cadres en tant que partie dun projet. Si vous souhaitez crer un projet ne contenant que des cadres et aucune fiche, choisissez Fichier|Nouveau|Application, fermez la nouvelle fiche et la nouvelle unit sans les enregistrer, puis choisissez Fichier| Nouveau|Cadre et enregistrez le projet.
Remarque

Lorsque vous enregistrez des cadres, vitez dutiliser les noms par dfaut Unit1, Project1 etc., car ils peuvent tre la source de conflits au moment de lutilisation ultrieure des cadres. A la conception, vous pouvez afficher nimporte quel cadre contenu dans le projet en cours en choisissant Voir|Fiches et en slectionnant le cadre. Comme dans le cas des fiches et des modules de donnes, vous pouvez passer du concepteur de fiche au fichier fiche du cadre en cliquant avec le bouton droit et en choisissant Voir comme fiche ou Voir comme texte.

Ajout de cadres la palette de composants


Les cadres sont ajouts la palette de composants comme les modles de composants. Pour ajouter un cadre la palette de composants, ouvrez le cadre dans le concepteur de fiche (vous ne pouvez pas utiliser un cadre incorpor dans un autre composant), cliquez avec le bouton droit sur le cadre et choisissez Ajouter la palette. Lorsque la bote de dialogue Information modle de composant souvre, slectionnez un nom, une page de palette et une icne pour le nouveau modle.

Utilisation et modification des cadres


Pour utiliser un cadre dans une application, vous devez le placer, directement ou indirectement, sur une fiche. Vous pouvez ajouter des cadres directement sur des fiches, sur dautres cadres ou sur dautres objets conteneur, comme des volets et des botes de dfilement. Le concepteur de fiche permet dajouter un cadre une application de deux manires : Slectionnez un cadre partir de la palette de composants et dposez-le sur une fiche, un autre cadre ou un autre objet conteneur. Si ncessaire, le concepteur de fiche demande sil est possible dinclure le fichier unit du cadre dans votre projet. Slectionnez Cadres partir de la page Standard de la palette de composants et cliquez sur une fiche ou un autre cadre. Une bote de dialogue souvre sur une liste de cadres figurant dj dans votre projet ; slectionnez-en un et cliquez sur OK. Lorsque vous dposez un cadre sur une fiche ou un autre conteneur, Delphi dclare une nouvelle classe qui descend du cadre que vous avez slectionn. De mme, lorsque vous ajoutez une nouvelle fiche un projet, Delphi dclare une nouvelle classe qui descend de TForm. Cela signifie que les modifications apportes ultrieurement au cadre dorigine (anctre) sont rpercutes sur le

6-16

Guide du dveloppeur

Manipulation des cadres

cadre incorpor, mais que les modifications apportes au cadre incorpor ne sont pas rpercutes sur le cadre anctre. Supposons que vous souhaitiez regrouper des composants daccs aux donnes et des contrles orients donnes en vue dune utilisation frquente, ventuellement dans plusieurs applications. Pour ce faire, vous pourriez rassembler les composants dans un modle de composant ; mais si vous commencez utiliser le modle et changez davis ultrieurement sur lorganisation des contrles, vous devez faire marche arrire et modifier manuellement dans chaque projet la partie sur laquelle le modle a t plac. Par contre, si vous placez vos composants base de donnes dans un cadre, les modifications ultrieures ne doivent tre apportes que dans un seul endroit ; les modifications apportes un cadre dorigine sont automatiquement rpercutes sur ses descendants incorpors lors de la recompilation des projets. Paralllement, vous pouvez modifier nimporte quel cadre incorpor sans affecter le cadre dorigine ni aucun de ses descendants incorpors. La seule restriction la modification des cadres incorpors est que vous ne pouvez pas leur ajouter des composants.
Figure 6.1 Cadre avec des contrles orients donnes et un composant source de donnes

Outre une simplification de gestion, les cadres procurent une efficacit supplmentaire dans lutilisation des ressources. Par exemple, pour utiliser une image bitmap ou un autre graphique dans une application, vous pouvez charger le graphique dans la proprit Picture dun contrle TImage. Toutefois, si vous utilisez frquemment le mme graphique dans une application, chaque objet Image que vous placez sur une fiche gnre une autre copie du graphique ajout au fichier ressource de la fiche. Cela est galement vrai si vous dfinissez TImage.Picture une fois et enregistrez le contrle Image en tant que modle de composant. Une meilleure solution consiste dposer lobjet Image sur un cadre, y charger le graphique puis utiliser le cadre l o vous souhaitez que le graphique apparaisse. Cela gnre des fichiers fiche moins volumineux et prsente en outre la possibilit de modifier le graphique partout o il figure en modifiant lobjet Image sur le cadre dorigine.

Partage des cadres


Vous pouvez partager un cadre avec les autres dveloppeurs de deux manires : Ajouter le cadre au rfrentiel dobjet. Distribuer lunit du cadre (.pas) et les fichiers fiche (.dfm ou .xfm).

Conception de linterface utilisateur des applications

6-17

Organisation des actions pour les barres doutils et les menus

Pour ajouter un cadre au rfrentiel, ouvrez nimporte quel projet contenant le cadre, cliquez avec le bouton droit dans le concepteur de fiche et choisissez Ajouter au rfrentiel. Pour plus dinformations, voir Utilisation du rfrentiel dobjets la page 5-22. Si vous envoyez une unit de cadre et les fichiers fiche dautres dveloppeurs, ils peuvent les ouvrir et les ajouter la palette de composants. Si le cadre contient dautres cadres, ils devront louvrir en tant que partie dun projet.

Organisation des actions pour les barres doutils et les menus


Delphi offre plusieurs fonctionnalits qui simplifieront votre travail de cration, de personnalisation et de maintenance des menus et des barres doutils. Ces fonctionnalits vous permettent dorganiser les listes des actions que les utilisateurs de votre application peuvent dclencher en appuyant sur un bouton dans une barre doutils, en choisissant une commande dans un menu ou en cliquant sur une icne. Trs souvent, un mme ensemble dactions est utilis pour plusieurs lments de linterface utilisateur. Par exemple, les commandes Couper, Copier et Coller apparaissent frquemment la fois dans un menu Edition et dans une barre doutils. Il vous suffit dajouter laction une fois pour lutiliser dans plusieurs lments de linterface utilisateur de votre application. Sur la plate-forme Windows, il existe des outils pour vous aider dfinir et grouper les actions, crer diverses dispositions et personnaliser les menus lors de la conception ou de lexcution. Ces outils sont appels outils ActionBand, les menus et les barres doutils que vous crez en les utilisant sont appels bandes daction. En gnral, vous pouvez crer une interface utilisateur ActionBand comme suit : Construisez une liste dactions afin de crer un ensemble dactions disponibles pour votre application (utilisez le gestionnaire dactions, TActionManager) Ajoutez les lments de linterface utilisateur lapplication (utilisez des composants ActionBand comme TActionMainMenuBaret TActionToolBar) Glissez-dplacez des actions du gestionnaire dactions aux lments de linterface utilisateur

6-18

Guide du dveloppeur

Organisation des actions pour les barres doutils et les menus

Le tableau suivant dfinit la terminologie qui sapplique la dfinition des menus et des barres doutils :
Tableau 6.1 Terme
Action

Terminologie de la dfinition des actions Dfinition


Une rponse ce que fait lutilisateur, comme cliquer sur un lment de menu. De nombreuses actions standard frquement ncessaires sont fournies ; vous pouvez les utiliser telles quelles dans vos applications. Par exemple, sont incluses les oprations sur les fichiers, comme ouvrir, enregistrer sous, excuter et quitter, ainsi que de nombreuses autres pour ldition, le formatage, la recherche, les dialogues ou les actions sur les fentres. Vous pouvez galement programmer des actions personnalises et utiliser les listes et le gestrionnaire dactions pour y accder. Un conteneur pour un ensemble dactions associ un menu ou une barre doutils personnaliss. Les composants ActionBand pour les menus principaux et les barres doutils (TActionMainMenuBar et TActionToolBar) sont des exemples de bandes daction. Vous permet de grouper des actions et de les introduire en tant que groupe dans un menu ou une barre doutils. Par exemple, une des catgories dactions standard, Search, inclut les actions Find, FindFirst, FindNext et Replace et les ajoute toutes en mme temps. Les classes qui ralisent les actions utilises dans votre application. Toutes les actions standard sont dfinies dans des classes dactions comme TEditCopy, TEditCut et TEditUndo. Vous pouvez utiliser ces classes en les faisant glisser de la bote de dialogue Personnalisation une bande daction. Reprsente la plupart du temps llment de menu ou le bouton qui reoit une notification pour dclencher une action. Quand le client reoit une commande utilisateur (par exemple, un clic de souris), il initie une action associe. Maintiennent la liste des actions par lesquelles votre application rpond ce que fait lutilisateur. Groupe et organise des ensembles logiques dactions pouvant tre rutiliss dans les composants ActionBand. Voir TActionManager. Prsente la liste des commandes que lutilisateur de lapplication peut excuter en cliquant dessus. Vous pouvez crer des menus en utilisant la classe menu ActionBand TActionMainMenuBar, ou en utilisant des composants multiplates-formes comme TMainMenu ou TPopupMenu. Reprsente llment auquel sapplique laction. La cible est gnralement un contrle, par exemple un mmo ou un contrle de donnes. Certaines actions nont pas de cible. Ainsi, les actions standard daide ne tiennent pas compte de la cible mais dmarrent simplement le systme daide. Affiche une ligne visible dicnes de boutons qui, lorsque lutilisateur clique dessus, font accomplir au programme une action, comme imprimer le document en cours. Vous pouvez crer des barres doutils en utilisant le composant barre doutils ActionBand TActionToolBar, ou en utilisant le composant multiplate-forme TToolBar.

Bande daction

Catgories dactions

Classes dactions

Client action

Liste dactions Gestionnaire dactions Menu

Cible

Barre doutils

Si vous dveloppez pour plusieurs plates-formes, reportez-vous Utilisation des listes dactions la page 6-26.

Conception de linterface utilisateur des applications

6-19

Organisation des actions pour les barres doutils et les menus

Quest-ce quune action ?


Pendant que vous dveloppez votre application, vous pouvez crer un ensemble dactions utilisables dans divers lments de linterface utilisateur. Vous pouvez les organiser en catgories et les insrer dans un menu en tant quensemble (par exemple, Couper, Copier et Coller) ou un seul la fois (par exemple, Outils| Personnaliser). Une action correspond un ou plusieurs lments de linterface utilisateur, comme les commandes de menu ou les boutons des barres doutils. Les actions ont deux utilits : (1) elles reprsentent des proprits communes des lments de linterface utilisateur, par exemple ltat dun contrle activ ou coch, et (2) elles rpondent lorsquun contrle est dclench, comme lorsque lutilisateur de lapplication clique sur un bouton ou choisit un lment de menu. Vous pouvez crer un catalogue dactions disponibles dans votre application via des menus, des boutons, des barres doutils, des menus contextuels, etc. Les actions sont associes dautres composants : Clients : Un ou plusieurs clients utilisent laction. Le client souvent reprsente un lment de menu ou un bouton (par exemple, TToolButton, TSpeedButton, TMenuItem, TButton, TCheckBox, TRadioButton, etc.). Des actions se trouvent galement dans les composants ActionBand comme TActionMainMenuBar et TActionToolBar. Quand le client reoit une commande de lutilisateur (par exemple, un clic de souris), il initie une action associe. Gnralement, lvnement OnClick dun client est associ lvnement Execute de son action. Cible : Laction agit sur la cible. La cible est gnralement un contrle, par exemple un mmo ou un contrle de donnes. Les dveloppeurs de composants peuvent crer des actions spcifiques aux besoins des contrles quils conoivent et utilisent, puis empaqueter ces units pour crer des applications plus modulaires. Certaines actions nont pas de cible. Ainsi, les actions standard daide ne tiennent pas compte de la cible mais dmarrent simplement le systme daide. Une cible peut galement tre un composant. Par exemple, les contrles de donnes changent la cible par un ensemble de donnes associ. Le client influence laction laction rpond lorsquun client dclenche laction. Laction influence galement le client les proprits des actions mettent jour dynamiquement les proprits des clients. Par exemple, si, lexcution, une action est dsactive (en dfinissant sa proprit Enabled par False), chaque client de cette action est dsactiv et apparat estomp . Vous pouvez ajouter, supprimer et rorganiser des actions en utilisant le gestionnaire dactions ou lditeur de liste dactions (qui saffiche lorsque vous double-cliquez sur un objet liste dactions, TActionList). Ces actions sont ensuite connectes aux contrles client.

6-20

Guide du dveloppeur

Organisation des actions pour les barres doutils et les menus

Dfinition des bandes daction


Les actions ne conservant aucune information de disposition (ni apparence ni position), Delphi propose les bandes daction capables de stocker ces donnes. Les bandes daction fournissent un mcanisme permettant de spcifier des informations de disposition et un jeu de contrles. Vous pouvez afficher les actions comme des lments de linterface utilisateur tels que barres doutils ou menus. Vous organisez des ensembles dactions en utilisant le gestionnaire dactions (TActionManager). Vous pouvez soit utiliser des actions standard soit crer les vtres. Crez ensuite les bandes daction : Utilisez TActionMainMenuBarpour crer un menu principal. Utilisez TActionToolBar pour crer une barre doutils. Les bandes daction agissent comme conteneurs qui contiennent et affichent les ensembles dactions. Pendant la conception, vous pouvez glisser-dplacer des lments de lditeur du gestionnaire dactions la bande daction. A lexcution, les utilisateurs peuvent galement personnaliser les menus ou les barres doutils de lapplication en utilisant une bote de dialogue semblable lditeur du gestionnaire dactions.

Cration des barres doutils et des menus


Remarque

Cette section dcrit la mthode recommande pour crer des menus et des barres doutils dans les applications Windows. Pour le dveloppement multiplate-forme, vous devez utiliser TToolBar et les composants menu, comme TMainMenu, et les organiser en utilisant les listes dactions (TActionList). Voir Dfinition des listes dactions la page 6-26. Vous utilisez le gestionnaire dactions pour gnrer automatiquement des barres doutils et des menus principaux en fonction des actions contenues dans votre application. Le gestionnaire dactions gre les actions standard ainsi que les actions personnalises que vous aurez ventuellement crites. Crez ensuite les lments de linterface utilisateur bass sur ces actions et utilisez les bandes daction pour afficher ces lments daction en tant qulments dans un menu ou en tant que boutons dans une barre doutils. La procdure gnrale de cration des menus, barres doutils et autres bandes daction comporte les tapes suivantes : Placer un gestionnaire dactions sur une fiche. Ajouter des actions au gestionnaire dactions, qui les organise en listes dactions adaptes. Crer les bandes daction (cest--dire, le menu ou la barre doutils) pour linterface utilisateur.

Conception de linterface utilisateur des applications

6-21

Organisation des actions pour les barres doutils et les menus

Placer les actions dans linterface de lapplication par glisser-dplacer. La procdure suivante dcrit ces tapes en dtail : Pour crer des menus et des barres doutils en utilisant les bandes daction :

1 Depuis la page Supplment de la palette de composants, placez un composant gestionnaire dactions (TActionManager) sur la fiche dans laquelle vous voulez crer la barre doutils ou le menu. 2 Si vous voulez quil y ait des images sur le menu ou la barre doutils, placez sur la fiche un composant liste dimages (ImageList) en le prenant dans la page Win32 de la palette de composants. (Vous devez ajouter les images que vous souhaitez utiliser cette liste dimages ou utilisez les images fournies.) 3 Depuis la page Supplment de la palette de composants, placez sur la fiche un ou plusieurs des bandes daction suivantes :
TActionMainMenuBar (pour concevoir des menus principaux) TActionToolBar (pour concevoir des barres doutils)

4 Connectez la liste dimages au gestionnaire dactions : la focalisation tant sur le gestionnaire dactions, slectionnez dans linspecteur dobjets le nom de la liste dimages dans la proprit Images. 5 Ajoutez des actions au volet action de lditeur du gestionnaire dactions :
Double-cliquez sur le gestionnaire dactions afin dafficher lditeur du gestionnaire dactions. Cliquez sur la flche droulante situe ct du bouton Nouvelle action (le bouton le plus gauche dans le coin suprieur droit de la page Actions, comme illustr par la figure 6.2) et slectionnez Nouvelle action... ou Nouvelle action standard.... Une vue arborescente saffiche. Ajoutez une ou plusieurs actions, ou catgories dactions, au volet actions du gestionnaire dactions. Le gestionnaire dactions ajoute les actions ses listes dactions.
Figure 6.2 Lditeur du gestionnaire dactions.
Bouton Nouvelle action & bouton droulant

6-22

Guide du dveloppeur

Organisation des actions pour les barres doutils et les menus

6 Glissez-dplacez des actions indpendantes, ou des catgories dactions, de lditeur du gestionnaire dactions au menu ou la barre doutils que vous concevez.
Pour ajouter des actions dfinies par lutilisateur, crez une nouvelle TAction en cliquant sur le bouton Nouvelle action et en crivant le gestionnaire dvnement qui dfinit la rponse quelle donnera son dclenchement. Voir Que se passet-il lors du dclenchement dune action ? la page 6-27, pour plus de dtails. Lorsque vous avez dfini les actions, vous pouvez les placer dans les menus ou les barres doutils par glisser-dplacer comme les actions standard.

Ajout de couleurs, de motifs ou dimages aux menus, boutons et barres doutils


Vous pouvez utiliser les proprits Background et BackgroundLayout pour spcifier la couleur, le motif ou le bitmap utiliser sur un lment de menu ou un bouton. Ces proprits vous permettent galement de dfinir une bannire qui se place gauche ou droite dun menu. Assignez des fonds et des dispositions aux sous-lments partir de leurs objets client action. Si vous voulez dfinir le fond des lments dun menu, cliquez dans le concepteur de fiches sur llment de menu qui contient ces lments. Par exemple, slectionner Fichier vous permet de changer le fond des lments apparaissant dans le menu Fichier. Vous pouvez attribuer une couleur, un motif, ou un bitmap la proprite Background dans linspecteur dobjets. Utilisez la proprit BackgroundLayout pour dcrire comment placer le fond sur llment. Les couleurs ou les images peuvent tre places derrire le libell normalement, tires pour remplir la zone, ou en mosaque de petits carrs recouvrant toute la zone. Les lments dont le fond est normal (blNormal), tir (blStretch), ou en mosaque (blTile) sont affichs avec un fond transparent. Si vous crez une bannire, limage complte est place gauche (blLeftBanner) ou droite (blRightBanner) de llment. Vous devez vous assurer que la taille convient car elle nest ni rduite ni agrandie. Pour modifier le fond dune bande daction (cest--dire, dans un menu principal ou une barre doutils) slectionnez la bande daction et choisissez la TActionClientBar via lditeur de collection de bandes daction. Vous pouvez dfinir les proprits Background et BackgroundLayout pour spcifier la couleur, le motif ou le bitmap utiliser sur toute la barre doutils ou tout le menu.

Ajout dicnes aux menus et aux barres doutils


Vous pouvez ajouter des icnes ct des lments de menu ou remplacer les libells figurant dans les barres doutils par des icnes. Vous organiserez les bitmaps ou les icnes au moyen dune liste dimages.

1 A partir de la page Win32 de la palette de composants, placez sur la fiche un composant liste dimages.

Conception de linterface utilisateur des applications

6-23

Organisation des actions pour les barres doutils et les menus

2 Ajoutez la liste dimages les images que vous voulez utiliser. Double-cliquez sur la liste dimages. Cliquez sur Ajouter et naviguez jusquaux images que vous voulez utiliser ; cliquez sur OK lorsque vous en avez termin. Vous trouverez des exemples dimages dans Program Files\Common Files\Borland Shared\Images. (Les images des boutons comprennent deux vues pour les tats actif et inactif des boutons.) 3 Depuis la page Supplment de la palette de composants, placez sur la fiche un ou plusieurs des bandes daction suivantes :
TActionMainMenuBar (pour concevoir des menus principaux) TActionToolBar (pour concevoir des barres doutils)

4 Connectez la liste dimages au gestionnaire dactions. Donnez dabord la focalisation au gestionnaire dactions. Ensuite, slectionnez dans linspecteur dobjets le nom de la liste dimages dans la proprit Images. 5 Utilisez lditeur du gestionnaire dactions pour ajouter des actions au gestionnaire dactions. Vous pouvez associer une image une action en dfinissant la proprit ImageIndex de laction par le numro dordre de limage dans la liste dimages. 6 Glissez-dplacez des actions indpendantes ou des catgories dactions de lditeur du gestionnaire dactions au menu ou la barre doutils. 7 Pour les barres doutils, o vous voulez uniquement afficher licne et pas le libell : slectionnez la bande daction Barre doutils et double-cliquez sur sa proprit Items. Dans lditeur de collections, vous pouvez slectionner un ou plusieurs lments et dfinir leurs proprits Caption. 8 Les images apparaissent automatiquement dans le menu ou la barre doutils.

Cration de barres doutils et de menus personnalisables par lutilisateur


Vous pouvez utiliser les bandes daction avec le gestionnaire dactions pour crer des menus et des barres doutils personnalisables. A lexcution, les utilisateurs peuvent personnaliser les barres doutils et les menus (bandes daction) de linterface utilisateur de lapplication en utilisant une bote de dialogue semblable lditeur du gestionnaire dactions. Pour permettre aux utilisateurs de personnaliser une bande daction de lapplication quils excutent :

1 Placez un gestionnaire dactions sur une fiche. 2 Placez vos composants bande daction (TActionMainMenuBar, TActionToolBar). 3 Double-cliquez sur le gestionnaire dactions afin dafficher lditeur du gestionnaire dactions.
Slectionnez les actions que vous voulez utiliser dans votre application. Ajoutez galement laction Customize, qui apparat la fin de la liste des actions standard. Placez sur la fiche un composant TCustomizeDlg depuis la page Dialogues, connectez-le au gestionnaire dactions en utilisant sa proprit

6-24

Guide du dveloppeur

Organisation des actions pour les barres doutils et les menus

ActionManager. Spcifiez un nom de fichier pour enregistrer dans un flux les personnalisations effectu es par les utilisateurs. Placez les actions dans les composants bande daction par glisser-dplacer. (Vrifiez que vous avez ajout laction Customize la barre doutils ou au menu.)

4 Terminez lapplication.
Lorsque vous compilez et excutez lapplication, les utilisateurs ont accs une commande Personnaliser qui affiche une bote de dialogue de personnalisation semblable lditeur du gestionnaire dactions. Ils peuvent glisser-dplacer des lments de menu et crer des barres doutils en utilisant les actions que vous avez fournies dans le gestionnaire dactions.

Cacher les lments et les catgories inutiliss dans les bandes daction
Un des avantages de lutilisation des ActionBands est que les lments et les catgories inutiliss peuvent tre cachs lutilisateur. Avec le temps, les bandes daction sadaptent aux utilisateurs de lapplication en montrant les lments quils utilisent et en cachant les autres. Les lments cachs peuvent redevenir visibles : il suffit que lutilisateur appuie sur un bouton droulant. De plus, lutilisateur peut restaurer la visibilit de tous les lments dune bande daction en rinitialisant les statistiques dusage dans la bote de dialogue de personnalisation. Le masquage des lments fait partie du comportement par dfaut des bandes daction, mais ce comportement peut tre modifi afin dinhiber le masquage dlments particuliers, de tous les lments dune collection particulire (par exemple, le menu Fichier), ou de tous les lments dune bande daction particulire. Le gestionnaire dactions mmorise le nombre de fois quune action a t invoqu e par lutilisateur en lenregistrant dans le champ UsageCount du TActionClientItem correspondant. Le gestionnaire dactions enregistre galement le nombre de fois que lapplication a t excute (ce qui correspond au numro de la dernire session), ainsi que le numro de la session o une action a t utilise pour la dernire fois. La valeur de UsageCount sert rechercher le nombre maximal de sessions pendant lesquelles un lment est inutilis avant dtre masqu, il ensuite est compar avec la diffrence entre le numro de session actuel et le numro de session de la dernire utilisation de llment. Si cette diffrence est suprieure au nombre dfini dans PrioritySchedule, llment est cach. Les valeurs par dfaut de PrioritySchedule sont indiques dans le tableau suivant :
Tableau 6.2 Valeurs par dfaut de la proprit PrioritySchedule du gestionnaire dactions Nombre de sessions pendant lesquelles un l ment restera visible apr s sa dernire utilisation
3 6 9 12

Nombre de sessions dans lesquelles un lment dune bande daction a t utilis


0, 1 2 3 4, 5

Conception de linterface utilisateur des applications

6-25

Utilisation des listes dactions

Tableau 6.2

Valeurs par dfaut de la proprit PrioritySchedule du gestionnaire dactions (suite) Nombre de sessions pendant lesquelles un l ment restera visible apr s sa dernire utilisation
17 23 29 31

Nombre de sessions dans lesquelles un lment dune bande daction a t utilis


6-8 9-13 14-24 25 ou plus

Il est possible de dsactiver le masquage dun lment au moment de la conception. Pour empcher le masquage dune action particulire (et de toutes les collections qui la contiennent), recherchez son objet TActionClientItem et dfinissez son UsageCount par -1. Pour empcher le masquage dune collection entire dlments, comme le menu Fichier ou mme la barre de menus principale, recherchez lobjet TActionClients qui lui est associ et dfinissez sa proprit HideUnused par False.

Utilisation des listes dactions


Remarque

Cette section concerne la dfinition des barres doutils et des menus dans le dveloppement multiplates-formes. Vous pouvez utiliser les mthodes dcrites ici pour le dveloppement Windows. Mais, lutilisation des bandes daction est plus simple et offre plus doptions. Les listes dactions seront g res automatiquement par le gestionnaire dactions. Voir Organisation des actions pour les barres doutils et les menus la page 6-18, pour plus dinformations sur lutilisation des bandes daction et du gestionnaire dactions. Les listes dactions maintiennent la liste des actions par lesquelles votre application rpond ce que fait lutilisateur. En utilisant les objets action, vous centralisez les fonctions accomplies par votre application partir de linterface utilisateur. Cela vous permet de partager le code ralisant les actions (par exemple, lorsquun bouton de barre doutils et un lment de menu effectuent la mme tche), et procure un lieu unique et centralis dactiver et de dsactiver des actions selon ltat de lapplication.

Dfinition des listes dactions


La dfinition des listes dactions est trs simple une fois comprises les tapes quelle implique : Crer la liste dactions. Ajouter des actions la liste dactions. Dfinir des proprits pour les actions. Attacher des clients laction.

Voici le dtail de ces tapes :

1 Placez un objet TActionList dans votre fiche ou votre module de donnes. (ActionList appartient la page Standard de la palette de composants.)

6-26

Guide du dveloppeur

Utilisation des listes dactions

2 Double-cliquez sur lobjet TActionList pour afficher lditeur de liste dactions. 1 Utilisez une des actions prdfinies numres dans lditeur : cliquez avec le bouton droit et choisissez Nouvelle action standard. 2 Les actions prdfinies sont groupes en catgories (ensemble de donnes, dition, aide et fentre) dans la bote de dialogue Classes dactions standard. Slectionnez toutes les actions standard que vous voulez ajouter votre liste dactions et cliquez sur OK.
ou

3 Crez une nouvelle action qui vous sera propre : cliquez avec le bouton droit et choisissez Nouvelle action. 3 Dfinissez les proprits de chaque action dans linspecteur dobjets. (Les proprits que vous dfinissez affectent chaque client de laction.)
La proprit Name identifie laction, les autres proprits et vnements (Caption, Checked, Enabled, HelpContext, Hint, ImageIndex, ShortCut, Visible et Execute) correspondent aux proprits et vnements de ses contrles client. Elles portent gnralement, mais pas obligatoirement, le mme nom que la proprit du client. Par exemple, la proprit Enabled dune action correspond la proprit Enabled dun TToolButton. Mais, la proprit Checked dune action correspond la proprit Down dun TToolButton.

4 Si vous utilisez les actions prdfinies, laction inclut une rponse standard qui intervient automatiquement. Si vous crez votre propre action, vous devez crire un gestionnaire dvnement dfinissant comment laction rpond lorsquelle est dclenche. Voir Que se passe-t-il lors du dclenchement dune action ? la page 6-27, pour plus de dtails. 5 Attachez les actions de la liste dactions aux clients qui le ncessitent :
Cliquez sur le contrle (par exemple, le bouton ou llment de menu) dans la fiche ou le module de donnes. Dans linspecteur dobjets, la proprit Action est la liste des actions disponibles. Slectionnez celle que vous souhaitez. Les actions standard, comme TEditDelete ou TDataSetPost, accomplissent laction attendue. Laide en ligne de rfrence peut vous donner tous les dtails sur le fonctionnement de chacune des actions standard. Si vous crivez vos propres actions, vous aurez besoin de mieux comprendre ce qui se passe lorsquune action est dclenche.

Que se passe-t-il lors du dclenchement dune action ?


Lorsquun vnement est dclench, il se produit la srie dvnements qui sapplique dabord aux actions gnriques. Ensuite, si lvnement ne gre pas laction, une autre squence dvnements intervient.

Conception de linterface utilisateur des applications

6-27

Utilisation des listes dactions

Rponse par les vnements


Quand un composant ou un contrle client est cliqu ou subit un autre type dopration, se produit une srie dvnements auxquels vous pouvez rpondre. Par exemple, le code suivant est le gestionnaire dvnement pour une action qui inverse la visibilit dune barre doutils quand une action est excute :
procedure TForm1.Action1Execute(Sender: TObject); begin { Inverse la visibilit de Toolbar1 } ToolBar1.Visible := not ToolBar1.Visible; end; Remarque

Pour des informations gnrales sur les vnements et les gestionnaires dvnements, voir Utilisation des vnements et des gestionnaires dvnementsUtilisation des vnements et des gestionnaires dvnements la page 3-28. Vous pouvez fournir un gestionnaire dvnement qui rponde lun des trois diffrents niveaux : action, liste dactions ou application. Cela ne vous concerne que si vous utilisez une nouvelle action gnrique et non une action standard prdfinie. En effet, les actions standard ont un comportement intgr qui sexcute automatiquement lorsque ces vnements se produisent. Lordre dans lequel les gestionnaires dvnements rpondront aux vnements est le suivant : Liste dactions Application Action Lorsque lutilisateur clique sur un contrle client, Delphi appelle la mthode Execute de laction qui sadresse dabord la liste dactions, puis lobjet Application, enfin laction elle-mme lorsque ni la liste dactions ni lapplication ne la gre. Delphi suit cette squence de rpartition lors de la recherche dune faon de rpondre laction de lutilisateur :

1 Si vous fournissez un gestionnaire dvnement OnExecute pour la liste dactions et quil gre laction, lapplication se poursuit.
Le gestionnaire dvnement de la liste dactions dispose dun paramtre Handled qui renvoie False par dfaut. Si le gestionnaire est dfini et gre lvnement, il renvoie True et la squence de traitement sarrte l. Par exemple :
procedure TForm1.ActionList1ExecuteAction(Action: TBasicAction; var Handled: Boolean); begin Handled := True; end;

Si vous ne dfinissez pas Handled par True dans le gestionnaire dvnement de la liste dactions, le traitement se poursuit.

2 Si vous navez pas crit de gestionnaire dvnement OnExecute pour la liste dactions ou si le gestionnaire ne gre pas laction, le gestionnaire dvnement

6-28

Guide du dveloppeur

Utilisation des listes dactions

OnActionExecute de lapplication est dclench. Sil gre laction, lapplication continue. Lobjet Application global reoit un vnement OnActionExecute si lune des listes dactions de lapplication choue en grant un vnement. Comme le gestionnaire dvnement OnExecute de la liste dactions, le gestionnaire OnActionExecute dispose dun paramtre Handled qui renvoie False par dfaut. Si un gestionnaire dvnement est dfini et gre lvnement, il renvoie True et la squence de traitement sarrte ici. Par exemple :
procedure TForm1.ApplicationExecuteAction(Action: TBasicAction; var Handled: Boolean); begin { Empche lexcution de toutes les actions de Application } Handled := True; end;

3 Si le gestionnaire dvnement OnExecute de lapplication ne gre pas laction, le gestionnaire dvnement OnExecute de laction est dclench.
Vous pouvez utiliser des actions intgres ou crer vos propres classes dactions qui savent comment oprer sur des classes cibles spcifiques (telles que les contrles de saisie). Quand aucun gestionnaire dvnement nest trouv nimporte quel niveau, lapplication essaie ensuite de trouver une cible sur laquelle excuter laction. Quand lapplication trouve une cible pour laquelle laction sait quoi faire, elle dclenche laction. Voir la section suivante pour davantage dinformations sur la manire dont lapplication trouve une cible pouvant correspondre une classe dactions prdfinie.

Comment les actions trouvent leurs cibles


Que se passe-t-il lors du dclenchement dune action ? la page 6-27 dcrit le cycle dexcution se produisant lorsquun utilisateur dclenche une action. Sil ny a pas de gestionnaire dvnement dfini pour rpondre laction, que ce soit au niveau de la liste dactions, de lapplication ou de laction, lapplication essaie didentifier un objet cible auquel laction peut sappliquer. Lapplication recherche un objet cible selon la squence suivante :

1 Contrle actif : Lapplication recherche dabord un contrle actif comme cible potentielle. 2 Fiche active : Si lapplication ne trouve pas de contrle actif ou si le contrle actif ne peut servir de cible, elle recherche la fiche active lcran (ActiveForm). 3 Contrles de la fiche : Si la fiche active nest pas une cible approprie, lapplication recherche une cible dans les autres contrles de la fiche active.
Si aucune cible nest trouve, rien ne se passe lorsque lvnement est dclench. Certains contrles peuvent tendre la recherche afin de dfrer la cible un composant qui leur est associ ; par exemple, les contrles orients donnes dfrent la cible au composant ensemble de donnes qui leur est associ. Dautre part, certaines actions prdfinies nutilisent pas de cible, par exemple, le dialogue douverture de fichiers.

Conception de linterface utilisateur des applications

6-29

Utilisation des listes dactions

Actualisation des actions


Lorsquelapplication est inactive, lvnement OnUpdate se produit pour chaque action lie un contrle ou un lment de menu affich. Ceci permet aux applications dexcuter un code centralis pour lactivation et la dsactivation, la slection et la dslection, et ainsi de suite. Par exemple, le code suivant illustre le gestionnaire dvnement OnUpdate pour une action qui est coche quand la barre doutils est visible.
procedure TForm1.Action1Update(Sender: TObject); begin { Indique si ToolBar1 est actuellement visible } (Sender as TAction).Checked := ToolBar1.Visible; end; Attention

Ne placez pas de code ncessitant une excution longue dans le gestionnaire dvnement OnUpdate. En effet, il est excut chaque fois que lapplication est inactive. Si lexcution de ce gestionnaire dvnement est trop longue, les performances de toute lapplication sen trouvent affectes.

Classes dactions prdfinies


Vous pouvez ajouter des actions prdfinies votre application en cliquant avec le bouton droit sur le gestionnaire dactions et en choisissant Nouvelle action standard. La bote de dialogue Classes dactions standard saffiche et prsente la liste des classes dactions prdfinies avec les actions standard qui leur sont associes. Ce sont des actions qui sont incluses dans Delphi et il existe des objets qui accomplissent ces actions automatiquement. Les actions prdfinies sont organises dans les classes suivantes :
Tableau 6.3 Classe
Edition

Classes d actions Description


Actions ddition standard : Utilises avec une cible contrle de saisie. TEditAction est la classe de base de descendants qui redfinissent la mthode ExecuteTarget afin dimplmenter les oprations copier, couper et coller en utilisant le presse-papiers. Actions de formatage standard : Utilises avec le texte format pour appliquer des options de formatage du texte telles que gras, italique, soulign, barr, etc. TRichEditActionest la classe de base de descendants qui redfinissent les m thodes ExecuteTarget et UpdateTarget afin dimplmenter le formatage de la cible. Actions daide standard : Utilises avec toute cible. THelpAction est la classe de base de descendants qui redfinissent la mthode ExecuteTarget pour transmettre les commandes un systme daide. Actions de fentre standard : Utilises avec les fiches dune application MDI comme cible. TWindowAction est la classe de base de descendants qui redfinissent la mthode ExecuteTarget pour implmenter la rorganisation, la cascade, la fermeture, la mosaque et la rduction de fentres enfant MDI.

Formatage

Aide

Fentre

6-30

Guide du dveloppeur

Utilisation des listes dactions

Tableau 6.3 Classe


Fichier Recherche

Classes d actions (suite) Description


Actions de fichiers : Utilises avec les oprations sur les fichiers comme ouvrir, excuter ou quitter. Actions de recherche : Utilises avec les options de recherche. TSearchAction implmente le comportement commun des actions affichant un dialogue non modal o lutilisateur peut entrer une chane pour rechercher un contrle de saisie. Actions des contrles onglet : Utilises pour le dplacement entre les onglets dans un contrle onglets, comme les boutons Prcdent et Suivant dun expert. Actions des contrles liste : Utilises pour grer les lments dune vue liste. Actions de dialogue : Utilises avec les composants dialogue. TDialogAction implmente le comportement commun des actions affichant un dialogue lors de leur excution. Chaque classe drive reprsente un dialogue spcifique. Actions Internet : Utilises pour des fonctions comme la navigation, le tlchargement et lenvoie de mail sur Internet. Actions densembles de donnes : Utilises avec un composant ensemble de donnes comme cible. TDataSetAction est la classe de base de descendants qui redfinissent les m thodes ExecuteTarget et UpdateTarget afin dimplmenter les dplacements et les ditions de la cible. TDataSetAction introduit une proprit DataSource qui garantit que les actions sont effectues sur lensemble de donnes. Si DataSource vaut nil, le contrle orient donnes dtenant la focalisation est utilis. Outils : Des outils supplmentaires comme TCustomizeActionBars qui affiche automatiquement la bote de dialogue permettant de personnaliser les bandes daction.

Tab

Liste Dialogue

Internet Ensemble de donnes

Outils

Tous les objets action sont dcrits sous leur nom dans laide en ligne de rfrence. Reportez-vous laide pour avoir des dtails sur leur fonctionnement.

Conception de composants utilisant des actions


Vous pouvez galement crer vos propres classes dactions prdfinies. Quand vous crivez vos propres classes dactions, vous pouvez leur attribuer la capacit sexcuter sur certaines classes dobjet cible. Vous pouvez ensuite utiliser vos actions personnalises de la mme faon que les classes dactions prdfinies. Ainsi, si laction dtermine quelle peut sappliquer une classe cible, il suffit daffecter laction au contrle client et il agit sur la cible sans avoir besoin dcrire un gestionnaire dvnement. Les concepteurs de composants peuvent utiliser comme exemple les classes dfinies dans les units StdActns et DBActns afin de driver leurs propres classes dactions qui implmentent des comportements spcifiques leurs contrles et leurs composants. Les classes de base de ces actions spcialises (TEditAction, TWindowAction) surchargent gnralement HandlesTarget, UpdateTarget et dautres

Conception de linterface utilisateur des applications

6-31

Utilisation des listes dactions

mthodes afin de limiter la cible de laction une classe spcifique dobjets. Les classes drives surchargent habituellement ExecuteTarget pour raliser une tche spcifique. Voici ces mthodes :
M thode
HandlesTarget

Description
Automatiquement appele lorsque lutilisateur invoque un objet (comme un bouton de barre doutils ou un lment de menu) li laction. La mthode HandlesTarget laisse lobjet action indiquer sil convient de lexcuter ce moment avec comme cible lobjet spcifi par le paramtre Target. Voir Comment les actions trouvent leurs cibles la page 6-29, pour plus de dtails. Automatiquement appele lorsque lapplication est inactive pour que les actions puissent se mettre jour elles-mmes en fonction des conditions en cours. Utilisez la place de OnUpdateAction. Voir Actualisation des actions la page 6-30, pour plus de dtails. Automatiquement appele lorsque laction est dclenche en rponse une action de lutilisateur la place de OnExecute (par exemple, quand lutilisateur slectionne un lment de menu ou appuie sur un bouton de barre doutils qui est li cette action). Voir Que se passe-t-il lors du dclenchement dune action ? la page 6-27, pour plus de dtails.

UpdateTarget

ExecuteTarget

Recensement dactions
Si vous crivez vos propres actions, il est possible de les recenser pour les faire apparatre dans lditeur de liste dactions. Vous les recensez ou vous en annulez le recensement en utilisant les routines globales de lunit ActnList :
procedure RegisterActions(const CategoryName: string; const AClasses: array of TBasicActionClass; Resource: TComponentClass); procedure UnRegisterActions(const AClasses: array of TBasicActionClass);

Quand vous appelez RegisterActions, les actions recenses apparaissent dans lditeur de liste dactions afin dtre utilises dans vos applications. Vous pouvez spcifier un nom de catgorie afin dorganiser vos actions, ainsi quun paramtre Resource permettant de fournir des valeurs de proprit par dfaut. Par exemple, le code suivant recense dans lEDI les actions standard :
{ recensement des actions standard } RegisterActions(, [TAction], nil); RegisterActions(Edit, [TEditCut, TEditCopy, TEditPaste], TStandardActions); RegisterActions(Window, [TWindowClose, TWindowCascade, TWindowTileHorizontal, TWindowTileVertical, TWindowMinimizeAll, TWindowArrange], TStandardActions);

Quand vous appelez UnRegisterActions, les actions napparaissent plus dans lditeur de liste dactions.

6-32

Guide du dveloppeur

Cration et gestion de menus

Cration et gestion de menus


Les menus constituent pour les utilisateurs un moyen commode dexcuter des commandes regroupes logiquement. Le concepteur de menus vous permet dajouter facilement une fiche un menu prdfini ou personnalis. Ajoutez un composant menu la fiche, ouvrez le concepteur de menus et saisissez directement les lments de menu dans la fentre du concepteur de menus. Vous pouvez ajouter ou supprimer des lments de menu et utiliser le glisser-dplacer pour rorganiser les lments la conception. Vous navez mme pas besoin dexcuter votre programme pour voir le rsultat : ce que vous concevez est immdiatement visible dans la fiche et apparat exactement comme lexcution. En utilisant du code, vous pouvez galement modifier les menus lexcution afin de proposer lutilisateur davantage dinformations ou doptions. Ce chapitre dcrit la manire dutiliser le concepteur de menus pour concevoir des barres de menus et des menus surgissants (locaux). Les sujets suivants, concernant la manipulation des menus la conception et lexcution, sont abords : Ouverture du concepteur de menus Construction des menus Edition des lments de menu dans linspecteur dobjets Utilisation du menu contextuel du concepteur de menus Utilisation des modles de menu Enregistrement dun menu comme modle Ajout dimages des lments de menu
Terminologie des menus
Elments de menu de la barre de menu Touche acclratrice Ligne de sparation Elments de menu dune liste de menus

Figure 6.3

Raccourci clavier

Pour des informations sur la faon de lier un lment de menu du code qui sexcute lorsque llment est slectionn, voir Association dvnements de menu des gestionnaires dvnements la page 3-31.

Ouverture du concepteur de menus


Vous concevez les menus de votre application laide du concepteur de menus. Avant de commencer utiliser le concepteur de menus, ajoutez votre fiche un composant TMainMenu ou TPopupMenu. Ces deux composants menu se trouvent dans la page Standard de la palette de composants.

Conception de linterface utilisateur des applications

6-33

Cration et gestion de menus

Figure 6.4

Composants menu principal et menu surgissant


Composant MainMenu Composant PopupMenu

Un composant menu principal (MainMenu) cre un menu attach la barre de titre de la fiche. Un composant menu surgissant (PopupMenu) cre un menu qui apparat quand lutilisateur clique avec le bouton droit de la souris dans la fiche. Les menus surgissants nont pas de barre de menu. Pour ouvrir le concepteur de menus, slectionnez un composant menu de la fiche, puis : Double-cliquez sur le composant menu. ou Dans la page Proprits de linspecteur dobjets, slectionnez la proprit Items puis double-cliquez sur [Menu] dans la colonne des valeurs ou cliquez sur le bouton points de suspension (...). Le concepteur de menus apparat, le premier lment de menu (vide) est slectionn dans le concepteur et la proprit Caption est slectionne dans linspecteur dobjets.
Figure 6.5 Concepteur pour un menu surgissant
Emplacement pour le premier lment de menu

6-34

Guide du dveloppeur

Cration et gestion de menus

Figure 6.6

Concepteur pour un menu principal


Barre de titre (affiche la proprit Name du composant menu) Barre de menu Emplacement pour les lments de menu

Le concepteur de menus affiche les lments de menu en mode WYSIWYG au fur et mesure que vous construisez le menu.

Un objet TMenuItem est cr et la proprit Name est affecte avec lintitul (Caption) spcifi pour llment de menu (moins les caractres interdits et plus un suffixe numrique).

Construction des menus


Vous devez ajouter un composant menu vos fiches pour chaque menu devant apparatre dans lapplication. Vous pouvez crer chaque structure de menu partir de zro ou partir de lun des modles de menu prdfinis. Cette section dcrit les principes de base de la cration de menus la conception. Pour davantage dinformations sur les modles de menu, voir Utilisation des modles de menu la page 6-43.

Nom des menus


Comme pour tous les composants, Delphi donne un nom par dfaut au composant menu que vous ajoutez une fiche, par exemple MainMenu1. Vous pouvez attribuer au menu un nom plus explicite respectant les conventions de nom du Pascal Objet. Delphi ajoute le nom du menu la dclaration de type de la fiche et le nom du menu apparat dans la liste des composants.

Conception de linterface utilisateur des applications

6-35

Cration et gestion de menus

Nom des lments de menu


A la diffrence des composants menu, vous devez donner vous-mme explicitement un nom aux lments de menu quand vous les ajoutez la fiche. Vous pouvez le faire de deux manires : En saisissant directement la valeur de la proprit Name. En saisissant dabord la valeur de la proprit Caption, puis en laissant Delphi en driver une valeur pour la proprit Name. Si, par exemple, vous spcifiez Fichier comme valeur de la proprit Caption, Delphi affecte la valeur Fichier1 la proprit Name de llment de menu. Si vous renseignez dabord la proprit Name avant de renseigner la proprit Caption, Delphi laisse la proprit Caption vide jusqu ce que vous saisissiez une valeur.
Remarque

Si vous saisissez dans la proprit Caption des caractres qui ne sont pas autoriss dans un identificateur Pascal Objet, Delphi modifie la proprit Name en consquence. Si par exemple, lintitul commence par un chiffre, Delphi fait prcder le chiffre dun caractre pour en driver la valeur de la proprit Name. Le tableau suivant donne des exemples de ce processus en supposant que tous ces lments sont placs dans la mme barre de menu.
Tableau 6.4
&Fichier &Fichier (une deuxime fois) 1234 1234 (une deuxime fois) $@@@# - (signe moins)

Exemples dintituls et des noms driv s Nom driv


Fichier1 Fichier2 N12341 N12342 N1 N2

Intitul du composant

Explication
Retire le & Numrote les lments rpts Ajoute une lettre au dbut et numrote en fin Ajoute un nombre pour que le nom driv ne soit plus ambigu. Supprime tous les caractres non standard, ajoute une lettre au dbut et un num ro dordre Numrote cette deuxime occurrence dun intitul sans aucun caractre standard

Comme pour le composant menu, Delphi ajoute le nom des lments de menu la dclaration de type de la fiche et leur nom apparat dans la liste des composants.

Ajout, insertion et suppression dlments de menu


Les procdures suivantes dcrivent la manire deffectuer les oprations de base intervenant dans la conception dune structure de menu. Chaque procdure suppose que la fentre du concepteur de menus est dj ouverte. Pour ajouter des lments de menu la conception :

1 Slectionnez la position laquelle vous voulez crer llment de menu.

6-36

Guide du dveloppeur

Cration et gestion de menus

Si vous venez juste douvrir le concepteur de menus, la premire position est dj slectionne dans la barre de menu.

2 Commencez saisir lintitul. Vous pouvez aussi commencer saisir la proprit Name en plaant le curseur dans linspecteur dobjets et en saisissant une valeur. Dans ce cas, vous devez reslectionner la proprit Caption et entrer une valeur. 3 Appuyez sur Entre.
Lemplacement suivant dlment de menu est slectionn. Si vous entrez dabord la proprit Caption, utilisez les touches de dplacement pour revenir dans llment de menu que vous venez de saisir. Vous pouvez constater que Delphi a renseign la proprit Name en partant de la valeur saisie dans lintitul. (Voir Nom des lments de menu la page 6-36.)

4 Continuez saisir la valeur des proprits Name et Caption pour chaque lment de menu ajouter ou appuyez sur Echap pour revenir la barre de menu.
Utilisez les touches de dplacement pour passer de la barre de menu au menu, puis pour vous dplacer dans les lments de la liste ; appuyez sur Entre pour achever une action. Pour revenir la barre de menu, appuyez sur Echap . Pour insrer un nouvel lment de menu vide :

1 Placez le curseur sur un lment de menu. 2 Appuyez sur Inser.


Dans la barre de menu, les lments de menu sont insrs gauche de llment slectionn et au-dessus de llment slectionn dans la liste de menus. Pour supprimer un lment de menu :

1 Placez le curseur sur llment de menu supprimer. 2 Appuyez sur Suppr.


Remarque

Vous ne pouvez pas supprimer lemplacement par dfaut qui apparat en dessous du dernier lment ajout la liste de menus ou ct du dernier lment de la barre de menu. Cet emplacement napparat pas dans le menu lexcution.

Ajout de lignes de sparation


Les lignes de sparation insrent une ligne entre deux lments de menu. Vous pouvez utiliser les lignes de sparation pour matrialiser des groupes de commandes dans une liste de menus ou simplement pour raliser une sparation visuelle dans une liste. Pour faire de llment de menu une ligne de sparation, entrez un tiret (-) comme libell.

Conception de linterface utilisateur des applications

6-37

Cration et gestion de menus

Spcification de touches acclratrices et de raccourcis clavier


Les touches acclratrices permettent lutilisateur daccder une commande de menu partir du clavier en appuyant sur Alt+ la lettre approprie indiqu e dans le code en la faisant prcder du symbole &. La lettre suivant le symbole & apparat souligne dans le menu. Delphi vrifie automatiquement si des touches acclratrices sont dupliques et les ajuste lexcution. Ainsi, les menus conus dynamiquement lexcution ne contiennent aucune touche acclratrice duplique et tous les lments de menu disposent dune touche acclratrice. Vous pouvez dsactiver cette vrification automatique en attribuant la proprit AutoHotkeys dun lment de menu la valeur maManual. Pour spcifier une touche acclratrice Ajoutez un & devant la lettre approprie de lintitul. Ainsi, pour ajouter une commande de menu Enregistrer dont la lettre E sert de touche acclratrice, entrez &Enregistrer. Les raccourcis clavier permettent lutilisateur deffectuer laction directement sans accder au menu, simplement en appuyant sur la combinaison de touches du raccourci clavier. Pour spcifier un raccourci clavier : Utilisez linspecteur dobjets pour saisir une valeur dans la proprit ShortCut ou slectionnez une combinaison de touches dans la liste droulante. Cette liste ne propose quun sous-ensemble de toutes les combinaisons utilisables. Quand vous ajoutez un raccourci, il apparat lexcution ct de lintitul de llment de menu.
Attention

A la diffrence des touches acclratrices, la prsence de raccourcis clavier dupliqus nest pas automatiquement vrifie. Vous devez vous-mme en assurer lunicit.

Cration de sous-menus
La plupart des menus dapplication contiennent des listes droulantes qui apparaissent ct dun lment de menu afin de proposer des commandes associes supplmentaires. De telles listes sont signales par un pointeur droite de llment de menu. Delphi gre les niveaux de sous-menus sans aucune limitation dans limbrication. Une telle organisation de votre structure de menu permet dconomiser de la place verticalement. Nanmoins, pour optimiser la conception, il est prfrable de ne pas utiliser plus de deux ou trois niveaux de menus dans la conception de votre interface. Dans le cas des menus surgissants, il est prfrable de nutiliser au maximum quun niveau de sous-menu.

6-38

Guide du dveloppeur

Cration et gestion de menus

Figure 6.7

Structure de menus imbriqus

Elment de menu de la barre de menu Elment de menu dune liste de menus Elment de menu imbriqu

Pour crer un sous-menu :

1 Slectionnez llment de menu sous lequel vous voulez crer un sous-menu. 2 Appuyez sur Ctrl afin de crer le premier emplacement ou cliquez sur le bouton droit de la souris et choisissez Crer un sous-menu. 3 Entrez lintitul de llment de sous-menu ou dplacez un lment de menu existant sur cet emplacement. 4 Appuyez sur Entre ou pour crer lemplacement suivant. 5 Rptez les tapes 3 et 4 pour chaque lment du sous-menu. 6 Appuyez sur Echap pour revenir au niveau de menu prcdent.

Cration de sous-menus par dplacement de menus existants


Vous pouvez galement crer un sous-menu en insrant un lment de la barre de menu (ou dun modle de menu) entre les lments de menu dune liste. Quand vous dplacez un menu dans une structure de menu existante, tous ses lments de menu associs se dplacent, ce qui cre directement un sous-menu. Cela sapplique galement aux sous-menus : le dplacement dun lment de menu dans un sous-menu existant peut ainsi crer un niveau supplmentaire dimbrication.

Dplacement dlments de menu


A la conception, vous pouvez dplacer les lments de menu en utilisant le glisser-dplacer. Vous pouvez dplacer des lments de menu dans la barre de menu, un emplacement diffrent dans la liste de menus ou dans un autre composant menu. La seule limitation ces dplacements est de nature hirarchique : vous ne pouvez pas dplacer un lment de menu de la barre de menu lintrieur de son propre menu ; de mme, vous ne pouvez pas dplacer un lment de menu lintrieur de son propre sous-menu. Par contre, vous pouvez toujours dplacer un lment dans un menu diffrent quelle que soit sa position dorigine. Quand vous faites glisser un lment, la forme du curseur change afin dindiquer si vous pouvez dposer llment de menu lemplacement du

Conception de linterface utilisateur des applications

6-39

Cration et gestion de menus

pointeur de la souris. Quand vous dplacez un lment de menu, tous les lments de menu situs en dessous sont galement dplacs. Pour dplacer un lment de menu lintrieur de la barre de menu :

1 Faites glisser llment de menu jusqu ce que la pointe du curseur de dplacement dsigne la nouvelle position. 2 Relchez le bouton de la souris pour dposer llment de menu la nouvelle position.
Pour dplacer un lment de menu dans une liste de menus :

1 Dplacez llment de menu le long de la barre de menu jusqu ce que le pointeur du curseur de dplacement dsigne le nouveau menu.
Cela force louverture du menu, ce qui vous permet damener llment son nouvel emplacement.

2 Faites glisser llment de menu dans la liste et relchez le bouton de la souris pour dposer llment de menu sa nouvelle position.

Ajout dimages des lments de menu


Des images peuvent aider les utilisateurs naviguer dans les menus en associant des glyphes et des images des actions dlment de menu, comme les images des barres doutils. Vous pouvez ajouter un par un des bitmaps uniques des lments de menu, ou organiser en liste les images de votre application et les ajouter un menu au moyen de cette liste. Si, dans votre application, vous utilisez plusieurs bitmaps de mme taille, il est prfrable de les placer dans une liste dimages. Pour ajouter une image unique un menu ou un lment de menu, dfinissez la proprit Bitmap de celui-ci pour quelle fasse rfrence au nom du bitmap que vous voulez utiliser. Pour ajouter une image un lment de menu laide dune liste dimages :

1 Dposez un composant TMainMenu ou TPopupMenu dans une fiche. 2 Dposez un objet TImageList dans la fiche. 3 Ouvrez lditeur de liste dimages en double-cliquant sur lobjet TImageList. 4 Choisissez Ajouter pour slectionner le bitmap ou le groupe de bitmaps que vous voulez utiliser dans le menu. Choisissez OK. 5 Affectez lobjet liste dimages que vous venez de crer la proprit Images du composant TMainMenu ou TPopupMenu. 6 Crez vos lments de menu et vos sous-menus comme dcrit plus haut. 7 Slectionnez dans linspecteur dobjets llment de menu pour lequel vous voulez spcifier une image et affectez sa proprit ImageIndex le numro correspondant dans la liste dimages (la valeur par dfaut de la proprit ImageIndex est -1 : pas dimage affiche).

6-40

Guide du dveloppeur

Cration et gestion de menus

Remarque

Pour un affichage correct dans les menus, utilisez des images de 16 sur 16 pixels. Mme si vous pouvez utiliser dautres tailles pour les images places dans les menus, il peut y avoir des problmes dalignement si vous utilisez des images plus grandes ou plus petites que 16 x 16 pixels.

Affichage du menu
Vous pouvez voir votre menu dans la fiche la conception sans excuter le code de votre programme. Les composants menu surgissant sont visibles dans la fiche la conception, mais pas le menu surgissant lui-mme. Utilisez le concepteur de menus pour visualiser un menu surgissant la conception. Pour visualiser le menu :

1 Si la fiche nest pas visible, cliquez dans la fiche ou dans le menu Voir, choisissez la fiche que vous voulez voir. 2 Si la fiche contient plusieurs menus, slectionnez le menu visualiser dans la liste droulante de la proprit Menu de la fiche.
Le menu apparat dans la fiche exactement tel quil apparatra lexcution du programme.

Edition des lments de menu dans linspecteur dobjets


Cette section a dcrit jusqu prsent comment initialiser diverses proprits des lments de menu (par exemple, les proprits Name ou Caption) en utilisant le concepteur de menus. Cette section a galement dcrit comment initialiser certaines proprits (par exemple, ShortCut) des lments de menu directement dans linspecteur dobjets comme vous le faites pour les autres composants slectionns dans la fiche. Quand vous modifiez un lment de menu en utilisant le concepteur de menus, ses proprits restent affiches dans linspecteur dobjets. Vous pouvez donc faire passer la focalisation dans linspecteur dobjets et y poursuivre la modification de llment de menu. Vous pouvez galement slectionner llment de menu dans la liste des composants de linspecteur dobjets et modifier ses proprits sans mme ouvrir le concepteur de menus. Pour fermer la fentre du concepteur de menus tout en poursuivant la modification des lments de menu :

1 Faites passer la focalisation de la fentre du concepteur de menus linspecteur dobjets en cliquant dans la page Proprits de linspecteur dobjets. 2 Fermez normalement le concepteur de menus.
La focalisation reste dans linspecteur dobjets o vous pouvez continuer modifier les proprits de llment de menu slectionn. Pour diter un autre lment de menu, slectionnez-le dans la liste des composants.

Conception de linterface utilisateur des applications

6-41

Cration et gestion de menus

Utilisation du menu contextuel du concepteur de menus


Le menu contextuel du concepteur de menus propose un accs rapide aux commandes les plus couramment utilises du concepteur de menus et aux options des modles de menu. (Pour davantage dinformations sur les modles de menu, voir Utilisation des modles de menu la page 6-43.) Pour afficher le menu contextuel, cliquez avec le bouton droit de la souris dans la fentre du concepteur de menus ou appuyez sur Alt+F10 quand le curseur est dans la fentre du concepteur de menus.

Commandes du menu contextuel


Le tableau suivant rsume les commandes du menu contextuel du concepteur de menus.
Tableau 6.5
Insrer Supprimer Crer un sous-menu Slectionner un menu Enregistrer comme modle Insrer depuis un modle Supprimer des modles Insrer depuis une ressource

Commandes du menu contextuel du concepteur de menus Action


Insre un emplacement au-dessus ou gauche du curseur. Supprime llment de menu slectionn (et tous ses ventuels souslments). Cre un emplacement un niveau imbriqu et ajoute un pointeur droite de llment de menu slectionn. Ouvre une liste des menus dans la fiche en cours. Double-cliquez sur un nom de menu pour louvrir dans le concepteur de menus. Ouvre la bote de dialogue Enregistrement de modle qui vous permet denregistrer un menu pour une rutilisation ultrieure. Ouvre la bote de dialogue Insertion de modle qui vous permet de slectionner le modle rutiliser. Ouvre la bote de dialogue Suppression de modles qui vous permet de supprimer des modles existants. Ouvre la bote de dialogue Insertion de menu depuis une ressource qui vous permet de choisir le fichier .mnu ouvert dans la fiche en cours.

Commande de menu

Dplacement parmi les menus la conception


Si vous concevez plusieurs menus pour votre fiche, vous pouvez utiliser le concepteur de menus ou linspecteur dobjets pour slectionner un menu et passer dun menu lautre. Pour utiliser le menu contextuel afin de passer dun menu de la fiche un autre :

1 Cliquez avec le bouton droit de la souris dans le concepteur de menus et choisissez Slectionnez un menu.

6-42

Guide du dveloppeur

Cration et gestion de menus

La bote de dialogue Slection de menu saffiche.


Figure 6.8 Bote de dialogue Slection de menu

Cette bote de dialogue numre tous les menus associs la fiche dont les menus sont ouverts dans le concepteur de menus.

2 Dans la liste de la bote de dialogue Slection de menu, choisissez le menu que vous voulez voir ou modifier.
Pour utiliser linspecteur dobjets afin de passer dun menu de la fiche un autre :

1 Slectionnez la fiche dont vous voulez choisir un menu. 2 Dans la liste des composants, slectionnez le menu que vous voulez modifier. 3 Dans la page Proprits de linspecteur dobjets, slectionnez la proprit Items de ce menu, puis cliquez sur le bouton points de suspension ou doublecliquez sur [Menu].

Utilisation des modles de menu


Delphi propose plusieurs menus pr-conus (des modles de menu) qui contiennent des commandes dutilisation courante. Vous pouvez utiliser ces menus dans vos applications sans les modifier (sauf pour ajouter le code) ou vous pouvez les utiliser comme point de dpart en les personnalisant comme vous le feriez avec un menu que vous avez cr. Les modles de menu ne contiennent pas de code de gestionnaire dvnement. Les modles de menu livrs avec Delphi sont stocks dans le sous-rpertoire BIN de linstallation par dfaut. Ces fichiers ont lextension .DMT (extension des modles de menu dans Delphi). Vous pouvez enregistrer comme modle tout menu que vous avez conu dans le concepteur de menus. Aprs avoir enregistr un menu comme modle, vous pouvez lutiliser comme les autres modles de menu. Si vous navez plus besoin dun modle de menu, vous pouvez le retirer de la liste. Pour ajouter un modle de menu votre application :

1 Cliquez avec le bouton droit de la souris dans le concepteur de menus et choisissez Insrer depuis un modle.

Conception de linterface utilisateur des applications

6-43

Cration et gestion de menus

(Sil ny a pas de modle, loption Insrer depuis un modle apparat estompe dans le menu contextuel.) La bote de dialogue Insertion de modle est ouverte et affiche une liste des modles de menu disponibles.
Figure 6.9 Bote de dialogue Insertion de modle des menus

2 Slectionnez le modle de menu que vous voulez insrer, puis appuyez sur Entre ou choisissez OK.
Cela insre le menu dans votre fiche lemplacement du curseur. Si, par exemple, le curseur est positionn sur un lment de menu dune liste, le modle de menu est insr en dessous de llment slectionn. Si le curseur est dans la barre de menu, le modle de menu est insr gauche du curseur. Pour supprimer un modle de menu :

1 Cliquez avec le bouton droit de la souris dans le concepteur de menus et choisissez Supprimer des modles.
(Sil ny a pas de modles, loption Supprimer des modles apparat estompe dans le menu contextuel.) La bote de dialogue Suppression de modles est ouverte et affiche une liste des modles existants.

2 Slectionnez le modle de menu supprimer et appuyez sur Suppr.


Delphi supprime le modle dans la liste des modles et sur le disque dur.

Enregistrement dun menu comme modle


Il est possible denregistrer comme modle tout menu que vous avez conu afin de pouvoir le rutiliser. Vous pouvez employer les modles de menu pour donner un aspect homogne vos applications ou les utiliser comme points de dpart que vous personnalisez. Les modles de menu que vous enregistrez sont stocks dans le sous-rpertoire BIN dans des fichiers .DMT. Pour enregistrer un menu comme modle

1 Concevez le menu que vous voulez pouvoir rutiliser.

6-44

Guide du dveloppeur

Cration et gestion de menus

Ce menu peut contenir de nombreux lments, commandes et sous-menus : tout dans le contenu de la fentre active du concepteur de menus est enregistr comme un seul menu rutilisable.

2 Cliquez avec le bouton droit de la souris dans le concepteur de menus et choisissez Enregistrer comme modle.
La bote de dialogue Enregistrement de modle souvre.
Figure 6.10 Bote de dialogue Enregistrement de modle pour les menus

3 Dans la bote de saisie Description du modle, entrez une brve description de ce menu, puis choisissez OK.
La bote de dialogue Enregistrement du modle se ferme en enregistrant votre menu et vous revenez dans le concepteur de menus.
Remarque

La description que vous saisissez nest affiche que dans les botes de dialogue Enregistrement de modle, Insertion de modle et Suppression de modles. Elle na aucun rapport avec les proprits Name ou Caption du menu.

Conventions de nom pour les lments et les gestionnaires dvnements des modles de menu
Quand vous enregistrez un menu comme modle, Delphi nenregistre pas sa proprit Name car chaque menu doit disposer dun nom unique dans la porte de son propritaire (la fiche). Cependant, quand vous insrez le menu comme modle dans une nouvelle fiche en utilisant le concepteur de menus, Delphi gnre alors de nouveaux noms pour lui et tous ses lments. Par exemple, vous enregistrez un menu Fichier comme modle Dans le menu original, vous le nommez MonFichier. Si vous linsrez comme modle dans un nouveau menu, Delphi le nomme Fichier1. Si vous linsrez dans un menu ayant dj un lment de menu nomm Fichier1, Delphi le nomme Fichier2. Delphi nenregistre aucun gestionnaire dvnement OnClick associ au menu enregistr comme modle car il ny a pas moyen de savoir si le code est applicable dans la nouvelle fiche. Quand vous gnrez un nouveau gestionnaire dvnement pour un lment du modle de menu, Delphi gnre galement le nom du gestionnaire dvnement.

Conception de linterface utilisateur des applications

6-45

Cration et gestion de menus

Il est simple dassocier des lments de menu des gestionnaires dvnements OnClick existants de la fiche. Pour plus dinformations, voir Association dvnements de menu des gestionnaires dvnements la page 3-31.

Manipulation dlments de menu lexcution


A lexcution, il est parfois ncessaire dajouter une structure de menu existante des lments de menu ; cela permet de proposer davantage dinformations ou doptions lutilisateur. Il est possible dinsrer un lment de menu en utilisant les mthodes Add ou Insert de llment de menu. Vous pouvez galement masquer ou afficher les lments dun menu en jouant sur leur proprit Visible. La proprit Visible dtermine si llment de menu est affich dans le menu. Pour estomper un lment de menu sans le masquer, utilisez la proprit Enabled. Pour des exemples utilisant les proprits Visible et Enabled des lments de menu, voir Dsactivation des lments de menu la page 7-11. Dans des applications MDI ou OLE, vous pouvez galement fusionner des lments de menu dans une barre de menu existante. Les sections suivantes dcrivent ce processus plus en dtail.

Fusion de menus
For Dans les applications MDI, comme lapplication exemple diteur de texte ou dans les applications client OLE, le menu principal de votre application doit tre capable dintgrer les lments de menu dune autre fiche ou dun objet serveur OLE. Ce processus sappelle la fusion de menus. Notez que la technologie OLE est limite aux applications Windows et nest pas utilisable en programmation multiplate-forme. Pour prparer des menus la fusion, vous devez spcifier les valeurs de deux proprits : Menu, une proprit de la fiche. GroupIndex, une proprit des lments du menu.

Spcification du menu actif : proprit Menu


La proprit Menu sp cifie le menu actif de la fiche. Les oprations de fusion de menu portent uniquement sur le menu actif. Si la fiche contient plusieurs composants menu, vous pouvez changer le menu actif lexcution en modifiant la valeur de la proprit Menu dans le code. Par exemple,
Form1.Menu := SecondMenu;

Ordre des lments de menu fusionns : proprit GroupIndex


La proprit GroupIndex dtermine lordre dans lequel les lments des menus fusionns apparaissent dans la barre de menu partage. La fusion dlments de

6-46

Guide du dveloppeur

Cration et gestion de menus

menu peut remplacer des lments existants de la barre de menu principale ou rajouter des lments celle-ci. La valeur par dfaut de GroupIndex est 0. Plusieurs rgles sappliquent la spcification dune valeur pour la proprit GroupIndex : Les nombres les plus bas apparaissent en premier (plus gauche) dans le menu. Par exemple, affectez la valeur 0 (zro) la proprit GroupIndex dun menu qui doit apparatre tout gauche, comme le menu Fichier. De mme, sp cifiez une valeur leve (elle na pas besoin dtre conscutive) un menu qui doit apparatre tout droite (comme le menu Aide). Pour remplacer des lments du menu principal, attribuez la mme valeur la proprit GroupIndex des lments du menu enfant. Cela peut sappliquer des groupes dlments ou un seul lment. Si, par exemple, votre fiche principale contient un lment de menu Edition dont la proprit GroupIndex vaut 1, vous pouvez le remplacer par un ou plusieurs lments du menu de la fiche enfant en attribuant galement la valeur 1 leur proprit GroupIndex. Si plusieurs lments du menu enfant ont la mme valeur pour GroupIndex, leur ordre nest pas modifi quand ils sont fusionns au menu principal. Pour insrer des lments sans remplacer des lments du menu principal, laissez des intervalles numriques entre les lments du menu principal et intercalez les numros de la fiche enfant. Vous pouvez par exemple, numroter les lments du menu principal 0 et 5, et insrer les lments du menu enfant en les numrotant 1, 2, 3 et 4.

Importation de fichiers ressource


Delphi peut utiliser des menus conus avec dautres applications dans la mesure o ils utilisent le format standard de fichier ressource Windows (.RC). Vous pouvez importer ces menus directement dans votre projet Delphi, ce qui vous vite davoir redfinir des menus que vous avez conu par ailleurs. Pour charger un fichier menu .RC existant :

1 Dans le concepteur de menus, placez le curseur lendroit o le menu doit apparatre.


Le menu import peut faire partie du menu que vous concevez ou constituer la totalit dun menu par lui-mme.

2 Cliquez avec le bouton droit de la souris et choisissez Insrer depuis la ressource.


La bote de dialogue Insertion de menu depuis une ressource souvre.

3 Dans la bote de dialogue, slectionnez le fichier ressource charger, puis choisissez OK.

Conception de linterface utilisateur des applications

6-47

Conception de barres doutils et de barres multiples

Le menu apparat dans la fentre du concepteur de menus.


Remarque

Si votre ficher ressource contient plusieurs menus, vous devez enregistrer chacun de ses menus dans un fichier ressource spar avant de pouvoir importer.

Conception de barres doutils et de barres multiples


Une barre doutils est un volet, gnralement plac en haut dune fiche (sous la barre de menu) qui contient des boutons et dautres contrles. Une barre multiple est une sorte de barre doutils qui affiche des contrles dans des bandes dplaables et redimensionnables. Si plusieurs volets sont aligns sur le haut de la fiche, ils sempilent verticalement dans lordre de leur ajout.
Remarque

Les barres multiples ne peuvent pas tre utilises dans CLX pour les applications multiplates-formes. Vous pouvez placer toutes sortes de contrles dans une barre doutils. Outre les boutons, vous pouvez y placer des grilles de couleur, des barres de d filement, des libells, etc. Vous pouvez ajouter une barre doutils une fiche de plusieurs faons : Placez un composant volet (TPanel) dans la fiche et ajoutez-y des contrles, en gnral des turboboutons. Utilisez un composant barre doutils (TToolBar) la place de TPanel et ajoutezlui des contrles. TToolBar gre les boutons et les autres contrles en les disposant en lignes et en ajustant automatiquement leur taille et leur position. Si vous utilisez des contrles bouton outil (TToolButton) dans la barre doutils, TToolBar permet simplement de grouper les boutons de manire fonctionnelle et propose dautres options daffichage. Utilisez un composant barre multiple ( TCoolBar) et ajoutez-lui des contrles. La barre multiple affiche des contrles dans des bandes qui peuvent tre dplaces et redimensionnes de manire indpendante. La mthode employer pour implmenter une barre doutils dpend de votre application. Le composant volet prsente lavantage de vous donner une matrise totale de laspect de la barre doutils. Si vous utilisez des composants barre doutils ou bande multiple, vous tes certain que votre application a bien le style dune application Windows, car vous utilisez dans ce cas des contrles natifs de Windows. Si ces contrles du systme dexploitation changent lavenir, votre application changera galement. Par ailleurs, comme les composants barre doutils et barre multiple sont fonds sur des composants standard Windows, votre application ncessite la prsence du fichier COMCTL32.DLL. Les barres doutils et les barres multiples ne sont pas autoriss dans les applications WinNT 3.51. Les sections suivantes expliquent comment : Ajouter une barre doutils et les contrles turbobouton correspondants en utilisant le composant volet

6-48

Guide du dveloppeur

Conception de barres doutils et de barres multiples

Ajouter une barre doutils et les contrles bouton outil correspondants en utilisant le composant barre doutils Ajouter un composant barre multiple Rpondre aux clics Ajouter des barres doutils et des barres multiples masqu es Afficher et masquer des barres doutils et des barres multiples

Ajout dune barre doutils en utilisant un composant volet


Pour ajouter une fiche une barre doutils en utilisant un composant volet :

1 Ajoutez la fiche un composant volet ( partir de la page Standard de la palette de composants). 2 Affectez la valeur alTop la proprit Align du volet. Quand il est align sur le haut de la fiche, le volet conserve sa hauteur mais ajuste sa largeur pour occuper toute la largeur de la zone client de la fiche, et ce mme si la fentre change de taille. 3 Ajoutez des turboboutons ou dautres contrles dans le volet.
Les turboboutons sont conus pour fonctionner dans des volets barre doutils. Gnralement, un turbobouton na pas dintitul mais seulement une petite image (appele un glyphe) qui reprsente la fonction du bouton. Les turboboutons ont trois modes de fonctionnement. Ils peuvent : Se comporter comme des boutons poussoir normaux. Se comporter comme des bascules. Se comporter comme un ensemble de boutons radio. Pour implmenter des turboboutons dans des barres doutils, vous pouvez : Ajouter un turbobouton dans un volet barre doutils Affecter un glyphe au turbobouton Dfinir ltat initial du turbobouton Crer un groupe de turboboutons Utiliser des boutons bascule

Ajout dun turbobouton un volet


Pour ajouter un turbobouton un volet barre doutils, placez dans le volet un composant turbobouton ( partir de la page Supplment de la palette de composants. Cest alors le volet et non la fiche qui est le propritaire du turbobouton, donc dplacer ou masquer le volet dplace ou masque galement le turbobouton. La hauteur par dfaut dun volet est 41 et la hauteur par dfaut dun turbobouton est 25. Si vous affectez la valeur 8 la proprit Top de chaque bouton, ils sont centrs verticalement. Le paramtrage par dfaut de la grille aligne verticalement le turbobouton sur cette position.

Conception de linterface utilisateur des applications

6-49

Conception de barres doutils et de barres multiples

Spcification du glyphe dun turbobouton


Chaque turbobouton a besoin dune image appele un glyphe afin dindiquer lutilisateur la fonction du bouton. Si vous ne spcifiez quune seule image pour le bouton, le bouton manipule limage afin dindiquer si le bouton est enfonc, relch, slectionn ou dsactiv. Vous pouvez galement spcifier des images distinctes spcifiques chaque tat. Normalement, les glyphes sont affects un turbobouton la conception mais il est possible daffecter dautres glyphes lexcution. Pour affecter un glyphe un turbobouton la conception :

1 Slectionnez le turbobouton. 2 Dans linspecteur dobjets, slectionnez la proprit Glyph. 3 Double-cliquez dans la colonne des valeurs ct de Glyph pour afficher lditeur dimages et slectionner le bitmap souhait.

Dfinition de ltat initial dun turbobouton


Cest laspect visuel dun turbobouton qui donne lutilisateur des indications sur sa fonction et son tat. Nayant pas dintitul, il est indispensable dutiliser des indications visuelles pour aider lutilisateur. Le tableau suivant dcrit comment modifier laspect dun turbobouton :
Tableau 6.6 Paramtrage de laspect dun turbobouton Initialisez :
Sa proprit GroupIndex une valeur non nulle et sa proprit Down True. Sa proprit Enabled False. Sa proprit Indent une valeur suprieure 0.

Pour que le turbobouton :


Apparaisse enfonc Apparaisse dsactiv Dispose dune marge gauche

Si, par exemple, votre application propose un outil de dessin activ par dfaut, vrifiez que le bouton correspondant de la barre doutils est enfonc au dmarrage de lapplication. Pour ce faire, affectez une valeur non nulle sa proprit GroupIndex et la valeur True sa proprit Down.

Cration dun groupe de turboboutons


Une srie de turboboutons reprsente souvent un ensemble de choix mutuellement exclusifs. Dans ce cas, vous devez associer les boutons dans un groupe, afin que lenfoncement dun bouton fasse remonter le bouton prcdemment enfonc du groupe. Pour associer un nombre quelconque de turboboutons dans un groupe, affectez la mme valeur la proprit GroupIndex de chacun de ces turboboutons. Le moyen le plus simple de procder consiste slectionner tous les boutons grouper puis spcifier une mme valeur pour leur proprit GroupIndex.

6-50

Guide du dveloppeur

Conception de barres doutils et de barres multiples

Utilisation de boutons bascule


Dans certains cas, vous voulez pouvoir cliquer sur un bouton dj enfonc dun groupe afin de le faire remonter, ce qui laisse le groupe sans aucun bouton enfonc. Un tel bouton est appel une bascule. Utilisez la proprit AllowAllUp pour crer un groupe de boutons qui se comporte ainsi : cliquez une fois; il est enfonc, cliquez nouveau, il remonte. Pour quun groupe de boutons radio se comporte comme une bascule, affectez sa proprit AllowAllUp la valeur True. Laffectation de la valeur True la proprit AllowAllUp dun des turboboutons du groupe laffecte tous ceux du groupe. Cela permet au groupe de se comporter comme un groupe normal, un seul bouton tant slectionn la fois mais, au mme moment, tous les boutons peuvent tre ltat relch.

Ajout dune barre doutils en utilisant le composant barre doutils


Le composant barre doutils (TToolBar) propose des caractristiques de gestion des boutons et de laffichage dont ne dispose pas le composant volet. Pour ajouter une barre doutils une fiche en utilisant le composant barre doutils :

1 Ajoutez la fiche un composant barre doutils ( partir de la page Win32 de la palette de composants). La barre doutils saligne automatiquement en haut de la fiche. 2 Ajoutez des boutons outil ou dautres contrles la barre.
Les boutons outil sont conus pour fonctionner dans des composants barre doutils. Comme les turboboutons, les boutons outil peuvent : Se comporter comme des boutons poussoirs normaux. Se comporter comme des bascules. Se comporter comme un ensemble de boutons radio. Pour implmenter des boutons outil dans une barre doutils, vous pouvez : Ajouter un bouton outil Affecter des images un bouton outil Dfinir laspect et les conditions initiales du bouton outil Crer un groupe de boutons outil Utiliser des boutons outil bascule

Ajout dun bouton outil


Pour ajouter un bouton outil dans une barre doutils, cliquez avec le bouton droit de la souris dans la barre doutils et choisissez Nouveau bouton. La barre doutils est le propritaire du bouton outil : dplacer ou masquer la barre doutils dplace et masque galement le bouton. De plus, tous les boutons outil de la barre doutils ont automatiquement la mme largeur et la mme hauteur. Vous pouvez dposer dans la barre doutils dautres contrles de la palette de composants, ils ont automatiquement une hauteur homogne. De plus,

Conception de linterface utilisateur des applications

6-51

Conception de barres doutils et de barres multiples

les contrles passent la ligne et commencent une nouvelle ligne quand ils ne tiennent pas horizontalement sur une seule ligne de la barre doutils.

Affectation dimages des boutons outil


Chaque bouton outil dispose de la proprit ImageIndex qui dtermine limage apparaissant dedans lexcution. Si vous ne fournissez quune seule image au bouton outil, le bouton manipule cette image pour indiquer si le bouton est dsactiv. Pour affecter une image un bouton outil la conception :

1 Slectionnez la barre doutils dans laquelle le bouton apparat. 2 Dans linspecteur dobjet, attribuez un objet TImageList la proprit Images de la barre doutils. Une liste dimages est une collection dicnes ou de bitmaps de mme taille. 3 Slectionnez un bouton outil. 4 Dans linspecteur dobjets, affectez la proprit ImageIndex du bouton outil une valeur entire correspondant limage de la liste dimages qui doit tre affecte au bouton.
Vous pouvez galement spcifier des images distinctes apparaissant dans les boutons outil quand ils sont dsactivs ou sous le pointeur de la souris. Pour ce faire, affectez des listes dimages distinctes aux proprits DisabledImages et HotImages de la barre doutils.

Dfinition de laspect et de ltat initial dun bouton outil


Le tableau suivant indique comment modifier laspect des boutons dune barre doutils :
Tableau 6.7 Paramtrage de laspect des boutons dune barre doutils Initialisez :
(Sur le bouton outil) sa proprit Style tbsCheck et sa proprit Down True. Sa proprit Enabled False. Sa proprit Indent une valeur suprieure 0.
Sa proprit Flat True

Pour que le bouton outil :


Apparaisse enfonc Apparaisse dsactiv Dispose dune marge gauche Semble avoir une bordure popup, ce qui donne la barre doutils un aspect transparent

Remarque

Lutilisation de la proprit Flat de TToolBar ncessite une version 4.70 ou ultrieure de COMCTL32.DLL. Pour forcer le passage la ligne aprs un bouton outil spcifique, slectionnez le bouton outil devant apparatre en dernier sur la ligne et affectez la valeur True sa proprit Wrap. Pour dsactiver le passage la ligne automatique dans la barre doutils, affectez la valeur False la proprit Wrapable de la barre doutils.

6-52

Guide du dveloppeur

Conception de barres doutils et de barres multiples

Cration de groupes de boutons outil


Pour crer un groupe de boutons outils, slectionnez les boutons associer et affectez la valeur tbsCheck leur proprit Style et la valeur True leur proprit Grouped. La slection dun bouton outil du groupe dslectionne le choix prcdent dans le groupe de boutons, ce qui permet de reprsenter un ensemble de choix mutuellement exclusifs. Toute squence non interrompue de boutons outils adjacents dont la proprit Style a la valeur tbsCheck et la proprit Grouped la valeur True forme un mme groupe. Pour interrompre un groupe de boutons outils, sparez les boutons avec : Un bouton outil dont la proprit Grouped a la valeur False. Un bouton outil dont la proprit Style na pas la valeur tbsCheck. Pour crer des espaces ou des sparateurs dans la barre doutils, ajoutez un bouton outil de Style tbsSeparator ou tbsDivider. Un contrle dun type autre que bouton outil.

Utilisation de boutons outil bascule


Utilisez la proprit AllowAllUp pour crer un groupe de boutons outils se comportant comme une bascule : cliquez une fois pour enfoncer le bouton et une seconde fois pour le faire remonter. Pour quun groupe de boutons outils se comporte comme une bascule, affectez la valeur True sa proprit AllowAllUp. Comme pour les turboboutons, laffectation de la valeur True la proprit AllowAllUp dun des boutons du groupe affecte automatiquement la mme valeur tous les boutons du groupe.

Ajout dun composant barre multiple


Remarque

Le composant TCoolBar ncessite une version 4.70 ou ultrieure de COMCTL32.DLL et nest pas disponible dans CLX. Le composant barre multiple (TCoolBar) galement appel multibarre affiche des contrles fentrs dans des bandes redimensionnables qui peuvent se dplacer indpendamment les unes des autres. Lutilisateur peut positionner les bandes faisant glisser des poignes de redimensionnement places sur le ct de chaque bande. Pour ajouter une barre multiple une fiche dans une application Windows,

1 Ajoutez la fiche un composant barre multiple ( partir de la page Win32 de la palette de composants). La barre multiple saligne automatiquement en haut de la fiche. 2 Ajoutez la barre des contrles fentrs de la palette de composants.
Seuls les composants de la VCL drivant de TWinControl sont des contrles fentrs. Vous pouvez ajouter une barre multiple des contrles graphiques

Conception de linterface utilisateur des applications

6-53

Conception de barres doutils et de barres multiples

(comme les libells ou les turboboutons), mais ils napparaissent pas dans des bandes distinctes.

Dfinition de laspect de la barre multiple


Le composant barre multiple dispose de plusieurs options de configuration. Le tableau suivant indique comment modifier laspect des boutons dune barre multiple :
Tableau 6.8 Paramtrage de laspect des boutons dune barre multiple Initialisez :
Sa proprit AutoSize True.

Pour que la barre multiple :


Se redimensionne automatiquement pour sadapter aux bandes quelle contient. Dispose de bandes dune hauteur uniforme. Soit oriente la verticale et pas lhorizontale. Empcher laffichage lexcution de la proprit Text des bandes. Retirer la bordure autour de la barre. Empcher les utilisateurs de modifier lordre des bandes lexcution. Lutilisateur peut toujours dplacer et redimensionner les bandes. Crer une image de fond pour la barre multiple. Choisir une liste dimages apparaissant gauche des bandes

Sa proprit FixedSize True. Sa proprit Vertical True. Cela change leffet de la proprit FixedSize. Sa proprit ShowText False. Chaque bande dune barre multiple a sa propre proprit Text. Sa proprit BandBorderStyle bsNone. Sa proprit FixedOrder True.

Sa proprit Bitmap avec un objet TBitmap. Sa proprit Images avec un objet TImageList.

Pour affecter individuellement des images aux bandes, slectionnez la barre multiple et, dans linspecteur dobjets, double-cliquez sur sa proprit Bands. Slectionnez une bande et affectez une valeur sa proprit ImageIndex .

Rponse aux clics


Quand lutilisateur clique sur un contrle, par exemple un bouton dune barre doutils, lapplication gnre un vnement OnClick auquel vous pouvez rpondre avec un gestionnaire dvnement. Etant donn que OnClick est lvnement par dfaut des boutons, vous pouvez gnrer un gestionnaire squelette pour lvnement en double-cliquant sur le bouton la conception. Pour plus dinformations, voir Utilisation des vnements et des gestionnaires dvnements la page 3-28 et Gnration du gestionnaire de lvnement par dfaut dun composant la page 3-29.

6-54

Guide du dveloppeur

Conception de barres doutils et de barres multiples

Affectation dun menu un bouton outil


Si vous utilisez une barre doutils (TToolBar) contenant des boutons outils (TToolButton), vous pouvez associer un menu un bouton spcifique :

1 Slectionnez le bouton outil. 2 Dans linspecteur dobjets, affectez un menu surgissant (TPopupMenu) la proprit DropDownMenu du bouton outil.
Si la proprit AutoPopup du menu a la valeur True, le menu apparat automatiquement quand le bouton est enfonc.

Ajout de barres doutils masques


Les barres doutils nont pas besoin dtre visibles tout le temps. En fait, il est souvent commode de disposer de plusieurs barres doutils, mais de nafficher que celles dont lutilisateur veut disposer. Souvent, les fiches que vous crez contiennent plusieurs barres doutils, mais en masquent certaines ou mme toutes. Pour crer une barre doutils masqu e :

1 Ajoutez la fiche un composant barre doutils, barre multiple ou volet. 2 Affectez la valeur False la proprit Visible du composant.
Bien que la barre doutils reste visible la conception afin que vous puissiez la modifier, elle reste cache lexcution tant que lapplication ne la rend pas explicitement visible.

Masquage et affichage dune barre doutils


Frquemment, une application dispose de plusieurs barres doutils mais vous ne voulez pas encombrer lcran en les affichant toutes la fois. Vous pouvez laisser lutilisateur dcider sil veut afficher les barres doutils. Comme tous les composants, les barres doutils peuvent tre masques et affiches quand cest ncessaire lexcution. Pour masquer ou afficher une barre doutils lexcution, affectez sa proprit Visible, respectivement, la valeur False or True. Gnralement vous faites ceci en rponse un vnement utilisateur particulier ou un changement du mode de fonctionnement de lapplication. Pour ce faire, chaque barre doutils dispose gnralement dun bouton de fermeture. Quand lutilisateur clique sur ce bouton, lapplication masque la barre doutils correspondante. Vous pouvez galement proposer un systme pour inverser ltat de la barre doutils. Dans lexemple suivant, la visibilit dune barre doutils de crayons est inverse par un bouton de la barre doutils principale. Comme chaque clic de la souris enfonce ou libre le bouton, un gestionnaire dvnement OnClick peut afficher ou masquer la barre doutils des crayons selon que le bouton est relch ou enfonc.

Conception de linterface utilisateur des applications

6-55

Conception de barres doutils et de barres multiples

procedure TForm1.PenButtonClick(Sender: TObject); begin PenBar.Visible := PenButton.Down; end;

Programmes exemple
Pour des exemples de applications Windows utilisant les actions et les listes dactions, voir Demos\RichEdit. De plus, les dmos de lexpert Application (Fichier|page Nouveau projet), Application MDI, Application SDI et Application Logo Winx peuvent utiliser les objets action et liste dactions. Pour des exemples dapplications multiplates-formes, reportez-vous Demos\CLX.

6-56

Guide du dveloppeur

Chapitre

Chapitre 7

Manipulation des contrles

Les contrles sont des composants visuels avec lesquels lutilisateur peut interagir lexcution. Ce chapitre dcrit un ensemble de fonctionnalits communes de nombreux contrles.

Implmentation du glisser-dplacer dans les contrles


Le glisser-dplacer est souvent une faon pratique de manipuler des objets. Les utilisateurs peuvent ainsi faire glisser des contrles entiers, ou bien extraire des lments de contrles (tels que des botes liste ou des vues arborescentes) en les faisant glisser sur dautres contrles. Dbut de lopration glisser-dplacer Acceptation des lments dplacer Dplacement des lments Fin de lopration glisser-dplacer Personnalisation du glisser-dplacer avec un objet dplacement Changement du pointeur de la souris

Dbut de lopration glisser-dplacer


Chaque contrle possde une proprit appele DragMode qui dtermine la faon dont les oprations glisser sont dmarres. Si la proprit DragMode est dmAutomatic, lopration glisser commence automatiquement quand lutilisateur clique sur le bouton de la souris alors que le curseur se trouve au-dessus dun contrle. Le plus souvent, vous donnerez DragMode la valeur dmManual (la valeur par dfaut) et lancerez lopration glisser en grant les vnements bouton de souris enfonc. Pour faire glisser un contrle manuellement, appelez la mthode BeginDrag du contrle. BeginDrag requiert un paramtre boolen appel Immediate et, de manire facultative, un paramtre entier appel Threshold. Si vous transmettez

Manipulation des contrles

7-1

Implmentation du glisser-dplacer dans les contrles

True pour Immediate, lop ration glisser commence immdiatement. Si vous transmettez False, lopration glisser ne commence pas avant que lutilisateur ne dplace la souris du nombre de pixels spcifi par Threshold. Lappel de
BeginDrag False)

permet au contrle daccepter les clics de la souris sans lancer une opration glisser. Vous pouvez imposer des conditions pour commencer lopration glisser, par exemple vrifier le bouton de souris enfonc par lutilisateur, en testant les paramtres du gestionnaire de lvnement bouton de souris enfonc, avant lappel BeginDrag. Le code qui suit, par exemple, gre lvnement bouton de souris enfonc dans une bote liste de fichiers en ne lanant lop ration glisser que si le bouton gauche de la souris a t enfonc.
procedure TFMForm.FileListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then { ne glisser que si le bouton gauche est enfonc } with Sender as TFileListBox do { traite Sender comme TFileListBox } begin if ItemAtPos(Point(X, Y), True) >= 0 then { y a-t-il un lment ici ? } BeginDrag(False); { si oui, le faire glisser } end; end;

Acceptation des lments dplacer


Quand lutilisateur fait glisser quelque chose sur un contrle, celui-ci reoit un vnement OnDragOver. Il doit alors indiquer sil peut accepter llment dans le cas o lutilisateur le lcherait cet emplacement. Laspect du curseur change pour indiquer si le contrle peut accepter llment que lutilisateur fait glisser. Pour accepter les lments que lutilisateur fait glisser sur un contrle, attachez un gestionnaire lvnement OnDragOver du contrle. Lvnement glisser-dessus a un paramtre appel Accept que le gestionnaire dvnement peut dfinir True pour indiquer quil accepte llment. Si Accept vaut True, lapplication renvoie un vnement glisser-dplacer au contrle. Lvnement glisser-dessus prsente dautres paramtres, dont la source de lopration glisser et lemplacement actuel du curseur de la souris, que le gestionnaire dvnement peut utiliser pour dterminer sil doit accepter le dplacement. Dans lexemple ci-dessous, une arborescence de rpertoires accepte les objets dplacs seulement sils viennent dune bote liste de fichiers.
procedure TFMForm.DirectoryOutline1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source is TFileListBox then Accept := True else Accept := False; end;

7-2

Guide du dveloppeur

Implmentation du glisser-dplacer dans les contrles

Dplacement des lments


Si un contrle indique qu il peut accepter un lment dplac, il doit le traiter sil est effectivement lch. Pour grer les lments lchs, attachez un gestionnaire lvnement OnDragDrop du contrle qui accepte lopration lcher. Comme lvnement glisser-dessus, lvnement glisser-dplacer indique la source de llment dplac et les coordonnes du curseur de la souris lorsquil est au-dessus du contrle acceptant llment. Le dernier paramtre vous permet de contrler le chemin emprunt par un lment au cours de lopration glisser ; vous pouvez, par exemple, utiliser ces informations pour modifier la couleur affiche par les composants au cours de leur transfert. Dans lexemple suivant, une arborescence de rpertoires, qui accepte les lments dplacs depuis une bote liste de fichiers, rpond en dplaant les fichiers vers le rpertoire sur lequel ils sont lchs :
procedure TFMForm.DirectoryOutline1DragDrop(Sender, Source: TObject; X, Y: Integer); begin if Source is TFileListBox then with DirectoryOutline1 do ConfirmChange(Move, FileListBox1.FileName, Items[GetItem(X, Y)].FullPath); end;

Fin de lopration glisser-dplacer


Une op ration glisser se termine lorsque llment est dplac avec succs ou quil est relch au-dessus dun contrle qui ne peut pas lacccepter. A ce stade un vnement fin-glisser est envoy au contrle partir duquel llment a t dplac. Pour permettre un contrle de rpondre quand des lments en sont extraits, attachez un gestionnaire lvnement OnEndDrag du contrle. Le paramtre le plus important dans un vnement OnEndDrag est appel Target, il indique quel contrle, le cas chant, accepte llment dplac. Si Target est nil, cela signifie quaucun contrle ne laccepte. Lvnement OnEndDrag comprend aussi les coordonnes du contrle de rception. Dans cet exemple, une bote liste de fichiers gre un vnement fin-glisser en mettant jour sa liste de fichiers.
procedure TFMForm.FileListBox1EndDrag(Sender, Target: TObject; X, Y: Integer); begin if Target <> nil then FileListBox1.Update; end;

Personnalisation du glisser-dplacer avec un objet dplacement


Vous pouvez utiliser un descendant de TDragObject pour personnaliser le comportement glisser-dplacer dun objet. Les vnements glisser-dessus et glisser-dplacer standard indiquent la source de llment gliss et les coordonnes du curseur de souris au-dessus du contrle qui laccepte. Pour

Manipulation des contrles

7-3

Implmentation du glisser-ancrer dans les contrles

obtenir des informations supplmentaires sur ltat en cours, drivez un objet gliss de TDragObject ou TDragObjectEx et surchargez ses mthodes virtuelles. Lobjet gliss doit tre cr dans lvnement OnStartDrag. Normalement, le paramtre source des vnements glisser-dessus et glisserdplacer est le contrle qui commence lopration glisser. Si plusieurs sortes de contrles peuvent commencer une opration impliquant le mme type de donnes, la source doit grer chaque sorte de contrle. Lorsque vous utilisez un descendant de TDragObject, toutefois, la source est lobjet gliss lui-mme ; si chaque contrle cre le mme type dobjet gliss dans son vnement OnStartDrag, la cible doit grer uniquement une sorte dobjet. Les vnements glisser-dessus et glisser-dplacer peuvent indiquer si la source est un objet gliss, en opposition au contrle, en appelant la fonction IsDragObject. Les descendants de TDragObjectEx sont librs automatiquement alors que les descendants de TDragObject ne le sont pas. Si vous avez des descendants de TDragObject qui ne sont pas explicitement librs, vous pouvez les modifier de faon ce quils drivent de TDragObjectEx au lieu de surveiller les perte de mmoire. Les objets glisss vous permettent de dplacer des lments entre une fiche implmente dans le fichier excutable principal de lapplication et une fiche implmente en utilisant une DLL, ou entre des fiches implmentes en utilisant diffrentes DLL.

Changement du pointeur de la souris


Il est possible de personnaliser laspect du pointeur de la souris lors doprations glisser en dfinissant la proprit DragCursor du composant source (VCL seulement).

Implmentation du glisser-ancrer dans les contrles


Remarque

Les proprits de glisser-ancrer sont disponibles dans la VCL, mais non dans CLX. Les descendants de TWinControl peuvent faire office de sites ancrs et les descendants de TControl peuvent faire office de fentres enfant ancres dans les sites dancrage. Par exemple, pour fournir un site dancrage sur le bord gauche de la fentre dune fiche, alignez un volet sur le bord gauche de la fiche et faites-en un site dancrage. Lorsque des contrles ancrables sont dplacs vers le volet puis lchs, ils deviennent des contrles enfant du volet. Transformation dun contrle fentr en un site dancrage Transformation dun contrle en un enfant ancrable Contrle de lancrage des contrles enfant Contrle du dsancrage des contrles enfant Contrle de la rponse des contrles enfant aux oprations glisser-ancrer

7-4

Guide du dveloppeur

Implmentation du glisser-ancrer dans les contrles

Transformation dun contrle fentr en un site dancrage


Remarque

Les proprits de glisser-ancrer sont disponibles dans la VCL, mais non dans CLX. Pour transformer un contrle fentr en un site dancrage :

1 Mettez la proprit DockSite True. 2 Si lobjet site ancr ne doit apparatre que lorsquil contient un client ancr, mettez sa proprit AutoSize True. Lorsque AutoSize est True, le site ancr a pour taille 0 jusqu ce qu il accepte dancrer un contrle enfant, aprs quoi il est redimensionn de sorte quil englobe le contrle enfant.

Transformation dun contrle en un enfant ancrable


Remarque

Les proprits de glisser-ancrer sont disponibles dans la VCL, mais non dans CLX. Pour transformer un contrle en un enfant ancrable :

1 Mettez sa proprit DragKind dkDock. Lorsque DragKind est dkDock, le fait de faire glisser le contrle dplace ce dernier vers un nouveau site dancrage ou dsancre le contrle qui devient une fentre flottante. Lorsque DragKind est dkDrag (valeur par dfaut), le fait de faire glisser le contrle dmarre une opration glisser-dplacer qui doit tre implmente laide des vnements OnDragOver, OnEndDrag et OnDragDrop. 2 Mettez sa proprit DragMode dmAutomatic. Lorsque DragMode est dmAutomatic, le glissement (glisser-dplacer ou ancrage, suivant DragKind) est automatiquement lanc lorsque lutilisateur commence faire glisser le contrle avec la souris. Lorsque DragMode est dmManual, vous pouvez commencer une opration glisser-ancrer (ou glisser-dplacer) en appelant la mthode BeginDrag. 3 Dfinissez sa proprit FloatingDockSiteClass pour indiquer le descendant TWinControl qui doit hberger le contrle lorsquil est dsancr et devient une fentre flottante. Lorsque le contrle est libr et hors dun site dancrage, un contrle fentr de cette classe est dynamiquement cr et devient le parent de lenfant ancrable. Si le contrle enfant ancrable est un descendant de TWinControl, il nest pas ncessaire de crer un site ancr flottant spar pour hberger le contrle, bien quil soit possible de spcifier une fiche pour obtenir une bordure et une barre de titre. Pour ignorer une fentre conteneur dynamique, attribuez FloatingDockSiteClass la mme classe que le contrle et elle deviendra une fentre flottante sans parent.

Manipulation des contrles

7-5

Implmentation du glisser-ancrer dans les contrles

Contrle de lancrage des contrles enfant


Remarque

Les proprits de glisser-ancrer sont disponibles dans la VCL, mais non dans CLX. Un site dancrage accepte automatiquement les contrles enfant lorsquils sont librs au-dessus de lui. Pour la plupart des contrles, le premier enfant est ancr pour remplir la zone client, le deuxime divise cette dernire en diffrentes rgions, et ainsi de suite. Les contrles de page ancrent les enfants dans de nouvelles feuilles onglets (ou fusionnent dans des feuilles onglets si lenfant est un autre contrle de page). Trois vnements permettent aux sites dinfluer sur lancrage des contrles enfant :
property OnGetSiteInfo: TGetSiteInfoEvent; TGetSiteInfoEvent = procedure(Sender: TObject; DockClient: TControl; var TRect; var CanDock: Boolean) of object; InfluenceRect:

OnGetSiteInfo intervient sur le site dancrage lorsque lutilisateur fait glisser un enfant ancrable sur le contrle. Il permet au site dindiquer sil accepte en tant quenfant le contrle spcifi par le paramtre DockClient et, si tel est le cas, o lenfant doit se trouver en vue de son ancrage. Lorsque OnGetSiteInfo intervient, InfluenceRect est initialise selon les coordonnes dcran du site dancrage et CanDock est intialise True. Une rgion dancrage plus limite peut tre cre en changeant InfluenceRect et lenfant peut tre rejet en mettant CanDock False.
property OnDockOver: TDockOverEvent; TDockOverEvent = procedure(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object;

OnDockOver intervient sur le site dancrage lorsque lutilisateur fait glisser un enfant ancrable sur le contrle. Il est analogue lvnement OnDragOver au cours dune opration normale de glisser-dposer. Utilisez-le pour indiquer que lenfant peut tre relch en vue de son ancrage, en initialisant la proprit Accept. Si le contrle ancrable est rejet par le gestionnaire dvnement OnGetSiteInfo (par exemple, si le type de contrle est incorrect), OnDockOver ne se produit pas.
property OnDockDrop: TDockDropEvent; TDockDropEvent = procedure(Sender: TObject; Source: TDragDockObject; X, Y: Integer) of object;

OnDockDrop intervient sur le site dancrage lorsque lutilisateur relche lenfant ancrable sur le contrle. Il est analogue lvnement OnDragDrop au cours dune opration normale de glisser-dposer. Utilisez-le pour faire en sorte daccepter le contrle en tant que contrle enfant. Laccs au contrle enfant peut tre obtenu laide de la proprit Control de TDockObject spcifi par le paramtre Source.

7-6

Guide du dveloppeur

Manipulation du texte dans les contrles

Contrle du dsancrage des contrles enfant


Remarque

Les proprits de glisser-ancrer sont disponibles dans la VCL, mais non dans CLX. Un site dancrage permet de dsancrer automatiquement les contrles enfant lorsquils sont dplacs et que leur proprit DragMode vaut dmAutomatic. Les sites dancrage peuvent ragir lorsque les contrles enfant sont retirs, et mme empcher le dsancrage, dans un gestionnaire dvnement OnUnDock :
property OnUnDock: TUnDockEvent; TUnDockEvent = procedure(Sender: TObject; Client: TControl; var Allow: Boolean) object; of

Le paramtre Client indique le contrle enfant qui tente un dsancrage et le paramtre Allow permet au site dancrage (Sender) de rejeter le dsancrage. Lorsque vous implmentez un gestionnaire dvnement OnUnDock, il peut tre utile de connatre les autres enfants ventuellement ancrs. Ces informations figurent dans la proprit en lecture seule DockClients, qui est un tableau index de TControl. Le nombre de clients ancrs est donn par la proprit en lecture seule DockClientCount.

Contrle de la rponse des contrles enfant aux oprations glisser-ancrer


Remarque

Les proprits de glisser-ancrer sont disponibles dans la VCL, mais non dans CLX. Les contrles enfant ancrables disposent de deux vnements qui interviennent au cours des oprations glisser-ancrer. OnStartDock, analogue lvnement OnStartDrag dune opration glisser-dposer, permet au contrle enfant ancrable de crer un objet glisser personnalis . OnEndDock, comme OnEndDrag, se produit lorsque lopration glisser sachve.

Manipulation du texte dans les contrles


Les sections suivantes expliquent comment utiliser les diffrentes fonctions des contrles diteur de texte format et des contrles mmo. Certaines de ces fonctions peuvent aussi tre utilises avec les contrles diteur. Dfinition de lalignement du texte Ajout de barres de dfilement en mode excution Ajout de lobjet presse-papiers Slection de texte Slection de la totalit dun texte Oprations couper, copier et coller Suppression du texte slectionn Dsactivation des lments de menu Ajout dun menu surgissant Gestion de lvnement OnPopup

Manipulation des contrles

7-7

Manipulation du texte dans les contrles

Dfinition de lalignement du texte


Dans un composant mmo ou diteur de texte format, le texte peut tre align gauche, droite ou centr. Pour modifier lalignement du texte, sp cifiez la proprit Alignment du composant. Lalignement nest appliqu que si la proprit WordWrap est True ; si le retour la ligne automatique est dsactiv, il nexiste pas de marge sur laquelle saligner. Par exemple, le code suivant attache un gestionnaire dvnement OnClick llment de menu Caractre|Gauche, puis attache le mme gestionnaire dvnement aux deux lments de Droit et Centr du menu Caractre.
procedure TEditForm.AlignClick(Sender: TObject); begin Left1.Checked := False; { efface les trois coches } Right1.Checked := False; Center1.Checked := False; with Sender as TMenuItem do Checked := True; { coche llment cliqu } with Editor do { puis initialise Alignment pour faire correspondre } if Left1.Checked then Alignment := taLeftJustify else if Right1.Checked then Alignment := taRightJustify else if Center1.Checked then Alignment := taCenter; end;

Ajout de barres de dfilement en mode excution


Les composants mmo ou diteur de texte format peuvent contenir des barres de dfilement horizontales ou verticales ou les deux, selon les besoins. Lorsque le retour la ligne automatique est actif, le composant na besoin que dune barre de dfilement vertical. Si lutilisateur dsactive le retour la ligne automatique, le composant a besoin aussi dune barre de dfilement horizontal, puisque le texte nest plus limit par le bord droit de lditeur. Pour ajouter des barres de dfilement en mode excution :

1 Dterminez si le texte peut dpasser la marge droite. Dans la majorit des cas, cela implique de tester si le retour la ligne automatique est activ. Vous devrez aussi vrifier qu il existe rellement des lignes dpassant la largeur du contrle. 2 Dfinissez la proprit ScrollBars du composant mmo ou diteur de texte format de faon inclure ou exclure les barres de dfilement.
Lexemple suivant attache le gestionnaire de lvnement OnClick llment de menu Caractres | Retour la ligne.
procedure TEditForm.WordWrap1Click(Sender: TObject); begin with Editor do begin

7-8

Guide du dveloppeur

Manipulation du texte dans les contrles

WordWrap := not WordWrap; { active ou dsactive le retour la ligne } if WordWrap then ScrollBars := ssVertical { seule la barre verticale est ncessaire } else ScrollBars := ssBoth; { deux barres peuvent tre ncessaires } WordWrap1.Checked := WordWrap; { coche ou dsactive llment de menu } end; end;

Les composants mmo ou diteur de texte format ne grent pas les barres de dfilement exactement de la mme manire. Le composant diteur de texte format peut dissimuler ses barres de dfilement si le texte ne sort pas des limites du composant. Le composant Mmo affiche toujours les barres de dfilement lorsqu elles ont t actives.

Ajout de lobjet Clipboard


La plupart des applications manipulant du texte permettent aux utilisateurs de dplacer un texte slectionn dun document vers un autre, mme sil sagit dune autre application. Lobjet Clipboard de Delphi encapsule un presse-papiers (comme le Presse-papiers de Windows) et inclut les mthodes permettant de couper, de copier et de coller du texte (ainsi que dautres formats, par exemple les graphiques). Lobjet Clipboard est dclar dans lunit Clipbrd. Pour ajouter lobjet Clipboard une application,

1 Slectionnez lunit qui utilisera le presse-papiers. 2 Recherchez le mot rserv implementation. 3 Ajoutez Clipbrd la clause uses sous implementation.
Si une clause uses existe dj dans la partie implementation, ajoutez Clipbrd la fin de celle-ci. Sil ny a pas de clause uses, ajoutez-en une rdige ainsi :
uses Clipbrd;

Par exemple, dans une application contenant une fentre enfant, la clause uses dans la partie implmentation de lunit peut ressembler ceci :
uses MDIFrame, Clipbrd;

Slection de texte
Pour transfrer du texte dans le presse-papiers, il faut dabord slectionner ce texte. La possibilit de mettre en surbrillance le texte slectionn est intgre aux composants diteur. Lorsque lutilisateur slectionne un texte, celui-ci apparat en surbrillance.

Manipulation des contrles

7-9

Manipulation du texte dans les contrles

Le tableau suivant dresse la liste des proprits frquemment utilises pour la manipulation du texte slectionn.
Tableau 7.1 Proprit
SelText SelLength SelStart

Proprits du texte slectionn Description


Contient une chane reprsentant le texte slectionn dans le composant. Contient la longueur dune chane slectionne. Contient la position de dpart dune chane.

Slection de la totalit dun texte


La mthode SelectAll slectionne la totalit du texte prsent dans le composant mmo ou diteur de texte format. Cest particulirement utile quand le contenu de lditeur dpasse la zone visible du composant. Dans les autres cas, les utilisateurs peuvent slectionner du texte laide du clavier ou de la souris. Pour slectionner la totalit du contenu dun composant mmo ou diteur de texte format, appelez la mthode SelectAll du contrle RichEdit1. Par exemple,
procedure TMainForm.SelectAll(Sender: TObject); begin RichEdit1.SelectAll; { slectionne tout le texte du composant RichEdit } end;

Couper, copier et coller du texte


Les applications utilisant lunit Clipbrd peuvent couper, copier et coller du texte, des graphiques et des objets, dans le presse-papiers. Les composants diteur qui encapsulent les contrles de manipulation de texte standard disposent tous de mthodes intgres autorisant les interactions avec le presse-papiers. Pour plus dinformations sur lutilisation des graphiques et du presse-papiers, voir Utilisation du presse-papiers avec les graphiques la page 8-22. Pour couper, copier ou coller du texte avec le presse-papiers, appelez respectivement les mthodes CutToClipboard, CopyToClipboard et PasteFromClipboard du composant. Par exemple, le code suivant attache des gestionnaires aux vnements OnClick des commandes Edition | Couper, Edition | Copier et Edition | Coller :
procedure TEditForm.CutToClipboard(Sender: TObject); begin Editor.CutToClipboard; end; procedure TEditForm.CopyToClipboard(Sender: TObject); begin Editor.CopyToClipboard; end; procedure TEditForm.PasteFromClipboard(Sender: TObject);

7-10

Guide du dveloppeur

Manipulation du texte dans les contrles

begin Editor.PasteFromClipboard; end;

Effacement du texte slectionn


Vous pouvez effacer le texte slectionn dans un diteur sans le placer dans le presse-papiers. Pour ce faire, appelez la mthode ClearSelection de lditeur. Par exemple, sil existe un lment Supprimer dans le menu Edition, votre code peut ressembler :
procedure TEditForm.Delete(Sender: TObject); begin RichEdit1.ClearSelection; end;

Dsactivation des lments de menu


Il est souvent utile de dsactiver des commandes de menus sans pour autant les retirer du menu. Dans un diteur de texte, par exemple, si aucun texte n est slectionn, les commandes Couper, Copier et Supprimer du menu Edition sont inapplicables. Lactivation ou la dsactivation des lments de menu peut tre dclenche lorsque lutilisateur slectionne le menu. Pour dsactiver un lment de menu, donnez la valeur False sa proprit Enabled. Dans lexemple suivant, un gestionnaire est attach lvnement OnClick dun lment Edition appartenant la barre de menu dune fiche enfant. Il dfinit la proprit Enabled des lments Couper, Copier et Supprimer dans le menu Edition, selon que du texte est slectionn ou non dans le composant RichEdit1. La commande Coller sera active ou dsactive selon que le presse-papiers contient ou non du texte.
procedure TEditForm.Edit1Click(Sender: TObject); var HasSelection: Boolean; { dclare une variable temporaire } begin Paste1.Enabled := Clipboard.HasFormat(CF_TEXT); {active ou dsactive llment Coller } HasSelection := Editor.SelLength > 0; { True si du texte est slectionn } Cut1.Enabled := HasSelection; { activation des lments si HasSelection vaut True } Copy1.Enabled := HasSelection; Delete1.Enabled := HasSelection; end;

La mthode HasFormat du presse-papiers renvoie une valeur boolenne indiquant si le presse-papiers contient des objets, du texte ou des images dun format particulier. En appelant HasFormat avec le paramtre CF_TEXT, vous pouvez dterminer si le presse-papiers contient du texte, et activer ou dsactiver llment Coller selon le cas. Pour plus dinformations sur lutilisation du presse-Papiers avec des graphiques, voir chapitre 8, Utilisation des graphiques et du multimdia.

Manipulation des contrles

7-11

Manipulation du texte dans les contrles

Ajout dun menu surgissant


Les menus surgissants (ou locaux) sont dun usage courant et faciles mettre en uvre dans toute sorte dapplication. Ils rduisent le nombre doprations ncessaires la ralisation des tches : en cliquant avec le bouton droit de la souris sur lespace de travail de lapplication, lutilisateur accde une liste regroupant les commandes les plus frquemment utilises. Dans une application diteur de texte, par exemple, vous pouvez ajouter un menu surgissant qui comporte les commandes ddition Couper, Copier et Coller. Ces lments de menu surgissant peuvent utiliser les mmes gestionnaires dvnements que les lments correspondants du menu Edition. Il nest pas ncessaire de crer des raccourcis clavier, ni des touches raccourci pour les menus surgissants, car les lments des menus qui leur correspondent en possdent gnralement. La proprit PopupMenu dune fiche indique quel menu surgissant doit safficher lorsque lutilisateur clique avec le bouton droit de la souris sur la fiche. Les diffrents contrles possdent aussi leurs proprits PopupMenu qui ont priorit sur la proprit de la fiche, permettant de dfinir des menus personnaliss pour des contrles particuliers. Pour ajouter un menu surgissant une fiche,

1 Placez un composant menu surgissant sur la fiche. 2 Utilisez le concepteur de menus pour dfinir les lments du menu surgissant. 3 Dfinissez par le nom du composant menu surgissant la proprit PopupMenu de la fiche ou du contrle devant faire apparatre le menu. 4 Attachez les gestionnaires aux vnements OnClick des lments du menu surgissant.

Gestion de lvnement OnPopup


Il peut tre ncessaire de prparer certains lments dun menu surgissant avant dafficher celui-ci, comme vous devez spcifier les lments activs ou dsactivs dun menu normal. Avec un menu normal, lvnement OnClick correspondant laffichage du menu est gnralement associ au titre de ce menu, comme dcrit dans la section Dsactivation des lments de menu la page 7-11. Comme les menus surgissants nont pas de barre de menu, vous devez grer lvnement dans le composant lui-mme. Le composant menu surgissant offre pour cela un vnement particulier appel OnPopup. Pour prparer des lments dun menu surgissant avant de les afficher,

1 Slectionnez le composant menu surgissant. 2 Attachez un gestionnaire son vnement OnPopup. 3 Ecrivez dans le gestionnaire dvnement le code activant, dsactivant, dissimulant ou affichant les lments du menu.

7-12

Guide du dveloppeur

Ajout de graphiques des contrles

Dans le code suivant, un gestionnaire existant pour lvnement Edit1Click dcrit prcdemment dans la section D sactivation des lments de menu la page 7-11 est attach lvnement OnPopup du composant menu surgissant. Une ligne de code est ajoute Edit1Click pour chaque lment du menu surgissant.
procedure TEditForm.Edit1Click(Sender: TObject); var HasSelection: Boolean; begin Paste1.Enabled := Clipboard.HasFormat(CF_TEXT); Paste2.Enabled := Paste1.Enabled;{Ajoute cette ligne} HasSelection := Editor.SelLength <> 0; Cut1.Enabled := HasSelection; Cut2.Enabled := HasSelection;{Ajoute cette ligne} Copy1.Enabled := HasSelection; Copy2.Enabled := HasSelection;{Ajoute cette ligne} Delete1.Enabled := HasSelection; end;

Ajout de graphiques des contrles


Plusieurs contrles permettent de personnaliser la manire dont le contrle est restitu. Ce sont les botes liste, botes options, menus, en-ttes, contrles onglets, vues liste, barres dtat, vues arborescentes et barres dtat. Au lieu dutiliser la mthode standard dessinant un contrle ou chacun de ses lments, le propritaire du contrle (gnralement la fiche) dessine ces lments en mode excution. Lutilisation la plus courante de ces contrles dessins par le propritaire est de remplacer le texte par des dessins ou dajouter des dessins au texte des lments. Pour des informations sur lutilisation du style dessin par le propritaire pour ajouter des images aux menus, voir Ajout dimages des lments de menu la page 6-40. Les contrles dessins par le propritaire ont un point commun : ils contiennent tous des listes dlments. Gnralement, il sagit de listes de chanes qui sont affiches sous forme de texte ou de liste dobjets contenant des chanes qui sont affiches sous forme de texte. Il est possible dassocier un objet chaque lment de ces listes et dutiliser lobjet lorsque vous dessinez un lment. Dans Delphi, la cration dun contrle dessin par le propritaire se fait gnralement en trois tapes :

1 Spcification du style dessin par le propritaire 2 Ajout dobjets graphiques une liste de chanes 3 Dessiner des lments dessins par le propritaire

Manipulation des contrles

7-13

Ajout de graphiques des contrles

Spcification du style dessin par le propritaire


Pour personnaliser le dessin dun contrle, vous devez spcifier des gestionnaires dvnements qui restituent limage du contrle quand il doit tre dessin. Certains contrles reoivent automatiquement ces vnements. Par exemple, les vues liste ou arborescentes et les barres doutils reoivent les vnements aux diverses tapes du processus de dessin sans avoir dfinir la moindre proprit. Ces vnements ont des noms de la forme OnCustomDraw ou OnAdvancedCustomDraw. Dautres contrles ncessitent linitialisation dune proprit avant de recevoir les vnements de dessin personnalis. Les botes liste, les botes options, les enttes et les barres dtat ont une proprit appele Style. La proprit Style dtermine si le contrle utilise le dessin par dfaut (appel style standard) ou bien le dessin effectu par le propritaire. Les grilles utilisent une proprit appele DefaultDrawing qui permet dactiver ou de dsactiver le dessin par dfaut. Les vues listes et les contrles onglets ont une proprit appele OwnerDraw qui active ou dsactive le dessin par dfaut. Pour les botes liste et les botes options, il y a plusieurs styles dessins par le propritaire, appels fixed et variable, comme dcrit dans le tableau suivant. Les autres contrles sont toujours fixes : bien que la taille de llment contenant du texte soit variable, la taille de chaque lment est fixe avant le dessin du contrle.
Tableau 7.2 Comparaison entre les styles fixed et variable Signification
Chaque lment est de la m me hauteur, dtermine par la proprit ItemHeight. Chaque lment peut avoir une hauteur diffrente qui dpend des donnes au moment de lexcution.

Styles dessin s par le propri taire


Fixed Variable

Exemples
lbOwnerDrawFixed, csOwnerDrawFixed lbOwnerDrawVariable, csOwnerDrawVariable

Ajout dobjets graphiques une liste de chanes


Toute liste de chanes est capable de contenir une liste dobjets en plus de sa liste de chanes. Dans une application de gestion de fichiers, par exemple, vous devez ajouter un bitmap indiquant le type du lecteur la lettre le dsignant. Pour cela, vous devez ajouter les images bitmap lapplication, puis les copier lendroit appropri dans la liste de chanes, comme le dcrivent les sections suivantes.

Ajout dimages une application


Un contrle image est un contrle non visuel qui contient une image graphique (un bitmap, par exemple). Les contrles image servent afficher des images graphiques sur une fiche, mais vous pouvez aussi les utiliser pour stocker des

7-14

Guide du dveloppeur

Ajout de graphiques des contrles

images caches que vous utiliserez dans votre application. Par exemple, il est possible de stocker des images bitmap pour les contrles dessins par le propritaire dans des contrles image cachs, comme dcrit ci-dessous :

1 Ajoutez des contrles image la fiche principale. 2 Dfinissez leurs proprits Name. 3 Donnez la valeur False la proprit Visible de chaque contrle image. 4 Dfinissez la proprit Picture de chaque contrle image par le bitmap souhait en utilisant lditeur dimage depuis linspecteur dobjets.
Les contrles image seront invisibles lorsque vous excuterez lapplication.

Ajout dimages une liste de chanes


Une fois que vous avez des images graphiques dans une application, vous pouvez les associer aux chanes de la liste. Vous pouvez soit ajouter les objets en mme temps que les chanes, soit les associer des chanes qui ont dj t ajoutes. Si vous disposez de toutes les donnes dont vous avez besoin, vous ajouterez sans doute les chanes et les objets en mme temps. Lexemple suivant montre comment ajouter des images une liste de chanes. Ce code est extrait dune application de gestion de fichiers dans laquelle chaque lecteur correct est reprsent par une lettre et est associ un bitmap indiquant le type du lecteur. Lvnement OnCreate se prsente comme suit :
procedure TFMForm.FormCreate(Sender: TObject); var Drive: Char; AddedIndex: Integer; begin for Drive := A to Z do { passe par tous les lecteurs possibles } begin case GetDriveType(Drive +:/) of { valeurs positives signifiant des lecteurs valides } DRIVE_REMOVABLE: { ajoute un onglet } AddedIndex := DriveTabSet.Tabs.AddObject(Drive, Floppy.Picture.Graphic); DRIVE_FIXED: { ajoute un onglet } AddedIndex := DriveTabSet.Tabs.AddObject(Drive, Fixed.Picture.Graphic); DRIVE_REMOTE: { ajoute un onglet } AddedIndex := DriveTabSet.Tabs.AddObject(Drive, Network.Picture.Graphic); end; if UpCase(Drive) = UpCase(DirectoryOutline.Drive) then { lecteur actif ? } DriveTabSet.TabIndex := AddedIndex; { puis en fait longlet en cours } end; end;

Dessiner des lments dessins par le propritaire


Lorsque vous avez spcifi qu un contrle est dessin par le propritaire (en initialisant une proprit ou en dfinissant un gestionnaire dvnement), le contrle nest plus dessin lcran. Au lieu de cela, le systme dexploitation gnre un vnement pour chaque lment visible du contrle. Cest votre application qui gre ces vnements et dessine les lments.

Manipulation des contrles

7-15

Ajout de graphiques des contrles

Pour dessiner les lments dun contrle dessin par le propritaire, suivez les tapes indiques ci-aprs. Ces tapes se rptent pour chaque lment visible du contrle, mais vous utiliserez le mme gestionnaire dvnement pour tous.

1 Le cas chant, dimensionnez llment.


Si les lments sont tous de mme taille (par exemple, avec un style de bote liste lsOwnerDrawFixed), cette opration nest pas ncessaire.

2 Dessinez llment.

Dimensionnement des lments dessins par le propritaire


Avant de laisser votre application dessiner chaque lment dun contrle de taille variable lorsquil est dessin par le propritaire, le systme dexploitation gnre un vnement de type measure-item. Cet vnement indique lapplication lendroit o llment apparatra sur le contrle. Delphi dtermine la taille probable de llment (gnralement juste assez grand pour afficher le texte de llment dans la police de caractres active). Votre application peut grer lvnement et modifier la zone rectangle choisie. Par exemple, si vous comptez remplacer le texte de llment par une image bitmap, vous modifierez le rectangle pour quil soit de la taille du bitmap. Si vous voulez avoir la fois limage et le texte, vous ajusterez la taille du rectangle pour quil puisse contenir les deux. Pour changer la taille dun lment dessin par le propritaire, attachez un gestionnaire lvnement measure-item dans le contrle dessin par le propritaire. Le nom de lvnement peut varier en fonction du contrle. Les botes liste et les botes options utilisent OnMeasureItem. Les grilles nont pas ce type dvnement. Lvnement dfinissant la taille utilise deux paramtres importants : lindice et la taille de llment. Cette taille est variable : lapplication peut laugmenter ou la diminuer. La position des lments suivants dpend de la taille des lments prcdents. Par exemple, dans une bote liste variable dessine par le propritaire, si lapplication dfinit la hauteur du premier lment cinq pixels, le second lment commence au sixime pixel depuis le haut, et ainsi de suite. Dans les botes liste et dans les botes options, le seul aspect des lments que lapplication puisse changer est la hauteur. La largeur de llment est toujours celle du contrle. Les grilles dessines par le propritaire ne peuvent pas modifier la taille des cellules au fur et mesure quelles sont dessines. En effet, la taille des lignes et des colonnes est dfinie avant le dessin par les proprits ColWidths et RowHeights. Le code suivant, attach lvnement OnMeasureItem du composant bote liste dessine par le propritaire, augmente la hauteur de chaque lment de liste pour permettre de placer limage bitmap associe.

7-16

Guide du dveloppeur

Ajout de graphiques des contrles

procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer; var TabWidth: Integer); { notez que TabWidth dfinit un paramtre var} var BitmapWidth: Integer; begin BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width; { augmente la largeur de longlet de celle du bitmap associ plus deux } Inc(TabWidth, 2 + BitmapWidth); end; Remarque

Vous devez transtyper les lments partir de la proprit Objects dans la liste de chanes. Objects est une proprit de type TObject, aussi peut-elle contenir nimporte quel type dobjet. Lorsque vous extrayez un objet dun tableau, vous devez le transtyper afin quil reprenne le type des lments.

Dessin des lments par le propritaire


Lorsquune application doit dessiner ou redessiner un contrle dessin par le propritaire, le systme dexploitation gnre un vnement de type draw-item pour chaque lment visible du contrle. Selon le contrle, llment peut galement recevoir les vnements de dessin pour llment pris comme un tout ou comme sous-lments. Pour dessiner chaque lment dun contrle dessin par le propritaire, attachez un gestionnaire lvnement draw-item de ce contrle. Les noms des vnements relatifs aux objets dessins par le propritaire commencent gnralement par : OnDraw, comme OnDrawItem ou OnDrawCell OnCustomDraw, comme OnCustomDrawItem OnAdvancedCustomDraw , comme OnAdvancedCustomDrawItem Lvnement draw-item contient des paramtres identifiant llment dessiner, le rectangle dans lequel il sinscrit et, habituellement, des informations sur son tat (actif, par exemple). Lapplication gre chaque vnement en plaant llment appropri dans le rectangle transmis. Par exemple, le code suivant montre comment dessiner des lments dans une bote liste ayant un bitmap associ chaque chane. Il attache ce gestionnaire lvnement OnDrawItem :
procedure TFMForm.DriveTabSetDrawTab(Sender: TObject; TabCanvas: TCanvas; R: TRect; Index: Integer; Selected: Boolean); var Bitmap: TBitmap; begin Bitmap := TBitmap(DriveTabSet.Tabs.Objects[Index]); with TabCanvas do begin Draw(R.Left, R.Top + 4, Bitmap); { dessine le bitmap } TextOut(R.Left + 2 + Bitmap.Width, { positionne le texte } R.Top + 2, DriveTabSet.Tabs[Index]); { et le dessine droite du bitmap } end; end;

Manipulation des contrles

7-17

7-18

Guide du dveloppeur

Chapitre

Chapitre 8

Utilisation des graphiques et du multimdia

Les lments graphiques et multimdia permettent damliorer la prsentation de vos applications. Delphi propose divers moyens dintroduire ces caractristiques dans votre application. Pour ajouter des lments graphiques, vous pouvez insrer des images pr-dessines la conception, les crer en utilisant des contrles graphiques la conception ou les dessiner dynamiquement lexcution. Pour ajouter des fonctions multimdia, Delphi propose des composants spciaux qui peuvent jouer des squences audio et vido. Notez que les composants multimdia ne sont disponibles en programmation multiplateforme.

Prsentation de la programmation relative aux graphiques


Les composants graphiques de la VCL dfinis dans lunit Graphics encapsulent la GDI (Graphics Device Interface) de Windows pour faciliter lajout de graphiques aux applications Windows. Les composants graphiques CLX dfinis dans lunit QGraphics encapsulent les widgets graphiques Qt pour permettre dajouter des graphiques aux applications multiplates-formes. Lorsque vous dessinez des graphiques dans une application Delphi, vous travaillez sur le canevas, de lobjet, plutt que directement sur lobjet. Le mot Canvas dsigne une proprit de lobjet, mais cest aussi un objet. Le principal avantage de lobjet canevas est quil gre efficacement des ressources et prend en compte le contexte de priphrique. Que vous dessiniez sur des bitmaps, sur lcran, sur limprimante ou sur des mtafichiers (dessins dans CLX), vos programmes peuvent utiliser les mmes mthodes. Les canevas sont uniquement disponibles en phase dexcution. Tout le travail relatif aux canevas se fait donc en crivant du code. Les sections suivantes expliquent comment utiliser les composants graphiques de la VCL pour simplifier les oprations de programmation.

Utilisation des graphiques et du multimdia

8-1

Prsentation de la programmation relative aux graphiques

Remarque VCL

Puisque TCanvas est un gestionnaire de ressources qui enveloppe le contexte de priphrique Windows, vous pouvez aussi utiliser toutes les fonctions GDI de Windows sur le canevas. La proprit Handle du canevas est le handle du contexte de priphrique. TCanvas est un gestionnaire de ressources qui enveloppe un dispositif de dessin Qt. La proprit Handle du canevas est un pointeur typ sur linstance dun objet dispositif de dessin Qt. Le fait que ce pointeur dinstance soit expos vous permet dutiliser les fonctions de bas niveau de la bibliothque graphique Qt qui ncessitent un pointeur dinstance sur un objet dispositif de dessin. La faon dont les images graphiques apparaissent dans votre application dpend de la faon dont elles sont dessines. Si vous dessinez directement dans le canevas dun contrle, limage est affiche directement. Toutefois, si vous dessinez sur une image hors cran comme un canevas Tbitmap, limage napparat que lorsquun contrle effectue la copie dun bitmap sur le canevas du contrle. Ce qui signifie que lorsquon dessine des bitmaps et quon les affecte un contrle image, limage napparat que si le contrle a la possibilit de traiter son message (VCL) ou son vnement (CLX) OnPaint. Lorsquon travaille avec des graphiques, on rencontre frquemment les termes dessin et peinture : Lorsque vous dessinez, vous crez avec du code un seul lment graphique spcifique tel quune ligne ou une forme. Dans votre code, vous indiquez un objet de dessiner un graphique particulier un emplacement particulier sur son canevas en appelant une mthode de dessin du canevas. Lorsque vous peignez, vous crez lapparence entire dun objet. La peinture implique gnralement le dessin. En effet, en rponse des vnements OnPaint, un objet dessinera des graphiques. Une bote de saisie, par exemple, se peint elle-mme en dessinant un rectangle, puis en dessinant du texte lintrieur. Un contrle forme, en revanche, se peint lui-mme en dessinant un seul graphique. Les exemples donns au dbut de ce chapitre dmontrent comment dessiner divers graphiques en rponse des vnements OnPaint. Les sections ultrieures montrent comment faire le mme type de dessin en rponse dautres vnements.

Remarque CLX

Rafrachissement de lcran
A certains moments, le systme dexploitation dtermine que lapparence des objets affichs lcran doit tre rafrachie. Windows gnre des messages WM_PAINT que la VCL redirige vers des gestionnaires dvnements OnPaint. (Si vous utilisez CLX dans le cadre du dveloppement multiplate-forme, un vnement de dessin est gnr que CLX redirige vers des gestionnaires dvnements OnPaint.) Si vous avez crit un gestionnaire de lvnement OnPaint pour cet objet, il est appel lorsque vous utilisez la mthode Refresh. Le nom gnr par dfaut pour le gestionnaire dvnement OnPaint dans un fiche est FormPaint. La mthode Refresh est parfois utilise pour rafrachir un composant ou une fiche. Par exemple, la mthode Refresh peut tre appele dans

8-2

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

le gestionnaire dvnement OnResize de la fiche afin de rafficher des graphiques ou, si vous utilisez la VCL, pour dessiner un fond sur la fiche. Bien que certains systmes dexploitation grent automatiquement laffichage des zones clientes dune fentre qui ne sont plus valides, Windows ne le fait pas. Pour Windows, tout dessin est considr comme permanent. Lorsquune fiche ou un contrle est temporairement masqu, par exemple lors dun glisser-dplacer, la fiche ou le contrle doivent repeindre la zone masque lorsquelle ne lest plus. Pour plus dinformations sur le message WM_PAINT, voir laide en ligne de Windows. Lors de lutilisation du contrle TImage pour afficher une image graphique sur une fiche, le dessin et le rafrachissement du graphique contenu dans le TImage sont grs automtiquement. La proprit Picture sp cifie le bitmap, le dessin ou tout autre objet raphique affich par TImage. Vous pouvez aussi dfinir la proprit Proportional pour que limage limage soir affiche sans distorsion dans le contrle image. Dessiner sur un TImage cre une image persistante. Par consquent, il nest pas ncessaire de redessiner limage contenue. Au contraire, le canevas dun TPaintBox crit directement sur le pilote de lcran (VCL) ou le dispositif de dessin (CLX), et de ce fait, tout ce qui est dessin sur le canevas du PaintBox est transitoire. Cela est vrai pour les contrles similaires, y compris la fiche elle-mme. De plus, si vous dessinez ou peignez partir du constructeur dun TPaintBox, vous devrez ajouter ce code dans le gestionnaire OnPaint afin que limage soit repeinte chaque fois que la zone cliente est invalide.

Types des objets graphiques


La VCL et CLX proposent les objets graphiques numrs dans le tableau suivant. Ces objets disposent de mthodes pour dessiner dans le canevas, dcrites dans la section Utilisation des mthodes du canevas pour dessiner des objets graphiques la page 8-10, et pour charger et enregistrer des fichiers graphiques (voir Chargement et enregistrement de fichiers graphiques la page 8-20).
Tableau 8.1 Objet
Picture

Types dobjets graphiques Description


Utilis pour contenir une image graphique. Pour ajouter dautres formats de fichiers graphiques, utilisez la m thode Register de lobjet Picture. Elle permet de grer des fichiers arbitraires comme laffichage dimages dans un contrle image. Objet graphique utilis pour crer des images, les manipuler (mise lchelle, dfilement, rotation et peinture) et les stocker sur disque sous forme de fichiers. Il est trs facile de crer la copie dun bitmap, puisque cest le handle qui est copi et non limage. Reprsente le conteneur dun texte ou dun graphique qui est coup, copi ou coll depuis ou vers une application. Grce au presse-papiers, vous pouvez extraire des donnes en fonction dun format donn ; comptage des rfrences dhandles, et louverture et la fermeture du presse-papiers ; grer et manipuler des formats pour les objets du presse-papiers.

Bitmap

Clipboard

Utilisation des graphiques et du multimdia

8-3

Prsentation de la programmation relative aux graphiques

Tableau 8.1 Objet


Icon Metafile (VCL seulement) Drawing (CLX seulement)

Types dobjets graphiques (suite) Description


Reprsente la valeur charge depuis un fichier icne (fichier .ICO). Contient un fichier, qui enregistre les oprations ncessaires la construction dune image, au lieu de contenir les pixels du bitmap de limage. Les mtafichiers ou les dessins sont extrmement rductibles sans perte de dtail de limage et ncessitent souvent moins de mmoire que les bitmaps, particulirement pour les pilotes haute rsolution comme les imprimantes. Mais les mtafichiers et les dessins ne sont pas aussi rapides que les bitmaps. Utilisez les mtafichiers ou les dessins lorsque vous recherchez souplesse et prcison plutt que les performances.

Proprits et mthodes communes du canevas


Le tableau suivant numre les principales proprits de lobjet canevas. Pour une liste complte des proprits et des mthodes, voir la rubrique traitant du composant TCanvas dans laide en ligne.
Tableau 8.2 Proprit
Font

Proprits communes de lobjet canevas Description


Spcifie la police devant tre utilise pour crire du texte sur limage. Dfinit les proprits de lobjet TFont afin de spcifier le type de police, sa couleur, sa taille, et son style. Dtermine la couleur et le modle utiliss par le canevas pour remplir les fonds et les formes graphiques. Dfinissez les proprits de lobjet TBrush pour spcifier la couleur et le modle ou le bitmap utiliser lors du remplissage des espaces sur le canevas. Spcifie le type de crayon utilis par le canevas pour dessiner des lignes et des formes. Dfinissez les proprits de lobjet TPen de faon spcifier la couleur, le style, la largeur et le mode du crayon. Spcifie la position de dessin en cours du crayon. Spcifie la couleur des pixels lintrieur du ClipRect en cours.

Brush

Pen

PenPos Pixels

Pour davantage dinformations sur ces proprits, voir Utilisation des proprits de lobjet canevas la page 8-5. Le tableau suivant liste les diffrentes mthodes pouvant tre utilises :
Tableau 8.3 M thode
Arc Chord CopyRect Draw

Mthodes communes de lobjet canevas Description


Dessine un arc sur limage ainsi que le primtre de lellipse dlimite par le rectangle spcifi. Dessine une figure ferme reprsente par lintersection dune ligne et dune ellipse. Copie une partie de limage dun autre canevas sur le canevas. Dessine sur le canevas lemplacement donn par les coordonnes (X, Y) lobjet graphique spcifi par le paramtre Graphic.

8-4

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Tableau 8.3 M thode


Ellipse FillRect

Mthodes communes de lobjet canevas (suite) Description


Dessine sur le canevas lellipse dfinie par un rectangle dlimit. Remplit sur le canevas le rectangle spcifi en utilisant le pinceau en cours. Remplit une zone du canevas en utilisant le pinceau en cours. Dessine un rectangle en utilisant le pinceau du canevas pour dessiner sa bordure. Dessine une ligne sur le canevas en partant de la position de PenPos au point spcifi par X et Y, et dfinit la position du crayon (X, Y). Change la position de dessin en cours par le point (X,Y). Dessine sur le canevas un secteur de lellipse dlimite par le rectangle (X1, Y1) et (X2, Y2). Dessine sur le canevas une srie de lignes connectant les points transmis et fermant la forme par une ligne allant du dernier point au premier point. Dessine sur le canevas une srie de lignes la position en cours du crayon et connectant chacun des points transmis dans Points. Dessine sur le canevas un rectangle dont le coin suprieur gauche apparat au point (X1, Y1) et le coin infrieur droit au point (X2, Y2). Utilisez Rectangle pour dessiner un cadre utilisant Pen et remplissez-le avec Brush. Dessine sur le canevas un rectangle coins arrondis. Dessine sur le canevas un graphique afin que limage tienne dans le rectangle spcifi. Le facteur damplification de limage devra sans doute tre modifi pour que limage tienne dans le rectangle. Renvoie respectivement la hauteur et la largeur dune chane dans la police en cours. La hauteur inclut lintervalle entre les lignes. Ecrit sur le canevas une chane commenant au point (X,Y), puis modifie PenPos par rapport la fin de la chane. Ecrit une chane lintrieur dune rgion ; toute partie de la chane se trouvant lextrieur de la rgion ne sera pas visible.

FloodFill (VCL seulement) FrameRect LineTo MoveTo Pie Polygon Polyline Rectangle

RoundRect StretchDraw

TextHeight, TextWidth TextOut TextRect

Pour davantage dinformations sur ces mthodes, voir Utilisation des mthodes du canevas pour dessiner des objets graphiques la page 8-10.

Utilisation des proprits de lobjet canevas


A lobjet canevas, il est possible de dfinir les proprits dun crayon afin quil dessine des lignes, celles dun pinceau pour quil remplisse des formes, celles dune fonte pour crire du texte et celles dun tableau de pixels pour reprsenter une image. Cette section traite des sujets suivants : Utilisation des crayons Utilisation des pinceaux Lecture et dfinition des pixels

Utilisation des graphiques et du multimdia

8-5

Prsentation de la programmation relative aux graphiques

Utilisation des crayons


La proprit Pen dun canevas contrle la faon dont les lignes apparaissent, y compris les lignes dessines pour dfinir le pourtour dune forme. Dessiner une ligne droite revient changer un groupe de pixels aligns entre deux points. Le crayon lui-mme possde quatre proprits quil est possible de changer : Color, Width, Style, et Mode. Proprit Proprit Proprit Proprit Color: modifie la couleur du crayon Width: modifie la largeur du crayon Style: modifie le style du crayon Mode: modifie le mode du crayon

Les valeurs de ces proprits dterminent la faon dont le crayon change les pixels de la ligne. Par dfaut, chaque crayon est noir, a une largeur de 1 pixel, est de style uni, et a un mode appel copie qui crase tout ce qui se trouve dj sur le canevas. Vous pouvez utiliser TPenRecall pour enregistrer et restaurer rapidement les proprits des crayons.

Changement de la couleur du crayon


La couleur du crayon est dfinie en mode excution comme toute autre proprit Color. La couleur du crayon dtermine la couleur des lignes qu il dessine : lignes, polylignes et contour des formes, ainsi que dautres types de lignes et polylignes. Pour modifier la couleur du crayon, donnez une valeur la proprit Color du crayon. Pour permettre lutilisateur de choisir une nouvelle couleur de crayon, vous devez placer une grille de couleurs dans la barre doutils du crayon. Une grille de couleurs permet de spcifier une couleur de premier plan et une couleur darrire-plan. Si vous nutilisez pas de grille, vous devez penser fournir une couleur darrire-plan pour dessiner les intervalles entre les segments de lignes. La couleur darrire-plan provient de la proprit Color du pinceau. Quand lutilisateur choisit une nouvelle couleur en cliquant dans la grille, ce code modifie la couleur du crayon en rponse lvnement OnClick :
procedure TForm1.PenColorClick(Sender: TObject); begin Canvas.Pen.Color := PenColor.ForegroundColor; end;

Changement de lpaisseur du crayon


Lpaisseur du crayon dtermine la taille, exprime en pixels, de la ligne quil dessine.
Remarque

Noubliez pas que lorsque lpaisseur est suprieure un pixel, Windows 95/98 dessine toujours une ligne continue, sans tenir compte de la valeur de la proprit Style du crayon. Pour modifier lpaisseur du crayon, affectez une valeur numrique la proprit Width du crayon.

8-6

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Supposons que la barre doutils du crayon contienne une barre de dfilement permettant de dfinir la largeur de celui-ci, et que vous vouliez mettre jour le libell attenant la barre de dfilement pour que lutilisateur voit ce quil fait. Pour utiliser la position de la barre de dfilement afin de dterminer lpaisseur du crayon, il est ncessaire de changer lpaisseur du crayon chaque fois que la position change. Voici comment traiter lvnement OnChange de la barre de dfilement :
procedure TForm1.PenWidthChange(Sender: TObject); begin Canvas.Pen.Width := PenWidth.Position;{ dfinit la largeur de crayon directement } PenSize.Caption := IntToStr(PenWidth.Position);{ conversion en chane pour le libell } end;

Changement du style du crayon


La proprit Style dun crayon permet de crer des lignes continues, pointilles ou tirets.
Remarque VCL

Dans le dveloppement dune application multiplate-forme devant tre dploye sous Windows, Windows 95/98 ne permet pas de dessiner des lignes pointilles ou tirets lorsque le crayon a une largeur suprieure un pixel. Il dessine la place une ligne continue, quel que soit le style spcifi. La dfinition des proprits dun crayon est une opration qui se prte parfaitement au partage dvnements entre plusieurs contrles. Pour dterminer le contrle qui reoit lvnement, il suffit de tester le paramtre Sender. Pour crer un gestionnaire pour lvnement clic de chacun des six boutons de style de la barre doutils dun crayon, procdez comme suit :

1 Slectionnez les six boutons de style de crayon et choisissez Inspecteur dobjets| Evnements|vnement OnClick et tapez SetPenStyle dans la colonne des gestionnaires.
Delphi gnre un gestionnaire vide appel SetPenStyle et lattache lvnement OnClick de chacun des six boutons.

2 Remplissez le gestionnaire de lvnement Onclick en dfinissant le style du crayon selon la valeur du paramtre Sender qui dsigne le contrle ayant envoy lvnement clic :
procedure TForm1.SetPenStyle(Sender: TObject); begin with Canvas.Pen do begin if Sender = SolidPen then Style := psSolid else if Sender = DashPen then Style := psDash else if Sender = DotPen then Style := psDot else if Sender = DashDotPen then Style := psDashDot else if Sender = DashDotDotPen then Style := psDashDotDot else if Sender = ClearPen then Style := psClear; end; end;

Utilisation des graphiques et du multimdia

8-7

Prsentation de la programmation relative aux graphiques

Changement du mode du crayon


La proprit Mode dun crayon vous permet de spcifier les diffrentes faons de combiner la couleur du crayon celle du canevas. Par exemple, le crayon peut toujours tre noir, tre de la couleur inverse larrire-plan du canevas, etc. Pour plus de dtails, voir la rubrique traitant de TPen dans laide en ligne.

Renvoi de la position du crayon


La position de dessin en cours, position partir de laquelle le crayon va dessiner la prochaine ligne, est appele la position du crayon. Le canevas stocke la position du crayon dans sa proprit PenPos. Cette position naffecte que le dessin des lignes ; pour les formes et le texte, vous devez spcifier toutes les coordonnes dont vous avez besoin. Pour dfinir la position du crayon, appelez la mthode MoveTo du canevas. Par exemple, le code suivant dplace la position du crayon sur le coin suprieur gauche du canevas :
Canvas.MoveTo(0, 0); Remarque

Lorsquune ligne est dessine avec la mthode LineTo, la position en cours est dplace sur le point darrive de la ligne.

Utilisation des pinceaux


La proprit Brush dun canevas dtermine la faon dont les zones sont remplies, y compris lintrieur des formes. Remplir une zone avec le pinceau revient changer dune certaine faon un grand nombre de pixels adjacents. Le pinceau a trois proprits que vous pouvez manipuler : Proprit Color : modifie la couleur de remplissage Proprit Style : modifie le style du pinceau Proprit Bitmap : utilise un bitmap comme modle de pinceau Les valeurs de ces proprits dterminent la faon dont le canevas remplit les formes et dautres zones. Par dfaut, chaque pinceau est blanc, a un style uni et na pas de motif de remplissage. Vous pouvez utiliser TBrushRecall pour enregistrer et restaurer rapidement les proprits des pinceaux.

Changement de la couleur du pinceau


La couleur du pinceau dtermine la couleur utilise par le canevas pour remplir les formes. Pour modifier la couleur de remplissage, affectez une valeur la proprit Color du pinceau. Le pinceau est utilis pour la couleur darrire-plan dans le dessin de lignes et de texte. Il est possible de dfinir la couleur du pinceau de la mme manire que celle du crayon, en rponse un clic dans la grille de couleurs prsente dans la barre doutils du pinceau (voir la section Changement de la couleur du crayon la page 8-6) :
procedure TForm1.BrushColorClick(Sender: TObject); begin

8-8

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Canvas.Brush.Color := BrushColor.ForegroundColor; end;

Changement du style du pinceau


Le style dun pinceau dtermine le motif utilis pour remplir les formes. Il vous permet de spcifier diffrentes faons de combiner la couleur du pinceau des couleurs dj prsentes sur le canevas. Les styles prdfinis comprennent des couleurs unies, pas de couleur et divers motifs de lignes et de hachurages. Pour modifier le style dun pinceau, dfinissez sa proprit Style par lune des valeurs prdfinies suivantes : bsSolid, bsClear, bsHorizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross ou bsDiagCross. Cet exemple dfinit le style du pinceau en faisant partager le mme gestionnaire dvnement OnClick aux huit boutons de style de pinceau. Tous les boutons sont slectionns, OnClick est slectionn dans Inspecteur dobjets|Evnements et le gestionnaire OnClick porte le nom SetBrushStyle.
procedure TForm1.SetBrushStyle(Sender: TObject); begin with Canvas.Brush do begin if Sender = SolidBrush then Style := bsSolid else if Sender = ClearBrush then Style := bsClear else if Sender = HorizontalBrush then Style := bsHorizontal else if Sender = VerticalBrush then Style := bsVertical else if Sender = FDiagonalBrush then Style := bsFDiagonal else if Sender = BDiagonalBrush then Style := bsBDiagonal else if Sender = CrossBrush then Style := bsCross else if Sender = DiagCrossBrush then Style := bsDiagCross; end; end;

Dfinition de la proprit Bitmap du pinceau


La proprit Bitmap du pinceau vous permet de spcifier une image bitmap qui sera utilise comme motif de remplissage des formes et des autres zones. Lexemple suivant charge un bitmap dun fichier et laffecte au pinceau du canevas de la fiche Form1 :
var Bitmap: TBitmap; begin Bitmap := TBitmap.Create; try Bitmap.LoadFromFile(MyBitmap.bmp); Form1.Canvas.Brush.Bitmap := Bitmap; Form1.Canvas.FillRect(Rect(0,0,100,100)); finally Form1.Canvas.Brush.Bitmap := nil; Bitmap.Free; end; end;

Utilisation des graphiques et du multimdia

8-9

Prsentation de la programmation relative aux graphiques

Remarque

Le pinceau nassume pas la possession dun objet bitmap affect sa proprit Bitmap. Vous devez vous assurer que lobjet Bitmap reste valide pendant la dure de vie du pinceau, aprs quoi vous devez vous-mme librer lobjet Bitmap.

Lecture et dfinition de pixels


Chaque canevas a une proprit Pixels indexe qui reprsente les points de couleur constituant limage sur le canevas. Vous devrez rarement accder directement la proprit Pixels, sauf si vous voulez connatre ou modifier la couleur dun pixel particulier.
Remarque

La dfinition de pixels individuels prend beaucoup plus de temps que les oprations graphiques sur des zones particulires. Nutilisez pas la proprit tableau Pixel pour accder aux pixels dune image dans un tableau gnral. Pour un accs performant aux pixels dune image, voir la proprit TBitmap.ScanLine.

Utilisation des mthodes du canevas pour dessiner des objets graphiques


Cette section montre comment utiliser certaines mthodes pour dessiner des objets graphiques. Elle traite des sujets suivants : Dessin Dessin Dessin Dessin de de de de lignes et de polylignes formes rectangles arrondis polygones

Dessin de lignes et de polylignes


Un canevas peut dessiner des lignes droites et des polylignes (ou lignes brises). Une ligne droite est une ligne de pixels reliant deux points. Une polyligne est une chane de lignes droites, relies bout bout. Le canevas dessine toutes les lignes en utilisant son crayon.

Dessin de lignes
Pour dessiner une ligne droite sur un canevas, utilisez la mthode LineTo du canevas. La mthode LineTo dessine une ligne partant de la position en cours du crayon et allant au point spcifi, et fait du point darrive de la ligne la position en cours. Le canevas dessine la ligne en utilisant son crayon. Par exemple, la mthode suivante dessine des lignes diagonales qui se croisent sur une fiche, chaque fois que la fiche est peinte :
procedure TForm1.FormPaint(Sender: TObject); begin with Canvas do begin MoveTo(0, 0); LineTo(ClientWidth, ClientHeight);

8-10

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

MoveTo(0, ClientHeight); LineTo(ClientWidth, 0); end; end;

Dessin de polylignes
En plus des lignes individuelles, le canevas peut dessiner des polylignes, qui sont des groupes composs dun nombre quelconque de segments de ligne relis entre eux. Pour dessiner une polyligne sur un canevas, appelez la mthode Polyline du canevas. Le paramtre pass la mthode Polyline est un tableau de points. Imaginez quune polyligne ralise une mthode MoveTo sur le premier point et une mthode LineTo sur chaque point successif. Si vous voulez dessiner plusieurs lignes, vous devez savoir que Polyline est plus rapide que la mthode MoveTo et que la mthode LineTo, car elle limine un certain nombre dappels supplmentaires. La mthode suivante, par exemple, dessine un losange dans une fiche :
procedure TForm1.FormPaint(Sender: TObject); begin with Canvas do Polyline([Point(0, 0), Point(50, 0), Point(75, 50), Point(25, 50), Point(0, 0)]); end;

Cet exemple montre bien les possibilits de Delphi de crer un paramtre tableau ouvert la vole. Il est possible de passer nimporte quel tableau de points, mais une manire simple de construire un tableau facilement consiste mettre ses lments entre crochets et de passer le tout en paramtre. Pour plus dinformations, voir laide en ligne.

Dessin de formes
Les canevas disposent de mthodes vous permettant de dessiner diffrents types de formes. Le canevas dessine le pourtour dune forme avec son crayon, puis remplit lintrieur avec son pinceau. La ligne qui dfinit la bordure de la forme est dtermine par lobjet Pen en cours. Cette section couvre : Dessin de rectangle et dellipses Dessin de rectangles coins arrondis Dessin de polygones

Dessin de rectangles et dellipses


Pour dessiner un rectangle ou une ellipse sur un canevas, appelez la mthode Rectangle ou la mthode Ellipse du canevas, en transmettant les coordonnes des limites dun rectangle. La mthode Rectangle dessine le rectangle ; Ellipse dessine une ellipse qui touche tous les cts du rectangle.

Utilisation des graphiques et du multimdia

8-11

Prsentation de la programmation relative aux graphiques

La mthode suivante dessine un rectangle remplissant le quart suprieur gauche dune fiche, puis dessine une ellipse sur la mme zone :
procedure TForm1.FormPaint(Sender: TObject); begin Canvas.Rectangle(0, 0, ClientWidth div 2, ClientHeight div 2); Canvas.Ellipse(0, 0, ClientWidth div 2, ClientHeight div 2); end;

Dessin de rectangles coins arrondis


Pour dessiner un rectangle coins arrondis sur un canevas, appelez la mthode RoundRect du canevas. Les quatre premiers paramtres transmis RoundRect sont les limites dun rectangle, comme pour la mthode Rectangle ou la mthode Ellipse. RoundRect prend deux paramtres supplmentaires qui indiquent comment dessiner les coins arrondis. La mthode suivante, par exemple, dessine un rectangle coins arrondis dans le quart suprieur de la fiche, en arrondissant les coins en arcs dun cercle de 10 pixels de diamtre :
procedure TForm1.FormPaint(Sender: TObject); begin Canvas.RoundRect(0, 0, ClientWidth div 2, ClientHeight div 2, 10, 10); end;

Dessin de polygones
Pour dessiner, sur un canevas, un polygone ayant un nombre quelconque de cts, appelez la mthode Polygon du canevas. Polygon prend un tableau de points comme seul paramtre et relie les points avec le crayon, puis relie le dernier point au premier de faon fermer le polygone. Aprs avoir dessin les lignes, Polygon utilise le pinceau pour remplir la zone interne au polygone. Le code suivant dessine un triangle rectangle dans la moiti infrieure gauche de la fiche :
procedure TForm1.FormPaint(Sender: TObject); begin Canvas.Polygon([Point(0, 0), Point(0, ClientHeight), Point(ClientWidth, ClientHeight)]); end;

Gestion de plusieurs objets de dessin dans votre application


Diffrentes mthodes de dessin (rectangle, forme, ligne, etc.) sont typiquement disponibles sur la barre doutils et le volet de boutons. Les applications peuvent rpondre des clics sur des turboboutons de faon dfinir les objets de dessin voulu. Cette section dcrit comment : Faire le suivi de loutil de dessin utiliser

8-12

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Changer doutil de dessin en utilisant des turboboutons Utiliser des outils de dessin

Faire le suivi de loutil de dessin utiliser


Une application graphique doit pouvoir connatre tout moment le type doutil de dessin (une ligne, un rectangle, une ellipse ou un rectangle arrondi, par exemple) que lutilisateur veut utiliser. Vous pouvez affecter des nombres chaque type doutil, mais vous devrez alors vous rappeler de la signification de chaque nombre. Vous pouvez rendre cette technique plus simple en affectant un nom de constante mnmonique chaque nombre, mais le code sera alors incapable de distinguer les nombres se trouvant dans la bonne plage et ceux du bon type. Par chance, le Pascal Objet fournit un moyen de grer ces deux points faibles. Vous pouvez dclarer un type numr. Un type numr est juste un moyen rapide pour affecter des valeurs squentielles des constantes. Depuis quil sagit aussi dune dclaration de type, vous pouvez utiliser la vrification de type du Pascal Objet pour vous assurer que vous naffectez que ces valeurs spcifiques. Pour dclarer un type numr, utilisez le mot rserv type, suivi par un identificateur de type, du signe gal et des identificateurs pour les valeurs mis entre parenthses et spars par des virgules. Par exemple, le code suivant dclare un type numr pour tous les outils de dessin de lapplication graphique :
type TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect);

Par convention, les identificateurs de type commencent par la lettre T, et les constantes similaires (celles constituant le type numr) commencent par un mme prfixe de deux caractres (comme ici dt pour drawing tool).La dclaration du type TDrawingTool est quivalente la dclaration dun groupe de constantes :
const dtLine = 0; dtRectangle = 1; dtEllipse = 2; dtRoundRect = 3;

La principale diffrence est quen dclarant un type numr, vous affectez des constantes et pas seulement des valeurs, mais aussi un type qui permet dutiliser la vrification de type du Pascal Objet pour vous prmunir de nombreuses erreurs. Une variable de type TDrawingTool peut tre affecte seulement par une des constantes dtLine..dtRoundRect. Toute tentative daffectation dun autre nombre (mme de la porte 0..3) gnrera une erreur de compilation.

Utilisation des graphiques et du multimdia

8-13

Prsentation de la programmation relative aux graphiques

Dans le code suivant, un champ ajout une fiche fera le suivi de loutil de dessin de la fiche :
type TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect); TForm1 = class(TForm) ...{ dclarations de mthode} public Drawing: Boolean; Origin, MovePt: TPoint; DrawingTool: TDrawingTool;{ champ pour loutil en cours } end;

Changement doutil en utilisant un turbobouton


Chaque outil de dessin de votre application doit avoir un gestionnaire pour son vnement OnClick. Supposons que votre application ait une barre doutils comportant un bouton pour chacun des quatre outils de dessin : ligne, rectangle, ellipse et rectangle arrondi. Vous attacherez les gestionnaires suivants aux vnements OnClick des quatre boutons, en affectant DrawingTool la valeur correspondant chaque outil :
procedure TForm1.LineButtonClick(Sender: TObject);{ LineButton } begin DrawingTool := dtLine; end; procedure TForm1.RectangleButtonClick(Sender: TObject);{ RectangleButton } begin DrawingTool := dtRectangle; end; procedure TForm1.EllipseButtonClick(Sender: TObject);{ EllipseButton } begin DrawingTool := dtEllipse; end; procedure TForm1.RoundedRectButtonClick(Sender: TObject);{ RoundRectButton } begin DrawingTool := dtRoundRect; end;

Utilisation des outils de dessin


Vous savez maintenant spcifier loutil utiliser. Il vous reste indiquer comment dessiner les diffrentes formes. Les seules mthodes ralisant des dessins sont les gestionnaires de souris (dplacement de souris et relchement de bouton de souris), et le seul code de dessin dessine des lignes, quel que soit loutil slectionn. Pour utiliser les diffrents outils de dessin, votre code doit spcifier comment dessiner selon loutil slectionn. Vous devez ajouter linstruction au gestionnaire dvnement de chaque outil.

8-14

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Cette section explique comment : dessiner des formes partager du code entre les gestionnaires dvnements

Dessiner des formes


Dessiner des formes est aussi simple que dessiner des lignes. Une seule instruction suffit. Vous navez besoin que des coordonnes. Voici rcrit le gestionnaire de lvnement OnMouseUp qui dessine des formes pour les quatre outils :
procedure TForm1.FormMouseUp(Sender: TObject; Button TMouseButton; Shift: TShiftState; X,Y: Integer); begin case DrawingTool of dtLine: begin Canvas.MoveTo(Origin.X, Origin.Y); Canvas.LineTo(X, Y) end; dtRectangle: Canvas.Rectangle(Origin.X, Origin.Y, X, Y); dtEllipse: Canvas.Ellipse(Origin.X, Origin.Y, X, Y); dtRoundRect: Canvas.RoundRect(Origin.X, Origin.Y, X, Y, (Origin.X - X) div 2, (Origin.Y - Y) div 2); end; Drawing := False; end;

Il est galement ncessaire de modifier le gestionnaire de OnMouseMove pour dessiner des formes :
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Drawing then begin Canvas.Pen.Mode := pmNotXor; case DrawingTool of dtLine: begin Canvas.MoveTo(Origin.X, Origin.Y); Canvas.LineTo(MovePt.X, MovePt.Y); Canvas.MoveTo(Origin.X, Origin.Y); Canvas.LineTo(X, Y); end; dtRectangle: begin Canvas.Rectangle(Origin.X, Origin.Y, MovePt.X, MovePt.Y); Canvas.Rectangle(Origin.X, Origin.Y, X, Y); end; dtEllipse: begin Canvas.Ellipse(Origin.X, Origin.Y, X, Y); Canvas.Ellipse(Origin.X, Origin.Y, X, Y); end; dtRoundRect: begin Canvas.RoundRect(Origin.X, Origin.Y, X, Y, (Origin.X - X) div 2, (Origin.Y - Y) div 2);

Utilisation des graphiques et du multimdia

8-15

Prsentation de la programmation relative aux graphiques

Canvas.RoundRect(Origin.X, Origin.Y, X, Y, (Origin.X - X) div 2, (Origin.Y - Y) div 2); end; end; MovePt := Point(X, Y); end; Canvas.Pen.Mode := pmCopy; end;

En principe, tout le code rptitif de lexemple prcdent devrait tre dans une routine spare. La section suivante prsente le code relatif au dessin des formes dans une seule routine pouvant tre appele par tous les gestionnaires dvnements de souris.

Partage de code entre plusieurs gestionnaires dvnements


Chaque fois que plusieurs gestionnaires dvnements utilisent le mme code, vous rendez lapplication plus efficace en plaant le code rpt dans une mthode partage par les gestionnaires dvnements. Pour ajouter une mthode une fiche,

1 Ajoutez la dclaration de la mthode lobjet fiche.


Il est possible dajouter la dclaration dans les sections public ou private, la fin des dclarations de lobjet fiche. Si le code partage uniquement les dtails de la manipulation de certains vnements, il est prfrable de crer une mthode partage private.

2 Ecrivez limplmentation de la mthode dans la partie implementation de lunit de la fiche.


Len-tte de limplmentation de la mthode doit correspondre exactement la dclaration, les mmes paramtres apparaissant dans le mme ordre. Le code suivant ajoute la fiche une mthode appele DrawShape et lappelle depuis chacun des gestionnaires. Dabord, la dclaration de DrawShape est ajoute la dclaration de lobjet fiche :
type TForm1 = class(TForm) ...{ champs et mthodes dclars ici} public { dclarations publiques } procedure DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode); end;

Ensuite limplmentation de DrawShape est crite dans la partie implementation de lunit :


implementation {$R *.FRM} ...{ autres implmentations de mthode omises pour plus de clart } procedure TForm1.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode); begin with Canvas do begin

8-16

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Pen.Mode := AMode; case DrawingTool of dtLine: begin MoveTo(TopLeft.X, TopLeft.Y); LineTo(BottomRight.X, BottomRight.Y); end; dtRectangle: Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y); dtEllipse: Ellipse(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y); dtRoundRect: RoundRect(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y, (TopLeft.X - BottomRight.X) div 2, (TopLeft.Y - BottomRight.Y) div 2); end; end; end;

Les autres gestionnaires dvnements sont modifis pour appeler DrawShape.


procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin DrawShape(Origin, Point(X, Y), pmCopy);{ dessine la forme finale } Drawing := False; end; procedure TForm1.FormMouseMove(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Drawing then begin DrawShape(Origin, MovePt, pmNotXor);{ efface la forme prcdente } MovePt := Point(X, Y);{ enregistre le point en cours } DrawShape(Origin, MovePt, pmNotXor);{ dessine la forme en cours } end; end;

Dessiner sur un graphique


Vous navez pas besoin de composant pour manipuler les objets graphiques de votre application. Vous pouvez construire des objets graphiques, dessiner sur eux, les sauvegarder et les dtruire sans mme dessiner sur lcran. En fait, il est rare quune application dessine directement sur une fiche. Le plus souvent, une application doit dessiner sur un graphique. Elle utilise ensuite un composant contrle image pour afficher le graphique sur une fiche. Une fois les oprations de dessin de lapplication reportes sur le graphique du contrle image, il est facile dy ajouter les fonctionnalits relatives limpression, aux oprations sur le presse-papiers, louverture et lenregistrement des objets graphiques. Les objets graphiques peuvent tre des fichiers bitmap, des dessins, des icnes ou toute autre classe graphique installe en tant que graphique jpeg.
Remarque

Etant donn que vous dessinez sur une image hors cran, comme un canevas Tbitmap, limage napparat pas tant quun contrle effectue la copie dun bitmap sur le canevas du contrle. En dautres mots, lorsque vous dessinez des bitmaps et les affectez un contrle image, limage napparat que si le contrle a la

Utilisation des graphiques et du multimdia

8-17

Prsentation de la programmation relative aux graphiques

possibilit de traiter son message. En revanche, si vous dessinez directement sur la proprit Canvas dun contrle, lobjet image apparat immdiatement.

Cration de graphiques dfilables


Le graphique ne doit pas tre de la mme taille que la fiche : il doit tre soit plus petit, soit plus grand. En ajoutant un contrle bote de dfilement sur la fiche et en plaant une image graphique lintrieur, vous pouvez afficher des graphiques beaucoup plus grands que la fiche et mme plus grands que lcran. Pour ajouter un graphique dfilable, vous devez commencer par ajouter un composant TScrollbox puis ajouter ensuite le contrle image.

Ajout dun contrle image


Un contrle image est un composant conteneur qui vous permet dafficher vos objets bitmap. Un contrle image peut tre utilis pour contenir un bitmap qui nest pas ncessairement affich en permanence, ou un bitmap dont lapplication a besoin pour gnrer dautres images.
Remarque

Pour des informations sur lutilisation des graphiques dans des contrles, voir Ajout de graphiques des contrles la page 7-13.

Positionnement du contrle
Un contrle image peut tre plac nimporte o dans une fiche. Pour tirer le meilleur parti de la capacit dun contrle image ajuster sa taille sur celle de son image, le seul point dfinir est le coin suprieur gauche du contrle. Si le contrle image sert demplacement non visible pour un bitmap, il peut tre plac nimporte o dans la fiche, comme un composant non visuel. Si vous placez le contrle image en le mettant lintrieur de la bote de dfilement dj installe dans la zone client de la fiche, vous serez sr que la bote de dfilement affichera des barres de dfilement pour permettre laccs aux parties du dessin napparaissant pas lcran. D finissez ensuite les proprits du contrle image.

Dfinition de la taille initiale du bitmap


Lorsquun contrle image est ajout, il nexiste quen tant que conteneur. La proprit Picture du contrle image peut tre dfinie en mode conception de faon contenir un graphique statique. Mais, le contrle peut galement charger limage depuis un fichier pendant lexcution, comme dcrit dans la section Chargement et enregistrement de fichiers graphiques la page 8-20. Pour crer un bitmap vide au dmarrage de lapplication,

1 Attachez un gestionnaire lvnement OnCreate de la fiche contenant limage. 2 Crez un objet bitmap, et affectez-le la proprit Picture.Graphic du contrle image.

8-18

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Dans cet exemple, limage est dans Form1, la fiche principale de lapplication. Le code attache donc un gestionnaire lvnement OnCreate de Form1 :
procedure TForm1.FormCreate(Sender: TObject); var Bitmap: TBitmap;{ variable temporaire pour contenir le bitmap } begin Bitmap := TBitmap.Create;{ construire lobjet bitmap } Bitmap.Width := 200;{ affecter la largeur initiale... } Bitmap.Height := 200;{ ...et la hauteur initiale } Image.Picture.Graphic := Bitmap;{ affecter le bitmap au contrle image } Bitmap.Free; {Nous en avons fini avec le bitmap, librons-le } end;

Laffectation du bitmap la proprit Graphic de limage copie le bitmap dans lobjet Picture. Mais, lobjet Picture ne devient pas propritaire du bitmap, cest pourquoi, aprs avoir effectu cette affectation, vous devez le librer. Si vous excutez lapplication maintenant, la zone client de la fiche apparat comme une zone blanche reprsentant le bitmap. Si vous redimensionnez la fentre de sorte que la zone client ne puisse afficher toute limage, la bote de dfilement affiche automatiquement des barres de dfilement pour permettre la visualisation du reste de limage. Mais si vous essayez de dessiner dans limage, rien napparat : lapplication dessine toujours dans la fiche qui est derrire limage et la bote de dfilement.

Dessiner sur un bitmap


Pour dessiner sur un bitmap, utilisez le canevas du contrle image et attachez les gestionnaires dvnements de souris aux vnements appropris du contrle image. Typiquement, vous devriez utiliser des oprations sur des rgions (rectangles, polylignes et ainsi de suite). Ce sont des mthodes rapides et efficaces pour dessiner. Un moyen efficace de dessiner des images lorsque vous avez besoin daccder de manire individuelle aux pixels est dutiliser la proprit ScanLine du bitmap. Pour une utilisation plus gnrale, vous pouvez dfinir un format de pixels de 24 bits et traiter le pointeur renvoy par ScanLine comme un tableau de couleurs RVB. Vous devrez sinon connatre le format natif de la proprit ScanLine. Cet exemple explique comment utiliser ScanLine pour extraire des pixels ligne par ligne.
procedure TForm1.Button1Click(Sender: TObject); // Cet exemple montre un dessin effectu directement sur le bitmap var x,y : integer; Bitmap : TBitmap; P : PByteArray; begin Bitmap := TBitmap.create; try Bitmap.LoadFromFile(C:\Program Files\Borland\Delphi 4\Images\Splash\256color\ factory.bmp); for y := 0 to Bitmap.height -1 do

Utilisation des graphiques et du multimdia

8-19

Prsentation de la programmation relative aux graphiques

begin P := Bitmap.ScanLine[y]; for x := 0 to Bitmap.width -1 do P[x] := y; end; canvas.draw(0,0,Bitmap); finally Bitmap.free; end; end;

Chargement et enregistrement de fichiers graphiques


Des images graphiques nexistant que pour la dure de lexcution dune application sont dun intrt limit. Le plus souvent, la mme image est utilise chaque excution, ou bien limage cre est enregistre pour une utilisation ultrieure. Le composant image facilite le chargement dune image depuis un fichier et son enregistrement. Les composants que vous utilisez pour charger, sauvegarder et remplacer des images graphiques supportent la plupart des formats de graphiques dont les fichiers bitmap, les mtafichiers, les glyphes, et ainsi de suite. Ils supportent aussi les classes graphiques installables. Le mcanisme douverture et denregistrement des fichiers graphiques est semblable celui utilis pour les autres fichiers et est dcrit dans les sections suivantes : Charger une image depuis un fichier Enregistrer une image dans un fichier Remplacer limage

Chargement dune image depuis un fichier


Votre application doit fournir la possibilit de charger une image depuis un fichier si votre application a besoin de modifier limage ou si vous voulez la stocker lextrieur de lapplication afin quun autre utilisateur ou une autre application puisse la modifier. Pour charger un fichier graphique dans un contrle image, appelez la mthode LoadFromFile de lobjet Picture du contrle image. Le code suivant extrait un nom de fichier dans une bote de dialogue douverture de fichiers graphiques, et charge ensuite ce fichier dans un contrle image nomm Image :
procedure TForm1.Open1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin CurrentFile := OpenPictureDialog1.FileName; Image.Picture.LoadFromFile(CurrentFile); end; end;

8-20

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Enregistrement dune image dans un fichier


Lobjet Picture peut charger et enregistrer des graphiques sous divers formats. Vous pouvez crer et recenser vos propres formats de fichiers graphiques afin que les objets image puissent galement les enregistrer et les stocker. Pour enregistrer le contenu dun contrle image dans un fichier, appelez la mthode SaveToFile de lobjet Picture du contrle image. La mthode SaveToFile ncessite de spcifier le nom du fichier de sauvegarde. Limage est nouvellement cre et na pas encore de nom de fichier, ou bien limage existe dj mais lutilisateur veut lenregistrer dans un fichier diffrent. Dans lun ou lautre cas, lapplication doit demander lutilisateur un nom de fichier avant lenregistrement, comme le montre la section suivante. Les deux gestionnaires dvnements suivants, attachs respectivement aux lments de menu Fichier|Enregistrer et Fichier|Enregistrer sous, grent lenregistrement des fichiers ayant dj un nom, lenregistrement des fichiers nayant pas de nom et lenregistrement des fichiers sous un nouveau nom.
procedure TForm1.Save1Click(Sender: TObject); begin if CurrentFile <> then Image.Picture.SaveToFile(CurrentFile){ enregistrer si dj nomm } else SaveAs1Click(Sender);{ sinon, obtenir un nom } end; procedure TForm1.Saveas1Click(Sender: TObject); begin if SaveDialog1.Execute then{ obtenir un nom de fichier } begin CurrentFile := SaveDialog1.FileName;{ enregistrer le nom spcifi par lutilisateur } Save1Click(Sender);{ puis enregistrer normalement } end; end;

Remplacement de limage
Il est possible tout moment de remplacer limage dun contrle image. Si un nouveau graphique est affect limage ayant dj un graphique, le nouveau graphique remplace lancien. Pour remplacer limage contenue dans un contrle image, affectez un nouveau graphique lobjet Picture du contrle image. La cration dun nouveau graphique passe par le mme processus que la cration du premier graphique (voir la section Dfinition de la taille initiale du bitmap la page 8-18), mais il faut galement permettre lutilisateur de choisir une taille diffrente de celle utilise par dfaut pour le graphique initial. Un moyen simple de proposer une telle option est de prsenter une bote de dialogue comme celle de la figure suivante.

Utilisation des graphiques et du multimdia

8-21

Prsentation de la programmation relative aux graphiques

Figure 8.1

Bote de dialogue Dimension bitmap de lunit BMPDlg

WidthEdit HeightEdit

Cette bote de dialogue particulire est cre dans lunit BMPDlg incluse dans le projet GraphEx (rpertoire EXAMPLES\DOC\GRAPHEX). Cette bote de dialogue tant dans votre projet, ajoutez-la la clause uses de lunit de votre fiche principale. Vous pouvez ensuite attacher un gestionnaire lvnement OnClick de llment de menu Fichier|Nouveau. Voici un exemple :
procedure TForm1.New1Click(Sender: TObject); var Bitmap: TBitmap;{ variable temporaire pour le nouveau bitmap } begin with NewBMPForm do begin ActiveControl := WidthEdit;{ focalisation sur le champ largeur } WidthEdit.Text := IntToStr(Image.Picture.Graphic.Width);{ dimensions en cours... } HeightEdit.Text := IntToStr(Image.Picture.Graphic.Height);{ ...par dfaut } if ShowModal <> idCancel then{ continuer si lutilisateur nannule pas la bote de dialogue } begin Bitmap := TBitmap.Create;{ crer un objet bitmap } Bitmap.Width := StrToInt(WidthEdit.Text);{ utiliser la largeur spcifie } Bitmap.Height := StrToInt(HeightEdit.Text);{ utiliser la hauteur spcifie } Image.Picture.Graphic := Bitmap;{ remplacer le graphique par le nouveau bitmap } CurrentFile := ;{ indique le fichier non nomm } Bitmap.Free; end; end; end; Remarque

Laffectation dun nouveau bitmap la proprit Graphic de lobjet Picture oblige lobjet Picture copier le nouveau graphique, mais il ne devient pas son propritaire. Lobjet Picture maintient son propre objet graphique interne. A cause de cela, le code prcdent libre lobjet bitmap aprs laffectation.

Utilisation du presse-papiers avec les graphiques


Vous pouvez utiliser le presse-papiers de Windows pour copier et coller des graphiques dans les applications ou pour changer des graphiques avec dautres applications. Lobjet Clipboard de la VCL facilite la gestion de diffrents types dinformations, y compris les graphiques. Avant dutiliser lobjet Clipboard dans une application, il faut ajouter lunit Clipbrd (QClipbrd dans CLX) la clause uses de toute unit devant accder aux donnes du presse-papiers.

8-22

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Pour les applications multiplates-formes, les donnes, qui sont stockes dans le presse-papiers lorsque vous utilisez CLX, sont stockes en tant que type mime en association avec un objet TStream. CLX fournit le source mime prdfini suivant et des constantes chane de type mime pour les objets CLX ci-dessous : TBitmap = image/delphi.bitmap TComponent = application/delphi.component TPicture = image/delphi.picture TDrawing = image/delphi.drawing

Copier des graphiques dans le presse-papiers


Toute image graphique, y compris le contenu dun contrle image, peut tre copie dans le presse-papiers. Une fois place dans le presse-papiers, limage est disponible pour toutes les applications. Pour copier une image dans le presse-papiers, affectez limage lobjet Clipboard en utilisant la mthode Assign. Le code suivant montre comment copier dans le presse-papiers limage dun contrle image nomm Image en rponse au choix dun lment de menu Edition|Copier :
procedure TForm1.Copy1Click(Sender: TObject); begin Clipboard.Assign(Image.Picture) end.

Couper des graphiques dans le presse-papiers


Lopration qui consiste couper un graphique dans le presse-papiers est semblable la copie, sauf que le graphique est supprim de la source. Pour couper un graphique dans le presse-papiers, commencez par le copier dans le presse-papiers, puis supprimez loriginal. Lorsque vous coupez un graphique, la seule question est de savoir comment montrer que limage originale a t efface. La solution classique consiste mettre la rgion blanc, comme dans le code suivant qui attache un gestionnaire lvnement OnClick dun lment de menu Edition|Couper :
procedure TForm1.Cut1Click(Sender: TObject); var ARect: TRect; begin Copy1Click(Sender);{ copier limage dans le presse-papiers } with Image.Canvas do begin CopyMode := cmWhiteness; ARect := Rect(0, 0, Image.Width, Image.Height);{ obtenir le rectangle bitmap} CopyRect(ARect, Image.Canvas, ARect);{ copier le bitmap sur lui-mme } CopyMode := cmSrcCopy;{ restaurer le mode normal } end; end;

Utilisation des graphiques et du multimdia

8-23

Prsentation de la programmation relative aux graphiques

Coller des graphiques depuis le presse-papiers


Si le presse-papiers contient un graphique bitmap, il est possible de le coller dans tout objet image, y compris les contrles image et la surface dune fiche. Pour coller un graphique depuis le presse-papiers,

1 Appelez la mthode HasFormat (si vous utilisez la VCL) ou la mthode Provides (si vous utilisez CLX) du presse-papiers pour savoir sil contient un graphique.
HasFormat (ou Provides dans CLX) est une fonction boolenne. Elle renvoie True si le presse-papiers contient un lment du type spcifi par le paramtre. Pour tester la prsence dun graphique, passez le paramtre CF_BITMAP sur la plate-forme Windows. Passez SDelphiBitmap dans les applications multiplatesformes.

2 Affectez le presse-papiers la destination.


Ce code montre comment coller une image depuis le presse-papiers dans un contrle image en rponse un clic sur un lment de menu Edition|Coller :
procedure TForm1.PasteButtonClick(Sender: TObject); var Bitmap: TBitmap; begin if Clipboard.HasFormat(CF_BITMAP) then { y a-t-il un bitmap dans le presse-papiers Windows ? ) begin Image.Picture.Bitmap.Assign(Clipboard); end; end;

Le mme exemple dans CLX pour le dveloppement multiplate-forme doit ressembler ceci :
procedure TForm1.PasteButtonClick(Sender: TObject); var Bitmap: TBitmap; begin if Clipboard.Provides(SDelphiBitmap) then { y a-t-il un bitmap dans le presse-papiers ? ) begin Image1.Picture.Bitmap.Assign(Clipboard); end; end;

Le graphique du presse-papiers peut provenir de cette application ou y avoir t copi par une autre application, comme Microsoft Paint. Dans ce cas, il nest pas ncessaire de vrifier le format du presse-papiers, car le menu Coller serait indisponible si le presse-papiers contenait un format non support.

8-24

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Techniques de dessin dans une application


Cet exemple explique les dtails relatifs limplmentation de leffet rubber banding dans une application graphique qui suit les mouvements de la souris au fur et mesure que lutilisateur dessine un graphique en mode excution. Le code qui suit provient dune application exemple situ e dans le rpertoire Demos\DOC\Graphex. Cette application dessine des lignes et des formes sur le canevas dune fentre en rponse des cliquer-glisser : lappui sur le bouton de la souris commence le dessin, le relchement du bouton termine le dessin. Pour commencer, cet exemple de code montre comment dessiner sur la surface dune fiche principale. Les exemples ultrieurs expliquent comment dessiner sur un bitmap. Les rubriques suivantes dcrivent lexemple : Comment rpondre la souris Ajout dun champ un objet fiche pour faire le suivi des actions de la souris Amlioration du dessin de ligne

Rpondre la souris
Votre application peut rpondre aux actions de la souris : enfoncement du bouton de la souris, dplacement de la souris et relchement du bouton de la souris. Elle peut aussi rpondre un clic (un appui suivi dun relchement, sans dplacer la souris) qui peut tre gnr par certaines frappes de touches (comme lappui sur la touche Entre dans une bote de dialogue modale). Cette section traite des sujets suivants : Quy a-til dans un vnement de souris ? Rponse laction bouton de souris enfonc Rponse laction bouton de souris relch Rponse au dplacement de la souris

Quy a-til dans un vnement de souris ?


La VCL possde trois vnements de souris : lvnement OnMouseDown, lvnement OnMouseMove et lvnement OnMouseUp. Lorsquune application dtecte une action de la souris, elle appelle le gestionnaire que vous avez dfini pour lvnement correspondant, en lui transmettant cinq paramtres. Les informations contenues dans ces paramtres permettent de personnaliser la rponse aux vnements. Il sagit des paramtres suivants :
Tableau 8.4 Param tre
Sender Button Shift X, Y

Paramtres des vnements de souris Signification


Lobjet ayant dtect laction de souris. Indique le bouton de la souris impliqu : mbLeft, mbMiddle ou mbRight. Indique ltat des touches Alt, Ctrl et Maj au moment de laction de souris. Les coordonnes de lendroit o lvnement a eu lieu.

Utilisation des graphiques et du multimdia

8-25

Prsentation de la programmation relative aux graphiques

La plupart du temps, les informations essentielles pour le gestionnaire dun vnement souris sont les coordonnes mais, dans certains cas, il est utile de tester le paramtre Button pour dterminer quel bouton de la souris a provoqu lvnement.
Remarque

Delphi utilise le mme critre que Microsoft Windows pour dterminer le bouton enfonc. Aussi, si vous avez interverti les boutons primaire et secondaire par dfaut de la souris (pour que le bouton droit de la souris soit le bouton primaire), un clic du bouton primaire (droit) entranera une valeur mbLeft pour le paramtre Button.

Rponse laction bouton de souris enfonc


Lorsque lutilisateur appuie sur un bouton de la souris, un vnement OnMouseDown est adress lobjet situ en dessous du pointeur de la souris. Lobjet peut alors rpondre lvnement. Pour rpondre une action bouton de souris enfonc, attachez un gestionnaire lvnement OnMouseDown. La VCL gnre un gestionnaire vide pour lvnement souris enfonce se produisant sur la fiche :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin end;

Exemple : rponse laction bouton de souris enfonc


Le code suivant affiche la chane Ici! sur une fiche lemplacement du clic de la souris :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.TextOut(X, Y, Ici!);{ crire du texte aux coordonnes (X, Y) } end;

Lorsque lapplication est excute, le curseur tant sur la fiche, tout appui sur le bouton de la souris fera apparatre la chane Ici! au point cliqu . Ce code dfinit la position de dessin en cours par les coordonnes du point o lutilisateur a enfonc le bouton de la souris :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.MoveTo(X, Y);{ dfinir la position du crayon } end;

Dsormais, lenfoncement du bouton de la souris dfinit la position du crayon et initialise ainsi le point de dpart de la ligne. Pour dessiner une ligne jusquau point o lutilisateur a relch le bouton, vous devez rpondre lvnement bouton de souris relch.

8-26

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Rponse laction bouton de souris relch


Un vnement OnMouseUp se produit ds que lutilisateur relche le bouton de la souris. Lvnement est, en gnral, adress lobjet au-dessus duquel la souris se trouvait lorsque le bouton a t enfonc, qui nest pas ncessairement celui au-dessus duquel le bouton de la souris est relch. Cela permet, par exemple, de dessiner une ligne comme si elle stendait au-del des bords de la fiche. Pour rpondre une action bouton de souris relch, dfinissez le gestionnaire de lvnement OnMouseUp. Voici un gestionnaire OnMouseUp qui dessine une ligne jusquau point o le bouton de la souris a t relch :
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.LineTo(X, Y);{ dessiner une ligne de PenPos (X, Y) } end;

Le code permet lutilisateur de dessiner des lignes en cliquant, en dplaant la souris, puis en relchant le bouton. Dans ce cas, lutilisateur ne voit pas la ligne tant quil ne relche pas le bouton de la souris.

Rponse au dplacement de la souris


Un vnement OnMouseMove se produit priodiquement lorsque lutilisateur dplace la souris. Lvnement est adress lobjet qui tait sous le pointeur de la souris lorsque lutilisateur a enfonc le bouton. Cela vous permet de fournir un retour dinformations lutilisateur en dessinant des lignes temporaires au fur et mesure que la souris est dplace. Pour rpondre aux dplacements de la souris, dfinissez un gestionnaire pour lvnement OnMouseMove de la fiche. Cet exemple utilise les vnements dplacement de la souris pour dessiner sur la fiche des formes intermdiaires pendant que lutilisateur maintient enfonc le bouton de la souris, offrant ainsi lutilisateur un aperu de ce quil obtiendra. Le gestionnaire de lvnement OnMouseMove dessine une ligne dans la fiche lemplacement de lvnement OnMouseMove :
procedure TForm1.FormMouseMove(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.LineTo(X, Y);{ dessiner la ligne la position en cours } end;

Avec ce code, le dessin suit le dplacement de la souris sur la fiche, avant mme que le bouton de la souris ne soit enfonc. Les vnements dplacement de la souris se produisent, mme lorsque le bouton de la souris na pas t enfonc. Pour dterminer si un bouton de la souris est enfonc, il est ncessaire dajouter un objet champ lobjet fiche.

Utilisation des graphiques et du multimdia

8-27

Prsentation de la programmation relative aux graphiques

Ajout dun champ un objet fiche


Lorsque vous ajoutez un composant une fiche, Delphi ajoute galement un champ reprsentant ce composant dans lobjet fiche. Il est ensuite possible de faire rfrence ce composant par le nom de son champ. Vous pouvez galement ajouter vos propres champs en modifiant la dclaration de type dans le fichier den-tte de lunit de la fiche. Dans lexemple suivant, il faut que la fiche dtermine si lutilisateur a enfonc le bouton de la souris. Pour cela, un champ boolen a t ajout dont la valeur est dfinie lorsque lutilisateur enfonce le bouton de la souris. Pour ajouter un champ un objet, modifiez la dfinition de type de lobjet, en spcifiant lidentificateur du champ et son type aprs la directive public la fin de la dclaration. Delphi est propritaire de toutes les dclarations places avant la directive public : cest l quil place tous les champs qui reprsentent les contrles et les mthodes rpondant aux vnements. Le code suivant ajoute dans la dclaration de lobjet fiche un champ de type Boolean, appel Drawing. Il ajoute galement deux champs afin de stocker les points de type TPoint : Origin et MovePt.
type TForm1 = class(TForm) procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); public Drawing: Boolean; Origin, MovePt: TPoint;{ champs pour stocker les points } end;

Nous disposons maintenant dun champ Drawing permettant de dterminer sil faut dessiner. Il faut donc linitialiser True lorsque lutilisateur enfonce le bouton de la souris et False lorsquil le relche :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Drawing := True;{ dfinir lindicateur de dessin } Canvas.MoveTo(X, Y); end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.LineTo(X, Y); Drawing := False;{ effacer lindicateur de dessin } end;

8-28

Guide du dveloppeur

Prsentation de la programmation relative aux graphiques

Ensuite, vous pouvez modifier le gestionnaire de lvnement OnMouseMove de faon ne dessiner que si Drawing est True :
procedure TForm1.FormMouseMove(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Drawing then{ dessiner seulement si lindicateur de dessin est dfini } Canvas.LineTo(X, Y); end;

Dsormais, le dessin nest effectu quentre les vnements bouton de souris enfonc et bouton de souris relch, mais il y a toujours cette ligne brise qui suit le dplacement de la souris au lieu dune belle ligne droite. Le problme tient ce qu chaque dplacement de la souris, le gestionnaire de lvnement dplacement de souris appelle LineTo qui dplace la position du crayon. Par consquent, le point dorigine de la ligne droite est perdu lorsque le bouton de la souris est relch.

Amlioration du dessin des lignes


Maintenant que nous disposons de champs pour garder la trace des divers points, il est possible damliorer le dessin des lignes dans lapplication.

Suivi du point dorigine


Lors du dessin dune ligne, le point de dpart de la ligne doit tre suivi avec le champ Origin. Il faut initialiser Origin avec le point o lvnement bouton de souris enfonc se produit. De cette manire, le gestionnaire de lvnement bouton de souris relch peut utiliser Origin pour tracer le dbut de la ligne, comme dans le code :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Drawing := True; Canvas.MoveTo(X, Y); Origin := Point(X, Y);{ enregistrer le dbut de ligne } end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.MoveTo(Origin.X, Origin.Y);{ dplacer le crayon au point de dpart } Canvas.LineTo(X, Y); Drawing := False; end;

Cette modification permet de redessiner la ligne finale. Mais quen est-il des dessins intermdiaires ?

Utilisation des graphiques et du multimdia

8-29

Prsentation de la programmation relative aux graphiques

Suivi des dplacements


Tel quest crit le gestionnaire de lvnement OnMouseMove, il prsente linconvnient de dessiner une ligne, non pas depuis sa position dorigine, mais depuis la position actuelle de la souris. Pour y remdier, il suffit de placer la position de dessin au point dorigine et de tirer la ligne jusquau point en cours :
procedure TForm1.FormMouseMove(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Drawing then begin Canvas.MoveTo(Origin.X, Origin.Y);{ dplacer le crayon au point de dpart } Canvas.LineTo(X, Y); end; end;

Le code prcdent fait le suivi de la position en cours de la souris, mais les lignes intermdiaires restent affiches et la ligne finale se voit peine. Lastuce consiste effacer chaque ligne avant de tracer la ligne suivante. Cela implique de garder la trace de son emplacement. Cest la fonction du champ MovePt ajout pralablement. Vous devez dfinir MovePt par le point darrive de chaque ligne intermdiaire, et utiliser MovePt et Origin pour effacer cette ligne avant de dessiner la suivante :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Drawing := True; Canvas.MoveTo(X, Y); Origin := Point(X, Y); MovePt := Point(X, Y); end; procedure TForm1.FormMouseMove(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Drawing then begin Canvas.Pen.Mode := pmNotXor;{ utiliser le mode XOR pour dessiner/effacer } Canvas.MoveTo(Origin.X, Origin.Y);{ dplacer le crayon lorigine } Canvas.LineTo(MovePt.X, MovePt.Y);{ effacer lancienne ligne } Canvas.MoveTo(Origin.X, Origin.Y);{ commencer de nouveau lorigine } Canvas.LineTo(X, Y);{ dessiner la nouvelle ligne } end; MovePt := Point(X, Y);{ enregistrer le point pour le prochain dplacement } Canvas.Pen.Mode := pmCopy; end;

Maintenant, un effet satisfaisant est obtenu lorsque la ligne est dessine. En modifiant le mode du crayon en pmNotXor, il combine la ligne avec les pixels de larrire-plan. Lorsque la ligne est efface, les pixels sont en fait ramens leur tat antrieur. En remettant le mode du crayon pmCopy (sa valeur par dfaut) aprs avoir dessin les lignes, le crayon est prt pour le dessin final lorsque le bouton de la souris est relch.

8-30

Guide du dveloppeur

Utilisation du multimdia

Utilisation du multimdia
Delphi vous permet dajouter des composants multimdia vos applications. Vous pouvez le faire en ajoutant le composant TAnimate de la page Win32 ou le composant TMediaPlayer de la page Systme de la palette des composants. Utilisez le composant animation pour jouer des squences vido silencieuses dans votre application. Utilisez le composant lecteur multimdia pour jouer des squences audio ou vido dans une application. Pour davantage dinformations sur les composants TAnimate et TMediaPlayer, voir laide en ligne de la VCL. Cette section aborde les sujets suivants : Ajout de squences vido silencieuses une application Ajout de squences audio et/ou vido une application

Ajout de squences vido silencieuses une application


Le contrle animation de Delphi vous permet dajouter des squences vido silencieuses votre application. Pour ajouter une squence vido silencieuse une application :

1 Double-cliquez sur licne animation dans la page Win32 de la palette des composants. Cela place automatiquement un contrle animation dans la fiche dans laquelle vous voulez afficher la squence vido. 2 En utilisant linspecteur dobjets, slectionnez la proprit Name et entrez un nouveau nom pour votre contrle animation. Vous utiliserez ce nom pour appeler le contrle animation (respectez les conventions standard de nomenclature des identificateurs Delphi).
Travaillez toujours directement dans linspecteur dobjets pour initialiser des proprits de conception ou pour crer des gestionnaires dvnements

3 Effectuez lune des oprations suivantes :


Slectionnez la proprit Common AVI et choisissez lun des AVI proposs dans la liste droulante. Ou slectionnez la proprit FileName, cliquez sur le bouton points de suspension et choisissez un fichier AVI dans lun des rpertoires disponibles localement ou sur le rseau, puis choisissez Ouvrir dans la bote de dialogue Ouvrir AVI. Ou slectionnez une ressource AVI en utilisant les proprits ResName ou ResID. Utilisez la proprit ResHandle pour indiquer le module contenant la ressource identifie par ResName ou ResID. Cela charge le fichier AVI en mmoire. Pour afficher lcran le premier plan de la squence AVI, utilisez la proprit Active ou la mthode Play, puis affectez la valeur True la proprit Open.

Utilisation des graphiques et du multimdia

8-31

Utilisation du multimdia

4 Affectez la proprit Repetitions le nombre spcifiant combien de fois la squence AVI doit tre joue. Si cette valeur est nulle, la squence est rpte jusqu lappel de la mthode Stop. 5 Faites les autres modifications des proprits du contrle animation. Si, par exemple, vous voulez modifier le premier plan affich louverture du contrle, affectez le numro de plan voulu la proprit StartFrame. 6 Affectez la valeur True la proprit Active en utilisant la liste droulante ou crivez un gestionnaire dvnement pour excuter la squence AVI quand un vnement spcifique a lieu lexcution. Par exemple, pour activer la squence AVI quand un objet bouton est choisi, crivez en consquence le gestionnaire dvnement OnClick. Vous pouvez galement appeler la mthode Play pour faire jouer la squence AVI.
Remarque

Si vous faites des modifications la fiche ou lun des composants de la fiche aprs avoir affecter la valeur True Active, la proprit Active revient False et vous devez la remettre True. Vous devez donc faire ceci juste avant la compilation ou lexcution.

Exemple dajout de squences vido silencieuses


Vous pouvez, par exemple, afficher un logo anim dans le premier cran apparaissant au dmarrage de votre application. Une fois laffichage du logo termin, lcran disparat. Pour excuter cet exemple, crez un nouveau projet et enregistrez le fichier Unit1.pas sous le nom Frmlogo.pas et le fichier Project1.dpr sous le nom Logo.dpr. Ensuite :

1 Double-cliquez sur licne animation dans la page Win32 de la palette des composants. 2 En utilisant linspecteur dobjets, affectez sa proprit Name la valeur Logo1. 3 Slectionnez sa proprit FileName, cliquez sur le bouton points de suspension (...), choisissez le fichier cool.avi dans le rpertoire ..\Demos\ Coolstuf. Cliquez ensuite sur le bouton Ouvrir dans la bote de dialogue Ouvrir AVI.
Cela charge le fichier cool.avi en mmoire.

4 Positionnez le contrle animation dans la fiche en cliquant dessus et en le faisant glisser sur le coin suprieur droit de la fiche. 5 Affectez la valeur 5 sa proprit Repetitions. 6 Cliquez sur la fiche pour lui attribuer la focalisation et affectez sa proprit Name la valeur LogoForm1 et sa proprit Caption la valeur Fentre Logo. Diminuez la hauteur de la fiche pour y centrer droite le contrle animation. 7 Double-cliquez sur lvnement OnActivate et entrez le code suivant qui excute la squence AVI quand la fiche obtient la focalisation lexcution :
Logo1.Active := True;

8-32

Guide du dveloppeur

Utilisation du multimdia

8 Double-cliquez sur licne de libell dans la page Standard de la palette des composants. Slectionnez la proprit Caption du composant et entrez Bienvenue Cool Images 4.0. Slectionnez ensuite sa proprit Font, cliquez sur le bouton points de suspension (...) et choisissez dans la bote de dialogue Fonte, Style : gras, Taille : 18, Couleur : Navy, puis choisissez OK. Cliquez sur le contrle libell et faites-le glisser pour le centrer dans la fiche. 9 Cliquez sur le contrle animation pour lui donner la focalisation. Doublecliquez sur son vnement OnStop et crivez le code suivant pour fermer la fiche larrt du fichier AVI :
LogoForm1.Close;

10 Slectionnez Excuter|Excuter pour excuter la fentre au logo anim.

Ajout de squences audio et/ou vido une application


Le composant lecteur multimdia de Delphi vous permet dajouter des squences audio et/ou vido votre application. Il ouvre un priphrique de mdia et peut jouer, arrter, faire une pause, enregistrer, etc., les squences audio et/ou vido utilises par le priphrique de mdia. Le priphrique de mdia peut tre matriel ou logiciel.
Remarque

Les squences audio et/ou vido ne sont pas prises en charge en programmation multiplate-forme. Pour ajouter une squence audio et/ou vido une application :

1 Double-cliquez sur licne du lecteur multimdia dans la page Systme de la palette des composants. Cela place automatiquement un contrle lecteur multimdia dans la fiche laquelle vous voulez jouer les caractristiques multimdia. 2 En utilisant linspecteur dobjets, slectionnez la proprit Name et entrez le nouveau nom du contrle lecteur multimdia. Vous utiliserez ce nom pour dsigner le contrle lecteur multimdia. Respectez les conventions standard des identificateurs de nom Delphi).
Travaillez toujours directement dans linspecteur dobjets pour initialiser des proprits de conception ou pour crer des gestionnaires dvnements.

3 Slectionnez la proprit DeviceType et choisissez le type de priphrique appropri ouvert par la proprit AutoOpen ou la mthode Open. Si DeviceType a la valeur dtAutoSelect, le type de priphrique est slectionn en fonction de lextension du fichier mdia spcifi par la proprit FileName. Pour davantage dinformations sur les types de priphriques et leurs fonctions, voir le tableau suivant. 4 Si le priphrique stocke son mdia dans un fichier, spcifiez le nom du fichier mdia en utilisant la proprit FileName. Slectionnez la proprit FileName. Cliquez sur le bouton points de suspension et choisissez un fichier mdia dans un rpertoire disponible localement ou sur le rseau, puis choisissez Ouvrir dans la bote de dialogue Ouvrir. Sinon lexcution, insrez

Utilisation des graphiques et du multimdia

8-33

Utilisation du multimdia

dans le lecteur matriel le support contenant le mdia (disque, cassette, etc) pour le priphrique de mdia slectionn.

5 Affectez la valeur True la proprit AutoOpen. Ainsi, le lecteur multimdia ouvre automatiquement le priphrique spcifi quand la fiche contenant le lecteur est cre lexcution. Si AutoOpen a la valeur False, le priphrique doit tre ouvert par un appel de la mthode Open. 6 Affectez la valeur True la proprit AutoEnable pour activer ou dsactiver automatiquement lexcution les boutons ncessaires du lecteur multimdia. Sinon, double-cliquez sur la proprit EnabledButtons pour affecter la valeur True ou False chaque bouton selon que vous souhaitez lactiver ou pas.
Le priphrique multimdia est excut, mis en pause ou arrt quand lutilisateur clique sur les boutons correspondants du composant lecteur multimdia. Il est galement possible de contrler le priphrique via les mthodes correspondant aux boutons (Play, Pause, Stop, Next, Previous, etc).

7 Positionnez la barre de contrle du lecteur multimdia dans la fiche. Vous pouvez le faire en cliquant dessus et en la faisant glisser la position de votre choix ou en slectionnant la proprit Align et en choisissant lalignement souhait dans sa liste droulante.
Si vous voulez que le lecteur multimdia soit invisible lexcution, affectez la valeur False sa proprit Visible et contrlez le priphrique en appelant les mthodes appropries (Play, Pause, Stop, Next, Previous, Step, Back, Start Recording, Eject).

8 Effectuez les autres paramtrages du contrle lecteur multimdia. Si, par exemple, le mdia ncessite une fentre daffichage, affectez la proprit Display le contrle affichant le mdia. Si le priphrique utilise plusieurs pistes, affectez la proprit Tracks la piste souhaite.
Tableau 8.5 Type de p riph rique
dtAVIVideo dtCDAudio

Types de priphriques multimdia et leurs fonctions Utilise des pistes


Non Oui

Logiciel/matriel utilis
Lecteur AVI Vido pour Window Lecteur CD Audio pour Windows ou un lecteur CD Audio Lecteur de cassettes audio-numriques Lecteur vido-num rique pour Windows Lecteur de films MM Priphrique overlay Scanner dimage

Joue
fichiers AVI Video Disques CD Audio

Utilise une fen tre daffichage


Oui Non

dtDAT dtDigitalVideo dtMMMovie dtOverlay dtScanner

Cassettes audionumriques fichiers AVI, MPG, MOV films MM Vido analogique N/d pour Play (scanne des images avec Record)

Oui Non Non Non Non

Non Oui Oui Oui Non

8-34

Guide du dveloppeur

Utilisation du multimdia

Tableau 8.5 Type de p riph rique


dtSequencer dtVCR

Types de priphriques multimdia et leurs fonctions (suite) Utilise des pistes


Oui Non Non

Logiciel/matriel utilis
Squenceur MIDI pour Windows Enregistreur de cassettes vido Lecteur audio Wav pour Windows

Joue
fichiers MIDI Cassettes vido fichiers WAV

Utilise une fen tre daffichage


Non Oui Non

dtWaveAudio

Exemple dajout de squences audio et/ou vido (VCL seulement)


Cet exemple excute une squence vido AVI pour une publicit multimdia de Delphi. Pour excuter cet exemple, crez un nouveau projet et enregistrez le fichier Unit1.pas sous le nom FrmAd.pas et le fichier Project1.dpr sous le nom DelphiAd.dpr. Puis :

1 Double-cliquez sur licne lecteur multimdia dans la page Systme de la palette des composants. 2 En utilisant linspecteur dobjets, affectez la proprit Name du lecteur multimdia la valeur VideoPlayer1. 3 Slectionnez sa proprit DeviceType et choisissez dtAVIVideo dans la liste droulante. 4 Slectionnez sa proprit FileName, cliquez sur le bouton points de suspension (...) et choisissez le fichier speedis.avi dans le rpertoire ..\Demos\ Coolstuf. Choisissez le bouton Ouvrir dans la bote de dialogue Ouvrir. 5 Affectez la valeur True sa proprit AutoOpen et la valeur False sa proprit Visible. 6 Double-cliquez sur licne animation dans la page Win32 de la palette des composants. Affectez la valeur False sa proprit AutoSize, 175 sa proprit Height et 200 sa proprit Width. Cliquez sur le contrle animation et faites-le glisser dans le coin suprieur gauche de la fiche. 7 Cliquez sur le contrle lecteur multimdia pour lui donner la focalisation. Slectionnez sa proprit Display et choisissez Animate1 dans la liste droulante. 8 Cliquez sur la fiche pour lui attribuer la focalisation et slectionnez sa proprit Name et affectez-lui la valeur Delphi_Ad. Redimensionnez la fiche pour lui donner la taille du contrle animation. 9 Double-cliquez sur lvnement OnActivate et crivez le code suivant pour excuter la squence vido AVI quand la fiche a la focalisation :
VideoPlayer1.Play;

10 Choisissez Excuter|Excuter pour excuter la vido AVI.

Utilisation des graphiques et du multimdia

8-35

8-36

Guide du dveloppeur

Chapitre

Chapitre 9

Ecriture dapplications multithreads

Delphi dispose de plusieurs objets facilitant la conception dapplications multithreads. Les applications multithreads sont des applications qui contiennent plusieurs chemins dexcution simultans. Mme si lutilisation de plusieurs threads doit tre mrement rflchie, elle peut amliorer un programme : En vitant les engorgements. Avec un seul thread, un programme doit arrter compltement lexcution pour attendre les processus lents comme les accs disque, la communication avec dautres machines ou laffichage de donnes multimdia. La CPU est inactive jusqu lachvement du processus. Avec plusieurs threads, lapplication peut poursuivre lexcution dans des threads spars pendant quun thread attend le rsultat du processus lent. En organisant le comportement dun programme. Le comportement dun programme peut souvent tre dcompos en plusieurs processus fonctionnant de manire indpendante. Lutilisation de threads permet dexcuter simultanment une section de code pour chacun de ces processus. Utilisez les threads pour assigner des priorits aux diverses tches du programme afin dattribuer davantage de temps machine aux tches critiques. En grant plusieurs processeurs. Si le systme excutant le programme dispose de plusieurs processeurs, il est possible damliorer les performances en dcomposant le travail en plusieurs threads sexcutant simultanment sur des processeurs distincts.
Remarque

Tous les systmes dexploitation ne grent pas rellement lutilisation de plusieurs processeurs, mme si cela est propos par le matriel sous-jacent. Par exemple, Windows 9x ne fait que simuler lutilisation de processeurs multiples, mme si le matriel sous-jacent le gre.

Ecriture dapplications multithreads

9-1

Dfinition dobjets thread

Dfinition dobjets thread


Dans la plupart des applications, vous pouvez utiliser un objet thread pour reprsenter un thread dexcution de lapplication. Les objets thread simplifient lcriture dapplications multithreads en encapsulant les utilisations les plus frquentes des threads.
Remarque

Les objets thread ne permettent pas de contrler les attributs de scurit ou la taille de la pile des threads. Si vous souhaitez contrler ces paramtres, vous devez utiliser la fonction BeginThread. Mme si vous utilisez BeginThread , vous pouvez nanmoins utiliser les objets de synchronisation de threads et les mthodes dcrites dans la section Coordination de threads la page 9-7. Pour davantage dinformations sur lutilisation de BeginThread, voir laide en ligne. Pour utiliser un objet thread dans une application, crez un nouveau descendant de TThread. Pour crer un descendant de TThread, choisissez Fichier|Nouveau dans le menu principal. Dans la bote de dialogue des nouveaux objets, slectionnez Objet thread. Vous devez spcifier le nom de classe du nouvel objet thread. Une fois le nom spcifi, Delphi cre un nouveau fichier unit pour implmenter le thread.

Remarque

A la diffrence de la plupart des botes de dialogue de lEDI demandant un nom de classe, la bote de dialogue Nouvel objet thread ne prfixe pas automatiquement le nom de classe avec un T. Le fichier unit automatiquement gnr contient le squelette du code du nouvel objet thread. Si vous avez nomm ce thread TMyThread, le code doit avoir laspect suivant :
unit Unit2; interface uses Classes; type TMyThread = class(TThread) private { Dclarations prives } protected procedure Execute; override; end; implementation { TMyThread } procedure TMyThread.Execute; begin { Code du thread ici } end; end.

Vous devez spcifier le code de la mthode Execute. Ces tapes sont dcrites dans les sections suivantes.

9-2

Guide du dveloppeur

Dfinition dobjets thread

Initialisation du thread
Si vous souhaitez crire du code dinitialisation pour la nouvelle classe de thread, vous devez craser la mthode Create. Ajoutez un nouveau constructeur la dclaration de la classe de thread et crivez le code dinitialisation pour limplmenter. Cest l que vous pouvez affecter une priorit par dfaut au thread et indiquer sil doit tre libr automatiquement la fin de son excution.

Affectation dune priorit par dfaut


La priorit indique la prfrence accorde au thread quand le systme dexploitation rpartit le temps machine entre les diffrents threads de lapplication. Utilisez un thread de priorit leve pour grer les tches critiques et un thread de priorit basse pour les autres tches. Pour indiquer la priorit de lobjet thread, affectez la proprit Priority. Si vous crivez une application Windows, les valeurs de Priority se rpartissent sur une chelle comportant sept niveaux, comme dcrit dans le tableau suivant :
Tableau 9.1 Valeur
tpIdle tpLowest tpLower tpNormal tpHigher tpHighest tpTimeCritical

Priorits des threads Priorit


Le thread sexcute uniquement quand le systme est inoccup. Windows ninterrompt pas dautres threads pour excuter un thread de priorit tpIdle. La priorit du thread est deux points en dessous de la normale. La priorit du thread est un point en dessous de la normale. Le thread a une priorit normale. La priorit du thread est un point au-dessus de la normale. La priorit du thread est deux points au-dessus de la normale. Le thread a la priorit la plus leve.

Remarque

Si vous crivez une application multiplate-forme, vous devez sparer le code destin attribuer les priorits pour Windows du code pour Linux. Sous Linux, Priority est une valeur numrique qui dpend de la politique choisie pour les threads, politique qui ne peut tre modifie que par lutilisateur root. Voir la version CLX de TThread et Priority dans laide en ligne pour plus de dtails. Gonfler la priorit du thread pour une opration utilisant intensivement la CPU peut sous-alimenter les autres threads de lapplication. Il ne faut accorder une priorit leve qu des threads qui passent lessentiel du temps attendre des vnements extrieurs. Le code suivant illustre le constructeur dun thread de priorit basse qui effectue des tches darrire-plan ne devant pas interfrer avec les performances du reste de lapplication :
constructor TMyThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); Priority := tpIdle; end;

Attention

Ecriture dapplications multithreads

9-3

Dfinition dobjets thread

Libration des threads


Gnralement, lorsque les threads ont fini dtre excuts, ils peuvent tre simplement librs. Dans ce cas, le plus simple consiste laisser lobjet thread se librer lui-mme. Pour ce faire, affectez la valeur True la proprit FreeOnTerminate. Il y a cependant des cas o la fin dun thread doit tre coordonne avec les autres threads. Par exemple, il se peut que vous deviez attendre quun thread renvoie une valeur avant deffectuer une action dans un autre thread. Pour ce faire, vous ne souhaitez pas librer le premier thread avant que le second nait reu la valeur renvoye. Vous pouvez traiter ce type de situation en affectant la valeur False FreeOnTerminate et en librant explicitement le premier thread partir du second.

Ecriture de la fonction thread


La mthode Execute constitue la fonction thread. Vous pouvez la concevoir comme un programme qui est excut par lapplication, cette diffrence prs quil partage le mme espace de processus. Lcriture dune fonction thread est plus dlicate que celle dun programme distinct car il faut prendre garde ne pas craser la mmoire utilise par dautres threads de lapplication. D un autre ct, comme le thread partage le mme espace de processus que les autres threads, il est possible dutiliser la mmoire partage pour faire communiquer les threads.

Utilisation du thread principal VCL/CLX


Quand vous utilisez des objets appartenant aux hirarchies dobjets VCL et CLX, leurs proprits et mthodes ne sont pas ncessairement adaptes lutilisation de threads. Cest--dire que laccs aux proprits et mthodes peut effectuer des actions utilisant de la mmoire qui nest pas protge de laction dautres threads. De ce fait, un thread principal est plac part pour laccs aux objets VCL et CLX. Cest ce thread qui gre tous les messages Windows reus par les composants dune application. Si tous les objets accdent leurs proprits et excutent leurs mthodes dans ce seul thread, il nest pas ncessaire de se proccuper dventuelles interfrences entre les objets. Pour utiliser le thread principal, crez une routine spare effectuant les actions ncessaires. Appelez cette routine spare depuis la mthode Synchronize de votre thread. Par exemple :
procedure TMyThread.PushTheButton; begin Button1.Click; end; procedure TMyThread.Execute; begin Synchronize(PushTheButton); end;

9-4

Guide du dveloppeur

Dfinition dobjets thread

Synchronize attend le thread principal pour entrer dans la boucle des messages puis excute la mthode qui lui est transmise.
Remarque

Comme Synchronize utilise la boucle des messages, elle ne fonctionne pas dans les applications console. Vous devez utiliser dautres mcanismes, comme les sections critiques, pour protger laccs aux objets VCL ou CLX dans les applications console. Il nest pas toujours ncessaire dutiliser le thread principal. Certains objets sont adapts aux threads. Il est prfrable de ne pas utiliser la mthode Synchronize quand vous savez que les mthodes dun objet sont adaptes lutilisation des threads, car cela amliore les performances en vitant davoir attendre le thread VCL ou CLX pour entrer dans la boucle de messages. Il nest pas ncessaire dutiliser la mthode Synchronize dans les situations suivantes : Les composants daccs aux donnes sont adapts aux threads comme suit : pour les ensembles de donnes BDE chaque thread doit disposer de son propre composant session de base de donnes. Il ny a quune seule exception : les pilotes Access. Ces pilotes sont conus en utilisant la bibliothque ADO Microsoft qui nest pas adapte aux threads. Pour dbDirect, il suffit que la bibliothque client du fournisseur soit adapte aux threads pour que les composants dbDirect le soient galement. Les composants ADO et InterbaseExpress sont adapts aux threads. Lorsque vous utilisez des composants daccs aux donnes, vous devez nanmoins encadrer tous les appels aux contrles orients donnes dans la mthode Synchronize. Ainsi, il est ncessaire de synchroniser les appels qui relient un contrle orient donnes un ensemble de donnes, mais il nest pas ncessaire de le faire pour accder aux donnes dun champ de lensemble de donnes. Pour davantage dinformations sur lutilisation de sessions de base de donnes avec les threads dans des applications BDE, voir Gestion de sessions multiples la page 20-32. Les objets VisualCLX ne sont pas adapts aux threads. Les objets DataCLX sont adapts aux threads. Les objets graphiques sont adapts aux threads. Il nest pas ncessaire dutiliser le thread principal VCL ou CLX pour accder aux objets TFont, TPen, TBrush, TBitmap, TMetafile (VCL seulement), TDrawing (CLX seulement) et TIcon. Il est possible daccder aux objets canevas en dehors de la mthode Synchronize en les verrouillant (voir Verrouillage dobjets la page 9-8). Les listes dobjets ne sont pas adaptes aux threads, mais vous pouvez utiliser une version adapte aux threads, TThreadList, la place de TList. Appelez rgulirement la routine CheckSynchronize depuis le thread principal de votre application pour que les threads darrire-plan synchronisent leur excution sur le thread principal. Le meilleur emplacement pour appeler CheckSynchronize est lorsque lapplication est inactive (par exemple, dans le gestionnaire de lvnement OnIdle). Cela vous garantit quil est sans danger de faire appels aux mthodes du thread darrire-plan.

Ecriture dapplications multithreads

9-5

Dfinition dobjets thread

Utilisation de variables locales aux threads


La mthode Execute et toutes les routines quelle appelle ont leurs propres variables locales comme toute routine Pascal Objet. Ces routines peuvent galement accder toutes les variables globales. En fait, les variables globales constituent un mcanisme puissant de communication entre les threads. Mais dans certains cas, vous souhaitez utiliser des variables globales pour les routines du thread sans quelles ne soient partages par les autres instances de la mme classe de thread. Il est possible pour ce faire de dclarer des variables locales au thread. Dclarez une variable locale au thread en la dclarant dans une section threadvar. Par exemple :
threadvar x : integer;

dclare une variable de type entier prive pour chaque thread de lapplication, mais globale lintrieur de chaque thread. La section threadvar ne peut tre utilise que pour des variables globales. Les variables pointeur et fonction ne peuvent pas tre des variables de thread. Les types utilisant une smantique de copie lors de lcriture, comme les chanes longues ne peuvent pas non plus faire office de variables de thread.

Vrification de larrt par dautres threads


Un thread commence son excution quand la mthode Execute est appele (voir Excution dobjets thread la page 9-12) et se poursuit jusqu larrt de Execute. Cela correspond une situation dans laquelle le thread effectue une tche spcifique puis sarrte une fois celle-ci termine. Dans certains cas, une application a besoin qu un thread poursuive son excution jusqu ce quun critre externe soit respect. Il est possible de permettre dautres threads de signaler quil est temps que votre thread arrte de sexcuter en testant la proprit Terminated. Quand un autre thread tente de terminer votre thread, il appelle la mthode Terminate. Terminate affecte la valeur True la proprit Terminated de votre thread. Cest la mthode Execute de votre thread dimplmenter la mthode Terminate en testant la valeur de la proprit Terminated. Lexemple suivant illustre une manire de procder :
procedure TMyThread.Execute; begin while not Terminated do PerformSomeTask; end;

Gestion des exceptions dans la fonction thread


La mthode Execute doit capturer toutes les exceptions qui se produisent dans le thread. Si vous chouez capturer une exception dans votre fonction thread, votre application risque de provoquer des violations daccs. Cela ne se voit pas lorsque vous dveloppez car lEDI capture lexception, mais lorsque vous

9-6

Guide du dveloppeur

Coordination de threads

excuterez votre application hors du dbogueur, lexception provoquera une erreur dexcution et lapplication cessera de sexcuter. Pour capturer les exceptions se produisant lintrieur de votre fonction thread, ajoutez un bloc try...except limplmentation de la mthode Execute :
procedure TMyThread.Execute; begin try while not Terminated do PerformSomeTask; except { faire quelque chose avec les exceptions } end; end;

Ecriture du code de nettoyage


Vous pouvez centraliser le code de nettoyage lors de la fin de lexcution du thread. Juste avant la fin du thread, un vnement OnTerminate a lieu. Placez lventuel code de nettoyage dans le gestionnaire dvnement OnTerminate afin de garantir son excution quel que soit le chemin dexcution suivi par la mthode Execute. Le gestionnaire dvnement OnTerminate nest pas excut comme partie de votre thread. Il est en fait excut dans le contexte du thread principal VCL ou CLX de votre application. Cela a deux implications : Il nest pas possible dutiliser de variables locales au thread dans un gestionnaire dvnement OnTerminate (sauf vouloir utiliser les valeurs du thread principal VCL ou CLX). Il est possible daccder en toute scurit tous les composants et objets VCL ou CLX dans le gestionnaire dvnement OnTerminate sans se proccuper des conflits avec les autres threads. Pour davantage dinformations sur le thread principal VCL ou CLX, voir Utilisation du thread principal VCL/CLX la page 9-4.

Coordination de threads
Quand vous crivez le code excut lorsque le thread sexcute, vous devez tenir compte du comportement des autres threads qui peuvent sexcuter simultanment. En particulier, il faut viter que deux threads tentent dutiliser simultanment le mme objet ou la mme variable globale. De plus, le code dun thread peut dpendre de tches effectues par dautres threads.

Ecriture dapplications multithreads

9-7

Coordination de threads

Eviter les accs simultans


Pour viter les conflits avec dautres threads lors de laccs des objets ou des variables, il peut tre ncessaire de bloquer lexcution des autres threads jusqu ce que le code dun thread ait termin une opration. Mais il ne faut pas bloquer inutilement lexcution des threads. Cela peut provoquer une dgradation importante des performances et rduire nant les avantages lis lutilisation de threads multiples.

Verrouillage dobjets
Certains objets disposent dun verrouillage intgr qui empche les autres threads dutiliser cette instance dobjet. Ainsi, les objets canevas (TCanvas et ses descendants) ont une mthode Lock qui empche les autres threads daccder au canevas jusqu lappel de la mthode Unlock. La VCL et CLX contiennent galement tous les deux un objet liste adapt aux threads, TThreadList. Lappel deTThreadList.LockList renvoie lobjet liste tout en empchant les autres threads dexcution dutiliser la liste jusqu lappel de la mthode UnlockList. Les appels des mthodes TCanvas.Lock et TThreadList.LockList peuvent tre imbriqus. Le verrou nest pas libr tant que le dernier verrouillage nest pas associ au dverrouillage correspondant dans le mme thread.

Utilisation de sections critiques


Pour les objets ne disposant pas de verrouillage intgr, vous pouvez utiliser une section critique. Les sections critiques fonctionnent comment une porte ne pouvant tre franchie que par un seul thread la fois. Pour utiliser une section critique, crez une instance globale de TCriticalSection. TCriticalSection dispose de deux mthodes, Acquire (qui empche les autres threads dexcuter la section) et Release (qui retire le blocage). Chaque section critique est associe la mmoire globale devant tre protge. Chaque thread accdant cette mmoire globale doit commencer par utiliser la mthode Acquire pour vrifier quun autre thread nest pas en train de lutiliser. Une fois termin, le thread appelle la mthode Release afin que les autres threads puissent accder la mmoire globale en appelant Acquire.
Attention

Les sections critiques ne peuvent fonctionner que si tous les threads les utilisent pour accder la mmoire globale associe. Les threads qui ne tiennent pas compte des sections critiques et accdent la mmoire globale sans appeler Acquire peuvent provoquer des problmes daccs simultans. Par exemple, une application a une section critique des variables globales, LockXY, qui bloque laccs aux variables globales X et Y. Tout thread utilisant X ou Y doit encadrer cette utilisation dappels la section critique comme cidessous :
LockXY.Acquire; { bloque les autres threads } try

9-8

Guide du dveloppeur

Coordination de threads

Y := sin(X); finally LockXY.Release; end;

Utilisation du synchronisateur criture exclusive et lecture multiple


Lorsque vous utilisez des sections critiques pour protger la mmoire globale, seul un thread peut utiliser la mmoire un moment donn. Cette protection peut tre exagre, notamment si un objet ou une variable doit tre souvent lu mais dans lequel vous crivez trs rarement. Il ny a aucun danger ce que plusieurs threads lisent la mme mmoire simultanment, pourvu quaucun thread ny crit. Lorsquune mmoire globale est souvent lue, mais dans laquelle les threads ncrivent quoccasionnellement, vous pouvez la protger laide de lobjet TMultiReadExclusiveWriteSynchronizer. Cet objet agit comme une section critique mais permet plusieurs threads de lire la mmoire quil protge condition quaucun thread ny crive. Les threads doivent disposer dun accs exclusif en criture la mmoire protge par TMultiReadExclusiveWriteSynchronizer. Pour utiliser un synchronisateur criture exclusive et lecture multiple, crez une instance globale de TMultiReadExclusiveWriteSynchronizer associe la mmoire globale que vous souhaitez protger. Chaque thread qui lit cette mmoire doit au pralable appeler la mthode BeginRead. BeginRead vite quun autre thread ncrive simultanment dans la mmoire. Lorsquun thread a fini de lire la mmoire protge, il appelle la mthode EndRead. Tout thread qui crit dans la mmoire protge doit au pralable appeler BeginWrite. BeginWrite vite quun autre thread ne lise ou ncrive simultanment dans la mmoire. Lorsquun thread a fini dcrire dans la mmoire protge, il appelle la mthode EndWrite, de sorte que les threads en attente puissent commencer lire la mmoire.
Attention

Comme les sections critiques, le synchronisateur criture exclusive et lecture multiple ne fonctionne que si chaque thread lutilise pour accder la mmoire globale associe. Les threads qui ignorent le synchronisateur et accdent la mmoire globale sans appeler BeginRead ou BeginWrite gnrent des problmes daccs simultan.

Autres techniques de partage de la mmoire


Si vous utilisez des objets de la VCL ou de CLX, utilisez le thread principal pour excuter votre code. Lutilisation du thread principal garantit que les objets naccdent pas indirectement de la mmoire utilise par dautres objets VCL ou CLX dans dautres threads. Voir Utilisation du thread principal VCL/CLX la page 9-4, pour davantage dinformations sur le thread principal. Si la mmoire globale na pas besoin dtre partage par plusieurs threads, envisagez dutiliser des variables locales aux threads au lieu de variables globales. En utilisant des variables locales aux threads, votre thread na pas besoin dattendre ou de bloquer les autres threads. Voir Utilisation de variables locales aux threads la page 9-6, pour davantage dinformations sur les variables locales aux threads.

Ecriture dapplications multithreads

9-9

Coordination de threads

Attente des autres threads


Si votre thread doit attendre la fin dautres threads pour terminer une tche, vous pouvez demander au thread de suspendre son excution. Vous pouvez attendre la fin de lexcution dun autre thread ou attendre quun autre thread signale quil a achev une tche.

Attente de la fin dexcution dun thread


Pour attendre la fin de lexcution dun thread, utilisez la mthode WaitFor de lautre thread. WaitFor ne revient que lorsque lautre thread se termine, soit en finissant sa propre mthode Execute, soit la suite dune exception. Par exemple, le code suivant attend quun autre thread remplisse un objet liste de threads avant daccder aux objets de la liste :
if ListFillingThread.WaitFor then begin with ThreadList1.LockList do begin for I := 0 to Count - 1 do ProcessItem(Items[I]); end; ThreadList1.UnlockList; end;

Dans lexemple prcdent, laccs aux lments de la liste ne se fait que lorsque la mthode WaitFor indique que la liste a t remplie. La valeur renvoye doit tre affecte par la mthode Execute du thread en attente. Cependant, puisque les threads appelant WaitFor veulent connatre le rsultat de lexcution du thread, la mthode Execute ne renvoie pas de valeur. A la place, la mthode Execute initialise la proprit ReturnValue. ReturnValue est alors renvoye par la mthode WaitFor quand elle est appele par dautres threads. Les valeurs renvoyes sont des entiers. Votre application en dtermine la signification.

Attente de lachvement dune tche


Parfois, il est ncessaire dattendre quun thread termine une opration au lieu dattendre la fin de lexcution dun thread particulier. Pour ce faire, utilisez un objet vnement. Les objets vnements (TEvent) doivent tre crs avec une porte globale afin quils puissent agir comme des signaux visibles pour tous les threads. Quand un thread termine une opration dont dpendent dautres threads, il appelle TEvent.SetEvent. SetEvent active le signal afin que les autres threads le surveillant sachent que lopration a t acheve. Pour dsactiver le signal, utilisez la mthode ResetEvent . Par exemple, imaginons une situation dans laquelle vous devez attendre la fin de lexcution de plusieurs threads au lieu dun seul. Comme vous ne savez pas quel sera le dernier thread, vous ne pouvez pas utiliser la mthode WaitFor de lun deux. A la place, vous pouvez faire en sorte que chaque thread incrmente

9-10

Guide du dveloppeur

Coordination de threads

un compteur la fin de son excution et que le dernier thread signale lachvement de lexcution de tous les threads en gnrant un vnement. Le code suivant montre la fin du gestionnaire dvnement OnTerminate de tous les threads dont lexcution doit tre acheve. CounterGuard est un objet section critique global qui vite lutilisation simultane du compteur par plusieurs threads. Counter est une variable globale qui compte le nombre de threads dont lexcution est acheve.
procedure TDataModule.TaskThreadTerminate(Sender: TObject); begin CounterGuard.Acquire; { obtient un verrou sur le compteur } Dec(Counter); { dcrmente la variable globale du compteur } if Counter = 0 then Event1.SetEvent; { signale sil sagit du dernier thread } CounterGuard.Release; { dverrouille le compteur } end;

Le thread principal initialise la variable Counter, lance les threads de tche et attend le signal indiquant lachvement de lexcution de tous les threads en appelant la mthode WaitFor. WaitFor attend lactivation du signal pendant une dure spcifie et renvoie lune des valeurs du tableau suivant :
Tableau 9.2 Valeur
wrSignaled wrTimeout wrAbandoned wrError

Valeurs renvoyes par WaitFor Signification


Le signal de lobjet vnement a t activ. La dure spcifie sest coule sans que le signal soit dfini. Lobjet vnement a t dtruit avant lcoulement de la dure spcifie. Une erreur a eu lieu pendant lattente.

Le code suivant montre comment le thread principal lance les threads de tche et reprend la main lorsque leur excution est acheve :
Event1.ResetEvent; { efface lvnement avant de lancer les threads } for i := 1 to Counter do TaskThread.Create(False); { cre et lance les threads de tche } if Event1.WaitFor(20000) <> wrSignaled then raise Exception; { poursuite avec le thread principal. Lexcution de tous les threads de tche est acheve } Remarque

Si vous ne voulez pas cesser dattendre un vnement aprs un dlai spcifi, transmettez la mthode WaitFor une valeur de paramtre INFINITE. Faites attention en utilisant INFINITE, car cela peut provoquer le blocage du thread si le signal attendu narrive pas.

Ecriture dapplications multithreads

9-11

Excution dobjets thread

Excution dobjets thread


Une fois une classe thread implmente en dfinissant sa mthode Execute, vous pouvez lutiliser dans une application pour excuter le code de sa mthode Execute. Pour utiliser un thread, crez une instance de la classe thread. Linstance de thread peut tre cre pour un dmarrage immdiat ou place en tat dattente afin de ntre excute qu avec lappel de la mthode Resume. Pour crer un thread sexcutant immdiatement, affectez la valeur False au paramtre CreateSuspended du constructeur. Par exemple, la ligne suivante cre un thread et commence son excution :
SecondProcess := TMyThread.Create(false); {cre et excute le thread } Attention

Ne crez pas trop de threads dans une application. Le surcot li la gestion de plusieurs threads peut influer sur les performances. La limite recommande est de 16 threads par processus sur une machine disposant dun seul processeur. Cette limite suppose que la plupart de ces threads attendent des vnements externes. Si tous les threads sont actifs, il convient de rduire encore ce nombre. Vous pouvez crer plusieurs instances du mme type de thread pour excuter du code parallle. Vous pouvez, par exemple, dmarrer une nouvelle instance dun thread en rponse une action de lutilisateur, ce qui permet chaque thread de gnrer la rponse attendue.

Redfinition de la priorit par dfaut


Quand le temps machine accord au thread est li la tche accomplie par le thread, sa priorit est dfinie dans le constructeur, comme dcrit dans Initialisation du thread la page 9-3. Par contre, si la priorit du thread varie en fonction du moment de lexcution du thread, crez le thread en tat suspendu, affectez sa priorit puis dmarrez lexcution du thread :
SecondProcess := TMyThread.Create(True); { cration mais pas excution } SecondProcess.Priority := tpLower; { rduire la priorit normale } SecondProcess.Resume; { excuter le thread } Remarque

Si vous crivez une application multiplate-forme, vous devez sparer le code destin attribuer les priorits pour Windows du code pour Linux. Sous Linux, Priority est une valeur numrique qui dpend de la politique choisie pour les threads, politique qui ne peut tre modifie que par lutilisateur root. Voir la version CLX de TThread et Priority dans laide en ligne pour plus de dtails.

Dmarrage et arrt des threads


Un thread peut tre dmarr et arrt plusieurs fois avant de terminer son excution. Pour interrompre temporairement lexcution dun thread, appelez sa mthode Suspend. Quand il faut reprendre lexcution du thread, appelez sa mthode Resume. Suspend augmente un compteur interne, il est donc possible dimbriquer les appels aux mthodes Suspend et Resume. Lexcution du thread ne reprend que si chaque appel de Suspend correspond un appel de Resume.

9-12

Guide du dveloppeur

Dbogage dapplications multithreads

Vous pouvez mettre un terme lexcution dun thread en appelant sa mthode Terminate. Terminate affecte la valeur True la proprit Terminated du thread. Si vous avez correctement implment la mthode Execute, elle teste priodiquement la valeur de la proprit Terminated et sarrte si Terminated a la valeur True.

Dbogage dapplications multithreads


Lors du dbogage dapplications multithreads, il est compliqu de surveiller ltat de tous les threads sexcutant simultanment ou mme de dterminer quel thread sexcute quand vous tes sur un point darrt. Vous pouvez utiliser la bote dtat des threads pour surveiller et manipuler tous les threads de lapplication. Pour afficher la bote de dialogue Etat des threads, choisissez Voir| Threads dans le menu principal. Quand un vnement de dbogage a lieu, (point darrt, exception, pause), la vue Etat des threads indique ltat de chaque thread. Cliquez avec le bouton droit de la souris dans la bote de dialogue Etat des threads pour accder aux commandes permettant daccder au code source correspondant ou changer le thread courant. Quand un thread est marqu comme en cours, ltape suivante ou lopration dexcution suivante se fait relativement ce thread. La bote de dialogue Etat des threads liste tous les threads dexcution de lapplication par leur identificateur de thread. Si vous utilisez des objets thread, lidentificateur de thread correspond la valeur de la proprit ThreadID. Si vous nutilisez pas dobjets thread, lidentificateur de chaque thread est renvoy lors de lappel de BeginThread. Pour davantage dinformations sur la bote dtat des threads, voir laide en ligne.

Ecriture dapplications multithreads

9-13

9-14

Guide du dveloppeur

10
Utilisation de CLX pour le dveloppement multiplate-forme
Chapitre 10

Chapitre

Vous pouvez utiliser Delphi pour dvelopper des applications 32 bits multiplatesformes qui sexcuteront sur les systmes dexploitation Windows et Linux. Pour ce faire, vous pouvez dmarrer avec une application Windows existante et la modifier, ou bien crer une nouvelle application en suivant les mthodes recommandes pour lcriture dun code indpendant de la plate-forme. Kylix est le logiciel Delphi pour Linux de Borland ; il vous permet de compiler et de dvelopper des applications sous Linux. Si vous souhaitez dvelopper et dployer des applications sous Linux et Windows, vous aurez besoin dutiliser Kylix ainsi que Delphi. Ce chapitre dcrit la manire de modifier les applications Delphi pour quelles se compilent sous Linux et il contient des informations sur les diffrences entre le dveloppement dapplications sous Windows et sous Linux. Il fournit galement des lignes directrices pour lcriture dun code portable entre les diffrents environnements.
Remarque

La plupart des applications dveloppes en utilisant CLX (sans appels des API propres un systme dexploitation) sexcuteront la fois sur les plates-formes Linux et Windows. Les application doivent tre compiles sur la plate-forme sur laquelle vous voulez quelles sexcutent.

Cration dapplications multiplates-formes


Vous crerez des applications multiplates-formes presque comme vous crez nimporte quelle application Delphi. Vous devez utiliser les composants visuels CLX et viter les appels aux API spcifiques du systme dexploitation pour que votre application soit totalement indpendante de la plate-forme. (Voir Ecriture de code portable la page 10-19, pour des conseils sur lcriture des applications multiplates-formes.)

Utilisation de CLX pour le dveloppement multiplate-forme

10-1

Cration dapplications multiplates-formes

Pour crer une application multiplate-forme :

1 Dans lEDI, choisissez Fichier|Nouveau|Application CLX. La palette de composants montre les composants pouvant tre utiliss dans les applications CLX.
Remarque

Seuls certains composants non visuels de Windows peuvent tre utiliss dans les applications CLX. Les pages ADO, BDE, Systme, DataSnap, InterBase, Site Express, FastNet, QReport, COM+, WebSnap et Serveurs de la palette de composants incluent des fonctionnalits qui ne fonctionneront que dans les applications CLX sous Windows. Si vous prvoyez de compiler votre application galement sous Linux, nutilisez pas les composants proposs dans ces pages, ou utilisez des $IFDEF pour marquer les sections de code qui les utilisent comme tant uniquement destines Windows.

2 Dveloppez votre application dans lEDI. Noubliez pas de nutiliser que des composants CLX dans votre application. 3 Compilez et testez lapplication sur chaque plate-forme sur laquelle vous envisagez de la faire tourner. Examinez tous les messages derreur pour reprer les endroits o des modifications supplmentaires seront ncessaires.
Lorsque vous placez une application sous Kylix, vous devez rinitialiser les options du projet. En effet, le fichier .dof stockant les options du projet est recr par Kylix et appel .kof (avec les options par dfaut). Vous pouvez galement stocker dans lapplication un grand nombre des options de compilation en tapant Ctrl+O+O. Les options sont places au dbut du fichier ouvert ce moment-l. Le fichier fiche dune application multiplate-forme aura lextension xfm et non pas dfm. Cela permet de distinguer les fiches multiplates-formes utilisant des composants CLX et les fiches utilisant des composants VCL. Un fichier fiche xfm fonctionnera la fois sous Windows et sous Linux, mais une fiche dfm ne fonctionnera que sous Windows. Vous pourriez aussi bien commencer le dveloppement de votre application multiplate-forme en partant de Kylix au lieu de Delphi :

1 Dveloppez, compilez et testez lapplication sous Linux en utilisant Kylix. 2 Placez les fichiers source de lapplication sous Windows. 3 Rinitialisez les options du projet. 4 Recompilez lapplication sous Windows en utilisant Delphi.
Pour plus dinformations sur lcriture des applications de bases de donnes ou des applications Internet indpendantes des plates-formes, voir Applications de bases de donnes multiplates-formes la page 10-26 et Applications Internet multiplates-formes la page 10-34.

10-2

Guide du dveloppeur

Portage dapplications VCL vers CLX

Portage dapplications VCL vers CLX


Si vous disposez dapplications Delphi crites pour lenvironnement Windows, vous pouvez les rendre multiplates-formes. La facilit de cette volution dpend de la nature et de la complexit de lapplication, ainsi que du nombre de dpendances Windows. Les sections suivantes dcrivent quelques-unes des diffrences majeures entre les environnements Windows et Linux et fournissent des lignes directrices sur la manire de dmarrer le portage dune application.

Techniques de portage
Les approches que vous pouvez adopter pour porter une application dune plateforme vers une autre sont les suivantes :
Tableau 10.1 Technique
Portage propre une plate-forme Portage multiplates-formes Emulation Windows

Techniques de portage Description


Cible un systme dexploitation et les API sous-jacentes Cible une API multiplates-formes Ne modifie pas le code et porte les API utilises

Portages propres une plate-forme


Les portages propres une plate-forme peuvent tre longs et coteux et ne produisent quun rsultat cibl. Ils crent plusieurs bases de code diffrentes, ce qui les rend particulirement difficiles maintenir. Toutefois, chaque portage est conu pour un systme dexploitation particulier et peut tirer parti des fonctionnalits propres la plate-forme. Lapplication sexcute donc en rgle gnrale plus rapidement.

Portages multiplates-formes
Les portages multiplates-formes offrent gnralement la technique la plus rapide et les applications portes ciblent plusieurs plates-formes. En ralit, la quantit de travail ncessaire au dveloppement dapplications multiplates-formes dpend beaucoup du code existant. Si le code a t dvelopp sans souci dindpendance par rapport la plate-forme, vous pouvez rencontrer des scnarios o la logique indpendante de la plate-forme et la mise en uvre dpendante de la plate-forme sont mlanges. Lapproche multiplates-formes est prfrable, car la logique mtier sexprime en termes indpendants de la plate-forme. Certains services sont masqus par une interface interne qui est identique sur toutes les plates-formes mais possde une mise en uvre particulire sur chacune. La bibliothque dexcution de Delphi en est un exemple : linterface est trs similaire sur les deux plates-formes, mme si la mise en uvre peut tre trs diffrente. Vous devez sparer les lments multiplates-formes, puis mettre en uvre des services particuliers au niveau

Utilisation de CLX pour le dveloppement multiplate-forme

10-3

Portage dapplications VCL vers CLX

suprieur. Cette approche est en fin de compte la solution la moins co teuse, grce la rduction des cots de maintenance occasionne par un large partage de la base de source et une amlioration de larchitecture dapplication.

Portages dmulation Windows


Lmulation Windows est la mthode la plus complexe et elle peut tre trs coteuse, mais cest celle qui offrira le plus de similarit entre lapplication Linux rsultante et une application Windows existante. Cette approche consiste mettre en uvre la fonctionnalit Windows sous Linux. Dun point de vue ingnierie, cette solution est trs difficile maintenir. L o vous voulez muler les API Windows, vous pouvez inclure deux sections distinctes en utilisant des $IFDEF pour indiquer les sections de code qui sappliquent spcifiquement Windows ou Linux.

Portage de votre application


Si vous portez une application que vous souhaitez excuter sous Windows et sous Linux, vous devez modifier votre code ou utiliser des $IFDEF pour dfinir les sections de code qui sappliquent spcifiquement Windows ou Linux. Les tapes gnrales pour porter votre application VCL vers CLX sont les suivantes :

1 Ouvrez le projet contenant lapplication que vous voulez modifier dans Delphi. 2 Copiez les fichiers .dfm dans des fichiers .xfm de mme nom (par exemple, renommez unit1.dfm en unit1.xfm). Renommez (ou utilisez un $IFDEF) la rfrence au fichier .dfm dans le ou les fichiers unit de {$R *.dfm} en {$R *.xfm}. (Le fichier .xfm fonctionnera dans Kylix comme dans Delphi.)
Par exemple, changez la rfrence aux fiches dans la section implementation de
{$R *.dfm}

en
{$R *.xfm}

3 Modifiez (ou spcifiez avec un $IFDEF) toutes les clauses uses pour qu elles fassent rfrence aux units correctes dans CLX. (Pour plus dinformations, consultez Comparaison entre les units CLX et VCL la page 10-11.)
Par exemple, changez la clause uses suivante dune application Windows
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

en la clause ci-dessous pour une application CLX :


uses Windows, Messages, SysUtils, Variants, Classes, QForms, QControls, QStdCtrls;

4 Enregistrez le projet et rouvrez-le. Dsormais, la palette de composants propose des composants pouvant tre utiliss dans les applications CLX.

10-4

Guide du dveloppeur

Portage dapplications VCL vers CLX

Remarque

Seuls certains composants non visuels de Windows peuvent tre utiliss dans les applications CLX. Les pages ADO, BDE, Systme, DataSnap, InterBase, Internet Express, Site Express, FastNet, QReport, COM+, Services Web et Serveurs de la palette de composants incluent des fonctionnalits qui ne fonctionneront que dans les applications CLX sous Windows. Si vous prvoyez de compiler votre application galement sous Linux, nutilisez pas les composants proposs dans ces pages, ou utilisez des $IFDEF pour marquer les sections de code qui les utilisent comme tant uniquement destines Windows.

5 Rcrivez le code qui ne ncessite pas de dpendances Windows afin de rendre le code plus indpendant de la plate-forme. Utilisez pour cela les routines et constantes de la bibliothque dexcution. (Pour plus dinformations, consultez Ecriture de code portable la page 10-19.) 6 Trouvez une fonctionnalit quivalente pour les caractristiques qui sont diffrentes sous Linux. Utilisez des $IFDEF (avec modration cependant) pour dlimiter les informations propres Windows. (Pour plus dinformations, consultez Utilisation des directives conditionnelles la page 10-20.)
Par exemple, vous pouvez dlimiter par des $IFDEF le code propre la plateforme dans vos fichiers source :
[$IFDEF MSWINDOWS] IniFile.LoadfromFile(c:\x.txt); [$ENDIF] [$IFDEF LINUX] IniFile.LoadfromFile(/home/name/x.txt); [$ENDIF]

7 Recherchez les rfrences aux noms de chemins dans tous les fichiers du projet.
Les noms de chemins dans Linux utilisent une barre oblique droite / comme dlimiteur (par exemple, /usr/lib) et les fichiers peuvent tre installs dans des rpertoires diffrents sur le systme Linux. Utilisez la constante PathDelim (dans SysUtils) pour spcifier le dlimiteur de chemin adapt au systme. D terminez lemplacement correct pour tous les fichiers dans Linux. Modifiez les rfrences des lettres de lecteurs (par exemple, C:\) et le code qui reconnat les lettres de lecteurs en recherchant un deux-points en position 2 dans la chane. Utilisez la constante DriveDelim (dans SysUtils) pour spcifier lemplacement selon des termes adapts au systme. L o vous spcifiez plusieurs chemins, remplacez le sparateur de chemin point-virgule (;) par un deux-points (:). Utilisez la constante PathSep (dans SysUtils) pour spcifier le sparateur de chemin adapt au systme. Comme les noms de fichiers sont sensibles la casse dans Linux, assurezvous que votre application ne modifie pas la casse des noms de fichiers ou nassume pas une certaine casse.

8 Compilez, testez et dboguez votre application.

Utilisation de CLX pour le dveloppement multiplate-forme

10-5

Portage dapplications VCL vers CLX

Pour transfrer lapplication sous Linux :

1 Transfrez sur votre ordinateur Linux les fichiers source et autres fichiers lis au projet de votre application Windows Delphi Windows. (Vous pouvez partager des fichiers source entre Linux et Windows si vous souhaitez que le programme sexcute sur les deux plates-formes. Vous pouvez galement transfrer les fichiers laide dun outil comme ftp en mode ASCII.)
Les fichiers source doivent inclure vos fichiers dunits (fichiers .pas), le fichier de projet (fichier .dpr) et tous les fichiers de paquets (fichiers .dpk). Les fichiers lis au projet incluent les fichiers de fiches (fichiers .xfm), les fichiers de ressources (fichiers .res) et les fichiers doptions de projet (fichiers .dof dans Kylix, cela devient des fichiers .kof). Si vous souhaitez compiler votre application uniquement partir de la ligne de commande (plutt que dutiliser lEDI), le fichier de configuration (fichier .cfg dans Kylix, cela devient un fichier .conf) sera ncessaire.

2 Ouvre le projet dans Kylix. Vous recevrez des avertissements propos des fonctionnalits spcifiques Windows qui sont utilises. 3 Compilez le projet en utilisant Kylix. Examinez tous les messages derreur pour reprer les endroits o des modifications supplmentaires seront ncessaires.

CLX et VCL
Kylix utilise la bibliothque de composants multiplates-formes (CLX) Borland la place de la bibliothque de composants visuels (VCL). Dans la VCL, de nombreux contrles permettent daccder facilement aux contrles Windows. De mme, CLX fournit un accs aux widgets (de window + gadget) Qt dans les bibliothques partages Qt. Delphi inclut et CLX et la VCL. CLX ressemble beaucoup la VCL. La plupart des noms de composants sont les mmes et de nombreuses proprits portent les mmes noms. En outre, CLX sera disponible sous Windows tout autant que la VCL (vrifiez la dernire version de Delphi pour dterminer les disponibilits). Les composants de CLX peuvent tre groups en parties comme suit :
Tableau 10.2 Parties
VisualCLX

Parties de CLX Description


Composants et graphiques dinterface utilisateur multiplates-formes natifs. Les composants de cette partie peuvent diffrer sous Linux et Windows. Composants daccs aux donnes client. Les composants de cette partie forment un sous-ensemble des ensembles de donnes locaux, client/serveur et n niveaux bass sur le client. Le code est identique sous Linux et Windows.

DataCLX

10-6

Guide du dveloppeur

Portage dapplications VCL vers CLX

Tableau 10.2 Parties


NetCLX RTL

Parties de CLX (suite) Description


Composants Internet incluant Apache DSO et CGI WebBroker. Ce sont les mmes sous Linux et Windows. Bibliothque dexcution jusqu Classes.pas inclus. Le code est identique sous Linux et Windows.

Les widgets de VisualCLX remplacent les contrles Windows. Dans CLX, TWidgetControl remplace le TWinControl de la VCL. Les autres composants (comme TScrollingWidget ) portent les mmes noms. Vous navez toutefois pas besoin de remplacer les occurrences de TWinControl par TWidgetControl. Des dclarations de types, comme
TWinControl = TWidgetControl;

sont prsentes dans le fichier source QControls.pas pour simplifier le partage du code source. TWidgetControl et ses descendants possdent tous une proprit Handle qui rfrence lobjet Qt, et une proprit Hooks qui rfrence les objets de liens grant le mcanisme des vnements. Les noms et les emplacements des units de certaines classes sont diffrents pour CLX. Vous devrez modifier les clauses uses pour liminer les rfrences aux units qui nexistent pas dans CLX et pour les remplacer par les noms dunits CLX. (La plupart des fichiers de projet et les sections dinterface de la plupart des units contiennent une clause uses. La section dimplmentation dune unit peut galement contenir sa propre clause uses.)

Diffrences de CLX
Bien que la plus grande partie de CLX soit mise en uvre de la mme faon que la VCL, certaines fonctionnalits sont mises en uvre autrement. Cette section prsente les diffrences entre les mises en uvre de CLX et de la VCL auxquelles vous devez faire attention lorsque vous crivez des applications multiplates-formes.

Prsentation visuelle
Lenvironnement visuel de Linux est quelque peu diffrent de celui de Windows. Laspect des botes de dialogue peut dpendre du gestionnaire de fentres utilis (par exemple, selon quil sagisse de KDE ou de Gnome).

Styles
Il est possible dutiliser des styles au niveau application en plus des proprits OwnerDraw. Vous pouvez utiliser la proprit TApplication.Style pour dfinir laspect visuel des lments graphiques dune application. Avec des styles, un widget ou une application peut prendre une toute nouvelle apparence. Vous pouvez toujours utiliser le dessin propritaire sous Linux mais lutilisation des styles est recommande.

Utilisation de CLX pour le dveloppement multiplate-forme

10-7

Portage dapplications VCL vers CLX

Variants
Tout le code des tableaux protg pour les variants qui se trouvait dans System se trouve dans deux nouvelles units : Variants.pas VarUtils.pas Le code dpendant du systme dexploitation est maintenant isol dans VarUtils.pas, et il contient galement des versions gnriques de tout ce qui est ncessaire Variants.pas. Si vous convertissez une application VCL qui inclut des appels Windows en une application CLX, vous devrez remplacer ceux-ci par des appels VarUtils.pas. Si vous souhaitez utiliser des variants, vous devrez inclure lunit Variants dans votre clause uses. VarIsEmpty effectue un test simple sur varEmpty pour vrifier si un variant est effac, et sous Linux vous devez utiliser la fonction VarIsClear pour effacer un variant.

Gestionnaire de donnes variants personnalises


Vous pouvez dfinir des types de donnes personnaliss pour les variants. Cela introduit une surcharge doprateurs lorsque le type est affect au variant. Pour crer un nouveau type de variant, descendez de la classe TCustomVariantType et instanciez votre nouveau type de variant. Considrons, par exemple, VarCmplx.pas. Cette unit met en uvre une prise en charge des mathmatiques complexes par lintermdiaire de variants personnaliss. Elle prend en charge les oprations de variants suivantes : addition, soustraction, multiplication, division (pas de division entire) et ngation. Elle gre galement les conversions entre : SmallInt, Integer, Single, Double, Currency, Date, Boolean, Byte, OleStr et String. Toute conversion flottante/ordinale provoquera la perte de la partie imaginaire de la valeur complexe.

Registre
Linux nutilise pas de registre pour stocker les informations de configuration. Vous devez utiliser des fichiers texte de configuration et des variables denvironnement la place du registre. Les fichiers de configuration systme sous Linux sont souvent installs dans /etc, par exemple /etc/hosts. Les autres profils utilisateur sont installs dans des fichiers cachs (dont le nom commence par un point), comme .bashrc, qui contient les paramtres du shell bash ou .XDefaults, qui sert dfinir des valeurs par dfaut pour les programmes X. Le code dpendant du registre peut tre modifi pour utiliser la place un fichier texte de configuration local stock , par exemple, dans le mme rpertoire que lapplication. Ecrire une unit contenant toutes les fonctions de registre mais en dtournant toutes les sorties vers un fichier de configuration local est un moyen que vous pouvez utiliser pour g rer une dpendance par rapport au registre.

10-8

Guide du dveloppeur

Portage dapplications VCL vers CLX

Pour mmoriser des informations un emplacement global sous Linux, vous pouvez stocker un fichier de configuration global dans le rpertoire racine. Toutes vos applications pourront alors accder au mme fichier de configuration. Vous devez toutefois vous assurer que les permissions du fichier et les droits daccs sont correctement dfinis. Vous pouvez galement utiliser des fichiers ini dans des applications multiplatesformes. Toutefois, dans CLX, vous devrez utiliser TMemIniFile au lieu de TRegIniFile.

Autres diffrences
La mise en uvre de CLX possde galement dautres diffrences affectant le fonctionnement de votre application. Cette section dcrit certaines de ces diffrences. ToggleButton ne peut pas tre inverse par la touche Entre. Dans Kylix, lutilisation de la touche Entre ne simule pas un vnement clic comme dans Delphi. TColorDialog ne possde pas de proprit TColorDialog.Options initialiser. Par consquent, vous ne pouvez pas personnaliser lapparence et la fonctionnalit de la bote de dialogue de slection de couleur. De plus, TColorDialog nest pas toujours modale. Sur Kylix, vous pouvez manipuler la barre de titre dune application avec une bote de dialogue modale (cest--dire que vous pouvez slectionner la fiche parent de la bote de dialogue de couleur et effectuer des oprations telles quun agrandissement lorsque la bote de dialogue de couleur est ouverte). A lexcution, les listes droulantes fonctionnent diffremment sur Kylix et sur Delphi. Sur Kylix, vous pouvez ajouter un lment une liste droulante en tapant le texte et en appuyant sur Entre dans la zone de saisie de la liste droulante. Vous pouvez dsactiver cette fonctionnalit en initialisant InsertMode ciNone. Il est galement possible dajouter des lments vides (aucune chane de caractres) la liste droulante. De plus, si vous maintenez appuye la flche vers le bas, laffichage ne sarrte pas au dernier lment de la liste droulante. Il effectue une boucle en revenant au dbut de la liste. TCustomEdit ne met pas en uvre Undo, ClearUndo ou CanUndo. Il nexiste donc aucune mthode pour annuler les saisies par programme. Mais les utilisateurs dune application peuvent annuler leurs saisies dans une bote de saisie (TEdit) lors de lexcution en cliquant avec le bouton droit de la souris sur cette bote puis en choisissant la commande Undo. Dans un vnement OnKeyDown ou KeyUp, la valeur de la touche Entre est 13 sous Windows. Sous Linux, cette valeur est 4100. Si vous testez la valeur numrique code en dur dune touche, comme lorsque vous testez la valeur 13 pour la touche Entre, vous devez modifier ce test lorsque vous portez une application Delphi vers Kylix. Il existe dautres diffrences. Reportez-vous la documentation en ligne de CLX pour des dtails sur tous les objets CLX ou, dans les versions de Delphi qui

Utilisation de CLX pour le dveloppement multiplate-forme

10-9

Portage dapplications VCL vers CLX

incluent le code source, reportez-vous au code que vous trouverez dans le rpertoire ..\Delphi6\Source\VCL\CLX.

Fonctionnalits manquantes dans CLX


Lorsque vous utilisez CLX la place de la VCL, beaucoup dobjets sont identiques. Mais, ces objets peuvent avoir perdu certaines fonctionnalits (comme des proprits, des mthodes, ou des vnements). Les fonctionnalits gnrales suivantes sont absentes de CLX : Proprits bidirectionnelles (BidiMode) pour les entres ou les sorties de texte de la droite vers la gauche Proprits de biseau gnriques sur les contrles courants (remarquez que certains objets possdent toujours des proprits de biseau) Proprits et mthodes dancrage Fonctionnalits de compatibilit ascendante comme les composants de longlet Win3.1 et Ctl3D DragCursor et DragKind (mais le glisser-dplacer est inclus)

Fonctionnalits non portes


Certaines fonctionnalits propres Windows, prises en charge par Delphi, ne sont pas portes directement vers les environnements Linux. Des fonctionnalits comme COM, ActiveX, OLE, BDE et ADO sont dpendantes de la technologie Windows et ne sont pas disponibles sur Kylix. Le tableau suivant prsente les fonctionnalits qui sont diffrentes sur les deux plates-formes, avec la fonctionnalit Kylix quivalente lorsqu elle est disponible.
Tableau 10.3 Fonctionnalits modifies ou diffrentes Fonctionnalit Kylix/Linux
Composants de bases de donnes classiques Non disponible dbExpress et composants de bases de donnes classiques Non disponible Non encore disponible Non disponible Non encore disponible Non disponible

Fonctionnalit Delphi/Windows
Composants ADO Serveurs Automation BDE Composants COM+ (incluant ActiveX) DataSnap FastNet Internet Express Composants existants (comme les lments de la page Win 3.1 de la palette de composants)

10-10

Guide du dveloppeur

Portage dapplications VCL vers CLX

Tableau 10.3

Fonctionnalits modifies ou diffrentes (suite) Fonctionnalit Kylix/Linux


SMTP/POP3 vous permet denvoyer, de recevoir et denregistrer des messages lectroniques

Fonctionnalit Delphi/Windows
Linterface de programmation dapplication de messagerie (MAPI, Messaging Application Programming Interface) incluant une bibliothque standard des fonctions de messagerie Windows. Quick Reports Services Web (SOAP) WebSnap Appels de lAPI Windows Messages Windows Winsock

Non disponible Non encore disponible Non encore disponible Mthodes CLX, appels Qt, appels libc ou appels dautres bibliothques systme Evnements Qt Sockets BSD

Les quivalents Linux des DLL Windows sont les bibliothques dobjets partags (fichiers .so), qui contiennent du code indpendant de la position (PIC). Il en rsulte que : Les variables se rfrant une adresse absolue en mmoire (au moyen de la directive absolute) ne sont pas autorises. Les rfrences mmoire globales et les appels des fonctions externes sont relatifs au registre EBX, qui doit tre prserv dun appel lautre. Vous ne devez vous proccuper des rfrences mmoire globales et des appels des fonctions externes que si vous utilisez lassembleur Kylix ou Delphi gnre le code correct. (Pour plus dinformations, consultez Inclusion de code assembleur inline la page 10-23.) Les modules et les paquets des bibliothques Kylix sont mis en uvre laide de fichiers .so.

Comparaison entre les units CLX et VCL


Tous les objets de la VCL ou de CLX sont dfinis dans des fichiers dunits (fichiers source .pas). Par exemple, vous trouverez la mise en uvre de TObject dans lunit System, et lunit Classes dfinit la classe de base TComponent. Lorsque vous dposez un objet sur une fiche ou que vous utilisez un objet dans votre application, le nom de lunit est ajout la clause uses qui indique au compilateur quelles units doivent tre lies au projet. Cette section contient des tableaux qui prsentent les units CLX avec lunit comparable de la VCL, les units qui existent uniquement pour CLX et celles qui existent uniquement pour VCL.

Utilisation de CLX pour le dveloppement multiplate-forme

10-11

Portage dapplications VCL vers CLX

Le tableau suivant prsente les units VCL et CLX comparables :


Tableau 10.4 Unit s VCL
ActnList Buttons CheckLst Classes Clipbrd ComCtrls Consts Contnrs Controls DateUtils DB DBActns DBClient DBCommon DBConnAdmin DBConsts DBCtrls DBGrids DBLocal DBLocalS DBLogDlg DBXpress Dialogs DSIntf ExtCtrls FMTBCD Forms Graphics Grids HelpIntfs ImgList IniFiles Mask MaskUtils Masks Math Menus Midas

Units VCL et leurs quivalents CLX Units CLX


QActnList QButtons QCheckLst Classes QClipbrd QComCtrls Consts, QConsts et RTLConsts Contnrs QControls DateUtils DB QDBActns DBClient DBCommon DBConnAdmin DBConsts QDBCtrls QDBGrids DBLocal DBLocalS DBLogDlg DBXpress QDialogs DSIntf QExtCtrls FMTBCD QForms QGraphics QGrids HelpIntfs QImgList IniFiles QMask MaskUtils Masks Math QMenus Midas

10-12

Guide du dveloppeur

Portage dapplications VCL vers CLX

Tableau 10.4 Unit s VCL


MidConst Printers Provider Qt Search Sockets StdActns StdCtrls SqlConst SqlExpr SqlTimSt SyncObjs SysConst SysInit System SysUtils Types TypInfo Variants VarUtils

Units VCL et leurs quivalents CLX (suite) Units CLX


MidConst QPrinters Provider Qt QSearch Sockets QStdActns QStdCtrls SqlConst SqlExpr SqlTimSt SyncObjs SysConst SysInit System SysUtils Types et QTypes TypInfo Variants VarUtils

Les units suivantes existent dans CLX mais pas dans la VCL :
Tableau 10.5 Unit
DirSel QStyle

Units de CLX absentes de la VCL Description


Slection de rpertoire Aspect graphique de linterface utilisateur

Les units VCL Windows suivantes ne sont pas incluses dans CLX, principalement parce quelles concernent des fonctionnalits propres Windows qui ne sont pas disponibles sous Linux comme ADO, COM et BDE. La raison de lexclusion de chaque unit est prcise.
Tableau 10.6 Unit
ADOConst ADODB AppEvnts AxCtrls BdeConst ComStrs

Units de la VCL uniquement Raison de son exclusion


Pas de fonctionnalit ADO Pas de fonctionnalit ADO Pas dobjet TApplicationEvent Pas de fonctionnalit COM Pas de fonctionnalit BDE Pas de fonctionnalit COM

Utilisation de CLX pour le dveloppement multiplate-forme

10-13

Portage dapplications VCL vers CLX

Tableau 10.6 Unit


ConvUtils CorbaCon CorbaStd CorbaVCL CtlPanel DataBkr DBCGrids DBExcept DBInpReq DBLookup DbOleCtl DBPWDlg DBTables DdeMan DRTable ExtActns ExtDlgs FileCtrl ListActns MConnect Messages MidasCon MPlayer Mtsobj MtsRdm Mtx mxConsts ObjBrkr OleConstMay OleCtnrs OleCtrls OLEDB OleServer Outline Registry ScktCnst ScktComp SConnect StdConvs SvcMgr

Units de la VCL uniquement (suite) Raison de son exclusion


Nouvelle fonctionnalit de Delphi 6 Pas de fonctionnalit Corba Pas de fonctionnalit Corba Pas de fonctionnalit Corba Pas de prise en charge du Panneau de configuration Windows Susceptible dapparatre plus tard en monte en gamme Pas de fonctionnalit BDE Pas de fonctionnalit BDE Pas de fonctionnalit BDE Obsolte Pas de fonctionnalit COM Pas de fonctionnalit BDE Pas de fonctionnalit BDE Pas de fonctionnalit DDE Pas de fonctionnalit BDE Nouvelle fonctionnalit de Delphi 6 Pas de botes de dialogue dimages Obsolte Nouvelle fonctionnalit de Delphi 6 Pas de fonctionnalit COM Domaine propre Windows Obsolte Lecteur de mdias propre Windows Pas de fonctionnalit COM Pas de fonctionnalit COM Pas de fonctionnalit COM Pas de fonctionnalit COM Susceptible dapparatre plus tard en monte en gamme Pas de fonctionnalit COM Pas de fonctionnalit COM Pas de fonctionnalit COM Pas de fonctionnalit COM Pas de fonctionnalit COM Obsolte Prise en charge du registre Windows Remplace par des sockets Remplace par des sockets Protocoles de connexion non pris en charge Nouvelle fonctionnalit de Delphi 6 Prise en charge des services NT

10-14

Guide du dveloppeur

Portage dapplications VCL vers CLX

Tableau 10.6 Unit


Tabnotbk Tabs ToolWin VarCmplx VarConv VCLCom WebConst Windows

Units de la VCL uniquement (suite) Raison de son exclusion


Obsolte Obsolte Pas de fonctionnalit dancrage Nouvelle fonctionnalit de Delphi 6 Nouvelle fonctionnalit de Delphi 6 Pas de fonctionnalit COM Constantes propres Windows Propre Windows (API)

Diffrences dans les constructeurs dobjets CLX


Lorsquun objet CLX est cr, soit implicitement dans le concepteur de fiches en plaant lobjet sur la fiche, soit explicitement dans le code en utilisant la mthode Create de lobjet, une instance du widget sous-jacent associ est galement cre. Cette instance est dtenue par lobjet CLX. Lorsque lobjet CLX est supprim au moyen dun appel la mthode Free ou quil est automatiquement supprim par le conteneur parent de lobjet CLX, le widget sous-jacent est galement supprim. Cest le mme type de fonctionnalit quoffre la VCL dans les applications Windows. Lorsque vous crez explicitement un objet CLX dans du code, en faisant des appels dans la bibliothque dinterface Qt comme QWidget_Create(), vous crez une instance dun widget Qt dont le propritaire nest pas un objet CLX. Cela transmet linstance dun widget Qt existant lobjet CLX utiliser pendant sa construction. Cet objet CLX nest pas propritaire du widget Qt qui lui est transmis. Par consquent, lorsque vous appelez la mthode Free aprs avoir cr lobjet de cette manire, seul lobjet CLX est dtruit, et non linstance du widget Qt sous-jacent. Ce comportement est diffrent de celui de la VCL. Certains objets CLX vous permettent dassumer la proprit du widget sousjacent en utilisant la mthode OwnHandle. Aprs lappel OwnHandle, si vous supprimez lobjet CLX, le widget sous-jacent est aussi supprim.

Partage des fichiers source entre Windows et Linux


Si vous voulez que votre application sexcute sous Windows et sous Linux, vous pouvez partager les fichiers source en les rendant accessibles aux deux systmes dexploitation. Vous pouvez procder de nombreuses manires, par exemple en plaant les fichiers sur un serveur accessible aux deux ordinateurs ou en utilisant Samba sur la machine Linux pour permettre daccder aux fichiers au travers dun partage rseau Microsoft pour Linux et Windows. Vous pouvez choisir de conserver le source sous Linux et de crer un partage sous Linux. Ou vous pouvez conserver le source sous Windows et crer un partage sous Windows pour que la machine Linux puisse y accder.

Utilisation de CLX pour le dveloppement multiplate-forme

10-15

Portage dapplications VCL vers CLX

Vous pouvez continuer dvelopper et compiler le fichier dans Kylix en utilisant des objets qui sont pris en charge par la VCL et CLX. Lorsque vous avez fini, vous pouvez compiler sous Linux et Windows. Les fichiers fiche (fichiers .dfm dans Delphi) sont appels fichiers .xfm dans Kylix. Si vous crez une nouvelle application CLX dans Delphi ou Kylix, un .xfm est cr la place dun .dfm. Dans le cas des applications multiplates-formes, le .xfm fonctionnera dans Delphi comme dans Kylix.

Diffrences denvironnement entre Windows et Linux


Habituellement, multiplate-forme signifie quune application peut sexcuter thoriquement sans aucune modification sous les systmes dexploitation Windows et Linux. Le tableau suivant prsente les diffrences entre les systmes dexploitation Linux et Windows.
Tableau 10.7 Diff rence
Nom de fichier sensible la casse

Diffrences dans les environnements dexploitation Linux et Windows Description


Dans Linux, une lettre majuscule nest pas identique une lettre minuscule. Le fichier Test.txt nest pas identique au fichier test.txt. Vous devez faire trs attention aux lettres majuscules dans les noms de fichiers sous Linux. Dans Windows, les lignes dun texte se terminent par CR/LF (cest--dire, ASCII 13 + ASCII 10), alors quelles se terminent par LF dans Linux. Bien que lditeur de code dans Kylix soit capable de grer la diffrence, vous devez tre conscient de cela lorsque vous importez du code depuis Windows. Dans DOS et dans Windows, le caractre de valeur #26 (Ctrl-Z) est considr comme la fin du fichier texte, mme sil existe des donnes dans le fichier aprs ce caractre. Linux na pas de caractre de fin de fichier particulier ; les donnes du texte se terminent la fin du fichier. Lquivalent Linux du fichier .bat est le script shell. Un script est un texte contenant des instructions enregistres et excutables laide de la commande chmod +x <fichierscript>. Pour lexcuter, tapez son nom. (Le langage de script dpend du shell que vous utilisez sous Linux. Bash est communment utilis.) Sous DOS ou Windows, si vous tentez de dtruire un fichier ou un dossier, une confirmation est demande (Etes-vous sr ?). Linux ne demande gnralement pas de confirmation ; il effectue simplement lopration. Cela accentue le risque de destruction accidentelle dun fichier ou de tout un systme de fichiers. Il nexiste aucun moyen dannuler une suppression sous Linux moins davoir sauvegard un fichier sur un autre support. Si une commande russit sous Linux, son invite est raffiche sans message dtat. Linux utilise un tiret simple (-) pour reprsenter les commutateurs de commande ou un tiret double (--) pour les options plusieurs caractres, l o DOS utilise une barre oblique droite (/) ou un tiret (-).

Caractres de fin de ligne

Caractre de fin de fichier

Fichiers de traitement par lots/scripts shell

Confirmation de commande

Retour de commande Commutateurs de commande

10-16

Guide du dveloppeur

Portage dapplications VCL vers CLX

Tableau 10.7 Diff rence

Diffrences dans les environnements dexploitation Linux et Windows (suite) Description


Sous Windows, la configuration seffectue dans le registre ou dans des fichiers comme autoexec.bat. Sous Linux, les fichiers de configuration sont crs sous la forme de fichiers cachs dont le nom commence par un point (.). La plupart sont installs dans le rpertoire /etc ou dans votre rpertoire initial. Linux utilise galement des variables denvironnement telles que LD_LIBRARY_PATH (chemin de recherche pour les bibliothques). Autres variables denvironnement importantes : HOMEVotre rpertoire initial (/home/sam) TERMType de terminal (xterm, vt100, console) SHELLChemin vers votre interprteur (/bin/bash) USERVotre identifiant de session (sfuller) PATHListe de recherche pour les programmes Ces variables sont spcifies dans linterprteur ou dans les fichiers rc tels que .bashrc. Sous Linux, vous utilisez des fichiers dobjets partags (.so). Sous Windows, il sagit de bibliothques de liens dynamiques (DLL). Linux ne possde pas de lettres de lecteurs. Un nom de chemin Linux est, par exemple, de la forme /lib/security. Voir DriveDelim dans la bibliothque dexcution. Les exceptions du systme dexploitation sont appeles signaux sous Linux. Sous Linux, les fichiers excutables ne ncessitent pas dextension. Sous Windows, les fichiers excutables possdent lextension exe. Linux nutilise pas dextensions de nom de fichier pour identifier les types de fichiers ou associer les fichiers des applications. Sous Linux, des permissions de lecture, dcriture et dexcution sont affectes aux fichiers (et aux rpertoires) pour le propritaire du fichier, le groupe et les autres. Par exemple, -rwxr-xr-x signifie, de la gauche vers la droite : - est le type de fichier (- = fichier ordinaire, d = rpertoire, l = lien) ; rwx reprsente les permissions pour le propritaire du fichier (lecture, criture, excution), r-x reprsente les permissions pour le groupe du propritaire du fichier (lecture, excution) et r-x reprsente les permissions pour tous les autres utilisateurs (lecture, excution). Lutilisateur root (super-utilisateur) peut outrepasser ces permissions. Vous devez vous assurer que votre application sexcute sous lutilisateur correct et dispose dun droit daccs correct aux fichiers requis. Lutilitaire make de Borland nest pas disponible sur la plateforme Linux. A la place, vous pouvez utiliser lutilitaire make GNU de Linux.

Fichiers de configuration

DLL Lettres de lecteurs

Exceptions Fichiers excutables Extensions de nom de fichier Permissions de fichier

Utilitaire Make

Utilisation de CLX pour le dveloppement multiplate-forme

10-17

Portage dapplications VCL vers CLX

Tableau 10.7 Diff rence


Multitche

Diffrences dans les environnements dexploitation Linux et Windows (suite) Description


Linux prend totalement en charge le fonctionnement multitche. Vous pouvez excuter en mme temps plusieurs programmes (appels processus sous Linux). Vous pouvez lancer des processus en arrire-plan (en utilisant & aprs la commande) et continuer immdiatement travailler. Linux vous permet galement de disposer de plusieurs sessions. Linux utilise une barre oblique droite (/) l o DOS utilise une barre oblique inverse (\). Une constante PathDelim peut tre utilise pour spcifier le caractre adapt la plate-forme. Voir PathDelim dans la bibliothque dexcution. Lors de lexcution de programmes, Windows consulte toujours en premier le rpertoire en cours, puis il examine la variable denvironnement PATH. Linux ne consulte jamais le rpertoire en cours mais recherche uniquement les rpertoires numrs dans PATH. Pour excuter un programme du rpertoire en cours, vous devez gnralement taper ./ avant. Vous pouvez galement modifier votre PATH pour inclure ./ comme premier chemin rechercher. Windows utilise le point-virgule comme sparateur de chemin de recherche. Sous Linux, un lien symbolique est un fichier spcial qui pointe sur un autre fichier du disque. En plaant les liens symboliques dans le rpertoire global bin qui contient les principaux fichiers de votre application, vous naurez pas modifier le chemin de recherche systme. Un lien symbolique se cre laide de la commande ln (link). Windows possde des raccourcis pour le bureau de linterface utilisateur graphique. Pour mettre un programme la disposition de la ligne de commande, les programmes dinstallation Windows modifient gnralement le chemin de recherche systme.

Noms de chemins

Chemin de recherche

Sparateur de chemin de recherche Liens symboliques

Structure de rpertoires sous Linux


Les rpertoires sont diffrents sous Linux. Nimporte quel fichier ou priphrique peut tre mont nimporte o dans le systme de fichiers.
Remarque

Les noms de chemins Linux utilisent des barres obliques droites contrairement Windows qui utilise des barres obliques inverses. La barre oblique initiale reprsente le rpertoire racine. Voici quelques rpertoires couramment utiliss dans Linux.
Tableau 10.8 Rpertoire
/ /root /bin

Rpertoires Linux courants Contenu


Le rpertoire racine ou de niveau suprieur de tout le systme de fichiers Linux Le systme de fichier root ; le rpertoire initial du super-utilisateur Commandes, utilitaires

10-18

Guide du dveloppeur

Portage dapplications VCL vers CLX

Tableau 10.8 Rpertoire


/sbin /dev /lib

Rpertoires Linux courants (suite) Contenu


Utilitaires systme Priphriques reprsents comme des fichiers Bibliothques Fichiers appartenant lutilisateur o nom_utilisateur est le nom de connexion de lutilisateur Facultatif Noyau appel lorsque le systme dmarre Fichiers de configuration Applications, programmes. Inclut gnralement des rpertoires comme / usr/spool, /usr/man, /usr/include, /usr/local Autre support install sur le systme, comme un CD-ROM ou un lecteur de disquettes Journaux, messages, fichiers de spool Systme de fichiers virtuels et statistiques du systme Fichiers temporaires

/home/ nom_utilisateur /opt /boot /etc /usr /mnt /var /proc /tmp

Remarque

Les diffrentes distributions de Linux installent parfois les fichiers diffrents emplacements. Un programme utilitaire peut tre install dans /bin avec une distribution Red Hat et dans /usr/local/bin avec une distribution Debian. Reportez-vous www.pathname.com pour des dtails supplmentaires sur lorganisation du systme de fichiers hirarchique UNIX/Linux. Vous pourrez galement consulter le document Filesystem Hierarchy Standard.

Ecriture de code portable


Si vous crivez des applications multiplates-formes destines tre excutes sous Windows et Linux, vous pouvez crire du code qui se compilera sous diffrentes conditions. En utilisant la compilation conditionnelle, vous pouvez conserver votre codage Windows, en prenant toujours en considration les diffrences du systme dexploitation Linux. Pour crer des applications facilement portables entre Windows et Linux, pensez rduire ou isoler les appels aux API propres une plate-forme (Win32 ou Linux) ; utilisez la place les mthodes CLX. liminer les constructions de messagerie Windows (PostMessage, SendMessage) dans une application. utiliser TMemIniFile la place de TRegIniFile. respecter et conserver la distinction minuscule/majuscule pour les noms de fichiers et de rpertoires.

Utilisation de CLX pour le dveloppement multiplate-forme

10-19

Portage dapplications VCL vers CLX

porter tout code TASM assembleur externe. Lassembleur GNU as ne prend pas en charge la syntaxe TASM. (Consultez Inclusion de code assembleur inline la page 10-23.) Essayez dcrire le code de manire utiliser les routines de la bibliothque dexcution indpendantes de la plate-forme et utilisez les constantes de System, SysUtils et des autres units de la bibliothque dexcution. Par exemple, utilisez la constante PathDelim pour que votre code ne soit pas affect par les diffrences de plate-forme de / par rapport \. Un autre exemple concerne lutilisation de caractres multi-octets sur les deux plates-formes. Traditionnellement, le code Windows attend uniquement 2 octets par caractre multi-octet. Sous Linux, les caractres multi-octets peut comporter beaucoup plus doctets (jusqu 6 octets pour UTF-8). Les deux plates-formes peuvent tre adaptes en utilisant la fonction StrNextChar dans SysUtils. Le code Windows existant suivant
while p^ <> #0 do begin if p^ in LeadBytes then inc(p); inc(p); end;

peut tre remplac par un code indpendant de la plate-forme comme celui-ci :


while p^ <> #0 do begin if p^ in LeadBytes then p := StrNextChar(p) else inc(p); end;

Cet exemple est portable dune plate-forme lautre et prend en charge les caractres multioctets sur plus de 2 octets, mais il vite toujours de nuire aux performances en appelant une procdure pour les environnement rgionaux non multi-octets. Si lutilisation de fonctions de bibliothque dexcution nest pas une solution envisageable, essayez disoler le code propre une plate-forme dans une partie de votre routine ou une sous-routine. Essayez de limiter le nombre de blocs $IFDEF pour conserver la lisibilit et la portabilit du code source. Le symbole conditionnel WIN32 nest pas dfini sous Linux. Le symbole conditionnel LINUX est dfini, pour indiquer que le code source est compil pour la plate-forme Linux.

Utilisation des directives conditionnelles


Lutilisation des directives de compilation $IFDEF est une mthode recommande pour introduire des conditions dans votre code pour les platesformes Windows et Linux. Toutefois, comme les $IFDEF rendent le code source plus difficile comprendre et maintenir, vous devez savoir quelles occasions il est raisonnable dutiliser des $IFDEF. En envisageant lutilisation des $IFDEF,

10-20

Guide du dveloppeur

Portage dapplications VCL vers CLX

les meilleures questions se poser devraient tre Pourquoi ce code a-t-il besoin dun $IFDEF ? et Ce traitement peut-il scrire sans $IFDEF ? Suivez ces lignes directrices pour utiliser des $IFDEF dans des applications multiplates-formes : Nessayez pas dutiliser de $IFDEF sans absolue ncessit. Les $IFDEF dans un fichier source sont uniquement valus lorsque le code source est compil. A la diffrence de C/C++, Delphi ne ncessite pas de sources dunit (fichiers en-tte) pour compiler un projet. La reconstruction totale de tout le code source est un vnement rare pour la plupart des projets Delphi. Nutilisez pas de $IFDEF dans les fichiers paquet (.dpk). Limitez leur utilisation aux fichiers source. Les crateurs de composants doivent crer deux paquets de conception lors du dveloppement multiplates-formes, et non un seul paquet avec des $IFDEF. En gnral, utilisez $IFDEF MSWINDOWS pour tester nimporte quelle plateforme Windows, y compris WIN32. Rservez lutilisation de $IFDEF WIN32 la distinction entre des plates-formes Windows spcifiques, comme Windows 32 bits et 64 bits. Ne limitez pas votre code WIN32 moins dtre sr quil ne fonctionne pas sous WIN64. Evitez les tests ngatifs du type $IFNDEF si ce nest pas absolument ncessaire. $IFNDEF LINUX nest pas quivalent $IFDEF MSWINDOWS. Evitez les combinaisons $IFNDEF/$ELSE. Utilisez plutt un test positif ($IFDEF) pour une meilleure lisibilit. Evitez les clauses $ELSE sur des $IFDEF de test de plate-forme. Utilisez des blocs $IFDEF spars pour du code LINUX ou MSWINDOWS au lieu de $IFDEF LINUX/$ELSE ou $IFDEF MSWINDOWS/$ELSE. Par exemple, un ancien code peut contenir
{$IFDEF WIN32} (Code Windows 32 bits) {$ELSE} (Code Windows 16 bits) {$ENDIF}

//!! Linux pourra tomber par erreur dans ce code.

Pour tout code non portable dans des $IFDEF, il est prfrable que le code source choue la compilation que de voir la plate-forme tomber dans une clause $ELSE et chouer mystrieusement lexcution. Les checs de compilation sont plus faciles rsoudre que les erreurs lexcution. Utilisez la syntaxe $IF pour les tests compliqus. Remplacez les $IFDEF imbriqus par une expression boolenne dans une directive $IF. La directive $IF doit tre termine par $IFEND, et non par $ENDIF. Cela vous permet de placer des expressions $IF dans des $IFDEF pour dissimuler la nouvelle syntaxe $IF aux compilateurs prcdents. Toutes les directives conditionnelles sont documentes dans laide en ligne. Pour plus dinformations, consultez galement la rubrique Compilation conditionnelle dans laide.

Utilisation de CLX pour le dveloppement multiplate-forme

10-21

Portage dapplications VCL vers CLX

Terminaison des directives conditionnelles


Utilisez la directive $IFEND pour terminer les directives conditionnelles $IF et $ELSEIF. Cela permet de dissimuler les blocs $IF/$IFEND pour les anciens compilateurs, avec lutilisation de $IFDEF/$ENDIF. Les anciens compilateurs ne reconnatront pas la directive $IFEND. $IF peut uniquement se terminer par $IFEND. Les anciennes directives ($IFDEF, $IFNDEF, $IFOPT) ne peuvent se terminer que par $ENDIF.
Remarque

Lors de limbrication dun $IF dans un $IFDEF/$ENDIF, nutilisez pas $ELSE avec $IF. Les anciens compilateurs verront le $ELSE et penseront quil fait partie du $IFDEF, ce qui entranera une erreur de compilation plus loin. Dans cette situation, vous pouvez utiliser {$ELSEIF True} comme substitut de {$ELSE}, puisque le $ELSEIF ne sera pas pris en compte si le $IF est pris en compte dabord, et que les anciens compilateurs ne connaissent pas $ELSEIF. La dissimulation des $IF pour la compatibilit ascendante est principalement un problme pour les fournisseurs et les dveloppeurs dapplications tierces parties qui souhaitent que leur code sexcute sur plusieurs versions diffrentes. $ELSEIF est une combinaison de $ELSE et de $IF. La directive $ELSEIF vous permet dcrire des blocs conditionnels plusieurs parties o un seul des blocs conditionnels sera pris en compte. Par exemple :
{$IFDEF faire} fais_le {$ELSEIF RTLVersion >= 14} fais_le_vraiment {$ELSEIF chaine = oui} bip {$ELSE} dernire chance {$IFEND}

De ces quatre cas, un seul est pris en compte. Si aucune de ces trois premires conditions nest vraie, la clause $ELSE est prise en compte. $ELSEIF doit tre termine par $IFEND. $ELSEIF ne peut pas tre place aprs $ELSE. Les conditions sont values de haut en bas comme une squence $IF...$ELSE normale. Dans lexemple, si faire nest pas dfini, RTLVersion a la valeur 15 et chaine vaut oui, seul le bloc fais_le_vraiment sera pris en compte, le bloc bip ne le sera pas, mme si les conditions sont vraies pour les deux. Si vous oubliez dutiliser un $ENDIF pour mettre fin lun de vos $IFDEF, le compilateur signale lerreur suivante la fin du fichier source :
Missing ENDIF

Sil existe plusieurs directives $IF/$IFDEF dans votre fichier source, il peut tre difficile de dterminer laquelle est lorigine du problme. Kylix ou Delphi renvoie le message derreur suivant sur la ligne source de la dernire directive $IF/$IFDEF du compilateur sans correspondance avec un $ENDIF/$IFEND :
Unterminated conditional directive

Vous pouvez commencer rechercher le problme cet emplacement.

10-22

Guide du dveloppeur

Portage dapplications VCL vers CLX

Emission de messages
La directive de compilation $MESSAGE permet au code source dmettre des conseils, des avertissements et des erreurs exactement comme le compilateur. {$MESSAGE HINT|WARN|ERROR|FATAL chaine texte } Le type de message est facultatif. Si aucun type de message nest indiqu, la valeur par dfaut est HINT. La chane de texte est obligatoire et doit tre encadre par des apostrophes. Exemples : {$MESSAGE Bouh!} met un conseil. {$Message Hint Donner manger au chat} met un conseil. {$Message Warn Il semble pleuvoir} met un avertissement. {$Message Error Non mis en oeuvre} met un message derreur, mais la compilation continue. {$Message Fatal Pan! Tu es mort.} met un message derreur et la compilation sarrte.

Inclusion de code assembleur inline


Si vous incluez du code assembleur inline dans vos applications Windows, il est possible que vous ne puissiez pas utiliser le mme code sous Linux cause des exigences du code indpendant de la position (PIC) sous Linux. Les bibliothques dobjets partags Linux (quivalentes aux DLL) ncessitent que tout le code soit relogeable en mmoire sans modification. Cela affecte principalement les routines assembleur inline qui utilisent des variables globales ou dautres adresses absolues, ou qui appellent des fonctions externes. Pour les units qui contiennent uniquement du code Pascal Objet, le compilateur gnre automatiquement un PIC lorsque cest ncessaire. Les units PIC possdent une extension .dpu (au lieu de .dcu). Il est recommand de compiler chaque fichier source dunit Pascal aux formats PIC et non PIC ; utilisez le commutateur de compilation -p pour gnrer du PIC. Les units prcompiles sont disponibles aux deux formats. Il est possible que vous souhaitiez coder diffremment des routines assembleur selon que vous compilez un excutable ou une librairie partag e ; utilisez {$IFDEF PIC} pour fusionner les deux versions de votre code assembleur. Vous pouvez aussi rcrire la routine en Pascal Objet pour viter le problme. Les rgles PIC pour le code assembleur inline sont les suivantes : PIC ncessite que toutes les rfrences mmoire soient relatives au registre EBX, qui contient le pointeur dadresse de base du module en cours (dans Linux, ce pointeur sappelle Global Offset Table ou GOT). Ainsi, plutt que
MOV EAX,GlobalVar

utilisez
MOV EAX,[EBX].GlobalVar

Utilisation de CLX pour le dveloppement multiplate-forme

10-23

Portage dapplications VCL vers CLX

PIC impose de prserver le registre EBX dun appel lautre dans votre code assembleur (comme sous Win32), et de restaurer galement le registre EBX avant deffectuer des appels des fonctions externes ( linverse de Win32). Mme si le code PIC fonctionnera dans des excutables de base, il peut ralentir les performances et gnrer plus de code. Vous navez pas le choix pour les objets partags, mais dans les excutables, vous souhaiterez probablement toujours obtenir le plus haut niveau de performances possible.

Messages et vnements systme


Les boucles de messages et les vnements fonctionnent diffremment sous Linux et dans CLX, mais cela concerne principalement lcriture de composants. La plupart des composants et des diteurs de proprits se portent facilement. TObject.Dispatch et la syntaxe des mthodes de messages sur les classes fonctionnent trs bien sous Linux ; les notifications du systme dexploitation Linux sont toutefois gres laide dvnements systme plutt que de messages. Pour crer un gestionnaire dvnements dans une application multiplate-forme, vous pouvez surcharger lune des mthodes dcrites au tableau suivant afin dcrire votre propre message personnalis au lieu de rpondre aux messages Windows. Dans la surcharge, appelez la mthode hrite pour que les processus par dfaut soient toujours excuts.
Tableau 10.9 M thode
ChangeBounds

M thodes prot ges de TWidgetControl pour la rponse aux vnements systme Description
Utilise lorsquun TWidgetControl est redimensionn. A peu prs analogue WM_SIZE ou WM_MOVE dans Windows. Qt dfinit la gomtrie dun widget bas sur la zone client, la VCL utilise toute la taille du contrle, ce qui inclut ce que Qt nomme le cadre. Appele automatiquement lors du redimensionnement des contrles. Utilise pour modifier lchelle dune fiche et tous ses contrles pour une rsolution dcran ou une taille de police diffrente. Comme ChangeScale modifie les proprits Top, Left, Width et Height, elle modifie la position du contrle et ses enfants aussi bien que leur taille. Appele lorsque la couleur du contrle a t modifie. Appele lorsque le curseur change de forme. Le curseur de la souris adopte cette forme lorsquil est au-dessus de ce widget. Appele lorsquune application modifie ltat activ dune fentre ou dun contrle. Appele lorsque lensemble des ressources de polices a t modifi. Elle dfinit la police pour le widget et informe tous les enfants de la modification. A peu prs analogue au message WM_FONTCHANGE. Appele lorsque la palette systme a t modifie. Appele lorsque les conseils daide sont affichs ou cachs pour un contrle. Appele lorsque les styles de linterface graphique utilisateur de la fentre ou des contrles ont t modifis.

ChangeScale

ColorChanged CursorChanged EnabledChanged FontChanged

PaletteChanged ShowHintChanged StyleChanged

10-24

Guide du dveloppeur

Portage dapplications VCL vers CLX

Tableau 10.9 M thode

Mthodes protges de TWidgetControl pour la rponse aux vnements systme (suite) Description
Appele lorsque lordre de tabulation de la fiche a t modifi. Appele lorsquun contrle est cach ou rendu visible. Appele lorsquun widget sous-jacent un contrle est dtruit.

TabStopChanged VisibleChanged WidgetDestroyed

Qt est un kit de dveloppement C++, aussi tous ses widgets sont-ils des objets C++. CLX est crit en Pascal Objet et le Pascal Objet ninteragit pas directement avec les objets C+. De plus, Qt utilise plusieurs hritages plusieurs endroits. Delphi inclut donc une couche dinterface qui convertit toutes les classes Qt en une srie de fonctions C simples. Celles-ci sont ensuite enveloppes dans un objet partag sous Linux et dans une DLL sous Windows. Chaque TWidgetControl possde des mthodes virtuelles CreateWidget, InitWidget et HookEvents qui doivent presque toujours tre surcharges. CreateWidget cre le widget Qt et affecte le Handle la variable de champ prive FHandle. InitWidget est appele lorsque le widget a t construit et que le Handle est valide. Certaines affectations de proprits dans CLX Delphi ont t dplaces du constructeur Create vers InitWidget. Cela permet de diffrer la construction de lobjet Qt jusqu ce quelle soit vraiment ncessaire. Par exemple, supposons que vous disposiez dune proprit appele Color. Dans SetColor, vous pouvez vrifier avec HandleAllocated si vous disposez dun Handle de Qt. Si le Handle est allou, vous pouvez effectuer lappel Qt pour dfinir la couleur. Sinon, vous pouvez stocker la valeur dans une variable de champ prive, et dans InitWidget, vous dfinissez la proprit. Linux prend en charge deux types dvnements : Widget et System. HookEvents est une mthode virtuelle qui connecte les mthodes dvnements des contrles CLX un objet de lien particulier qui communique avec lobjet Qt. Lobjet de lien nest rien dautre quun ensemble de pointeurs de mthodes. Les vnements systme dans Kylix passent par EventHandler, qui remplace fondamentalement WndProc.

Diffrences de programmation sous Linux


Le type widechar Linux wchar_t comporte 32 bits par caractre. La norme Unicode 16 bits prise en charge par les widechars du Pascal objet est un sousensemble de la norme UCS 32 bits prise en charge par Linux et les bibliothques GNU. Les donnes Pascal de type widechar doivent tre tendues 32 bits par caractre avant de pouvoir tre transmises une fonction de systme dexploitation en tant que wchar_t. Sous Linux, les widestrings sont comptes par rfrence comme les chanes longues (alors que ce nest pas le cas sous Windows). La gestion multi-octet est diffrente sous Linux. Sous Windows, les caractres multi-octets (MBCS) sont reprsents sous la forme de codes de caractres de 1 et 2 octets. Sous Linux, ils sont reprsents par 1 6 octets.

Utilisation de CLX pour le dveloppement multiplate-forme

10-25

Applications de bases de donnes multiplates-formes

Les AnsiStrings peut transporter des squences de caractres multi-octets, en fonction des paramtres rgionaux de lutilisateur. Le codage Linux pour les caractres multi-octets comme le japonais, le chinois, lhbreu et larabe peuvent tre incompatibles avec le codage Windows pour ces mmes paramtres rgionaux. Unicode est portable, alors que le multi-octet ne lest pas. Sous Linux, vous ne pouvez pas utiliser de variables sur des adresses absolues. La syntaxe var X: Integer absolute $1234; nest pas prise en charge dans PIC et elle est interdite dans Delphi.

Applications de bases de donnes multiplates-formes


Sous Windows, Delphi fournit plusieurs mthodes pour accder aux informations de bases de donnes. Cela inclut lutilisation dADO, du moteur de bases de donnes Borland (BDE) et dInterBase Express. Toutefois, ces trois mthodes ne sont pas disponibles dans Kylix. Vous pouvez utiliser la place dbExpress, une nouvelle technologie daccs aux donnes multiplates-formes, qui est galement disponible sous Windows, en commenant par la version 6 de Delphi. Avant de porter une application de base de donnes vers dbExpress pour quelle sexcute sous Linux, vous devez comprendre les diffrences entre lutilisation de dbExpress et le mcanisme daccs aux donnes que vous utilisiez. Ces diffrences se situent diffrents niveaux. Au niveau le plus bas, il existe une couche qui communique entre votre application et le serveur de base de donnes. Cela peut tre ADO, le moteur BDE, ou le logiciel client InterBase. Cette couche est remplace par dbExpress, qui est un ensemble de pilotes lgers pour le traitement SQL dynamique. Laccs aux donnes de bas niveau est envelopp dans un ensemble de composants que vous ajoutez des modules ou des fiches de donnes. Ces composants incluent des composants de connexion la base de donnes, qui reprsentent la connexion un serveur de base de donnes, et des ensembles de donnes, qui reprsentent les donnes obtenues partir du serveur. Bien quil existe des diffrences trs importantes, en raison de la nature unidirectionnelle des curseurs dbExpress, elles sont moins prononces ce niveau, car les ensembles de donnes partagent tous un anctre commun, comme les composants de connexion de base de donnes. Au niveau de linterface utilisateur, il y a moins de diffrences. Les contrles CLX orients donnes sont conus pour tre autant que possible similaires aux contrles Windows correspondants. Les diffrences les plus importantes au niveau de linterface utilisateur rsultent des modifications ncessaires lutilisation des mises jour en mmoire cache. Pour des informations sur le portage dapplications de bases de donnes existantes vers dbExpress, reportez-vous Portage dapplications de bases de donnes vers Linux la page 10-29. Pour des informations sur la conception de nouvelles applications dbExpress, consultez le chapitre 14, Conception dapplications de bases de donnes.

10-26

Guide du dveloppeur

Applications de bases de donnes multiplates-formes

Diffrences de dbExpress
Sous Linux, dbExpress gre la communication avec les serveurs de bases de donnes. dbExpress se compose dun ensemble de pilotes lgers qui mettent en uvre un ensemble dinterfaces communes. Chaque pilote est un objet partag (fichier .so) qui doit tre li votre application. Comme dbExpress est conu pour tre multiplates-formes, il sera galement disponible sous Windows sous la forme dun ensemble de bibliothques de liens dynamiques (.dll). Comme avec nimporte quelle couche daccs aux donnes, dbExpress a besoin du logiciel client du fournisseur de base de donnes. De plus, il utilise un pilote propre la base de donnes, plus deux fichiers de configuration, dbxconnections et dbxdrivers. Cest beaucoup moins que, par exemple, pour le moteur BDE, qui ncessite la bibliothque principale du moteur de bases de donnes Borland (Idapi32.dll) plus un pilote propre la base de donnes et un certain nombre dautres bibliothques de gestion. Voici quelques autres diffrences entre dbExpress et les autres couches daccs aux donnes partir desquelles vous devez porter votre application : dbExpress fournit un chemin plus simple et plus rapide aux bases de donnes distantes. Par consquent, vous pouvez vous attendre une amlioration sensible des performances pour un accs aux donnes simple et direct. dbExpress peut traiter les requtes et les procdures stockes, mais il ne prend pas en charge louverture des tables. dbExpress renvoie uniquement des curseurs unidirectionnels. dbExpress ne dispose pas dautre possibilit de mise jour intgre que lexcution dune requte INSERT, DELETE ou UPDATE. dbExpress na pas de mmoire cache pour les mtadonnes et linterface daccs aux mtadonnes lors de la conception est mise en uvre laide de linterface centrale daccs aux donnes. dbExpress excute uniquement des requtes transmises par lutilisateur, optimisant ainsi laccs la base de donnes sans introduire de requtes supplmentaires. dbExpress gre un tampon denregistrement ou un bloc de tampons denregistrement de manire interne. Il diffre en cela du moteur BDE, avec lequel les clients doivent allouer la mmoire utilise pour les enregistrements du tampon. dbExpress ne prend pas en charge les tables locales qui ne sont pas bases sur SQL (comme Paradox, dBase ou FoxPro). Il existe des pilotes dbExpress pour InterBase, Oracle, DB2 et MySQL. Si vous utilisez un serveur de base de donnes diffrent, vous devrez porter vos donnes sur lune de ces bases de donnes, crire un pilote dbExpress pour le serveur que vous utilisez ou obtenir un pilote dbExpress tierce partie pour votre serveur de base de donnes.

Utilisation de CLX pour le dveloppement multiplate-forme

10-27

Applications de bases de donnes multiplates-formes

Diffrences au niveau composant


Lorsque vous crivez une application dbExpress, celle-ci a besoin dun ensemble de composants daccs aux donnes diffrent de ceux utiliss dans vos applications de bases de donnes existantes. Les composants dbExpress partagent les mmes classes de base que dautres composants daccs aux donnes (TDataSet et TCustomConnection), ce qui signifie quun grand nombre de proprits, de mthodes et dvnements sont les mmes que pour les composants utiliss dans vos applications existantes. Le tableau suivant prsente la liste des composants de bases de donnes importants utiliss dans InterBase Express, le BDE et ADO dans lenvironnement Windows, et montre les composants dbExpress comparables pour une utilisation sous Linux et dans des applications multiplates-formes.
Tableau 10.10 Composants daccs aux donnes comparables Composants BDE
TDatabase TTable TQuery TStoredProc

Composants vInterBase Express


TIBDatabase TIBTable TIBQuery TIBStoredProc TIBDataSet

Composants ADO
TADOConnection TADOTable TADOQuery TADOStoredProc TADODataSet

Composants dbExpress
TSQLConnection TSQLTable TSQLQuery TSQLStoredProc TSQLDataSet

Les ensembles de donnes dbExpress (TSQLTable, TSQLQuery, TSQLStoredProc et TSQLDataSet) sont toutefois plus limits que leurs quivalents, car ils ne prennent pas en charge les modifications et permettent uniquement la navigation vers lavant. Pour plus de dtails sur les diffrences entre les ensembles de donnes dbExpress et les autres ensembles de donnes disponibles sous Windows, consultez le chapitre 22, Utilisation densembles de donnes unidirectionnels. A cause de labsence de prise en charge des modifications et de la navigation, la plupart des applications dbExpress ne fonctionnent pas directement avec les ensembles de donnes dbExpress. Elles connectent plutt lensemble de donnes dbExpress un ensemble de donnes client, qui conserve les enregistrements dans une mmoire tampon et assure une prise en charge des modifications et de la navigation. Pour plus dinformations sur cette architecture, consultez Architecture des bases de donnes la page 14-6.
Remarque

Pour les applications trs simples, vous pouvez utiliser TSQLClientDataSet la place dun ensemble de donnes dbExpress connect un ensemble de donnes client. Cela a pour avantage la simplicit, car il existe une correspondance 1 pour 1 entre lensemble de donnes de lapplication que vous portez et lensemble de donnes de lapplication porte, mais cette solution est moins souple quune connexion explicite entre un ensemble de donnes dbExpress et un ensemble de donnes client. Pour la plupart des applications, il est recommand dutiliser un ensemble de donnes dbExpress connect un composant TClientDataSet.

10-28

Guide du dveloppeur

Applications de bases de donnes multiplates-formes

Diffrences au niveau de linterface utilisateur


Les contrles CLX orients donnes sont conus pour tre aussi similaires que possible aux contrles Windows correspondants. Par consquent, le portage de la partie interface utilisateur de vos applications de bases de donnes introduit quelques considrations supplmentaires par rapport celles du portage dune application Windows quelconque vers CLX. Les principales diffrences au niveau de linterface utilisateur proviennent des diffrences dans la faon dont les ensembles de donnes dbExpress ou les ensembles de donnes client fournissent les donnes. Si vous utilisez uniquement des ensembles de donnes dbExpress, vous devez ajuster votre interface utilisateur cause du fait que les ensembles de donnes ne prennent pas en charge la modification mais uniquement la navigation vers lavant. Il peut, par exemple, tre ncessaire de supprimer des contrles permettant aux utilisateurs de se positionner sur un enregistrement prcdent. Comme les ensembles de donnes dbExpress ne grent pas de mmoire tampon des donnes, vous ne pouvez pas afficher les donn es dans une grille oriente donnes : vous pouvez seulement afficher un enregistrement la fois. Si vous avez connect lensemble de donnes dbExpress un ensemble de donnes client, les lments de linterface utilisateur associs la modification et la navigation devraient toujours fonctionner. Vous devez uniquement les reconnecter lensemble de donnes client. Dans ce cas, lattention doit principalement tre mise sur la gestion de lcriture des mises jour dans la base de donnes. Par dfaut, la plupart des ensembles de donnes sous Windows crivent automatiquement les mises jour sur le serveur de base de donnes lorsquelles sont transmises (par exemple, lorsque lutilisateur se dplace vers un nouvel enregistrement). Les ensembles de donnes client, par contre, conservent toujours les mises jour en mmoire cache. Pour des informations sur la manire de grer ces diffrences, consultez Mise jour des donnes dans les applications dbExpress la page 10-32.

Portage dapplications de bases de donnes vers Linux


Le portage de votre application de bases de donnes vers dbExpress vous permet de crer une application multiplates-formes qui sexcutera la fois sous Windows et sous Linux. La procdure de portage implique dapporter des modifications votre application, car la technologie est diffrente. La difficult du portage dpend du type de lapplication, de sa complexit et de ce quil est ncessaire daccomplir. Une application qui utilise largement les technologies propres Windows comme ADO sera plus difficile porter quune autre utilisant la technologie de base de donnes Delphi.

Utilisation de CLX pour le dveloppement multiplate-forme

10-29

Applications de bases de donnes multiplates-formes

Suivez ces tapes gnrales pour porter votre application de base de donnes Windows/VCL vers Kylix/CLX :

1 Examinez lendroit o les donnes de la base de donnes sont stockes. dbExpress fournit des pilotes pour Oracle, Interbase, DB2 et MySQL. Les donnes doivent rsider sur lun de ces serveurs SQL.
Certaines versions de Delphi incluent lutilitaire Data Pump dont vous pouvez vous servir pour transfrer les donnes de la base de donnes locale, depuis les plates-formes comme Paradox, dBase et FoxPro vers lune des platesformes prises en charge. (Consultez le fichier datapump.hlp dans Program Files\Common Files\Borland\Shared\BDE pour des informations sur lemploi de cet utilitaire.)

2 Si vous navez pas spar vos fiches dinterface utilisateur des modules de donnes contenant les ensembles de donnes et les composants de connexion, vous devrez le faire avant de dmarrer le portage. Vous isolerez ainsi les parties de votre application qui ncessitent un ensemble de composants totalement nouveau dans les modules de donnes. Les fiches reprsentant linterface utilisateur pourront alors tre portes comme nimporte quelle autre application. Pour les dtails, reportez-vous Portage de votre application la page 10-4.
Les tapes suivantes supposent que vos ensembles de donnes et composants de connexion sont isols dans leurs propres modules de donnes.

3 Crez un nouveau module de donnes qui contiendra les versions CLX de vos ensembles de donnes et composants de connexion. 4 Pour chaque ensemble de donnes de lapplication dorigine, ajoutez un ensemble de donnes dbExpress, un composant TDataSetProvider et un composant TClientDataSet . Utilisez les correspondances du tableau 10.10 pour dcider de lensemble de donnes dbExpress utiliser. Donnez ces composants des noms significatifs.
Initialisez la proprit ProviderName du composant TClientDataSet avec le nom du composant TDataSetProvider. Initialisez la proprit DataSet du composant TDataSetProvider avec lensemble de donnes dbExpress. Modifiez la proprit DataSet de tous les composants sources de donnes qui faisaient rfrence lensemble de donnes dorigine afin qu ils fassent prsent rfrence lensemble de donnes client.

5 Dfinissez les proprits du nouvel ensemble de donnes pour quelles correspondent celles de lensemble de donnes dorigine :
Si lensemble de donnes dorigine tait un composant TTable, TADOTable ou TIBTable, initialisez la proprit TableName du nouveau composant TSQLTable avec la proprit TableName de lensemble de donnes dorigine. Copiez galement toutes les proprits utilises pour dfinir les liens matre-dtail ou spcifier des index. Les proprits spcifiant des plages et des filtres devraient tre initialises sur lensemble de donnes client plutt que sur le nouveau composant TSQLTable.

10-30

Guide du dveloppeur

Applications de bases de donnes multiplates-formes

Si lensemble de donnes dorigine est un composant TQuery, TADOQuery ou TIBQuery, initialisez la proprit SQL du nouveau composant TSQLQuery avec la proprit SQL de lensemble de donnes dorigine. Initialisez la proprit Params du nouveau TSQLQuery conformment la valeur de la proprit Params ou Parameters de lensemble de donnes dorigine. Si vous avez initialis la proprit DataSource pour tablir un lien matredtail, copiez-la galement. Si lensemble de donnes dorigine tait un composant TStoredProc, TADOStoredProc ou TIBStoredProc, initialisez la proprit StoredProcName du nouveau composant TSQLStoredProc avec la proprit StoredProcName ou ProcedureName de lensemble de donnes dorigine. Initialisez la proprit Params du nouveau composant TSQLStoredProc conformment la valeur de la proprit Params ou Parameters de lensemble de donnes dorigine.

6 Pour tout composant de connexion de base de donnes dans lapplication dorigine (TDatabase, TIBDatabase ou TADOConnection), ajoutez un composant TSQLConnection au nouveau module de donnes. Vous devez galement ajouter un composant TSQLConnection pour chaque serveur de base de donnes auquel vous vous connectiez sans composant de connexion (par exemple, en utilisant la proprit ConnectionString sur un ensemble de donnes ADO ou en initialisant la proprit DatabaseName de lensemble de donnes BDE avec un alias BDE). 7 Pour chaque ensemble de donnes dbExpress positionn ltape 4, initialisez sa proprit SQLConnection avec le composant TSQLConnection correspondant la connexion de base de donnes approprie. 8 Sur chaque composant TSQLConnection, spcifiez les informations ncessaires ltablissement dune connexion de base de donnes. Pour cela, double-cliquez sur le composant TSQLConnection pour afficher lditeur de connexion et affectez les valeurs correspondant aux paramtres appropris. Si vous avez d transfrer des donnes vers un nouveau serveur de base de donnes ltape 1, spcifiez les paramtres appropris pour ce nouveau serveur. Si vous utilisez le mme serveur quauparavant, vous pouvez obtenir certaines de ces informations sur le composant de connexion dorigine :
Si lapplication dorigine utilisait TDatabase, vous devez transfrer les informations qui apparaissent dans les proprits Params et TransIsolation. Si lapplication dorigine utilisait TADOConnection, vous devez transfrer les informations qui apparaissent dans les proprits ConnectionString et IsolationLevel. Si lapplication dorigine utilisait TIBDatabase, vous devez transfrer les informations qui apparaissent dans les proprits DatabaseName et Params. Sil ny avait pas de composant de connexion dorigine, vous devez transfrer les informations associes lalias BDE ou qui apparaissaient dans la proprit ConnectionString de lensemble de donnes. Vous pouvez enregistrer cet ensemble de paramtres sous un nouveau nom de connexion. Pour plus de dtails sur cette procdure, reportez-vous Contrles des connexions la page 17-3.

Utilisation de CLX pour le dveloppement multiplate-forme

10-31

Applications de bases de donnes multiplates-formes

Mise jour des donnes dans les applications dbExpress


Les applications dbExpress utilisent des ensembles de donnes client pour prendre en charge la modification. Lorsque vous transmettez des modifications un ensemble de donnes client, celles-ci sont crites dans le clich en mmoire des donnes de lensemble de donnes client, mais elles ne sont pas automatiquement crites sur le serveur de base de donnes. Si votre application dorigine utilisait un ensemble de donnes client pour les mises jour en mmoire cache, vous navez rien modifier pour prendre en charge la modification sous Linux. Par contre, si vous vous basiez sur le comportement par dfaut de la plupart des ensembles de donnes sous Windows, qui consiste crire les modifications sur le serveur de base de donnes lors de la transmission des enregistrements, vous devrez apporter des changements pour prendre en charge lutilisation dun ensemble de donnes client. Deux mthodes sont possibles pour convertir une application qui ne conservait pas auparavant les mises jour en mmoire cache : Vous pouvez reproduire le comportement de lensemble de donnes sous Windows en crivant du code pour appliquer chaque enregistrement mis jour au serveur de base de donnes ds quil est transmis. Pour cela, fournissez lensemble de donnes client un gestionnaire dvnement AfterPost qui appliquera la mise jour au serveur de base de donnes :
procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet); begin with DataSet as TClientDataSet do ApplyUpdates(1); end;

Vous pouvez ajuster votre interface utilisateur pour traiter les mises jour en mmoire cache. Cette approche possde certains avantages, comme la rduction du trafic rseau et de la dure des transactions. Toutefois, si vous adoptez lenregistrement des mises jour en mmoire cache, vous devrez dcider du moment o ces mises jour devront tre r-appliques au serveur de base de donnes, et apporter probablement des modifications linterface utilisateur pour laisser les utilisateurs spcifier lapplication des mises jour ou leur indiquer si leurs modifications ont t crites dans la base de donnes. En outre, comme les erreurs de mise jour ne sont pas dtectes quand lutilisateur transmet un enregistrement, vous devrez changer la manire dont vous signalez de telles erreurs lutilisateur, afin quil puisse voir quelle mise jour a caus un problme, ainsi que le type de problme. Si votre application dorigine utilisait la prise en charge fournie par le BDE ou ADO pour conserver les mises jour en mmoire cache, vous aurez besoin dapporter des modifications votre code pour passer lutilisation dun ensemble de donnes client. Le tableau ci-dessous prsente les proprits, les vnements et les mthodes qui prennent en charge les mises jour en mmoire cache sur les ensembles de donnes BDE et ADO, ainsi que les proprits, mthodes et vnements correspondants sur TClientDataSet.

10-32

Guide du dveloppeur

Applications de bases de donnes multiplates-formes

Tableau 10.11 Sur les ensembles de donnes BDE (ou TDatabase)


CachedUpdates

Proprits, mthodes et vnements pour les mises jour en mmoire cache Sur les ensembles de donn es ADO
LockType

Sur TClientDataSet
Non obligatoires, les ensembles de donnes client conservent toujours les mises jour en mmoire cache. Non pris en charge ChangeCount

Objectif
Dtermine si les mises jour en m moire cache sont effectives.

Non pris en charge. UpdatesPending

CursorType

Indique quel point lensemble de donnes est isol des modifications sur le serveur. Indique si la mmoire cache locale contient des enregistrements mis jour qui doivent tre transmis la base de donnes. Indique le type denregistrements mis jour rendre visibles lors de la transmission de mises jour en mmoire cache. Indique si un enregistrement est inchang, modifi, insr ou supprim. Evnement pour traiter les erreurs de mise jour enregistrement par enregistrement. Transmet les enregistrement de la mmoire cache locale la base de donnes.

Non pris en charge

UpdateRecordTypes

FilterGroup

StatusFilter

UpdateStatus

RecordStatus

UpdateStatus

OnUpdateError

Non pris en charge

OnReconcileError

ApplyUpdates (sur un ensemble de donnes ou une base de donnes) CancelUpdates

UpdateBatch

ApplyUpdates

CancelUpdates ou CancelBatch G r s automatiquement Non pris en charge

CancelUpdates

Efface les mises jour en cours dans la mmoire cache sans les transmettre. Rinitialise la mmoire cache de mise jour aprs la transmission russie des mises jour. Copie des enregistrements de bases de donnes dans la m moire cache locale des fins de modification et de mise jour. Annule les mises jour de lenregistrement en cours si elles ne sont pas encore effectues.

CommitUpdates

Reconcile

FetchAll

GetNextPacket (et PacketRecords)

RevertRecord

CancelBatch

RevertRecord

Utilisation de CLX pour le dveloppement multiplate-forme

10-33

Applications Internet multiplates-formes

Applications Internet multiplates-formes


Une application Internet est une application client/serveur qui utilise des protocoles Internet standard pour connecter le client au serveur. Comme vos applications utilisent des protocoles Internet standard pour les communications client/serveur, vous pouvez rendre ces applications multiplates-formes. Par exemple, un programme ct serveur pour une application Internet communique avec le client par lintermdiaire du logiciel serveur Web de la machine. Lapplication serveur est gnralement crite pour Linux ou Windows, mais elle peut aussi tre multiplates-formes. Les clients peuvent se trouver sur nimporte quelle plate-forme. Delphi ou Kylix vous permet de crer des applications de serveur Web sous la forme dapplications CGI ou Apache pour un dploiement sous Linux. Sous Windows, vous pouvez crer dautres types de serveurs Web comme des DLL Microsoft Server (ISAPI), des DLL Netscape Server (NSAPI) et des applications CGI Windows. Les applications strictement CGI et quelques applications utilisant WebBroker seront les seules sexcuter la fois sous Windows et sous Linux.

Portage dapplications Internet vers Linux


Si vous disposez dapplications Internet existantes que vous souhaitez rendre indpendantes des plates-formes, vous devrez choisir de porter votre application de serveur Web ou de crer une application nouvelle sous Linux. Consultez le chapitre 27, Cration dapplications Internet pour des informations sur lcriture de serveurs Web. Si votre application utilise WebBroker, crit dans linterface WebBroker et nutilise pas dappels dAPI natifs, elle ne sera pas aussi difficile porter vers Linux. Si votre application crit dans ISAPI, NSAPI, CGI Windows ou dautres API Web, elle sera plus difficile porter. Vous devrez effectuer des recherches dans vos fichiers source et convertir ces appels dAPI en appels Apache (consultez httpd.pas dans le rpertoire Internet pour des prototypes de fonctions pour les API Apache) ou CGI. Vous devrez galement apporter les autres modifications suggres dans Portage dapplications VCL vers CLX la page 10-3.

10-34

Guide du dveloppeur

11
Chapitre 11

Chapitre

Utilisation des paquets et des composants

Un paquet est une bibliothque lie dynamiquement spciale, utilise par les applications Delphi, lEDI ou les deux. Les paquets dexcution fournissent des fonctionnalits lorsquun utilisateur excute une application. Les paquets de conception sont utiliss pour installer des composants dans lEDI et pour crer des diteurs de proprits particuliers pour des composants personnaliss. Un mme paquet peut fonctionner la fois en conception et en excution, les paquets de conception faisant souvent appel des paquets dexcution. Pour les distinguer des autres DLL, les paquets sont stocks dans des fichiers dont lextension est .bpl (Borland Package Library). Comme les autres bibliothques dexcution, les paquets contiennent du code pouvant tre partag par plusieurs applications. Par exemple, les composants Delphi les plus couramment utiliss se trouvent dans un paquet appel vcl. Chaque fois que vous crez une application, vous pouvez spcifier quelle utilise vcl. Lorsque vous compilez une application cre de cette manire, limage excutable de lapplication ne contient que son propre code et ses propres donnes, le code commun tant dans le paquet dexcution appel vcl60.bpl. Un ordinateur sur lequel sont installes plusieurs applications utilisant des paquets na besoin que dune seule copie de vcl60.bpl, qui est partag par toutes les applications et par lEDI de Delphi mme. Delphi est livr avec plusieurs paquets dexcution prcompils, qui encapsulent les composants VCL et CLX. Delphi utilise galement des paquets de conception pour faciliter la manipulation des composants dans lEDI. Vous pouvez construire des applications avec ou sans paquets. Mais, si vous voulez ajouter lEDI des composants personnaliss, vous devez les installer en tant que paquets de conception.

Utilisation des paquets et des composants

11-1

Pourquoi utiliser des paquets ?

Vous pouvez crer vos propres paquets dexcution afin de les partager entre plusieurs applications. Si vous crivez des composants Delphi, compilez-les dans des paquets de conception avant de les installer.

Pourquoi utiliser des paquets ?


Les paquets de conception simplifient la distribution et linstallation de composants personnaliss. Lutilisation, optionnelle, des paquets dexcution offre plusieurs avantages par rapport la programmation conventionnelle. En compilant dans une bibliothque dexcution du code rutilis, vous pouvez le partager entre plusieurs applications. Par exemple, toutes vos applications, y compris Delphi, peuvent accder aux composants standard par le biais des paquets. Comme les applications nintgrent pas de copies spares de la bibliothque des composants dans leur excutable, ces dernires sont plus petites, ce qui conomise la fois de lespace disque et des ressources systme. De plus, les paquets permettent dacclrer la compilation car seul le code spcifique lapplication est compil chaque gnration.

Les paquets et les DLL standard


Crez un paquet quand vous voulez qu un composant personnalis soit utilisable dans lEDI. Crez une DLL standard quand vous voulez gnrer une bibliothque utilisable par toute application, quel que soit loutil de dveloppement utilis pour la crer. Le tableau suivant donne la liste des types de fichiers associs aux paquets :
Tableau 11.1 Extension du fichier
.dpk dcp

Fichiers paquet compils Contenu


Le fichier source donnant la liste des units contenues dans le paquet. Une image binaire contenant une en-tte de paquet et la concatnation de tous les fichiers dcu du paquet, y compris les informations de symbole ncessaires au compilateur. Un seul fichier dcp est cr pour chaque paquet. Le nom de base pour le dcp est celui du fichier source dpk. Vous devez avoir un fichier .dcp pour construire une application avec des paquets. Une image binaire pour un fichier unit contenu dans un paquet. Lorsque cela est ncessaire, un seul fichier dcu est cr pour chaque fichier unit. Le paquet dexcution. Ce fichier est une DLL avec des caractristiques spcifiques Delphi. Le nom de base du bpl est celui du fichier source dpk.

dcu bpl

Vous pouvez inclure VCL ou CLX, ou les deux types de composants dans un paquet. Les paquets destins tre multiplates-formes ne doivent inclure que des composants CLX.
Remarque

Les paquets partagent leurs donnes globales avec les autres modules dune application.

11-2

Guide du dveloppeur

Paquets dexcution

Pour plus dinformations sur les paquets et les DLL, voir le Guide du langage Pascal Objet.

Paquets dexcution
Les paquets dexcution sont dploys avec les applications Delphi. Ils fournissent des fonctionnalits lorsquun utilisateur excute une application. Pour excuter une application utilisant des paquets, le fichier excutable de lapplication et tous les fichiers paquet (fichiers .bpl) quelle utilise doivent se trouver sur lordinateur. Les fichiers .bpl doivent tre dans le chemin du systme pour quune application puisse les utiliser. Quand vous dployez une application, vrifiez que les utilisateurs possdent la version correcte de chaque bpl ncessaire.

Utilisation des paquets dans une application


Pour utiliser des paquets dans une application :

1 Chargez ou crez un projet dans lEDI. 2 Choisissez Projet|Options. 3 Choisissez la page Paquets. 4 Cochez la case Construire avec les paquets dexcution et saisissez un ou plusieurs noms de paquets dans la bote de saisie place en dessous. Les paquets dexcution associs avec les paquets de conception dj installs apparaissent dj dans la bote de saisie. 5 Pour ajouter un paquet une liste existante, cliquez sur le bouton Ajouter puis entrez le nom du nouveau paquet dans la bote de dialogue Ajout de paquet dexcution. Pour parcourir la liste des paquets disponibles, cliquez sur le bouton Ajouter puis sur le bouton Parcourir plac ct de la bote de saisie Nom de paquet dans la bote de dialogue Ajout de paquet dexcution.
Si vous modifiez la bote de saisie Chemin de recherche dans la bote de dialogue Ajout de paquet dexcution, le chemin daccs global la bibliothque Delphi est modifi. Il nest pas ncessaire dinclure lextension dans le nom de paquet (ni le nombre reprsentant la version de Delphi) ; autrement dit, vcl60.bpl scrit vcl. Si vous tapez les noms directement dans la bote de saisie Paquets dexcution, sparez-les par des points-virgules. Par exemple :
rtl;vcl;vcldb;vclado;vclx;Vclbde;

Les paquets numrs dans la bote de saisie Paquets dexcution sont automatiquement lis lapplication lors de sa compilation. Les paquets en double sont ignors et si la bote de saisie est vide, lapplication est compile sans paquet.

Utilisation des paquets et des composants

11-3

Paquets dexcution

Les paquets dexcution sont slectionns uniquement pour le projet en cours. Pour que les choix en cours deviennent des choix par dfaut pour les futurs projets, cochez la case D faut, en bas de la bote de dialogue.
Remarque

Lorsque vous crez une application avec des paquets, vous devez inclure les noms originels des units Delphi dans la clause uses des fichiers source. Par exemple, le fichier source de la fiche principale pourrait commencer ainsi :
unit MainForm; interface Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

Les units rfrences dans cet exemple sont contenues dans les paquets vcl et rtl. Namoins, vous devez conserver ces rfrences dans la clause uses, mme si vous utilisez vcl et rtl dans votre application, ou vous aurez des erreurs de compilation. Dans les fichiers source gnrs, Delphi ajoute automatiquement ces units la clause uses.

Paquets chargs dynamiquement


Pour charger un paquet lexcution, appelez la fonction LoadPackage. LoadPackage charge le paquet, recherche les units dupliques, appelle les blocs dinitialisation de toutes les units contenues dans le paquet. Par exemple, le code suivant est excut lorsquun fichier est choisi dans la bote de dialogue de slection des fichiers.
with OpenDialog1 do if Execute then with PackageList.Items do AddObject(FileName, Pointer(LoadPackage(FileName)));

Pour dcharger un paquet dynamiquement, appelez UnloadPackage. Soyez prudent en dtruisant toute instance de classe dfinie dans le paquet et en drecensant les classes prcdemment recenses.

Choix des paquets dexcution utiliser


Delphi est livr avec plusieurs paquets dexcution prcompils, dont rtl et vcl, qui fournissent le langage de base et le support des composants. Le paquet vcl contient les composants les plus couramment utiliss, le paquet rtl contient toutes les fonctions systme qui ne sont pas des composants et les lments de linterface Windows. Il ne comprend pas les composants base de donnes ni les autres composants spciaux, qui se trouvent dans des paquets distincts. Pour crer une application de base de donnes client/serveur utilisant des paquets, vous avez besoin dau moins deux paquets dexcution : vcl et vcldb. Si vous voulez galement utiliser dans votre application des composants arborescence (Outline), vous avez besoin en plus de vclx. Pour utiliser ces

11-4

Guide du dveloppeur

Paquets de conception

paquets, choisissez Projet|Options, slectionnez la page Paquets et entrez la liste suivante dans la bote de saisie Paquets dexcution.
rtl;vcl;Vcldb;vclx;

Il nest, en fait, pas ncessaire de prciser vcl et rtl, car elles sont rfrences dans la clause Requires de vcldb (voir Clause Requires la page 11-10). Votre application se compilera de la mme faon que vcl et rtl figurent ou non dans la liste des paquets dexcution.

Paquets personnaliss
Un paquet personnalis est soit une bpl que vous programmez et compilez vousmme, soit un paquet prcompil dvelopp par un fournisseur tiers. Pour utiliser dans une application un paquet dexcution personnalis, choisissez Projet|Options et ajoutez le nom du paquet la bote de saisie Paquets dexcution de la page Paquets. Par exemple, si vous avez cr un paquet effectuant des statistiques, nomm stats.bpl, la bote de saisie Paquets dexcution doit avoir la forme :
rtl;vcl;vcldb;stats

Si vous crez vos propres paquets, vous pouvez les ajouter selon vos besoins la liste.

Paquets de conception
Des paquets de conception sont utiliss pour installer des composants dans la palette des composants de lIDE ou pour crer les diteurs de proprits spciaux de composants personnaliss. Delphi est livr avec de nombreux paquets de conception dj installs dans lEDI. Ils dpendent de la version de Delphi que vous utilisez et de la personnalisation laquelle vous avez pu la soumettre. Vous pouvez voir la liste des paquets installs sur votre systme en choisissant la commande Composant| Installer des paquets. Les paquets de conception fonctionnent en appelant des paquets dexcution rfrencs dans leur clause Requires. Voir Clause Requires la page 11-10. Par exemple, dclstd rfrence vcl. Dclstd contient lui-mme des fonctionnalits supplmentaires qui rendent la plupart des composants standard disponibles dans la palette des composants. Outre les paquets pr-installs, vous pouvez installer dans lEDI vos propres paquets de composants ou ceux dvelopps par des tiers. Le paquet de conception dclusr est fourni en guise de conteneur par dfaut des nouveaux composants.

Utilisation des paquets et des composants

11-5

Paquets de conception

Installation de paquets de composants


Tous les composants installs dans lEDI le sont sous la forme de paquets. Si vous crivez vos propres composants, crez et compilez un paquet les contenant, voir Cration et modification de paquets la page 11-7. Le code source des composants doit respecter le modle dcrit dans la partie V, Cration de composants personnaliss. Pour installer ou dsinstaller vos propres composants ou les composants fournis par un tiers, procdez de la manire suivante :

1 Si vous installez un nouveau paquet, copiez ou dplacez les fichiers paquet dans un rpertoire local. Si le paquet est livr avec des fichiers .bpl, .dcp et .dcu,vous devez tous les copier. Pour davantage dinformations sur ces fichiers, voir Fichiers paquets crs lors dune compilation russie la page 11-13.
Le rpertoire dans lequel sont stocks le fichier .dcp et les fichiers .dcu, sils font partie de la distribution, doit tre dans le chemin de la bibliothque Delphi. Si le paquet est distribu sous forme dun fichier .dpc (collection de paquets), seul cet unique fichier doit tre copi ; le fichier .dpc contient les autres fichiers. Pour plus dinformations sur les fichiers de collection de paquets, voir Fichiers de collection de paquets la page 11-14.)

2 Choisissez Composant|Installer des paquets dans le menu de lEDI ou choisissez Projet|Options et cliquez sur longlet Paquets. 3 Une liste des paquets disponibles apparat sous Paquets de conception.
Pour installer un paquet dans lEDI, cochez la case cocher place ct du nom de paquet. Pour dsinstaller un paquet, dslectionnez la case cocher. Pour voir une liste des composants inclus dans un paquet install, slectionnez le paquet et cliquez sur Composants. Pour ajouter un paquet la liste, cliquez sur le bouton Ajouter puis recherchez dans la bote de dialogue douverture de paquet le rpertoire dans lequel se trouve le fichier .bpl ou .dpc (voir ltape 1). Slectionnez le fichier .bpl ou .dpc et cliquez sur Ouvrir. Si vous slectionnez un fichier .dpc, une nouvelle bote de dialogue apparat pour la gestion de lextraction du fichier .bpl et dautres fichiers de la collection de paquets. Pour retirer un paquet de la liste, slectionnez le paquet, puis cliquez sur Supprimer.

4 Cliquez sur OK.


Les composants du paquet sont installs sur la page de la palette des composants spcifie dans la procdure RegisterComponents des composants, avec les noms dont ils taient affects dans cette mme procdure.

11-6

Guide du dveloppeur

Cration et modification de paquets

Sauf si vous changez les options par dfaut, les nouveaux projets sont crs avec tous les paquets disponibles installs. Si vous voulez que vos choix dinstallation deviennent les options par dfaut pour les nouveaux projets, cochez Dfaut, en bas de la page Paquets de la bote de dialogue Options du projet. Pour supprimer des composants de la palette des composants sans dsinstaller de paquet, slectionnez Composant|Configurer la palette, ou bien Outils| Options denvironnement et cliquez sur longlet Palette. La page Palette contient la liste de tous les composants installs avec le nom de la page o chacun apparat. Slectionnez le composant supprimer de la palette et cliquez sur Cacher.

Cration et modification de paquets


Pour crer un paquet, il faut: Un nom pour le paquet. Une liste des autres paquets requis (lis) par le nouveau paquet. Une liste des fichiers unit devant tre contenus par le paquet lors de sa compilation. Un paquet est avant tout un conteneur pour ses units de code source qui contiennent les fonctionnalits du bpl compil. Cest dans la clause Contains que vous placez les units de code source des composants personnaliss devant tre compils dans un paquet Les fichiers source de paquets, qui se terminent par lextension .dpk, sont gnrs par lditeur de paquets.

Cration dun paquet


Pour crer un paquet, suivez les tapes suivantes. Pour davantage dinformations sur les tapes suivantes, voir Prsentation de la structure dun paquet la page 11-9. Pour crer un paquet, suivez les tapes suivantes. Pour davantage dinformations sur ces tapes, voir Prsentation de la structure dun paquet la page 11-9.
Remarque

Nutilisez pas de IFDEF dans un fichier de paquet (.dpk) comme dans le dveloppement multiplate-forme. Mais, vous pouvez les utiliser dans le code source.

1 Choisissez Fichier|Nouveau, slectionnez licne Paquet et choisissez OK. 2 Le paquet gnr est affich dans lditeur de paquet. 3 Lditeur de paquet affiche pour le nouveau paquet un nud Requires et un nud Contains. 4 Pour ajouter une unit la clause contains, cliquez sur le turbobouton Ajouter au paquet. Dans la page Ajouter unit, tapez un nom de fichier .pas dans la bote de saisie Nom de fichier unit, ou cliquez sur Parcourir... pour

Utilisation des paquets et des composants

11-7

Cration et modification de paquets

rechercher le fichier, puis cliquez sur OK. Lunit slectionne apparat sous le nud Contains de lditeur de paquet. Vous pouvez ajouter des units supplmentaires en rptant cette tape.

5 Pour ajouter un paquet la clause requires, cliquez sur le turbobouton Ajouter au paquet. Dans la page Ncessite, tapez un nom de fichier .dcp dans la bote de saisie Nom de paquet, ou cliquez sur Parcourir... pour rechercher le fichier, puis cliquez sur OK. Le paquet slectionn apparat sous le nud Requires dans lditeur de paquet. Vous pouvez ajouter des paquets supplmentaires en rptant cette tape. 6 Cliquez sur le turbobouton Options, et slectionnez le type de paquet gnrer.
Pour crer un paquet de conception uniquement (un paquet ne pouvant sutiliser lexcution), slectionnez le bouton radio Seulement en conception. (Ou ajoutez la directive de compilation {$DESIGNONLY} au fichier dpk.) Pour crer un paquet dexcution uniquement (un paquet ne pouvant tre install), slectionnez le bouton radio dexcution seule. (Ou ajoutez la directive de compilation {$RUNONLY} au fichier dpk.) Pour crer un paquet utilisable lexcution et la conception, slectionnez les deux boutons radio Conception et Excution.

7 Dans lditeur de paquet, cliquez sur le turbobouton Compiler le paquet pour compiler votre paquet.

Modification dun paquet existant


Il y a plusieurs manires douvrir un paquet existant afin de le modifier : Choisissez Fichier|Ouvrir (ou Fichier|Rouvrir) et slectionnez un fichier dpk. Choisissez Composant|Installer des paquets, slectionnez un paquet dans la liste Paquets de conception et choisissez le bouton Modifier. Quand lditeur de paquet est ouvert, slectionnez un des paquets du nud Requires, cliquez avec le bouton droit de la souris et choisissez Ouvrir. Pour modifier la description dun paquet ou dfinir les options dutilisation, cliquez sur le turbobouton Options dans lditeur de paquet et slectionnez longlet Description. La bote de dialogue Options du projet possde une case cocher Dfaut dans le coin infrieur gauche. Si vous cliquez sur OK quand cette case est coche, les options choisies sont enregistres comme paramtres par dfaut pour les nouveaux projets . Pour restaurer les valeurs par dfaut originales, supprimez ou renommez le fichier defproj.dof.

11-8

Guide du dveloppeur

Cration et modification de paquets

Modification manuelle de fichiers source de paquets


Les fichiers source de paquets, comme les fichiers projet, sont gnrs par Delphi partir des informations que vous lui avez fourni. Comme les fichiers projet, ils peuvent aussi tre modifis manuellement. Un fichier source de paquet devrait tre enregistr avec lextension .dpk (pour Delphi PacKage) afin dviter toute confusion avec les autres fichiers contenant du code source Pascal Objet. Pour ouvrir un fichier source de paquet dans lditeur de code,

1 Ouvrez les paquets dans lditeur de paquets. 2 Cliquez avec le bouton droit de la souris dans lditeur de paquets et slectionnez Voir le source.
Len-tte package spcifie le nom du paquet. La clause requires numre dautres paquets externes utiliss par le paquet en cours. Si un paquet ne contient pas dunit qui utilise des units dun autre paquet, il na pas besoin de clause requires. La clause contains identifie les fichiers unit compiler et rassembler dans le paquet. Toutes les units utilises par des units de la clause contains qui ne se trouvent pas dans les paquets de la clause requires seront aussi rassembles dans le paquet, mme si elle ne sont pas indiques dans la clause (le compilateur indique un avertissement). Par exemple, le code suivant dclare le paquet vcldb (dans le fichier source vcldb60.bpl) :
package vcldb; requires vcldb; contains rtl, vcl, Db, DBActns, DBOleCtl, Dbcgrids, dbCommon, dbConsts, Dbctrls, Dbgrids, Dblogdlg, SQLTimSt, FmtBcd; end.

Prsentation de la structure dun paquet


Les paquets incluent les parties suivantes : Nom de paquet clause Requires clause Contains

Nom de paquets
Les noms de paquets doivent tre uniques dans un projet. Si un paquet a le nom STATS, lditeur de paquet gnre un fichier source correspondant appel STATS.dpk ; le compilateur gnre un excutable et une image binaire appels respectivement STATS.bpl et STATS.dcp. Utilisez STATS pour vous rfrer au paquet dans la clause requires dun autre paquet, ou lors de lutilisation du paquet dans une application.

Utilisation des paquets et des composants

11-9

Cration et modification de paquets

Clause Requires
La clause requires spcifie les autres paquets, externes, utiliss par le paquet en cours. Un paquet externe inclus dans la clause requires est automatiquement li lors de la compilation dans toute application utilisant le paquet en cours ou lune des units contenues dans le paquet externe. Si les fichiers unit contenus dans votre paquet font rfrence dautres units empaquetes, les autres paquets doivent apparatre dans la clause requires de votre paquet, sinon vous devrez les ajouter. Si les autres paquets sont omis de la clause requires, le compilateur les importera dans votre paquet comme units contenues implicitement.
Remarque

La plupart des paquets que vous crez ncessitent rtl. Si vous utilisez des composants VCL, vous devez inclure galement le paquet vcl. Si vous utilisez des composants CLX en programmation multiplate-forme, vous devez inclure VisualCLX.

Pas de rfrence circulaire


Les paquets ne doivent pas contenir de rfrence circulaire dans leur clause requires. Par consquent : Un paquet ne doit pas se rfrencer lui-mme dans sa clause requires. Une chane de rfrences doit se terminer sans rfrencer un paquet de la chane. Si le paquet A requiert le paquet B, alors le paquet B ne doit pas requrir le paquet A ; si le paquet A requiert le paquet B qui requiert le paquet C, alors le paquet C ne doit pas requrir le paquet A.

Gestion des rfrences de paquet dupliques


Les rfrences en double dans la clause requires dun paquet, ou dans la bote de saisie Paquet dexcution, sont ignores. Mais, pour la lisibilit du programme, il vaut mieux les supprimer.

Clause Contains
La clause contains identifie les fichiers unit lier dans le paquet. Si vous crivez votre propre paquet, placez votre code source dans des fichiers pas et incluez-les dans la clause contains.

Eviter lutilisation de code source redondant


Un paquet ne peut apparatre dans la clause contains dun autre paquet. Toutes les units incluses directement dans la clause contains dun paquet, ou indirectement dans lune de ces units sont lies dans le paquet au moment de la compilation. Une unit ne peut tre contenue (directement ou indirectement) dans plusieurs des paquets utiliss par une mme application, y compris lEDI Delphi. Cela signifie que si vous crez un paquet contenant lune des units de vcl, vous ne pourrez pas installer ce paquet dans lEDI. Pour utiliser une unit dj empaquete dans un autre paquet, placez le premier paquet dans la clause requires du second paquet.

11-10

Guide du dveloppeur

Cration et modification de paquets

Compilation de paquets
Vous pouvez compiler un paquet dans lEDI ou depuis la ligne de commande. Pour recompiler un paquet directement dans lEDI :

1 Choisissez Fichier|Ouvrir. 2 Slectionnez le paquet Delphi (*.dpk) partir de la liste droulante Fichiers de type. 3 Slectionnez un fichier .dpk dans la bote de dialogue. 4 Lorsque lditeur de paquet est ouvert, cliquez sur le turbobouton Compiler.
Vous pouvez insrer des directives de compilation dans le code source du paquet. Pour plus dinformations, voir le paragraphe ci-dessous Directives de compilation propres aux paquets. Si vous compilez partir de la ligne de commande, de nouvelles options ddition de lien spcifiques aux paquets sont utilisables. Pour plus dinformations, voir Utilisation du compilateur et du lieur en ligne de commande la page 11-13.

Directives de compilation propres aux paquets


Le tableau suivant liste les directives de compilation propres aux paquets quil est possible dinsrer dans le code source.
Tableau 11.2 Directive
{$IMPLICITBUILD OFF}

Directives de compilation propres aux paquets Fonction


Empche une recompilation implicite du paquet. Utilisezla dans les fichiers .dpk lors de la compilation de paquets qui fournissent des fonctionnalits de bas niveau et qui ne sont pas modifies frquemment ou dont le source nest pas distribu. Dsactive la cration de rfrences de donnes importes. Cette directive augmente lefficacit des accs mmoire, mais empche lunit o elle se trouve de faire rfrence des variables dune autre unit. Les units sont faiblement empaquetes. Voir Paquets faibles la page 11-12 ci-dessous. Empche les units dtre places dans un paquet. Compile le paquet pour une installation dans lEDI. (Mettre dans le fichier .dpk.) Compile le paquet comme excutable seulement. (Mettre dans le fichier .dpk.)

{$G-} ou {IMPORTEDDATA OFF}

{$WEAKPACKAGEUNIT ON} {$DENYPACKAGEUNIT ON} {$DESIGNONLY ON} {$RUNONLY ON}

Remarque

Utilisez {$DENYPACKAGEUNIT ON} dans votre code pour que lunit ne soit pas mise dans un paquet. Lutilisation de {$G-} ou {$IMPORTEDDATA OFF} permet un paquet de ne pas tre utilis dans la mme application avec dautres paquets. Les paquets compils avec la directive {$DESIGNONLY ON} ne devrait pas tre utiliss dans les applications puisque quils contiennent du

Utilisation des paquets et des composants

11-11

Cration et modification de paquets

code ncessaire lEDI. D autres directives de compilation peuvent tre utilises dans le code source de paquet. Voir Directives de compilation dans laide en ligne pour les directives de compilation qui nont pas t abordes ici. Reportez-vous Cration de paquets et de DLL la page 5-10, pour dautres directives pouvant tre utilises dans toutes les bibliothques.

Paquets faibles
La directive $WEAKPACKAGEUNIT affecte la manire dont un fichier .dcu est stock dans les fichiers .dcp et .bpl dun paquet. Pour des informations sur les fichiers gnrs par le compilateur, voir Fichiers paquets crs lors dune compilation russie la page 11-13.) Si {$WEAKPACKAGEUNIT ON} apparat dans un fichier unit, le compilateur omet lunit des bpl si cest possible, et cre une version locale non empaquete de lunit quand elle est ncessaire une autre application ou un autre paquet. Une unit compile avec cette directive est dite faiblement empaquete. Si, par exemple, vous crez un paquet appel PACK ne contenant que lunit UNIT1. Supposez que UNIT1 nutilise aucune autre unit, mais fait des appels RARE.dll. Si vous placez la directive {$WEAKPACKAGEUNIT ON} dans UNIT1.pas, lors de la compilation du paquet, UNIT1 nest pas incluse dans PACK.bpl ; vous navez donc pas distribuer de copie de RARE.dll avec PACK. Nanmoins, UNIT1 sera toujours incluse dans PACK.dcp. Si UNIT1 est rfrence dans un autre paquet ou une autre application utilisant PACK, elle sera copie dans PACK.dcp et directement compile dans le projet. Supposons maintenant que vous ajoutiez PACK une deuxime unit, UNIT2 qui utilise UNIT1. Cette fois, mme si vous compilez PACK avec la directive {$WEAKPACKAGEUNIT ON} dans UNIT1.pas, le compilateur inclut UNIT1 dans PACK.bpl. Par contre les autres paquets ou applications faisant rfrence UNIT1 utiliseront la copie (non empaquete) prise dans PACK.dcp.
Remarque

Les fichiers unit contenant la directive {$WEAKPACKAGEUNIT ON} ne doivent pas contenir de variables globales, de section dinitialisation ou de sections de finalisation. La directive $WEAKPACKAGEUNIT est une caractristique avance propose pour les dveloppeurs distribuant leurs paquets dautres programmeurs Delphi. Cela permet dviter la distribution de DLL rarement utilises ou dliminer des conflits entre des paquets dpendant dune mme bibliothque externe. Ainsi, lunit PenWin de Delphi rfrence PenWin.dll. La plupart des projets nutilisent pas PenWin et la plupart des ordinateurs nont pas de fichier PenWin.dll install. Cest pour cela que lunit PenWin est faiblement empaquete dans vcl. Quand vous compilez un projet utilisant PenWin et le paquet vcl, PenWin est copi depuis VCL60.dcp et li directement votre projet ; lexcutable rsultant est li statiquement PenWin.dll. Si PenWin ntait pas faiblement empaquet, il se poserait deux problmes. Tout dabord, il faudrait que vcl soit li de manire statique PenWin.dll et ne pourrait de ce fait tre charg que sur un systme disposant de PenWin.dll

11-12

Guide du dveloppeur

Cration et modification de paquets

install. De plus, si vous tentez de crer un paquet contenant PenWin, une erreur de compilation aurait lieu, puisque lunit PenWin serait contenue dans vcl et dans votre paquet. Ainsi, sans empaquetage faible, lunit PenWin naurait pas pu tre incluse dans la distribution standard de vcl.

Utilisation du compilateur et du lieur en ligne de commande


Quand vous compilez depuis la ligne de commande, utilisez les options spcifiques aux paquets prsentes dans le tableau suivant.
Tableau 11.3 Option
-$G-

Options du compilateur en ligne de commande propres aux paquets Fonction


Dsactive la cration de rfrences de donnes importes. Lutilisation de cette option augmente lefficacit des accs m moire, mais empche les paquets compils avec cette option de rfrencer des variables appartenant dautres paquets. Spcifie le rpertoire o se trouvera le fichier bpl du paquet. Spcifie le rpertoire o se trouvera le fichier dcp du paquet. Utilise les paquets. Empche la recompilation implicite ultrieure dun paquet. Utilisez cette option lors de la compilation de paquets qui fournissent des fonctionnalits de bas niveau, qui changent peu souvent entre les builds, ou dont le code source ne sera pas distribu.

-LEchemin -LNchemin -LUpaquet -Z

Remarque

Lutilisation de loption -$G- empche un paquet dtre utilis dans une mme application avec dautres paquets. Les autres options en ligne de commande peuvent tre utilises de manire approprie lors de la compilation des paquets. Voir Le compilateur en ligne de commande dans laide en lignepour les options en ligne de commande qui nont pas t abordes ici.

Fichiers paquets crs lors dune compilation russie


Pour crer un paquet, compilez un fichier source ayant lextension .dpk. Le nom de base du fichier .dpk doit correspondre au nom de base des fichiers gnrs par le compilateur ; cest--dire que si le fichier source du paquet sappelle traypak.dpk, le compilateur cre un paquet appel traypak.bpl. Le tableau suivant donne la liste des fichiers gnrs par une compilation russie dun paquet.
Tableau 11.4 Extension de fichier
dcp

Fichiers compils dun paquet Contenu


Une image binaire contenant un en-tte de paquet et la concatnation de tous les fichiers dcu du paquet. Un seul fichier dcp est cr pour chaque paquet. Le nom pour le fichier dcp est celui du fichier source dpk. Une image binaire pour un fichier unit contenu dans un paquet. Lorsque cela est ncessaire, un seul fichier dcu est cr pour chaque fichier unit. Le paquet dexcution. Ce fichier est une DLL avec des caractristiques spcifiques Delphi. Le nom de base du bpl est celui du fichier source dpk.

dcu bpl

Utilisation des paquets et des composants

11-13

Dploiement de paquets

Lors de la compilation, les fichiers bpi, bpl et lib sont gnrs par dfaut dans les rpertoires spcifis dans la page Bibliothque de la bote de dialogue des options denvironnement. Vous pouvez redfinir les options par dfaut en cliquant sur le turbobouton Options de lditeur de paquets afin dafficher la bote de dialogue des options du projet ; faites alors les modifications ncessaires dans la page Rpertoires/Conditions.

Dploiement de paquets
Vous dploierez les paquets de la mme faon que les applications. Pour plus dinformations sur le dploiement en gnral, reportez-vous au chapitre 13, D ploiement des applications.

Dploiement dapplications utilisant des paquets


Pour distribuer une application utilisant des paquets dexcution, vrifiez que lutilisateur dispose du fichier .exe de lapplication, ainsi que de toutes les bibliothques (.bpl ou .dll) appeles par lapplication. Si les fichiers bibliothque sont dans un rpertoire diffrent de celui du fichier .exe, ils doivent tre accessibles via les chemins daccs de lutilisateur. Vous pouvez suivre la convention consistant placer les fichiers des bibliothques dans le rpertoire Windows\System. Si vous utilisez InstallShield Express, le script dinstallation peut vrifier la prsence des paquets ncessaires sur le systme de lutilisateur avant de les rinstaller aveuglment.

Distribution de paquets dautres dveloppeurs


Si vous distribuez des paquets dexcution ou de conception dautres dveloppeurs Delphi, assurez-vous de fournir les fichiers .dcp et .bpl. Vous aurez probablement besoin dinclure aussi les fichiers .dcu.

Fichiers de collection de paquets


Les collections de paquet (fichiers .dpc) offrent un moyen pratique de distribuer des paquets dautres dveloppeurs. Chaque collection de paquets contient un ou plusieurs paquets, comprenant les bpl et les fichiers supplmentaires que vous voulez distribuer avec. Lorsquune collection de paquets est slectionne pour une installation de lEDI, les fichiers qui la constituent sont automatiquement extraits du fichier conteneur .pce ; la bote de dialogue Installation offre la possibilit dinstaller tous les paquets de la collection ou ceux slectionns. Pour crer une collection de paquets,

1 Choisissez Outils|Editeur de collection de paquets pour ouvrir lditeur de collection de paquets.

11-14

Guide du dveloppeur

Dploiement de paquets

2 Cliquez sur le turbobouton Ajouter un paquet, slectionnez un bpl dans la bote de dialogue Slectionner le paquet et choisissez Ouvrir. Pour ajouter dautres bpl la collection, choisissez nouveau le turbobouton Ajouter un paquet. Sur le ct gauche de lditeur de paquets, un diagramme arborescence affiche les bpl que vous avez ajout. Pour supprimer un paquet, slectionnez-le et choisissez le turbobouton Retirer le paquet. 3 Slectionnez le nud Collection en haut du diagramme arborescence. Sur la partie droite de lditeur de collection de paquets, deux champs apparaissent :
Dans la bote de saisie Nom auteur/vendeur, vous pouvez saisir des informations optionnelles propos de votre collection de paquets qui apparatront dans la bote de dialogue Installation lorsque les utilisateurs installeront les paquets. Dans la liste Nom de rpertoire, numrez les rpertoires dans lesquels vous voulez installer les fichiers de la collection de paquets. Utilisez les boutons Ajouter, Edition et Supprimer pour modifier cette liste. Par exemple, supposons que vous voulez copier tous les fichiers de code source dans un mme rpertoire. Dans ce cas, vous pouvez saisir comme Source le nom de rpertoire C:\MyPackage\Source, comme le chemin suggr. La bote de dialogue Installation affichera C:\C:\MyPackage\Source comme chemin suggr pour le rpertoire.

4 En plus des bpl, la collection de paquets peut contenir des fichiers .dcp, .dcu, et des units .pas, de la documentation, et dautres fichiers que lon peut inclure pour la distribution. Les fichiers annexes sont placs dans des groupes de fichiers associs aux paquets spcifiques (bpl). Les fichiers dun groupe ne sont installs que lorsque le bpl associ est install. Pour mettre les fichiers annexes dans la collection de paquets, slectionnez un bpl dans le diagramme arborescence et choisissez le turbobouton Ajouter un groupe de fichiers ; saisissez un nom pour le groupe de fichiers. Ajoutez dautres fichiers si vous le dsirez en procdant de la mme manire. Lorsque vous slectionnez un groupe de fichiers, de nouveaux champs apparaissent sur la droite de lditeur de collection de paquets.
Dans la bote liste Rpertoire dinstallation, slectionnez le rpertoire dans lequel vous voulez installer les fichiers de ce groupe. La liste droulante comprend les rpertoires saisis dans liste de rpertoires de ltape 3 ci-dessus. Vrifiez la case cocher Groupe optionnel si vous voulez que linstallation des fichiers de ce groupe soit facultative. Sous Fichiers inclus, numrez les fichiers que vous voulez inclure dans ce groupe. Utilisez les boutons Ajouter, Supprimer et Auto pour modifier la liste. Le bouton Auto permet de slectionner tous les fichiers avec lextension sp cifie dont la liste se trouve dans la clause contains du paquet ; lditeur de collection de paquets utilise le chemin de la bibliothque de Delphi pour rechercher ces fichiers.

5 Vous pouvez slectionner des rpertoires dinstallation pour les paquets dont la liste se trouve dans la clause requires de nimporte quel paquet de votre

Utilisation des paquets et des composants

11-15

Dploiement de paquets

collection. Lorsque vous slectionnez un bpl dans la liste arborescente, quatre nouveaux champs apparaissent sur la partie droite de lditeur de collection de paquets : Dans la bote liste Fichiers excutables requis, slectionnez le rpertoire dans lequel vous voulez installer les fichiers .bpl pour les paquets dont la liste se trouve dans la clause requires. La liste droulante comprend les rpertoires saisis dans Nom de rpertoire ltape 3 ci-dessus. Lditeur de collection de paquets recherche ces fichiers en utilisant le chemin de la bibliothque Delphi et donne la liste sous Fichiers excutables requis. Dans la bote liste Rpertoire des bibliothques requises, slectionnez le rpertoire dinstallation des fichiers.dcp pour les paquets de la clause requires. La liste droulante comprend les rpertoires spcifis sous Nom rpertoire ltape 3, ci-dessus. Lditeur de collection de paquets recherche ces fichiers en utilisant le chemin de bibliothque global de Delphi, et les affiche sous Fichiers bibliothque requis.

6 Pour enregistrer votre fichier source de collection de paquets, choisissez Fichier|Enregistrer. Les fichiers source de collection de paquets doivent tre enregistrs avec lextension .pce. 7 Pour construire votre collection de paquets, choisissez le turbobouton Compiler. Lditeur de collection de paquets gnre un fichier .dpc avec le nom de votre fichier source (.pce). Si vous navez pas encore enregistr le fichier source, lditeur vous demande un nom de fichier avant la compilation.
Pour diter ou recompiler un fichier .pce existant, slectionnez Fichier|Ouvrir dans lditeur de collection de paquets et localisez le fichier sur lequel vous voulez travailler.

11-16

Guide du dveloppeur

12
Chapitre 12

Chapitre

Cration dapplications internationales

Ce chapitre prsente les rgles dcriture dapplications qui seront distribues sur les marchs internationaux. En planifiant le processus, il est possible de rduire le temps et le code ncessaires pour que vos applications puissent fonctionner parfaitement ltranger comme sur le march domestique.

Internationalisation et localisation
Pour crer une application distribuable sur les marchs trangers, vous devez accomplir deux tapes : Internationalisation Localisation Si votre version de Delphi comprend les Outils de traduction, vous pouvez les utiliser pour grer la localisation. Pour plus dinformations, voir laide en ligne des outils de traduction (ETM.hlp).

Internationalisation
Linternationalisation est le processus permettant votre application de fonctionner selon divers paramtres rgionaux. Les paramtres rgionaux sont lenvironnement de lutilisateur qui inclut les conventions culturelles du pays cible aussi bien que sa langue. Windows gre un grand nombre de paramtres rgionaux, chacun deux dcrits par lassociation dune langue et dun pays.

Cration dapplications internationales

12-1

Internationalisation des applications

Localisation
La localisation est le processus de traduction dune application pour quelle fonctionne pour des paramtres rgionaux spcifiques. Outre la traduction de linterface utilisateur, la localisation peut galement consister personnaliser les fonctionnalits. Par exemple, une application financire peut tre modifie afin de respecter les rgles fiscales dans diffrents pays.

Internationalisation des applications


Vous devez effectuer les tapes suivantes pour crer des applications internationalises : Le code de votre application doit tre capable de grer des jeux de caractres internationaux. Vous devez concevoir linterface utilisateur de lapplication afin de ladapter aux modifications rsultant de la localisation. Vous devez isoler toutes les ressources qui ont besoin dtre localises.

Codage de lapplication
Vous vous assurerez que le code de lapplication peut grer les chanes quelle rencontrera dans les divers environnements rgionaux cible.

Jeux de caractres
Les versions de Windows diffuses aux USA utilisent le jeu de caractres ANSI Latin-1 (1252). Mais dautres ditions de Windows utilisent des jeux de caractres diffrents. Ainsi, la version japonaise de Windows utilise le jeu de caractres Shift-JIS (page de code 932) qui reprsente les caractres japonais avec des codes sur plusieurs octets. Il y a, en gnral, trois types de jeux de caractres : Uni-octet (cod sur un seul octet) Multi-octet (cod sur plusieurs octets) Multi-octet et de longueur fixe Windows et Linux supportent tous les deux les jeux de caractres sur un seul octet et sur plusieurs octets, comme le jeu Unicode. Dans un jeu sur un seul octet, chaque octet dune chane reprsente un caractre. Le jeu de caractres ANSI utilis par de nombreux systmes dexploitation occidentaux utilise un seul octet. Dans un jeu sur plusieurs octets, certains caractres sont reprsents par un octet et dautres par plusieurs octets. Le premier octet dun caractre sur plusieurs octets est appel loctet de poids fort. En gnral, les 128 premiers caractres dun jeu multi-octet correspondent aux caractres ASII sur 7 bits, et tout octet dont la valeur ordinale est suprieure 127 est loctet de poids fort dun

12-2

Guide du dveloppeur

Internationalisation des applications

caractre multi-octet. Seuls les caractres sur un octet peuvent contenir la valeur null (#0). Les jeux de caractres multi-octets en particulier les jeux sur deux octets (DBCS) sont employs pour les langues asatiatiques, tandis que le jeu UTF-8 utilis par Linux est un encodage sur plusieurs octets du jeu Unicode.

Jeux de caractres OEM et ANSI


Il est parfois ncessaire de faire des conversions entre le jeu de caractres Windows (ANSI) et le jeu de caractres spcifi par la page de code de la machine de lutilisateur (appel jeu de caractres OEM).

Jeux de caractres sur plusieurs octets


Les idogrammes utiliss en Asie ne peuvent se satisfaire de la correspondance 1 pour 1 existant entre les caractres dune langue et le type char qui occupe un seul octet (8 bits). Ces langues ont trop de caractres pour quils soient reprsents sur un seul octet comme le fait le type char. En revanche, une chane multi-octet peut contenir un ou plusieurs octets par caractre. AnsiStrings peut contenir un mlange de caractres sur un et plusieurs octets. Loctet de poids fort de tous les codes utilisant plusieurs octets appartient un intervalle rserv et sp cifique du jeu de caractres concern. Le second octet et les octets suivants peuvent tre le code dun autre caractre sil sagit dun caractre cod sur un seul octet, ou il peut appartenir lintervalle rserv indiqu par le premier octet sil sagit dun caractre cod sur plusieurs octets. Aussi, la seule faon de savoir si un octet particulier dune chane reprsente seul un caractre ou fait partie dun groupe doctets est de lire la chane partir de lorigine, en la dcomposant en caractres de deux ou plusieurs octets chaque fois quest rencontr un octet de poids fort appartenant lintervalle rserv. Lors de lcriture de code destin aux pays asiatiques, vous devez traiter toutes les manipulations de chanes avec des fonctions capables de dcomposer les chanes en caractres de plusieurs octets. Delphi fournit de nombreux ses fonctions de la bibliothque dexcution pour effectuer cela. En voici quelques unes :
AdjustLineBreaks AnsiCompareFileName AnsiExtractQuotedStr AnsiLastChar AnsiLowerCase AnsiLowerCaseFileName AnsiPos AnsiQuotedStr AnsiStrComp AnsiStrIComp AnsiStrLastChar AnsiStrLComp AnsiStrLIComp AnsiStrLower AnsiStrPos AnsiStrRScan AnsiStrScan AnsiStrUpper AnsiUpperCase AnsiUpperCaseFileName ByteToCharIndex ByteToCharLen ByteType ChangeFileExt CharToByteIndex CharToByteLen ExtractFileDir ExtractFileExt ExtractFileName ExtractFilePath ExtractRelativePath FileSearch IsDelimiter IsPathDelimiter LastDelimiter StrByteType StringReplace WrapText

Cration dapplications internationales

12-3

Internationalisation des applications

Noubliez pas que la longueur de la chane en octets ne correspond pas ncessairement la longueur de la chane en caractres. Faites attention ne pas tronquer les chanes en coupant en deux un caractre cod sur plusieurs octets. Vous ne pouvez pas passer des caractres comme paramtres aux fonctions ou aux procdures puisque la taille dun caractre nest pas connue directement. Vous devez passer un pointeur sur le caractre ou sur la chane.

Caractres larges
Une autre approche de lutilisation des jeux de caractres pour idogrammes est de convertir tous les caractres dans un systme de caractres larges, comme Unicode. Les caractres et les chanes Unicode sont galement appels caractres larges et chanes de caractres larges. Dans le jeu Unicode, chaque caractre est reprsent par deux octets. Ainis, une chane Unicode est une suite non doctets spars mais de mots de deux octets. Les 256 premiers caractres Unicode correspondent au jeu de caractres ANSI. Le systme dexploitation Windows supporte Unicode (UCS-2). Le systme dexploitation Linux supporte UCS-4, super-ensemble de UCS-2. Delphi/Kylix supporte UCS-2 sur les deux plates-formes. Les caractres larges utilisant deux octets et non un, le jeu de caractres peut reprsenter beaucoup plus de caractres diffrents. En outre, les caractres larges prsentent un avantage sur les caractres MBCS : ils vous permettent de conserver vos habitudes car il existe une relation directe entre le nombre doctets dune chane et son nombre de caractres. Et, vous ne risquez plus de couper un caractre en deux, ni de confondre la seconde moiti dun caractre avec la premire dun autre. Linconvnient majeur des caractres larges est que Windows 9x nen reconnat quun petit nombre dans les appels aux fonctions API. Cest pourquoi, les composants VCL reprsentent toutes les valeurs chanes par des chanes caractres dun seul octet ou par des chanes MBCS. Vous devrez passer du systme caractres larges au systme MBCS chaque fois que dfinir la proprit dune chane ou en lire la valeur exigerait un supplment de code et ralentirait votre application. Cependant, vous pouvez souhaiter traduire en caractres larges certains algorithmes de traitement des chanes pour profiter de la correspondance 1 pour 1 entre caractres et WideChars.

Inclure des fonctionnalits bi-directionnelles dans les applications


Certaines langues ne se lisent pas de gauche droite comme la plupart des langues occidentales, mais elles lisent les mots de droite gauche et comptent de gauche droite. Ces langues sont dites bi-directionnelles (BiDi) du fait de cette sparation. Les langues bi-directionnelles les plus courantes sont lArabe et lHbreu, sans parler dautres langues de lEst. TApplication dispose de deux proprits, BiDiKeyboard et NonBiDiKeyboard, vous permettant de spcifier la disposition clavier. En outre, la VCL gre la localisation bi-directionnelle via les proprits BiDiMode et ParentBiDiMode. Le tableau suivant numre les objets de la VCL possdant ces proprits.

12-4

Guide du dveloppeur

Internationalisation des applications

Tableau 12.1

Objets de la VCL supportant les BiDi Objet de la VCL


TButton TCheckBox TComboBox TEdit TGroupBox TLabel TListBox TMainMenu TMemo TPanel TPopupMenu TRadioButton TRadioGroup TScrollBar

Page de la palette de composants


Standard

Supplment

TActionMainMenuBar TActionToolBar TBitBtn TCheckListBox TColorBox TDrawGrid TLabeledEdit TMaskEdit TScrollBox TSpeedButton TStaticLabel TStaticText TStringGrid TValueListEditor

Win32

TComboBoxEx TDateTimePicker THeaderControl THotKey TListView TMonthCalendar TPageControl TRichEdit TStatusBar TTreeView

Cration dapplications internationales

12-5

Internationalisation des applications

Tableau 12.1

Objets de la VCL supportant les BiDi (suite) Objet de la VCL


TDBCheckBox TDBComboBox TDBEdit TDBGrid TDBListBox TDBLookupComboBox TDBLookupListBox TDBMemo TDBRadioGroup TDBRichEdit TDBText

Page de la palette de composants


Contrles de donnes

QReport

TQRDBText TQRExpr TQRLabel TQRMemo TQRPreview TQRSysData

Autres classes

TApplication (sans ParentBiDiMode) TBoundLabel TControl (sans ParentBiDiMode) TCustomHeaderControl (sans ParentBiDiMode) TForm TFrame THeaderSection THintWindow (sans ParentBiDiMode) TMenu TStatusPanel TTabControl TValueListEditor

Remarque

THintWindow capte la valeur de BiDiMode du contrle qui a activ le conseil.

Proprits bi-directionnelles
Les objets dont la liste est donne dans le tableau 12.1, Objets de la VCL supportant les BiDi, ont les proprits : BiDiMode et ParentBiDiMode. Ces proprits, ainsi que BiDiKeyboard et NonBiDiKeyboard de TApplication grent la localisation bi-directionnelle.
Remarque

Les proprits bi-directionnelles ne sont pas disponibles dans CLX pour la programmation multiplate-forme.

12-6

Guide du dveloppeur

Internationalisation des applications

Proprit BiDiMode
La proprit BiDiMode est un nouveau type dnumr, TBiDiMode, qui possde quatre tats : bdLeftToRight, bdRightToLeft, bdRightToLeftNoAlign et bdRightToLeftReadingOnly.

bdLeftToRight
bdLeftToRight dessine le texte en utilisant le sens de lecture de gauche droite, lalignement et la barre de dfilement tant inchangs. Par exemple, lors de la saisie de texte de droite gauche, comme pour lArabe ou lHbreu, le curseur passe en mode poussoir et le texte est saisi de droite gauche. Pour du texte latin, comme lAnglais ou le Franais, il est saisi de gauche droite. bdLeftToRight est la valeur par dfaut.
Figure 12.1 Contrles initialiss bdLeftToRight

bdRightToLeft
bdRightToLeft dessine le texte en utilisant le sens de lecture de droite gauche, lalignement tant modifi et la barre de dfilement dplace. Le texte est saisi normalement pour les langues allant de droite gauche comme lArabe ou lHbreu. Lorsque le clavier est modifi pour une langue latine, le curseur passe en mode poussoir et le texte est saisi de gauche droite.
Figure 12.2 Contrles initialiss bdRightToLeft

bdRightToLeftNoAlign
bdRightToLeftNoAlign dessine le texte en utilisant le sens de lecture de droite gauche, lalignement tant inchang et la barre de dfilement dplace.
Figure 12.3 Contrles initialiss bdRightToLeftNoAlign

bdRightToLeftReadingOnly
bdRightToLeftReadingOnly dessine le texte en utilisant le sens de lecture de droite gauche, lalignement et la barre de dfilement tant inchangs.
Figure 12.4 Contrles initialiss bdRightToLeftReadingOnly

Cration dapplications internationales

12-7

Internationalisation des applications

Proprit ParentBiDiMode
ParentBiDiMode est une proprit boolenne. Lorsquelle est True (la valeur par dfaut), le contrle regarde la proprit de son parent pour connatre la valeur utiliser pour BiDiMode. Si le contrle est un objet TForm, la fiche utilise la valeur BiDiMode de Application. Si toutes les proprits ParentBiDiMode sont True, lorsque la proprit BiDiMode de Application est modifie, toutes les fiches et tous les contrles du projet sont initialiss avec la nouvelle valeur.

Mthode FlipChildren
La mthode FlipChildren vous permet de faire basculer la position des enfants dun contrle conteneur. Les contrles conteneur sont des contrles qui contiennent dautres contrles, comme TForm, TPanel et TGroupBox. FlipChildren possde un seul paramtre boolen, AllLevels. Lorsqu il est False, seuls les enfants directs du contrle conteneur sont basculs de position. Lorsquil est True, tous les enfants du contrle conteneur sont basculs de position. Delphi fait basculer la position des contrles en modifiant la proprit Left et lalignement du contrle. Si le ct gauche dun contrle est cinq pixels de la limite gauche de son parent, le basculement provoque laffichage du ct droit du contrle de saisie cinq pixels de la limite droite de son parent. Si le contrle de saisie est align gauche, un appel FlipChildren provoquera un alignement droite. Pour basculer la position dun contrle lors de la conception, il faut slectionner Edition|Transposer les enfants et slectionner Tous ou Slectionns suivant que vous voulez basculer la position de tous les contrles ou seulement les enfants du contrle slectionn. Il est aussi possible de basculer la position dun contrle en slectionnant le contrle sur la fiche, en cliquant sur le bouton droit de la souris pour slectionner le choix Transposer les enfants dans le menu contextuel.
Remarque

La slection dun contrle de saisie suivi de la commande Transposer les enfants|Slectionns ne fait rien. Cela est du au fait que les contrles de saisie ne sont pas des conteneurs.

Autres mthodes
Il existe dautres mthodes utiles afin de dvelopper des applications pour des utilisateurs bi-directionnels.
M thode
OkToChangeFieldAlignment DBUseRightToLeftAlignment ChangeBiDiModeAlignment

Description
Utilise avec les contrles base de donnes. Vrifie si lalignement dun contrle peut tre modifi. Utilise pour v rifier lalignement des contrles base de donnes. Modifie le param tre dalignement qui lui est transmis. Aucune vrification nest faite pour linitialisation de BiDiMode, car il y a juste conversion de lalignement gauche vers lalignement droite et vice-versa, en laissant centr les contrles seuls. Renvoie True si une des options allant de droite gauche est slectionne. Renvoie False si le contrle est dans un mode allant de gauche droite.

IsRightToLeft

12-8

Guide du dveloppeur

Internationalisation des applications

M thode
UseRightToLeftReading UseRightToLeftAlignment

Description
Renvoie True si le contrle utilise le sens de lecture allant de droite gauche. Renvoie True si le contrle utilise le sens dalignement allant de droite gauche. Il peut tre surchag pour tre personnalis. Renvoie True si le contrle utilise une barre de dfilement gauche. Renvoie les bons paramtres pour le mode BiDi du contrle. Renvoie les bons paramtres pour le mode BiDi du contrle, en les limitant la lecture. Ajoute le paramtre ExStyle flags appropri au contrle cr.

UseRightToLeftScrollBar DrawTextBiDiModeFlags DrawTextBiDiModeFlagsReadingOnly AddBiDiModeExStyle

Fonctionnalits spcifiques aux cibles locales


Vous pouvez ajouter votre application des fonctionnalits supplmentaires pour des cibles locales spcifiques. En particulier, pour les langues asiatiques, il peut tre ncessaire votre application de contrler lIME (Input Method Editor) utilis pour convertir en chanes de caractres les touches frappes au clavier par lutilisateur. Les composants VCL supportent la programmation de lIME. La plupart des contrles fentrs autorisant directement la saisie de texte possdent une proprit ImeName qui permet de spcifier lIME utiliser lorsque le contrle reoit la saisie. Ces contrles possdent galement une proprit ImeMode qui permet de spcifier en quoi lIME doit convertir ce qui est frapp au clavier. TWinControl introduit plusieurs mthodes protges que vous pouvez utiliser pour contrler lIME depuis les classes que vous avez dfinies. De plus, la variable globale Screen vous fournit des informations concernant les IME disponibles sur le systme de lutilisateur. La variable globale Screen (disponible dans la VCL et dans CLX) fournit galement des informations concernant laffectation des touches utilise sur le systme de lutilisateur. Vous pouvez lutiliser pour obtenir des informations sur les paramtres rgionaux de lenvironnement dans lequel tourne votre application.

Conception de linterface utilisateur


Lorsque vous crez une application pour plusieurs marchs trangers, il est important de concevoir son interface utilisateur afin quelle sadapte aux modifications effectues lors de sa traduction.

Texte
Tout le texte apparaissant dans linterface utilisateur doit tre traduit. Le texte anglais tant presque toujours plus court que les traductions, vous devez concevoir les lments de votre interface utilisateur qui affiche du texte en

Cration dapplications internationales

12-9

Internationalisation des applications

rservant de lespace pour lexpansion de ce texte. Concevez galement les botes de dialogue, les menus, les barres dtat et les autres lments de linterface utilisateur affichant du texte de telle sorte quils puissent facilement afficher des chanes plus longues. Evitez les abrviations qui ne peuvent exister dans les langues utilisant des idogrammes. Les chanes courtes grandissent plus que les phrases longues. Le tableau suivant fournit une approximation des taux de foisonnement selon la longueur de la chane initiale (en anglais) :
Tableau 12.2
1-5 6-12 13-20 21-30 31-50 over 50

Estimation des longueurs de chane Augmentation prvisible


100% 80% 60% 40% 20% 10%

Longueur de la chane anglaise (en caract res)

Images graphiques
Le mieux est dutiliser des images qui ne ncessitent pas de traduction, cest-dire des images qui ne contiennent pas de texte. Si vous devez inclure du texte dans vos images, il est prfrable dutiliser un objet libell avec arrire-plan transparent par dessus limage, plutt que dinclure le texte dans limage ellemme. Voici quelques autres considrations prendre en compte lors de la cration des images graphiques. Essayez dviter les images spcifiques une culture. Par exemple, les botes lettres sont trs diffrentes selon les pays. Les symboles religieux ne conviennent pas aux pays o il existe plusieurs religions dominantes. Mme les couleurs ont des connotations symboliques diffrentes selon les cultures.

Formats et ordre de tri


Les formats de date, formats horaires, numriques et montaires utiliss dans votre application doivent tre localiss selon les paramtres rgionaux. Si vous utilisez uniquement les formats de Windows, vous navez rien traduire puisque Windows les lit dans la base de registres de lutilisateur. Cependant, si vous spcifiez vos propres chanes de format, dclarez-les comme constantes de ressource afin de pouvoir les localiser. Lordre dans lequel les chanes sont classes dpend galement du pays. De nombreuses langues europennes utilisent des caractres accentus et sont classes diffremment selon les paramtres rgionaux. En outre, certaines combinaisons de deux caractres peuvent tre traites par le tri comme un seul caractre. Par exemple, en espagnol, la combinaison ch est trie comme tant un caractre unique compris entre le c et le d. Parfois, un caractre est tri comme sil sagissait de deux caractres spars, par exemple le eszett allemand.

12-10

Guide du dveloppeur

Internationalisation des applications

Correspondances entre claviers


Faites attention aux combinaisons de touches utilises comme raccourcis. Les caractres disponibles sur le clavier amricain ne sont pas tous accessibles facilement sur les autres claviers. Lorsque cela est possible, utilisez les touches numriques et les touches de fonction comme raccourcis, puisquelles sont aisment accessibles sur tous les claviers.

Isolement des ressources


La partie la plus vidente de la localisation dune application consiste traduire les chanes apparaissant dans linterface utilisateur. Pour crer une application pouvant tre traduite sans modifier le moindre code, les chanes de linterface utilisateur doivent tre toutes places dans un seul module. Delphi cre automatiquement un fichier a .dfm (.xfm dans les applications CLX) contenant les ressources des menus, botes de dialogue et des bitmaps. Outre les lments dinterface apparents, vous devez isoler toutes les chanes, comme les messages derreur proposs lutilisateur. Les ressources chane ne sont pas incluses dans le fichier fiche. Vous pouvez les isoler en dclarant des constantes au moyen du mot cl resourcestring. Pour plus dinformations sur les constantes de chane de ressource, voir le guide du langage Pascal Objet. Il vaut mieux inclure toutes les chanes de ressource dans une seule unit spare.

Cration de DLL de ressources


Lisolement des ressources simplifie le processus de traduction. Le niveau suivant disolement des ressources consiste crer un module DLL. Un module .DLL contient toutes les ressources et uniquement les ressources dun programme. Les DLL de ressource permettent de crer un programme grant plusieurs localisations en changeant simplement de DLL de ressource. Utilisez lexpert Ressource DLL pour crer un module de ressource pour une application. Vous devez avoir ouvert un projet compil et enregistr pour utiliser lexpert module de ressource. Cela cre un fichier RC contenant les tables de chane partir des fichiers RC utiliss et des chanes resourcestring du projet, et gnre un projet pour une DLL de ressource qui contient les fiches et le fichier RES cr. Le fichier RES est compil partir du nouveau fichier RC. Vous devez crer un module de ressource pour chaque traduction que vous voulez grer. Chaque module de ressource doit avoir une extension du nom de fichier spcifique la localisation cible. Les deux premiers caractres indiquent la langue cible et le troisime le pays pour la localisation. Si vous utilisez lexpert Ressource DLL, cela est gr pour vous. Sinon, utilisez le code suivant pour obtenir le code local de la traduction cible :
unit locales; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

Cration dapplications internationales

12-11

Internationalisation des applications

type TForm1 = class(TForm) Button1: TButton; LocaleList: TListBox; procedure Button1Click(Sender: TObject); private { dclarations prives } public { dclarations publiques } end; var Form1: TForm1; implementation {$R *.DFM} function GetLocaleData(ID: LCID; Flag: DWORD): string; var BufSize: Integer; begin BufSize := GetLocaleInfo(ID, Flag, nil, 0); SetLength(Result, BufSize); GetLocaleinfo(ID, Flag, PChar(Result), BufSize); SetLength(Result, BufSize - 1); end; { Appel pour chaque localisation supporte. } function LocalesCallback(Name: PChar): Bool; stdcall; var LCID: Integer; begin LCID := StrToInt('$' + Copy(Name, 5, 4)); Form1.LocaleList.Items.Add(GetLocaleData(LCID, LOCALE_SLANGUAGE)); Result := Bool(1); end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin with Languages do begin for I := 0 to Count - 1 do begin ListBox1.Items.Add(Name[I]); end; end; end;

Utilisation des DLL de ressource


Lexcutable, les DLL et les paquets constituant lapplication contiennent toutes les ressources ncessaires. Cependant, pour remplacer ces ressources par leurs versions localises, il suffit simplement de fournir lapplication les DLL de ressource localises portant le mme nom que les fichiers EXE, DLL ou BPL.

12-12

Guide du dveloppeur

Internationalisation des applications

Lorsque votre application dmarre, elle vrifie les paramtres rgionaux du systme. Si elle trouve des DLL de ressource ayant les mmes noms que les fichiers EXE, DLL ou BPL qu elle utilise, elle examine lextension de ces DLL. Si lextension dun module ressource correspond la langue et au pays des paramtres rgionaux du systme, votre application utilise les ressources de ce module plutt que les ressources de lexcutable, de la DLL ou du paquet. Sil ny a pas de module ressource correspondant la fois la langue et au pays, votre application essaie de trouver un module ressource correspondant la langue seule. Sil ny a pas de module ressource correspondant la langue, votre application utilise les ressources compiles avec lexcutable, la DLL ou le paquet. Si vous voulez que votre application utilise un module de ressource diffrent de celui correspondant aux paramtres rgionaux du systme sur lequel elle sexcute, vous pouvez redfinir lentre spcifiant la localisation dans les registres Windows. Sous lentre HKEY_CURRENT_USER\Software\Borland\ Locales, ajoutez le chemin daccs de lapplication et le nom de fichier sous la forme dune chane et dfinissez comme valeur de la donne lextension du DLL de ressource. Au dmarrage, lapplication recherche les DLL de ressource portant cette extension avant de rechercher la localisation du systme. Laffectation de cette entre de registre permet de tester des versions localises de lapplication sans modifier la localisation de votre systme. Par exemple, la procdure suivante peut tre utilise dans le programme dinstallation ou de configuration afin de dfinir la localisation utiliser au moment de charger des applications Delphi :
procedure SetLocalOverrides(FileName: string, LocaleOverride: string); var Reg: TRegistry; begin Reg := TRegistry.Create; try if Reg.OpenKey(Software\Borland\Locales, True) then Reg.WriteString(LocalOverride, FileName); finally Reg.Free; end;

Dans votre application, utilisez la fonction globale FindResourceHInstance pour obtenir le handle du module de ressource en cours. Par exemple :
LoadStr(FindResourceHInstance(HInstance), IDS_AmountDueName, szQuery, SizeOf(szQuery));

Vous pouvez ainsi distribuer une seule application qui sadapte automatiquement la localisation du systme sur laquelle elle sexcute en fournissant simplement les DLL de ressource.

Basculement dynamique de DLL de ressource


En plus de la localisation dune DLL de ressource au dmarrage de lapplication, il est possible de basculer de DLL de ressource dynamiquement lors de lexcution. Pour ajouter cette fonctionnalit vos propres applications, vous

Cration dapplications internationales

12-13

Localisation des applications

devez inclure lunit ReInit dans votre instruction uses. ReInit se trouve dans lexemple Richedit du rpertoire Demos. Pour basculer de langue, vous devez appeler LoadResourceModule, en passant le LCID du nouveau langage, puis appeler ReinitializeForms. Par exemple, le code suivant bascule la langue en Franais :
const FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH; if LoadNewResourceModule(FRENCH) <> 0 then ReinitializeForms;

Lavantage de cette technique est que linstance en cours de lapplication et de toutes ses fiches est utilise. Il nest pas ncessaire de mettre jour les paramtres du registre et de redmarrer lapplication ou de recharger les ressources ncessaires lapplication, comme la connexion aux serveurs base de donnes. Lorsquil y a basculement de la DLL de ressource, les proprits spcifies dans la nouvelle DLL crasent celles des instances en cours dexcution des fiches.
Remarque

Toute modification effectu e dans les proprits dune fiche lors de lexcution est perdue. Une fois que la nouvelle DLL est charge, les valeurs par dfaut ne sont pas initialises. Evitez le code qui rinitialise les objets fiche dans leur tat de dmarrage, mise part les diffrences dues la localisation.

Localisation des applications


Lorsque votre application est internationalise, vous devez crer les versions localises pour les diffrents marchs trangers sur lesquels vous souhaitez la distribuer.

Localisation des ressources


Idalement, vos ressources ont t isoles dans une DLL de ressource qui contient les fichiers fiche (.dfm ou .xfm) et un fichier ressource. Vous pouvez ouvrir vos fiches dans lEDI et traduire les proprits importantes.
Remarque

Dans un projet DLL de ressource, vous ne pouvez pas ajouter ou supprimer de composant. Pourtant, il est possible de modifier les proprits, au risque de gnrer des erreurs dexcution. Veillez donc ne modifier que les proprits qui requirent une traduction. Pour viter les erreurs, vous pouvez configurer linspecteur dobjets pour nafficher que les proprits localisables ; pour ce faire, cliquez avec le bouton droit sur linspecteur dobjets et utilisez le menu Voir pour filtrer les catgories de proprits non souhaites. Vous pouvez ouvrir le fichier RC et traduire des chanes appropries. Utilisez lditeur StringTable en ouvrant le fichier RC partir du gestionnaire de projet.

12-14

Guide du dveloppeur

13
Chapitre 13

Chapitre

Dploiement des applications

Une fois que votre application Delphi est termine et quelle fonctionne, vous pouvez la dployer. Cest--dire que vous la rendez disponible pour que dautres lexcutent. Il est ncessaire deffectuer un certain nombre doprations pour dployer une application sur un autre ordinateur afin que lapplication soit entirement oprationnelle. Les tapes ncessaires pour une application donne varient suivant le type de lapplication. Les sections suivantes dcrivent les points prendre en compte pour dployer les diffrentes applications :
Remarque

Dploiement dapplications gnralistes Dploiement dapplications CLX Dploiement dapplications de bases de donnes Dploiement dapplications Web Programmation pour des environnements htes htrognes Termes du contrat de licence logicielle

Les informations prsentes dans ces sections concernent le dploiement dapplications sous Windows. Si vous crivez des applications multiplates-formes dployer sous Linux, vous devez vous reporter aux informations sur le dploiement de la documentation Kylix.

Dploiement dapplications gnralistes


En dehors du fichier excutable, une application peut ncessiter des fichiers complmentaires, par exemple des DLL, des fichiers paquets ou des applications complmentaires. De plus, lapplication peut ncessiter des entres dans les registres Windows que ce soit pour spcifier lemplacement de fichiers auxiliaires ou le paramtrage de lapplication. Il est possible dautomatiser avec un programme dinstallation, comme InstallShield Express, le processus de copie des fichiers dune application sur un ordinateur, ainsi que le paramtrage des entres

Dploiement des applications

13-1

Dploiement dapplications gnralistes

de registre. Les tapes suivantes sont les principales tapes dun dploiement et concernent quasiment tous les types dapplication : Utilisation des programmes dinstallation Identification des fichiers de lapplication Les applications Delphi qui accdent des bases de donnes ou qui fonctionnent sur le Web ncessitent des tapes complmentaires dinstallation en plus de celles sappliquant aux applications gnrales. Pour davantage dinformations sur linstallation dapplications de bases de donnes, voir Dploiement dapplications de bases de donnes la page 13-7. Pour davantage dinformations sur linstallation dapplications Web, voir D ploiement dapplications Web la page 13-11. Pour davantage dinformations sur linstallation de contrles ActiveX, voir Dploiement dun contrle ActiveX sur le Web la page 38-16.

Utilisation des programmes dinstallation


Les applications Delphi simples, constitues dun seul fichier excutable, sinstallent facilement sur un ordinateur cible. Il suffit de copier le fichier sur lordinateur. Mais les applications plus complexes composes de plusieurs fichiers exigent une procdure dinstallation plus sophistique. De telles applications ncessitent un programme dinstallation spcifique. Les botes outils dinstallation automatisent le processus de cration dun programme dinstallation, le plus souvent sans avoir besoin dcrire une seule ligne de code. Les programmes dinstallation crs avec les botes outils dinstallation effectuent diffrentes tches inhrentes linstallation des applications Delphi, notamment : copier les fichiers excutables et les fichiers annexes sur lordinateur hte, tablir les entres dans le registre Windows et installer le moteur BDE pour les applications de bases de donnes bases sur BDE. InstallShield Express est une bote outils dinstallation fournie avec Delphi. InstallShield Express est spcialement adapt lutilisation de Delphi et du moteur de bases de donnes Borland. Il est bas sur la technologie MSI, linstallateur de Windows. InstallShield Express nest pas install automatiquement lors de linstallation de Delphi, et doit tre install manuellement si vous voulez lutiliser pour crer des programmes dinstallation. Excutez le programme dinstallation du CD Delphi pour installer InstallShield Express. Pour davantage dinformations sur lutilisation de InstallShield Express, voir son aide en ligne. Dautres botes outils dinstallation sont disponibles. Cependant, si vous dployez des applications de bases de donnes, vous ne devez utiliser que celles bases sur la technologie MSI et celles qui sont certifies pour dployer le moteur de bases de donnes Borland (BDE).

13-2

Guide du dveloppeur

Dploiement dapplications gnralistes

Identification des fichiers de lapplication


En plus du fichier excutable, il peut tre ncessaire de distribuer de nombreux autres fichiers avec une application. Fichiers de lapplication Fichiers paquet Modules de fusion Contrles ActiveX

Fichiers de lapplication
Il peut tre ncessaire de distribuer les types suivants de fichiers avec une application :
Tableau 13.1 Type
Fichiers programme Fichiers paquet Fichiers daide Fichiers ActiveX Tables des fichiers locaux

Fichiers de lapplication Extension de nom de fichier


.exe et .dll .bpl et .dcp .hlp, .cnt et .toc (sil est utilis) ou dautres fichiers daide supports par votre application .ocx (parfois supports par une DLL) .dbf, .mdx, .dbt, .ndx, .db, .px, .y*, .x*, .mb, .val, .qbe, .gd*

Fichiers paquet
Si lapplication utilise des paquets dexcution, il faut distribuer les fichiers paquet avec lapplication. InstallShield Express gre linstallation des fichiers paquet de la mme manire que les DLL, copie ces fichiers et cre les entres ncessaires dans les registres Windows. Vous pouvez aussi utiliser des modules de fusion pour dployer des paquets dexcution avec des outils dinstallation bass sur MSI, comme InstallShield Express. Voir la section suivante pour plus de dtails. Borland recommande linstallation des fichiers paquet dexcution dorigine Borland dans le rpertoire Windows\System. Cela sert demplacement commun afin que plusieurs applications puissent accder une seule instance de ces fichiers. Pour les paquets que vous avez crs, il est recommand de les installer dans le rpertoire de lapplication. Seuls les fichiers .BPL doivent tre distribus.
Remarque

Si vous dployez des paquets avec des applications CLX, vous devez inclure clx60.bpl au lieu de vcl60.bpl. Si vous distribuez des paquets dautres dveloppeurs, fournissez les fichiers .BPL et .DCP.

Dploiement des applications

13-3

Dploiement dapplications gnralistes

Modules de fusion
InstallShield Express 3.0 est bas sur la technologie MSI, linstallateur de Windows. Cest pour cette raison que Delphi inclut les modules de fusion. Les modules de fusion fournissent une mthode standard que vous pouvez utiliser pour offrir aux applications du code partag , des fichiers, des ressources, des entres du registre et la logique dinstallation sous forme dun seul fichier compos. Vous pouvez utiliser des modules de fusion pour dployer des paquets dexcution avec des outils dinstallation bass sur MSI, comme InstallShield Express. Les bibliothques dexcution ont certaines interdpendances en raison de la faon dont elles ont t regroupes. Le rsultat est que lorsqu un paquet est ajout un projet dinstallation, loutil dinstallation ajoute automatiquement un ou plusieurs autres paquets ou signale une dpendance sur eux. Par exemple, si vous ajoutez le module de fusion VCLInternet un projet dinstallation, loutil dinstallation va aussi ajouter automatiquement les modules VCLDatabase et StandardVCL ou signaler une dpendance sur ces modules. Les dpendances de chaque module de fusion sont numres dans le tableau suivant. Les divers outils dinstallation peuvent ragir diffremment ces dpendances. InstallShield pour linstallateur Windows ajoute automatiquement les modules requis sil peut les trouver. Les autres outils peuvent se contenter de signaler une dpendance ou peuvent gnrer un chec de construction si les modules requis ne sont pas tous inclus dans le projet.
Tableau 13.2
ADORTL BaseClientDataSet BaseRTL BaseVCL BDEClientDataSet

Modules de fusion et leurs dpendances BPL inclus


adortl60.bpl cds60.bpl rtl60.bpl vcl60.bpl, vclx60.bpl bdecds60.bpl

Module de fusion

Dpendances
DatabaseRTL, BaseRTL DatabaseRTL, BaseRTL, DataSnap, dbExpress Pas de dpendance BaseRTL BaseClientDataSet, DataBaseRTL, BaseRTL, DataSnap, DatabaseVCL, BaseVCL, BDERTL Internet, DatabaseRTL, BaseRTL, BDERTL DatabaseRTL, BaseRTL BaseRTL BaseVCL, DatabaseRTL, BaseRTL DatabaseRTL, BaseRTL DataSnap, DatabaseRTL, BaseRTL DataSnapConnection, DataSnap, DatabaseRTL, BaseRTL, BaseVCL DataSnap, DatabaseRTL, BaseRTL, BaseVCL DatabaseVCL, BaseVCL, BaseRTL DatabaseRTL, BaseRTL

BDEInternet BDERTL DatabaseRTL DatabaseVCL DataSnap DataSnapConnection DataSnapCorba DataSnapEntera DBCompatVCL dbExpress

inetdbbde60.bpl bdertl60.bpl dbrtl60.bpl vcldb60.bpl dsnap60.bpl dsnapcon60.bpl dsnapcrba60.bpl dsnapent60.bpl vcldbx60.bpl dbexpress60.bpl

13-4

Guide du dveloppeur

Dploiement dapplications gnralistes

Tableau 13.2

Modules de fusion et leurs dpendances (suite) BPL inclus


dbxcds60.bpl inetdbxpress60.bpl dss60.bpl nmfast60.bpl vclib60.bpl

Module de fusion
dbExpressClientDataSet DBXInternet DecisionCube FastNet InterbaseVCL

Dpendances
BaseClientDataSet, DataBaseRTL, BaseRTL, DataSnap, dbExpress Internet, DatabaseRTL, BaseRTL, dbExpress, DatabaseVCL, BaseVCL TeeChart, BaseVCL, BaseRTL, DatabaseVCL, DatabaseRTL, BDERTL BaseVCL, BaseRTL BaseClientDataSet, DatabaseRTL, BaseRTL, DataSnap, DatabaseVCL, BaseVCL DatabaseRTL, BaseRTL BaseVCL, BaseRTL DatabaseVCL, BaseVCL, DatabaseRTL, BaseRTL BaseVCL, BaseRTL, BDERTL, DatabaseRTL BaseVCL, BaseRTL BaseVCL, BaseRTL BaseVCL, BaseRTL BaseRTL XMLRTL, Internet, DataSnapConnection, DataSnap, DatabaseRTL, BaseRTL WebDataSnap, XMLRTL, Internet, DataSnapConnection, DataSnap, DatabaseRTL, BaseRTL, BaseVCL Internet, DatabaseRTL, BaseRTL

Internet InternetDirect Office2000Components QuickReport SampleVCL TeeChart VCLIE VisualCLX WebDataSnap WebSnap

inet60.bpl, inetdb60.bpl indy60.bpl dcloffice2k60.bpl qrpt60.bpl vclsmp60.bpl tee60.bpl, teedb60.bpl, teeqr60.bpl, teeui60.bpl vclie60.bpl visualclx60.bpl webdsnap60.bpl websnap60.bpl, vcljpg60.bpl xmlrtl60.bpl

XMLRTL

Contrles ActiveX
Certains composants fournis avec Delphi sont des contrles ActiveX. Le conteneur du composant est li au fichier excutable de lapplication (ou un paquet dexcution), mais le fichier .OCX du composant doit galement tre distribu avec lapplication. Ces composants sont : Chart FX, copyright par SoftwareFX Inc. VisualSpeller Control, copyright par Visual Components, Inc. Formula One (tableur), copyright par Visual Components, Inc. First Impression (VtChart), copyright par Visual Components, Inc. Graph Custom Control, copyright par Bits Per Second Ltd.

Les contrles ActiveX que vous crez doivent galement tre enregistrs sur lordinateur cible avant dtre utiliss. Les programmes dinstallation comme InstallShield Express automatisent le processus denregistrement. Pour enregistrer manuellement un contrle ActiveX, utilisez lapplication exempleTRegSvr ou lutilitaire Microsoft REGSRV32.EXE (qui nest pas inclus dans toutes les versions de Windows).

Dploiement des applications

13-5

Dploiement dapplications CLX

Les fichiers DLL grant un contrle ActiveX doivent galement tre distribus avec une application.

Applications complmentaires
Les applications complmentaires sont des programmes distincts en labsence desquels votre application Delphi fonctionnerait de manire incomplte ou ne fonctionnerait pas du tout. Les applications complmentaires peuvent tre celles fournies avec le systme dexploitation, par Borland ou des produits tiers. Le programme utilitaire Server Manager de InterBase est un exemple de programme complmentaire qui permet de grer les utilisateurs et la scurit des bases de donnes InterBase. Si une application dpend dun programme complmentaire, assurez-vous de le dployer avec votre application, si cest possible. La distribution des programmes complmentaires peut tre limite par des accords de licence de distribution. Consultez la documentation dun programme complmentaire pour des informations spcifiques.

Emplacement des DLL


Vous pouvez installer les fichiers .dll utiliss par une seule application dans le mme rpertoire que lapplication. Les DLL utilises par plusieurs applications doivent tre installes de manire tre partages par ces applications. La convention courante veut quon installe ces fichiers DLL dans les rpertoires Windows ou Windows\System. Une autre mthode consiste crer un rpertoire spcifique pour un groupe de fichiers dll associs comme le fait linstallation du moteur de bases de donnes Borland.

Dploiement dapplications CLX


Si vous crivez des applications multiplates-formes qui seront dployes la fois sur Windows et sur Linux, vous devez compiler et dployer les applications sur les deux plates-formes. Les tapes du dploiement des applications CLX sont les mmes que pour les applications gnralistes. Pour des informations sur le dploiement dapplications gnralistes, voir Dploiement dapplications gnralistes la page 13-1. Pour davantage dinformations sur linstallation dapplications CLX de bases de donnes, voir Dploiement dapplications de bases de donnes la page 13-7.
Remarque

Quand vous dployez des applications CLX sous Windows, vous devez inclure qtintf.dll avec lapplication pour inclure le runtime CLX. Si vous dployez des paquets avec des applications CLX, vous devez inclure clx60.bpl au lieu de vcl60.bpl. Voir chapitre 10, Utilisation de CLX pour le dveloppement multiplate-forme, pour des informations sur lcriture des applications CLX.

13-6

Guide du dveloppeur

Dploiement dapplications de bases de donnes

Dploiement dapplications de bases de donnes


Les applications accdant des bases de donnes prsentent des caractristiques dinstallation propres au-del de la copie du fichier excutable de lapplication sur lordinateur cible. Le plus souvent, laccs aux bases de donnes est gr par un moteur de bases de donnes distinct dont les fichiers ne peuvent tre lis au fichier excutable de lapplication. Les fichiers de donnes, lorsquils nont pas t crs au pralable, doivent tre rendus accessibles lapplication. Les applications de bases de donnes multiniveaux ncessitent une gestion encore plus spcialise de linstallation, car les fichiers constituant lapplication doivent tre installs sur plusieurs ordinateurs. Diffrentes technologies de bases de donnes (ADO, BDE, dbExpress et InterBase Express) sont supportes et les exigences du dploiement diffrent pour chacune. Indpendamment de celle que vous utilisez, vous devez vous assurer que le logiciel client est install sur le systme o vous prvoyez dexcuter lapplication de bases de donnes. BDE, ADO et dbExpress ncessitent galement des pilotes pour interagir avec le logiciel client de la base de donn es. InterBase nexige aucun pilote car les composants IBX communiquent directement avec la base de donnes. Des informations spcifiques sur la faon de dployer les applications de bases de donnes dbExpress, BDE et multiniveaux sont dcrites dans les sections suivantes : Dploiement dapplications de bases de donnes dbExpress Dploiement dapplications BDE Dploiement dapplications de bases de donnes multiniveaux (DataSnap) Les applications de bases de donnes qui utilisent des ensembles de donnes client, comme TClientDataSet ou TSQLClientDataSet, ou des fournisseurs densembles de donnes ncessitent dinclure libmidas.dcu et crtl.dcu (pour la liaison statique quand un excutable autonome est fourni) ; si vous conditionnez votre application (avec lexcutable et les ventuelles DLL requises), vous devez inclure Midas.dll. Si vous dployez des applications de bases de donnes qui utilisent ADO, vous devez vous assurer que MDAC version 2.1 ou ultrieure est install sur le systme o vous prvoyez dexcuter lapplication. MDAC est install automatiquement avec des logiciels comme Windows 2000 et Internet Explorer version 5 ou ultrieure. Vous devez aussi vous assurer que les pilotes pour le serveur de base de donnes auquel vous voulez vous connecter sont installs sur le client. Aucune autre tape de dploiement nest requise. Si vous dployez des applications de bases de donnes qui utilisent InterBase Express, vous devez vous assurer que le client InterBase est install sur le systme o vous prvoyez dexcuter lapplication. InterBase ncessite que gd32.dll et interbase.msg soient situs dans un rpertoire accessible. Aucune autre tape de dploiement nest requise. Les composants InterBase Express communiquant directement avec la base de donnes, aucun pilote

Dploiement des applications

13-7

Dploiement dapplications de bases de donnes

supplmentaire nest requis. Pour plus dinformations, reportez-vous au Embedded Installation Guide situ sur le site web de Borland. Outre les technologies dcrites ici, vous pouvez utiliser des moteurs de bases de donnes fournis par des tiers pour grer laccs aux bases de donnes des applications Delphi. Consultez la documentation ou le vendeur du moteur de bases de donnes pour ce qui concerne les problmes de droit, dinstallation et de configuration du moteur.

Dploiement dapplications de bases de donnes dbExpress


dbExpress est un ensemble de pilotes qui offrent un accs rapide aux informations des bases de donnes. Etant galement disponibles sous Linux, les composants dbExpress autorisent le dveloppement multiplate-forme. Pour plus dinformations sur lutilisation des composants dbExpress, voir chapitre 22, Utilisation densembles de donnes unidirectionnels. Vous pouvez dployer des applications dbExpress sous forme dun fichier excutable autonome ou sous forme dun fichier excutable contenant les DLL des pilotes dbExpress associs. Pour dployer les applications dbExpress sous forme de fichiers excutables autonomes, les fichiers objet dbExpress doivent tre lis de faon statique dans votre excutable. Vous faites cela en incluant les DCU suivantes, situ es dans le rpertoire lib :
Tableau 13.3 Unit de base de donnes
dbExpInt dbExpOra dbExpDb2 dbExpMy Crtl, MidasLib

Dploiement dbExpress sous forme dexcutable autonome Quand linclure


Applications se connectant aux bases de donnes InterBase Applications se connectant aux bases de donnes Oracle Applications se connectant aux bases de donnes DB2 Applications se connectant aux bases de donnes MySQL Requises par les excutables dbExpress qui utilisent des ensembles de donnes client comme TSQLClientDataSet

Si vous ne dployez pas un excutable autonome, vous pouvez dployer avec votre excutable les pilotes dbExpress et les DLL DataSnap associs. Le tableau suivant numre les DLL appropries et indique quand il faut les inclure :
Tableau 13.4 DLL de bases de donnes
dbexpint.dll dbexpora.dll dbexpdb2.dll.

Dploiement dbExpress avec les DLL des pilotes Quand les dployer
Applications se connectant aux bases de donnes InterBase Applications se connectant aux bases de donnes Oracle Applications se connectant aux bases de donnes DB2

13-8

Guide du dveloppeur

Dploiement dapplications de bases de donnes

Tableau 13.4 DLL de bases de donnes


dbexpmy.dll Midas.dll

Dploiement dbExpress avec les DLL des pilotes (suite) Quand les dployer
Applications se connectant aux bases de donnes MySQL Requis par les applications de bases de donnes qui utilisent des ensembles de donnes client

Dploiement dapplications BDE


Le moteur de bases de donnes Borland (BDE) dfinit une API importante pour linteraction avec les bases de donnes. De tous les mcanismes daccs aux donnes, le BDE gre le plus large ventail de fonctions et offre les meilleurs utilitaires. Il reprsente le meilleur support de manipulation des donnes dans les tables Paradox ou dBASE. Laccs aux bases de donnes dans une application se fait par le biais de divers moteurs de bases de donnes. Une application peut utiliser le BDE ou un moteur fourni par un tiers. SQL Links est fourni (mais pas avec toutes les ditions) pour permettre un accs natif aux systmes de bases de donnes SQL. Les sections suivantes dcrivent linstallation des lments daccs aux bases de donnes dune application : Le moteur de bases de donnes Borland SQL Links

Le moteur de bases de donnes Borland


Pour utiliser les composants de donnes standard Delphi ayant un accs aux bases de donnes, le moteur de bases de donnes Borland (BDE) doit tre prsent et disponible. Voir le document BDEDEPLOY pour connatre les droits et restrictions sappliquant la distribution du BDE. Borland recommande lutilisation de InstallShield Express (ou dun autre programme dinstallation certifi) pour linstallation du BDE. InstallShield Express cre les entres de registre ncessaires et dfinit les alias ncessaires lapplication. Il est important dutiliser un programme certifi pour dployer les fichiers BDE car : Une installation incorrecte du BDE ou des sous-ensembles BDE peut empcher le fonctionnement dautres applications utilisant le BDE. Ces applications sont des produits Borland, mais galement des programmes tiers utilisant le BDE. Sous Windows 9x et Windows NT, les informations de configuration BDE sont stockes dans les registres Windows et non pas dans des fichiers .INI, comme ctait le cas avec Windows 16 bits. La cration ou la suppression de ces entres lors de linstallation ou de la dsinstallation est une tche complexe. Il est possible de ninstaller que la partie du BDE ncessaire une application. Si, par exemple, une application nutilise que des tables Paradox, il est seulement ncessaire dinstaller la partie du BDE indispensable laccs aux tables Paradox. Cela rduit lespace disque ncessaire une application. Les programmes

Dploiement des applications

13-9

Dploiement dapplications de bases de donnes

dinstallation certifis, comme InstallShield Express, sont capables deffectuer une installation partielle du BDE. Il faut prendre garde laisser intacts les fichiers systme BDE inutiliss par lapplication installe mais ncessaires dautres programmes dj installs.

SQL Links
SQL Links propose les pilotes permettant de connecter une application au logiciel client dune base de donnes SQL (via le moteur de bases de donnes Borland). Voir le document DEPLOY pour connatre les droits et restrictions sappliquant la distribution de SQL Links. Comme pour le moteur de bases de donnes Borland, SQL Links doit tre dploy en utilisant InstallShield Express (ou tout autre programme certifi).
Remarque

SQL Links connecte le BDE au logiciel client et pas directement la base de donnes SQL mme. Il est donc toujours ncessaire dinstaller le programme client du systme de bases de donnes SQL utilis. Reportez-vous la documentation de votre systme SQL ou consultez le vendeur pour davantage dinformations sur linstallation et la configuration du logiciel client. Le tableau suivant prsente les noms des fichiers de pilote et de configuration utiliss par SQL Links pour se connecter aux diffrents systmes de base de donnes SQL. Ces fichiers sont fournis avec SQL Links et sont redistribuables en accord avec la licence Delphi.
Tableau 13.5 Vendeur
Oracle 7 Oracle8 Sybase Db-Lib Sybase Ct-Lib Microsoft SQL Server Informix 7 Informix 9 DB/2 InterBase

Fichiers des logiciels client des bases de donnes SQL Fichiers redistribuables
SQLORA32.DLL et SQL_ORA.CNF SQLORA8.DLL et SQL_ORA8.CNF SQLSYB32.DLL et SQL_SYB.CNF SQLSSC32.DLL et SQL_SSC.CNF SQLMSS32.DLL et SQL_MSS.CNF SQLINF32.DLL et SQL_INF.CNF SQLINF9.DLL et SQL_INF9.CNF SQLDB232.DLL et SQL_DB2.CNF SQLINT32.DLL et SQL_INT.CNF

Installez SQL Links en utilisant InstallShield Express ou tout autre programme dinstallation certifi. Pour des informations spcifiques concernant linstallation et la configuration de SQL Links, voir le fichier daide SQLLNK32.HLP qui est install, par dfaut, dans le rpertoire principal du BDE.

13-10

Guide du dveloppeur

Dploiement dapplications Web

Dploiement dapplications de bases de donnes multiniveaux (DataSnap)


DataSnap fournit des fonctionnalits de bases de donnes multiniveaux aux applications Delphi en permettant aux applications client de se connecter aux fournisseurs dun serveur dapplications. Installez DataSnap avec une application multiniveau au moyen dInstallShield Express (ou dun autre utilitaire de script dinstallation certifi Borland). Consultez le document DEPLOY (situ dans le rpertoire Delphi principal) pour de plus amples dtails sur les fichiers qui ncessitent dtre redistribus avec une application. Reportez-vous aussi au document REMOTE pour obtenir des informations sur les fichiers DataSnap qui peuvent tre redistribus et de quelle faon.

Dploiement dapplications Web


Certaines applications Delphi sont conues pour tre excutes sur le Web, sous la forme de DLL dextension ct serveur (ISAPI et Apache), dapplications CGI ou de fiches ActiveForm. Les tapes du dploiement dapplications Web sont identiques celles des applications gnralistes cette diffrence que les fichiers de lapplication sont dploys sur le serveur Web. Pour des informations sur linstallation de programmes standard, voir Dploiement dapplications gnralistes la page 13-1. Pour davantage dinformations sur le dploiement dapplications de bases de donnes Web, voir Dploiement dapplications de bases de donnes la page 13-7. Les considrations suivantes sont spcifiques au dploiement dapplications Web : Pour les applications de bases de donnes BDE, le moteur de bases de donnes Borland (ou tout autre moteur de bases de donnes) est install avec les fichiers de lapplication sur le serveur Web. Pour les applications dbExpress, les DLL dbExpress doivent tre incluses dans le chemin daccs. Sil est inclus, le pilote dbExpress doit tre install avec les fichiers de lapplication sur le serveur Web. La scurit pour les rpertoires doit tre dfinie de sorte que lapplication puisse accder tous les fichiers ncessaires de la base de donnes. Le rpertoire contenant une application doit avoir des attributs de lecture et dexcution. Lapplication ne doit pas utiliser de chemins daccs cods en dur pour accder aux bases de donnes et aux autres fichiers. Lemplacement dun contrle ActiveX est indiqu par le paramtre CODEBASE de la balise HTML <OBJECT>. Le dploiement sur Apache est dcrit dans la section suivante.

Dploiement des applications

13-11

Dploiement dapplications Web

Dploiement pour Apache


WebBroker supporte Apache version 1.3.9 et ultrieure pour les DLL et les applications CGI. Apache est configur par fichiers dans le rpertoire conf. Si vous crez des DLL Apache, vous devez vous assurer de dfinir les directives appropries dans le fichier de configuration du serveur Apache, nomm httpd.conf. La DLL doit tre physiquement situe dans le sous-rpertoire Modules du logiciel Apache. Si vous crez des applications CGI, loption ExecCGI du rpertoire physique (spcifi dans la directive Directory du fichier httpd.conf) doit tre dfinie pour permettre lexcution de programmes, afin que le script CGI puisse tre excut. Pour vous assurer que les permissions ont t correctement dfinies, vous devez utiliser la directive ScriptAlias ou bien activer Options ExecCGI. La directive ScriptAlias cre un rpertoire virtuel sur votre serveur et marque le rpertoire de destination comme contenant des scripts CGI. Par exemple, ajoutez la ligne suivante dans votre fichier httpd.conf :
ScriptAlias /cgi-bin c:\inetpub\cgi-bin

Cela permettra de satisfaire les demandes comme as /cgi-bin/mycgi grce lexcution du script c:\inetpub\cgi-bin\mycgi. Vous pouvez aussi dfinir Options par All ou par ExecCGI en utilisant la directive Directory dans httpd.conf. La directive Options contrle les fonctionnalits du serveur qui seront disponibles dans un rpertoire particulier. Les directives Directory sont utilises pour entourer un ensemble de directives qui sappliquent au rpertoire indiqu et ses sous-rpertoires. Voici un exemple de la directive Directory :
<Directory <apache-root-dir>\cgi-bin> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory>

Dans cet exemple, Options est dfinie par ExecCGI ce qui permet lexcution des scripts CGI dans le rpertoire cgi-bin.
Remarque

Apache sexcute en local sur le serveur sous le compte spcifi par la directive User du fichier httpd.conf. Assurez-vous que lutilisateur a bien les droits appropris pour accder aux ressources ncessaires lapplication. Des informations sur le dploiement du logiciel Apache se trouvent dans le fichier LICENSE dApache, livr avec Apache. Vous trouverez aussi des informations de configuration sur le site web dApache, www.apache.org.

13-12

Guide du dveloppeur

Programmation pour des environnements htes htrognes

Programmation pour des environnements htes htrognes


En raison des caractristiques des divers environnements des systmes dexploitation, certains lments peuvent varier selon les prfrences de lutilisateur ou la configuration. Les points suivants peuvent affecter le dploiement dune application sur un autre ordinateur : Rsolution dcran et profondeur de couleurs Fontes Versions des systmes dexploitation Applications complmentaires Emplacement des DLL

Rsolution dcran et profondeur de couleurs


La taille du bureau et le nombre de couleurs disponibles sur un ordinateur sont configurable et dpendent du matriel install. Il est probable que ces caractristiques ne sont pas identiques sur les systmes utiliss pour le dveloppement et ceux sur lesquels lapplication est dploye. Laspect dune application (fentres, objets et taille des fontes) sur des ordinateurs utilisant des rsolutions diffrentes peut tre gr de diffrentes manires : Concevez lapplication avec la plus basse rsolution employe par les utilisateurs (gnralement, 640x480). Il ny a rien faire dans ce cas pour redimensionner les objets dynamiquement afin de les rendre proportionnels la taille daffichage de lcran du systme hte. Visuellement, plus la rsolution est importante et plus les objets apparaissent petits. Effectuez la conception en utilisant la rsolution du systme employ pour effectuer le dveloppement et, lexcution, redimensionnez dynamiquement toutes les fiches et les objets proportionnellement la diffrence de rsolution cran entre le systme de dveloppement et le systme hte (en utilisant un coefficient de variation entre les rsolutions cran). Effectuez la conception en utilisant une rsolution du systme de dveloppement et, lexcution, redimensionnez dynamiquement les fiches de lapplication. Selon la position des contrles visuels dans les fiches, cette option peut ncessiter que les fiches disposent de barres de dfilement pour que lutilisateur puisse accder tous les contrles des fiches.

Si vous nutilisez pas de redimensionnement dynamique


Si les fiches et les contrles visuels constituant une application ne sont pas redimensionns dynamiquement lexcution, concevez les lments de lapplication en utilisant la rsolution la plus basse. Sinon, les fiches dune application excute sur un ordinateur utilisant une rsolution dcran plus faible que celle utilise pour le systme de dveloppement risquent de dborder de lcran.

Dploiement des applications

13-13

Programmation pour des environnements htes htrognes

Si par exemple, le systme de dveloppement est configur avec une rsolution cran de 1024x768 et quune fiche est conue avec une largeur de 700 pixels, une partie de cette fiche ne sera pas visible sur le bureau dun ordinateur configur avec une rsolution de 640x480.

Si vous redimensionnez dynamiquement les fiches et les contrles


Si les fiches et les contrles visuels dune application sont dynamiquement redimensionns, adaptez tous les aspects du processus de redimensionnement pour garantir un aspect optimal de lapplication pour toutes les rsolutions cran possibles. Voici quelques facteurs considrer lorsque vous redimensionnez dynamiquement les lments visuels dune application : Le redimensionnement des fiches et des contrles visuels est effectu en utilisant un ratio calcul en comparant la rsolution cran du systme de dveloppement celle du systme sur lequel lapplication est installe. Utilisez une constante pour reprsenter une dimension de la rsolution cran du systme de dveloppement : la hauteur ou la largeur exprime en pixels. Rcuprez lexcution la mme dimension pour le systme de lutilisateur en utilisant la proprit TScreen.Height ou TScreen.Width . Divisez la valeur pour le systme de dveloppement par la valeur pour le systme de lutilisateur afin den driver le ratio entre les rsolutions cran des deux systmes. Redimensionnez les lments visuels de lapplication (fiches et contrles) en rduisant ou en augmentant la taille des lments et leur position dans les fiches. Ce redimensionnement est proportionnel la diffrence entre les rsolutions cran des systmes du dveloppeur et de lutilisateur. Redimensionnez et repositionnez automatiquement les contrles visuels des fiches en dfinissant la proprit CustomForm.Scaled par True et en appelant la mthode TWinControl.ScaleBy (TWidgetControl.ScaleBy pour les applications multiplates-formes). La mthode ScaleBy ne modifie pas la hauteur ou la largeur de la fiche. Il faut effectuer cette opration manuellement en multipliant les valeurs en cours des proprits Height et Width par le ratio de diffrence des rsolutions cran. Les contrles dune fiche peuvent tre redimensionns manuellement au lieu dutiliser la mthode TWinControl.ScaleBy (TWidgetControl.ScaleBy pour les applications multiplates-formes), en faisant rfrence chaque contrle dans une boucle et en affectant ses dimensions et sa position. La valeur des proprits Height et Width des contrles visuels est multiplie par le ratio de diffrence des rsolutions cran. Repositionnez les contrles visuels en fonction de la rsolution cran en multipliant la valeur des proprits Top et Left par le mme ratio. Si une application a t conue sur un ordinateur configur pour une rsolution cran suprieure celle de lutilisateur, les tailles de fontes seront rduites dans le processus de redimensionnement des contrles visuels. Si la taille de la fonte lors de la conception est petite, la fonte redimensionne lexcution risque dtre trop petite pour tre lisible. Par exemple, supposons que la taille de fonte par dfaut dune fiche est 8. Avec un systme de dveloppement ayant une rsolution cran de 1024x768 et celui de lutilisateur une rsolution 640x480, les contrles visuels seront rduits dun facteur 0,625

13-14

Guide du dveloppeur

Programmation pour des environnements htes htrognes

(640 / 1024 = 0,625). La taille de fonte dorigine de 8 est rduite 5 (8 * 0,625 = 5). Le texte de lapplication apparat irrgulier et illisible quand il saffiche laffiche dans la fonte rduite. Certains contrles visuels comme TLabel et TEdit se redimensionnent dynamiquement quand la taille de la fonte du contrle change. Cela peut affecter les applications dployes quand les fiches et les contrles sont redimensionns dynamiquement. Le redimensionnement du contrle provoqu par la modification de taille de la fonte se cumule la modification de taille due au redimensionnement proportionnel aux rsolutions cran. Cet effet indsirable est neutralis en dfinissant la proprit AutoSize de ces contrles par False. Il faut viter dutiliser des coordonnes en pixel explicites, par exemple pour crire directement dans un canevas. Il faut la place modifier les coordonnes en leur appliquant un ratio proportionnel au ratio de diffrence des rsolutions cran entre le systme de dveloppement et celui dutilisation. Si, par exemple, lapplication dessine un rectangle dans le canevas de dix pixels de haut sur vingt pixels de large, multipliez les valeurs dix et vingt par le ratio de diffrence de rsolution. Ainsi, vous tes certain que le rectangle apparat visuellement de la mme taille pour diffrentes rsolutions cran.

Adaptation des profondeurs de couleurs variables


Pour prendre en compte le fait que tous les ordinateurs sur lesquels lapplication est dploye ne sont pas configurs avec les mmes possibilits de couleurs, la solution la plus simple consiste nutiliser que des graphiques avec le plus petit nombre possible de couleurs. Cela sapplique particulirement aux glyphes des contrles qui doivent utiliser des graphiques en 16 couleurs. Pour laffichage dimages, vous pouvez soit proposer plusieurs copies de limage dans diffrentes rsolutions et niveaux de couleur ou indiquer dans lapplication la rsolution minimale et le nombre de couleurs ncessaires lapplication.

Fontes
Les systmes dexploitation Windows et Linux disposent dun jeu standard de fontes. Quand vous concevez une application devant tre dploye sur dautres ordinateurs, tenez compte du fait que tous les ordinateurs nont pas ncessairement de fontes en-dehors des jeux standard. Les composants texte utiliss dans lapplication ne doivent utiliser que des fontes qui sont trs probablement disponibles sur les ordinateurs cible. Quand lutilisation dune fonte non standard est absolument ncessaire dans une application, vous devez distribuer cette fonte avec lapplication. Soit le programme dinstallation, soit lapplication mme doit installer la fonte sur lordinateur cible. La distribution de fontes cres par des tiers peut tre sujette des restrictions imposes par leurs crateurs. Windows dispose dune protection contre lutilisation dune fonte inexistante sur un systme. Il lui substitue une fonte existante, la plus proche possible. Bien que

Dploiement des applications

13-15

Termes du contrat de licence logicielle

cela empche les erreurs dues des fontes manquantes, le rsultat final peut dgrader laspect visuel de lapplication. Il est prfrable de prvoir cette ventualit la conception. Pour mettre la disposition dune application Windows une fonte non standard, utilisez les fonctions AddFontResource et DeleteFontResource de lAPI Windows. Dployez les fichiers .fot des fontes non-standard avec lapplication.

Versions des systmes dexploitation


Quand vous utilisez des fonctions de lAPI du systme dexploitation ou accdez des zones du systme dexploitation depuis une application, il y a le risque que cette fonction, cette opration ou cette zone ne soit pas disponible sur des ordinateurs utilisant une version du systme diffrente. Pour prendre cette possibilit en compte, vous avez diffrentes possibilits : Spcifiez dans les spcifications logicielles de lapplication les versions du systme sous lesquelles lapplication peut sexcuter. Cest alors lutilisateur de ninstaller et de nutiliser lapplication que dans des versions compatibles du systme dexploitation. Testez la version du systme dexploitation lors de linstallation de lapplication. Si une version incompatible du systme dexploitation est dtecte, arrtez le processus dinstallation ou prvenez lutilisateur du problme. Testez la version du systme dexploitation lexcution, juste avant dexcuter une opration qui nest pas applicable toutes les versions. Si une version incompatible du systme dexploitation est dtecte, abandonnez lopration et informez lutilisateur. Vous pouvez aussi utiliser du code diffrent pour les diffrentes versions du systme dexploitation. Par exemple, certaines oprations sont effectues de faons diffrentes sous Windows 95/98 et sous Windows NT/2000. Utilisez la fonction GetVersionEx de lAPI Windows pour dterminer la version de Windows.

Termes du contrat de licence logicielle


La distribution de certains des fichiers associs aux applications Delphi est sujette des limitations ou est purement et simplement interdite. Les documents suivants dcrivent les stipulations lgales concernant la redistribution de ces fichiers : DEPLOY README Contrat de licence Documentation de produits vendus par un tiers

13-16

Guide du dveloppeur

Termes du contrat de licence logicielle

DEPLOY
DEPLOY aborde certains aspects lgaux de la distribution de divers composants et utilitaires et autres produits pouvant faire partie ou tre associs une application Delphi. DEPLOY est un document install dans le rpertoire principal de Delphi. Il aborde les sujets suivants : fichiers .exe, .dll et .bpl Les composants et les paquets de conception Le moteur de bases de donnes Borland (BDE) contrles ActiveX Les images exemple SQL Links

README
README contient des informations de dernire minute Delphi ; il peut donc contenir des informations pouvant affecter les droits de redistribution des composants, utilitaires ou autres lments. README est un document install dans le rpertoire principal de Delphi.

Contrat de licence
Le contrat de licence Delphi est un document imprim qui traite des droits et obligations lgales concernant Delphi.

Documentation de produits vendus par un tiers


Les droits de redistribution des composants, utilitaires, applications utilitaires, moteurs de bases de donnes ou autres logiciels provenant dun tiers sont rgis par le vendeur fournissant le produit. Consultez la documentation du produit ou le vendeur pour des informations concernant la redistribution du produit avec une application Delphi avant de le distribuer.

Dploiement des applications

13-17

13-18

Guide du dveloppeur

II
Partie II

Partie

Dveloppement dapplications de bases de donnes

Les chapitres de cette partie prsentent les concepts et les connaissances ncessaires la cration dapplications de bases de donnes Delphi.
Remarque

Vous avez besoin de ldition Professionnelle ou Entreprise de Delphi pour dvelopper des applications de bases de donnes. Pour implmenter des bases de donnes Client/Serveur plus volues, vous avez besoin des caractristiques de Delphi disponibles dans ldition Entreprise.

Dveloppement dapplications de bases de donnes

14
Chapitre 14

Chapitre

Conception dapplications de bases de donnes

Les applications de bases de donnes permettent aux utilisateurs dinteragir avec les informations stockes dans les bases de donnes. Les bases de donnes permettent de structurer les informations et de les partager entre plusieurs applications. Delphi permet de grer les applications de bases de donnes relationnelles. Les bases de donnes relationnelles organisent les informations en tables, qui contiennent des lignes (enregistrements) et des colonnes (champs). Ces tables peuvent tre manipules par des oprations simples appeles calculs relationnels. Lorsque vous concevez une application de bases de donn es, vous devez comprendre comment les donnes sont structures. A partir de cette structure, vous pouvez concevoir une interface utilisateur pour afficher les donnes et permettre lutilisateur dentrer de nouvelles informations et de modifier les donnes existantes. Ce chapitre prsente certains aspects courants de la conception dune application de bases de donnes et les dcisions inhrentes la conception dune interface utilisateur.

Utilisation des bases de donnes


Delphi comprend de nombreux composants permettant daccder aux bases de donnes et de reprsenter les informations quelles contiennent. Ils sont regroups en fonction du mcanisme daccs aux donnes : La page BDE de la palette de composants contient les composants qui utilisent le moteur de bases de donnes Borland (BDE, Borland Database Engine). Le BDE dfinit une API importante pour linteraction avec les bases de donnes. De tous les mcanismes daccs aux donnes, le BDE gre le plus large

Conception dapplications de bases de donnes

14-1

Utilisation des bases de donnes

ventail de fonctions et offre les meilleurs utilitaires. Il reprsente le meilleur support de manipulation des donnes dans les tables Paradox ou dBASE. Toutefois, cest le mcanisme le plus compliqu dployer. Pour plus dinformations sur lutilisation des composants BDE, voir chapitre 20, Utilisation du moteur de bases de donnes Borland. La page ADO de la palette de composants contient les composants qui utilisent ActiveX Data Objects (ADO) pour accder aux informations de bases de donnes via OLEDB. ADO est un standard Microsoft. De nombreux pilotes ADO permettent de se connecter diffrents serveurs de bases de donnes. Grce aux composants ADO, vous pouvez intgrer votre application dans un environnement ADO (par exemple, en recourant des serveurs dapplications ADO). Pour plus dinformations sur lutilisation des composants ADO, voir chapitre 21, Utilisation des composants ADO. La page dbExpress de la palette de composants contient les composants qui utilisent dbExpress pour accder aux informations de bases de donnes. dbExpress est un ensemble de pilotes lgers qui offrent laccs le plus rapide aux informations de bases de donnes. En outre, tant galement disponibles sous Linux, les composants dbExpress autorisent le dveloppement multiplateforme. Toutefois, les composants base de donnes dbExpress prennent en charge lventail le plus rduit de fonctions de manipulation de donnes. Pour plus dinformations sur lutilisation des composants dbExpress, voir chapitre 22, Utilisation densembles de donnes unidirectionnels. La page InterBase de la palette de composants contient les composants qui accdent directement aux bases de donnes InterBase, sans passer par une couche moteur distincte. La page AccsBD de la palette de composants contient les composants utilisables avec tout mcanisme daccs aux donnes. Cette page comprend TClientDataset, qui peut utiliser les donnes stockes sur disque ou, par le biais du composant TDataSetProvider de cette mme page, les composants dun des autres groupes. Pour plus dinformations sur lutilisation des ensembles de donnes client, voir chapitre 23, Utilisation densembles de donnes client. Pour plus dinformations sur TDataSetProvider, voir chapitre 24, Utilisation des composants fournisseur.
Remarque

Chaque version de Delphi comprend ses propres pilotes daccs aux serveurs de bases de donnes par le biais de BDE, ADO ou dbExpress. Lorsque vous concevez une application de base de donnes, vous devez choisir lensemble de composants utiliser. Chaque mcanisme daccs aux donnes diffre par lventail des fonctions prises en charge, la facilit de dploiement et la capacit des pilotes grer divers serveurs de bases de donnes. Outre un mcanisme daccs aux donnes, vous devez choisir un serveur de bases de donnes. Il existe diffrents types de bases de donnes et vous devez prendre en considration les avantages et les inconvnients de chaque type avant de choisir un serveur de bases de donnes.

14-2

Guide du dveloppeur

Utilisation des bases de donnes

Bien que tous ces types de bases de donnes contiennent des tables qui stockent des informations, certains prsentent certaines caractristiques telles que : Scurit des bases de donnes Transactions Intgrit rfrentielle, procdures stockes et dclencheurs

Types de bases de donnes


Les serveurs de bases de donnes relationnelles diffrent par la faon dont ils stockent les informations et par celle dont ils permettent plusieurs utilisateurs dy accder simultanment. Delphi prend en charge deux types de serveurs de bases de donnes relationnelles : Les serveurs de bases de donnes distants rsident sur des machines distinctes. Parfois, les donnes dun serveur de bases de donnes distant ne rsident pas sur une seule machine mais sont rparties entre plusieurs serveurs. Bien que les serveurs de bases de donnes distants ne stockent pas les informations de la mme manire, ils fournissent une interface logique commune aux clients, en loccurrence SQL (Structured Query Language). Le fait que vous y accdiez laide de SQL leur vaut parfois dtre appels serveurs SQL (ils sont aussi appels systme de gestion de bases de donnes distant.) Outre les commandes courantes qui composent SQL, la plupart des serveurs de bases de donnes distants grent une variante unique du langage SQL. InterBase, Oracle, Sybase, Informix, Microsoft SQL Server et DB2 sont des exemples de serveurs SQL. Les bases de donnes locales rsident sur votre disque local ou sur un rseau local. Elles disposent dinterfaces de programmation dapplications propritaires pour accder aux donnes. Lorsquelles sont partag es par plusieurs utilisateurs, elles utilisent des mcanismes de verrouillage de fichiers. Cest pourquoi elles sont parfois appeles bases de donnes base de fichiers. Paradox, dBASE, FoxPro et Access sont des exemples de bases de donnes locales. Les applications qui utilisent des bases de donnes locales sont appeles applications niveau unique car lapplication et la base de donnes partagent un systme de fichiers unique. Les applications qui utilisent des serveurs de bases de donnes distants sont appeles applications niveau double ou applications multiniveaux car lapplication et la base de donnes fonctionnent sur des systmes (ou niveaux) indpendants. Le choix du type de base de donnes utiliser dpend de plusieurs facteurs. Par exemple, il se peut que vos donnes soient dj stockes dans une base de donnes existante. Si vous crez les tables de bases de donnes quutilise votre application, les points suivants vous intressent. Combien dutilisateurs partageront ces tables ? Les serveurs de bases de donnes distants sont conus pour permettre plusieurs utilisateurs daccder simultanment aux informations. Ils peuvent prendre en charge plusieurs utilisateurs grce un mcanisme appel transactions. Certaines bases de

Conception dapplications de bases de donnes

14-3

Utilisation des bases de donnes

donnes locales (telles que Local InterBase) offrent galement un support de transaction mais bon nombre ne proposent que des mcanismes de verrouillage de fichiers tandis que certaines ne prsentent aucun support multi-utilisateur (tels que les fichiers densembles de donnes client). Quelle quantit de donnes les tables contiendront-elles ? Les serveurs de bases de donnes distants peuvent contenir davantage de donnes que les bases de donnes locales. Certains serveurs de bases de donnes distants sont conus pour stocker des quantits volumineuses de donnes tandis que dautres rpondent des impratifs diffrents (tels que la rapidit des mises jour). Quel type de performance (vitesse) attendez-vous de la base de donnes ? Les bases de donnes locales sont gnralement plus rapides que les serveurs de bases de donnes distants car elles rsident sur le mme systme. Chaque serveur de base de donnes distant tant conu pour un type dopration particulier, vous pouvez prendre en compte la question de la performance dans le choix du serveur. Quel est le type de support qui sera disponible pour ladministration des bases de donnes ? Les bases de donnes locales ne ncessitent pas autant de support que les serveurs de bases de donnes distants. Gnralement, leur cot de fonctionnement est infrieur car elles ne ncessitent pas de serveurs indpendants ni de licences de site onreuses.

Scurit des bases de donnes


Les bases de donnes contiennent souvent des informations sensibles. Diffrentes bases de donnes offrent des schmas de scurit pour protger ces informations. Certaines bases de donnes, comme Paradox et dBASE, noffrent une protection quau niveau des tables ou des champs. Lorsque les utilisateurs essaient daccder aux tables protges, ils doivent fournir un mot de passe. Une fois identifis, ils ne peuvent visualiser que les champs (colonnes) pour lesquels ils disposent dune permission. La plupart des serveurs SQL requirent un mot de passe et un nom dutilisateur pour tre utiliss. Une fois que lutilisateur est connect la base de donnes, le nom dutilisateur et le mot de passe dterminent les tables quil peut utiliser. Pour plus dinformations sur lattribution de mots de passe pour accder aux serveurs SQL, voir Contrle de la connexion au serveur la page 17-4. Lorsque vous concevez des applications de bases de donnes, vous devez envisager le type dauthentification requis par votre serveur de base de donnes. Les applications sont souvent conues de telle sorte que la connexion de base de donnes explicite soit masque, si bien que les utilisateurs ont uniquement besoin de se connecter aux applications. Si vous ne souhaitez pas que vos utilisateurs aient besoin de fournir un mot de passe, vous devez soit utiliser une base de donnes qui nen requiert pas, soit fournir le mot de passe et le nom dutilisateur au serveur par programmation. Lorsque vous fournissez le mot de passe par programmation, vous devez veiller ce que la scurit ne soit pas viole par lecture du mot de passe partir de lapplication.

14-4

Guide du dveloppeur

Utilisation des bases de donnes

Si vous obligez les utilisateurs fournir un mot de passe, vous devez dterminer quel moment ce dernier est requis. Si vous utilisez une base de donnes locale mais envisagez de passer un serveur SQL plus important, vous pouvez inviter lutilisateur fournir son mot de passe au moment o il se connecte la base de donnes SQL plutt qu louverture des diffrentes tables. Si votre application requiert plusieurs mots de passe pour la connexion plusieurs bases de donnes ou systmes protgs, vous pouvez demander aux utilisateurs de fournir un mot de passe matre unique qui permet daccder une table de mots de passe requis par ces systmes. Lapplication fournit alors les mots de passe par programmation, sans que les utilisateurs aient besoin de fournir plusieurs mots de passe. Dans les applications multiniveaux, vous pouvez utiliser un modle de scurit diffrent. Vous pouvez utiliser HTTPs, CORBA ou COM+ pour contrler laccs aux niveaux intermdiaires et laisser ces derniers grer tous les dtails relatifs laccs aux serveurs de bases de donnes.

Transactions
Une transaction est un groupe dactions qui doivent tre menes avec succs sur une ou plusieurs tables dans une base de donnes avant dtre valides (rendues dfinitives). Si lune des actions du groupe choue, toutes les actions sont abandonnes (annules). Les transactions garantissent ce qui suit : Toutes les mises jour dune mme transaction sont soit valides, soit annules et ramenes leur tat prcdent. Cest ce que nous appelons atomicit . Une transaction est une transformation valide de ltat dun systme, en maintenant les constantes de cet tat. Cest ce que nous appelons cohrence. Les transactions simultanes ne voient pas les rsultats partiels et non valids les unes des autres afin de ne pas crer dincohrences dans ltat de lapplication. Cest ce que nous appelons isolation. Les mises jour valides des enregistrements survivent aux pannes, y compris les pannes de communication, les pannes de processus et les pannes systme des serveurs. Cest ce que nous appelons durabilit. Les transactions protgent ainsi contre les dfaillances matrielles qui se produisent au milieu dune commande de base de donnes ou dun ensemble de commandes. Louverture dune transaction vous permet de bnficier dun tat durable aprs les pannes survenues sur les supports disque. Les transactions constituent aussi la base du contrle simultan de plusieurs utilisateurs sur les serveurs SQL. Lorsque tous les utilisateurs interagissent avec la base de donnes par le biais de transactions, les commandes dun utilisateur ne peuvent pas altrer lunit dune transaction dun autre utilisateur ; le serveur SQL planifie les transactions entrantes, qui russissent ou chouent en bloc.

Conception dapplications de bases de donnes

14-5

Architecture des bases de donnes

Bien que le support des transactions ne fasse pas partie de la plupart des bases de donnes locales, il est fourni par InterBase local. En outre, les pilotes du moteur de bases de donnes Borland offrent pour certaines un support des transactions limit. Le support des transactions de bases de donnes est fourni par le composant qui reprsente la connexion la base de donnes. Pour plus de dtails sur la gestion des transactions laide dun composant connexion de base de donnes, voir Gestion des transactions la page 17-6. Dans les applications multiniveaux, vous pouvez crer des transactions qui comprennent des actions autres que des oprations de bases de donnes ou qui englobent plusieurs bases de donnes. Pour plus de dtails sur lutilisation des transactions dans les applications multiniveaux, voir Gestion des transactions dans les applications multiniveaux la page 25-21.

Intgrit rfrentielle, procdures stockes et dclencheurs


Toutes les bases de donnes relationnelles prsentent certaines caractristiques communes qui permettent aux applications de stocker et de manipuler les donnes. En outre, les bases de donnes offrent souvent des fonctionnalits qui leur sont propres et qui savrent utiles pour garantir la cohrence des relations entre les tables dune base de donnes. Cest--dire : Intgrit rfrentielle. Lintgrit rfrentielle offre un mcanisme permettant dviter la cassure des relations matre/dtail entre les tables. Lorsque lutilisateur essaie de supprimer un champ de la table matre, pouvant aboutir la cration denregistrements dtail orphelins, les rgles de lintgrit rfrentielle vitent la suppression ou suppriment automatiquement les enregistrements dtail orphelins. Procdures stockes. Les procdures stockes sont des jeux dinstructions SQL nomms et enregistrs sur un serveur SQL. Les procdures stockes ralisent gnralement des tches de bases de donnes courantes sur le serveur et renvoient parfois des ensembles denregistrements (ensembles de donnes). Dclencheurs. Les dclencheurs sont des ensembles dinstructions SQL automatiquement cres en rponse une commande.

Architecture des bases de donnes


Les applications de bases de donnes sont construites partir dlments dinterface utilisateur, de composants qui reprsentent les informations de bases de donnes (ensembles de donnes) et de composants qui connectent ceux-ci les uns aux autres et la source des informations de bases de donnes. Larchitecture de votre application de base de donnes reprsente lorganisation de tous ces lments.

14-6

Guide du dveloppeur

Architecture des bases de donnes

Structure gnrale
Bien quil existe de nombreuses faons dorganiser les composants dune application de base de donnes, la plupart dentre elles suivent le schma gnral illustr par la figure suivante :
Figure 14.1 Architecture de base de donnes g nrique

Fiche interface utilisateur


Il est conseill disoler linterface utilisateur sur une fiche compltement indpendante du reste de lapplication. Cela prsente plusieurs avantages. Lisolation de linterface utilisateur des composants qui reprsentent les informations de bases de donnes vous apporte une plus grande flexibilit conceptuelle : les modifications que vous apportez la gestion des informations de bases de donnes nimposent pas la rcriture de linterface utilisateur, tandis que celles que vous apportez linterface utilisateur ne vous obligent pas modifier la partie de lapplication qui utilise la base de donnes. En outre, ce type disolation vous permet de dvelopper des fiches communes diverses applications, ce qui garantit la cohrence de linterface utilisateur. De plus, si le rfrentiel dobjets contient des liens vers des fiches convenablement conues, vous -mme et les autres dveloppeurs disposez dune base de travail et ntes pas obligs de commencer chaque nouveau projet partir daucun lment. Enfin, le partage des fiches vous permet de dvelopper des standards dentreprise pour les interfaces des applications. Pour plus dinformations sur la cration de linterface utilisateur dune application de base de donnes, voir Conception de linterface utilisateur la page 14-17.

Module de donnes
Si vous avez isol votre interface utilisateur dans sa propre fiche, vous pouvez utiliser un module de donnes afin dy placer les composants qui reprsentent les informations de bases de donnes (ensembles de donnes), et les composants qui connectent ces ensembles de donnes aux autres lments de votre application. Comme les fiches de linterface utilisateur, les modules de donnes peuvent figurer dans le rfrentiel dobjets en vue dtre rutiliss ou partags par les applications.

Source de donnes
Le premier lment du module de donnes est une source de donnes. La source de donnes relie linterface utilisateur un ensemble de donnes qui reprsente les informations dune base de donnes. Plusieurs contrles orients donnes disposs sur une fiche peuvent partager une mme source de donnes. Dans ce

Conception dapplications de bases de donnes

14-7

Architecture des bases de donnes

cas, le contenu de chaque contrle est synchronis : lorsque lutilisateur parcourt les enregistrements, les valeurs figurant dans les diffrents champs de lenregistrement actif sont affiches dans les contrles correspondants.

Ensemble de donnes
Lensemble de donnes constitue le cur de votre application de base de donnes. Ce composant reprsente un ensemble denregistrements de la base de donnes sous-jacente. Ces enregistrements peuvent tre les donnes dune seule table de base de donnes, un sous-ensemble des champs ou des enregistrements dune table ou des informations manant de plusieurs tables jointes en une vue unique. Lutilisation densembles de donnes protge la logique de votre application de la restructuration des tables physiques de la base de donnes. Lorsque la base de donnes sous-jacente change, vous pouvez tre amen modifier la faon dont le composant ensemble de donnes spcifie les donnes quil contient, mais le reste de votre application peut continuer fonctionner sans subir de modifications. Pour plus dinformations sur les proprits et mthodes courantes des ensembles de donnes, voir chapitre 18, Prsentation des ensembles de donnes.

Connexion des donnes


Diffrents types densembles de donnes utilisent diffrents mcanismes de connexion aux informations de la base de donnes sous-jacente. Ces diffrents mcanismes dterminent les variantes majeures de larchitecture des applications de bases de donnes que vous crez. Il existe essentiellement quatre mcanismes de connexion aux donnes : Connexion directe un serveur de bases de donnes. La plupart des ensembles de donnes utilisent un descendant de TCustomConnection pour reprsenter la connexion un serveur de bases de donnes. Utilisation dun fichier ddi sur disque. Les ensembles de donnes client permettent dutiliser un fichier ddi sur disque. Aucun composant connexion spar nest requis lors de lutilisation dun fichier ddi car lensemble de donnes client est en mesure de lire et dcrire dans le fichier. Connexion un autre ensemble de donnes. Les ensembles de donnes client peuvent utiliser les donnes fournies par un autre ensemble de donnes. Un composant TDataSetProvider fait office dintermdiaire entre lensemble de donnes client et son ensemble de donnes source. Ce fournisseur densemble de donnes peut rsider dans le mme module de donnes que lensemble de donnes client ou faire partie dun serveur dapplication excut sur une autre machine. Si le fournisseur fait partie dun serveur dapplication, vous devez utiliser un descendant spcial de TCustomConnection pour reprsenter la connexion au serveur. Obtention des donnes partir dun objet DataSpace RDS. Les ensembles de donnes ADO peuvent utiliser un composant TRDSConnection pour rassembler les donnes des applications de bases de donnes multiniveaux labores laide de serveurs dapplications ADO. Parfois, ces mcanismes peuvent tre combins en une mme application.

14-8

Guide du dveloppeur

Architecture des bases de donnes

Connexion directe un serveur de bases de donnes


Larchitecture de base de donnes la plus courante est celle dans laquelle lensemble de donnes utilise un composant connexion pour tablir une connexion serveur de bases de donnes. Lensemble de donnes peut alors directement lire les donnes du serveur et y envoyer les modifications. Cette architecture est illustre par la figure suivante :
Figure 14.2 Connexion directe au serveur de bases de donnes

Chaque type densemble de donnes utilise son propre type de composant connexion, qui reprsente un mcanisme daccs aux donnes unique : Si lensemble de donnes est un ensemble de donnes BDE tel que TTable, TQuery ou TStoredProc, le composant connexion est un objet TDataBase. Vous connectez lensemble de donnes au composant base de donnes en dfinissant sa proprit Database. Vous navez pas besoin dajouter explicitement un composant base de donnes lorsque vous utilisez un ensemble de donnes BDE. Si vous dfinissez la proprit DatabaseName de lensemble de donnes, un composant base de donnes est automatiquement cr lexcution. Si lensemble de donnes est un ensemble de donnes ADO tel que TADODataSet , TADOTable, TADOQuery ou TADOStoredProc, le composant connexion est un objet TADOConnection. Vous connectez lensemble de donnes au composant connexion ADO en dfinissant sa proprit ADOConnection. Comme pour les ensembles de donnes BDE, vous navez pas besoin dajouter explicitement le composant connexion : par contre, vous pouvez dfinir la proprit ConnectionString de lensemble de donnes.

Conception dapplications de bases de donnes

14-9

Architecture des bases de donnes

Si lensemble de donnes est un ensemble de donnes dbExpress tel que TSQLDataSet, TSQLTable, TSQLQuery ou TSQLStoredProc, le composant connexion est un objet TSQLConnection. Vous connectez lensemble de donnes au composant connexion SQL en dfinissant sa proprit SQLConnection. Lorsque vous utilisez des ensembles de donnes dbExpress, vous devez explicitement ajouter le composant connexion. En outre, les ensembles de donnes dbExpress prsentent la particularit dtre toujours unidirectionnels et accessibles en lecture seule : cela signifie que vous pouvez uniquement parcourir les enregistrements dans lordre et que vous ne pouvez pas utiliser les mthodes ddition des ensembles de donnes. Si lensemble de donnes est un ensemble de donnes InterBase Express tel que TIBDataSet, TIBTable, TIBQuery ou TIBStoredProc, le composant connexion est un objet TIBDatabase. Vous connectez lensemble de donnes au composant base de donnes InterBase en dfinissant sa proprit Database. Comme dans le cas des ensembles de donnes dbExpress, vous devez explicitement ajouter le composant connexion. Outre les composants prcdemment cits, vous pouvez utiliser un ensemble de donnes client spcialis tel que TBDEClientDataSet, TSQLClientDataSet ou TIBClientDataSet avec un composant connexion de base de donnes. Lorsque vous utilisez lun de ces ensembles de donnes client, spcifiez le type appropri de composant connexion comme valeur de la proprit DBConnection . Bien que chaque type densemble de donnes utilise un composant connexion diffrent, ils effectuent tous la plupart des mmes tches et mettent disposition la plupart des mmes proprits, mthodes et vnements. Pour plus dinformations sur les points communs des diffrents composants connexion de base de donnes, voir chapitre 17, Connexion aux bases de donnes. Cette architecture reprsente une application niveau unique ou une application niveau double, selon que le serveur de base de donn es est une base de donnes locale ou un serveur de base de donnes distant. La logique qui manipule les informations de bases de donnes figure dans lapplication qui implmente linterface utilisateur, tout en tant confine dans un module de donnes.
Remarque

Toutes les versions de Delphi ne proposent pas les pilotes ou composants connexion requis pour crer des applications niveau double.

Utilisation dun fichier ddi sur disque


Dans sa forme la plus simple, une application de base de donnes que vous crivez ne recourt aucun serveur de bases de donnes. Par contre, elle utilise MyBase, exploite la possibilit quont les ensembles de donnes client de senregistrer eux-mmes dans un fichier puis den extraire les donnes.

14-10

Guide du dveloppeur

Architecture des bases de donnes

Cette architecture est illustre par la figure suivante :


Figure 14.3 Application de base de donnes base de fichiers

Lorsque vous utilisez cette approche base de fichiers, votre application crit les modifications sur disque laide de la mthode SaveToFile de lensemble de donnes client. SaveToFile accepte un paramtre, le nom du fichier qui est cr (ou cras) et qui contient la table. Lorsque vous souhaitez lire une table prcdemment crite laide de la mthode SaveToFile, utilisez la mthode LoadFromFile. LoadFromFile accepte aussi un paramtre, le nom du fichier contenant la table. Si vous chargez les donnes toujours partir du mme fichier et les y enregistrez toujours, vous pouvez utiliser la proprit FileName au lieu des mthodes SaveToFile et LoadFromFile. Lorsque FileName a pour valeur un nom de fichier valide, les donnes sont automatiquement charges partir du fichier louverture de lensemble de donnes client et enregistres dans le fichier la fermeture de lensemble de donnes client. Cette architecture simple de type fichier est une application niveau unique. La logique qui manipule les informations de bases de donnes figure dans lapplication qui implmente linterface utilisateur, tout en tant confine dans un module de donnes. Lapproche de type fichier prsente lavantage de la simplicit. Aucun serveur de bases de donnes ne doit tre install, configur ou dploy (si vous neffectuez pas de liaison statique dans midaslib.dcu, lensemble de donnes client requiert midas.dll). Aucune licence de site ni administration de base de donn es nest ncessaire. En outre, certaines versions de Delphi vous permettent de raliser des conversions entre des documents XML arbitraires et les paquets de donnes utiliss par un ensemble de donnes client. Par consquent, lapproche base de fichiers permet dutiliser des documents XML ainsi que des ensembles de donnes ddis. Pour plus dinformations sur la conversion entre des documents XML et des paquets de donnes densemble de donnes client, voir chapitre 26, Utilisation de XML dans les applications de bases de donnes. Lapproche base de fichiers ne gre pas les situations multi-utilisateurs. Lensemble de donnes doit tre totalement ddi lapplication. Les donnes sont enregistres dans des fichiers sur disque puis charg es ultrieurement, mais aucune protection intgre nempche un utilisateur dcraser les fichiers de donnes dun autre utilisateur.

Conception dapplications de bases de donnes

14-11

Architecture des bases de donnes

Pour plus dinformations sur lutilisation dun ensemble de donnes client dont les donnes sont stockes sur disque, voir Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers la page 23-39.

Connexion un autre ensemble de donnes


Certains ensembles de donnes client spcialiss utilisent le BDE ou dbExpress pour se connecter un serveur de bases de donnes. Ces ensembles de donnes client spcialiss sont, de fait, des composants composites qui utilisent de manire interne un autre ensemble de donnes pour accder aux donnes et un composant fournisseur pour empaqueter les donnes de lensemble de donnes source et appliquer les mises jour au serveur de bases de donnes. Ces composants composites requirent des ressources systme supplmentaires mais prsentent certains avantages : Les ensembles de donnes client offrent le support le plus robuste pour la manipulation des mises jour places en mmoire cache. Par dfaut, les autres types densembles de donnes envoient directement les modifications au serveur de bases de donnes. Vous pouvez rduire le trafic rseau en utilisant un ensemble de donnes qui place les mises jour en mmoire cache localement puis les applique toutes en une seule transaction. Pour plus dinformations sur les avantages de lutilisation densembles de donnes client pour placer les mises jour en mmoire cache, voir Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18. Les ensembles de donnes client peuvent appliquer les modifications directement au serveur de bases de donnes lorsque lensemble de donnes est accessible en lecture seule. Lorsque vous utilisez dbExpress, outre que cest le seul moyen de parcourir librement les donnes, cest la seule faon de modifier les donnes dans lensemble de donnes. Mme lorsque vous nutilisez pas dbExpress, le rsultat de certaines requtes et de toutes les procdures stockes est accessible en lecture seule. Lutilisation dun ensemble de donnes client offre un procd standard pour rendre ces donnes modifiables. Un ensemble de donnes client pouvant directement utiliser des fichiers ddis sur disque, son utilisation peut tre combine avec un modle base de fichiers afin doffrir une application briefcase souple. Pour plus dinformations sur le modle briefcase, voir Combinaison des approches la page 14-16. Outre ces ensembles de donnes client spcialiss, il existe un ensemble de donnes client gnrique ( TClientDataSet), qui ne comprend pas de fournisseur densemble de donnes ni densemble de donnes interne. Bien que TClientDataSet ne possde pas de mcanisme interne daccs aux bases de donnes, vous pouvez le connecter un autre ensemble de donnes externe partir duquel il peut lire les donnes et vers lequel il peut envoyer les mises jour.

14-12

Guide du dveloppeur

Architecture des bases de donnes

Malgr son caractre quelque peu complexe, cette approche savre parfois opportune : Lensemble de donnes source et le fournisseur densemble de donnes tant externes, vous pouvez plus facilement contrler la faon dont ils lisent les donnes et appliquent les mises jour. Par exemple, le composant fournisseur met disposition une srie dvnements qui ne sont pas disponibles lorsque vous utilisez un ensemble de donnes client spcialis pour accder aux donnes. Lorsque lensemble de donnes source est externe, vous pouvez le lier un autre ensemble de donnes dans une relation matre/dtail. Un fournisseur externe convertit automatiquement cette organisation en un seul ensemble de donnes comprenant des dtails imbriqus. Lorsque lensemble de donnes source est interne, vous ne pouvez pas crer densembles dtail imbriqus de cette faon. La connexion dun ensemble de donnes client un ensemble de donnes externe est une architecture qui peut facilement voluer vers une architecture multiniveau. Etant donn que le processus de dveloppement est dautant plus coteux et consommateur dnergie que le nombre de niveaux augmente, vous pouvez commencer dvelopper votre application en tant quapplication niveau unique ou double. A mesure quaugmenteront la quantit de donnes, le nombre dutilisateurs et le nombre des diffrentes applications accdant aux donnes, vous serez ventuellement amen adopter une architecture multiniveau. Si vous pensez utiliser terme une architecture multiniveau, il peut tre judicieux de commencer en utilisant un ensemble de donnes client avec un ensemble de donnes source externe. Ainsi, lorsque vous transfrez vers un niveau intermdiaire la logique de laccs et de la manipulation des donnes, le dveloppement effectu est protg car le code est rutilisable mesure que lapplication prend de lampleur. TClientDataSet peut tre li tout ensemble de donnes source. Cela signifie que vous pouvez utiliser des ensembles de donnes personnaliss (composants tierces parties) pour lesquels nexiste aucun ensemble de donnes client spcialis correspondant. Certaines versions de Delphi incluent mme des composants fournisseur spciaux qui connectent un ensemble de donnes client un document XML plutt qu un autre ensemble de donnes. (Cela fonctionne de la mme faon que la connexion dun ensemble de donnes client un autre ensemble de donnes (source), la diffrence que le fournisseur XML utilise un document XML la place dun ensemble de donnes. Pour plus dinformations sur ces fournisseurs XML, voir Utilisation dun document XML comme source pour un fournisseur la page 26-9.) Larchitecture qui connecte un ensemble de donnes client un ensemble de donnes externe se prsente sous deux versions : Connexion dun ensemble de donnes client un autre ensemble de donnes dans la mme application. Utilisation dune architecture multiniveau.

Conception dapplications de bases de donnes

14-13

Architecture des bases de donnes

Connexion dun ensemble de donnes client un autre ensemble de donnes dans la mme application
Le fait dutiliser un composant fournisseur vous permet de vous connecter TClientDataSet un autre ensemble de donnes (source). Le fournisseur assemble les informations de bases de donnes en paquets de donnes transportables (utilisables par les ensembles de donnes client) et applique un serveur de base de donnes les mises jour reues dans les paquets delta (que les ensembles de donnes client crent). Cette architecture est illustre par la figure suivante :
Figure 14.4 Architecture combinant un ensemble de donnes client et un autre ensemble de donnes

Cette architecture reprsente une application niveau unique ou une application niveau double, selon que le serveur de base de donn es est une base de donnes locale ou un serveur de base de donnes distant. La logique qui manipule les informations de bases de donnes figure dans lapplication qui implmente linterface utilisateur, tout en tant confine dans un module de donnes. Pour lier lensemble de donnes client au fournisseur, attribuez sa proprit ProviderNamele nom du composant fournisseur. Le fournisseur doit se trouver dans le mme module de donnes que lensemble de donnes client. Pour lier le fournisseur lensemble de donnes source, dfinissez sa proprit DataSet. Une fois que lensemble de donnes client est li au fournisseur et que celui-ci est li lensemble de donnes source, ces composants grent automatiquement tous les aspects inhrents la lecture, laffichage et lexploration des enregistrements de bases de donnes (sous rserve que lensemble de donnes source soit connect une base de donnes). Pour appliquer les modifications

14-14

Guide du dveloppeur

Architecture des bases de donnes

utilisateur la base de donnes, vous devez uniquement appeler la mthode ApplyUpdates de lensemble de donnes client. Pour plus dinformations sur lutilisation dun ensemble de donnes client avec un fournisseur, voir Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29.

Utilisation dune architecture multiniveau


Lorsque les informations de bases de donnes comprennent des relations complexes entre plusieurs tables ou que le nombre de clients saccrot, vous pouvez utiliser une application multiniveau. Les applications multiniveaux comprennent des niveaux intermdiaires entre lapplication cliente et le serveur de base de donnes. Cette architecture est illustre par la figure suivante :
Figure 14.5 Architecture de base de donnes multiniveau

La figure prcdente reprsente une application trois niveaux. La logique qui manipule les informations de bases de donnes se trouve sur un systme indpendant, ou niveau. Ce niveau intermdiaire centralise la logique qui gouverne les interactions avec votre base de donnes et offre ainsi un contrle centralis des relations entre les donnes. Cela permet diffrentes applications clientes dutiliser les mmes donnes tout en garantissant lhomognit de la

Conception dapplications de bases de donnes

14-15

Architecture des bases de donnes

logique des donnes. Les applications multiniveaux autorisent aussi les applications clientes de taille rduite car la majeure partie du traitement est dplace vers le niveau intermdiaire. Ces applications clientes de taille rduite sont plus faciles installer, configurer et grer. Les applications multiniveaux peuvent aussi amliorer les performances en rpartissant le traitement des donnes sur plusieurs systmes. Larchitecture multiniveau sapparente beaucoup au modle prcdent. Elle sen distingue essentiellement par le fait que lensemble de donnes source, qui se connecte au serveur de base de donnes, et le fournisseur, qui fait office dintermdiaire entre cet ensemble de donnes source et lensemble de donnes client, ont tous les deux t dplacs vers une application spare. Cette application est appele serveur dapplications (ou parfois courtier ou agent des donnes distantes). tant donn que le fournisseur a t dplac vers une application spare, lensemble de donnes client ne peut plus se connecter lensemble de donnes source en dfinissant simplement sa proprit ProviderName. En outre, il doit utiliser un type de composant connexion pour rechercher le serveur dapplications et sy connecter. Plusieurs types de composants connexion peuvent connecter un ensemble de donnes client un serveur dapplications. Ils drivent tous de TCustomRemoteServer et diffrent essentiellement par le protocole de communication utilis (TCP/IP, HTTP, DCOM, SOAP, ou CORBA). Liez lensemble de donnes client son composant connexion en dfinissant la proprit RemoteServer. Le composant connexion tablit une connexion au serveur dapplications et renvoie une interface que lensemble de donnes client utilise pour appeler le fournisseur spcifi par sa proprit ProviderName. Chaque fois que lensemble de donnes client appelle le serveur dapplications, il transmet la valeur de ProviderName puis le serveur dapplications transmet lappel au fournisseur. Pour plus dinformations sur la connexion dun ensemble de donnes client un serveur dapplications, voir chapitre 25, Cration dapplications multiniveaux.

Combinaison des approches


Les sections prcdentes dcrivent diffrentes architectures utilisables lors de lcriture dapplications de bases de donnes. Rien ne vous empche, toutefois, de combiner deux ou plusieurs des architectures disponibles dans une mme application. De fait, certaines combinaisons peuvent savrer trs puissantes. Par exemple, vous pouvez combiner larchitecture de type disque dcrite dans Utilisation dun fichier ddi sur disque la page 14-10, avec une approche telle que celles dcrites dans Connexion dun ensemble de donnes client un autre ensemble de donnes dans la mme application la page 14-14 ou Utilisation dune architecture multiniveau la page 14-15. Ces combinaisons sont simples car tous les modles utilisent un ensemble de donnes client pour reprsenter les donnes qui apparaissent dans linterface utilisateur. Le rsultat

14-16

Guide du dveloppeur

Conception de linterface utilisateur

est appel modle briefcase (ou parfois modle dconnect ou informatique nomade). Le modle briefcase peut, par exemple, savrer utile dans la situation suivante : la base de donnes sur site dune entreprise contient des informations de contacts clients que les reprsentants peuvent utiliser et mettre jour lextrieur de lentreprise. Ils peuvent tlcharger des informations partir de la base de donnes, exploiter ces donnes sur leurs ordinateurs portables pendant quils sont en dplacement dans tout le pays, et mme mettre jour des enregistrements sur des sites existants ou de nouveaux sites. Quand les reprsentants reviennent dans lentreprise, ils doivent charger leurs changements de donnes dans la base de donnes de lentreprise pour les mettre la disposition de tous. Lors dune opration sur site, lensemble de donnes client dune application de modle briefcase obtient ses donnes dun fournisseur. Lensemble de donnes client est ensuite connect au serveur de base de donnes et peut, par le biais du fournisseur, rcuprer des donnes du serveur et lui communiquer des mises jour. Avant de se dconnecter du fournisseur, lensemble de donnes client enregistre sa capture instantane des informations dans un fichier sur disque. Hors site, lensemble de donnes client charge ses donnes partir du fichier et enregistre toute modification dans ce fichier. Dans une dernire phase, une fois de nouveau sur site, lensemble de donnes client se reconnecte au fournisseur afin dappliquer ses mises jour au serveur de base de donnes ou dactualiser sa capture instantane des donnes.

Conception de linterface utilisateur


La page ContrleBD de la palette des composants offre un ensemble de contrles orients donnes qui reprsentent les donnes de champs dun enregistrement de base de donnes et qui permettent aux utilisateurs de modifier ces donnes et de rpercuter ces modifications dans la base de donnes. Lutilisation de contrles orients donnes vous permet de construire linterface utilisateur votre application de base de donnes de sorte que ces informations soient visibles et accessibles aux utilisateurs. Pour plus dinformations sur les contrles orients donnes, voir chapitre 15, Utilisation de contrles de donnes Outre les contrles de donnes lmentaires, vous pouvez galement intgrer dautres lments dans votre interface utilisateur : Votre application peut analyser les donnes contenues dans une base de donnes. Les applications qui analysent les donnes dune base de donnes ne se contentent pas de les afficher ; elles les rsument sous forme conviviale afin que les utilisateurs en saisissent limpact. Vous pouvez imprimer des rapports afin dobtenir une copie imprime des informations affiches dans votre interface utilisateur. Vous pouvez crer une interface utilisateur qui peut tre visualise laide de navigateurs Web. Les applications de bases de donnes Web les plus simples sont dcrites dans Utilisation des bases de donnes dans les rponses la

Conception dapplications de bases de donnes

14-17

Conception de linterface utilisateur

page 28-18. En outre, vous pouvez combiner lapproche Web et larchitecture multiniveau, comme dcrit dans Ecriture des applications client Web la page 25-36.

Analyse des donnes


Certaines applications de bases de donnes ne prsentent pas les informations de bases de donnes directement lutilisateur mais analysent et rsument les informations des bases de donnes pour permettre aux utilisateurs de tirer des conclusions partir des donnes. Le composant TDBChart de la page ContrleBD de la palette des composants vous permet de prsenter les informations de bases de donnes sous forme graphique afin que les utilisateurs puissent rapidement saisir limportance des informations de bases de donnes. En outre, certaines versions de Delphi proposent une page Decision Cube sur la palette des composants. Elle contient six composants qui vous permettent danalyser les donnes et de raliser des rfrences croises sur les donnes lors de la construction dapplications daide la dcision. Pour plus dinformations sur lutilisation des composants Decision Cube, voir chapitre 16, Utilisation de composants daide la dcision. Si vous souhaitez construire vos propres composants daffichage de rsums de donnes en fonction de divers critres de regroupement, vous pouvez utiliser des agrgats maintenus avec un ensemble de donnes client. Pour plus dinformations sur lutilisation des agrgats maintenus, voir Utilisation des agrgats maintenus la page 23-13.

Ecriture de rapports
Si vous souhaitez que les utilisateurs puissent imprimer les informations de bases de donnes manant des ensembles de donnes de votre application, vous pouvez utiliser les composants rapport de la page QReport de la palette des composants. Lutilisation de ces composants vous permet de construire visuellement des rapports bandes pour prsenter et rsumer les informations contenues dans vos tables de bases de donnes. Vous pouvez ajouter des rsums aux en-ttes et aux pieds de page de groupe pour analyser les donnes en fonction de critres de regroupement. Dmarrez un rapport pour votre application en slectionnant licne QuickReport dans la bote de dialogue Nouveaux lments. Slectionnez Fichier|Nouveau dans le menu principal et allez la page Affaires. Double-cliquez sur licne Expert QuickReport pour lancer lexpert.
Remarque

Pour un exemple dutilisation des composants de la page QReport, reportez-vous au programme exemple QuickReport livr avec Delphi.

14-18

Guide du dveloppeur

15
Chapitre 15

Chapitre

Utilisation de contrles de donnes

La page ContrleBD de la palette des composants offre un ensemble de contrles orients donnes qui reprsentent les donnes de champs dun enregistrement de base de donnes et qui permettent aux utilisateurs de modifier ces donnes et de rpercuter ces modifications dans la base de donnes si lensemble de donnes le permet. Lutilisation de contrles de donnes sur les fiches de votre application de base de donnes vous permet de construire linterface utilisateur de celle-ci de sorte que ces informations soient visibles et accessibles aux utilisateurs. Les contrles orients donnes que vous ajoutez votre interface utilisateur dpendent notamment des facteurs suivants : Le type de donnes que vous affichez. Vous avez le choix entre les contrles qui permettent dafficher et de modifier du texte brut, ceux conus pour le texte format, ceux destins aux lments multimdia ou aux graphiques, etc. Les contrles qui affichent diffrents types dinformations sont dcrits dans Affichage dun seul enregistrement la page 15-8. Lorganisation des informations. Vous pouvez afficher les informations dun seul enregistrement ou, laide dune grille, rpertorier les donnes manant de plusieurs enregistrements. Le paragraphe Choix de lorganisation des donnes la page 15-8 dcrit certaines possibilits. Le type densemble de donnes qui fournit les donnes aux contrles. Vous pouvez utiliser des contrles qui refltent les limites de lensemble de donnes sous-jacent. Par exemple, lutilisation dune grille avec un ensemble de donnes unidirectionnel ne serait pas fonde car les ensembles de donnes unidirectionnels ne peuvent fournir quun enregistrement la fois. Eventuellement, la faon dont vous souhaitez que les utilisateurs puissent naviguer dans les enregistrements ou les ensembles de donnes pour y ajouter ou y modifier des donnes. Vous pouvez ajouter vos propres contrles ou mcanismes de navigation et de modification ou utiliser un contrle intgr tel quun navigateur de donnes. Pour plus dinformations sur lutilisation dun

Utilisation de contrles de donnes

15-1

Fonctionnalits communes des contrles de donnes

navigateur de donnes, voir Navigation et manipulation denregistrements la page 15-33.


Remarque

Des contrles orients donnes daide la dcision plus complexes sont prsents dans le chapitre 16, Utilisation de composants daide la dcision. Quels que soient les contrles orients donnes que vous choisissez dajouter votre interface, ils prsentent certaines fonctionnalits communes, dcrites ciaprs.

Fonctionnalits communes des contrles de donnes


Les tches suivantes sont communes la plupart des contrles de donnes : Association dun contrle de donnes un ensemble de donnes Edition et mise jour des donnes Activation et dsactivation de laffichage des donnes Rafrachissement de laffichage des donnes Activation des vnements souris, clavier et timer

Les contrles orients donnes vous permettent dafficher et dditer des champs associs lenregistrement en cours dun ensemble de donnes. Le tableau suivant dresse la liste des contrles de donnes apparaissant sur la page ContrleBD de la palette des composants.
Tableau 15.1 Contr les de donnes
TDBGrid

Contrles de donnes Description


Affiche les informations issues dune source de donnes dans un format tabulaire. Les colonnes de la grille correspondent celles de la table sous-jacente ou de lensemble de donnes de la requte. Chaque ligne de la grille reprsente un enregistrement. Permet la navigation dans les enregistrements dun ensemble de donnes, leur mise jour, leur validation, leur suppression, lannulation des oprations ddition et le rafrachissement de laffichage. Affiche les donnes dun champ sous forme de libell. Affiche les donnes dun champ dans une zone de saisie. Affiche les donnes dun champ m mo ou dun champ BLOB dans une zone de saisie multiligne. Affiche des images graphiques dun champ de donnes dans une zone graphique. Affiche une liste dlments partir desquels vous pouvez mettre jour un champ de lenregistrement en cours. Affiche une liste droulante dlments partir desquels vous pouvez mettre jour un champ et permet la saisie directe de texte comme dans une zone de saisie standard. Affiche une case cocher indiquant la valeur dun champ boolen.

TDBNavigator

TDBText TDBEdit TDBMemo TDBImage TDBListBox TDBComboBox

TDBCheckBox

15-2

Guide du dveloppeur

Fonctionnalits communes des contrles de donnes

Tableau 15.1 Contr les de donnes

Contrles de donnes (suite) Description


Affiche un ensemble doptions mutuellement exclusives pour un champ. Affiche une liste dlments rfrencs dans un autre ensemble de donnes en fonction de la valeur dun champ. Affiche une liste dlments rfrencs dans un autre ensemble de donnes en fonction de la valeur dun champ et permet la saisie directe de texte comme dans une zone de saisie oriente donnes standard. Affiche un ensemble de contrles orients donnes configurable et rcurrent dans une grille. Affiche les donnes formates dun champ dans une zone de saisie.

TDBRadioGroup TDBLookupListBox TDBLookupComboBox

TDBCtrlGrid TDBRichEdit

Les contrles sont orients donnes au moment de la conception. Lorsque vous associez le contrle orient donnes un ensemble de donnes actif lors de la construction dune application, vous pouvez voir immdiatement les donnes relles dans le contrle. En phase de conception, vous pouvez utiliser lditeur de champs pour parcourir un ensemble de donnes afin de vrifier que votre application affiche les donnes correctement sans quil soit ncessaire de la compiler ou de lexcuter. Pour plus dinformations sur lditeur de champs, voir la section Cration de champs persistants la page 19-4. Lors de lexcution, les contrles orients donnes affichent galement des donnes et permettent leur dition si le contrle, lapplication et lensemble de donnes auxquels votre application est connecte lautorisent.

Association dun contrle de donnes un ensemble de donnes


Les contrles de donnes se connectent aux ensembles de donnes en utilisant une source de donnes. Un composant source de donnes (TDataSource) agit comme une voie de communication entre le contrle et un ensemble de donnes contenant des donnes. Chaque contrle orient donnes doit tre associ un composant source de donnes afin de pouvoir afficher et manipuler des donnes. De mme, tous les ensembles de donnes doivent tre associs un composant source de donnes afin que leurs donnes puissent tre affiches et manipules dans les contrles orients donnes dune fiche.
Remarque

Les composants source de donnes sont galement ncessaires pour lier les ensembles de donnes non imbriqus dans les relations matre-dtail. Pour associer un contrle de donnes un ensemble de donnes,

1 Placez un ensemble de donnes dans un module de donnes ou sur une fiche et dfinissez ses proprits. 2 Placez une source de donnes dans le mme module de donnes ou sur la mme fiche. A laide de linspecteur dobjets, attribuez sa proprit DataSet lensemble de donnes plac ltape 1.

Utilisation de contrles de donnes

15-3

Fonctionnalits communes des contrles de donnes

3 Depuis longlet AccsBD de la palette des composants, placez un contrle de donnes sur une fiche. 4 A laide de linspecteur dobjets, attribuez la proprit DataSource du contrle le composant source de donnes plac ltape 2. 5 Donnez la proprit DataField du contrle le nom du champ afficher, ou bien slectionnez un champ dans la liste droulante. Cette tape ne sapplique pas aux contrles TDBGrid, TDBCtrlGrid et TDBNavigator, car ils accdent tous les champs disponibles dans un ensemble de donnes. 6 Pour afficher des donnes dans le contrle, mettez la proprit Active de lensemble de donnes True.

Modification de lensemble de donnes associ lexcution


Dans lexemple prcdent, la source de donnes a t associe son ensemble de donnes en dfinissant sa proprit DataSet la conception. A lexcution, si ncessaire, vous pouvez modifier lensemble de donnes dun composant source de donnes. Par exemple, le code suivant attribue lensemble de donnes du composant source de donnes CustSource lun des composants ensemble de donnes Customers ou Orders :
with CustSource do begin if (DataSet = Customers) then DataSet := Orders else DataSet := Customers; end;

Vous pouvez galement attribuer la proprit DataSet un ensemble de donnes appartenant une autre fiche afin de synchroniser les contrles de donnes des deux fiches. Par exemple :
procedure TForm2.FormCreate (Sender : TObject); begin DataSource1.Dataset := Form1.Table1; end;

Activation et dsactivation de la source de donnes


La source de donnes possde une proprit Enabled qui dtermine si elle est connecte son ensemble de donnes. Lorsque Enabled vaut True, la source de donnes est connecte un ensemble de donnes. Vous pouvez temporairement dconnecter une source de donnes unique de son ensemble de donnes en attribuant Enabled la valeur False. Lorsque Enabled vaut False, tous les contrles de donnes attachs au composant source de donnes deviennent vierges et inactifs jusqu ce que Enabled prenne la valeur True. Il est toutefois recommand de contrler laccs un ensemble de donnes par le biais des mthodes DisableControls et EnableControls dun composant ensemble de donnes car elles affectent toutes les sources de donnes attaches.

15-4

Guide du dveloppeur

Fonctionnalits communes des contrles de donnes

Rponse aux modifications effectues par le biais de la source de donnes


tant donn que la source de donnes relie le contrle de donnes son ensemble de donnes, elle vhicule toute la communication qui intervient entre eux deux. Gnralement, le contrle orient donnes rpond automatiquement aux modifications apportes dans lensemble de donnes. Toutefois, si votre interface utilisateur utilise des contrles non orients donnes, vous pouvez utiliser les vnements dun composant source de donnes pour fournir manuellement le mme type de rponse. Lvnement OnDataChange se produit chaque fois que les donnes dun enregistrement sont susceptibles davoir volu, notamment lorsque le contenu des champs est modifi ou que le curseur est positionn sur un autre enregistrement. Cet vnement, dclench par toute modification, garantit que le contrle reflte les valeurs de champ en cours dans lensemble de donnes. Gnralement, un gestionnaire dvnement OnDataChange rafrachit la valeur dun contrle non orient donnes qui affiche des donnes de champ. Lvnement OnUpdateData se produit lorsque les donnes de lenregistrement en cours sont sur le point dtre valides. Par exemple, un vnement OnUpdateData se produit aprs lappel de Post, mais avant la validation effective des donnes dans le cache local ou le serveur de bases de donnes sous-jacent. Lvnement OnStateChange se produit lorsque ltat de lensemble de donnes change. Lorsque cet vnement est dclench, vous pouvez examiner la proprit State de lensemble de donnes afin de dterminer son tat en cours. Par exemple, le gestionnaire dvnement OnStateChange suivant active ou dsactive les boutons ou les lments de menu en fonction de ltat en cours :
procedure Form1.DataSource1.StateChange(Sender: TObject); begin CustTableEditBtn.Enabled := (CustTable.State = dsBrowse); CustTableCancelBtn.Enabled := CustTable.State in [dsInsert, dsEdit, dsSetKey]; CustTableActivateBtn.Enabled := CustTable.State in [dsInactive]; end; Remarque

Pour plus dinformations sur les tats des ensembles de donnes, voir D termination des tats dun ensemble de donnes la page 18-3.

Edition et mise jour des donnes


A lexception du navigateur, tous les contrles affichent les donnes dun champ de base de donnes. De plus, vous pouvez les utiliser pour diter et mettre jour les donnes, si lensemble de donnes sous-jacent le permet.
Remarque

Les ensembles de donnes unidirectionnels ne permettent jamais aux utilisateurs dditer et de mettre jour les donnes.

Utilisation de contrles de donnes

15-5

Fonctionnalits communes des contrles de donnes

Activation de ldition des contrles lors dune saisie utilisateur


Un ensemble de donnes doit tre en mode dsEdit pour autoriser ldition de son contenu. Si la proprit AutoEdit de la source de donnes vaut True (valeur par dfaut), le contrle de donnes place lensemble de donnes en mode dsEdit ds que lutilisateur essaie de modifier son contenu. Si AutoEdit vaut False, vous devez fournir un mcanisme permettant de placer lensemble de donnes en mode dition. Ce mcanisme peut consister en un contrle TDBNavigator dot dun bouton ddition, grce auquel lutilisateur peut explicitement placer lensemble de donnes en mode dition. Pour plus dinformations sur TDBNavigator, voir Navigation et manipulation denregistrements la page 15-33. Vous avez galement la possibilit dcrire du code qui appelle la mthode Edit de lensemble de donnes lorsque vous souhaitez placer celui-ci en mode dition.

Edition des donnes affiches dans un contrle


Un contrle de donnes ne peut valider les modifications dans son ensemble de donnes associ que si la proprit CanModify de lensemble de donnes vaut True. CanModify vaut toujours False pour les ensembles de donnes unidirectionnels. Certains ensembles de donnes possdent une proprit ReadOnly qui permet de spcifier si CanModify vaut True.
Remarque

La possibilit pour un ensemble de donnes de mettre jour des donnes dpend de la table de base de donnes sous-jacent. Mme si la proprit CanModify de lensemble de donnes vaut True, la proprit Enabled de la source de donnes qui connecte lensemble de donnes au contrle doit galement valoir True afin que le contrle puisse valider les mises jour dans la table de base de donnes. La proprit Enabled de la source de donnes dtermine si le contrle peut afficher les valeurs de champ partir de lensemble de donnes et, par consquent, si un utilisateur peut modifier et valider les valeurs. Si Enabled vaut True (valeur par dfaut), les contrles peuvent afficher les valeurs de champ. Enfin, vous pouvez mme dterminer si lutilisateur peut apporter des modifications aux donnes affiches dans le contrle. La proprit ReadOnly du contrle de donnes dtermine si un utilisateur peut modifier les donnes affiches par le contrle. Si elle vaut False (valeur par dfaut), les utilisateurs peuvent modifier les donnes. Il est logique dappliquer doffice la proprit ReadOnly du contrle la valeur True lorsque la proprit CanModify de lensemble de donnes a pour valeur False. Sinon, vous donnez aux utilisateurs la fausse impression quils peuvent affecter les donnes de la table de base de donnes sous-jacente. Dans tous les contrles orients donnes, lexception de TDBGrid, les modifications dun champ sont copies dans lensemble de donnes sous-jacent quand vous appuyez sur Tab depuis le contrle. Si vous appuyez sur la touche Echap avant dappuyer sur Tab dans un champ, les modifications sont abandonnes et le champ reprend sa valeur initiale.

15-6

Guide du dveloppeur

Fonctionnalits communes des contrles de donnes

Avec le composant TDBGrid, les modifications sont valides au moment o vous passez un enregistrement diffrent ; vous pouvez appuyer sur Echap dans nimporte quel champ dun enregistrement avant de passer un autre enregistrement pour annuler une modification. Lorsquun enregistrement est crit, Delphi vrifie si le statut des contrles orients donnes associs lensemble de donnes a t modifi. En cas de problme de mise jour dun champ contenant des donnes modifies, Delphi provoque une exception et aucune modification nest apporte lenregistrement.
Remarque

si votre application place les mises jour en mmoire cache (par exemple, laide dun ensemble de donnes client), toutes les modifications sont crites dans un cache interne. Ces modifications ne sont pas appliques la table de base de donnes sous-jacente tant que vous nappelez pas la mthode ApplyUpdates de lensemble de donnes.

Activation et dsactivation de laffichage des donnes


Lorsque votre application parcourt un ensemble de donnes ou effectue une recherche, il est prfrable dinterdire temporairement le rafrachissement des valeurs affiches dans les contrles orients donnes chaque changement denregistrement. Cela a pour effet dacclrer litration ou la recherche et permet dviter que limage ne saute lcran. DisableControls est une mthode qui dsactive laffichage dans tous les contrles orients donnes lis un ensemble de donnes. D s que litration ou la recherche est termine, votre application doit immdiatement faire appel la mthode EnableControls pour ractiver laffichage des contrles. En rgle gnrale, vous devez dsactiver les contrles avant de commencer parcourir les enregistrements. Ce processus doit prendre place dans une instruction try...finally pour que vous puissiez ractiver les contrles mme si une exception est provoque. La clause finally doit faire appel EnableControls. Le code ci-dessous montre comment DisableControls et EnableControls peuvent tre utilises dans ce but :
CustTable.DisableControls; try CustTable.First; { Aller sur le premier enregistrement qui dfinit EOF False } while not CustTable.EOF do { Boucle jusqu ce quEOF soit True } begin { Traiter chaque enregistrement ici } CustTable.Next; { EOF False en cas de succs ; EOF True quand Next choue sur le dernier enregistrement } end; finally CustTable.EnableControls; end;

Utilisation de contrles de donnes

15-7

Choix de lorganisation des donnes

Rafrachissement de laffichage des donnes


La mthode Refresh dun ensemble de donnes rinitialise les tampons locaux et extrait nouveau les donnes dun ensemble ouvert. Vous pouvez utiliser cette mthode pour mettre jour laffichage dans les contrles orients donnes si vous pensez que les donnes sous-jacentes ont chang du fait que dautres applications y accdent en mme temps. Si vous utilisez les mises jour en mmoire cache, vous devez, avant dactualiser lensemble de donnes, appliquer les mises jour ventuelles que celui-ci dtient en mmoire cache. Le rafrachissement donne parfois des rsultats inattendus (par exemple, lorsquun utilisateur est en train de visualiser un enregistrement supprim par une autre application, puis que cet enregistrement disparat ds que lapplication fait appel Refresh). Les donnes peuvent galement changer laffichage si un autre utilisateur modifie un enregistrement aprs que vous ayez extrait les donnes et avant davoir fait appel Refresh.

Activation des vnements souris, clavier et timer


La proprit Enabled dun contrle de donnes dtermine sil doit ragir aux vnements souris, clavier ou timer et transmettre des informations sa source de donnes. La valeur par dfaut de cette proprit est True. Pour empcher les vnements souris, clavier ou timer datteindre un contrle de donnes, vous devez dfinir sa proprit Enabled False. Quand Enabled a la valeur False, la source de donnes qui connecte le contrle son ensemble de donnes ne reoit pas dinformations du contrle de donnes. Celui-ci affichera toujours les donnes, mais le texte napparatra pas en surbrillance.

Choix de lorganisation des donnes


Lorsque vous crez linterface utilisateur de votre application de base de donnes, vous devez dfinir lorganisation de laffichage des informations et des contrles qui les manipulent. Vous devez dabord dterminer si vous souhaitez afficher un seul enregistrement ou plusieurs enregistrements la fois. En outre, vous pouvez ajouter des contrles pour explorer et manipuler les enregistrements. Le contrle TDBNavigator prend en charge de nombreuses fonctions susceptibles de vous intresser.

Affichage dun seul enregistrement


Dans de nombreuses applications, il est souhaitable de nafficher simultanment que les informations relatives un seul enregistrement de donnes. Par exemple, une application de saisie de commandes peut afficher les informations relatives une seule commande sans indiquer les autres commandes consignes. Ces

15-8

Guide du dveloppeur

Choix de lorganisation des donnes

informations peuvent provenir dun seul enregistrement dun ensemble de commandes. Les applications qui affichent un seul enregistrement sont gnralement faciles lire et comprendre car toutes les informations de bases de donnes concernent le mme lment (la mme commande dans le cas prcdent). Les contrles orients donnes contenus dans ces interfaces utilisateur reprsentent un seul champ dun enregistrement de base de donnes. La page ContrleBD de la palette des composants offre un large choix de contrles pour la reprsentation des diffrents types de champs. Ces contrles sont gnralement les versions orientes donnes de contrles disponibles sur la palette des composants. Par exemple, le contrle TDBEdit est une version oriente donnes du contrle TEdit standard qui permet aux utilisateurs de visualiser et dditer une chane texte. Le type de donnes contenu dans le champ (texte, texte format, graphique, informations boolennes, etc.) dtermine le contrle utilis.

Affichage de donnes en tant que libells


TDBText est un contrle en lecture seulement semblable au composant TLabel de la page Standard de la palette des composants. Le contrle TDBText est utile quand vous voulez placer des donnes en affichage seulement sur une fiche permettant lutilisateur dentrer des donnes dans dautres contrles. Supposons, par exemple, quune fiche soit cre partir des champs dune table clients et quune fois que lutilisateur entre les informations sur la rue, la ville et le dpartement dans la fiche, vous utilisiez une rfrence dynamique pour dterminer automatiquement le contenu du champ code postal depuis une table distincte. Un composant TDBText reli la table des codes postaux permettra dafficher le champ code postal correspondant ladresse entre par lutilisateur. TDBText extrait le texte affich du champ spcifi dans lenregistrement en cours dun ensemble de donnes. Puisque TDBText obtient son texte dun ensemble de donnes, le texte affich est dynamique, cest--dire quil change au fur et mesure que lutilisateur navigue dans la table. Pour cette raison, il nest pas possible de spcifier le texte daffichage de TDBText au moment de la conception comme cest le cas pour le composant TLabel.
Remarque

Lorsque vous placez un composant TDBText sur une fiche, vrifiez que sa proprit AutoSize est True (la valeur par dfaut) ; vous garantissez ainsi que le contrle se redimensionne automatiquement pour afficher des donnes de largeur variable. Si AutoSize vaut False, et le contrle trop troit, les donnes affiches seront tronques.

Affichage et dition de champs dans une zone de saisie


TDBEdit est la version oriente donnes du composant zone de saisie. TDBEdit affiche la valeur actuelle dun champ de donnes auquel il est li et lui permet dtre dit comme dans nimporte quelle zone de saisie.

Utilisation de contrles de donnes

15-9

Choix de lorganisation des donnes

Par exemple, supposons que CustomersSource est un composant TDataSource actif et li un objet TClientDataSet ouvert appel CustomersTable. Vous pouvez placer un composant TDBEdit sur une fiche et dfinir ses proprits comme suit : DataSource: CustomersSource DataField: CustNo Le composant zone de saisie oriente donnes affiche immdiatement la valeur de la colonne CustNo de la ligne en cours dans lensemble de donnes CustomersTable, tant au moment de la conception que de lexcution.

Affichage et dition de texte dans un contrle mmo


TDBMemo est un composant orient donnes, semblable au composant TMemo standard, permettant dafficher des donnes de texte long. TDBMemo sert afficher et saisir du texte multiligne. Vous pouvez utiliser les contrles TDBMemo pour afficher les champs de texte volumineux ou les donnes textuelles contenues dans les champs BLOB (binary large object). Par dfaut, TDBMemo permet un utilisateur dditer du texte mmo. Pour empcher ldition, mettez la proprit ReadOnly du contrle mmo True. Pour afficher les tabulations et permettre aux utilisateurs dentrer des tabulations dans le mmo, mettez la proprit WantTabs True. Pour limiter le nombre de caractres pouvant tre saisis par les utilisateurs dans un mmo de base de donnes, utilisez la proprit MaxLength. Par dfaut, MaxLength vaut 0, ce qui signifie quil ny a aucune limite, en dehors de celles du systme dexploitation, au nombre de caractres pouvant tre contenus dans le contrle. Plusieurs proprits affectent laspect du mmo de base de donnes et la faon dentrer le texte. Vous pouvez fournir des barres de dfilement laide de la proprit ScrollBars. Pour interdire le retour automatique en fin de ligne, dfinissez la proprit WordWrap False. La proprit Alignment dtermine lalignement du texte dans le contrle. Les options possibles sont taLeftJustify (valeur par dfaut), taCenter et taRightJustify. Pour changer la fonte du texte, utilisez la proprit Font. Au moment de lexcution, lutilisateur peut couper, copier et coller du texte vers un contrle mmo de base de donnes ou depuis celui-ci. Vous pouvez galement effectuer cette tche par programmation avec les mthodes CutToClipboard, CopyToClipboard et PasteFromClipboard. Comme TDBMemo peut afficher de grandes quantits de donnes, ce champ peut tre relativement long remplir lors de lexcution. Pour acclrer le dfilement des enregistrements, TDBMemo a une proprit AutoDisplay qui contrle si les donnes auxquelles il accde doivent tre affiches automatiquement. Si vous dfinissez AutoDisplay False, TDBMemo affiche le nom du champ plutt que les donnes elles-mmes. Pour visualiser les donnes, il suffit de double-cliquer lintrieur du contrle.

15-10

Guide du dveloppeur

Choix de lorganisation des donnes

Affichage et dition dans un contrle mmo de texte format


TDBRichEdit est un composant orient donnes, semblable au composant TRichEdit standard, qui peut afficher le texte format dun BLOB (binary large object). TDBRichEdit affiche du texte format, multiligne, et permet lutilisateur dentrer du texte multiligne format.
Remarque

TDBRichEdit est dot de proprits et de mthodes permettant dentrer et de manipuler du texte format. Toutefois, il noffre pas une interface utilisateur mettant ces options de formatage la disposition de lutilisateur. Cest votre application qui doit implmenter linterface utilisateur permettant daccder aux fonctions de texte format. Par dfaut, TDBRichEdit permet lutilisateur dditer du texte mmo format. Pour empcher ldition, mettez la proprit ReadOnly du contrle diteur de texte format True. Pour afficher les tabulations et permettre aux utilisateurs dentrer des tabulations dans le mmo, mettez la proprit WantTabs True. Pour limiter le nombre de caractres pouvant tre saisis par les utilisateurs dans un mmo de base de donnes, utilisez la proprit MaxLength. Par dfaut, MaxLength vaut 0, ce qui signifie quil ny a aucune limite, en dehors de celles du systme dexploitation, au nombre de caractres pouvant tre saisi. Comme TDBRichEdit peut contenir de grands volumes de donnes, il faut parfois beaucoup de temps pour afficher les donnes lexcution. Pour acclrer le dfilement des enregistrements, TDBRichEdit a une proprit AutoDisplay qui contrle si les donnes auxquelles il accde doivent tre affiches automatiquement. Si AutoDisplay est False, TDBRichEdit affiche le nom du champ la place des donnes. Pour visualiser les donnes, il suffit de doublecliquer lintrieur du contrle.

Affichage et dition de champs graphiques dans un contrle image


TDBImage est un contrle orient donnes qui permet laffichage de graphiques contenus dans des champs BLOB. Par dfaut, TDBImage permet lutilisateur dditer une image par couper-coller via le Presse-papiers en utilisant les mthodes CutToClipboard, CopyToClipboard et PasteFromClipboard. Vous pouvez galement fournir vos propres mthodes ddition si vous le souhaitez. Par dfaut, seule la partie du graphique pouvant tenir dans le contrle image apparat et limage est tronque si elle est trop grande. Vous pouvez attribuer la proprit Stretch la valeur True pour redimensionner le graphique afin quil remplisse le contrle image et que sa taille soit ajuste conformment aux redimensionnements du contrle. Comme le composant TDBImage peut afficher de grandes quantits de donnes, laffichage peut prendre un certain temps lexcution. Pour acclrer le dfilement des enregistrements, TDBImage a une proprit AutoDisplay qui contrle si les donnes auxquelles il accde doivent safficher automatiquement. Si vous mettez AutoDisplay False, TDBImage affiche le nom du champ au lieu des donnes. Pour visualiser les donnes, il suffit de double-cliquer lintrieur du contrle.

Utilisation de contrles de donnes

15-11

Choix de lorganisation des donnes

Affichage de donnes dans des botes liste et des botes options


Quatre contrles de donnes fournissent aux utilisateurs un groupe de valeurs par dfaut parmi lesquelles il est possible deffectuer un choix lexcution. Ces contrles prsentent une version oriente donnes des contrles bote liste et bote options standard : TDBListBox. Ce contrle affiche une liste dlments quil est possible de faire dfiler. Lutilisateur peut aussi choisir lun de ces lments pour entrer dans un champ de donnes. Une bote liste oriente donnes affiche la valeur en cours pour un champ de lenregistrement en cours et met lentre correspondante en surbrillance dans la liste. Si la valeur de champ de la ligne en cours ne figure pas dans la liste, aucune valeur nest mise en surbrillance dans la bote liste. Lorsquil slectionne un lment dans la liste, la valeur de champ correspondante est remplace dans lensemble de donnes sous-jacent. TDBComboBox. Ce contrle combine les fonctionnalits dun contrle de saisie orient donnes et dune liste droulante. A lexcution, les utilisateurs ont la possibilit dafficher une liste droulante dans laquelle ils peuvent slectionner un ensemble de valeurs prdfinies ou de saisir une valeur diffrente. TDBLookupListBox. Ce composant se comporte comme TDBListBox la diffrence que la liste des lments daffichage est recherche dans un autre ensemble de donnes. TDBLookupComboBox. Ce composant se comporte comme TDBComboBox la diffrence que la liste des lments daffichage est recherche dans un autre ensemble de donnes.
Remarque

Au moment de lexcution, les utilisateurs peuvent lancer une recherche incrmentale pour trouver des lments dans une bote liste. Lorsque le contrle a la focalisation, le fait quun utilisateur tape ROB par exemple, provoque la slection du premier lment de la bote liste commenant par ces lettres. Sil ajoute un E, le premier lment commenant par les lettres ROBE est slectionn, par exemple Robert Johnson. La recherche neffectue pas de distinction majuscules/minuscules. Les touches Retour arrire et Echap permettent dannuler la recherche de la chane (mais laissent la slection intacte), linstar dune pause de deux secondes entre deux frappes.

Utilisation de TDBListBox et de TDBComboBox


Lorsque vous utilisez TDBListBox ou TDBComboBox, vous devez recourir lditeur de liste de chanes lors de la conception afin de crer la liste des lments afficher. Pour activer lditeur de liste de chanes, cliquez sur le bouton points de suspension situ en regard de la proprit Items dans linspecteur dobjets. Ensuite, tapez les lments devant apparatre dans la liste. A lexcution, utilisez les mthodes de la proprit Items pour manipuler sa liste de chanes. Quand un contrle TDBListBox ou TDBComboBox est li un champ par sa proprit DataField, la valeur du champ est slectionne dans la liste. Si la valeur en cours ne figure pas dans la liste, aucun lment nest slectionn. Toutefois, TDBComboBox affiche la valeur en cours du champ dans sa zone de saisie, quelle apparaisse ou non dans la liste Items.

15-12

Guide du dveloppeur

Choix de lorganisation des donnes

Pour TDBListBox, la proprit Height dtermine le nombre dlments simultanment visibles dans la bote liste. La proprit IntegralHeight contrle laffichage du dernier lment. Si IntegralHeight vaut False (valeur par dfaut), la base de la bote liste est dtermine par la proprit ItemHeight et le dernier lment est susceptible de napparatre que partiellement. Si IntegralHeight a pour valeur True, le dernier lment visible de la bote liste saffiche entirement. Pour TDBComboBox, la proprit Style dtermine linteraction de lutilisateur avec le contrle. Par dfaut, Style est csDropDown, ce qui signifie que lutilisateur peut entrer des valeurs au clavier ou bien choisir un lment dans la liste droulante. Les proprits suivantes dterminent laffichage de la liste Items lexcution : Style dtermine le style daffichage du composante la bote options : csDropDown (valeur par dfaut) : affiche une liste droulante avec une zone de saisie o lutilisateur peut entrer du texte. Tous les lments sont des chanes de mme hauteur. csSimple : combine un contrle de saisie une liste dlments de taille fixe systmatiquement affiche. Quand Style a la valeur csSimple, assurez-vous daugmenter la proprit Height afin de pouvoir afficher la liste. csDropDownList : affiche une bote liste et une zone de saisie, mais lutilisateur ne peut ni saisir ni modifier les valeurs qui ne figurent pas dans la liste droulante au moment de lexcution. csOwnerDrawFixed et csOwnerDrawVariable : permettent la liste des lments dafficher des valeurs autres que des chanes (par exemple, des images bitmap) ou dutiliser des fontes diffrentes pour les lments de la liste. DropDownCount : nombre maximum dlments affichs dans la liste. Si le nombre dlments (Items) est suprieur DropDownCount, lutilisateur peut faire dfiler la liste. Si le nombre dlments (Items) est infrieur DropDownCount, la liste est suffisamment grande pour afficher tous les lments (Items). ItemHeight : hauteur de chaque lment lorsque le style a pour valeur csOwnerDrawFixed. Sorted : si la valeur est True, la liste des lments (Items) est affiche dans lordre alphabtique.

Affichage dans une bote liste de rfrence et une bote options de rfrence
Les botes liste de rfrence et les botes options de rfrence (TDBLookupListBox et TDBLookupComboBox) proposent lutilisateur une liste limite de choix partir desquels il peut dfinir une valeur de champ correcte. Lorsquil slectionne un lment dans la liste, la valeur de champ correspondante est remplace dans lensemble de donnes sous-jacent. Prenons lexemple dun bon de commande dont les champs sont lis OrdersTable. OrdersTable contient un champ CustNo correspondant un numro dID client, mais OrdersTable ne contient aucune autre information sur le client.

Utilisation de contrles de donnes

15-13

Choix de lorganisation des donnes

CustomersTable, en revanche, contient un champ CustNo correspondant un numro dID client ainsi que des informations supplmentaires, telles que lentreprise et ladresse du client. Lors de la facturation, il serait pratique que le bon de commande permette un employ de slectionner un client daprs le nom de lentreprise au lieu de lID client. Un composant TDBLookupListBox affichant le nom de toutes les entreprises dans CustomersTable permettra un utilisateur de slectionner le nom de lentreprise dans la liste et de placer CustNo sur le bon de commande. Ces contrles de rfrence drivent la liste dlments daffichage depuis lune des deux sources suivantes : Un champ de rfrence dfini pour un ensemble de donnes. Pour sp cifier les lments dune bote liste laide dun champ de rfrence, lensemble de donnes auquel vous liez le contrle doit dj dfinir un champ de rfrence. (Ce processus est dcrit dans Dfinition dun champ de rfrence la page 19-10). Pour spcifier le champ de rfrence pour les lments dune bote liste,

1 Affectez la proprit DataSource de la bote liste la source de donnes de lensemble de donnes contenant le champ de rfrence utiliser. 2 Choisissez le champ de rfrence utiliser dans la liste droulante de la proprit DataField.
Lorsque vous activez une table associe un contrle de rfrence, il identifie son champ de donnes en tant que champ de rfrence et affiche les valeurs appropries. Une cl, un champ de donnes et une source de donnes secondaires. Si vous navez pas dfini de champ de rfrence pour un ensemble de donnes, vous pouvez tablir une relation de mme type laide dune source de donnes secondaire, dune valeur de champ rechercher dans la source de donnes secondaire et dune valeur de champ renvoyer comme lment de liste. Pour spcifier une source de donnes secondaire pour les lments dune bote liste,

3 Affectez la proprit DataSource de la bote liste la source de donnes du contrle. 4 Choisissez un champ pour insrer les valeurs de rfrence depuis la liste droulante de la proprit DataField. Le champ choisi ne doit pas tre un champ de rfrence. 5 Affectez la proprit ListSource de la bote liste la source de lensemble de donnes contenant le champ dont vous voulez rfrencer les valeurs. 6 Pour la proprit KeyField , choisissez dans la liste droulante un champ utiliser comme cl de rfrence. La liste droulante affiche les champs de lensemble de donnes associ la source de donnes spcifie ltape 3. Le champ choisi na pas besoin de faire partie dun index, mais si cest le cas, les performances en seront amliores. 7 Dans la liste droulante de la proprit ListField, choisissez un champ dont les valeurs sont renvoyer. Cette liste droulante affiche les champs de

15-14

Guide du dveloppeur

Choix de lorganisation des donnes

lensemble de donnes associ la source que vous avez spcifie ltape 3. Lorsque vous activez une table associe un contrle de rfrence, il reconnat que les lments de sa liste sont drivs dune source secondaire et affiche des valeurs issues de celle-ci. Pour dfinir le nombre dlments simultanment affichs dans un contrle TDBLookupListBox, utilisez la proprit RowCount. La hauteur de la bote liste sadapte au nombre de lignes dfini. Pour dfinir le nombre dlments affichs dans la liste droulante de TDBLookupComboBox, utilisez la proprit DropDownRows.
Remarque

Vous pouvez galement dfinir une colonne de grille de donnes pour quelle fonctionne comme une bote options de rfrence. Pour plus dinformations sur la manire de procder, voir Dfinition dune colonne de liste de rfrence la page 15-24.

Manipulation de champs boolens avec des cases cocher


TDBCheckBox est un contrle case cocher oriente donnes. Vous pouvez lutiliser pour dfinir les valeurs de champs boolens dans un ensemble de donnes. Par exemple, un formulaire de facture peut comporter une case qui, quand elle est coche, indique que le client est exonr dimpt et, quand elle ne lest pas, indique quil est imposable. Le contrle case cocher orient donnes gre son propre tat (activation ou dsactivation) en comparant le contenu du champ au contenu des propritsValueChecked et ValueUnchecked. Si la valeur de la proprit ValueChecked correspond la valeur du champ, le contrle est activ. Si la valeur de la proprit ValueUnchecked, correspond la valeur du champ, le contrle est dsactiv.
Remarque

Les valeurs des proprits ValueChecked et ValueUnchecked ne peuvent pas tre identiques. Donnez la proprit ValueChecked une valeur que le contrle doit crire dans la base de donnes sil est activ lorsque lutilisateur passe un autre enregistrement. Par dfaut, cette valeur est true, mais vous pouvez la changer en valeur alphanumrique en fonction de vos besoins. Vous pouvez galement entrer une liste dlments dlimits par des points-virgules comme valeur de ValueChecked. Si lun de ces lments correspond au contenu de ce champ dans lenregistrement en cours, la case est active. Par exemple, vous pouvez spcifier une chane ValueChecked comme :
DBCheckBox1.ValueChecked := True;Yes;On;

Si le champ de lenregistrement en cours contient des valeurs true, Yes ou On, cest que la case est active. Aucune distinction majuscules/minuscules nest effectue pendant la comparaison du champ avec les chanes de ValueChecked. Si un utilisateur active une case cocher pour laquelle il y a plusieurs chanes ValueChecked, la premire est la valeur crite dans la base de donnes.

Utilisation de contrles de donnes

15-15

Choix de lorganisation des donnes

Donnez la proprit ValueUnchecked une valeur que le contrle doit crire dans la base de donnes sil nest pas activ lorsque lutilisateur passe un autre enregistrement. Par dfaut, cette valeur est dfinie comme false, mais vous pouvez lui donner nimporte quelle valeur alphanumrique en fonction de vos besoins. Vous pouvez galement entrer une liste dlments dlimits par des points-virgules en tant que valeur de ValueUnchecked. Si lun des lments correspond au contenu de ce champ dans lenregistrement en cours, la case cocher nest pas active. Une case cocher oriente donnes est dsactive chaque fois que le champ de lenregistrement en cours ne contient pas lune des valeurs de la liste des proprits ValueChecked ou ValueUnchecked. Si le champ associ la case cocher est un champ logique, elle est toujours active lorsque le contenu du champ est True et dsactive sil est False. Dans ce cas, les chanes entres dans les proprits ValueChecked et ValueUnchecked sont sans effet sur les champs logiques.

Limitation de valeurs de champ avec des boutons radio


TDBRadioGroup est une version oriente donnes du composant groupe de boutons radio. Il vous permet de dfinir la valeur dun champ de donnes laide dun bouton radio o le nombre de valeurs possibles est limit. Le groupe de boutons radio prsente un bouton radio pour chaque valeur quun champ peut accepter. Les utilisateurs peuvent dfinir la valeur dun champ en slectionnant le bouton radio voulu. La proprit Itemsdtermine les boutons radio devant figurer dans le groupe. Items est une liste de chanes. Un bouton radio est affich pour chaque chane de la proprit Items et chaque chane apparat droite du bouton radio en tant que libell. Si la valeur actuelle dun champ associ un groupe de boutons radio correspond lune des chanes de la proprit Items, ce bouton radio est slectionn. Par exemple, si trois chanes, Rouge, Jaune et Bleu apparaissent dans la liste Items et si le champ de lenregistrement en cours contient la valeur Bleu, le troisime bouton du groupe est slectionn.
Remarque

Si le champ ne correspond aucune des chanes de la liste Items, il est toujours possible de slectionner un bouton radio lorsque le champ correspond une chane de la proprit Values. Si le champ de lenregistrement en cours ne correspond aucune des chanes dItems ou de Values, aucun bouton radio nest slectionn. La proprit Values peut contenir une liste facultative de chanes quil est possible de renvoyer lensemble de donnes quand lutilisateur slectionne un bouton radio et crit un enregistrement dans la base de donnes. Les chanes sont associes aux boutons dans un ordre numrique. La premire chane est associe au premier bouton, la seconde au second bouton et ainsi de suite. Par exemple, supposons que la proprit Items contienne Rouge, Jaune et Bleu et que Values contienne Magenta, Jaune et Cyan. Si un utilisateur slectionne le bouton libell Rouge, Magenta est crit dans la base de donnes.

15-16

Guide du dveloppeur

Choix de lorganisation des donnes

Si aucune chane na t fournie pour Values, la chane Item dun bouton radio slectionn est renvoye la base de donnes au moment o un enregistrement y est crit.

Affichage de plusieurs enregistrements


Il se peut que vous souhaitiez afficher de nombreux enregistrements dans la mme fiche. Par exemple, une application de facturation peut afficher sur la mme fiche toutes les commandes passes par un mme client. Pour afficher plusieurs enregistrements, utilisez un contrle grille. Les contrles grille offrent un affichage champs et enregistrements multiples des donnes qui peut rendre linterface utilisateur de votre application plus attrayante et plus efficace. Les contrles grille sont prsents dans Visualisation et dition des donnes avec un contrle TDBGrid la page 15-18 et Cration dune grille qui contient dautres contrles orients donnes la page 15-32.
Remarque

Vous ne pouvez pas afficher plusieurs enregistrements lorsque vous utilisez un ensemble de donnes unidirectionnel. Vous pouvez concevoir une interface utilisateur qui affiche la fois les champs dun mme enregistrement et les grilles qui reprsentent plusieurs enregistrements. Voici deux modles qui combinent ces deux approches : Fiches matre-dtail : Vous pouvez reprsenter les informations la fois dune table matre et dune table dtail en incluant la fois les contrles qui affichent un champ unique et les contrles grille. Par exemple, vous pouvez afficher les informations sur un client unique et une grille dtail qui affiche les commandes passes par ce client. Pour plus dinformations sur la liaison de tables sous-jacentes dans une fiche matre-dtail, voir Cration de relations matre/dtail la page 18-40 et Etablissement de relations matre/dtail en utilisant des paramtres la page 18-55. Fiches dtail : dans une fiche qui affiche plusieurs enregistrements, vous pouvez inclure des contrles champ unique qui affichent les informations dtailles de lenregistrement slectionn. Cette approche est particulirement utile lorsque les enregistrements incluent de long mmos ou des informations graphiques. Lorsque lutilisateur passe en revue les enregistrements de la grille, le mmo ou le graphique se met jour pour reprsenter la valeur de lenregistrement slectionn. La mise en place de ce dispositif est trs facile. La synchronisation entre les deux affichages est automatique si la grille et le contrle mmo ou image partagent une source de donnes commune.

Astuce

Il est gnralement prfrable de ne pas combiner ces deux approches sur une mme fiche. Il est gnralement dlicat pour les utilisateurs de comprendre les relations entre les donnes de telles fiches.

Utilisation de contrles de donnes

15-17

Visualisation et dition des donnes avec un contrle TDBGrid

Visualisation et dition des donnes avec un contrle TDBGrid


Un contrle TDBGrid permet de visualiser et de modifier les enregistrements dun ensemble de donnes dans un format de type grille tabulaire.
Figure 15.1 Contrle TDBGrid
Champ actif Titres de colonnes

Indicateur denregistrement

Trois facteurs affectent laspect des enregistrements affichs dans un contrle grille : Lexistence dobjets colonne persistante dfinis pour la grille laide de lditeur de colonnes. Les objets colonne persistante offrent une grande flexibilit pour configurer des grilles et dfinir laspect des donnes. Pour plus dinformations sur lutilisation de colonnes persistantes, voir Cration dune grille personnalise la page 15-19. La cration de composants champs persistants pour lensemble de donnes affich dans la grille. Pour plus dinformations sur la cration de ces composants avec lditeur de champs, voir chapitre 19, Manipulation des composants champ . La dfinition du paramtre ObjectView de lensemble de donnes pour laffichage des champs ADT et tableau dans la grille. Voir Affichage des champs ADT et tableau la page 15-26. Le contrle grille dispose dune proprit Columns qui est lenveloppe dun objet TDBGridColumns. TDBGridColumns contient une collection dobjets TColumn reprsentant toutes les colonnes du contrle grille. Vous pouvez utiliser lditeur de colonnes pour configurer les attributs de colonnes lors de la phase de conception, ou bien utiliser la proprit Columns pour accder aux mthodes, vnements et proprits de TDBGridColumns lexcution.

Utilisation dun contrle grille son tat par dfaut


La proprit State de la proprit Columns dune grille indique si des objets colonne persistante existent. Columns.State est une proprit dexcution et est automatiquement dfinie pour la grille. Sa valeur par dfaut est csDefault, ce qui signifie que les objets colonne persistante nexistent pas. Dans ce cas, laffichage des donnes dans la grille est essentiellement dtermin par les proprits des

15-18

Guide du dveloppeur

Visualisation et dition des donnes avec un contrle TDBGrid

champs de lensemble de donnes de la grille ou, en labsence de composants champs persistants, par les valeurs daffichage par dfaut. Lorsque la proprit Columns.State de la grille vaut csDefault, les colonnes des grilles sont gnres dynamiquement partir des champs visibles de lensemble de donnes, et leur ordre dans la grille correspond celui des champs dans lensemble de donnes. Chaque colonne de la grille est associe un composant champ. Les modifications des proprits des composants champ sont immdiatement refltes dans la grille. Il peut tre utile dutiliser un contrle grille ayant des colonnes dynamiquement gnres pour afficher et modifier le contenu de certaines tables slectionnes lexcution. La structure de la grille ntant pas dfinie, elle peut changer en temps rel pour afficher diffrents ensembles de donnes. Une grille unique avec des colonnes dynamiquement gnres peut afficher une table Paradox un certain moment, puis les rsultats dune requte SQL lorsque sa proprit DataSource est modifie, ou lorsque la proprit DataSet de la source des donnes est modifie. Lapparence dune colonne dynamique peut tre modifie lors de la conception ou lexcution ; dans les deux cas, ce sont les proprits correspondantes du composant champ affich dans la colonne que vous modifiez. La dure des proprits des colonnes dynamiques correspond la priode o une colonne est associe un champ particulier dans un ensemble de donnes unique. Par exemple, la modification de la proprit Width dune colonne change la proprit DisplayWidth du champ associ cette colonne. Les modifications de proprits de colonnes non bases sur des proprits de champs, telles que la proprit Font, ne sont valides que pendant lexistence de ces colonnes. Si lensemble de donnes dune grille consiste en un ensemble de composants champs dynamiques, les champs sont dtruits ds la fermeture de lensemble de donnes. Lorsque les composants champs sont dtruits, les colonnes qui leur sont associes sont galement dtruites. Si lensemble de donnes dune grille consiste en un ensemble de composants champs persistants, les composants champs existent mme si lensemble de donnes est ferm, de telle sorte que toutes les colonnes associes ces champs gardent leurs proprits la fermeture de lensemble de donnes.
Remarque

Si la proprit Columns.State dune grille est mise csDefault lexcution, tous les objets colonnes de la grille sont supprims (mme les colonnes persistantes) et les colonnes dynamiques sont reconstruites partir des champs visibles dans lensemble de donnes de la grille.

Cration dune grille personnalise


Une grille personnalise est un contrle pour lequel vous dfinissez des objets colonne persistante dcrivant laspect dune colonne et la mthode daffichage des donnes dans la colonne. Une grille personnalise vous permet de configurer plusieurs grilles pour quelles affichent diverses vues dun mme ensemble de donnes (divers ordres de colonnes, divers choix de champs et diverses couleurs et fontes, par exemple). Une grille personnalise permet aussi aux utilisateurs de

Utilisation de contrles de donnes

15-19

Visualisation et dition des donnes avec un contrle TDBGrid

modifier laspect de la grille lexcution sans affecter les champs utiliss par la grille, ou lordre des champs de lensemble de donnes. Lutilisation des grilles personnalises est conseille avec les ensembles de donnes dont la structure est connue pendant la phase de conception. Comme elles sattendent ce que les noms des champs dfinis la conception existent dans lensemble de donnes, les grilles personnalises ne sont pas adaptes si vous devez utiliser des tables arbitraires slectionnes lexcution.

Prsentation des colonnes persistantes


Lorsque vous crez des objets colonne persistante pour une grille, ils ne sont associs aux champs sous-jacents de lensemble de donnes de la grille que de faon temporaire. Les valeurs par dfaut des proprits des colonnes persistantes sont lues dynamiquement dans la source par dfaut (la grille ou le champ associ, par exemple) jusqu ce quune valeur soit affecte la proprit de la colonne. Tant que vous navez pas affect une valeur une proprit de colonne, sa valeur change si sa source par dfaut change. Ds que vous affectez une valeur une proprit de colonne, elle ne change plus mme si sa source par dfaut change. Par exemple, la source par dfaut dun libell de colonne est la proprit DisplayLabel du champ associ. Si vous modifiez la proprit DisplayLabel, le titre de colonne reflte immdiatement ce changement. Si vous affectez ensuite une chane au libell de la colonne, le titre de la colonne devient indpendant de la proprit DisplayLabel du champ associ. Les modifications de la proprit DisplayLabel du champ ne sont plus reportes dans le titre de la colonne. Les colonnes persistantes sont indpendantes des composants champ qui leur sont associs. De plus, il nest pas ncessaire dassocier les colonnes persistantes des objets champ. Si la proprit FieldName dune colonne persistante est vide, ou si le nom du champ ne correspond aucun champ dans lensemble de donnes actif dans la grille, la proprit Field de la colonne est NULL et la colonne est dessine avec des cellules vides. Si vous surchargez la mthode de dessin par dfaut de la cellule, vous pouvez afficher vos propres informations dans les cellules vides. Par exemple, vous pouvez utiliser une colonne vide pour afficher des valeurs synthtises sur le dernier enregistrement dun groupe denregistrements rcapitul par lagrgat. Vous pouvez aussi afficher un bitmap ou un histogramme reprsentant les donnes de lenregistrement. Il est possible dassocier une ou plusieurs colonnes persistantes au mme champ dun ensemble de donnes. Par exemple, vous pouvez afficher un champ contenant une rfrence darticle droite et gauche dune large grille pour faciliter la recherche dune rfrence en vitant lutilisateur de faire dfiler la grille.
Remarque

Etant donn que les colonnes persistantes nont pas besoin dtre associes un champ dun ensemble de donnes, et tant donn que plusieurs colonnes peuvent rfrencer le mme champ, la valeur de la proprit FieldCount dune grille personnalise peut tre infrieure ou gale au nombre de colonnes dune grille. Notez galement que si la colonne slectionne dans la grille personnalise

15-20

Guide du dveloppeur

Visualisation et dition des donnes avec un contrle TDBGrid

nest pas associe un champ, la proprit SelectedField de la grille est NULL et la proprit SelectedIndex est 1. Les colonnes persistantes peuvent tre configures pour afficher des cellules de grille sous forme de liste droulante dans une bote options de valeurs de rfrence provenant dun autre ensemble de donnes ou dune liste de choix statique, ou sous forme dun bouton points de suspension () dans une cellule, sur laquelle lutilisateur peut cliquer pour lancer des visionneurs de donnes spciaux ou des botes de dialogue en relation avec la cellule en cours.

Cration de colonnes persistantes


Pour personnaliser laspect dune grille lors de la phase de conception, appelez lditeur de colonnes pour crer un ensemble dobjets colonne persistante pour la grille. La proprit State dune grille comportant des objets colonne persistante est automatiquement mise csCustomized. Pour crer des colonnes persistantes pour un contrle de grille,

1 Slectionnez le composant grille dans la fiche. 2 Appelez lditeur de colonnes en double-cliquant sur la proprit Columns de la grille dans linspecteur dobjets.
La bote liste des colonnes affiche les colonnes persistantes dfinies pour la grille slectionne. Lorsque vous ouvrez lditeur de colonnes pour la premire fois, cette liste est vide car la grille est dans son mode par dfaut et ne contient que des colonnes dynamiques. Vous pouvez crer des colonnes pour tous les champs dun ensemble de donnes en une seule fois, ou vous pouvez crer des colonnes persistantes sur une base individuelle. Pour crer des colonnes persistantes pour tous les champs :

1 Cliquez avec le bouton droit de la souris pour appeler le menu contextuel et choisissez la commande Ajouter tous les champs. Si la grille nest associe aucune source de donnes, Ajouter tous les champs est dsactive. Associez la grille avec une source de donnes ayant un ensemble de donnes actif avant de choisir cette commande. 2 Si la grille contient dj des colonnes persistantes, une bote de dialogue vous demande si vous souhaitez supprimer les colonnes existantes. Si vous rpondez Oui, toutes les informations existantes sur les champs persistants sont supprimes et les champs de lensemble de donnes en cours sont insrs selon leur ordre dans lensemble de donnes. Si vous rpondez Non, les champs persistants existants restent intacts, et les nouvelles informations de colonnes bases sur les champs supplmentaires de lensemble de donnes sont ajoutes lensemble de donnes. 3 Cliquez sur la case de fermeture pour appliquer les colonnes persistantes la grille et fermer la bote de dialogue.

Utilisation de contrles de donnes

15-21

Visualisation et dition des donnes avec un contrle TDBGrid

Pour crer des colonnes persistantes individuelles :

1 Choisissez le bouton Ajouter dans lditeur de colonnes. La nouvelle colonne sera slectionne dans la bote liste. Elle porte un numro et un nom par dfaut (comme, 0 - TColumn). 2 Pour associer un champ cette nouvelle colonne, dfinissez la proprit FieldName dans linspecteur dobjets. 3 Pour dfinir le titre de la nouvelle colonne, dveloppez la proprit Title dans linspecteur dobjets et dfinissez son option Caption. 4 Fermez lditeur de colonnes pour appliquer les colonnes persistantes la grille et fermer la bote de dialogue.
Lors de lexcution, vous pouvez passer aux colonnes persistantes en attribuant csCustomized la proprit Columns.State. Toutes les colonnes existantes de la grille sont dtruites et de nouvelles colonnes persistantes sont construites pour chaque champ de lensemble de donnes de la grille. Vous pouvez ensuite ajouter une colonne persistante lors de lexcution en appelant la mthode Add de la liste de colonnes :
DBGrid1.Columns.Add;

Suppression de colonnes persistantes


Il peut tre utile de supprimer une colonne persistante dune grille pour liminer les champs que vous ne souhaitez pas afficher. Pour supprimer une colonne persistante :

1 Double-cliquez sur la grille afin dafficher lditeur de colonnes. 2 Slectionnez le champ supprimer dans la bote liste des colonnes. 3 Cliquez sur Supprimer (vous pouvez aussi utiliser le menu contextuel ou la touche Suppr).
Remarque

Si vous supprimez toutes les colonnes dune grille, la proprit Columns.State revient ltat csDefault et cre automatiquement des colonnes dynamiques pour chaque champ de lensemble de donnes. Pour supprimer une colonne persistante lors de lexcution, il vous suffit de librer lobjet colonne :
DBGrid1.Columns[5].Free;

Modification de lordre des colonnes persistantes


Les colonnes apparaissent dans lditeur de colonnes dans le mme ordre que dans la grille. Vous pouvez modifier lordre des colonnes en faisant un glisserdplacer depuis la bote liste des colonnes. Pour modifier la position dune colonne :

1 Slectionnez la colonne dans la bote liste des colonnes. 2 Faites-la glisser vers son nouvel emplacement dans la bote liste.

15-22

Guide du dveloppeur

Visualisation et dition des donnes avec un contrle TDBGrid

Vous pouvez aussi modifier lordre des colonnes en cliquant sur le titre dune colonne dans la grille elle-mme puis en faisant glisser la colonne jusqu une nouvelle position, comme vous le feriez lexcution.
Remarque

Le dplacement des champs persistants dans lditeur de champs a pour effet de dplacer les colonnes dans une grille par dfaut mais pas dans une grille personnalise. Vous ne pouvez pas, en phase de conception, dplacer des colonnes dans les grilles contenant des colonnes et des champs dynamiques, car aucun lment persistant ne peut enregistrer la modification. Lutilisateur peut, lexcution, utiliser la souris pour faire glisser une colonne un nouvel emplacement de la grille si sa proprit DragModevaut dmManual. Le changement de lordre des colonnes dune grille pour lesquelles la proprit State vaut csDefault, provoque galement la modification de lordre des composants champs dans lensemble de donnes sous-jacent. Lordre des champs dans la table elle-mme nest pas affect. Pour empcher le changement de lordre des colonnes lexcution, il faut mettre la proprit DragMode dmAutomatic. A lexcution, lvnement OnColumnMoved dune grille se dclenche aprs le dplacement dune colonne.

Important

Dfinition des proprits de colonne en mode conception


Les proprits dune colonne dterminent laffichage des donnes dans ses cellules. La plupart des proprits de colonnes hritent leurs valeurs par dfaut des proprits associes un autre composant (appel la source par dfaut), tel quune grille ou un composant champ associ. Pour dfinir les proprits dune colonne, slectionnez la colonne dans lditeur de colonnes et dfinissez ses proprits dans linspecteur dobjets. Le tableau suivant dresse la liste des proprits de colonne pouvant tre dfinies.
Tableau 15.2 Proprit
Alignment ButtonStyle

Proprits de colonne Utilisation


Aligne ( gauche ou droite) ou centre les donnes du champ dans la colonne. Source par dfaut : TField.Alignment. cbsAuto : (valeur par dfaut) affiche une liste droulante si le champ associ est un champ de rfrence, ou si la proprit PickList de la colonne contient des donnes. cbsEllipsis : affiche un bouton points de suspension (...) droite de la cellule. Un clic sur ce bouton dclenche lvnement OnEditButtonClick de la grille. cbsNone : la colonne utilise le contrle de saisie normal pour modifier les donnes contenues dans la colonne. Spcifie la couleur de fond des cellules de la colonne. Source par dfaut : TDBGrid.Color. (Pour dfinir la couleur de fond du texte, utilisez la proprit Font.) Nombre de lignes de texte affiches dans la liste droulante. Par dfaut : 7. Spcifie si la colonne est tendue. Sapplique uniquement aux colonnes reprsentant des champs ADT ou tableau.

Color

DropDownRows Expanded

Utilisation de contrles de donnes

15-23

Visualisation et dition des donnes avec un contrle TDBGrid

Tableau 15.2 Proprit


FieldName ReadOnly Width Font PickList Title

Proprits de colonne (suite) Utilisation


Spcifie le nom du champ associ cette colonne (peut tre vierge). True : les donnes dans la colonne ne sont pas modifiables par lutilisateur. False : (valeur par dfaut) les donnes dans la colonne sont modifiables. Spcifie la largeur de la colonne en pixels. Source par dfaut : TField.DisplayWidth. Spcifie la fonte, la taille et la couleur du texte dans la colonne. Source par dfaut : TDBGrid.Font. Contient une liste de valeurs afficher dans une liste droulante dans la colonne. Dfinit les proprits du titre de la colonne slectionne.

Le tableau ci-dessous rsume les proprits pouvant tre dfinies pour la proprit Title.
Tableau 15.3 Proprit
Alignment Caption Color Font

Proprits disponibles pour la proprit Title Utilisation


Aligne gauche (dfaut), droite, ou centre le libell dans le titre de colonne. Spcifie le texte afficher dans le titre de la colonne. Source par dfaut : TField.DisplayLabel. Spcifie la couleur de fond de la cellule de titre de colonne. Source par dfaut : TDBGrid.FixedColor. Spcifie la fonte, la taille et la couleur du texte dans le titre de la colonne. Source par dfaut : TDBGrid.TitleFont.

Dfinition dune colonne de liste de rfrence


Vous pouvez crer une colonne qui affiche une liste droulante de valeurs, limage dun contrle bote options de rfrence. Pour que la colonne fasse office de bote options, attribuez sa proprit ButtonStyle la valeur cbsAuto. Une fois que vous aurez rempli la liste de valeurs, la grille affiche automatiquement un bouton de bote options lorsquune cellule de cette colonne est en mode Edition. Pour remplir cette liste de valeurs parmi lesquelles lutilisateur pourra effectuer son choix, deux possibilits soffrent vous : Vous pouvez rcuprer les valeurs partir dune table de rfrence. Si vous voulez quune colonne affiche une liste droulante de valeurs extraites dune table de rfrence distincte, vous devez dfinir un champ de rfrence dans lensemble de donnes. Pour plus dinformations sur la cration de champs de rfrence, voir Dfinition dun champ de rfrence la page 19-10. Lorsque le champ de rfrence est dfini, affectez son nom la proprit FieldName de la colonne. La liste droulante est automatiquement remplie avec les valeurs de rfrence dfinies dans le champ de rfrence. Vous pouvez spcifier une liste de valeurs explicitement lors de la conception. Pour entrer les valeurs de la liste la conception, double-cliquez sur la

15-24

Guide du dveloppeur

Visualisation et dition des donnes avec un contrle TDBGrid

proprit PickList de la colonne dans linspecteur dobjets. Cela active lditeur de liste de chanes, dans lequel vous pouvez entrer les valeurs qui constituent la liste de slection de la colonne. Par dfaut, la liste droulante affiche 7 valeurs. Vous pouvez modifier la longueur de cette liste en dfinissant la proprit DropDownRows.
Remarque

Pour restaurer le comportement par dfaut dune colonne contenant une liste de slection explicite, supprimez tout le texte de la liste de slection laide de lditeur de liste de chane.

Insertion dun bouton dans une colonne


Une colonne peut contenir un bouton points de suspension (), plac droite de lditeur de cellules standard. En cliquant sur la souris ou en appuyant sur Ctrl+Entre, vous dclenchez lvnement OnEditButtonClick de la grille. Vous pouvez utiliser le bouton points de suspension pour ouvrir des fiches contenant des vues plus dtailles des donnes de la colonne. Par exemple, dans une table affichant la synthse des factures mises, vous pouvez intgrer un bouton points de suspension dans la colonne des totaux permettant dafficher une fiche contenant les lments dune facture prcise ou le montant de la TVA, etc. Pour les champs graphiques, vous pouvez utiliser ce bouton pour afficher une fiche contenant limage. Pour doter une colonne dun bouton points de suspension :

1 Slectionnez la colonne dans la bote liste Colonnes. 2 Choisissez cbsEllipsiscomme valeur de la proprit ButtonStyle. 3 Ecrivez un gestionnaire dvnement OnEditButtonClick.

Restauration des valeurs par dfaut dune colonne


A lexcution, vous pouvez tester la proprit AssignedValues dune colonne pour savoir si une proprit de colonne a t explicitement attribu e. Les valeurs non explicitement dfinies sont dynamiquement bases sur les valeurs par dfaut de la grille ou du champ associ. Vous pouvez annuler les modifications de proprits apportes une ou plusieurs colonnes. Dans lditeur de colonnes, slectionnez la ou les colonnes restaurer, puis choisissez Restaurer dfauts dans le menu contextuel. Cette commande provoque lannulation des paramtres de proprits dfinis et restaure les proprits dune colonne aux valeurs des proprits drives du composant champ sous-jacent. A lexcution, Il est possible de redfinir toutes les proprits par dfaut dune colonne en appelant la mthode RestoreDefaults de cette colonne. Vous pouvez aussi redfinir les proprits par dfaut de toutes les colonnes dune grille en appelant la mthode RestoreDefaults de la liste de colonnes :
DBGrid1.Columns.RestoreDefaults;

Utilisation de contrles de donnes

15-25

Visualisation et dition des donnes avec un contrle TDBGrid

Affichage des champs ADT et tableau


Parfois, les champs de lensemble de donnes de la grille ne reprsentent pas de simples valeurs, telles que du texte, des graphiques, des valeurs numriques ou autres. Certains serveurs de bases de donnes autorisent les champs qui englobent des types de donnes simples, tels que les champs ADT ou tableau. Une grille peut afficher les champs composites de deux faons : Elle peut aplanir le champ afin que chacun des types simples qui composent le champ apparaisse en tant que champ spar dans lensemble de donnes. Lorsquun champ composite est aplani, ses composants apparaissent sous forme de champs spars qui refltent leur source commune uniquement si chaque nom de champ est prcd du nom du champ parent commun dans la table de base de donnes sous-jacente. Pour afficher les champs composites comme sils taient aplanis, attribuez la valeur False la proprit ObjectView de lensemble de donnes. Lensemble de donnes stocke les champs composites sous la forme dun ensemble de champs spars et la grille reflte cette organisation en attribuant une colonne chaque composante. Elle peut afficher des champs composites dans une seule colonne, indiquant ainsi quils constituent un seul champ. Vous pouvez alors tendre et rduire la colonne en cliquant sur la flche dans la barre de titre du champ ou en dfinissant la proprit Expanded de la colonne : Lorsquune colonne est tendue, chaque champ enfant apparat dans sa propre sous-colonne et une barre de titre correspondante apparat sous la barre de titre du champ parent. La hauteur de la barre de titre de la grille augmente : la premire ligne fournit le nom du champ composite et la seconde indique ses diffrentes composantes. Les champs qui ne sont pas composites apparaissent avec des barres de titre extra hautes. Cette extension se poursuit pour les composantes qui sont elles-mmes des champs composites (par exemple, une table dtail imbrique dans une autre) et la hauteur de la barre de titre augmente en consquence. Lorsque le champ est rduit, seule la colonne apparat avec une chane non modifiable des champs enfants, spars par des virgules. Pour afficher un champ composite dans une colonne tendue ou rduite, attribuez la valeur True la proprit ObjectView de lensemble de donnes. Lensemble de donnes stocke le champ composite sous la forme dun champ composant unique qui contient un ensemble de sous-champs imbriqu s. La grille reflte cette organisation dans une colonne qui peut tre tendue ou rduite. La figure suivante montre une grille contenant un champ ADT et un champ tableau. La proprit ObjectView de lensemble de donnes a pour valeur False afin que chaque champ enfant dispose dune colonne.

15-26

Guide du dveloppeur

Visualisation et dition des donnes avec un contrle TDBGrid

Figure 15.2 Contrle TDBGrid avec ObjectView dfini False


Champs enfant ADT Champs enfant tableau

Les figures suivantes montrent la grille dote dun champ ADT et dun champ tableau. La premire figure montre les champs rduits. Cet tat ne permet pas de les modifier. La seconde figure montre les champs tendus. Pour tendre et rduire les champs, cliquez sur la flche dans leur barre de titre.
Figure 15.3 Contrle TDBGrid avec Expanded dfini False

Figure 15.4 Contrle TDBGrid avec Expanded dfini True


Colonnes de champs enfant ADT Colonnes de champs enfant tableau

Le tableau suivant numre les proprits qui affectent laffichage des champs ADT et tableau dans un objet TDBGrid :
Tableau 15.4 Proprit
Expandable

Proprits relatives laffichage des champs composites Objet


TColumn

Utilisation
Indique si la colonne peut tre tendue pour afficher les champs enfants dans des colonnes spares et modifiables. (lecture seule) Spcifie si la colonne est tendue. Spcifie le nombre maximum de lignes de titre pouvant apparatre dans la grille.

Expanded MaxTitleRows

TColumn TDBGrid

Utilisation de contrles de donnes

15-27

Visualisation et dition des donnes avec un contrle TDBGrid

Tableau 15.4 Proprit


ObjectView

Proprits relatives laffichage des champs composites (suite) Objet


TDataSet TColumn

Utilisation
Spcifie si les champs apparaissent aplanis, ou dans un mode objet, o chaque champ objet peut tre dvelopp et rduit. Fait rfrence lobjet TColumn auquel appartient la colonne du champ enfant.

ParentColumn

Remarque

Outre des champs ADT et array, certains ensembles de donnes comprennent des champs qui font rfrence un autre ensemble de donnes (champs ensemble de donnes) ou un enregistrement appartenant dautres champs ensemble de donnes (rfrence). Les grilles orientes donnes affichent respectivement ces champs sous les formes Ensemble de donnes ou Rfrence. A lexcution, un bouton points de suspension apparat droite. Le fait de cliquer sur ce bouton active une nouvelle fiche dont la grille affiche le contenu du champ. Dans le cas dun champ ensemble de donnes, cette grille affiche lensemble de donnes correspondant la valeur du champ. Dans le cas dun champ rfrence, cette grille contient une seule ligne qui affiche lenregistrement dun autre ensemble de donnes.

Dfinition des options de la grille


La proprit Options dune grille permet de contrler, la conception, le comportement et laspect de la grille lexcution. Quand un composant grille est plac dans une fiche la conception, la proprit Options de linspecteur dobjets apparat avec un signe + (plus) indiquant qu elle peut tre dveloppe pour afficher une srie de proprits boolennes dfinies individuellement. Pour visualiser et dfinir ces proprits, cliquez sur le signe +. La liste des options apparat dans linspecteur dobjets sous la proprit Options. Le signe + devient un signe - (moins), sur lequel vous pouvez cliquer pour rduire la liste. Le tableau suivant liste les proprits Options pouvant tre dfinies et dcrit leur effet sur la grille lexcution.
Tableau 15.5 Option
dgEditing

Options dtailles des proprits Options du composant TDBGrid Utilisation


True : (valeur par dfaut) interdit la modification, linsertion et la suppression denregistrements dans la grille. False : interdit la modification, linsertion et la suppression denregistrements dans la grille. True : quand un champ est slectionn, il est en mode Edition. False : (valeur par dfaut) un champ nest pas automatiquement en mode Edition sil est slectionn. True : (valeur par dfaut) affiche les noms de champs en haut de la grille. False : laffichage des noms de champs est dsactiv.

dgAlwaysShowEditor

dgTitles

15-28

Guide du dveloppeur

Visualisation et dition des donnes avec un contrle TDBGrid

Tableau 15.5 Option


dgIndicator

Options dtailles des proprits Options du composant TDBGrid (suite) Utilisation


True : (valeur par dfaut) la colonne dindicateur est affiche sur la gauche de la grille et lindicateur denregistrement en cours (une flche gauche de la grille) est activ. A linsertion, la flche se transforme en astrisque et se transforme en I la modification. False : la colonne dindicateur napparat pas. True : (valeur par dfaut) les colonnes peuvent tre redimensionnes en faisant glisser les lignes de colonnes dans la zone de titre. Le redimensionnement modifie la largeur correspondante du composant TField sous-jacent. False : les colonnes de la grille ne peuvent tre redimensionnes. True : (valeur par dfaut) affiche une ligne verticale de sparation entre les colonnes. False : naffiche pas de ligne verticale de sparation entre les colonnes. True : (valeur par dfaut) affiche une ligne horizontale de sparation entre les enregistrements. False : naffiche pas de ligne horizontale de sparation entre les enregistrements.

dgColumnResize

dgColLines

dgRowLines

dgTabs

True : (valeur par dfaut) autorise la tabulation entre les champs des enregistrements. False : la tabulation fait sortir du contrle grille. True : la barre de slection occupe toute la largeur de la grille. False : (valeur par dfaut) la slection dun champ dun enregistrement ne slectionne que ce champ.

dgRowSelect

dgAlwaysShowSelection

True : (valeur par dfaut) la barre de slection de la grille est toujours visible, m me si un autre contrle a la focalisation. False : la barre de slection napparat dans la grille que si la grille a la focalisation. True : (valeur par dfaut) demande la confirmation de la suppression denregistrements (Ctrl+Suppr). False : supprime les enregistrements sans confirmation. True : (valeur par dfaut) annule une insertion en attente lorsque la focalisation quitte la grille. Cela permet dviter des validations involontaires denregistrements vierges ou partiellement vierges. False : permet une insertion en attente dtre valide. True : permet aux utilisateurs de slectionner des lignes non contigus en utilisant les touches Ctrl+Maj ou Maj+flche. False : (valeur par dfaut) ne permet pas lutilisateur de slectionner plusieurs lignes.

dgConfirmDelete

dgCancelOnExit

dgMultiSelect

Saisie de modifications dans la grille


Lors de lexcution, vous pouvez utiliser une grille pour modifier les donnes existantes et pour entrer de nouveaux enregistrements si : La proprit CanModifyde lensemble de donnes est True.

Utilisation de contrles de donnes

15-29

Visualisation et dition des donnes avec un contrle TDBGrid

La proprit ReadOnly de la grille est False. Lorsquun utilisateur modifie un enregistrement de la grille, les modifications apportes chaque champ sont mises dans le tampon interne des enregistrements, et ne sont pas mises (ou valides) tant que lutilisateur nest pas pass un autre enregistrement de la grille. Mme si vous utilisez la souris pour dplacer la focalisation sur un autre contrle de la fiche, la grille ncrit vos modifications que lorsque vous changez denregistrement en cours. Lorsquun enregistrement est crit, le systme vrifie si le statut des composants orients donnes associs lensemble de donnes a t modifi. En cas de problme de mise jour dun champ contenant des donnes modifies, la grille provoque une exception et ne modifie pas lenregistrement.
Remarque

Si votre application place les mises jour en mmoire cache, les modifications apportes aux enregistrements sont uniquement envoyes dans un cache interne. Elles ne sont rpercutes dans la table de base de donnes sous-jacente que lorsque votre application applique les mises jour. Vous pouvez annuler toutes les modifications dun enregistrement en appuyant sur Echap dans un champ avant dactiver un autre enregistrement.

Contrle du dessin de la grille


Le premier niveau de contrle du dessin des cellules de la grille consiste dfinir les proprits des colonnes. La grille utilise par dfaut la fonte, lalignement et la couleur dune colonne pour dessiner les cellules de cette colonne. Le texte des champs de donnes est dessin laide des proprits DisplayFormat et EditFormat du composant champ associ la colonne. Vous pouvez modifier la logique daffichage de la grille en entrant du code dans lvnement OnDrawColumnCell dune grille. Si la proprit DefaultDrawing de la grille est True, le dessin normal est effectu avant que votre vnement OnDrawColumnCell ne soit appel. Votre code peut alors se superposer laffichage par dfaut. Cette fonctionnalit vous sera utile si vous avez dfini une colonne persistante vierge et dsirez ajouter des graphiques dans les cellules de cette colonne. Si vous souhaitez remplacer la logique de dessin de la grille, mettez DefaultDrawing False et placez le code dans lvnement OnDrawColumnCell de la grille. Si vous dsirez remplacer la logique de dessin pour certaines colonnes ou certains types de donnes, vous pouvez appeler DefaultDrawColumnCell depuis votre gestionnaire dvnement OnDrawColumnCell pour que la grille utilise son code de dessin normal pour les colonnes slectionnes. Ceci rduit votre travail si vous ne voulez modifier que la faon dont les champs logiques sont dessins, par exemple.

15-30

Guide du dveloppeur

Visualisation et dition des donnes avec un contrle TDBGrid

Comment rpondre aux actions de lutilisateur lexcution


Le comportement de la grille peut tre modifi en crivant des gestionnaires dvnements rpondant des actions spcifiques dans la grille. Une grille affichant en gnral plusieurs champs et enregistrements de faon simultane, des besoins trs spcifiques peuvent intervenir dans la rponse des modifications de colonnes. Il est possible, par exemple, dactiver ou de dsactiver un bouton de la fiche chaque fois que lutilisateur entre ou sort dune colonne particulire. Le tableau suivant liste les vnements dun contrle grille disponibles dans linspecteur dobjets.
Tableau 15.6 Ev nement
OnCellClick OnColEnter OnColExit OnColumnMoved OnDblClick OnDragDrop OnDragOver OnDrawColumnCell OnDrawDataCell OnEditButtonClick OnEndDrag OnEnter OnExit OnKeyDown OnKeyPress OnKeyUp OnStartDrag OnTitleClick

Evnements dun contrle grille Utilisation


Spcifie laction lancer lorsquun utilisateur clique sur une cellule de la grille. Spcifie laction lancer lorsque lutilisateur se place dans une colonne de la grille. Spcifie laction lancer lorsque lutilisateur quitte une colonne de la grille. Appel lorsque lutilisateur dplace une colonne. Spcifie laction lancer lorsque lutilisateur double-clique dans la grille. Spcifie laction lancer lorsque lutilisateur se sert du glisser-dplacer dans la grille. Spcifie laction lancer lorsque lutilisateur fait glisser la slection sur la grille. Appel pour dessiner des cellules individuelles. (obsolte) Dans les grilles pour lesquelles State = csDefault, appel pour dessiner des cellules individuelles. Appel quand lutilisateur clique sur un bouton points de suspension (...) dans une colonne. Spcifie laction lancer lorsque lutilisateur arrte de faire glisser la slection sur la grille. Spcifie laction lancer lorsque la grille reoit la focalisation. Spcifie laction lancer lorsque la grille perd la focalisation. Spcifie laction lancer lorsque lutilisateur appuie sur une touche ou une combinaison de touches du clavier dans la grille. Spcifie laction lancer lorsque lutilisateur appuie sur une touche alphanum rique du clavier dans la grille. Spcifie laction lancer lorsque lutilisateur relche une touche du clavier dans la grille. Spcifie laction lancer lorsque lutilisateur dmarre un glisserdplacer sur la grille. Spcifiez laction lancer lorsquun utilisateur clique sur le titre dune colonne.

Utilisation de contrles de donnes

15-31

Cration dune grille qui contient dautres contrles orients donnes

Il y a de nombreuses utilisations possibles pour ces vnements. Par exemple, il est possible dcrire pour lvnement OnDblClick, un gestionnaire qui fasse apparatre une liste surgissante dans laquelle lutilisateur peut choisir la valeur entrer dans la colonne. Un tel gestionnaire utiliserait la proprit SelectedField pour dterminer la ligne et la colonne actives.

Cration dune grille qui contient dautres contrles orients donnes


Un contrle TDBCtrlGrid affiche plusieurs champs de plusieurs enregistrements dans un format de type grille tabulaire. Chaque cellule de la grille affiche plusieurs champs dune ligne. Pour utiliser une grille de contrle de base de donnes :

1 Placez une grille de contrle de base de donnes sur la fiche. 2 Donnez la proprit DataSource le nom de la source de donnes. 3 Placez des contrles de donnes dans la cellule de conception de la grille. (la cellule qui se trouve le plus haut ou le plus gauche de la grille, la seule dans laquelle vous puissiez placer des contrles). 4 Donnez la proprit DataField de chaque contrle de donnes le nom dun champ. La source de donnes de ces contrles est dj dfinie comme la source de la grille de contrle de base de donnes. 5 Disposez les contrles dans la cellule comme vous lentendez.
Lorsque vous compilez et excutez une application contenant une grille de contrle de base de donnes, la disposition des contrles orients donnes dans la cellule de conception (dfinie lexcution) est duplique dans chaque cellule de la grille. Chaque cellule affiche un enregistrement distinct dun ensemble de donnes.
Figure 15.5 TDBCtrlGrid en mode conception

15-32

Guide du dveloppeur

Navigation et manipulation denregistrements

Le tableau ci-dessous rsume les proprits uniques des grilles de contrle de base de donnes que vous pouvez dfinir en phase de conception :
Tableau 15.7 Proprit
AllowDelete AllowInsert ColCount Orientation PanelHeight PanelWidth RowCount ShowFocus

Proprits dune grille de contrle de base de donnes Utilisation


True (par dfaut) : permet la suppression des enregistrements. False : interdit la suppression des enregistrements. True (par dfaut) : permet linsertion denregistrements. False : interdit linsertion denregistrements. Dfinit le nombre de colonnes dans la grille (1 par dfaut). goVertical (par dfaut) : affiche les enregistrements de haut en bas. goHorizontal: affiche les enregistrements de gauche droite. Dfinit la hauteur dun volet (72 par dfaut). Dfinit la largeur dun volet (200 par dfaut). Dfinit le nombre de volets afficher (3 par dfaut). True (par dfaut) : affiche, lexcution, un rectangle de focalisation autour du volet de lenregistrement en cours. False : naffiche pas de rectangle de focalisation.

Pour plus dinformations sur les proprits et les mthodes des grilles de contrle de base de donnes, voir la Rfrence VCL en ligne.

Navigation et manipulation denregistrements


TDBNavigator est un contrle simple permettant lutilisateur de naviguer parmi les enregistrements dun ensemble de donnes et de les manipuler. Le navigateur se compose dune srie de boutons permettant lutilisateur de faire dfiler vers lavant ou vers larrire des enregistrements, un par un, daller directement au premier ou au dernier, dinsrer un nouvel enregistrement, de mettre jour un enregistrement existant, dcrire des modifications ou den annuler, de supprimer un enregistrement ou de rafrachir laffichage. La figure suivante montre le navigateur tel quil apparat par dfaut lorsque vous le placez sur une fiche lors de la conception. Le navigateur se compose dune srie de boutons permettant lutilisateur de naviguer dun enregistrement lautre dans un ensemble de donnes, et de modifier, supprimer, insrer et valider des enregistrements. La proprit VisibleButtonsdu navigateur vous permet dafficher ou de cacher dynamiquement un sous-ensemble de ces boutons.

Utilisation de contrles de donnes

15-33

Navigation et manipulation denregistrements

Figure 15.6 Boutons de TDBNavigator


Ins. enreg. Enreg. suiv. 1er enreg. Enreg. prc. Dernier enr. Edit. enreg. actif Suppr. enreg. actif Ecriture dition Rafrachissement Annulation ddition

Le tableau ci-dessous donne la description des boutons du navigateur.


Tableau 15.8 Bouton
Premier Prcdent Suivant Dernier Insertion

Boutons TDBNavigator Utilisation


Fait appel la mthode First de lensemble de donnes pour que le premier enregistrement de lensemble de donnes devienne lenregistrement en cours. Fait appel la mthode Prior de lensemble de donnes pour que lenregistrement prcdent devienne lenregistrement en cours. Fait appel la mthode Next de lensemble de donnes pour que lenregistrement suivant devienne lenregistrement en cours. Fait appel la mthode Last de lensemble de donnes pour que le dernier enregistrement devienne lenregistrement en cours. Fait appel la mthode Insert de lensemble de donnes pour insrer un nouvel enregistrement avant lenregistrement en cours et placer lensemble de donnes en mode Insertion. Supprime lenregistrement en cours. Si la proprit ConfirmDelete est True, il est demand confirmation avant la suppression. Place lensemble de donnes en mode Edition afin de pouvoir modifier lenregistrement en cours. Ecrit les modifications dans lenregistrement en cours dans la base de donnes. Annule ldition de lenregistrement en cours, et replace lensemble de donnes ltat Visualisation. Vide les tampons daffichage du contrle orient donnes, puis les rafrachit partir de la table ou de la requte physique. Utile si les donnes sous-jacentes ont pu tre modifies par une autre application.

Suppression Edition Ecriture Annulation Rafrachissement

Choix des boutons visibles


Lorsque vous placez un composant TDBNavigator sur une fiche, tous ses boutons sont visibles par dfaut. Vous pouvez utiliser la proprit VisibleButtons pour les dsactiver si vous ne comptez pas les utiliser sur une fiche. Par exemple, lorsque vous utilisez un ensemble de donnes unidirectionnel,seuls les boutons Premier, Suivant et Rafrachissement sont pertinents. Il peut tre utile de dsactiver les boutons Edition, Insertion, Suppression , Ecriture et Annulation sur une fiche servant parcourir des enregistrements plutt qu les diter.

15-34

Guide du dveloppeur

Navigation et manipulation denregistrements

Affichage et dissimulation des boutons en mode conception


La proprit VisibleButtonsde linspecteur dobjets est suivie du signe + pour indiquer que sa liste doptions peut tre dveloppe. Vous pouvez choisir dafficher une valeur boolenne pour chacun des boutons du navigateur. Pour voir ces valeurs et les dfinir, cliquez sur le signe +. La liste des boutons pouvant tre activs ou dsactivs apparat dans linspecteur dobjets en dessous de la proprit VisibleButtons. Le signe + devient un signe - (moins), sur lequel vous pouvez cliquer pour rduire la liste des proprits. La visibilit dun bouton est indique par ltat Boolean de sa valeur. Si cette valeur est True, le bouton apparat dans le composant TDBNavigator. Si elle est False, le bouton est supprim du navigateur lors de la conception et de lexcution.
Remarque

Quand la valeur dun bouton est False, il est supprim du composant TDBNavigator et tous les autres boutons sagrandissent pour occuper toute la largeur du contrle. Vous pouvez faire glisser les poignes de celui-ci pour redimensionner les boutons.

Affichage et dissimulation des boutons lexcution


Lors de lexcution, vous avez la possibilit de masquer ou dafficher les boutons du navigateur en rponse aux actions de lutilisateur ou aux tats de lapplication. Supposons, par exemple, que vous fournissiez un seul navigateur pour consulter deux ensembles de donnes, lun permettant aux utilisateurs dditer les enregistrements, lautre tant en lecture seulement. Lorsque vous passez de lun lautre, vous devez masquer les boutons Insertion, Suppression, Edition, Ecriture, Annulation et Rafrachissement pour le second ensemble de donnes et les afficher pour le premier. Supposons que vous vouliez empcher toute dition dOrdersTable en masquant les boutons Insertion, Suppression, Edition, Ecriture, Annulation et Rafrachissement du navigateur, mais que vous vouliez permettre en mme temps ldition de CustomersTable. La proprit VisibleButtons dtermine quels sont les boutons affichs dans le navigateur. Voici comment ajouter le code ncessaire au gestionnaire dvnementOnEntercod pralablement :
procedure TForm1.CustomerCompanyEnter(Sender :TObject); begin if Sender = CustomerCompany then begin DBNavigatorAll.DataSource := CustomerCompany.DataSource; DBNavigatorAll.VisibleButtons := [nbFirst,nbPrior,nbNext,nbLast]; end else begin DBNavigatorAll.DataSource := OrderNum.DataSource; DBNavigatorAll.VisibleButtons := DBNavigatorAll.VisibleButtons + [nbInsert, nbDelete,nbEdit,nbPost,nbCancel,nbRefresh]; end; end;

Utilisation de contrles de donnes

15-35

Navigation et manipulation denregistrements

Affichage de panneaux dinformation


Pour afficher un panneau dinformation pour chaque bouton du navigateur lexcution, attribuez la propritShowHint la valeur True. Quand ShowHint a la valeur True, le navigateur affichera alors des panneaux dinformation lorsque vous ferez passer le curseur sur les boutons. Par dfaut ShowHint est False. La proprit Hints contrle le texte des panneaux dinformation des boutons. Par dfaut, Hints est une liste de chanes vide. Quand Hints est vide, un texte daide saffiche par dfaut pour chaque bouton. Pour personnaliser ces panneaux dinformation, utilisez lditeur de liste de chanes et saisissez une ligne de texte distincte pour chaque bouton dans la proprit Hints. Lorsquelles sont prsentes, ces chanes ont priorit sur les chanes par dfaut du navigateur.

Utilisation dun navigateur pour plusieurs ensembles de donnes


Comme pour les autres contrles orients donnes, la proprit DataSource dun navigateur spcifie la source de donnes qui lie le contrle un ensemble de donnes. En changeant la proprit DataSource dun navigateur lors de lexcution, vous pouvez faire en sorte quun mme navigateur procure des fonctions de navigation pour plusieurs ensembles de donnes. Supposons quune fiche contienne deux contrles DBEdit lis aux ensembles de donnes CustomerTable et OrdersTable via respectivement les sources de donnes CustomersSource et OrdersSource. Lorsquun utilisateur accde au contrle ddition connect CustomersSource, le navigateur doit galement utiliser CustomersSource ; et quand lutilisateur accde au contrle ddition connect OrdersSource, le navigateur doit basculer OrdersSource. Vous pouvez coder un gestionnaire dvnement OnEnter pour lun des contrles ddition, puis le partager avec lautre contrle ddition. Par exemple :
procedure TForm1.CustomerCompanyEnter(Sender :TObject); begin if Sender = CustomerCompany then DBNavigatorAll.DataSource := CustomerCompany.DataSource else DBNavigatorAll.DataSource := OrderNum.DataSource; end;

15-36

Guide du dveloppeur

16
Chapitre 16

Chapitre

Utilisation de composants daide la dcision

Les composants daide la dcision permettent de crer des graphes et des tableaux de rfrences croises pour visualiser et analyser des donnes selon diffrentes perspectives. Pour plus dinformations sur les rfrences croises, voir Prsentation des rfrences croises la page 16-2.

Prsentation
Les composants daide la dcision apparaissent sur la page Decision Cube de la palette des composants : Le cube de dcision, TDecisionCube, est un lieu de stockage de donnes multidimensionnelles. La source de dcision, TDecisionSource, dfinit ltat actuel du pivot dune grille ou dun graphe de dcision. La requte de dcision, TDecisionQuery, est une forme spcialise de TQuery utilise pour dfinir les donnes dun cube de dcision. Le pivot de dcision, TDecisionPivot, vous permet douvrir et de fermer les dimensions, ou champs, dun cube de dcision, en appuyant sur des boutons. La grille de dcision, TDecisionGrid, affiche des donnes unidimensionnelles ou multidimensionnelles sous forme dun tableau. Le graphe de dcision, TDecisionGraph, affiche les champs en provenance dune grille de dcision sous forme dun graphe dynamique, qui change lorsque les dimensions des donnes sont modifies. La figure suivante montre tous les composants daide la dcision placs dans une fiche au moment de la conception.

Utilisation de composants daide la dcision

16-1

Prsentation des rfrences croises

Figure 16.1 Composants daide la dcision au moment de la conception


Requte de dcision Cube de dcision Source de dcision

Pivot de dcision

Grille de dcision

Graphe de dcision

Prsentation des rfrences croises


Les rfrences croises sont une faon de prsenter des sous-ensembles de donnes afin de mettre en vidence des relations ou des tendances. Les champs des tables deviennent les dimensions de la rfrence croise tandis que les valeurs des champs dfinissent les catgories et les calculs rcapitulatifs dans chaque dimension. Vous pouvez utiliser les composants daide la dcision pour dfinir des rfrences croises dans les fiches. TDecisionGrid reprsente les donnes dans un tableau, tandis que TDecisionGraph les reprsente dans un graphe. TDecisionPivot possde des boutons pour afficher ou cacher des dimensions et pour les permuter entre lignes et colonnes. Les rfrences croises peuvent avoir une ou plusieurs dimensions.

16-2

Guide du dveloppeur

Instructions relatives lutilisation de composants daide la dcision

Rfrences croises une dimension


Les rfrences croises une dimension montrent une ligne (ou une colonne) rcapitulative des catgories dune seule dimension. Par exemple, si Payment est la dimension colonne choisie et si AmountPaid est le champ rcapitulatif, la rfrence croise de la figure suivante montre le montant pay avec chaque mthode.
Figure 16.2 Rfrence croise une seule dimension

Rfrences croises plusieurs dimensions


Les rfrences croises multidimensionnelles utilisent des dimensions supplmentaires pour les lignes et/ou les colonnes. Par exemple, une rfrence croise deux dimensions pourrait montrer le montant pay par mode de rglement pour chaque pays. Une rfrence croise trois dimensions pourrait montrer le montant pay (AmountPaid) par mode de rglement (Payment) et par chance (Terms) pour chaque pays (Country), comme le montre la figure suivante.
Figure 16.3 Rfrence croise trois dimensions

Instructions relatives lutilisation de composants daide la dcision


Les composants daide la dcision dont la liste est la page 16-1 peuvent tre utiliss ensemble pour prsenter des donnes multidimensionnelles sous forme de tableaux et de graphes. Plusieurs grilles ou graphes peuvent tre attachs chacun des ensembles de donnes. Plusieurs instances de TDecisionPivot peuvent tre utilises pour afficher les donnes sous diffrents angles lexcution.

Utilisation de composants daide la dcision

16-3

Instructions relatives lutilisation de composants daide la dcision

Pour crer une fiche avec des tableaux et des graphes de donnes multidimensionnelles, suivez ces tapes :

1 Crez une fiche. 2 Ajoutez ces composants la fiche et utilisez linspecteur dobjets pour les lier comme indiqu :
un ensemble de donnes, habituellement TDecisionQuery (pour plus de dtails, reportez-vous Cration densembles de donnes de dcision avec lditeur de requte de dcision la page 16-6) ou TQuery ; un cube de dcision, TDecisionCube, li lensemble de donnes en dfinissant la proprit DataSet du cube de dcision par le nom de lensemble de donnes ; une source de dcision, TDecisionSource, lie au cube de dcision en dfinissant la proprit DecisionCube de la source de dcision par le nom du cube de dcision.

3 Ajoutez un pivot de dcision, TDecisionPivot, et liez-le la source de dcision dans linspecteur dobjets en dfinissant la proprit DecisionSource du pivot par le nom de la source de dcision. Le pivot de dcision est facultatif mais utile ; il permet au dveloppeur de fiches et lutilisateur final de changer les dimensions affiches dans les grilles ou les graphes de dcision en appuyant sur des boutons.
Dans son orientation par dfaut (horizontale), les boutons de gauche du pivot de dcision correspondent aux champs de gauche de la grille de dcision (les lignes) ; les boutons de droite correspondent aux champs du haut de la grille de dcision (les colonnes). Vous pouvez dterminer lendroit o apparaissent les boutons du pivot de dcision en dfinissant sa proprit GroupLayout par xtVertical, xtLeftTop ou xtHorizontal (la valeur par dfaut). Pour plus dinformations sur les proprits du pivot de dcision, reportez-vous Utilisation de pivots de dcision la page 16-10.

4 Ajoutez un ou plusieurs graphes et/ou grilles de dcision, lis la source de dcision. Pour plus de dtails, reportez-vous Cration et utilisation de grilles de dcision la page 16-11 et Cration et utilisation de graphes de dcision la page 16-14. 5 Utilisez lditeur de requte de dcision ou la proprit SQL de TDecisionQuery (ou TQuery) pour spcifier les tables, les champs et les calculs rcapitulatifs afficher dans la grille ou dans le graphe. Le dernier champ de SQL SELECT peut tre un champ rcapitulatif. Les autres champs de SELECT doivent tre des champs GROUP BY. Pour en savoir plus, reportez-vous Cration densembles de donnes de dcision avec lditeur de requte de dcision la page 16-6. 6 Dfinissez la proprit Active de la requte de dcision (ou dun autre composant ensemble de donnes) True.

16-4

Guide du dveloppeur

Utilisation densembles de donnes avec les composants daide la dcision

7 Utilisez la grille et le graphe de dcision pour montrer et reprsenter graphiquement les diffrentes dimensions des donnes. Reportez-vous Utilisation de grilles de dcision la page 16-12 et Utilisation de graphes de dcision la page 16-15, pour avoir des instructions et des suggestions.
Pour voir une illustration dans une fiche de tous les composants daide la dcision, reportez-vous la figure 16.1 la page 16-2.

Utilisation densembles de donnes avec les composants daide la dcision


Le seul composant daide la dcision liant directement un ensemble de donnes un cube de dcision est TDecisionCube. Le composant TDecisionCube sattend recevoir des donnes dont les groupes et les calculs rcapitulatifs ont t dfinis par une instruction SQL dun format acceptable. La phrase GROUP BY doit contenir les mmes champs non rcapitulatifs (et dans le mme ordre) que la phrase SELECT. Les champs rcapitulatifs doivent tre identifis. Le composant requte de dcision, TDecisionQuery, est une forme spcialise de TQuery. Vous pouvez utiliser TDecisionQuery pour dfinir de manire plus simple les dimensions (lignes et colonnes) et les valeurs rcapitulatives utilises pour fournir des donnes aux cubes de dcision (TDecisionCube) . Vous pouvez aussi utiliser un TQuery ordinaire ou un autre ensemble de donnes BDE, comme ensemble de donnes pour TDecisionCube, mais la configuration correcte de lensemble de donnes et de TDecisionCube est ds lors la charge du concepteur. Pour fonctionner correctement avec un cube de dcision, tous les champs de lensemble de donnes doivent tre soit des dimensions, soit des champs rcapitulatifs. Les rcapitulations doivent tre de type additif (comme la somme des valeurs ou le nombre de valeurs) et sappliquent chaque combinaison de valeurs des dimensions. Pour faciliter la configuration, les noms des sommes de lensemble de donnes peuvent commencer par Sum... tandis que ceux des dnombrements peuvent commencer par Count.... Le cube de dcision ne peut pivoter, faire le sous-total ou forer que pour les rcapitulatifs dont les cellules sont additives (SUM et COUNT sont additives alors que AVERAGE, MAX et MIN ne le sont pas). Ne concevez danalyse croise que pour les grilles qui contiennent uniquement des agrgats additifs. Si vous utilisez des agrgats non additifs, utilisez une grille de dcision statique qui neffectue pas de pivot, de sous-total ou de forage. Comme la moyenne peut tre calcule en divisant SUM par COUNT, une moyenne du pivot est ajoute automatiquement quand les dimensions SUM et COUNT dun champ sont places dans lensemble de donnes. Utilisez ce type de moyenne de prfrence celle calcule par linstruction AVERAGE. Il est galement possible de calculer des moyennes en utilisant COUNT(*). Pour utiliser COUNT(*) afin de calculer des moyennes, placez un slecteur COUNT(*) COUNTALL dans la requte. Si vous utilisez COUNT(*) pour calculer des

Utilisation de composants daide la dcision

16-5

Utilisation densembles de donnes avec les composants daide la dcision

moyennes, lagrgat peut tre utilis pour tous les champs. Nutilisez COUNT(*) que dans les cas o aucun des champs ne peut contenir de valeurs vierges ou si loprateur COUNT nest pas disponible pour tous les champs.

Cration densembles de donnes de dcision avec TQuery ou TTable


Si vous utilisez un composant TQuery ordinaire comme ensemble de donnes de dcision, vous devez configurer manuellement linstruction SQL, en fournissant une phrase GROUP BY qui contienne les mmes champs (et dans le mme ordre) que la phrase SELECT. Linstruction SQL doit ressembler ce qui suit :
SELECT ORDERS."Terms", ORDERS."ShipVIA", ORDERS."PaymentMethod", SUM( ORDERS."AmountPaid" ) FROM "ORDERS.DB" ORDERS GROUP BY ORDERS."Terms", ORDERS."ShipVIA", ORDERS."PaymentMethod"

Lordre des champs dans linstruction SELECT doit correspondre lordre des champs de GROUP BY. Avec TTable, vous devez spcifier au cube de dcision les informations sur les champs de la requte qui servent de regroupement et ceux servant de rcapitulatifs. Pour ce faire, remplissez la zone Type de dimension pour chaque champ du DimensionMap du cube de dcision. Il faut spcifier pour chaque champ si cest une dimension ou un rcapitulatif et dans ce cas le type de rcapitulatif. Comme le calcul de moyenne de pivot dpend du calcul SUM/ COUNT, il faut galement spcifier le nom de champ de base afin de permettre au cube de dcision dassocier les paires de rcapitulatifs SUM et COUNT.

Cration densembles de donnes de dcision avec lditeur de requte de dcision


Toutes les donnes utilises par les composants daide la dcision passent par le cube de dcision, qui accepte un ensemble de donnes spcialement format, le plus souvent produit par une requte SQL. Pour plus dinformations, voir Utilisation densembles de donnes avec les composants daide la dcision la page 16-5. Bien que TTable et TQuery puissent tre utiliss comme ensembles de donnes de dcision, il est plus facile dutiliser TDecisionQuery; ; lditeur de requte de dcision, fourni avec lui, peut tre utilis pour spcifier les tables, les champs et les calculs rcapitulatifs qui apparatront dans le cube de dcision, et vous aidera configurer correctement les parties SELECT et GROUP BY de linstruction SQL. Pour utiliser lditeur de requte de dcision :

1 Slectionnez le composant requ te de dcision dans la fiche, puis cliquez avec le bouton droit de la souris et choisissez Editeur de requte de dcision. La bote de dialogue Editeur de requte de dcision apparat.

16-6

Guide du dveloppeur

Utilisation des cubes de dcision

2 Choisissez la base de donnes utiliser. 3 Pour des requtes sur une seule table, cliquez Slection des tables et champs.
Pour les requtes complexes mettant en uvre des jointures multitables, cliquez sur le bouton Constructeur de requtes pour afficher le constructeur SQL ou tapez linstruction SQL dans la bote de saisie de la page donglet SQL.

4 Revenez la bote de dialogue Editeur de requte de dcision. 5 Dans la bote de dialogue Editeur de requte de dcision, slectionnez les champs dans la bote liste des champs disponibles et placez-les dans Dimensions ou Rcapitulatifs en cliquant sur le bouton flche droite appropri. A mesure que vous ajoutez des champs dans la liste Rcapitulatifs, slectionnez dans le menu affich le type de rcapitulatif utiliser : somme, nombre ou moyenne. 6 Par dfaut, tous les champs et calculs rcapitulatifs dfinis dans la proprit SQL de la requ te de dcision apparaissent dans les botes liste Dimensions et Rcapitulatifs. Pour supprimer une dimension ou un rcapitulatif, slectionnez llment dans la liste et cliquez sur la flche gauche situe ct de la liste, ou double-cliquez sur llment supprimer. Pour lajouter nouveau, slectionnez-le dans la bote liste des champs disponibles et cliquez sur la flche droite approprie.
Lorsque le contenu de la requte de dcision est dfini, vous pouvez manipuler ensuite laffichage des dimensions avec la proprit DimensionMap et les boutons de TDecisionPivot. Pour plus dinformations, voir la section suivante, Utilisation des cubes de dcision, Utilisation de sources de dcision la page 16-10, et Utilisation de pivots de dcision la page 16-10.
Remarque

Quand vous utilisez lditeur de requte de dcision, la requte est initialement gre en utilisant la syntaxe SQL ANSI-92 puis, si cest ncessaire, elle est ensuite traduite dans le dialecte utilis par le serveur. Lditeur ne lit et naffiche que du SQL ANSI standard. La traduction dans le dialecte appropri est affecte automatiquement la proprit SQL du TDecisionQuery. Pour modifier une requte, ditez la version ANSI-92 dans lditeur et pas celle contenue dans la proprit SQL.

Utilisation des cubes de dcision


Le composant cube de dcision, TDecisionCube, est un lieu de stockage de donnes multidimensionnelles qui extrait ses donnes dun ensemble de donnes (gnralement une instruction SQL sp cialement structure et entre via TDecisionQuery ou TQuery). Les donnes sont stockes dune faon qui permet de les rorganiser ou deffectuer dautres calculs rcapitulatifs sans avoir besoin de lancer la requte une seconde fois.

Utilisation de composants daide la dcision

16-7

Utilisation des cubes de dcision

Proprits et vnements des cubes de dcision


Les proprits DimensionMap de TDecisionCube ne contrlent pas seulement les dimensions et les champs rcapitulatifs qui apparaissent, mais permettent aussi de dfinir des plages de donnes ou de spcifier le nombre maximal de dimensions que le cube de dcision pourra supporter. Vous pouvez aussi indiquer dafficher ou non les donnes au cours de la conception. Vous pouvez afficher les noms, les valeurs (catgories), les sous-totaux ou les donnes. Laffichage des donnes pendant la conception peut prendre du temps, selon la source des donnes. Lorsque vous cliquez sur les points de suspension en regard de DimensionMap, dans linspecteur dobjets, la bote de dialogue Editeur de cube de dcision apparat. Vous pouvez utiliser ses pages et ses contrles pour dfinir les proprits DimensionMap. Lvnement OnRefresh est dclench chaque fois quest reconstruit le cache du cube de dcision. Les dveloppeurs peuvent accder aux nouvelles valeurs des proprits DimensionMap et les changer ce moment-l pour librer la mmoire, changer le nombre maximal de dimensions ou de champs rcapitulatifs, etc. OnRefresh sert galement lorsque les utilisateurs accdent lditeur de cube de dcision ; le code de lapplication peut alors rpondre aux modifications apportes par lutilisateur.

Utilisation de lditeur de cube de dcision


Vous pouvez utiliser lditeur de cube de dcision pour dfinir les proprits DimensionMap des cubes de dcision. Vous pouvez afficher lditeur de cube de dcision via linspecteur dobjets, comme indiqu dans la section prcdente. Vous pouvez aussi cliquer avec le bouton droit sur un cube de dcision dans une fiche au moment de la conception et choisir Editeur de cube de dcision. La bote de dialogue Editeur de cube de dcision possde deux onglets : Paramtres de dimensions, utilis pour activer ou dsactiver les dimensions disponibles, renommer et reformater des dimensions, placer des dimensions dans un tat perfor de manire permanente, et dfinir les plages de valeurs afficher. Contrle de la mmoire, utilis pour dfinir le nombre maximal de dimensions et de champs rcapitulatifs pouvant tre actifs en mme temps, pour afficher des informations sur lutilisation de la mmoire et pour dterminer les noms et les donnes qui apparaissent la conception.

Visualisation et modification des paramtres de dimensions


Pour visualiser les paramtres de dimensions, affichez lditeur de cube de dcision et cliquez sur longlet Paramtres de dimensions. Ensuite, slectionnez une dimension ou un champ rcapitulatif dans la liste des champs disponibles.

16-8

Guide du dveloppeur

Utilisation des cubes de dcision

Ces informations apparaissent dans les botes situes sur le ct droit de lditeur : Pour modifier le nom dune dimension ou dun champ rcapitulatif apparaissant sur le pivot, la grille ou le graphe de dcision, entrez un nouveau nom dans la bote de saisie Nom affiche. Pour savoir si le champ slectionn est une dimension ou un champ rcapitulatif, lisez le texte se trouvant dans la bote de saisie Type. Si lensemble de donnes est un composant TTable, vous pouvez utiliser Type pour spcifier si le champ slectionn est une dimension ou un champ rcapitulatif. Pour dsactiver ou activer la dimension ou le champ rcapitulatif slectionn, modifiez le paramtrage de la bote liste droulante Type actif : Actif, Si besoin ou Inactif. Dsactiver une dimension ou la dfinir par Si besoin conomise de la mmoire. Pour modifier le format de cette dimension ou de ce champ rcapitulatif, entrez une chane de formatage dans la bote de saisie Format. Pour afficher cette dimension ou ce champ rcapitulatif par Anne, Trimestre ou Mois, changez le paramtrage de la bote liste droulante Groupage. Dans la bote liste Groupage, vous pouvez placer la dimension ou le rcapitulatif slectionn dans un tat perfor permanent. Cela peut tre utile pour conomiser de la mmoire lorsquune dimension a de nombreuses valeurs. Pour plus dinformations, voir Considrations relatives au contrle de la mmoire la page 16-21. Pour dterminer le point de dpart des intervalles, commencez par choisir la valeur adapte de regroupement dans la liste droulante Groupage puis entrez la valeur de dpart de lintervalle dans la liste droulante Valeur initiale.

Dfinition du maximum de dimensions et de rcapitulations


Pour dterminer le nombre maximal de dimensions et de champs rcapitulatifs disponibles pour les pivots, les grilles et les graphes lis au cube de dcision slectionn, affichez lditeur de cube de dcision, cliquez sur longlet Contrle de la mmoire et utilisez les contrles de saisie pour ajuster le paramtrage en cours, si ncessaire. Ces paramtres permettent de contrler la quantit de mmoire ncessaire au cube de dcision. Pour plus dinformations, reportez-vous Considrations relatives au contrle de la mmoire la page 16-21.

Visualisation et modification des options de conception


Pour dterminer combien dinformations apparatront lors de la conception, affichez lditeur de cube de dcision, cliquez sur longlet Contrle de la mmoire. Cochez ensuite les paramtres qui indiquent les noms et les donnes afficher. Laffichage des donnes ou des noms des champs lors de la conception peut diminuer les performances dans certains cas cause du temps ncessaire lextraction des donnes.

Utilisation de composants daide la dcision

16-9

Utilisation de sources de dcision

Utilisation de sources de dcision


Le composant source de dcision, TDecisionSource, dfinit ltat en cours des pivots des grilles ou des graphes de dcision. Lorsque deux de ces objets utilisent la mme source de dcision, leurs pivots partagent le mme tat.

Proprits et vnements
Voici les proprits et les vnements spciaux qui contrlent laspect et le comportement des sources de dcision : La proprit ControlType de TDecisionSource indique si les boutons du pivot de dcision doivent agir comme des cases cocher (slections multiples) ou des boutons radio (slections mutuellement exclusives). Les proprits SparseCols et SparseRows de TDecisionSource indiquent si les colonnes ou les lignes sans valeur doivent tre affiches ; si True, les colonnes ou les lignes vides sont affiches. TDecisionSource possde les vnements suivants : OnLayoutChange se produit lorsque lutilisateur effectue des pivotements ou des perforations qui rorganisent les donnes. OnNewDimensions se produit lorsque les donnes elles-mmes sont modifies, par exemple lorsque les champs rcapitulatifs ou les dimensions sont modifis. OnSummaryChange se produit lorsque la valeur rcapitulative en cours est modifie. OnStateChange se produit quand le cube de dcision est activ ou dsactiv. OnBeforePivot se produit lorsque les modifications sont valides mais pas encore refltes par linterface utilisateur. Les dveloppeurs ont la possibilit deffectuer les changements, par exemple de capacit ou de ltat du pivot, avant que lutilisateur de lapplication ne puisse voir le rsultat de son action. OnAfterPivot est dclench aprs une modification de ltat du pivot. Les dveloppeurs peuvent intercepter des informations ce moment.

Utilisation de pivots de dcision


Le composant pivot de dcision, TDecisionPivot, vous permet douvrir ou de fermer les dimensions, ou champs, dun cube de dcision en appuyant sur des boutons. Lorsquune ligne ou une colonne est ouverte en appuyant sur un bouton TDecisionPivot, la dimension correspondante apparat dans le composant TDecisionGrid ou TDecisionGraph. Lorsqu une dimension est ferme, le dtail de ses donnes napparat pas ; elles sintgrent aux totaux des autres dimensions. Une dimension peut aussi tre en tat perfor, tat dans lequel seules les

16-10

Guide du dveloppeur

Cration et utilisation de grilles de dcision

valeurs rcapitulatives pour une catgorie particulire de la dimension apparaissent. Vous pouvez utiliser le pivot de dcision pour rorganiser les dimensions affiches par la grille et le graphe de dcision. Faites simplement glisser un bouton vers la partie des lignes ou celle des colonnes, ou rorganisez les boutons dans la mme partie. Pour voir des illustrations de pivots de dcision pendant la conception, reportezvous aux figures 16.1, 16.2 et 16.3.

Proprits des pivots de dcision


Voici les proprits spciales qui contrlent laspect et le comportement des pivots de dcision : Les premires proprits de TDecisionPivot dfinissent leur aspect et leur comportement gnraux. Vous pouvez dfinir la proprit ButtonAutoSize de TDecisionPivot par False pour empcher la rduction et le dveloppement des boutons lorsque vous ajustez la taille du composant. La proprit Groups de TDecisionPivot dfinit quels boutons de dimensions apparatront. Vous pouvez grouper les boutons de slection des lignes, des colonnes et des champs rcapitulatifs votre gr. Si vous voulez une disposition des groupes plus simple, vous pouvez placer quelque part sur votre fiche un TDecisionPivot contenant uniquement les lignes, et ailleurs un second contenant uniquement les colonnes. Gnralement, TDecisionPivot est ajout au-dessus de TDecisionGrid. Dans cette orientation par dfaut (horizontale), les boutons du ct gauche de TDecisionPivot sappliquent aux champs du ct gauche de TDecisionGrid (lignes) ; les boutons du ct droit sappliquent aux champs du haut de TDecisionGrid (colonnes). Vous pouvez dterminer o apparatront les boutons de TDecisionPivot en dfinissant sa proprit GroupLayout par xtVertical, xtLeftTop ou xtHorizontal (valeur par dfaut dcrite au paragraphe prcdent).

Cration et utilisation de grilles de dcision


Les composants grille de dcision, TDecisionGrid, prsentent des rfrences croises sous forme de tableaux. Ces tableaux de rfrences croises, galement appels tableaux croiss, sont dcrits la page 16-2. 16.1 la page 16-2 montre une grille de dcision place sur une fiche pendant la conception.

Cration de grilles de dcision


Pour crer une fiche contenant un ou plusieurs tableaux de rfrences croises,

1 Suivez les tapes 1 3 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3.

Utilisation de composants daide la dcision

16-11

Cration et utilisation de grilles de dcision

2 Ajoutez un ou plusieurs composants grille de dcision (TDecisionGrid) et dfinissez dans linspecteur dobjets leur proprit DecisionSource par le nom du composant source de dcision, TDecisionSource, auquel vous voulez relier les grilles. 3 Continuez par les tapes 5 7 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3
Pour avoir la description de ce qui apparat dans la grille de dcision et savoir comment lutiliser, lisez Utilisation de grilles de dcision la page 16-12. Pour ajouter un graphe la fiche, suivez les instructions de Cration de graphes de dcision la page 16-14.

Utilisation de grilles de dcision


Le composant grille de dcision, TDecisionGrid, affiche les donnes du cube de dcision (TDecisionCube) li la source de dcision (TDecisionSource). Par dfaut, la grille apparat avec les champs dimension gauche ou en haut selon le groupage dfini dans lensemble de donnes. Les catgories, une pour chaque valeur, apparaissent sous chacun des champs. Vous pouvez : Ouvrir et fermer les dimensions Rorganiser, ou faire pivoter, les lignes et les colonnes Forer pour obtenir les dtails Limiter la slection des dimensions une seule dimension par axe

Pour plus dinformations sur les proprits et les vnements relatifs la grille de dcision, voir Proprits des grilles de dcision la page 16-13.

Ouverture et fermeture des champs dune grille de dcision


Un signe plus (+) apparat dans un champ dimension ou rcapitulatif, quand un ou plusieurs champs sont ferms (cachs) sa droite. Vous pouvez ouvrir dautres champs et dautres catgories en cliquant sur le signe plus. Un signe moins (-) indique un champ compltement ouvert (dvelopp). Lorsque vous cliquez sur le signe moins, le champ se ferme. Cette possibilit de dveloppement peut tre dsactive ; pour plus de dtails, voir Proprits des grilles de dcision la page 16-13.

Rorganisation des lignes et des colonnes dune grille de dcision


Vous pouvez faire glisser des titres de lignes et de colonnes le long du mme axe ou vers dautres axes. Vous pouvez ainsi rorganiser la grille et examiner les donnes sous un angle nouveau, au fur et mesure que vous changez le regroupement des donnes. La possibilit de pivoter peut tre dsactive ; pour plus de dtails, voir Proprits des grilles de dcision la page 16-13. Si vous incluez un pivot de dcision, vous pouvez rorganiser laffichage en appuyant sur ses boutons ou en les faisant glisser. Voir les instructions de Utilisation de pivots de dcision la page 16-10.

16-12

Guide du dveloppeur

Cration et utilisation de grilles de dcision

Perforation pour voir les dtails dans les grilles de dcision


Vous pouvez forer pour voir une dimension en dtail. Par exemple, si vous cliquez avec le bouton droit sur un libell de catgorie (titre de ligne) pour une dimension qui en contient dautres, vous pouvez choisir de forer et de voir uniquement les donnes de cette catgorie. Lorsqu une dimension est perfore, les libells des catgories de cette dimension ne saffichent pas sur la grille, car seuls les enregistrements correspondant une seule catgorie sont affichs. Si vous avez un pivot de dcision sur la fiche, il affiche les valeurs des autres catgories et vous permet den changer. Pour forer dans une dimension, Cliquez avec le bouton droit de la souris sur le libell dune catgorie et choisissez Percer jusqu cette valeur, ou Cliquez avec le bouton droit de la souris sur un bouton du pivot et choisissez Perfor. Pour que la dimension complte soit de nouveau active, Cliquez avec le bouton droit de la souris sur le bouton correspondant du pivot ou bien, cliquez avec le bouton droit de la souris dans le coin suprieur gauche de la grille de dcision et slectionnez la dimension.

Limite des dimensions slectionner dans les grilles de dcision


Vous pouvez changer la proprit ControlType de la source de dcision pour dterminer si plusieurs dimensions peuvent tre slectionnes pour chaque axe de la grille. Pour plus dinformations, voir Utilisation de sources de dcision la page 16-10.

Proprits des grilles de dcision


Le composant grille de dcision, TDecisionGrid, affiche les donnes du composant TDecisionCube li TDecisionSource. Par dfaut, les donnes apparaissent dans une grille avec les champs de catgorie gauche et en haut de la grille. Voici quelques proprits spciales qui contrlent laspect et le comportement des grilles de dcision : TDecisionGrid a des proprits uniques pour chaque dimension. Pour les dfinir, choisissez Dimensions dans linspecteur dobjets, puis slectionnez une dimension. Ses proprits apparaissent alors dans linspecteur dobjets : Alignment dfinit lalignement des libells des catgories de cette dimension, Caption peut remplacer le nom par dfaut de la dimension, Color dfinit la couleur des libells des catgories, FieldName affiche le nom de la dimension active, Format peut contenir tout format standard pour ce type de donnes et Subtotals indique sil faut afficher les sous-totaux pour cette dimension. Ces mmes proprits sont utilises avec les champs rcapitulatifs pour changer laspect des donnes rcapitulatives de la grille. Pour dfinir les proprits des

Utilisation de composants daide la dcision

16-13

Cration et utilisation de graphes de dcision

dimensions, cliquez sur un composant dans la fiche ou choisissez le composant dans la liste droulante situe en haut de linspecteur dobjets. La proprit Options de TDecisionGrid vous permet de contrler laffichage des lignes de la grille (cgGridLines = True), dactiver la fonction de rduction et de dveloppement des dimensions avec les indicateurs + et - (cgOutliner = True) et dactiver la possibilit de pivoter par glisser-dplacer (cgPivotable = True). Lvnement OnDecisionDrawCell de TDecisionGrid vous permet de changer laspect de chaque cellule au moment o elle est dessine. Lvnement passe en tant que paramtres par rfrence les valeurs de String, Font et Color de la cellule en cours. Vous tes libre de modifier ces paramtres pour raliser des effets, par exemple choisir une couleur particulire pour les valeurs ngatives. En plus de la proprit DrawState qui est passe par TCustomGrid, lvnement transmet la valeur de TDecisionDrawState, qui peut tre utilise pour dterminer le type de cellule dessiner. Dautres informations concernant la cellule peuvent tre extraites via les fonctions Cells, CellValueArray ou CellDrawState. Lvnement OnDecisionExamineCell de TDecisionGrid vous permet de connecter lvnement clic-droit aux cellules de donnes, afin de pouvoir afficher des informations (par exemple, des enregistrements dtail) sur une cellule particulire. Lorsque lutilisateur clique avec le bouton droit de la souris sur une cellule, lvnement est fourni avec toutes les informations qui entrent en jeu, cest--dire la valeur rcapitulative en cours et un tableau ValueArray contenant toutes les valeurs de la dimension utilises pour calculer la valeur rcapitulative.

Cration et utilisation de graphes de dcision


Les composants graphe de dcision, TDecisionGraph, prsentent des rfrences croises sous forme de graphes. Chaque graphe de dcision montre la valeur dun seul calcul rcapitulatif, la somme, le nombre ou la moyenne, pour une ou plusieurs dimensions. Pour plus dinformations sur les rfrences croises, voir page 16-3. Pour voir des illustrations sur les graphes de dcision pendant la conception, voir 16.1 la page 16-2 et 16.4 la page 16-16.

Cration de graphes de dcision


Pour crer une fiche ayant un ou plusieurs graphes de dcision,

1 Suivez les tapes 1 3 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3. 2 Ajoutez un ou plusieurs composants graphe de dcision (TDecisionGraph ) et dfinissez dans linspecteur dobjets leur proprit DecisionSource par le nom du composant source de dcision, TDecisionSource, auquel vous voulez relier les graphes.

16-14

Guide du dveloppeur

Cration et utilisation de graphes de dcision

3 Continuez avec les tapes 5 7 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3. 4 Enfin, cliquez avec le bouton droit de la souris sur le graphe et choisissez Modifier le graphe pour changer laspect des sries du graphe. Vous pouvez dfinir des proprits modles pour chaque dimension du graphe, puis dfinir les proprits de chaque srie pour remplacer ces valeurs par dfaut. Pour plus de dtails, voir Personnalisation du graphe de dcision la page 16-17.
Pour avoir la description de ce qui apparat dans le graphe de dcision et savoir comment lutiliser, lisez la section suivante, Utilisation de graphes de dcision. Pour ajouter une grille de dcision (ou tableau crois) la fiche, suivez les instructions de Cration et utilisation de grilles de dcision la page 16-11.

Utilisation de graphes de dcision


Le composant graphe de dcision, TDecisionGraph, affiche les champs de la source de dcision (TDecisionSource) sous forme dun graphe dynamique qui change lorsque les dimensions de donnes sont ouvertes, fermes, dplaces ou rorganises laide du pivot de dcision (TDecisionPivot). Les donnes reprsentes viennent dun ensemble de donnes spcialement format, tel que TDecisionQuery. Pour avoir un aperu de la faon dont les composants daide la dcision grent et disposent ces donnes, voir page 16-1. Par dfaut, la dimension de la premire ligne est reprsente par laxe des x et la dimension de la premire colonne par laxe des y. Vous pouvez utiliser les graphes de dcision la place, ou en plus, des grilles de dcision (qui elles, prsentent les rfrences croises sous forme tabulaire). Les grilles ou les graphes de dcision qui sont lis la mme source de dcision reprsentent les mmes dimensions de donnes. Pour montrer diffrentes donnes rcapitulatives pour les mmes dimensions, vous pouvez lier plusieurs graphes de dcision la mme source de dcision. Pour montrer diffrentes dimensions, liez les graphes de dcision diffrentes sources de dcision. Par exemple, dans la figure suivante, le premier pivot de dcision et le premier graphe sont lis la premire source de dcision alors que le second pivot de dcision et le second graphe sont lis la seconde source de dcision. Chaque graphe peut donc reprsenter des dimensions diffrentes.

Utilisation de composants daide la dcision

16-15

Cration et utilisation de graphes de dcision

Figure 16.4 Graphes de dcision lis diffrentes sources de dcision

Pour plus dinformations sur ce qui apparat dans un graphe de dcision, voir la section suivante, Affichage du graphe de dcision. Pour crer un graphe de dcision, voir la section prcdente, Cration de graphes de dcision. Pour connatre les proprits des graphes de dcision et savoir comment changer laspect et le comportement des graphes de dcision, voir Personnalisation du graphe de dcision la page 16-17.

Affichage du graphe de dcision


Par dfaut, le graphe de dcision reprsente les valeurs rcapitulatives des catgories existant dans le premier champ de la ligne active (le long de laxe des y) par rapport aux valeurs du premier champ de la colonne active (le long de laxe des x). Chaque catgorie est reprsente par une srie. Si une seule dimension est slectionne (par exemple, en cliquant sur un seul bouton de TDecisionPivot), une seule srie est reprsente.

16-16

Guide du dveloppeur

Cration et utilisation de graphes de dcision

Si vous utilisez un pivot de dcision, vous pouvez appuyer sur ses boutons pour dterminer les champs (dimensions) du cube de dcision qui doivent tre reprsents. Pour changer les axes du graphe, faites glisser les boutons de dimension du pivot de dcision de part et dautre de lespace sparateur. Si le graphe est unidimensionnel, avec tous les boutons dun ct de lespace sparateur, vous pouvez utiliser les icnes de lignes ou de colonnes comme cible du dplacement pour ajouter des boutons de lautre ct du sparateur et rendre le graphe multidimensionnel. Si vous voulez quune seule ligne ou quune seule colonne soit active la fois, vous pouvez donner la valeur xtRadio la proprit ControlType de TDecisionSource. Un seul champ pourra alors tre actif la fois, et la fonctionnalit du pivot de dcision correspondra au comportement du graphe. xtRadioEx fonctionne comme xtRadio, mais nautorise pas ltat o les dimensions de toutes les lignes ou de toutes les colonnes sont fermes. Si vous avez la fois une grille et un graphe de dcision connects la mme TDecisionSource, il vaudra mieux dfinir ControlType par xtCheck pour revenir au comportement le plus souple de TDecisionGrid.

Personnalisation du graphe de dcision


Le composant graphe de dcision, TDecisionGraph, affiche les champs de la source de dcision (TDecisionSource) sous forme dun graphe dynamique qui change quand les dimensions sont ouvertes, fermes, dplaces ou rorganises laide du pivot de dcision (TDecisionPivot). Vous pouvez modifier le type, les couleurs, les types de marqueurs des graphes linaires et de nombreuses autres proprits des graphes de dcision. Pour personnaliser un graphe,

1 Cliquez dessus avec le bouton droit de la souris et choisissez Modifier le graphe. La bote de dialogue de modification de graphe apparat. 2 Utilisez la page Graphe de la bote de dialogue de modification de graphe pour voir la liste des sries visibles, slectionner la dfinition de srie utiliser si deux ou plus sont disponibles pour la mme srie, changer le type de graphe dun modle ou dune srie et dfinir les proprits globales du graphe.
La liste Sries de la page Graphe montre toutes les dimensions du cube de dcision (prcdes de Modle:) et les catgories actuellement visibles. Chaque catgorie, ou srie, est un objet spar. Vous pouvez : ajouter ou supprimer des sries drives des sries existantes du graphe. Les sries drives peuvent fournir des annotations pour des sries existantes ou reprsenter des valeurs calcules partir dautres sries ; changer le type de graphe par dfaut et changer le titre des modles et des sries. Vous trouverez dans laide en ligne la description des autres onglets de la page Graphe.

Utilisation de composants daide la dcision

16-17

Cration et utilisation de graphes de dcision

3 Utilisez la page Sries pour tablir les modles de dimensions, puis personnaliser les proprits de chaque srie du graphe.
Par dfaut, les sries sont reprsentes par des barres dhistogramme qui peuvent avoir jusqu 16 couleurs. Vous pouvez modifier le type et les proprits du modle pour crer un nouveau modle par dfaut. Lorsque vous utilisez le pivot pour faire passer la source de dcision par diffrents tats, le modle est utilis pour crer de faon dynamique la srie de chaque nouvel tat. Pour avoir plus de dtails sur les modles, voir Dfinition des modles de graphe de dcision par dfaut la page 16-18. Pour personnaliser une srie individuelle, suivez les instructions de Personnalisation des sries dun graphe de dcision la page 16-19. Vous trouverez dans laide en ligne la description des autres onglets de la page Sries.

Dfinition des modles de graphe de dcision par dfaut


Les graphes de dcision affichent les valeurs provenant de deux dimensions du cube de dcision : lune est reprsente par un axe et lautre est utilise pour crer lensemble des sries. Le modle de cette dimension fournit les valeurs par dfaut des proprits des sries (si la srie est reprsente par une barre, une ligne, une aire, etc.) Au fur et mesure que les utilisateurs pivotent dun tat vers lautre, les sries exiges pour la dimension sont cres en utilisant le type de srie et les autres valeurs par dfaut sp cifies dans le modle. Un modle distinct est fourni pour le cas o les utilisateurs pivotent vers un tat dans lequel une seule dimension est active. Un tat unidimensionnel est souvent reprsent par un graphique sectoriel, et un modle est fourni pour ce cas. Vous pouvez : Changer le type du graphe par dfaut. Changer les autres proprits du modle de graphe. Voir et dfinir les proprits gnrales du graphe.

Changement du type de graphe de dcision par dfaut


Pour changer le type du graphe par dfaut,

1 Slectionnez un modle dans la liste Sries de la page Graphe de la bote de dialogue de modification de graphe. 2 Cliquez sur le bouton Modifier. 3 Slectionnez un nouveau type et fermez la bote de dialogue Galerie.

16-18

Guide du dveloppeur

Cration et utilisation de graphes de dcision

Changement des autres proprits dun modle de graphe de dcision


Pour changer la couleur ou les autres proprits dun modle,

1 Slectionnez la page Sries, en haut de la bote de dialogue de modification de graphe. 2 Choisissez un modle dans la liste droulante en haut de la page. 3 Choisissez longlet correspondant la proprit modifier et faites vos choix.

Visualisation des proprits globales dun graphe de dcision


Pour voir et dfinir les proprits dun graphe de dcision autres que le type ou les sries,

1 Slectionnez la page Graphe en haut de la bote de dialogue de modification de graphe. 2 Choisissez longlet correspondant la proprit modifier et faites vos choix.

Personnalisation des sries dun graphe de dcision


Les modles fournissent de nombreux paramtres par dfaut pour chaque dimension du cube de dcision, tels le type de graphe et la faon dafficher les sries. D autres paramtres par dfaut, tels les couleurs des sries, sont dfinis par TDecisionGraph. Vous pouvez remplacer les paramtres par dfaut de chaque srie. Les modles doivent tre utiliss pour que le programme cre les sries correspondant aux catgories et doivent tre abandonns quand ce nest plus ncessaire. Si vous voulez, vous pouvez dfinir des sries personnalises pour des valeurs particulires de catgories. Utilisez le pivot afin que le graphe affiche une srie pour la catgorie que vous voulez personnaliser. Quand la srie est affiche sur le graphe, vous pouvez utiliser lditeur de graphe pour : Changer le type de graphe. Changer dautres proprits concernant les sries. Enregistrer les sries spcifiques au graphe que vous venez de personnaliser. Pour dfinir des modles de sries et dfinir des options par dfaut globales, voir Dfinition des modles de graphe de dcision par dfaut la page 16-18.

Changement du type de graphe des sries


Par dfaut, les sries ont toutes le mme type de graphe, dfini par le modle de sa dimension. Pour changer toutes les sries dun mme graphe, il suffit de changer le type du modle. Pour ce faire, reportez-vous Changement du type de graphe de dcision par dfaut la page 16-18. Pour changer le type de graphe dune seule srie,

1 Slectionnez une srie dans la liste Sries de la page Graphe de lditeur de graphe. 2 Cliquez sur le bouton Modifier.

Utilisation de composants daide la dcision

16-19

Utilisation des composants daide la dcision lexcution

3 Slectionnez un nouveau type et fermez la bote de dialogue Galerie. 4 Activez la case cocher denregistrement des sries.

Changement des autres proprits des sries dun graphe de dcision


Pour changer la couleur ou dautres proprits des sries dun graphe de dcision,

1 Slectionnez la page Sries, en haut de la bote de dialogue de modification de graphe. 2 Choisissez une srie dans la liste droulante, en haut de la page. 3 Choisissez longlet correspondant la proprit modifier et faites vos choix. 4 Activez la case cocher denregistrement des sries.

Enregistrement des paramtres des sries dun graphe de dcision


Par dfaut, seuls les paramtres des modles sont enregistrs en mode conception. Les modifications faites des sries particulires ne sont enregistres que si la case denregistrement de ces sries est coche dans la bote de dialogue de modification de graphe. Lenregistrement des sries occupant beaucoup de mmoire, pensez dsactiver cette case quand vous navez pas besoin de les enregistrer.

Utilisation des composants daide la dcision lexcution


A lexcution, les utilisateurs peuvent effectuer de nombreuses oprations en cliquant avec le bouton gauche, en cliquant avec le bouton droit et en faisant glisser les composants daide la dcision visibles. Ces oprations, dcrites plus haut, sont rsumes ici.

Pivots de dcision lexcution


Les utilisateurs peuvent : cliquer avec le bouton gauche sur le bouton rcapitulatif, lextrmit gauche du pivot de dcision, pour afficher la liste des rcapitulations disponibles. Ils peuvent utiliser cette liste pour changer les donnes rcapitulatives affiches dans les grilles et les graphes de dcision. Cliquer avec le bouton droit de la souris sur un bouton de dimension et choisir de : le dplacer de la partie lignes vers la partie colonnes ou linverse ; forer pour afficher les donnes dtail.

16-20

Guide du dveloppeur

Considrations relatives au contrle de la mmoire

Cliquer avec le bouton gauche sur un bouton de dimension, aprs avoir choisi la commande de forage et slectionner : ouvrir dimension, pour revenir au niveau suprieur de cette dimension ; toutes les valeurs, pour basculer entre laffichage dans les grilles de dcision des rcapitulations seulement ou des rcapitulations plus les autres valeurs. partir de la liste des catgories disponibles, une catgorie forer pour connatre les valeurs dtail. Cliquer avec le bouton gauche sur un bouton de dimension pour ouvrir ou fermer cette dimension. Faire glisser les boutons de dimension depuis la partie lignes vers la partie colonnes et rciproquement ; ils peuvent ensuite les placer ct des boutons existant dans cette partie ou sur licne de lignes ou de colonnes.

Grilles de dcision lexcution


Les utilisateurs peuvent : Cliquer avec le bouton droit de la souris lintrieur de la grille de dcision et choisir lune des possibilits suivantes : activer et dsactiver alternativement les sous-totaux pour des groupes individuels de donnes, pour toutes les valeurs dune dimension, ou pour toute la grille ;. afficher lditeur de cube de dcision, dcrit la page 16-8. ouvrir et fermer alternativement les dimensions et les rcapitulations. Cliquer sur + et sur dans les titres de lignes ou de colonnes pour ouvrir et fermer les dimensions. Faire glisser les dimensions des lignes vers les colonnes et rciproquement.

Graphes de dcision lexcution


Les utilisateurs peuvent faire glisser la souris dun ct lautre ou de haut en bas du graphe pour faire dfiler les catgories et les valeurs non visibles lcran.

Considrations relatives au contrle de la mmoire


Un champ dimension ou rcapitulatif charg dans le cube de dcision occupe de lespace mmoire. Lajout dun nouveau champ rcapitulatif augmente de faon linaire loccupation mmoire : par exemple, un cube de dcision avec deux champs rcapitulatifs occupe deux fois plus de mmoire quavec un seul, avec trois champs rcapitulatifs il occupe trois fois plus de mmoire, etc. La

Utilisation de composants daide la dcision

16-21

Considrations relatives au contrle de la mmoire

consommation de mmoire pour les dimensions augmente plus vite. Lajout dune dimension de 10 valeurs multiplie par 10 la consommation de mmoire (par rapport lajout dune dimension qui aurait une seule valeur) et lajout dune dimension de 100 valeurs la multiplie par 100. Lajout de dimensions un cube de dcision peut avoir un effet dramatique sur lutilisation de la mmoire et entraner trs vite une baisse des performances. Cet effet est particulirement prononc quand les dimensions ajoutes comportent de nombreuses valeurs. Les composants daide la dcision contiennent un certain nombre doptions qui vous aident contrler comment et quand la mmoire est utilise. Pour plus dinformations sur les proprits et les techniques indiques ici, recherchez TDecisionCube dans laide en ligne.

Dfinition du maximum de dimensions, de champs rcapitulatifs, et de cellules


Les proprits MaxDimensions et MaxSummaries des cubes de dcision sont utilises avec la proprit CubeDim.ActiveFlag pour contrler le nombre de dimensions et de champs rcapitulatifs pouvant tre chargs en mme temps. Dans lditeur de cube de dcision (groupe Capacit du cube, page Contrle de la mmoire), vous pouvez dfinir le nombre maximal de valeurs afin de contrler le nombre de dimensions et de champs rcapitulatifs pouvant tre prsents en mmoire. La limitation du nombre de dimensions et de champs rcapitulatifs permet de rduire grossirement la quantit de mmoire utilise par le cube de dcision. Mais, elle ne permet pas de distinguer les dimensions ayant peu de valeurs de celles en ayant beaucoup. Pour avoir un meilleur contrle des besoins en mmoire du cube de dcision, vous devez aussi limiter le nombre de cellules. Dfinissez le nombre maximal de cellules dans lditeur de cube de dcision (groupe Capacit du cube, page Contrle de la mmoire).

Dfinition de ltat des dimensions


La proprit ActiveFlag contrle les dimensions charger. Vous pouvez dfinir cette proprit dans la page Paramtres de dimensions de lditeur de cube de dcision, en utilisant Type actif. Quand ce contrle est mis Actif, la dimension sera charge inconditionnellement et occupera toujours lespace mmoire. Notez que le nombre de dimensions dans cet tat doit toujours tre infrieur MaxDimensions, et que le nombre des champs rcapitulatifs mis Actif doit tre infrieur MaxSummaries. Ne mettez Actif une dimension ou un champ rcapitulatif que sil faut absolument quil soit disponible tout moment. Le choix de Actif diminue la capacit de mmoire disponible que peut grer le cube. Lorsque ActiveFlag est dfinie AsNeeded, une dimension ou un champ rcapitulatif nest charg que sil peut ltre sans dpasser les limites de MaxDimensions, MaxSummaries ou MaxCells. Le cube de dcision permutera en et hors mmoire les dimensions et les champs rcapitulatifs marqus AsNeeded pour respecter les limites imposes par MaxCells, MaxDimensions et MaxSummaries.

16-22

Guide du dveloppeur

Considrations relatives au contrle de la mmoire

Cest--dire quune dimension ou un champ rcapitulatif ne sera pas en mmoire quand il nest pas utilis. Dfinir par AsNeeded les dimensions qui ne sont pas frquemment utilises entrane de meilleures performances pour le chargement et le pivotement, malgr le temps daccs aux dimensions non charges.

Utilisation de dimensions pagines


Quand Binning a la valeur Set dans la page Paramtres de dimensions de lditeur de cube de dcision et si Start Value nest pas NULL, la dimension est dite pagine ou perfore de manire permanente. Il nest possible daccder aux donnes que pour une seule valeur la fois de cette dimension mme sil est possible par code daccder squentiellement plusieurs valeurs. Il nest pas possible douvrir ou de pivoter une telle dimension. Les donnes de dimensions comportant un grand nombre de valeurs diffrentes consomment beaucoup de mmoire. En paginant de telles dimensions, il est possible dafficher le rcapitulatif pour une seule valeur la fois. Les informations affiches ainsi sont plus lisibles et la gestion mmoire est simplifie.

Utilisation de composants daide la dcision

16-23

16-24

Guide du dveloppeur

17
Chapitre 17

Chapitre

Connexion aux bases de donnes

La plupart des composants ensemble de donnes peuvent se connecter directement un serveur de bases de donnes. Une fois connect, lensemble de donnes communique avec le serveur automatiquement. Lorsque vous ouvrez lensemble de donnes, il se remplit avec les donnes du serveur et, lorsque vous validez des enregistrements, ceux-ci sont envoys au serveur et appliqus. Un composant connexion peut tre partag par plusieurs ensembles de donnes, ou chaque ensemble de donnes peut utiliser sa propre connexion. Chaque type densemble de donnes se connecte au serveur de bases de donnes laide de son propre type de composant connexion, qui utilise un mcanisme unique daccs aux donnes. Le tableau suivant prsente ces mcanismes et les composants connexion associs :
Tableau 17.1 Composants connexion de base de donn es Composant connexion
TDatabase TADOConnection TSQLConnection TIBDatabase

M canisme dacc s aux donn es


BDE (moteur de bases de donnes Borland). Objets de donnes ActiveX (ActiveX Data Objects, ADO). dbExpress. InterBase Express.

Remarque

Pour une prsentation de certains avantages et inconvnients de chacun de ces mcanismes, voir Utilisation des bases de donnes la page 14-1. Le composant connexion fournit toutes les informations ncessaires ltablissement dune connexion de base de donnes. Ces informations diffrent dun type de composant connexion lautre : Pour la description dune connexion BDE, voir Identification de la base de donnes la page 20-15. Pour la description dune connexion ADO, voir Connexion un stockage de donnes avec TADOConnection la page 21-3.

Connexion aux bases de donnes

17-1

Utilisation de connexions implicites

Pour la description dune connexion dbExpress, voir Configuration de TSQLConnection la page 22-3. Pour la description dune connexion InterBase Express, voir laide en ligne de TIBDatabase. Bien que chaque type densemble de donnes utilise un composant connexion diffrent, ils drivent tous de TCustomConnection. Ils effectuent tous la plupart des mmes tches et mettent disposition la plupart des mmes proprits, mthodes et vnements. Ce chapitre prsente de nombreuses tches communes.

Utilisation de connexions implicites


Quel que soit le mcanisme daccs aux donnes utilis, vous pouvez toujours crer le composant connexion explicitement puis lutiliser pour grer la connexion au serveur de bases de donnes et la communication avec celui-ci. Pour les ensembles de donnes BDE et ADO, vous pouvez galement dcrire la connexion de base de donnes par le biais des proprits de lensemble de donnes puis laisser celui-ci gnrer une connexion implicite. Pour les ensembles de donnes BDE, vous spcifiez une connexion implicite avec la proprit DatabaseName. Pour les ensembles de donnes ADO, vous utilisez la proprit ConnectionString. Lorsque vous utilisez une connexion implicite, vous navez pas besoin de crer explicitement un composant connexion. Cela peut simplifier le dveloppement de votre application et la connexion par dfaut que vous spcifiez peut couvrir de nombreuses situations. Toutefois, pour les applications client/serveur stratgiques complexes impliquant de nombreux utilisateurs et diffrentes contraintes en matire de connexions de bases de donnes, vous devez crer vos propres composants connexion afin dadapter chaque connexion de base de donnes aux besoins de votre application. Les composants connexion explicites offrent un contrle accru. Par exemple, vous devez accder au composant connexion pour effectuer les tches suivantes : Personnaliser la prise en charge de la connexion au serveur de bases de donnes. (Les connexions implicites affichent une bote de dialogue douverture de session par dfaut invitant lutilisateur indiquer un nom dutilisateur et un mot de passe.) Contrler les transactions et spcifier leurs niveaux disolement. Excuter des commandes SQL sur le serveur sans utiliser un ensemble de donnes. Raliser des actions sur tous les ensembles de donnes ouverts connects la mme base de donnes. En outre, si un serveur est utilis par plusieurs ensembles de donnes, le recours un composant connexion permet de ne spcifier le serveur quen un seul endroit. Ainsi, si vous changez le serveur, vous navez pas besoin de mettre jour plusieurs composants ensemble de donnes mais uniquement le composant connexion.

17-2

Guide du dveloppeur

Contrles des connexions

Contrles des connexions


Pour quune connexion au serveur de base de donnes puisse tre tablie, votre application doit fournir certaines informations essentielles qui dcrivent le serveur dsir. Chaque type de composant connexion met disposition un ensemble diffrent de proprits permettant didentifier le serveur. En rgle gnrale, toutefois, ils permettent tous de nommer le serveur souhait et fournissent un ensemble de paramtres de connexion qui contrlent ltablissement de la connexion. Les paramtres de connexion varient dun serveur lautre. Ils peuvent inclure des informations telles que les nom et mot de passe utilisateur, la taille maximale des champs BLOB, les rles SQL, etc. Une fois que vous avez identifi le serveur dsir et les paramtres de connexion, vous pouvez utiliser le composant connexion pour ouvrir ou fermer une connexion explicitement. Le composant connexion gnre des vnements lorsquil ouvre ou ferme une connexion, qui vous permettent de personnaliser la faon dont votre application ragit aux modifications apportes la connexion de base de donnes.

Connexion un serveur de bases de donnes


Un composant connexion permet dtablir une connexion un serveur de bases de donnes de deux faons : Appeler la mthode Open. Attribuer la proprit Connected la valeur True. Le fait dappeler la mthode Open attribue Connected la valeur True.
Remarque

Lorsquun composant connexion nest pas connect un serveur et quune application essaie douvrir lun de ses ensembles de donnes associs, lensemble de donnes appelle automatiquement la mthode Open du composant connexion. Lorsque vous attribuez Connected la valeur True, le composant connexion gnre dabord un vnement BeforeConnect, dans lequel vous pouvez effectuer toute initialisation. Par exemple, vous pouvez utiliser cet vnement pour modifier les paramtres de connexion. Aprs lvnement BeforeConnect, il est possible que le composant connexion affiche une bote de dialogue douverture de session par dfaut, suivant votre choix en matire de contrle de connexion au serveur. Il transmet ensuite le nom dutilisateur et le mot de passe au pilote et ouvre une connexion. Une fois la connexion ouverte, le composant connexion gnre un vnement AfterConnect, dans lequel vous pouvez effectuer toute tche ncessitant une connexion ouverte.

Remarque

Certains composants connexion gnrent galement des vnements supplmentaires lors de ltablissement dune connexion. Une fois tablie, la connexion est conserve tant quau moins un ensemble de donnes actif lutilise. Si aucun ensemble de donnes nest plus actif, le

Connexion aux bases de donnes

17-3

Contrle de la connexion au serveur

composant connexion abandonne la connexion. Certains composants connexion mettent disposition une proprit KeepConnection qui permet la connexion de demeurer ouverte mme si tous les ensembles de donnes qui lutilisent sont ferms. Si KeepConnection a pour valeur True, la connexion est maintenue. Pour les connexions vers des serveurs de bases de donnes distants, ou pour les applications qui ouvrent et ferment frquemment des ensembles de donnes, il est prfrable que KeepConnection ait pour valeur True afin de rduire le trafic sur le rseau et dacclrer lapplication. Si KeepConnection a pour valeur False, la connexion est ferme ds quil ny a plus densemble de donnes actif utilisant la base de donnes. Si un ensemble de donnes (qui utilise la base de donnes) est ultrieurement ouvert, la connexion doit tre nouveau tablie et initialise.

Dconnexion dun serveur de base de donnes


Un composant connexion permet de se dconnecter dun serveur de deux faons : Attribuer la proprit Connected la valeur False. Appeler la mthode Close. Le fait dappeler Close attribue Connected la valeur False. Lorsque Connected prend pour valeur False, le composant connexion gnre un vnement BeforeDisconnect, dans lequel vous pouvez effectuer tout nettoyage avant la fermeture de la connexion. Par exemple, vous pouvez utiliser cet vnement pour placer en mmoire cache les informations sur tous les ensembles de donnes ouverts avant quils ne soient ferms. Aprs lvnement BeforeConnect, le composant connexion ferme tous les ensembles de donnes ouverts et se dconnecte du serveur. Enfin, le composant connexion gnre un vnement AfterDisconnect, dans lequel vous pouvez rpondre la modification de ltat de la connexion, par exemple en activant un bouton Connexion dans linterface utilisateur.
Remarque

Le fait dappeler Close ou dattribuer Connected la valeur False provoque la dconnexion dun serveur de base de donnes mme si le composant connexion dispose dune proprit KeepConnection ayant pour valeur True.

Contrle de la connexion au serveur


La plupart des serveurs de bases de donnes distants incluent une gestion de la scurit pour empcher les accs non autoriss. Gnralement, le serveur demande un nom dutilisateur et un mot de passe lors de la procdure de connexion avant dautoriser laccs une base de donnes. Lors de la conception, si un serveur requiert une procdure de connexion, une bote de dialogue de connexion standard demande de saisir un nom dutilisateur et un mot de passe au moment de la premire tentative de connexion la base de donnes.

17-4

Guide du dveloppeur

Contrle de la connexion au serveur

A lexcution, trois moyens permettent de grer la procdure de connexion dun serveur : Laisser la bote de dialogue de connexion par dfaut demander et traiter la connexion. Cest lapproche par dfaut. Initialisez la proprit LoginPrompt du composant connexion True (valeur par dfaut) et ajoutez DBLogDlg la clause uses de lunit qui dclare le composant connexion. Votre application affiche la bote de dialogue standard de connexion lorsque le serveur attend un nom dutilisateur et un mot de passe. Fournir les informations de connexion avant la tentative de connexion. Chaque type de composant connexion utilise un mcanisme diffrent pour spcifier le nom dutilisateur et le mot de passe : Pour les ensembles de donnes BDE, dbExpress et InterBase Express, les paramtres de connexion du nom dutilisateur et du mot de passe sont accessibles par le biais de la proprit Params. (Pour les ensembles de donnes BDE, les valeurs de paramtre peuvent galement tre associes un alias BDE, tandis que pour les ensembles de donnes dbExpress, elles peuvent galement tre associes un nom de connexion). Pour les ensembles de donnes ADO, le nom dutilisateur et le mot de passe peuvent tre inclus dans la proprit ConnectionString (ou fournis comme paramtres de la mthode Open). Si vous spcifiez le nom dutilisateur et le mot de passe avant que le serveur ne les demande, veillez affecter au paramtre LoginPrompt la valeur False afin que la bote de dialogue de connexion par dfaut ne saffiche pas. Par exemple, le code suivant dfinit le nom dutilisateur et le mot de passe sur un composant connexion SQL dans le gestionnaire dvnement BeforeConnect, en dcodant un mot de passe crypt associ au nom de connexion en cours :
procedure TForm1.SQLConnectionBeforeConnect(Sender: TObject); begin with Sender as TSQLConnection do begin if LoginPrompt = False then begin Params.Values[User_Name] := SYSDBA; Params.Values[Password] := Decrypt(Params.Values[Password]); end; end; end;

Linitialisation du nom dutilisateur et du mot de passe la conception ou lutilisation de chanes codes en dur dans le code gnrent lintgration des valeurs dans le fichier excutable de lapplication. Cette approche compromet la scurit du serveur car elle permet de les trouver facilement. Fournir votre propre traitement de lvnement de connexion. Le composant connexion gnre un vnement lorsquil requiert le nom dutilisateur et le mot de passe. Pour TDatabase, TSQLConnection et TIBDatabase, il sagit dun vnement OnLogin. Le gestionnaire dvnement possde deux paramtres, le

Connexion aux bases de donnes

17-5

Gestion des transactions

composant connexion et une copie locale des paramtres de nom dutilisateur et de mot de passe dans une liste de chanes. (TSQLConnection comprend galement le paramtre de base de donnes). Vous devez affecter la proprit LoginPrompt la valeur True pour que cet vnement puisse se produire. Lorsque la proprit LoginPrompt a pour valeur False et quun gestionnaire est affect pour lvnement OnLogin, il est impossible dtablir une connexion la base de donnes, car la bote de dialogue par dfaut ne saffiche pas, et le gestionnaire dvnement OnLogin ne sexcute jamais. Pour TADOConnection, lvnement est un vnement OnWillConnect. Le gestionnaire dvnement possde cinq paramtres, le composant connexion et quatre paramtres qui renvoient les valeurs dterminant la connexion (notamment deux paramtres pour le nom dutilisateur et le mot de passe). Cet vnement se produit toujours, quelle que soit la valeur de LoginPrompt. Ecrivez un gestionnaire pour lvnement dans lequel vous dfinissez les paramtres de connexion. Dans lexemple suivant, les valeurs des paramtres USER NAME et PASSWORD sont fournies laide dune variable globale (UserName) et dune mthode qui renvoie un mot de passe en fonction dun nom dutilisateur (PasswordSearch) :
procedure TForm1.Database1Login(Database: TDatabase; LoginParams: TStrings); begin LoginParams.Values[USER NAME] := UserName; LoginParams.Values[PASSWORD] := PasswordSearch(UserName); end;

Comme dans les autres mthodes de transmission de paramtres de connexion, lorsque vous crivez un gestionnaire dvnement OnLogin ou OnWillConnect, vitez de coder en dur le mot de passe dans le code de votre application. Il doit apparatre uniquement sous la forme dune valeur crypte, dune entre de base de donnes scurise utilise par votre application pour rechercher la valeur, ou tre dynamiquement obtenu auprs de lutilisateur.

Gestion des transactions


Une transaction est un groupe dactions devant tre menes avec succs sur une ou plusieurs tables dune base de donnes avant dtre valides (rendues dfinitives). Si lune des actions du groupe choue, toutes les actions sont annules (abandonnes). Les transactions prservent lhomognit de la base de donnes en cas doccurrence dun problme suite lexcution dune des actions qui les composent. Par exemple, dans une application bancaire, le transfert de fonds dun compte vers un autre est une opration qui mrite dtre protge avec une transaction. Si, aprs diminution du solde dun compte, une erreur se produit dans laugmentation du solde de lautre compte, il est souhaitable dannuler la transaction afin que la base de donnes continue de reflter le solde total correct. Il est toujours possible de grer les transactions par mission directe de commandes SQL la base de donnes. A lexception de certaines bases de

17-6

Guide du dveloppeur

Gestion des transactions

donnes qui noffrent aucune prise en charge des transactions, la plupart des bases de donnes fournissent leur propre modle de gestion des transactions. Si votre serveur de base de donnes le permet, vous pouvez coder directement votre propre gestion des transactions afin de tirer parti des fonctionnalits avances de gestion des transactions, telles que la mise en mmoire cache des schmas. Si vous navez pas besoin dutiliser de fonctionnalits avances, les composants connexion fournissent un ensemble de mthodes et de proprits permettant de grer les transactions sans explicitement mettre de commande SQL. Grce ces proprits et mthodes, vous navez pas besoin de personnaliser votre application en fonction de chaque type de serveur de base de donnes utilis, sous rserve que le serveur prenne en charge les transactions. (Le moteur BDE offre galement une prise en charge limite des transactions pour les tables locales sans prise en charge des transactions du serveur. Lorsque le moteur BDE nest pas utilis, toute tentative de dmarrage de transactions sur une base de donnes qui ne les prend pas en charge amne les composants connexion dclencher une exception.)
Attention

lorsquun composant fournisseur densemble de donnesapplique des mises jour, il gnre implicitement les transactions pour toutes les mises jour. Veillez ce que toutes les transactions explicitement dmarres nentrent pas en conflit avec celles gnres par le fournisseur.

Dmarrage dune transaction


Lorsque vous dmarrez une transaction, toutes les instructions suivantes qui ralisent des op rations de lecture ou dcriture sur la base de donnes interviennent dans le contexte de cette transaction jusqu ce que la transaction soit acheve de faon explicite ou, dans le cas de transactions se chevauchant, jusqu ce quune autre transaction soit dmarre. Chaque instruction est considre comme faisant partie dun groupe. Si les modifications ne sont pas valides avec succs dans la base de donnes, chaque modification apporte dans le groupe doit tre annule. Lorsque la transaction est en cours de traitement, la vue des donnes des tables de la base de donnes est dtermine par le niveau disolement des transactions. Pour plus dinformations sur les niveaux disolement des transactions, voir Spcification du niveau disolement des transactions la page 17-10. Pour TADOConnection, dmarrez une transaction en appelant la mthode BeginTrans :
Level := ADOConnection1.BeginTrans;

BeginTrans renvoie le niveau dimbrication de la transaction dmarre. Une transaction imbrique est une transaction qui fait partie dune autre transaction parent. Une fois que le serveur a dmarr la transaction, la connexion ADO reoit un vnement OnBeginTransComplete. Pour TDatabase, utilisez la mthode StartTransaction TDataBase ne prend pas en charge les transactions imbriques ou se chevauchant. Si vous appelez la

Connexion aux bases de donnes

17-7

Gestion des transactions

mthode StartTransaction du composant TDatabase alors quune autre transaction est en cours, une exception est dclenche. Pour viter dappeler StartTransaction, vous pouvez vrifier la proprit InTransaction :
if not Database1.InTransaction then Database1.StartTransaction;

TSQLConnection utilise galement la mthode StartTransaction dans une version qui offre davantage de contrle. Notamment, StartTransaction accepte un descripteur de transaction qui permet de grer plusieurs transactions simultanes et de spcifier le niveau disolement des transactions pour chaque transaction. (Pour plus dinformations sur les niveaux de transaction, voir Spcification du niveau disolement des transactions la page 17-10.) Pour grer plusieurs transactions simultanes, attribuez au champ TransactionID du descripteur de transaction une valeur unique. TransactionID peut prendre nimporte quelle valeur, sous rserve quelle soit unique (cest--dire non conflictuelle avec une transaction en cours). Suivant le serveur, les transactions dmarres par TSQLConnection peuvent tre imbriques (comme dans le cas dune connexion ADO) ou se chevaucher.
var TD: TTransactionDesc; begin TD.TransactionID := 1; TD.IsolationLevel := xilREADCOMMITTED; SQLConnection1.StartTransaction(TD);

Par dfaut, dans le cas des transactions se chevauchant, la premire transaction devient inactive lorsque la seconde dmarre, bien que vous puissiez diffrer la validation ou lannulation de la premire. Si vous utilisez TSQLConnection avec une base de donnes InterBase, vous pouvez identifier chaque ensemble de donnes dans votre application avec une transaction active particulire, en dfinissant sa proprit TransactionLevel. En dautres termes, aprs le dmarrage dune seconde transaction, vous pouvez continuer utiliser les deux transactions simultanment, en associant simplement un ensemble de donnes la transaction qui vous intresse.
Remarque

Contrairement TADOConnection, TSQLConnection et TDatabase ne reoivent pas dvnements au dmarrage des transactions. InterBase Express offre davantage de contrle que TSQLConnection en utilisant un composant transaction distinct au lieu de dmarrer les transactions au moyen du composant connexion. Vous pouvez, toutefois, utiliser TIBDatabase pour dmarrer une transaction par dfaut :
if not IBDatabase1.DefaultTransaction.InTransaction then IBDatabase1.DefaultTransaction.StartTransaction;

Vous pouvez obtenir des transactions se chevauchant laide de deux composants transaction spars. Chaque composant transaction possde un ensemble de paramtres qui permettent de configurer les proprits de la transaction. Ces paramtres vous permettent de spcifier le niveau disolement, ainsi que dautres proprits de la transaction.

17-8

Guide du dveloppeur

Gestion des transactions

Achvement dune transaction


Au mieux, une transaction ne doit durer que le temps ncessaire. Plus une transaction demeure active, plus dutilisateurs peuvent simultanment accder la base de donnes. De mme, plus nombreuses sont les transactions qui dmarrent et sachvent simultanment pendant la dure de vie de votre transaction, plus grande est la probabilit pour que votre transaction entre en conflit avec une autre transaction lorsque vous essayez de valider vos modifications.

Achvement dune transaction russie


Lorsque les actions qui composent la transaction ont toutes russi, vous pouvez rendre dfinitives les modifications de la base de donnes en validant la transaction. Dans le cas de TDatabase, vous validez une transaction laide de la mthode Commit :
MyOracleConnection.Commit;

Dans le cas de TSQLConnection, vous utilisez galement la mthode Commit, mais vous devez spcifier la transaction valider en fournissant le descripteur de transaction communiqu la mthode StartTransaction :
MyOracleConnection.Commit(TD);

Dans le cas de TIBDatabase, vous validez un objet transaction laide de sa mthode Commit :
IBDatabase1.DefaultTransaction.Commit;

Dans le cas de TADOConnection, vous validez une transaction laide de la mthode CommitTrans :
ADOConnection1.CommitTrans; Remarque

Il est possible de valider une transaction imbrique de sorte que seules les modifications ultrieures soient annules si la transaction parent est annule. Une fois la transaction correctement valide, un composant connexion ADO reoit un vnement OnCommitTransComplete. Les autres composants connexion ne reoivent pas dvnements similaires. Un appel pour valider la transaction en cours est gnralement tent dans une instruction try...except. Ainsi, si une transaction ne peut pas tre correctement valide, vous pouvez utiliser le bloc except pour traiter lerreur et renouveler lopration ou pour annuler la transaction.

Achvement dune transaction non russie


Si une erreur se produit pendant lapplication des modifications faisant partie de la transaction ou pendant la tentative de validation de la transaction, vous pouvez supprimer toutes les modifications qui composent la transaction. La suppression de ces modifications correspond lannulation de la transaction.

Connexion aux bases de donnes

17-9

Gestion des transactions

Dans le cas de TDatabase, vous annulez une transaction en appelant la mthode Rollback :
MyOracleConnection.Rollback;

Dans le cas de TSQLConnection, vous utilisez galement la mthode Rollback, mais vous devez spcifier la transaction annuler en fournissant le descripteur de transaction communiqu la mthode StartTransaction :
MyOracleConnection.Rollback(TD);

Dans le cas de TIBDatabase, vous annulez un objet transaction en appelant sa mthode Rollback :
IBDatabase1.DefaultTransaction.Rollback;

Dans le cas de TADOConnection, vous annulez une transaction en appelant la mthode RollbackTrans :
ADOConnection1.RollbackTrans;

Une fois la transaction correctement annule, un composant connexion ADO reoit un vnement OnRollbackTransComplete. Les autres composants connexion ne reoivent pas dvnements similaires. Un appel pour annuler la transaction en cours se produit gnralement Dans un code de gestion des exceptions, lorsque vous ne pouvez pas rtablir la situation aprs une erreur de base de donnes. Dans un code dvnement de bouton ou de menu, comme lorsquun utilisateur clique sur un bouton Annuler.

Spcification du niveau disolement des transactions


Le niveau disolement des transactions dtermine comment une transaction interagit avec dautres transactions simultanes quand elles portent sur les mmes tables. Il affecte, en particulier, ce qu une transaction voit des changements apports une table par les autres transactions. Chaque type de serveur prend en charge un ensemble diffrent de niveaux possibles disolement des transactions. Ces derniers sont au nombre de trois : DirtyRead : lorsque le niveau disolement a pour valeur DirtyRead, votre transaction voit toutes les modifications apportes par les autres transactions, mme si elles nont pas t valides. Les changements non valids ne sont pas permanents et peuvent tre annuls tout moment. Cette valeur reprsente le niveau disolement le plus faible et nest pas disponible pour de nombreux serveurs de bases de donnes (tels quOracle, Sybase, MS-SQL et InterBase). ReadCommitted : lorsque le niveau disolement a pour valeur ReadCommitted, seuls les changements valids apports par les autres sont visibles. Bien que ce paramtre empche votre transaction de voir les changements non valids susceptibles dtre annuls, vous pouvez obtenir une vue incohrente de ltat de la base de donnes si une autre transaction est valide pendant le

17-10

Guide du dveloppeur

Envoi de commandes au serveur

processus de lecture. Ce niveau est disponible pour toutes les transactions lexception des transactions locales gres par le BDE. RepeatableRead : lorsque le niveau disolement a pour valeur RepeatableRead, votre transaction est en mesure de voir un tat cohrent des donnes de la base de donnes. Votre transaction voit une seule capture instantane des donnes. Elle ne peut pas voir les changements de donnes ultrieurs apports par dautres transactions simultanes, mmes si elles sont valides. Ce niveau disolement garantit qu aprs la lecture dun enregistrement par la transaction, la vue de cet enregistrement ne changera pas. Cest le niveau o votre transaction est la mieux isole des changements apports par dautres transaction. Ce niveau nest pas disponible sur certains serveurs, tels que Sybase et MS-SQL, ni pour les transactions locales gres par le BDE. En outre, TSQLConnection vous permet dadapter les niveaux disolement aux bases de donnes. Les niveaux disolement personnaliss sont dfinis par le pilote dbExpress. Reportez-vous la documentation du pilote pour plus dinformations.
Remarque

Pour une description dtaille de la mise en uvre de chaque niveau disolement, reportez-vous la documentation de votre serveur. TDatabase et TADOConnection vous permettent de spcifier le niveau disolement des transactions par le biais de la proprit TransIsolation. Lorsque vous attribuez TransIsolation une valeur non prise en charge par le serveur de bases de donnes, vous obtenez le niveau disolement immdiatement suprieur (ventuellement disponible). En labsence de niveau suprieur, le composant connexion dclenche une exception en cas de tentative de dmarrage dune transaction. Lorsque vous utilisez TSQLConnection, le niveau disolement des transactions est contrl par le champ IsolationLevel du descripteur de transaction. Lorsque vous utilisez InterBase Express, le niveau disolement des transactions est contrl par un paramtre de transaction.

Envoi de commandes au serveur


Tous les composants connexion de base de donnes, lexception de TIBDatabase, permettent dexcuter des instructions SQL sur le serveur associ en appelant la mthode Execute. Bien que la mthode Execute puisse renvoyer un curseur lorsque linstruction est une instruction SELECT, cette utilisation nest pas recommande. La meilleure faon dexcuter des instructions qui renvoient des donnes consiste utiliser un ensemble de donnes. La mthode Execute est trs pratique pour excuter des instructions SQL simples qui ne renvoient pas denregistrements. Parmi ces instructions figurent les instructions DDL (Data Definition Language, langage de dfinition de donnes), qui manipulent ou crent des mtadonnes de bases de donnes, telles que CREATE INDEX, ALTER TABLE et DROP DOMAIN. Certaines instructions SQL DML (Data Manipulation Language, langage de manipulation de donnes) ne

Connexion aux bases de donnes

17-11

Envoi de commandes au serveur

renvoient pas non plus densemble de rsultat. Les instructions DML ralisant une action sur des donnes mais ne renvoyant pas densemble de rsultat sont les suivantes : INSERT, DELETE et UPDATE. La syntaxe de la mthode Execute dpend du type de connexion : Dans le cas de TDatabase, Execute possde quatre paramtres : une chane qui spcifie une instruction SQL unique excuter, un objet TParams qui fournit toutes les valeurs de paramtre de linstruction, une valeur boolenne qui indique si linstruction doit tre place en mmoire cache en vue dun appel ultrieur et un pointeur vers un curseur BDE pouvant tre renvoy (il est recommand dindiquer nil). Dans le cas de TADOConnection, il existe deux versions de la mthode Execute. La premire possde une valeur WideString qui spcifie linstruction SQL et un second paramtre qui dsigne un ensemble doptions qui dterminent si linstruction est excute de faon asynchrone et si elle renvoie des enregistrements. Cette premire syntaxe renvoie une interface pour les enregistrements renvoys. La seconde syntaxe possde une valeur WideString qui spcifie linstruction SQL, un deuxime paramtre qui renvoie le nombre denregistrements affects par lexcution de linstruction et un troisime qui dsigne des options, telles que lexcution ou non de linstruction de faon asynchrone. Aucune des syntaxes ne permet la transmission de paramtres. Dans le cas de TSQLConnection, Execute possde trois paramtres : une chane qui spcifie une instruction SQL unique excuter, un objet TParams qui fournit les valeurs de paramtre de cette instruction et un pointeur qui peut recevoir un objet TCustomSQLDataSet cr pour renvoyer les enregistrements.
Remarque

Execute ne peut excuter quune instruction SQL en mme temps. A la diffrence des utilitaires de script SQL, un seul appel dExecute ne permet pas dexcuter plusieurs instructions SQL. Pour ce faire, appelez Execute autant de fois que ncessaire. Il est relativement facile dexcuter une instruction ne comprenant aucun paramtre. Par exemple, le code suivant excute une instruction CREATE TABLE (DDL) sans aucun paramtre sur un composant TSQLConnection :
procedure TForm1.CreateTableButtonClick(Sender: TObject); var SQLstmt: String; begin SQLConnection1.Connected := True; SQLstmt := CREATE TABLE NewCusts + ( + CustNo INTEGER, + Company CHAR(40), + State CHAR(2), + PRIMARY KEY (CustNo) + ); SQLConnection1.Execute(SQLstmt, nil, nil); end;

Pour utiliser des paramtres, vous devez crer un objet TParams. Pour chaque valeur de paramtre, utilisez la mthode TParams.CreateParam afin dajouter un

17-12

Guide du dveloppeur

Utilisation densembles de donnes associs

objet TParam. Ensuite, utilisez les proprits de TParam pour dcrire le paramtre et dfinir sa valeur. Ce processus est illustr dans lexemple suivant, qui utilise TDatabase pour excuter une instruction INSERT. Linstruction INSERT possde un paramtre unique nomm :StateParam. Un objet TParams (appel stmtParams) est cr afin de fournir la valeur CA pour ce paramtre.
procedure TForm1.INSERT_WithParamsButtonClick(Sender: TObject); var SQLstmt: String; stmtParams: TParams; begin stmtParams := TParams.Create; try Database1.Connected := True; stmtParams.CreateParam(ftString, StateParam, ptInput); stmtParams.ParamByName(StateParam).AsString := CA; SQLstmt := INSERT INTO "Custom.db" + (CustNo, Company, State) + VALUES (7777, "Robin Dabank Consulting", :StateParam); Database1.Execute(SQLstmt, stmtParams, False, nil); finally stmtParams.Free; end; end;

Si linstruction SQL comprend un paramtre mais que vous ne fournissez pas dobjet TParam pour indiquer sa valeur, linstruction SQL peut gnrer une erreur lors de son excution (cela dpend du type de la base de donnes utilise). Si un objet TParam est fourni alors quaucun paramtre ne lui correspond dans linstruction SQL, une exception est dclenche lorsque lapplication tente dutiliser le TParam.

Utilisation densembles de donnes associs


Tous les composants connexion de base de donnes grent une liste de tous les ensembles de donnes qui les utilisent pour se connecter une base de donnes. Par exemple, un composant connexion utilise cette liste pour fermer tous les ensembles de donnes lorsquil ferme la connexion la base de donnes. Vous pouvez galement utiliser cette liste pour effectuer des oprations sur tous les ensembles de donnes utilisant un composant connexion spcifique pour se connecter une base de donnes particulire.

Fermeture densembles de donnes sans dconnexion du serveur


Le composant connexion ferme automatiquement tous les ensembles de donnes lorsque vous fermez sa connexion. Toutefois, les ensembles de donnes doivent parfois tre ferms sans pour autant mettre fin la connexion au serveur de base de donnes.

Connexion aux bases de donnes

17-13

Obtention de mtadonnes

Pour fermer tous les ensembles de donnes ouverts sans provoquer la dconnexion du serveur, vous pouvez utiliser la mthode CloseDataSets. Dans le cas de TADOConnection et TIBDatabase, lappel de CloseDataSets laisse toujours la connexion ouverte. Dans le cas de TDatabase et TSQLConnection, vous devez galement attribuer la proprit KeepConnection la valeur True.

Dplacement parmi les ensembles de donnes associs


Pour effectuer des actions (autres que leur fermeture) sur tous les ensembles de donnes qui utilisent un composant connexion, utilisez les proprits DataSets et DataSetCount. DataSets est un tableau indic de tous les ensembles de donnes lis au composant connexion. Pour tous les composants connexion, lexcept de TADOConnection, cette liste ne comprend que les ensembles de donnes actifs. TADOConnection rpertorie galement les ensembles de donnes inactifs. DataSetCount reprsente le nombre densembles de donnes dans le tableau.
Remarque

Lorsque vous utilisez un ensemble de donnes client spcialis pour placer les mises jour en mmoire cache (par opposition lensemble de donnes client gnrique TClientDataSet), la proprit DataSets comprend lensemble de donnes interne dtenu par lensemble de donnes client, non celui-ci. Vous pouvez utiliser DataSets avec DataSetCount pour effectuer un cycle sur tous les ensembles de donnes actuellement actifs depuis votre code. Par exemple, le code suivant parcourt tous les ensembles de donnes actifs et dsactive tous les contrles qui utilisent les donnes quils fournissent :
var I: Integer; begin with MyDBConnection do begin for I := 0 to DataSetCount - 1 do DataSets[I].DisableControls; end; end;

Remarque

TADOConnection gre les objets commande ainsi que les ensembles de donnes. A limage des ensembles de donnes, vous pouvez parcourir les objets commande, laide des proprits Commands et CommandCount.

Obtention de mtadonnes
Tous les composants connexion de base de donnes peuvent extraire du serveur de bases de donnes des listes de mtadonnes, bien que le type des mtadonnes extraites est variable. Les mthodes qui extraient les mtadonnes remplissent une liste de chanes avec les noms de diffrentes entits disponibles sur le serveur. Vous pouvez alors utiliser ces informations pour, par exemple, permettre aux utilisateurs de slectionner une table dynamiquement lexcution.

17-14

Guide du dveloppeur

Obtention de mtadonnes

Vous pouvez utiliser un composant TADOConnection pour extraire les mtadonnes des tables et procdures stockes disponibles sur le stockage de donnes ADO. Vous pouvez alors utiliser ces informations pour, par exemple, permettre aux utilisateurs de slectionner une table ou procdure stocke dynamiquement lexcution.

Enumration des tables disponibles


La mthode GetTableNamescopie une liste des noms de tables dans un objet liste de chanes existant. Cela permet, par exemple, de remplir une bote liste avec des noms de table, grce laquelle lutilisateur pourra choisir la table quil souhaite ouvrir. La ligne suivante remplit une bote liste avec le nom de toutes les tables de la base de donnes :
MyDBConnection.GetTableNames(ListBox1.Items, False);

GetTableNames possde deux paramtres : la liste de chanes remplir avec les noms de table et une valeur boolenne qui indique si la liste doit comprendre les tables systme ou les tables ordinaires. Notez que, tous les serveurs nutilisant pas des tables systme pour stocker les mtadonnes, la demande de tables systme peut aboutir la gnration dune liste vide.
Remarque

Pour la plupart des composants connexion de base de donnes, GetTableNames renvoie la liste de toutes les tables non-systme disponibles lorsque le second paramtre a pour valeur False. Dans le cas de TSQLConnection, toutefois, vous contrlez plus facilement les types ajouts la liste lorsque vous ne rcuprez pas uniquement les noms de tables systme. Lorsque vous utilisez TSQLConnection, les types de noms ajouts la liste sont contrls par la proprit TableScope. TableScope indique si la liste doit contenir tout ou partie des lments suivants : tables ordinaires, tables systme, synonymes et vues.

Enumration des champs dune table


La mthode GetFieldNamesremplit une liste de chanes existante avec les noms de tous les champs (colonnes) dune table spcifie. GetFieldNames possde deux paramtres, le nom de la table dont vous souhaitez numrer les champs et une liste de chanes existante remplir avec les noms de champ :
MyDBConnection.GetFieldNames(Employee, ListBox1.Items);

Enumration des procdures stockes disponibles


Pour obtenir une liste de toutes les procdures stockes de la base de donnes, utilisez la mthode GetProcedureNames Cette mthode accepte un seul paramtre, une liste de chanes existante remplir :
MyDBConnection.GetProcedureNames(ListBox1.Items); Remarque

GetProcedureNames est uniquement disponible pour TADOConnection et TSQLConnection.

Connexion aux bases de donnes

17-15

Obtention de mtadonnes

Enumration des index disponibles


Pour obtenir la liste de tous les index dune table spcifique, utilisez la mthode GetIndexNames. Cette mthode prend en compte deux paramtres, la table dont vous souhaitez connatre les index et une liste de chanes existante remplir :
SQLConnection1.GetIndexNames(Employee, ListBox1.Items); Remarque

GetIndexNames est uniquement disponible pour TSQLConnection, bien que la plupart des ensembles de type table possdent une mthode quivalente.

Enumration des paramtres de procdure stocke


Pour obtenir la liste de tous les paramtres dune procdure stocke spcifique, utilisez la mthode GetProcedureParams. GetProcedureParams remplit un objet TList avec les pointeurs des enregistrements des descriptions de paramtres, dans lequel chaque enregistrement dcrit un paramtre dune procdure stocke spcifie, notamment ses nom, index, type de paramtre, type de champ, etc. GetProcedureParams accepte deux paramtres, le nom de la procdure stocke et un objet TList existant :
SQLConnection1.GetProcedureParams(GetInterestRate, List1);

Vous pouvez convertir les descriptions de paramtre ajoutes la liste en lobjet plus courant TParams en appelant la procdure globale LoadParamListItems GetProcedureParams allouant dynamiquement les diffrents enregistrements, votre application doit les librer lorsquelle na plus besoin des informations. La routine globale FreeProcParams peut effectuer cette opration.
Remarque

GetProcedureParams est uniquement disponible pour TSQLConnection.

17-16

Guide du dveloppeur

18
Chapitre 18

Chapitre

Prsentation des ensembles de donnes

Lunit fondamentale pour accder aux donnes est la famille dobjets ensemble de donnes. Les applications utilisent des ensembles de donnes pour tous les accs aux bases de donnes. Un objet ensemble de donnes reprsente un ensemble denregistrements dune base de donnes organis en une table logique. Ces enregistrements peuvent tre issus dune seule table de base de donnes ou peuvent reprsenter les rsultats de lexcution dune requte ou dune procdure stocke. Tous les objets ensemble de donnes utiliss dans des applications de bases de donnes descendent de TDataSet et hritent des champs de donnes, proprits, mthodes et vnements de cette classe. Ce chapitre dcrit les fonctionnalits de TDataSet hrites par les objets ensemble de donnes utiliss dans les applications de bases de donnes. Avant dutiliser tout objet de base de donnes, vous devez avoir assimil ces fonctionnalits partages. TDataSet est un ensemble de donnes virtuel, ce qui signifie que la plupart de ses proprits et mthodes sont dclares comme virtual ou abstract. Une mthode virtuelle est une dclaration de fonction ou de procdure dont limplmentation est redfinie par les objets descendants. Une mthode abstract est une fonction ou une procdure sans vritable implmentation. La dclaration est un prototype qui dcrit une mthode (ainsi que ses paramtres et le type renvoy, le cas chant) devant tre implmente dans tous les objets ensemble de donnes descendants (limplmentation peut tre diffrente pour chaque ensemble de donnes). Etant donn que TDataSet contient des mthodes abstract, vous ne pouvez pas lutiliser directement dans une application sans gnrer derreur dexcution. A la place, soit vous crez des instances des descendants de TDataSet intgrs et les utilisez dans votre application, soit vous drivez votre propre objet ensemble de donnes depuis TDataSet ou depuis ses descendants et crivez des implmentations pour toutes ses mthodes abstract.

Prsentation des ensembles de donnes

18-1

Utilisation des descendants de TDataSet

TDataSet dfinit la plupart des fonctionnalits communes tous les objets ensemble de donnes. Ainsi, il dfinit la structure de base de tous les ensembles de donnes : un tableau de composants TField qui correspond aux colonnes dune ou de plusieurs tables de bases de donnes, aux champs de rfrence ou aux champs calculs fournis par votre application. Pour plus dinformations sur les composants TField, voir chapitre 19, Manipulation des composants champ. Ce chapitre dcrit lutilisation des fonctionnalits de bases de donnes courantes associes TDataSet. Gardez cependant lesprit que, bien que TDataSet introduise les mthodes lies ces fonctionnalits, tous les objets dpendants de TDataSet ne les implmentent pas. En particulier, les ensembles de donnes unidirectionnels nen implmentent quun sous-ensemble limit.

Utilisation des descendants de TDataSet


TDataSet a plusieurs descendants immdiats, chacun correspondant un diffrent mcanisme daccs aux donnes. Vous ne travaillez pas directement avec ces descendants. Au lieu de cela, chaque descendant introduit les proprits et les mthodes permettant dutiliser un mcanisme daccs aux donnes particulier. Ces proprits et mthodes sont alors exposes par les classes descendantes adaptes aux diffrents types de donnes serveur. Les descendants immdiats de TDataSet sont : TBDEDataSet, qui utilise le moteur BDE (Borland Database Engine) pour communiquer avec le serveur de base de donnes. Les descendants de TBDEDataSet que vous utilisez sont TTable, TQuery, TStoredProc et TNestedTable. Les fonctionnalits uniques des ensembles de donnes bass sur le BDE sont dcrites dans le chapitre 20, Utilisation du moteur de bases de donnes Borland. TCustomADODataSet, qui utilise les ADO (objets de donnes ActiveX) pour communiquer avec un datastore OLEDB. Les descendants de TCustomADODataSet que vous utilisez sont TADODataSet, TADOTable, TADOQuery et TADOStoredProc. Les fonctionnalits uniques des ensembles de donnes bass sur les ADO sont dcrites dans le chapitre 21, Utilisation des composants ADO. TCustomSQLDataSet, qui utilise dbExpress pour communiquer avec un serveur de base de donnes. Les descendants de TCustomSQLDataSet que vous utilisez sont TSQLDataSet, TSQLTable, TSQLQuery et TSQLStoredProc. Les fonctionnalits uniques des ensembles de donnes dbExpress sont dcrites dans le chapitre 22, Utilisation densembles de donnes unidirectionnels. TIBCustomDataSet, qui communique directement avec un serveur de base de donnes InterBase. Les descendants de TIBCustomDataSet que vous utilisez sont TIBDataSet, TIBTable, TIBQuery et TIBStoredProc. TCustomClientDataSet, qui reprsente les donnes dun autre composant ensemble de donnes ou les donnes dun fichier ddi sur disque. Les descendants de TCustomClientDataSet que vous utilisez sont TClientDataSet, qui peut se connecter un ensemble de donnes externe (source), et les ensembles

18-2

Guide du dveloppeur

Dtermination des tats dun ensemble de donnes

de donnes client spcifiques un mcanisme daccs aux donnes (TBDEClientDataSet, TSQLClientDataSet et TIBClientDataSet), qui utilisent un ensemble de donnes source interne. Les fonctionnalits uniques des ensembles de donnes client sont dcrites dans le chapitre 23, Utilisation densembles de donnes client. Les avantages et inconvnients des divers mcanismes daccs aux donnes employs par ces descendants de TDataSet sont dcrits dans Utilisation des bases de donnes la page 14-1. En plus des ensembles de donnes intgrs, vous pouvez crer vos propres descendants TDataSet personnaliss, par exemple pour fournir des donnes partir dun processus autre quun serveur de base de donnes, comme une feuille de calcul. Lcriture densembles de donnes personnaliss vous offre la souplesse de grer les donnes avec la mthode de votre choix tout en continuant dutiliser les contrles donnes de la VCL pour construire votre interface utilisateur. Pour plus dinformations sur la cration de composants personnaliss, voir chapitre 40, Prsentation gnrale de la cration dun composant. Bien que chaque descendant de TDataSet ait ses propres proprits et mthodes uniques, certaines des proprits et mthodes introduites par les classes descendantes sont les mmes que celles introduites par dautres classes descendantes utilisant un autre mcanisme daccs aux donnes. Par exemple, il y a des similitudes entre les divers composants table (TTable, TADOTable, TSQLTable et TIBTable). Pour plus dinformations sur les similitudes introduites par les descendants de TDataSet, voir Types densembles de donnes la page 18-27.

Dtermination des tats dun ensemble de donnes


Ltat, ou le mode, dun ensemble de donnes dtermine les oprations possibles sur ses donnes. Par exemple, quand un ensemble de donnes est ferm, son tat devient dsInactive, ce qui signifie que rien ne peut affecter ses donnes. Au moment de lexcution, vous pouvez examiner la proprit en lecture seule State de lensemble de donnes, pour dterminer son tat en cours. Le tableau suivant rcapitule les valeurs possibles de la proprit State et leur signification :
Tableau 18.1 Valeur
dsInactive dsBrowse

Valeurs possibles pour la propri t State des ensembles de donnes Etat


Inactif Visualisation

Signification
Lensemble de donnes est ferm. Ses donnes sont indisponibles. Lensemble de donnes est ouvert. Ses donnes peuvent tre vues mais pas modifies. Cest ltat par dfaut dun ensemble de donnes ouvert. Lensemble de donnes est ouvert. La ligne en cours peut tre modifie. (non support par les ensembles de donnes unidirectionnels)

dsEdit

Edition

Prsentation des ensembles de donnes

18-3

Dtermination des tats dun ensemble de donnes

Tableau 18.1 Valeur


dsInsert

Valeurs possibles pour la propri t State des ensembles de donnes (suite) Etat
Insertion

Signification
Lensemble de donnes est ouvert. Une nouvelle ligne peut tre insre. (non support par les ensembles de donnes unidirectionnels) Lensemble de donnes est ouvert. Active la dfinition de portes et de valeurs cl pour les oprations portant sur des portes et les oprations GotoKey. (non support par tous les ensembles de donnes) Lensemble de donnes est ouvert. Indique quun vnement OnCalcFields est en cours. Interdit toute modification de champ non calcul. Lensemble de donnes est ouvert. Indique que la proprit CurValue des champs est lue par un gestionnaire dvnement qui rpond aux erreurs en appliquant des mises jour en mmoire cache. Lensemble de donnes est ouvert. Indique que la proprit NewValue des champs est lue par un gestionnaire dvnement qui rpond aux erreurs en appliquant des mises jour en mmoire cache. Lensemble de donnes est ouvert. Indique que la proprit OldValue des champs est lue par un gestionnaire dvnement qui rpond aux erreurs en appliquant des mises jour en mmoire cache. Lensemble de donnes est ouvert. Indique quune opration de filtrage est en cours. Un ensemble de donnes restreint peut tre visualis, sans quaucune donne ne puisse tre change. (non support par les ensembles de donnes unidirectionnels) Lensemble de donnes est ouvert. Les contrles orients donnes ne sont pas mis jour et les vnements ne sont pas dclenchs lorsque lenregistrement en cours est modifi. Lensemble de donnes est ouvert. Un vnement OnCalcFields est en cours pour des valeurs calcules stockes avec lenregistrement. (uniquement pour les ensembles de donnes client) Lensemble de donnes est dans le processus douverture, mais na pas fini. Cet tat arrive quand lensemble de donnes est ouvert pour une lecture asynchrone.

dsSetKey

Indexation (SetKey)

dsCalcFields

Champs calculs (CalcFields) CurValue

dsCurValue

dsNewValue

NewValue

dsOldValue

OldValue

dsFilter

Filtrage

dsBlockRead

Lecture de bloc Calcul interne

dsInternalCalc

dsOpening

Ouverture

En gnral, une application vrifie ltat de lensemble de donnes pour dterminer le moment deffectuer certaines oprations. Par exemple, vous pouvez chercher ltat dsEdit ou dsInsert pour savoir sil faut valider les mises jour.
Remarque

A chaque fois que ltat dun ensemble de donnes change, lvnement OnStateChange est appel pour tous les composants source de donnes associs. Pour plus dinformations concernant les composants source de donnes et sur OnStateChange, voir Rponse aux modifications effectu es par le biais de la source de donnes la page 15-5.

18-4

Guide du dveloppeur

Ouverture et fermeture des ensembles de donnes

Ouverture et fermeture des ensembles de donnes


Pour lire ou crire des donnes dans un ensemble de donnes, une application doit dabord louvrir. Il y a deux moyens de procder, Dfinir la proprit Active de lensemble de donnes par True, soit dans linspecteur dobjets la conception, soit dans le code lexcution :
CustTable.Active := True;

Appeler la mthode Open de lensemble de donnes au moment de lexcution,


CustQuery.Open;

Quand vous ouvrez lensemble de donnes, celui-ci reoit dabord un vnement BeforeOpen, puis il ouvre un curseur, se remplit lui-mme de donnes et, enfin, reoit un vnement AfterOpen. Lensemble de donnes qui vient dtre ouvert est en mode visualisation, ce qui veut dire que votre application peut lire des donnes et naviguer dans cet ensemble de donnes. Il y a deux faons de fermer un ensemble de donnes, Dfinir la proprit Active de lensemble de donnes par False, soit dans linspecteur dobjets la conception, soit dans le code lexcution :
CustQuery.Active := False;

Appeler la mthode Close de lensemble de donnes lexcution,


CustTable.Close;

De mme que lensemble de donnes reoit les vnements BeforeOpen et AfterOpen quand vous louvrez, il reoit les vnements BeforeClose et AfterClose quand vous le fermez. Ces gestionnaires rpondent la mthode Close dun ensemble de donnes. Vous pouvez utiliser ces vnements, par exemple, pour inviter lutilisateur valider les modifications en attente ou les annuler avant de fermer lensemble de donnes. Le code suivant illustre un tel gestionnaire :
procedure TForm1.CustTableVerifyBeforeClose(DataSet: TDataSet); begin if (CustTable.State in [dsEdit, dsInsert]) then begin case MessageDlg(Emettre les modifications avant de fermer?, mtConfirmation, mbYesNoCancel, 0) of mrYes: CustTable.Post; { enregistrer les modifications } mrNo: CustTable.Cancel; { abandonner les modifications } mrCancel: Abort; { annuler la fermeture de lensemble de donnes } end; end; end; Remarque

Il est parfois ncessaire de fermer au pralable lensemble de donnes pour changer certaines de ses proprits, comme la proprit TableName sur un composant TTable. Lorsque vous rouvrez lensemble de donnes, la nouvelle valeur de proprit prend effet.

Prsentation des ensembles de donnes

18-5

Navigation dans les ensembles de donnes

Navigation dans les ensembles de donnes


Chaque ensemble de donnes actif dispose dun curseur qui pointe sur la ligne en cours dans lensemble de donnes. Ce sont les valeurs de champ de cette ligne en cours qui apparaissent dans les contrles champ unique, orients donnes dune fiche, comme TDBEdit, TDBLabel et TDBMemo. Si lensemble de donnes prend en charge ldition, lenregistrement en cours contient les valeurs qui sont manipulables par des mthodes ddition, dinsertion et de suppression. Vous pouvez changer de ligne en cours en dplaant le curseur pour le faire pointer sur une autre ligne. Le tableau suivant dresse la liste des mthodes pouvant tre utilises dans le code dune application, pour se dplacer vers dautres enregistrements.
Tableau 18.2 M thodes
First Last Next Prior MoveBy

M thodes de navigation relatives aux ensembles de donnes Dplace le curseur vers


La premire ligne dun ensemble de donnes. La dernire ligne dun ensemble de donnes. (non disponible pour les ensembles de donnes unidirectionnels) La ligne suivante dun ensemble de donnes. La ligne prcdente dun ensemble de donnes. (non disponible pour les ensembles de donnes unidirectionnels) Le nombre spcifi de lignes en avant ou en arrire dun ensemble de donnes.

Le composant visuel, orient donnes, TDBNavigator, encapsule ces mthodes sous la forme de boutons sur lesquels lutilisateur peut cliquer pour se dplacer parmi les enregistrements lors de lexcution. Pour plus dinformations sur le composant navigateur, voir Navigation et manipulation denregistrements la page 15-33. Chaque fois que vous changez lenregistrement en cours laide dune de ces mthodes (ou dune autre mthode de navigation base sur un critre de recherche), lensemble de donnes reoit deux vnements : BeforeScroll (avant de quitter lenregistrement en cours) et AfterScroll (aprs avoir atteint le nouvel enregistrement). Vous pouvez utiliser ces vnements pour mettre jour votre interface utilisateur (par exemple, pour mettre jour une barre dtat qui donne des informations sur lenregistrement en cours).

18-6

Guide du dveloppeur

Navigation dans les ensembles de donnes

TDataSet dfinit deux proprits boolennes qui donnent des indications utiles pour parcourir les enregistrements dun ensemble de donnes.
Tableau 18.3 Proprit
Bof (Dbut de fichier)

Proprits de navigation des ensembles de donnes Description


True : le curseur se trouve sur la premire ligne de lensemble de donnes. False : le curseur nest pas rpertori comme tant sur la premire ligne de lensemble de donnes True : le curseur se trouve sur la dernire ligne de lensemble de donnes. False : le curseur nest pas rpertori comme tant sur la premire ligne de lensemble de donnes

Eof (Fin de fichier)

Utilisation des mthodes First et Last


La mthode First place le curseur sur la premire ligne dun ensemble de donnes et dfinit la proprit Bof par True. Si le curseur est dj sur la premire ligne, First na aucun effet. Par exemple, le code suivant permet daller sur le premier enregistrement de CustTable :
CustTable.First;

La mthode Last place le curseur sur la dernire ligne dun ensemble de donnes et dfinit la proprit Eof par True. Si le curseur est dj sur la dernire ligne, Last na aucun effet. Le code suivant permet daller sur le dernier enregistrement de CustTable :
CustTable.Last; Remarque Conseil

La mthode Last dclenche une exception dans les ensembles de donnes unidirectionnels. Bien quil puisse exister de nombreuses raisons pour aller sur la premire ou sur la dernire ligne dun ensemble de donnes sans que lutilisateur nintervienne, vous pouvez offrir ce dernier la possibilit de naviguer parmi les enregistrements en utilisant le composant TDBNavigator. Le composant navigateur contient des boutons qui, sils sont actifs et visibles, permettent lutilisateur daller sur la premire ou la dernire ligne de lensemble de donnes actif. Les vnements OnClick de ces boutons appellent les mthodes First et Last de lensemble de donnes. Pour plus dinformations concernant le fonctionnement du composant navigateur, voir Navigation et manipulation denregistrements la page 15-33.

Prsentation des ensembles de donnes

18-7

Navigation dans les ensembles de donnes

Utilisation des mthodes Next et Prior


La mthode Next dplace le curseur dune ligne en avant dans lensemble de donnes et dfinit la proprit Bof par False si lensemble de donnes nest pas vide. Si le curseur se trouve dj sur la dernire ligne de lensemble de donnes, lorsque vous appelez Next, celle-ci na aucun effet. Par exemple, le code suivant provoque le dplacement du curseur sur le prochain enregistrement de CustTable :
CustTable.Next;

La mthode Prior dplace le curseur dune ligne en arrire dans lensemble de donnes et dfinit la proprit Eof par False si lensemble de donnes nest pas vide. Si le curseur se trouve dj sur la premire ligne dans lensemble de donnes, lorsque vous appelez Prior, celle-ci na aucun effet. Par exemple, le code suivant permet daller sur lenregistrement prcdent de CustTable :
CustTable.Prior; Remarque

La mthode Prior dclenche une exception dans les ensembles de donnes unidirectionnels.

Utilisation de la mthode MoveBy


MoveBy vous permet de spcifier le nombre de lignes du dplacement du curseur dans lensemble de donnes, vers lavant ou vers larrire. Le dplacement se fait par rapport la position de lenregistrement en cours au moment o MoveBy est appele. MoveBy dfinit galement les proprits Bof et Eof de lensemble de donnes. Cette fonction accepte un paramtre entier qui indique le nombre denregistrements parcourus lors du dplacement. Un entier positif indique un dplacement vers lavant et un entier ngatif, un dplacement vers larrire.
Remarque

La mthode MoveBy dclenche une exception dans les ensembles de donnes unidirectionnels si vous utilisez un argument ngatif. MoveBy renvoie le nombre de lignes effectivement parcourues. Si le dplacement voulu va au-del du dbut ou de la fin de lensemble de donnes, le nombre de lignes renvoyes par MoveBy sera diffrent de celui voulu pour le dplacement. Cest parce que MoveBy sarrte quand il atteint le premier ou le dernier enregistrement de lensemble de donnes. Le code suivant provoque un dplacement de deux enregistrements vers larrire dans CustTable :
CustTable.MoveBy(-2);

Remarque

Si votre application utilise MoveBy dans un environnement de base de donnes multi-utilisateur, ne perdez pas de vue que les ensembles de donnes sont fluides. Un enregistrement qui se trouvait cinq enregistrements en arrire il y a un instant, peut se retrouver maintenant quatre, six ou mme un nombre

18-8

Guide du dveloppeur

Navigation dans les ensembles de donnes

denregistrements inconnu en arrire si plusieurs utilisateurs accdent simultanment la base de donnes et font des modifications.

Utilisation des proprits Eof et Bof


Les deux proprits Eof (fin de fichier) et Bof (dbut de fichier), accessibles en lecture et lexcution uniquement, sont utiles pour parcourir tous les enregistrements dun ensemble de donnes.

Eof
Quand la valeur de Eof est True, cela indique que le curseur se trouve sans quivoque sur la dernire ligne de lensemble de donnes. Eof passe True quand une application : Ouvre un ensemble de donnes vide. Russit appeler la mthode Last de lensemble de donnes. Appelle la mthode Next de lensemble de donnes et que son excution choue (car le curseur se trouve dj sur la dernire ligne de lensemble de donnes). Appelle SetRange sur une porte ou un ensemble de donnes vide. Eof vaut False dans tous les autres cas ; vous devez supposer que Eof vaut False sauf si lune des conditions ci-dessus est vrifie et si vous avez test directement la valeur de la proprit. Le test sur Eof se fait gnralement dans une condition de boucle pour contrler le processus itratif sur tous les enregistrements dun ensemble de donnes. Si vous ouvrez un ensemble de donnes contenant plusieurs enregistrements (ou si vous appelez First) Eof vaut False. Pour parcourir un un les enregistrements dun ensemble de donnes, vous devez crer une boucle qui avance sur chaque enregistrement en appelant Next, et se termine quand Eof vaut True. Eof reste False jusqu ce que vous appeliez Next alors que le curseur se trouve dj sur le dernier enregistrement. Lexemple suivant montre lune des faons de programmer une boucle de traitement denregistrements pour un ensemble de donnes appel CustTable :
CustTable.DisableControls; try CustTable.First; { Se positionne sur le premier enregistrement ; Eof devient False } while not CustTable.Eof do { boucle jusqu ce que Eof devienne True } begin { Le traitement de lenregistrement se fait ici } CustTable.Next; { Eof vaut false en cas de russite; Eof vaut True si Next choue sur le dernier enregistrement} end; finally CustTable.EnableControls; end;

Prsentation des ensembles de donnes

18-9

Navigation dans les ensembles de donnes

Conseil

Cet exemple montre aussi comment dsactiver puis ractiver des contrles visuels, orients donnes, rattachs lensemble de donnes. Si vous dsactivez les contrles visuels pendant la dure de litration sur lensemble de donnes, le traitement sera acclr car votre application na pas mettre jour le contenu des contrles au fur et mesure de lvolution de lenregistrement en cours. Une fois litration acheve, les contrles doivent tre ractivs pour tre mis jour en fonction de la nouvelle ligne en cours. Notez que lactivation de contrles visuels a lieu dans la clause finally dune instruction try...finally. Cela garantit que les contrles ne resteront pas dsactivs, mme si une exception termine le traitement de la boucle de faon prmature.

Bof
Quand la valeur de Bof est True, cela indique que le curseur se trouve sans quivoque sur la premire ligne de lensemble de donnes. Bof est mis True lorsquune application : Ouvre un ensemble de donnes. Appelle la mthode First de lensemble de donnes. Appelle la mthode Prior de lensemble de donnes et que son excution choue (car le curseur se trouve dj sur la premire ligne de lensemble de donnes). Appelle SetRange sur une porte ou un ensemble de donnes vide. Bof prend la valeur False dans tous les autres cas ; vous devez supposer que Bof vaut False sauf si lune des conditions ci-dessus est vrifie et si vous avez test directement la valeur de la proprit. Comme Eof, Bof peut se trouver dans une condition de boucle pour contrler un processus itratif sur des enregistrements dun ensemble de donnes. Lexemple suivant montre lune des faons de programmer une boucle de traitement denregistrements pour un ensemble de donnes appel CustTable: :
CustTable.DisableControls; { acclre le traitement et empche les rafrachissements cran } try while not CustTable.Bof do { boucle jusqu ce que Bof devienne True } begin { Le traitement de lenregistrement se fait ici } CustTable.Prior; { Bof vaut false en cas de russite; Bof vaut True si Prior choue sur le premier enregistrement } end; finally CustTable.EnableControls; { affiche la nouvelle ligne en cours dans les contrles } end;

18-10

Guide du dveloppeur

Navigation dans les ensembles de donnes

Marquage denregistrements
Outre la possibilit de se dplacer dun enregistrement un autre dans un ensemble de donnes (ou de se dplacer selon un nombre dtermin denregistrements), il est possible de marquer un emplacement particulier dans un ensemble de donnes de faon y revenir rapidement le moment voulu. TDataSet introduit une fonction de marquage constitue dune proprit Bookmark et de cinq mthodes de dfinition de signets. TDataSet implmente des mthodes virtuelles de gestion des signets. Bien que ces mthodes garantissent que chaque objet ensemble de donnes driv de TDataSet renvoie une valeur si une mthode de signet est appele, les valeurs renvoyes sont simplement des valeurs par dfaut qui nindiquent pas la position en cours. Les descendants de TDataSet ont des niveaux de support de signets diffrents. Les ensembles de donnes dbExpress ne supportent pas les signets. Les ensembles de donnes ADO peuvent prendre en charge les signets, en fonction des tables de la base de donnes sous-jacente. Les ensembles de donnes BDE, InterBase express et client prennent toujours en charge les signets.

La proprit Bookmark
La proprit Bookmark indique quel est le signet en cours dans votre application. Bookmark est une chane qui identifie le signet en cours. Tout nouveau signet ajout devient le signet en cours.

La mthode GetBookmark
Pour crer un signet, vous devez dclarer une variable de type TBookmark dans votre application, puis appeler GetBookmark pour allouer un espace de stockage la variable et dfinir sa valeur par un emplacement particulier dans lensemble de donnes. Le type TBookmark est un pointeur.

Les mthodes GotoBookmark et BookmarkValid


Lorsquun signet lui est transmis, GotoBookmark dplace le curseur de lensemble de donnes lemplacement du signet. Avant dappeler GotoBookmark, vous pouvez appeler BookmarkValid pour dterminer si le signet pointe sur un enregistrement. BookmarkValid renvoie True si le signet pointe sur un enregistrement.

La mthode CompareBookmarks
Vous pouvez aussi appeler CompareBookmarks pour voir si un signet sur lequel vous voulez vous dplacer est diffrent dun autre signet ou du signet en cours. Si les deux signets font rfrence au mme enregistrement (ou si tous les deux sont nil), CompareBookmarks renvoie 0.

La mthode FreeBookmark
FreeBookmark restitue la mmoire alloue un signet lorsquil nest plus ncessaire. Vous devez galement appeler FreeBookmark avant de rutiliser un signet existant.

Prsentation des ensembles de donnes

18-11

Recherche dans les ensembles de donnes

Un exemple dutilisation de signets


Le code suivant illustre lutilisation des signets :
procedure DoSomething (const Tbl: TTable) var Bookmark: TBookmark; begin Bookmark := Tbl.GetBookmark; { alloue la mmoire et affecte une valeur } Tbl.DisableControls; { dsactive laffichage des enregistrements dans les contrles orients donnes } try Tbl.First; { se dplace sur le premier enregistrement de la table } while not Tbl.Eof do {parcourt tous les enregistrements de la table } begin { insrez ici votre traitement } Tbl.Next; end; finally Tbl.GotoBookmark(Bookmark); Tbl.EnableControls; { ractive laffichage des enregistrements dans les contrles orients donnes, si ncessaire } Tbl.FreeBookmark(Bookmark); {restitue la mmoire alloue au signet } end; end;

Avant dentrer dans le processus de parcours des enregistrements, les contrles sont dsactivs. Mme si une erreur se produit durant le balayage des enregistrements, la clause finally permet dtre sr que les contrles seront toujours ractivs et que le signet sera toujours restitu, mme si la boucle se termine prmaturment.

Recherche dans les ensembles de donnes


Si un ensemble de donnes nest pas unidirectionnel, vous pouvez effectuer la recherche en utilisant les mthodes Locate et Lookup. Ces mthodes autorisent des recherches dans tout type de colonne et dans tout ensemble de donnes.
Remarque

Certains descendants de TDataSet offrent une famille supplmentaire de mthodes de recherche bases sur un index. Pour plus dinformations sur ces mthodes supplmentaires, voir Utilisation dindex pour chercher des enregistrements la page 18-32.

Utilisation de la mthode Locate


Locate dplace le curseur sur la premire ligne correspondant au critre de recherche spcifi. Dans sa forme la plus simple, vous transmettez Locate le nom de la colonne de recherche, une valeur de champ pour tablir la correspondance et un indicateur doption qui spcifie si la recherche doit tenir compte des diffrences majuscules/minuscules et si elle utilise les

18-12

Guide du dveloppeur

Recherche dans les ensembles de donnes

correspondances de cls partielles. (Correspondances dans lesquelles la chane de critre peut se limiter un prfixe de la valeur de champ.) Par exemple, le code suivant dplace le curseur sur la premire ligne de CustTable pour laquelle la valeur dans la colonne Company est Professional Divers, Ltd. :
var LocateSuccess: Boolean; SearchOptions: TLocateOptions; begin SearchOptions := [loPartialKey]; LocateSuccess := CustTable.Locate(Company, Professional Divers, Ltd., SearchOptions); end;

Si Locate trouve une correspondance, le premier enregistrement contenant cette correspondance devient lenregistrement en cours. Locate renvoie True si une correspondance est trouve et False dans le cas contraire. Si la recherche choue, lenregistrement en cours reste le mme. Le vrai potentiel de Locate se manifeste quand vous effectuez une recherche sur plusieurs colonnes et que vous spcifiez plusieurs valeurs recherches. Celles-ci sont des Variants, et vous pouvez donc sp cifier des types de donnes diffrents pour vos critres de recherche. Pour spcifier plusieurs colonnes dans une chane de recherche, sparez les lments de la chane par des points-virgules. Les valeurs recherches tant des Variants, vous devez soit transmettre un type tableau de Variants comme argument (par exemple, les valeurs renvoyes par la mthode Lookup), soit construire le tableau de Variants la vole en utilisant la fonction VarArrayOf. Le code suivant illustre une recherche sur plusieurs colonnes faisant intervenir de multiples valeurs de recherche et utilisant les correspondances de cls partielles :
with CustTable do Locate(Company;Contact;Phone, VarArrayOf([Sight Diver,P]), loPartialKey);

Locate utilise la mthode de recherche la plus rapide pour trouver les correspondances denregistrements. Si les colonnes de la recherche sont indexes et que lindex est compatible avec les options de recherche spcifies, Locate utilise cet index.

Utilisation de la mthode Lookup


Lookup recherche la premire ligne qui correspond au critre de recherche. Si elle trouve une ligne correspondante, elle force le recalcul de tous les champs calculs et de tous les champs de rfrence associs lensemble de donnes, puis elle renvoie un ou plusieurs champs de la ligne correspondante. Lookup ne dplace pas le curseur sur cette ligne ; elle ne fait que renvoyer certaines de ses valeurs. Dans sa forme la plus simple, vous transmettez Lookup le nom du champ de recherche, une valeur de champ pour tablir la correspondance et le champ ou les champs renvoyer. Par exemple, le code suivant recherche le premier enregistrement de CustTable pour laquelle la valeur dans le champ Company est

Prsentation des ensembles de donnes

18-13

Affichage et dition densembles de donnes en utilisant des filtres

Professional Divers, Ltd., puis renvoie le nom de la socit, le nom du contact commercial et son numro de tlphone :
var LookupResults: Variant; begin LookupResults := CustTable.Lookup(Company, Professional Divers, Ltd., Company;Contact; Phone); end;

Lookup renvoie les valeurs des champs spcifis du premier enregistrement quelle trouve. Les valeurs sont renvoyes en tant que Variants. Si plusieurs valeurs ont t demandes, Lookup renvoie un tableau de Variants. Sil nexiste aucun enregistrement correspondant, Lookup renvoie un Variant Null. Pour plus dinformations concernant les tableaux de Variants, voir laide en ligne. Le vrai potentiel de Lookup se manifeste quand vous effectuez une recherche sur plusieurs colonnes et que vous spcifiez plusieurs valeurs rechercher. Pour spcifier des chanes contenant plusieurs colonnes ou des champs de rsultats, vous devez sparer les lments de la chane par des points-virgules. Les valeurs recherches tant des Variants, pour transmettre plusieurs valeurs, vous devez soit transmettre un type tableau de Variants comme argument (par exemple, les valeurs renvoyes par la mthode Lookup), soit construire le tableau de Variants la vole en utilisant la fonction VarArrayOf. Le code suivant illustre une recherche sur plusieurs colonnes :
var LookupResults: Variant; begin with CustTable do LookupResults := Lookup(Company; City, VarArrayOf([Sight Diver, Christiansted]), Company; Addr1; Addr2; State; Zip); end;

Comme Locate, Lookup utilise la mthode de recherche la plus rapide pour trouver les correspondances denregistrements. Si les colonnes de la recherche sont indexes, Lookup utilise lindex.

Affichage et dition densembles de donnes en utilisant des filtres


Il arrive souvent quune application ne sintresse qu un sous-ensemble denregistrements dun ensemble de donnes. Par exemple, votre application peut souhaiter rcuprer ou visualiser dans une base de donnes des clients les enregistrements des socits dont le sige se trouve en Californie, ou bien rechercher un enregistrement contenant un ensemble de valeurs de champ dtermin. Dans tous les cas, vous pouvez utiliser des filtres pour limiter laccs dune application un sous-ensemble de tous les enregistrements de lensemble de donnes.

18-14

Guide du dveloppeur

Affichage et dition densembles de donnes en utilisant des filtres

Avec des ensembles de donnes unidirectionnels, vous ne pouvez limiter les enregistrements de lensemble de donnes que par le biais dune requte. Avec dautres descendants de TDataSet, vous pouvez toutefois dfinir un sousensemble dans les donnes dj extraites. Pour limiter laccs dune application un sous-ensemble de tous les enregistrements de lensemble de donnes, vous pouvez utiliser des filtres. Le filtre spcifie des conditions quun enregistrement doit satisfaire pour tre affich. Les conditions de filtre peuvent tre stipules dans la proprit Filter de lensemble de donnes ou codes dans son gestionnaire dvnement OnFilterRecord. Les conditions de filtre sont bases sur les valeurs contenues dans un nombre quelconque de champs dun ensemble de donnes, que ces champs soient indexs ou non. Ainsi, pour ne visualiser que les enregistrements correspondant des entreprises situes en Californie, un filtre simple consistera rechercher les enregistrements contenant la valeur CA dans le champ Etat.
Remarque

Les filtres sont appliqus chaque enregistrement rcupr dans lensemble de donnes. Pour extraire des volumes importants de donnes, il est plus efficace dutiliser une requte pour restreindre la rcupration des enregistrements ou de dfinir une porte sur un ensemble de donnes client indexe plutt que dutiliser des filtres.

Activation et dsactivation des filtres


Lactivation dun filtre sur un ensemble de donnes est un processus qui se droule en trois tapes :

1 Crer un filtre. 2 Dfinir des options de filtre pour les tests de filtres bass sur des chanes, si ncessaire. 3 Dfinir la proprit Filtered par True.
Lorsque le filtrage est activ, seuls les enregistrements correspondant au critre de filtre sont disponibles pour une application. Le filtrage est toujours une condition temporaire. Vous pouvez dsactiver le filtrage en dfinissant la proprit Filtered par False.

Cration de filtres
Les deux mthodes suivantes permettent de crer un filtre pour un ensemble de donnes : Spcifiez des conditions de filtre dans la proprit Filter. Filter est particulirement utile pour crer et appliquer des filtres lexcution. Ecrivez un gestionnaire dvnement OnFilterRecord pour les conditions de filtre simples ou complexes. Avec OnFilterRecord, les conditions de filtre sont spcifies en mode conception. A la diffrence de la proprit Filter, qui se limite une seule chane contenant une logique de filtre, lvnement

Prsentation des ensembles de donnes

18-15

Affichage et dition densembles de donnes en utilisant des filtres

OnFilterRecord peut utiliser la logique des branchements et des boucles pour crer des conditions de filtre multiniveaux et complexes. Lorsque vous crez des filtres en utilisant la proprit Filter, votre application peut crer, modifier et appliquer des filtres dynamiquement (en rponse des saisies utilisateur, par exemple). Linconvnient est que les conditions de filtre doivent pouvoir sexprimer dans une seule chane texte, ne peuvent pas utiliser des constructions base de branchements ou de boucles, et que leurs valeurs ne peuvent tre ni testes ni compares des valeurs ne figurant pas encore dans lensemble de donnes. La puissance de lvnement OnFilterRecord rside dans la possibilit pour un filtre dtre complexe et variable, dtre bas sur plusieurs lignes de code utilisant des constructions de branchements et de boucles, et de pouvoir tester et comparer les valeurs de lensemble de donnes avec des valeurs figurant lextrieur de lensemble de donnes, comme le texte dune zone de saisie. Son inconvnient est que le filtre doit tre dfini en mode conception et quil ne peut pas tre modifi en rponse des saisies utilisateur. Vous pouvez toutefois crer plusieurs gestionnaires de filtres et permuter de lun lautre en rponse certaines conditions dapplication. Les sections suivantes dcrivent comment crer des filtres en utilisant la proprit Filter et le gestionnaire dvnement OnFilterRecord.

Dfinition de la proprit Filter


Pour crer un filtre en utilisant la proprit Filter, vous devez spcifier une chane contenant la condition de filtre comme valeur de cette proprit. Par exemple, linstruction suivante cre un filtre qui a pour effet de tester le champ State dun ensemble de donnes pour voir sil contient une valeur correspondant ltat de Californie :
Dataset1.Filter := State = + QuotedStr(CA);

La valeur de la proprit Filter peut aussi tre dfinie partir du texte saisi dans un contrle. Par exemple, linstruction suivante affecte le texte dune zone de saisie la proprit Filter :
Dataset1.Filter := Edit1.Text;

Vous pouvez aussi crer une chane partir de texte cod en dur et de donnes saisies par lutilisateur dans un contrle :
Dataset1.Filter := State = + QuotedStr(Edit1.Text);

Les enregistrements vierges ne saffichent que sils sont explicitement inclus dans le filtre :
Dataset1.Filter := State <> CA or State = BLANK; Remarque

Aprs avoir spcifi une valeur pour la proprit Filter, pour appliquer le filtre lensemble de donnes, dfinissez la proprit Filtered par True.

18-16

Guide du dveloppeur

Affichage et dition densembles de donnes en utilisant des filtres

Les oprateurs logiques et de comparaison suivants permettent de comparer les valeurs des champs des littraux et des constantes :
Tableau 18.4 Oprateur
< > >= <= = <> AND NOT OR + * / *

Oprateurs logiques et de comparaison pouvant apparatre dans un filtre Signification


Infrieur Suprieur Suprieur ou gal Infrieur ou gal Egal Diffrent Teste si deux instructions valent toutes deux True Vrifie que linstruction suivante ne vaut pas True Vrifie quau moins une des deux instructions vaut True Ajoute des nombres, concatne des chanes, ajoute des nombres des valeurs date/heure (disponible seulement pour certains pilotes) Soustrait un nombre dun autre, une date dune autre ou un nombre dune date (disponible seulement pour certains pilotes) Multiplie deux nombres (disponible seulement pour certains pilotes) Divise deux nombres (disponible seulement pour certains pilotes) caractre gnrique pour des comparaisons partielles (FilterOptions doit inclure foPartialCompare)

En utilisant des combinaisons de ces oprateurs, il est possible de crer des filtres sophistiqus. Par exemple, linstruction suivante vrifie que deux conditions de test sont remplies avant dafficher un enregistrement :
(Custno > 1400) AND (Custno < 1500); Remarque

Lorsque le filtrage est activ, les modifications apportes par lutilisateur peuvent entraner que lenregistrement ne rponde plus aux conditions du filtre. La prochaine fois que lenregistrement sera extrait de lensemble de donnes, il napparatra plus. Dans ce cas, le prochain enregistrement rpondant la condition de filtre devient lenregistrement en cours.

Ecriture dun gestionnaire dvnement OnFilterRecord


Vous pouvez crire du code pour filtrer les enregistrements en utilisant les vnements OnFilterRecord gnrs par lensemble chaque rcupration denregistrement. Ce gestionnaire dvnement implmente un test qui dtermine si lenregistrement est inclus dans ceux qui sont visibles dans lapplication. Pour indiquer quun enregistrement rpond une condition de filtre, votre gestionnaire OnFilterRecord dfinit son paramtre Accept par True, pour inclure un enregistrement, ou par False, pour lexclure.

Prsentation des ensembles de donnes

18-17

Affichage et dition densembles de donnes en utilisant des filtres

Par exemple, le filtre suivant affiche uniquement les enregistrements pour lesquels le champ State vaut CA :
procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean); begin Accept := DataSet[State].AsString = CA; end;

Quand le filtrage est activ, lensemble de donnes gnre un vnement OnFilterRecord pour chaque enregistrement rcupr. Le gestionnaire dvnement teste chaque enregistrement et seuls ceux rpondant aux conditions de filtre apparaissent dans lapplication. Les performances tant directement drives du nombre de fois que lvnement se dclenche et de la dure du traitement de chaque vnement, il est conseill de rduire autant que possible le code du gestionnaire dvnement OnFilterRecord.

Permutation entre les gestionnaires dvnements filtre lexcution


Vous pouvez coder un nombre quelconque de gestionnaires dvnements OnFilterRecord et passer de lun lautre lexcution. Par exemple, les instructions suivantes permettent de passer un gestionnaire dvnement OnFilterRecord appel NewYorkFilter :
DataSet1.OnFilterRecord := NewYorkFilter; Refresh;

Dfinition doptions de filtre


La proprit FilterOptions permet de spcifier si un filtre comparant des champs bass sur des chanes accepte des enregistrements partir de comparaisons partielles et si les comparaisons chane tiennent compte de la distinction majuscules/minuscules. FilterOptions est une proprit ensemble qui peut tre un ensemble vide (la valeur par dfaut) ou contenir lune des valeurs suivantes (ou les deux) :
Tableau 18.5 Valeur
foCaseInsensitive foNoPartialCompare

Valeurs de FilterOptions Signification


Ignore les diffrences majuscules/minuscules lors de la comparaison des chanes. Dsactive les correspondances de chanes partielles, il sen suit quaucune correspondance ne peut tre tablie avec les chanes se terminant par un astrisque (*).

Par exemple, les instructions suivantes dfinissent un filtre qui ignore les diffrences majuscules/minuscules lors de la comparaison des valeurs dun champ State :
FilterOptions := [foCaseInsensitive]; Filter := State = + QuotedStr(CA);

18-18

Guide du dveloppeur

Affichage et dition densembles de donnes en utilisant des filtres

Navigation parmi les enregistrements dun ensemble de donnes filtr


Quatre mthodes permettent de naviguer parmi les enregistrements dun ensemble de donnes filtr. Le tableau suivant dresse la liste de ces mthodes et dcrit leur utilisation :
Tableau 18.6 M thodes
FindFirst

M thodes navigationnelles relatives aux ensembles de donnes filtrs Utilisation


Se positionne sur le premier enregistrement correspondant au critre de filtre en cours. Cette recherche commence toujours par le premier enregistrement de lensemble de donnes non filtr. Se positionne sur le dernier enregistrement correspondant au critre de filtre en cours. Se dplace de lenregistrement en cours dans lensemble de donnes filtr sur le prochain enregistrement. Se dplace de lenregistrement en cours dans lensemble de donnes filtr sur lenregistrement prcdent.

FindLast FindNext FindPrior

Par exemple, linstruction suivante trouve le premier enregistrement filtr dans un ensemble de donnes :
DataSet1.FindFirst;

Dans la mesure o la proprit Filter a t dfinie ou que vous avez cr un gestionnaire dvnement OnFilterRecord pour votre application, ces mthodes positionnent le curseur sur lenregistrement spcifi, que le filtre soit ou non activ. Si ces mthodes sont appeles lorsque le filtrage nest pas activ, elles provoquent les effets suivants : Le filtrage est temporairement activ. En cas de correspondance, le curseur est positionn sur un enregistrement. Le filtrage est dsactiv.
Remarque

Si le filtrage est dsactiv, si la proprit Filter na pas t dfinie et si aucun gestionnaire dvnement OnFilterRecord na t cr, ces mthodes ont le mme effet que First, Last, Next et Prior. Toutes les mthodes navigationnelles relatives aux filtres positionnent le curseur sur un enregistrement (si un enregistrement correspond au filtre spcifi), le traitent comme lenregistrement en cours et True. Si aucun enregistrement ne correspond au filtre, la position du curseur reste inchange, et les mthodes renvoient False. Vous pouvez vrifier ltat de la proprit Found pour envelopper ces appels et nagir que lorsque Found vaut True. Par exemple, si le curseur est dj positionn sur le dernier enregistrement correspondant de lensemble de donnes lorsque vous appelez FindNext, la mthode renvoie False, et lenregistrement en cours reste le mme.

Prsentation des ensembles de donnes

18-19

Modification des donnes

Modification des donnes


Vous pouvez utiliser les mthodes densembles de donnes suivantes pour insrer, mettre jour et supprimer des donnes si la proprit en lecture seule CanModify vaut True. CanModify vaut True sauf si lensemble de donnes est unidirectionnel, la base de donnes sous-jacente lensemble de donnes ne reconnat pas les droits daccs en lecture et en criture ou un autre facteur intervient. (Les facteurs pouvant intervenir sont la propritReadOnly de certains ensembles de donnes ou la proprit RequestLive des composants TQuery.)
Tableau 18.7 M thode
Edit Append Insert Post

M thodes des ensembles de donnes pour diter des donnes Description


Met lensemble de donnes ltat dsEdit sil nest pas dj ltat dsEdit ou dsInsert. Emet les donnes en suspens, dplace le curseur la fin de lensemble de donnes, puis met ce dernier ltat dsInsert. Emet les donnes en suspens, puis met lensemble de donnes ltat dsInsert. Tente dmettre lenregistrement nouveau ou modifi vers la base de donnes. Si lopration russit, lensemble de donnes est mis ltat dsBrowse ; dans le cas contraire, son tat en cours reste inchang. Annule lopration en cours et met lensemble de donnes ltat dsBrowse. Supprime lenregistrement en cours et met lensemble de donnes ltat dsBrowse.

Cancel Delete

Modification denregistrements
Un ensemble de donnes doit tre en mode dsEdit pour que lapplication puisse modifier des enregistrements. Dans votre code, vous pouvez utiliser la mthode Edit pour basculer un ensemble de donnes en mode dsEdit si la proprit en lecture seule CanModify de lensemble de donnes vaut True. Quand un ensemble de donnes passe en mode dsEdit, il reoit dabord un vnement BeforeEdit. Une fois le passage en mode dition russi, lensemble de donnes reoit un vnement AfterEdit. En gnral, ces vnements sont utiliss pour mettre jour linterface utilisateur afin quelle indique ltat en cours de lensemble de donnes. Si lensemble de donnes ne peut passer en mode dition pour une raison ou pour une autre, un vnement OnEditError survient, grce auquel vous pouvez informer lutilisateur du problme ou essayer de corriger la situation qui a empch lensemble de donnes de passer en mode dition. Dans les fiches de votre application, certains contrles orients donnes pourront mettre automatiquement votre ensemble de donnes ltat dsEdit si La proprit ReadOnly du contrle vaut False (la valeur par dfaut). La proprit AutoEdit de la source de donnes du contrle vaut True et La proprit CanModify de lensemble de donnes vaut True.

18-20

Guide du dveloppeur

Modification des donnes

Remarque

Mme si un ensemble de donnes est ltat dsEdit, la modification denregistrements peut chouer pour les bases de donnes SQL si lutilisateur de votre application ne dispose pas des droits daccs SQL appropris. Quand un ensemble de donnes se trouve en mode dsEdit, lutilisateur peut modifier toutes les valeurs de champ de lenregistrement qui apparat dans les contrles orients donnes dune fiche. Les contrles orients donnes, pour lesquels la modification est active automatiquement, appellent Post quand lutilisateur accomplit une action qui change la position du curseur (comme le dplacement vers un autre enregistrement dans une grille). Si vous avez mis un composant navigateur dans votre fiche, lutilisateur peut annuler les modifications en cliquant sur le bouton Annuler du navigateur. Lannulation des modifications renvoie lensemble de donnes ltat dsBrowse. Dans votre code, vous devez valider ou annuler les modifications en appelant les mthodes appropries. Les modifications sont valides par lappel de Post. Vous les annulez en appelant Cancel. Les mthodes Edit et Post sont souvent utilises conjointement. Par exemple,
with CustTable do begin Edit; FieldValues[CustNo] := 1234; Post; end;

Dans lexemple prcdent, la premire ligne du fragment de code place lensemble de donnes en mode dsEdit. La ligne suivante affecte la chane 1234 au champ CustNo de lenregistrement en cours. Pour finir, la dernire ligne crit (met) lenregistrement modifi. Si les mises jour ne sont pas en mmoire cache, les modifications sont crites en retour dans la base de donnes. Si les mises jour sont en mmoire cache, les modifications sont crites dans un tampon temporaire, o elles restent jusqu ce que la mthode ApplyUpdates de lensemble de donnes soit appele.

Ajout de nouveaux enregistrements


Un ensemble de donnes doit tre en mode dsInsert pour que lapplication puisse ajouter de nouveaux enregistrements. Dans votre code, vous pouvez utiliser les mthodes Insert ou Append pour mettre un ensemble de donnes en mode dsInsert si la proprit CanModify de lensemble de donnes, accessible seulement en lecture, vaut True. Quand un ensemble de donnes passe en mode dsInsert, il reoit dabord un vnement BeforeInsert. Une fois le passage en mode insertion russi, lensemble de donnes reoit dabord un vnement OnNewRecord, puis un vnement AfterInsert. Vous pouvez utiliser ces vnements, par exemple, pour fournir les valeurs initiales des enregistrements que vous venez dinsrer.
procedure TForm1.OrdersTableNewRecord(DataSet: TDataSet); begin DataSet.FieldByName(OrderDate).AsDateTime := Date; end;

Prsentation des ensembles de donnes

18-21

Modification des donnes

Dans les fiches de votre application, les contrles orients donnes grille et navigateur pourront mettre automatiquement votre ensemble de donnes ltat dsInsert si les conditions suivantes sont runies : La proprit ReadOnly du contrle vaut False (la valeur par dfaut). La proprit CanModify de lensemble de donnes vaut True.
Remarque

Mme si un ensemble de donnes est ltat dsInsert, lajout denregistrements peut chouer pour les bases de donnes SQL si lutilisateur de votre application ne dispose pas des droits daccs SQL appropris. Quand un ensemble de donnes se trouve en mode dsInsert, lutilisateur ou bien lapplication peut entrer des valeurs dans les champs associs au nouvel enregistrement. Sauf pour les contrles grille et navigateur, il ny a aucune diffrence apparente entre Insert et Append. Lors dun appel Insert, une ligne vide apparat dans la grille au-dessus de lenregistrement en cours. Lors dun appel Append, la grille dfile jusquau dernier enregistrement de lensemble de donnes, une ligne vide apparat la fin de la grille, et les boutons Suivant et Prcdent sont griss sur tout composant navigateur associ lensemble de donnes. Les contrles orients donnes, pour lesquels linsertion est active automatiquement, appellent Post quand lutilisateur accomplit une action qui change la position du curseur (comme le dplacement vers un autre enregistrement dans une grille). Vous devez sinon appeler Post dans votre code. Post crit le nouvel enregistrement dans la base de donnes ou, si vous utilisez les mises jour en mmoire cache, Post crit lenregistrement dans un cache en mmoire. Pour crire les insertions mises en mmoire cache et les ajouter la base de donnes, appelez la mthode ApplyUpdates de lensemble de donnes.

Insertion denregistrements
Insert ouvre un nouvel enregistrement vide avant lenregistrement en cours, puis positionne le curseur sur ce nouvel enregistrement de faon que les valeurs de champ puissent tre entres par lutilisateur ou par le code de votre application. Quand une application Post (ou ApplyUpdates si vous utilisez les mises jour en mmoire cache), le nouvel enregistrement insr peut tre crit comme suit dans le journal des modifications : Pour les tables Paradox et dBASE indexes, lenregistrement est insr dans lensemble de donnes une position dtermine par lindex. Pour les tables Paradox et dBASE non indexes, lenregistrement est insr dans lensemble de donnes sa position actuelle. Pour les bases de donnes SQL, lemplacement physique de linsertion est spcifique limplmentation. Si la table est indexe, lindex est mis jour avec les donnes du nouvel enregistrement.

18-22

Guide du dveloppeur

Modification des donnes

Ajout denregistrements la fin


Append ouvre un nouvel enregistrement vide la fin de lensemble de donnes, en faisant en sorte que lenregistrement vide devienne lenregistrement en cours afin que les valeurs de champ de lenregistrement puissent tre entres par lutilisateur ou par le code de votre application. Quand une application Post (ou ApplyUpdates si vous utilisez les mises jour en mmoire cache), le nouvel enregistrement ajout peut tre crit comme suit dans le journal des modifications : Pour les tables Paradox et dBASE indexes, lenregistrement est insr dans lensemble de donnes une position dtermine par lindex. Pour les tables Paradox et dBASE non indexes, lenregistrement est ajout la fin de lensemble de donnes. Pour les bases de donnes SQL, lemplacement physique de lajout est spcifique limplmentation. Si la table est indexe, lindex est mis jour avec les donnes du nouvel enregistrement.

Suppression denregistrements
Utilisez la mthode Delete pour supprimer lenregistrement en cours dun ensemble de donnes actif. Quand la mthode Delete est appele,

1 Lensemble de donnes reoit un vnement BeforeDelete. 2 Lensemble de donnes tente de supprimer lenregistrement en cours. 3 Lensemble de donnes revient ltat dsBrowse. 4 Lensemble de donnes reoit un vnement AfterDelete.
Si vous voulez empcher la suppression dans le gestionnaire dvnement BeforeDelete, vous pouvez appeler la procdure globale Abort :
procedure TForm1.TableBeforeDelete (Dataset: TDataset)begin if MessageDlg(Delete This Record?, mtConfirmation, mbYesNoCancel, 0) <> mrYes then Abort; end;

Si Delete choue, elle gnre un vnement OnDeleteError. Si le gestionnaire dvnement OnDeleteError ne peut pas corriger le problme, lensemble de donnes reste dans ltat dsEdit. Si Delete russit, lensemble de donnes revient ltat dsBrowse et lenregistrement suivant celui qui est supprim devient lenregistrement en cours. Si les mises jour sont en mmoire cache, lenregistrement supprim nest enlev de la table de la base de donnes sous-jacente que si vous appelez ApplyUpdates. Si vous avez dot vos fiches dun composant navigateur, les utilisateurs pourront supprimer lenregistrement en cours en cliquant sur le bouton deffacement. Dans votre code, vous devez appeler explicitement Delete pour supprimer lenregistrement en cours.

Prsentation des ensembles de donnes

18-23

Modification des donnes

Validation des donnes


Quand vous avez fini de modifier un enregistrement, vous devez appeler la mthode Post pour crire effectivement les modifications. La mthode Post se comporte de faon diffrente selon ltat dans lequel se trouve lensemble de donnes et selon que vous mettiez ou non les mises jour en mmoire cache. Si vous ne mettez pas les mises jour en mmoire cache, et que lensemble de donnes est dans ltat dsEdit ou dsInsert, Post crit lenregistrement en cours dans la base de donnes et remet lensemble de donnes dans ltat dsBrowse. Si vous mettez les mises jour en mmoire cache, et que lensemble de donnes est dans ltat dsEdit ou dsInsert, Post crit lenregistrement en cours dans un cache interne et remet lensemble de donnes dans ltat dsBrowse. Les modifications ne sont crites dans la base de donnes que lorsque vous appelez ApplyUpdates. Si lensemble de donnes est dans ltat dsSetKey, Post le met dans ltat dsBrowse. Quel que soit ltat initial de lensemble de donnes, Post gnre des vnements BeforePost et AfterPost, avant et aprs lcriture des modifications en cours. Vous pouvez utiliser ces vnements pour mettre jour linterface utilisateur, ou empcher lensemble de donnes de valider les modifications en appelant la procdure Abort. Si lappel Post choue, lensemble de donnes reoit un vnement OnPostError, dans lequel vous pouvez informer lutilisateur du problme ou essayer de le corriger. Lmission peut se faire, soit explicitement soit implicitement, comme partie intgrante dune autre procdure. Quand une application quitte lenregistrement en cours, Post est appele implicitement. Les appels aux mthodes First, Next, Prior et Last effectuent une validation (Post) si la table est en mode dsEdit ou dsInsert. En outre, les mthodes Append et Insert valident implicitement toute donne en suspens.
Attention

La mthodeClose nappelle pas implicitement Post. Utilisez lvnement BeforeClose pour valider explicitement toute modification en suspens.

Annulation des modifications


Une application peut tout moment annuler les changements apports lenregistrement en cours, si elle na pas, directement ou indirectement, dj appel Post. Par exemple, si un ensemble de donnes est en mode dsEdit et quun utilisateur a chang les donnes dun ou de plusieurs champs, lapplication peut rtablir les valeurs initiales de lenregistrement en appelant la mthode Cancel de lensemble de donnes. Un appel Cancel remet toujours lensemble de donnes dans ltat dsBrowse. Si lensemble de donnes tait en mode dsEdit ou dsInsert lorsque votre application a appel Cancel, il reoit les vnements BeforeCancel et AfterCancel avant et aprs la restauration des valeurs initiales de lenregistrement en cours.

18-24

Guide du dveloppeur

Modification des donnes

Pour une fiche, vous pouvez permettre lutilisateur dannuler les oprations de modification, dinsertion, et dajout en incluant le bouton Annuler dans un composant navigateur associ lensemble de donnes, ou bien le code de votre propre bouton dannulation.

Modification denregistrements entiers


Dans les fiches, tous les contrles orients donnes, lexception des grilles et des navigateurs, donnent accs un champ unique denregistrement. Par contre, dans votre code, vous pouvez utiliser les mthodes suivantes qui fonctionnent sur des structures denregistrements entiers condition toutefois que la structure des tables de la base sous-jacente lensemble de donnes soit stable et ne subisse aucun changement. Le tableau suivant rcapitule les mthodes disponibles pour manipuler des enregistrements entiers plutt que des champs individuels de ces enregistrements :
Tableau 18.8 M thode
AppendRecord([tableau de valeurs]) InsertRecord([tableau de valeurs]) SetFields([tableau de valeurs])

M thodes qui oprent sur des enregistrements entiers Description


Ajoute un enregistrement avec les valeurs de colonne spcifies la fin de la table ; analogue Append. Excute implicitement Post. Insre un enregistrement avec les valeurs de colonne spcifies avant la position en cours du curseur dans la table ; analogue Insert. Excute implicitement Post. Dfinit les valeurs des champs correspondants ; analogue laffectation de valeurs aux composants TField. Lapplication doit excuter explicitement Post.

Chacune de ces mthodes accepte comme argument un tableau de valeurs, o chaque valeur correspond une colonne de lensemble de donnes sous-jacent. Les valeurs peuvent tre littrales, variables ou NULL. Si le nombre de valeurs de largument est infrieur au nombre de colonnes dans lensemble de donnes, les valeurs restantes sont supposes avoir la valeur NULL. Pour les ensembles de donnes non indexs, AppendRecord ajoute un enregistrement la fin de lensemble de donnes et InsertRecord insre un enregistrement aprs la position en cours du curseur. Pour les ensembles de donnes indexs, les deux mthodes placent lenregistrement la bonne position dans la table, dtermine par lindex. Dans les deux cas, les deux mthodes dplacent le curseur sur le nouvel enregistrement. SetFields affecte les valeurs spcifies dans le tableau de paramtres aux champs de lensemble de donnes. Pour utiliser SetFields, lapplication doit dabord appeler Edit pour mettre lensemble de donnes en mode dsEdit. Pour appliquer les modifications dans lenregistrement en cours, elle doit excuter Post. Si vous utilisez SetFields pour modifier certains champs, et non tous les champs dun enregistrement existant, vous pouvez transmettre des valeurs NULL pour les champs que vous ne voulez pas changer. Si vous ne fournissez pas un

Prsentation des ensembles de donnes

18-25

Champs calculs

nombre de valeurs correspondant au nombre de champs dun enregistrement, SetFields leur affecte la valeur NULL. Les valeurs NULL crasent les valeurs existantes de ces champs. Par exemple, supposons quune base de donnes dispose dune table COUNTRY avec les colonnes Name, Capital, Continent, Area et Population. Si un composant TTable appel CountryTable a t li la table COUNTRY, linstruction suivante insrera un enregistrement dans la table COUNTRY :
CountryTable.InsertRecord([Japan, Tokyo, Asia]);

Cette instruction ne spcifie aucune valeur pour Area et Population, des valeurs NULL leur sont donc affectes. La table est indexe sur Name, lenregistrement est donc insr la position alphabtique de Japan. Pour mettre jour lenregistrement, lapplication peut utiliser le code suivant :
with CountryTable do begin if Locate(Name, Japan, loCaseInsensitive) then; begin Edit; SetFields(nil, nil, nil, 344567, 164700000); Post; end; end;

Ce code affecte des valeurs aux champs Area et Population, avant de les enregistrer dans la base de donnes. Les trois pointeurs NULL agissent comme marqueurs de remplissage des trois premires colonnes pour indiquer que leur contenu actuel doit tre prserv.

Champs calculs
En utilisant lditeur de champs, vous pouvez dfinir des champs calculs pour vos ensembles de donnes. Quand un ensemble de donnes contient des champs calculs, vous fournissez le code calculant les valeurs de ces champs dans un gestionnaire dvnement OnCalcFields. Pour des dtails sur la dfinition des champs calculs en utilisant lditeur de champs, voir Dfinition dun champ calcul la page 19-8. La proprit AutoCalcFields dtermine quand OnCalcFields est appel. Si AutoCalcFields vaut True, OnCalcFields est appel quand : Un ensemble de donnes est ouvert. Lensemble de donnes passe en mode dition. Un enregistrement est rcupr dans la base de donnes. La focalisation se dplace dun composant visuel un autre, ou bien dune colonne une autre dans un contrle grille orient donnes.

18-26

Guide du dveloppeur

Types densembles de donnes

Si AutoCalcFields vaut False, alors OnCalcFields nest pas appel quand on modifie individuellement des champs se trouvant lintrieur dun enregistrement (la quatrime condition ci-dessus).
Attention

Comme OnCalcFields est frquemment appel, lexcution du code que vous crivez pour ce gestionnaire doit tre brve. En outre, si AutoCalcFields vaut True, OnCalcFields ne doit accomplir aucune action qui modifie lensemble de donnes (ou lensemble de donnes li sil fait partie dune relation matre-dtail), car cela induit une rcursion. Par exemple, si OnCalcFields excute Post, et que AutoCalcFields True, alors OnCalcFields est nouveau appel, provoquant un nouvel appel Post, etc. Quand OnCalcFields sexcute, lensemble de donnes passe en mode dsCalcFields. Cet tat empche les modifications et les ajouts dans les enregistrements sauf sils sappliquent aux champs calculs modifis par le gestionnaire lui-mme. La raison qui empche dautres modifications est que OnCalcFields utilise les valeurs des autres champs pour driver celles des champs calculs. Sinon, les changements des autres champs pourraient invalider les valeurs affectes aux champs calculs. Lexcution de OnCalcFields acheve, lensemble de donnes revient ltat dsBrowse.

Types densembles de donnes


Utilisation des descendants de TDataSet la page 18-2 classe les descendants de TDataSet selon la mthode quils utilisent pour accder leurs donnes. Un autre moyen pratique de classer les descendants de TDataSet est de considrer le type de donnes du serveur quils reprsentent. Selon ce moyen, il y a trois classes densembles de donnes de base : Ensembles de donnes de type table : Les ensembles de donnes de type table reprsentent une seule table du serveur de base de donnes, avec toutes ses lignes et toutes ses colonnes. Les ensembles de donnes de type table sont TTable, TADOTable, TSQLTable et TIBTable. Les ensembles de donnes de type table vous permettent de bnficier des index dfinis sur le serveur. Comme il y a une correspondance un--un entre la table de la base de donnes et lensemble de donnes, vous pouvez utiliser les index du serveur qui ont t dfinis pour cette table. Les index permettent votre application de trier les enregistrement de la table, acclrent les recherches et les rfrences, et peuvent servir de base une relation matre/ dtail. Certains ensembles de donnes de type table tirent galement avantage de la relation un--un lentre ensemble de donnes et la table de la base de donnes pour vous permettre deffectuer des oprations comme la cration et la suppression de tables. Ensembles de donnes de type requte : Les ensembles de donnes de type requte reprsentent une seule commande, ou requte, SQL. Les requtes peuvent reprsenter lensemble de rsultats dune commande dexcution (gnralement une instruction SELECT) ou peuvent excuter une commande qui ne renvoie aucun enregistrement (par exemple une instruction UPDATE).

Prsentation des ensembles de donnes

18-27

Types densembles de donnes

Les ensembles de donnes de type requte sont TQuery, TADOQuery, TSQLQuery et TIBQuery. Pour utiliser efficacement un ensemble de donnes de type requte, vous devez tre familier de SQL et de limplmentation SQL de votre serveur, y compris des limitations et des extensions du standard SQL-92. Si vous dbutez dans SQL, vous pouvez vous procurer un manuel externe qui traite de SQL en dtail. Un des meilleurs est Understanding the New SQL: A Complete Guide, de Jim Melton et Alan R. Simpson, Morgan Kaufmann Publishers. Ensembles de donnes de type procdure : Les ensembles de donnes de type procdure reprsentent une procdure stocke sur le serveur de base de donnes. Les ensembles de donnes de type procdure sont TStoredProc, TADOStoredProc, TSQLStoredProc et TIBStoredProc. Une procdure stocke est un programme autonome crit dans le langage de procdure et de dclenchement propre au systme de base de donnes utilis. Elles grent, en gnral, les tches trs rptitives sur les bases de donnes et sont particulirement utiles pour les oprations qui sappliquent un grand nombre denregistrements ou qui utilisent des fonctions statistiques et mathmatiques. Les procdures stockes amliorent gnralement les performances des applications de bases de donnes, car : Elles tirent parti de la plus grande puissance et de la plus grande rapidit fournies par le serveur. Elles rduisent le trafic sur le rseau en dplaant le traitement sur le serveur. Les procdures stockes peuvent renvoyer des donnes ou non. Celles qui le font doivent renvoyer les donnes sous forme dun curseur (comme le rsultat dune requte SELECT), sous forme de plusieurs curseurs (en renvoyant rellement plusieurs ensembles de donnes), ou dans des paramtres de sortie. Ces diffrences proviennent en partie du serveur : certains dentre eux nautorisent pas les procdures stockes renvoyer des donnes ou nautorisent que les paramtres de sortie. Certains autres ne supportent pas les procdures stockes. Reportez-vous la documentation de votre serveur pour savoir ce quil propose.
Remarque

Vous pouvez, en gnral, utiliser un ensemble de donnes de type requte pour excuter des procdures stockes car la plupart des serveurs fournissent des extensions SQL permettant de travailler avec les procdures stockes. Mais, chaque serveur utilise pour cela sa propre syntaxe. Si vous choisissez dutiliser un ensemble de donnes de type requte la place dun ensemble de donnes de type procdure stocke, cherchez la syntaxe ncessaire dans la documentation de votre serveur. Outre les ensembles de donnes faisant clairement partie dune de ces trois catgories, quelques descendants de TDataSet appartiennent plusieurs catgories : TADODataSet et TSQLDataSetpossdent une proprit CommandType qui vous permet de spcifier sils reprsentent une table, une requte ou une procdure stocke. Les proprits et les mthodes sont presque les mmes que celles des

18-28

Guide du dveloppeur

Utilisation densembles de donnes de type table

ensembles de donnes de type requte, bien que TADODataSet vous permette de spcifier un index comme dans les ensembles de donnes de type table. TClientDataSet reprsente les donnes dun autre ensemble de donnes. De ce fait, il peut reprsenter une table, une requte et une procdure stocke. TClientDataSet se comporte pratiquement comme un ensemble de donnes de type table puisquil supporte les index. Mais, il possde aussi quelques fonctionnalits des requtes et des procdures stockes : la gestion des paramtres et la possibilit de sexcuter sans renvoyer densemble de rsultats. Dautres ensembles de donnes client (TBDEClientDataSet et TSQLClientDataSet ) possdent une proprit CommandType qui vous permet de spcifier sils reprsentent une table, une requ te ou une procdure stocke. Les proprits et mthodes sont comme TClientDataSet , y compris le support des paramtres, des index, et la possibilit de sexcuter sans renvoyer densemble de rsultats. TIBDataSet peut reprsenter la fois des requtes et des procdures stockes. En fait, il peut reprsenter plusieurs requ tes et procdures stockes simultanment, sans quil y ait des proprits diffrentes pour chacune.

Utilisation densembles de donnes de type table


Pour utiliser un ensemble de donnes de type table,

1 Placez le composant appropri dans un module de donnes ou sur une fiche, et attribuez sa proprit Name une valeur unique approprie votre application. 2 Identifiez le serveur de base de donnes qui contient les donnes utiliser. Chaque ensemble de donnes de type table fait cela diffremment, mais, en gnral, il faut spcifier un composant de base de donnes :
Pour TTable, spcifiez un composant TDatabase ou un alias BDE en utilisant la proprit DatabaseName. Pour TADOTable, spcifiez un composant TADOConnection en utilisant la proprit Connection. Pour TSQLTable, spcifiez un composant TSQLConnection en utilisant la proprit SQLConnection. Pour TIBTable, spcifiez un composant TIBConnection en utilisant la proprit Database. Pour plus dinformations sur lutilisation des composants connexion aux bases de donnes, voir chapitre 17, Connexion aux bases de donnes.

3 Dfinissez la proprit TableName par le nom de la table de la base de donnes. Vous pouvez slectionner des tables dans une liste droulante si vous avez dj identifi un composant connexion aux bases de donnes.

Prsentation des ensembles de donnes

18-29

Utilisation densembles de donnes de type table

4 Placez un composant source de donnes dans le module de donnes ou sur la fiche, et dfinissez sa proprit DataSet par le nom de lensemble de donnes. Le composant source de donnes est utilis pour transmettre un ensemble de rsultats afficher entre lensemble de donnes et les composants orients donnes.

Avantages de lutilisation des ensembles de donnes de type table


Le principale avantage de lutilisation des ensembles de donnes de type table est la disponibilit des index. Les index permettent votre application de Trier les enregistrements de lensemble de donnes. Localiser rapidement les enregistrements. Limiter les enregistrements visibles. Etablir des relations matre/dtail.

De plus, la relation un--un entre les ensembles de donnes de type table et les tables de bases de donnes permet nombre dentre eux dtre utiliss pour les oprations suivantes : Contrle des accs en lecture/criture aux tables Cration et suppression des tables Vidage des tables Synchronisation des tables

Tri des enregistrements avec des index


Un index dtermine lordre daffichage des enregistrements dune table. En gnral, les enregistrements apparaissent dans lordre ascendant selon un index primaire, ou par dfaut. Ce comportement par dfaut ne requiert pas lintervention de lapplication. Si vous voulez un ordre de tri diffrent, vous devez spcifier au choix Un autre index. La liste des colonnes sur lesquelles trier (non disponible sur les serveurs non bass sur SQL). Les index vous permettent de prsenter les donnes dune table selon des ordres diffrents. Pour les tables SQL, cet ordre de tri est implment en utilisant lindex pour gnrer une clause ORDER BY dans une requte lisant les enregistrements dune table. Pour les autres tables (comme Paradox et dBASE), lindex est utilis par le mcanisme daccs aux donnes pour prsenter les donnes dans lordre voulu.

Obtention dinformations sur les index


Votre application peut obtenir des informations sur les index dfinis par le serveur partir de tout ensemble de donnes de type table. Pour obtenir la liste des index disponibles pour lensemble de donnes, appelez la mthode GetIndexNames. GetIndexNames remplit une liste de chanes avec des noms

18-30

Guide du dveloppeur

Utilisation densembles de donnes de type table

dindex valides. Par exemple, le code suivant remplit une bote liste des noms de tous les index dfinis pour lensemble de donnes CustomersTable :
CustomersTable.GetIndexNames(ListBox1.Items); Remarque

Pour les tables Paradox, lindex primaire nest pas nomm et nest donc pas renvoy par GetIndexNames. Vous pouvez quand mme redfinir en index primaire lindex dune table Paradox, lorsque vous avez utilis un autre index, en dfinissant la proprit IndexName par une chane vide. Pour obtenir des informations sur les champs de lindex en cours, utilisez les proprits IndexFieldCount, qui dtermine le nombre de colonnes de lindex. IndexFields, qui examine la liste des composants champ des colonnes qui constituent lindex. Le code suivant illustre lutilisation des proprits IndexFieldCount et IndexFields pour parcourir une liste de noms de colonnes dans une application :
var I: Integer; ListOfIndexFields: array[0 to 20} of string; begin with CustomersTable do begin for I := 0 to IndexFieldCount - 1 do ListOfIndexFields[I] := IndexFields[I].FieldName; end; end;

Remarque

IndexFieldCount nest pas valide pour une table dBASE ouverte sur une expression dindex.

Spcification dun index avec IndexName


Utilisez la proprit IndexName pour forcer un index tre actif. Une fois actif, un index dtermine lordre des enregistrements dun ensemble de donnes. (Il peut aussi tre utilis pour un lien matre-dtail, une recherche indexe ou un filtrage index). Pour activer un index, dfinissez la proprit IndexName par le nom de lindex. Dans certains systmes de bases de donnes, les index primaires nont pas de nom. Pour activer un de ces index, dfinissez la proprit IndexName par une chane vide. A la conception, vous pouvez slectionner un index dans la liste des index disponibles, en cliquant sur le bouton points de suspension dans linspecteur dobjets. A lexcution, dfinissez IndexName en utilisant un littral ou une variable String. Pour obtenir la liste des index disponibles, appelez la mthode GetIndexNames. Le code suivant dfinit lindex de CustomersTable par CustDescending :
CustomersTable.IndexName := CustDescending;

Prsentation des ensembles de donnes

18-31

Utilisation densembles de donnes de type table

Cration dun index avec IndexFieldNames


Si aucun index nest dfini pour implmenter lordre de tri que vous voulez, vous pouvez crer un pseudo-index en utilisant la proprit IndexFieldNames.
Remarque

IndexName et IndexFieldNames sexcluent mutuellement. Dfinir la valeur de lune efface la valeur de lautre. La valeur de IndexFieldNames est de type string. Pour spcifier un ordre de tri, indiquez chacun des noms de colonnes dans lordre o ils doivent tre utiliss en les dlimitant par des points-virgules. Le tri est uniquement croissant. La distinction majuscules/minuscules du tri dpend des capacits de votre serveur. Consultez la documentation de votre serveur pour davantage dinformations. Le code suivant dfinit lordre de tri de PhoneTable selon LastName, puis FirstName :
PhoneTable.IndexFieldNames := LastName;FirstName;

Remarque

Si vous utilisez IndexFieldNames sur des tables Paradox ou dBASE, lensemble de donnes tente de trouver un index utilisant les colonnes que vous avez spcifies. Sil nen trouve pas, il dclenche une exception.

Utilisation dindex pour chercher des enregistrements


Vous pouvez effectuer une recherche dans nimporte quel ensemble de donnes en utilisant les mthodes Locate et Lookup de TDataSet. Mais, lutilisation explicite dindex, peut amliorer pour certains ensembles de donnes de type table les performances de recherche des mthodes Locate et Lookup. Les ensembles de donnes ADO supportent tous la mthode Seek, qui permet daller sur un enregistrement grce un ensemble de valeurs des champs de lindex en cours. Seek vous permet de spcifier o placer le curseur par rapport au premier ou au dernier enregistrement correspondant. TTable et tous les types densembles de donnes client supportent des recherches indexes similaires, mais ils utilisent une combinaison de mthodes correspondantes. Le tableau suivant prsente les six mthodes fournies par TTable et les ensembles de donnes client pour prendre en charge les recherches indexes :
Tableau 18.9 M thode
EditKey

M thodes de recherche indexe Utilisation


Rserve le contenu actuel du tampon de cls de recherche et place lensemble de donnes en mode dsSetKey afin de permettre votre application de modifier les critres de recherche existants avant lexcution de la recherche. Combine les mthodes SetKey et GotoKey en une seule m thode. Combine les mthodes SetKey et GotoNearest en une seule mthode. Recherche le premier enregistrement dun ensemble de donnes correspondant exactement au critre de recherche et place le curseur dessus sil en trouve un.

FindKey FindNearest GotoKey

18-32

Guide du dveloppeur

Utilisation densembles de donnes de type table

Tableau 18.9 M thode


GotoNearest

M thodes de recherche indexe (suite) Utilisation


Recherche dans des champs chane la correspondance la plus proche pour un enregistrement, en se basant sur des valeurs de cl partielles et place le curseur sur cet enregistrement. Efface le contenu du tampon de cls de recherche et active ltat dsSetKey pour la table afin de permettre votre application de spcifier un nouveau critre avant dexcuter une recherche.

Indexation (SetKey)

GotoKeyet FindKey sont des fonctions boolennes qui, en cas de succs, placent le curseur sur un enregistrement correspondant et renvoient True. Si la recherche naboutit pas, le curseur nest pas dplac et ces fonctions renvoient False. GotoNearest et FindNearest provoquent toujours le repositionnement du curseur sur la premire correspondance exacte trouve ou, si aucune correspondance nest trouve, sur le premier enregistrement suprieur au critre de recherche spcifi.

Excution dune recherche avec les mthodes Goto


Pour excuter une recherche en utilisant les mthodes Goto, procdez comme suit :

1 Spcifiez lindex utiliser pour la recherche. Cest le mme index qui trie les enregistrements dans lensemble de donnes (voir Tri des enregistrements avec des index la page 18-30). Pour spcifier lindex, utilisez les proprits IndexName ou IndexFieldNames. 2 Ouvrez lensemble de donnes. 3 Mettez lensemble de donnes client ltat dsSetKey en appelant la mthode SetKey. 4 Spcifiez la ou les valeurs rechercher dans la proprit Fields. Fields est un objet TFields, qui gre une liste indexe de composants champ auxquels vous pouvez accder en spcifiant les numros ordinaux correspondant chaque colonne. Le premier numro de colonne dun ensemble de donnes est 0. 5 Recherchez et accdez au premier enregistrement trouv avec GotoKey ou GotoNearest.
Par exemple, le code ci-dessous, quand il est rattach lvnement OnClick dun bouton, utilise la mthode GotoKey pour passer au premier enregistrement dont la valeur du premier champ de lindex correspond exactement au texte de la zone de saisie :
procedure TSearchDemo.SearchExactClick(Sender: TObject); begin ClientDataSet1.SetKey; ClientDataSet1.Fields[0].AsString := Edit1.Text; if not ClientDataSet1.GotoKey then ShowMessage(Enregistrement non trouv); end;

Prsentation des ensembles de donnes

18-33

Utilisation densembles de donnes de type table

GotoNearest est similaire. Elle recherche la premire occurrence correspondant une valeur de champ partielle. Elle ne peut tre utilise que pour des champs chane. Par exemple,
Table1.SetKey; Table1.Fields[0].AsString := Sm; Table1.GotoNearest;

Sil existe un enregistrement dont la valeur du premier champ index commence par les lettres Sm, le curseur se positionne dessus. Sinon, la position du curseur ne change pas et GotoNearest renvoie False.

Excution dune recherche avec les mthodes Find


Les mthodes Find font la mme chose que les mthodes Goto, la diffrence que vous navez pas besoin de mettre explicitement lensemble de donnes ltat dsSetKey pour spcifier les valeurs de champ cl servant de base la recherche. Pour excuter une recherche en utilisant les mthodes Find, procdez comme suit :

1 Spcifiez lindex utiliser pour la recherche. Cest le mme index qui trie les enregistrement dans lensemble de donnes (voir Tri des enregistrements avec des index la page 18-30). Pour spcifier lindex, utilisez les proprits IndexName ou IndexFieldNames. 2 Ouvrez lensemble de donnes. 3 Recherchez et accdez au premier enregistrement correspondant plus proche avec FindKey ou FindNearest. Les deux mthodes ne quun seul argument : une liste de valeurs de champ dlimites virgules (chaque valeur correspond une colonne dindex de la jacente).
Remarque

trouv ou au prennent par des table sous-

FindNearest ne peut tre utilise que pour les champs chane.

Spcification de lenregistrement en cours aprs une recherche russie


Par dfaut, une recherche russie provoque le positionnement du curseur sur le premier enregistrement correspondant au critre de recherche. Si vous prfrez, vous pouvez mettre la proprit KeyExclusive True afin de positionner le curseur sur lenregistrement suivant le premier enregistrement correspondant au critre de recherche. Par dfaut, la proprit KeyExclusive est False, et positionne le curseur sur le premier enregistrement correspondant au critre de recherche si celle-ci aboutit.

Recherche sur des cls partielles


Si lensemble de donnes comporte plusieurs colonnes cl et si vous voulez rechercher des valeurs dans un sous-ensemble dune cl, vous devez donner KeyFieldCount une valeur correspondant au nombre de colonnes sur lesquelles la recherche est effectue. Par exemple, si lindex en cours de lensemble de donnes comprend trois colonnes et si vous voulez effectuer une recherche sur la premire colonne seulement, vous devez donner KeyFieldCount la valeur 1.

18-34

Guide du dveloppeur

Utilisation densembles de donnes de type table

En ce qui concerne les ensembles de donnes de type table avec des cls multicolonnes, vous ne pouvez rechercher les valeurs que dans des colonnes contigus, en commenant par la premire. Par exemple, pour une cl portant sur trois colonnes, vous pouvez rechercher des valeurs dans la premire colonne, puis dans la premire et la seconde, ou bien dans la premire, la seconde et la troisime, mais pas seulement dans la premire et la troisime.

Ritration ou extension dune recherche


Chaque fois que vous appelez SetKey ou FindKey, la mthode efface les valeurs prcdentes de la proprit Fields. Si vous voulez ritrer une recherche laide de champs pralablement dfinis, ou bien si vous voulez les ajouter aux champs utiliss, faites appel EditKey au lieu de SetKey et FindKey. Par exemple, supposons que vous ayez dj effectu dans la table Employee une recherche base sur le champ City de lindex CityIndex. Supposons en outre que CityIndex comprenne la fois les champs City et Company. Pour trouver un enregistrement avec un nom de socit prcis dans une ville donne, utilisez le code suivant :
Employee.KeyFieldCount := 2; Employee.EditKey; Employee[Company] := Edit2.Text; Employee.GotoNearest;

Limitation des enregistrements avec des portes


Vous pouvez temporairement voir et modifier un sous-ensemble de nimporte quel ensemble de donnes en utilisant des filtres (voir Affichage et dition densembles de donnes en utilisant des filtres la page 18-14). Certains ensembles de donnes de type table supportent un autre moyen daccder un sous-ensemble denregistrements disponibles, les portes. Les portes ne sappliquent quaux TTable et aux ensembles de donnes client. Malgr leurs similarits, les portes et les filtres ont des utilisations diffrentes. Les rubriques suivantes prsentent les diffrences entre les portes et les filtres et expliquent comment utiliser les portes.

Prsentation des diffrences entre les portes et les filtres


Les portes et les filtres ont pour effet de restreindre la quantit denregistrements visibles, mais leur mode de fonctionnement diffre. Une porte est un ensemble denregistrements indexs contigus qui correspondent tous aux valeurs des limites dfinies. Prenons lexemple dune base de donnes demploys indexe sur le nom de famille, vous pouvez appliquer une porte pour afficher tous les employs dont le nom de famille est suprieur Jones et infrieur Smith. Du fait que les portes dpendent des index, vous devez faire en sorte que lindex en cours puisse permettre de dfinir la porte. De mme que pour spcifier un index pour trier des enregistrements, vous pouvez utiliser la proprit IndexName ou IndexFieldNames pour affecter lindex sur lequel vous souhaitez dfinir une porte.

Prsentation des ensembles de donnes

18-35

Utilisation densembles de donnes de type table

Un filtre est compos dun ensemble denregistrements qui partagent les valeurs spcifies, indpendamment de lindexation. Supposons que vous souhaitiez appliquer un filtre sur une base de donnes demploys vivant en Californie et ayant travaill depuis au moins cinq ans dans lentreprise. Bien quils puissent utiliser les index lors de leur application, les filtres ne dpendent pas deux. Les filtres sont appliqus enregistrement par enregistrement au fur et mesure quune application parcourt un ensemble de donnes. En principe, les filtres sont plus souples que les portes. Toutefois, les portes peuvent tre plus efficaces lorsque les ensembles de donnes sont trs grands et que les enregistrements susceptibles dintresser lapplication se trouvent dj dans des groupes dindex contigus. Pour les trs grands ensembles de donnes, il est souvent plus efficace dutiliser la clause WHERE dune requte pour slectionner les donnes. Pour plus de dtails sur la spcification dune requte, voir Utilisation densembles de donnes de type requte la page 18-49.

Spcification de portes
Deux moyens sexcluant mutuellement permettent de spcifier une porte : Spcifiez le dbut et la fin sparment en utilisant SetRangeStart et SetRangeEnd. Spcifier les valeurs des deux extrmits simultanment en utilisant SetRange.

Dfinition des valeurs de dbut de porte


Appelez la procdure SetRangeStart pour placer lensemble de donnes ltat dsSetKey et commencez crer une liste de valeurs de dbut pour la porte. Aprs lappel SetRangeStart, les affectations suivantes de la proprit Fields sont traites comme des valeurs dindex utiliser lorsque la porte est applique. Les champs spcifis doivent sappliquer lindex en cours. Supposons, par exemple, que votre application utilise un composant TSQLClientDataSet appel Customers, li la table CUSTOMER, et que vous ayez cr des composants champ persistants pour chaque champ de lensemble de donnes Customers. La table CUSTOMER est indexe sur la premire colonne (CustNo). Dans une fiche de lapplication, deux composants de saisie appels StartVal et EndVal permettent dindiquer les valeurs de dbut et de fin dune porte. Le code ci-dessous peut tre utilis pour crer une porte et lappliquer :
with Customers do begin SetRangeStart; FieldByName(CustNo).AsString := StartVal.Text; SetRangeEnd; if (Length(EndVal.Text) > 0) then FieldByName(CustNo).AsString := EndVal.Text; ApplyRange; end;

Ce code vrifie que le texte saisi dans EndVal nest pas NULL avant daffecter des valeurs Fields. Si le texte saisi dans StartVal vaut NULL, tous les enregistrements partir du dbut de lensemble de donnes seront inclus,

18-36

Guide du dveloppeur

Utilisation densembles de donnes de type table

puisque toutes les valeurs sont suprieures une valeur NULL. Par contre, si le texte entr dans EndVal a une valeur NULL, aucun enregistrement ne sera inclus, puisquaucun ne peut tre infrieur cette valeur. Pour un index plusieurs colonnes, vous pouvez spcifier une valeur de dpart pour tous les champs de lindex ou pour certains de ces champs. Si aucune valeur nest fournie pour lun des champs utilis dans lindex, une valeur NULL est affecte au champ lors de lapplication de la porte. Si vous essayez de dfinir une valeur pour un champ ne figurant pas dans lindex, lensemble de donnes dclenche une exception.
Conseil

Pour commencer au dbut de lensemble de donnes, nappelez pas SetRangeStart. Pour mettre fin la spcification du dbut de la porte, appelez SetRangeEnd ou appliquez ou annulez la porte. Pour plus dinformations sur lapplication et lannulation des portes, voir Application ou annulation dune porte la page 18-40.

Dfinition des valeurs de fin de porte


Appelez la procdure SetRangeEnd pour placer lensemble de donnes ltat dsSetKey et commencez crer une liste de valeurs de fin pour la porte. Aprs lappel SetRangeEnd, les affectations suivantes de la proprit Fields sont traites comme des valeurs dindex utiliser lorsque la porte est applique. Les champs spcifis doivent sappliquer lindex en cours.
Attention

Pour quune porte se termine sur le dernier enregistrement de lensemble de donnes, spcifiez des valeurs de fin. Si vous ne fournissez pas de valeur de fin, Delphi suppose sinon que la valeur de fin est une valeur NULL. Une porte contenant des valeurs de fin NULL est toujours vide. La faon la plus simple daffecter des valeurs de fin de porte est dappeler la mthode FieldByName. Par exemple,
with Contacts do begin SetRangeStart; FieldByName(LastName).AsString := Edit1.Text; SetRangeEnd; FieldByName(LastName).AsString := Edit2.Text; ApplyRange; end;

Comme dans la spcification des valeurs de dbut de porte, si vous essayez de dfinir une valeur pour un champ ne figurant pas dans lindex, lensemble de donnes dclenche une exception. Pour mettre fin la spcification de fin de la porte, appliquez ou annulez la porte. Pour plus dinformations sur lapplication et lannulation des portes, Application ou annulation dune porte la page 18-40.

Prsentation des ensembles de donnes

18-37

Utilisation densembles de donnes de type table

Dfinition des valeurs de dbut et de fin de porte


Plutt que dutiliser des appels spars SetRangeStart et SetRangeEnd pour spcifier les limites de la porte, vous pouvez appeler la procdure SetRange pour placer lensemble de donnes ltat dsSetKey et dfinir des valeurs de dbut et de fin pour la porte par un simple appel. SetRange prend deux paramtres tableau constants : un ensemble de valeurs de dbut et un ensemble de valeurs de fin. Par exemple, linstruction suivante dfinit une porte base sur un index de deux colonnes :
SetRange([Edit1.Text, Edit2.Text], [Edit3.Text, Edit4.Text]);

Pour un index plusieurs colonnes, vous pouvez spcifier une valeur de dpart et de fin pour tous les champs de lindex ou pour certains de ces champs. Si aucune valeur nest fournie pour lun des champs utilis dans lindex, une valeur NULL est affecte au champ lors de lapplication de la porte. Pour ne pas spcifier de valeur pour le premier champ de lindex et spcifier des valeurs pour les champs suivants, passez une valeur NULL ou une valeur vide au premier champ. Spcifiez toujours des valeurs de fin pour une porte, mme si vous voulez quelle se termine sur le dernier enregistrement de lensemble de donnes. Lensemble de donnes suppose sinon que la valeur de fin est une valeur NULL. Une porte contenant des valeurs de fin NULL est toujours vide car la porte de dpart est suprieure ou gale la porte de fin.

Spcification dune porte partir de cls partielles


Si une cl est compose dun ou de plusieurs champs chane, les mthodes SetRange supportent les cls partielles. Par exemple, si un index est bas sur les colonnes LastName et FirstName, les spcifications de porte suivantes sont valides :
Contacts.SetRangeStart; Contacts[LastName] := Smith; Contacts.SetRangeEnd; Contacts[LastName] := Zzzzzz; Contacts.ApplyRange;

Ce code inclut tous les enregistrements dans une porte o LastName est suprieur ou gal Smith. La spcification des valeurs peut galement se prsenter ainsi :
Contacts[LastName] := Sm;

Cette instruction inclut les enregistrements o LastName est suprieur ou gal Sm.

Inclusion ou exclusion denregistrements correspondant aux valeurs dune porte


Par dfaut, une porte inclut tous les enregistrements suprieurs ou gaux la porte de dbut spcifie et infrieurs ou gaux la porte de fin spcifie. Ce comportement est contrl par la proprit KeyExclusive. Par dfaut, KeyExclusive est False.

18-38

Guide du dveloppeur

Utilisation densembles de donnes de type table

Si vous prfrez, vous pouvez donner la proprit KeyExclusive dun ensemble de donnes la valeur True pour quelle exclue les enregistrements gaux la porte de fin. Par exemple,
Contacts.KeyExclusive := True; Contacts.SetRangeStart; Contacts[LastName] := Smith; Contacts.SetRangeEnd; Contacts[LastName] := Tyler; Contacts.ApplyRange;

Ce code inclut tous les enregistrements dune porte pour lesquels LastName est suprieur ou gal Smith et infrieur Tyler.

Modification dune porte


Deux fonctions permettent de modifier les conditions relatives aux limites dune porte : EditRangeStart, pour modifier les valeurs de dbut dune porte, et EditRangeEnd, pour modifier les valeurs de fin de la porte. Le processus ddition et dapplication dune porte se droule comme suit :

1 Mettez lensemble de donnes ltat dsSetKey et modifiez la valeur de dbut de lindex pour la porte. 2 Modifiez la valeur de fin de lindex pour la porte. 3 Appliquez la porte lensemble de donnes.
Vous pouvez modifier les valeurs de dbut ou de fin dune porte, ou bien modifier les deux la fois. Si vous modifiez les conditions relatives aux limites dune porte actuellement applique lensemble de donnes, les modifications ne sont pas appliques tant que vous navez pas rappel ApplyRange.

Modification du dbut de la porte


Appelez la procdure EditRangeStart pour placer lensemble de donnes ltat dsSetKey et commencez modifier la liste en cours des valeurs de dbut de la porte. Aprs avoir appel EditRangeStart, les affectations suivantes de la proprit Fields crasent les valeurs dindex en cours lors de lapplication de la porte.
Conseil

Si vous avez initialement cr une porte de dbut base sur une cl partielle, vous pouvez utiliser EditRangeStart pour tendre la valeur de dbut de la porte. Pour plus dinformations sur les portes bases sur des cls partielles, voir Spcification dune porte partir de cls partielles la page 18-38.

Modification de la fin de la porte


Appelez la procdure EditRangeEnd pour placer lensemble de donnes ltat dsSetKey et commencez modifier la liste en cours de valeurs de fin de porte. Aprs avoir appel EditRangeEnd, les affectations suivantes de la proprit Fields sont traites comme des valeurs dindex de fin utiliser lors de lapplication dune porte.

Prsentation des ensembles de donnes

18-39

Utilisation densembles de donnes de type table

Application ou annulation dune porte


Lorsque vous appelez SetRangeStart ou EditRangeStart pour spcifier le dbut dune porte, ou bien SetRangeEnd ou EditRangeEnd pour spcifier la fin dune porte, lensemble de donnes passe ltat dsSetKey. Il y demeure jusqu ce que vous appliquiez ou annuliez la porte.

Application dune porte


Lorsque vous spcifiez une porte, les conditions relatives aux limites que vous dfinissez nentrent en vigueur que lorsque vous appliquez la porte. Pour quune porte prenne effet, appelez la mthode ApplyRange. ApplyRange limite immdiatement lutilisateur qui ne peut plus visualiser et accder quaux donnes contenues dans le sous-ensemble de lensemble de donnes.

Annulation dune porte


La mthode CancelRange met fin lapplication dune porte et restaure laccs la totalit de lensemble de donnes. Mme si lannulation dune porte restaure laccs tous les enregistrements de lensemble de donnes, les conditions relatives aux limites de la porte sont toujours disponibles afin que vous puissiez rappliquer la porte ultrieurement. Les limites dune porte sont prserves jusqu ce que vous fournissiez de nouvelles limites ou modifiiez les limites existantes. Par exemple, le code suivant est correct :
MyTable.CancelRange; {permet dutiliser cette porte ultrieurement. Pas besoin dappeler SetRangeStart, etc.} MyTable.ApplyRange;

Cration de relations matre/dtail


Les ensembles de donnes de type table peuvent tre lis par le biais de relations matre/dtail. Lorsque vous dfinissez une relation matre/dtail, vous reliez deux ensembles de donnes de sorte que tous les enregistrements de lun (ensemble de donnes dtail) correspondent toujours un enregistrement unique dans lautre (ensemble de donnes matre). Les ensembles de donnes de type table prennent en charge les relations matre/ dtail selon deux processus trs diffrents : Tous les ensembles de donnes de type table peuvent agir sur la partie dtail dun autre ensemble de donnes en reliant les curseurs. Ce processus est dcrit dans Comment faire de la table la partie dtail dun autre ensemble de donnes ci-aprs. TTable, TSQLTable et tous les ensembles de donnes client peuvent agir sur la partie matre dune relation matre/dtail qui utilise des tables imbriques. Ce processus est dcrit dans Utilisation de tables dtail imbriques la page 18-43.

18-40

Guide du dveloppeur

Utilisation densembles de donnes de type table

Chacune de ces approches prsente ses propres avantages. La liaison des curseurs vous permet de crer des relations matre/dtail dans lesquelles la table matre est un ensemble de donnes de nimporte quel type. Avec les dtails imbriqus, le type densemble de donnes qui peut agir en tant que table dtail est limit, mais ils offrent davantage de faons dafficher les donnes. Si le matre est un ensemble de donnes client, les dtails imbriqus fournissent un mcanisme plus robuste pour lapplication des mises jour en mmoire cache.

Comment faire de la table la partie dtail dun autre ensemble de donnes


Les proprits MasterSource et MasterFields dun ensemble de donnes de type table peuvent tre utilises pour tablir des relations un--plusieurs entre deux ensembles de donnes. La proprit MasterSource permet de spcifier une source de donnes utilise par la table pour extraire des donnes de la table matre. Cette source de donnes peut tre lie nimporte quel type densemble de donnes. Par exemple, en spcifiant dans cette proprit la source de donnes dune requte, vous pourrez lier un ensemble de donnes client en tant que dtail de la requ te, de sorte que cet ensemble de donnes client se charge du suivi des vnements survenant dans la requte. Lensemble de donnes est li la table matre par son index en cours. Avant dindiquer quels champs de lensemble de donnes matre sont suivis par lensemble de donnes dtail, dfinissez lindex de lensemble de donnes dtail commenant par les champs correspondants. Vous pouvez utiliser la proprit IndexName ou la proprit IndexFieldNames. Lorsque vous avez spcifi lindex utiliser, servez-vous de la proprit MasterFields pour indiquer la ou les colonnes de lensemble de donnes matre correspondant aux champs dindex de la table dtail. Pour lier des ensembles de donnes partir de plusieurs noms de colonnes, sparez les noms des champs par des points-virgules :
Parts.MasterFields := OrderNo;ItemNo;

Pour crer des liens fiables entre deux ensembles de donnes, vous pouvez utiliser le concepteur de liaisons de champs. Pour ce faire, aprs avoir spcifi un MasterSource et un index, double-cliquez sur la proprit MasterFields dans linspecteur dobjets. En suivant les procdures dcrites ci-dessous, vous pourrez crer une fiche dans laquelle un utilisateur pourra parcourir les enregistrements sur des clients et affichera toutes les commandes passes par le client en cours. La table matre est CustomersTable, la table dtail OrdersTable. Lexemple utilise le composant BDE TTable, mais vous pouvez utiliser les mmes mthodes pour lier nimporte quels ensembles de donnes de type table.

1 Placez deux composants TTable et deux composants TDataSource dans un module de donnes. 2 Dfinissez les proprits du premier composant TTable comme suit :
DatabaseName : DBDEMOS

Prsentation des ensembles de donnes

18-41

Utilisation densembles de donnes de type table

TableName : CUSTOMER Name : CustomersTable

3 Dfinissez les proprits du deuxime composant TTable comme suit :


DatabaseName : DBDEMOS TableName : ORDERS Name : OrdersTable

4 Dfinissez les proprits du premier composant TDataSource comme suit :


Name : CustSource DataSet : CustomersTable

5 Dfinissez les proprits du deuxime composant TDataSource comme suit :


Name : OrdersSource DataSet : OrdersTable

6 Placez deux composants TDBGrid sur une fiche. 7 Choisissez Fichier|Utiliser lunit pour indiquer que la fiche doit utiliser le module de donnes. 8 Donnez la proprit DataSource de la premire grille la valeur CustSource, et donnez la proprit DataSource de la deuxime grille la valeur OrdersSource. 9 Dfinissez la proprit MasterSource de OrdersTable par CustSource. Cela lie la table CUSTOMER (la table matre) la table ORDERS (la table dtail). 10 Double-cliquez dans la zone de la valeur de la proprit MasterFields dans linspecteur dobjets pour appeler le concepteur de liaisons de champs afin de dfinir les proprits suivantes :
Dans le champ Index disponibles, choisissez CustNo pour lier les deux tables sur le champ CustNo. Slectionnez CustNo dans les deux listes de champs Champs dtail et Champs matre. Cliquez sur Ajouter pour ajouter cette condition de jointure. Dans la liste Champs joints, CustNo -> CustNo apparat. Cliquez sur OK pour valider vos slections et quitter le concepteur de liaisons de champs.

11 Dfinissez les proprits Active de CustomersTable et de OrdersTable par True pour afficher les donnes dans les grilles de la fiche. 12 Compilez lapplication et excutez-la.
Si vous lancez lapplication maintenant, vous pouvez constater que les tables sont lies et que quand vous vous dplacez sur un nouvel enregistrement de la table CUSTOMER, seuls apparaissent les enregistrements de la table ORDERS appartenant au client en cours.

18-42

Guide du dveloppeur

Utilisation densembles de donnes de type table

Utilisation de tables dtail imbriques


Une table imbrique est un ensemble de donnes dtail qui est la valeur dun champ unique dun autre ensemble de donnes (matre). Pour les ensembles de donnes qui reprsentent les donnes du serveur, un ensemble de donnes dtail imbriqu peut tre utilis uniquement pour un champ dun ensemble de donnes du serveur. Les composants TClientDataSet ne reprsentent pas les donnes dun serveur, mais ils peuvent contenir des champs densembles de donnes si vous crez pour eux un ensemble de donnes contenant des dtails imbriqus, ou sils reoivent des donnes dun fournisseur li la table matre dans une relation matre/dtail.
Remarque

Pour TClientDataSet, lutilisation des ensembles dtail imbriqus simpose si vous souhaitez appliquer les mises jour partir de tables matre et dtail dans un serveur de base de donnes. Pour utiliser des ensembles dtail imbriqus, la proprit ObjectView de lensemble de donnes client doit tre True. Lorsque votre ensemble de donnes de type table contient des ensembles de donnes dtail imbriqus, TDBGrid permet dafficher les dtails imbriqus dans une fentre surgissante. Pour plus dinformations, voir Affichage des champs ensemble de donnes la page 19-30. Vous pouvez aussi afficher et diter ces ensembles de donnes dtail dans des contrles orients donnes en utilisant un composant ensemble de donnes spar pour lensemble dtail. A la conception, crez des champs persistants pour les champs de votre ensemble de donnes (matre), en utilisant lditeur de champs : cliquez avec le bouton droit sur lensemble de donnes matre et choisissez Editeur de champs. Ajoutez un nouveau champ persistant votre ensemble de donnes client en cliquant avec le bouton droit et en choisissant Ajouter des champs. Dfinissez votre nouveau champ avec le type champ ensemble de donnes. Dans lditeur de champs, dfinissez la structure de la table dtail. Vous devez aussi ajouter des champs persistants pour tous les autres champs utiliss dans votre ensemble de donnes dtail. Le composant ensemble de donnes pour la table dtail est un ensemble de donnes descendant dun type autoris pour la table matre. Les composants TTable acceptent uniquement les composantsTNestedDataSet comme ensembles de donnes imbriqus. Les composants TSQLTable acceptent dautres composants TSQLTable. Les composants TClientDataset acceptent dautres ensembles de donnes client. Choisissez un ensemble de donnes du type appropri dans la palette de composants et ajoutez-le votre fiche ou votre module de donnes. Affectez la proprit DataSetField de cet ensemble de donnes dtail le champ persistant DataSet de lensemble de donnes matre. Enfin, placez un composant source de donnes dans le module de donnes ou sur la fiche, et dfinissez sa proprit DataSet par lensemble de donnes dtail. Les contrles orients donnes peuvent utiliser cette source de donnes pour accder aux donnes de lensemble de donnes dtail.

Prsentation des ensembles de donnes

18-43

Utilisation densembles de donnes de type table

Contrle des accs en lecture/criture aux tables


Par dfaut, quand un ensemble de donnes de type table est ouvert, il demande laccs en lecture et en criture la table de la base de donnes sous-jacente. Selon les caractristiques de la table de la base de donnes sous-jacente, le droit dcriture demand peut ne pas tre accord (par exemple, quand vous demandez laccs en criture une table SQL dun serveur distant et que le serveur a limit laccs la table en lecture seulement).
Remarque

Ce nest pas vrai pour TClientDataSet, qui dtermine si les utilisateurs peuvent modifier des donnes partir dinformations procures par le fournisseur de lensemble de donnes avec les paquets de donnes. Ce nest pas vrai non plus pour TSQLTable, qui est un ensemble de donnes unidirectionnel, et donc toujours en lecture seule. Quand une table souvre, vous pouvez vrifier la proprit CanModify pour savoir si la base de donnes sous-jacente (ou le fournisseur de lensemble de donnes) autorise les utilisateurs modifier les donnes de la table. Si CanModify vaut False, lapplication ne peut pas crire dans la base de donnes. Si CanModify vaut True, votre application peut crire dans la base de donnes si la proprit ReadOnly de la table vaut False. ReadOnly dtermine si un utilisateur peut la fois voir et modifier les donnes. Quand ReadOnly vaut False (valeur par dfaut), un utilisateur peut la fois voir et modifier les donnes. Pour limiter un utilisateur la visualisation des donnes, dfinissez ReadOnly par True avant douvrir la table.

Remarque

ReadOnly est implmente sur tous les ensembles de type table, lexception de TSQLTable, qui est toujours en lecture seule.

Cration et suppression des tables


Certains ensembles de donnes de type table vous permettent de crer et de supprimer les tables sous-jacentes, la conception ou lexcution. En gnral, les tables de bases de donnes sont cres et supprimes par ladministrateur de la base. Mais, il peut tre pratique au cours du dveloppement et des tests de crer et de dtruire des tables utilises par votre application.

Cration de tables
TTable et TIBTable vous permettent tous deux de crer la table de base de donnes sous-jacente sans utiliser SQL. De mme, TClientDataSet vous permet de crer un ensemble de donnes quand vous ne travaillez pas avec un fournisseur densemble de donnes. En utilisant TTable et TClientDataSet, vous pouvez crer la table pendant la conception ou pendant lexcution. TIBTable vous permet de crer des tables uniquement lexcution.

18-44

Guide du dveloppeur

Utilisation densembles de donnes de type table

Avant de crer la table, vous devez dfinir des proprits pour spcifier la structure de la table que vous crez. En particulier, vous devez spcifier : La base de donnes qui contiendra la nouvelle table. Pour TTable, vous spcifiez la base de donnes en utilisant la proprit DatabaseName. Pour TIBTable, vous devez utiliser un composant TIBDataBase, qui est affect la proprit Database. (Les ensembles de donnes client nutilisent pas de base de donnes.) Le type de base de donnes (TTable seulement). Dfinissez la proprit TableType par le type de table souhait. Pour les tables Paradox, dBASE ou ASCII, dfinissez TableType par ttParadox, ttDBase ou ttASCII, respectivement. Pour tous les autres types de tables, dfinissez TableType par ttDefault. Le nom de la table que vous voulez crer. TTable et TIBTable ont tous deux une proprit TableName pour stocker le nom de la nouvelle table. Les ensembles de donnes client nutilisent pas de nom de table, mais vous devez spcifier la proprit FileName avant denregistrer la nouvelle table. Si vous crez une table qui reprend le nom dune table existante, la table existante et toutes ses donnes sont remplaces par la nouvelle table. Lancienne table et ses donnes ne peuvent pas tre rcupres. Pour viter de remplacer une table existante, vous devez vrifier la proprit Exists lexcution. Exists est disponible uniquement sur TTable et TIBTable. Les champs de la nouvelle table. Pour ce faire, vous pouvez procder de deux faons : Vous pouvez ajouter des dfinitions de champs la proprit FieldDefs. En conception double-cliquez sur la proprit FieldDefs dans linspecteur dobjets pour afficher lditeur de collection. Utilisez lditeur de collection pour ajouter, supprimer ou modifier les proprits de dfinitions de champs. A lexcution, effacez toutes les dfinitions de champs existantes et utilisez ensuite la mthode AddFieldDef pour ajouter chaque nouvelle dfinition de champ. Pour chaque nouvelle dfinition de champ, dfinissez les proprits de lobjet TFieldDef pour spcifier les attributs du champ. Vous pouvez utiliser la place des composants champs persistants. En conception double-cliquez sur lensemble de donnes pour afficher lditeur de champs. Dans lditeur de champs, cliquez avec le bouton droit et choisissez la commande Nouveau champ. Dcrivez les principales proprits de votre champ. Une fois que le champ est cr, vous pouvez modifier ses proprits dans linspecteur dobjets en le slectionnant dans lditeur de champs. Les index de la nouvelle table (facultatif). En conception double-cliquez sur la proprit IndexDefs dans linspecteur dobjets pour afficher lditeur de collection. Utilisez lditeur de collection pour ajouter, supprimer ou modifier les proprits de dfinitions dindex. A lexcution, effacez toutes les dfinitions dindex existantes et utilisez ensuite la mthode AddIndexDef pour ajouter chaque nouvelle dfinition dindex. Pour chaque nouvelle dfinition dindex, dfinissez les proprits de lobjet TIndexDef pour spcifier les attributs de lindex.

Prsentation des ensembles de donnes

18-45

Utilisation densembles de donnes de type table

Remarque

Vous ne pouvez pas dfinir dindex pour la nouvelle table si vous utilisez des composants champ persistant au lieu dobjets dfinition de champ. Pour crer la table pendant la conception, cliquez avec le bouton droit sur lensemble de donnes et choisissez Crer table (TTable) ou Crer ensemble de donnes (TClientDataSet ). Cette commande napparat pas dans le menu contextuel tant que navez pas spcifi toutes les informations ncessaires. Pour crer la table lexcution, appelez la mthode CreateTable (TTable et TIBTable) ou la mthode CreateDataSet (TClientDataSet).

Remarque

Vous pouvez tablir les dfinitions pendant la conception, puis appeler la mthode CreateTable (ou CreateDataSet) lexcution pour crer la table. Cependant, pour faire cela vous devrez indiquer que les dfinitions spcifies lexcution seront enregistres avec le composant ensemble de donnes. (par dfaut, les dfinitions de champs et dindex sont gnres de faon dynamique lexcution). Spcifiez que les dfinitions doivent tre enregistres avec lensemble de donnes en dfinissant sa proprit StoreDefs par True. Si vous utilisez TTable, vous pouvez pr-charger les dfinitions de champs et dindex dune table existante pendant la conception. Dfinissez les proprits DatabaseName et TableName pour spcifier la table existante. Cliquez avec le bouton droit sur le composant table et choisissez Mettre jour la dfinition de table. Cela dfinit automatiquement les valeurs des proprits FieldDefs et IndexDefs pour dcrire les champs et les index de la table existante. Ensuite, rinitialisez DatabaseName et TableName pour spcifier la table que vous voulez crer, en annulant toutes les demandes de renommer la table existante. Quand vous crez des tables Oracle8, vous ne pouvez pas crer de champs objets (champs ADT, champs de tableaux et champs densembles de donnes). Le code suivant cre une nouvelle table lexcution et lassocie lalias DBDEMOS. Avant de crer la nouvelle table, il vrifie que le nom de la table fourni ne correspond pas au nom dune table existante :
var TableFound: Boolean; begin with TTable.Create(nil) do // cre un composant TTable temporaire begin try { dfinit les proprits du composant TTable temporaire } Active := False; DatabaseName := DBDEMOS; TableName := Edit1.Text; TableType := ttDefault; { dfinit les champs de la nouvelle table } FieldDefs.Clear; with FieldDefs.AddFieldDef do begin Name := First; DataType := ftString; Size := 20; Required := False; end; with FieldDefs.AddFieldDef do begin

Conseil

Remarque

18-46

Guide du dveloppeur

Utilisation densembles de donnes de type table

Name := Second; DataType := ftString; Size := 30; Required := False; end; { dfinit les index de la nouvelle table } IndexDefs.Clear; with IndexDefs.AddIndexDef do begin Name := ; Fields := First; Options := [ixPrimary]; end; TableFound := Exists; // vrifie si la table existe dj if TableFound then if MessageDlg(Remplacer la table existante + Edit1.Text + ?, mtConfirmation, mbYesNoCancel, 0) = mrYes then TableFound := False; if not TableFound then CreateTable; // cre la table finally Free; // dtruit le composant TTable temporaire la fin end; end; end;

Suppression de tables
TTable et TIBTable vous permettent de supprimer des tables de la base de donnes sous-jacente sans utiliser SQL. Pour supprimer une table lexcution, appelez la mthode DeleteTable de lensemble de donnes. Par exemple, linstruction suivante supprime la table sous-jacente dun ensemble de donnes :
CustomersTable.DeleteTable; Attention

Quand vous supprimez une table avec DeleteTable, la table et toutes ses donnes disparaissent. Si vous utilisez TTable, vous pouvez aussi supprimer des tables pendant la conception : cliquez avec le bouton droit sur le composant table et slectionnez Supprimer une table dans le menu contextuel. Loption de menu Supprimer une table nest prsente que si le composant table reprsente une table de base de donnes existante (les proprits DatabaseName et TableName spcifient une table existante).

Vidage des tables


De nombreux ensembles de donnes de type table ont une seule mthode qui vous permet de supprimer toutes les lignes de donnes de la table. Pour TTable et TIBTable, vous pouvez supprimer tous les enregistrements en appelant la mthode EmptyTable lexcution :
PhoneTable.EmptyTable;

Prsentation des ensembles de donnes

18-47

Utilisation densembles de donnes de type table

Pour TADOTable, vous pouvez utiliser la mthode DeleteRecords.


PhoneTable.DeleteRecords;

Pour TSQLTable, vous pouvez aussi utiliser la mthode DeleteRecords. Notez, cependant, que la version TSQLTable de DeleteRecords ne prend jamais de paramtre.
PhoneTable.DeleteRecords;

Pour les ensembles de donnes client, vous pouvez utiliser la mthode EmptyDataSet .
PhoneTable.EmptyDataSet; Remarque Attention

Pour les tables des serveurs SQL, ces mthodes russissent uniquement si vous avez le privilge DELETE pour cette table. Quand vous videz un ensemble de donnes, les donnes que vous supprimez disparaissent dfinitivement.

Synchronisation des tables


Si vous avez deux ensembles de donnes ou plus qui reprsentent la mme table de base de donnes mais ne partagent pas un composant source de donnes, alors, chaque ensemble de donnes a sa propre vue des donnes et son propre enregistrement en cours. Au fur et mesure que les utilisateurs accdent aux enregistrements par le biais de chaque ensemble de donnes, les enregistrements en cours des composants diffrent. Si les ensembles de donnes sont tous des instances de TTable, ou tous des instances de TIBTable, ou tous des ensembles de donnes client, vous pouvez forcer lenregistrement en cours de chacun de ces ensembles de donnes tre le mme, en appelant la mthode GotoCurrent. GotoCurrent dfinit son propre enregistrement en cours de lensemble de donnes par lenregistrement en cours de lensemble de donnes correspondant. Par exemple, le code suivant dfinit lenregistrement en cours de CustomerTableOne comme le mme que lenregistrement en cours de CustomerTableTwo :
CustomerTableOne.GotoCurrent(CustomerTableTwo); Conseil

Si votre application doit synchroniser des ensembles de donnes de cette manire, placez les ensembles de donnes dans un module de donnes et ajoutez lunit du module de donnes la clause uses de chaque unit qui accde aux tables. Pour synchroniser des ensembles de donnes de fiches distinctes, vous devez ajouter lunit dune fiche la clause uses de lautre, et qualifier au moins un des ensembles de donnes par le nom de sa fiche. Par exemple :
CustomerTableOne.GotoCurrent(Form2.CustomerTableTwo);

18-48

Guide du dveloppeur

Utilisation densembles de donnes de type requte

Utilisation densembles de donnes de type requte


Pour utiliser un ensemble de donnes de type requte,

1 Placez le composant appropri dans un module de donnes ou sur une fiche, et attribuez sa proprit Name une valeur unique approprie votre application. 2 Identifiez le serveur de base de donnes qui envoyer la requte. Chaque ensemble de donnes de type requte fait cela diffremment, mais, en gnral, il faut spcifier un composant de base de donnes :
Pour TQuery, spcifiez un composant TDatabase ou un alias BDE en utilisant la proprit DatabaseName. Pour TADOQuery, spcifiez un composant TADOConnection en utilisant la proprit Connection. Pour TSQLQuery, spcifiez un composant TSQLConnection en utilisant la proprit SQLConnection. Pour TIBQuery, spcifiez un composant TIBConnection en utilisant la proprit Database. Pour plus dinformations sur lutilisation des composants connexion aux bases de donnes, voir chapitre 17, Connexion aux bases de donnes.

3 Spcifiez une instruction SQL dans la proprit SQL de lensemble de donnes et, ventuellement, spcifiez les paramtres de linstruction. Pour plus dinformations, voir Spcification de la requte la page 18-50 et Utilisation de paramtres dans les requtes la page 18-52. 4 Si les donnes de la requte doivent tre utilises avec des contrles de donnes visuels, ajoutez un composant source de donnes au module de donnes et dfinissez sa proprit DataSet par lensemble de donnes de type requte. Le composant source de donnes suit les rsultats de la requte (que lon appelle ensemble de rsultats) que les composants orients donnes affichent. Connectez les composants orients donnes la source de donnes laide de leurs proprits DataSource et DataField. 5 Activez le composant requte. Pour les requtes qui renvoient un ensemble de rsultats, utilisez la proprit Active ou la mthode Open. Pour excuter des requtes qui effectuent seulement une action sur une table et ne renvoient aucun ensemble de rsultats, utilisez la mthode ExecSQL lexcution. Si vous prvoyez dexcuter la requ te plusieurs fois, vous pouvez appeler Prepare pour initialiser la couche daccs aux donnes et les valeurs des paramtres de liaison dans la requte. Pour plus dinformations sur la prparation dune requte, voir Prparation des requtes la page 18-56.

Prsentation des ensembles de donnes

18-49

Utilisation densembles de donnes de type requte

Spcification de la requte
Pour les vritables ensembles de donnes de type requte, vous utilisez la proprit SQL pour sp cifier linstruction SQL excuter par lensemble de donnes. Certains ensembles de donnes, comme TADODataSet, TSQLDataSet, et les ensembles de donnes client, utilisent une proprit CommandText pour faire la mme chose. La plupart des requtes qui renvoient des enregistrements sont des commandes SELECT. Gnralement, elles dfinissent les champs inclure, les tables dans lesquelles les slectionner, les conditions qui limitent les enregistrements inclure, lordre de lensemble de donnes rsultant. Par exemple :
SELECT CustNo, OrderNo, SaleDate FROM Orders WHERE CustNo = 1225 ORDER BY SaleDate

Les requtes qui ne renvoient pas denregistrements contiennent des instructions qui utilisent des instructions DDL (langage de dfinition des donnes) ou DML (langage de manipulation des donnes) autres que les instructions SELECT (Par exemple, les commandes INSERT, DELETE, UPDATE, CREATE INDEX et ALTER TABLE ne renvoient aucun enregistrement). Le langage utilis dans les commandes est spcifique au serveur mais gnralement conforme au standard SQL-92 du langage SQL. La commande SQL que vous excutez doit tre acceptable pour le serveur que vous utilisez. Les ensembles de donnes nvaluent pas la commande SQL et ne lexcutent pas. Ils transmettent simplement la commande au serveur pour son excution. Dans la plupart des cas, la commande SQL doit tre constitue dune seule instruction SQL complte, mme si cette instruction peut tre aussi complexe que ncessaire (par exemple, une instruction SELECT avec une clause WHERE qui utilise plusieurs oprateurs logiques imbriqus comme AND et OR). Certains serveurs supportent galement la syntaxe batch qui autorise plusieurs instructions ; si votre serveur supporte cette syntaxe, vous pouvez entrer plusieurs instructions pour spcifier la requte. Les instructions SQL utilises par les requtes peuvent tre textuelles ou peuvent contenir des paramtres remplacer. Les requtes qui utilisent des paramtres sont appeles requtes paramtres. Quand vous utilisez des requtes paramtres, les valeurs relles affectes aux paramtres sont insres dans la requte avant dexcuter cette dernire. Lutilisation des requtes paramtres est trs souple, car vous pouvez, lexcution, changer la vue dun utilisateur et accder aux donnes la vole, sans avoir modifier linstruction SQL. Pour plus dinformations sur les requtes paramtres, voir Utilisation de paramtres dans les requtes la page 18-52.

Spcification dune requte en utilisant la proprit SQL


Quand vous utilisez un vritable ensemble de donnes de type requte (TQuery, TADOQuery, TSQLQuery, ou TIBQuery), affectez la requte la proprit SQL. La proprit SQL est un objet TStrings. Chaque chane diffrente de cet objet

18-50

Guide du dveloppeur

Utilisation densembles de donnes de type requte

TStrings est une ligne distincte de la requte. Lutilisation de plusieurs lignes naffecte pas la faon dont la requte sexcute sur le serveur, mais peut faciliter la modification et le dbogage de la requte si linstruction est divise en units logiques :
MyQuery.Close; MyQuery.SQL.Clear; MyQuery.SQL.Add(SELECT CustNo, OrderNO, SaleDate); MyQuery.SQL.Add( FROM Orders); MyQuery.SQL.Add(ORDER BY SaleDate); MyQuery.Open;

Le code ci-aprs montre la modification dune seule ligne dans une instruction SQL existante. Dans ce cas, la clause ORDER BY existe dj dans la troisime ligne de linstruction. Elle est rfrence via la proprit SQL en utilisant un index de 2.
MyQuery.SQL[2] := ORDER BY OrderNo; Remarque

Lensemble de donnes doit tre ferm lorsque vous spcifiez ou modifiez la proprit SQL. Pendant la conception, utilisez lditeur de liste de chanes pour spcifier la requte. Cliquez sur le bouton points de suspension de la proprit SQL, dans linspecteur dobjets, pour afficher lditeur de liste de chanes.

Remarque

Avec certaines versions de Delphi, si vous utilisez TQuery, vous pouvez aussi utiliser le constructeur SQL pour construire une requte base sur une reprsentation visible des tables et des champs dune base de donnes. Pour utiliser le constructeur SQL, slectionnez le composant requte, cliquez avec le bouton droit pour appeler le menu contextuel et choisissez lditeur de requtes graphique. Pour apprendre utiliser le constructeur de requtes, ouvrez-le et faites appel son aide en ligne. Comme la proprit SQL est un objet TStrings, vous pouvez charger le texte de la requte partir dun fichier, en appelant la mthode TStrings.LoadFromFile :
MyQuery.SQL.LoadFromFile(custquery.sql);

Vous pouvez aussi utiliser la mthode Assign de la proprit SQL pour copier le contenu dun objet liste de chanes dans la proprit SQL. La mthode Assign efface automatiquement le contenu en cours de la proprit SQL avant de copier la nouvelle instruction :
MyQuery.SQL.Assign(Memo1.Lines);

Spcification dune requte en utilisant la proprit CommandText


Quand vous utilisez TADODataSet, TSQLDataSet ou un ensemble de donnes client, affectez le texte dune instruction de requte la proprit CommandText :
MyQuery.CommandText := SELECT CustName, Address FROM Customer;

Pendant la conception, vous pouvez taper directement la requte dans linspecteur dobjets, ou, si lensemble de donnes SQL dispose dj dune connexion la base de donnes active, vous pouvez cliquer sur le bouton points de suspension de la proprit CommandText pour afficher lditeur de

Prsentation des ensembles de donnes

18-51

Utilisation densembles de donnes de type requte

CommandText. Lditeur de CommandText numre les tables disponibles et les champs contenus dans ces tables pour faciliter la composition de vos requtes.

Utilisation de paramtres dans les requtes


Une instruction SQL paramtre contient des paramtres, ou variables, dont les valeurs peuvent tre modifies pendant la conception ou pendant lexcution. Les paramtres peuvent remplacer les valeurs des donnes, comme celles qui sont utilises pour les comparaisons dans une clause WHERE, qui apparaissent dans une instruction SQL. En gnral, les paramtres reprsentent les valeurs des donnes qui sont passes linstruction. Par exemple, dans linstruction INSERT suivante, les valeurs insrer sont passes sous forme de paramtres :
INSERT INTO Country (Name, Capital, Population) VALUES (:Name, :Capital, :Population)

Dans cette instruction SQL, :Name, :Capital et :Population sont des marques de rservation pour les valeurs relles fournies linstruction par votre application au cours de lexcution. Remarquez que les noms des paramtres commencent par un deux points. Le deux points est requis pour distinguer les noms de paramtres des valeurs littrales. Vous pouvez aussi inclure des paramtres non nomms en insrant un point dinterrogation (?) dans votre requ te. Les paramtres non nomms sont identifis par leur position, puisquils nont pas de nom. Avant que lensemble de donnes puisse excuter la requte, vous devez fournir une valeur pour chaque paramtre figurant dans le texte de la requte. TQuery, TIBQuery, TSQLQuery et les ensembles de donnes client utilisent la proprit Params pour stocker ces valeurs. TADOQuery utilise la place la proprit Parameters. Params (ou Parameters) est une collection dobjets paramtre (TParam ou TParameter), o chaque objet reprsente un seul paramtre. Quand vous spcifiez le texte de la requ te, lensemble de donnes gnre cet ensemble dobjets paramtre et (selon le type de lensemble de donnes) initialise les proprits qu il peut dduire de la requte.
Remarque

Vous pouvez supprimer la g nration automatique des objets paramtre en rponse au changement du texte de la requte, en dfinissant la proprit ParamCheck par False. Cest utile pour les instructions DDL (langage de dfinition des donnes) contenant des paramtres qui font partie de linstruction DDL et ne sont pas des paramtres de la requte. Par exemple, linstruction DDL pour crer une procdure stocke peut dfinir des paramtres faisant partie de cette procdure stocke. En dfinissant ParamCheck par False, vous empchez ces paramtres dtre pris par erreur pour les paramtres de la requte. Les valeurs de paramtres doivent tre lies linstruction SQL avant sa premire excution. Les composants requte le font pour vous automatiquement si vous nappelez pas explicitement la mthode Prepare avant lexcution dune requte.

Conseil

Cest une bonne habitude de programmation de fournir aux paramtres des noms de variable correspondant aux noms des colonnes avec lesquelles ils sont associs. Par exemple, si un nom de colonne est Number, alors le paramtre

18-52

Guide du dveloppeur

Utilisation densembles de donnes de type requte

qui lui correspond peut tre :Number. Lutilisation de noms correspondants est particulirement importante si lensemble de donnes utilise une source de donnes pour obtenir les valeurs des paramtres dun autre ensemble de donnes. Ce processus est dcrit dans Etablissement de relations matre/dtail en utilisant des paramtres la page 18-55.

Fourniture des paramtres pendant la conception


Au cours de la conception, vous pouvez spcifier les valeurs des paramtres en utilisant lditeur de collection de paramtres. Pour afficher lditeur de collection de paramtres, cliquez sur le bouton points de suspension de la proprit Params ou Parameters dans linspecteur dobjets. Si linstruction SQL ne contient aucun paramtre, aucun objet napparat dans lditeur de collection.
Remarque

Lditeur de collection de paramtres est le mme diteur de collection que celui qui apparat pour dautres proprits de collection. Comme cet diteur est partag par dautre proprits, son menu contextuel (clic droit) contient les commandes Ajouter et Supprimer. Cependant, elles ne sont jamais actives pour les paramtres des requ tes. Le seul endroit o lon peut ajouter ou supprimer des paramtres est dans linstruction SQL elle-mme. Slectionnez chaque paramtre dans lditeur de collection de paramtres. Puis, utilisez linspecteur dobjets pour modifier ses proprits. Quand vous utilisez la proprit Params (objets TParam), vous pouvez inspecter ou modifier ce qui suit : La proprit DataType indique le type de donnes de la valeur du paramtre. Pour certains ensembles de donnes, cette valeur peut tre correctement initialise. Si lensemble de donnes ne peut pas dduire le type, DataType vaut ftUnknown, et vous devez la modifier et indiquer le type de la valeur du paramtre. La proprit DataType indique le type de donnes logique du paramtre. En gnral, ces types de donnes sont conformes aux types de donnes du serveur. Pour avoir la correspondance entre les types logiques et les types de donnes du serveur, consultez la documentation du mcanisme daccs aux donnes ((BDE, dbExpress, InterBase). La proprit ParamType indique le type du paramtre slectionn. Pour les requtes, elle est toujours initialise ptInput, car les requtes ne peuvent contenir que des paramtres dentre. Si la valeur de ParamType est ptUnknown, changez-la en ptInput. La proprit Value spcifie la valeur du paramtre slectionn. Vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramtres au cours de lexcution.

Prsentation des ensembles de donnes

18-53

Utilisation densembles de donnes de type requte

Quand vous utilisez la proprit Parameters (objets TParameter), vous pouvez inspecter ou modifier ce qui suit : La proprit DataType indique le type de donnes de la valeur du paramtre. Pour certains types de donnes, vous pouvez ajouter dautres informations : La proprit NumericScale indique le nombre de dcimales des paramtres numriques. La proprit Precision indique le nombre total de chiffres des paramtres numriques. La proprit Size indique le nombre de caractres des paramtres chane. La proprit Direction indique le type du paramtre slectionn. Pour les requtes, elle est toujours initialise pdInput, car les requtes ne peuvent contenir que des paramtres dentre. La proprit Attributes indique le type des valeurs que le paramtre acceptera. Attributes peut tre dfini par une combinaison de psSigned, psNullable et psLong. La proprit Value spcifie la valeur du paramtre slectionn. Vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramtres au cours de lexcution.

Fourniture des paramtres pendant lexcution


Pour crer des paramtres lexcution, vous pouvez utiliser la mthode ParamByName pour affecter des valeurs un paramtre en se basant sur son nom (non disponible pour TADOQuery) la proprit Params ou Parameters pour affecter des valeurs un paramtre en se basant sur sa position dans linstruction SQL. la proprit Params.ParamValues ou Parameters.ParamValues pour affecter des valeurs un ou plusieurs paramtres dune seule ligne de commande, en se basant sur le nom de chaque ensemble de paramtres. Le code suivant utilise ParamByName pour affecter le texte dune bote texte au paramtre :Capital :
SQLQuery1.ParamByName(Capital).AsString := Edit1.Text;

Le mme code peut tre rcrit en utilisant la proprit Params et lindice 0 (en supposant que le paramtre :Capital est le premier de linstruction SQL) :
SQLQuery1.Params[0].AsString := Edit1.Text;

La ligne de commande ci-dessous dfinit trois paramtres la fois, laide de la proprit Params.ParamValues :
Query1.Params.ParamValues[Name;Capital;Continent] := VarArrayOf([Edit1.Text, Edit2.Text, Edit3.Text]);

Remarquez que ParamValues utilise des variants, ce qui vite de transtyper des valeurs.

18-54

Guide du dveloppeur

Utilisation densembles de donnes de type requte

Etablissement de relations matre/dtail en utilisant des paramtres


Pour dfinir une relation matre/dtail o lensemble dtail est un ensemble de donnes de type requte, vous devez spcifier une requte utilisant des paramtres. Ces paramtres font rfrence aux valeurs de champs en cours dans lensemble de donnes matre. Comme les valeurs de champs en cours dans lensemble de donnes matre changent dynamiquement lors de lexcution, vous devez re-lier les paramtres de lensemble dtail chaque fois que change lenregistrement matre. Bien quil soit possible dcrire pour cela du code utilisant un gestionnaire dvnement, tous les ensembles de donnes de type requte lexception de TIBQuery fournissent un mcanisme plus facile avec la proprit DataSource. Si les valeurs des paramtres dune requte paramtre ne sont pas lies au moment de la conception ni spcifies au moment de lexcution, les ensembles de type requte tentent de fournir ces valeurs en utilisant la proprit DataSource. DataSource identifie un autre ensemble de donnes o sont recherchs des noms de champs correspondant aux noms des paramtres non lis. Cet ensemble de donnes de recherche peut tre de nimporte quel type. Lensemble de donnes o seffectue la recherche doit tre cr et rempli avant la cration de lensemble de donnes dtail qui lutilise. Sil existe des correspondances dans lensemble de donnes o seffectue la recherche, lensemble de donnes dtail lie les valeurs des paramtres aux valeurs des champs trouvs dans lenregistrement en cours point par la source de donnes. Pour comprendre comment cela fonctionne, considrez deux tables : une table de clients (Customer) et une table de commandes (Orders). Pour chaque client, la table des commandes contient lensemble des commandes effectues par le client. La table des clients comprend un champ ID qui spcifie un ID de client unique. La table des commandes comprend un champ CustID qui spcifie lID du client ayant pass une commande. La premire tape consiste dfinir lensemble de donnes Customer :

1 Ajoutez un ensemble de donnes de type requte votre application et liez-le la table Customer. 2 Ajoutez un composant TDataSource nomm CustomerSource. D finissez sa proprit DataSet par lensemble de donnes ajout ltape 1. Cette source de donnes reprsente dsormais lensemble de donnes Customer. 3 Ajoutez un ensemble de donnes de type requte et dfinissez sa proprit SQL par
SELECT CustID, OrderNo, SaleDate FROM Orders WHERE CustID = :ID

Remarquez que le nom du paramtre est le mme que le nom du champ dans la table matre (Customer).

4 Dfinissez la proprit DataSource de lensemble de donnes dtail par CustomerSource. D finir cette proprit transforme lensemble dtail en requ te lie.

Prsentation des ensembles de donnes

18-55

Utilisation densembles de donnes de type requte

A lexcution, le paramtre :ID de linstruction SQL pour lensemble de donnes dtail, na pas de valeur, lensemble de donnes essaie alors de trouver une correspondance entre le nom du paramtre et le nom dune colonne de lensemble de donnes identifi par CustomerSource. CustomerSource obtient ses donnes de lensemble de donnes matre qui, son tour, drive ses donnes de la table Customer. Comme la table Customer contient un colonne appele ID, la valeur du champ ID dans lenregistrement en cours de lensemble de donnes matre est assigne au paramtre :ID de linstruction SQL de lensemble de donnes dtail. Les ensembles de donnes sont lis dans une relation matre/ dtail. Chaque fois que lenregistrement en cours change dans lensemble de donnes Customer, linstruction SELECT de lensemble de donnes dtail sexcute pour retrouver toutes les commandes sappliquant lidentificateur de client en cours.

Prparation des requtes


La prparation dune requte est une tape facultative qui prcde lexcution de la requte. La prparation dune requte consiste soumettre linstruction SQL, et ses ventuels paramtres, la couche accs aux donnes et au serveur de base de donnes, des fins danalyse, dallocation des ressources et doptimisation. Certains ensembles de donnes effectuent des op rations supplmentaires lors de la prparation dune requte. Ces oprations amliorent les performances de la requte, ce qui acclre votre application, spcialement lorsque vous travaillez avec des requ tes modifiables. Une application peut prparer une requte en dfinissant la proprit Prepared par True. Si vous ne prparez pas une requte avant de lexcuter, lensemble de donnes le fait pour vous automatiquement chaque fois que vous appelez Open ou ExecSQL. Bien que lensemble de donnes prpare la requte pour vous, vous pouvez amliorer les performances en prparant lensemble de donnes de manire explicite avant de louvrir pour la premire fois.
CustQuery.Prepared := True;

Lorsque vous prparez lensemble de donnes de manire explicite, les ressources alloues lexcution de linstruction ne sont pas libres tant que vous ne dfinissiez pas Prepared par False. Dfinissez la proprit Prepared par False si vous voulez que lensemble de donnes soit re-prpar avant son excution (par exemple, si vous ajoutez un paramtre).
Remarque

Quand vous changez le texte de la proprit SQL dune requte, lensemble de donnes ferme automatiquement la requ te et annule sa prparation.

18-56

Guide du dveloppeur

Utilisation densembles de donnes de type requte

Excution de requtes qui ne renvoient pas densemble de rsultats


Quand une requte renvoie un ensemble denregistrements (comme une requte SELECT), vous excutez la requte de la mme faon que vous remplissez denregistrements un ensemble de donnes : en dfinissant Active par True ou en appelant la mthode Open. Mais, de nombreuses commandes SQL ne renvoient pas denregistrement. De telles commandes comprennent les instructions DDL (Data Definition Language) ou DML (Data Manipulation Language) autres que les instructions SELECT (par exemple, les commandes INSERT, DELETE, UPDATE, CREATE INDEX et ALTER TABLE ne renvoient pas denregistrement). Pour tous les ensembles de donnes de type requte, vous pouvez excuter une requte qui ne renvoie pas densemble de rsultats en appelant ExecSQL :
CustomerQuery.ExecSQL; { la requte ne renvoie pas densemble de rsultats } Conseil

Si vous excutez la requte plusieurs fois, cest une bonne ide de dfinir la proprit Preparedpar True. Mme si la requte ne renvoie aucun enregistrement, vous pouvez vouloir connatre le nombre denregistrements quelle affecte (par exemple, le nombre denregistrements supprims par une requte DELETE). La proprit RowsAffected donne le nombre denregistrements affects aprs lappel de la mthode ExecSQL.

Conseil

Quand vous ne savez pas au moment de la conception si la requte renvoie un ensemble de rsultats (par exemple, si lutilisateur fournit la requte lexcution de faon dynamique), vous pouvez programmer les deux types dinstructions dexcution de la requ te dans un bloc try...except. Placez un appel la mthode Open dans la clause try. Une requte daction est excute quand la requte est active avec la mthode Open, mais, en plus, une exception est dclenche. Vrifiez lexception et supprimez-la si elle indique simplement labsence densemble de rsultats. (Par exemple, TQuery lindique par une exception ENoResultSet.)

Utilisation densembles de rsultats unidirectionnels


Quand un ensemble de donnes de type requte renvoie un ensemble de rsultats, il reoit galement un curseur, ou pointeur, sur le premier enregistrement de cet ensemble de rsultats. Lenregistrement point par le curseur est lenregistrement actif en cours. Lenregistrement en cours est celui dont les valeurs des champs sont affiches dans les composants orients donnes associs la source de donnes de lensemble de rsultats. Sauf si vous utilisez dbExpress, ce curseur est par dfaut bidirectionnel. Un curseur bidirectionnel peut naviguer dans les enregistrements la fois en avant et en arrire. Le curseur bidirectionnel requiert une charge de traitement supplmentaire et peut ralentir certaines requtes.

Prsentation des ensembles de donnes

18-57

Utilisation densembles de donnes de type procdure stocke

Si vous navez pas besoin de naviguer vers larrire dans un ensemble de rsultats, TQuery et TIBQuery vous permettent damliorer les performances de la requte en demandant la place un curseur unidirectionnel. Pour demander un curseur unidirectionnel, dfinissez la proprit UniDirectional par True. Dfinissez UniDirectional avant la prparation et lexcution de la requte. Le code suivant illustre la dfinition de la proprit UniDirectional avant la prparation et lexcution dune requte :
if not (CustomerQuery.Prepared) then begin CustomerQuery.UniDirectional := True; CustomerQuery.Prepared := True; end; CustomerQuery.Open; { renvoie un ensemble de rsultats avec un curseur unidirectionnel } Remarque

Ne confondez pas la proprit UniDirectional et un ensemble de donnes unidirectionnel. Les ensembles de donnes unidirectionnels (TSQLDataSet, TSQLTable, TSQLQuery et TSQLStoredProc) utilisent dbExpress, qui ne renvoie que des curseurs unidirectionnels. En plus de supprimer la navigation arrire, les ensembles de donnes unidirectionnels ne mettent pas les enregistrements en tampon, et ont donc dautres limites (comme lincapacit utiliser des filtres).

Utilisation densembles de donnes de type procdure stocke


La faon dont votre application utilise une procdure stocke dpend de la faon dont a t programme la procdure stocke, du fait quelle renvoie des donnes ou non, du serveur de base de donnes utilis ou dune combinaison de ces diffrents facteurs. De faon gnrale, pour accder une procdure stocke sur un serveur, vous devez faire ceci :

1 Placez le composant appropri dans un module de donnes ou sur une fiche, et attribuez sa proprit Name une valeur unique approprie votre application. 2 Identifiez le serveur de base de donnes qui dfinit la procdure stocke. Chaque ensemble de donnes de type procdure stocke fait cela diffremment, mais, en gnral, il faut spcifier un composant de base de donnes :
Pour TStoredProc, spcifiez un composant TDatabase ou un alias BDE en utilisant la proprit DatabaseName. Pour TADOStoredProc, spcifiez un composant TADOConnection en utilisant la proprit Connection. Pour TSQLStoredProc, spcifiez un composant TSQLConnection en utilisant la proprit SQLConnection. Pour TIBStoredProc, spcifiez un composant TIBConnection en utilisant la proprit Database.

18-58

Guide du dveloppeur

Utilisation densembles de donnes de type procdure stocke

Pour plus dinformations sur lutilisation des composants connexion aux bases de donnes, voir chapitre 17, Connexion aux bases de donnes.

3 Spcifiez la procdure stocke excuter. Pour la plupart des ensembles de donnes de type procdure stocke, vous le faites en dfinissant la proprit StoredProcName. La seule exception est TADOStoredProc , qui dispose la place dune proprit ProcedureName. 4 Si la procdure stocke renvoie un curseur utiliser avec des contrles de donnes visuels, ajoutez un composant source de donnes au module de donnes et dfinissez sa proprit DataSet par lensemble de donnes de type procdure stocke. Connectez les composants orients donnes la source de donnes laide de leurs proprits DataSource et DataField. 5 Fournissez les valeurs des ventuels paramtres de la procdure stocke. Si le serveur ne fournit pas dinformation sur tous les paramtres des procdures stockes, vous devez fournir des informations supplmentaires sur les paramtres dentre, comme les noms et les types de donnes de ces paramtres. Pour plus dinformations sur lutilisation des paramtres des procdures stockes, voir Utilisation de paramtres avec les procdures stockes la page 18-59. 6 Excutez la procdure stocke. Pour les procdures stockes qui renvoient un curseur, utilisez la proprit Active ou la mthode Open. Pour excuter des procdures stockes qui ne renvoient pas de rsultat ou renvoient uniquement des paramtres de sortie, utilisez la mthode ExecProc lexcution. Si vous prvoyez dexcuter la procdure stocke plusieurs fois, vous pouvez appeler Prepare pour initialiser la couche daccs aux donnes et les valeurs des paramtres de liaison dans la procdure stocke. Pour plus dinformations sur la prparation dune procdure stocke, voir Excution de procdures stockes qui ne renvoient pas densemble de rsultats la page 18-63. 7 Traitez les ventuels rsultats. Ces rsultats peuvent tre renvoys sous forme de paramtres de rsultat et de sortie, ou bien sous forme dun ensemble de rsultats qui remplit lensemble de donnes de type procdure stocke. Certaines procdures stockes renvoient plusieurs curseurs. Pour plus de dtails sur la faon daccder aux curseurs supplmentaires, voir Lecture de plusieurs ensembles de rsultats la page 18-64.

Utilisation de paramtres avec les procdures stockes


Il existe quatre types de paramtres pouvant tre associs aux procdures stockes : Paramtres dentre, utiliss pour transmettre des valeurs une procdure stocke pour leur traitement. Paramtres de sortie, utiliss par une procdure stocke pour transmettre en retour des valeurs une application.

Prsentation des ensembles de donnes

18-59

Utilisation densembles de donnes de type procdure stocke

Paramtres dentre/sortie, utiliss pour transmettre des valeurs une procdure stocke pour leur traitement, et utiliss par la procdure stocke pour transmettre en retour des valeurs une application. Un paramtre de rsultat, utilis par certaines procdures stockes pour renvoyer lapplication une erreur ou une valeur dtat. Une procdure stocke ne peut renvoyer quun seul paramtre de rsultat. Le type de paramtres utilis par une procdure stocke dpend de limplmentation gnrale propre au langage des procdures stockes sur votre serveur de base de donnes et de linstance spcifique de la procdure stocke. Quel que soit le serveur, certaines procdures stockes peuvent utiliser ou ne pas utiliser les paramtres dentre. Au contraire, certaines utilisations des paramtres sont spcifiques au serveur. Par exemple, sur MS-SQL Server et Sybase, les procdures stockes renvoient toujours un paramtre de rsultat, mais limplmentation InterBase dune procdure stocke ne renvoie jamais de paramtre de rsultat. Laccs aux paramtres des procdures stockes est fourni par la proprit Params (dans TStoredProc , TSQLStoredProc, TIBStoredProc) ou par la proprit Parameters (dans TADOStoredProc). Quand vous affectez une valeur la proprit StoredProcName (ou ProcedureName), lensemble de donnes gnre automatiquement un objet pour chaque paramtre de la procdure stocke. Pour certains ensembles de donnes, si le nom de la procdure stocke nest pas spcifi jusquau moment de lexcution, les objets correspondants chaque paramtre doivent tre crs par programme ce moment-l. Ne pas spcifier la procdure stocke et crer manuellement les objets TParam ou TParameter permet un ensemble de donnes seul dtre utilis avec un nombre quelconque de procdures stockes.
Remarque

Certaines procdures stockes renvoient un ensemble de donnes en plus des paramtres de sortie et de rsultat. Les applications peuvent afficher les enregistrements des ensembles de donnes dans des contrles orients donnes, mais doivent traiter sparment les paramtres de sortie et les paramtres de rsultat.

Dfinition des paramtres pendant la conception


Vous pouvez attribuer des valeurs aux paramtres des procdures stockes au moment de la conception en utilisant lditeur de collection de paramtres. Pour afficher lditeur de collection de paramtres, cliquez sur le bouton points de suspension de la proprit Params ou Parameters dans linspecteur dobjets.
Important

Vous pouvez donner des valeurs aux paramtres dentre en les slectionnant dans lditeur de collection de paramtres et en utilisant linspecteur dobjets pour dfinir la proprit Value. Mais, vous ne devez modifier ni les noms ni les types de donnes des paramtres dentre indiqus par le serveur. Si vous le faites, une exception se produit lorsque vous excutez la procdure stocke. Certains serveurs nindiquent pas les noms ni les types de donnes des paramtres. En ce cas, vous devez dfinir les paramtres manuellement en utilisant lditeur de collection de paramtres. Cliquez avec le bouton droit et choisissez Ajouter pour ajouter des paramtres. Vous devez dcrire entirement

18-60

Guide du dveloppeur

Utilisation densembles de donnes de type procdure stocke

chaque paramtre que vous ajoutez. M me si vous navez pas besoin dajouter des paramtres, vous devez vrifier que les objets paramtre individuels sont corrects. Si lensemble de donnes a une proprit Params (objets TParam), les proprits suivantes doivent tre correctement spcifies : La proprit Name indique le type du paramtre slectionn. La proprit DataType indique le type de donnes de la valeur du paramtre. Lorsque vous utilisez TSQLStoredProc, certains types de donnes exigent des informations supplmentaires : La proprit NumericScale indique le nombre de dcimales des paramtres numriques. La proprit Precision indique le nombre total de chiffres des paramtres numriques. La proprit Size indique le nombre de caractres des paramtres chane. La proprit ParamType indique le type du paramtre slectionn. Ce peut tre ptInput (pour les paramtres dentre), ptOutput (pour les paramtres de sortie), ptInputOutput (pour les paramtres dentre/sortie) ou ptResult (pour les paramtres de rsultat). La proprit Value spcifie la valeur du paramtre slectionn. Vous ne pouvez pas dfinir la valeur des paramtres de sortie ou des paramtres de rsultat. Cest lexcution de la procdure stocke qui dfinit ces types de paramtres. Pour les paramtres dentre ou dentre/sortie, vous pouvez laisser Value vide si votre application fournit les valeurs des paramtres au cours de lexcution. Si lensemble de donnes utilise une proprit Parameters (objets TParameter), les proprits suivantes doivent tre correctement spcifies : La proprit Name indique le nom du paramtre tel quil est dfini par la procdure stocke. La proprit DataType indique le type de donnes de la valeur du paramtre. Pour certains types de donnes, vous pouvez ajouter dautres informations : La proprit NumericScale indique le nombre de dcimales des paramtres numriques. La proprit Precision indique le nombre total de chiffres des paramtres numriques. La proprit Size indique le nombre de caractres des paramtres chane. La proprit Direction indique le type du paramtre slectionn. Ce peut tre pdInput (pour les paramtres dentre), pdOutput (pour les paramtres de sortie), pdInputOutput (pour les paramtres dentre/sortie) ou pdReturnValue (pour les paramtres de rsultat).

Prsentation des ensembles de donnes

18-61

Utilisation densembles de donnes de type procdure stocke

La proprit Attributes indique le type des valeurs que le paramtre acceptera. Attributes peut tre dfini par une combinaison de psSigned, psNullable et psLong. La proprit Value spcifie la valeur du paramtre slectionn. Ne dfinissez pas la valeur des paramtres de sortie ou des paramtres de rsultat. Pour les paramtres dentre ou dentre/sortie, vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramtres au cours de lexcution.

Utilisation des paramtres pendant lexcution


Pour certains ensembles de donnes, si le nom de la procdure stocke nest pas spcifi jusquau moment de lexcution, aucun objet TParam ne sera cr automatiquement et ils devront tre crs par programme. Cela se fera en utilisant la mthode TParam.Create ou la mthode TParams.AddParam :
var P1, P2: TParam; begin ... with StoredProc1 do begin StoredProcName := GET_EMP_PROJ; Params.Clear; P1 := TParam.Create(Params, ptInput); P2 := TParam.Create(Params, ptOutput); try Params[0].Name := EMP_NO; Params[1].Name := PROJ_ID; ParamByname(EMP_NO).AsSmallInt := 52; ExecProc; Edit1.Text := ParamByname(PROJ_ID).AsString; finally P1.Free; P2.Free; end; end; ... end;

Mme si vous navez pas besoin dajouter les objets paramtre individuels lexcution, vous pouvez accder chacun deux en affectant des valeurs aux paramtres dentre et en rcuprant les valeurs des paramtres de sortie. Vous pouvez utiliser la mthode ParamByName de lensemble de donnes, pour accder aux paramtres individuels par leur nom. Par exemple, le code suivant dfinit la valeur dun paramtre dentre/sortie, excute la procdure stocke et rcupre la valeur renvoye :
with SQLStoredProc1 do begin ParamByName(IN_OUTVAR).AsInteger := 103; ExecProc; IntegerVar := ParamByName(IN_OUTVAR).AsInteger; end;

18-62

Guide du dveloppeur

Utilisation densembles de donnes de type procdure stocke

Prparation des procdures stockes


Comme avec les ensembles de donnes de type requte, les ensembles de donnes de type procdure stocke doivent tre prpars avant dexcuter la procdure stocke. La prparation de la procdure stocke indique la couche daccs aux donnes et au serveur de base de donnes dallouer des ressources pour la procdure stocke et de lier des paramtres. Ces oprations peuvent amliorer les performances. Si vous tentez dexcuter une procdure stocke avant de la prparer, lensemble de donnes la prpare pour vous automatiquement et annule la prparation aprs son excution. Si vous prvoyez dexcuter une procdure stocke de nombreuses fois, il est plus efficace de la prparer explicitement en dfinissant la proprit Prepared par True.
MyProc.Prepared := True;

Lorsque vous prparez lensemble de donnes de manire explicite, les ressources alloues lexcution de la procdure stocke ne sont pas libres tant que vous ne dfinissez pas Prepared par False. Dfinissez la proprit Prepared par False si vous voulez que lensemble de donnes soit re-prpar avant son excution (par exemple, si vous modifiez les paramtres quand vous utilisez les procdures Oracle surcharges).

Excution de procdures stockes qui ne renvoient pas densemble de rsultats


Quand une procdure stocke renvoie un curseur, vous lexcutez de la mme faon que vous remplissez denregistrements un ensemble de donnes : en dfinissant Active par True ou en appelant la mthode Open. Mais, de nombreuses procdures stockes ne renvoient pas de donnes ou renvoient uniquement des paramtres de rsultat ou de sortie. Lexcution dune procdure stocke ne renvoyant pas densemble de rsultats est obtenue en appelant la mthode ExecProc. Aprs lexcution de la procdure stocke, vous pouvez utiliser la mthode ParamByName pour lire la valeur du paramtre de rsultat ou de tout paramtre de sortie :
MyStoredProcedure.ExecProc; { ne renvoie pas densemble de rsultats } Edit1.Text := MyStoredProcedure.ParamByName(OUTVAR).AsString; Remarque

TADOStoredProc na pas de mthode ParamByName. Pour obtenir les valeurs des paramtres de sortie lorsque vous utilisez ADO, accdez aux objets paramtre en utilisant la proprit Parameters. Si vous excutez la procdure stocke plusieurs fois, cest une bonne ide de dfinir la proprit Prepared par True.

Conseil

Prsentation des ensembles de donnes

18-63

Utilisation densembles de donnes de type procdure stocke

Lecture de plusieurs ensembles de rsultats


Certaines procdures stockes renvoient plusieurs ensembles denregistrements. Lorsque vous louvrez, lensemble de donnes ne rcupre que le premier ensemble denregistrements. Si vous utilisez TSQLStoredProc ou TADOStoredProc , vous pouvez accder aux autres ensembles denregistrements en appelant la mthode NextRecordSet :
var DataSet2: TCustomSQLDataSet; begin DataSet2 := SQLStoredProc1.NextRecordSet; ...

Dans TSQLStoredProc, NextRecordSet renvoie le composant TCustomSQLDataSet qui vient dtre cr et fournit laccs au prochain ensemble denregistrements. Dans TADOStoredProc, NextRecordset renvoie une interface qui peut tre affecte la proprit RecordSet dun ensemble de donnes ADO existant. Pour nimporte quelle classe, la mthode renvoie le nombre denregistrements de lensemble de donnes renvoy sous forme dun paramtre de sortie. La premire fois que vous appelez NextRecordSet, elle renvoie un ensemble de donnes pour le second ensemble denregistrements. Appeler nouveau NextRecordSet renvoie un troisime ensemble de donnes, et ainsi de suite jusqu ce quil ny ait plus densemble denregistrements. Lorsque quil ny a pas de curseur supplmentaire, NextRecordSet renvoie nil.

18-64

Guide du dveloppeur

19
Manipulation des composants champ
Chapitre 19

Chapitre

Ce chapitre dcrit les proprits, les vnements et les mthodes communes lobjet TField et ses descendants. Les composants champ reprsentent les diffrents champs (colonnes) des ensembles de donnes. Ce chapitre dcrit galement comment utiliser les composants champ pour contrler laffichage et ldition des donnes dans des applications. Les composants champ sont toujours associs un ensemble de donnes. Vous nutilisez jamais un objet TField directement dans vos applications. Au lieu de cela, chaque composant champ de votre application est un descendant de TField spcifique au type de donnes dune colonne dun ensemble de donnes. Les composants champ fournissent des contrles orients donnes tels que TDBEdit et TDBGrid afin daccder aux donnes dune colonne particulire de lensemble de donnes associ. Dune faon gnrale, un composant champ reprsente les caractristiques dune colonne, ou dun champ, dun ensemble de donnes (comme le type de donnes ou la taille du champ). Il reprsente galement les caractristiques daffichage du champ, comme lalignement, le format daffichage et le format ddition. Par exemple, un composant TFloatField est dot de quatre proprits qui affectent directement lapparence des donnes :
Tableau 19.1 Proprit
Alignment DisplayWidth DisplayFormat EditFormat

Proprits du composant TFloatField affectant laffichage des donnes Utilisation


Centre ou aligne droite ou gauche les valeurs dun contrle pour laffichage. Spcifie le nombre de chiffres affichs dans un contrle. Spcifie le formatage des donnes affiches (par exemple, le nombre de dcimales). Contrle laspect des valeurs dans un contrle au cours ddition.

Manipulation des composants champ

19-1

Composants champ dynamique

Lorsque vous passez dun enregistrement un autre dans un ensemble de donnes, un composant champ vous permet de visualiser et de modifier la valeur du champ dans lenregistrement en cours. Les composants champ ont de nombreuses proprits en commun (comme DisplayWidth et Alignment) ; ils ont galement des proprits spcifiques certains types de donnes (telles que Precision pour TFloatField). Chacune de ces proprits affecte laspect des donnes dans une fiche. Certaines dentre elles, comme Precision, peuvent galement affecter les donnes pouvant tre saisies par un utilisateur quand il modifie ou saisit des donnes. Tous les composants champ dun ensemble de donnes sont soit dynamiques (automatiquement g nrs partir de la structure sous-jacente des tables de bases de donnes) ou persistants (gnrs partir des noms de champs et des proprits dfinis dans lditeur de champs). Les champs dynamiques et les champs persistants ont des caractristiques diffrentes et sont appropris des situations prcises. Les sections suivantes dcrivent en dtail les champs persistants et les champs dynamiques et indiquent quand les utiliser.

Composants champ dynamique


Les composants champ gnrs dynamiquement correspondent au comportement par dfaut. En fait, tous les composants champ dun ensemble de donnes sont crs dynamiquement chaque fois que vous placez un ensemble de donnes dans un module de donnes puis spcifiez comment lensemble de donnes rcupre ses donnes et louvrez. Un composant champ est dynamique sil est cr automatiquement en fonction de la structure physique sous-jacente des donnes reprsentes par un ensemble de donnes. Les ensembles de donnes gnrent un composant champ pour chaque colonne de donnes sous-jacentes. Le descendant TField cr pour chaque colonne est dtermin par les informations de type de champ envoyes par la base de donnes ou par le composant fournisseur (pour TClientDataSet). Les champs dynamiques sont temporaires. Leur dure de vie quivaut la dure douverture dun ensemble de donnes. A chaque nouvelle ouverture dun ensemble de donnes utilisant des champs dynamiques, il reconstruit un ensemble de composants champ dynamiques partir de la structure des donnes sous-jacentes. Si les colonnes des donnes sous-jacentes changent, la prochaine ouverture dun ensemble de donnes utilisant des composants champ dynamiques, les composants champ gnrs automatiquement changeront galement. Les champs dynamiques doivent tre utiliss dans des applications flexibles en matire ddition et daffichage des donnes. Par exemple, pour crer un outil de visualisation de bases de donnes comme lexplorateur SQL, vous devez utiliser des champs dynamiques, car chaque table de base de donnes na pas le mme nombre de colonnes et ses colonnes sont de types diffrents. Les champs dynamiques sutilisent aussi dans des applications o linteraction utilisateur avec les donnes se produit lintrieur des composants grille et lorsque les ensembles de donnes utiliss par lapplication changent souvent.

19-2

Guide du dveloppeur

Champs persistants

Pour utiliser des champs dynamiques dans une application :

1 Placez des ensembles de donnes et des sources de donnes dans un module de donnes. 2 Associez les ensembles de donnes aux donnes. Cela suppose lutilisation dun fournisseur ou composant connexion pour connecter la source des donnes et dfinir les proprits qui dterminent les donnes reprsentes par lensemble de donnes. 3 Associez les sources de donnes aux ensembles de donnes. 4 Placez des contrles orients donnes dans les fiches de votre application, ajoutez le module de donnes dans chaque clause uses des units de fiches, et associez chaque contrle orient donnes une source de donnes du module. Il faut aussi associer un champ chaque contrle orient donnes le ncessitant. Etant donn que vous utilisez des composants champ dynamiques, lexistence des noms des champs louverture de lensemble de donnes nest pas garantie. 5 Ouvrez les ensembles de donnes.
Les champs dynamiques prsentent malgr tout quelques limites. Sans crire de code, il est impossible de changer leurs paramtres par dfaut daffichage et ddition, il est difficile de modifier leur ordre daffichage sans prendre de risque et il est impossible dempcher laccs des champs de lensemble de donnes. Des champs supplmentaires comme les champs de rfrence ou les champs calculs ne peuvent pas tre crs pour lensemble de donnes et il est impossible de surcharger le type par dfaut dun champ dynamique. Pour un plus grand contrle des champs de vos applications de bases de donnes, vous devez appeler lditeur de champs et crer des champs persistants.

Champs persistants
Par dfaut, les champs des ensembles de donnes sont des champs dynamiques. Leurs proprits et leur disponibilit sont automatiquement dfinies et ne peuvent pas tre modifies. Pour contrler les proprits et les vnements dun champ, vous devez crer des champs persistants. Grce aux champs persistants, vous pouvez : dfinir ou modifier les caractristiques daffichage ou ddition du champ la conception ou lexcution ; crer de nouveaux champs, tels que des champs de rfrence, des champs calculs et des champs agrgs, dont les valeurs sont bases sur les champs dun ensemble de donnes ; valider les entres de donnes ; retirer des composants champ de la liste des composants persistants pour empcher votre application daccder des colonnes particulires dune base de donnes sous-jacente ;

Manipulation des composants champ

19-3

Champs persistants

dfinir de nouveaux champs pour remplacer des champs existants, daprs les colonnes de la table ou de la requte sous-jacente dun ensemble de donnes. Au moment de la conception vous pouvez, ce qui est conseill, utiliser lditeur de champs pour crer des listes persistantes de composants champ utiliss par les ensembles de donnes de votre application. Ces listes sont stockes dans votre application et ne changent pas, mme si la structure de la base de donnes sous-jacente dun ensemble de donnes est modifie. Il est ensuite possible de crer des gestionnaires dvnements pour ces champs de faon ce quils puissent rpondre aux modifications de donnes et aux validations de saisies.
Remarque

Lorsque vous crez les champs persistants dun ensemble de donnes, seuls ceux slectionns sont disponibles pour votre application en mode conception et lexcution. Pendant la phase de conception, vous pouvez toujours utiliser lditeur de champs de faon ajouter ou supprimer des champs persistants pour un ensemble de donnes. La totalit des champs utiliss dans un ensemble de donnes sont soit persistants soit dynamiques. Il est impossible de combiner les deux types de champs au sein du mme ensemble de donnes. Si vous avez cr des champs persistants pour un ensemble de donnes, vous devrez tous les supprimer pour revenir des champs dynamiques. Pour plus dinformations sur les champs dynamiques, voir Composants champ dynamique la page 19-2.

Remarque

Lune des principales utilisations des champs persistants est de contrler laspect et laffichage des donnes. Vous pouvez galement contrler laspect des colonnes dans les grilles orientes donnes. Pour savoir comment grer laspect des colonnes dans les grilles, reportez-vous Cration dune grille personnalise la page 15-19.

Cration de champs persistants


Les composants champ persistants crs avec lditeur de champs offrent un accs en programmation aux donnes sous-jacentes. Ils garantissent qu chaque excution de votre application, celle-ci utilise et affiche toujours les mmes colonnes, dans le mme ordre, mme si la structure physique de la base de donnes sous-jacente change. Les composants orients donnes et le code du programme qui dpendent de champs spcifiques fonctionnent toujours comme prvu. Si une colonne dont dpend un composant champ persistant est supprime ou modifie, Delphi provoque une exception au lieu de faire fonctionner lapplication avec une colonne inexistante ou avec des donnes sans correspondance. Pour crer un composant champ persistant pour un ensemble de donnes :

1 Placez un ensemble de donnes dans un module de donnes. 2 Liez lensemble de donnes ses donnes sous-jacentes. Pour ce faire, vous devez gnralement associer lensemble de donnes un fournisseur ou composant connexion et spcifier les proprits permettant de dcrire les donnes. Par exemple, si vous utilisez TADODataSet, vous pouvez attribuer

19-4

Guide du dveloppeur

Champs persistants

la proprit Connection un composant TADOConnection correctement configur et la proprit CommandText une requte valide.

3 Double-cliquez sur le composant ensemble de donnes dans le module de donnes de faon appeler lditeur de champs. Ce dernier contient une barre de titre, des boutons de navigation et une bote liste.
La barre ou de la Ainsi, si donnes la partie de titre de lditeur de champs affiche le nom du module de donnes fiche contenant lensemble de donnes, ainsi que le nom de celui-ci. vous ouvrez lensemble de donnes Customers dans le module de CustomerData, la barre de titre affiche CustomerData.Customers, ou du nom quelle peut contenir.

Sous la barre de titre figure un ensemble de boutons de navigation vous permettant de faire dfiler un un les enregistrements dun ensemble de donnes au moment de la conception ; ces boutons vous permettent galement de passer directement au premier ou au dernier enregistrement. Les boutons de navigation sont estomps si vous navez pas encore cr de composant champ persistant pour lensemble de donnes ou si celui-ci nest pas actif. Si lensemble de donnes est unidirectionnel, les boutons permettant de se dplacer sur les dernier et prcdent enregistrements sont toujours estomps. La bote liste affiche le nom des composants champ persistants de lensemble de donnes. Lorsque vous lancez lditeur de champs la premire fois pour un nouvel ensemble de donnes, la liste est vide car les composants champ sont dynamiques et non persistants. Si vous lancez lditeur de champs pour un ensemble de donnes contenant dj des composants champ persistants, vous verrez leur nom dans la bote liste.

4 Choisissez loption dajout de champs dans le menu contextuel de lditeur de champs. 5 Dans la bote de dialogue dajout de champs, slectionnez les champs persistants. Par dfaut, tous les champs sont slectionns louverture de la bote de dialogue. Tous les champs que vous slectionnerez dans cette bote de dialogue deviendront des champs persistants.
La bote de dialogue dajout de champs se referme et les champs que vous avez slectionns apparaissent dans la bote liste de lditeur de champs ; ce sont les champs persistants. Si lensemble de donnes est actif, vous remarquerez galement que les boutons de navigation Dernier (si lensemble de donnes nest pas unidirectionnel) et Suivant, au-dessus de la bote liste sont activs. Dsormais, chaque fois que vous ouvrirez lensemble de donnes, il ne crera plus de composant champ dynamique pour chaque colonne de la base de donnes sous-jacente. Au lieu de cela, il ne crera des composants persistants que pour les champs spcifis. A chaque fois que vous ouvrirez lensemble de donnes, il vrifiera que chacun des champs persistants non calculs est prsent ou quil peut tre cr partir des donnes de la base. Sinon, il provoquera une exception vous avertissant que le champ nest pas valide et ne souvrira pas.

Manipulation des composants champ

19-5

Champs persistants

Modification de lordre des champs persistants


Lordre dans lequel apparaissent les composants champ persistants dans la bote liste de lditeur de champs est lordre par dfaut dans lequel ils apparaissent dans un composant grille orient donnes. Vous pouvez le modifier en faisant glisser les champs ailleurs dans la bote liste. Pour changer lemplacement de champs :

1 Slectionnez-les. Vous pouvez slectionner et dplacer plusieurs champs la fois. 2 Faites-les glisser au nouvel emplacement.
Si vous slectionnez un ensemble de champs non contigus et les faites glisser vers un nouvel emplacement, ils sont insrs en tant que bloc contigu. A lintrieur de ce bloc, lordre des champs reste inchang. Pour changer lordre dun champ dans la liste, une autre mthode consiste slectionner le champ et utiliser les touches Ctrl+Haut et Ctrl+Bas.

Dfinition de nouveaux champs persistants


Non seulement vous pouvez slectionner des composants champ existants changer en composants champ persistants pour un ensemble de donnes, mais aussi crer des champs persistants spciaux supplmentaires ou destins remplacer les autres champs persistants de lensemble de donnes. Les champs persistants que vous crez ne servent que pour laffichage. Les donnes quils contiennent au moment de lexcution ne sont pas conserves, soit parce quelles existent dj ailleurs dans la base de donnes, soit parce quelles sont temporaires. La structure physique des donnes sous-jacentes de lensemble de donnes reste de toute faon inchange. Pour crer un nouveau composant champ persistant, cliquez avec le bouton droit de la souris sur la bote liste de lditeur de champs et choisissez Nouveau champ. La bote de dialogue Nouveau champ apparat. La bote de dialogue Nouveau champ contient trois botes groupe : Proprits du champ, Type de champ et Dfinition de la rfrence. La bote groupe Proprits du champ vous permet dentrer des informations gnrales sur le composant champ. Tapez le nom de champ dans la zone de saisie Nom. Le nom que vous saisissez correspond la proprit FieldName du composant champ. La bote de dialogue Nouveau champ lutilise pour construire un nom de composant dans la zone de saisie Composant. Le nom qui sy affiche correspond la proprit Name du composant champ ; il est fourni uniquement titre dinformation (Name est lidentificateur vous permettant de faire rfrence au composant champ dans le code source). La bote de dialogue ne tient pas compte de ce que vous entrez directement dans la zone de saisie Composant.

19-6

Guide du dveloppeur

Champs persistants

La bote options Type vous permet de spcifier le type de donnes du composant champ. Vous devez obligatoirement indiquer un type de donnes pour chaque nouveau composant champ cr. Par exemple, pour afficher une valeur montaire virgule flottante dans un champ, slectionnez Currency dans la liste droulante. Utilisez la zone de saisie Taille pour spcifier le nombre maximum de caractres pouvant tre affichs ou entrs dans un champ chane, ou bien la taille des champs Bytes et VarBytes. Taille ne sutilise pour aucun autre type de donnes. La bote groupe Type de champ vous permet de spcifier le type du nouveau composant champ crer. Son type par dfaut est Donnes. Si vous choisissez Rfrence, les zones de saisie Ensemble de donnes et Champs cl de la bote groupe Dfinition de la rfrence sont actives. Il est aussi possible de crer des champs calculs, et si vous travaillez avec un ensemble de donnes client, vous pouvez mme crer des champs CalcInterne ou Agrgat. Le tableau suivant dresse la liste des champs pouvant tre crs :
Tableau 19.2
Champs de donnes Champs calculs CalcInterne Champs de rfrence Agrgat

Types de champs persistants Utilisation


Ils remplacent gnralement les champs existants (par exemple, pour changer le type des donnes dun champ). Ils affichent des valeurs calcules lors de lexcution par le gestionnaire dvnement OnCalcFields dun ensemble de donnes. Ils affichent des valeurs calcules lors de lexcution par le client ensemble de donnes et stockes avec ses donnes. Ils extraient des valeurs dun ensemble de donnes spcifi lors de lexcution en fonction des critres de recherche que vous indiquez (non pris en charge par les ensembles de donnes unidirectionnels). Affiche une valeur rcapitulant les donnes contenues dans un ensemble denregistrements dun ensemble de donnes client.

Type de champ

La bote groupe Dfinition de la rfrence ne sutilise que pour crer des champs de rfrence. Elle est dcrite dans Dfinition dun champ de rfrence la page 19-10.

Dfinition dun champ de donnes


Un champ de donn es remplace un champ existant dans un ensemble de donnes. Il peut arriver que pour des raisons lies par exemple la programmation vous ayez remplacer TSmallIntField par TIntegerField. Comme vous ne pouvez pas changer directement son type de donnes, vous devez dfinir un nouveau champ pour le remplacer.
Important

Mme si pour remplacer un champ existant vous en dfinissez un nouveau, celui-ci doit driver la valeur de ses donnes dune colonne dune table sousjacente dun ensemble de donnes. Pour crer un champ de donnes de remplacement dun champ de la table sousjacente un ensemble de donnes :

1 Retirez le champ de la liste des champs persistants affecte lensemble de donnes puis choisissez Nouveau champ dans le menu contextuel.

Manipulation des composants champ

19-7

Champs persistants

2 Dans la bote de dialogue Nouveau champ, entrez dans la zone de saisie Nom le nom dun champ existant de la table de la base de donnes. Nentrez pas un nouveau nom de champ car vous spcifiez ici le nom dun champ existant dont le nouveau champ va driver ses donnes. 3 Choisissez un nouveau type de donnes dans la bote options Type. Celui-ci doit tre diffrent de celui du champ que vous remplacez. Il nest pas possible de remplacer un champ chane dune taille donne par un champ chane dune autre taille. Mme si le type de donnes doit tre diffrent il doit nanmoins tre compatible avec le type de donnes rel du champ de la table sous-jacente. 4 Le cas chant, entrez la taille du champ dans la zone de saisie correspondante. Cela ne sapplique quaux champs de type TStringField, TBytesField et TVarBytesField. 5 Slectionnez Donnes dans la bote groupe Type de champ. 6 Choisissez OK. La bote de dialogue Nouveau champ se referme, le nouveau champ remplace celui que vous avez spcifi ltape 1 et la dclaration de composant dans la dclaration de type du module de donnes ou de la fiche est mise jour.
Pour diter les proprits ou les vnements associs au composant champ, slectionnez le nom du composant dans la bote liste de lditeur de champs, puis ditez ses proprits ou vnements avec linspecteur dobjets. Pour plus de dtails sur ldition des proprits et des vnements dun composant champ, reportez-vous D finition des vnements et des proprits des champs persistants la page 19-13.

Dfinition dun champ calcul


Un champ calcul, comme son nom lindique, affiche les valeurs calcules lors de lexcution par le gestionnaire dvnement OnCalcFields dun ensemble de donnes. Par exemple, vous pouvez tre amen crer un champ chane qui affiche des valeurs concatnes partir dautres champs. Pour crer un champ calcul partir de la bote de dialogue Nouveau champ :

1 Saisissez un nom dans la zone de saisie Nom (attention ne pas entrer le nom dun champ existant). 2 Choisissez le type de donnes de ce champ dans la bote options Type. 3 Entrez la taille du champ dans la zone de saisie correspondante, le cas chant. La taille ne sapplique quaux champs de type TStringField, TBytesField et TVarBytesField. 4 Slectionnez Calcul ou CalcInterne dans la bote groupe Type de champ. InternalCalc est uniquement disponible si vous utilisez un ensemble de donnes client. La principale diffrence entre les deux types de champs calculs est que les valeurs calcules pour un champ CalcInterne sont stockes et extraites des donnes de lensemble de donnes client.

19-8

Guide du dveloppeur

Champs persistants

5 Choisissez OK. Le nouveau champ calcul est ajout automatiquement la fin de la liste des champs persistants de la bote liste de lditeur de champs et la dclaration du composant est ajoute automatiquement la dclaration de type du module de donnes ou de la fiche. 6 Introduisez le code qui calcule les valeurs du champ dans le gestionnaire dvnement OnCalcFields de lensemble de donnes. Pour savoir comment crire du code pour calculer la valeur des champs, voir Programmation dun champ calcul la page 19-9.
Remarque

Pour diter les proprits ou vnements associs au composant champ, slectionnez le nom du composant dans la bote liste de lditeur de champs, puis procdez ldition avec linspecteur dobjets. Pour en savoir plus ce sujet, reportez-vous D finition des vnements et des proprits des champs persistants la page 19-13.

Programmation dun champ calcul


Aprs avoir dfini un champ calcul, vous devez crire le code permettant den calculer la valeur, sinon il aura toujours une valeur NULL. Le code dun champ calcul doit tre plac dans lvnement OnCalcFields de son ensemble de donnes. Pour programmer la valeur dun champ calcul :

1 Slectionnez le composant ensemble de donnes dans la liste droulante de linspecteur dobjets. 2 Choisissez la page Evnements dans linspecteur dobjets. 3 Double-cliquez sur la proprit OnCalcFields pour lancer ou crer une procdure CalcFields pour le composant ensemble de donnes. 4 Ecrivez le code dfinissant les valeurs et les autres proprits du champ calcul.
Supposons par exemple que vous ayez cr un champ calcul CityStateZip pour la table Customers dans le module de donnes CustomerData. CityStateZip affichera le nom de la ville et de ltat o se trouve lentreprise et le code postal sur une mme ligne dun contrle orient donnes. Pour ajouter du code la procdure CalcFields pour la table Customers, slectionnez celle-ci dans la liste droulante de linspecteur dobjets, passez la page Evnements et double-cliquez sur la proprit OnCalcFields. La procdure TCustomerData.CustomersCalcFields apparat dans la fentre de code source de lunit. Ajoutez le code suivant la procdure pour calculer le champ :
CustomersCityStateZip.Value := CustomersCity.Value + , + CustomersState.Value + + CustomersZip.Value; Remarque

Lorsque vous crivez le gestionnaire dvnement OnCalcFields pour un champ calcul de faon interne, vous pouvez amliorer les performances en consultant la proprit State de lensemble de donnes client et en recalculant la valeur uniquement si State vaut dsInternalCalc. Pour plus dinformations, voir

Manipulation des composants champ

19-9

Champs persistants

Utilisation de champs calculs de faon interne dans les ensembles de donnes client la page 23-13.

Dfinition dun champ de rfrence


Un champ de rfrence est un champ en lecture seule qui affiche des valeurs lexcution en fonction du critre de recherche ayant t spcifi. Dans sa forme la plus simple, on transmet un champ de rfrence le nom du champ rechercher, la valeur rechercher et le champ de lensemble de donnes de rfrence dont la valeur doit safficher. Prenons par exemple une application de VPC permettant un oprateur dutiliser un champ de rfrence pour dterminer automatiquement la ville et ltat correspondant un code postal fourni par le client. Dans ce cas, la colonne sur laquelle doit porter la recherche peut sappeler ZipTable.Zip, la valeur rechercher tant le code postal du client tel quil a t entr dans Order.CustZip et les valeurs renvoyer tant celles des colonnes ZipTable.City et ZipTable.State de lenregistrement o ZipTable.Zip correspond la valeur actuelle du champ Order.CustZip.
Remarque

Les ensembles de donnes unidirectionnels ne prennent pas en charge les champs de rfrence. Pour crer un champ de rfrence dans la bote de dialogue Nouveau champ :

1 Saisissez le nom du champ de rfrence dans la zone de saisie Nom. Attention ne pas saisir un nom de champ existant. 2 Dans la bote options Type, choisissez un type de donnes pour le champ. 3 Le cas chant, entrez la taille du champ dans la zone de saisie correspondante. La taille nest spcifier que pour les champs de type TStringField, TBytesField et TVarBytesField. 4 Slectionnez Rfrence dans la bote groupe Type de champ pour activer les botes options Ensemble de donnes et Champs cl. 5 Choisissez dans la liste droulante de la bote options Ensemble de donnes lensemble de donnes sur lequel doit porter la recherche des valeurs de champ. Lensemble de rfrence doit tre diffrent de celui du composant champ lui-mme, sinon une exception de rfrence circulaire sera provoque au moment de lexcution. En spcifiant un ensemble de donnes de rfrence, vous activez les botes options Cls de rfrence et Champ rsultat. 6 Dans la liste droulante Champs cl, choisissez dans lensemble de donnes actif le champ dont les valeurs doivent se correspondre. Pour faire correspondre plusieurs champs, entrez leur nom directement au lieu de les choisir dans la liste droulante. Sparez leur nom par des points-virgules. Si vous utilisez plusieurs champs, il faut employer des composants champ persistants. 7 Dans la liste droulante Cls de rfrence, choisissez un champ de lensemble de donnes de rfrence devant correspondre au champ source spcifi ltape 6. Si vous avez spcifi plusieurs champs cl, il faut spcifier le mme

19-10

Guide du dveloppeur

Champs persistants

nombre de cls de rfrence. Pour spcifier plusieurs champs, entrez leur nom directement. Sparez leur nom par des points-virgules.

8 Dans la liste droulante Champ rsultat, choisissez un champ de lensemble de donnes de rfrence renvoyer comme valeur du champ de rfrence que vous tes en train de crer.
Lorsque vous concevez et excutez votre application, les valeurs des champs de rfrence sont dtermines avant celles des champs calculs. Il est possible de crer des champs calculs bass sur des champs de rfrence mais il est impossible de crer des champs de rfrence bass sur des champs calculs. Vous pouvez affiner laide de la proprit LookupCache la faon dont les champs de rfrence sont dtermins. Cette proprit dtermine si les valeurs dun champ de rfrence sont places en mmoire cache lors de la premire ouverture dun ensemble de donnes ou si elles sont rfrences dynamiquement chaque modification de lenregistrement en cours dans lensemble de donnes. Mettez LookupCache True pour cacher les valeurs dun champ de rfrence lorsque la proprit LookupDataSet ne risque aucune modification et que le nombre de valeurs de rfrence est faible. La mise en mmoire cache des valeurs de rfrence permet dacclrer les performances, car les valeurs de rfrence relatives chaque ensemble de valeurs de la proprit LookupKeyFields sont prcharges louverture de lensemble de donnes. En cas de modification de lenregistrement en cours dans lensemble de donnes, lobjet champ peut localiser sa valeur (Value) dans la mmoire cache, plutt que daccder LookupDataSet. Cette amlioration des performances est apprciable si lensemble de donnes de rfrence ( LookupDataSet) est sur un rseau prsentant des temps daccs lents.
Conseil

Vous pouvez utiliser une mmoire cache de rfrence pour proposer les valeurs de rfrence par programme au lieu dutiliser un ensemble de donnes secondaire. V rifiez que la proprit LookupDataSet vaut nil. Utilisez ensuite la mthode Add de la proprit LookupList pour la remplir avec les valeurs de rfrence. Affectez la valeur True la proprit LookupCache. Le champ utilise la liste de rfrence spcifie sans redfinir ses valeurs avec celles dun ensemble de donnes de rfrence. Si chaque enregistrement de lensemble de donnes (DataSet) comporte des valeurs diffrentes pour KeyFields, le temps ncessaire la localisation des valeurs dans le cache peut tre suprieur aux gains de temps obtenus grce au placement en mmoire cache. Plus le nombre de valeurs distinctes dans KeyFields est lev, plus le temps de traitement pass localiser des valeurs dans la mmoire cache augmente. Si LookupDataSet risque de changer, le fait de placer des valeurs de rfrence en mmoire cache peut provoquer des rsultats errons. Appelez RefreshLookupList pour mettre jour les valeurs dans la mmoire cache. RefreshLookupList rgnre la proprit LookupList qui contient la valeur de la proprit LookupResultField de chaque ensemble de valeurs LookupKeyFields. Si LookupCache est dfinie lexcution, appelez RefreshLookupList pour initialiser la mmoire cache.

Manipulation des composants champ

19-11

Champs persistants

Dfinition dun champ agrgat


Un champ agrgat affiche les valeurs issues dun calcul portant sur un ensemble de donnes client. Un agrgat est la somme des donnes contenues dans un ensemble denregistrements. Voir Utilisation des agrgats maintenus la page 23-13 pour plus dinformations sur les agrgats maintenus. Pour crer un champ agrgat dans la bote de dialogue Nouveau champ :

1 Entrez un nom pour le champ agrgat dans la zone de saisie Nom. Nentrez pas le nom dun champ existant. 2 Choisissez le type de donnes dagrgat pour le champ dans la bote options Type. 3 Slectionnez loption dagrgat dans la bote groupe Type de champ. 4 Choisissez OK. Le champ agrgat nouvellement dfini est automatiquement ajout lensemble de donnes client et la proprit Aggregates de lensemble de donnes client est automatiquement mise jour pour inclure la spcification dagrgat approprie. 5 Placez le calcul de la somme dans la proprit ExprText du champ agrgat nouvellement cr. Pour plus dinformations sur la dfinition dune somme, voir Spcification dagrgats la page 23-14.
Une fois quun composant persistant TAggregateField est cr, un contrle TDBText peut tre li au champ agrgat. Le contrle TDBText affiche alors la valeur du champ agrgat en fonction de lenregistrement en cours de lensemble de donnes client sous-jacent.

Suppression de champs persistants


La suppression de champs persistants peut permettre daccder un sousensemble de colonnes dune table et de dfinir vos propres champs persistants afin de remplacer une colonne. Pour supprimer un ou plusieurs champs persistants dun ensemble de donnes :

1 Slectionnez les champs supprimer dans la bote liste de lditeur de champs. 2 Appuyez sur Suppr.
Remarque

Vous pouvez galement supprimer les champs slectionns en choisissant Supprimer dans le menu contextuel de lditeur de champs. Les champs supprims ne sont plus disponibles pour lensemble de donnes et ne peuvent plus tre affichs par les contrles orients donnes. Vous avez toujours la possibilit de recrer un composant champ persistant supprim par accident, mais les modifications pralablement apportes leurs proprits ou vnements seront perdues. Pour plus de dtails, reportez-vous Cration de champs persistants la page 19-4.

19-12

Guide du dveloppeur

Champs persistants

Remarque

Si vous supprimez tous les composants champ persistants dun ensemble de donnes, lensemble de donnes recommence utiliser des composants champ dynamiques pour chaque colonne de la table de base de donnes sous-jacente.

Dfinition des vnements et des proprits des champs persistants


Vous pouvez dfinir les proprits et personnaliser les vnements des composants champ persistants lors de la conception. Les proprits contrlent la faon dont un champ est affich par un composant orient donnes (elles dterminent par exemple sil doit apparatre dans un composant TDBGrid ou bien si sa valeur peut tre modifie). Les vnements contrlent ce qui se passe quand les donnes dun champ sont extraites, modifies, dfinies ou valides. Pour dfinir les proprits dun composant champ ou crire des gestionnaires dvnements personnaliss pour celui-ci, slectionnez-le dans lditeur de champs ou dans la liste de linspecteur dobjets.

Dfinition des proprits daffichage et ddition en mode conception


Pour diter les proprits daffichage dun composant champ slectionn, accdez la page Proprits de linspecteur dobjets. Le tableau suivant dresse la liste des proprits daffichage pouvant tre dites.
Tableau 19.3 Proprit
Alignment ConstraintErrorMessage CustomConstraint Currency

Proprits du composant champ Finalit


Aligne le contenu dun champ gauche, droite ou au centre dans un composant orient donnes. Spcifie le texte afficher en cas de condition de contrainte. Spcifie une contrainte locale appliquer aux donnes lors de ldition. Champs numriques seulement. True : affiche des valeurs montaires. False (par dfaut) : naffiche pas les valeurs montaires. Spcifie le format daffichage dans un composant orient donnes. Spcifie le nom de colonne dun champ dans un composant grille orient donnes. Spcifie la largeur, en caractres, dune colonne de grille affichant le contenu de ce champ. Spcifie le format ddition dans un composant orient donnes. Limite lentre de donnes dans un champ de saisie aux types et aux tendues de caractres spcifis. Spcifie galement les caractres spciaux, non ditables, qui apparaissent dans le champ (tirets, parenthses, etc.). Spcifie le type du champ crer. Spcifie le nom rel dune colonne de la table dont le champ drive sa valeur et son type de donnes.

DisplayFormat DisplayLabel DisplayWidth EditFormat EditMask

FieldKind FieldName

Manipulation des composants champ

19-13

Champs persistants

Tableau 19.3 Proprit

Proprits du composant champ (suite) Finalit


Indique si des conditions de contrainte ont t imposes un champ. Spcifie une contrainte SQL importe du dictionnaire de donnes ou dun serveur SQL. Spcifie la position du champ dans un ensemble de donnes. Spcifie la table utilise pour rfrencer les valeurs de champs lorsque Lookup est True. Spcifie le champ ou les champs de lensemble de donnes de rfrence devant se correspondre lors dun rfrencement. Spcifie le champ de lensemble de donnes de rfrence dont la valeur doit tre copie dans le champ de rfrence Champs numriques seulement. Spcifie la valeur maximum que lutilisateur peut entrer dans le champ. Champs numriques seulement. Spcifie la valeur minimum que lutilisateur peut entrer dans le champ. Spcifie le nom du composant utilis pour faire rfrence du composant champ dans Delphi. Spcifie le nom du champ tel quil apparat dans la base de donnes sous-jacente. Champs numriques uniquement. Spcifie le nombre de chiffres significatifs. True : affiche les valeurs de champ dans les contrles orients donnes, mais en interdit ldition. False (par dfaut) : autorise laffichage et ldition des valeurs du champ. Spcifie le nombre maximum de caractres pouvant tre affichs ou entrs dans un champ chane, ou bien la taille en octets des champs TBytesField et TVarBytesField. Compartiment entier long que le programmeur peut utiliser dans tous les composants. True (par dfaut) : spcifie quune traduction sera effectue vers et depuis les locales respectives au fur et mesure que des donnes sont transfres entre un ensemble de donnes et une base de donnes. False : spcifie que ces traductions ne seront pas effectues. True (valeur par dfaut) : permet laffichage du champ dans une grille oriente donnes. False : empche laffichage du champ dans un composant grille orient donnes. Les composants dfinis par lutilisateur peuvent afficher les dcisions prises en fonction de cette proprit.

HasConstraints ImportedConstraint Index LookupDataSet LookupKeyFields LookupResultField MaxValue MinValue Name Origin Precision ReadOnly

Size

Tag Transliterate

Visible

Toutes les proprits ne sont pas disponibles pour lensemble des composants champ. Par exemple, un composant champ de type TStringField ne peut pas avoir les proprits Currency, MaxValue ou DisplayFormat et un composant de type TFloatField ne peut pas avoir de proprit Size.

19-14

Guide du dveloppeur

Champs persistants

Alors que le rle de la plupart des proprits est vident, certaines comme Calculated ncessitent des tapes de programmation supplmentaires. D autres, comme DisplayFormat, EditFormat et EditMask sont relies entre elles ; leur configuration doit tre coordonne. Pour plus de dtails sur lutilisation des proprits DisplayFormat, EditFormat et EditMask, voir Contrle ou dissimulation de la saisie utilisateur la page 19-17.

Dfinition des proprits des composants champ lexcution


Les proprits des composants champ peuvent aussi tre utilises et manipules lexcution. Accdez aux composants champ persistants par leur nom, celui-ci tant obtenu en concatnant le nom du champ et le nom de lensemble de donnes. Par exemple, le code ci-dessous donne la valeur True la proprit ReadOnly du champ CityStateZip de la table Customers :
CustomersCityStateZip.ReadOnly := True;

Linstruction suivante change lordre des champs en donnant la valeur 3 la proprit Index du champ CityStateZip de la table Customers :
CustomersCityStateZip.Index := 3;

Cration des ensembles dattributs pour les composants champ


Lorsque plusieurs champs des ensembles de donnes utiliss par votre application partagent des proprits de formatage (telles que Alignment, DisplayWidth, DisplayFormat, EditFormat, MaxValue, MinValue, et ainsi de suite), il est plus pratique de les dfinir pour un seul champ, puis de les stocker comme ensemble dattributs dans le dictionnaire des donnes. Ils peuvent alors tre appliqus facilement dautres champs.
Remarque

Les ensembles dattributs et le dictionnaire de donnes ne sont disponibles que pour les ensembles de donnes BDE. Pour crer un ensemble dattributs daprs un composant champ dun ensemble de donnes :

1 Double-cliquez sur lensemble de donnes pour lancer lditeur de champs. 2 Slectionnez le champ dont vous voulez dfinir les proprits. 3 Dfinissez les proprits voulues pour ce champ dans linspecteur dobjets. 4 Cliquez avec le bouton droit de la souris sur la bote liste de lditeur de champs pour ouvrir le menu contextuel. 5 Choisissez Enregistrer les attributs pour enregistrer la proprit du champ en cours comme ensemble dattributs dans le dictionnaire de donnes.
Par dfaut, lensemble dattributs prend le nom du champ en cours. Vous pouvez toutefois spcifier un nom diffrent en choisissant Enregistrer les attributs sous au lieu de la commande Enregistrer les attributs. Lorsque vous avez cr un nouvel ensemble dattributs et que vous lavez ajout au dictionnaire de donnes, vous pouvez lassocier dautres composants champ

Manipulation des composants champ

19-15

Champs persistants

persistants. Mme si vous supprimez cette associationultrieurement, lensemble dattributs reste dfini dans le dictionnaire de donnes.
Remarque

Vous pouvez galement crer des ensembles dattributs directement depuis lexplorateur SQL. Lorsque vous crez un ensemble dattributs avec lexplorateur SQL, il est ajout au dictionnaire de donnes mais il nest pas encore appliqu un champ. Lexplorateur SQL vous permet de spcifier deux attributs supplmentaires : un type de champ (tel que TFloatField, TStringField, etc.) et un contrle orient donnes (TDBEdit, TDBCheckBox, etc.) plac automatiquement sur une fiche lorsque vous y faites glisser un champ bas sur lensemble dattributs. Pour en savoir plus ce sujet, reportez-vous laide en ligne de lexplorateur SQL.

Association des ensembles dattributs aux composants champ


Lorsque plusieurs champs des ensembles de donnes utiliss par votre application partagent des proprits de formatage (Alignment, DisplayWidth, DisplayFormat, EditFormat, MaxValue, MinValue, etc.) et si vous avez enregistr ces proprits en tant quensembles dattributs dans le dictionnaire de donnes, vous pouvez facilement appliquer ceux-ci aux champs sans avoir les recrer manuellement pour chacun deux. En outre, si vous changez ultrieurement la configuration des attributs dans le dictionnaire de donnes, ces modifications seront rpercutes automatiquement chaque champ associ, la prochaine fois que des composants champ seront ajouts lensemble de donnes. Pour attribuer un ensemble dattributs un composant champ :

1 Double-cliquez sur lensemble de donnes pour lancer lditeur de champs. 2 Slectionnez le champ auquel lensemble dattributs doit sappliquer. 3 Cliquez avec le bouton droit de la souris sur la bote liste et choisissez Associer les attributs. 4 Slectionnez ou entrez lensemble dattributs appliquer depuis la bote de dialogue Association dattributs. Si un ensemble dattributs porte ce nom dans le dictionnaire de donnes, il apparat dans la bote de saisie.
Important

Si lensemble dattributs dfini dans le dictionnaire de donnes est modifi par la suite, vous devrez nouveau lappliquer chaque composant champ qui lutilise. Vous pouvez appeler lditeur de champs et slectionner plusieurs composants champ de lensemble de donnes lorsque vous r-appliquez les attributs.

Suppression des associations densembles dattributs


Si vous changez davis concernant lassociation dun ensemble dattributs un champ, vous pouvez facilement supprimer lassociation en procdant comme suit :

1 Appelez lditeur de champs correspondant depuis lensemble de donnes contenant le champ. 2 Slectionnez le champ pour lequel vous voulez supprimer lensemble dattributs.

19-16

Guide du dveloppeur

Champs persistants

3 Appelez le menu contextuel de lditeur de champs et choisissez Dissocier les attributs.


Important

Le fait de dissocier un ensemble dattributs ne modifie pas les proprits du champ. Le champ garde les paramtres quil avait lorsque lensemble dattributs lui a t affect. Pour modifier ces proprits, slectionnez le champ dans lditeur de champs et dfinissez les proprits dans linspecteur dobjets.

Contrle ou dissimulation de la saisie utilisateur


La proprit EditMask permet de contrler le type et la porte des valeurs quun utilisateur peut entrer dans un composant orient donnes associ des composants TStringField, TDateField, TTimeField, TDateTimeField et TSQLTimeStampField. Vous pouvez soit utiliser des masques existants ou crer les vtres. La manire la plus simple consiste faire appel lditeur de masques de saisie. Cependant, vous avez aussi la possibilit dentrer les masques directement dans le champ EditMask de linspecteur dobjets.
Remarque

Pour les composants TStringField, la proprit EditMask dfinit aussi le format daffichage. Pour entrer un masque de saisie, appelez lditeur de masques de saisie dun composant champ :

1 Slectionnez le composant dans lditeur de champs ou dans linspecteur dobjets. 2 Cliquez sur la page Proprits de linspecteur dobjets. 3 Double-cliquez sur la colonne de la proprit EditMask dans linspecteur dobjets ou cliquez sur le bouton points de suspension. Lditeur de masques de saisie souvre.
La zone de saisie Masque vous permet de crer et dditer un format de masque. La grille Masques exemple vous permet de slectionner des masques prdfinis. Si vous en slectionnez un, son format apparat dans la zone de saisie et vous pouvez alors soit le modifier, soit lutiliser tel quel. La zone Test de saisie vous permet galement de tester les entres utilisateur. Le bouton Masques vous permet de charger un ensemble de masques personnalis (si vous en avez cr un) dans la grille Masques exemple.

Utilisation des formats par dfaut pour les champs numriques, date et heure
Delphi fournit des routines intgres daffichage et ddition ainsi quun formatage par dfaut intelligent pour les composants TFloatField, TCurrencyField, TBCDField, TFMTBCDField , TIntegerField, TSmallIntField, TWordField, TDateField, TDateTimeField, TTimeField et TSQLTimeStampField. Vous navez donc rien faire pour utiliser ces routines.

Manipulation des composants champ

19-17

Champs persistants

Le formatage par dfaut est effectu par les routines suivantes :


Tableau 19.4 Routine
FormatFloat FormatDateTime SQLTimeStampToStri ng FormatCurr BcdToStrF

Routines de formatage des composants champ Utilis e par . . .


TFloatField, TCurrencyField TDateField, TTimeField, TDateTimeField TSQLTimeStampField TCurrencyField, TBCDField TFMTBcdField

Seules les proprits de format appropries au type de donnes dun composant champ sont disponibles pour un composant donn. Les conventions de format par dfaut des valeurs de date, dheure, montaire et numriques reposent sur les proprits des Options rgionales dfinies dans le Panneau de configuration. Par exemple, si vous utilisez les paramtres par dfaut des Etats-Unis, la colonne TFloatField dont la proprit Currency est True remplace la valeur 1234,56 de la proprit DisplayFormat par $1234.56, tandis que la valeur de EditFormat devient 1234.56. Au moment de la conception ou de lexcution, vous pouvez diter les proprits DisplayFormat et EditFormat dun composant champ pour ignorer la configuration daffichage par dfaut de ce champ. Vous pouvez galement crire des gestionnaires dvnements OnGetText et OnSetText pour effectuer un formatage personnalis des composants champ lors de lexcution.

Gestion des vnements


A linstar de tous les composants, les composants champ ont des gestionnaires dvnements associs. Il est possible daffecter des mthodes comme gestionnaire de ces vnements. Ceux-ci vous permettent de contrler les vnements affectant les donnes saisies dans les champs au moyen de contrles orients donnes et deffectuer des actions spcifiques. Le tableau suivant dresse la liste des vnements associs aux composants champ :
Tableau 19.5 Ev nement
OnChange OnGetText OnSetText OnValidate

Evnements des composants champ Finalit


Appel lors du changement de la valeur dun champ. Appel lors de lextraction de la valeur dun composant champ pour affichage ou dition. Appel lors de la dfinition de la valeur dun composant champ. Appel pour valider la valeur dun composant champ chaque fois quelle est modifie suite une dition ou une insertion.

Les vnements OnGetText et OnSetText sont surtout utiles aux programmeurs qui veulent aller au-del des fonctions de formatage intgres. OnChange permet deffectuer des tches spcifiques une application et associes aux modifications

19-18

Guide du dveloppeur

Manipulation des mthodes de champ lors de lexcution

de donnes, comme lactivation ou la dsactivation de menus ou de contrles visuels. OnValidate est utile pour valider la saisie de donnes dans votre application avant de renvoyer les valeurs un serveur de base de donnes. Pour crire un gestionnaire dvnement pour un composant champ :

1 Slectionnez le composant. 2 Slectionnez la page Evnements dans linspecteur dobjets. 3 Double-cliquez sur la colonne des valeurs du gestionnaire dvnement pour ouvrir la fentre de code source correspondante. 4 Crez ou ditez le code du gestionnaire.

Manipulation des mthodes de champ lors de lexcution


Les mthodes des composants champ disponibles au moment de lexcution vous permettent de convertir les valeurs des champs dun type en un autre et de placer la focalisation sur le premier contrle orient donnes dune fiche associe un composant champ. Le contrle de la focalisation des composants orients donnes associs un champ est important quand votre application effectue la validation de donnes orientes enregistrement dans un gestionnaire dvnement densemble de donnes (comme BeforePost). Il est possible de procder la validation des champs dun enregistrement, que son contrle orient donnes associ ait la focalisation ou non. Si la validation choue pour un champ particulier de lenregistrement, vous devez faire en sorte que le contrle contenant les donnes lorigine de lerreur reoive la focalisation afin que lutilisateur puisse entrer les corrections. Pour contrler la focalisation des composants orients donnes dun champ, vous devez recourir la mthodeFocusControl. Celle-ci place la focalisation sur le premier contrle orient donnes dune fiche associ un champ. Un gestionnaire dvnement doit faire appel la mthode FocusControl dun champ avant de le valider. Le code ci-dessous montre comment faire appel la mthode FocusControl pour le champ Company de la table Customers :
CustomersCompany.FocusControl;

Le tableau suivant dresse la liste des autres mthodes des composants champ et prsente leur utilisation. Pour une liste complte des mthodes et des informations dtailles sur leur utilisation, voir les entres sur TField et ses descendants dans la Rfrence VCL.
Tableau 19.6 M thode
AssignValue Clear

M thodes des composants champ Utilisation


Affecte une valeur de champ une valeur spcifie en utilisant une fonction de conversion base sur le type du champ. Efface le champ et met sa valeur NULL.

Manipulation des composants champ

19-19

Affichage, conversion et accs aux valeurs des champs

Tableau 19.6 M thode


GetData IsValidChar SetData

M thodes des composants champ (suite) Utilisation


Extrait du champ des donnes non formates. Dtermine si un caractre saisi par un utilisateur dans un contrle orient donnes dans le but de dfinir une valeur est autoris. Affecte des donnes brutes au champ.

Affichage, conversion et accs aux valeurs des champs


Les contrles orients donnes comme TDBEdit et TDBGrid affichent automatiquement les valeurs associes aux composants champ. Si ldition est active pour lensemble de donnes et les contrles, les contrles orients donnes peuvent aussi envoyer des valeurs nouvelles et modifies dans la base de donnes. En gnral, les proprits et les mthodes incorpores des contrles orients donnes leur permettent de se connecter des ensembles de donnes, dafficher des valeurs et deffectuer des mises jour sans que cela require de programmation supplmentaire de votre part. Utilisez-les autant que possible dans vos applications de bases de donnes. Pour plus dinformations sur les contrles orients donnes, voir chapitre 15, Utilisation de contrles de donnes. Les contrles standard peuvent aussi afficher et diter des valeurs de bases de donnes associes des composants champ. Lutilisation de contrles standard peut toutefois ncessiter un supplment de programmation de votre part. Par exemple, lorsque votre application utilise des contrles standard, elle doit dterminer quel moment les mettre jour car les valeurs de champ voluent. Si lensemble de donnes possde un composant source de donnes, vous pouvez utiliser ses vnements cet effet. En particulier, lvnement OnDataChange vous permet de savoir quel moment vous devez mettre jour la valeur dun contrle et lvnement OnStateChange peut vous aider dterminer quel moment vous devez activer ou dsactiver les contrles. Pour plus dinformations sur ces vnements, voir Rponse aux modifications effectues par le biais de la source de donnes la page 15-5. Les rubriques suivantes dcrivent la manipulation de valeurs de champ afin de les afficher dans des contrles standard.

Affichage de valeurs dans les contrles standard


Une application peut accder la valeur dune colonne densemble de donnes au moyen de la proprit Value dun composant champ. Le gestionnaire dvnement OnDataChange ci-dessous, par exemple, met jour le texte contenu dans un contrle TEdit car la valeur du champ CustomersCompany a peut-tre volu :
procedure TForm1.CustomersDataChange(Sender: TObject, Field: TField); begin Edit3.Text := CustomersCompany.Value; end;

19-20

Guide du dveloppeur

Affichage, conversion et accs aux valeurs des champs

Cette mthode fonctionne bien pour les valeurs chane, mais elle peut ncessiter un surcrot de programmation pour pouvoir grer les conversions dautres types de donnes. Heureusement, les composants champ ont des proprits intgres leur permettant de le faire.
Remarque

Vous pouvez galement utiliser des Variants pour accder aux valeurs des champs et les dfinir. Pour plus de dtails sur lutilisation des variants pour accder aux valeurs des champs et les dfinir, reportez-vous Accs des valeurs par la proprit par dfaut dun ensemble de donnes la page 19-23.

Conversion des valeurs de champs


Le rle de ces proprits est de convertir un type de donnes en un autre. Par exemple, la fonction proprit AsString convertit les valeurs numriques et boolennes en reprsentations chane. Le tableau suivant donne la liste des proprits de conversion des composants champ et indique celles conseilles en fonction de leur classe :
AsFloat AsCurrency AsBCD
Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui

AsVariant
TStringField TWideStringField TIntegerField TSmallIntField TWordField TLargeintField TFloatField TCurrencyField TBCDField TFMTBCDField TDateTimeField TDateField TTimeField TSQLTimeStampField TBooleanField TBytesField TVarBytesField TBlobField TMemoField TGraphicField TVariantField TAggregateField Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui N/D Oui

AsString
N/D Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui

AsInteger
Oui Oui N/D Oui Oui Oui Oui Oui Oui Oui

AsDateTime AsSQLTimeStamp
Oui Oui

AsBoolean
Oui Oui

Oui

Oui

Oui

Oui

Manipulation des composants champ

19-21

Affichage, conversion et accs aux valeurs des champs

Vous remarquerez que certaines colonnes du tableau font rfrence plusieurs proprits de conversion (telles que AsFloat, AsCurrency et AsBCD). En effet, tous les types de donnes de champ qui prennent en charge lune de ces proprits prennent galement en charge les autres. Vous remarquerez galement que la proprit AsVariant peut traduire tous les types de donnes. Pour tout type de donnes ne figurant pas dans la liste cidessus, AsVariant est galement disponible (et constitue, de fait, la seule option). Utilisez-la en cas de doute. Il est des cas o la conversion nest pas possible. Par exemple, AsDateTime permet de convertir une chane au format date, heure ou date/heure seulement si la valeur de la chane est dans un format date/heure identifiable. Lchec dune tentative de conversion a pour effet de provoquer une exception. Dans certains autres cas, la conversion est possible, mais les rsultats sont parfois imprvisibles. Par exemple, que signifie la conversion dune valeur TDateTimeField au format flottant ? AsFloat convertit la partie date du champ en nombre de jours partir du 31/12/1899 et la partie heure du champ en une fraction de 24 heures. Le tableau suivant donne la liste des conversions autorises qui donnent des rsultats spciaux :
Tableau 19.7 Conversion
De String Boolean De Float Integer De DateTime ou SQLTimeStamp Float De Boolean String

Rsultats de conversion spciaux R sultat


Convertit True, False, Yes et No en valeur boolenne. Les autres valeurs provoquent une exception. Arrondit la valeur virgule flottante lentier le plus proche. Convertit la date en nombre de jours partir du 31 dcembre 1899 et lheure en fraction de 24 heures. Convertit toute valeur boolenne en True ou False.

Dans les autres cas, la conversion est totalement impossible, toute tentative provoquant une exception. La conversion a toujours lieu avant laffectation. Par exemple, linstruction cidessous convertit la valeur de CustomersCustNo en chane et affecte celle-ci au texte dun contrle de saisie :
Edit1.Text := CustomersCustNo.AsString;

A linverse, linstruction suivante affecte le texte dun contrle de saisie au champ CustomersCustNo en tant quentier :
MyTableMyField.AsInteger := StrToInt(Edit1.Text);

19-22

Guide du dveloppeur

Affichage, conversion et accs aux valeurs des champs

Accs des valeurs par la proprit par dfaut dun ensemble de donnes
La mthode la plus gnrale pour accder la valeur dun champ consiste recourir la proprit FieldValues. Par exemple, linstruction suivante prend la valeur dune zone de saisie et la transfre dans le champ CustNo de la table Customers :
Customers.FieldValues[CustNo] := Edit2.Text;

Etant donn que la proprit FieldValues est de type Variant, elle convertit automatiquement les autres types de donnes en une valeur Variant. Pour en savoir plus sur les Variants, voir laide en ligne.

Accs des valeurs par la proprit Fields dun ensemble de donnes


Vous pouvez accder la valeur dun champ par la proprit Fields du composant ensemble de donnes auquel appartient le champ. Fields gre une liste indexe de tous les champs de lensemble de donnes. Cest utile si vous devez parcourir un certain nombre de colonnes ou si votre application utilise des tables non disponibles lors de la conception. Pour utiliser la proprit Fields, vous devez connatre lordre et le type de donnes dun champ de lensemble de donnes. Pour spcifier le champ auquel vous voulez accder, vous devez utiliser un nombre ordinal. Le premier champ dun ensemble de donnes porte le numro 0. La valeur des champs doit tre convertie correctement laide des proprits de conversion de chaque composant champ. Pour plus de dtails sur les proprits de conversion, reportez-vous Conversion des valeurs de champs la page 19-21. Par exemple, linstruction ci-dessous affecte la valeur actuelle de la septime colonne (pays) de la table Customers un contrle de saisie :
Edit1.Text := CustTable.Fields[6].AsString;

A linverse, vous pouvez affecter une valeur un champ en dfinissant la proprit Fields de lensemble de donnes pour le champ voulu. Exemple :
begin Customers.Edit; Customers.Fields[6].AsString := Edit1.Text; Customers.Post; end;

Manipulation des composants champ

19-23

Dfinition de la valeur par dfaut dun champ

Accs des valeurs par la mthode FieldByName dun ensemble de donnes


Vous pouvez galement accder la valeur dun champ par la mthode FieldByName dun ensemble de donnes. Cette mthode est utile si vous connaissez le nom du champ auquel vous voulez accder, mais si vous navez pas accs la table sous-jacente au moment de la conception. Pour utiliser FieldByName, vous devez connatre lensemble de donnes et le nom du champ auxquels vous voulez accder pour transmettre le nom du champ la mthode en tant quargument. Pour accder la valeur du champ ou la modifier, vous devez convertir le rsultat avec la proprit de conversion de composant champ approprie, comme par exemple AsString ou AsInteger. Par exemple, linstruction suivante affecte la valeur du champ CustNo de lensemble de donnes Customers un contrle de saisie :
Edit2.Text := Customers.FieldByName(CustNo).AsString;

A linverse, vous pouvez affecter une valeur un champ :


begin Customers.Edit; Customers.FieldByName(CustNo).AsString := Edit2.Text; Customers.Post; end;

Dfinition de la valeur par dfaut dun champ


Vous pouvez spcifier la faon dont la valeur par dfaut dun champ dans un ensemble de donnes client ou un ensemble de donnes BDE doit tre calcule lexcution en utilisant la proprit DefaultExpression. Cette proprit peut tre toute expression SQL valide ne faisant pas rfrence aux valeurs des champs. Si lexpression contient des valeurs littrales autres que des valeurs numriques, elles doivent tre entoures de guillemets. Par exemple, si un champ heure contient une valeur par dfaut quivalente midi, elle apparat ainsi :
12:00:00 Remarque

Si la table de base de donnes sous-jacente dfinit une valeur par dfaut pour le champ, la valeur par dfaut que vous spcifiez dans DefaultExpression est prioritaire. En effet, DefaultExpression sapplique lorsque lensemble de donnes valide lenregistrement contenant le champ, cest--dire avant lapplication de lenregistrement modifi au serveur de base de donnes.

Utilisation de contraintes
Les composants champ des ensembles de donnes ou des ensembles de donnes BDE peuvent utiliser des contraintes SQL importes du serveur. De plus, vos applications peuvent crer et utiliser des contraintes personnalises appliques

19-24

Guide du dveloppeur

Utilisation de contraintes

ces ensembles de donns localement par rapport votre application. Toutes les contraintes sont des rgles ou des conditions qui imposent une limite la porte ou lintervalle des valeurs que le champ peut stocker.

Cration de contrainte personnalise


Une contrainte personnalise nest pas importe du serveur comme les autres contraintes. Cest une contrainte que vous dclarez, implmentez et rendez effective dans votre application locale. Ainsi, les contraintes personnalises permettent une pr-validation des donnes saisies mais elles ne peuvent pas tre appliques aux donnes reues dune application serveur ou mises vers celle-ci Pour crer une contrainte personnalise, dfinissez la proprit CustomConstraint de faon ce quelle spcifie une condition de contrainte et affectez la proprit ConstraintErrorMessage le texte du message affich lorsquun utilisateur effectue une violation de contrainte lexcution. CustomConstraint est une chane SQL qui spcifie une contrainte propre lapplication et impose la valeur du champ. D finissez CustomConstraint de faon limiter les valeurs pouvant tre saisies par un utilisateur dans un champ. CustomConstraint peut tre toute expression de recherche SQL valide telle que :
x > 0 and x < 100

Le nom utilis pour faire rfrence la valeur du champ peut tre toute chane autre qu un mot SQL rserv, tant quelle est utilise avec homognit lintrieur de lexpression de contrainte.
Remarque

Les contraintes spcialises ne sont disponibles que pour les ensembles de donnes BDE et client. Les contraintes spcialises sajoutent toute contrainte dfini par le serveur quant aux valeurs des donnes du champ. Pour connatre les contraintes imposes par le serveur, lisez la valeur de la proprit ImportedConstraint.

Utilisation des contraintes du serveur


La plupart des bases de donnes SQL dexploitation utilisent les contraintes pour imposer des conditions sur les valeurs possibles dun champ. Par exemple, un champ peut ne pas autoriser de valeurs NULL, peut exiger quune valeur soit unique pour une colonne et que ces valeurs soient comprises entre 0 et 150. Comme vous devez dupliquer de telles conditions dans vos applications client, les ensembles de donnes client et les ensembles de donnes BDE possdent une proprit ImportedConstraint permettant de diffuser localement les contraintes du serveur. ImportedConstraint est une proprit en lecture seule qui spcifie une clause SQL limitant les valeurs de champ dune certaine manire. Par exemple :
Value > 0 and Value < 100

Manipulation des composants champ

19-25

Utilisation des champs objet

Ne modifiez pas la valeur de ImportedConstraint, sauf si vous voulez modifier des commandes SQL non standard ou propres un serveur qui ont t importes en tant que commentaires, car le moteur de bases de donnes na pas pu les interprter. Pour ajouter des contraintes supplmentaires sur la valeur dun champ, utilisez la proprit CustomConstraint. Les contraintes personnalises sont imposes en plus des contraintes importes. Si les contraintes du serveur changent, la valeur de ImportedConstraint change aussi, mais les contraintes introduites dans la proprit CustomConstraint persistent. La suppression des contraintes de la proprit ImportedConstraint nentrane pas la validit des valeurs de champs qui sont en violation avec ces contraintes. La suppression des contraintes signifie simplement que la vrification est effectue par le serveur et non plus localement. Lorsque les contraintes sont vrifies localement, le message derreur spcifi dans la proprit ConstraintErrorMessage apparat au moment o les violations sont dtectes (sinon, les messages derreur affichs proviennent du serveur).

Utilisation des champs objet


Les champs objet reprsentent un compos dautres types de donnes plus simples, parmi lesquels les champs ADT (Abstract Data Type), tableau, ensemble de donnes et rfrence. Ces types de champ contiennent des champs enfants ou dautres ensembles de donnes ou y font rfrence. Les champs ADT et tableau contiennent des champs enfants. Les champs enfants dun champ ADT peuvent tre de nimporte quel type scalaire ou type dobjet (cest--dire, de tout autre type de champ). Ces champs enfants peuvent varier quant leur type. Un champ tableau contient un tableau de champs enfants de type identique. Les champs ensemble de donnes et de rfrence sont des champs qui accdent dautres ensembles de donnes. Un champ ensemble de donnes permet daccder un ensemble de donnes (dtail) imbriqu. Un champ de rfrence stocke un pointeur (rfrence) sur un autre objet persistant (ADT).
Tableau 19.8
TADTField TArrayField TDataSetField TReferenceField

Types de composants champ objet Utilisation


Reprsente un champ ADT (Abstract Data Type). Reprsente un champ tableau. Reprsente un champ contenant une rfrence un ensemble de donnes imbriqu. Reprsente un champ REF, pointant sur un champ ADT.

Nom du composant

Quand vous ajoutez des champs avec lditeur de champs un ensemble de donnes contenant des champs objet, des champs objet persistants du type correct sont automatiquement crs pour vous. Lorsque vous ajoutez des champs objet persistants un ensemble de donnes, la proprit ObjectView de

19-26

Guide du dveloppeur

Utilisation des champs objet

lensemble de donnes prend automatiquement la valeur True, ce qui amne lensemble de donnes stocker ces champs de faon hirarchise, plutt qu les aplanir comme si les champs enfants constitutifs taient des champs spars indpendants. Les proprits suivantes sont communes tous les champs objet et permettent de grer les ensembles de donnes et les champs enfants.
Tableau 19.9 Proprit
Fields ObjectType FieldCount FieldValues

Proprits communes des descendants de champs objet Utilisation


Contient les champs enfants du champ objet. Classe le champ objet. Nombre de champs enfants appartenant au champ objet. Permet daccder aux valeurs des champs enfants.

Affichage des champs ADT et tableau


Les champs ADT et tableau contiennent des champs enfants qui peuvent tre affichs par le biais de contrles orients donnes. Les contrles orients donnes tels que TDBEdit qui reprsentent une valeur de champ unique affichent les valeurs des champs enfants dans une chane non modifiable, spars par des virgules. En outre, si vous attribuez la proprit DataField du contrle le champ enfant au lieu du champ objet, le champ enfant peut tre visualis et modifi comme tout autre champ de donnes normal. Un contrle TDBGrid affiche diffremment les donnes de champs ADT et tableau, suivant la valeur de la proprit ObjectView de lensemble de donnes. Lorsque ObjectView vaut False, chaque champ enfant apparat dans une seule colonne. Lorsque ObjectView vaut True, un champ ADT ou tableau peut tre dvelopp et rduit en cliquant sur la flche dans la barre de titre de la colonne. Lorsque le champ est dvelopp, chaque champ enfant apparat dans sa propre colonne et barre de titre, et tous sous la barre de titre du champ ADT ou tableau. Lorsque le champ ADT ou tableau est rduit, seule une colonne apparat, contenant une chane non modifiable des champs enfants, spars par des virgules.

Utilisation des champs ADT


Les types de champs ADT sont dfinis par lutilisateur et crs sur le serveur. Ils sapparentent au type denregistrement. Un type de champ ADT peut contenir la plupart des champ scalaires, des champs tableau, des champs de rfrence et des champs ADT imbriqus. Il existe plusieurs faons daccder aux donnes des types de champ ADT. Elles sont illustrs dans les exemples suivants, qui affectent une valeur de champ

Manipulation des composants champ

19-27

Utilisation des champs objet

enfant une zone de saisie appele CityEdit et utilisent la structure ADT suivante :
Address Street City State Zip

Utilisation de composants champ persistant


La faon la plus facile daccder des valeurs de champ ADT consiste utiliser des composants champ persistant. Dans le cas de la structure ADT ci-dessus, les champs persistants suivants peuvent tre ajouts la table Customer laide de lditeur de champs :
CustomerAddress: TADTField; CustomerAddrStreet: TStringField; CustomerAddrCity: TStringField; CustomerAddrState: TStringField; CustomerAddrZip: TStringField;

A partir de ces champs persistants, vous pouvez accder simplement aux champs enfants dun champ ADT par nom :
CityEdit.Text := CustomerAddrCity.AsString;

Bien que les champs persistants reprsentent la faon la plus facile daccder aux champs enfants ADT, il est impossible de les utiliser si la structure de lensemble de donnes est inconnue lors de la conception. Lorsque vous accdez des champs enfants ADT sans utiliser de champs persistants, vous devez attribuer la valeur True la proprit ObjectView de lensemble de donnes.

Utilisation de la mthode FieldByName dun ensemble de donnes


Vous pouvez accder aux enfants dun champ ADT laide de la mthode FieldByName de lensemble de donnes en qualifiant le nom du champ enfant partir du nom du champ ADT :
CityEdit.Text := Customer.FieldByName(Address.City).AsString;

Utilisation de la proprit FieldValues dun ensemble de donnes


Vous pouvez galement utiliser des noms de champ qualifis avec la proprit FieldValues dun ensemble de donnes :
CityEdit.Text := Customer[Address.City];

Vous pouvez ignorer le nom de la proprit (FieldValues) car FieldValues est la proprit par dfaut de lensemble de donnes.
Remarque

A la diffrence des autres mthodes disponibles lexcution pour accder aux valeurs de champs enfants ADT, la proprit FieldValues fonctionne mme si la proprit ObjectView de lensemble de donnes vaut False.

19-28

Guide du dveloppeur

Utilisation des champs objet

Utilisation de la proprit FieldValues dun champ ADT


Vous pouvez accder la valeur dun champ enfant avec la proprit FieldValues de TADTField. FieldValues accepte et renvoie un Variant ; elle peut dont traiter et convertir des champs de nimporte quel type. Le paramtre dindex accepte une valeur entire qui spcifie le dcalage du champ.
CityEdit.Text := TADTField(Customer.FieldByName(Address)).FieldValues[1];

FieldValues tant la proprit par dfaut de TADTField, le nom de proprit (FieldValues) peut tre ignor. Par consquent, linstruction suivante est quivalente la prcdente :
CityEdit.Text := TADTField(Customer.FieldByName(Address))[1];

Utilisation de la proprit Fields dun champ ADT


Chaque champ ADT possde une proprit Fields analogue la proprit Fields dun ensemble de donnes. De mme que la proprit Fields dun ensemble de donnes, vous pouvez lutiliser pour accder aux champs enfants par position :
CityEdit.Text := TADTField(Customer.FieldByName(Address)).Fields[1].AsString;

ou par nom :
CityEdit.Text := TADTField(Customer.FieldByName(Address)).Fields.FieldByName(City).AsString;

Utilisation des champs tableau


Les champs tableau se composent dun ensemble de champs de mme type. Les types de champ peuvent tre scalaires (par exemple virgule flottante, chane) ou non scalaires (ADT), mais un champ tableau de tableaux nest pas autoris. La proprit SparseArrays de TDataSet dtermine si un objet unique TField est cr pour chaque lment du champ tableau. Il existe plusieurs faons daccder aux donnes contenues dans les types de champs tableau. Si vous nutilisez pas de champs persistants, vous devez attribuer la valeur True la proprit ObjectView de lensemble de donnes afin daccder aux lments dun champ tableau.

Utilisation de champs persistants


Vous pouvez mapper les champs persistants avec les diffrents lments de tableau dun champ tableau. Par exemple, supposons un champ tableau TelNos_Array, qui est un tableau de chanes compos de six lments. Les champs persistants suivants crs pour le composant table Customer reprsente le champ TelNos_Array et ses six lments :
CustomerTelNos_Array: TArrayField; CustomerTelNos_Array0: TStringField; CustomerTelNos_Array1: TStringField; CustomerTelNos_Array2: TStringField; CustomerTelNos_Array3: TStringField; CustomerTelNos_Array4: TStringField; CustomerTelNos_Array5: TStringField;

Manipulation des composants champ

19-29

Utilisation des champs objet

A partir de ces champs persistants, le code suivant utilise un champ persistant pour affecter une valeur dlment de tableau une zone de saisie nomme TelEdit.
TelEdit.Text := CustomerTelNos_Array0.AsString;

Utilisation de la proprit FieldValues dun champ tableau


Vous pouvez accder la valeur dun champ enfant avec la proprit FieldValues du champ tableau. FieldValues accepte et renvoie un Variant ; elle peut dont traiter et convertir des champs enfants de nimporte quel type. Par exemple,
TelEdit.Text := TArrayField(Customer.FieldByName(TelNos_Array)).FieldValues[1];

FieldValues tant la proprit par dfaut de TArrayField, vous pouvez aussi crire le code suivant :
TelEdit.Text := TArrayField(Customer.FieldByName(TelNos_Array))[1];

Utilisation de la proprit Fields dun champ tableau


TArrayField possde une proprit Fields qui vous permet daccder aux diffrents sous-champs. Cette possibilit est illustre dans le code suivant, dans lequel un champ tableau (OrderDates) est utilis pour remplir une bote liste avec tous les lments de tableau nayant pas NULL pour valeur :
for I := 0 to OrderDates.Size - 1 do begin if not OrderDates.Fields[I].IsNull then OrderDateListBox.Items.Add(OrderDates[I]); end;

Utilisation des champs ensemble de donnes


Les champs ensemble de donnes permettent daccder aux donnes stockes dans un ensemble de donnes imbriqu. La proprit NestedDataSet contient des rfrences lensemble de donnes imbriqu. Les donnes contenues dans lensemble de donnes imbriqu sont accessibles par le biais des objets champ de cet ensemble de donnes.

Affichage des champs ensemble de donnes


Les contrles TDBGrid permettent laffichage des donnes stockes dans les champs ensemble de donnes. Dans un contrle TDBGrid, un champ ensemble de donnes est dsign dans chaque cellule de la colonne de lensemble de donnes avec la chane (DataSet) et, lexcution, avec un bouton points de suspension sur la droite. Le fait de cliquer sur ce bouton appelle une nouvelle fiche dont la grille affiche lensemble de donnes associ au champ ensemble de donnes de lenregistrement en cours. Cette fiche peut aussi tre appele par programmation avec la mthode ShowPopupEditor. Par exemple, si la septime colonne de la grille reprsente un champ ensemble de donnes, le code suivant affichera lensemble de donnes associ ce champ pour lenregistrement en cours.
DBGrid1.ShowPopupEditor(DBGrid1.Columns[7]);

19-30

Guide du dveloppeur

Utilisation des champs objet

Accs aux donnes dun ensemble de donnes imbriqu


Normalement un champ ensemble de donnes nest pas directement li un contrle orient donnes. En fait, comme un champ ensemble de donnes imbriqu nest rien dautre quun ensemble de donnes, vous utilisez un descendant de TDataSet pour accder ses donnes. Le type densemble de donnes utilis est dtermin par lensemble de donnes parent (celui possdant le champ ensemble de donnes). Par exemple, un ensemble de donnes BDE utilise TNestedTable pour reprsenter les donnes des champs ensemble de donnes, alors que les ensembles de donnes client utilisent dautres ensembles de donnes client. Pour accder aux donnes dun champ ensemble de donnes :

1 Crez un objet TDataSetField persistant en appelant lditeur de champ de lensemble de donnes parent. 2 Crez un ensemble de donnes reprsentant les valeurs de ce champ ensemble de donnes. Il doit avoir un type compatible avec lensemble de donnes parent. 3 Affectez la proprit DataSetField de lensemble de donnes cr ltape 2 le champ ensemble de donnes persistant cr ltape 1.
Si le champ ensemble de donnes imbriqu de lenregistrement en cours possde une valeur, le composant ensemble de donnes dtail contient des enregistrements avec les donnes imbriques ; sinon, lensemble de donnes dtail est vide. Avant dinsrer des enregistrements dans un ensemble de donnes imbriqu, vous devez avoir post lenregistrement correspondant dans la table matre, sil vient juste dtre insr. Si lenregistrement insr na pas t post, il sera automatiquement post avant que ne soit post lensemble de donnes imbriqu.

Utilisation de champs de rfrence


Les champs de rfrence stockent un pointeur ou une rfrence vers un autre objet ADT. Cet objet ADT est un enregistrement unique dune autre table objet. Les champs de rfrence font toujours rfrence un enregistrement unique dun ensemble de donnes (table objet). Les donnes contenues dans lobjet rfrenc sont renvoyes dans un ensemble de donnes imbriqu mais sont aussi accessibles via la proprit Fields sur le composant TReferenceField.

Affichage des champs de rfrence


Dans un contrle TDBGrid, un champ de rfrence est dsign dans chaque cellule de la colonne de lensemble de donnes avec (Reference) et, lexcution, avec un bouton points de suspension sur la droite. A lexcution, le fait de cliquer sur ce bouton appelle une nouvelle fiche dont la grille affiche lobjet associ au champ de rfrence de lenregistrement en cours. Cette fiche peut aussi tre appele par programmation avec la mthode ShowPopupEditor de la grille DB. Par exemple, si la septime colonne de la grille

Manipulation des composants champ

19-31

Utilisation des champs objet

reprsente un champ de rfrence, le code suivant affiche lobjet associ ce champ pour lenregistrement en cours.
DBGrid1.ShowPopupEditor(DBGrid1.Columns[7]);

Accs aux donnes dun champ de rfrence


Vous pouvez accder aux donnes dun champ de rfrence de la mme faon que vous accdez un ensemble de donnes imbriqu :

1 Crez un objet TDataSetField persistant en appelant lditeur de champ de lensemble de donnes parent. 2 Crez un ensemble de donnes reprsentant la valeur de ce champ ensemble de donnes. 3 Affectez la proprit DataSetField de lensemble de donnes cr ltape 2 le champ ensemble de donnes persistant cr ltape 1.
Si la rfrence est attribue, lensemble de donnes de rfrence contient un enregistrement unique, avec les donnes rfrences. Si la rfrence vaut null, lensemble de donnes de rfrence est vide. Vous pouvez galement utiliser la proprit Fields du champ de rfrence pour accder aux donnes dun champ de rfrence. Par exemple, les lignes suivantes sont quivalentes et affectent des donnes du champ de rfrence CustomerRefCity une zone de saisie appele CityEdit :
CityEdit.Text := CustomerRefCity.Fields[1].AsString; CityEdit.Text := CustomerRefCity.NestedDataSet.Fields[1].AsString;

Lorsque les donnes dun champ rfrence sont modifies, cest en fait les donnes rfrences qui sont modifies. Pour affecter une valeur un champ rfrence, vous devez dabord utiliser une instruction SELECT pour slectionner la rfrence dans la table et ensuite lui attribuer la valeur. Par exemple :
var AddressQuery: TQuery; CustomerAddressRef: TReferenceField; begin AddressQuery.SQL.Text := SELECT REF(A) FROM AddressTable A WHERE A.City = San Francisco; AddressQuery.Open; CustomerAddressRef.Assign(AddressQuery.Fields[0]); end;

19-32

Guide du dveloppeur

20
Chapitre 20

Chapitre

Utilisation du moteur de bases de donnes Borland

Le moteur de bases de donnes Borland (BDE) est un mcanisme daccs aux donnes pouvant tre partag entre plusieurs applications. Le BDE dfinit une puissante bibliothque dappels API qui peuvent crer, restructurer, mettre jour, interroger ou manipuler des serveurs de bases de donnes locaux ou distants. Le BDE fournit une interface uniforme permettant daccder une grande varit de serveurs, en utilisant des pilotes pour se connecter aux diffrentes bases de donnes. Selon votre version de Delphi, vous pouvez utiliser les pilotes pour base de donnes locale (Paradox, dBASE, FoxPro et Access), les pilotes SQL Links pour base de donnes distante telles que InterBase, Oracle, Sybase, Informix, Microsoft SQL server ou DB2, et un adaptateur ODBC qui vous permet de fournir vos propres pilotes ODBC. Durant son dploiement, vous devez inclure le BDE avec votre application. Bien que cela augmente la taille de lapplication et la complexit du dploiement, le BDE peut tre partag avec dautres applications BDE, et il fournit un large support pour la manipulation des bases de donnes. Mme sil est possible dutiliser lAPI du BDE directement dans votre application, les composants de la page BDE de la palette des composants regroupent toutes ces fonctionnalits.
Remarque

Pour plus dinformations sur lAPI du BDE, voir son fichier daide, BDE32.hlp, qui se trouve dans le rpertoire o vous vous avez install le moteur de bases de donnes Borland.

Architecture BDE
Avec le BDE, votre application utilise une variante de larchitecture gnrale de base de donnes dcrite dans Architecture des bases de donnes la page 14-6. En plus des lments de linterface utilisateur, de la source de donnes et des

Utilisation du moteur de bases de donnes Borland

20-1

Architecture BDE

ensembles de donnes communs toutes les applications de bases de donnes Delphi, une application BDE peut inclure : Un ou plusieurs composants pour contrler les transactions et grer les connexions aux bases de donnes. Un ou plusieurs composants de session pour isoler les oprations daccs aux donnes telles que les connexions aux bases de donnes, et pour grer des groupes de bases de donnes. Les relations entre les composants dune application BDE sont illustres dans la figure suivante :
Figure 20.1 Composants dune application BDE

Utilisation densembles de donnes BDE


Les ensembles de donnes BDE utilisent le moteur de bases de donnes Borland pour accder aux donnes. Ils hritent des capacits de lensemble de donnes commun, dcrites au chapitre 18, Prsentation des ensembles de donnes, en utilisant le BDE pour fournir limplmentation. De plus, tous les ensembles de donnes BDE ajoutent des proprits, des vnements et des mthodes pour : Association dun ensemble de donnes avec les connexions de bases de donnes et de session. Mise en cache des BLOBS. Obtention dun handle BDE. Il existe trois ensembles de donnes BDE : TTable, un ensemble de donnes de type table qui reprsente toutes les lignes et colonnes dune table de base de donnes. Voir Utilisation densembles de donnes de type table la page 18-29 pour la description des caractristiques communes aux ensembles de donnes de type table. Voir Utilisation de TTable la page 20-5 pour la description des caractristiques spcifiques TTable. TQuery, un ensemble de donnes de type requte qui encapsule une instruction SQL et permet aux applications daccder aux enregistrements trouvs, sil y en a. Voir Utilisation densembles de donnes de type requte

20-2

Guide du dveloppeur

Architecture BDE

la page 18-49 pour la description des caractristiques communes aux ensembles de donnes de type requte. Voir Utilisation de TQuery la page 20-9 pour la description des caractristiques spcifiques TQuery. TStoredProc, un ensemble de donnes de type procdure stocke qui excute une procdure stocke dfinie sur un serveur de base de donnes. Voir Utilisation densembles de donnes de type procdure stocke la page 18-58 pour la description des caractristiques communes aux ensembles de donnes de type procdure stocke. Voir Utilisation de TStoredProc la page 20-13 pour la description des caractristiques spcifiques TStoredProc .
Remarque

En plus des trois types densemble de donnes BDE, il existe un ensemble de donnes BDE client (TBDEClientDataSet) qui peut tre utilis pour les mises jour en mmoire cache . Pour plus dinformations sur les mises jour en mmoire cache, voir Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18.

Association dun ensemble de donnes avec les connexions de bases de donnes et de session
Pour quun ensemble de donnes BDE puisse rcuprer des donnes sur un serveur, il doit utiliser la fois une base de donnes et une session. Les bases de donnes reprsentent les connexions aux serveurs spcifiques de bases de donnes. La base de donnes identifie un pilote BDE, un serveur particulier de base de donnes utilisant ce pilote et un jeu de paramtres de connexion pour accder ce serveur. Chaque base de donnes est reprsente par un composant TDatabase. Vous pouvez soit associer vos ensembles de donnes avec un composant TDatabase insr dans un formulaire ou un module de donnes, soit identifier simplement le serveur de base de donnes par son nom et laisser Delphi gnrer un composant base de donnes implicite votre place. Il est toutefois recommand dutiliser un composant TDatabase explicite dans la plupart des applications, parce quil vous donne un plus grand contrle sur la faon dtablir la connexion, y compris sur le processus de connexion, et vous permet de crer et dutiliser des transactions. Pour associer un ensemble de donnes BDE une base de donnes, utilisez la propritDatabaseName. DatabaseName est une chane qui contient des informations diffrentes selon que vous utilisez ou non un composant explicite de base de donnes et, si ce nest pas le cas, le type de base de donnes utilis : Si vous utilisez un composant TDatabase explicite, DatabaseName est la valeur de la proprit DatabaseName du composant base de donnes. Si vous dsirez utiliser un composant base de donnes implicite et si la base de donnes possde un alias BDE, vous pouvez spcifier celui-ci comme valeur pour DatabaseName. Un alias BDE reprsente une base de donnes et ses informations de configuration. Les informations de configuration associes avec les alias diffrent avec le type de la base de donnes (Oracle, Sybase, InterBase, Paradox, dBASE, etc.). Servez-vous de loutil dadministration BDE ou de lexplorateur SQL pour crer et grer les alias BDE.

Utilisation du moteur de bases de donnes Borland

20-3

Architecture BDE

Si vous dsirez utiliser un composant base de donnes implicite pour une base de donnes Paradox ou dBASE, vous pouvez simplement spcifier avec DatabaseName le rpertoire o se trouvent les tables de la base. Unesession fournit la gestion globale dun groupe de connexions aux bases de donnes dans une application. Quand vous ajoutez des ensembles de donnes BDE dans votre application, celle-ci contient automatiquement un composant session nomm Session. Quand vous ajoutez des bases de donnes et des composants ensemble de donnes votre application, ils sont automatiquement associs cette session par dfaut. Ce composant gre aussi laccs aux fichiers Paradox protgs par mot de passe, et spcifie les rpertoires pouvant partager des fichiers Paradox sur un rseau. Vous pouvez grer les connexions aux bases de donnes et accder aux fichiers Paradox en utilisant les proprits, les vnements et les mthodes de la session. Vous pouvez vous servir de la session par dfaut pour grer toutes les connexions aux bases de donnes dans votre application. Vous pouvez aussi ajouter des sessions supplmentaires au moment de la conception, ou les crer dynamiquement lors de lexcution pour grer un sous-ensemble de connexions. Pour associer votre ensemble de donnes avec un composant session explicitement cr, utilisez la proprit SessionName. Si vous nutilisez pas de composant explicite de session dans votre application, il nest pas ncessaire de fournir une valeur cette proprit. Que vous utilisiez la session par dfaut ou spcifiez une session explicite avec la proprit SessionName, vous pouvez accder la session associe un ensemble de donnes en lisant la proprit DBSession.
Remarque

Si vous utilisez un composant session, la proprit SessionName dun ensemble de donnes doit concorder avec la proprit SessionName du composant base de donnes auquel cet ensemble de donnes est associ. Pour plus dinformations sur TDatabase et TSession, voir Connexion aux bases de donnes avec TDatabase la page 20-14 et Gestion des sessions de bases de donnes la page 20-18.

Mise en cache des BLOBS


Les ensembles de donnes BDE possdent tous une proprit CacheBlobs qui dtermine si les champs BLOB sont mis localement en cache par le BDE quand une application lit les enregistrements BLOB. Par dfaut, CacheBlobs a pour valeur True, ce qui signifie que le BDE met en cache une copie locale des champs BLOB. Cette mise en cache amliore les performances de lapplication en permettant au BDE de stocker des copies locales des BLOBS au lieu daller les chercher sans cesse sur le serveur mesure que lutilisateur parcourt les enregistrements. Dans les applications et les environnements o les BOLBS sont frquemment mis jour ou remplacs, et dans lesquels une vue actualise des donnes BLOB est plus importante que les performances de lapplication, vous pouvez mettre CacheBlobs False pour vous assurer que lapplication voit toujours la dernire version du champ BLOB.

20-4

Guide du dveloppeur

Architecture BDE

Obtention dun handle BDE


Vous pouvez trs bien utiliser les ensembles de donnes BDE sans jamais devoir faire dappel API direct au moteur de bases de donnes Borland. Les ensembles de donnes BDE, en combinaison avec les composants base de donnes et session, comprennent une bonne partie des fonctionnalits du BDE. Cependant, si vous devez faire des appels API directs au BDE, vous aurez besoin de handles pour les ressources gres par le BDE. De nombreuses API du BDE requirent ces handles sous la forme de paramtres. Tous les ensembles de donnes BDE comprennent trois proprits en lecture seule pour accder aux handles du BDE durant lexcution : Handle est un handle vers le curseur BDE qui accde aux enregistrements de lensemble de donnes. DBHandle est un handle vers la base de donnes qui contient les tables sousjacentes ou la procdure stocke. DBLocale est un handle vers le pilote du langage BDE pour lensemble de donnes. La locale contrle lordre de tri et le jeu de caractres utilis pour la chane de donnes. Ces proprits sont automatiquement assignes un ensemble de donnes quand il est connect un serveur de base de donnes travers le BDE. Pour plus dinformations sur lAPI du BDE, voir le fichier daide en ligne, BDE32.HLP.

Utilisation de TTable
TTable encapsule toute la structure et les donnes dune table de base de donnes sous-jacente. Elle implmente toutes les fonctionnalits de base introduites par TDataSet, ainsi que toutes les caractristiques spciales typiques des ensembles de donnes de type table. Avant dtudier les possibilits uniques offertes par TTable, vous devriez vous familiariser avec les caractristiques communes des bases de donnes dcrites dans Prsentation des ensembles de donnes la page 18-1, y compris la section sur les ensembles de donnes de type table qui commence page 18-29. Comme TTable est un ensemble de donnes BDE, elle doit treassocie avec une base de donnes et une session. Association dun ensemble de donnes avec les connexions de bases de donnes et de session la page 20-3 dcrit la faon de former ces associations. Une fois lensemble de donnes associ avec une base de donnes et une session, vous pouvez le lier une table particulire en dfinissant la proprit TableName et, si vous utilisez une table Paradox, dBASE, FoxPro ou ASCII dlimit par des virgules, la proprit TableType.
Remarque

La table doit tre ferme quand vous modifiez son association une base de donnes, une session ou une autre table, ou quand vous dfinissez la proprit TableType. Cependant, avant de fermer la table pour modifier ces proprits, validez ou annulez toute modification en cours. Si les mises jour en mmoire cache sont actives, appelez la mthode ApplyUpdates pour crire les modifications valides dans la base de donnes.

Utilisation du moteur de bases de donnes Borland

20-5

Architecture BDE

Les composants TTable offrent un support unique aux tables des bases de donnes locales (Paradox, dBASE, FoxPro, ASCII dlimit par des virgules). De plus, les composants TTable peuvent bnficier du support du BDE pour les oprations groupes (oprations consistant ajouter, mettre jour, supprimer ou copier des groupes entiers denregistrements). Ce support est dcrit dans Importation des donnes dune autre table la page 20-8.

Spcification du type dune table locale


Si une application accde une table Paradox, dBASE, FoxPro, ou ASCII dlimit par des virgules, le BDE utilise la proprit TableType pour dterminer le type de la table (sa structure prsume). TableType nest pas utilise quand TTable reprsente une base de donnes SQL sur un serveur de base de donnes. Par dfaut, TableType est dfini sur ttDefault. Dans ce cas, le BDE dtermine le type de la table daprs lextension de son nom de fichier. Le tableau suivant rsume les extensions de fichier reconnues par le BDE et les types prsums correspondants :
Tableau 20.1 Extension
Pas dextension .DB .DBF .TXT

Types de tables reconnues par le BDE daprs les extensions Type de table
Paradox Paradox dBASE Texte ASCII

Si votre table locale Paradox, dBASE ou ASCII utilise les extensions dcrites dans le tableau prcdent, vous pouvez laisser TableType sur ttDefault. Sinon, votre application doit dfinir TableType pour indiquer le type rel de la table. Le tableau suivant indique les valeurs que vous pouvez assigner TableType :
Tableau 20.2 Valeur
ttDefault ttParadox ttDBase ttFoxPro ttASCII

Valeurs de TableType Type de table


Type de table dtermin automatiquement par le BDE Paradox dBASE FoxPro Texte ASCII dlimit par des virgules

Contrle daccs en lecture/criture aux tables locales


Comme tout ensemble de donnes de type table, TTable vous permet de contrler laccs en lecture et en criture par votre application grce la proprit ReadOnly. De plus, pour les tables Paradox, dBASE et FoxPro, TTable peut vous permettre de contrler laccs aux tables en lecture et en criture par dautres applications. La proprit Exclusive dtermine si votre application obtient laccs exclusif en

20-6

Guide du dveloppeur

Architecture BDE

lecture/criture une base Paradox, dBASE ou FoxPro. Pour lobtenir, mettez la proprit Exclusive du composant table True avant douvrir la table. Si vous russissez ouvrir la table avec un accs exclusif, les autres applications ne peuvent plus ni lire ni crire de donnes dans la table. La requte daccs exclusif ne peut tre honore que si la table nest pas dj en utilisation au moment o vous louvrez. Les instructions suivantes ouvrent une table en accs exclusif :
CustomersTable.Exclusive := True; {Etablit la requte de verrouillage exclusif} CustomersTable.Active := True; {Ouvre la table} Remarque

Vous pouvez essayer dappliquer Exclusive aux tables SQL, mais certains serveurs ne supportent pas le verrouillage exclusif au niveau des tables. Dautres peuvent admettre le verrouillage exclusif, mais permettre tout de mme dautres applications de lire des donnes dans la table. Pour plus dinformations sur le verrouillage exclusif de tables de bases de donnes, voir la documentation de votre serveur.

Spcification dun fichier dindex dBASE


Sur la plupart des serveurs, pour spcifier un index, vous utilisez les mthodes communes tous les ensembles de donnes de type table. Ces mthodes sont dcrites dans Tri des enregistrements avec des index la page 18-30. Cependant, pour les tables dBASE utilisant des fichiers dindex autres que le fichier dindex MDX dexploitation ou des index dBASE III PLUS (*.NDX), utilisez les proprits IndexFiles et IndexName. Assignez la proprit IndexFiles le nom dun fichier dindex autre que le fichier MDX dexploitation ou listez les fichiers .NDX. Spcifiez ensuite un index dans la proprit IndexName pour quil trie effectivement lensemble de donnes. Lors de la conception, cliquez sur le bouton point de suspension dans la valeur de la proprit IndexFiles, dans linspecteur dobjets, pour invoquer lditeur de fichiers dindex. Pour ajouter un fichier dindex .MDX ou .NDX, cliquez sur le bouton Ajouter dans la bote de dialogue Fichiers dindex et slectionnez le fichier dans la bote de dialogue douverture. Rptez ce processus pour chaque fichier dindex .MDX ou .NDX. Cliquez sur le bouton OK dans la bote de dialogue Fichiers dindex aprs avoir ajout tous les index voulus. Cette mme opration peut tre excute par programmation lors de lexcution. Pour cela, accdez la proprit IndexFiles en utilisant les proprits et mthodes des listes de chanes. Quand vous ajoutez un nouvel ensemble dindex, appelez dabord la mthode Clear de la proprit IndexFiles de la table pour supprimer toute entre existante. Appelez la mthode Add pour ajouter chaque fichier dindex .MDX ou .NDX :
with Table2.IndexFiles do begin Clear; Add('Bystate.ndx'); Add('Byzip.ndx'); Add('Fullname.ndx'); Add('St_name.ndx'); end;

Utilisation du moteur de bases de donnes Borland

20-7

Architecture BDE

Aprs avoir ajout des fichiers dindex .MDX ou .NDX, les noms des index individuels du fichier dindex sont accessibles et modifiables par la proprit IndexName. Les repres dindex sont aussi lists en utilisant la mthode GetIndexNames et en inspectant les dfinitions dindex travers les objets TIndexDef dans la proprit IndexDefs. Les fichiers .NDX correctement lists sont automatiquement mis jour lorsque des donnes sont ajoutes, modifies ou supprimes dans la table (quun index donn soit ou non utilis dans la proprit IndexName). Dans lexemple ci-dessous, le fichier dindex ANIMALS.MDX est affect la proprit IndexFiles du composant table AnimalsTable, et le repre dindex NAME est affect sa proprit IndexName :
AnimalsTable.IndexFiles.Add('ANIMALS.MDX'); AnimalsTable.IndexName := 'NAME';

Une fois le fichier dindex spcifi, les index MDX ou NDX fonctionnent comme nimporte quel autre index. Spcifier un nom dindex trie les donnes de la table et rend lindex disponible pour les recherches, les portes et (pour les index MDX) les liaisons matre-dtail. Voir Utilisation densembles de donnes de type table la page 18-29 pour plus de dtail sur lutilisation dindex. En utilisant des index .NDX dBASE III PLUS avec les composants TTable, deux considrations particulires sont prendre en compte. La premire est que les fichiers .NDX ne peuvent pas tre utiliss comme base pour les liaisons matredtail. La seconde est que lors de lactivation dun index .NDX avec la proprit IndexName, vous devez inclure lextension .NDX dans le nom de lindex dans la valeur de la proprit :
with Table1 do begin IndexName := 'ByState.NDX'; FindKey(['CA']); end;

Renommer une table locale


Pour renommer une table Paradox ou dBASE au moment de la conception, faites un clic droit sur le composant table et slectionnez loption adquate dans le menu contextuel. Pour renommer une table Paradox ou dBASE lexcution, appelez la mthode RenameTable de la table. Par exemple, linstruction suivante renomme la table Customer en CustInfo :
Customer.RenameTable(CustInfo);

Importation des donnes dune autre table


Vous pouvez utiliser la mthode BatchMove pour importer les donnes dune autre table. BatchMove peut : Copier des enregistrements dune autre table dans la table en cours. Mettre jour les enregistrements de la table en cours qui apparaissent dans une autre table.

20-8

Guide du dveloppeur

Architecture BDE

Ajouter des enregistrements dune autre table la fin de la table en cours. Supprimer dans la table en cours les enregistrements qui apparaissent dans une autre table. BatchMove prend deux paramtres : le nom de la table depuis laquelle importer les donnes, et une spcification de mode qui dtermine quelle opration dimportation effectuer.Le tableau suivant indique les valeurs possibles pour la spcification de mode :
Tableau 20.3 Valeur
batAppend batAppendUpdate

Modes dimportation de BatchMove Signification


Ajoute tous les enregistrements de la table source la fin de la table en cours. Ajoute tous les enregistrements de la table source la fin de la table en cours et met jour les enregistrements existants dans cette table avec les enregistrements correspondants de la table source. Copie tous les enregistrements de la table source dans la table en cours. Supprime tous les enregistrements de la table en cours qui apparaissent aussi dans la table source. Met jour les enregistrements existants de la table en cours avec les enregistrements correspondants de la table source.

batCopy batDelete batUpdate

Par exemple, le code suivant met jour tous les enregistrements de la table en cours avec les enregistrements de la table Customer qui possdent les mmes valeurs pour les champs de lindex en cours :
Table1.BatchMove('CUSTOMER.DB', batUpdate);

BatchMove renvoie le nombre denregistrements imports avec succs.


Attention

Limportation denregistrements en utilisant le mode batCopy crase les enregistrements existants. Pour prserver ces derniers, utilisez plutt batAppend. BatchMove neffectue que certaines op rations groupes supportes par le BDE. Dautres fonctions sont disponibles par le composant TBatchMove. Si vous devez dplacer une grosse masse de donnes dans les tables, utilisez TBatchMove au lieu dappeler la mthode de table BatchMove. Pour plus dinformations sur lutilisation de TBatchMove, voir Utilisation de TBatchMove la page 20-55.

Utilisation de TQuery
TQuery reprsente une unique instruction en DDL (Data Definition Language) ou DML (Data Manipulation Language), par exemple une commande SELECT, INSERT, DELETE, UPDATE, CREATE INDEX ou ALTER TABLE. Le langage utilis dans les commandes est spcifique au serveur, mais se conforme gnralement au standard SQL-92. TQuery implmente toutes les fonctionnalits de base introduites par TDataSet, ainsi que toutes les spcificits des ensembles de donnes de type requte. Avant dtudier les caractristiques particulires de TQuery, familiarisez-vous avec les fonctions communes des bases de donnes

Utilisation du moteur de bases de donnes Borland

20-9

Architecture BDE

dcrites au chapitre 18, Prsentation des ensembles de donnes, y compris la section sur les ensembles de donnes de type requte qui commence page 18-49. Comme TQuery est un ensemble de donnes BDE, il doit habituellement tre associ avec une base de donnes et une session (lexception survient quand vous utilisez TQuery pour une requte htrogne). Consultez Association dun ensemble de donnes avec les connexions de bases de donnes et de session la page 20-3 pour savoir comment former de telles associations. Vous spcifiez linstruction SQL de la requte en dfinissant la proprit SQL. Un composantTQuery peut accder aux donnes dans : Les tables Paradox ou dBASE, en utilisant Local SQL, qui fait partie du BDE. Local SQL est un sous-ensemble de la spcification SQL-92. La plus grande partie de DML et suffisamment de syntaxe DDL sont supports pour travailler avec ces types de tables. Consultez laide locale SQL, LOCALSQL.HLP, pour plus de dtails sur la syntaxe SQL supporte. Les bases de donnes locales InterBase Server, laide du moteur InterBase. Pour plus dinformations sur le support de syntaxe SQL-92 dInterBase et sur le support de syntaxe tendue, voir la rfrence au langage InterBase. Les bases de donnes sur serveurs distants, comme Oracle, Sybase, MS-SQL Server, Informix, DB2, et InterBase. Vous devez installer le pilote SQL Link et un logiciel client sp cifique(fourni par le vendeur) pour accder au serveur de base de donnes. Toute syntaxe SQL supporte par ces serveurs est admise. Pour plus dinformations sur la syntaxe, les limitations et les extensions SQL, voir la documentation de votre serveur.

Cration de requtes htrognes


TQuery supporte les requtes htrognes sur plusieurs types de serveur ou de table (par exemple, des donnes dune table Oracle et dune table Paradox). Quand vous excutez une requte htrogne, le BDE analyse et traite la requte en utilisant Local SQL. Pour cette raison, la syntaxe SQL spcifique au serveur et tendue nest pas supporte. Pour effectuer une requte htrogne, suivez les tapes ci-dessous :

1 Dfinissez des alias BDE distincts pour chaque base de donnes concerne dans la requte, en utilisant loutil dadministration BDE ou lexplorateur SQL. 2 Laissez vide la proprit DatabaseName de TQuery ; les noms des bases de donnes seront spcifis dans linstruction SQL. 3 Dans la proprit SQL, spcifiez linstruction SQL excuter. Faites-y prcder le nom de chaque table par lalias BDE de la base de donnes de cette table, encadr par des caractres deux-points. La rfrence entire est elle-mme encadre de guillemets. 4 Dfinissez les paramtres de la requte dans la proprit Params. 5 Appelez Prepare pour prparer la requte avant sa premire excution. 6 Appelez Open ou ExecSQL selon le type de requte que vous excutez.

20-10

Guide du dveloppeur

Architecture BDE

Par exemple, vous dfinissez un alias nomm Oracle1 pour une base de donnes Oracle comprenant une table CUSTOMER, et un alias nomm Sybase1 pour une base de donnes Sybase comprenant une table ORDERS. Une requ te simple sur ces deux tables pourrait scrire :
SELECT Customer.CustNo, Orders.OrderNo FROM :Oracle1:CUSTOMER JOIN :Sybase1:ORDERS ON (Customer.CustNo = Orders.CustNo) WHERE (Customer.CustNo = 1503)

Dans une requte htrogne, au lieu de spcifier la base de donnes laide dun alias, vous pouvez utiliser un composant TDatabase. Configurez TDatabase afin quil pointe sur la base de donnes, affectez la proprit TDatabase.DatabaseName une valeur arbitraire mais unique, et utilisez ensuite cette valeur dans linstruction SQL au lieu dun nom dalias BDE.

Obtention dun ensemble de rsultats modifiable


Pour obtenir un ensemble de rsultats que lutilisateur puisse diter dans des contrles orients donnes, dfinissez la proprit RequestLive dun composant requte True. Dfinir RequestLive True ne garantit pas un ensemble de rsultats dynamique, mais le BDE essaie dhonorer la requte chaque fois que possible. Il existe quelques restrictions sur les requtes densemble de rsultats dynamiques, selon que la requte utilise lanalyseur SQL local ou lanalyseur SQL dun serveur. Les requtes dans lesquelles les noms des tables sont prcds dun alias de base de donnes BDE (comme les requtes htrognes) et les requtes excutes sur Paradox ou dBASE sont analyses par le BDE en utilisant le SQL local. Quand une requte utilise lanalyseur SQL local, le BDE offre une gestion tendue des ensembles de rsultats dynamiques et modifiables, aussi bien dans les requ tes monotables que multitables. Lors de lutilisation du SQL local, un ensemble de rsultats dynamique dune requte sur une vue ou une table unique est renvoy si la requ te ne contient aucun des lments suivants : DISTINCT dans la clause SELECT Jointures (interne, externe ou UNION) Fonctions dagrgat avec ou sans clauses GROUP BY ou HAVING Vues ou tables de base qui ne peuvent pas tre mises jour Sous-requ tes Clauses ORDER BY non bases sur un index

Les requtes sur un serveur de base de donnes distant sont analyses par le serveur. Si la proprit RequestLive a pour valeur True, linstruction SQL doit rester dans les standards Local SQL et se conformer de plus toute restriction impose par le serveur, car le BDE en a besoin pour communiquer les modifications de donnes la table. Un ensemble de rsultats dynamique dune requte sur une vue ou une table unique est renvoy si la requte ne contient aucun des lments suivants : Clause DISTINCT dans linstruction SELECT

Utilisation du moteur de bases de donnes Borland

20-11

Architecture BDE

Fonctions dagrgat avec ou sans clauses GROUP BY ou HAVING Rfrences plusieurs tables de base ou vues modifiables (jointures) Sous-requ tes qui rfrencent la table dans la clause FROM ou dautres tables Si une application demande et reoit un ensemble de rsultats dynamique, la proprit CanModify du composant requte est dfinie True. Mme si la requ te renvoie un ensemble de rsultats dynamique, il nest pas s r que vous puissiez mettre jour lensemble de rsultats directement sil contient des champs lis ou si vous changez dindex avant de tenter une mise jour. Si ces conditions se prsentent, vous devez considrer lensemble de rsultats comme tant en lecture seule, et le mettre jour en consquence. Si une application demande un ensemble de rsultats dynamique, mais que la syntaxe de linstruction SELECT ne le permette pas, le BDE retourne : Soit un ensemble de rsultats en lecture seule pour les requtes effectues sur Paradox ou dBASE. Soit un code derreur pour les requtes SQL effectues sur un serveur distant.

Mise jour des ensembles de rsultats en lecture seule


Les applications peuvent mettre jour les donnes renvoyes dans un ensemble de rsultats en lecture si elles utilisent les mises jour en mmoire cache. Si vous utilisez un ensemble de donnes client pour mettre en mmoire cache les mises jour, celui-ci ou son fournisseur associ peut gnrer automatiquement le code SQL pour appliquer les mises jour, moins que la requte ne reprsente des tables multiples. Dans ce dernier cas, vous devez indiquer comment appliquer les mises jour : Si toutes les mises jour sont appliques une table de base de donnes unique, vous pouvez indiquer la table sous-jacente mettre jour dans un gestionnaire dvnement OnGetTableName. Si vous avez besoin de davantage de contrle sur lapplication des mises jour, vous pouvez associer la requte avec un objet de mise jour (TUpdateSQL). Un fournisseur utilise automatiquement cet objet de mise jour pour appliquer les mises jour :

1 Associez lobjet de mise jour la requte en dfinissant la proprit UpdateObject de la requ te lobjet TUpdateSQL que vous utilisez. 2 Affectez aux proprits ModifySQL, InsertSQL et DeleteSQL de lobjet de mise jour les instructions SQL qui effectuent les mises jour appropries aux donnes de votre requte.
Si vous utilisez le BDE pour mettre en mmoire cache les mises jour, vous devez utiliser un objet de mise jour.
Remarque

Pour plus dinformations sur les objets de mise jour, voir Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45.

20-12

Guide du dveloppeur

Architecture BDE

Utilisation de TStoredProc
TStoredProc reprsente une procdure stocke. Elle implmente toutes les fonctionnalits introduites par TDataSet, ainsi que la plupart des fonctionnalits spciales typiques des ensembles de donnes de type procdure stocke. Avant dtudier les caractristiques particulires de TStoredProc, familiarisez-vous avec les fonctions communes des bases de donnes dcrites au chapitre 18, Prsentation des ensembles de donnes, y compris la section sur les ensembles de donnes de type procdure stocke qui commence en page 18-58. Puisque TStoredProc est un ensemble de donnes BDE, il doit tre associ une base de donnes et une session. Voir Association dun ensemble de donnes avec les connexions de bases de donnes et de session la page 20-3 pour savoir comment former de telles associations. Une fois lensemble de donnes associ une base de donnes et une session, vous pouvez le lier une procdure stocke particulire en dfinissant la proprit StoredProcName. TStoredProc diffre des autres ensembles de donnes de type procdure stocke par les points suivants : Il vous donne un plus grand contrle sur la faon de lier les paramtres . Il fournit la gestion des procdures stockes surcharges Oracle.

Liaison des paramtres


Quand vous prparez et excutez une procdure stocke, ses paramtres dentre sont automatiquement lis aux paramtres sur le serveur. TStoredProc vous permet dutiliser la proprit ParamBindMode pour spcifier comment les paramtres doivent tre lis ceux du serveur. Par dfaut, ParamBindMode est dfini pbByName, ce qui signifie que les paramtres du composant procdure stocke correspondent ceux du serveur par leur nom. Cest la mthode la plus simple pour lier les paramtres. Certains serveurs supportent aussi la liaison des paramtres par valeur ordinale, cest--dire lordre dans lequel ils apparaissent dans la procdure stocke. Dans ce cas, lordre dans lequel vous spcifiez les paramtres dans lditeur de collection de paramtres est important. Le premier paramtre spcifi correspond au premier paramtre dentre sur le serveur, et ainsi de suite. Si votre serveur supporte ce type de liaison de paramtre, dfinissez ParamBindMode pbByNumber.
Astuce

Si vous voulez dfinir ParamBindMode pbByNumber, vous devez spcifier des paramtres de type correct dans lordre correct. Vous pouvez consulter le code source dune procdure stocke dun serveur dans lexplorateur SQL pour dterminer lordre correct et le type des paramtres indiquer.

Manipulation des procdures stockes redfinies dOracle


Les serveurs Oracle permettent la redfinition de procdures stockes ; les procdures redfinies sont des procdures diffrentes avec le mme nom. La proprit Overload du composant procdure stocke permet lapplication de spcifier la procdure excuter.

Utilisation du moteur de bases de donnes Borland

20-13

Architecture BDE

Si Overload a pour valeur zro (valeur par dfaut), il ny a pas de redfinition. Si Overload a pour valeur 1, le composant procdure stocke excute la premire procdure stocke quil trouve sur le serveur Oracle ayant le nom redfini ; si Overload a pour valeur 2, il excute la seconde, et ainsi de suite.
Remarque

Les procdures stockes redfinies peuvent prendre des paramtres dentre et de sortie diffrents. Voir la documentation de votre serveur Oracle pour plus dinformations.

Connexion aux bases de donnes avec TDatabase


Quand une application Delphi utilise le moteur de bases de donnes Borland (BDE) pour se connecter une base de donnes, cette connexion est encapsule par un composant TDatabase. Un composant base de donnes reprsente la connexion une base de donnes unique dans le contexte dune session BDE. TDatabase effectue la plupart des mmes tches que les autres composants de connexion de base de donnes et partage avec eux de nombreuses proprits mthodes et vnements communs. Ces fonctionnalits sont dcrites dans le chapitre 17, Connexion aux bases de donnes. En plus des proprits, mthodes et vnements communs, TDatabase introduit de nombreuses fonctionnalits spcifiques au BDE, dcrites dans les rubriques suivantes .

Association dun composant base de donnes une session


Tous les composants base de donnes doivent tre associs une session BDE. Utilisez SessionName pour tablir cette association. Quand vous crez un composant base de donnes au moment de la conception, la proprit SessionName est dfinie Default, ce qui signifie quil est associ au composant de session par dfaut rfrenc par la variable globale Session. Les applications BDE multithreads ou rentrantes peuvent ncessiter plusieurs sessions. Si vous devez utiliser des sessions multiples, ajoutez des composants TSession pour chaque session. Associez alors votre ensemble de donnes un composant session en affectant la proprit SessionName la valeur de la proprit SessionName du composant session. Durant lexcution, vous pouvez accder au composant session avec lequel la base de donnes est associe en lisant la proprit Session. Si SessionName est vide ou a pour valeur Default, la proprit Session rfrence linstance TSession rfrence par la variable globale Session. Session permet aux applications daccder aux proprits, mthodes et vnements dun composant session parent dun composant de base de donnes sans connatre le nom rel de la session. Pour plus dinformations sur les sessions BDE, voir Gestion des sessions de bases de donnes la page 20-18.

20-14

Guide du dveloppeur

Architecture BDE

Si vous utilisez un composant base de donnes implicite, la session de ce composant base de donnes est celle spcifie par la proprit SessionName de lensemble de donnes.

Interactions entre les composants base de donnes et session


En gnral, les proprits de composants session fournissent des comportements globaux par dfaut qui sappliquent tous les composants base de donnes crs lexcution. Par exemple, la proprit KeepConnections de la session de contrle dtermine si une connexion de base de donnes est maintenue mme si ses ensembles de donnes associs sont ferms (cas par dfaut), ou si la connexion est interrompue quand tous ses ensembles de donnes sont ferms. De mme, lvnement par dfaut OnPassword dune session garantit que lapplication affiche la bote de dialogue standard de saisie de mot de passe si elle tente de sattacher une base de donnes sur un serveur ncessitant un mot de passe. Les mthodes de session sappliquent un peu diffremment. Les mthodes TSession affectent tous les composants base de donnes, quils soient crs explicitement ou instancis implicitement par un ensemble de donnes. Par exemple, la mthode de session DropConnections ferme tous les ensembles de donnes appartenant aux composants base de donnes dune session, puis interrompt toutes les connexions de bases de donnes, mme si la proprit KeepConnection de composants base de donnes individuels a pour valeur True. Les mthodes de composants de bases de donnes ne sappliquent quaux ensembles de donnes associs un composant base de donnes donn. Par exemple, supposons que le composant Database1 est associ la session par dfaut. Database1.CloseDataSets() ne ferme que les ensembles de donnes associs Database1. Les ensembles de donnes ouverts appartenant dautres composants de bases de donnes dans la session par dfaut restent ouverts.

Identification de la base de donnes


AliasName et DriverName sont des proprits mutuellement exclusives qui identifient le serveur de base de donnes auquel le composant TDatabase est connect. AliasName spcifie le nom dun alias BDE existant utiliser pour le composant de base de donnes. Lalias apparat ensuite dans les listes droulantes pour les composants ensemble de donnes, afin que vous puissiez les lier un composant base de donnes particulier. Si vous spcifiez AliasName pour un composant base de donnes, toute valeur dj affecte DriverName est efface, parce quun nom de pilote fait toujours partie dun alias BDE. Vous crer et ditez les alias BDE en utilisant lexplorateur de bases de donnes ou lutilitaire dadministration BDE. Pour plus dinformations sur la cration et la maintenance des alias BDE, voir la documentation en ligne de ces utilitaires. DriverNameest le nom dun pilote BDE. Un nom de pilote est un paramtre dun alias BDE, mais vous pouvez spcifier un nom de pilote au lieu dun alias quand vous crez un alias BDE local pour un composant base de donnes en utilisant la proprit DatabaseName. Si vous spcifiez DriverName,

Utilisation du moteur de bases de donnes Borland

20-15

Architecture BDE

toute valeur dj affecte AliasName est efface pour viter tout conflit potentiel entre le nom du pilote que vous spcifiez et le nom du pilote faisant partie de lalias BDE identifi par AliasName. DatabaseName vous permet de fournir votre propre nom pour une connexion de base de donnes. Ce nom sajoute alors AliasName ou DriverName, et est local votre application. DatabaseName peut tre un alias BDE ou, pour les fichiers Paradox et dBASE, un chemin daccs qualifi. Comme AliasName, DatabaseName apparat ensuite dans les listes droulantes pour les composants ensemble de donnes afin de vous permettre de les lier aux composants base de donnes. Au moment de la conception, pour spcifier un alias BDE, affecter un pilote BDE ou crer un alias BDE local, double-cliquez sur un composant base de donnes pour appeler lditeur de proprits de bases de donnes. Vous pouvez entrer un DatabaseName dans la zone de saisie Nom de lditeur de proprits. Vous pouvez entrer un nom dalias BDE existant dans la bote options Nom dalias pour la proprit Alias, ou choisir un alias existant dans la liste droulante. La bote options Nom de pilote vous permet de saisir le nom dun pilote BDE existant pour la proprit DriverName, mais vous pouvez aussi en choisir un dans la liste droulante des pilotes existants.
Remarque

Lditeur de proprits de bases de donnes vous permet aussi de visualiser et de dfinir les paramtres de connexion BDE, et de dfinir ltat des proprits LoginPrompt et KeepConnection. Pour plus dinformations sur les paramtres de connexion, voir Dfinition des paramtres dalias BDE ci-dessous. Pour plus dinformations sur LoginPrompt, voir Contrle de la connexion au serveur la page 17-4. Pour plus dinformations sur KeepConnection, voir Ouverture dune connexion avec TDatabase la page 20-17.

Dfinition des paramtres dalias BDE


Au moment de la conception, vous pouvez crer ou diter les paramtres de connexion de trois manires : Utilisez lexplorateur de bases de donnes ou lutilitaire dadministration BDE pour crer ou modifier des alias BDE, y compris les paramtres. Pour plus dinformations sur ces utilitaires, voir les fichiers daide en ligne. Double-cliquez sur la proprit Params dans linspecteur dobjets pour appeler diteur de liste de chanes . Double-cliquez sur un composant base de donnes dans un module de donnes ou une fiche pour appeler lditeur de proprits de bases de donnes. Ces trois mthodes ditent la proprit Params du composant base de donnes. Params est une liste de chanes contentant les paramtres de connexion de base de donnes pour lalias BDE associ un composant base de donnes. Certains paramtres de connexion typiques comprennent le chemin daccs, le nom du serveur, la taille de cache du schma, le pilote de langage et le mode de requ te SQL.

20-16

Guide du dveloppeur

Architecture BDE

Quand vous appelez lditeur de proprits de bases de donnes pour la premire fois, les paramtres de lalias BDE ne sont pas visibles. Pour afficher les paramtres en cours, cliquez sur Dfaut. Les paramtres en cours saffichent dans la zone mmo Paramtres de connexion. Vous pouvez diter les entres existantes ou en ajouter de nouvelles. Pour effacer les paramtres existants, cliquez sur Effacer. Les modifications ne prennent effet que lorsque vous cliquez sur OK. A lexcution, lapplication ne peut dfinir les paramtres dalias quen modifiant directement la proprit Params. Pour plus dinformations sur les paramtres spcifiques lutilisation de pilotes SQL Links avec le BDE, voir le fichier daide en ligne SQL Links.

Ouverture dune connexion avec TDatabase


Comme avec tous les composants de connexion de base de donnes, pour vous connecter une base de donnes laide de TDatabase, dfinissez la proprit Connected True ou appelez la mthode Open. Ce processus est dcrit dans Connexion un serveur de bases de donnes la page 17-3. Une fois la connexion de base de donnes tablie, elle est maintenue aussi longtemps qu il reste au moins un ensemble de donnes actif. Quand il nen reste plus, la connexion est interrompue, moins que la proprit KeepConnection du composant base de donnes soit True. Quand vous vous connectez partir dune application sur un serveur de base de donnes distant, lapplication utilise le BDE et le pilote SQL Links Borland pour tablir la connexion. Le BDE peut aussi communiquer avec un pilote ODBC fourni par vos soins. Vous devrez configurer le pilote ODBC ou SQL Links pour votre application avant deffectuer la connexion. Les paramtres ODBC et SQL Links sont stocks dans la proprit Params dun composant base de donnes. Pour plus dinformations sur les paramtres SQL Links, voir le guide de lutilisateur en ligne SQL Links. Pour modifier la proprit Params, voir D finition des paramtres dalias BDE la page 20-16.

Manipulation des protocoles rseau


Durant la configuration du pilote ODBC ou SQL Links appropri, il peut tre ncessaire de spcifier le protocole rseau utilis par le serveur, tel que SPX/IPX ou TCP/IP, en fonction des options de configuration du pilote. Dans la plupart des cas, la configuration du protocole rseau est prise en charge par un logiciel de configuration client du serveur. Pour ODBC, il peut galement tre ncessaire de vrifier la configuration du pilote avec le gestionnaire de pilote ODBC. Ltablissement dune connexion initiale entre client et serveur peut savrer problmatique. La liste de dpannage suivante pourra vous aider si vous rencontrez des difficults : La connexion ct client du serveur est-elle correctement configure ? Toutes les DLL pour la connexion et les pilotes de bases de donnes sont-elles dans le chemin de recherche ?

Utilisation du moteur de bases de donnes Borland

20-17

Architecture BDE

Si vous utilisez TCP/IP : Le logiciel de communication TCP/IP est-il install ? La bonne WINSOCK.DLL est-elle installe ? Ladresse IP du serveur est-elle recense dans le fichier HOSTS du client ? DNS (Domain Name Services) est-il correctement configur ? Pouvez-vous effectuer un ping du serveur ? Pour dautres conseils de dpannage, voir le guide de lutilisateur SQL Links en ligne et la documentation de votre serveur.

Utilisation dODBC
Une application peut utiliser les sources de donnes ODBC (par exemple, Btrieve). Une connexion par pilote ODBC requiert : Un pilote ODBC fourni par le vendeur. Microsoft ODBC Driver Manager. Lutilitaire dadministration BDE. Pour configurer un alias BDE pour une connexion par pilote ODBC, utilisez lutilitaire dadministration BDE. Pour plus dinformations, voir le fichier daide en ligne de lutilitaire dadministration BDE.

Utilisation des composants base de donnes dans les modules de donnes


Vous pouvez placer sans risque des composants base de donnes dans des modules de donnes. Cependant, si vous mettez un module de donnes contenant un composant base de donnes dans le rfrentiel dobjets, et si vous voulez que dautres utilisateurs puissent en hriter, vous devez dfinir la proprit HandleShared du composant base de donnes True pour viter tout conflit de domaine dappellation global.

Gestion des sessions de bases de donnes


Les requtes, curseurs, pilotes et connexions de bases de donnes dune application BDE sont maintenues dans le contexte dune ou plusieurs sessions BDE. Les sessions isolent un ensemble doprations daccs une base de donnes, comme les connexions de bases de donnes, sans quil soit ncessaire de lancer une autre instance de lapplication. Toutes les applications BDE comprennent automatiquement un composant session par dfaut, nomm Session, qui encapsule la session BDE par dfaut. Quand les composants base de donnes sont ajouts lapplication, ils sont automatiquement associs la session par dfaut (notez que son SessionName est Default). La session par dfaut fournit un contrle global sur tous les composants base de donnes non associs une autre session, quils soient implicites (crs par la session lexcution quand vous ouvrez un ensemble de donnes non associ un composant base de donnes que vous avez cr) ou persistant (cr explicitement par votre application). La session par dfaut nest

20-18

Guide du dveloppeur

Architecture BDE

pas visible dans votre module de donnes ou votre fiche au moment de la conception, mais vous pouvez accder par code ses proprits et ses mthodes lors de lexcution. Pour utiliser la session par dfaut, vous navez pas crire de code, moins que votre application doive : Explicitement activer ou dsactiver une session, en activant ou dsactivant la capacit douverture de base de donnes de la session. Modifier les proprits de la session, par exemple spcifier les proprits par dfaut pour les composants base de donnes gnrs implicitement. Excuter les mthodes dune session, comme g rer les connexions aux bases de donnes (par exemple ouvrir et fermer des connexions de bases de donnes en rponse aux actions de lutilisateur). Rpondre aux vnements de session, comme quand lapplication essaie daccder une table Paradox ou dBASE protge par mot de passe. Dfinir des rpertoires Paradox comme avec la proprit NetFileDir pour accder aux tables Paradox sur un rseau et avec la proprit PrivateDir sur un disque dur local pour acclrer les performances. Grer les alias BDE qui dcrivent les configurations de connexion possibles pour les bases de donnes et les ensembles de donnes qui utilisent la session. Que vous ajoutiez les composants base de donnes une application au moment de la conception ou que vous les criez dynamiquement lexcution, ils sont automatiquement associs la session par dfaut, moins que vous ne les affectiez spcifiquement une session diffrente. Si vous ouvrez un ensemble de donnes non associ un composant base de donnes, Delphi va automatiquement : Crer un composant base de donnes pour cet ensemble de donnes lexcution. Associer le composant base de donnes la session par dfaut. Initialiser certaines proprits-cls du composant base de donnes, bases sur celles de la session par dfaut. Parmi les plus importantes de ces proprits se trouve KeepConnections, qui dtermine quand les connexions de bases de donnes sont maintenues ou interrompues par lapplication. La session par dfaut procure un large ensemble de valeurs par dfaut pouvant tre utilises par la plupart des applications. Il nest ncessaire dassocier un composant base de donnes une session explicitement nomme que si le composant excute une requte simultane sur une base de donnes dj ouverte par la session par dfaut. Dans ce cas, chaque requte concurrente doit fonctionner dans sa propre session. Les applications de bases de donnes multithreads requirent aussi des sessions multiples, dans lesquelles chaque thread possde sa propre session. Les applications peuvent crer des composants session supplmentaires selon leurs besoins. Les applications de bases de donnes BDE comprennent automatiquement un composant liste de session, nomm Sessions, que vous

Utilisation du moteur de bases de donnes Borland

20-19

Architecture BDE

pouvez utiliser pour grer tous vos composants session. Pour plus dinformations sur la gestion de sessions multiples, voir Gestion de sessions multiples la page 20-32. Vous pouvez placer sans risque des composants session dans des modules de donnes. Cependant, si vous mettez un module de donnes contenant un ou plusieurs composants session dans le rfrentiel dobjets, assurez-vous que la proprit AutoSessionName a pour valeur True pour viter tout conflit despace dappellation quand les utilisateurs en hritent.

Activation dune session


Active est une proprit boolenne qui dtermine si les composants base de donnes et ensemble de donnes associs une session sont ouverts. Vous pouvez utiliser cette proprit pour lire ltat en cours des connexions de bases de donnes et densemble de donnes dune session, ou changer cet tat. Si Active a pour valeur False (valeur par dfaut), toutes les bases de donnes et ensembles de donnes associs la session sont ferms. Si Active a pour valeur True, les bases de donnes et ensembles de donnes sont ouverts. Une session est active ds quelle est cre, puis chaque fois que sa proprit Active est change de False True (par exemple, quand une base de donnes ou un ensemble de donnes associ une session est ouverte alors quil ny a aucun autre ensemble de donnes ou base de donnes ouvert). Mettre Active True dclenche lvnement de session OnStartup, recense les rpertoires Paradox avec le BDE, et recense la proprit ConfigMode, qui dtermine quels alias BDE sont disponibles dans cette session. Vous pouvez crire un gestionnaire dvnement OnStartup pour initialiser les proprits NetFileDir, PrivateDir et ConfigMode avant quelles ne soient recenses avec le BDE, ou pour effectuer dautres activits spcifiques de dmarrage de session. Pour plus dinformations sur les proprits NetFileDir et PrivateDir, voir Spcification des rpertoires Paradox la page 20-27. Pour plus dinformations sur ConfigMode, voir Manipulation des alias BDE la page 20-28. Une fois la session active, vous pouvez ouvrir ses connexions de bases de donnes en appelant la mthode OpenDatabase. Pour les composants session placs dans un module de donnes ou une fiche, mettre Active False quand il existe des bases de donnes ou des ensembles de donnes ouverts ferme ceux-ci. A lexcution, fermer des bases de donnes ou des ensembles de donnes peut dclencher les vnements associs.
Remarque

Il est impossible de mettre Active False pour la session par dfaut au moment de la conception. Bien quil soit possible de fermer la session par dfaut lexcution, ce nest pas recommand. Vous pouvez aussi utiliser les mthodes Open et Close dune session pour activer ou dsactiver les sessions autres que la session par dfaut lexcution. Par exemple, la simple ligne de code suivante ferme toutes les bases de donnes et ensembles de donnes ouverts pour une session :
Session1.Close;

20-20

Guide du dveloppeur

Architecture BDE

Ce code met la proprit Active de Session1 False. Quand la proprit Active dune session a pour valeur False, tout essai par lapplication douvrir une base de donnes ou un ensemble de donnes remet Active True et appelle le gestionnaire dvnement OnStartup de la session, sil existe. Vous pouvez aussi coder explicitement la ractivation de la session lexcution. Le code suivant ractive Session1 :
Session1.Open; Remarque

Si une session est active, vous pouvez aussi ouvrir et fermer des connexions individuelles de bases de donnes. Pour plus dinformations, voir Fermeture des connexions de bases de donnes la page 20-22.

Spcification du comportement de la connexion de base de donnes par dfaut


KeepConnections fournit la valeur par dfaut de la proprit KeepConnection des composants base de donnes implicites crs lexcution. KeepConnection spcifie ce quil advient dune connexion une base de donnes tablie pour un composant base de donnes quand tous ses ensembles de donnes sont ferms. Si elle a pour valeur True (valeur par dfaut), une connexion de base de donnes constante, ou persistante, est maintenue mme si aucun ensemble de donnes nest actif. Si elle a pour valeur False, une connexion de base de donnes est interrompue ds que tous ses ensembles de donnes sont ferms.
Remarque

La persistance de la connexion pour un composant base de donnes plac explicitement dans un module de donnes ou une fiche est contrle par la proprit KeepConnection de ce composant base de donnes. Si elle est dfinie diffremment, la proprit KeepConnection dun composant base de donnes prend toujours le pas sur la proprit KeepConnections de la session. Pour plus dinformations sur le contrle des connexions individuelles de bases de donnes au sein dune session, voir Gestion des connexions de bases de donnes la page 20-22. KeepConnections doit tre True pour les applications qui ouvrent et ferment souvent tous les ensembles de donnes associs une base de donnes sur un serveur distant. Ce rglage rduit le trafic du rseau et acclre laccs aux donnes, parce quil signifie quune connexion ne doit tre ouverte et ferme quune seule fois durant la vie de la session. Sinon, chaque fois que lapplication ferme ou rtablit une connexion, cela implique la surcharge dattacher et de dtacher la base de donnes.

Remarque

Mme avec KeepConnections True pour une session, vous pouvez fermer et librer les connexions de bases de donnes inactives pour tous les composants base de donnes implicites en appelant la mthode DropConnections. Pour plus dinformations sur DropConnections, voir Interruption des connexions de bases de donnes inactives la page 20-23.

Utilisation du moteur de bases de donnes Borland

20-21

Architecture BDE

Gestion des connexions de bases de donnes


Vous pouvez utiliser un composant session pour grer les connexions de bases de donnes en son sein. Le composant session inclut des proprits et des mthodes pour : Ouvrir des connexions de bases de donnes. Fermer des connexions de bases de donnes. Fermer et librer toutes les connexions de bases de donnes temporaires et inactives. Localiser des connexions de bases de donnes spcifiques. Parcourir toutes les connexions de bases de donnes ouvertes.

Ouverture de connexions de bases de donnes


Pour ouvrir une connexion de base de donnes au sein dune session, appelez la mthode OpenDatabase. OpenDatabase prend un paramtre, le nom de la base de donnes ouvrir. Ce nom est un alias BDE ou le nom dun composant base de donnes. Pour Paradox ou dBASE, le nom peut aussi tre un chemin daccs qualifi. Par exemple, linstruction suivante utilise la session par dfaut et essaie douvrir une connexion de base de donnes pour la base de donnes pointe par lalias DBDEMOS :
var DBDemosDatabase: TDatabase; begin DBDemosDatabase := Session.OpenDatabase('DBDEMOS'); ...

OpenDatabase active la session si elle ne lest pas dj, puis vrifie si le nom de base de donnes spcifi concorde avec la proprit DatabaseName de lun des composants base de donnes de la session. Si le nom ne correspond aucun composant base de donnes existant, OpenDatabase cre un composant base de donnes temporaire en utilisant le nom spcifi. Finalement, OpenDatabase appelle la mthode Open du composant base de donnes pour se connecter au serveur. Chaque appel OpenDatabase incrmente dune unit un compteur de rfrence pour la base de donnes. Tant que ce compteur reste suprieur 0, la base de donnes est ouverte.

Fermeture des connexions de bases de donnes


Pour fermer une connexion de base de donnes individuelle, appelez la mthode CloseDatabase. Quand vous appelez CloseDatabase, le compteur de rfrence de la base de donnes, incrment lors de lappel de OpenDatabase, est dcrment dune unit. Quand le compteur de rfrence dune base de donnes arrive 0, la base de donnes est ferme. CloseDatabase prend un paramtre, la base de donnes fermer. Si vous avez ouvert la base de donnes avec la mthode OpenDatabase, ce paramtre peut tre dfini sur la valeur renvoye par celle-ci.
Session.CloseDatabase(DBDemosDatabase);

Si le nom de base de donnes spcifi est associ un composant base de donnes temporaire (implicite), et si la proprit KeepConnections de la session a

20-22

Guide du dveloppeur

Architecture BDE

pour valeur False, le composant base de donnes est libr, fermant effectivement la connexion.
Remarque

Si KeepConnections a pour valeur False, les composants base de donnes temporaires sont ferms et librs automatiquement quand le dernier ensemble de donnes associ au composant base de donnes est ferm. Une application peut toujours appeler CloseDatabase avant ce moment pour forcer la fermeture. Pour librer les composants base de donnes temporaires quand KeepConnections a pour valeur True, appelez la mthode Close du composant base de donnes, puis la mthode DropConnections de la session. Lappel de CloseDatabase pour un composant base de donnes persistant ne ferme pas rellement la connexion. Pour cela, appelez directement la mthode Close du composant base de donnes. Il existe deux faons de fermer toutes les connexions de bases de donnes au sein de la session : Mettre la proprit Active de la session False. Appeler la mthode Close pour la session. Quand vous mettez Active False, Delphi appelle automatiquement la mthode Close. Close dconnecte toutes les bases de donnes actives en librant les composants base de donnes temporaires et en appelant la mthode Close de chaque composant base de donnes persistant. Finalement, Close met le handle BDE de la session nil.

Remarque

Interruption des connexions de bases de donnes inactives


Si la proprit KeepConnections dune session a pour valeur True (valeur par dfaut), les connexions de bases de donnes pour les composants temporaires base de donnes sont maintenues mme si tous les ensembles de donnes utiliss par le composant sont ferms. Vous pouvez liminer ces connexions et librer tous les composants base de donnes temporaires inactifs pour une session en appelant la mthode DropConnections. Par exemple, les lignes suivantes librent tous les composants base de donnes temporaires inactifs pour la session par dfaut :
Session.DropConnections;

Les composants base de donnes temporaires pour lesquels un ou plusieurs ensembles de donnes sont actifs ne sont ni supprims ni librs par cet appel. Pour librer ces composants, appelez Close.

Recherche dune connexion de base de donnes


Utilisez la mthode FindDatabase dune session pour dterminer si un composant base de donnes spcifique est dj associ une session. FindDatabase prend un paramtre, le nom de la base de donnes rechercher. Ce nom est un alias BDE ou le nom dun composant base de donnes. Pour Paradox ou dBASE, il peut aussi tre un chemin daccs qualifi. FindDatabase renvoie le composant base de donnes sil trouve une concordance. Sinon, il renvoie nil.

Utilisation du moteur de bases de donnes Borland

20-23

Architecture BDE

Le code suivant recherche dans la session par dfaut un composant base de donnes en utilisant lalias DBDEMOS, et, sil nen trouve pas, le cre et louvre :
var DB: TDatabase; begin DB := Session.FindDatabase('DBDEMOS'); if (DB = nil) then { La base de donnes nexiste pas} DB := Session.OpenDatabase('DBDEMOS'); { la crer et louvrir} if Assigned(DB) and DB.Connected then begin DB.StartTransaction; ... end; end;

Parcourir les composants base de donnes dune session


Vous pouvez utiliser deux proprits de composant de session, Databases et DatabaseCount, pour parcourir tous les composants base de donnes actifs associs une session. Databases est un tableau de tous les composants base de donnes actifs et associs une session. DatabaseCount est le nombre de bases de donnes de ce tableau. A mesure que les connexions sont ouvertes et fermes durant la vie dune session, les valeurs de Databases et DatabaseCount changent. Par exemple, si la proprit KeepConnections dune session a pour valeur False et si tous les composants base de donnes sont crs selon les besoins lexcution, chaque fois quune base de donnes est ouverte, DatabaseCount est incrmente dune unit. Chaque fois quune base de donnes est ferme, DatabaseCount est dcrmente dune unit. Si DatabaseCount a pour valeur zro, il ny a actuellement plus de composant base de donnes actif pour la session. Le code suivant dfinit la proprit KeepConnection de chaque base de donnes active dans la session par dfaut True :
var MaxDbCount: Integer; begin with Session do if (DatabaseCount > 0) then for MaxDbCount := 0 to (DatabaseCount - 1) do Databases[MaxDbCount].KeepConnection := True; end;

Manipulation des tables Paradox et dBASE protges par mot de passe


Un composant session peut stocker des mots de passe pour les tables Paradox et dBASE protges par mot de passe. Une fois un mot de passe ajout la session, votre application peut ouvrir les tables protges par ce mot passe. Si vous retirez le mot de passe de la session, lapplication ne pourra plus ouvrir les tables qui lutilisent tant que vous ne lajoutez pas de nouveau la session.

20-24

Guide du dveloppeur

Architecture BDE

Utilisation de la mthode AddPassword


La mthode AddPassword offre une alternative pour quune application puisse fournir un mot de passe pour une session avant douvrir une table Paradox ou dBase crypte qui requiert un mot de passe pour son accs. Si vous najoutez pas le mot de passe la session, quand lapplication tente douvrir une table protge par mot de passe, une bote de dialogue demande le mot de passe lutilisateur. AddPassword prend un paramtre, une chane contenant le mot de passe utiliser. Vous pouvez appeler AddPassword autant de fois que ncessaire pour ajouter des mots de passe (un la fois) pour accder des tables protges par des mots de passe diffrents.
var Passwrd: String; begin Passwrd := InputBox('Entrez le mot de passe', 'Mot de passe:', ''); Session.AddPassword(Passwrd); try Table1.Open; except ShowMessage('Impossible douvrir la table !'); Application.Terminate; end; end; Remarque

Lemploi de la fonction InputBox, ci-dessus, est pour dmonstration seulement. Dans une application relle, utilisez les fonctions de saisie de mot de passe, qui masquent ce dernier mesure de sa frappe, comme la fonction PasswordDialog ou une fiche personnalise. Le bouton Ajouter de la bote de dialogue de la fonction PasswordDialog a le mme effet que la mthode AddPassword.
if PasswordDialog(Session) then Table1.Open else ShowMessage('Aucun mot de passe fourni, impossible douvrir la table !'); end;

Utilisation des mthodes RemovePassword et RemoveAllPasswords


RemovePassword supprime de la mmoire un mot de passe prcdemment ajout. RemovePassword prend un paramtre, une chane contenant le mot de passe supprimer.
Session.RemovePassword(secret);

RemoveAllPasswords supprime de la mmoire tous les mots de passe prcdemment ajouts.


Session.RemoveAllPasswords;

Utilisation du moteur de bases de donnes Borland

20-25

Architecture BDE

Utilisation de la mthode GetPassword et de lvnement OnPassword


Lvnement OnPassword vous permet de contrler la faon dont votre application fournit les mots de passe pour les tables Paradox et dBASE quand cest ncessaire. Fournissez un gestionnaire pour lvnement OnPassword si vous ne voulez pas du comportement par dfaut. Si vous nen fournissez pas, Delphi prsente une bote de dialogue par dfaut pour lentre du mot de passe, sans comportement spcial -- si lessai douverture de la table ne russit pas, une exception est dclenche. Si vous fournissez un gestionnaire pour lvnement OnPassword, vous devez faire deux choses dans ce gestionnaire : appeler la mthode AddPassword et dfinir le paramtre Continue du gestionnaire dvnement True. La mthode AddPassword passe la session une chane utiliser comme mot de passe pour la table. Le paramtre Continue indique Delphi qu il nest plus ncessaire dinviter lutilisateur saisir le mot de passe pour cet essai douverture de table. La valeur par dfaut de Continue a pour valeur False, et il faut donc la mettre explicitement True. Si Continue a pour valeur False aprs que le gestionnaire dvnement a fini son excution, un vnement OnPassword est de nouveau dclench, mme si un mot de passe valide a t pass par AddPassword. Si Continue a pour valeur True aprs lexcution du gestionnaire dvnement et si la chane passe avec AddPassword nest pas un mot de passe valide, lessai douverture de la table choue et une exception est dclenche. OnPassword peut tre dclenche dans deux circonstances. La premire est un essai douverture dune table protge par mot de passe (dBASE ou Paradox) quand un mot de passe valide na pas encore t fourni la session (si un mot de passe valide a dj t fourni, lvnement OnPassword ne survient pas). Lautre circonstance est un appel la mthode GetPassword. GetPassword gnre un vnement OnPassword, ou, si la session na pas de gestionnaire dvnement OnPassword, affiche une bote de dialogue de mot de passe par dfaut. Elle renvoie True si le gestionnaire dvnement OnPassword ou la bote de dialogue par dfaut a ajout un mot de passe la session, et False si aucune entre na t effectue. Dans lexemple suivant, la mthode Password est dsigne comme le gestionnaire dvnement OnPassword pour la session par dfaut, en laffectant la proprit OnPassword de lobjet global Session.
procedure TForm1.FormCreate(Sender: TObject); begin Session.OnPassword := Password; end;

Dans la mthode Password, la fonction InputBox demande un mot de passe lutilisateur. La mthode AddPassword fournit alors par programme le mot de passe saisi dans la bote de dialogue la session.
procedure TForm1.Password(Sender: TObject; var Continue: Boolean); var Passwrd: String; begin Passwrd := InputBox('Entrez le mot de passe', 'Mot de passe:', '');

20-26

Guide du dveloppeur

Architecture BDE

Continue := (Passwrd > ''); Session.AddPassword(Passwrd); end;

Lvnement OnPassword (et donc le gestionnaire dvnement Password) est dclench par un essai douverture dune table protge par mot de passe, comme prsent ci-dessus. Mme si lutilisateur est invit fournir un mot de passe dans le gestionnaire dvnement OnPassword, lessai douverture peut chouer en cas de saisie dun mot de passe incorrect ou si une autre erreur survient.
procedure TForm1.OpenTableBtnClick(Sender: const CRLF = #13 + #10; begin try Table1.Open; except on E:Exception do begin ShowMessage('Error!' + CRLF + E.Message + CRLF + 'Terminating application...'); Application.Terminate; end; end; end; TObject);

{ cette ligne dclenche lvnement OnPassword} { exception si impossible douvrir la table } { afficher lerreur expliquant le problme }

{ fin de lapplication }

Spcification des rpertoires Paradox


Deux proprits de composant de session, NetFileDir et PrivateDir, sont spcifiques aux applications qui fonctionnent avec les tables Paradox. NetFileDir spcifie le rpertoire qui contient le fichier de contrle de rseau Paradox, PDOXUSRS.NET. Ce fichier rgente le partage des tables Paradox sur les lecteurs rseau. Toutes les applications qui ont besoin de partager des tables doivent spcifier le mme rpertoire pour le fichier de contrle de rseau (en gnral, un rpertoire situ sur un serveur de fichiers rseau). Delphi calcule une valeur pour NetFileDir partir du fichier de configuration du moteur de bases de donnes Borland (BDE) pour un alias de base de donnes donn. Si vous dfinissez vous-mme NetFileDir, la valeur que vous fournissez supplante le paramtre de configuration BDE ; assurez-vous donc de valider la nouvelle valeur. Au moment de la conception, vous pouvez spcifier une valeur pour NetFileDir dans linspecteur dobjets. Vous pouvez aussi dfinir ou modifier NetFileDir par code lexcution. La ligne suivante dfinit NetFileDir pour la session par dfaut lemplacement du rpertoire depuis lequel lapplication sexcute :
Session.NetFileDir := ExtractFilePath(Application.EXEName); Remarque

NetFileDir ne peut tre modifie que lorsquune application na ouvert aucun fichier Paradox. Si vous modifiez NetFileDir lexcution, vrifiez quelle pointe vers un rpertoire rseau valide partag par vos utilisateurs rseau.

Utilisation du moteur de bases de donnes Borland

20-27

Architecture BDE

PrivateDir spcifie le rpertoire de stockage des fichiers temporaires de traitement des tables, comme ceux gnrs par le BDE pour manipuler les instructions SQL locales. Si aucune valeur nest spcifie pour la proprit PrivateDir, le BDE utilise automatiquement le rpertoire en cours au moment de son initialisation. Si votre application sexcute directement sur un serveur de fichiers rseau, vous pouvez amliorer ses performances lexcution en dfinissant PrivateDir au disque dur local de lutilisateur avant douvrir la base de donnes.
Remarque

Il ne faut pas dfinir PrivateDir au moment de la conception puis ouvrir la session dans lEDI. Cela aurait pour consquence de gnrer une erreur spcifiant que le rpertoire est occup lors de lexcution de votre application depuis lEDI. Le code suivant dfinit le paramtrage de la proprit PrivateDir de la session par dfaut sur le rpertoire C:\TEMP dun utilisateur :
Session.PrivateDir := 'C:\TEMP';

Important

Ne dfinissez pas PrivateDir sur le rpertoire racine dun disque. Utilisez toujours un sous-rpertoire.

Manipulation des alias BDE


Chaque composant de base de donnes associ une session possde un alias BDE (mme si un chemin daccs qualifi peut tre substitu un alias pour accder aux tables Paradox et dBASE). Une session peut crer, modifier et supprimer des alias durant son existence. La mthode AddAlias cre un nouvel alias BDE pour un serveur de base de donnes SQL. AddAlias prend trois paramtres : une chane contenant le nom de lalias, une chane qui spcifie le pilote SQL Links utiliser, et une liste de chanes contenant les paramtres de lalias. Par exemple, les instructions suivantes utilisent AddAlias pour ajouter la session par dfaut un nouvel alias pour laccs un serveur InterBase :
var AliasParams: TStringList; begin AliasParams := TStringList.Create; try with AliasParams do begin Add('OPEN MODE=READ'); Add('USER NAME=TOMSTOPPARD'); Add('SERVER NAME=ANIMALS:/CATS/PEDIGREE.GDB'); end; Session.AddAlias('CATS', 'INTRBASE', AliasParams); ... finally AliasParams.Free; end; end;

AddStandardAlias cre un nouvel alias BDE pour les tables Paradox, dBASE ou ASCII. AddStandardAlias prend trois paramtres de type chane : le nom de lalias, le chemin daccs qualifi vers la table Paradox ou dBASE, et le nom du pilote

20-28

Guide du dveloppeur

Architecture BDE

par dfaut utiliser lors de lessai douverture dune table dont le nom ne possde pas dextension. Par exemple, linstruction suivante utilise AddStandardAlias pour crer un nouvel alias pour laccs une table Paradox :
AddStandardAlias('MYDBDEMOS', 'C:\TESTING\DEMOS\', 'Paradox');

Quand vous ajoutez un alias une session, le BDE stocke une copie de lalias en mmoire, o il est seulement disponible cette session et toute autre session pour laquelle cfmPersistent est inclus dans la proprit ConfigMode. ConfigMode est un ensemble qui dcrit quels types dalias peuvent tre utiliss par les bases de donnes dans la session. Le paramtrage par dfaut est cmAll, qui se traduit par lensemble [cfmVirtual, cfmPersistent, cfmSession]. Si ConfigMode a pour valeur cmAll, une session peut voir tous les alias crs dans cette session (cfmSession), tous les alias du fichier de configuration BDE du systme de lutilisateur (cfmPersistent), et tous les alias que le BDE maintient en mmoire (cfmVirtual). Vous pouvez modifier ConfigMode pour restreindre les alias que les bases de donnes dune session peuvent utiliser. Par exemple, dfinir ConfigMode cfmSession restreint la vue dune session aux seuls alias crs au sein de cette session. Tous les autres alias du fichier de configuration BDE ou en mmoire ne sont pas disponibles. Pour rendre un alias nouvellement cr disponible toutes les sessions et aux autres applications, utilisez la mthode SaveConfigFile de la session. SaveConfigFile crit les alias en mmoire dans le fichier de configuration BDE, o ils peuvent tre lus et utiliss par les autres applications BDE. Aprs avoir cr un alias, vous pouvez modifier ses paramtres en appelant ModifyAlias. ModifyAlias prend deux paramtres : le nom de lalias modifier et une liste de chanes contenant les paramtres modifier et leurs valeurs. Par exemple, les instructions suivantes utilisent ModifyAlias pour changer le paramtre OPEN MODE pour lalias CATS en READ/WRITE dans la session par dfaut :
var List: TStringList; begin List := TStringList.Create; with List do begin Clear; Add('OPEN MODE=READ/WRITE'); end; Session.ModifyAlias('CATS', List); List.Free; ...

Pour supprimer un alias prcdemment cr dans une session, appelez la mthode DeleteAlias. DeleteAlias prend un seul paramtre, le nom de lalias supprimer. DeleteAlias rend un alias indisponible la session.
Remarque

DeleteAlias ne supprime pas un alias du fichier de configuration BDE si lalias y avait t crit par un appel pralable SaveConfigFile. Pour supprimer lalias du fichier de configuration aprs lappel DeleteAlias, appelez SaveConfigFile de nouveau.

Utilisation du moteur de bases de donnes Borland

20-29

Architecture BDE

Les composants session fournissent cinq mthodes pour la rcupration dinformations sur les alias BDE, y compris les informations de paramtre et de pilote. Ce sont : GetAliasNames, pour lister les alias auxquels une session a accs. GetAliasParams, pour lister les paramtres dun alias spcifi. GetAliasDriverName, pour retourner le nom du pilote BDE utilis par lalias. GetDriverNames, pour retourner une liste de tous les pilotes BDE disponibles pour la session. GetDriverParams, pour retourner les paramtres de pilote pour un pilote spcifi. Pour plus dinformations sur lutilisation des mthodes dinformation dune session, voir Rcupration des informations dune session ci-dessous. Pour plus dinformations sur les alias BDE et les pilotes SQL Links avec lesquels ils fonctionnent, voir le fichier daide BDE en ligne, BDE32.HLP.

Rcupration des informations dune session


Vous pouvez rcuprer les informations sur une session et ses composants base de donnes en utilisant les mthodes informatives de la session. Par exemple, une mthode rcupre le nom de tous les alias connus de la session, et une autre mthode rcupre le nom des tables associes un composant base de donnes spcifique utilis par la session. Le tableau suivant rsume les mthodes informatives dun composant session :
Tableau 20.4 Mthode
GetAliasDriverName GetAliasNames GetAliasParams GetConfigParams GetDatabaseNames GetDriverNames GetDriverParams GetStoredProcNames GetTableNames GetFieldNames

M thodes informatives de bases de donnes pour les composants session Action


Rcupre le pilote BDE pour un alias de base de donnes spcifi. Rcupre la liste des alias BDE dune base de donnes. Rcupre la liste des paramtres de l alias BDE spcifi dune base de donnes. Rcupre les informations de configuration partir du fichier de configuration BDE. Rcupre la liste des alias BDE et les noms de tous les composants TDatabase en cours dutilisation. Rcupre le nom de tous les pilotes BDE actuellement installs. Rcupre la liste des paramtres pour le pilote BDE spcifi. Rcupre les noms de toutes les procdures stockes pour la base de donnes spcifie. Rcupre les noms de toutes les tables correspondant au modle spcifi pour la base de donnes spcifie. Rcupre les noms de tous les champs de la table spcifie dune base de donnes spcifie.

Sauf pour GetAliasDriverName, ces mthodes renvoient un ensemble de valeurs dans une liste de chanes dclare et maintenue par votre application. GetAliasDriverName renvoie une chane unique, le nom du pilote BDE en cours pour un composant de base de donnes particulier utilis par la session.

20-30

Guide du dveloppeur

Architecture BDE

Par exemple, le code suivant rcupre les noms de tous les composants base de donnes et tous les alias connus de la session par dfaut :
var List: TStringList; begin List := TStringList.Create; try Session.GetDatabaseNames(List); ... finally List.Free; end; end;

Cration de sessions supplmentaires


Vous pouvez crer des sessions qui sajoutent la session par dfaut. Au moment de la conception, vous pouvez placer des sessions supplmentaires dans un module de donnes (ou une fiche), dfinir leurs proprits dans linspecteur dobjets, leur crire des gestionnaires dvnements, et crire le code qui appelle leurs mthodes. Vous pouvez aussi crer des sessions, dfinir leurs proprits et appeler leurs mthodes lexcution.
Remarque

Crer des sessions supplmentaires est facultatif, moins quune application nexcute des requtes simultanes sur une base de donnes, ou quelle soit multithread. Pour permettre la cration dynamique dun composant session lexcution, suivez les tapes ci-dessous :

1 Dclarez une variable TSession. 2 Instanciez une nouvelle session en appelant la mthode Create. Le constructeur dfinit une liste vide de composants base de donnes pour la session, dfinit la proprit KeepConnections True, et ajoute la session la liste des sessions maintenue par le composant liste de sessions de lapplication. 3 Dfinissez la proprit SessionName de la nouvelle session un nom unique. Cette proprit est utilise pour associer les composants base de donnes la session. Pour plus dinformations sur la proprit SessionName, voir Affectation dun nom une session la page 20-32. 4 Activez la session et ajustez ses proprits si ncessaire.
Vous pouvez aussi crer et ouvrir des sessions avec la mthode OpenSession de TSessionList. Lemploi de OpenSession est plus sr que lappel de Create, parce que OpenSession ne cre la session que si elle nexiste pas dj. Pour plus dinformations sur OpenSession, voir Gestion de sessions multiples la page 20-32. Le code suivant cre un nouveau composant session, lui affecte un nom et ouvre la session pour les oprations de bases de donnes qui suivent (non prsentes ici). Aprs usage, la session est dtruite par un appel la mthode Free.
Remarque

Ne dtruisez jamais la session par dfaut.

Utilisation du moteur de bases de donnes Borland

20-31

Architecture BDE

var SecondSession: TSession; begin SecondSession := TSession.Create(Form1); with SecondSession do try SessionName := 'SecondSession'; KeepConnections := False; Open; ... finally SecondSession.Free; end; end;

Affectation dun nom une session


La proprit SessionName dune session sert nommer la session afin que vous puissiez lui associer des bases de donnes et des ensembles de donnes. Pour la session par dfaut, SessionName est Default ; vous devez donner la proprit SessionName de chaque nouveau composant que vous crez une valeur unique. Les composants base de donnes et ensemble de donnes possdent une proprit SessionName qui correspond la proprit SessionName dun composant session. Si vous laissez vide la proprit SessionName dun composant base de donnes et ensemble de donnes, celui-ci est automatiquement associ la session par dfaut. Vous pouvez aussi dfinir SessionName pour un composant base de donnes ou ensemble de donnes un nom correspondant la proprit SessionName dun composant session que vous crez. Le code suivant utilise la mthode OpenSession du composant TSessionList par dfaut, Sessions, pour ouvrir un nouveau composant session, dfinir sa proprit SessionName InterBaseSession, activer la session et associer un composant base de donnes existant Database1 cette session :
var IBSession: TSession; ... begin IBSession := Sessions.OpenSession('InterBaseSession'); Database1.SessionName := 'InterBaseSession'; end;

Gestion de sessions multiples


Si vous crez une application unique utilisant plusieurs threads pour effectuer des oprations de bases de donnes, vous devez crer une session supplmentaire pour chaque thread. La page BDE de la palette des composants contient un composant session que vous pouvez placer dans un module de donnes ou une fiche au moment de la conception.
Important

Quand vous placez un composant session, vous devez aussi dfinir sa proprit SessionName une valeur unique afin dviter les conflits avec la proprit SessionName de la session par dfaut.

20-32

Guide du dveloppeur

Architecture BDE

Placer un composant session au moment de la conception prsuppose que le nombre de threads (et donc de sessions) requis par lapplication lexcution est statique. Cependant, il est plus probable quune application doive crer des sessions dynamiquement. Pour cela, appelez la mthode OpenSession de lobjet global Sessions lexcution. OpenSession ne demande quun seul paramtre, un nom de session qui doit tre unique parmi tous les noms de sessions de lapplication. Le code suivant cre dynamiquement et active une nouvelle session avec un nom gnr unique :
Sessions.OpenSession('RunTimeSession' + IntToStr(Sessions.Count + 1));

Cette instruction gnre un nom unique pour une nouvelle session en rcuprant le nombre de sessions en cours et en laugmentant de 1. Notez que si vous crez et dtruisez dynamiquement des sessions lexcution, ce code exemple ne fonctionnera comme prvu. Nanmoins, il montre comment utiliser les proprits et les mthodes de Sessions pour grer les sessions multiples. Sessions est une variable de type TSessionList qui est automatiquement instancie pour les applications de bases de donnes BDE. Vous pouvez utiliser les proprits et les mthodes de Sessions pour tracer les sessions multiples dune application de base de donnes multithread. Le tableau suivant rsume les proprits et les mthodes du composant TSessionList :
Tableau 20.5
Count FindSession

Proprits et mthodes de TSessionList But


Renvoie le nombre de sessions, actives et inactives, dans la liste des sessions. Recherche une session dun nom spcifi et renvoie un pointeur dessus, ou nil sil ny en a pas. Si on lui passe un nom de session vide, FindSession renvoie un pointeur sur la session par dfaut, Session. Remplit une liste de chanes avec les noms de tous les composants session couramment instancis. Cette procdure ajoute toujours au moins une chane, Default pour la session par dfaut. Renvoie le composant session pour le nom de session spcifi. Sil ny a pas de session avec ce nom,une exception est dclenche. Cre et active une nouvelle session et ractive une session existante pour le nom de session spcifi. Accde la liste des sessions par valeur ordinale.

Proprit ou M thode

GetSessionNames

List OpenSession Sessions

En exemple lutilisation des proprits et des mthodes de Sessions dans une application multithread, considrez ce qui se passe quand vous voulez ouvrir une connexion de base de donnes. Pour dterminer si une connexion existe dj, utilisez la proprit Sessions pour parcourir chaque session de la liste de sessions, en commenant par la session par dfaut. Examinez la proprit Databases de chaque composant session pour voir si la base de donnes en question est ouverte. Si vous dcouvrez quun autre thread utilise dj la base de donnes dsire, examinez la session suivante de la liste.

Utilisation du moteur de bases de donnes Borland

20-33

Utilisation des transactions avec le BDE

Si aucun thread existant nutilise la base de donnes, vous pouvez ouvrir la connexion avec cette session. En revanche, si tous les threads existants utilisent la base de donnes, vous devez ouvrir une nouvelle session dans laquelle vous ouvrirez une autre connexion de base de donnes. Si vous rpliquez un module de donnes contenant une session dans une application multithread, o chaque thread contient sa propre copie du module de donnes, vous pouvez utiliser la proprit AutoSessionName pour vous assurer que tous les ensembles de donnes de ce module de donnes utilisent la session adquate. Dfinir AutoSessionName True permet la session de gnrer dynamiquement son propre nom unique quand elle est cre lexcution. Elle affecte ensuite ce nom chaque ensemble de donnes du module de donnes, redfinissant tout nom de session explicitement dfini. Cela assure que chaque thread possde sa propre session, et que chaque ensemble de donnes utilise la session dans son propre module de donnes.

Utilisation des transactions avec le BDE


Par dfaut, le BDE fournit un contrle de transaction implicite pour vos applications. Quand une application est sous contrle de transaction implicite, une transaction distincte est utilise pour chaque enregistrement dun ensemble de donnes crit dans la base de donnes sous-jacente. Les transactions implicites garantissent la fois un minimum de conflits de mise jour des enregistrements et une vue cohrente de la base de donnes. En revanche, comme chaque ligne de donnes crite dans une base de donnes prend place dans sa propre transaction, le contrle de transaction implicite peut conduire un trafic rseau excessif et rduire les performances de lapplication. De plus, le contrle de transaction implicite ne protge pas les op rations logiques qui recouvrent plusieurs enregistrements. Si vous contrlez explicitement les transactions, vous pouvez choisir le meilleur moment pour lancer, valider ou annuler vos transactions. Quand vous dveloppez des applications en environnement multi-utilisateur, surtout quand elles fonctionnent sur un serveur SQL distant, il vaut mieux contrler les transactions explicitement. Il existe deux faons, mutuellement exclusives de contrler les transactions explicitement dans une application de base de donnes BDE : Utiliser le composant base de donnes pour contrler les transactions. Le principal avantage de lemploi des mthodes et des proprits dun composant base de donnes est que cela fournit une application propre, portable, qui ne dpend pas dune base de donnes ou dun serveur particulier. Ce type de contrle de transaction est support par tous les composants connexion de bases de donnes et est dcrit dans Gestion des transactions la page 17-6. Utiliser le SQL transparent dans un composant requte pour passer des instructions SQL directement aux serveurs distants SQL ou ODBC. Le principal avantage du SQL transparent est que vous pouvez utiliser les

20-34

Guide du dveloppeur

Utilisation des transactions avec le BDE

capacits de gestion avance des transactions dun serveur de base de donnes particulier, comme la mise en cache de schma. Pour comprendre les avantages du modle de gestion de transaction de votre serveur, voir la documentation de votre serveur de base de donnes. Pour plus dinformations sur lutilisation du SQL transparent, voir Utilisation du SQL transparent cidessous. Quand vous travaillez sur des bases de donnes locales, vous pouvez utiliser seulement le composant base de donnes pour crer des transactions explicites (les bases de donnes locales ne supportent pas le SQL transparent). Cependant, il existe des limitations lemploi des transactions locales. Pour plus dinformations sur lutilisation des transactions locales, voir Utilisation de transactions locales la page 20-36.
Remarque

Vous pouvez minimiser le nombre des transactions ncessaires en mettant les mises jour en mmoire cache. Pour plus dinformations sur les mises jour en mmoire cache, voir Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18 et Utilisation du BDE pour placer en mmoire cache les mises jour la page 20-37.

Utilisation du SQL transparent


Avec le SQL transparent, utilisez un composant TQuery, TStoredProc ou TUpdateSQL pour envoyer une instruction de contrle de transaction SQL directement un serveur de base de donnes distant. Le BDE ne traite pas linstruction SQL. Lemploi du SQL transparent vous permet de tirer directement avantage des contrles de transaction offerts par votre serveur, surtout quand ces contrles ne sont pas standard. Pour utiliser le SQL transparent pour contrler une transaction, vous devez : Installer les pilotes SQL Links appropris. Si vous avez choisi linstallation typique de Delphi, tous les pilotes SQL Links sont dj correctement installs. Configurer votre protocole de rseau. Consultez votre administrateur rseau pour plus dinformations. Avoir accs une base de donnes sur un serveur distant. Dfinir SQLPASSTHRU MODE NOT SHARED avec lexplorateur SQL. SQLPASSTHRU MODE spcifie si les instructions BDE et SQL transparent peuvent partager les mmes connexions de bases de donnes. Dans la plupart des cas, SQLPASSTHRU MODE est dfini SHARED AUTOCOMMIT. Cependant, vous ne pouvez pas partager les connexions de bases de donnes quand vous utilisez des instructions de contrle de transaction. Pour plus dinformations sur les modes SQLPASSTHRU, voir le fichier daide de lutilitaire dadministration BDE.
Remarque

Quand SQLPASSTHRU MODE a pour valeur NOT SHARED, vous devez utiliser des composants base de donnes distincts pour les ensembles de donnes qui

Utilisation du moteur de bases de donnes Borland

20-35

Utilisation des transactions avec le BDE

passent des instructions de transaction SQL au serveur et pour les ensembles de donnes qui ne le font pas.

Utilisation de transactions locales


Le BDE supporte les transactions locales sur les tables Paradox, dBASE, Access et FoxPro. D un point de vue programmation, il ny a pas de diffrence pour vous entre une transaction locale et une transaction sur un serveur de base de donnes distant.
Remarque

Quand vous utilisez des transactions avec des tables locales Paradox, dBASE, Access et FoxPro, dfinissez TransIsolation tiDirtyRead au lieu dutiliser la valeur par dfaut tiReadCommitted. Une erreur BDE est renvoye si TransIsolation est dfinie une valeur autre que tiDirtyRead pour les tables locales. Quand une transaction est dmarre sur une table locale, les mises jour effectues sur la table sont consignes. Chaque enregistrement du journal contient lancien tampon dun enregistrement. Quand une transaction est active, les enregistrements mis jour sont verrouills jusqu ce que la transaction soit valide ou annule. En cas dannulation, les anciens tampons denregistrements sont appliqus au lieu des nouveaux, afin de les restaurer dans leur tat antrieur. Les transactions locales sont plus limites que les transactions sur les serveurs SQL ou les pilotes ODBC. En particulier, les restrictions suivantes sappliquent aux transactions locales : La rcupration automatique en cas de problme nest pas fournie. Les instructions de dfinition de donnes ne sont pas supportes. Les transactions ne peuvent pas tre effectues sur des tables temporaires. Le niveau TransIsolation doit tre dfini tiDirtyRead. Pour Paradox, les transactions locales ne peuvent tre effectues que sur les tables comportant des index valides. Il est impossible dannuler les modifications sur des tables Paradox qui nont pas dindex. Un nombre limit denregistrements peut tre verrouill et modifi. Avec les tables Paradox, vous tes limit 255 enregistrements. Avec dBASE la limite est de 100. Les transactions ne peuvent tre effectu es sur le pilote ASCII BDE. Fermer un curseur sur une table durant une transaction annule celle-ci sauf si : Plusieurs tables sont ouvertes. Le curseur est ferm sur une table dans laquelle aucune modification na t effectue.

20-36

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

Utilisation du BDE pour placer en mmoire cache les mises jour


Lapproche recommande pour la mise en mmoire cache des mises jour consiste utiliser un ensemble de donnes client (TBDEClientDataSet) ou connecter lensemble de donnes BDE un ensemble de donnes client laide dun fournisseur densemble de donnes. Les avantages de lensemble de donnes client sont traits dans Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18. Dans les cas les plus simples, vous pouvez choisir dutiliser le BDE pour la mise en mmoire cache des mises jour. Les ensembles de donnes BDE et les composants TDatabase fournissent des proprits, des mthodes et des vnements pour la gestion des mises jour en mmoire cache. La plupart correspondent directement aux proprits, mthodes et vnements que vous utilisez avec les ensembles de donnes client et les fournisseurs densembles de donnes lors de lutilisation dun ensemble de donnes client pour la mise en mmoire cache des mises jour. Le tableau suivant prsente ces proprits, mthodes et vnements, ainsi que leurs correspondances dans TBDEClientDataSet :
Tableau 20.6 Proprits, mthodes et vnements pour les mises jour en mmoire cache

Sur ensembles de donnes BDE (ou TDatabase)


CachedUpdates

Sur TBDEClientDataSet
Inutile pour les ensembles de donnes clients, qui pratiquent toujours la mise en mmoire cache des mises jour. Utilise un gestionnaire dvnement BeforeUpdateRecord, ou, si lon emploie TClientDataSet, utilise la proprit UpdateObject sur lensemble de donnes BDE source. ChangeCount

Fonction
Dtermine si les mise jour en mmoire cache sont actives pour lensemble de donnes.

UpdateObject

Spcifie lobjet mise jour pour mettre jour les ensembles de donnes en lecture seule.

UpdatesPending

Indique si le cache local contient des enregistrements modifis quil faut appliquer la base de donnes. Indique le type denregistrements mis jour rendre visibles en appliquant les mises jour en mmoire cache. Indique si un enregistrement est inchang, modifi, insr ou supprim . Un vnement pour la gestion des erreurs de mise jour, enregistrement par enregistrement.

UpdateRecordTypes

StatusFilter

UpdateStatus OnUpdateError

UpdateStatus OnReconcileError

Utilisation du moteur de bases de donnes Borland

20-37

Utilisation du BDE pour placer en mmoire cache les mises jour

Tableau 20.6

Proprits, mthodes et vnements pour les mises jour en mmoire cache (suite)

Sur ensembles de donnes BDE (ou TDatabase)


OnUpdateRecord

Sur TBDEClientDataSet
BeforeUpdateRecord

Fonction
Un vnement pour le traitement des mises jour, enregistrement par enregistrement. Applique la base de donnes les enregistrements du cache local. Supprime toutes les mises jour en attente du cache local, sans les appliquer. Efface le cache des mises jour aprs le succs de lapplication des mises jour. Copie les enregistrements de bases de donnes dans le cache local pour modification et mise jour. Annule les mises jour de lenregistrement en cours si elles ne sont pas encore appliques.

ApplyUpdates ApplyUpdates (base de donnes) CancelUpdates

ApplyUpdates

CancelUpdates

CommitUpdates

Reconcile

FetchAll

GetNextPacket (et PacketRecords) RevertRecord

RevertRecord

Pour une vue densemble du processus de mises jour en mmoire cache, voir Prsentation de lutilisation dun cache pour les mises jour la page 23-20.
Remarque

Mme si vous utilisez un ensemble de donnes client pour placer les mises jour en mmoire cache, lisez la section sur les objets mise jour, page 20-45. Vous pouvez utiliser les objets mise jour dans le gestionnaire dvnement BeforeUpdateRecord de TBDEClientDataSet ou TDataSetProvider pour appliquer les mises jour depuis des procdures stockes ou des requtes multitables.

Activation des mises jour BDE en mmoire cache


Pour utiliser le BDE pour les mises jour en mmoire cache, lensemble de donnes BDE doit indiquer le placement des mises jour en mmoire cache. Cela est spcifi en dfinissant la proprit CachedUpdates True. Lorsque les mises jour en mmoire cache sont actives, une copie de tous les enregistrements est place en mmoire locale. Les utilisateurs consultent et ditent cette copie locale des donnes. Les modifications, insertions et suppressions ont aussi lieu en mmoire cache. Elles saccumulent en mmoire jusqu ce que lapplication applique ces modifications au serveur de base de donnes. Si les enregistrements modifis sont appliqus avec succs la base de donnes, lenregistrement de ces modifications est libr de la mmoire cache. Lensemble de donnes met toutes les mises jour en mmoire cache jusqu ce que vous dfinissiez CachedUpdates False. Lapplication des mises jour prsentes en mmoire cache ne dsactive pas les futures mises jour en mmoire cache ; cela crit seulement lensemble en cours des modifications dans la base de donnes et les efface de la mmoire. Lannulation des mises jour en appelant

20-38

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

CancelUpdates supprime toutes les modifications en cours dans la mmoire cache, mais nempche pas lensemble de donnes de continuer placer en mmoire cache les modifications ultrieures.
Remarque

Si vous dsactivez les mises jour en mmoire cache en dfinissant CachedUpdates False, toutes les modifications en attente que vous navez pas encore appliqu es sont perdues sans notification. Pour viter la perte des modifications, testez la proprit UpdatesPending avant de dsactiver les mises jour en mmoire cache.

Application des mises jour BDE en mmoire cache


Lapplication des mises jour est un processus en deux phases qui doit se produire dans le contexte dune transaction dun composant base de donnes, afin que votre application puisse grer facilement les erreurs. Pour plus dinformations sur la gestion des transactions avec les composants base de donnes, voir Gestion des transactions la page 17-6. Quand vous appliquez des mises jour sous le contrle dune transaction de base de donnes, les vnements suivants prennent place :

1 Une transaction de base de donnes dmarre. 2 Les mises jour en mmoire cache sont crites dans la base de donnes (phase 1). Si vous le fournissez, un vnement OnUpdateRecord est dclench pour chaque enregistrement crit dans la base de donnes. Si une erreur survient quand un enregistrement est appliqu la base de donnes, lvnement OnUpdateError est dclench si vous en fournissez un. 3 La transaction est valide si les oprations dcriture sont russies ; elle est annule dans le cas contraire :
Si lcriture dans la base de donnes est russie : Les modifications de la base de donnes sont valides, ce qui termine la transaction de base de donnes. Les mises jour en mmoire cache sont valides, librant le tampon interne du cache (phase 2). Si lcriture dans la base de donnes choue : Les modifications de la base de donnes sont annules, ce qui termine la transaction de base de donnes. Les mises jour en mmoire cache ne sont pas valides, et restent intactes dans le cache interne. Pour plus dinformations sur la cration et lutilisation dun gestionnaire dvnement OnUpdateRecord, voir Cration dun gestionnaire dvnement OnUpdateRecord la page 20-42. Pour plus dinformations sur la gestion des erreurs de mise jour lors de lapplication des mises jour prsentes en mmoire cache, Gestion des erreurs de mise jour en mmoire cache la page 20-43.

Utilisation du moteur de bases de donnes Borland

20-39

Utilisation du BDE pour placer en mmoire cache les mises jour

Remarque

Lapplication des mises jour en mmoire cache est particulirement difficile quand vous travaillez avec plusieurs ensembles de donnes en liaison matre/ dtail, car lordre dans lequel vous appliquez les mises jour chaque ensemble de donnes est significatif. Normalement, vous devez mettre jour les tables matre avant les tables dtail, sauf lors de la gestion des enregistrements supprims, o cet ordre doit tre invers. En raison de cette difficult, il est vivement recommand dutiliser des ensembles de donnes client lors de la mise en mmoire cache des mises jour dune fiche matre/dtail. Les ensembles de donnes client grent automatiquement lordre des oprations dans les relations matre/dtail. Il y a deux faons dappliquer les mises jour BDE : Vous pouvez appliquer les mises jour au moyen dun composant base de donnes en appelant sa mthode ApplyUpdates. Cest lapproche la plus simple, car la base de donnes gre tous les dtails de la gestion dune transaction ncessaire au processus de mise jour, et de leffacement du cache de lensemble de donnes quand la mise jour est termine. Vous pouvez appliquer les mises jour pour un ensemble de donnes unique en appelant les mthodes ApplyUpdates et CommitUpdates de lensemble de donnes. Quand vous appliquez les mises jour au niveau de lensemble de donnes, vous devez coder explicitement la transaction pour le processus de mise jour, et appeler explicitement CommitUpdates pour valider les mises jour depuis le cache.

Important

Pour appliquer les mises jour depuis une procdure stocke ou une requte SQL qui ne renvoie pas un ensemble de rsultats dynamique, vous devez utiliser TUpdateSQL pour spcifier comment effectuer les mises jour. Pour les mises jour de jointures (requtes impliquant plusieurs tables), vous devez fournir un objet TUpdateSQL pour chaque table implique, et vous devez utiliser le gestionnaire dvnement OnUpdateRecord pour invoquer ces objets afin deffectuer les mises jour. Consultez Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45 pour plus de dtails.

Application des mises jour en mmoire cache avec une base de donnes
Pour appliquer les mises jour prsentes en mmoire cache un ou plusieurs ensembles de donnes dans le contexte dune connexion de base de donnes, appelez la mthode ApplyUpdates du composant base de donnes. Le code suivant applique les mises jour lensemble de donnes CustomersQuery en rponse un vnement clic de bouton :
procedure TForm1.ApplyButtonClick(Sender: TObject); begin // pour les bases de donnes locales Paradox, dBASE et FoxPro // dfinir TransIsolation DirtyRead if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then Database1.TransIsolation := tiDirtyRead; Database1.ApplyUpdates([CustomersQuery]); end;

La squence ci-dessus crit les mises jour en mmoire cache dans la base de donnes dans le contexte dune transaction gnre automatiquement. En cas de

20-40

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

succs, elle valide la transaction, puis les mises jour prsentes en mmoire cache. En cas dchec, elle annule la transaction et laisse le cache de mise jour inchang. Dans ce dernier cas, vous devez grer les erreurs de mises jour en mmoire cache par le biais de lvnement OnUpdateError de lensemble de donnes. Pour plus dinformations sur la gestion des erreurs de mise jour, voir Gestion des erreurs de mise jour en mmoire cache la page 20-43. Le principal avantage appeler la mthode ApplyUpdates dun composant base de donnes est que vous pouvez mettre jour tous les composants ensemble de donnes associs la base de donnes. Le paramtre de la mthode ApplyUpdates pour une base de donnes est un tableau de TDBDataSet. Par exemple, le code suivant applique les mises jour pour deux requtes :
if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then Database1.TransIsolation := tiDirtyRead; Database1.ApplyUpdates([CustomerQuery, OrdersQuery]);

Application des mises jour en mmoire cache avec les mthodes de composant base de donnes
Vous pouvez appliquer directement les mises jour densembles de donnes BDE individuels en utilisant les mthodes ApplyUpdates et CommitUpdates de lensemble de donnes. Chacune de ces mthodes encapsule une phase du processus de mise jour :

1 ApplyUpdates crit les mises jour en mmoire cache dans une base de donnes (phase 1). 2 CommitUpdates efface le cache interne quand lcriture dans la base de donnes est russie (phase 2).
Le code suivant illustre la manire dappliquer les mises jour dans une transaction pour lensemble de donnes CustomerQuery :
procedure TForm1.ApplyButtonClick(Sender: TObject) begin Database1.StartTransaction; try if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then Database1.TransIsolation := tiDirtyRead; CustomerQuery.ApplyUpdates; {essai dcriture des modifications dans la base de donnes} Database1.Commit; { si succs, valider les modifications } except Database1.Rollback; { si chec, annuler les modifications } raise; { dclencher lexception de nouveau pour viter un appel CommitUpdates } end; CustomerQuery.CommitUpdates; { si succs, effacer le cache interne } end;

Si une exception est dclenche durant lappel de ApplyUpdates, la transaction de base de donnes est annule. Cette annulation garantit que la table de base de donnes sous-jacente nest pas modifie. Linstruction raise dans le bloc try...except dclenche lexception, ce qui empche lappel de CommitUpdates.

Utilisation du moteur de bases de donnes Borland

20-41

Utilisation du BDE pour placer en mmoire cache les mises jour

Comme CommitUpdates nest pas appele, le cache interne des mises jour nest pas vid, ce qui vous laisse la possibilit de grer les conditions derreur et de relancer la mise jour.

Cration dun gestionnaire dvnement OnUpdateRecord


Quand un ensemble de donnes BDE applique ses mises jour en mmoire cache, il parcourt les modifications enregistres dans son cache, essayant de les appliquer aux enregistrements correspondants dans la table de base de donnes. Au moment o chaque modification, insertion ou suppression est sur le point dtre applique, lvnement OnUpdateRecord du composant ensemble de donnes est dclench. Fournir un gestionnaire pour lvnement OnUpdateRecord permet deffectuer des actions juste avant lapplication effective de la mise jour de lenregistrement en cours. Ces actions peuvent comprendre une validation spciale des donnes, la mise jour dautres tables, des substitutions spciales de paramtres ou lexcution de multiples objets mise jour. Un gestionnaire dvnement OnUpdateRecord donne un meilleur contrle sur le processus de mise jour. Voici le code squelette dun gestionnaire dvnement OnUpdateRecord :
procedure TForm1.DataSetUpdateRecord(DataSet: TDataSet; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); begin { effectuer les mises jour ici... } end;

Le paramtre DataSet spcifie lensemble de donnes ayant des mises jour en mmoire cache. Le paramtre UpdateKind indique le type de mise jour qui doit tre effectu sur lenregistrement en cours. UpdateKind peut prendre les valeurs ukModify, ukInsert et ukDelete. Si vous utilisez un objet mise jour, vous devez lui passer ce paramtre lors de lapplication de la mise jour. Vous pouvez aussi avoir besoin dinspecter ce paramtre si votre gestionnaire effectue un traitement spcial selon le type de mise jour. Le paramtre UpdateAction indique si vous avez appliqu la mise jour. UpdateAction peut prendre les valeurs uaFail (valeur par dfaut), uaAbort, uaSkip, uaRetry, uaApplied. Si votre gestionnaire dvnement applique la mise jour avec succs, donnez ce paramtre la valeur uaApplied avant de sortir. Si vous dcidez de ne pas mettre jour lenregistrement en cours, donnez-lui la valeur uaSkip pour prserver les modifications en mmoire cache non appliques. Si vous ne changez pas la valeur de UpdateAction , toute lopration de mise jour de lensemble de donnes est annule et une exception est dclenche. Vous pouvez supprimer le message derreur (et dclencher une exception silencieuse) en donnant UpdateAction la valeur uaAbort. En plus de ces paramtres, vous utiliserez les proprits OldValue et NewValue pour le composant champ associ lenregistrement en cours. OldValue donne la valeur originale du champ telle que rcupre de la base de donnes. Elle peut servir localiser lenregistrement de base de donnes mettre jour. NewValue est la valeur modifie dans la mise jour que vous essayez dappliquer.

20-42

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

Important

Un gestionnaire dvnement OnUpdateRecord, comme un gestionnaire dvnement OnUpdateError ou OnCalcFields, ne doit jamais appeler les mthodes qui modifient lenregistrement en cours dun ensemble de donnes. Lexemple suivant illustre comment utiliser ces paramtres et proprits. Il emploie un composant TTable nomm UpdateTable pour appliquer les mises jour. En pratique, il est plus facile dutiliser un objet mise jour, mais lemploi dune table illustre plus clairement les possibilits.
procedure TForm1.EmpAuditUpdateRecord(DataSet: TDataSet; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); begin if UpdateKind = ukInsert then UpdateTable.AppendRecord([DataSet.Fields[0].NewValue, DataSet.Fields[1].NewValue]) else if UpdateTable.Locate('KeyField', VarToStr(DataSet.Fields[1].OldValue), []) then case UpdateKind of ukModify: begin UpdateTable.Edit; UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue); UpdateTable.Post; end; ukInsert: begin UpdateTable.Insert; UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue); UpdateTable.Post; end; ukDelete: UpdateTable.Delete; end; UpdateAction := uaApplied; end;

Gestion des erreurs de mise jour en mmoire cache


Quand il essaie dappliquer les mises jour, le moteur de bases de donnes Borland (BDE) recherche les conflits de mise jour utilisateur et autres conditions, et il signale les erreurs ventuelles. Lvnement OnUpdateError du composant ensemble de donnes vous permet de capturer les erreurs et dy rpondre. Il est bon de crer un gestionnaire pour cet vnement si vous utilisez les mises jour en mmoire cache. Si vous ne le faites pas et qu une erreur survient, toute lopration de mise jour choue. Voici le code squelette dun gestionnaire dvnement OnUpdateError :
procedure TForm1.DataSetUpdateError(DataSet: TDataSet; E: EDatabaseError; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); begin { ... effectuer ici la gestion derreur de mise jour ... } end;

DataSet rfrence lensemble de donnes auquel les mises jour sont appliques. Vous pouvez utiliser cet ensemble de donnes pour accder aux nouvelles et anciennes valeurs durant la gestion derreur. Les valeurs originales des champs

Utilisation du moteur de bases de donnes Borland

20-43

Utilisation du BDE pour placer en mmoire cache les mises jour

de chaque enregistrement sont stockes dans une proprit TField en lecture seule appele OldValue. Les valeurs modifies sont stockes dans la proprit TField analogue NewValue. Ces valeurs constituent la seule possibilit dinspecter et de modifier les valeurs de mise jour dans le gestionnaire dvnement.
Attention

Nappelez aucune mthode densemble de donnes susceptible de changer lenregistrement en cours (comme Next et Prior). Cela ferait entrer le gestionnaire dvnement dans une boucle sans fin. Le paramtre E est habituellement du type EDBEngineError. Dans ce type dexception, vous pouvez extraire un message derreur que vous pouvez afficher aux utilisateurs dans votre gestionnaire derreur. Par exemple, le code suivant affiche le message derreur dans lintitul dune bote de dialogue :
ErrorLabel.Caption := E.Message;

Ce paramtre est aussi utile pour dterminer la cause exacte de lerreur de mise jour. Vous pouvez rcuprer les codes derreur spcifiques depuis EDBEngineError, et prendre les mesures appropries. Le paramtre UpdateKind dcrit le type de mise jour qui a gnr lerreur. Sauf si votre gestionnaire derreur doit entreprendre des actions spciales selon le type derreur rapport, vous ne lutiliserez sans doute pas. Le tableau suivant prsente les valeurs possibles de UpdateKind :
Tableau 20.7 Valeur
ukModify ukInsert ukDelete

Valeurs UpdateKind Signification


Ldition dun enregistrement existant a gnr une erreur. Linsertion dun enregistrement a gnr une erreur. La suppression dun enregistrement existant a gnr une erreur.

UpdateAction indique au BDE comment continuer le processus de mise jour la sortie de votre gestionnaire dvnement. Au premier appel de votre gestionnaire derreur de mise jour, la valeur de ce paramtre est toujours dfinie uaFail. Selon la condition derreur de lenregistrement qui a gnr lerreur et ce que vous faites pour la corriger, vous dfinissez g nralement UpdateAction une valeur diffrente avant de quitter le gestionnaire : Si votre gestionnaire derreur peut corriger la condition derreur qui a provoqu son intervention, dfinissez UpdateAction laction approprie entreprendre en sortie. Pour les conditions derreur que vous corrigez, dfinissez UpdateAction uaRetry pour appliquer de nouveau la mise jour de lenregistrement. Si vous utilisez la valeur uaSkip, la mise jour de la ligne qui a provoqu lerreur est ignore et la mise jour de lenregistrement reste dans le cache quand toutes les autres mises jour sont termines. uaFail et uaAbort mettent toutes deux un terme toute lopration de mise jour. uaFail dclenche une exception et affiche un message derreur. uaAbort dclenche une exception silencieuse (sans afficher de message derreur).

20-44

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

Le code suivant montre comment un gestionnaire dvnement OnUpdateError vrifie si lerreur de mise jour est lie une violation de cl, et dans ce cas dfinit le paramtre UpdateAction uaSkip :
{ Ajouter 'Bde' votre clause uses pour cet exemple } if (E is EDBEngineError) then with EDBEngineError(E) do begin if Errors[ErrorCount - 1].ErrorCode = DBIERR_KEYVIOL then UpdateAction := uaSkip { violation de cl, ignorer cet enregistrement } else UpdateAction := uaAbort; { ne sait pas ce qui est faux, annuler la mise jour } end; Remarque

Si une erreur survient durant lapplication des mises jour en mmoire cache, une exception est dclenche et un message derreur est affich. A moins que ApplyUpdates ne soit appel dans une construction try...except, un message derreur affich depuis votre gestionnaire dvnement OnUpdateError peut provoquer un double affichage par votre application du mme message derreur. Pour viter la duplication du message derreur, dfinissez UpdateAction uaAbort pour dsactiver laffichage des messages derreur gnrs par le systme.

Utilisation dobjets mise jour pour mettre jour un ensemble de donnes


Quand lensemble de donnes BDE reprsente une procdure stocke ou une requte non dynamique, il nest pas possible dappliquer les mises jour directement depuis lensemble de donnes. De tels ensembles de donnes peuvent aussi provoquer un problme quand vous utilisez un ensemble de donnes client pour placer les mises jour en mmoire cache. Que vous utilisiez le BDE ou un ensemble de donnes client pour placer les mises jour en mmoire cache, vous devez grer ces problmes en utilisant un objet mise jour :

1 Si vous utilisez un ensemble de donnes client, utilisez un composant fournisseur externe avec TClientDataSet plutt que TBDEClientDataSet. Vous pouvez ainsi dfinir la proprit UpdateObject de lensemble de donnes BDE source (tape 3). 2 Ajoutez un composant TUpdateSQL au mme module de donnes que celui de lensemble de donnes BDE. 3 Affectez la proprit UpdateObject du composant ensemble de donnes BDE le composant TUpdateSQL dans le module de donnes. 4 Spcifiez les instructions SQL ncessaires pour effectuer les mises jour en utilisant les proprits ModifySQL, InsertSQL et DeleteSQL de lobjet mise jour. Vous pouvez utiliser lditeur de mise jour SQL pour composer ces instructions. 5 Fermez lensemble de donnes.

Utilisation du moteur de bases de donnes Borland

20-45

Utilisation du BDE pour placer en mmoire cache les mises jour

6 Affectez la proprit CachedUpdates du composant ensemble de donnes la valeur True ou liez lensemble de donnes lensemble de donnes client laide dun fournisseur densemble de donnes. 7 Rouvrez lensemble de donnes.
Remarque

Parfois, vous devez utiliser plusieurs objets mise jour . Par exemple, lors de la mise jour dune jointure multitable ou dune procdure stocke qui reprsente des donnes venant de plusieurs ensembles de donnes, vous devez fournir un objet TUpdateSQL pour chaque table mettre jour. Quand vous utilisez plusieurs objets mise jour, vous ne pouvez pas associer simplement lobjet mise jour lensemble de donnes en dfinissant la proprit UpdateObject. Vous devez plutt appeler manuellement lobjet mise jour depuis un gestionnaire dvnement OnUpdateRecord (si vous utilisez le BDE pour placer les mises jour en mmoire cache) ou BeforeUpdateRecord (si vous utilisez un ensemble de donnes client). Lobjet mise jour encapsule en ralit trois composants TQuery. Chacun de ces composants requ te effectue une tche de mise jour unique. Le premier fournit une instruction SQL UPDATE pour modifier les enregistrements existants ; le second composant fournit une instruction INSERT pour ajouter de nouveaux enregistrements une table ; le troisime fournit une instruction DELETE pour supprimer des enregistrements dune table. Quand vous placez un composant mise jour dans un module de donnes, vous ne voyez pas les composants requte qu il encapsule. Ils sont crs lexcution par le composant mise jour partir de trois proprits de mise jour pour lesquelles vous fournissez des instructions SQL : ModifySQL spcifie linstruction UPDATE. InsertSQL spcifie linstruction INSERT. DeleteSQL spcifie linstruction DELETE. A lexcution, quand le composant de mise jour est utilis pour appliquer les mises jour, il :

1 Slectionne une instruction SQL excuter selon que lenregistrement en cours est modifi, insr ou supprim. 2 Fournit les valeurs de paramtre aux instructions SQL. 3 Prpare et excute linstruction SQL pour effectuer la mise jour spcifie.

Cration dinstructions SQL pour les composants mise jour


Pour mettre jour un enregistrement dans un ensemble de donnes associ, un objet mise jour utilise lune des trois instructions SQL. Chaque objet mise jour permet de mettre jour une seule table, et les instructions de mise jour de chaque objet doivent rfrencer la mme table de base de donnes. Les trois instructions SQL suppriment, insrent et modifient les enregistrements mis en mmoire cache en vue dune mise jour. Vous devez fournir ces instructions sous la forme de proprits DeleteSQL, InsertSQL, et ModifySQL de lobjet mise jour. Vous pouvez fournir ces valeurs la conception ou

20-46

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

lexcution. Par exemple, le code suivant spcifie lexcution une valeur pour la proprit DeleteSQL :
with UpdateSQL1.DeleteSQL do begin Clear; Add(DELETE FROM Inventory I); Add(WHERE (I.ItemNo = :OLD_ItemNo)); end;

A la conception, vous pouvez utiliser lditeur SQL de mise jour pour vous aider composer les instructions SQL qui appliquent les mises jour. Les objets mise jour fournissent une liaison automatique des paramtres pour les paramtres qui rfrencent les valeurs originales et modifies des champs de lensemble de donnes. Vous insrez donc normalement des paramtres avec des noms spcialement formats quand vous composez les instructions SQL . Pour plus dinformations sur lutilisation de ces paramtres, voir Substitution de paramtres dans les instructions SQL de mise jour la page 20-48.

Utilisation de lditeur SQL de mise jour


Pour crer les instructions SQL dun composant mise jour :

1 Avec linspecteur dobjets, slectionnez le nom de lobjet mise jour dans la liste droulante de la proprit UpdateObject de lensemble de donnes. Cette tape garantit que lditeur SQL de mise jour invoqu dans ltape suivante dtermine les valeurs par dfaut adquates pour les options de gnration SQL. 2 Faites un clic droit sur lobjet mise jour et slectionnez lditeur UpdateSQL dans le menu contextuel. Lditeur SQL de mise jour saffiche. Il cre les instructions SQL pour les proprits ModifySQL, InsertSQL et DeleteSQL de lobjet mise jour, selon lensemble de donnes sous-jacent et les valeurs que vous lui fournissez.
Lditeur SQL de mise jour possde deux pages. La page Options est visible la premire fois que vous invoquez lditeur. Utilisez la bote options Nom de table pour slectionner la table mettre jour. Quand vous spcifiez un nom de table, les botes liste Champs cl et Mettre jour les champs se remplissent avec les colonnes disponibles. La bote liste Mettre jour les champs indique les colonnes mettre jour. Quand vous spcifiez une table pour la premire fois, toutes les colonnes de cette bote liste sont slectionnes pour tre incluses. Vous pouvez faire une slection multiple des champs selon vos besoins. La bote liste Champs cl sert spcifier les colonnes utiliser comme cls durant la mise jour. Pour Paradox, dBASE et FoxPro les colonnes que vous spcifiez doivent correspondre un index existant, mais ce nest pas obligatoire pour les bases de donnes SQL distantes. Au lieu de dfinir Champs cl, vous pouvez cliquer sur le bouton Cls primaires pour choisir les champs cl de la mise jour en fonction de lindex primaire de la table. Cliquez sur Valeurs du Dataset pour ramener les listes de slection leur tat original : tous les champs slectionns en tant que cls et tous ceux slectionns pour mise jour.

Utilisation du moteur de bases de donnes Borland

20-47

Utilisation du BDE pour placer en mmoire cache les mises jour

Cochez la case Noms de champs entre guillemets si votre serveur requiert des guillemets autour des noms de champs. Aprs avoir spcifi une table, slectionnez les colonnes cls et les colonnes mettre jour, cliquez sur Gnrer le SQL pour gnrer les instructions SQL prliminaires associer aux proprits ModifySQL, InsertSQL et DeleteSQL du composant mise jour. Dans la plupart des cas, vous devrez affiner les instructions SQL gnres automatiquement. Pour afficher et modifier les instructions SQL gnres, slectionnez la page SQL. Si vous avez gnr des instructions SQL, linstruction de la proprit ModifySQL y est dj affiche dans la zone mmo Texte SQL. Vous pouvez diter linstruction selon vos dsirs.
Important

Gardez lesprit que les instructions SQL gnres sont des points de dpart pour la cration dinstructions de mise jour. Il peut tre ncessaire de les modifier pour quelles sexcutent correctement. Par exemple, si vous travaillez sur des donnes contenant des valeurs NULL, il faut modifier la clause WHERE comme ceci :
WHERE field IS NULL

plutt que dutiliser la variable champ gnre. Testez chaque instruction directement avant de laccepter. Utilisez les boutons radio Type dinstruction pour basculer dune instruction gnre une autre et les diter. Pour accepter les instructions et les associer avec les proprits SQL du composant mise jour, cliquez sur OK.

Substitution de paramtres dans les instructions SQL de mise jour


Les instructions SQL de mise jour utilisent une forme spciale de substitution de paramtres qui vous permet de substituer les anciennes ou les nouvelles valeurs de champs dans les mises jour denregistrements. Quand lditeur SQL de mise jour gnre ses instructions, il dtermine quelles valeurs de champs utiliser. Quand vous crivez le code SQL de mise jour, vous spcifiez les valeurs de champs utiliser. Quand le nom dun paramtre correspond celui dune colonne dune table, la nouvelle valeur du champ dans la mise jour en mmoire cache de lenregistrement est utilise automatiquement comme valeur du paramtre. Quand le nom dun paramtre correspond celui dune colonne commenant par la chane OLD_, lancienne valeur du champ est utilise. Par exemple, dans linstruction SQL de mise jour ci-dessous, le paramtre :LastName est automatiquement rempli avec la nouvelle valeur du champ dans la mise jour en mmoire cache pour lenregistrement insr.
INSERT INTO Names (LastName, FirstName, Address, City, State, Zip) VALUES (:LastName, :FirstName, :Address, :City, :State, :Zip)

Les nouvelles valeurs de champs sont habituellement utilises dans les instructions InsertSQL et ModifySQL. Dans la mise jour dun enregistrement

20-48

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

modifi, la nouvelle valeur de champ du cache de mise jour est utilise par linstruction UPDATE pour remplacer lancienne valeur de champ dans la table de base mise jour. Dans le cas dun enregistrement supprim, il ny a pas de nouvelles valeurs, et la proprit DeleteSQL utilise donc la syntaxe :OLD_FieldName. Les anciennes valeurs de champs sont aussi utilises normalement dans la clause WHERE de linstruction SQL pour une mise jour par modification ou suppression pour dterminer quel enregistrement mettre jour ou supprimer. Dans la clause WHERE dune instruction SQL de mise jour UPDATE ou DELETE, fournissez au moins le nombre minimal de paramtres ncessaires pour identifier sans ambigut lenregistrement de la table de base qui est mis jour partir des donnes en mmoire cache. Par exemple, dans une liste de clients, lutilisation du nom de famille peut ne pas tre suffisant pour identifier de manire unique lenregistrement adquat dans la table de base. Il peut y avoir plusieurs enregistrements sous le nom de Martin. Lutilisation de paramtres pour le nom, le prnom et le numro de tlphone peut constituer une combinaison assez prcise, dfaut dun code client unique.
Remarque

Si vous crez des instructions SQL contenant des paramtres qui ne se rfrent pas aux valeurs de champs originales ou modifies, lobjet mise jour ne sait pas comment relier leurs valeurs. Vous pouvez cependant le faire manuellement, en utilisant la proprit Query de lobjet mise jour . Consultez Utilisation de la proprit Query dun composant mise jour la page 20-54 pour plus de dtails.

Elaboration des instructions SQL de mise jour


Au moment de la conception, vous pouvez utiliser lditeur SQL de mise jour pour crire les instructions SQL pour les proprits DeleteSQL, InsertSQL et ModifySQL. Si vous nutilisez pas cet diteur, ou si vous voulez modifier les instructions gnres, respectez les points suivants en crivant les instructions de suppression, dinsertion et de modification des enregistrements de la table de base. La proprit DeleteSQL ne doit contenir quune instruction SQL avec la commande DELETE. La table de base mettre jour doit tre nomme dans la clause FROM. Pour que linstruction SQL ne supprime que lenregistrement de la table de base correspondant celui supprim dans la mmoire cache de mise jour, utilisez une clause WHERE. Dans la clause WHERE, utilisez un paramtre pour un ou plusieurs champs afin didentifier de manire unique lenregistrement dans la table de base correspondant celui figurant dans la mmoire cache de mise jour. Si les paramtres sont nomms comme les champs et prcds du prfixe OLD_, ils reoivent automatiquement les valeurs des champs correpondants de lenregistrement figurant dans la mmoire cache de mise jour. Si les paramtres sont nomms dune autre faon, vous devez fournir les valeurs de paramtre.
DELETE FROM Inventory I WHERE (I.ItemNo = :OLD_ItemNo)

Utilisation du moteur de bases de donnes Borland

20-49

Utilisation du BDE pour placer en mmoire cache les mises jour

Certains types de tables peuvent tre incapables de trouver lenregistrement dans la table de base quand les champs utiliss pour identifier lenregistrement contiennent des valeurs NULL. Dans ces cas, la mise jour par suppression choue pour ces enregistrements. Pour prendre cela en compte, ajoutez une condition pour les champs pouvant contenir une valeur NULL, laide du prdicat IS NULL (en plus dune condition pour une valeur non NULL). Par exemple, si le champ FirstName peut contenir une valeur NULL :
DELETE FROM Names WHERE (LastName = :OLD_LastName) AND ((FirstName = :OLD_FirstName) OR (FirstName IS NULL))

Linstruction InsertSQL ne doit contenir quune instruction SQL avec la commande INSERT. La table de base mettre jour doit tre nomme dans la clause INTO. Dans la clause VALUES, fournissez une liste de paramtres spars par des vigules. Si les paramtres sont nomms comme les champs, ils reoivent automatiquement les valeurs des champs correspondants de lenregistrement figurant dans la mmoire cache de mise jour. Si les paramtres sont nomms dune autre faon, vous devez fournir les valeurs de paramtres. La liste de paramtres fournit les valeurs des champs du nouvel enregistrement insr. Il doit y avoir autant de paramtres de valeur que de champs lists dans linstruction.
INSERT INTO Inventory (ItemNo, Amount) VALUES (:ItemNo, 0)

Linstruction ModifySQL ne doit contenir quune instruction SQL avec la commande UPDATE. La table de base mettre jour doit tre nomme dans la clause FROM. Incluez une ou plusieurs affectations de valeur dans la clause SET. Si les valeurs des affectations de la clause SET sont des paramtres nomms comme les champs, les paramtres reoivent automatiquement les valeurs des champs correspondants de lenregistrement mis jour figurant dans la mmoire cache. Vous pouvez affecter dautres valeurs de champ en utilisant dautres paramtres, tant que les paramtres ne portent pas le nom de champs existants et que vous fournissiez les valeurs. Comme avec linstruction DeleteSQL, fournissez une clause WHERE pour identifier de manire unique lenregistrement de la table de base mettre jour, en utilisant des paramtres nomms comme les champs et prcds du prfixe OLD_. Dans linstruction de mise jour cidessous, le paramtre :ItemNo reoit automatiquement une valeur, contrairement :Price.
UPDATE Inventory I SET I.ItemNo = :ItemNo, Amount = :Price WHERE (I.ItemNo = :OLD_ItemNo)

Considrant le code SQL de mise jour ci-dessus, prenons un exemple o lutilisateur final de lapplication modifie un enregistrement existant. La valeur dorigine du champ ItemNo est 999. Dans une grille connecte lensemble de donnes en mmoire cache, lutilisateur final modifie la valeur du champ ItemNo en 123, et celle du champ Amount en 20. Quand la mthode ApplyUpdates est invoqu e, cette instruction SQL affecte tous les enregistrements de la table de base dont le champ ItemNo a pour valeur 999, en utilisant lancienne valeur

20-50

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

contenue dans le paramtre :OLD_ItemNo. Dans ces enregistrements, linstruction modifie la valeur du champ ItemNo field en 123 (en utilisant le paramtre :ItemNo, la valeur provenant de la grille) et celle du champ Amount en 20.

Utilisation de plusieurs objets mise jour


Quand plusieurs tables de base rfrences dans lensemble de donnes de mise jour doivent tre mises jour, vous devez utiliser plusieurs objets mise jour, raison dun par table de base mise jour. Comme lobjet UpdateObject du composant ensemble de donnes ne permet dassocier quun seul objet mise jour lensemble de donnes, vous devez associer chaque objet mise jour un ensemble de donnes en affectant sa proprit DataSet le nom de lensemble de donnes.
Conseil

Quand vous utilisez plusieurs objets mise jour, vous pouvez utiliser TBDEClientDataSet au lieu de TClientDataSet avec un fournisseur externe. La raison est quil nest pas ncessaire de dfinir la proprit UpdateObject de lensemble de donnes source. La proprit DataSet des objets mise jour nest pas disponible dans linspecteur dobjets la conception. Vous ne pouvez dfinir cette proprit qu lexcution.
UpdateSQL1.DataSet := Query1;

Lobjet mise jour utilise cet ensemble de donnes pour obtenir les valeurs de champs originales et modifies pour la substitution de paramtres et, sil sagit dun ensemble de donnes BDE, pour identifier la session et la base de donnes utiliser lors de lapplication des mises jour. Pour que la substitution de paramtres fonctionne correctement, la proprit DataSet de lobjet mise jour doit tre lensemble de donnes qui contient les valeurs de champs mises jour. Lors de lutilisation dun ensemble de donnes BDE pour mettre en mmoire cache les mises jour, il sagit de lensemble de donnes BDE lui-mme. Lors de lutilisation dun ensemble de donnes client, cest un ensemble de donnes client qui est fourni en paramtre au gestionnaire dvnement BeforeUpdateRecord . Quand lobjet mise jour na pas t affect la proprit UpdateObject de lensemble de donnes, ses instructions SQL ne sont pas automatiquement excutes quand vous appelez ApplyUpdates. Pour mettre jour les enregistrements, vous devez appeler manuellement lobjet mise jour depuis un gestionnaire dvnement OnUpdateRecord (si vous utilisez le BDE pour placer les mises jour en mmoire cache) ou BeforeUpdateRecord (si vous utilisez un ensemble de donnes client). Dans ce gestionnaire dvnement, vous devez au moins entreprendre les actions suivantes : Si vous utilisez un ensemble de donnes client pour placer les mises jour en mmoire cache, vous devez vous assurer que les proprits DatabaseName et SessionName des objets mise jour sont dfinies comme les proprits DatabaseName et SessionName de lensemble de donnes source. Le gestionnaire dvnement doit appeler la mthode ExecSQL ou Apply de lobjet mise jour. Cela invoque lobjet mise jour pour chaque enregistrement ncessitant une mise jour. Pour plus dinformations sur

Utilisation du moteur de bases de donnes Borland

20-51

Utilisation du BDE pour placer en mmoire cache les mises jour

lexcution des instructions de mise jour, voir Excution des instructions SQL ci-dessous. Affectez au paramtre UpdateAction du gestionnaire dvnement la valeur uaApplied (OnUpdateRecord) ou au paramtre Applied la valeur True (BeforeUpdateRecord). Si vous le dsirez, vous pouvez effectuer une validation ou une modification des donnes, ou dautres oprations qui dpendent de la mise jour de chaque enregistrement.
Attention

Si vous appelez la mthode ExecSQL ou Apply dun objet mise jour dans un gestionnaire dvnement OnUpdateRecord, assurez-vous de ne pas dfinir la proprit UpdateObject de lensemble de donnes cet objet mise jour. Sinon, le rsultat sera une seconde tentative dapplication de la mise jour de chaque enregistrement.

Excution des instructions SQL


Quand vous utilisez plusieurs objets mise jour, vous ne les associez pas un ensemble de donnes par sa proprit UpdateObject. En consquence, les instructions appropries ne sont pas automatiquement excutes quand vous appliquez les mises jour. A la place, vous devez invoquer explicitement lobjet mise jour dans le code. Il y a deux faons dinvoquer lobjet mise jour. Celle que vous choisissez varie selon que linstruction SQL utilise ou non des paramtres pour reprsenter les valeurs des champs: Si linstruction SQL excuter utilise des paramtres, appelez la mthode Apply. Si linstruction SQL excuter nutilise pas de paramtre, il vaut mieuxappeler la mthode ExecSQL.
Remarque

Si linstruction SQL utilise des paramtres autres que des types intgrs (pour les valeurs de champs originales et mises jour), vous devez fournir manuellement les valeurs de paramtres au lieu de vous appuyer sur la substitution de paramtre fournie par la mthode Apply. Consultez Utilisation de la proprit Query dun composant mise jour la page 20-54 pour plus dinformations sur la fourniture manuelle des valeurs de paramtres. Pour plus dinformations sur la substitution de paramtre par dfaut dans les instructions SQL de mise jour, voir Substitution de paramtres dans les instructions SQL de mise jour la page 20-48.

Appel de la mthode Apply


La mthode Apply dun composant mise jour applique manuellement les mises jour pour lenregistrement en cours. Le processus comprend deux tapes :

1 Les valeurs de champs initiale et modifie de lenregistrement sont lies aux paramtres de linstruction SQL appropri. 2 Linstruction SQL est excute.

20-52

Guide du dveloppeur

Utilisation du BDE pour placer en mmoire cache les mises jour

Appelez la mthode Apply pour appliquer la mise jour de lenregistrement en cours dans la mmoire cache de mise jour. Apply est souvent appele depuis un gestionnaire dvnement OnUpdateRecord de lensemble de donnes ou depuis un gestionnaire dvnement BeforeUpdateRecord dun fournisseur.
Attention

Si vous utilisez la proprit UpdateObject de lensemble de donnes pour associer ensemble de donnes et objet mise jour, Apply est appele automatiquement. Dans ce cas, nappelez pas Apply dans un gestionnaire dvnement OnUpdateRecord pour viter une seconde tentative dapplication de la mise jour de lenregistrement en cours. Les gestionnaires dvnements OnUpdateRecord indiquent le type de mise jour qui doit tre appliqu avec un paramtre UpdateKind de type TUpdateKind. Vous devez passer ce paramtre la mthode Apply pour indiquer linstruction SQL utiliser. Le code suivant illustre lutilisation dun gestionnaire dvnement BeforeUpdateRecord :
procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin with UpdateSQL1 do begin DataSet := DeltaDS; DatabaseName := (SourceDS as TDBDataSet).DatabaseName; SessionName := (SourceDS as TDBDataSet).SessionName; Apply(UpdateKind); Applied := True; end; end;

Appel de la mthode ExecSQL


La mthode ExecSQL dun composant mise jour applique manuellement les mises jour relatives lenregistrement en cours. A la diffrence de la mthode Apply, ExecSQL ne lie pas les paramtres dans linstruction SQL avant de lexcuter. La mthode ExecSQL est appele le plus souvent depuis un gestionnaire dvnement OnUpdateRecord (utilisation du BDE) ou BeforeUpdateRecord (utilisation dun ensemble de donnes client). Comme ExecSQL ne lie pas les valeurs de paramtres, elle est utilise principalement quand les instructions SQL de lobjet mise jour ne comprennent pas de paramtres. Vous pouvez utiliser la place Apply, mme sil ny a pas de paramtres, mais ExecSQL est plus efficace car elle ne vrifie pas les paramtres. Si les instructions SQL comprennent des paramtres, vous pouvez tout de mme appeler ExecSQL, mais seulement aprs avoir li explicitement les paramtres. Si vous utilisez le BDE pour mettre les mises jour en mmoire cache, vous pouvez lier explicitement les paramtres en dfinissant la proprit DataSet de lobjet mise jour, puis en appelant sa mthode SetParams. Si vous utilisez un ensemble de donnes client, vous devez fournir les paramtres lobjet requte sous-jacent maintenu par TUpdateSQL. Pour plus dinformations sur la faon de procder, voir Utilisation de la proprit Query dun composant mise jour la page 20-54.

Utilisation du moteur de bases de donnes Borland

20-53

Utilisation du BDE pour placer en mmoire cache les mises jour

Attention

Si vous utilisez la proprit UpdateObject de lensemble de donnes pour associer ensemble de donnes et objet mise jour, ExecSQL est appele automatiquement. Dans ce cas, nappelez pas ExecSQL dans un gestionnaire dvnement OnUpdateRecord ou BeforeUpdateRecord pour viter une seconde tentative dapplication de la mise jour de lenregistrement en cours. Les gestionnaires dvnements OnUpdateRecord et BeforeUpdateRecord indiquent le type de mise jour qui doit tre appliqu avec un paramtre UpdateKind de type TUpdateKind. Vous devez passer ce paramtre la mthode ExecSQL pour indiquer linstruction SQL utiliser. Le code suivant illustre ceci avec un gestionnaire dvnement BeforeUpdateRecord :
procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin with UpdateSQL1 do begin DatabaseName := (SourceDS as TDBDataSet).DatabaseName; SessionName := (SourceDS as TDBDataSet).SessionName; ExecSQL(UpdateKind); Applied := True; end; end;

Si une exception est dclenche durant lexcution du programme de mise jour, lexcution continue dans lvnement OnUpdateError, sil est dfini.

Utilisation de la proprit Query dun composant mise jour


La proprit Query dun composant mise jour fournit laccs aux composants requte qui implmentent ses instructions DeleteSQL, InsertSQL et ModifySQL. Dans la plupart des applications, il nest pas ncessaire daccder directement ces composants requtes : vous pouvez utiliser les proprits DeleteSQL, InsertSQL et ModifySQL pour spcifier les instructions que ces requ tes excutent, et les excuter en appelant la mthode Apply ou ExecSQL de lobjet mise jour. Il y a des cas, cependant, o vous pouvez avoir besoin de manipuler directement le composant requte. En particulier, la proprit Query est utile si vous voulez fournir vos propres valeurs aux paramtres des instructions SQL, plutt que de vous appuyer sur la liaison automatique de paramtres de lobjet mise jour aux anciennes et nouvelles valeurs de champs.
Remarque

La proprit Query nest accessible qu lexcution. La proprit Query est indexe sur une valeur TUpdateKind : Avec lindex ukModify, elle accde la requte qui met jour des enregistrements existants. Avec lindex ukInsert, elle accde la requte qui insre de nouveaux enregistrements. Avec lindex ukDelete, elle accde la requte qui supprime des enregistrements.

20-54

Guide du dveloppeur

Utilisation de TBatchMove

Lexemple suivant montre comment utiliser la proprit Query pour fournir des valeurs de paramtres qui ne peuvent tre lies automatiquement :
procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin UpdateSQL1.DataSet := DeltaDS; { requis pour la substitution de paramtres automatique } with UpdateSQL1.Query[UpdateKind] do begin { veillez que DatabaseName et SessionName sont corrects pour la requte } DatabaseName := (SourceDS as TDBDataSet).DatabaseName; SessionName := (SourceDS as TDBDataSet).SessionName; ParamByName('TimeOfUpdate').Value = Now; end; UpdateSQL1.Apply(UpdateKind); { effectue maintenant les substitutions automatiques } Applied := True; end;

Utilisation de TBatchMove
TBatchMove encapsule les fonctionnalits du moteur de bases de donnes (BDE) qui permettent de dupliquer un ensemble de donnes, dajouter un ensemble de donnes des enregistrements dun autre, de mettre jour des enregistrements dun ensemble de donnes avec ceux dun autre, et de supprimer dans un ensemble de donnes les enregistrements qui correspondent ceux dun autre ensemble de donnes. TBatchMove sert le plus souvent : Charger les donnes dun serveur dans une source de donnes locale afin de les analyser ou deffectuer dautres oprations. Transfrer, dans le cadre dune opration dupsizing, une base de donnes de bureau dans des tables stockes sur un serveur distant. Un composant action groupe peut crer sur la destination des tables correspondant aux tables source, en tablissant une correspondance automatique entre les noms de colonnes et les types de donnes.

Cration dun composant action groupe


Pour crer un composant action groupe :

1 Placez sur une fiche ou dans un module de donnes un composant table ou requte dun ensemble de donnes depuis lequel vous voulez importer des enregistrements (appel ensemble de donnes Source). 2 Placez sur une fiche ou dans un module de donnes lensemble de donnes dans lequel vous voulez dplacer les enregistrements (appel ensemble de donnes Destination). 3 Placez un composant TBatchMove depuis la page BDE de la palette des composants dans le module de donnes ou sur la fiche, et dfinissez sa proprit Name une valeur unique approprie votre application.

Utilisation du moteur de bases de donnes Borland

20-55

Utilisation de TBatchMove

4 Affectez la proprit Source du composant action groupe le nom de la table depuis laquelle copier, ajouter ou mettre jour des enregistrements. Vous pouvez slectionner les tables dans les listes droulantes des composants ensemble de donnes disponibles. 5 Affectez la proprit Destination le nom de lensemble de donnes crer, complter ou mettre jour. Vous pouvez slectionner une table de destination dans les listes droulantes des composants ensemble de donnes disponibles.
Si vous ajoutez, mettez jour ou supprimez des enregistrements, Destination doit reprsenter une table de base de donnes existante. Si vous copiez une table et si Destination reprsente une table existante, lexcution de laction groupe crase toutes les donnes en cours de la table de destination. Si vous crez une table entirement nouvelle en copiant une table existante, la table rsultante possde le nom spcifi dans la proprit Name du composant table vers lequel vous copiez les informations. Le type de la table obtenu prsente une structure approprie au serveur spcifi par la proprit DatabaseName.

6 Dfinissez la proprit Mode pour indiquer le type dopration effectuer. Les oprations possibles sont batAppend (valeur par dfaut), batUpdate, batAppendUpdate, batCopy et batDelete. Pour plus dinformations sur ces modes, voir Spcification dun mode daction groupe la page 20-57. 7 Facultativement, dfinissez la proprit Transliterate. Si la valeur de Transliterate est True (valeur par dfaut), les donnes caractre sont transcrites du jeu de caractres de lensemble de donnes Source vers celui de lensemble de donnes Destination, si ncessaire. 8 Facultativement, dfinissez une association entre les colonnes laide de la proprit Mappings. Il nest pas ncessaire de le faire si vous voulez que laction groupe associe chaque colonne en fonction de sa position dans les tables source et destination. Pour plus dinformations sur les correspondances de colonnes, voir Mappage des types de donnes la page 20-58. 9 Facultativement, dfinissez les proprits ChangedTableName, KeyViolTableName et ProblemTableName. Laction groupe stocke les enregistrements posant problme dans la table spcifie par ProblemTableName. Si vous mettez jour une table Paradox par une opration action groupe, les violations de cls seront signales dans la table spcifie par KeyViolTableName. ChangedTableName liste tous les enregistrements modifis dans la table destination lors de laction groupe. Si vous ne spcifiez pas ces proprits, les tables derreurs ne sont ni cres, ni utilises. Pour plus dinformations sur la gestion des erreurs relatives aux actions groupes, voir Gestion des erreurs relatives aux actions groupes la page 20-60.

20-56

Guide du dveloppeur

Utilisation de TBatchMove

Spcification dun mode daction groupe


La proprit Mode spcifie lopration ralise par un composant action groupe :
Tableau 20.8 Proprit
batAppend batUpdate

Modes relatifs aux actions groupes Signification


Ajoute les enregistrements la table destination. Met jour les enregistrements de la table destination avec les enregistrements correspondants de la table source. La mise jour est base sur lindex en cours dans la table destination. Si un enregistrement correspondant existe dans la table destination, une mise jour est effectue. Sinon, les enregistrements sont ajouts la table destination. Cre la table destination partir de la structure de la table source. Si la table destination existe dj, elle est supprime et recre. Supprime les enregistrements de la table destination ayant une correspondance dans la table source.

batAppendUpdate

batCopy batDelete

Ajout denregistrements
Pour ajouter des donnes, lensemble de donnes destination doit reprsenter une table existante. Durant lopration dajout, le BDE convertit si ncessaire les donnes des tailles et des types de donnes appropris lensemble de donnes destination. Si la conversion nest pas possible, une exception est dclenche et les donnes ne sont pas ajoutes.

Mise jour denregistrements


Pour mettre jour les donnes, lensemble de donnes destination doit reprsenter une table existante et avoir un index qui permet dtablir la correspondance entre les enregistrements. Si les champs de lindex primaire sont utiliss pour tablir les correspondances, les enregistrements pour lesquels des champs indexs dans lensemble de donnes destination correspondent des champs indexs dans lensemble de donnes source sont crass avec les donnes source. Si ncessaire, pendant lopration de mise jour, le BDE convertit les donnes des tailles et des types de donnes appropris lensemble de donnes destination.

Ajout et mise jour denregistrements


Pour ajouter et mettre jour des donnes, lensemble de donnes destination doit reprsenter une table existante et doit avoir un index qui permet dtablir la correspondance entre les enregistrements. Si les champs de lindex primaire sont utiliss pour tablir les correspondances, les enregistrements pour lesquels des champs indexs dans lensemble de donnes destination correspondent des champs indexs dans lensemble de donnes source sont crass avec les donnes source. Sinon, les donnes de lensemble de donnes source sont ajoutes lensemble de donnes destination. Durant les oprations dajout et de mise

Utilisation du moteur de bases de donnes Borland

20-57

Utilisation de TBatchMove

jour, le BDE convertit si ncessaire les donnes des tailles et des types de donnes appropris lensemble de donnes destination.

Copie densembles de donnes


Pour copier un ensemble de donnes source, lensemble de donnes destination ne doit pas reprsenter une table existante. Si cest le cas, lopration action groupe crase la table existante avec une copie de lensemble de donnes source. Si les ensembles de donnes source et destination sont grs par des moteurs de bases de donnes de types diffrents, par exemple Paradox et InterBase, le BDE cre un ensemble de donnes destination avec une structure aussi proche que possible de celle de lensemble de donnes source et effectue automatiquement les conversions de taille et de type de donnes en cas de besoin.
Remarque

TBatchMove ne copie pas les structures de mtadonnes, comme les index, les contraintes et les procdures stockes. Vous devez recrer ces objets mtadonnes sur votre serveur de bases de donnes ou utiliser lexplorateur SQL.

Suppression denregistrements
Pour supprimer des donnes dans lensemble de donnes destination, celui-ci doit reprsenter une table existante et doit avoir un index qui permet dtablir la correspondance entre les enregistrements. Si les champs de lindex primaire sont utiliss pour tablir les correspondances, les enregistrements pour lesquels des champs indexs dans lensemble de donnes destination correspondent des champs indexs dans lensemble de donnes source sont supprims dans la table destination.

Mappage des types de donnes


En mode batAppend, un composant action groupe cre la table destination partir des types de donnes des colonnes de la table source. Les colonnes et les types de donnes sont mapps partir de leur position dans les tables source et destination. Ainsi, la premire colonne de la source est mappe avec la premire colonne de la destination et ainsi de suite. Pour outrepasser le mappage par dfaut des colonnes, utilisez la proprit Mappings. Mappings est une liste de mappages de colonnes (un par ligne). Cette liste peut prendre deux formes. Pour mapper une colonne de la table source sur une colonne de mme nom dans la table destination, vous pouvez utiliser une liste simple qui spcifie le nom de colonne faire correspondre. Par exemple, le mappage suivant spcifie quune colonne nomme ColName de la table source doit tre mappe sur une colonne de mme nom dans la table destination :
ColName

Pour mapper une colonne nomme SourceColName de la table source sur une colonne nomme DestColName dans la table destination, la syntaxe est la suivante :
DestColName = SourceColName

20-58

Guide du dveloppeur

Utilisation de TBatchMove

Si les types de donnes des colonnes source et destination ne sont pas les mmes, lopration action groupe tente de les traduire au mieux. Elle tronque les types de donnes caractre, si ncessaire, et essaie deffectuer une conversion limite, si possible. Par exemple, mapper une colonne CHAR(10) sur une colonne CHAR(5) perd les cinq derniers caractres de la colonne source. A titre dexemple de conversion, si une colonne source de type caractre est mappe sur une colonne de type entier, lopration action groupe convertit une valeur caractre 5 la valeur entire 5 correspondante. Les valeurs qui ne peuvent pas tre converties gnrent des erreurs. Pour plus dinformations sur les erreurs, voir Gestion des erreurs relatives aux actions groupes la page 20-60. Lorsque vous dplacez des donnes entre des tables de types diffrents, un composant action groupe traduit les types de donnes conformment aux types de serveurs de lensemble de donnes. Consultez laide en ligne du BDE pour obtenir les dernires tables de mappage entre types de serveurs.
Remarque

Pour excuter une action groupe sur des donnes en direction dune base de donnes sur un serveur SQL, vous devez avoir install ce serveur de bases de donnes et une version de Delphi proposant le pilote SQL Link appropri, ou utiliser ODBC si les pilotes ODBC adquats des tiers sont installs.

Excution dune action groupe


Utilisez la mthode Execute pour excuter une opration group e pralablement prpare lexcution. Par exemple, si BatchMoveAdd est le nom dun composant action groupe, linstruction suivante lexcute :
BatchMoveAdd.Execute;

Vous pouvez aussi excuter une action group e la conception en effectuant un clic droit sur un composant action groupe et en choisissant Excuter dans le menu contextuel. La proprit MovedCount garde en mmoire le nombre denregistrements dplacs lors de lexcution dune action groupe. La proprit RecordCount spcifie le nombre maximal denregistrements dplacer. Si RecordCount est zro, tous les enregistrements sont dplacs, en commenant par le premier enregistrement de lensemble de donnes source. Si RecordCount est un nombre positif, un maximum de RecordCount enregistrements est dplac, en commenant par lenregistrement en cours de lensemble de donnes source. Si RecordCount est suprieur au nombre denregistrements situ s entre lenregistrement en cours et le dernier enregistrement, lopration se termine lorsque la fin de lensemble de donnes source est atteinte. Vous pouvez examiner MoveCount pour dterminer combien denregistrements ont t effectivement transfrs.

Utilisation du moteur de bases de donnes Borland

20-59

Dictionnaire de donnes

Gestion des erreurs relatives aux actions groupes


Deux types derreurs peuvent survenir dans une opration action groupe : les erreurs de conversion de type de donnes et les violations dintgrit. TBatchMove possde plusieurs proprits indiquant comment ces erreurs doivent tre traites. La proprit AbortOnProblem spcifie sil faut arrter lopration quand une erreur de conversion de type de donnes survient. Si AbortOnProblem est True, lopration est annule si une erreur survient. Si elle est False, lopration continue. Vous pouvez examiner la table spcifie dans la proprit ProblemTableName pour dterminer les enregistrements ayant pos problme. La proprit AbortOnKeyViol indique sil faut arrter lopration quand une violation de cl Paradox survient. La proprit ProblemCount indique le nombre denregistrements qui nont pas pu tre grs dans la table destination sans perte de donnes. Si AbortOnProblem est True, ce nombre vaut 1, puisque lopration est arrte quand une erreur survient. Les proprits suivantes permettent un composant action groupe de crer des tables supplmentaires documentant lopration effectue : ChangedTableName, si spcifie, cre une table Paradox locale contenant tous les enregistrements de la table destination qui ont t modifis suite des oprations impliquant une suppression ou des mises jour. KeyViolTableName, si spcifie, cre une table Paradox locale contenant tous les enregistrements de la table source ayant gnr une violation de cl lors de la manipulation dune table Paradox. Si AbortOnKeyViol est True, cette table contiendra au plus une entre, puisque lopration est arrte au premier problme rencontr. ProblemTableName, si spcifie, cre une table Paradox locale contenant tous les enregistrements nayant pu tre valids dans la table destination cause derreurs de conversion de type de donnes. Par exemple, la table pourrait contenir les enregistrements de la table source dont les donnes ont du tre tronques pour tenir dans la table destination. Si AbortOnKeyViol est True, cette table contiendra au plus un enregistrement puisque lopration est arrte au premier problme rencontr.
Remarque

Si ProblemTableName nest pas spcifie, les donnes de lenregistrement sont tronques et places dans la table destination.

Dictionnaire de donnes
Quand vous utilisez le BDE pour accder aux donnes, votre application doit accder au dictionnaire de donnes. Celui-ci fournit une zone de stockage personnalisable, indpendante de vos applications, o vous pouvez crer des

20-60

Guide du dveloppeur

Dictionnaire de donnes

ensembles dattributs de champs tendus qui dcrivent le contenu et lapparence des donnes. Par exemple, si vous dveloppez frquemment des applications financires, vous pouvez crer des ensembles dattributs de champs spcialiss dcrivant diffrents formats daffichage montaire. Quand vous crez des ensembles de donnes pour votre application la conception, plutt que dutiliser linspecteur dobjets pour dfinir manuellement les champs montaires de chaque ensemble de donnes, vous pouvez associer ces champs un ensemble dattributs de champs tendus dans le dictionnaire de donnes. Lusage de ce dernier assure une apparence homogne des donnes dans et entre les applications que vous crez. En environnement client/serveur, le dictionnaire de donnes peut rsider sur un serveur distant pour un partage supplmentaire des informations. Pour apprendre comment crer des ensembles dattributs de champs tendus dans lditeur de champs la conception et comment les associer aux champs des ensembles de donnes de votre application, voir Cration des ensembles dattributs pour les composants champ la page 19-15. Pour plus dinformations sur la cration dun dictionnaire de donnes et sur les attributs de champs tendus avec les explorateurs SQL et de base de donnes, consultez leurs aides en ligne respectives. Une interface de programmation pour le dictionnaire de donnes est disponible dans lunitdrintf (situ dans le rpertoire lib). Cette interface fournit les mthodes suivantes :
Tableau 20.9 Routine
DictionaryActive DictionaryDeactivate IsNullID FindDatabaseID FindTableID FindFieldID FindAttrID GetAttrName GetAttrNames GetAttrID NewAttr UpdateAttr CreateField

Interface du dictionnaire de donnes Utilisation


Indique si le dictionnaire de donnes est actif. Dsactive le dictionnaire de donnes. Indique si un identificateur donn est un identificateur null. Renvoie lidentificateur dune base de donnes daprs son alias. Renvoie lidentificateur dune table de la base de donnes spcifie. Renvoie lidentificateur dun champ de la table spcifie. Renvoie lidentificateur dun ensemble dattributs nomm. Renvoie le nom dun ensemble dattributs daprs son identificateur. Excute un callback pour chaque ensemble dattributs du dictionnaire. Renvoie lidentificateur dun ensemble dattributs pour le champ spcifi. Cre un nouvel ensemble dattributs partir dun composant champ. Met jour un ensemble dattributs pour correspondre aux proprits dun champ. Cre un composant champ daprs des attributs stocks.

Utilisation du moteur de bases de donnes Borland

20-61

Outils de manipulation du BDE

Tableau 20.9 Routine


UpdateField AssociateAttr

Interface du dictionnaire de donnes (suite) Utilisation


Change les proprits dun champ pour quelles correspondent lensemble dattributs spcifi. Associe un ensemble dattributs un identificateur de champ donn. Supprime une association densemble dattributs pour un identificateur de champ. Renvoie la classe de contrle pour un identificateur dattribut spcifi. Renvoie un nom de table qualifi (par le nom de lutilisateur). Renvoie un nom de table qualifi (par le nom de lutilisateur). Indique si lensemble de donnes a des contraintes dans le dictionnaire. Met jour les contraintes importes dun ensemble de donnes. Applique un ensemble de donnes les contraintes et les paramtres en cours du dictionnaire.

UnassociateAttr GetControlClass QualifyTableName QualifyTableNameByName HasConstraints UpdateConstraints UpdateDataset

Outils de manipulation du BDE


Lun des avantages de lutilisation du BDE comme mcanisme daccs aux donnes est la force du support fourni avec Delphi. Ces utilitaires comprennent : Lexplorateur SQL et lexplorateur de base de donnes : Delphi est livr avec une de ces deux applications, selon la version que vous avez achete. Les deux explorateurs vous permettent : Dexaminer les structures et les tables des bases de donnes existantes. Lexplorateur SQL vous permet dexaminer et dinterroger les bases de donnes SQL distantes. De remplir les tables de donnes. De crer des ensembles dattributs de champs tendus dans le dictionnaire de donnes ou de les associer aux champs de votre application. De crer et de grer des alias BDE. Lexplorateur SQL vous permet aussi : De crer des objets SQL tels que des procdures stockes sur les serveurs de bases de donnes distants. Dafficher le texte reconstruit des objets SQL sur les serveurs de bases de donnes distants. De lancer des scripts SQL. Le moniteur SQL : Il vous permet de surveiller toutes les communications qui passent entre le serveur de base de donnes distant et le BDE. Vous pouvez filtrer les messages que vous surveillez, en vous limitant aux catgories qui

20-62

Guide du dveloppeur

Outils de manipulation du BDE

vous intressent. Le moniteur SQL est trs utile pour dboguer votre application. Lutilitaire dadministration BDE : Il vous permet dajouter de nouveaux pilotes de bases de donnes, de configurer les valeurs par dfaut des pilotes existants et de crer de nouveaux alias BDE. Le module base de donnes : Si vous utilisez des tables Paradox ou dBASE, ce module vous permet dafficher et dditer leurs donnes, de crer de nouvelles tables et de restructurer les tables existantes. Son emploi vous donne plus de contrle que les mthodes dun composant TTable (par exemple, il vous permet de spcifier des contrles de validit et les pilotes de langage). Il fournit le seul mcanisme de restructuration des tables Paradox et dBASE en dehors des appels directs lAPI du BDE.

Utilisation du moteur de bases de donnes Borland

20-63

20-64

Guide du dveloppeur

21
Chapitre 21

Chapitre

Utilisation des composants ADO

Les composants ADOExpress permettent daccder aux donnes par le biais du modle ADO. ADO (Microsoft ActiveX Data Objects) est un ensemble dobjets COM qui accdent aux donnes par le biais dun fournisseur OLE DB. Les composants ADOExpress Delphi encapsulent ces objets ADO dans larchitecture de base de donnes Delphi. La couche ADO dune application ADO comprend Microsoft ADO 2.1, un fournisseur OLE DB ou un pilote ODBC pour laccs au stockage de donnes, le logiciel client propre au systme de base de donnes utilis (dans le cas des bases de donnes SQL), un systme de base de donnes dorsal accessible lapplication (dans le cas des systmes de bases de donnes SQL) et une base de donnes. Tous ces lments doivent tre accessibles lapplication ADO pour que celle-ci soit totalement oprationnelle. Les objets ADO essentiels sont les objets Connection, Command et Recordset. Ces objets ADO sont encapsuls par les composants TADOConnection, TADOCommand et ensemble de donnes ADO. Le modle ADO comprend dautres objets utilitaires, comme les objets Field ou Properties, mais ils ne sont gnralement pas utiliss directement dans les applications Delphi et ne sont pas encapsuls par des composants ddis. Ce chapitre prsente les composants ADOExpress et les fonctionnalits uniques quils apportent larchitecture de base de donnes Delphi commune. Avant de dcouvrir les fonctionnalits propres aux composants ADOExpress, vous devez connatre les fonctionnalits communes des composants connexion de base de donnes et des ensembles de donnes dcrites dans les chapitres 17, Connexion aux bases de donnes et 18, Prsentation des ensembles de donnes.

Utilisation des composants ADO

21-1

Prsentation gnrale des composants ADO

Prsentation gnrale des composants ADO


La page ADO de la palette de composants hberge les composants ADOExpress. Ces composants permettent de se connecter un stockage de donnes ADO, dexcuter des commandes et dextraire des donnes de tables de bases de donnes utilisant le modle ADO. Ils requirent ADO version 2.1 (ou suprieure) sur lordinateur hte. De plus, il faut que le logiciel client pour le systme de bases de donnes cible (par exemple, Microsoft SQL Server) soit install ainsi quun pilote OLE DB ou ODBC spcifique ce systme de bases de donnes. La plupart des composants ADOExpress ont des homologues directs dans les composants disponibles pour dautres mcanismes daccs aux donnes : un composant connexion de base de donnes (TADOConnection) et diffrents types densembles de donnes. En outre, ADOExpress comprend TADOCommand, simple composant qui nest pas un ensemble de donnes mais qui reprsente une commande SQL excuter sur le stockage de donnes ADO. Le tableau suivant prsente les composants ADO.
Tableau 21.1 Composant
TADOConnection

Composants ADO Utilisation


Composant connexion de base de donnes qui tablit une connexion avec un stockage de donnes ADO ; des composants ensemble de donnes ou commande ADO peuvent partager cette connexion pour excuter des commandes, obtenir des donnes ou agir sur les mtadonnes. Ensemble de donnes de base utilis pour obtenir et transformer les donnes ; TADODataSet peut obtenir les donnes dune ou de plusieurs tables ; il peut se connecter directement un stockage de donnes ou utiliser un composant TADOConnection. Ensemble de donnes de type table utilis pour lobtention et la manipulation dun ensemble denregistrements produit par une seule table de base de donnes ; TADOTable peut se connecter directement un stockage de donnes ou utiliser un composant TADOConnection. Ensemble de donnes de type requte utilis pour lobtention et la manipulation dun ensemble denregistrements produit par une instruction SQL valide ; TADOQuery peut galement excuter des instructions SQL DDL (langage de dfinition de donnes). Il peut se connecter directement un stockage de donnes ou utiliser un composant TADOConnection. Ensemble de donnes de type procdure stocke utilis pour lexcution de procdures stockes ; TADOStoredProc excute des procdures stockes qui peuvent ou non extraire des donnes. Il peut se connecter directement un stockage de donnes ou utiliser un composant TADOConnection. Simple composant permettant dexcuter des commandes (des instructions SQL ne produisant pas densemble de rsultats) ; TADOCommand peut tre utilis avec un composant ensemble de donnes associ ou obtenir un ensemble de donnes dune table. Il peut se connecter directement un stockage de donnes ou utiliser un composant TADOConnection.

TADODataSet

TADOTable

TADOQuery

TADOStoredProc

TADOCommand

21-2

Guide du dveloppeur

Connexion des stockages de donnes ADO

Connexion des stockages de donnes ADO


Delphi utilisent Microsoft ActiveX Data Objects (ADO) 2.1 pour interagir avec un fournisseur OLE DB qui se connecte un stockage de donnes et accde ses donnes. Lun des lments quun stockage de donnes peut reprsenter est une base de donnes. Une application ADO nest oprationnelle que si ADO 2.1 est install sur lordinateur client. ADO et OLE DB sont fournis par Microsoft et installs avec Windows. Un fournisseur ADO reprsente lun des nombreux types daccs, allant des pilotes OLE DB natifs aux pilotes ODBC. Ces pilotes doivent tre installs sur lordinateur client. Les pilotes OLE DB des diffrents systmes de bases de donnes sont fournis par lditeur de bases de donnes ou par une tierce partie. Si lapplication utilise une base de donnes SQL, telle que Microsoft SQL Server ou Oracle, le logiciel client de ce systme de base de donnes doit galement tre install sur lordinateur client. Le logiciel client est fourni par lditeur de bases de donnes et install partir du CD-ROM (ou de la disquette) des systmes de bases de donnes. Pour connecter votre application au stockage de donnes, utilisez un composant connexion ADO ( TADOConnection). Configurez le composant connexion ADO afin quil utilise lun des fournisseurs ADO disponibles. Bien que TADOConnection ne soit pas obligatoirement requis, du fait que les composants ensemble de donnes et commande ADO peuvent directement tablir des connections par le biais de leur proprit ConnectionString, vous pouvez utiliser TADOConnection pour partager une connexion parmi plusieurs composants ADO. Cela permet de rduire la consommation des ressources et de crer des transactions qui englobent plusieurs ensembles de donnes. Comme les autres composants connexion de base de donnes, TADOConnection permet de raliser les tches suivantes : Contrles des connexions Contrle de la connexion au serveur Gestion des transactions Utilisation densembles de donnes associs Envoi de commandes au serveur Obtention de mtadonnes

Outre ces fonctionnalits communes tous les composants connexion de base de donnes, TADOConnection offre : Un large ventail doptions permettant doptimiser la connexion. La possibilit dafficher la liste des objets commande utilisant la connexion. Des vnements supplmentaires lors de la ralisation des tches courantes.

Connexion un stockage de donnes avec TADOConnection


Un ou plusieurs composants commande et ensemble de donnes ADO peuvent utiliser une mme connexion un stockage de donnes grce TADOConnection . Pour ce faire, associez les composants ensemble de donnes et commande au

Utilisation des composants ADO

21-3

Connexion des stockages de donnes ADO

composant connexion via leur proprit Connection. A la conception, slectionnez le composant connexion souhait dans la liste droulante affiche par la proprit Connection dans linspecteur dobjet. A lexcution, affectez la rfrence la proprit Connection. Par exemple, la ligne suivante associe un composant TADODataSet un composant TADOConnection.
ADODataSet1.Connection := ADOConnection1;

Le composant connexion reprsente un objet connexion ADO. Avant dutiliser lobjet connexion pour tablir une connexion, vous devez identifier le stockage de donnes auquel vous souhaitez vous connecter. Gnralement, vous fournissez ces informations par le biais de la proprit ConnectionString. ConnectionString est une chane contenant un ou plusieurs paramtres de connexion nomms spars par des points-virgules. Ces paramtres identifient le stockage de donnes en spcifiant le nom dun fichier qui contient les informations de connection ou le nom dun fournisseur ADO et une rfrence qui dsigne le stockage de donnes. Utilisez les noms de paramtres prdfinis suivants pour fournir ces informations :
Tableau 21.2 Param tre
Provider Data Source File name Remote Provider Remote Server

Modes de connexion ADO Description


Le nom dun fournisseur ADO local utiliser pour la connexion. Le nom du stockage de donnes. Le nom dun fichier contenant les informations de connexion. Le nom dun fournisseur ADO qui rside sur une machine distante. Le nom du serveur distant lors de lutilisation dun fournisseur distant.

Ainsi, une valeur classique de ConnectionString a la forme


Provider=MSDASQL.1;Data Source=MQIS Remarque

Il nest pas ncessaire que les paramtres de connexion de ConnectionString incluent le paramtre Provider ou Remote Provider si vous spcifiez un fournisseur ADO laide de la proprit Provider. De mme, vous navez pas besoin de spcifier le paramtre Data Source si vous utilisez la proprit DefaultDatabase. Outre les paramtres ci-dessus, ConnectionString peut comprendre tous les paramtres de connexion propres au fournisseur ADO spcifique que vous utilisez. Ces paramtres de connexion supplmentaires peuvent comprendre lID et le mot de passe utilisateur si vous souhaitez coder en dur les informations de connexion. A la conception, vous pouvez utiliser lditeur de chane de connexion pour construire la chane de connexion en slectionnant dans des listes les lments de connexion (comme le fournisseur ou le serveur). Cliquez sur le bouton points de suspension de la proprit ConnectionString dans linspecteur dobjets pour lancer lditeur de chane de connexion, qui est un diteur de proprit ActiveX fourni par ADO. Aprs avoir spcifi la proprit ConnectionString (et, ventuellement, la proprit Provider), vous pouvez utiliser le composant connexion ADO pour tablir la connexion ou rompre la connexion au stockage de donnes ADO, moins que

21-4

Guide du dveloppeur

Connexion des stockages de donnes ADO

vous ne souhaitiez au pralable utiliser les autres proprits pour optimiser la connexion. Lorsque vous tablissez ou rompez la connexion au stockage de donnes, TADOConnection vous permet de rpondre quelques vnements supplmentaires, outre ceux communs tous les composants connexion de base de donnes. Ces vnements supplmentaires sont dcrits dans Evnements se produisant pendant ltablissement dune connexion la page 21-8 et Evnements se produisant pendant la dconnexion la page 21-9.
Remarque

Si vous nactivez pas explicitement la connexion en affectant la valeur True la proprit Connected du composant connexion, la connexion est automatiquement tablie quand le premier composant ensemble de donnes est ouvert ou la premire fois que vous utilisez un composant commande ADO pour excuter une commande.

Accs lobjet connexion


Utilisez la proprit ConnectionObject de TADOConnection pour accder lobjet connexion ADO sous-jacent. En utilisant cette rfrence, vous pouvez accder aux proprits et appeler les mthodes de lobjet ADO Connection sous-jacent. Lutilisation de lobjet Connection ADO sous-jacent ncessite une bonne connaissance pratique des objets ADO en gnral et de lobjet Connection ADO en particulier. Il nest pas conseill dutiliser lobjet Connection moins dtre familier des oprations sur les objets connexion. Reportez-vous laide du SDK Microsoft Data Access pour des informations spcifiques sur lutilisation des objets Connection ADO.

Optimisation dune connexion


Lutilisation de TADOConnection pour tablir la connexion un stockage de donnes, au lieu de fournir simplement une chane de connexion pour les composants commande et ensemble de donnes ADO, prsente lavantage de procurer un contrle accru des conditions et attributs de la connexion.

Connexions asynchrones
Utilisez la proprit ConnectOptions pour que la connexion soit asynchrone. Lutilisation de connexions asynchrones permet votre application de poursuivre son traitement sans attendre leur ouverture dfinitive. Par dfaut, ConnectionOptions a la valeur coConnectUnspecified qui laisse le serveur dcider du meilleur type de connexion. Pour imposer explicitement une connexion asynchrone, initialisez ConnectOptions coAsyncConnect. Les deux exemples de code suivants active et dsactive des connexions asynchrones dans le composant connexion spcifi :
procedure TForm1.AsyncConnectButtonClick(Sender: TObject); begin with ADOConnection1 do begin Close; ConnectOptions := coAsyncConnect; Open;

Utilisation des composants ADO

21-5

Connexion des stockages de donnes ADO

end; end; procedure TForm1.ServerChoiceConnectButtonClick(Sender: TObject); begin with ADOConnection1 do begin Close; ConnectOptions := coConnectUnspecified; Open; end; end;

Contrle des dpassements de dlais


Vous pouvez contrler la dure scoulant avant que les commandes ou les connexions tentes soient considres comme ayant chou et arrtes avec les proprits ConnectionTimeout et CommandTimeout. ConnectionTimeout spcifie la dure, en seconde, scoulant avant le dpassement de dlai pour tablir la connexion avec un stockage de donnes. Si la connexion nest pas correctement tablie avant lexpiration du dlai spcifi dans ConnectionTimeout, la tentative de connexion est abandonne :
with ADOConnection1 do begin ConnectionTimeout := 10 {seconds}; Open; end;

CommandTimeout spcifie la dure, en seconde, scoulant avant le dpassement de dlai pour une commande. Si la commande dmarre par un appel de la mthode Execute nest pas acheve avant lexpiration du dlai spcifi par CommandTimeout, la commande est annule et ADO gnre une exception.
with ADOConnection1 do begin CommandTimeout = 10 {secondes}; Execute(DROP TABLE Employee1997, cmdText, []); end;

Indication des types doprations pris en charge par la connexion


Les connexions ADO sont tablies laide dun mode spcifique, similaire au mode que vous utilisez lorsque vous ouvrez un fichier. Le mode de connexion dtermine les permissions disponibles pour la connexion et, par l-mme, les types doprations (telles que la lecture et lcriture) ralisables avec cette connexion. Utilisez la proprit Mode pour indiquer le mode de connexion. Les valeurs possibles sont indiques dans le tableau suivant :
Tableau 21.3
cmUnknown cmRead

Modes de connexion ADO Signification


Les permissions ne sont pas encore dfinies pour la connexion ou ne peuvent tre dtermines. Des permissions en lecture seule sont accessibles pour la connexion.

Mode de connexion

21-6

Guide du dveloppeur

Connexion des stockages de donnes ADO

Tableau 21.3
cmWrite cmReadWrite

Modes de connexion ADO (suite) Signification


Des permissions en criture seule sont accessibles pour la connexion. Des permissions en lecture/criture sont accessibles pour la connexion. Empche les autres utilisateurs douvrir des connexions avec des droits en lecture. Empche les autres utilisateurs douvrir des connexions avec des droits en criture. Empche les autres utilisateurs douvrir des connexions. Empche les autres utilisateurs douvrir des connexions avec nimporte quelle permission.

Mode de connexion

cmShareDenyRead cmShareDenyWrite cmShareExclusive cmShareDenyNone

Les valeurs possibles pour Mode correspondent aux valeurs ConnectModeEnum de la proprit Mode sur lobjet connexion ADO sous-jacent. Consultez laide SDK daccs aux donnes de Microsoft pour plus dinformations sur ces valeurs.

Spcification de lexcution automatique des transactions par la connexion


Utilisez la proprit Attributes pour contrler lutilisation par le composant de la conservation de la validation ou de lannulation. Lorsque le composant connexion utilise la conservation des validations, chaque fois que votre application valide une transaction, une nouvelle transaction est automatiquement dmarre. Lorsque le composant connexion utilise la conservation des annulations, chaque fois que votre application annule une transaction, une nouvelle transaction est automatiquement dmarre. Attributes est un ensemble qui peut contenir aucune, lune et/ou lautre des constantes xaCommitRetaining et xaAbortRetaining. Lorsque Attributes contient xaCommitRetaining, la connexion utilise la conservation des validations. Lorsque Attributes contient xaAbortRetaining, elle utilise la conservation des annulations. Pour tester si lune ou lautre de ces caractristiques est dj dfinie, utilisez loprateur in. Activez la conservation des validations ou des annulations en ajoutant la valeur approprie la proprit Attributes ou retirez-les en soustrayant la valeur. Les exemples de code suivant active et dsactive, respectivement, la conservation des validations dans un composant connexion ADO.
procedure TForm1.RetainingCommitsOnButtonClick(Sender: TObject); begin with ADOConnection1 do begin Close; if not (xaCommitRetaining in Attributes) then Attributes := (Attributes + [xaCommitRetaining]) Open; end; end; procedure TForm1.RetainingCommitsOffButtonClick(Sender: TObject); begin with ADOConnection1 do begin Close;

Utilisation des composants ADO

21-7

Connexion des stockages de donnes ADO

if (xaCommitRetaining in Attributes) then Attributes := (Attributes - [xaCommitRetaining]); Open; end; end;

Accs aux commandes dune connexion


Comme avec les autres composants connexion de base de donnes, vous pouvez accder aux ensembles de donnes associs la connexion, laide des proprits DataSets et DataSetCount. Toutefois, ADOExpress comprend galement des objets TADOCommand, qui ne sont pas des ensembles de donnes, mais qui grent une relation similaire avec le composant connexion. Vous pouvez utiliser les proprits Commands et CommandCount de TADOConnection pour accder aux objets commande ADO associs de la mme manire que les proprits DataSets et DataSetCount pour accder aux ensembles de donnes associs. A la diffrence de DataSets et DataSetCount, qui ne prsentent que des ensembles de donnes actifs, Commands et CommandCount fournissent des rfrences tous les composants TADOCommand associs au composant connexion. Commands est un tableau dindice de base zro de rfrences des composants commande ADO. CommandCount fournit le dcompte de toutes les commandes rpertories dans Commands. Vous pouvez utiliser ces proprits conjointement pour parcourir toutes les commandes qui utilisent un composant connexion, comme lillustre le code suivant :
var i: Integer begin for i := 0 to (ADOConnection1.CommandCount - 1) do ADOConnection1.Commands[i].Execute; end;

Evnements connexion ADO


Outre les vnements habituels qui se produisent pour tous les composants connexion de base de donnes, TADOConnection gnre une srie dvnements supplmentaires qui interviennent pendant le droulement normal des oprations.

Evnements se produisant pendant ltablissement dune connexion


Outre les vnements BeforeConnect et AfterConnect, communs tous les composants connexion de base de donnes, TADOConnection gnre les vnements OnWillConnect et OnConnectComplete lors de ltablissement dune connexion. Ces vnements se produisent aprs lvnement BeforeConnect. OnWillConnect se produit avant que le fournisseur ADO ntablisse une connexion. Il vous permet dapporter des modifications de dernire minute

21-8

Guide du dveloppeur

Connexion des stockages de donnes ADO

la chane de connexion, de fournir un nom et un mot de passe utilisateur si vous grez votre propre support de connexion (login), dimposer une connexion asynchrone ou mme dannuler la connexion avant son ouverture. OnConnectComplete se produit aprs louverture de la connexion. Etant donn que TADOConnection peut reprsenter des connexions asynchrones, vous devez utiliser OnConnectComplete, qui se produit aprs louverture de la connexion ou son chec en raison dune condition derreur, au lieu de lvnement AfterConnect, qui se produit lorsque le composant connexion indique au fournisseur ADO douvrir une connexion mais pas ncessairement aprs louverture de la connexion.

Evnements se produisant pendant la dconnexion


Outre les vnements BeforeDisconnect et AfterDisconnect, communs tous les composants connexion de base de donnes, TADOConnection gnre un vnement OnDisconnect aprs la fermeture dune connexion. OnDisconnect se produit aprs la fermeture de la connexion mais avant celle de tout ensemble de donnes associ et avant lvnement AfterDisconnect.

Evnements se produisant pendant la gestion des transactions


Les composants de connexion ADO proposent plusieurs vnements pour grer le cours dun processus de transaction. Ces vnements indiquent quel moment un processus de transaction dmarr par une mthode BeginTrans, CommitTrans et RollbackTrans a t correctement excut sur le stockage de donnes. Lvnement OnBeginTransComplete se produit lorsque le stockage de donnes a correctement dmarr une transaction aprs un appel de la mthode BeginTrans. Lvnement OnCommitTransComplete se produit aprs la validation russie dune transaction la suite de lappel de CommitTrans. Lvnement OnRollbackTransComplete se produit aprs lannulation russie dune transaction la suite de lappel de RollbackTrans.

Autres vnements
Les composants connexion ADO introduisent deux vnements supplmentaires qui permettent de rpondre aux notifications provenant de lobjet connexion ADO sous-jacent : Lvnement OnExecuteComplete se produit aprs que le composant connexion excute une commande sur le stockage de donnes (par exemple, aprs lappel de la mthode Execute). OnExecuteComplete indique si lexcution a russi. Lvnement OnInfoMessage se produit lorsque lobjet connexion sous-jacent fournit des informations dtailles aprs lexcution dune opration. Le gestionnaire dvnement OnInfoMessage reoit linterface dun objet Error ADO qui contient les informations dtailles et un code dtat indiquant si lopration a russi.

Utilisation des composants ADO

21-9

Utilisation des ensembles de donnes ADO

Utilisation des ensembles de donnes ADO


Les composants ensemble de donnes ADO encapsulent lobjet Recordset ADO. Ils hritent des fonctionnalits densemble de donnes communes dcrites dans le chapitre 18, Prsentation des ensembles de donnes, et utilisent ADO pour fournir limplmentation. Lutilisation dun ensemble de donnes ADO suppose la connaissance de ces fonctionnalits communes. Outre les fonctionnalits densemble de donnes communes, tous les ensembles de donnes ADO ajoutent des proprits, des vnements et des mthodes pour effectuer les oprations suivantes : Connexion un stockage de donnes ADO. Accs lobjet Recordset sous-jacent. Filtrage denregistrements partir de signets. Lecture denregistrements de faon asynchrone. Ralisation de mises jour groupes (placement des mises jour en mmoire cache). Utilisation de fichiers sur disque pour stocker les donnes. Il existe quatre ensembles de donnes ADO : TADOTable, ensemble de donnes de type table qui reprsente toutes les lignes et colonnes dune seule table de base de donnes. Voir Utilisation densembles de donnes de type table la page 18-29, pour plus dinformations sur lutilisation de TADOTable et des autres ensembles de donnes de type table. TADOQuery, ensemble de donnes de type requte qui encapsule une instruction SQL et permet aux applications daccder aux enregistrements ventuellement obtenus. Voir Utilisation densembles de donnes de type requte la page 18-49, pour plus dinformations sur lutilisation de TADOQuery et des autres ensembles de donnes de type requ te. TADOStoredProc, ensemble de donnes de type procdure stocke qui excute une procdure stocke dfinie sur un serveur de bases de donnes. Voir Utilisation densembles de donnes de type procdure stocke la page 18-58, pour plus dinformations sur lutilisation de TADOStoredProc et des autres ensembles de donnes de type procdure stocke. TADODataSet , ensemble de donnes polyvalent qui comprend les fonctionnalits des trois autres types. Voir Utilisation de TADODataSet la page 21-17, pour une description des fonctionnalits propres TADODataSet.
Remarque

Lorsque vous utilisez ADO pour accder aux informations de bases de donnes, vous navez pas besoin de recourir un ensemble de donnes tel que TADOQuery pour reprsenter les commandes SQL qui ne renvoient pas de curseur. Par contre, vous pouvez utiliser TADOCommand, simple composant qui nest pas un ensemble de donnes. Pour plus dinformations sur TADOCommand, voir Utilisation dobjets commande la page 21-19.

21-10

Guide du dveloppeur

Utilisation des ensembles de donnes ADO

Connexion dun ensemble de donnes ADO un stockage de donnes


Il est possible de connecter individuellement ou collectivement des ensembles de donnes ADO un stockage de donnes ADO. Lorsque vous connectez des ensembles de donnes collectivement, attribuez la proprit Connection de chaque ensemble de donnes un composant TADOConnection. Chaque ensemble de donnes utilise alors la connexion du composant connexion ADO.
ADODataSet1.Connection := ADOConnection1; ADODataSet2.Connection := ADOConnection1; ...

Cette manire de procder prsente, entre autres, les avantages suivants : Les ensembles de donnes partagent les attributs de lobjet connexion. Il ny a quune seule connexion configurer : celle de lobjet TADOConnection. Les ensembles de donnes peuvent participer des transactions. Pour plus dinformations sur lutilisation de TADOConnection, voir Connexion des stockages de donnes ADO la page 21-3. Lorsque vous connectez des ensembles de donnes individuellement, dfinissez la proprit ConnectionString de chaque ensemble de donnes. Chaque ensemble de donnes qui utilise ConnectionString tablit sa propre connexion avec le stockage de donnes, de manire indpendante des autres connexions densembles de donnes de lapplication. La proprit ConnectionString des ensembles de donnes ADO fonctionne de la mme faon que la proprit ConnectionString de TADOConnection ; il sagit dun ensemble de paramtres de connexion spars par des points-virgules, tels que celui-ci :
ADODataSet1.ConnectionString := Provider=VotreFournisseur;Password=MotDePasse; + User ID=JaneDoe;SERVER=PURGATORY;UID=JaneDoe;PWD=MotDePasse; + Initial Catalog=Employee;

A la conception, vous pouvez utiliser lditeur de chane de connexion pour concevoir la chane de connexion. Pour plus dinformations sur les chanes de connexion, voir Connexion un stockage de donnes avec TADOConnection la page 21-3.

Utilisation des ensembles denregistrements


La proprit Recordset donne un accs direct lobjet ensemble denregistrements ADO sous-jacent au composant ensemble de donnes. En utilisant cet objet, il est possible dans une application daccder aux proprits et dappeler les mthodes de lobjet ensemble denregistrements. Lutilisation de Recordset pour accder directement lobjet ensemble denregistrements ADO sous-jacent suppose une bonne connaissance des objets ADO en gnral et de lobjet ensemble denregistrements ADO en particulier. Lutilisation directe de lobjet ensemble denregistrements nest pas conseille moins dtre familiaris avec sa manipulation. Consultez laide du SDK Microsoft Data Access pour des informations spcifiques sur les objets ensemble denregistrements.

Utilisation des composants ADO

21-11

Utilisation des ensembles de donnes ADO

La proprit RecordsetState indique ltat en cours de lobjet ensemble denregistrements sous-jacent. RecordsetState correspond la proprit State de lobjet ensemble denregistrements ADO. RecordsetState a pour valeur stOpen, stExecuting ou stFetching. (TObjectState, qui est le type de la proprit RecordsetState, dfinit dautres valeurs, mais seuls stOpen, stExecuting et stFetching appartiennent aux ensembles denregistrements). La valeur stOpen indique que lensemble denregistrements est actuellement inactif. La valeur stExecuting indique quil est en train dexcuter une commande. La valeur stFetching indique quil est en train de lire des lignes dans les tables associes. Utilisez les valeurs RecordsetState quand vous effectuez des actions qui dpendent de ltat en cours de lensemble de donnes. Ainsi, une routine qui actualise les donnes peut tester la valeur de la proprit RecordsetState pour vrifier si lensemble de donnes est actif et nest pas en train de traiter dautres oprations ou de lire des donnes.

Filtrage denregistrements partir de signets


Les ensembles de donnes ADO prennent en charge la fonctionnalit densemble de donnes commune consistant utiliser des signets pour marquer et retrouver des enregistrements spcifiques. En outre, limage des autres ensembles de donnes, un ensemble de donnes ADO vous permet dutiliser des filtres pour limiter les enregistrements disponibles dans lensemble de donnes. Les ensembles de donnes ADO offrent une fonctionnalit supplmentaire qui combine ces deux fonctionnalits densemble de donnes communes : la possibilit de filtrer un ensemble denregistrements identifi par des signets. Pour filtrer un ensemble de signets,

1 Utilisez la mthode Bookmark pour marquer les enregistrements inclure dans lensemble de donnes filtr. 2 Appelez la mthode FilterOnBookmarks pour filtrer lensemble de donnes afin que seuls les enregistrements marqus dun signet apparaissent.
Ce processus est illustr ci-dessous :
procedure TForm1.Button1Click(Sender: TObject); var BM1, BM2: TBookmarkStr; begin with ADODataSet1 do begin BM1 := Bookmark; BMList.Add(Pointer(BM1)); MoveBy(3); BM2 := Bookmark; BMList.Add(Pointer(BM2)); FilterOnBookmarks([BM1, BM2]); end; end;

Notez que lexemple ci-dessus ajoute les signets un objet liste nomm BMList. Cela permettra lapplication de librer les signets lorsquils ne seront plus ncessaires.

21-12

Guide du dveloppeur

Utilisation des ensembles de donnes ADO

Pour plus dinformations sur lutilisation des signets, voir Marquage denregistrements la page 18-11. Pour des dtails sur les autres types de filtres, voir Affichage et dition densembles de donnes en utilisant des filtres la page 18-14.

Lecture denregistrements de faon asynchrone


A la diffrence des autres ensembles de donnes, les ensembles de donnes ADO peuvent lire leurs donnes de faon asynchrone. Cela permet votre application de poursuivre lexcution dautres tches pendant le remplissage de lensemble de donnes avec des donnes du stockage de donnes. Pour dterminer si lensemble de donnes lit les donnes de faon asynchrone, utilisez la proprit ExecuteOptions. ExecuteOptions rgit la lecture des enregistrements par lensemble de donnes lorsque vous appelez Open ou attribuez Active la valeur True. Si lensemble de donnes reprsente une requte ou procdure stocke qui ne renvoie pas denregistrements, ExecuteOptions dtermine la faon dont elle est excute lorsque vous appelez ExecSQL ou ExecProc. ExecuteOptions est un ensemble contenant aucune ou plusieurs des valeurs suivantes :
Tableau 21.4 Options dexcution des ensembles de donnes ADO Signification
La commande ou lopration de lecture de donnes est excute de faon asynchrone. Lensemble de donnes lit dabord le nombre denregistrements spcifi par la proprit CacheSize de faon synchrone, puis toutes les lignes restantes de faon asynchrone. Lexcution de la commande ou les lectures de donnes asynchrones ne bloquent pas le thread dexcution en cours. Une commande ou une procdure stocke qui ne renvoie pas de donnes. Si des lignes sont rcupres, elles ne sont pas prises en compte et rien nest renvoy.

Option dex cution


eoAsyncExecute eoAsyncFetch

eoAsyncFetchNonBlocking eoExecuteNoRecords

Utilisation des mises jour groupes


Une approche pour placer les mises jour en mmoire cache consiste connecter lensemble de donnes ADO un ensemble de donnes client laide dun fournisseur densemble de donnes. Cette approche est prsente dans Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18. Toutefois, les composants ensemble de donnes ADO prennent en charge les mises jour places en mmoire cache, appeles alors mises jour groupes. Le tableau suivant tablit une correspondance entre le placement des mises jour

Utilisation des composants ADO

21-13

Utilisation des ensembles de donnes ADO

en mmoire cache laide dun ensemble de donnes client et leur placement laide des fonctionnalits de mises jour groupes :
Tableau 21.5 Ensemble de donnes ADO
LockType

Comparaison des mises jour en mmoire cache dun ensemble de donnes client et ADO

TClientDataSet
Inutilis : les ensembles de donnes client placent toujours les mises jour en mmoire cache. Inutilis : les ensembles de donnes client manipulent toujours une photographie mmorise des donnes. UpdateStatus

Description
Spcifie si lensemble de donnes est ouvert en mode mise jour groupe.

CursorType

Spcifie le degr disolement de lensemble de donnes ADO par rapport aux modifications prsentes sur le serveur. Indique la mise jour qui a ventuellement affect la ligne en cours. RecordStatus fournit davantage dinformations que UpdateStatus. Spcifie les types denregistrements disponibles. FilterGroup fournit davantage dinformations. Applique les mises jour en mmoire cache au serveur de base de donnes. A la diffrence de ApplyUpdates, UpdateBatch permet de limiter les types de mises jour appliquer. Ne prend pas en compte les mises jour en attente et rtablit les valeurs initiales. A la diffrence de CancelUpdates, CancelBatch permet de limiter les types de mises jour annuler.

RecordStatus

FilterGroup UpdateBatch

StatusFilter ApplyUpdates

CancelBatch

CancelUpdates

Lutilisation des caractristiques de mises jour groupes des composants ensemble de donnes ADO fait intervenir : Ouverture de lensemble de donnes en mode mises jour groupes Examen du statut de mise jour ligne par ligne Filtrage de lignes en fonction du statut de mise jour Application des mises jour groupes dans les tables des bases Annulation des mises jour groupes

Ouverture de lensemble de donnes en mode mises jour groupes


Pour ouvrir un ensemble de donnes ADO en mode mises jour groupes, il doit respecter les critres suivants :

1 La proprit CursorType du composant doit avoir la valeur ctKeySet (valeur par dfaut de la proprit) ou ctStatic. 2 La proprit LockType doit avoir la valeur ltBatchOptimistic. 3 La commande doit tre une requte SELECT.
Avant dactiver le composant ensemble de donnes, initialisez les proprits CursorType et LockType comme indiqu ci-dessus. Affectez une instruction SELECT la proprit CommandText du composant (pour TADODataSet) ou la proprit SQL (pour TADOQuery). Pour les composants TADOStoredProc, affectez

21-14

Guide du dveloppeur

Utilisation des ensembles de donnes ADO

la proprit ProcedureName le nom dune procdure stocke qui renvoie un ensemble de rsultats. Ces proprits peuvent tre dfinies la conception en utilisant linspecteur dobjet ou par code lexcution. Lexemple suivant illustre la prparation dun composant TADODataSet en mode mises jour groupes.
with ADODataSet1 do begin CursorLocation := clUseClient; CursorType := ctStatic; LockType := ltBatchOptimistic; CommandType := cmdText; CommandText := SELECT * FROM Employee; Open; end;

Une fois lensemble de donnes ouvert en mode mises jour groupes, toutes les modifications des donnes sont places dans le cache au lieu dtre appliques directement aux tables de la base.

Examen du statut de mise jour ligne par ligne


Pour dterminer le statut de la mise jour pour une ligne donne, faites-en la ligne en cours puis inspectez la proprit RecordStatus du composant de donnes ADO. RecordStatus indique ltat de mise jour pour la ligne en cours et uniquement pour elle.
case ADOQuery1.RecordStatus of rsUnmodified: StatusBar1.Panels[0].Text rsModified: StatusBar1.Panels[0].Text rsDeleted: StatusBar1.Panels[0].Text rsNew: StatusBar1.Panels[0].Text end; := := := := Enregistrement Enregistrement Enregistrement Enregistrement non modifi; modifi; supprim; ajout;

Filtrage de lignes en fonction du statut de mise jour


Le filtrage dun ensemble denregistrements ne montre que les lignes qui appartiennent au groupe des lignes ayant le statut de mise jour avec la valeur spcifie par la proprit FilterGroup. Affectez FilterGroup les constantes de type TFilterGroup qui reprsentent le statut de mise jour des lignes afficher. La valeur fgNone (valeur par dfaut de cette proprit) spcifie une absence de filtrage et laffichage de toutes les lignes sans tenir compte du statut de mise jour (sauf les lignes marques pour effacement). Lexemple suivant naffiche que les lignes mises jour en attente.
FilterGroup := fgPendingRecords; Filtered := True; Remarque

Pour que la proprit FilterGroup prenne effet, la proprit Filtered du composant ensemble de donnes ADO doit avoir la valeur True.

Application des mises jour groupes dans les tables des bases
Pour appliquer les mises jour en attente qui nont pas dj t appliqu es ou annules, appelez la mthode UpdateBatch. Pour les lignes dont le contenu a chang et qui sont appliques, les modifications sont places dans les tables de base sur lesquelles lensemble denregistrement est bas. Une ligne du cache

Utilisation des composants ADO

21-15

Utilisation des ensembles de donnes ADO

marqu pour la suppression entrane la suppression de la ligne correspondante de la table de la base. Une insertion denregistrement (lenregistrement existe dans le cache mais pas dans la table de la base) est ajoute la table de la base. Pour les lignes modifies, les colonnes des lignes correspondantes des tables de la base sont modifies pour adopter les nouvelles valeurs de colonnes prsentes dans le cache. Utilise sans paramtre, la mthode UpdateBatch applique toutes les mises jour en attente. Il est possible de transmettre une valeur de type TAffectRecords comme paramtre de UpdateBatch. Si une valeur autre que arAll est transmise, seul un sous-ensemble des modifications en attente est appliqu. Le paramtre arAll a le mme effet que labsence de paramtre et provoque lapplication de toutes les mises jour en attente. Lexemple suivant napplique que la ligne en cours :
ADODataSet1.UpdateBatch(arCurrent);

Annulation des mises jour groupes


Pour annuler les mises jour en attente, appelez la mthode CancelBatch. Lorsque vous annulez des mises jour groupes en attente, les valeurs de champ des lignes modifies reviennent celles existant avant le dernier appel de CancelBatch ou de UpdateBatch, si lune de ces mthodes a dj t appele, ou avant le groupe de modifications en attente. Utilise sans paramtre, la mthode CancelBatch annule toutes les mises jour en attente. Il est possible de transmettre une valeur de type TAffectRecords comme paramtre de CancelBatch. Si une valeur autre que arAll est transmise, seul un sous-ensemble des modifications en attente est annul. Le paramtre arAll a le mme effet que labsence de paramtre et provoque lannulation de toutes les mises jour en attente. Lexemple suivant annule toutes les modifications en attente :
ADODataSet1.CancelBatch;

Lecture et enregistrement des donnes dans des fichiers


Les donnes obtenues dans un composant ensemble de donnes ADO peuvent tre enregistres dans un fichier pour une utilisation ultrieure dans le mme ordinateur ou dans un autre. Les donnes sont enregistres en utilisant un des deux formats propritaire proposs : ADTG ou XML. Ces deux formats de fichiers sont les seuls formats grs par ADO. Toutefois, ils ne sont pas ncessairement grs par toutes les versions de ADO. Consultez la documentation ADO pour connatre quels formats de fichiers grent la version en cours. Enregistrez les donnes dans un fichier en utilisant la mthode SaveToFile. SaveToFile accepte deux paramtres, le nom du fichier dans lequel les donnes sont enregistres, et, ventuellement, le format (ADTG ou XML) de sauvegarde des donnes. Indiquez le format du fichier enregistr en attribuant au paramtre Format la valeur pfADTG ou pfXML. Si le fichier sp cifi par le paramtre FileName existe dj, SaveToFile dclenche une exception EOleException.

21-16

Guide du dveloppeur

Utilisation des ensembles de donnes ADO

Rcuprez les donnes enregistres en utilisant la mthode LoadFromFile. LoadFromFile accepte un paramtre : le nom du fichier charger. Si le fichier spcifi nexiste pas, LoadFromFile dclenche une exception EOleException. Lors de lappel de la mthode LoadFromFile, le composant ensemble de donnes est automatiquement activ. Dans lexemple suivant, la premire procdure enregistre dans un fichier lensemble de donnes obtenu par le composant TADODataSet ADODataSet1. Le fichier destination est un fichier ADTG nomm SaveFile qui est cr sur un disque local. La seconde procdure charge ce fichier dans le composant TADODataSet ADODataSet2.
procedure TForm1.SaveBtnClick(Sender: TObject); begin if (FileExists(c:\SaveFile)) then begin DeleteFile(c:\SaveFile); StatusBar1.Panels[0].Text := Fichier sauvegarde supprim!; end; ADODataSet1.SaveToFile(c:\SaveFile, pfADTG); end; procedure TForm1.LoadBtnClick(Sender: TObject); begin if (FileExists(c:\SaveFile)) then ADODataSet2.LoadFromFile(c:\SaveFile) else StatusBar1.Panels[0].Text := Fichier sauvegarde inexistant!; end;

Il nest pas ncessaire que les ensembles de donnes qui effectuent la sauvegarde et la lecture des donnes figurent sur la mme fiche comme dans lexemple prcdent, ni dans la mme application ou sur la mme machine. Cela permet des transferts de donnes de style porte-documents dun ordinateur un autre.

Utilisation de TADODataSet
TADODataSet est un ensemble de donnes polyvalent qui permet de manipuler les donnes dun stockage de donnes ADO. A la diffrence des autres composants ensemble de donnes ADO, TADODataSet nest pas un ensemble de donnes de type table, de type requ te ou de type procdure stocke. Par contre, il peut fonctionner comme lun des types suivants : Comme un ensemble de donnes de type table, TADODataSet permet de reprsenter toutes les lignes et colonnes dune seule table de base de donnes. Pour lutiliser cet effet, attribuez la proprit CommandType la valeur cmdTable et la proprit CommandText le nom de la table. TADODataSet gre les tches de type table suivantes : Affectation dindex pour trier des enregistrements ou constituer la base de recherches partir denregistrements. Outre les proprits et mthodes dindex standard dcrites dans Tri des enregistrements avec des index la page 18-30, vous pouvez utiliser la proprit Sort de TADODataSet pour

Utilisation des composants ADO

21-17

Utilisation des ensembles de donnes ADO

effectuer des tris partir dindex temporaires. Les recherches bases sur les index effectues laide de la mthode Seek utilisent lindex en cours. vidage de lensemble de donnes. La mthode DeleteRecords offre davantage de contrle que les mthodes connexes des autres ensembles de donnes de type table car elle permet de spcifier les enregistrements supprimer. Les tches de type table gres par TADODataSet sont disponibles mme si CommandType na pas pour valeur cmdTable. Comme un ensemble de donnes de type requte, TADODataSet permet de spcifier une commande SQL unique excuter louverture de lensemble de donnes. Pour lutiliser cet effet, attribuez la proprit CommandType la valeur cmdText et la proprit CommandText la commande SQL excuter. A la conception, vous pouvez double-cliquer sur la proprit CommandText dans linspecteur dobjets pour utiliser lditeur de texte de commande afin dlaborer la commande SQL. TADODataSet gre les tches de type requte suivantes : Utilisation de paramtres dans le texte des requtes. Voir Utilisation de paramtres dans les requ tes la page 18-52, pour plus dinformations sur les paramtres de requte. Dfinition de relations matre/dtail laide de paramtres. Voir Etablissement de relations matre/dtail en utilisant des paramtres la page 18-55, pour plus dinformations sur ce sujet. Prparation de la requte afin damliorer les performances en attribuant la proprit Prepared la valeur True. Comme un ensemble de donnes de type procdure stocke, TADODataSet permet de spcifier une procdure stocke excuter louverture de lensemble de donnes. Pour lutiliser cet effet, attribuez la proprit CommandType la valeur cmdStoredProc et la proprit CommandText le nom de la procdure stocke. TADODataSet gre les tches de type procdure stocke suivantes : Utilisation de paramtres de procdure stocke. Voir Utilisation de paramtres avec les procdures stockes la page 18-59, pour plus dinformations sur les paramtres de procdure stocke. Lecture de plusieurs ensembles de rsultats. Voir Lecture de plusieurs ensembles de rsultats la page 18-64, pour plus dinformations sur ce sujet. Prparation de la procdure stocke afin damliorer les performances en attribuant la proprit Prepared la valeur True. En outre, TADODataSet vous permet dutiliser les donnes stockes dans un fichier en attribuant la proprit CommandType la valeur cmdFile et la proprit CommandText le nom du fichier. Avant de dfinir les proprits CommandText et CommandType, vous devez lier TADODataSet un stockage de donnes en dfinissant la proprit Connection ou ConnectionString. Ce processus est dcrit dans Connexion dun ensemble de

21-18

Guide du dveloppeur

Utilisation dobjets commande

donnes ADO un stockage de donnes la page 21-11. Vous pouvez aussi utiliser un objet DataSpace RDS pour connecter TADODataSet un serveur dapplications ADO. Pour ce faire, attribuez la proprit RDSConnection un objet TRDSConnection.

Utilisation dobjets commande


Dans lenvironnement ADO, les commandes sont une reprsentation sous forme de texte de demandes dactions spcifiques un fournisseur. Ce sont gnralement des instructions SQL utilisant le langage de dfinition de donnes (DDL) ou le langage de manipulation de donn es (DML). Le langage utilis dans ces commandes est spcifique au fournisseur, mais, gnralement, il respecte le standard SQL-92 du langage SQL. Bien que vous puissiez toujours excuter une commande laide de TADOQuery, il peut vous sembler opportun de ne pas utiliser un composant ensemble de donnes, notamment si la commande ne renvoie pas un ensemble de rsultats. Vous pouvez aussi utiliser le composant TADOCommand, objet lger permettant dexcuter une srie de commandes, raison dune commande la fois. TADOCommand est avant tout conu pour lexcution de commandes ne renvoyant pas densemble de rsultats, comme les instructions SQL du langage de dfinition de donnes (DDL). Cependant, il est capable via une version redfinie de sa mthode Execute de renvoyer un ensemble de rsultats qui peut tre affect la proprit RecordSet dun composant ensemble de donnes ADO. En gnral, lutilisation de TADOCommand est trs similaire celle de TADODataSet , la diffrence que vous ne pouvez pas utiliser les mthodes densemble de donnes standard pour lire les donnes, parcourir les enregistrements, modifier les donnes, etc. Les objets TADOCommand se connectent un stockage de donnes de la mme faon que les ensembles de donnes ADO. Voir Connexion dun ensemble de donnes ADO un stockage de donnes la page 21-11 pour plus de dtails. Les rubriques suivantes expliquent comment spcifier et excuter des commandes laide de TADOCommand.

Spcification de la commande
Spcifiez les commands dun composant TADOCommand laide de la proprit CommandText. Comme TADODataSet, TADOCommand vous permet de spcifier la commande de diffrentes manires, en fonction de la proprit CommandType. CommandType peut prendre les valeurs suivantes : cmdText (si la commande est une instruction SQL), cmdTable (si cest un nom de table) et cmdStoredProc (si la commande spcifie le nom dune procdure stocke). A la conception, slectionnez la valeur approprie dans la liste propose par linspecteur dobjet. A lexcution, affectez une valeur de type TCommandType la proprit CommandType.
with ADOCommand1 do begin

Utilisation des composants ADO

21-19

Utilisation dobjets commande

CommandText := AddEmployee; CommandType := cmdStoredProc; ... end;

Si le type spcifique nest pas indiqu, cest le serveur qui le dtermine en se basant sur la commande spcifie par CommandText. CommandText peut contenir le texte dune requte SQL qui comprend des paramtres ou le nom dune procdure stocke qui utilise des paramtres. Vous devez alors fournir les valeurs des paramtres, qui sont lies ceux-ci avant lexcution de la commande. Voir Gestion des paramtres de commande la page 21-21, pour plus de dtails.

Utilisation de la mthode Execute


Pour que TADOCommand puisse excuter sa commande, il doit tre correctement connect un stockage de donnes. Cette connexion est tablie de la mme faon quavec un ensemble de donnes ADO. Voir Connexion dun ensemble de donnes ADO un stockage de donnes la page 21-11, pour plus de dtails. Pour excuter la commande, appelez la mthode Execute. Execute est une mthode redfinie qui permet de choisir la faon la plus approprie pour excuter la commande. Dans le cas des commandes qui ne requirent aucun paramtre et dont le nombre denregistrements quelles affectent na aucune importance, appelez Execute sans dfinir de paramtres :
with ADOCommand1 do begin CommandText := UpdateInventory; CommandType := cmdStoredProc; Execute; end;

Les autres versions de Execute vous permettent de fournir des valeurs de paramtres laide dun tableau Variant et dobtenir le nombre denregistrements affects par la commande. Pour plus dinformations sur lexcution de commandes renvoyant un ensemble de rsultats, voir Rcupration densembles de rsultats laide de commandes la page 21-21.

Annulation des commandes


Si vous excutez la commande de faon asynchrone, aprs avoir appel Execute, vous pouvez abandonner lexcution en appelant la mthode Cancel :
procedure TDataForm.ExecuteButtonClick(Sender: TObject); begin ADOCommand1.Execute; end;

21-20

Guide du dveloppeur

Utilisation dobjets commande

procedure TDataForm.CancelButtonClick(Sender: TObject); begin ADOCommand1.Cancel; end;

La mthode Cancel na deffet que si une commande en attente a t excute de manire asynchrone (eoAsynchExecute dans le paramtre ExecuteOptions de la mthode Execute). Une commande est dite en attente si la mthode Execute a t appele mais nest pas encore acheve ou na pas dpass le dlai limite. Une commande dpasse le dlai limite si elle nest pas termine ou annule dans lintervalle, en secondes, imparti par la proprit CommandTimeout. Par dfaut, les commandes disposent dun dlai de 30 secondes.

Rcupration densembles de rsultats laide de commandes


A la diffrence des composants TADOQuery, qui excutent diffrentes mthodes selon quelles renvoient ou non un ensemble de rsultats, TADOCommand utilise toujours Execute pour excuter la commande, quelle renvoie ou non un ensemble de rsultats. Lorsque la commande renvoie un ensemble de rsultats, Execute renvoie une interface de linterface _RecordSet ADO. La faon la plus pratique dutiliser cette interface consiste laffecter la proprit RecordSet dun ensemble de donnes ADO. Par exemple, le code suivant utilise TADOCommand ( ADOCommand1) pour excuter une requte SELECT, qui renvoie un ensemble de rsultats. Cet ensemble de rsultats est ensuite affect la proprit RecordSet dun composant TADODataSet (ADODataSet1).
with ADOCommand1 do begin CommandText := SELECT Company, State + FROM customer + WHERE State = :StateParam; CommandType := cmdText; Parameters.ParamByName(StateParam).Value := HI; ADODataSet1.Recordset := Execute; end;

Ds que lensemble de rsultats est affect la proprit Recordset dun ensemble de donnes ADO, lensemble de donnes est automatiquement activ et les donnes sont accessibles.

Gestion des paramtres de commande


Un objet TADOCommand peut utiliser des paramtres de deux faons : La proprit CommandText peut spcifier une requte qui comprend des paramtres. Lutilisation de requtes paramtres dans TADOCommand sapparente celle dune requte paramtre dans un objet ADO. Voir Utilisation de paramtres dans les requtes la page 18-52, pour plus dinformations sur les requtes paramtres.

Utilisation des composants ADO

21-21

Utilisation dobjets commande

La proprit CommandText peut spcifier une procdure stocke qui utilise des paramtres. Les paramtres de procdure stocke sutilisent avec TADOCommand de la mme faon quavec un ensemble de donnes ADO. Voir Utilisation de paramtres avec les procdures stockes la page 18-59, pour plus dinformations sur les paramtres de procdures stockes. Lorsque vous utilisez TADOCommand, vous pouvez indiquer les valeurs de paramtres de deux faons : en les fournissant au moment dappeler la mthode Execute ou, lavance, en les dfinissant par le biais de la proprit Parameters. La mthode Execute est redfinie dans des versions qui acceptent un ensemble de valeurs de paramtres sous la forme dun tableau Variant. Cela permet de fournir des valeurs de paramtres rapidement sans dfinir la proprit Parameters :
ADOCommand1.Execute(VarArrayOf([Edit1.Text, Date]));

Lorsque vous utilisez des procdures stockes qui renvoient des paramtres de sortie, vous devez recourir la proprit Parameters. Mme si vous navez pas besoin de lire les paramtres de sortie, la proprit Parameters peut savrer utile car elle vous permet de fournir les paramtres la conception et dutiliser les proprits de TADOCommand de la mme faon que les paramtres des ensembles de donnes. Lorsque vous dfinissez la proprit CommandText, la proprit Parameters est automatiquement mise jour pour reflter les paramtres de la requte ou ceux utiliss par la procdure stocke. A la conception, vous pouvez utilise lditeur de paramtres pour accder aux paramtres en cliquant sur le bouton points de suspension de la proprit Parameters dans linspecteur dobjets. A lexcution, utilisez les proprits et mthodes de TParameter pour spcifier ou connatre la valeur de chaque paramtre.
with ADOCommand1 do begin CommandText := INSERT INTO Talley + (Counter) + VALUES (:NewValueParam); CommandType := cmdText; Parameters.ParamByName(NewValueParam).Value := 57; Execute end;

21-22

Guide du dveloppeur

22
Chapitre 22

Chapitre

Utilisation densembles de donnes unidirectionnels

dbExpress est un ensemble de pilotes de bases de donnes lgers qui permettent daccder rapidement aux serveurs de bases de donnes SQL. Pour chaque base de donnes prise en charge, dbExpress fournit un pilote qui adapte les logiciels serveur un ensemble uniforme dinterfaces dbExpress. Lorsque vous dployez une application de base de donnes qui utilise dbExpress, il suffit dinclure une bibliothque de liaison dynamique (le pilote propre au serveur) avec les fichiers dapplication que vous crez. dbExpress vous permet daccder aux bases de donnes laide densembles de donnes unidirectionnels. Ceux-ci ont t conus pour un accs lger et rapide aux informations de la base, avec des temps systme rduits. Comme les autres ensembles de donnes, ils peuvent envoyer une commande SQL au serveur de la base de donnes et, si la commande retourne un ensemble denregistrements, obtenir un curseur pour accder ces enregistrements. Toutefois, les ensembles de donnes unidirectionnels peuvent uniquement rcuprer un curseur unidirectionnel. Ils ne placent pas les donnes dans un tampon de mmoire, ce qui les rend plus rapides et moins consommateurs de mmoire que les autres types densembles de donnes. Mais, parce quils ne mettent pas les enregistrements dans un tampon, les ensembles de donnes unidirectionnels sont moins flexibles que les autres ensembles de donnes. De nombreuses capacits de TDataSet ne sont pas implmentes ou provoquent des exceptions dans les ensembles de donnes unidirectionnels. Par exemple : Les seules mthodes de navigation supportes sont First and Next. La plupart des autres dclenchent des exceptions. Certaines, comme celles qui participent au support des signets, ne font rien du tout. Il ny a pas de support ddition intgr, car cela ncessiterait un tampon pour les modifications. La proprit CanModify est toujours False, et donc les tentatives ddition de lensemble de donnes chouent toujours. Vous pouvez cependant utiliser les ensembles de donnes unidirectionnels pour mettre

Utilisation densembles de donnes unidirectionnels

22-1

Types densembles de donnes unidirectionnels

jour les donnes en faisant appel une commande SQL UPDATE, ou leur confrer la prise en charge conventionnelle de ldition en recourant un ensemble de donnes client dbExpress ou en connectant lensemble de donnes un ensemble de donnes client (voir Connexion un autre ensemble de donnes la page 14-12). Il ny a pas de support des filtres, car ceux-ci doivent fonctionner avec plusieurs enregistrements, ce qui ncessite la mise en tampon. Si vous essayez de filtrer un ensemble de donnes unidirectionnel, une exception est dclenche. Pour imposer des limites aux donnes afficher, il vous faut utiliser la commande SQL qui dfinit les donnes pour lensemble de donnes. Il ny a pas de support des champs de rfrence, qui ncessitent un tampon pour les enregistrements multiples contenant des valeurs de rfrence. Si vous dfinissez un champ de rfrence sur un ensemble de donnes unidirectionnel, il ne fonctionnera pas correctement. Malgr ces limites, les ensembles de donnes unidirectionnels offrent un moyen puissant daccder aux donnes. Ils reprsentent le mcanisme daccs aux donnes le plus rapide et sont trs simples utiliser et dployer.

Types densembles de donnes unidirectionnels


La page dbExpress de la palette des composants contient quatre types densembles de donnes unidirectionnels : TSQLDataSet, TSQLQuery, TSQLTable et TSQLStoredProc. TSQLDataSet est le plus gnral des quatre. Vous pouvez utiliser un ensemble de donnes SQL pour reprsenter nimporte quelles donnes disponibles via dbExpress, ou pour envoyer des commandes une base de donnes accde via dbExpress. Cest le composant recommand pour travailler avec des tables dans de nouvelles applications de bases de donnes. TSQLQuery est un ensemble de donnes de type requte qui encapsule une instruction SQL et permet aux applications daccder aux enregistrements ventuellement obtenus. Voir Utilisation densembles de donnes de type requte la page 18-49, pour plus dinformations sur lutilisation des ensembles de donnes de type requte. TSQLTable est un ensemble de donnes de type table qui reprsente toutes les lignes et colonnes dune seule table de base de donnes. VoirUtilisation densembles de donnes de type table la page 18-29, pour plus dinformations sur lutilisation des ensembles de donnes de type table. TSQLStoredProc est un ensemble de donnes de type procdure stocke qui excute une procdure stocke dfinie sur un serveur de bases de donnes. VoirUtilisation densembles de donnes de type procdure stocke la page 18-58, pour plus dinformations sur lutilisation des ensembles de donnes de type procdure stocke.
Remarque

La page dbExpress comprend galement TSQLClientDataSet, qui nest pas un ensemble de donnes unidirectionnel. Il sagit dun ensemble de donnes client

22-2

Guide du dveloppeur

Connexion au serveur de bases de donnes

qui utilise un ensemble de donnes unidirectionnel de manire interne pour accder ses donnes.

Connexion au serveur de bases de donnes


La premire tape du travail avec un ensemble de donnes unidirectionnel est de se connecter un serveur de base de donnes. A la conception, une fois quun ensemble de donnes dispose dune connexion active un serveur de base de donnes, linspecteur dobjets peut fournir des listes droulantes de valeurs pour les autres proprits. Par exemple, sil sagit dune procdure stocke, il faut quune connexion soit active pour que linspecteur dobjets puisse indiquer les procdures stockes disponibles sur le serveur. La connexion un serveur de base de donnes est reprsente par un composant TSQLConnection distinct. Vous utilisez TSQLConnection comme tout autre composant connexion de base de donnes. Pour plus dinformations sur les composants connexion de base de donnes, voir chapitre 17, Connexion aux bases de donnes. Pour utiliser TSQLConnection afin de connecter un ensemble de donnes unidirectionnel un serveur de bases de donnes, dfinissez la proprit SQLConnection. Pendant la conception, vous pouvez choisir le composant connexion SQL dans une liste droulante de linspecteur dobjets. Si vous faites cette affectation pendant lexcution, soyez s r que la connexion est active :
SQLDataSet1.SQLConnection := SQLConnection1; SQLConnection1.Connected := True;

Gnralement, tous les ensembles de donnes unidirectionnels dune application partagent le mme composant connexion, sauf si vous travaillez avec des donnes issues de plusieurs serveurs de bases de donnes. Toutefois, vous pouvez utiliser une connexion diffrente pour chaque ensemble de donnes si le serveur ne prend pas en charge plusieurs instructions par connexion. Vrifiez si le serveur de base de donnes ncessite une connexion diffrente pour chaque ensemble de donnes en lisant la proprit MaxStmtsPerConn. Par dfaut, TSQLConnection gnre les connexions selon les besoins lorsque le serveur limite le nombre dinstructions pouvant tre excutes via une connexion. Si vous souhaitez assurer un suivi plus approfondi des connexions utilises, attribuez la proprit AutoClone la valeur False. Avant de dfinir la proprit SQLConnection, vous devez configurer le composant TSQLConnection afin quil identifie le serveur de bases de donnes et tous les paramtres de connexion requis (notamment la base de donnes utiliser sur le serveur, le nom de la machine hte excutant le serveur, le nom dutilisateur, le mot de passe, etc.).

Configuration de TSQLConnection
Afin de dcrire une connexion de base de donnes de faon suffisamment dtaille pour que TSQLConnection puisse louvrir, vous devez identifier le pilote utiliser et un ensemble de paramtres de connexion transmis au pilote.

Utilisation densembles de donnes unidirectionnels

22-3

Connexion au serveur de bases de donnes

Identification du pilote
Le pilote est identifi par la proprit DriverName, qui correspond au nom dun pilote dbExpress install, tel que INTERBASE, ORACLE, MYSQL ou DB2. Le nom de pilote est associ deux fichiers : Le pilote dbExpress. Celui-ci peut tre une bibliothque de liaison dynamique portant un nom tel que dbexpint.dll, dbexpora.dll, dbexpmys.dll ou dbexpdb2.dll, ou une unit compile que vous pouvez lier de faon statique votre application (dbexptint.dcu, dbexpora.dcu, dbexpmys.dcu ou dbexpdb2.dcu). La bibliothque de liaison dynamique fournie par lditeur de bases de donnes pour la gestion de la partie client. La relation entre ces deux fichiers et le nom de la base de donnes est stocke dans un fichier appel dbxdrivers.ini, qui est mis jour lorsque vous installez un pilote dbExpress. Gnralement, vous navez pas vous soucier de ces fichiers car le composant connexion SQL les recherche dans dbxdrivers.ini lorsquil reoit la valeur de DriverName. Lorsque vous dfinissez la proprit DriverName, TSQLConnection attribue automatiquement aux proprits LibraryName et VendorLib les noms des bibliothques de liaison dynamique associes. Une fois LibraryName et VendorLib dfinies, votre application nest plus dpendante de dbxdrivers.ini (en dautres termes, vous navez pas besoin de dployer le fichier dbxdrivers.ini avec votre application sauf si vous dfinissez la proprit DriverName lexcution.)

Spcification des paramtres de connexion


La proprit Params est une liste de chanes associant des noms des valeurs. Chaque association prsente la forme Nom=Valeur, o Nom reprsente le nom du paramtre, et Valeur la valeur attribuer. Les paramtres particuliers requis dpendent du serveur de base de donnes utilis. Toutefois, un paramtre particulier, Database, est requis pour tous les serveurs. Sa valeur dpend du serveur que vous utilisez. Par exemple, Database reprsente le nom du fichier .gdb (InterBase), lentre dans TNSNames.ora (ORACLE) ou le nud ct client (DB2). Parmi les paramtres classiques figurent User_Name (nom utiliser lors de louverture de session), Password (mot de passe associ User_Name), HostName (nom de la machine ou adresse IP du serveur) et TransIsolation (degr de reconnaissance par vos transactions des modifications apportes par les autres transactions). Lorsque vous spcifiez un nom de pilote, la proprit Params est prcharge avec tous les paramtres requis pour ce type de pilote, initialiss leurs valeurs par dfaut. Params tant une liste de chanes, lors de la conception, vous pouvez doublecliquer sur la proprit Params dans linspecteur dobjets pour modifier les paramtres laide de lditeur de liste de chanes. Lors de lexcution, utilisez la proprit Params.Values pour attribuer des valeurs aux diffrents paramtres.

22-4

Guide du dveloppeur

Connexion au serveur de bases de donnes

Dnomination dune description de connexion


Bien que vous puissiez toujours spcifier une connexion laide uniquement des proprits DatabaseName et Params, il peut savrer plus pratique de nommer une combinaison spcifique puis simplement didentifier la connexion par son nom. Vous pouvez nommer les combinaisons de paramtres et de bases de donnes dbExpress, qui sont ensuite enregistres dans un fichier appel dbxconnections.ini. Le nom de chaque combinaison est un nom de connexion. Une fois que vous avez dfini le nom de connexion, vous pouvez identifier une connexion de base de donnes en attribuant simplement la proprit ConnectionName un nom de connexion valide. Le fait de dfinir ConnectionName dfinit automatiquement les proprits DriverName et Params. Une fois ConnectionName dfinie, vous pouvez modifier la proprit Params afin de crer des variantes temporaires partir de lensemble de valeurs de paramtres enregistr, mais la modification de la proprit DriverName efface la fois Params et ConnectionName. Lun des avantages de lutilisation de noms de connexion apparat lorsque vous dveloppez votre application en utilisant une base de donnes (par exemple Local InterBase), mais que vous la dployez en vue dune utilisation par une autre base de donnes (telle quORACLE). Dans ce cas, sur le systme o le dploiement est effectu, le profil de DriverName et Params est susceptible de diffrer par rapport aux valeurs utilises pendant le dveloppement. Vous pouvez facilement passer dune description de connexion lautre en utilisant deux versions du fichier dbxconnections.ini. A la conception, votre application charge DriverName et Params partir de la version de conception de dbxconnections.ini. Puis, lorsque vous dployez votre application, elle charge ces valeurs partir dune version distincte de dbxconnections.ini qui utilise la base de donnes relle. Toutefois, pour que cela fonctionne, vous devez indiquer votre composant connexion de recharger les proprits DriverName et Params lors de lexcution. Il existe deux moyens de le faire : Attribuer la proprit LoadParamsOnConnect la valeur True. Ainsi, louverture de la connexion, TSQLConnection attribue automatiquement DriverName et Params les valeurs associes ConnectionName dans dbxconnections.ini. Appeler la mthode LoadParamsFromIniFile. Elle attribue DriverName et Params les valeurs associes ConnectionName dans dbxconnections.ini (ou dans un autre fichier que vous spcifiez). Vous pouvez opter pour cette mthode si vous souhaitez remplacer certaines valeurs de paramtres avant douvrir la connexion.

Utilisation de lditeur de connexion


La relation entre les noms de connexion et leurs paramtres de pilote et de connexion associs est stocke dans le fichier dbxconnections.ini. Vous pouvez crer ou modifier ces associations laide de lditeur de connexion. Pour afficher lditeur de connexion, double-cliquez sur le composant TSQLConnection. Lditeur de connexion apparat, avec une liste droulante contenant tous les pilotes disponibles, une liste de noms de connexion pour le

Utilisation densembles de donnes unidirectionnels

22-5

Spcification des donnes afficher

pilote slectionn et un tableau prsentant les paramtres de connexion associs au nom de connexion slectionn. Cette bote de dialogue vous permet dindiquer la connexion utiliser en slectionnant un pilote et un nom de connexion. Aprs avoir dtermin la configuration souhaite, cliquez sur le bouton Tester la connexion afin de vrifier que vous avez choisi une configuration valide. En outre, cette bote de dialogue vous permet de modifier les connexions nommes dans dbxconnections.ini : Modifiez les valeurs de paramtres dans le tableau des paramtres afin de modifier la connexion nomme slectionne. Lorsque vous quittez la bote de dialogue en cliquant sur OK, les nouvelles valeurs de paramtres sont enregistres dans le fichier dbxconnections.ini. Cliquez sur le bouton Ajouter une connexion afin de dfinir une nouvelle connexion nomme. Une bote de dialogue apparat dans laquelle vous pouvez spcifier le pilote utiliser et le nom de la nouvelle connexion. Une fois la connexion nomme, modifiez les paramtres afin de spcifier la connexion souhaite puis cliquez sur OK pour enregistrer la nouvelle connexion dans dbxconnections.ini. Cliquez sur le bouton Supprimer la connexion pour supprimer la connexion nomme slectionne de dbxconnections.ini. Cliquez sur le bouton Renommer la connexion pour modifier le nom de la connexion nomme slectionne. Toutes les modifications que vous avez apportes aux paramtres sont enregistres sous le nouveau nom lorsque vous cliquez sur OK.

Spcification des donnes afficher


Il existe de nombreux moyens de spcifier les donnes que reprsente un ensemble de donnes unidirectionnel. Votre choix dpendra du type densemble de donnes unidirectionnel que vous utilisez et de lorigine des informations : une simple table, les rsultats dune requte ou les rsultats dune procdure stocke. Quand vous travaillez avec un composant TSQLDataSet, utilisez la proprit CommandType pour indiquer do lensemble de donnes obtient ses donnes. CommandType peut prendre lune quelconque des valeurs suivantes : ctQuery : Si CommandType est ctQuery, TSQLDataSet excute la requte que vous spcifiez. Si la requte est une commande SELECT, lensemble de donnes contient lensemble denregistrements rsultant. ctTable : Si CommandType est ctTable, TSQLDataSet extrait tous les enregistrements de la table spcifie. ctStoredProc : Si CommandType est ctStoredProc, TSQLDataSet excute une procdure stocke. Si cette dernire renvoie un curseur, lensemble de donnes contient les enregistrements renvoys.

22-6

Guide du dveloppeur

Spcification des donnes afficher

Remarque

Vous pouvez aussi remplir lensemble de donnes unidirectionnel par des mtadonnes qui vous renseignent sur ce qui est disponible sur le serveur. Pour connatre la faon de le faire, voir Rcupration de mtadonnes dans un ensemble de donnes unidirectionnel la page 22-14.

Reprsentation des rsultats dune requte


Lutilisation dune requte est le moyen le plus gnral de spcifier un ensemble denregistrements. Les requtes sont de simples commandes crites en SQL. Vous pouvez utiliser soit TSQLDataSet soit TSQLQuery pour reprsenter le rsultat dune requte. Lorsque vous utilisez TSQLDataSet , attribuez la proprit CommandType la valeur ctQuery et le texte de linstruction de requte la proprit CommandText. Si vous utilisez TSQLQuery, affectez alors la requte la proprit SQL. Ces proprits fonctionnent de la mme manire pour tous les ensembles de donnes polyvalents ou de type requte. Voir Spcification de la requte la page 18-50, pour plus de dtails leur sujet. Lorsque vous spcifiez la requte, elle peut inclure des paramtres, ou variables, dont les valeurs peuvent tre modifies pendant la conception ou pendant lexcution. Les paramtres peuvent remplacer les valeurs des donnes qui apparaissent dans linstruction SQL. Lutilisation de paramtres dans les requtes et la dfinition de valeurs pour ces paramtres sont dcrites dans Utilisation de paramtres dans les requtes la page 18-52. SQL dfinit des requtes comme UPDATE qui excutent des actions sur le serveur mais ne renvoient pas un ensemble denregistrements. Ces requtes sont dcrites dans Excution des commandes ne renvoyant pas denregistrement la page 22-10.

Reprsentation des enregistrements dune table


Quand vous voulez reprsenter tous les champs et tous les enregistrements dune seule table de la base de donnes sous-jacente, vous pouvez utiliser soit TSQLDataSet, soit TSQLTable pour gnrer la requte SQL votre place.
Remarque

Si les performances du serveur entrent en compte, vous prfrerez composer explicitement la requte et non vous reposer sur la gnration automatique. Les requtes gnres automatiquement utilisent des caractres gnriques au lieu dnumrer explicitement tous les champs de la table. Cela peut entraner une lgre baisse de performance sur le serveur. Le caractre gnrique (*) des requtes gnres automatiquement est plus robuste lors des modifications de champs sur le serveur.

Reprsentation dune table en utilisant TSQLDataSet


Pour que TSQLDataSet gnre une requte qui lise tous les champs et tous les enregistrements dune seule table de base de donnes, dfinissez la proprit CommandType par ctTable.

Utilisation densembles de donnes unidirectionnels

22-7

Spcification des donnes afficher

Quand CommandType vaut ctTable, TSQLDataSet gnre une requte en se basant sur les valeurs de deux proprits : CommandText spcifie le nom de la table de base de donnes que doit reprsenter lobjet TSQLDataSet. SortFieldNames numre les noms des champs utiliser pour trier les donnes, dans lordre de leur prpondrance. Par exemple, si vous spcifiez ceci :
SQLDataSet1.CommandType := ctTable; SQLDataSet1.CommandText := Employee; SQLDataSet1.SortFieldNames := HireDate,Salary

TSQLDataSet gnre la requte suivante, qui prsente tous les enregistrements de la table Employee, tris par date dembauche (HireDate) et, pour une mme date dembauche, par salaire (Salary) :
select * from Employee order by HireDate, Salary

Reprsentation dune table en utilisant TSQLTable


Si vous utilisez TSQLTable, spcifiez la table que vous voulez par le biais de la proprit TableName. Pour spcifier lordre des champs dans lensemble de donnes, vous devez spcifier un index. Il existe deux moyens de le faire : Dfinissez la proprit IndexName par le nom dun index dfini sur le serveur qui impose lordre que vous souhaitez. Dfinissez la proprit IndexFieldNames par la liste, dlimite par des points virgules, des noms des champs sur lesquels trier. IndexFieldNames fonctionne comme la proprit SortFieldNames de TSQLDataSet, sauf quelle utilise comme dlimiteur le point virgule au lieu de la virgule.

Reprsentation des rsultats dune procdure stocke


Les procdures stockes sont des jeux dinstructions SQL nomms et enregistrs sur un serveur SQL. La faon dindiquer la procdure stocke excuter dpend du type densemble de donnes unidirectionnel que vous utilisez. Lorsque vous utilisez TSQLDataSet , pour spcifier une procdure stocke : Dfinissez la proprit CommandType par ctStoredProc . Spcifiez le nom de la procdure stocke comme valeur de la proprit CommandText :
SQLDataSet1.CommandType := ctStoredProc; SQLDataSet1.CommandText := MyStoredProcName;

Lorsque vous utilisez TSQLStoredProc, il vous suffit de spcifier le nom de la procdure stocke comme valeur de la proprit StoredProcName.
SQLStoredProc1.StoredProcName := MyStoredProcName;

22-8

Guide du dveloppeur

Rcupration des donnes

Une fois que vous avez identifi une procdure stocke, il se peut que votre application ait besoin de fournir les valeurs des paramtres dentre de la procdure stocke ou dextraire les valeurs des paramtres de sortie la fin de lexcution de la procdure stocke. Voir Utilisation de paramtres avec les procdures stockes la page 18-59, pour plus dinformations sur lutilisation des paramtres de procdure stocke.

Rcupration des donnes


Lorsque vous avez spcifi la source des donnes, vous devez rcuprer les donnes avant que votre application ne puisse y accder. Lorsque lensemble de donnes a rcupr les donnes, les contrles orients donnes, lis lensemble de donnes au moyen dune source de donnes, affichent automatiquement les valeurs des donnes, tandis que les ensembles de donnes client lis lensemble de donnes au moyen dun fournisseur peuvent tre remplis par les enregistrements. Comme pour nimporte quel ensemble de donnes, il y a deux faons de rcuprer les donnes pour un ensemble de donnes unidirectionnel : Dfinir la proprit Active par True, soit dans linspecteur dobjets lors de la conception, soit dans le code lors de lexcution :
CustQuery.Active := True;

Appeler la mthode Open lors de lexcution :


CustQuery.Open;

Vous pouvez utiliser la proprit Active ou la mthode Open avec nimporte quel ensemble de donnes unidirectionnel obtenant ses enregistrements du serveur. Que ces enregistrements proviennent dune requte SELECT (y compris dune requte gnre automatiquement lorsque CommandType vaut ctTable) ou dune procdure stocke na pas dimportance.

Prparation de lensemble de donnes


Avant quune requte ou une procdure stocke ne sexcute sur le serveur, elle doit dabord tre prpare. Prparer lensemble de donnes signifie que dbExpress et le serveur allouent des ressources linstruction et ses paramtres. Si CommandType vaut ctTable, cela se passe au moment o lensemble de donnes gnre sa requte SELECT. Tous les paramtres qui ne sont pas lis par le serveur sont incorpors dans une requte ce moment-l. Les ensembles de donnes unidirectionnels sont automatiquement prpars lorsque vous dfinissez Active par True ou appelez la mthode Open. Lorsque vous fermez lensemble de donnes, les ressources alloues lexcution de linstruction sont libres. Si vous prvoyez dexcuter plusieurs fois la requte ou la procdure stocke, vous pouvez amliorer les performances en prparant lensemble de donnes de manire explicite avant de louvrir pour la premire

Utilisation densembles de donnes unidirectionnels

22-9

Excution des commandes ne renvoyant pas denregistrement

fois. Pour prparer un ensemble de donnes de manire explicite, dfinissez sa proprit Prepared par True.
CustQuery.Prepared := True;

Lorsque vous prparez lensemble de donnes de manire explicite, les ressources alloues lexcution de linstruction ne sont pas libres tant que vous ne dfinissiez pas Prepared par False. Dfinissez la proprit Prepared par False si vous voulez que lensemble de donnes soit re-prpar avant son excution (par exemple, si vous modifiez la valeur dun paramtre ou la proprit SortFieldNames).

Rcupration de plusieurs ensembles de donnes


Certaines procdures stockes renvoient plusieurs ensembles denregistrements. Lorsque vous louvrez, lensemble de donnes ne rcupre que le premier ensemble denregistrements. Pour accder aux autres ensembles denregistrements, appelez la mthode NextRecordSet :
var DataSet2: TSQLDataSet; nRows: Integer; begin DataSet2 := SQLDataSet1.NextRecordSet(nRows); ...

NextRecordSet renvoie un composant TSQLDataSet nouvellement cr qui donne accs au prochain ensemble denregistrements. La premire fois que vous appelez NextRecordSet, elle renvoie un ensemble de donnes pour le second ensemble denregistrements. Appeler NextRecordSet renvoie un troisime ensemble de donnes, et ainsi de suite jusqu ce quil ny ait plus densemble denregistrements. Lorsque quil ny a pas densemble de donnes supplmentaire, NextRecordSet renvoie nil.

Excution des commandes ne renvoyant pas denregistrement


Vous pouvez utiliser un ensemble de donnes unidirectionnel mme si la requte ou la procdure stocke quil reprsente ne renvoie pas denregistrement. De telles commandes comprennent les instructions DDL (Data Definition Language) ou DML (Data Manipulation Language) autres que les instructions SELECT (par exemple, les commandes INSERT, DELETE, UPDATE, CREATE INDEX et ALTER TABLE ne renvoie pas denregistrement). Le langage utilis dans les commandes est spcifique au serveur mais gnralement conforme au standard SQL-92 du langage SQL. La commande SQL que vous excutez doit tre acceptable pour le serveur que vous utilisez. Les ensembles de donnes unidirectionnels nvaluent pas la commande SQL et ne lexcutent pas. Ils transmettent simplement la commande au serveur pour son excution.

22-10

Guide du dveloppeur

Excution des commandes ne renvoyant pas denregistrement

Remarque

Si la commande ne renvoie pas denregistrement, vous navez pas besoin dutiliser un ensemble de donnes unidirectionnel, car vous navez pas besoin des mthodes de lensemble de donnes donnant accs lensemble denregistrements. Le composant de connexion SQL, qui se connecte au serveur de base de donnes, peut tre utilis directement pour excuter les commandes sur le serveur. Voir Envoi de commandes au serveur la page 17-11, pour plus de dtails.

Spcification de la commande excuter


Avec les ensembles de donnes unidirectionnels, la faon dont vous spcifiez la commande excuter est la mme, que la commande produise un ensemble de donnes ou non. Ainsi : Lorsque vous employez TSQLDataSet , utilisez les proprits CommandType et CommandText pour spcifier la commande : Si CommandType vaut ctQuery, CommandText est linstruction SQL transmettre au serveur. Si CommandType vaut ctStoredProc, CommandText est le nom de la procdure stocke excuter. Lorsque vous employez TSQLQuery, utilisez la proprit SQL pour spcifier linstruction SQL transmettre au serveur. Lorsque vous employez TSQLStoredProc, utilisez la proprit StoredProcName pour spcifier le nom de la procdure stocke excuter. Tout comme vous avez spcifi la commande de la mme faon que pour rcuprer des enregistrements, vous travaillerez avec les paramtres de requte ou les paramtres de procdure stocke comme avec les requtes et les procdures stockes renvoyant des enregistrements. Voir Utilisation de paramtres dans les requtes la page 18-52 et Utilisation de paramtres avec les procdures stockes la page 18-59, pour plus de dtails.

Excution de la commande
Pour excuter une requte ou une procdure stocke ne renvoyant pas denregistrement, nutilisez pas la proprit Active ni la mthode Open. En revanche, utilisez : La mthode ExecSQL si lensemble de donnes est une instance de TSQLDataSet or TSQLQuery.
FixTicket.CommandText := DELETE FROM TrafficViolations WHERE (TicketID = 1099); FixTicket.ExecSQL;

La mthode ExecProc si lensemble de donnes est une instance deTSQLStoredProc.


SQLStoredProc1.StoredProcName := MyCommandWithNoResults; SQLStoredProc1.ExecProc;

Utilisation densembles de donnes unidirectionnels

22-11

Excution des commandes ne renvoyant pas denregistrement

Conseil

Si vous excutez la requte ou la procdure stocke plusieurs fois, il convient de dfinir la proprit Prepared par True.

Cration et modification des mtadonnes du serveur


La majorit des commandes ne renvoyant pas de donnes se rpartissent en deux catgories : celles servant modifier les donnes (comme les commandes INSERT, DELETE et UPDATE) et celles servant crer ou modifier sur le serveur des entits telles que les tables, les index et les procdures stockes. Si vous ne voulez pas utiliser de commandes SQL explicites pour ldition, vous pouvez lier votre ensemble de donnes unidirectionnel un ensemble de donnes client et laisser celui-ci grer toute la gnration des commandes SQL sappliquant ldition (voir Connexion dun ensemble de donnes client un autre ensemble de donnes dans la mme application la page 14-14). En fait, cest lapproche recommande car les contrles orients donnes sont conus pour oprer les modifications via un ensemble de donnes client tel que TClientDataSet. Cependant, le seul moyen dont dispose votre application pour crer ou modifier les mtadonnes sur le serveur, est denvoyer une commande. Tous les pilotes de bases de donnes ne supportent pas la mme syntaxe SQL. Il nest pas du ressort de ce document de dcrire la syntaxe SQL supporte par chaque type de base de donnes ni les diffrences existant entre ces types. Pour avoir des informations compltes et rcentes sur limplmentation SQL dun systme de base de donnes particulier, reportez-vous la documentation livre avec ce systme. En gnral, utilisez linstruction CREATE TABLE pour crer des tables dans une base de donnes et CREATE INDEX pour crer de nouveaux index pour ces tables. Lorsquelles sont supportes, utilisez les instructions CREATE qui ajoutent les divers objets de mtadonnes, comme CREATE DOMAIN, CREATE VIEW, CREATE SCHEMA et CREATE PROCEDURE. Pour chaque instruction CREATE, il existe une instruction DROP correspondante qui efface lobjet de mtadonnes. Ces instructions comprennent DROP TABLE, DROP VIEW, DROP DOMAIN, DROP SCHEMA et DROP PROCEDURE. Pour modifier la structure dune table, utilisez une instruction ALTER TABLE. ALTER TABLE a des clauses ADD et DROP permettant de crer de nouveaux lments dans la table et de les supprimer. Par exemple, utilisez la clause ADD COLUMN pour ajouter la table une nouvelle colonne, et DROP CONSTRAINT pour supprimer une contrainte pralablement tablie pour la table. Par exemple, linstruction suivante cre une procdure stocke appele GET_EMP_PROJ sur une base de donnes InterBase :
CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN FOR SELECT PROJ_ID

22-12

Guide du dveloppeur

Dfinition de curseurs lis matre/dtail

FROM EMPLOYEE_PROJECT WHERE EMP_NO = :EMP_NO INTO :PROJ_ID DO SUSPEND; END

Le code suivant utilise un TSQLDataSet pour crer cette procdure stocke. Remarquez lutilisation de la proprit ParamCheck pour empcher lensemble de donnes de confondre les paramtres de la dfinition de la procdure stocke (:EMP_NO et :PROJ_ID) avec un paramtre de la requte crant la procdure stocke.
with SQLDataSet1 do begin ParamCheck := False; CommandType := ctQuery; CommandText := CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) + RETURNS (PROJ_ID CHAR(5)) AS + BEGIN + FOR SELECT PROJ_ID FROM EMPLOYEE_PROJECT + WHERE EMP_NO = :EMP_NO + INTO :PROJ_ID + DO SUSPEND; + END; ExecSQL; end;

Dfinition de curseurs lis matre/dtail


Il existe deux faons dutiliser des curseurs lis pour dfinir une relation matre/ dtail dans laquelle un ensemble de donnes unidirectionnel fait office densemble dtail. Le choix dpend du type densemble de donnes unidirectionnel utilis. Lorsque vous avez dfini cette relation, lensemble de donnes unidirectionnel (le plusieurs de la relation un--plusieurs) donne accs aux seuls enregistrements qui correspondent lenregistrement en cours dans lensemble matre (le un de la relation un--plusieurs). TSQLDataSet et TSQLQuery ncessitent lutilisation dune requte paramtre pour tablir une relation matre/dtail. Cette technique permet de crer ces relations sur tous les ensembles de donnes de type requte. Pour plus dinformations sur la cration de relations matre/dtail impliquant des ensembles de donnes de type requte, voir Etablissement de relations matre/ dtail en utilisant des paramtres la page 18-55. Pour dfinir une relation matre/dtail o lensemble dtail est une instance de TSQLTable, utilisez les proprits MasterSource et MasterFields, comme vous le feriez avec tout autre ensemble de donnes de type table. Pour plus dinformations sur la cration de relations matre/dtail impliquant des ensembles de donnes de type table, voir Etablissement de relations matre/ dtail en utilisant des paramtres la page 18-55.

Utilisation densembles de donnes unidirectionnels

22-13

Accs aux informations de schma

Accs aux informations de schma


Deux procds permettent dobtenir des informations sur les lments disponibles sur le serveur. Ces informations, appeles mtadonnes ou informations de schma, indiquent quelles tables et quelles procdures stockes sont accessibles sur le serveur et donnent des prcisions sur ces tables et ces procdures stockes (comme les champs contenus dans une table, les index ayant t dfinis, les paramtres utiliss par une procdure stocke). Le procd le plus simple pour obtenir ces mtadonnes consiste utiliser les mthodes de TSQLConnection. Ces mthodes remplissent une liste de chanes ou un objet liste existant avec les noms de tables, de procdures stockes, de champs ou dindex, ou avec des descripteurs de paramtre. Cette technique sapparente celle que vous utilisez pour remplir des listes avec des mtadonnes pour tout autre composant connexion de base de donnes. Ces mthodes sont dcrites dans Obtention de mtadonnes la page 17-14. Si vous avez besoin dinformations de schma plus dtailles, vous pouvez remplir un ensemble de donnes unidirectionnel avec des mtadonnes. Au lieu dune simple liste, lensemble de donnes unidirectionnel est rempli avec des informations de schma, dans lesquelles chaque enregistrement reprsente une table, une procdure stocke, un index, un champ ou un paramtre unique.

Rcupration de mtadonnes dans un ensemble de donnes unidirectionnel


Pour remplir un ensemble de donnes unidirectionnel avec des mtadonnes du serveur de base de donnes, vous devez dabord indiquer quelles sont les donnes que vous voulez, en utilisant la mthode SetSchemaInfo. SetSchemaInfo accepte trois paramtres : Le type dinformation de schma (mtadonnes) que vous voulez lire. Cela peut tre une liste de tables (stTables), une liste de tables systme (stSysTables), une liste de procdures stockes (stProcedures), une liste de champs dans une table (stColumns), une liste dindex (stIndexes) ou la liste des paramtres utiliss par une procdure stocke (stProcedureParams). Chaque type dinformation utilise un ensemble de champs spcifique pour dcrire les lments de la liste. Pour plus de dtails sur les structures de ces ensembles de donnes, voir Structure des ensembles de mtadonnes la page 22-15. Si vous recherchez des informations sur des champs des index ou les paramtres dune procdure stocke, le nom de la table ou de la procdure stocke auxquels elles sappliquent. Si vous recherchez nimporte quel autre type dinformations de schma, ce paramtre est nil. Un modle respecter pour chaque nom renvoy. Ce modle est un modle SQL, comme Cust%, qui utilise les jokers % (correspondant une chane de nimporte quels caractres et de nimporte quelle longueur) et _ (correspondant un seul caractre quelconque). Pour utiliser un pourcentage ou un soulign dans un modle pour sa valeur normale, doublez le caractre

22-14

Guide du dveloppeur

Accs aux informations de schma

(%% ou __). Si vous ne voulez pas utiliser de modle, ce paramtre peut tre nil.
Remarque

Si vous lisez des informations de schma concernant les tables (stTables), les informations de schma rsultantes peuvent dcrire les tables ordinaires, les tables systme, les vues et/ou les synonymes, selon la valeur de la proprit TableScope de la connexion SQL. Lappel suivant demande une table listant toutes les tables systme (les tables du serveur qui contiennent des mtadonnes) :
SQLDataSet1.SetSchemaInfo(stSysTable, , );

Lorsque vous ouvrez lensemble de donnes aprs cet appel de SetSchemaInfo, il possde un enregistrement pour chaque table, dont les colonnes fournissent le nom de table, le type, le nom de schma, etc. Si le serveur nutilise pas de tables systme pour stocker les mtadonnes (par exemple MySQL), lensemble de donnes ne contient aucun enregistrement lorsque vous louvrez. Lexemple prcdent nutilisait que le premier paramtre. Supposons que vous vouliez obtenir la liste des paramtres utiliss en entre de la procdure stocke nomme MyProc. Supposons galement que la personne ayant crit cette procdure se soit servie dun prfixe dans le nom de tous les paramtres pour indiquer sil sagit dun paramtre en entre ou en sortie (inName, outValue, etc.). Vous pourriez appeler SetSchemaInfo comme suit :
SQLDataSet1.SetSchemaInfo(stProcedureParams, MyProc, in%);

Lensemble de donnes rsultant est une table de paramtres dentre dont les colonnes dcrivent les proprits de chaque paramtre.

Lecture des donnes aprs lutilisation de lensemble de donnes pour des mtadonnes
Aprs un appel SetSchemaInfo, il y a deux faons de revenir lexcution des requtes ou des procdures stockes avec lensemble de donnes : Changez la proprit CommandText, en spcifiant la requte, la table ou la procdure stocke partir de laquelle vous voulez lire des donnes. Appelez SetSchemaInfo, en dfinissant le premier paramtre par stNoSchema. Dans ce cas, lensemble de donnes se remet lire les donnes spcifies par la valeur en cours de CommandText.

Structure des ensembles de mtadonnes


Pour chaque type de mtadonnes auquel vous pouvez accder en utilisant TSQLDataSet, il existe un ensemble de colonnes (champs) qui sont remplies par les informations sur les lments du type concern.

Utilisation densembles de donnes unidirectionnels

22-15

Accs aux informations de schma

Informations sur les tables


Lorsque vous demandez des informations sur les tables (stTables ou stSysTables), lensemble de donnes rsultant comprend un enregistrement pour chaque table. Ces enregistrements possdent les colonnes suivantes :
Tableau 22.1 Colonnes des tables de mtadonnes concernant les tables Type de champ
ftInteger ftString

Nom de colonne
RECNO CATALOG_NAME

Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la table. Cest le m me que le param tre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de la table. Le nom de la table. Ce champ dtermine lordre de tri de lensemble de donnes. Identifie le type de table. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : table 2 : vue 4 : table systme 8 : synonyme 16 : table temporaire 32 : table locale.

SCHEMA_NAME TABLE_NAME TABLE_TYPE

ftString ftString ftInteger

Informations sur les procdures stockes


Lorsque vous demandez des informations sur les procdures stockes (stProcedures), lensemble de donnes rsultant comprend un enregistrement pour chaque procdure stocke. Ces enregistrements possdent les colonnes suivantes :
Tableau 22.2 Colonnes des tables de mtadonnes concernant les procdures stockes Type de champ
ftInteger ftString

Nom de colonne
RECNO CATALOG_NAME

Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la procdure stocke. C est le mme que le param tre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de la procdure stocke. Le nom de la procdure stocke. Ce champ dtermine lordre de tri de lensemble de donnes. Identifie le type de procdure stocke. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : procdure 2 : fonction 4 : paquetage 8 : procdure systme

SCHEMA_NAME PROC_NAME PROC_TYPE

ftString ftString ftInteger

22-16

Guide du dveloppeur

Accs aux informations de schma

Tableau 22.2

Colonnes des tables de mtadonnes concernant les procdures stockes Type de champ
ftSmallint ftSmallint

Nom de colonne
IN_PARAMS OUT_PARAMS

Contenu
Le nombre de paramtres dentre. Le nombre de paramtres de sortie.

Informations sur les champs


Lorsque vous demandez des informations sur les champs dune table particulire (stColumns), lensemble de donnes rsultant comprend un enregistrement pour chaque champ. Ces enregistrements possdent les colonnes suivantes :
Tableau 22.3 Colonnes des tables de mtadonnes concernant les champs Type de champ
ftInteger ftString

Nom de colonne
RECNO CATALOG_NAME

Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la table dont vous voulez connatre les champs. Cest le mme que le paramtre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire du champ. Le nom de la table contenant les champs. Le nom du champ. Cette valeur dtermine lordre de tri de lensemble de donnes. La position de la colonne dans sa table. Identifie le type de valeur contenue dans le champ. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : identificateur de ligne 2 : version de ligne 4 : champ incrmentation automatique 8 : Champ possdant une valeur par dfaut Le type de donnes de la colonne. Cest une des constantes de types de champs logiques dfinies dans sqllinks.pas. Une chane dcrivant le type de donnes. Cest la mme que celle contenue dans COLUMN_DATATYPE et COLUMN_SUBTYPE, mais sous une forme utilise par certaines instructions DDL. Un sous-type du type de donnes de la colonne. Cest une des constantes de sous-types logiques dfinies dans sqllinks.pas. La taille du type de champ (nombre de caractres dans une chane, octets dans un champ doctets, chiffres significatifs dans une valeur BCD, membres dun champ ADT, etc.).

SCHEMA_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION COLUMN_TYPE

ftString ftString ftString ftSmallint ftInteger

COLUMN_DATATYPE

ftSmallint

COLUMN_TYPENAME

ftString

COLUMN_SUBTYPE

ftSmallint

COLUMN_PRECISION

ftInteger

Utilisation densembles de donnes unidirectionnels

22-17

Accs aux informations de schma

Tableau 22.3

Colonnes des tables de mtadonnes concernant les champs (suite) Type de champ
ftSmallint

Nom de colonne
COLUMN_SCALE

Contenu
Le nombre de chiffres droite de la dcimale dans les valeurs BCD, ou de descendants dans les champs ADT et tableau. Le nombre doctets ncessaires pour stocker les valeurs des champs. Un boolen indiquant si le champ peut tre laiss vierge (0 signifie que le champ exige une valeur).

COLUMN_LENGTH COLUMN_NULLABLE

ftInteger ftSmallint

Informations sur les index


Lorsque vous demandez des informations sur les index dune table particulire (stIndexes), lensemble de donnes rsultant comprend un enregistrement pour chaque champ de chaque enregistrement. (Les index multi-enregistrements sont dcrit par plusieurs enregistrements.) Lensemble de donnes possde les colonnes suivantes :
Tableau 22.4 Colonnes des tables de mtadonnes concernant les index Type de champ
ftInteger ftString

Nom de colonne
RECNO CATALOG_NAME

Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant lindex. Cest le mme que le paramtre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de lindex. Le nom de la table pour laquelle est dfini lindex. Le nom de lindex. Ce champ dtermine lordre de tri de lensemble de donnes. Indique le nom de la cl primaire. Le nom du champ (colonne) dans lindex. La position de ce champ dans lindex. Identifie le type dindex. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : non unique 2 : unique 4 : cl primaire Indique que lindex est ascendant (a) ou descendant (d). Dcrit une condition de filtre limitant les enregistrements indexs.

SCHEMA_NAME TABLE_NAME INDEX_NAME PKEY_NAME COLUMN_NAME COLUMN_POSITION INDEX_TYPE

ftString ftString ftString ftString ftString ftSmallint ftSmallint

SORT_ORDER FILTER

ftString ftString

22-18

Guide du dveloppeur

Dbogage dapplications dbExpress

Informations sur les paramtres des procdures stockes


Lorsque vous demandez des informations sur les paramtres dune procdure stocke (stProcedureParams), lensemble de donnes rsultant comprend un enregistrement pour chaque paramtre. Ces enregistrements possdent les colonnes suivantes :
Tableau 22.5 Colonnes des tables de mtadonnes concernant les paramtres Type de champ
ftInteger ftString

Nom de colonne
RECNO CATALOG_NAME

Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la procdure stocke. Cest le mme que le paramtre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de la procdure stocke. Le nom de la procdure stocke contenant le paramtre. Le nom du paramtre. Ce champ dtermine lordre de tri de lensemble de donnes. Identifie le type de paramtre. Cest le mme que la proprit ParamType dun objet TParam. Le type de donnes du param tre. Cest une des constantes de types de champs logiques dfinies dans sqllinks.pas. Un sous-type du type de donnes du param tre. Cest une des constantes de sous-types logiques dfinies dans sqllinks.pas. Une chane dcrivant le type de donnes. Cest la mme que celle contenue dans PARAM_DATATYPE et PARAM_SUBTYPE, mais sous une forme utilise par certaines instructions DDL. Le nombre maximal de chiffres dans les valeurs en virgule flottante ou dans les octets (pour les chanes et les champs doctets). Le nombre de chiffres droite de la dcimale dans les valeurs en virgule flottante. Le nombre doctets ncessaires pour stocker les valeurs des paramtres. Un boolen indiquant si le param tre peut tre laiss vierge (0 signifie que le paramtre exige une valeur).

SCHEMA_NAME PROC_NAME PARAM_NAME PARAM_TYPE PARAM_DATATYPE

ftString ftString ftString ftSmallint ftSmallint

PARAM_SUBTYPE

ftSmallint

PARAM_TYPENAME

ftString

PARAM_PRECISION

ftInteger

PARAM_SCALE PARAM_LENGTH PARAM_NULLABLE

ftSmallint ftInteger ftSmallint

Dbogage dapplications dbExpress


Lors du dbogage de votre application de base de donnes, il peut savrer utile de contrler les messages SQL envoys la base de donnes et reus de celle-ci par le biais de votre composant connexion, y compris ceux automatiquement gnrs (par exemple, par un composant fournisseur ou par le pilote dbExpress).

Utilisation densembles de donnes unidirectionnels

22-19

Dbogage dapplications dbExpress

Utilisation de TSQLMonitor pour contrler les commandes SQL


TSQLConnection utilise un composant compagnon, TSQLMonitor, pour intercepter ces messages et les enregistrer dans une liste de chanes. TSQLMonitor fonctionne comme lutilitaire moniteur SQL que vous pouvez utiliser avec le BDE, la diffrence quil contrle uniquement les commandes impliquant un seul composant TSQLConnection plutt que toutes les commandes gres par dbExpress. Pour utiliser TSQLMonitor :

1 Ajoutez un composant TSQLMonitor la fiche ou au module de donnes contenant le composant TSQLConnection dont vous souhaitez contrler les commandes SQL. 2 Attribuez sa proprit SQLConnection le composant TSQLConnection. 3 Attribuez la valeur True la proprit Active du moniteur SQL.
A mesure que les commandes SQL sont envoyes au serveur, la proprit TraceList du moniteur SQL est automatiquement mise jour afin de prsenter toutes les commandes SQL interceptes. Vous pouvez enregistrer cette liste dans un fichier en sp cifiant une valeur pour la proprit FileName puis en attribuant la proprit AutoSave la valeur True. AutoSave oblige le moniteur SQL enregistrer le contenu de la proprit TraceList dans un fichier chaque consignation dun nouveau message. Si vous voulez pargner votre systme la charge lie lenregistrement dun fichier chaque consignation, vous pouvez utiliser le gestionnaire dvnement OnLogTrace afin de nenregistrer des fichiers qu la suite dun certain nombre de consignations de messages. Par exemple, le gestionnaire dvnement suivant enregistre le contenu de TraceList tous les 10 messages et efface le journal aprs lavoir enregistr afin de limiter la longueur de la liste :
procedure TForm1.SQLMonitor1LogTrace(Sender: TObject; CBInfo: Pointer); var LogFileName: string; begin with Sender as TSQLMonitor do begin if TraceCount = 10 then begin LogFileName := c:\log + IntToStr(Tag) + .txt; Tag := Tag + 1; {permet de nommer diffremment le fichier journal suivant } SaveToFile(LogFileName); TraceList.Clear; { efface la liste } end; end; end; Remarque

Le gestionnaire dvnement prcdent vous permet galement denregistrer une liste qui savre partielle (contenant moins de 10 entres) larrt de lapplication.

22-20

Guide du dveloppeur

Dbogage dapplications dbExpress

Utilisation dun callback pour contrler les commandes SQL


Au lieu dutiliser TSQLMonitor, vous pouvez personnaliser la faon dont votre application assure le suivi des commandes SQL en recourant la mthode SetTraceCallbackEvent du composant connexion SQL. SetTraceCallbackEvent accepte deux paramtres : un callback de type TSQLCallbackEvent et une valeur dfinie par lutilisateur transmise la fonction de callback. La fonction de callback accepte deux paramtres, CallType et CBInfo : CallType est rserv un usage ultrieur. CBInfo est un pointeur vers un enregistrement qui comprend la catgorie (la mme que CallType), le texte de la commande SQL et la valeur dfinie par lutilisateur transmise la mthode SetTraceCallbackEvent. Le callback renvoie une valeur de type CBRType, gnralement cbrUSEDEF. Le pilote dbExpress appelle votre callback chaque fois que le composant connexion SQL transmet une commande au serveur ou que celui-ci renvoie un message derreur.
Attention

Nappelez pas SetTraceCallbackEvent si lobjet TSQLConnection est associ un composant TSQLMonitor. TSQLMonitor utilise le mcanisme de callback pour fonctionner et TSQLConnection ne peut prendre en charge quun callback la fois.

Utilisation densembles de donnes unidirectionnels

22-21

22-22

Guide du dveloppeur

23
Chapitre 23

Chapitre

Utilisation densembles de donnes client

Les ensembles de donnes client sont des ensembles de donnes spcialiss qui stockent toutes leurs donnes en mmoire. La manipulation des donnes stockes en mmoire est possible grce midaslib.dcu ou midas.dll. Le format utilis par les ensembles de donnes client pour le stockage des donnes est auto-contenu et facilement transportable ; cest ce qui permet aux ensembles de donnes client de : Lire et crire dans des fichiers ddis sur le disque, en agissant comme un ensemble de donnes bas sur des fichiers. Les proprits et mthodes prenant en charge ce mcanisme sont dcrites dans Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers la page 23-39. Mettre en cache les mises jour des donnes dun serveur de base de donnes. Les fonctionnalits des ensembles de donnes client prenant en charge les mises jour en cache sont dcrites dans Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18. Reprsenter les donnes dans la partie client dune application multiniveau. Pour fonctionner ainsi, lensemble de donnes client doit fonctionner avec un fournisseur externe, comme dcrit dans Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29. Pour plus dinformations sur ces mthodes, voir chapitre 25, Cration dapplications multiniveaux. Reprsenter les donnes issue dune source autre quun ensemble de donnes. Comme un ensemble de donnes client peut utiliser les donnes provenant dun fournisseur externe, des fournisseurs spcialiss peuvent adapter une grande varit de sources dinformations pour les faire fonctionner avec des ensembles de donnes client. Par exemple, vous pouvez utiliser un fournisseur XML pour permettre un ensemble de donnes client de reprsenter les informations contenues dans un document XML.

Utilisation densembles de donnes client

23-1

Manipulation des donnes avec un ensemble de donnes client

Que vous utilisiez les ensembles de donnes client avec des donnes bases sur des fichiers, pour mettre en cache les mises jour, avec des donnes issues dun fournisseur externe (comme avec un document XML ou dans une application multiniveau), ou en combinant toutes ces approches (comme dans une application de modle briefcase), vous bnficierez de la vaste gamme des fonctionnalits pour ensemble de donnes client lors de la manipulation des donnes.

Manipulation des donnes avec un ensemble de donnes client


Comme tout ensemble de donnes, les ensembles de donnes client vous permettent de fournir les donnes aux contrles orients donnes laide dun composant source de donnes. Voir chapitre 15, Utilisation de contrles de donnes, pour plus dinformations sur laffichage des informations de bases de donnes dans les contrles orients donnes. Les ensembles de donnes client implmentent toutes les proprits et les mthodes hrites de TDataSet. Pour une prsentation complte du comportement gnrique des ensembles de donnes, voir chapitre 18, Prsentation des ensembles de donnes. De plus, les ensembles de donnes client implmentent nombre des fonctionnalits courantes des ensembles de donnes de type table comme : Tri des enregistrements avec des index. Utilisation dindex pour chercher des enregistrements. Limitation des enregistrements avec des portes. Cration de relations matre/dtail. Contrle des accs en lecture/criture aux tables Cration de lensemble de donnes sous-jacent Vidage de lensemble de donnes Synchronisation des ensembles de donnes client

Pour plus de dtails sur ces fonctionnalits, voir Utilisation densembles de donnes de type table la page 18-29. Les ensembles de donnes client diffrent des autres ensembles de donnes en ce sens quils stockent toutes leurs donnes en mmoire. Cest pourquoi la prise en charge de certaines fonctions de bases de donnes peut largir leur champ daction et impliquer de nouvelles contraintes. Ce chapitre dcrit certaines de ces fonctions communes et les diffrences introduites par les ensembles de donnes client.

Navigation parmi les donnes des ensembles de donnes client


Si une application utilise des contrles orients donnes standard, un utilisateur peut se dplacer parmi les enregistrements dun ensemble de donnes client en utilisant le comportement intgr de ces contrles. Il est aussi possible davoir recours au code pour se dplacer parmi les enregistrements ; utilisez pour cela

23-2

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

les mthodes standard comme First, Last, Next et Prior. Pour plus dinformations sur ces mthodes, voir Navigation dans les ensembles de donnes la page 18-6. Au contraire de la majorit des ensembles de donnes, les ensembles de donnes client peuvent positionner le curseur sur un enregistrement spcifique dans lensemble de donnes en utilisant la proprit RecNo. Habituellement, une application utilise RecNo pour dterminer le numro de lenregistrement en cours. Mais, les ensembles de donnes client peuvent dfinir RecNo par un numro denregistrement afin que cet enregistrement devienne lenregistrement en cours.

Limitation des enregistrements affichs


Pour restreindre laccs aux donnes de manire temporaire, les applications peuvent dfinir des portes et des filtres. Lorsqu une porte ou un filtre est appliqu, lensemble de donnes client naffiche pas toutes les donnes places dans sa mmoire cache. A la place, il affiche uniquement celles correspondant aux conditions de la porte ou du filtre. Pour plus dinformations sur lutilisation de filtres, voir Affichage et dition densembles de donnes en utilisant des filtres la page 18-14. Pour plus dinformations sur les portes, voir Limitation des enregistrements avec des portes la page 18-35. Avec la majorit des ensembles de donnes, les chanes des filtres sont analyses et traduites en commandes SQL qui sont ensuite implmentes sur le serveur de base de donnes. De ce fait, le dialecte SQL du serveur limite les oprations utilises dans les chanes de filtre. Les ensembles de donnes client implmentent leur propre support des filtres, qui comprend davantage doprations que celui des autres ensembles de donnes. Par exemple, avec un ensemble de donnes client, les expressions de filtre peuvent comprendre des op rateurs de chanes renvoyant des sous-chanes, des oprateurs qui dcomposent des valeurs de date et dheure, etc. Les ensembles de donnes client autorisent lutilisation des filtres sur les champs BLOB et les types de champs complexes comme les champs ADT et les champs de tableaux. Voici les divers oprateurs et fonctions quun ensemble de donnes client peut utiliser dans les filtres, accompagns dune comparaison avec les autres ensembles de donnes prenant en charge les filtres :
Tableau 23.1 Support des filtres dans les ensembles de donnes client Pris en charge par dautres ensembles de donnes Commentaire
Oui Oui Oui Oui

Op rateur ou fonction
Comparaisons = <> >= <=

Exemple
State = CA State <> CA DateArrive >= 1/1/1998 Total <= 100000

Utilisation densembles de donnes client

23-3

Manipulation des donnes avec un ensemble de donnes client

Tableau 23.1

Support des filtres dans les ensembles de donnes client (suite) Pris en charge par dautres ensembles de donnes Commentaire
Oui Oui Oui Les enregistrements vierges ne saffichent que sils sont explicitement inclus dans le filtre.

Op rateur ou fonction
> < BLANK

Exemple
Pourcentage > 50 Champ1 < Champ2 State <> CA or State = BLANK

IS NULL IS NOT NULL Oprateurs logiques and or not Oprateurs arithmtiques +

Champ1 IS NULL Champ1 IS NOT NULL

Non Non

State = CA and Country = US not (State = CA)

Oui

State = CA or State = MA Oui Oui

Total + 5 > 100

Dpend du pilote Dpend du pilote Dpend du pilote Dpend du pilote

Sapplique aux nombres, aux chanes ou aux dates (heures) plus un nombre. Sapplique aux nombres, aux dates ou aux dates (heures) moins un nombre. Sapplique aux nombres uniquement. Sapplique aux nombres uniquement.

Champ1 - 7 <> 10

* /

Remise * 100 > 20 Remise > Total / 5

Fonctions String Upper Lower Substring Upper(Champ1) = TOUJOURS Non

Lower(Champ1 + Champ2) = Non josp Substring(ChampDate,8) = 1998 Substring(ChampDate,1,3) = JAN Non La valeur va de la position du second argument la fin ou au nombre de caractres dans le troisime argument. Le premier caractre a la position 1.

23-4

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

Tableau 23.1

Support des filtres dans les ensembles de donnes client (suite) Pris en charge par dautres ensembles de donnes Commentaire
Non Supprime le troisime argument au dbut et la fin. Sil ny a pas de troisime argument, supprime les espaces. Voir Trim. Voir Trim.

Op rateur ou fonction
Trim

Exemple
Trim(Champ1 + Champ2) Trim(Champ1, -)

TrimLeft TrimRight

TrimLeft(ChampString) TrimLeft(Champ1, $) <> TrimRight(ChampString) TrimRight(Champ1, .) <>

Non Non

Fonctions DateTime Year Month Day Hour Minute Second GetDate Date Time Year(ChampDate) = 2001 Month(ChampDate) <> 12 Day(ChampDate) = 1 Hour(ChampDate) < 16 Minute(ChampDate) = 0 Second(ChampDate) = 30 GetDate - DateField > 7 Non Non Non Non Non Non Non Reprsente la date et lheure en cours. Renvoie la partie date dune valeur date/heure. Renvoie la partie heure dune valeur date/heure.

ChampDate = Date(GetDate) Non ChampHeure > Time(GetDate) Non

Divers Like Memo LIKE %filters% Non Fonctionne comme SQL-92 sans la clause ESC. Lorsquelle est applique des champs BLOB, FilterOptions dtermine la prise en compte de la casse. Fonctionne comme SQL-92. Le second argument est une liste de valeurs toutes du mme type. Caractre gnrique pour les comparaisons partielles.

In

Day(ChampDate) in (1,7)

Non

State = M*

Oui

Lorsque vous appliquez des portes ou des filtres, lensemble de donnes client stockera tous les enregistrements en mmoire. La porte ou le filtre dtermine simplement quels sont les enregistrements accessibles aux contrles pour la navigation ou laffichage des donnes issues de lensemble client.

Utilisation densembles de donnes client

23-5

Manipulation des donnes avec un ensemble de donnes client

Remarque

Lors de lextraction de donnes en provenance dun fournisseur, vous pouvez aussi limiter les donnes stockes par lensemble de donnes client en transmettant des paramtres au fournisseur. Pour plus dinformations sur les portes, voir Limitation des enregistrements avec des paramtres la page 23-34.

Edition des donnes


Les ensembles de donnes client reprsentent leurs donnes sous la forme dun paquet de donnes en mmoire. Ce paquet est la valeur de la proprit Data de lensemble de donnes client. Par dfaut, cependant, les modifications ne sont pas enregistres dans la proprit Data. Les insertions, suppressions et modifications (faites par lutilisateur ou programmes) sont stockes dans un journal interne de modifications, reprsent par la proprit Delta. Lutilisation dun journal de modifications a une double finalit : Le journal de modifications est ncessaire pour appliquer des mises jour un serveur de base de donnes ou un composant fournisseur externe. Le journal de modifications constitue un outil labor pour lannulation de modifications. La proprit LogChanges vous permet de dsactiver temporairement le journal de modifications. Lorsque LogChanges vaut True, les modifications sont enregistres dans le journal. Si LogChanges vaut False, les modifications sont directement ralises dans la proprit Data. Vous pouvez dsactiver le journal de modifications dans les applications bases sur des fichiers si vous navez pas besoin de la fonctionnalit dannulation. Les modifications restent dans le journal de modifications jusqu ce quelles soient supprimes par lapplication. Les applications suppriment les modifications lors des tches suivantes : Annulation des modifications Enregistrement des modifications
Remarque

Lenregistrement de lensemble de donnes client dans un fichier ne supprime pas les modifications du journal. Lorsque vous rechargez lensemble de donnes, les proprits Data et Delta sont inchanges par rapport ce quelles taient lors de lenregistrement des donnes.

Annulation des modifications


Mme si la version originale dun enregistrement reste inchange dans la proprit Data, lutilisateur voit la toute dernire version de lenregistrement chaque fois qu il modifie lenregistrement, le laisse et le slectionne nouveau. Si un utilisateur ou une application modifie plusieurs fois un enregistrement, chaque version de lenregistrement est stocke dans une entre diffrente du journal de modifications.

23-6

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

La possibilit de stocker chaque modification apporte un enregistrement permet de supporter les oprations dannulation plusieurs niveaux : Pour supprimer la dernire modification apporte un enregistrement, appelez UndoLastChange. Cette mthode accepte un paramtre boolen, FollowChange, qui indique si le curseur doit tre repositionn sur lenregistrement restaur (True) ou sil doit tre laiss sur lenregistrement en cours (False). Si un enregistrement a subi plusieurs modifications, chaque appel UndoLastChange annule un niveau de modification. UndoLastChange renvoie une valeur boolenne indiquant si lannulation a russi ou chou. En cas de russite, UndoLastChange renvoie True. Utilisez la proprit ChangeCount pour dterminer si dautres modifications doivent tre annules. ChangeCount indique le nombre de modifications stockes dans le journal de modifications. Plutt que de supprimer chaque niveau de modification lun aprs lautre, vous pouvez les supprimer tous en une seule fois. Pour supprimer toutes les modifications apportes un enregistrement, slectionnez-le et appelez RevertRecord. Cette mthode supprime toutes les modifications apportes lenregistrement en cours. Pour restaurer un enregistrement supprim, dfinissez dabord la proprit StatusFilter par [ usDeleted], ce qui rend visibles les enregistrements supprims. Ensuite, naviguez jusqu lenregistrement que vous voulez restaurer et appelez RevertRecord. Enfin, restaurez la proprit StatusFilter en [usModified, usInserted, usUnmodified] de sorte que la version modifie de lensemble de donnes (contenant maintenant lenregistrement restaur) soit nouveau visible. A tout moment pendant les modifications, vous pouvez enregistrer ltat courant du journal de modifications laide de la proprit SavePoint. La lecture de SavePoint renvoie un marqueur la position courante dans le journal de modifications. Ultrieurement, si vous souhaitez annuler toutes les modifications opres depuis la lecture du point de sauvegarde, attribuez SavePoint la valeur lue. Votre application peut obtenir des valeurs pour plusieurs points de sauvegarde. Toutefois, lorsque vous sauvegardez le journal de modifications au niveau dun point de sauvegarde, les valeurs de tous les points de sauvegarde postrieurement lues par votre application ne sont plus valides. Toutes les modifications enregistres dans le journal de modifications peuvent tre abandonnes en appelant CancelUpdates. Cette mthode efface le journal de modifications et annule tous les changements apports lensemble des enregistrements. CancelUpdates doit tre employe avec prcaution. Aprs avoir appel la mthode CancelUpdates, il est impossible de rcuprer les modifications.

Enregistrement des modifications


Les ensembles de donnes client utilisent diffrents mcanismes pour intgrer les modifications partir du journal de modifications, selon quils stockent leurs donnes dans un fichier ou reprsentent des donnes manant dun serveur.

Utilisation densembles de donnes client

23-7

Manipulation des donnes avec un ensemble de donnes client

Quel que soit le mcanisme utilis, le journal de modifications est automatiquement vid lorsque les mises jour ont t intgres. Les applications bases sur des fichiers peuvent simplement fusionner les modifications dans la mmoire cache locale reprsente par la proprit Data. Elles ne sont pas concernes par la rsolution de modifications locales partir de changements raliss par dautres utilisateurs. Pour fusionner le journal de modifications dans la proprit Data, appelez la mthode MergeChangeLog. Fusion des modifications dans les donnes la page 23-41 dcrit ce processus. Vous ne pouvez pas utiliser MergeChangeLog si vous utilisez lensemble de donnes client pour mettre en cache des mises jour ou pour reprsenter les donnes issues dun composant fournisseur externe. Les informations contenues dans le journal de modifications sont requises pour rpercuter les enregistrements mis jour sur les donnes stockes dans la base de donnes (ou lensemble de donnes source). A la place, appelez ApplyUpdates, qui essaie dcrire les modifications sur le serveur de base de donnes ou lensemble de donnes source, et met jour la proprit Data uniquement lorsque les modifications ont t valides avec succs. Voir Application des mises jour la page 23-24, pour plus dinformations sur ce processus.

Dfinition de contraintes pour les valeurs des donnes


Les ensembles de donnes client peuvent imposer des contraintes aux modifications quun utilisateur peut effectuer sur les donnes. Ces contraintes sont appliques lorsque lutilisateur essaie de valider des changements dans le journal de modifications. Vous pouvez toujours fournir des contraintes personnalises. Elles vous permettent dimposer vos propres limites, dfinies par lapplication, sur les valeurs quun utilisateur peut valider dans un ensemble de donnes client. De plus, lorsque des ensembles de donnes client reprsentent des donnes dun serveur accd en utilisant le BDE, elles imposent galement les contraintes sur les donnes importes du serveur de base de donnes. Si lensemble de donnes client fonctionne avec un composant fournisseur externe, le fournisseur peut contrler si ces contraintes sont envoyes lensemble de donnes client, et lensemble de donnes client peut contrler sil les utilise. Pour savoir comment le fournisseur contrle si les contraintes sont incluses dans les paquets de donnes, voir Gestion des contraintes du serveur la page 24-15. Pour savoir comment et pourquoi lensemble de donnes client peut dsactiver lapplication des contraintes du serveur, voir Gestion des contraintes lies au serveur la page 23-35.

Spcification de contraintes personnalises


Vous pouvez utiliser les proprits des composants champ de lensemble de donnes client pour imposer vos propres contraintes quant aux donnes que

23-8

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

lutilisateur peut saisir. Chaque composant champ possde deux proprits qui peuvent tre utilises pour spcifier des contraintes : La proprit DefaultExpression dfinit une valeur par dfaut qui est attribue au champ si lutilisateur nen saisit pas une. Remarquez que si le serveur de base de donnes ou lensemble de donnes source attribue aussi une expression par dfaut au champ, celle de lensemble de donnes client est prioritaire car elle est attribue avant que la mise jour ne soit applique en retour sur le serveur de base de donnes ou dans lensemble de donnes source. La proprit CustomConstraint vous permet dimposer une condition remplir pour quune valeur de champ puisse tre valide. Les contraintes personnalises dfinies de cette faon sont appliques en plus des contraintes importes du serveur. Pour plus dinformations sur la manipulation des contraintes personnalises sur les composants champ, voir Cration de contrainte personnalise la page 19-25. Au niveau de lenregistrement, vous pouvez spcifier des contraintes laide de la proprit Constraints de lensemble de donnes client. Constraints est une collection dobjets TCheckConstraint , dans laquelle chacun deux reprsente une condition. Utilisez la proprit CustomConstraint dun objet TCheckConstraint pour ajouter vos propres contraintes, qui sont vrifies lorsque vous validez les enregistrements.

Tri et indexation
Lutilisation dindex prsente plusieurs avantages pour vos applications : Ils permettent aux ensembles de donnes client de localiser les donnes rapidement. Ils permettent dappliquer des portes pour limiter les enregistrements disponibles. Ils permettent votre application de dfinir des relations entre les autres ensembles de donnes, telles que des tables de rfrence ou des liens matre/ dtail. Ils spcifient lordre dans lequel les enregistrements apparaissent. Si un ensemble de donnes client reprsente les donnes dun serveur ou utilise un fournisseur externe, il hrite dun index et dun ordre de tri par dfaut, bass sur les donnes quil reoit. Lindex par dfaut sappelle DEFAULT_ORDER. Il est possible dutiliser ce classement, mais il est impossible de modifier ou de supprimer lindex. En plus de lindex par dfaut, lensemble de donnes client gre un deuxime index, appel CHANGEINDEX, partir des enregistrements stocks dans le journal de modifications (proprit Delta). CHANGEINDEX classe tous les enregistrements de lensemble de donnes tels quils apparatraient si les modifications de Delta taient appliques. CHANGEINDEX est bas sur lordre quil a hrit de DEFAULT_ORDER. Comme pour DEFAULT_ORDER, il est impossible de modifier ou de supprimer lindex CHANGEINDEX.

Utilisation densembles de donnes client

23-9

Manipulation des donnes avec un ensemble de donnes client

Vous pouvez utiliser dautres index existants ou crer vos propres index. Les sections suivantes dcrivent comment crer et utiliser des index avec des ensembles de donnes client.
Remarque

Vous pouvez galement vouloir revoir les documents sur les index dans les ensembles de donnes de type table, ce qui sapplique aussi aux ensembles de donnes client. Vous trouverez ces informations dans Tri des enregistrements avec des index la page 18-30 et Limitation des enregistrements avec des portes la page 18-35.

Ajout dun nouvel index


Il y a trois manires dajouter des index un ensemble de donnes client : Pour crer un index temporaire lexcution afin de trier les enregistrements de lensemble de donnes client, vous pouvez utiliser la proprit IndexFieldNames. Spcifiez les noms de champs en les sparant par des pointsvirgules. Lordre des noms de champs dans la liste dtermine leur ordre dans lindex. Cest la mthode dajout dindex la moins puissante. En effet, vous ne pouvez pas spcifier un index dcroissant ou ne tenant pas compte des diffrences majuscules/minuscules et les index gnrs ne grent pas le regroupement. Ces index ne sont pas prservs quand vous fermez l ensemble de donnes et ne sont pas enregistrs quand vous enregistrez lensemble de donnes client dans un fichier. Pour crer lexcution un index utilisable pour les regroupements, appelez la mthode AddIndex. AddIndex vous permet de spcifier les proprits de lindex, dont : Le nom de lindex. Il permet de permuter les index lexcution. Les champs qui composent lindex. Lindex utilise ces champs pour trier les enregistrements et localiser les enregistrements dont les champs indexs prsentent une valeur particulire. La faon dont lindex trie les enregistrements. Par dfaut, les index imposent un ordre de tri croissant (selon la configuration de la machine). Cet ordre de tri par dfaut tient compte de la casse. Vous pouvez dfinir des options pour que la totalit de lindex fasse la diffrence entre les majuscules et les minuscules ou pour trier par ordre dcroissant. Vous pouvez aussi spcifier une liste de champs trier sans tenir compte de la casse et une autre liste de champs trier par ordre dcroissant. Le niveau par dfaut de regroupement pris en charge par lindex. Les index crs avec AddIndex ne sont pas persistants aprs la fermeture de lensemble de donnes client. (Cest dire quils sont perdus lorsque vous rouvrez lensemble de donnes client). Vous ne pouvez pas appeler AddIndex quand lensemble de donnes client est ferm. Les index ajouts en employant AddIndex ne sont pas enregistrs quand vous enregistrez lensemble de donnes client dans un fichier.

23-10

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

La troisime mthode pour crer un index intervient lors de la cration de lensemble de donnes client. Avant de crer lensemble de donnes client, spcifiez les index souhaits en utilisant la proprit IndexDefs. Les index sont alors crs en mme temps que lensemble de donnes sous-jacent lors de lappel de CreateDataSet. Pour plus dinformations sur la cration des ensembles de donnes client, voir Cration et suppression des tables la page 18-44. Comme pour AddIndex, les index crs en mme temps que lensemble de donnes prennent en charge le regroupement et peuvent tre tris en ordre dcroissant sur certains champs et ne pas prendre en compte les diffrences majuscules-minuscules pour dautres. Les index crs de cette manire sont toujours conservs et enregistrs quand vous enregistrez lensemble de donnes client dans un fichier.
Conseil

Lindexation et le tri peuvent seffectuer sur des champs calculs en interne avec des ensembles de donnes client.

Suppression et permutation dindex


Pour supprimer un index ayant t cr pour un ensemble de donnes client, appelez DeleteIndex et spcifiez le nom de lindex supprimer. Les index DEFAULT_ORDER et CHANGEINDEX ne peuvent pas tre supprims. Lorsque plusieurs index sont disponibles, il est possible de changer dindex en utilisant la proprit IndexName. Lors de la phase de conception, les index disponibles peuvent tre slectionns dans la liste droulante de la proprit IndexName dans linspecteur dobjets.

Utilisation des index pour regrouper les donnes


Lorsque vous utilisez un index dans votre ensemble de donnes client, il impose automatiquement un ordre de tri sur les enregistrements. En raison de cet ordre de tri, des enregistrements adjacents contiennent gnralement les mmes valeurs dans les champs qui composent lindex. Par exemple, considrons la portion de table de commandes suivante indexe sur les champs SalesRep et Customer :
SalesRep
1 1 1 1 2 2

Customer
1 1 2 2 1 3

OrderNo
5 2 3 6 1 4

Amount
100 50 200 75 10 200

En raison de lordre de tri, les valeurs identiques dans la colonne SalesRep apparaissent regroupes. A lintrieur des champs relatifs au reprsentant (SalesRep) 1, les valeurs identiques de la colonne des clients (Customer) apparaissent regroupes. En dautres termes, les donnes sont regroupes par reprsentant (SalesRep) puis, dans le groupe SalesRep, par client (Customer). A chaque regroupement est associ un niveau. Dans notre exemple, le groupe

Utilisation densembles de donnes client

23-11

Manipulation des donnes avec un ensemble de donnes client

SalesRep est le niveau 1 (car il nest imbriqu dans aucun autre groupe) et le groupe Customer est le niveau 2 (car il est imbriqu dans le groupe de niveau 1). Le niveau de regroupement correspond lordre des champs dans lindex. Les ensembles de donnes client vous permettent de dterminer la position de lenregistrement en cours dans un niveau de regroupement donn. Cela permet votre application dafficher les enregistrements diffremment, suivant qu ils se trouvent en tte, au milieu ou la fin dun groupe. Par exemple, vous pouvez afficher une valeur de champ que si elle figure dans le premier enregistrement dun groupe et liminer ainsi les doublons. Le rsultat est le suivant partir de la table prcdente :
SalesRep
1

Customer
1 2

OrderNo
5 2 3 6 1 4

Amount
100 50 200 75 10 200

1 3

Pour dterminer la position de lenregistrement en cours dans un groupe, utilisez la mthode GetGroupState. GetGroupState accepte une valeur entire reprsentant le niveau du groupe et renvoie une valeur indiquant la position de lenregistrement en cours dans le groupe (premire position, dernire position ou aucune des deux positions). Lorsque vous crez un index, vous pouvez spcifier le niveau de regroupement quil prend en charge (jusquau nombre de champs prsents dans lindex). GetGroupState ne peut fournir dinformation sur les groupes au del de ce niveau, mme si lindex classe les enregistrements sur dautres champs.

Reprsentation des valeurs calcules


Comme pour tout ensemble de donnes, vous pouvez ajouter des champs calculs votre ensemble de donnes client. Il sagit de champs dont les valeurs sont calcules dynamiquement, gnralement en fonction des valeurs dautres champs du mme enregistrement. Pour plus dinformations sur lutilisation des champs calculs, voir D finition dun champ calcul la page 19-8. Toutefois, les ensembles de donnes client vous permettent de mieux dfinir quel moment les champs sont calculs par lutilisation de champs calculs de faon interne. Pour plus dinformations sur les champs calculs de faon interne, voir Utilisation de champs calculs de faon interne dans les ensembles de donnes client ci-aprs. Vous pouvez aussi indiquer aux ensembles de donnes client de crer des valeurs calcules qui rsument les donnes de plusieurs enregistrements laide des agrgats maintenus. Pour plus dinformations sur les agrgats maintenus, voir Utilisation des agrgats maintenus la page 23-13.

23-12

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

Utilisation de champs calculs de faon interne dans les ensembles de donnes client
Dans les autres ensembles de donnes, votre application doit dterminer la valeur des champs calculs chaque fois que lenregistrement change ou que lutilisateur modifie lun des champs de lenregistrement en cours. Elle ralise cela dans un gestionnaire dvnement OnCalcFields. Bien que vous puissiez utiliser ce procd dans les ensembles de donnes client, ces derniers, en enregistrant les valeurs calcules dans leurs donnes, vous permettent de rduire au minimum le nombre de fois o les champs calculs doivent tre recalculs. Lorsque les valeurs calcules sont enregistres avec lensemble de donnes client, elles doivent toujours tre recalcules lorsque lutilisateur modifie lenregistrement en cours mais votre application na pas besoin de recalculer les valeurs chaque fois que lenregistrement en cours change. Pour enregistrer les valeurs calcules dans les donnes de lensemble de donnes client, utilisez des champs calculs de faon interne la place de champs calculs. Les champs calculs de faon interne, comme les champs calculs, sont calculs dans un gestionnaire dvnement OnCalcFields. Toutefois, vous pouvez optimiser votre gestionnaire dvnement en vrifiant la proprit State de votre ensemble de donnes client. Lorsque State vaut dsInternalCalc, vous devez recalculer les champs calculs de faon interne. Lorsque State vaut dsCalcFields, il suffit de recalculer les champs calculs ordinaires. Pour utiliser des champs calculs de faon interne, vous devez dfinir les champs devant tre calculs de faon interne avant de crer lensemble de donnes client. Selon que vous utilisez des champs persistants ou des dfinitions de champs, vous ferez cela dune des faons suivantes : Si vous utilisez des champs persistants, dfinissez les champs devant tre calculs de faon interne en slectionnant InternalCalc dans lditeur de champs. Si vous utilisez des dfinitions de champs, attribuez la valeur True la proprit InternalCalcField de la dfinition de champ adquate.
Remarque

Dautres types densembles de donnes utilisent des champs calculs de faon interne. Mais, vous ne calculez pas les valeurs de ces champs dans un gestionnaire dvnement OnCalcFields. Elles sont automatiquement calcules par le BDE ou par le serveur de base de donnes distant.

Utilisation des agrgats maintenus


Les ensembles de donnes client permettent de rsumer les donnes manant de diffrents groupes denregistrements. Comme ces rsums sont automatiquement mis jour au fur et mesure que sont modifies les donnes dans lensemble de donnes, ces donnes de rsum sont appeles agrgats maintenus. Dans leur forme la plus simple, les agrgats maintenus vous permettent dobtenir des informations telles que la somme de toutes les valeurs dune colonne de lensemble de donnes client. Ils sont suffisamment souples, toutefois,

Utilisation densembles de donnes client

23-13

Manipulation des donnes avec un ensemble de donnes client

pour supporter un large ventail de calculs rsum et dterminer des sous-totaux englobant diffrents groupes denregistrements dfinis par un champ de lindex supportant le regroupement.

Spcification dagrgats
Pour spcifier que vous voulez oprer des calculs synthtiques partir des enregistrements dun ensemble de donnes client, utilisez la proprit Aggregates. Aggregates est un ensemble de spcifications dagrgat (TAggregate). Vous pouvez ajouter des spcifications dagrgat votre ensemble de donnes client laide de lditeur de collection lors de la conception ou en utilisant la mthode Add de Aggregates lors de lexcution. Si vous souhaitez crer des composants champ pour les agrgats, crez des champs persistants pour les valeurs synthtises dans lditeur de champs.
Remarque

Lorsque vous crez des champs synthtiss, les objets agrgat appropris sont automatiquement ajouts la proprit Aggregates de lensemble de donnes client. Ne les ajoutez pas de faon explicite lors de la cration des champs persistants synthtiss. Pour plus de dtails sur la cration des champs persistants synthtiss, voir Dfinition dun champ agrgat la page 19-12. Pour chaque agrgat, la proprit Expression indique le calcul synthtique quelle reprsente. Expression peut contenir une simple expression synthtique telle que
Sum(Champ1)

ou une expression complexe qui combine les informations de plusieurs champs, telle que
Sum(Qt * Prix) - Sum(MontantPay)

Les expressions dagrgat incluent un ou plusieurs oprateurs de synthse du tableau suivant :


Tableau 23.2 Oprateur
Sum Avg Count Min Max

Oprateurs de synthse pour les agrgats maintenus Rle


Somme des valeurs dun champ num rique ou dune expression Valeur moyenne dun champ numrique ou date/heure ou dune expression Spcification du nombre de valeurs exprimes pour un champ ou pour une expression Valeur minimale dun champ chane, numrique ou date/heure ou dune expression Valeur maximale dun champ chane, numrique ou date/heure ou dune expression

Les oprateurs de synthse portent sur des valeurs de champ ou sur des expressions conues partir de valeurs de champ laide des mmes oprateurs que ceux utiliss pour la cration de filtres. Vous ne pouvez pas, toutefois, imbriquer des oprateurs de synthse. Vous pouvez crer des expressions avec des oprateurs partir de valeurs synthtises, ou de valeurs synthtises et de constantes. Toutefois, vous ne pouvez pas combiner des valeurs synthtises et des valeurs de champ, car de telles expressions sont ambigus (rien nindique

23-14

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

quel enregistrement doit fournir la valeur de champ). Ces rgles sont illustres dans les expressions suivantes :
Sum(Qty * Price) {autoris -- synthse dune expression portant sur des champs }

Max(Champ1) - Max(Champ2) {autoris -- expression partir de synthses } Avg(TauxRemise) * 100 Min(Sum(Champ1)) Count(Champ1) - Champ2 {autoris -- expression partir dune synthse et dune constante } {non autoris -- synthses imbriques } {non autoris -- expression partir dune synthse et dun champ }

Agrgats de groupes denregistrements


Par dfaut, les agrgats maintenus sont calculs afin quils synthtisent tous les enregistrements de lensemble de donnes client. Toutefois, vous pouvez spcifier que lopration ne porte que sur les enregistrements dun groupe. Cela vous permet dobtenir des synthses intermdiaires, comme des sous-totaux impliquant des groupes denregistrements ayant une valeur de champ commune. Pour spcifier un agrgat maintenu sur un groupe denregistrements, vous devez disposer dun index partir duquel peut soprer le regroupement. Voir Utilisation des index pour regrouper les donnes la page 23-11, pour plus dinformations sur le regroupement. Une fois que vous disposez dun index qui regroupe les donnes en fonction de la synthse que vous voulez oprer, spcifiez les proprits IndexName et GroupingLevel dagrgat pour indiquer lindex utiliser et le groupe ou sousgroupe de cet index qui dfinit les enregistrements synthtiser. Par exemple, considrons la portion de table de commandes suivante trie par reprsentants (SalesRep) puis par clients (Customer) :
SalesRep
1 1 1 1 2 2

Customer
1 1 2 2 1 3

OrderNo
5 2 3 6 1 4

Amount
100 50 200 75 10 200

Le code suivant dfinit un agrgat maintenu qui indique le montant total des ventes ralis par chaque reprsentant :
Agg.Expression := Sum(Amount); Agg.IndexName := SalesCust; Agg.GroupingLevel := 1; Agg.AggregateName := Total for Rep;

Pour ajouter un agrgat qui synthtise chaque client pour un reprsentant donn, crez un agrgat maintenu de niveau 2.

Utilisation densembles de donnes client

23-15

Manipulation des donnes avec un ensemble de donnes client

Les agrgats maintenus qui synthtisent un groupe denregistrements sont associs un index spcifique. La proprit Aggregates peut inclure des agrgats qui utilisent diffrents index. Toutefois, seuls les agrgats qui synthtisent la totalit de lensemble de donnes client et ceux qui utilisent lindex en cours sont valides. La modification de lindex en cours dtermine les agrgats valides. Pour dterminer les agrgats valides un moment donn, utilisez la proprit ActiveAggs.

Obtention de valeurs dagrgat


Pour obtenir la valeur dun agrgat maintenu, appelez la mthode Value de lobjet TAggregate qui reprsente lagrgat. Value renvoie lagrgat maintenu du groupe qui contient lenregistrement en cours de lensemble de donnes client. Lorsque la synthse porte sur la totalit de lensemble de donnes client, vous pouvez appeler Value tout moment pour obtenir lagrgat maintenu. Toutefois, lorsque la synthse porte sur des informations regroupes, vous devez veiller ce que lenregistrement en cours se trouve dans le groupe synthtiser. Aussi est-il judicieux dobtenir les valeurs dagrgat des moments prcis, comme lorsque vous vous positionnez sur le premier ou le dernier enregistrement dun groupe. Utilisez la mthode GetGroupState pour dterminer la position de lenregistrement en cours dans un groupe. Pour afficher les agrgats maintenus dans les contrles orients donnes, utilisez lditeur de champs pour crer un composant champ agrgat persistant. Lorsque vous spcifiez un champ agrgat dans lditeur de champs, la proprit Aggregates de lensemble de donnes client est automatiquement mise jour pour intgrer la spcification dagrgat approprie. La proprit AggFields contient le nouveau composant champ agrgat tandis que la mthode FindField le renvoie.

Copie de donnes dun autre ensemble de donnes


Pour copier les donnes dun autre ensemble de donnes lors de la conception, cliquez avec le bouton droit sur lensemble de donnes client et choisissez Affecter donnes locales. Une bote de dialogue apparat, affichant tous les ensembles de donnes disponibles dans votre projet. Slectionnez les donnes et la structure que vous souhaitez copier et choisissez OK. Lorsque vous copiez lensemble de donnes source, votre ensemble de donnes client est automatiquement activ. Pour copier partir dun autre ensemble de donnes lexcution, vous pouvez affecter ses donnes directement ou, si la source est un autre ensemble de donnes client, cloner le curseur.

Affectation directe des donnes


Vous pouvez utiliser la proprit Data de lensemble de donnes client pour affecter des donnes un ensemble de donnes client depuis un autre ensemble de donnes. Data est un paquet de donnes qui se prsente sous la forme dun OleVariant. Un paquet de donnes peut maner dun autre ensemble de donnes client ou de tout autre ensemble de donnes avec laide dun fournisseur. Une

23-16

Guide du dveloppeur

Manipulation des donnes avec un ensemble de donnes client

fois quun paquet de donnes est affect Data, son contenu est automatiquement affich dans les contrles orients donnes connects lensemble de donnes client par un composant source de donnes. Lorsque vous ouvrez un ensemble de donnes client reprsentant des donnes du serveur ou utilisant un composant fournisseur externe, les paquets de donnes sont automatiquement affects Data. Lorsque votre ensemble de donnes client nutilise pas de fournisseur, vous pouvez copier les donnes partir dun autre ensemble de donnes client comme suit :
ClientDataSet1.Data := ClientDataSet2.Data; Remarque

Lorsque vous copiez la proprit Data dun autre ensemble de donnes client, vous copiez galement le journal de modifications, mais la copie ne reflte pas les filtres ni les portes ayant t appliqus. Pour inclure les filtres ou les portes, vous devez cloner le curseur de lensemble de donnes source. Si vous copiez partir dun ensemble de donnes autre qu un ensemble de donnes client, vous pouvez crer un composant fournisseur densembles de donnes, le relier lensemble de donnes source et copier ses donnes :
TempProvider := TDataSetProvider.Create(Form1); TempProvider.DataSet := SourceDataSet; ClientDataSet1.Data := TempProvider.Data; TempProvider.Free;

Remarque

Lorsque vous affectez directement les donnes la proprit Data, le nouveau paquet de donnes nest pas fusionn dans les donnes existantes. Au lieu de cela, toutes les anciennes donnes sont remplaces. Si vous souhaitez fusionner les modifications dun autre ensemble de donnes, et non copier ses donnes, vous devez utiliser un composant fournisseur. Crez un fournisseur densembles de donnes comme dans lexemple prcdent, mais attachez-le lensemble de donnes de destination et au lieu de copier la proprit Data, utilisez la mthode ApplyUpdates :
TempProvider := TDataSetProvider.Create(Form1); TempProvider.DataSet := ClientDataSet1; TempProvider.ApplyUpdates(SourceDataSet.Delta, -1, ErrCount); TempProvider.Free;

Clonage dun curseur densemble de donnes client


Les ensembles de donnes client utilisent la mthode CloneCursor qui vous permet de travailler avec une autre vue des donnes lexcution. CloneCursor permet un deuxime ensemble de donnes client de partager les donnes de lensemble de donnes client original. Ceci est moins onreux que de copier toutes les donnes originales mais, comme les donnes sont partages, le second ensemble de donnes client ne peut pas modifier les donnes sans affecter lensemble de donnes client original. CloneCursor prend trois paramtres : Source spcifie lensemble de donnes client cloner. Les deux autres paramtres (Reset et KeepSettings) indiquent si dautres informations que les donnes doivent tre copies. Il peut sagir de tout filtre, de

Utilisation densembles de donnes client

23-17

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

lindex en cours, de liens vers une table matre (lorsque lensemble de donnes source est un ensemble dtail), de la proprit ReadOnly et de tout lien vers un composant connexion ou un fournisseur. Lorsque Reset et KeepSettings valent False, un ensemble de donnes client clon est ouvert et les paramtres de lensemble de donnes client source sont utiliss pour dfinir les proprits de lensemble de donnes destination. Lorsque Reset vaut True, les proprits de lensemble de donnes client destination reoivent les valeurs par dfaut (aucun index ni filtre, aucune table matre, ReadOnly vaut False et aucun composant connexion ou fournisseur nest spcifi). Lorsque KeepSettings vaut True, les proprits de lensemble de donnes destination ne sont pas modifies.

Ajout dinformations dapplication aux donnes


Les dveloppeurs dapplications peuvent ajouter des informations personnalises la proprit Data de lensemble de donnes client. Comme ces informations sont regroupes dans le paquet de donnes, elles sont incluses lorsque vous enregistrez les donnes dans un fichier ou un flux. Elles sont copies lorsque vous copiez les donnes dans un autre ensemble de donnes. Elles peuvent aussi tre intgres dans la proprit Delta afin que le fournisseur puisse les lire lorsquil reoit les mises jour de lensemble de donnes client. Pour enregistrer les informations dapplication dans la proprit Data, utilisez la mthode SetOptionalParam. Cette mthode vous permet de stocker un OleVariant qui contient les donnes sous un nom spcifique. Pour extraire ces informations dapplication, utilisez la mthode GetOptionalParam, en transmettant le nom utilis pour leur stockage.

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
Lorsque vous modifiez des donnes dans la majorit des ensembles de donnes, chaque fois que vous supprimez ou mettez un enregistrement, par dfaut, lensemble de donnes gnre une transaction, supprime ou crit lenregistrement sur le serveur de base de donnes, puis valide la transaction. Sil y a un problme lors de lcriture des modifications dans la base de donnes, votre application reoit immdiatement une notification : lensemble de donnes dclenche une exception lorsque vous mettez (post) lenregistrement. Si votre ensemble de donnes utilise un serveur de base de donnes distant, cette approche peut rduire les performances, cause du trafic sur le rseau entre votre application et le serveur chaque fois que vous passez un nouvel enregistrement aprs ldition de lenregistrement en cours. Pour rduire le trafic sur le rseau, vous pouvez effectuer les mises jour dans un cache local. Lorsque vous mettez en cache les mises jour, votre application rcupre les donnes dans la base de donnes, les met en cache et les modifie en local, puis

23-18

Guide du dveloppeur

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

applique les mises jour du cache la base de donnes en une seule transaction. Lorsque vous mettez en cache les mises jour, les changements effectus sur un ensemble de donnes (comme mettre des modifications ou supprimer des enregistrements) sont stocks en local au lieu dtre crits directement dans la table sous-jacente lensemble de donnes. Lorsque les modifications sont termines, votre application appelle une mthode qui crit les modifications du cache dans la base de donnes et vide le cache. Mettre en cache les mises jour peut minimiser le temps de transaction et rduire le trafic sur le rseau. Cependant, les donnes mises en cache sont locales pour votre application et ne se trouvent plus sous le contrle des transactions. Cela signifie que, pendant que vous travaillez sur votre copie des donnes dans votre mmoire locale, dautres applications peuvent tre en train de changer les donnes dans la table de la base de donnes sous-jacente. Dautre part, elles ne peuvent pas voir les modifications que vous effectuez tant que ne validez pas les mises jour du cache. De ce fait, les mises jour en cache ne conviennent pas aux applications impliquant des donnes trop versatiles, car vous risqueriez de crer ou de rencontrer trop de conflits au moment dintgrer vos modifications dans la base de donnes. Bien que le BDE et ADO fournissent dautres mcanismes pour cacher les mises jour, lutilisation dun ensemble de donnes client offre plusieurs avantages : Lorsque des ensembles de donnes sont lis par des relations matre/dtail, lapplication des mises jour est gre votre place. Cela garantit que les mises jour dans des ensembles de donnes multiples lis entre eux sont effectues dans le bon ordre. Les ensembles de donnes client vous procurent le meilleur contrle sur le processus de mise jour. Vous pouvez dfinir des proprits pour influencer le SQL gnr pour mettre jour les enregistrements, spcifier la table utiliser dans le cas de mise jour denregistrements partir dune jointure multitable, ou mme appliquer les mises jour manuellement partir dun gestionnaire dvnement BeforeUpdateRecord. Si des erreurs se produisent pendant lapplication au serveur de la base de donnes des mises jour du cache, seuls les ensembles de donnes client (et les fournisseurs densembles de donnes) vous donnent des informations sur lenregistrement en cours dans le serveur en plus de la valeur originale (non modifie) de votre ensemble de donnes et de la nouvelle valeur (modifie) de la mise jour qui a chou. Les ensembles de donnes client vous permettent de spcifier le nombre derreurs de mise jour que vous pouvez accepter avant labandon de la totalit de la mise jour.

Utilisation densembles de donnes client

23-19

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

Prsentation de lutilisation dun cache pour les mises jour


Pour utiliser les mises jour en cache, les processus suivants doivent se produire successivement dans une application.

1 Indiquer les donnes que vous voulez modifier. La faon dont vous le ferez dpend du type densemble de donnes client que vous utilisez :
Si vous utilisez TClientDataSet, spcifiez le composant fournisseur qui reprsente les donnes que vous voulez modifier. Cela est dcrit dans Spcification dun fournisseur la page 23-30. Si vous utilisez un ensemble de donnes client associ un mcanisme daccs aux donnes particulier, vous devez - Identifier le serveur de base de donnes en dfinissant la proprit DBConnection par un composant de connexion appropri. - Indiquer les donnes que vous voulez voir en spcifiant les proprits CommandText et CommandType. CommandType indique si CommandText est une instruction SQL excuter, le nom dune procdure stocke ou le nom dune table. Si CommandText est une requte ou une procdure stocke, utilisez la proprit Params pour extraire les paramtres dentre. - Optionnellement, utilisez la proprit Options pour dterminer si les ensembles dtails imbriqus et les donnes BLOB doivent figurer dans les paquets de donnes ou tre extraits sparment, si les types spcifiques ddition (insertions, modifications ou suppressions) sont dsactivs, si une mme mise jour peut concerner plusieurs enregistrements du serveur et si les enregistrements de lensemble de donnes client sont rafrachis lorsquil applique les mises jour. Options est identique la proprit Options du fournisseur. Par consquent, vous pouvez dfinir des options non pertinentes ou inappropries. Par exemple, il ny a pas lieu dinclure poIncFieldProps, car lensemble de donnes client nextrait pas ses donnes dun ensemble de donnes comportant des champs persistants. De mme, il nest pas souhaitable dexclure poAllowCommandText, qui est inclus par dfaut, car cela dsactiverait la proprit CommandText, que lensemble de donnes client utilise pour spcifier quelles donnes il veut. Pour plus dinformations sur la proprit Options du fournisseur, voir Initialisation des options contrlant les paquets de donnes la page 24-6.

2 Afficher et modifier les donnes, permettre linsertion de nouveaux enregistrements et la suppression denregistrements existants. A la fois la copie originale de chaque enregistrement et toutes ses modifications sont stockes en mmoire. Ce processus est dcrit dans Edition des donnes la page 23-6. 3 Extraire des enregistrements supplmentaires si ncessaire. Par dfaut, les ensembles de donnes client extraient tous les enregistrements et les stockent en mmoire. Si un ensemble de donnes contient beaucoup denregistrements, ou des enregistrements avec des champs BLOB volumineux, vous souhaiterez probablement modifier ce comportement pour que lensemble de donnes clients nextrait que les enregistrements requis pour laffichage et recommence lopration lorsque cela savre nouveau ncessaire. Pour des dtails sur la

23-20

Guide du dveloppeur

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

faon de contrler le processus dextraction des enregistrements, voir Extraction des donnes dans lensemble de donnes ou le document source la page 23-31.

4 Optionnellement, rafrachir les enregistrements. Plus le temps passe, plus dautres utilisateurs risquent de modifier les donnes sur le serveur de la base de donnes. Cela peut provoquer un cart de plus en plus important entre les donnes de lensemble client et celles du serveur, et une augmentation des risques derreurs au moment o vous appliquerez les mises jour. Pour rduire ce problme, vous pouvez rafrachir les enregistrements nayant pas t modifis. Voir Rafrachissement des enregistrements la page 23-36, pour plus de dtails. 5 Appliquer les enregistrements du cache local la base de donnes ou annuler les mises jour. Pour chaque enregistrement crit dans la base de donnes, un vnement BeforeUpdateRecord est dclench. Si une erreur se produit lors de lcriture dun enregistrement dans la base de donnes, un vnement OnUpdateError permet lapplication de corriger cette erreur, si possible, et de poursuivre la mise jour. Lorsque les mises jour sont termines, toutes les mises jour appliques avec succs sont supprimes du cache local. Pour plus dinformations sur lapplication des mises jour dans la base de donnes, voir Mise jour des enregistrements la page 23-24.
Au lieu dappliquer les mises jour, une application peut annuler les mises jour, en vidant le journal de modifications sans les crire dans la base de donnes. Vous pouvez annuler les mises jour en appelant la mthode CancelUpdates. Tous les enregistrements supprims dans le cache sont dsupprims, les enregistrements modifis sont ramens leurs valeurs originelles, et les enregistrements nouvellement insrs disparaissent tout simplement.

Choix du type densemble de donnes pour les mises jour en cache


Delphi inclut certains composants densembles de donnes client spcialiss pour les mises jour en cache. Chaque ensemble de donnes client est associ un mcanisme daccs aux donnes particulier. Ils sont dcrits dans le tableau suivant :
Tableau 23.3 Ensembles de donn es client spcialiss pour les mises jour en cache Mcanisme d acc s aux donnes
Borland Database Engine dbExpress InterBase Express

Ensemble de donn es client


TBDEClientDataSet TSQLClientDataSet TIBClientDataSet

En outre, vous pouvez mettre en cache les mises jour en utilisant lensemble de donnes client gnrique ( TClientDataSet) avec un fournisseur externe et un ensemble de donnes source. Pour plus dinformations sur lutilisation de

Utilisation densembles de donnes client

23-21

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

TClientDataSet avec un fournisseur externe, voir Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29.
Remarque

Les ensembles de donnes client spcialiss associs chaque mcanisme daccs aux donnes utilisent en fait un fournisseur et un ensemble de donnes source. Mais, et le fournisseur et lensemble de donnes source sont internes par rapport lensemble de donnes client. Le plus simple est dutiliser un des ensembles de donnes client spcialiss pour mettre en cache les mises jour. Mais, il est parfois prfrable dutiliser TClientDataSet avec un fournisseur externe : Si vous utilisez un mcanisme daccs aux donnes nayant pas densemble de donnes client spcialis, vous devez utiliser TClientDataSet avec un composant fournisseur externe. Par exemple, si les donnes proviennent dun document XML ou dun ensemble de donnes personnalis. Si vous travaillez avec des tables entre lesquelles a t tablie une relation matre/dtail, vous devez utiliser TClientDataSet et le connecter, au moyen dun fournisseur, la table matre de deux ensembles de donnes source lis dans une relation matre/dtail. Lensemble de donnes client voit lensemble dtail comme le champ dun ensemble de donnes imbriqu . Cette approche est ncessaire pour permettre lapplication des mises jour des tables matre et client dans lordre correct. Si vous voulez coder des gestionnaires dvnements rpondant la communication entre lensemble client et le fournisseur (par exemple, avant et aprs que lensemble client extrait des enregistrements du fournisseur), vous devez utiliser TClientDataSet avec un composant fournisseur externe. Les ensembles de donnes client spcialiss publient les vnements les plus importants de lapplication des mises jour (OnReconcileError, BeforeUpdateRecord et OnGetTableName), mais ils ne publient pas les vnements priphriques de la communication entre lensemble client et son fournisseur, car au dpart ils ont t prvus pour les applications multiniveaux. Lorsque vous utilisez le BDE, vous pouvez vouloir utiliser un fournisseur externe et un ensemble de donnes source si vous avez besoin dutiliser un objet mise jour. Bien quil soit possible de coder un objet mise jour partir du gestionnaire dvnement BeforeUpdateRecord de TBDEClientDataSet, il est plus simple daffecter la proprit UpdateObject de lensemble de donnes source. Pour plus dinformations sur lutilisation des objets mise jour, voir Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45.

Indication des enregistrements modifis


Lorsque lutilisateur modifie un ensemble de donnes client, il vous semblera sans doute utile de fournir le feedback des modifications effectues. Cela sera particulirement utile si vous voulez autoriser lutilisateur dfaire certaines

23-22

Guide du dveloppeur

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

modifications en naviguant jusqu elles et en cliquant sur un bouton Dfaire par exemple. La mthode UpdateStatus et les proprits StatusFilter sont utiles pour fournir un feedback sur les mises jour qui se sont produites : UpdateStatus indique quel type de mise jour sest ventuellement produit sur lenregistrement en cours. Cela peut tre lune des valeurs suivantes : usUnmodified indique que lenregistrement en cours est inchang. usModified indique que lenregistrement en cours a t modifi. usInserted indique quun enregistrement a t insr par lutilisateur. usDeleted indique quun enregistrement a t supprim par lutilisateur.

StatusFilter contrle quels types de mises jour sont visibles dans le journal de modifications. StatusFilter fonctionne sur les enregistrements en cache comme les filtres sur des donnes standard. StatusFilter est un ensemble qui peut inclure nimporte quelle combinaison des valeurs suivantes : usUnmodified indique un enregistrement non modifi. usModified indique un enregistrement modifi. usInserted indique un enregistrement insr. usDeleted indique un enregistrement supprim.

Par dfaut, StatusFilter est lensemble [usModified, usInserted, usUnmodified]. Vous pouvez ajouter usDeleted cet ensemble afin de fournir le feedback des enregistrements supprims en plus.
Remarque

UpdateStatus et StatusFilter sont galement utiles dans les gestionnaires des vnements BeforeUpdateRecord et OnReconcileError. Pour plus dinformations sur BeforeUpdateRecord, voir Intervention pendant lapplication des mises jour la page 23-25. Pour plus dinformations OnReconcileError, voir Conciliation des erreurs de mise jour la page 23-27. Lexemple suivant montre comment fournir du feedback sur ltat de mise jour des enregistrements, en utilisant la mthode UpdateStatus. Il suppose que vous avez chang la proprit StatusFilter afin qu elle comprenne usDeleted, ce qui permet aux enregistrements supprims de rester visibles dans lensemble de donnes. Il suppose de plus que vous avez ajout un champ calcul lensemble de donnes, appel Status.
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet); begin with ClientDataSet1 do begin case UpdateStatus of usUnmodified: FieldByName(Status).AsString := ; usModified: FieldByName(Status).AsString := M; usInserted: FieldByName(Status).AsString := I; usDeleted: FieldByName(Status).AsString := D; end; end; end;

Utilisation densembles de donnes client

23-23

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

Mise jour des enregistrements


Le contenu du journal de modifications est stock en tant que paquet de donnes dans la proprit Delta de lensemble de donnes client. Pour rendre permanents les changements stocks dans Delta, lensemble de donnes client doit les appliquer la base de donnes (ou lensemble de donnes source ou au document XML). Lorsquun client applique les mises jour au serveur, le processus est le suivant :

1 Lapplication client appelle la mthode ApplyUpdates dun objet ensemble de donnes client. Cette mthode transmet le contenu de la proprit Delta de lensemble de donnes client au fournisseur (interne ou externe). Delta est un paquet de donnes qui contient les enregistrements mis jour, insrs et supprims dans un ensemble de donnes client. 2 Le fournisseur applique les mises jour, en plaant en mmoire cache tous les enregistrements problmatiques qu il ne peut pas rsoudre lui-mme. Voir Comment rpondre aux demandes de mise jour des clients la page 24-9, pour plus de dtails sur lapplication des mises jour par le fournisseur. 3 Le fournisseur renvoie tous les enregistrements non rsolus lensemble de donnes client dans un paquet de donnes Result. Le paquet de donnes Result contient tous les enregistrements non mis jour. Il contient aussi les informations derreur, comme les messages derreur et les codes derreur. 4 Lensemble de donnes client essaie de concilier les erreurs de mise jour renvoyes dans le paquet de donnes Result enregistrement par enregistrement.

Application des mises jour


Les changements apports la copie locale des donnes de lensemble client ne sont transmis au serveur de base de donnes (ou au document XML) que lorsque lapplication client appelle la mthodeApplyUpdates. ApplyUpdates prend les modifications dans le journal de modifications et les envoie au fournisseur sous forme dun paquet de donnes (nomm Delta). (Notez que, lors de lutilisation de la majorit des ensembles de donnes client, le fournisseur est interne lensemble de donnes client.) ApplyUpdates accepte un paramtre unique, MaxErrors, qui indique le nombre maximum derreurs que le fournisseur peut tolrer avant de mettre fin au processus de mise jour. Si MaxErrors est gal 0, tout le processus de mise jour prend fin ds quune erreur de mise jour se produit. Aucune modification nest crite dans la base de donnes et le journal de modifications de lensemble de donnes client reste inchang. Si MaxErrors est gal -1, un nombre quelconque derreurs est tolr et le journal de modifications contient tous les enregistrements nayant pas pu tre appliqus. Si MaxErrors a une valeur positive et quil se produit davantage derreurs que le nombre autoris par MaxErrors, toutes les mises jour sont annules. Sil se produit moins derreurs que le nombre spcifi par MaxErrors, tous les enregistrements qui sappliquent

23-24

Guide du dveloppeur

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

correctement sont automatiquement effacs du journal de modifications de lensemble de donnes client. ApplyUpdates renvoie le nombre rel derreurs rencontres, qui est toujours infrieur ou gal MaxErrors plus un. Cette valeur de renvoi indique le nombre denregistrements qui nont pas pu tre crits dans la base de donnes. La mthode ApplyUpdates de lensemble de donnes client effectue les oprations suivantes :

1 Elle appelle indirectement la mthode ApplyUpdates du fournisseur. La mthode ApplyUpdates du fournisseur crit les mises jour dans la base de donnes, dans lensemble de donnes source ou dans le document XML, et tente de corriger les erreurs rencontres. Les enregistrements quelle ne peut appliquer cause des erreurs sont renvoys lensemble de donnes client. 2 La mthode ApplyUpdates de lensemble de donnes client essaie alors de concilier ces enregistrements problmatiques en appelant la mthode Reconcile. Reconcile est une routine de gestion derreur qui appelle le gestionnaire dvnement OnReconcileError. Vous devez crire le code du gestionnaire dvnement OnReconcileError pour quil corrige les erreurs. Pour plus dinformations sur lutilisation de OnReconcileError, voir Conciliation des erreurs de mise jour la page 23-27. 3 Enfin, Reconcile supprime du journal de modifications celles dont lapplication a russi et met jour Data avec les nouveaux enregistrements mis jour. Quand Reconcile est termine, ApplyUpdates indique le nombre derreurs survenues.
Important

Dans certains cas, le fournisseur ne peut dterminer comment appliquer les mises jour (par exemple, lors de mises jour partir dune procdure stocke ou dune jointure multitable). Les ensembles de donnes client et les composants fournisseur gnrent des vnements vous permettant de grer de telles situations. Voir Intervention pendant lapplication des mises jour ci-aprs, pour plus de dtails. Si le fournisseur se trouve sur un serveur dapplications sans tat, vous voudrez peut-tre changer avec lui des informations dtat persistantes, avant ou aprs lapplication des mises jour. TClientDataSet reoit un vnement BeforeApplyUpdates avant que les mises jour ne soient envoyes, ce qui vous permet denvoyer au serveur des informations dtat persistantes. Une fois que les mises jour sont appliques (mais avant le processus de conciliation), TClientDataSet reoit un vnement AfterApplyUpdates, ce qui vous permet de rpondre toute information dtat persistante renvoye par le serveur dapplications.

Conseil

Intervention pendant lapplication des mises jour


Lorsquun ensemble de donnes client applique ses mises jour, le fournisseur dtermine comment grer lcriture des insertions, des suppressions et des modifications sur le serveur de la base de donnes ou dans lensemble de donnes source. Lorsque vous utilisez TClientDataSet avec un composant fournisseur externe, vous pouvez utiliser les proprits et les vnements de ce

Utilisation densembles de donnes client

23-25

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

fournisseur pour agir sur la faon dont sont appliques les mises jour. Ces mthodes sont dcrites dans Comment rpondre aux demandes de mise jour des clients la page 24-9. Mais, lorsque le fournisseur est interne, ce qui se passe pour tout ensemble de donnes client associ un mcanisme daccs aux donnes, vous ne pouvez pas dfinir ses proprits ni fournir de gestionnaire dvnement. Il sen suit que lensemble de donnes client publie une proprit et deux vnements vous permettant dagir sur la faon dont le fournisseur interne applique les mises jour. UpdateMode dtermine les champs utiliss pour rechercher des enregistrements dans les instructions SQL que gnre le fournisseur pour appliquer les mises jour. UpdateMode est identique la proprit UpdateMode du fournisseur. Pour plus dinformations sur la proprit UpdateMode du fournisseur, voir Comment contrler lapplication des mises jour la page 24-11. OnGetTableName qui vous permet de fournir au fournisseur le nom de la table de base de donnes laquelle il doit appliquer les mises jour. Cela permet au fournisseur de gnrer les instructions SQL de mise jour lorsqu il ne peut pas identifier la table de la base de donnes partir de la procdure stocke ou de la requte spcifie par CommandText. Par exemple, si la requte excute une jointure multitable qui nimplique des mises jour que pour une seule table, la fourniture dun gestionnaire dvnement OnGetTableName permet au fournisseur interne dappliquer correctement les mises jour. Le gestionnaire dvnement OnGetTableName reoit trois paramtres : le composant fournisseur interne, lensemble de donnes interne ayant extrait les donnes du serveur, et un paramtre pour renvoyer le nom de la table utiliser dans le SQL gnr. BeforeUpdateRecord se produit pour chaque enregistrement du paquet delta. Cet vnement permet deffectuer tout changement de dernire minute avant que lenregistrement ne soit insr, supprim ou modifi. En outre, il vous permet dexcuter vos propres instructions SQL pour appliquer la mise jour lorsque le fournisseur nest pas en mesure de gnrer une instruction SQL correcte (cest par exemple le cas des jointures multitables dans lesquelles plusieurs tables doivent tre mises jour.) Le gestionnaire dvnement BeforeUpdateRecord reoit cinq paramtres : le composant fournisseur interne, lensemble de donnes interne qui a extrait les donnes du serveur, un paquet delta positionn sur lenregistrement qui va tre mis jour, une indication de la nature de la mise jour (insertion, suppression ou modification), et un paramtre qui renvoie lindication que le gestionnaire dvnement a effectu la mise jour. Tout cela est illustr dans le gestionnaire dvnement suivant. Pour simplifier, cet exemple suppose que les instructions SQL sont accessibles en tant que variables globales ne ncessitant que les valeurs des champs :
procedure TForm1.SQLClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied Boolean); var

23-26

Guide du dveloppeur

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

SQL: string; Connection: TSQLConnection; begin Connection := (SourceDS as TCustomSQLDataSet).SQLConnection; case UpdateKind of ukModify: begin { 1st dataset: update Fields[1], use Fields[0] in where clause } SQL := Format(UpdateStmt1, [DeltaDS.Fields[1].NewValue, DeltaDS.Fields[0].OldValue]); Connection.Execute(SQL, nil, nil); { 2nd dataset: update Fields[2], use Fields[3] in where clause } SQL := Format(UpdateStmt2, [DeltaDS.Fields[2].NewValue, DeltaDS.Fields[3].OldValue]); Connection.Execute(SQL, nil, nil); end; ukDelete: begin { 1st dataset: use Fields[0] in where clause } SQL := Format(DeleteStmt1, [DeltaDS.Fields[0].OldValue]); Connection.Execute(SQL, nil, nil); { 2nd dataset: use Fields[3] in where clause } SQL := Format(DeleteStmt2, [DeltaDS.Fields[3].OldValue]); Connection.Execute(SQL, nil, nil); end; ukInsert: begin { 1st dataset: values in Fields[0] and Fields[1] } SQL := Format(InsertStmt1, [DeltaDS.Fields[0].NewValue, DeltaDS.Fields[1].NewValue]); Connection.Execute(SQL, nil, nil); { 2nd dataset: values in Fields[2] and Fields[3] } SQL := Format(InsertStmt2, [DeltaDS.Fields[2].NewValue, DeltaDS.Fields[3].NewValue]); Connection.Execute(SQL, nil, nil); end; end; Applied := True; end;

Conciliation des erreurs de mise jour


Deux vnements vous permettent de grer les erreurs qui se produisent pendant le processus de mise jour : Pendant le processus de mise jour, le fournisseur interne gnre un vnement OnUpdateError chaque fois quil rencontre une mise jour quil ne peut pas traiter. Si vous corrigez le problme dans le gestionnaire de lvnement OnUpdateError, lerreur nest pas comptabilise dans le nombre maximal derreurs pass la mthode ApplyUpdates. Cet vnement ne se produit que pour les ensembles de donnes client utilisant un fournisseur interne. Si vous utilisez TClientDataSet, vous pouvez utiliser la place lvnement OnUpdateError du composant fournisseur. Lorsque lopration de mise jour est compltement termine, lensemble de donnes client gnre un vnement OnReconcileError pour chaque

Utilisation densembles de donnes client

23-27

Utilisation dun ensemble de donnes client pour mettre en cache les mises jour

enregistrement que le fournisseur na pas pu appliquer sur le serveur de la base de donnes. Il faut toujours coder un gestionnaire dvnement OnReconcileError ou OnUpdateError, mme sil ne fait quabandonner les enregistrements nayant pas pu tre appliqus. Les gestionnaires des deux vnements fonctionnent de manire identique. Ils incluent les paramtres suivants : DataSet : Un ensemble de donnes client qui contient lenregistrement mis jour qui na pas pu tre appliqu. Vous pouvez utiliser les mthodes de lensemble de donnes client pour obtenir des informations sur lenregistrement problmatique et pour le modifier afin de rsoudre tous les problmes. Vous pouvez notamment utiliser les proprits CurValue, OldValue et NewValue des champs de lenregistrement en cours pour dterminer la cause du problme de mise jour. Toutefois, vous ne pouvez pas appeler une mthode de lensemble de donnes client qui modifie lenregistrement en cours dans votre gestionnaire dvnement. E : Un objet qui reprsente le problme qui sest produit. Vous pouvez utiliser cette exception pour extraire un message derreur ou pour dterminer la cause dune erreur de mise jour. UpdateKind : Le type de mise jour ayant gnr lerreur. UpdateKind peut tre ukModify (problme survenu lors de la mise jour dun enregistrement existant modifi), ukInsert (problme survenu lors de linsertion dun nouvel enregistrement) ou ukDelete (problme survenu lors de la suppression dun enregistrement existant). Action : Un paramtre var qui indique laction entreprendre la fin de lexcution du gestionnaire dvnement. Dans votre gestionnaire dvnement, vous initialisez ce paramtre pour Ignorer lenregistrement et le laisser dans le journal de modifications. (rrSkip ou raSkip) Abandonner lopration de conciliation entire. (rrAbort ou raAbort) Fusionner la modification infructueuse avec lenregistrement correspondant sur le serveur. (rrMerge ou raMerge) Cela ne fonctionne que si lenregistrement du serveur ninclut pas de modification sur les champs modifis dans lenregistrement de lensemble de donnes client. Remplacer la mise jour courante dans le journal de modifications par la valeur de lenregistrement dans le gestionnaire dvnement, qui a normalement t corrig. (rrApply ou raCorrect) Ignorer lerreur compltement. (rrIgnore) Cette possibilit nexiste que dans le gestionnaire dvnement OnUpdateError, elle est prvue pour le cas o le gestionnaire dvnement applique la mise jour dans le serveur de la base de donnes. Lenregistrement mis jour est supprim du journal de modifications et fusionn dans Data, comme si le fournisseur avait appliqu la mise jour.

23-28

Guide du dveloppeur

Utilisation dun ensemble de donnes client avec un fournisseur

Retirer les modifications de lenregistrement sur lensemble de donnes client, en rappliquant les valeurs initialement fournies. (raCancel) Cette possibilit nexiste que dans le gestionnaire dvnement OnReconcileError. Mettre jour la valeur de lenregistrement en cours en fonction de lenregistrement du serveur. (raRefresh) Cette possibilit nexiste que dans le gestionnaire dvnement OnReconcileError. Le code suivant montre un gestionnaire dvnement OnReconcileError qui utilise la bote de dialogue derreur et de conciliation de lunit RecError prsente dans le rpertoire objrepos. Pour utiliser cette bote de dialogue, ajoutez RecError votre clause uses.
procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind, var Action TReconcileAction); begin Action := HandleReconcileError(DataSet, UpdateKind, E); end;

Utilisation dun ensemble de donnes client avec un fournisseur


Un ensemble de donnes client utilise un fournisseur pour se fournir en donnes et applique des mises jour lorsque II met en cache les mises jour dun serveur de base de donnes ou dun autre ensemble de donnes. Il reprsente les donnes dun document XML. Il stocke les donnes de la partie client dune application multiniveau. Pour tout ensemble de donnes client autre que TClientDataSet, ce fournisseur est interne et, de cette faon, non directement accessible lapplication. Avec TClientDataSet, le fournisseur est un composant externe qui lie lensemble de donnes client une source de donnes externe. Un fournisseur externe peut rsider dans la mme application que lensemble de donnes client ou faire partie dune application spare excute sur un autre systme. Pour plus dinformations sur les composants fournisseur, voir chapitre 24, Utilisation des composants fournisseur. Pour plus dinformations sur les applications dans lesquelles le fournisseur rside sur une application spare excute sur un systme diffrent, voir chapitre 25, Cration dapplications multiniveaux. Lorsque vous utilisez un fournisseur (interne ou externe), lensemble de donnes client met toujours en cache toutes les mises jour. Pour plus dinformations, voir Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18. Les rubriques suivantes dcrivent les proprits et mthodes supplmentaires de lensemble de donnes client lui permettant de fonctionner avec un fournisseur.

Utilisation densembles de donnes client

23-29

Utilisation dun ensemble de donnes client avec un fournisseur

Spcification dun fournisseur


Contrairement aux ensembles de donnes client associs un mcanisme daccs aux donnes, TClientDataSet na pas de composant fournisseur interne pour empaqueter les donnes ou appliquer des mises jour. Si vous voulez quil reprsente des donnes issues dun ensemble de donnes source ou dun document XML, vous devez associer lensemble client avec un composant fournisseur externe. La faon dont vous associez TClientDataSet un fournisseur dpend de lendroit o se trouve le fournisseur : dans la mme application que lensemble de donnes client ou sur un serveur dapplications distant excut sur un autre systme. Si le fournisseur se trouve dans la mme application que lensemble de donnes client, vous pouvez associer lensemble de donnes un fournisseur en choisissant celui-ci dans la liste droulante de la proprit ProviderName dans linspecteur dobjets. Ce procd fonctionne sous rserve que le fournisseur possde le mme Owner que lensemble de donnes client. Lensemble de donnes client et le fournisseur possdent le mme Owner sils sont placs dans la mme fiche ou dans le mme module de donnes. Pour utiliser un fournisseur local possdant un Owner diffrent, vous devez tablir lassociation lexcution laide de la mthode SetProvider de lensemble de donnes client. Si vous envisagez de passer un fournisseur distant ou si vous voulez faire directement appel linterface IAppServer, vous pouvez dfinir la proprit RemoteServer par un composant TLocalConnection. Si vous utilisez TLocalConnection, linstance TLocalConnection gre la liste des tous les fournisseurs locaux par rapport votre application, et les appels IAppServer de lensemble de donnes client. Si vous nutilisez pas TLocalConnection, Delphi cre un objet cach pour grer les appels IAppServer de lensemble de donnes client. Si le fournisseur se trouve sur un serveur dapplications distant, outre la proprit ProviderName, vous devez sp cifier un composant qui connecte lensemble de donnes client au serveur dapplications. Voici deux proprits pouvant grer cette tche : RemoteServer, qui spcifie le nom dun composant connexion partir duquel obtenir une liste de fournisseurs, ou ConnectionBroker, qui spcifie un courtier ou agent centralis fournissant un niveau dindirection supplmentaire entre lensemble client et le composant connexion. Le composant connexion et le composant courtier, lorsquil est utilis, se trouvent dans le mme module de donnes que lensemble de donnes client. Le composant connexion tablit et maintient la connexion au serveur dapplications, cest pourquoi il est parfois appel le courtier ou lagent des donnes. Pour plus dinformations, voir Structure de lapplication client la page 25-5. Aprs avoir spcifi en mode conception la proprit RemoteServer ou ConnectionBroker, vous pouvez slectionner un fournisseur dans la liste droulante de la proprit ProviderName dans linspecteur dobjets. Cette liste

23-30

Guide du dveloppeur

Utilisation dun ensemble de donnes client avec un fournisseur

contient les fournisseurs locaux (appartenant la mme fiche ou au mme module de donnes) et les fournisseurs distants accessibles par le biais du composant connexion.
Remarque

Si le composant connexion est une instance de TDCOMConnection, le serveur dapplications doit tre recens sur la machine client. A lexcution, vous pouvez passer dun fournisseur lautre (local ou distant) en modifiant la proprit ProviderName dans le code.

Extraction des donnes dans lensemble de donnes ou le document source


Les ensembles de donnes client peuvent contrler comment ils vont extraire les paquets de donnes dun fournisseur. Par dfaut, un ensemble de donnes client extrait tous les enregistrements de lensemble de donnes source. Cela est vrai si lensemble source et le fournisseur sont des composants internes (comme avec TBDEClientDataSet, TSQLClientDataSet et TIBClientDataSet), ou des composants spars qui fournissent les donnes au TClientDataSet. Vous pouvez changer la faon dont lensemble de donnes client lit les enregistrements, en utilisant les proprits PacketRecords et FetchOnDemand.

Extractions incrmentales
En changeant la proprit PacketRecords, vous pouvez demander que lensemble de donnes client lise les donnes en fragments plus petits. PacketRecords spcifie la quantit denregistrements extraire la fois et le type des enregistrements renvoyer. Par dfaut, PacketRecords vaut -1, ce qui signifie que tous les enregistrements disponibles sont extraits la fois, que ce soit la premire ouverture de lensemble de donnes client ou lorsque lapplication appelle explicitement GetNextPacket. Lorsque PacketRecords vaut -1, lensemble de donnes client nextrait pas de donnes supplmentaires aprs la premire extraction des donnes, car il dispose de tous les enregistrements disponibles. Pour extraire les enregistrements par petits lots, affectez PacketRecords une valeur correspondant au nombre denregistrements voulu. Par exemple, linstruction suivante fixe la taille de chaque paquet de donnes dix enregistrements :
ClientDataSet1.PacketRecords := 10;

Ce processus dextraction denregistrements par petits lots est appel extraction incrmentale. Les ensembles de donnes client utilisent lextraction incrmentale lorsque PacketRecords est suprieur zro. Pour lire chaque lot denregistrements, lensemble de donnes client appelle GetNextPacket. Les paquets extraits sont ajouts la fin des donnes se trouvant dj dans lensemble de donnes client. GetNextPacket renvoie le nombre denregistrements extraits. Si la valeur renvoye est quivalente la valeur de PacketRecords, cest que tous les enregistrements disponibles nont pas t traits. Si la valeur renvoye est suprieure 0 mais infrieure PacketRecords, cest que

Utilisation densembles de donnes client

23-31

Utilisation dun ensemble de donnes client avec un fournisseur

le dernier enregistrement a t atteint durant lopration dextraction. Si GetNextPacket renvoie 0, cest quil ny a plus aucun enregistrement extraire.
Attention

Lextraction incrmentale ne fonctionne pas si les donnes sont extraites dun fournisseur distant situ sur un serveur dapplications sans tat. Voir Gestion des informations dtat dans les modules de donnes distants la page 25-23, pour plus dinformations sur lutilisation de lextraction incrmentale avec les modules de donnes distants sans tat. La proprit PacketRecords peut aussi tre utilise pour extraire des informations mtadonnes sur lensemble de donnes source. Pour extraire des informations mtadonnes, PacketRecords doit valoir 0.

Remarque

Extraction la demande
Lextraction automatique denregistrements est contrle par la proprit FetchOnDemand. Lorsque FetchOnDemand vaut True (la valeur par dfaut), lensemble de donnes client lit automatiquement les enregistrements en fonction des besoins. Pour empcher lextraction automatique des enregistrements, mettez FetchOnDemand False. Si FetchOnDemand est False, lapplication doit appeler explicitement GetNextPacket pour extraire des enregistrements. Par exemple, les applications qui doivent reprsenter des ensembles de donnes trs volumineux accessibles en lecture seulement peuvent dsactiver FetchOnDemand afin que les ensembles de donnes client nessaient pas de charger plus de donnes que la mmoire ne peut en contenir. Entre les extractions, lensemble de donnes client libre sa mmoire cache laide de la mthode EmptyDataSet. Cette approche, toutefois, ne fonctionne pas trs bien lorsque le client doit renvoyer les mises jour au serveur. Le fournisseur contrle si les enregistrements figurant dans les paquets de donnes comprennent des donnes BLOB et des ensembles de donnes dtail imbriqus. Si le fournisseur exclut cette information des enregistrements, la proprit FetchOnDemand oblige lensemble de donnes client extraire automatiquement les donnes BLOB et les ensembles de donnes dtail au fur et mesure des besoins. Si FetchOnDemand vaut False, et si le fournisseur ne contient pas de donnes BLOB ni densembles de donnes dtail avec les enregistrements, vous devez appeler explicitement la mthode FetchBlobs ou FetchDetails pour extraire ces informations.

Obtention de paramtres de lensemble de donnes source


Il existe deux cas dans lesquels un ensemble de donnes client doit obtenir des valeurs de paramtres : Lapplication a besoin de la valeur des paramtres de sortie dune procdure stocke. Le client souhaite initialiser les paramtres dentre dune requte ou dune procdure stocke daprs les valeurs en cours dans lensemble de donnes source.

23-32

Guide du dveloppeur

Utilisation dun ensemble de donnes client avec un fournisseur

Les ensembles de donnes client stockent les valeurs des paramtres dans leur proprit Params. Ces valeurs sont rafrachies par des paramtres de sortie quelconques chaque fois que lensemble de donnes client lit les donnes depuis lensemble de donnes source. Il peut cependant exister des cas o un composant TClientDataSet dans une application client a besoin de paramtres de sortie alors quil ne lit pas de donnes. Pour lire des paramtres de sortie sans lire denregistrement, ou pour initialiser des paramtres dentre, lensemble de donnes client peut extraire des valeurs de paramtre de lensemble de donnes source en appelant la mthode FetchParams. Les paramtres sont renvoys dans un paquet de donnes depuis le fournisseur et affects la proprit Params de lensemble de donnes client. A la conception, la proprit Params peut tre initialise en cliquant avec le bouton droit sur lensemble de donnes client et en choisissant Rcuprer les paramtres.
Remarque

Il nest jamais ncessaire dappeler FetchParams lorsque lensemble de donnes client utilise un fournisseur interne et un ensemble de donnes source, car la proprit Params reflte toujours les paramtres de lensemble de donnes source interne. Dans le cas de TClientDataSet, la mthode FetchParams (ou la commande Rcuprer les paramtres) ne fonctionne que si lensemble de donnes client est connect un fournisseur dont lensemble de donnes associ peut fournir des paramtres. Par exemple, si lensemble de donnes source est un ensemble de donnes de type table, il ny a aucun paramtre rcuprer. Si le fournisseur rside sur un systme spar dans le cadre dun serveur dapplications sans tat, vous ne pouvez pas utiliser FetchParams pour extraire des paramtres de sortie. Dans un serveur dapplications sans tat, dautres clients peuvent modifier et r-excuter la requte ou la procdure stocke, en changeant les paramtres de sortie avant lappel de FetchParams. Pour extraire des paramtres de sortie depuis un serveur dapplications sans tat, utilisez la mthode Execute. Si le fournisseur est associ une requte ou une procdure stocke, Execute indique au fournisseur dexcuter la requte ou la procdure stocke et de renvoyer les ventuels paramtres de sortie. Ces paramtres renvoys sont alors utiliss pour mettre automatiquement jour la proprit Params.

Transmission de paramtres lensemble de donnes source


Les ensembles de donnes client peuvent transmettre des paramtres lensemble de donnes source pour spcifier les donnes qui doivent figurer dans les paquets de donnes quil envoie. Ces paramtres peuvent spcifier : Les valeurs des paramtres en entre dune requte ou dune procdure stocke excute sur le serveur dapplications Les valeurs des champs qui limitent le nombre denregistrements envoys dans les paquets de donnes Vous pouvez spcifier les valeurs de paramtres que votre ensemble de donnes client envoie au fournisseur lors de la conception ou lexcution. Lors de la conception, slectionnez lensemble de donnes client et double-cliquez sur la

Utilisation densembles de donnes client

23-33

Utilisation dun ensemble de donnes client avec un fournisseur

proprit Params dans linspecteur dobjets. Cela appelle lditeur de collection, dans lequel vous pouvez ajouter, supprimer ou rorganiser les paramtres. Lorsque vous slectionnez un paramtre dans lditeur de collection, vous pouvez en modifier les proprits laide de linspecteur dobjets. A lexcution, utilisez la mthode CreateParam de la proprit Params pour ajouter des paramtres votre ensemble de donnes client. CreateParam renvoie un objet paramtre, dot dun nom, dun type de paramtre et dun type de donnes particuliers. Vous pouvez alors utiliser les proprits de cet objet paramtre pour affecter une valeur au paramtre. Par exemple, le code suivant attribue la valeur 605 un paramtre appel CustNo :
with ClientDataSet1.Params.CreateParam(ftInteger, CustNo, ptInput) do AsInteger := 605;

Si lensemble de donnes client nest pas actif, vous pouvez envoyer les paramtres au serveur dapplications et rcuprer un paquet de donnes qui reflte ces valeurs de paramtre en mettant simplement la proprit Active True.

Envoi de paramtres de requte ou de procdure stocke


Lorsque la proprit CommandType de lensemble de donns client est ctQuery ou ctStoredProc, ou lorsque le fournisseur associ reprsente le rsultat dune requte ou dune procdure stocke, si lensemble de donnes client est une instance de TClientDataSet, vous pouvez utiliser la proprit Params pour spcifier la valeur des paramtres. Quand lensemble client demande des donnes lensemble source ou utilise sa mthode Execute pour excuter une requ te ou une procdure stocke ne renvoyant pas densemble de donnes, il transmet les valeurs de ces paramtres en mme temps que la demande des donnes ou que la commande execute. Lorsque le fournisseur reoit ces paramtres, il les affecte lensemble de donnes qui lui est associ. Il indique alors lensemble de donnes dexcuter la requ te ou la procdure stocke en utilisant les valeurs de ces paramtres et, si lensemble de donnes client a demand des donnes, il commence fournir celles-ci, en commenant par le premier enregistrement de lensemble de rsultats.
Remarque

Les noms de paramtres doivent correspondre aux noms des paramtres correspondants dans lensemble de donnes source.

Limitation des enregistrements avec des paramtres


Si lensemble de donnes client est une instance de TClientDataSet dont le fournisseur associ reprsente un composant TTable ou TSQLTable une instance de TSQLClientDataSet or TBDEClientDataSet dont la proprit CommandType est ctTable il peut alors utiliser la proprit Params pour limiter les enregistrements mis en mmoire cache. Chaque paramtre reprsente la valeur dun champ, cette valeur

23-34

Guide du dveloppeur

Utilisation dun ensemble de donnes client avec un fournisseur

doit se trouver dans un enregistrement pour que celui-ci soit inclus dans les donnes de lensemble client. Cela fonctionne comme un filtre, sauf quavec un filtre, les enregistrements sont encore en mmoire cache mais considrs comme non disponibles. Le nom de chaque paramtre doit correspondre un nom de champ. Lorsque vous utilisez TClientDataSet, ce sont les noms des champs du composant TTable ou TSQLTable associ au fournisseur. Lorsque vous utilisez TSQLClientDataSet ou TBDEClientDataSet, ce sont les noms des champs de la table sur le serveur de base de donnes. Lensemble client ne contient alors que les enregistrements dont les valeurs dans les champs quivalents correspondent celles des paramtres. Par exemple, supposons une application qui affiche les commandes dun seul client. Lorsque lutilisateur identifie le client, lensemble de donnes client dfinit sa proprit Params pour inclure un paramtre unique nomm CustID, dont la valeur identifie le client dont les commandes doivent tre affiches. Quand lensemble de donnes client demande les donnes de lensemble de donnes source, il transmet la valeur de ce paramtre. Le fournisseur nenvoie ensuite que les enregistrements concernant le client identifi. Ceci est beaucoup plus efficace que la solution dans laquelle tous les enregistrements de commande sont envoys par le fournisseur lapplication client puis filtrs laide de lensemble de donnes client.

Gestion des contraintes lies au serveur


Lorsquun serveur de base de donnes dfinit des contraintes sur la validit des donnes, il est utile que lensemble de donnes client les connaisse. Ainsi, lensemble de donnes client peut garantir que les modifications apportes par lutilisateur nenfreignent pas les contraintes tablies par le serveur. Il sen suit que de telles violations ne sont jamais transmises au serveur de la base de donnes o elles auraient t rejetes. Cela signifie que les mises jour gnrant des erreurs lors du processus de mise jour sont moins nombreuses. Indpendamment de la source des donnes, vous pouvez dupliquer les contraintes du serveur en les ajoutant explicitement lensemble de donnes client. Ce processus est dcrit dans Spcification de contraintes personnalises la page 23-8. Cest cependant plus pratique si les contraintes du serveur sont automatiquement incluses dans les paquets de donnes. Car vous navez pas spcifier explicitement les expressions ni les contraintes par dfaut, et lensemble de donnes client change les valeurs quil rend obligatoires lorsque les contraintes du serveur changent. Par dfaut, voici ce quil se produit exactement : si lensemble de donnes source est averti des contraintes du serveur, le fournisseur les inclut automatiquement dans les paquets de donnes et lensemble de donnes client les impose lorsque lutilisateur poste ses modifications dans le journal de modifications.
Remarque

Seuls les ensembles de donnes qui utilisent le BDE peuvent importer des contraintes partir du serveur. Cela signifie que les contraintes du serveur ne sont incluses dans les paquets de donnes que si vous utilisez TBDEClientDataSet

Utilisation densembles de donnes client

23-35

Utilisation dun ensemble de donnes client avec un fournisseur

ou TClientDataSet avec un fournisseur qui reprsente une base de donnes base sur le BDE. Pour plus dinformations sur la faon dimporter les contraintes du serveur et dempcher un fournisseur de les inclure dans les paquets de donnes, voir Gestion des contraintes du serveur la page 24-15.
Remarque

Pour plus dinformations sur lutilisation des contraintes lorsquelles ont t importes, voir Utilisation des contraintes du serveur la page 19-25. Bien que limportation des contraintes et des expressions du serveur soit une fonctionnalit de grand intrt, qui aide une application prserver lintgrit des donnes, il y a des circonstances o apparat la ncessit de les dsactiver de manire provisoire. Par exemple, si une contrainte du serveur est base sur la valeur maximale en cours dans un champ et si lensemble de donnes client utilise la lecture incrmentale, la valeur maximale en cours dans lensemble de donnes client peut tre diffrente de la valeur maximale sur le serveur de la base de donnes et les contraintes appeles diffremment. Dans un autre cas, si un ensemble de donnes client applique un filtre aux enregistrements quand des contraintes sont actives, ce filtre peut provoquer des interfrences indsirables avec les conditions des contraintes. Dans chacun de ces cas, une application peut dsactiver le contrle des contraintes. Pour dsactiver temporairement les contraintes, appelez la mthode DisableConstraints. A chaque appel de DisableConstraints, un compteur de rfrences est incrment. Tant que la valeur de ce compteur est suprieure zro, les contraintes ne sont pas appliques sur lensemble de donnes client. Pour ractiver les contraintes pour lensemble de donnes client, appelez la mthode EnableConstraints de lensemble de donnes. Chaque appel EnableConstraints dcrmente le compteur de rfrences. Quand ce compteur atteint la valeur zro, les contraintes sont nouveau actives.

Conseil

Appelez toujours DisableConstraints et EnableConstraints dans des blocs apparis pour garantir que les contraintes sont actives quand vous souhaitez quelles le soient.

Rafrachissement des enregistrements


Les ensembles de donnes client manipulent une photographie mmorise des donnes de lensemble de donnes source. Si lensemble source reprsente un serveur de base de donnes, au fur et mesure que le temps passe, dautres utilisateurs peuvent modifier ces donnes. Les donnes de lensemble de donnes client deviennent une reprsentation de moins en moins fidle des donnes sousjacentes. Comme tout ensemble de donnes, les ensembles de donnes client disposent dune mthode Refresh qui met jour ses enregistrements en fonction des valeurs courantes sur le serveur. Toutefois, lappel de Refresh ne fonctionne que si le journal de modifications ne contient aucun changement. Lappel de Refresh alors que des modifications nont pas t appliqu es dclenche une exception. Les ensembles de donnes client peuvent aussi mettre jour les donnes sans toucher au journal de modifications. Pour ce faire, appelez la mthode

23-36

Guide du dveloppeur

Utilisation dun ensemble de donnes client avec un fournisseur

RefreshRecord. A la diffrence de la mthode Refresh, RefreshRecord ne met jour que lenregistrement en cours dans lensemble de donnes client. RefreshRecord modifie la valeur denregistrement initialement obtenue du fournisseur mais laisse intacts tous les changements contenus dans le journal de modifications.
Attention

Il nest pas appropri dappeler systmatiquement RefreshRecord. Si les modifications de lutilisateur entrent en conflit avec celles apportes lensemble de donnes sous-jacent par dautres utilisateurs, lappel de RefreshRecord masque ce conflit. Lorsque lensemble de donnes client applique ses mises jour, aucune erreur de conciliation ne se produit et lapplication ne peut pas rsoudre le conflit. Pour viter que les erreurs de mise jour ne soient masques, vous pouvez vrifier quaucune mise jour nest en attente avant dappeler RefreshRecord . Par exemple, ci-dessous, AfterScroll rafrachit lenregistrement en cours chaque fois que lutilisateur se dplace sur un nouvel enregistrement (ce qui garantit la valeur la plus rcente), mais seulement lorsquil nest pas dangereux de procder ainsi :
procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet); begin if ClientDataSet1.UpdateStatus = usUnModified then ClientDataSet1.RefreshRecord; end;

Communication avec des fournisseurs laide dvnements personnaliss


Les ensembles de donnes client communiquent avec un composant fournisseur par le biais dune interface spciale appele IAppServer. Si le fournisseur est local, IAppServer est linterface vers un objet auto-gnr qui gre toute la communication entre lensemble de donnes client et son fournisseur. Si le fournisseur est distant, IAppServer est linterface vers un module de donnes distant sur le serveur dapplications. TClientDataSet offre de nombreuses possibilits de personnalisation de la communication qui utilise linterface IAppServer. Avant et aprs chaque appel de mthode IAppServer dirig vers le fournisseur de lensemble de donnes client, TClientDataSet reoit des vnements spciaux qui lui permettent dchanger des informations quelconques avec son fournisseur. Ces vnements correspondent des vnements similaires du fournisseur. Et, par exemple, quand lensemble de donnes client appelle sa mthode ApplyUpdates, les vnements suivants se produisent :

1 Lensemble de donnes client reoit un vnement BeforeApplyUpdates, o il spcifie des informations personnalises dans un OleVariant nomm OwnerData. 2 Le fournisseur reoit un vnement BeforeApplyUpdates, o il peut rpondre lOwnerData depuis lensemble de donnes client et mettre jour la valeur de lOwnerData avec les nouvelles informations.

Utilisation densembles de donnes client

23-37

Utilisation dun ensemble de donnes client avec un fournisseur

3 Le fournisseur poursuit son processus normal dassemblage dun paquet de donnes (comprenant tous les vnements qui laccompagnent). 4 Le fournisseur reoit un vnement AfterApplyUpdates, o il peut rpondre la valeur courante de lOwnerData et la mettre jour en lui donnant une valeur pour lensemble de donnes client. 5 Lensemble de donnes client reoit un vnement AfterApplyUpdates, o il peut rpondre la valeur renvoye de lOwnerData.
Les appels aux autres mthodes dIAppServer sont accompagns dun ensemble semblable dvnements BeforeXXX et AfterXXX qui vous permettent de personnaliser la communication entre lensemble de donnes client et son fournisseur. En outre, lensemble de donnes client dispose dune mthode spciale, DataRequest, dont le seul but est de permettre une communication avec le fournisseur spcifique lapplication. Quand lensemble de donnes client appelle DataRequest, il transmet un OleVariant en tant que paramtre pouvant contenir les informations que vous voulez. En retour, est gnr sur le fournisseur lvnement OnDataRequest, o vous pouvez rpondre, de la faon que vous avez dfinie dans lapplication, et renvoyer une valeur lensemble de donnes client.

Redfinition de lensemble de donnes source


Les ensembles de donnes client associs un mcanisme particulier daccs aux donnes utilisent les proprits CommandText et CommandType pour spcifier les donnes quils reprsentent. Cependant lorsque vous utilisez TClientDataSet , les donnes sont spcifies par lensemble de donnes source, et non par lensemble de donnes client. Habituellement, cet ensemble de donnes source possde une proprit qui spcifie linstruction SQL g nrant les donnes, le nom dune table dans la base de donnes ou le nom dune procdure stocke. Si le fournisseur le permet, TClientDataSet peut redfinir sur lensemble de donnes source la proprit qui indique les donnes quil reprsente. Cest--dire que, si le fournisseur le permet, la proprit CommandText de lensemble de donnes client remplace la proprit sur lensemble de donnes du fournisseur qui spcifie les donnes quil reprsente. Cela permet lensemble de donnes client de spcifier de faon dynamique les donnes quil veut voir. Par dfaut, les composants fournisseur externe ne permettent pas aux ensembles de donnes client dutiliser la valeur CommandText de cette faon. Pour permettre TClientDataSet dutiliser sa proprit CommandText, vous devez ajouter poAllowCommandText la proprit Options du fournisseur. Sinon, la valeur de CommandText est ignore.
Remarque

Ne supprimez jamais poAllowCommandText de la proprit Options de TSQLClientDataSet, de TBDEClientDataSet ou de TIBClientDataSet. La proprit Options de lensemble de donnes client est adresse au fournisseur interne, aussi la suppression de poAllowCommandText empche lensemble de donnes client dindiquer quelles donnes accder.

23-38

Guide du dveloppeur

Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers

Lensemble de donnes client envoie sa chane CommandText au fournisseur deux moments : Quand lensemble de donnes client est ouvert pour la premire fois. Une fois que le premier paquet de donnes est extrait du fournisseur, lensemble de donnes client nenvoie plus CommandText lorsquil lit les paquets de donnes suivants. Quand lensemble de donnes client envoie une commande Execute au fournisseur. Pour envoyer une commande SQL ou pour changer le nom dune table ou dune procdure stocke un autre moment, vous devez utiliser explicitement linterface IAppServer par le biais de la proprit AppServer. Cette proprit reprsente linterface par laquelle lensemble de donnes client communique avec son fournisseur.

Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers
Les ensembles de donnes client peuvent fonctionner avec des fichiers sur disque ddis tout comme il le font avec les donnes issues dun serveur. Cela leur permet dtre utiliss dans les applications de bases de donnes de type fichier et les applications modle briefcase. Les fichiers spciaux que les ensembles de donnes client utilisent pour leurs donnes sont appels MyBase.
Conseil

Tous les ensembles de donnes client sont appropris une application du modle briefcase, mais pour une application MyBase pure (une application qui nutilise pas de fournisseur), il est prfrable dutiliser TClientDataSet, car il implique une charge systme minimale. Dans une application MyBase pure, lapplication client ne peut pas obtenir de dfinitions de table ni de donnes du serveur et aucun serveur ne peut recevoir ses mises jour. A la place, lensemble de donnes doit indpendamment : Dfinir et crer les tables Charger les donnes enregistres Fusionner les modifications dans ses donnes Enregistrer les donnes

Cration dun nouvel ensemble de donnes


Il existe trois faons de dfinir et crer des ensembles de donnes client qui ne reprsentent pas les donnes dun serveur : Vous pouvez dfinir et crer un nouvel ensemble de donnes client en utilisant des champs persistants ou des dfinitions de champs et dindex. Suivez le mme processus que pour la cration dun ensemble de donnes de type table. Pour davantage dinformations, voir Cration et suppression des tables la page 18-44.

Utilisation densembles de donnes client

23-39

Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers

Vous pouvez copier un ensemble de donnes existant ( la conception ou lexcution). Pour plus dinformations sur la copie des ensembles de donnes existants, voir Copie de donnes dun autre ensemble de donnes la page 23-16. Vous pouvez crer un ensemble de donnes client partir de nimporte quel document XML. Voir Conversion de documents XML en paquets de donnes la page 26-7, pour plus de dtails. Une fois lensemble de donne cr, vous pouvez lenregistrer dans un fichier. A partir de ce moment-l, vous navez plus besoin de recrer la table ; il vous suffit de la charger depuis le fichier que vous avez enregistr. Lorsque vous commencez laborer une application de base de donnes de type fichier, vous pouvez crer et enregistrer des fichiers vides pour vos ensembles de donnes avant dcrire lapplication elle-mme. Ainsi, vous dmarrez en ayant les mtadonnes de votre ensemble de donnes client dj dfinies, ce qui facilite la dfinition de linterface utilisateur.

Chargement des donnes depuis un fichier ou un flux


Pour charger des donnes depuis un fichier, appelez la mthode LoadFromFile de lensemble de donnes client. LoadFromFile accepte un paramtre, une chane qui spcifie le fichier o lire les donnes. Le cas chant, le nom de fichier peut tre un nom de chemin daccs qualifi. Si vous chargez toujours les donnes de lensemble de donnes client partir du mme fichier, vous pouvez utiliser la place la proprit FileName. Si FileName nomme un fichier existant, les donnes sont automatiquement charges louverture de lensemble de donnes client. Pour charger des donnes partir dun flux, appelez la mthode LoadFromStream de lensemble de donnes client. LoadFromStream accepte un paramtre : un objet flux qui fournit les donnes. Les donnes charges par LoadFromFile (LoadFromStream) doivent avoir t sauvegardes dans le format ensemble de donnes client, par cet ensemble de donnes client ou par un autre, en utilisant la mthode SaveToFile (SaveToStream), ou gnres partir dun document XML. Pour plus dinformations sur la sauvegarde des donnes dans un fichier ou dans un flux, voir Sauvegarde des donnes dans un fichier ou un flux la page 23-41. Pour plus dinformations sur la cration des donnes dun ensemble de donnes client partir dun document XML, voir chapitre 26, Utilisation de XML dans les applications de bases de donnes. Lorsque vous appelez LoadFromFile ou LoadFromStream, toutes les donnes du fichier sont lues dans la proprit Data. Toutes les modifications qui figuraient dans le journal de modifications lorsque les donnes ont t sauvegardes sont lues dans la proprit Delta. Mais, les seuls index lus dans le fichier sont ceux qui ont t crs avec lensemble de donnes.

23-40

Guide du dveloppeur

Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers

Fusion des modifications dans les donnes


Lorsque vous modifiez les donnes dun ensemble client, toutes les modifications sont consignes dans un journal de modifications qui nexiste quen mmoire. Ce journal est gr sparment des donnes elles-mmes bien que cela soit compltement transparent pour les objets qui utilisent lensemble de donnes client. En dautres termes, les contrles qui permettent la navigation dans lensemble de donnes client ou qui affichent ses donnes ont une vue des donnes qui intgre les modifications. Si vous ne souhaitez pas annuler les modifications, vous devez fusionner le journal de modifications avec les donnes de lensemble de donnes client en appelant la mthode MergeChangeLog. MergeChangeLog crase les enregistrements de Data avec les valeurs des champs du journal de modifications. Aprs lexcution de MergeChangeLog, la proprit Data contient un amalgame constitu des donnes existantes et des modifications issues du journal de modifications. Cet amalgame devient la nouvelle valeur de la proprit Data (elle sert ensuite de rfrence aux futures modifications). MergeChangeLog efface tous les enregistrements du journal de modifications et rinitialise la proprit ChangeCount 0.
Attention

Nappelez pas MergeChangeLog pour les ensembles de donnes client qui utilisent un fournisseur. Dans ce cas, vous devez appeler la mthode ApplyUpdates pour crire les modifications dans la base de donnes. Pour plus dinformations, voir Application des mises jour la page 23-24. Il est galement possible de fusionner les modifications dans les donnes dun ensemble de donnes client spar si ce dernier a initialement fourni les donnes dans la proprit Data. Pour ce faire, vous devez utiliser un fournisseur densembles de donnes. Voir un exemple dans Affectation directe des donnes la page 23-16. Si vous ne souhaitez pas utiliser les capacits D faire fournies par le journal de modifications, vous pouvez dfinir la proprit LogChanges de lensemble de donnes client par False. Lorsque LogChanges vaut False, les modifications sont automatiquement fusionnes lorsque vous postez des enregistrements et il est inutile dappeler MergeChangeLog.

Remarque

Sauvegarde des donnes dans un fichier ou un flux


Lorsque vous avez fusionn les modifications avec les donnes dun ensemble de donnes client, ces dernires nexistent quen mmoire. Bien quelles ne soient pas perdues si vous fermez puis ouvrez nouveau lensemble de donnes client dans votre application, larrt de celle-ci les fera disparatre. Pour que ces donnes soient permanentes, elles doivent tre crites sur disque. Enregistrez les modifications sur disque laide de la mthode SaveToFile. SaveToFile accepte un paramtre : une chane qui spcifie le fichier dans lequel les donnes sont crites. Le cas chant, le nom de fichier peut tre un nom de chemin daccs qualifi. Si le fichier existe dj, son contenu actuel est cras.

Utilisation densembles de donnes client

23-41

Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers

Remarque

SaveToFile ne conserve aucun index ajout lensemble de donnes client lexcution, sauf les index ajouts lorsque vous avez cr lensemble de donnes client. Si vous sauvegardez toujours les donnes dans le mme fichier, vous pouvez utiliser la place la proprit FileName. Si FileName est initialise, les donnes sont automatiquement sauvegardes dans le fichier nomm la fermeture de lensemble de donnes client. Vous pouvez aussi sauvegarder les donnes dans un flux laide de la mthode SaveToStream. SaveToStream accepte un paramtre : un objet flux qui reoit les donnes.

Remarque

Si vous sauvegardez un ensemble de donnes client alors que des modifications existent encore dans le journal de modifications, ces modifications ne sont pas fusionnes avec les donnes. Lorsque vous rechargez les donnes laide de la mthode LoadFromFile ou LoadFromStream, le journal de modifications contient toujours les modifications non fusionnes. Ce point est important pour les applications qui supportent le modle briefcase, dans lequel les modifications finissent par tre appliques un composant fournisseur sur le serveur dapplications.

23-42

Guide du dveloppeur

24
Chapitre 24

Chapitre

Utilisation des composants fournisseur

Les composants fournisseur (TDataSetProvider et TXMLTransformProvider) dfinissent le mcanisme qu utilisent le plus couramment les ensembles de donnes client pour obtenir leurs donnes. Les fournisseurs reoivent les demandes de donnes dun ensemble de donnes client (ou agent XML), extraient les donnes demandes, empaqutent les donnes en un paquet de donnes transportable et renvoient les donnes lensemble de donnes client (ou agent XML). Cette activit est appele fourniture. reoivent les donnes mises jour dun ensemble de donnes client (ou agent XML), appliquent les mises jour au serveur de base de donnes, lensemble de donnes source ou au document XML, et consignent toutes les mises jour inapplicables en renvoyant les mises jour non rsolues lensemble de donnes client en vue dune rgularisation ultrieure. Cette activit est appele rsolution. Lessentiel de lactivit dun composant fournisseur seffectue automatiquement. Vous navez pas besoin dcrire de code dans le fournisseur pour crer les paquets de donnes partir des donnes dun ensemble de donnes ou dun document XML ou pour appliquer les mises jour. Toutefois, les composants fournisseur comprennent une srie dvnements et de proprits qui permettent votre application de contrler plus directement les informations empaquetes pour les clients et la faon dont elle rpond aux requtes client. Lorsque vous utilisez TBDEClientDataSet, TSQLClientDataSet ou TIBClientDataSet, le fournisseur est interne lensemble de donnes client, et lapplication ne peut pas y accder directement. Lorsque vous utilisez TClientDataSet ou TXMLBroker, toutefois, le fournisseur est un composant spar qui vous permet de contrler les informations empaquetes pour les clients et les rponses aux vnements qui se produisent au cours des processus de fourniture et de rsolution. Les ensembles de donnes client qui possdent un fournisseur interne mettent

Utilisation des composants fournisseur

24-1

Spcification de la source de donnes

disposition une partie des proprits et vnements du fournisseur interne comme leurs propres proprits et vnements mais, pour un contrle maximal, vous pouvez utiliser TClientDataSet avec un composant fournisseur spar. Lorsque vous utilisez un composant fournisseur spar, il peut rsider dans la mme application que lensemble de donnes client (ou agent XML) ou sur un serveur dapplications dans le cadre dune application multiniveau. Ce chapitre dcrit comment utiliser un composant fournisseur pour contrler les interactions avec les ensembles de donnes client ou les agents XML.

Spcification de la source de donnes


Quand vous utilisez un composant fournisseur, vous devez spcifier la source quil utilise pour extraire les donnes que le composant assemble en paquets de donnes. Suivant votre version de Delphi, vous pouvez spcifier la source ainsi : Pour fournir les donnes partir dun ensemble de donnes, utilisez TDataSetProvider. Pour fournir les donnes partir dun document XML, utilisez TXMLTransformProvider.

Utilisation dun ensemble de donnes comme source des donnes


Si le fournisseur est un fournisseur densemble de donnes (TDataSetProvider), attribuez sa proprit DataSet lensemble de donnes source. A la conception, slectionnez-le parmi les ensembles de donnes disponibles dans la liste droulante de la proprit DataSet dans linspecteur dobjets. TDataSetProvider interagit avec lensemble de donnes source laide de linterface IProviderSupport. Cette interface est introduite par TDataSet, elle est donc disponible dans tous les ensembles de donnes. Cependant, les mthodes IProviderSupport implmentes dans TDataSet sont essentiellement des squelettes qui ne font rien ou dclenchent des exceptions. Les classes densemble de donnes fournies avec Delphi (ensembles de donnes BDE, ADO, dbExpress et InterBase Express) redfinissent ces mthodes pour implmenter linterface IProviderSupport dune manire plus utile. Les ensembles de donnes client najoutent rien limplmentation IProviderSupport hrite mais peuvent tre nanmoins utiliss comme ensemble de donnes source sous rserve que la proprit ResolveToDataSet du fournisseur ait pour valeur True. Les concepteurs de composants qui crent leur propre descendant personnalis de TDataSet doivent redfinir les mthodes appropries de IProviderSupport si leurs ensembles de donnes doivent fournir des donnes un fournisseur. Si le fournisseur fournit uniquement des paquets de donnes en mode lecture seule, (cest--dire sil napplique pas les modifications), les mthodes IProviderSupport implmentes par TDataSet peuvent suffire.

24-2

Guide du dveloppeur

Communication avec lensemble de donnes client

Utilisation dun document XML comme source des donnes


Si le fournisseur est un fournisseur XML, attribuez sa proprit XMLDataFile le document source. Etant donn que les fournisseurs XML doivent transformer le document source en paquets de donnes, vous devez, en plus dindiquer le document source, spcifier comment celui-ci doit tre transform. Cette transformation est g re par la proprit TransformRead du fournisseur. TransformRead reprsente un objet TXMLTransform. Vous pouvez dfinir ses proprits pour spcifier la transformation utiliser et recourir ses vnements pour fournir votre propre entre la transformation. Pour plus dinformations sur lutilisation des fournisseurs XML, voir Utilisation dun document XML comme source pour un fournisseur la page 26-9.

Communication avec lensemble de donnes client


Toute la communication entre un fournisseur et un ensemble de donnes client ou agent XML seffectue par le biais dune interface IAppServer. Si le fournisseur figure dans la mme application que le client, cette interface est implmente par un objet cach automatiquement gnr ou par un composant TLocalConnection. Si le fournisseur fait partie dune application multiniveau, il sagit de linterface du module de donnes distant du serveur dapplication. La plupart des applications nutilisent pas IAppServer directement, mais linvoquent par le biais des proprits et des mthodes de lensemble de donnes client ou de lagent XML. Toutefois, lorsque cela est ncessaire, vous pouvez appeler directement linterface IAppServer laide de la proprit AppServer dun ensemble de donnes client. Le tableau suivant prsente les mthodes de linterface IAppServer, ainsi que les mthodes et les vnements correspondants du composant fournisseur et de lensemble de donnes client. Ces mthodes IAppServer comprennent un paramtre Provider. Dans les applications multiniveaux, ce paramtre indique le fournisseur sur le serveur dapplications avec lequel lensemble de donnes client communique. La plupart des mthodes comprennent galement un paramtre OleVariant appel OwnerData qui permet un ensemble de donnes client et un fournisseur dchanger des informations personnalises. OwnerData nest pas utilis par dfaut, mais est transmis tous les gestionnaires dvnement, de sorte que vous pouvez crire du code qui permet votre fournisseur de sadapter aux informations dfinies par lapplication avant et aprs chaque appel manant dun ensemble de donnes client.

Utilisation des composants fournisseur

24-3

Dtermination du mode dapplication des mises jour laide dun fournisseur

Tableau 24.1 IAppServer

Membres de linterface AppServer composant fournisseur


ApplyUpdates (mthode), BeforeApplyUpdates (vnement), AfterApplyUpdates (vnement) DataRequest (mthode), OnDataRequest (vnement) Execute (mthode), BeforeExecute (vnement), AfterExecute (vnement) GetParams (mthode), BeforeGetParams (vnement), AfterGetParams (vnement) Utilis pour identifier tous les fournisseurs disponibles. GetRecords (mthode), BeforeGetRecords (vnement), AfterGetRecords (vnement) RowRequest (m thode), BeforeRowRequest (vnement), AfterRowRequest (vnement)

TClientDataSet
ApplyUpdates (mthode), BeforeApplyUpdates (vnement), AfterApplyUpdates (vnement). DataRequest (m thode). Execute (mthode), BeforeExecute (vnement), AfterExecute (vnement). FetchParams (m thode), BeforeGetParams (vnement), AfterGetParams (vnement). Utilis pour crer une liste la conception pour la proprit ProviderName. GetNextPacket (m thode), Data (proprit), BeforeGetRecords (vnement), AfterGetRecords (vnement) FetchBlobs (mthode), FetchDetails (m thode), RefreshRecord (mthode), BeforeRowRequest (vnement), AfterRowRequest (vnement)

AS_ApplyUpdates (mthode)

AS_DataRequest (mthode) AS_Execute (m thode)

AS_GetParams (mthode) AS_GetProviderNames (mthode) AS_GetRecords (mthode)

AS_RowRequest (mthode)

Dtermination du mode dapplication des mises jour laide dun fournisseur densemble de donnes
TXMLTransformProvider appliquent toujours les mises jour au document XML associ. Toutefois, lorsque vous utilisez TDataSetProvider, vous pouvez choisir le mode dapplication des mises jour. Par dfaut, quand les composants TDataSetProvider appliquent les modifications et rsolvent les erreurs de modification, ils communiquent directement avec le serveur de bases de donnes en utilisant des instructions SQL gnres dynamiquement. Cette approche prsente cet avantage que lapplication serveur na pas besoin de fusionner les modifications deux fois (dabord pour lensemble de donnes, puis sur le serveur distant). Cependant, vous pouvez prfrer une autre approche : par exemple, vous pouvez utiliser certains des vnements sur le composant ensemble de donnes. Il se peut aussi que lensemble de donnes utilis ne gre pas lutilisation dinstructions SQL (par exemple, si la fourniture est effectue partir dun composant TClientDataSet ). TDataSetProvider vous laisse dcider si vous souhaitez appliquer les modifications sur le serveur de bases de donnes en utilisant le SQL ou sur lensemble de

24-4

Guide du dveloppeur

Contrle des informations places dans les paquets de donnes

donnes source en dfinissant la proprit ResolveToDataSet. Quand cette proprit a la valeur True, les modifications sont appliques lensemble de donnes. Lorsqu elle a pour valeur False, les mises jour sont directement appliques au serveur de bases de donnes sous-jacent.

Contrle des informations places dans les paquets de donnes


Lorsque vous utilisez un fournisseur densemble de donnes, il y a plusieurs moyens de contrler quelles informations sont places dans les paquets de donnes envoys et reus par le client. Cest--dire : Spcifier les champs apparaissant dans les paquets de donnes Spcifier des options caractrisant les paquets de donnes Ajouter des informations personnalises aux paquets de donnes
Remarque

Ces techniques de contrle du contenu des paquets de donnes sont uniquement disponibles pour les fournisseurs densemble de donnes. Lorsque vous utilisez TXMLTransformProvider, vous pouvez uniquement grer le contenu des paquets de donnes en contrlant le fichier de transformation utilis par le fournisseur.

Spcification des champs apparaissant dans les paquets de donnes


Lorsque vous utilisez un fournisseur densemble de donnes, vous pouvez contrler les champs apparaissant dans les paquets de donnes en crant des champs persistants dans lensemble de donnes quutilise le fournisseur pour construire les paquets de donnes. Le fournisseur peut alors inclure uniquement ces champs. Les champs dont la valeur est gnre dynamiquement par lensemble de donnes source (comme les champs calculs ou les champs de rfrence) peuvent tre utiliss, mais ils apparaissent aux ensembles de donnes client comme des champs statiques en lecture seule. Pour plus dinformations sur les champs persistants, voir Champs persistants la page 19-3. Si lensemble de donnes client modifie les donnes et applique les modifications, vous devez inclure suffisamment de champs pour quil ny ait pas denregistrements doublon dans le paquet de donnes. Sinon, lors de lapplication des modifications, il est impossible de dterminer les enregistrements actualiser. Si vous ne voulez pas que lensemble de donnes client accde des champs uniquement spcifis pour assurer lunicit, initialisez la proprit ProviderFlags de ces champs en spcifiant pfHidden.
Remarque

La ncessit de spcifier suffisamment de champs pour viter des enregistrements en doublon se pose galement lorsque lensemble de donnes source du fournisseur reprsente une requte. Vous devez dfinir la requte de telle sorte quelle comprenne suffisamment de champs pour assurer lunicit de tous les enregistrements, mme si votre application nutilise pas tous les champs.

Utilisation des composants fournisseur

24-5

Contrle des informations places dans les paquets de donnes

Initialisation des options contrlant les paquets de donnes


La proprit Options dun fournisseur densemble de donnes permet de spcifier si les champs BLOB ou les tables dtail imbriques sont galement envoys, si les proprits daffichage des champs sont inclues, le type de modifications autorises, etc. Le tableau suivant numre les valeurs possibles pouvant tre places dans Options.
Tableau 24.2 Valeur
poAutoRefresh

Options dun fournisseur Signification


Le fournisseur rafrachit lensemble de donnes client avec les valeurs en cours pour les enregistrements chaque fois quil applique les modifications. Lensemble de donnes client ne peut pas appliquer de mises jour au fournisseur. Les ensembles de donnes client ne peuvent modifier les valeurs de donnes existantes. Si lutilisateur tente de modifier un champ, lensemble de donnes client dclenche une exception. Cela naffecte pas la capacit de lensemble de donnes client insrer ou supprimer des enregistrements. Les ensembles de donnes client ne peuvent pas insrer de nouveaux enregistrements. Si lutilisateur tente dinsrer un enregistrement, lensemble de donnes client dclenche une exception. Cela naffecte pas la capacit de lensemble de donnes client supprimer des enregistrements ou modifier des donnes existantes. Les ensembles de donnes client ne peuvent pas supprimer denregistrements. Si lutilisateur tente de supprimer un enregistrement, lensemble de donnes client dclenche une exception. Cela naffecte pas la capacit de lensemble de donnes client insrer ou modifier des enregistrements. Les valeurs des champs BLOB ne sont pas incluses dans les paquets de donnes. Les ensembles de donnes client doivent demander ces valeurs explicitement quand elles en ont besoin. Si la proprit FetchOnDemand de lensemble de donnes client a la valeur True, il demande ces valeurs automatiquement. Sinon, lapplication doit appeler la mthode FetchBlobs de lensemble de donnes client pour lire les donnes BLOB. Quand lensemble de donnes du fournisseur reprsente le matre dans une relation matre/dtail, les valeurs de dtail imbriques ne sont pas incluses dans les paquet de donnes. Les ensembles de donnes client doivent demander ces valeurs explicitement. Si la proprit FetchOnDemand de lensemble de donnes client a la valeur True, il demande ces valeurs automatiquement. Sinon, lapplication doit appeler la mthode FetchDetails de lensemble de donnes client pour lire les dtails imbriqus.

poReadOnly poDisableEdits

poDisableInserts

poDisableDeletes

poFetchBlobsOnDemand

poFetchDetailsOnDemand

24-6

Guide du dveloppeur

Contrle des informations places dans les paquets de donnes

Tableau 24.2 Valeur

Options dun fournisseur (suite) Signification


Le paquet de donnes contient les proprits de champs suivantes (quand elles sont pertinentes) : Alignment, DisplayLabel, DisplayWidth, Visible, DisplayFormat, EditFormat, MaxValue, MinValue, Currency, EditMask et DisplayValues. Quand lensemble de donnes du fournisseur reprsente le matre dans une relation matre-dtail, les enregistrements du dtail sont automatiquement supprims par le serveur quand des enregistrements matre sont supprims. Pour utiliser cette option, le serveur de bases de donnes doit tre configur pour effectuer la suppression en cascade pour la relation dintgrit rfrentielle. Quand lensemble de donnes du fournisseur reprsente le matre dans une relation matre-dtail, les valeurs de cl des tables dtail sont actualises automatiquement quand les valeurs correspondantes sont modifies dans les enregistrements matre. Pour utiliser cette option, le serveur de bases de donnes doit tre configur pour effectuer les mises jour en cascade pour la relation dintgrit rfrentielle. Une seule actualisation peut entraner la modification de plusieurs enregistrements de la table de base de donnes sous-jacente. Cela peut tre fait par des dclencheurs, lintgrit rfrentielle, des instructions SQL sur lensemble de donnes source, etc. Attention, sil se produit une erreur, les gestionnaires dvnements donnent accs lenregistrement actualis et pas aux autres enregistrements modifis en consquence. Les ensembles de donnes client ne peuvent pas demander au fournisseur de repositionner le curseur sur le premier enregistrement avant de fournir des donnes. Les modifications apportes par le serveur aux enregistrements modifis dans le cadre du processus de mise jour sont renvoyes au client et fusionnes dans lensemble de donnes client. Le client peut redfinir le texte de linstruction SQL de lensemble de donnes associ ou le nom de la table ou procdure stocke quil reprsente. Lensemble de donnes client ne doit pas retrier les enregistrements de lensemble de donnes pour imposer un ordre par dfaut.

poIncFieldProps

poCascadeDeletes

poCascadeUpdates

poAllowMultiRecordUpdates

poNoReset

poPropogateChanges

poAllowCommandText

poRetainServerOrder

Ajout dinformations personnalises aux paquets de donnes


Les fournisseurs densembles de donnes peuvent ajouter dans des paquets de donnes des informations dfinies par lapplication en utilisant lvnement OnGetDataSetProperties. Ces informations sont codes sous la forme dun OleVariant et stockes sous le nom spcifi. Les ensembles de donnes client peuvent alors lire ces informations en utilisant leur mthode GetOptionalParam. Vous pouvez galement spcifier que les informations doivent tre places dans

Utilisation des composants fournisseur

24-7

Comment rpondre aux demandes de donnes des clients

les paquets delta envoys par les ensembles de donnes client lors de la mise jour des enregistrements. Dans ce cas, lensemble de donnes client peut ne jamais exploiter ces informations que le fournisseur senvoie lui-mme. Quand vous ajoutez des informations personnalises dans lvnement OnGetDataSetProperties, chaque attribut individuel (appel parfois un paramtre optionnel) est spcifi en utilisant un tableau Variant contenant trois lments : le nom (une chane), la valeur (un Variant) et un indicateur boolen indiquant si les informations doivent tre places dans les paquets delta lorsque le client applique les mises jour. Ajoutez plusieurs attributs en crant un tableau Variant de tableaux Variant. Par exemple, le gestionnaire dvnement OnGetDataSetProperties suivant envoie deux valeurs : lheure laquelle les donnes ont t fournies et le nombre total denregistrements dans lensemble de donnes source. Seule lheure laquelle les donnes ont t fournies est renvoye quand les ensembles de donnes client appliquent les mises jour :
procedure TMyDataModule1.Provider1GetDataSetProperties(Sender: TObject; DataSet: TDataSet; out Properties: OleVariant); begin Properties := VarArrayCreate([0,1], varVariant); Properties[0] := VarArrayOf([TimeProvided, Now, True]); Properties[1] := VarArrayOf([TableSize, DataSet.RecordCount, False]); end;

Quand lensemble de donnes client applique les mises jour, lheure laquelle les enregistrements ont t initialement fournis peut tre lue dans lvnement OnUpdateData du fournisseur :
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); var WhenProvided: TDateTime; begin WhenProvided := DataSet.GetOptionalParam(TimeProvided); ... end;

Comment rpondre aux demandes de donnes des clients


Gnralement, les demandes de donnes de la part des clients sont gres automatiquement. Un ensemble de donnes client ou agent XML demande un paquet de donnes en appelant (indirectement via linterface IAppServer) la mthode GetRecords. Le fournisseur rpond automatiquement en lisant les donnes de lensemble de donnes ou du document XML associ, en crant un paquet de donnes qui est envoy au client. Le fournisseur a la possibilit de modifier les donnes aprs les avoir assembles dans un paquet, mais avant denvoyer le paquet au client. Par exemple, vous pouvez retirer des enregistrements du paquet en vous basant sur un critre (par exemple, le niveau daccs dun utilisateur) ou, dans une application multiniveau, crypter des donnes confidentielles avant de les envoyer au client.

24-8

Guide du dveloppeur

Comment rpondre aux demandes de mise jour des clients

Pour modifier le paquet de donnes avant de lenvoyer au client, crivez un gestionnaire de lvnement OnGetData. Les gestionnaires dvnement OnGetData transmettent le paquet de donnes comme paramtre sous la forme dun ensemble de donnes client. En utilisant les mthodes de lensemble de donnes client, vous pouvez modifier les donnes avant de les expdier au client. Comme tous les appels de mthode effectu s via linterface IAppServer, le fournisseur peut communiquer des informations dtat persistantes un ensemble de donnes client avant et aprs lappel de GetRecords. Cette communication seffectue en utilisant les gestionnaires dvnements BeforeGetRecords et AfterGetRecords. Pour davantage dinformations sur la persistance dinformations dtat dans les serveurs dapplications, voir Gestion des informations dtat dans les modules de donnes distants la page 25-23.

Comment rpondre aux demandes de mise jour des clients


Un fournisseur applique les mises jour aux enregistrements de la base de donnes en se basant sur un paquet de donnes Delta envoy par un ensemble de donnes client ou agent XML. Lensemble de donnes client demande des mises jour en appelant (indirectement, via linterface IAppServer) la mthode ApplyUpdates. Comme tous les appels de mthode effectu s via linterface IAppServer, le fournisseur peut communiquer des informations dtat persistantes un ensemble de donnes client avant et aprs lappel de ApplyUpdates. Cette communication seffectue en utilisant les gestionnaires dvnements BeforeApplyUpdates et AfterApplyUpdates. Pour davantage dinformations sur la persistance dinformations dtat dans les serveurs dapplications, voir Gestion des informations dtat dans les modules de donnes distants la page 25-23. Si vous utilisez un fournisseur densemble de donnes, des vnements supplmentaires vous apportent un contrle accru : Quand un fournisseur densemble de donnes reoit une demande de mise jour, il gnre un vnement OnUpdateData dans lequel vous pouvez modifier le paquet Delta avant quil ne soit crit dans lensemble de donnes ou dterminer comment les mises jour sont appliqu es. Aprs lvnement OnUpdateData, le fournisseur crit les modifications dans la base de donnes ou lensemble de donnes source. Le fournisseur effectue la mise jour enregistrement par enregistrement. Avant dappliquer chaque enregistrement, le fournisseur densemble de donnes gnre un vnement BeforeUpdateRecord que vous pouvez utiliser pour filtrer avant que les modifications ne soient appliques. Si une erreur se produit lors de la rsolution dun enregistrement, le fournisseur reoit un vnement OnUpdateError dans lequel il peut rsoudre lerreur. Gnralement, il se produit des erreurs car la modification viole une contrainte du serveur ou parce quun enregistrement a t modifi avec une autre application aprs sa lecture par le fournisseur, mais avant la demande de lensemble de donnes client dappliquer la mise jour.

Utilisation des composants fournisseur

24-9

Comment rpondre aux demandes de mise jour des clients

Les erreurs de mise jour peuvent tre traites par le fournisseur densemble de donnes ou lensemble de donnes client. Lorsque le fournisseur fait partie dune application multiniveau, il doit grer toutes les erreurs de mise jour qui ne ncessitent pas dinteraction avec lutilisateur pour tre rsolues. Quand le fournisseur ne peut rsoudre une condition derreur, il stocke une copie temporaire de lenregistrement posant problme. Quand le traitement des enregistrements est termin, le fournisseur renvoie lensemble de donnes client le nombre derreurs ayant eu lieu et copie les enregistrements non rsolus dans un paquet de donnes rsultat quil renvoie lensemble de donnes client pour que celui-ci termine la rconciliation. Les gestionnaires dvnements de tous les vnements du fournisseur reoivent les mises jour sous la forme dun ensemble de donnes client. Si le gestionnaire dvnement ne traite que certains types de mise jour, vous pouvez filtrer lensemble de donnes en vous basant sur le type de mise jour des enregistrements. Le filtrage des enregistrements vite au gestionnaire dvnement de parcourir des enregistrements quil nutilise pas. Pour filtrer lensemble de donnes client daprs le type de mise jour de ses enregistrements, dfinissez sa proprit StatusFilter.
Remarque

Les applications doivent proposer des fonctions supplmentaires quand les mises jour sont diriges vers un ensemble de donnes qui reprsente plusieurs tables. Pour des dtails sur la manire de procder, voir Application des mises jour des ensembles de donnes reprsentant plusieurs tables la page 24-13.

Modification des paquets delta avant la mise jour de la base de donnes


Avant quun fournisseur densemble de donnes napplique les mises jour la base de donnes, il gnre un vnement OnUpdateData. Le gestionnaire dvnement OnUpdateData reoit en paramtre une copie du paquet Delta sous la forme dun ensemble de donnes client. Dans le gestionnaire dvnement OnUpdateData, vous pouvez utiliser toutes les proprits et mthodes de lensemble de donnes client pour modifier le paquet Delta avant de lcrire dans lensemble de donnes. Une proprit savre particulirement utile : UpdateStatus. UpdateStatus indique le type de modification que reprsente lenregistrement en cours dans le paquet delta. Elle peut prendre lune des valeurs numres dans le tableau suivant :
Tableau 24.3 Valeur
usUnmodified usModified usInserted usDeleted

Valeurs de UpdateStatus Description


Le contenu de lenregistrement na pas t modifi. Le contenu de lenregistrement a t modifi. Lenregistrement a t insr. Lenregistrement a t supprim .

24-10

Guide du dveloppeur

Comment rpondre aux demandes de mise jour des clients

Le gestionnaire dvnement OnUpdateData suivant insre la date en cours dans chaque nouvel enregistrement insr dans la base de donnes :
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); begin with DataSet do begin First; while not Eof do begin if UpdateStatus = usInserted then begin Edit; FieldByName(DateCreated).AsDateTime := Date; Post; end; Next; end; end;

Comment contrler lapplication des mises jour


Lvnement OnUpdateData permet galement au fournisseur dindiquer comment les enregistrements dun paquet delta sont appliqus la base de donnes. Par dfaut, les modifications places dans le paquet delta sont crites dans la base de donnes en utilisant des instructions SQL UPDATE, INSERT ou DELETE gnres automatiquement, par exemple :
UPDATE EMPLOYEES set EMPNO = 748, NAME = Smith, TITLE = Programmer 1, DEPT = 52 WHERE EMPNO = 748 and NAME = Smith and TITLE = Programmer 1 and DEPT = 47

Si vous ne spcifiez pas le contraire, tous les champs des enregistrements du paquet delta sont utiliss dans les clauses UPDATE et WHERE. Vous pouvez nanmoins exclure certains champs. Vous pouvez le faire en utilisant la proprit UpdateMode du fournisseur. UpdateMode peut prendre lune des valeurs suivantes :
Tableau 24.4 Valeur
upWhereAll upWhereChanged upWhereKeyOnly

Valeurs de UpdateMode Signification


Tous les champs sont utiliss pour la recherche (dans la clause WHERE). Seuls les champs cls et les champs modifis sont utiliss pour la recherche. Seuls les champs cl sont utiliss pour la recherche.

Utilisation des composants fournisseur

24-11

Comment rpondre aux demandes de mise jour des clients

Vous pouvez avoir besoin dun contrle encore plus prcis. Par exemple, dans linstruction prcdente, vous pouvez empcher que le champ EMPNO ne soit modifi en le retirant de la clause UPDATE et enlever les champs TITLE et DEPT de la clause WHERE pour empcher des conflits de mise jour quand dautres applications ont modifi les donnes. Pour sp cifier la clause dans laquelle un champ spcifique apparat, utilisez la proprit ProviderFlags. ProviderFlags est un ensemble qui peut inclure les valeurs du tableau suivant :
Tableau 24.5 Valeur
pfInWhere

Valeurs de ProviderFlags Description


Le champ apparat dans la clause WHERE des instructions INSERT, DELETE et UPDATE gnres lorsque UpdateMode a pour valeur upWhereAll ou upWhereChanged. Le champ apparat dans la clause UPDATE des instructions UPDATE gnres. Le champ est utilis dans la clause WHERE des instructions gnres lorsque UpdateMode a pour valeur upWhereKeyOnly. Le champ est inclus dans les enregistrements afin de garantir lunicit, mais il ne doit pas tre visible ou utilis du ct client.

pfInUpdate pfInKey pfHidden

Par exemple, le gestionnaire dvnement OnUpdateData suivant permet au champ TITLE dtre mis jour et utilise les champs EMPNO et DEPT pour rechercher lenregistrement dsir. Si une erreur se produit et quune seconde tentative de recherche est effectue uniquement base sur la cl, linstruction SQL gnre recherche uniquement le champ EMPNO :
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); begin with DataSet do begin FieldByName(TITLE).ProviderFlags := [pfInUpdate]; FieldByName(EMPNO).ProviderFlags := [pfInWhere, pfInKey]; FieldByName(DEPT).ProviderFlags := [pfInWhere]; end; end; Remarque

Vous pouvez utiliser la proprit UpdateFlags pour contrler comment les mises jour sont appliques mme si vous actualisez un ensemble de donnes sans utiliser dinstructions SQL gnres dynamiquement. Ces indicateurs indiquent quand mme les champs utiliss pour rechercher des enregistrements et les champs actualiss.

Filtrage des mises jour


Avant lapplication de chaque mise jour, un fournisseur densemble de donnes reoit un vnement BeforeUpdateRecord. Vous pouvez utiliser cet vnement pour modifier les enregistrements avant quils ne soient appliqus, tout comme vous utilisez lvnement OnUpdateData pour modifier tout le paquet delta. Par exemple, le fournisseur ne compare pas les champs BLOB (comme les mmos)

24-12

Guide du dveloppeur

Comment rpondre aux demandes de mise jour des clients

quand il teste les conflits de mise jour. Si vous voulez tester les erreurs de mise jour concernant des champs BLOB, vous pouvez utiliser lvnement BeforeUpdateRecord. Vous pouvez galement utiliser cet vnement pour appliquer vous-mme les mises jour ou pour filtrer et rejeter les mises jour. Le gestionnaire dvnement BeforeUpdateRecord vous permet de signaler quune mise jour a dj t gre et quelle ne doit pas tre applique. Le fournisseur passe cet enregistrement sans le considrer comme une erreur de mise jour. Cet vnement vous permet dappliquer les mises jour dans une procdure stocke (qui ne peut tre mise jour automatiquement), en permettant au fournisseur de ne pas effectuer le traitement automatique une fois lenregistrement mis jour dans le gestionnaire dvnement.

Rsolution des erreurs de mise jour par le fournisseur


Si une condition derreur apparat alors qu un fournisseur densemble de donnes tente dappliquer un enregistrement du paquet delta, un vnement OnUpdateError se produit. Quand le fournisseur ne peut rsoudre une condition derreur, il stocke une copie temporaire de lenregistrement posant problme. Quand le traitement des enregistrements est termin, il renvoie le nombre derreurs ayant eu lieu et copie les enregistrements non rsolus dans un paquet de donnes rsultat quil envoie au client pour que celui-ci termine la rconciliation. Dans les applications multiniveaux, ce mcanisme vous permet de grer toutes les erreurs de mise jour qui ne peuvent tre rsolues mcaniquement par le serveur dapplications tout en permettant lutilisateur de lapplication client de corriger des conditions derreur. Le gestionnaire dvnement OnUpdateError reoit en paramtre une copie de lenregistrement qui na pu tre modifi, un code derreur de la base de donnes et une valeur indiquant si la rsolution tentait dinsrer, de supprimer ou de modifier lenregistrement. Lenregistrement posant problme est transmis dans un ensemble de donnes client. Vous ne devez jamais utiliser les mthodes de parcours des donnes dans cet ensemble de donnes. Par contre, pour chaque champ de cet ensemble de donnes vous pouvez utiliser les proprits NewValue, OldValue, et CurValue afin de dterminer la cause du problme et effectuer les modifications ncessaires la rsolution de lerreur de modification. Si le gestionnaire dvnement OnUpdateError peut corriger le problme, il doit dfinir la valeur du paramtre Response afin dappliquer lenregistrement rectifi.

Application des mises jour des ensembles de donnes reprsentant plusieurs tables
Quand un fournisseur densemble de donnes gnre des instructions SQL qui appliquent directement les mises jour dans un serveur de bases de donnes, il lui faut le nom de la table de la base de donnes qui contient les enregistrements. Cela peut tre automatiquement gr pour de nombreux

Utilisation des composants fournisseur

24-13

Comment rpondre aux vnements gnrs par le client

ensembles de donnes tels que les ensembles de donnes de type table ou les composants TQuery dynamiques. Toutefois, les mises jour automatiques reprsentent un problme dans le cas o le fournisseur doit appliquer les mises jour aux donnes sous-jacentes une procdure stocke renvoyant un ensemble de rsultats ou une requte multitable. Il nest pas vident de dterminer le nom de la table dans laquelle appliquer les mises jour. Si la requte ou procdure stocke est un ensemble de donnes BDE (TQuery ou TStoredProc) et quelle possde un objet mise jour associ, le fournisseur utilise cet objet. Toutefois, en labsence dobjet mise jour, vous devez spcifier le nom de la table par code dans un gestionnaire dvnement OnGetTableName. Quand ce gestionnaire dvnement a indiqu un nom de table, le fournisseur peut gnrer les instructions SQL appropries pour appliquer les mises jour. La solution consistant fournir le nom de la table ne fonctionne que si les mises jour doivent tre appliqu es une seule table de base de donnes (sil suffit de modifier les enregistrements dune seule table). Si la mise jour ncessite la modification de plusieurs tables de la base de donnes, vous devez explicitement appliquer les mises jour en utilisant lvnement BeforeUpdateRecord du fournisseur. Quand ce gestionnaire dvnement a appliqu une mise jour, vous devez initialiser son paramtre Applied True afin que le fournisseur ne gnre pas une erreur.
Remarque

Si le fournisseur est associ un ensemble de donnes BDE, vous pouvez utiliser un objet mise jour dans le gestionnaire dvnement BeforeUpdateRecord pour appliquer les mises jour laide dinstructions SQL personnalises. Voir Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45, pour plus de dtails.

Comment rpondre aux vnements gnrs par le client


Les composants fournisseur implmentent un vnement gnrique qui vous permet de crer vos propres appels du fournisseur directement par les ensembles de donnes client. Cest lvnement OnDataRequest. OnDataRequest ne rentre pas dans le fonctionnement normal dun fournisseur. Cest simplement un point dentre qui permet vos ensembles de donnes client de communiquer directement avec les fournisseurs. Ce gestionnaire dvnement attend comme paramtre en entre un OleVariant et renvoie un OleVariant. En utilisant des valeurs OleVariant, vous disposez dune interface suffisamment gnrale pour vous adapter tout type dinformation reue ou envoye par le fournisseur. Pour gnrer un vnement OnDataRequest, lapplication client appelle la mthode DataRequest de lensemble de donnes client.

24-14

Guide du dveloppeur

Gestion des contraintes du serveur

Gestion des contraintes du serveur


La plupart des systmes de gestion de bases de donnes relationnelles implmentent des contraintes sur les tables afin de garantir lintgrit des donnes. Une contrainte est une rgle contrlant les valeurs des tables et des colonnes et les relations entre les donnes de colonnes de diffrentes tables. Ainsi, la plupart des bases de donnes compatibles SQL-92 grent les contraintes suivantes : NOT NULL, afin de garantir que la valeur dune colonne est dfinie. NOT NULL UNIQUE, afin de garantir quune colonne contient une valeur et que cette valeur nexiste pas dans cette colonne pour un autre enregistrement. CHECK, afin de garantir que la valeur dune colonne se trouve dans un intervalle spcifi ou quelle appartient une plage limite de valeurs autorises. CONSTRAINT, une contrainte portant sur la table sappliquant plusieurs colonnes. PRIMARY KEY, pour dsigner une ou plusieurs colonnes comme cl primaire jouant un rle dans lindexation. FOREIGN KEY, pour dsigner une ou plusieurs colonnes dans une table en rfrenant une autre.
Remarque

Cette liste nest pas exhaustive. Votre serveur de bases de donnes peut grer certaines ou toutes les contraintes prcdentes, ainsi que dautres. Pour davantage dinformations sur les contraintes quil gre, consultez la documentation de votre serveur. Les contraintes dun serveur de base de donnes prennent la place de nombreuses vrifications effectues auparavant par les applications classiques de bases de donnes de bureau. Vous pouvez tirer profit des contraintes dfinies par le serveur dans vos applications de bases de donnes multiniveaux sans avoir reproduire les contraintes dans le code du serveur dapplications ou dans celui de lapplication client. Si le fournisseur utilise un ensemble de donnes BDE, la proprit Constraints vous permet de reproduire et dappliquer les contraintes du serveur aux donnes transmises ou reues par les applications client. Si Constraints a la valeur True (cas par dfaut), les contraintes du serveur stockes dans lensemble de donnes source figurent dans les paquets de donnes et affectent les tentatives de modification des donnes par les clients.

Important

Avant que le fournisseur ne puisse transfrer aux ensembles de donnes client les informations relatives aux contraintes, il doit lire ces informations sur le serveur de bases de donnes. Pour importer les contraintes de bases de donnes du serveur, utilisez lexplorateur SQL pour importer les contraintes du serveur de base de donnes et les expressions par dfaut dans le dictionnaire de donnes. Les contraintes et les expressions par dfaut du dictionnaire de donnes sont automatiquement proposes aux ensembles de donnes BDE.

Utilisation des composants fournisseur

24-15

Gestion des contraintes du serveur

Il est parfois ncessaire de ne pas appliquer les contraintes du serveur aux donnes envoyes un ensemble de donnes client. Ainsi quand un ensemble de donnes client reoit les donnes en paquets et autorise la modification locale des donnes avant la lecture de tous les enregistrements, il peut tre ncessaire de dsactiver certaines des contraintes du serveur qui risquent dtre dclenches cause dun ensemble de donnes temporairement incomplet. Pour empcher la rplication des contraintes du fournisseur par lensemble de donnes client, affectez la valeur False Constraints. De toute faon, les ensembles de donnes client peuvent dsactiver ou activer les contraintes en utilisant les mthodes DisableConstraints et EnableConstraints. Pour davantage dinformations sur lactivation et la dsactivation des contraintes par les ensembles de donnes client, voir Gestion des contraintes lies au serveur la page 23-35.

24-16

Guide du dveloppeur

25
Chapitre 25

Chapitre

Cration dapplications multiniveaux

Ce chapitre dcrit la cration dune application de base de donnes client/ serveur multiniveau. Une application client/serveur multiniveau est partitionne en units logiques, appeles niveaux, dont les diffrentes units fonctionnent en coordination les unes avec les autres sur des machines spares. Les applications multiniveaux partagent des donnes et communiquent par un rseau local voire mme par Internet. Elles offrent de nombreux avantages, comme les applications clients simples et la logique dentreprise centralise. Dans sa forme la plus simple, parfois appele modle niveau triple, une application multiniveau est partitionne en trois niveaux : une application client : elle fournit une interface utilisateur sur la machine de lutilisateur ; un serveur dapplications : il rside dans un emplacement central du rseau, accessible tous les clients, et offre des services de donnes courants ; un serveur de bases de donnes distant : il supporte le systme de gestion de base de donnes relationnelles (SGBDR). Dans ce modle niveau triple, le serveur dapplications gre les flux de donnes entre les clients et le serveur de base de donnes distant ; il est donc parfois dnomm courtier ou broker de donnes . Avec Delphi, on ne cre gnralement que le serveur dapplications et ses clients, bien que, si vous tes rellement ambitieux, vous puissiez crer galement votre propre dorsal de base de donnes. Dans les applications multiniveaux plus complexes, les services supplmentaires se situent entre un client et un serveur de base de donnes distant. Vous pouvez, par exemple, disposer dun courtier de services de scurit pour prendre en charge la scurit des transactions Internet ou de services de pont pour prendre en charge le partage de donnes avec des bases de donnes rsidant sur dautres plates-formes.

Cration dapplications multiniveaux

25-1

Avantages du modle de base de donnes multiniveau

Le support Delphi pour le dveloppement des applications multiniveaux tend la faon dont les ensembles de donnes client communiquent avec un composant fournisseur laide de paquets de donnes transportables. Ce chapitre se focalise sur la cration dune application de bases de donnes niveau triple. Quand vous savez crer et grer une application niveau triple, vous pouvez crer et ajouter des couches de services supplmentaires en fonction de vos besoins.

Avantages du modle de base de donnes multiniveau


Le modle de base de donnes multiniveau divise une application de base de donnes en units logiques. Lapplication client peut se focaliser sur laffichage des donnes et sur les interactions utilisateur. Dans sa forme idale, elle ignore la faon dont les donnes sont stockes ou gres. Le serveur dapplications (niveau intermdiaire) coordonne et traite les requtes et les mises jour de diffrents clients. Il gre tous les dtails de la dfinition des ensembles de donnes et de linteraction avec le serveur de bases de donnes. Les avantages de ce modle multiniveau sont les suivants : Encapsulation de la logique de lentreprise dans un niveau intermdiaire partag. Toutes les applications client accdent au mme niveau intermdiaire. Cela vite la redondance et le cot de gestion lis la duplication des rgles de lentreprise pour chaque application. Applications client simples. Vous pouvez crire vos applications client de sorte quelles occupent peu de place et dlguer ainsi une part plus importante du traitement aux niveaux intermdiaires. Non seulement les applications client sont de taille rduite, mais elles sont plus faciles dployer car elles ne sont pas concernes par linstallation, la configuration et la gestion du logiciel de connectivit des bases de donnes (comme le moteur de bases de donnes Borland et les logiciels ct client du serveur de bases de donnes). Les applications client simples peuvent tre distribues sur Internet pour bnficier de plus de souplesse. Traitement distribu des donnes. La rpartition du travail dune application entre plusieurs machines peut amliorer les performances par un meilleur quilibrage de la charge et permet aux systmes redondants de prendre le relais en cas de dfaillance dun serveur. Possibilit damliorer la scurit. Vous pouvez isoler les fonctionnalits sensibles dans des niveaux sur lesquels sont appliqu es diffrentes restrictions daccs. Vous bnficiez ainsi de niveaux de scurit souples et configurables. Les niveaux intermdiaires peuvent limiter les points dentre des supports sensibles, ce qui vous permet de mieux en contrler laccs. Si vous utilisez HTTP, CORBA ou COM+, vous pouvez tirer parti de leur modle de scurit.

25-2

Guide du dveloppeur

Prsentation des applications multiniveaux bases sur les fournisseurs

Prsentation des applications multiniveaux bases sur les fournisseurs


Le support de Delphi pour les applications multiniveaux utilise les composants de la page DataSnap et de la page Accs BD de la palette des composants ainsi quun module de donnes distant cr par un expert de la page Multi-niveaux de la bote de dialogue Nouveaux lments. Ils sont bass sur la possibilit des composants fournisseur dassembler les donnes en paquets de donnes transportables et de traiter les mises jour reues en tant que paquets delta transportables. Les composants requis pour une application multiniveau sont dcrits dans le tableau suivant :
Tableau 25.1 Composant
Modules de donnes distants Composant fournisseur Composant ensemble de donnes client

Composants utiliss dans les applications multiniveaux Description


Modules de donnes spcialiss agissant commeun serveur COM Automation, serveur SOAP ou serveur CORBA pour permettre aux applications client daccder tous les fournisseurs quils contiennent. Utilis sur lapplication serveur. Courtier de donnes qui offre des donnes en crant des paquets de donnes et qui rsout les mise jours client. Utilis sur lapplication serveur. Ensemble de donnes spcialis qui utilise midas.dll ou midaslib.dcu pour grer les donnes stockes sous forme de paquets de donnes. Lensemble de donnes client est utilis dans lapplication client. Il place les mises jour en mmoire cache localement et les applique dans des paquets delta sur le serveur dapplications. Famille de composants qui localisent le serveur, tablissent les connexions et mettent linterface IAppServer la disposition des ensembles de donnes client. Chaque composant connexion utilise un protocole de communication particulier.

Composants connexion

Les composants fournisseur et ensemble de donnes client requirent midas.dll ou midaslib.dcu, qui gre les ensembles de donnes stocks sous forme de paquets de donnes. (Etant donn que le fournisseur est utilis sur le serveur dapplications et que lensemble de donnes client est utilis sur lapplication client, si vous utilisez midas.dll, vous devez le dployer la fois sur lapplication serveur et sur lapplication client.) Si vous utilisez des ensembles de donnes BDE, le serveur dapplications peut ncessiter lexplorateur SQL qui facilite la gestion des bases de donnes et qui permet dimporter les contraintes serveur dans le dictionnaire des donnes, de sorte quelles peuvent tre contrles nimporte quel niveau dune application multiniveau.
Remarque

Vous devez acqurir des licences serveur pour dployer vos applications. Larchitecture qui accueille ces composants est dcrite dans Utilisation dune architecture multiniveau la page 14-15.

Cration dapplications multiniveaux

25-3

Prsentation des applications multiniveaux bases sur les fournisseurs

Prsentation dune application niveau triple


Les tapes numrotes suivantes illustrent une suite normale dvnements pour une application niveau triple base sur les fournisseurs :

1 Un utilisateur dmarre lapplication client. Le client se connecte au serveur dapplications (qui peut tre spcifi lors de la conception ou lors de lexcution). Si le serveur dapplications nest pas dj en fonctionnement, il dmarre. Le client reoit une interface IAppServer du serveur dapplications. 2 Le client demande des donnes au serveur dapplications. Un client peut demander toutes les donnes la fois ou bien demander les donnes par fragments durant la session (extraction sur demande). 3 Le serveur dapplications rcupre les donnes (si ncessaire, en tablissant dabord une connexion avec la base de donnes), les empaquette pour le client puis renvoie un paquet de donnes au client. D autres informations (par exemple, les caractristiques de laffichage des champs) peuvent tre incluses dans les mtadonnes du paquet de donnes. Ce processus dempaquetage des donnes est appel fourniture. 4 Le client dcode le paquet de donnes et affiche les donnes lutilisateur. 5 Pendant que lutilisateur interagit avec lapplication client, les donnes sont mises jour (des enregistrements sont ajouts, supprims ou modifis). Ces modifications sont stockes par le client dans un journal de modifications. 6 Le client applique ensuite les mises jour au serveur dapplications, gnralement en rponse une action de lutilisateur. Pour appliquer les mises jour, le client empaquette son journal des modifications et le transmet en tant que paquet de donnes au serveur. 7 Le serveur dapplications dcode le paquet et met les mises jour (dans le contexte dune transaction, le cas chant). Si un enregistrement ne peut pas tre valid (par exemple parce quune autre application a modifi lenregistrement aprs que le client la demand et avant que le client nait appliqu ses mises jour), le serveur dapplications essaie de rgulariser les modifications du client avec les donnes courantes ou enregistre les enregistrements qui nont pu tre valids. Cette opration de validation des enregistrements et de sauvegarde des enregistrements problme est dnomme rsolution. 8 Aprs lopration de rsolution, le serveur dapplications renvoie au client les enregistrements non transmis pour rsolution ultrieure. 9 Le client rgularise les enregistrements non rsolus. Cela peut seffectuer de plusieurs manires. Le client tente habituellement de remdier la situation qui a empch la validation des enregistrements ou bien annule les changements. Si lerreur peut tre corrige, le client applique de nouveau les mises jour. 10 Le client rafrachit ses donnes partir du serveur.

25-4

Guide du dveloppeur

Prsentation des applications multiniveaux bases sur les fournisseurs

Structure de lapplication client


Pour lutilisateur final, lapplication client dune application multiniveau a lapparence et le comportement dune application niveau double qui utilise les mises jour en cache. Linteraction utilisateur sopre par le biais de contrles orients donnes standard qui affichent les donnes partir dun composant TClientDataSet. Pour plus de dtails sur lutilisation des proprits, vnements et mthodes des ensembles de donnes client, voir chapitre 23, Utilisation densembles de donnes client. TClientDataSet rcupre les donnes dun composant fournisseur, auquel il applique les mises jour, limage des applications niveau double qui utilisent un ensemble de donnes client et un fournisseur externe. Pour plus dinformations sur les fournisseurs, voir chapitre 24, Utilisation des composants fournisseur. Pour plus dinformations sur les fonctionnalits dun ensemble de donnes client qui facilitent sa communication avec un fournisseur, voir Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29. Lensemble de donnes client communique avec le fournisseur par le biais de linterface IAppServer. Il obtient cette interface auprs dun composant connexion. Le composant connexion tablit la connexion au serveur dapplications. Diffrents composants connexion sont disponibles suivant les protocoles de communication utiliss. Ces composants connexion sont prsents dans le tableau suivant :
Tableau 25.2 Composant
TDCOMConnection TSocketConnection TWebConnection TSOAPConnection TCorbaConnection

Composant connexion Protocole


DCOM Windows sockets (TCP/IP) HTTP SOAP (HTTP et XML) CORBA (IIOP)

Remarque

Delphi comprend galement un composant connexion qui ne se connecte pas un serveur dapplications mais qui fournit une interface IAppServer aux ensembles de donnes client afin quils puissent communiquer avec les fournisseurs dans la mme application. Ce composant, TLocalConnection, nest pas requis mais facilite lvolution ultrieure vers une application multiniveau. Pour plus dinformations sur lutilisation des composants connexion, voir Connexion au serveur dapplications la page 25-27.

Structure du serveur dapplications


Lorsque vous configurez et excutez un serveur dapplications, ce dernier ntablit pas de connexion avec les applications client. Cest au contraire les applications client qui initialisent et maintiennent la connexion. Lapplication

Cration dapplications multiniveaux

25-5

Prsentation des applications multiniveaux bases sur les fournisseurs

client utilise son composant connexion pour tablir une connexion avec le serveur dapplications, qu il utilise pour communiquer avec son fournisseur slectionn. Tout ce processus est automatique et vous navez pas besoin dcrire du code pour grer les requtes entrantes, ni pour fournir les interfaces. Un serveur dapplications repose sur un module de donnes distant, module de donnes spcialis qui gre linterface IAppServer. Les applications client utilisent linterface IAppServer pour communiquer avec les fournisseurs sur le serveur dapplications. Il existe quatre types de modules de donnes distants : TRemoteDataModule : il sagit dun serveur Automation double interface. Utilisez ce type de module de donnes distant si les clients utilisent DCOM, HTTP, sockets ou OLE pour se connecter au serveur dapplications, sauf si vous souhaitez installer le serveur dapplications avec MTS. TMTSDataModule : il sagit dun serveur Automation double interface. Utilisez ce type de module de donnes distant si vous crez le serveur dapplications en tant que bibliothque active (.DLL) installe avec MTS ou COM+. Vous pouvez utiliser des modules de donnes distants MTS avec DCOM, HTTP, sockets ou OLE. TCorbaDataModule : il sagit dun serveur CORBA. Utilisez ce type de module de donnes distant pour fournir des donnes aux clients CORBA. TSoapDataModule : il sagit dun module de donnes qui implmente un descendant de IAppServer comme interface invocable dans une application service Web. Utilisez ce type de module de donnes distant pour fournir des donnes aux clients accdant aux donnes en tant que service Web. Si le serveur dapplications doit tre dploy sur MTS ou COM+, le module de donnes distant contient des vnements pour lactivation et la dsactivation du serveur dapplications. Cela lui permet dacqurir des connexions de bases de donnes quand il est activ et de les librer quand il est dsactiv.

Contenu du module de donnes distant


Vous pouvez inclure un composant non visuel dans le module de donnes distant comme dans nimporte quel module de donnes. Toutefois, vous devez inclure certains composants : Si le module de donnes distant expose des informations dun serveur de bases de donnes, il doit comprendre un composant ensemble de donnes pour reprsenter les enregistrements de ce serveur de bases de donnes. Dautres composants, tel quun composant connexion de base de donnes dun type particulier, peut tre requis pour permettre lensemble de donnes dinteragir avec un serveur de bases de donnes. Pour plus dinformations sur les ensembles de donnes, voir chapitre 18, Prsentation des ensembles de donnes. Pour plus dinformations sur les composants connexion de base de donnes, voir chapitre 17, Connexion aux bases de donnes. Pour chaque ensemble de donnes que le module de donnes distant expose aux clients, il doit comprendre un fournisseur densemble de donnes. Un

25-6

Guide du dveloppeur

Prsentation des applications multiniveaux bases sur les fournisseurs

fournisseur densemble de donnes rassemble les donnes en paquets de donnes qui sont envoys aux ensembles de donnes client et applique les mises jour reues des ensembles de donnes client un ensemble de donnes source ou un serveur de bases de donnes. Pour plus dinformations sur les fournisseurs densemble de donnes, voir chapitre 24, Utilisation des composants fournisseur. Pour chaque document XML que le module de donnes distant expose aux clients, il doit comprendre un fournisseur XML. Un fournisseur XML se comporte comme un fournisseur densemble de donnes, la diffrence quil rcupre les donnes dun document XML et les applique celui-ci, au lieu dutiliser un serveur de bases de donnes. Pour plus dinformations sur les fournisseurs XML, voir Utilisation dun document XML comme source pour un fournisseur la page 26-9.
Remarque

Ne confondez pas les composants connexion de base de donnes, qui connectent les bases de donnes un serveur de bases de donnes, avec les composants connexion utiliss par les applications client dune application multiniveau. Les composants connexion des applications multiniveaux sont disponibles sur la page DataSnap de la palette de composants.

Utilisation des modules de donnes transactionnels


Vous pouvez crire un serveur dapplications tirant profit des services spcifiques pour les applications distribu es proposes par MTS (avant Windows 2000) ou COM+ (sous Windows 2000 ou plus). Pour ce faire, vous devez crer un module de donnes transactionnel au lieu dun simple module de donnes distant. Lors de lcriture dun module de donnes transactionnel, une application peut exploiter des services spcifiques : Scurit. MTS et COM+ offrent au serveur dapplications une scurit par rle. Des rles sont attribus aux clients pour dterminer comment ils peuvent accder linterface du module de donnes MTS. Le module de donnes MTS implmente la mthode IsCallerInRole qui vous permet de dterminer le rle du client connect et dautoriser un accs conditionnel certaines fonctionnalits en fonction du rle. Pour davantage dinformations sur la scurit MTS et COM+, voir Scurit en fonction des rles la page 39-15. Regroupement des handles de bases de donnes. Les modules de donnes transactionnels regroupent automatiquement les connexions de bases de donnes si vous utilisez ADO ou (si vous utilisez MTS en activant loption MTS POOLING) le BDE. De sorte que, lorsqu un client nutilise plus une connexion de base de donnes, un autre client la rutilise. Ceci allge le trafic rseau car votre niveau intermdiaire na pas besoin de se dconnecter du serveur de bases de donnes distant et de sy reconnecter. Lorsque les handles de bases de donnes sont regroups, votre composant connexion de base de donnes doit affecter sa proprit KeepConnectionla valeur False, pour que votre application optimise le partage des connexions. Pour davantage

Cration dapplications multiniveaux

25-7

Prsentation des applications multiniveaux bases sur les fournisseurs

dinformations sur le regroupement des handles de bases de donnes, voir Fournisseurs de ressources base de donnes la page 39-6. Transactions. Lorsque vous utilisez un module de donnes transactionnel, vous pouvez proposer une gestion amliore des transactions ne se limitant pas une seule connexion de base de donnes. Des modules de donnes transactionnels peuvent participer des transactions recouvrant plusieurs bases de donnes ou contenir des fonctions qui nimpliquent aucune base de donnes. Pour davantage dinformations sur la gestion des transactions propose par les objets transactionnels, voir Gestion des transactions dans les applications multiniveaux la page 25-21. Activation juste temps et dsactivation ds que possible. Vous pouvez crire votre serveur de sorte que les instances du module de donnes distant soient actives et dsactives en fonction des besoins. Lorsque vous utilisez lactivation juste temps et la dsactivation ds que possible, votre module de donnes distant est instanci uniquement lorsquil est requis pour traiter des requtes client. Cela lui vite de mobiliser des ressources inutilises comme les handles de bases de donnes. Lutilisation de lactivation juste temps et de la dsactivation ds que possible offre un juste milieux entre le routage de tous les clients par le biais dune seule instance du module de donnes distant et la cration dune instance pour chaque connexion client. Avec une seule instance du module de donnes distant, le serveur dapplications doit traiter tous les appels de bases de donnes par le biais dune seule connexion de base de donnes. Cela aboutit un goulet dtranglement et peut pnaliser les performances sil y a trop de clients. Avec plusieurs instances du module de donnes distant, chaque instance peut grer une connexion de base de donnes, ce qui vite de srialiser les accs aux bases de donnes. Toutefois, cela monopolise les ressources car les autres clients ne peuvent pas utiliser la connexion la base de donnes tant quelle est associe au module de donnes distant dun client. Pour tirer parti des transactions, de lactivation juste temps et de la dsactivation ds que possible, les instances du module de donnes distant doivent tre sans tat. Cela signifie que vous devez fournir plus de support lorsque votre client utilise des informations dtat. Par exemple, le client doit passer les informations sur lenregistrement en cours lors des lectures incrmentales. Pour plus de renseignements sur les informations dtat et les modules de donnes distants dans les applications multiniveaux, voir Gestion des informations dtat dans les modules de donnes distants la page 25-23. Par dfaut, tous les appels un module de donnes transactionnel gnrs automatiquement sont transactionnels (ils supposent qu la fin de lappel le module de donnes peut tre dsactiv et que toutes les transactions en cours ventuelles peuvent tre valides (commit) ou annules (rollback). Vous pouvez crire un module de donnes transactionnel dpendant dinformations dtat persistantes en initialisant False la proprit AutoComplete, mais il ne supportera pas les transactions, ni lactivation juste temps, ni la dsactivation ds que possible moins dutiliser une interface personnalise.

25-8

Guide du dveloppeur

Prsentation des applications multiniveaux bases sur les fournisseurs

Attention

Les serveurs dapplications utilisant des modules de donnes transactionnels ne doivent pas ouvrir de connexions de bases de donnes avant lactivation du module de donnes. Pendant le dveloppement de votre application, assurezvous que tous les ensembles de donnes sont inactifs et que la base de donnes nest pas connecte avant lexcution de votre application. Dans lapplication ellemme, vous devez ajouter du code pour ouvrir les connexions de bases de donnes lors de lactivation du module de donnes et pour les fermer lors de sa dsactivation.

Regroupement des modules de donnes distants


Le regroupement dobjets permet de crer un cache des modules de donnes distants partags par leurs clients, ce qui conomise les ressources. Son fonctionnement dpend du type du module distant et du protocole de connexion. Si vous crez un module de donnes transactionnel install sur COM+, vous pouvez utiliser le gestionnaire de composants COM+ pour installer le serveur dapplications comme un objet regroup. Pour davantage dinformations, voir Regroupement dobjets la page 39-9. Mme si vous nutilisez pas un module de donnes transactionnel, vous pouvez exploiter les avantages du regroupement dobjets si la connexion est constitue en utilisant HTTP (TWebConnection ou TSOAPConnection). Avec cet autre type de regroupement dobjets, vous limitez le nombre dinstances cres de votre module de donnes distant. Cela limite le nombre de connexions de bases de donnes maintenir ainsi que dautres ressources utilises par le module de donnes distant. Lorsque lapplication serveur Web reoit les demandes des clients (qui transmettent les appels votre module de donnes distant), elle les transmet au premier module de donnes distant disponible du regroupement. Sil ny a pas de module de donnes distant disponible, elle en cre un nouveau (jusquau nombre maximal que vous avez spcifi). Cest une solution intermdiaire entre le routage de tous les clients via une seule instance du module de donnes distant (qui peut crer un goulet dtranglement) et la cration dune instance spare pour chaque connexion client (qui gaspille de nombreuses ressources). Si une instance de module de donnes distant du groupe ne reoit pas de demande client pendant un moment, elle est automatiquement libre. Cela empche le groupe de monopoliser les ressources inutilement. Pour configurer le regroupement dobjets avec une connexion Web (HTTP), votre module de donnes distant doit redfinir la mthode UpdateRegistry. Dans la mthode redfinie, appelez RegisterPooled quand le module de donnes distant est recens et UnregisterPooled quand son recensement est annul.Quand vous utilisez une mthode de regroupement dobjets, votre module de donnes distant doit tre sans tat. En effet, une seule instance peut ventuellement grer des requtes de plusieurs clients. Si elle dpend dinformations persistantes dtat, des clients peuvent interfrer avec dautres. Pour davantage dinformations, voir Gestion des informations dtat dans les modules de donnes distants la page 25-23.

Cration dapplications multiniveaux

25-9

Prsentation des applications multiniveaux bases sur les fournisseurs

Slection dun protocole de connexion


Chaque protocole de communication que vous pouvez utiliser pour connecter vos applications client au serveur dapplications offre ses propres avantages. Avant de choisir un protocole, dterminez le nombre de clients attendus, le dploiement de votre application et les plans de dveloppement futurs.

Utilisation de connexions DCOM


Le protocole DCOM offre lapproche de communication la plus directe car il ne requiert aucune application dexcution particulire sur le serveur. Toutefois, comme DCOM nest pas inclus dans Windows 95, il peut ne pas tre install sur danciennes machines client. DCOM offre la seule approche qui vous permette dutiliser les services de scurit dans un module de donnes transactionnel. Ces services de scurit reposent sur lattribution de rles aux appelants dobjets transactionnels. Si DCOM est utilis, DCOM indique au systme lapplication client gnratrice de lappel votre serveur dapplications (MTS ou COM+). Il est alors possible de dterminer prcisment le rle de lappelant. Avec dautres protocoles, toutefois, un excutable runtime, spar du serveur dapplications, reoit les appels clients. Cet excutable runtime ralise les appels COM vers le serveur dapplications pour le compte du client. De ce fait, il est impossible dattribuer des rles pour distinguer les clients : lexcutable runtime est en fait le seul client. Pour davantage dinformations sur la scurit et les objets transactionnels, voir Scurit en fonction des rles la page 39-15.

Utilisation de connexions Socket


TCP/IP Sockets vous permet de crer des clients lgers. Par exemple, si vous crivez une application client pour le Web, vous ne pouvez pas tre certain que les systmes client supportent DCOM. Le protocole Sockets offre un plus petit dnominateur commun qui permet dtablir des connexions au serveur dapplications. Pour plus dinformations sur les sockets, voir chapitre 32, Utilisation des sockets. Au lieu dinstancier directement le module de donnes distant partir du client (comme cest le cas avec DCOM), le protocole Sockets utilise une application spare sur le serveur (ScktSrvr.exe) qui accepte les requtes client et instancie le module de donnes distant laide de COM. Le composant connexion sur le client et ScktSrvr.exe sur le serveur sont responsables du tri des appels IAppServer.
Remarque

ScktSrvr.exe peut sexcuter en tant quapplication de service NT. Recensez-le dans le gestionnaire de services en le lanant avec loption en ligne de commande -install. Vous pouvez le drecenser avec loption en ligne de commande -uninstall. Avant de pouvoir utiliser une connexion socket, le serveur dapplications doit recenser sa disponibilit pour les clients utilisant une connexion socket. Par dfaut, tous les nouveaux modules de donnes distants se recensent eux-mmes en ajoutant un appel de la mthode EnableSocketTransport dans la mthode

25-10

Guide du dveloppeur

Prsentation des applications multiniveaux bases sur les fournisseurs

UpdateRegistry. Vous pouvez retirer cet appel pour empcher les connexions de socket votre serveur dapplications.
Remarque

Des serveurs plus anciens najoutant pas ce recensement, vous pouvez dsactiver la vrification que le serveur dapplications est recens en dslectionnant dans ScktSrvr.exe llment de menu Connexions|Objets recenss seulement. Tant quil na pas libr une rfrence aux interfaces sur le serveur dapplications, le protocole Sockets noffre aucune protection sur le serveur contre les dfaillances systme client. Tout en gnrant moins de trafic de messages que DCOM (qui envoie priodiquement des messages), lutilisation de Sockets peut aboutir la situation dans laquelle un serveur dapplications, non conscient de la dconnexion du client, ne libre pas ses ressources.

Utilisation de connexions Web


HTTP vous permet de crer des clients pouvant communiquer avec un serveur dapplications protg par un coupe-feu. Les messages HTTP procurent un accs contrl aux applications internes afin que vos applications client soient distribues largement en toute scurit. Comme les connexions socket, les messages HTTP offre un plus petit dnominateur commun, que vous savez disponible, pour tablir des connexions au serveur dapplications. Pour plus dinformations sur les messages HTTP, voir chapitre 27, Cration dapplications Internet. Au lieu dinstancier directement le module de donnes distant partir du client (comme cela se produit pour DCOM), les connexions bases sur HTTP utilisent un serveur dapplications Web sur le serveur (httpsrvr.dll), qui accepte les requtes client et instancie le module de donnes distant laide de COM. De ce fait, on les appelle galement connexions Web. Le composant connexion sur le client et httpsrvr.dll sur le serveur sont responsables du tri des appels IAppServer. Les connexions Web peuvent tirer parti de la scurit SSL apporte par wininet.dll (une bibliothque dutilitaires Internet qui sexcute sur le systme client). Lorsque vous avez configur le serveur Web sur le systme serveur pour quil exige une authentification, vous pouvez spcifier le nom dutilisateur et le mot de passe en utilisant les proprits du composant de la connexion Web. Comme autre mesure de scurit, le serveur dapplications doit recenser sa disponibilit pour les clients utilisant une connexion Web. Par dfaut, tous les nouveaux modules de donnes distants se recensent eux-mmes en ajoutant un appel de la mthode EnableWebTransportdans la mthode UpdateRegistry. Vous pouvez retirer cet appel pour empcher les connexions Web votre serveur dapplications.Les connexions Web peuvent bnficier du regroupement dobjets. Il permet votre serveur de crer un groupe limit dinstances de module de donnes distant accessibles aux requtes client. En groupant les modules de donnes distants, votre serveur utilise des ressources pour les modules de donnes et pour les connexions aux bases de donnes uniquement lorsque cela est ncessaire. Pour plus dinformations sur le regroupement des objets, voir Regroupement des modules de donnes distants la page 25-9.

Cration dapplications multiniveaux

25-11

Construction dune application multiniveau

Au contraire de ce qui se passe avec la plupart des autres composants connexion, vous ne pouvez pas utiliser de rappels lorsque la connexion a t tablie via HTTP.

Utilisation de connexions SOAP


SOAP est le protocole grce auquel Delphi prend en charge les applications service Web. SOAP transfre les appels aux mthodes laide dun codage XML. Les connexions SOAP utilisent HTTP comme protocole de transport. Les connexions SOAP prsentent lavantage de pouvoir fonctionner dans les applications multiplates-formes car elles sont prises en charge la fois sous Windows et Linux. Les connexions SOAP utilisant HTTP, elles offrent les mmes avantages que les connexions Web : HTTP fournit un plus petit dnominateur commun disponible sur tous les clients, qui peuvent communiquer avec un serveur dapplications protg par un coupe-feu. Pour plus dinformations sur lutilisation de SOAP pour distribuer une application sous Delphi, voir chapitre 31, Utilisation de services Web . Comme dans le cas des connexions HTTP, vous ne pouvez pas utiliser de rappels lorsque la connexion a t tablie via SOAP. Les connexions SOAP vous limite galement un seul module de donnes distant dans le serveur dapplications.

Utilisation de connexions CORBA


CORBA vous permet dintgrer vos applications de bases de donnes multiniveaux un environnement standardis CORBA. Par exemple, lorsque vous utilisez une application client crite en Java, seule la connexion CORBA est disponible. CORBA (et Java) tant accessible sur de multiples plates-formes, cela vous permet dcrire des applications multiniveaux pour plusieurs plates-formes. Grce CORBA, votre application bnficie automatiquement de la rpartition quilibre de la charge, de la transparence de localisation et du basculement de serveur du logiciel runtime ORB. De plus, vous pouvez ajouter des hooks pour tirer parti des autres services CORBA.

Construction dune application multiniveau


Les tapes gnrales de cration dune application de bases de donnes multiniveau sont les suivantes ;

1 Crez le serveur dapplications. 2 Recensez ou installez le serveur dapplications. 3 Crez une application client.
Lordre de cration est important. Vous devez crer et excuter le serveur dapplications avant de crer un client. Lors de la conception, vous pouvez alors vous connecter au serveur dapplications pour tester votre client. Vous pouvez, bien entendu, crer un client sans spcifier le serveur dapplications lors de la conception et nindiquer le nom du serveur qu lexcution, mais cela ne vous

25-12

Guide du dveloppeur

Cration du serveur dapplications

permet pas de voir si votre application fonctionne correctement et vous ne pourrez pas choisir les serveurs et les fournisseurs laide de linspecteur dobjets.
Remarque

Si vous ne crez pas lapplication client sur le mme systme que le serveur, et si vous nutilisez pas une connexion DCOM, vous pouvez recenser le serveur dapplications sur le systme client. Ainsi, le composant connexion dtecte le serveur dapplications la conception, ce qui vous permet de choisir des noms de serveur et de fournisseur partir dune liste droulante de linspecteur dobjets. Si vous utilisez une connexion Web, SOAP ou socket, le composant connexion lit le nom des serveurs recenss sur la machine serveur.

Cration du serveur dapplications


La cration dun serveur dapplications est trs similaire la cration de la plupart des applications de bases de donnes. La principale diffrence rside dans le fait que le serveur dapplications inclut utilise un module de donnes distant. Pour crer un serveur dapplications, excutez les tapes suivantes :

1 Dmarrez un nouveau projet :


Si vous utilisez SOAP comme protocole de transport, ce sera une nouvelle application service Web. Choisissez Fichier|Nouveau|Autre et, sur la page Services Web du dialogue Nouveaux lments, choisissez Application service Web. Pour tout autre protocole de transport, vous navez qu choisir Fichier| Nouveau|Application. Enregistrez le nouveau projet.

2 Ajoutez un nouveau module de donnes distant au projet. Dans le menu principal, choisissez Fichier|Nouveau|Autre et, dans la page Multiniveaux de la bote de dialogue Nouveaux lments, slectionnez
Module de donnes distant si vous crez un serveur COM Automation auxquels les clients peuvent accder laide de DCOM, HTTP, Sockets ou OLEnterprise ; Module de donnes transactionnel si vous crez un module de donnes distant excut dans MTS ou COM+. Les connexions peuvent tre tablies laide de DCOM, HTTP ou de sockets. Mais seul DCOM gre les services de scurit. Module de donnes CORBA si vous crez un serveur CORBA. Module de donnes SOAP si vous crez un serveur SOAP dans une application service Web. Pour plus de dtails sur la configuration dun module de donnes distant, voir Configuration du module de donnes distant la page 25-15.

Cration dapplications multiniveaux

25-13

Cration du serveur dapplications

Remarque

Les modules de donnes distants sont plus que de simples modules de donnes. Le module de donnes CORBA fait office de serveur CORBA. Le module de donnes SOAP implmente une interface invocable dans une application service Web. Les autres modules de donnes sont des objets COM Automation.

3 Placez sur le module de donnes les composants ensemble de donnes appropris, et configurez-les pour accder au serveur de base de donnes. 4 Placez sur le module de donnes un composant TDataSetProvider pour chaque ensemble de donnes. Ce fournisseur est ncessaire au courtage des demandes client et lempaquetage des donnes. Attribuez la proprit DataSet de chaque composant fournisseur le nom de lensemble de donnes devant tre accessible. Vous pouvez dfinir dautres proprits pour le fournisseur. Voir chapitre 24, Utilisation des composants fournisseur, pour plus de dtails sur la configuration dun fournisseur.
Si vous manipulez des donnes de documents XML, vous pouvez utiliser un composant TXMLTransformProvider au lieu dun ensemble de donnes et du composant TDataSetProvider. Lorsque vous utilisez TXMLTransformProvider, dfinissez la proprit XMLDataFile afin de spcifier le document XML dont proviennent les donnes et auquel les mises jour sont appliqu es.

5 Ecrivez du code pour le serveur dapplications afin dimplmenter les vnements, les rgles dentreprise partag es, les validations de donnes partages et la scurit partage. Lorsque vous crivez ce code, vous pouvez
Etendre linterface du serveur dapplications afin doffrir lapplication client dautres possibilits pour appeler le serveur. Lextension de linterface du serveur dapplications est dcrite dans Extension de linterface du serveur dapplications la page 25-19. Fournir une gestion des transactions au-del des transactions automatiquement cres lorsque les mises jour sont appliques. La gestion des transactions dans les applications de bases de donnes multiniveaux est dcrite dans Gestion des transactions dans les applications multiniveaux la page 25-21. Crer des relations matre / dtail entre les ensembles de donnes de votre serveur dapplications. Les relations matre / dtail sont dcrites dans Gestion des relations matre / dtail la page 25-22. Faire en sorte que votre serveur dapplications soit sans tat. La gestion des informations dtat est dcrite dans Gestion des informations dtat dans les modules de donnes distants la page 25-23. Diviser votre serveur dapplications en plusieurs modules de donnes distants. Lutilisation de plusieurs modules de donnes distants est dcrite dans Utilisation de plusieurs modules de donnes distants la page 25-24.

6 Enregistrez, compilez et recensez ou installez le serveur dapplications. Le recensement dun serveur dapplications est dcrit dans Recensement du serveur dapplications la page 25-25.

25-14

Guide du dveloppeur

Cration du serveur dapplications

7 Si votre serveur dapplications nutilise pas DCOM ou SOAP, vous devez installer le logiciel runtime qui reoit les messages client, instancie le module de donnes distant et trie les appels dinterface.
Pour le protocole TCP/IP Sockets, il sagit dune application de rpartition de sockets, Scktsrvr.exe. Pour les connexions HTTP, il sagit de httpsrvr.dll, une dll ISAPI/NSAPI qui doit tre installe avec votre serveur Web. Pour CORBA, il sagit du VisiBroker ORB.

Configuration du module de donnes distant


Lorsque vous crez le module de donnes distant, vous devez fournir certaines informations indiquant comment il rpond aux requtes client. Ces informations varient avec le type de module de donnes distant. Voir Structure du serveur dapplications la page 25-5, pour plus dinformations sur le type de module de donnes distant ncessaire.

Configuration de TRemoteDataModule
Pour ajouter un composant TRemoteDataModule dans votre application, choisissez Fichier|Nouveau|Autre et slectionnez Module de donnes distant dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes distant apparat. Vous devez fournir un nom de classe pour votre module de donnes distant. Il sagit du nom de base dun descendant de TRemoteDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TRemoteDataModule, qui implmente IMyDataServer, un descendant de IAppServer.
Remarque

Vous pouvez ajouter vos propres proprits et mthodes la nouvelle interface. Pour plus dinformations, voir Extension de linterface du serveur dapplications la page 25-19. Vous devez spcifier le modle threading dans lexpert Module de donnes distant. Vous pouvez choisir Thread Unique, Thread Appartement, Thread Libre ou Les deux. Si vous choisissez Thread Unique, COM fait en sorte quune seule requte client soit traite un moment donn. Aucune requte client ne peut entrer en conflit avec une autre. Si vous choisissez Thread Appartement, COM fait en sorte que toute instance de votre module de donnes distant traite une seule requte un moment donn. Lorsque vous crivez du code dans une bibliothque Thread Appartement, vous devez prvenir les conflits de thread si vous utilisez des variables globales ou des objets non contenus dans le module de donnes distant. Cest le modle recommand si vous utilisez des ensembles de donnes BDE. (Veuillez noter que vous aurez besoin dun composant session

Cration dapplications multiniveaux

25-15

Cration du serveur dapplications

dont la proprit AutoSessionName vaut True pour grer les problmes de threading sur les ensembles de donnes BDE.) Si vous choisissez Thread Libre, votre application peut recevoir des requtes client simultanes sur plusieurs threads. Vous devez faire en sorte que votre application soit compatible avec les threads. Comme plusieurs clients peuvent simultanment accder votre module de donnes distant, vous devez protger vos donnes dinstance (proprits, objets contenus, etc.) ainsi que les variables globales. Cest le modle recommand si vous utilisez des ensembles de donnes ADO. Si vous choisissez Les deux, votre bibliothque fonctionne de la mme faon que lorsque vous choisissez Thread Libre, la diffrence que tous les rappels (appels vers les interfaces client) sont automatiquement srialiss. Si vous choisissez Neutre, le module de donnes distant peut recevoir des appels simultans dans des threads spars, comme dans le modle Thread Libre, mais COM sassure quil ny a pas deux threads accdant la mme mthode au mme moment. Si vous crez un fichier .EXE, vous devez galement spcifier le type dinstanciation utiliser. Vous pouvez choisir Instance unique ou Instance multiple (linstanciation interne ne sapplique que si le code client fait partie du mme espace de processus.) Si vous choisissez Instance unique, chaque connexion client lance sa propre instance du fichier excutable. Ce processus instancie une seule instance du module de donnes distant, qui est ddi la connexion client. Si vous choisissez Instance multiple, une seule instance de lapplication (processus) instancie tous les modules de donnes distants crs pour les clients. Chaque module de donnes distant est ddi une seule connexion client, mais ils partagent tous le mme espace de processus.

Configuration de TMTSDataModule
Pour ajouter un composant TMTSDataModule dans votre application, choisissez Fichier|Nouveau|Autre et slectionnez Module de donnes transactionnel dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes transactionnel apparat. Vous devez fournir un nom de classe pour votre module de donnes distant. Il sagit du nom de base dun descendant de TMTSDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TMTSDataModule, qui implmente IMyDataServer, un descendant de IAppServer.
Remarque

Vous pouvez ajouter vos propres proprits et mthodes votre nouvelle interface. Pour plus dinformations, voir Extension de linterface du serveur dapplications la page 25-19. Vous devez spcifier le modle threading dans lexpert Module de donnes transactionnel. Choisissez Unique, Appartement ou Les deux.

25-16

Guide du dveloppeur

Cration du serveur dapplications

Si vous choisissez Unique, les requtes client sont srialises afin que lapplication nen traite quune seule la fois. Aucune requ te client ne peut entrer en conflit avec une autre. Si vous choisissez Appartement, le systme fait en sorte que toute instance de votre module de donnes distant traite une seule requ te un moment donn ; les appels utilisent toujours le mme thread. Vous devez prvenir les conflits de thread si vous utilisez des variables globales ou des objets non contenus dans le module de donnes distant. Au lieu dutiliser des variables globales, vous pouvez utiliser le gestionnaire de proprits partages. Pour plus dinformations sur le gestionnaire de proprits partages, voir Gestionnaire de proprits partages la page 39-7. Si vous choisissez Les deux, MTS appelle linterface du module de donnes distant de la mme faon que lorsque vous choisissez Appartement. Toutefois, tous les rappels raliss en direction des applications clients sont automatiquement srialiss afin quaucun nentre en conflit avec un autre.
Remarque

Le modle Appartement sous MTS ou COM + est diffrent du modle correspondant sous DCOM. Vous devez aussi spcifier les attributs des transactions de votre module de donnes distant. Vous pouvez choisir parmi les options suivantes : Requiert une transaction. Lorsque vous slectionnez cette option, chaque fois quun client utilise linterface de votre module de donnes distant, lappel est excut dans le contexte dune transaction. Si lappelant fournit une transaction, il est inutile quune nouvelle transaction soit cre. Requiert une nouvelle transaction. Lorsque vous slectionnez cette option, chaque fois quun client utilise linterface de votre module de donnes distant, une nouvelle transaction est automatiquement cre pour lappel. Supporte les transactions. Lorsque vous slectionnez cette option, votre module de donnes distant peut tre utilis dans le contexte dune transaction, mais lappelant doit fournir la transaction lorsquil appelle linterface. Ne supporte pas les transactions. Lorsque vous slectionnez cette option, votre module de donnes distant ne peut pas tre utilis dans le contexte de transactions.

Configuration de TSoapDataModule
Pour ajouter un composant TSoapDataModule dans votre application, choisissez Fichier|Nouveau|Autre et slectionnez Module de donnes SOAP dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes SOAP apparat. Vous devez fournir un nom de classe pour votre module de donnes SOAP. Il sagit du nom de base dun descendant de TSoapDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TSoapDataModule, qui implmente IMyDataServer, un descendant de IAppServer.

Cration dapplications multiniveaux

25-17

Cration du serveur dapplications

Vous pouvez modifier les dfinitions de linterface gnre et le descendant de TSoapDataModule en ajoutant vos propres proprits et mthodes. Ces proprits et mthodes ne sont pas appeles automatiquement, mais les applications client qui demandent votre nouvelle interface par son nom peuvent utiliser toutes les proprits et toutes les mthodes que vous avez ajoutes.
Remarque

Pour utiliser TSoapDataModule, le nouveau module de donnes doit avoir t ajout une application service Web. Linterface IAppServer est une interface invocable, recense dans la section dinitialisation de la nouvelle unit. Cela permet au composant invocateur dans le module Web principal de faire suivre tous les appels entrants votre module de donnes.

Configuration de TCorbaDataModule
Pour ajouter un composant TCorbaDataModule dans votre application, choisissez Fichier|Nouveau et slectionnez Module de donnes CORBA dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes CORBA apparat. Vous devez fournir un nom de classe pour votre module de donnes distant. Il sagit du nom de base dun descendant de TCorbaDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TSoapDataModule, qui implmente IMyDataServer, un descendant de IAppServer.
Remarque

Vous pouvez ajouter vos propres proprits et mthodes votre nouvelle interface. Pour plus dinformations sur lajout dlments linterface de votre module de donnes, voir Extension de linterface du serveur dapplications la page 25-19. Lexpert module de donnes CORBA vous permet de spcifier comment votre application serveur cre les instances du module de donnes distant. Vous pouvez choisir entre le mode partag ou instance par client. Lorsque vous choisissez le mode partag, votre application cre une instance unique du module de donnes distant qui gre toutes les requtes client. Ce modle est traditionnellement utilis dans le dveloppement CORBA. Lorsque vous choisissez le mode une instance par client, une nouvelle instance du module de donnes distant est cre pour chaque connexion client. Cette instance persiste jusqu ce que le dlai dinactivit soit coul sans message de la part du client. Cela permet certes au serveur de librer les instances lorsquelles ne sont plus utilises par les clients, mais prsente le risque que le serveur soit libr prmaturment si le client nutilise pas linterface du serveur pendant une longue priode.

Remarque

Contrairement au modle dinstanciation des serveurs COM, o est dtermin le nombre dinstances du processus qui sont excutes, dans le modle CORBA, linstanciation dtermine le nombre dinstances de votre objet qui sont cres. Elles sont toutes cres dans une seule instance de lexcutable serveur.

25-18

Guide du dveloppeur

Cration du serveur dapplications

Outre le modle dinstanciation, vous devez spcifier le modle threading dans lexpert Module de donnes CORBA. Vous pouvez choisir Monothread ou Multithread. Si vous choisissez Monothread, chaque instance du module de donnes distant est assure de ne recevoir quune requte client un moment donn. Vous pouvez accder en scurit aux objets contenus dans votre module de donnes distant. Toutefois, vous devez prvenir les conflits de thread lorsque vous utilisez des variables globales ou des objets non contenus dans le module de donnes distant. Si vous choisissez Multithread, chaque connexion client dispose de son propre thread. Toutefois, votre application peut tre appele par plusieurs clients simultanment, chacun sur un thread diffrent. Vous devez prvenir laccs simultan aux donnes dinstance ainsi qu la mmoire globale. Lcriture de serveurs multithreads est dlicate lorsque vous utilisez une instance partage du module de donnes distant car vous devez protger toute lutilisation des objets contenus dans le module.

Extension de linterface du serveur dapplications


Les applications client interagissent avec le serveur dapplications en crant, ou en sy connectant, une instance du module de donnes distant. Elles utilisent son interface comme base de toute communication avec le serveur dapplications. Vous pouvez effectuer un ajout linterface de votre module de donnes distant afin damliorer la prise en charge de vos applications client. Cette interface est un descendant de IAppServer ; elle est automatiquement cre par lexpert lorsque vous crez le module de donnes distant. Pour effectuer un ajout linterface du module de donnes distant, vous pouvez Choisir la commande Ajouter linterface dans le menu Edition de lEDI. Indiquez si vous ajoutez une procdure, une fonction ou une proprit et entrez la syntaxe. Lorsque vous cliquez sur OK, vous vous retrouvez dans lditeur de code sur limplmentation du nouveau membre de votre interface. Utiliser lditeur de bibliothque de types. Slectionnez linterface de votre serveur dapplications dans lditeur de bibliothque de types et cliquez sur le bouton doutil correspondant au type de membre dinterface (mthode ou proprit) que vous ajoutez. Nommez votre membre dinterface dans la page Attributs, spcifiez les paramtres et le type dans la page Paramtres puis rafrachissez la bibliothque de types. Pour plus dinformations sur lutilisation de lditeur de bibliothque de types, voir chapitre 34, Utilisation des bibliothques de types. Notez que de nombreuses fonctionnalits que vous pouvez spcifier dans lditeur de bibliothque de types (comme laide contextuelle, la version, etc.) ne sappliquent pas aux interfaces CORBA. Toutes les valeurs que vous spcifiez pour ces dernires dans lditeur de bibliothque de types sont ignores.

Cration dapplications multiniveaux

25-19

Cration du serveur dapplications

Remarque

Aucune de ces approches ne fonctionne si vous implmentez TSoapDataModule. Pour les descendants de TSoapDataModule, vous devez modifier linterface du serveur directement. Le comportement de Delphi lorsque vous ajoutez de nouvelles entres linterface, en utilisant lditeur de bibliothque de types ou la commande Ajouter linterface, diffre selon que vous crez un serveur bas sur COM (TRemoteDataModule ou TMTSDataModule) ou un serveur CORBA (TCorbaDataModule). Lorsque vous ajoutez une interface COM, vos modifications sont ajoutes au code source de votre unit et au fichier de la bibliothque de types (.TLB). Lorsque vous effectuez un ajout linterface CORBA, vos modifications sont rpercutes dans le code source de votre unit et dans lunit _TLB automatiquement gnre. Lunit _TLB est ajoute la clause uses de votre unit. Vous devez ajouter cette unit la clause uses dans votre application client si sous souhaitez tirer parti de la liaison anticipe. De plus, vous pouvez enregistrer un fichier .IDL partir de lditeur de bibliothque de types laide de la commande Fichier|Enregistrer sous. Le fichier .IDL est requis pour recenser linterface dans le rfrentiel dinterfaces et dans le dmon dactivation dobjets.

Remarque

Vous devez enregistrer explicitement le fichier TLB en choisissant Rafrachir dans lditeur de bibliothque de types et en sauvegardant ensuite les modifications depuis lEDI. Une fois que vous avez effectu un ajout linterface de votre module de donnes distant, localisez les proprits et les mthodes ajoutes limplmentation de votre module de donnes distant. Ajoutez du code pour terminer cette implmentation en remplissant le corps des nouvelles mthodes. Les applications client appellent les extensions de votre interface laide de la proprit AppServer de leur composant connexion. Pour plus dinformations sur la procdure suivre, voir Appel des interfaces serveur la page 25-33.

Ajout de rappels linterface du serveur dapplications


Vous pouvez faire que le serveur dapplications appelle votre application client en introduisant un rappel. Pour ce faire, lapplication client passe une interface lune des mthodes du serveur dapplications, et le serveur dapplications appelle ensuite cette mthode. Cependant, si vos extensions linterface du module de donnes distant comprennent des rappels, vous ne pouvez pas utiliser de connexion HTTP ou SOAP. TWebConnection ne supporte pas les rappels. Si vous utilisez une connexion de type socket, les applications client doivent indiquer si elles utilisent ou non les rappels par la dfinition de la proprit SupportCallbacks. Tous les autres types de connexions supportent automatiquement les rappels.

Extension de linterface dun serveur dapplications transactionnel


Si vous utilisez les transactions ou lactivation juste temps, vous devez vous assurer que toutes les nouvelles mthodes appellent SetCompletepour indiquer

25-20

Guide du dveloppeur

Cration du serveur dapplications

leur achvement. Cela permet larrt des transactions et la dsactivation du module de donnes distant. De plus, vous ne pouvez pas renvoyer depuis ces nouvelles mthodes de valeurs qui rendraient possible une communication directe entre les clients et les objets ou interfaces du serveur dapplications sans fournir une rfrence fiable. Si vous utilisez un module de donnes MTS sans tat, oublier dutiliser une rfrence fiable peut provoquer des blocages car vous ne garantissez pas que le module de donnes distant soit actif. Pour davantage dinformations sur les rfrences fiables, voir Transfert de rfrences dobjets la page 39-21.

Gestion des transactions dans les applications multiniveaux


Lorsque les applications client appliquent les mises jour sur le serveur dapplications, le composant fournisseur enveloppe automatiquement le processus dapplication des mises jour et de rsolution des erreurs dans une transaction. Cette transaction est valide si le nombre denregistrements problmatiques nest pas suprieur la valeur MaxErrors spcifie comme argument la mthode ApplyUpdates. Sinon, elle est annule. De plus, vous pouvez amliorer la prise en charge des transactions sur votre application serveur en ajoutant un composant connexion de base de donnes ou en grant la transaction directement en envoyant du code SQL au serveur de bases de donnes. La gestion des transactions est la mme que dans une application niveau double. Pour plus dinformations sur ce type de gestion de transactions, voir Gestion des transactions la page 17-6. Si vous utilisez un module de donnes distant transactionnel, vous pouvez amliorer la prise en charge des transactions laide des transactions MTS ou COM+. Ces transactions peuvent inclure toute logique dentreprise sur votre serveur dapplications et ne se limitent pas la gestion de laccs aux bases de donnes. De plus, comme elles grent la validation en deux phases, ces transactions peuvent englober plusieurs bases de donnes. Seuls les composants daccs aux donnes BDE et ADO grent les validations en deux phases. Nutilisez pas les composants InterbaseExpress ou dbExpress si vous utilisez des transactions cheval sur plusieurs bases de donnes.
Attention

Si vous utilisez le BDE, la validation en deux phases nest entirement implmente que sur les bases de donnes Oracle7 et MS-SQL. Si votre transaction implique plusieurs bases de donnes et que certaines dentre elles sont des serveurs distants autres que Oracle7 ou MS-SQL, il existe un risque minime dchec partiel. Toutefois, dans toute base de donn es, vous pouvez utiliser les transactions. Par dfaut dans un module de donnes transactionnel, tous les appels de IAppServer sont transactionnels. Il suffit dactiver lattribut de transaction de votre module de donnes pour indiquer quil doit participer aux transactions. De plus, vous pouvez tendre linterface du serveur dapplications pour inclure des appels de mthode qui encapsulent des transactions que vous avez dfinies.

Cration dapplications multiniveaux

25-21

Cration du serveur dapplications

Si lattribut de transaction indique que le module de donnes distantncessite une transaction, tous les appels des clients sont automatiquement inclus dans une transaction jusqu ce que vous spcifiez que la transaction est acheve. Ces appels russissent ou sont annuls en bloc.
Remarque

Ne combinez pas les transactions MTS ou COM+ avec des transactions explicites cres par un composant connexion de base de donnes ou laide de commandes SQL explicites. Lorsque votre module de donnes transactionnel est rpertori dans une transaction, il rpertorie automatiquement tous les appels de votre base de donnes dans la transaction. Pour plus dinformations sur lutilisation des transactions MTS et COM+, voir Support transactionnel MTS et COM+ la page 39-9.

Gestion des relations matre / dtail


Vous pouvez crer des relations matre/dtail entre les ensembles de donnes client de votre application client de la mme faon qu avec tout ensemble de donnes de type table. Pour plus dinformations sur la dfinition de relations matre/dtail de cette manire, voir Cration de relations matre/dtail la page 18-40. Toutefois, cette approche prsente deux inconvnients majeurs : Tous les enregistrements de la table dtail doivent provenir du serveur dapplications mme si elle nutilise quun ensemble dtail la fois. (Ce problme peut tre attnu laide de paramtres. Pour plus dinformations, voir Limitation des enregistrements avec des paramtres la page 23-34.) Il est trs difficile dappliquer les mises jour car les ensembles de donnes client les appliquent au niveau de lensemble de donnes alors que les mises jour matre/dtail englobent plusieurs ensembles de donnes. Mme dans un environnement niveau double, o vous pouvez utiliser le composant connexion de base de donnes pour appliquer les mises jour pour plusieurs tables dans une seule transaction, lapplication des mises jour dans des fiches matre/dtail est dlicate. Dans les applications multiniveaux, vous pouvez viter ces problmes en utilisant des tables imbriques pour reprsenter la relation matre/dtail. Lorsque les donnes proviennent densembles de donnes, dfinissez une relation matre/ dtail entre les ensembles de donnes sur le serveur dapplications puis initialisez la proprit DataSet de votre composant fournisseur sur la table matre. Pour utiliser des tables imbriques pour reprsenter les relations matre/dtail lorsque les donnes proviennent de documents XML, utilisez un fichier de transformation qui dfinit les ensembles dtails imbriqus. Lorsque les clients appellent la mthode GetRecords du fournisseur, il inclut automatiquement lensemble de donnes dtail en tant que champ ensemble de donnes dans les enregistrements du paquet de donnes. Lorsque les clients appellent la mthode ApplyUpdates du fournisseur, il traite automatiquement lapplication des mises jour dans lordre adquat.

25-22

Guide du dveloppeur

Cration du serveur dapplications

Gestion des informations dtat dans les modules de donnes distants


Linterface IAppServer, qui contrle toute la communication entre les ensembles de donnes client et les fournisseurs sur le serveur dapplications, est gnralement sans tat. Lorsquune application est sans tat, elle ne mmorise pas ce qui sest produit lors des appels prcdents effectus par le client. Cette caractristique est utile si vous regroupez les connexions aux bases de donnes dans un module de donnes transactionnel, car votre serveur dapplications na pas besoin de diffrencier les connexions par rapport des informations persistantes comme lenregistrement en cours. De mme, cette absence dinformation dtat est importante lorsque vous partagez les instances des modules de donnes distants entre de nombreux clients, comme cela se produit avec lactivation juste temps, le regroupement des objets, ou les serveurs CORBA classique. Les modules de donnes SOAP doivent tre sans tat. Dans certaines circonstances, toutefois, vous voudrez maintenir des informations dtat entre les appels au serveur dapplications. Par exemple, lorsque vous demandez des donnes laide de la lecture incrmentale, le fournisseur sur le serveur dapplications doit mmoriser des informations sur les appels prcdents (lenregistrement en cours). Avant et aprs tous les appels linterface IAppServer effectus par lensemble de donnes client (AS_ApplyUpdates, AS_Execute, AS_GetParams, AS_GetRecords ou AS_RowRequest), il reoit un vnement dans lequel il peut envoyer ou extraire des informations dtat personnalises. De mme, avant et aprs la rponse des fournisseurs aux appels gnrs par les clients, ils reoivent des vnements dans lesquels ils peuvent extraire ou envoyer des informations dtat personnalises. Avec ce mcanisme, vous pouvez communiquer des informations dtat persistantes entre les applications client et le serveur dapplications, mme si le serveur dapplications est sans tat. Par exemple, considrez un ensemble de donnes qui reprsente la requte paramtre suivante :
SELECT * from CUSTOMER WHERE CUST_NO > :MinVal ORDER BY CUST_NO

Pour utiliser la lecture incrmentale dans un serveur dapplications sans tat, vous pouvez faire ce qui suit : Lorsque le fournisseur rassemble un ensemble denregistrements dans un paquet de donnes, il note la valeur de CUST_NO sur le dernier enregistrement du paquet :
TRemoteDataModule1.DataSetProvider1GetData(Sender: TObject; DataSet: TCustomClientDataSet); begin DataSet.Last; { se positionne sur le dernier enregistrement } with Sender as TDataSetProvider do Tag := DataSet.FieldValues[CUST_NO]; {enregistre la valeur de CUST_NO } end;

Cration dapplications multiniveaux

25-23

Cration du serveur dapplications

Le fournisseur envoie cette dernire valeur CUST_NO au client aprs avoir envoy le paquet de donnes :
TRemoteDataModule1.DataSetProvider1AfterGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TDataSetProvider do OwnerData := Tag; {envoie la dernire valeur de CUST_NO } end;

Sur le client, lensemble de donnes client enregistre cette dernire valeur de CUST_NO :
TDataModule1.ClientDataSet1AfterGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TClientDataSet do Tag := OwnerData; {enregistre la dernire valeur de CUST_NO } end;

Avant de lire un paquet de donnes, le client envoie la dernire valeur de CUST_NO quil a reue :
TDataModule1.ClientDataSet1BeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TClientDataSet do begin if not Active then Exit; OwnerData := Tag; { envoie la dernire valeur de CUST_NO au serveur dapplications } end; end;

Enfin, sur le serveur, le fournisseur utilise la dernire valeur de CUST_NO envoye comme valeur minimale dans la requ te :
TRemoteDataModule1.DataSetProvider1BeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin if not VarIsEmpty(OwnerData) then with Sender as TDataSetProvider do with DataSet as TSQLDataSet do begin Params.ParamValues[MinVal] := OwnerData; Refresh; { oblige la requte se rexcuter } end; end;

Utilisation de plusieurs modules de donnes distants


Vous pouvez structurer votre serveur dapplications de telle sorte quil utilise plusieurs modules de donnes distants. Le recours plusieurs modules de donnes distants vous permet de partitionner votre code, dorganiser un serveur dapplications volumineux en plusieurs units relativement autonomes. Bien que vous puissiez toujours crer sur le serveur dapplications plusieurs modules de donnes distants fonctionnant indpendamment, Delphi propose un

25-24

Guide du dveloppeur

Recensement du serveur dapplications

modle dans lequel un module de donnes distant parent principal rpartit les connexions des clients parmi les modules de donnes distants enfant. Pour crer le module de donnes distant parent, vous devez tendre son interface IAppServer en ajoutant les proprits qui exposent les interfaces des modules de donnes distants enfant. En dautres termes, pour chaque module de donnes distant enfant, ajoutez une proprit linterface du module de donn es parent dont la valeur reprsente linterface IAppServer interface du module de donnes enfant. La mthode daccs en lecture une proprit doit ressembler ceci :
function ParentRDM.Get_ChildRDM: IChildRDM; begin {Le module de donnes distant parent utilise un composant fabricant dfini dans lunit du module de donnes distant enfant. Cela est plus efficace dans le cas de la cration de plusieurs enfants pour diffrents clients } Result := ChildRDMFactory.CreateCOMObject(nil) as IChildRDM; Result.ParentRDM := Self; end;

Pour plus dinformations sur lextension de linterface du module de donnes distant parent, voir Extension de linterface du serveur dapplications la page 25-19.
Conseil

Vous pouvez galement tendre linterface de chaque module de donnes enfant en exposant linterface du module de donnes parent ou les interfaces des autres modules de donnes enfant. Cela facilite la communication entre les diffrents modules de donnes de votre serveur dapplications. Une fois que les proprits qui reprsentent les modules de donnes distants enfant ont t ajoutes au module de donnes distant principal, les applications client nont pas besoin dtablir de connexions distinctes chaque module de donnes distant sur le serveur dapplications. En effet, elles partagent une connexion unique au module de donnes distant parent, qui rpartit ensuite les messages parmi les modules de donnes enfant. Etant donn que chaque application client utilise la mme connexion pour chaque module de donnes distant, les modules de donnes distants peuvent partager une connexion de base de donnes unique, ce qui permet dconomiser les ressources. Pour plus dinformations sur la partage dune connexion unique par les applications enfant, voir Connexion un serveur dapplications qui utilise plusieurs modules de donnes la page 25-35.

Recensement du serveur dapplications


Pour que les applications client puissent localiser et utiliser un serveur dapplications, celui-ci doit tre recens ou install. (Cela nest pas absolument ncessaire pour les serveurs dapplications CORBA, mais le recensement demeure recommand.) Si le serveur dapplications utilise DCOM, HTTP ou des sockets comme protocole de communication, il fait office de serveur Automation et doit tre

Cration dapplications multiniveaux

25-25

Cration de lapplication client

recens comme tout autre serveur COM. Pour plus dinformations sur le recensement dun serveur COM, voir Recensement dun objet COM la page 36-18. Si vous utilisez un module de donnes transactionnel, il ne faut pas recenser le serveur dapplications. Vous devez la place linstaller dans MTS ou COM+. Pour davantage dinformations sur linstallation dobjets transactionnels, voir Installation dobjets transactionnels la page 39-24. Lorsque le serveur dapplications utilise SOAP, il doit tre recens afin que son interface soit reconnue par le rpartiteur SOAP. Lorsque le serveur dapplications utilise SOAP, lapplication doit tre une application service Web. En tant que telle, elle doit tre recense sur votre serveur Web, afin quelle puisse recevoir les messages HTTP entrants. De plus, si vous souhaitez que des clients non crits avec Delphi accdent aux interfaces de votre application, vous pouvez publier un document WSDL dcrivant les interfaces invocables de votre application. Pour plus informations sur lexportation dun document WSDL pour une application service Web, voir Gnration de documents WSDL pour une application service Web la page 31-8. Lorsque le serveur dapplications utilise CORBA, le recensement est facultatif. Si vous souhaitez que les applications client utilisent la liaison dynamique votre interface, vous devez installer linterface du serveur dans le rfrentiel dinterfaces. De plus, si vous souhaitez que les applications client dmarrent le serveur dapplications lorsquil nest pas encore excut, ce dernier doit tre recens avec lOAD (Object Activation Daemon).

Cration de lapplication client


A bien des gards, la cration dune application client multiniveau est similaire la cration dun client niveau double qui utilise un ensemble de donnes client pour placer les mises jour en mmoire cache. La diffrence majeure rside dans le fait quun client multiniveau utilise un composant connexion pour tablir un canal de communication avec le serveur dapplications. Pour crer une application client multiniveau, dmarrez un nouveau projet et effectuez les tapes suivantes :

1 Ajoutez un nouveau module de donnes au projet. 2 Placez un composant connexion sur le module de donnes. Le type de composant connexion que vous ajoutez dpend du protocole de communication que vous souhaitez utiliser. Voir Structure de lapplication client la page 25-5, pour plus de dtails. 3 Initialisez les proprits sur votre composant connexion pour spcifier le serveur dapplications avec lequel il doit tablir une connexion. Pour plus dinformations sur la configuration du composant connexion, voir Connexion au serveur dapplications la page 25-27.

25-26

Guide du dveloppeur

Cration de lapplication client

4 Initialisez les autres proprits du composant connexion selon les besoins de votre application. Par exemple, vous pouvez initialiser la proprit ObjectBroker pour permettre au composant connexion de choisir dynamiquement parmi plusieurs serveurs. Pour plus dinformations sur lutilisation des composants connexion, voir Gestion des connexions serveur la page 25-32. 5 Placez autant de composants TClientDataSet que ncessaire sur le module de donnes, et initialisez la proprit RemoteServer pour chaque composant avec le nom du composant connexion plac lors de ltape 2. Pour une prsentation dtaille des ensembles de donnes client, voir chapitre 23, Utilisation densembles de donnes client. 6 Initialisez la proprit ProviderName de chaque composant TClientDataSet. Si votre composant connexion est connect au serveur dapplications lors de la conception, vous pouvez choisir un fournisseur disponible dans la liste droulante de la proprit ProviderName. 7 Poursuivez comme si vous criez une application de base de donnes quelconque. Les clients dapplications multiniveaux disposent de quelques fonctionnalits supplmentaires :
Votre application peut appeler directement le serveur dapplications. Appel des interfaces serveur la page 25-33 dcrit la procdure suivre. Vous pouvez utiliser les fonctionnalits des ensembles de donnes client qui permettent de grer leur interaction avec les composants fournisseur. Ces fonctionnalits sont dcrites dans Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29.

Connexion au serveur dapplications


Pour tablir et maintenir une connexion avec un serveur dapplications, une application client utilise un ou plusieurs composants connexion. Ces composants se trouvent sur la page DataSnap de la palette des composants. Utilisez un composant connexion pour Identifier le protocole utilis pour communiquer avec le serveur dapplications. Chaque type de composant connexion reprsente un protocole de communication diffrent. Voir Slection dun protocole de connexion la page 25-10, pour plus de dtails sur les avantages et les limites des protocoles disponibles. Indiquer comment localiser la machine serveur. Les dtails didentification de la machine serveur varient selon le protocole. Identifier le serveur dapplications sur la machine serveur. Si vous nutilisez pas CORBA, identifiez le serveur laide de la proprit ServerName ou ServerGUID. ServerName identifie le nom de base de la classe que vous spcifiez lorsque vous crez le module de donnes distant sur le serveur dapplications. Voir Configuration du module de donnes distant la page 25-15, pour plus de dtails sur la spcification de cette valeur sur le

Cration dapplications multiniveaux

25-27

Cration de lapplication client

serveur. Si le serveur est recens ou install sur la machine client, ou si le composant connexion est connect la machine serveur, vous pouvez initialiser la proprit ServerName lors de la conception partir dune liste droulante dans linspecteur dobjets. ServerGUID spcifie le GUID de linterface du module de donnes distant. Vous pouvez rechercher cette valeur laide de lditeur de bibliothque de types. Si vous utilisez CORBA, identifiez le serveur laide de la proprit RepositoryID. RepositoryID spcifie lId de rfrentiel de linterface usine du serveur dapplications, qui apparat comme troisime argument dans lappel de TCorbaVCLComponentFactory.Create, automatiquement ajout la section dinitialisation de lunit dimplmentation du serveur CORBA. Vous pouvez aussi initialiser cette proprit sur le nom de base de linterface du module de donnes CORBA (la mme chane que la proprit ServerName des autres composants connexion) pour quelle soit automatiquement convertie en lId de rfrentiel appropri. Grer les connexions serveur. Les composants connexion peuvent tre utiliss pour crer ou abandonner des connexions et pour appeler des interfaces de serveur dapplications. Gnralement, le serveur dapplications et lapplication client se trouvent sur des machines diffrentes. Mais mme si le serveur rside sur la mme machine que lapplication client (par exemple, pendant la construction et le test de toute lapplication multiniveau), vous pouvez utiliser le composant connexion pour identifier le serveur dapplications par son nom, spcifier une machine serveur et utiliser linterface du serveur dapplications.

Spcification dune connexion laide de DCOM


Lorsque vous utilisez DCOM pour communiquer avec le serveur dapplications, lapplication cliente inclut un composant TDCOMConnection pour sy connecter. TDCOMConnection utilise la proprit ComputerName pour identifier la machine sur laquelle rside le serveur. Lorsque ComputerName est vierge, le composant connexion DCOM considre que le serveur dapplications rside sur la machine client ou quil possde une entre de registre systme. Lorsque vous utilisez DCOM et que le serveur rside sur une machine diffrente de celle du client, vous devez fournir ComputerName si vous ne fournissez pas dentre de registre systme pour le serveur dapplications sur le client.
Remarque

Mme lorsquil existe une entre de registre systme pour le serveur dapplications, vous pouvez spcifier ComputerName pour craser cette entre. Cela peut tre particulirement utile pendant le dveloppement, le test et le dbogage. Si votre application client peut choisir parmi plusieurs serveurs, vous pouvez utiliser la proprit ObjectBroker au lieu de spcifier la valeur de ComputerName. Pour plus dinformations, voir Courtage de connexions la page 25-31.

25-28

Guide du dveloppeur

Cration de lapplication client

Si vous fournissez le nom dun ordinateur hte ou dun serveur introuvable, le composant connexion DCOM dclenche une exception lorsque vous essayez douvrir la connexion.

Spcification dune connexion laide de sockets


Vous pouvez tablir une connexion un serveur dapplications laide de sockets depuis nimporte quelle machine disposant dune adresse TCP/IP. Cette mthode prsente lavantage de pouvoir sappliquer davantage de machines, mais ne permet pas lutilisation des protocoles de scurit. Lorsque vous utilisez des sockets, incluez un composant TSocketConnection pour la connexion au serveur dapplications. TSocketConnection identifie la machine serveur laide de ladresse IP ou du nom dhte du systme serveur, et du numro de port du programme de rpartition de sockets (Scktsrvr.exe) excut sur la machine serveur. Pour plus dinformations sur les adresses IP et les valeurs de port, voir Description des sockets la page 32-3. Trois proprits de TSocketConnection spcifient ces informations : Address spcifie ladresse IP du serveur. Host spcifie le nom dhte du serveur. Port spcifie le numro de port du programme de rpartition de sockets sur le serveur dapplications. Address et Host sexcluent lune lautre. Initialiser la valeur de lune dsinitialise la valeur de lautre. Pour plus dinformations sur la proprit utiliser, voir Description des htes la page 32-4. Si votre application client peut choisir parmi plusieurs serveurs, vous pouvez utiliser la proprit ObjectBroker au lieu de spcifier une valeur pour Address ou Host. Pour plus dinformations, voir Courtage de connexions la page 25-31. Par dfaut, la valeur de Port est 211, cest le numro de port par dfaut des programmes de rpartition de sockets fournis avec Delphi. Si le rpartiteur de sockets a t configur pour utiliser un port diffrent, initialisez la proprit Port en fonction de cette valeur.
Remarque

Vous pouvez configurer le port du rpartiteur de sockets en cliquant avec le bouton droit sur licne du serveur de socket Borland et en choisissant Proprits. Bien que les connexions socket ne permettent pas lutilisation des protocoles de scurit, vous pouvez personnaliser la connexion socket en ajoutant votre propre cryptage. Pour cela,

1 Crez un objet COM supportant linterface IDataIntercept. Cest une interface de cryptage et de dcryptage des donnes. 2 Utilisez TPacketInterceptFactory comme fabricant de classes de cet objet. Si vous utilisez un expert pour crer lobjet COM ltape 1, remplacez la ligne de la section dinitialisation indiquant TComponentFactory.Create(...) par TPacketInterceptFactory.Create(...).

Cration dapplications multiniveaux

25-29

Cration de lapplication client

3 Recensez votre nouveau serveur COM sur la machine client. 4 Dfinissez la proprit InterceptName ou InterceptGUID du composant connexion socket pour spcifier cet objet COM. Si vous avez utilis TPacketInterceptFactory ltape 2, votre serveur COM apparat dans la liste droulante de linspecteur dobjets pour la proprit InterceptName. 5 Enfin, cliquez avec le bouton droit sur licne du serveur de socket Borland, choisissez Proprits et, dans la page des proprits, affectez aux proprits InterceptName et InterceptGUID lidentificateur ProgId ou GUID de lintercepteur.
Ce mcanisme peut servir galement la compression et la dcompression des donnes.

Spcification dune connexion laide de HTTP


Vous pouvez tablir une connexion un serveur dapplications laide de HTTP depuis nimporte quelle machine disposant dune adresse TCP/IP. Au contraire des sockets, HTTP vous permet de bnficier de la scurit SSL et de communiquer avec un serveur protg par un coupe-feu. Lorsque vous utilisez HTTP, incluez un composant TWebConnection pour la connexion au serveur dapplications. Le composant connexion Web tablit une connexion vers lapplication serveur Web (httpsrvr.dll), qui son tour communique avec le serveur dapplications. TWebConnection localise httpsrvr.dll en utilisant une URL (Uniform Resource Locator). LURL spcifie le protocole (http ou, si vous utilisez la scurit SSL, https), le nom dhte de la machine excutant le serveur Web et httpsrvr.dll, ainsi que le chemin daccs lapplication serveur Web (httpsrvr.dll). Spcifiez cette valeur avec la proprit URL.
Remarque

Lorsque vous utilisez TWebConnection, wininet.dll doit tre install sur la machine client. Si vous avez IE3 ou une version suprieure, wininet.dll se trouve dans le rpertoire systme de Windows. Si le serveur Web ncessite une authentification, ou si vous utilisez un serveur proxy qui demande une authentification, vous devez dfinir la valeur des proprits UserName et Password pour que le composant connexion tablisse la connexion. Si votre application client peut choisir parmi plusieurs serveurs, vous pouvez utiliser la proprit ObjectBroker au lieu de spcifier la valeur de URL. Pour plus dinformations, voir Courtage de connexions la page 25-31.

Spcification dune connexion laide de SOAP


Vous pouvez tablir une connexion un serveur dapplications SOAP en utilisant le composant TSoapConnection. TSoapConnection est trs semblable TWebConnection , car il utilise galement HTTP comme protocole de transport. Ainsi, vous pouvez utiliser TSoapConnection depuis nimporte quelle machine ayant une adresse TCP/IP et elle profitera de la scurit SSL pour communiquer avec un serveur protg par un pare-feu.

25-30

Guide du dveloppeur

Cration de lapplication client

Le composant connexion SOAP tablit une connexion avec une application serveur Web implmentant linterface IAppServer comme service Web. TSoapConnection localise cette application serveur Web en utilisant une URL (Uniform Resource Locator). LURL spcifie le protocole (http ou, si vous utilisez la scurit SSL, https), le nom dhte de la machine excutant le serveur Web, le nom de lapplication service Web et le chemin correspondant au nom de chemin du THTTPSoapDispatcher sur le serveur dapplications. Spcifiez cette valeur dans la proprit URL.
Remarque

Lorsque vous utilisez TSoapConnection, wininet.dll doit tre installe sur la machine client. Si vous avez install IE3, ou une version suprieure, wininet.dll se trouve dans le rpertoire systme de Windows. Si le serveur Web exige une authentification, ou si vous utilisez un serveur proxy ncessitant une authentification, vous devez dfinir les valeurs des proprits UserName et Password pour permettre au composant connexion de se connecter.

Spcification dune connexion laide de CORBA


Toutefois, vous pouvez limiter le nombre de serveurs auxquels votre application client peut se connecter laide des autres proprits du composant connexion CORBA. Si vous souhaitez spcifier une machine serveur particulire plutt que laisser CORBA Smart Agent en localiser une de disponible, utilisez la proprit HostName. Si plusieurs instances dobjets implmentent linterface de votre serveur, vous pouvez spcifier lobjet que vous souhaitez utiliser en initialisant la proprit ObjectName. Le composant TCorbaConnection obtient une interface vers le module de donnes CORBA sur le serveur dapplications de deux manires : Si vous utilisez la liaison anticipe (statique), vous devez ajouter le fichier _TLB.pas (gnr par lditeur de bibliothque de types) votre application client. La liaison anticipe est fortement recommande pour la vrification du type la compilation et parce quelle est beaucoup plus rapide que la liaison tardive (dynamique). Si vous utilisez la liaison tardive (dynamique), linterface doit tre recense dans le rfrentiel dinterfaces. Pour une comparaison des liaisons anticipe et tardive, voir Appel des interfaces serveur la page 25-33.

Courtage de connexions
Si votre application client peut choisir parmi plusieurs serveurs, vous pouvez utiliser un courtier dobjets pour localiser un systme serveur disponible. Le courtier dobjets gre une liste de serveurs disponibles pour le composant connexion. Lorsque le composant connexion a besoin de se connecter un serveur dapplications, il demande au courtier dobjets un nom dordinateur (ou une adresse IP, un nom dhte, une URL). Le courtier fournit un nom puis le composant connexion tablit la connexion. Si le nom fourni ne fonctionne pas

Cration dapplications multiniveaux

25-31

Cration de lapplication client

(par exemple si le serveur nest pas oprationnel), le courtier fournit un autre nom et rpte lopration jusqu ce que la connexion soit tablie. Une fois que le composant connexion a tabli une connexion avec un nom fourni par le courtier, il enregistre ce nom en tant que valeur de la proprit approprie (ComputerName, Address, Host, RemoteHost ou URL). Si le composant connexion ferme la connexion puis a besoin de louvrir nouveau, il utilise cette valeur de proprit et ne demande un nouveau nom au courtier que si la connexion choue. Pour utiliser un courtier dobjets, spcifiez la proprit ObjectBroker de votre composant connexion. Lorsque la proprit ObjectBroker est initialise, le composant connexion nenregistre pas la valeur de ComputerName, Address, Host, RemoteHost ou URL.
Remarque

Nutilisez pas la proprit ObjectBroker avec des connexions CORBA. CORBA possde son propre service de courtage.

Gestion des connexions serveur


La fonction principale des composants connexion est de localiser le serveur dapplications et de sy connecter. Comme ils grent les connexions serveur, ils vous permettent galement dappeler les mthodes de linterface du serveur dapplications.

Connexion au serveur
Pour localiser le serveur dapplications et vous y connecter, vous devez dabord initialiser les proprits du composant connexion pour identifier le serveur dapplications. Ce processus est dcrit dans Connexion au serveur dapplications la page 25-27. Avant douvrir la connexion, tous les ensembles de donnes client qui utilisent le composant connexion pour communiquer avec le serveur dapplications doivent lindiquer en initialisant leur proprit RemoteServer. La connexion est automatiquement ouverte lorsque les ensembles de donnes client essaient daccder au serveur dapplications. Par exemple, linitialisation True de la proprit Active de lensemble de donnes client ouvre la connexion, pour autant que la proprit RemoteServer ait t dfinie. Si vous ne liez aucun ensemble de donnes client au composant connexion, vous pouvez ouvrir la connexion en initialisant True la proprit Connected du composant connexion. Avant dtablir une connexion un serveur dapplications, un composant connexion gnre un vnement BeforeConnect. Vous pouvez excuter des actions particulires avant de vous connecter en les codant dans un gestionnaire BeforeConnect. Aprs avoir tabli une connexion, le composant connexion gnre un vnement AfterConnect o vous pouvez galement excuter toute action ncessaire.

25-32

Guide du dveloppeur

Cration de lapplication client

Fermeture ou changement de connexion serveur


Un composant connexion ferme une connexion un serveur dapplications dans les circonstances suivantes : Quand vous initialisez la proprit Connected False. Quand vous librez le composant connexion. Un objet connexion est libr automatiquement quand un utilisateur ferme lapplication client. Quand vous modifiez les proprits qui identifient le serveur dapplications (ServerName, ServerGUID, ComputerName, etc.). La modification de ces proprits vous permet de basculer entre les serveurs dapplications disponibles lors de lexcution. Le composant connexion ferme la connexion en cours et en tablit une nouvelle.
Remarque

Au lieu dutiliser un seul composant connexion pour basculer entre les serveurs dapplications disponibles, une application client peut disposer de plusieurs composants connexion, chacun deux tant connect un serveur dapplications particulier. Avant de fermer une connexion, un composant connexion appelle automatiquement son gestionnaire dvnement BeforeDisconnect, sil existe. Pour excuter des actions particulires avant la dconnexion, crivez un gestionnaire BeforeDisconnect. De mme, aprs la fermeture de la connexion, le gestionnaire dvnement AfterDisconnect est appel. Pour excuter des actions particulires aprs la dconnexion, crivez un gestionnaire AfterDisconnect.

Appel des interfaces serveur


Les applications nont pas besoin dappeler linterface IAppServer directement, car les appels appropris sont automatiquement raliss lorsque vous utilisez les proprits et mthodes de lensemble de donnes client. Cependant, alors qu il nest pas ncessaire de travailler directement avec linterface IAppServer, vous pouvez avoir ajout vos propres extensions linterface du module de donnes distant. Lorsque vous tendez linterface du serveur dapplications, vous devez tre en mesure dappeler ces extensions laide de la connexion cre par votre composant connexion. A moins que vous utilisez SOAP, vous pouvez utiliser cet effet la proprit AppServer du composant connexion. Pour plus dinformations sur lextension de linterface du serveur dapplications, voir Extension de linterface du serveur dapplications la page 25-19. AppServer est un Variant qui reprsente linterface du serveur dapplications. Vous pouvez appeler une mthode dinterface laide de AppServer en crivant une instruction telle que
MyConnection.AppServer.SpecialMethod(x,y);

Toutefois, cette technique offre une liaison tardive (dynamique) de lappel dinterface. En raison de cela, lappel de la procdure SpecialMethod nest pas lie avant lexcution lorsque lappel est excut. La liaison tardive est trs souple mais son utilisation vous prive de nombreux avantages tels que code insight et la vrification de type. De plus, la liaison tardive est plus lente que la liaison

Cration dapplications multiniveaux

25-33

Cration de lapplication client

anticipe car le compilateur gnre des appels supplmentaires vers le serveur pour configurer les appels dinterface avant de les raliser. Lorsque vous utilisez DCOM ou CORBA comme protocole de communication, vous pouvez utiliser la liaison anticipe dappels AppServer. Utilisez loprateur as pour affecter la variable AppServer le descendant IAppServer que vous avez cr lorsque vous avez cr le module de donnes distant. Par exemple :
with MyConnection.AppServer as IMyAppServer do SpecialMethod(x,y);

Pour utiliser la liaison anticipe sous DCOM, la bibliothque de types du serveur doit tre recense sur la machine client. Vous pouvez utiliser TRegsvr.exe, fourni avec Delphi, pour recenser la bibliothque de types.
Remarque

Reportez-vous la dmo TRegSvr (qui offre le source de TRegsvr.exe) pour un exemple de recensement de la bibliothque de types par programmation. Pour utiliser la liaison anticipe avec CORBA, vous devez ajouter votre projet lunit _TLB gnre par lditeur de bibliothque de types. Pour ce faire, ajoutez cette unit la clause uses de votre unit. Lorsque vous utilisez TCP/IP ou HTTP, vous ne pouvez pas rellement utiliser la liaison anticipe mais, comme le module de donnes distant utilise une interface double, vous pouvez utiliser la dispinterface du serveur dapplications pour amliorer les performances dune simple liaison tardive. La dispinterface porte le mme nom que linterface du module de donn es distant, suivi de la chane Disp. Vous pouvez affecter la proprit AppServer une variable de ce type pour obtenir la dispinterface. Par exemple :
var TempInterface: IMyAppServerDisp; begin TempInterface :=IMyAppServerDisp(IDispatch(MyConnection.AppServer)); ... TempInterface.SpecialMethod(x,y); ... end;

Remarque

Pour utiliser la dispinterface, vous devez ajouter lunit _TLB gnre lorsque vous enregistrez la bibliothque de types la clause uses de votre module client. Si vous utilisez SOAP, vous ne pouvez pas utiliser la proprit AppServer. A la place, vous devez utiliser un objet interface distante (THTTPRio) et effectuer des appels liaison anticipe. Comme dans tous les appels liaison anticipe, lapplication client doit connatre la dclaration de linterface du serveur dapplications la compilation. Pour lajouter votre application client, vous pouvez soit ajouter lunit utilise par le serveur pour dclarer et recenser linterface la clause uses du client, soit faire rfrence un document WSDL dcrivant linterface. Pour plus dinformations sur limportation dun document WSDL dcrivant linterface du serveur, voir Importation de documents WSDL la page 31-9.

25-34

Guide du dveloppeur

Cration de lapplication client

Remarque

Lunit qui dclare linterface du serveur doit aussi la recenser dans le registre dinvocation. Pour savoir comment recenser des interfaces invocables, voir D finition des interfaces invocables la page 31-4. Une fois que votre application utilise lunit du serveur qui dclare et recense linterface, ou que vous avez import un document WSDL pour gnrer une telle unit, crez une instance de THTTPRio pour linterface souhaite :
X := THTTPRio.Create(nil);

Ensuite, assignez lURL utilise par votre composant connexion lobjet interface distante :
X.URL := SoapConnection1.URL;

Vous pouvez alors utiliser loprateur as pour convertir linstance de THTTPRio en linterface du serveur dapplications :
InterfaceVariable := X as IMyAppServer; InterfaceVariable.SpecialMethod(x,y);

Connexion un serveur dapplications qui utilise plusieurs modules de donnes


Si le serveur dapplications utilise un module de donnes distant parent principal et plusieurs modules de donnes distants enfant, comme dcrit dans Utilisation de plusieurs modules de donnes distants la page 25-24, vous devez disposer dun composant connexion spar pour chaque module de donnes distant sur le serveur dapplications. Chaque composant connexion reprsente la connexion un module de donnes distant unique. Bien quil soit possible pour votre application client dtablir des connexions indpendantes chaque module de donnes distant sur le serveur dapplications, il est plus efficace dutiliser une connexion unique au serveur dapplications qui soit partage par tous les composants connexion. Pour ce faire, vous ajoutez un composant connexion unique qui se connecte au module de donnes distant principal sur le serveur dapplications puis, pour chaque module de donnes distant enfant, vous ajoutez un composant qui partage la connexion au module de donnes distant principal.

1 Pour la connexion au module de donnes distant principal, ajoutez et configurez un composant connexion tel que dcrit dans Connexion au serveur dapplications la page 25-27. La seule limite est que vous ne pouvez pa utiliser une connexion CORBA ou SOAP. 2 Pour chaque module de donnes distant enfant, utilisez un composant TSharedConnection.
Affectez sa proprit ParentConnection le composant connexion ajout ltape 1. Le composant TSharedConnection partage la connexion tablie par cette connexion principale.

Cration dapplications multiniveaux

25-35

Ecriture des applications client Web

Affectez sa proprit ChildName le nom de la proprit sur linterface du module de donnes distant principal qui expose linterface du module de donnes distant enfant dsir. Lorsque vous affectez le composant TSharedConnection plac ltape 2 comme valeur de la proprit RemoteServer dun ensemble de donnes client, il fonctionne comme si vous utilisiez une connexion entirement indpendante au module de donnes distant enfant. Toutefois, le composant TSharedConnection utilise la connexion tablie par le composant plac ltape 1.

Ecriture des applications client Web


Si vous voulez crer des clients bass sur le Web pour votre application de bases de donnes multiniveau, vous devez remplacer le niveau client par une application Web spciale qui agit simultanment en tant que client pour un serveur dapplications et en tant quapplication serveur Web installe sur la mme machine que le serveur Web. Cette architecture est illustre par la figure suivante.
Figure 25.1 Application de bases de donnes multiniveau base sur le Web

Il existe deux faons denvisager la construction de lapplication Web : Vous pouvez combiner larchitecture de base de donnes multiniveau au support dActiveX fourni par Delphi pour distribuer lapplication client en tant que contrle ActiveX. Cela permet nimporte quel navigateur supportant ActiveX dexcuter votre application client en tant que serveur en processus. Vous pouvez utiliser les paquets de donn es XML pour construire une application InternetExpress. Cela permet aux navigateurs supportant javascript dinteragir avec votre application client par le biais de pages html. Ces deux approches sont trs diffrentes. Votre choix dpendra des considrations suivants : Chaque approche repose sur une technologie diffrente (ActiveX contre javascript et XML). Prenez en compte les systmes de vos utilisateurs finals. La premire approche exige un navigateur supportant ActiveX (ce qui limite vos clients aux plates-formes Windows). La seconde exige un navigateur

25-36

Guide du dveloppeur

Ecriture des applications client Web

supportant javascript et les capacits DHTML introduites par Netscape 4 et Internet Explorer 4. Les contrles ActiveX doivent tre tlchargs sur le navigateur pour agir en tant que serveur en processus. Il sen suit que les clients utilisant lapproche ActiveX exigent beaucoup plus de mmoire que les clients dune application base sur HTML. Lapproche InternetExpress peut sintgrer dautres pages HTML. Un client ActiveX doit tre excut dans une fentre part. Lapproche InternetExpress utilise HTTP standard, excluant donc les problmes de coupe-feu auxquels sont confrontes les applications ActiveX. Lapproche ActiveX autorise une plus grande souplesse dans la faon de programmer votre application. Vous ntes pas limit par les capacits des bibliothques javascript. Les ensembles de donnes client utiliss dans lapproche ActiveX exposent plus de fonctionnalits (filtres, fourchettes, globalisation, paramtres facultatifs, lecture diffre des BLOB ou des dtails imbriques, etc.) que les navigateurs XML utiliss par lapproche InternetExpress.
Attention

Votre application client Web risque dapparatre et de se comporter de manire diffrente selon le navigateur qui laffiche. Testez-la avec les navigateurs dont se serviront vos utilisateurs finals.

Distribution dune application client en tant que contrle ActiveX


Larchitecture de base de donnes multiniveau peut tre combine avec les fonctionnalits ActiveX de Delphi pour distribuer une application client en tant que contrle ActiveX. Lorsque vous distribuez votre application client MIDAS en tant que contrle ActiveX, crez le serveur dapplications comme dans toute autre application multiniveau. La seule contrainte est que vous serez amen utiliser DCOM, HTTP, SOAP ou sockets comme protocole de communication, car le logiciel runtime CORBA nest pas install sur les machines client. Pour plus de dtails sur la cration du serveur dapplications, voir Cration du serveur dapplications la page 25-13. Lorsque vous crez lapplication client, vous devez utiliser une fiche active comme base au lieu dune fiche ordinaire. Voir Cration dune fiche active pour lapplication client, pour plus de dtails. Une fois que vous avez construit et dploy votre application client, celle-ci est accessible depuis nimporte quelle machine munie dun navigateur Web ActiveX. Pour quun navigateur Web lance votre application client, le serveur Web doit tre excut sur la machine qui hberge lapplication client. Si lapplication client utilise DCOM pour communiquer avec le serveur dapplications, la machine qui hberge le navigateur Web doit tre active pour fonctionner avec DCOM. Si la machine hbergeant le navigateur Web est une machine Windows 95, DCOM95, disponible auprs de Microsoft, doit y tre install.

Cration dapplications multiniveaux

25-37

Ecriture des applications client Web

Cration dune fiche active pour lapplication client


1 Comme lapplication client doit tre dploye en tant que contrle ActiveX, un serveur Web doit tre excut sur le mme systme que lapplication client. Vous pouvez utiliser un serveur immdiatement oprationnel, tel que Personal Web Server de Microsoft, ou crire le vtre laide des composants socket dcrits dans le chapitre 32, Utilisation des sockets. 2 Crez lapplication client en suivant la procdure dcrite dans Cration de lapplication client la page 25-26, la diffrence toutefois que vous devez commencer en choisissant Fichier|Nouveau|Fiche active, plutt quen dmarrant le projet client comme un projet Delphi ordinaire. 3 Si votre application client utilise un module de donnes, ajoutez un appel pour crer de faon explicite le module de donnes dans linitialisation de la fiche active. 4 Lorsque votre application client est acheve, compilez le projet et slectionnez Projet|Options de dploiement Web. Dans la bote de dialogue Options de dploiement Web, vous devez procder comme suit : 1 Sur la page Projet, spcifiez le rpertoire destination, lURL du rpertoire cible et le rpertoire HTML. Habituellement, le rpertoire destination et le rpertoire HTML sont les mmes que les rpertoires de projets de votre serveur Web. LURL cible est habituellement le nom de la machine serveur spcifie dans les paramtres Windows Network|DNS. 2 Sur la page Fichiers supplmentaires, incluez midas.dll dans votre application client. 5 Enfin, slectionnez Projet|Dployer pour le Web, pour dployer lapplication client en tant que fiche active.
Nimporte quel navigateur Web pouvant excuter des fiches actives peut excuter votre application client. Il suffit que soit sp cifi le fichier .HTM cr lorsque vous avez dploy lapplication client. Ce fichier .HTM porte le mme nom que votre projet dapplication client et apparat dans le rpertoire spcifi comme rpertoire destination.

Construction des applications Web avec InternetExpress


Une application client peut exiger du serveur dapplications la fourniture de donnes codes en XML la place dOleVariants. En combinant les paquets de donnes codes XML, bibliothques javascript spciales de fonctions pour bases de donnes, et le support des applications serveur Web de Delphi, vous pouvez crer des applications client simples accessibles via un navigateur Web supportant javascript. Ces applications constituent le support InternetExpress de Delphi. Avant dentreprendre la construction dune application InternetExpress, vous devez comprendre larchitecture des applications serveur Web de Delphi. Elle est dcrite dans le chapitre 27, Cration dapplications Internet.

25-38

Guide du dveloppeur

Ecriture des applications client Web

Une application InternetExpress tend larchitecture dapplication serveur Web de base pour faire office de client dun serveur dapplications. Les applications InternetExpress gnrent des pages HTML qui associent HTML, XML et javascript. HTML rgit la disposition et laspect des pages vues par les utilisateurs finals dans leur navigateur. XML code les paquets de donnes et les paquets delta qui reprsentent les informations base de donnes. Javascript permet aux contrles HTML dinterprter et de manipuler les donnes des paquets XML sur la machine client. Si lapplication InternetExpress utilise DCOM pour se connecter au serveur dapplications, vous devez suivre des tapes supplmentaires afin de garantir que le serveur dapplications accorde les droits daccs et de lancement ses clients. Voir Droits daccs au serveur dapplications et son lancement la page 25-41, pour plus de dtails.
Astuce

Vous pouvez crer une application InternetExpress pour fournir des navigateurs Web avec des donnes relles mme si vous navez pas dapplication serveur. Ajoutez simplement un fournisseur et son ensemble de donnes au module Web.

Construction dune application InternetExpress


Les tapes suivantes dcrivent une faon de construire une application Web avec InternetExpress. Il en rsulte une application qui cre des pages HTML pour permettre aux utilisateurs dinteragir sur les donnes depuis un serveur dapplications via un navigateur Web javascript. Vous pouvez galement construire une application InternetExpress laide de larchitecture Site Express et du producteur de page dInternetExpress (TInetXPageProducer).

1 Choisissez Fichier|Nouveau pour afficher la bote de dialogue Nouveaux lments. Dans la page Nouveau, slectionnez Application serveur Web. Cette procdure est dcrite par Cration dapplications serveur Web avec lagent Web la page 28-1. 2 Depuis la page DataSnap de la palette de composants, ajoutez un composant connexion au module Web qui apparat lorsque vous crez une nouvelle application serveur Web. Le type du composant connexion dpendra du protocole de communication utilis. Voir Slection dun protocole de connexion la page 25-10, pour plus de dtails. 3 Dfinissez les proprits de votre composant connexion pour spcifier le serveur dapplications avec lequel il doit tablir la connexion. Pour en savoir plus sur la dfinition dun composant connexion, voir Connexion au serveur dapplications la page 25-27. 4 Depuis la page InternetExpress de la palette de composants, ajoutez au module Web un courtierXML au lieu dun ensemble de donnes client. Comme TClientDataSet, TXMLBroker reprsente les donnes venant dun fournisseur sur le serveur dapplications et interagit avec le serveur dapplications via son interface IAppServer. Cependant, au contraire des ensembles de donnes, les courtiers XML demandent des paquets de donnes XML et non OleVariants, et interagissent avec les composants InternetExpress et non les contrles de donnes.

Cration dapplications multiniveaux

25-39

Ecriture des applications client Web

5 Dfinissez la proprit RemoteServer du courtier XML pour quelle pointe sur le composant connexion ajout ltape 2. Dfinissez la proprit ProviderName pour quelle indique le fournisseur sur le serveur dapplications qui fournit les donnes et applique les mises jour. Pour plus dinformations sur la configuration dun courtier XML, voir Utilisation dun courtier XML la page 25-42. 6 Ajoutez au module Web un producteur de page InternetExpress (TInetXPageProducer) pour chaque page qui sera vue par les utilisateurs dans leur navigateur. Pour chaque producteur de page, vous devez dfinir une proprit IncludePathURL. Elle indique o se trouvent les bibliothques javascript. Ces bibliothques ajoutent aux contrles HTML des capacits de gestion des donnes. 7 Cliquez avec le bouton droit sur une page Web et choisissez Editeur dactions pour afficher lditeur dactions. Ajoutez llment daction correspondant chaque message que vous voulez g rer depuis les navigateurs. Associez les producteurs de page que vous avez ajout ltape 6 avec ces actions en dfinissant leur proprit Producer ou en crivant du code dans un gestionnaire de lvnement OnAction. Pour plus dinformations sur lajout des lments daction dans lditeur dactions, voir Ajout dactions au rpartiteur la page 28-5. 8 Double-cliquez sur chaque page Web pour afficher lditeur de pages Web (vous pouvez galement afficher cet diteur en cliquant dans linspecteur dobjets sur le bouton points de suspension situ ct de la proprit WebPageItems). Dans lditeur, vous pouvez ajouter des lments Web pour concevoir les pages que verront les utilisateurs dans leur navigateur. Pour plus dinformations sur la conception de pages Web pour votre application InternetExpress, voir Cration des pages Web avec un producteur de page InternetExpress la page 25-44. 9 Construisez votre application Web. Une fois lapplication installe avec votre serveur Web, les navigateurs pourront lappeler en spcifiant le nom de lapplication dans la portion de lURL correspondant au nom de script et le nom du composant page Web dans la partie correspondant au chemin daccs.

Utilisation des bibliothques javascript


Les pages HTML gnres par les composants InternetExpress et les lments Web quelles contiennent utilisent plusieurs bibliothques javascript livres avec Delphi :
Tableau 25.3 Bibliothque
xmldom.js

Les bibliothques javascript fonctions


Cette bibliothque est un analyseur XML compatible DOM crit en javascript. Il permet aux analyseurs ne supportant pas XML dutiliser les paquets de donnes XML. Cette bibliothque dfinit des classes daccs aux donnes analogues TClientDataSet et TField.

xmldb.js

25-40

Guide du dveloppeur

Ecriture des applications client Web

Tableau 25.3 Bibliothque


xmldisp.js xmlerrdisp.js

Les bibliothques javascript (suite) fonctions


Cette bibliothque dfinit des classes associant les classes daccs aux donnes de xmldb aux contrles HTML de la page HTML. Cette bibliothque dfinit des classes qui peuvent tre utilises lors de la rconciliation des erreurs de mise jour. Ces classes ne sont utilises par aucun des composants InternetExpress intgrs, mais sont utiles pour crire un gnrateur Reconcile. Cette bibliothque inclut des fonctions pour afficher des paquets de donnes formats XML et des paquets delta XML. Cette bibliothque nest utilise par aucun des composants InternetExpress intgrs, mais est utile pour le dbogage.

xmlshow.js

Ces bibliothques sont dans le rpertoire Source/Webmidas. Lorsque vous les aurez installes, vous devrez dfinir la proprit IncludePathURL de tous les producteurs de page InternetExpress pour indiquer o elles se trouvent. Il est possible dcrire vos propres pages HTML en utilisant les classes javascript fournies dans ces bibliothques au lieu dutiliser les lments Web pour gnrer vos pages Web. Toutefois, vous devez vrifier que votre code ne fait rien dillgal car ces classes comportent une vrification derreurs minimale (afin de rduire la taille des pages Web gnres). Les classes des bibliothques javascript sont un standard en cours de dveloppement, elles sont rgulirement mises jour. Si vous voulez les utiliser directement plutt que de laisser les lments Web gnrer le code javascript, vous pouvez obtenir leurs dernires versions et une documentation sur leur utilisation partir de CodeCentral disponible via community.borland.com.

Droits daccs au serveur dapplications et son lancement


Les demandes issues de lapplication InternetExpress apparaissent au serveur dapplications comme provenant dun compte invit dont le nom est IUSR_computername, o computername est le nom du systme qui excute lapplication Web. Par dfaut, ce compte na pas le droit daccder au serveur dapplications ni de le lancer. Si vous essayez dutiliser lapplication Web sans accorder ces droits, lorsque le navigateur Web tente de charger la page demande, un dpassement de dlai se produit avec lerreur EOLE_ACCESS_ERROR.
Remarque

Le serveur dapplications sexcutant sous le compte invit, il ne peut tre arrt par aucun autre compte. Pour accorder lapplication Web le droit daccder au serveur dapplications et de le lancer, excutez DCOMCnfg.exe, qui se trouve dans le rpertoire System32 de la machine excutant le serveur dapplications. Les tapes suivantes dcrivent comment configurer votre serveur dapplications :

1 Lorsque vous excutez DCOMCnfg, slectionnez votre serveur dans la liste des applications de la page Applications. 2 Cliquez sur le bouton Proprits. Lorsque le dialogue change, slectionnez la page Scurit.

Cration dapplications multiniveaux

25-41

Ecriture des applications client Web

3 Slectionnez Permissions daccs personnalises, et appuyez sur le bouton Modifier. Ajoutez le nom IUSR_computername la liste de comptes ayant un droit daccs, o computername est le nom de la machine excutant lapplication Web. 4 Slectionnez Permissions de lancement personnalises, et appuyez sur le bouton Modifier. Ajoutez IUSR_computername la liste. 5 Cliquez sur le bouton Appliquer.

Utilisation dun courtier XML


Un courtier XML a deux fonctions principales : Il lit partir du serveur dapplications les paquets de donnes XML et les rend disponibles aux lments Web gnrant le HTML pour lapplication InternetExpress. Il reoit des navigateurs les mises jour au format des paquets delta XML et les applique au serveur dapplications.

Lecture des paquets de donnes XML


Avant que le courtier XML fournisse les paquets de donnes XML aux composants gnrant les pages HTML, il doit les lire depuis le serveur dapplications. Pour cela, il utilise linterface IAppServer du serveur dapplications, quil acquiert via un composant connexion. Vous devez dfinir les proprits suivantes pour que le producteur XML utilise linterface IAppServer du serveur dapplications : Dfinissez la proprit RemoteServer par le composant connexion qui tablit la connexion au serveur dapplications et obtient son interface IAppServer. Au moment de la conception, vous pouvez slectionner cette valeur dans linspecteur dobjets partir dune liste droulante. Dfinissez la proprit ProviderName par le nom du composant fournisseur sur le serveur dapplications qui reprsente lensemble de donnes pour lequel vous voulez les paquets XML. Ce fournisseur fournit les paquets de donnes XML et applique les mises jour partir des paquets delta XML. Au moment de la conception, si la proprit RemoteServer est dfinie et si le composant connexion a une connexion active, linspecteur dobjets affiche la liste des fournisseurs disponibles. (Si vous utilisez une connexion DCOM, le serveur dapplications doit tre recens sur la machine client). Deux proprits vous permettent dindiquer les informations inclure dans les paquets de donnes. Vous pouvez limiter le nombre denregistrements ajouts au paquet de donnes en dfinissant la proprit MaxRecords. Cela est particulirement important pour les gros ensembles de donnes car les applications InternetExpress envoient tout le paquet de donnes aux navigateurs Web client. Si le paquet de donnes est trop gros, le temps de tlchargement peut devenir excessivement long.

25-42

Guide du dveloppeur

Ecriture des applications client Web

Si le fournisseur sur le serveur dapplications reprsente une requte ou une procdure stocke, vous pouvez souhaiter transmettre les valeurs des paramtres avant dobtenir le paquet de donnes XML. Vous pouvez fournir ces valeurs laide de la proprit Params. Les composants qui gnrent le code HTML et javascript pour lapplication InternetExpress utilisent automatiquement le paquet de donnes XML du courtier XML lorsque vous avez dfini leur proprit XMLBroker. Pour obtenir le paquet de donnes XML directement dans le code, utilisez la mthode RequestRecords.
Remarque

Quand le courtier XML fournit un paquet de donnes un autre composant (ou que vous appelez RequestRecords), il reoit un vnement OnRequestRecords. Vous pouvez utiliser cet vnement pour fournir votre propre chane XML au lieu du paquet de donnes du serveur dapplications. Par exemple, vous pouvez lire le paquet de donnes XML partir du serveur dapplications laide de GetXMLRecords, puis le modifier avant de le fournir la page Web.

Application des mises jour partir des paquets delta XML


Lorsque vous ajoutez le courtier XML au module Web (ou un module de donnes contenant un TWebDispatcher), il se recense lui-mme automatiquement avec le rpartiteur Web en tant quobjet auto-rparti. Cela veut dire quau contraire des autres composants, il nest pas ncessaire de crer un lment daction pour le courtier XML afin quil rponde aux messages de mise jour provenant du navigateur Web. Ces messages contiennent les paquets delta XML appliquer au serveur dapplications. Habituellement, ils proviennent dun bouton que vous avez cr dans une des pages HTML produites par lapplication client Web. Afin que le rpartiteur reconnaisse les messages pour le courtier XML, vous devez les dcrire laide de la proprit WebDispatch. Dfinissez la proprit PathInfo par la partie chemin daccs de lURL laquelle sont envoys les messages du courtier XML. Dfinissez MethodType par la valeur den-tte de la mthode des messages de mise jour adresss cette URL (classiquement mtPost). Si vous souhaitez rpondre tous les messages avec le chemin daccs spcifi, dfinissez MethodType par mtAny. Si vous ne voulez pas que le courtier XML rponde directement aux messages de mise jour (par exemple, si vous souhaitez les grer explicitement en utilisant un lment daction), dfinissez la proprit Enabled par False. Pour plus dinformations sur la faon dont le rpartiteur Web dtermine les composants grant les messages du navigateur Web, voir Rpartition des messages de requte la page 28-5. Lorsque le rpartiteur passe un message de mise jour au courtier XML, il passe les mises jour sur le serveur dapplications et il reoit ventuellement un paquet delta XML dcrivant toutes les erreurs de mise jour qui se sont produites. Finalement, il envoie un message de rponse au navigateur, qui redirige le navigateur sur la page ayant gnr le paquet delta XML delta ou lui envoie un nouveau contenu.

Cration dapplications multiniveaux

25-43

Ecriture des applications client Web

Certains vnements vous permettent dintgrer des traitements personnaliss au niveau de chacune des tapes de ce processus de mise jour :

1 La premire fois que le rpartiteur passe le message de mise jour au courtier XML, il reoit un vnement BeforeDispatch, o vous pouvez pr-traiter la demande ou mme la grer entirement. Cet vnement permet au courtier XML de grer dautres messages que les messages de mise jour. 2 Si le gestionnaire de lvnement BeforeDispatch ne gre pas le message, le courtier XML reoit un vnement OnRequestUpdate, o vous pouvez appliquer les mises jour vous-mme plutt que de suivre le processus par dfaut. 3 Si le gestionnaire de lvnement OnRequestUpdate ne gre pas la demande, le courtier XML applique les mises jour et reoit un paquet delta contenant les erreurs sy rapportant. 4 Sil ny a pas derreur de mise jour, le courtier XML reoit un vnement OnGetResponse, o vous pouvez crer un message de rponse indiquant que les mises jour ont t appliques avec succs ou envoyer des donnes rafrachies au navigateur. Si le gestionnaire de lvnement OnGetResponse nachve pas la rponse (ne dfinit pas le paramtre Handled par True), le courtier XML envoie une rponse qui redirige le navigateur sur le document ayant gnr le paquet delta. 5 Sil y a des erreurs de mise jour, le courtier XML reoit un vnement OnGetErrorResponse. Vous pouvez utiliser cet vnement pour tenter de rsoudre les erreurs ou pour gnrer une page Web qui les dcrit lutilisateur final. Si le gestionnaire de lvnement OnGetErrorResponse nachve pas la rponse (ne dfinit pas le paramtre Handled par True), le courtier XML appelle un gnrateur de contenu particulier, appel le ReconcileProducer, pour gnrer le contenu du message de rponse. 6 Enfin, le courtier XML reoit un vnement AfterDispatch, o vous pouvez effectuer toutes les actions voulues avant de renvoyer une rponse au navigateur Web.

Cration des pages Web avec un producteur de page InternetExpress


Chaque producteur de page InternetExpress gnre un document HTML qui apparat dans les navigateurs des clients de votre application. Si votre application comprend plusieurs documents Web spars, utilisez un producteur de page diffrent pour chacun dentre eux. Le producteur de page InternetExpress (TInetXPageProducer) est un composant producteur de page spcial. Comme les autres producteurs de page, vous pouvez lassigner la proprit Producer dun lment daction ou lappeler explicitement partir du gestionnaire de lvnement OnAction. Pour plus dinformations sur lutilisation des producteurs de contenu avec les lments daction, voir Rponse aux messages de requte avec des lments daction la page 28-8.

25-44

Guide du dveloppeur

Ecriture des applications client Web

Pour plus dinformations sur les producteurs de page, voir Utilisation du composant gnrateur de page la page 28-14. Contrairement la majorit des producteurs de page, le producteur de page InternetExpress dispose dun modle par dfaut, valeur de sa proprit HTMLDoc. Ce modle contient un jeu de balises transparentes pour HTML que le producteur de page InternetExpress utilise pour assembler le document HTML (avec javascript et XML imbriqu s) en incluant le contenu produit par les autres composants. Avant qu il soit possible de traduire toutes les balises transparentes pour HTML et dassembler le document, vous devez indiquer lemplacement des bibliothques javascript utilises par le code javascript imbriqu dans la page. Cet emplacement est spcifi en dfinissant la proprit IncludePathURL. Vous pouvez spcifier les composants gnrant chaque partie de la page Web avec lditeur de pages Web. Affichez lditeur de pages Web en double-cliquant sur le composant page Web ou, dans linspecteur dobjets, en cliquant sur le bouton points de suspension situ ct de la proprit WebPageItems. Les composants que vous ajoutez dans lditeur de pages Web gnrent le code HTML qui remplace une des balises transparentes pour HTML du modle par dfaut du producteur de page InternetExpress. Ces composants constituent la valeur de la proprit WebPageItems. Aprs avoir insr les composants dans lordre qui vous convient, vous pouvez personnaliser le modle pour ajouter votre propre code HTML ou modifier les balises par dfaut.

Utilisation de lditeur de pages Web


Lditeur de pages Web vous permet dajouter des lments Web votre producteur de page InternetExpress et de voir la page HTML qui en rsulte. Affichez lditeur de pages Web en double-cliquant sur un composant producteur de page InternetExpress.
Remarque

Vous devez avoir install Internet Explorer 4, ou une version suprieure, pour utiliser lditeur de pages Web. Le haut de lditeur de pages Web affiche les lments Web qui gnrent le document HTML. Ces lments Web sont imbriqus : chaque type dlment assemble le HTML gnr par ses sous-lments. Diffrents types dlments peuvent contenir diffrents sous-lments. A gauche, une arborescence affiche tous les lments Web en indiquant la faon dont ils simbriquent. A droite, vous pouvez voir les lments Web inclus dans llment en cours de slection. Lorsque vous slectionnez un composant en haut de lditeur de pages Web, vous pouvez dfinir ses proprits dans linspecteur dobjets. Cliquez sur le bouton Nouveau pour ajouter un sous-lment llment en cours de slection. Le dialogue Ajout de composant Web montre uniquement les lments pouvant tre ajouts llment slectionn. Le producteur de page InternetExpress peut contenir un des deux types dlment suivants, chacun dentre eux gnrant une fiche HTML : TDataForm gnre une fiche HTML pour afficher les donnes et les contrles qui manipulent les donnes ou soumettent les mises jour.

Cration dapplications multiniveaux

25-45

Ecriture des applications client Web

Les lments que vous ajoutez TDataForm affichent les donnes dans une grille multi-enregistrement (TDataGrid) ou dans un jeu de contrles, chacun reprsentant un seul champ et un seul enregistrement (TFieldGroup). En outre, vous pouvez ajouter un jeu de boutons pour naviguer dans les donnes ou pour poster les mises jour (TDataNavigator). Vous pouvez galement ajouter un bouton qui applique les mises jour en retour sur le client Web (TApplyUpdatesButton). Chacun de ces lments contient des sous-lments qui reprsentent une valeur ou un bouton individuel. Enfin, avec la plupart des lments Web, vous pouvez ajouter une grille de disposition (TLayoutGroup) permettant de personnaliser la disposition des lments quils contiennent. TQueryForm gnre une fiche HTML pour afficher ou lire les valeurs dfinies par lapplication. Par exemple, vous pouvez utiliser cette fiche pour afficher et soumettre des valeurs de paramtres. Les lments que vous ajoutez TQueryForm affichent les valeurs dfinies par lapplication (TQueryFieldGroup). Ils peuvent galement constituer un jeu de boutons soumettant ou rinitialisant ces valeurs (TQueryButtons). Chacun de ces lments contient des sous-lments qui reprsentent une valeur ou un bouton individuel. Vous pouvez galement ajouter une grille de disposition une fiche de requte comme vous le faites une fiche de donnes. La partie infrieure de lditeur de pages Web affiche le code HTML gnr et vous permet de voir ce quil donne dans un navigateur (IE4).

Dfinition des proprits des lments Web


Les lments Web ajouts avec lditeur de pages Web sont des composants spcialiss qui gnrent le HTML. Chaque classe dlment Web a t conue pour produire un contrle spcial ou une section du document HTML final. Un ensemble commun de proprits influence laspect du document HTML final. Lorsquun lment Web reprsente des informations provenant du paquet de donnes XML (par exemple, lorsquil gnre un ensemble de contrles affichant des champs ou des paramtres, ou un bouton de manipulation des donnes), la proprit XMLBroker associe llment Web au courtier XML grant le paquet de donnes. Vous pouvez ensuite spcifier lensemble contenu dans un champ ensemble de donnes du paquet en utilisant la proprit XMLDataSetField. Si llment Web reprsente un champ ou une valeur de paramtre spcifique, il possde une proprit FieldName ou une proprit ParamName. Vous pouvez appliquer un attribut de style tout lment Web, jouant ainsi sur laspect global de tout le document HTML quil gnre. Styles et feuilles de style font partie du standard HTML 4. Ils permettent un document HTML de dfinir un ensemble dattributs daffichage appliquer une balise et tout ce qui est de sa porte. Les lments Web les utilisent de plusieurs faons : La faon la plus simple dutiliser les styles est de dfinir un attribut de style sur llment Web directement. Pour cela, utilisez la proprit Style. La valeur de Style nest rien dautre que la partie dfinition dattribut dune dfinition de style HTML standard, par exemple :
color: red.

25-46

Guide du dveloppeur

Ecriture des applications client Web

Vous pouvez aussi dfinir une feuille de style, qui dtermine un ensemble de dfinitions. Chaque dfinition inclut un slecteur de style (soit le nom dune balise laquelle le style sapplique constamment, soit le nom dun style dfini par lutilisateur), plus la dfinition entre accolades de lattribut :
H2 B {color: red} .MyStyle {font-family: arial; font-weight: bold; font-size: 18px }

Lensemble global des dfinitions est maintenu par le producteur de page InternetExpress dans sa proprit Styles. Chaque lment Web peut alors faire rfrence aux styles par les noms dfinis par lutilisateur via la proprit StyleRule. Si vous partagez une feuille de style avec dautres applications, vous pouvez fournir les dfinitions de style dans la valeur de la proprit StylesFile du producteur de page InternetExpress et non dans la proprit Styles. Les lments Web individuels peuvent continuer faire rfrence aux styles via la proprit StyleRule. Autre proprit commune des lments Web : la proprit Custom. Custom est un jeu doptions que vous ajoutez la balise HTML gnre. HTML dfinit un jeu doptions diffrent pour chaque type de balise. La rfrence de la VCL donne un exemple des options possibles pour la proprit Custom de la plupart des lments Web. Pour plus dinformations sur ces options, reportez-vous un guide de rfrence HTML.

Personnalisation du modle dun producteur de page InternetExpress


Le modle dun producteur de page InternetExpress est un document HTML contenant des balises imbriques supplmentaires que votre application traduit de manire dynamique. Au dpart, le producteur de page g nre un modle partir de la valeur de la proprit HTMLDoc. Ce modle par dfaut a la forme suivante :
<HTML> <HEAD> </HEAD> <BODY> <#INCLUDES> <#STYLES> <#WARNINGS> <#FORMS> <#SCRIPT> </BODY> </HTML>

Les balises transparentes pour HTML du modle par dfaut sont traduites comme suit : <#INCLUDES> gnre les instructions qui incluent les bibliothques javascript. Ces instructions ont la forme suivante :
<SCRIPT language=Javascript type="text/javascript" SRC="IncludePathURL/xmldom.js"> </SCRIPT> <SCRIPT language=Javascript type="text/javascript" SRC="IncludePathURL/xmldb.js"> </SCRIPT> <SCRIPT language=Javascript type="text/javascript" SRC="IncludePathURL/xmlbind.js"> </SCRIPT>

<#STYLES> gnre les instructions qui dfinissent une feuille de style partir des dfinitions listes dans la proprit Styles ou StylesFile du producteur de page InternetExpress.

Cration dapplications multiniveaux

25-47

Ecriture des applications client Web

<#WARNINGS> ne gnre rien pendant lexcution. Au moment de la conception, elle ajoute des messages davertissement concernant les problmes dtects lors de la gnration du document HTML. Vous pouvez voir ces messages dans lditeur de pages Web. <#FORMS> gnre le HTML produit par les composants que vous avez ajouts avec lditeur de pages Web. Le HTML correspondant chaque composant est gnr dans lordre de WebPageItems. <#SCRIPT> gnre le bloc des dclarations javascript utilises dans le HTML gnr par les composants ajouts avec lditeur de pages Web. Vous pouvez remplacer le modle par dfaut en modifiant la valeur de HTMLDoc ou en dfinissant la proprit HTMLFile. Le modle HTML personnalis peut comprendre une ou plusieurs des balises transparentes pour HTML appartenant au modle par dfaut. Le producteur de page InternetExpress traduit automatiquement ces balises lorsque vous appelez la mthode Content . En outre, le producteur de page InternetExpress traduit automatiquement les trois balises suivantes : <#BODYELEMENTS> est remplac du modle par dfaut. Cela HTML lorsque vous voulez lments supplmentaires par le mme HTML que celui rsultant des 5 balises peut servir gnrer un modle dans un diteur utiliser la disposition par dfaut mais ajouter des laide de lditeur.

<#COMPONENT Name=WebComponentName> est remplac par le HTML gnr par le composant nomm WebComponentName. Ce composant peut tre lun de ceux ajouts dans lditeur de pages Web, ou tout autre composant supportant linterface IWebContent, il a le mme propritaire que le producteur de page InternetExpress. <#DATAPACKET XMLBroker=BrokerName> est remplac par le paquet de donnes XML obtenu partir du courtier XML spcifi par BrokerName. Lorsque, dans lditeur de pages Web, vous examinez le HTML gnr par le producteur de page InternetExpress, vous voyez cette balise la place du paquet de donnes luimme. De plus, le modle personnalis peut inclure toute autre balise transparente pour HTML que vous auriez dfinie. Lorsque le producteur de page InternetExpress rencontre une balise appartenant un des sept types quil traduit automatiquement, il gnre un vnement OnHTMLTag, dans lequel vous pouvez crire du code pour effectuer vos propres traductions. Pour plus dinformations sur les modles HTML, voir Modles HTML la page 28-15.
Astuce

Les composants qui apparaissent dans lditeur de pages Web gnrent du code statique. Cest dire que, sauf si le serveur dapplications modifie les mtadonnes figurant dans les paquets de donnes, le code HTML est toujours le mme quelque soit le moment o il est gnr. Pour viter, lexcution, la gnration dynamique de ce code, en rponse chaque message de demande, vous pouvez copier le HTML gnr dans lditeur de pages Web et lutiliser comme modle. Lditeur de pages Web affichant une balise <#DATAPACKET> au lieu de lXML rel, utiliser ce genre de modle nempche pas votre application de lire dynamiquement les paquets de donnes provenant du serveur dapplications.

25-48

Guide du dveloppeur

26
Utilisation de XML dans les applications de bases de donnes
Chapitre 26

Chapitre

En plus de la prise en charge de la connexion des serveurs de bases de donnes, Delphi vous permet de travailler avec des documents XML comme sil sagissait de serveurs de bases de donnes. XML (Extensible Markup Language) est un langage de balisage pour la description de donnes structures. Les documents XML fournissent un format standard transportable pour les donnes, qui est utilis dans les applications Web, la communication inter-entreprises (business-to-business), etc. Pour plus dinformations sur la manipulation directe de documents XML dans Delphi, consultez le chapitre 30, Utilisation de documents XML. La prise en charge des documents XML dans Delphi pour les applications de bases de donnes repose sur un ensemble de composants capables de convertir des paquets de donnes (la proprit Data dun ensemble de donnes client) en documents XML et des documents XML en paquets de donnes. Pour utiliser ces composants, vous devez tout dabord dfinir la transformation entre le document XML et le paquet de donnes. Aprs avoir dfini la transformation, vous pouvez utiliser des composants spciaux pour convertir des documents XML en paquets de donnes. fournir des donnes dun document XML et traiter les mises jour dun document XML. utiliser un document XML comme client dun fournisseur.

Dfinition des transformations


Pour pouvoir effectuer des conversions entre des paquets de donnes et des documents XML, vous devez au pralable dfinir la relation entre les mtadonnes dun paquet de donnes et les nuds du document XML

Utilisation de XML dans les applications de bases de donnes

26-1

Dfinition des transformations

correspondant. Une description de cette relation est stocke dans un document XML spcial appel une transformation. Chaque fichier de transformation contient deux lments : la correspondance entre les nuds dun schma XML et les champs dun paquet de donnes, et un document de squelette XML qui reprsente la structure des rsultats de la transformation. Une transformation est une correspondance unidirectionnelle : partir dun schma ou dun document XML vers un paquet de donnes ou partir des mtadonnes dun paquet de donnes vers un schma XML. Les fichiers de transformation se crent souvent par paire : lun dfinit la correspondance de XML vers le paquet de donnes, et lautre la correspondance du paquet de donnes vers XML. Pour crer les fichiers de transformation pour une correspondance, employez lutilitaire XMLMapper prsent dans le rpertoire bin.

Correspondance entre les nuds XML et les champs du paquet de donnes


XML fournit une mthode textuelle pour stocker ou dcrire des donnes structures. Les ensembles de donnes fournissent une autre mthode pour stocker et dcrire des donnes structures. Pour convertir un document XML en ensemble de donnes, vous devez donc identifier les correspondances entre les nuds dun document XML et les champs dun ensemble de donnes. Considrons, par exemple, un document qui reprsente un ensemble de messages lectroniques. Ce document peut avoir lapparence suivante (avec un seul message) :
<?xml version="1.0" standalone=yes ?> <email> <head> <from> <name>Dave Boss</name> <address>dboss@MyCo.com</address> </from> <to> <name>Joe Engineer</name> <address>jengineer@MyCo.com</address> </to> <cc> <name>Robin Smith/name> <address>rsmith@MyCo.com</address> </cc> <cc> <name>Leonard Devon</name> <address>ldevon@MyCo.com</address> </cc> </head> <body> <subject>XML components</subject> <content>

26-2

Guide du dveloppeur

Dfinition des transformations

Joe, Ci-joint la spcification de la gestion du nouveau composant XML dans Delphi. Cest une bonne solution notre application inter-entreprises. Le schedule du projet est galement joint. Te semble-til raisonnable ? Dave. </content> <attachment attachfile="XMLSpec.txt"/> <attachment attachfile="Schedule.txt"/> </body> </email>

Une correspondance naturelle entre ce document et un ensemble de donnes consisterait mapper chaque message sur un enregistrement unique. Lenregistrement contiendrait des champs pour le nom et ladresse de lexpditeur. Comme un message lectronique peut avoir plusieurs destinataires, le destinataire (<to>) serait mapp sur un ensemble de donnes imbriqu. De mme, la liste cc serait mappe sur un ensemble de donnes imbriqu. La ligne de sujet serait mappe sur un champ de type chane de caractres tandis que le message lui-mme (<content>) serait probablement mapp sur un champ mmo. Les noms des fichiers joints seraient mapps sur un ensemble de donnes imbriqu, car un message peut avoir plusieurs fichiers joints. Par consquent, le message lectronique ci-dessus serait mapp sur un ensemble de donnes comme suit :
SenderName SenderAddress
Dave Boss

To

CC

Subject

Content Attach

dboss@MyCo.Com (DataSet) (DataSet) XML components (MEMO) (DataSet)

o lensemble de donnes imbriqu dans le champ To est


Name
Joe Engineer

Address
jengineer@MyCo.Com

lensemble de donnes imbriqu dans le champ CC est


Name
Robin Smith Leonard Devon

Address
rsmith@MyCo.Com ldevon@MyCo.Com

et lensemble de donnes imbriqu dans le champ Attach est


Attachfile
XMLSpec.txt Schedule.txt

La dfinition de telles correspondances implique lidentification dans le document XML des nuds qui peuvent tre rpts, et leur correspondance avec des ensembles de donnes imbriqus. Les lments baliss qui ont des valeurs et apparaissent une fois seulement (comme <content>...</content>) sont mapps

Utilisation de XML dans les applications de bases de donnes

26-3

Dfinition des transformations

sur des champs dont le type de donnes reflte le type des donnes pouvant apparatre comme valeurs. Les attributs dune balise (comme lattribut AttachFile de la balise de pice jointe) sont galement mapps sur des champs. Notez que les balises du document XML napparaissent pas toutes dans lensemble de donnes correspondant. Par exemple, llment <head>...<head/> ne possde pas dlment correspondant dans lensemble de donnes rsultant. Gnralement, seuls les lments qui ont des valeurs, les lments qui peuvent tre rpts ou les attributs dune balise sont mapps sur les champs (y compris les champs dun ensemble de donnes imbriqu) dun ensemble de donnes. Un nud pre du document XML qui est mapp sur un champ dont la valeur est compose partir des valeurs des nuds fils constituerait toutefois une exception cette rgle. Par exemple, un document XML peut contenir un ensemble de balises de la forme
<FullName> <Title> Mr. </Title> <FirstName> John </FirstName> <LastName> Smith </LastName> </FullName>

qui peuvent tre mappes sur un champ densemble de donnes unique avec la valeur
Mr. John Smith

Utilisation de XMLMapper
Lutilitaire mappeur XML, xmlmapper.exe, vous permet de dfinir des mappages (ou correspondances) de trois manires : A partir dun schma (ou dun document) XML existant vers un ensemble de donnes client que vous dfinissez. Cette mthode est utile lorsque vous souhaitez crer une application de base de donnes pour manipuler des donnes pour lesquelles vous disposez dj dun schma XML. A partir dun paquet de donnes existant vers un nouveau schma XML que vous dfinissez. Cette mthode est utile lorsque vous souhaitez prsenter des informations de bases de donnes existantes dans XML, par exemple pour crer un nouveau systme de communication inter-entreprise. Entre un schma XML existant et un paquet de donnes existant. Cette mthode est utile lorsque vous disposez dun schma XML et dune base de donnes qui dcrivent tous deux les mmes informations et que vous souhaitez les faire travailler ensemble. Aprs avoir dfini le mappage, vous pouvez gnrer les fichiers de transformation pour la conversion des documents XML en paquets de donnes et vice-versa. Notez que seul le fichier de transformation est directionnel : un mme mappage peut tre utilis pour gnrer la fois la transformation de XML vers le paquet de donnes et du paquet de donnes vers XML.
Remarque

Le mappeur XML se base sur deux .DLL (midas.dll et msxml.dll). Assurez-vous que ces .DLL sont toutes deux installes avant dessayer dutiliser

26-4

Guide du dveloppeur

Dfinition des transformations

xmlmapper.exe. De plus, msxml.dll doit tre enregistr en tant que serveur COM. Vous pouvez effectuer cet enregistrement au moyen de Regsvr32.exe.

Chargement dun schma XML ou dun paquet de donnes


Avant de pouvoir dfinir un mappage et gnrer un fichier de transformation, vous devez charger les descriptions du document XML et du paquet de donnes entre lesquels vous tes en train de dfinir un mappage. Vous pouvez charger un document ou un schma XML en choisissant Fichier| Ouvrir et en slectionnant le document ou le schma dans la bote de dialogue rsultante. Vous pouvez charger un paquet de donnes en choisissant Fichier|Ouvrir et en slectionnant un fichier de paquet de donnes dans la bote de dialogue rsultante. Le paquet de donnes est simplement le fichier gnr lorsque vous appelez la mthode SaveToFile dun ensemble de donnes client. Si vous navez pas enregistr le paquet de donnes sur disque, vous pouvez directement accder au paquet de donnes partir du serveur dapplications dune application plusieurs niveaux en cliquant avec le bouton droit de la souris dans la vue Paquet de donnes et en choisissant Connexion un serveur distant. Vous pouvez charger seulement un document ou schma XML, seulement un paquet de donnes, ou les deux. Si vous ne chargez quun ct du mappage, le mappeur XML peut gnrer un mappage naturel pour lautre ct.

Dfinition des mappages


Le mappage entre un document XML et un paquet de donnes ninclut pas ncessairement tous les champs du paquet de donnes ou tous les lments baliss du document XML. Vous devez donc spcifier les lments mapper. Pour cela, slectionnez dabord la page Affectations du volet central de la bote de dialogue. Pour spcifier les lments dun document ou dun schma XML mapper sur les champs dun paquet de donnes, slectionnez longlet Exemple ou Structure du volet Document XML et double-cliquez sur les nuds des lments mapper sur des champs du paquet de donnes. Pour spcifier les champs du paquet de donnes mapper sur des lments baliss ou des attributs du document XML, double-cliquez sur les nuds correspondant ces champs dans la vue Paquet de donnes. Si vous navez charg quun seul ct du mappage (le document XML ou le paquet de donnes), vous pouvez gnrer lautre ct aprs avoir slectionn les nuds mapper. Si vous gnrez un paquet de donnes partir dun document XML, vous devez dfinir tout dabord des attributs pour les nuds slectionns dterminant les types de champs auxquels ils correspondent dans le paquet de donnes. Dans le volet central, slectionnez la page Proprits du nud. Slectionnez chaque nud qui participe au mappage et indiquez les attributs du champ correspondant. Si le mappage nest pas simple (comme dans le cas dun nud avec des sous-nuds correspondant un champ dont la valeur est

Utilisation de XML dans les applications de bases de donnes

26-5

Dfinition des transformations

construite partir de ces sous-nuds), activez la case cocher Traduction dfinie par lutilisateur. Vous devrez crire par la suite un gestionnaire dvnement pour effectuer la transformation sur des nuds dfinis par lutilisateur. Aprs avoir spcifi la manire dont les nuds doivent tre mapps, choisissez Crer|Paquet de donnes partir de donnes XML. Le paquet de donnes correspondant est automatiquement gnr et affich dans la vue Paquet de donnes. Si vous gnrez un document XML partir dun paquet de donnes, choisissez Crer|Donnes XML partir dun paquet de donnes. Une bote de dialogue apparat dans laquelle vous pouvez spcifier les noms des balises et des attributs dans le document XML qui correspondent aux champs, enregistrements et ensembles de donnes du paquet de donnes. Pour les valeurs des champs, vous indiquez si elles sont mappes sur un lment balis avec une valeur ou sur un attribut en les nommant de faon diffrente. Les noms commenant par un symbole @ mappent sur des attributs de la balise qui correspond lenregistrement, tandis que les noms ne commenant pas par un symbole @ mappent sur des lments baliss qui possdent des valeurs et sont imbriqus dans llment de lenregistrement. Si vous avez charg la fois un document XML et un paquet de donnes (fichier densemble de donnes client), assurez-vous de slectionner les nuds correspondants dans le mme ordre. Les nuds correspondants devraient apparatre les uns ct des autres dans le tableau situ en haut de la page Affectations. Lorsque vous avez charg ou gnr le document XML et le paquet de donnes puis slectionn les nuds apparaissant dans le mappage, le tableau en haut de la page Affectations devrait reflter le mappage que vous avez dfini.

Gnration de fichiers de transformation


Pour gnrer un fichier de transformation, utilisez les tapes suivantes :

1 Slectionnez dabord le bouton radio indiquant la transformation crer :


Choisissez le bouton Paquet de donnes en XML si le mappage seffectue dun paquet de donnes vers un document XML. Choisissez le bouton XML en paquet de donnes si le mappage seffectue dun document XML vers un paquet de donnes.

2 Si vous gnrez un paquet de donnes, vous pouvez galement utiliser les boutons radio de la section Format du paquet de donnes cr. Ces boutons vous permettent dindiquer comment le paquet de donnes sera utilis : comme ensemble de donnes, comme paquet delta pour lapplication de mises jour, ou comme paramtres transmettre un fournisseur avant de lire des donnes. 3 Cliquez sur Crer et tester le fichier de transformation pour gnrer une version en mmoire de la transformation. Le mappeur XML affiche le document XML qui serait gnr pour le paquet de donnes dans la vue

26-6

Guide du dveloppeur

Conversion de documents XML en paquets de donnes

Paquet de donnes ou le paquet de donnes qui serait gnr pour le document XML dans le volet Document XML.

4 Enfin, choisissez Fichier|Enregistrer|Transformation pour enregistrer le fichier de transformation. Le fichier de transformation est un fichier XML spcial (avec lextension .xtr) qui dcrit la transformation que vous avez dfinie.

Conversion de documents XML en paquets de donnes


Aprs avoir cr un fichier de transformation indiquant la manire de transformer un document XML en paquet de donnes, vous pouvez crer des paquets de donnes pour tout document XML conforme au schma utilis dans la transformation. Ces paquets de donnes peuvent ensuite tre affects un ensemble de donnes client et enregistrs dans un fichier pour constituer la base dune application de base de donnes base sur un fichier. Le composant TXMLTransform transforme un document XML en paquet de donnes selon le mappage dfini dans un fichier de transformation.
Remarque

Vous pouvez aussi utiliser TXMLTransform pour convertir un paquet de donnes qui apparat au format XML en un document XML arbitraire.

Spcification du document XML source


Il existe trois mthodes pour spcifier le document XML source : Si le document source est un fichier .xml sur disque, vous pouvez utiliser la proprit SourceXmlFile. Si le document source est une chane XML en mmoire, vous pouvez utiliser la proprit SourceXml. Si vous disposez dune interface IDOMDocument pour le document source, vous pouvez utiliser la proprit SourceXmlDocument. TXMLTransform vrifie ces proprits dans lordre indiqu ci-dessus. Ainsi, il recherche dabord un nom de fichier dans la proprit SourceXmlFile. Si SourceXmlFile est une chane vide, il vrifie la proprit SourceXml. Si SourceXml est une chane vide, il vrifie alors la proprit SourceXmlDocument.

Spcification de la transformation
Il existe deux mthodes pour spcifier la transformation qui convertit le document XML en paquet de donnes : Utilisez la proprit TransformationFile pour indiquer un fichier de transformation cr laide de xmlmapper.exe. Utilisez la proprit TransformationDocument si vous disposez dune interface IDOMDocument pour la transformation.

Utilisation de XML dans les applications de bases de donnes

26-7

Conversion de documents XML en paquets de donnes

TXMLTransform vrifie ces proprits dans lordre indiqu ci-dessus. Ainsi, il recherche dabord un nom de fichier dans la proprit TransformationFile. Si TransformationFile est une chane vide, il vrifie la proprit TransformationDocument.

Obtention du paquet de donnes rsultant


Pour que TXMLTranform effectue sa transformation et gnre un paquet de donnes, il vous suffit de lire la proprit Data. Par exemple, le code suivant utilise un document XML et un fichier de transformation pour gnrer un paquet de donnes, qui est ensuite affect un ensemble de donnes client :
XMLTransform1.SourceXMLFile := CustomerDocument.xml; XMLTransform1.TransformationFile := CustXMLToCustTable.xtr; ClientDataSet1.XMLData := XMLTransform1.Data;

Conversion de nuds dfinis par lutilisateur


Lorsque vous dfinissez une transformation laide de xmlmapper.exe, vous pouvez spcifier que certains nuds du document XML sont dfinis par lutilisateur. Les nuds dfinis par lutilisateur sont les nuds pour lesquels vous souhaitez fournir la transformation sous forme de code plutt quen vous basant sur une traduction directe dune valeur de nud vers une valeur de champ. Vous pouvez fournir le code de traduction des nuds dfinis par lutilisateur en utilisant lvnement OnTranslate. OnTranslate est appel chaque fois que le composant TXMLTransform rencontre un nud dfini par lutilisateur dans le document XML. Dans le gestionnaire dvnement OnTranslate, vous pouvez lire le document source et spcifier la valeur rsultante pour le champ dans le paquet de donnes. Par exemple, le gestionnaire dvnement OnTranslate suivant convertit un nud du document XML de la forme suivante
<FullName> <Title> </Title> <FirstName> </FirstName> <LastName> </LastName> </FullName>

en valeur de champ unique :


procedure TForm1.XMLTransform1Translate(Sender: TObject; Id: String; SrcNode: IDOMNode; var Value: String; DestNode: IDOMNode); var CurNode: IDOMNode; begin if Id = FullName then begin Value = ; if SrcNode.hasChildNodes then

26-8

Guide du dveloppeur

Utilisation dun document XML comme source pour un fournisseur

begin CurNode := SrcNode.firstChild; Value := Value + CurNode.nodeValue; while CurNode <> SrcNode.lastChild do begin CurNode := CurNode.nextSibling; Value := Value + ; Value := Value + CurNode.nodeValue; end; end; end; end;

Utilisation dun document XML comme source pour un fournisseur


Le composant TXMLTransformProvider vous permet dutiliser un document XML comme sil sagissait dune table de base de donnes. TXMLTransformProvider prpare les donnes dun document XML et applique en retour les mises jour des clients ce document XML. Il apparat aux clients tels que les ensembles de donnes client ou les courtiers XML comme n importe quel autre composant fournisseur. Pour des informations sur des composants fournisseur, consultez le chapitre 24, Utilisation des composants fournisseur. Pour des informations sur lutilisation de composants fournisseur avec des ensembles de donnes clients, consultez Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29. Vous pouvez spcifier le document XML partir duquel le fournisseur XML fournit les donnes et auquel il applique les mises jour au moyen de la proprit XMLDataFile. Les composants TXMLTransformProvider utilisent des composants TXMLTransform internes pour effectuer les traductions entre les paquets de donnes et le document XML source : un composant pour traduire le document XML en paquets de donnes et un autre pour traduire en retour les paquets de donnes dans le format XML du document source aprs lapplication des mises jour. Ces deux composants TXMLTransform sont respectivement accessibles laide des proprits TransformRead et TransformWrite. En utilisant TXMLTransformProvider, vous devez spcifier les transformations utilises par ces deux composants TXMLTransform pour la traduction entre les paquets de donnes et le document XML source. Utilisez pour cela la proprit TransformationFile ou TransformationDocument du composant TXMLTransform, exactement comme pour utiliser un composant TXMLTransform autonome. En outre, si la transformation inclut des nuds dfinis par lutilisateur, vous devez fournir un gestionnaire dvnement OnTranslate aux composants TXMLTransform internes. Il nest pas ncessaire de spcifier le document source pour les composants TXMLTransform qui constituent les valeurs de TransformRead et TransformWrite.

Utilisation de XML dans les applications de bases de donnes

26-9

Utilisation dun document XML comme client dun fournisseur

Pour TransformRead, la source est le fichier spcifi par la proprit XMLDataFile du fournisseur (toutefois, si vous affectez XMLDataFile une chane vide, vous pouvez spcifier le document source en utilisant TransformRead.XmlSource ou TransformRead.XmlSourceDocument). Pour TransformWrite, le source est gnr au niveau interne par le fournisseur lorsquil applique des mises jour.

Utilisation dun document XML comme client dun fournisseur


Le composant TXMLTransformClient se comporte comme adaptateur pour vous permettre dutiliser un document (ou un ensemble de documents) XML comme client pour un serveur dapplications (ou simplement comme client dun ensemble de donnes auquel il se connecte par lintermdiaire dun composant TDataSetProvider). Cela veut dire que le client TXMLTransform vous permet de publier des donnes dune base de donnes en tant que document XML et dutiliser des requtes de mise jour (insertions ou suppressions) partir dune application externe qui les fournit sous la forme de documents XML. Pour spcifier le fournisseur partir duquel lobjet TXMLTransformClient lit des donnes et auquel il applique des mises jour, utilisez la proprit ProviderName. Comme avec la proprit ProviderName dun ensemble de donnes client, ProviderName peut tre le nom dun fournisseur sur un serveur dapplications distant ou un fournisseur local dans la mme fiche ou le mme module de donnes que lobjet TXMLTransformClient. Pour des informations sur les fournisseurs, consultez le chapitre 24, Utilisation des composants fournisseur. Si le fournisseur se trouve sur un serveur dapplications distant, vous devez utiliser un composant de connexion DataSnap pour vous connecter ce serveur dapplications. Spcifiez le composant de connexion au moyen de la proprit RemoteServer. Pour des informations sur les composants de connexion DataSnap, consultez Connexion au serveur dapplications la page 25-27.

Lecture dun document XML partir dun fournisseur


TXMLTransformClient utilise un composant TXMLTransform interne pour traduire les paquets de donnes du fournisseur en document XML. Vous pouvez accder ce composant TXMLTransform avec la valeur de la proprit TransformGetData. Pour pouvoir crer un document XML reprsentant les donnes dun fournisseur, vous devez spcifier le fichier de transformation utilis par TransformGetData pour traduire le paquet de donnes au format XML appropri. Pour cela, initialisez la proprit TransformationFile ou TransformationDocument du composant TXMLTransform, exactement comme pour lutilisation dun composant TXMLTransform autonome. Si cette transformation inclut des nuds dfinis par lutilisateur, vous pouvez galement fournir TransformGetData un gestionnaire dvnement OnTranslate. Il nest pas ncessaire de spcifier le document source pour TransformGetData, car TXMLTransformClient le rcupre partir du fournisseur. Toutefois, si le fournisseur attend des paramtres dentre, vous pouvez les dfinir avant de lire

26-10

Guide du dveloppeur

Utilisation dun document XML comme client dun fournisseur

les donnes. Utilisez la mthode SetParams pour fournir ces paramtres dentre avant de lire les donnes partir du fournisseur. SetParams accepte deux arguments : une chane XML partir de laquelle extraire les valeurs des paramtres, et le nom dun fichier de transformation pour traduire ce code XML en paquet de donnes. SetParams utilise le fichier de transformation pour convertir la chane XML en paquet de donnes, puis extrait les valeurs des paramtres de ce paquet de donnes.
Remarque

Vous pouvez outrepasser lun quelconque de ces arguments si vous souhaitez spcifier le document ou la transformation dune autre manire. Il vous suffit de dfinir lune des proprits avec TransformSetParams pour indiquer les paramtres ou la transformation utiliser pour les convertir, puis daffecter largument que vous souhaitez outrepasser une chane vide lorsque vous appelez SetParams. Pour des dtails sur les proprits que vous pouvez utiliser, consultez Conversion de documents XML en paquets de donnes la page 26-7. Aprs avoir configur TransformGetData et spcifi les ventuels paramtres dentre, vous pouvez appeler la mthode GetDataAsXml pour rcuprer le code XML. GetDataAsXml envoie les valeurs de paramtres en cours au fournisseur, rcupre un paquet de donnes, le convertit en document XML puis renvoie ce document sous forme de chane de caractres. Vous pouvez enregistrer cette chane dans un fichier :
var XMLDoc: TFileStream; XML: string; begin XMLTransformClient1.ProviderName := Provider1; XMLTransformClient1.TransformGetData.TransformationFile := CustTableToCustXML.xtr; XMLTransformClient1.TransFormSetParams.SourceXmlFile := InputParams.xml; XMLTransformClient1.SetParams(, InputParamsToDP.xtr); XML := XMLTransformClient1.GetDataAsXml; XMLDoc := TFileStream.Create(Customers.xml, fmCreate or fmOpenWrite); try XMLDoc.Write(XML, Length(XML)); finally XMLDoc.Free; end; end;

Application de mises jour dun document XML un fournisseur


TXMLTransformClient vous permet aussi dinsrer toutes les donnes dun document XML dans lensemble de donnes du fournisseur ou de supprimer tous les enregistrements dun document XML de lensemble de donnes du fournisseur. Pour effectuer ces mises jour, appelez la mthode ApplyUpdates en transmettant Une chane dont la valeur est le contenu du document XML avec les donnes insrer ou supprimer.

Utilisation de XML dans les applications de bases de donnes

26-11

Utilisation dun document XML comme client dun fournisseur

Le nom dun fichier de transformation capable de convertir ces donnes XML en paquet delta dinsertion ou de suppression. En dfinissant le fichier de transformation laide de lutilitaire mappeur XML, vous indiquez si la transformation est destine un paquet delta dinsertion ou de suppression. Le nombre derreurs de mise jour qui peuvent tre tolres sans que lopration de mise jour ne soit abandonne. Si le nombre denregistrements qui ne peuvent pas tre insrs ou supprims est infrieur ce paramtre, ApplyUpdates renvoie le nombre derreurs relles. Si le nombre denregistrements qui ne peuvent pas tre insrs ou supprims est gal ce paramtre, lopration de mise jour tout entire est annule et aucune mise jour nest effectue. Lappel suivant transforme le document XML Customers.xml en paquet delta et applique toutes les mises jour quel que soit le nombre derreurs :
StringList1.LoadFromFile(Customers.xml); nErrors := ApplyUpdates(StringList1.Text, CustXMLToInsert.xtr, -1);

26-12

Guide du dveloppeur

III
Partie III

Partie

Ecriture dapplications Internet

Les chapitres de cette section prsentent les concepts et les connaissances ncessaires la construction dapplications distribues sur Internet.
Remarque

Les composants dcrits dans cette section ne sont pas disponibles dans toutes les ditions de Delphi.

Ecriture dapplications Internet

27
Chapitre 27

Chapitre

Cration dapplications Internet

Les applications serveur Web tendent les fonctions et les possibilits des serveurs Web existants. Une application serveur Web reoit des messages de requte HTTP du serveur Web, effectue les actions demandes par les messages et formule des rponses qui sont renvoyes au serveur Web. Toute opration qui peut seffectuer dans une application Delphi peut tre incorpore dans une application serveur Web. Delphi propose deux architectures diffrentes pour dvelopper des applications serveur Web : lagent Web et WebSnap. Bien que ces deux architectures soient diffrentes, WebSnap et lagent Web ont de nombreux lments en commun. Larchitecture WebSnap se comporte comme un sur-ensemble de lagent Web. Elle propose des composants supplmentaires et de nouvelles caractristiques comme le concepteur de surface WebSnap (qui permet au dveloppeur dafficher le contenu dune page sans avoir excuter lapplication). Les applications dveloppes avec WebSnap peuvent contenir des composants agent Web alors que linverse nest pas vrai. Ce chapitre dcrit les caractristiques des architectures agent Web et WebSnap et donne des informations g nrales sur les applications client-serveur Internet.

A propos de lagent Web et de WebSnap


La premire tape de la conception dune application serveur Web consiste choisir larchitecture que vous souhaitez utiliser. Ces deux architectures ont de nombreuses caractristiques en commun : Gestion de plusieurs types dapplications serveur Web, dont ISAPI, NSAPI, CGI, Win CGI et Apache. Elles sont dcrites dans la section Types dapplications serveur Web la page 27-6. Gestion multithread permettant aux requ tes client entrantes dtre traites dans des threads distincts.

Cration dapplications Internet

27-1

A propos de lagent Web et de WebSnap

Mise en cache des modules Web afin dobtenir des meilleurs temps de rponse. Nanmoins, ces deux approches prsentent des avantages et inconvnients. Les principales diffrences entre ces deux technologies sont prsentes dans le tableau suivant :
Tableau 27.1 Agent Web
Compatibilit ascendante.

Comparaison de lagent Web et de WebSnap WebSnap


Mme si les applications WebSnap peuvent utiliser tous les composants agent Web produisant un contenu, les modules Web et le rpartiteur qui les contiennent sont nouveaux. Actuellement, WebSnap est disponible uniquement sous Windows. Plusieurs modules Web peuvent dcomposer lapplication en units, ce qui permet plusieurs dveloppeurs de travailler sur le mme projet en minimisant les conflits. Plusieurs rpartiteurs spcifiques peuvent traiter des types diffrents de requte. Gre tous les gnrateurs de contenu apparaissant dans des applications agent Web, plus dautres composants conus pour permettre la conception rapide de pages Web orientes donnes. Gestion des scripts ct serveur (JScript ou VBscript) ce qui permet de sparer la logique de gnration du HTML de la logique de m tier. Les pages nommes peuvent tre obtenues automatiquement par un rpartiteur de page et dsignes par des scripts ct serveur. Les sessions stockent les informations ncessaires pour un court moment sur un utilisateur final. Cela peut tre utilis pour des oprations comme la gestion de la connexion/ dconnexion. Les composants rpartiteur peuvent rpondre automatiquement diverses requtes. Le concepteur de surface WebSnap vous permet de concevoir visuellement les pages Web et de visualiser le rsultat la conception. La prvisualisation est disponible pour tous les composants.

Disponibles dans des applications multiplates-formes (CLX). Un seul module Web par application.

Un seul rpartiteur Web par application. Des composants spcialiss pour crer le contenu (gnrateurs de page, composants InternetExpress et les composants service Web). Pas de gestion des scripts.

Pas de gestion intgre des pages nomm es. Pas de gestion des sessions.

Chaque requte doit tre gre explicitement en utilisant un lment action ou un composant dauto-rpartition. Seuls des composants spcialiss permettent de prvisualiser le contenu quils gnrent. Lessentiel du dveloppement se fait de manire non visuelle.

Pour davantage dinformations sur lagent Web, voir chapitre 28, Utilisation de lagent Web. Pour davantage dinformations sur WebSnap, voir chapitre 29, Utilisation de WebSnap.

27-2

Guide du dveloppeur

Terminologie et standard

Terminologie et standard
La majorit des protocoles contrlant lactivit Internet sont dfinis dans des documents Request for Comment (RFC) grs par le comit IETF (Internet Engineering Task Force), comit charg de lingnierie et du dveloppement des protocoles Internet. Plusieurs documents RFC vous apporteront dutiles prcisions pour le dveloppement dapplications Internet : Le RFC822, Standard for the format of ARPA Internet text messages, dcrit la structure et le contenu des en-ttes de messages. Le RFC1521, MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies, dcrit la mthode utilise pour encapsuler et transporter des messages multiparties et multiformats. Le RFC1945, Hypertext Transfer Protocol HTTP/1.0, dcrit une mthode de transfert utilise pour distribuer des documents hypermdia collaboratifs. Le comit IETF propose une bibliothque des documents RFC sur le site Web www.ietf.cnri.reston.va.us

Composition dune URL (Uniform Resource Locator)


LURL est une description complte de lemplacement dune ressource sur Internet. Une URL se compose de plusieurs parties auxquelles une application peut accder. Ces diffrentes parties sont dcrites dans la figure suivante :
Figure 27.1 Composants dune URL

La premire partie (qui nappartient pas techniquement lURL) identifie le protocole (http). Cette partie peut spcifier dautres protocoles comme https (secure http), ftp, etc. La partie Hte identifie la machine qui excute le serveur Web et lapplication serveur Web. Bien que cela napparaisse pas dans lillustration prcdente, cette partie peut se substituer au port qui reoit les messages. Gnralement, il nest pas ncessaire de spcifier un port, car le protocole implique le numro de port. La partie Nom script spcifie le nom de lapplication serveur Web. Il sagit de lapplication laquelle le serveur Web transmet les messages. A la suite du nom de script apparat le chemin. Ce dernier identifie la destination du message dans lapplication serveur Web. Les valeurs du chemin peuvent faire rfrence des rpertoires de la machine hte, aux noms de composants qui rpondent des messages spcifiques ou tout autre mcanisme

Cration dapplications Internet

27-3

Activit dun serveur HTTP

utilis par lapplication serveur Web pour diviser le traitement des messages entrants. La partie Requte contient un ensemble de valeurs nommes. Ces valeurs et leurs noms sont dfinis par lapplication serveur Web.

URI et URL
LURL est un sous-ensemble dune URI (Uniform Resource Identifier) dfini dans le document RFC1945. Les applications serveur Web gnrent frquemment un contenu partir de plusieurs sources ; le rsultat final ne rside pas un emplacement prcis, mais est cr si ncessaire. Les URI peuvent dcrire des ressources nayant pas demplacement dfini.

En-tte de message de requte HTTP


Les messages de requte HTTP contiennent plusieurs en-ttes donnant des informations sur le client, la cible de la requte, la manire dont la requte doit tre traite et ce qui a t expdi avec la requte. Chaque en-tte est identifi par un nom, comme Host suivi dune valeur chane. Soit par exemple, la requte HTTP suivante :
GET /art/gallery.dll/animals?animal=dog&color=black HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/3.0b4Gold (WinNT; I) Host: www.TSite.com:1024 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

La premire ligne identifie la requte comme un GET. Un message de requ te GET demande lapplication serveur Web de renvoyer le contenu associ lURI suivant le mot GET (ici /art/gallery.dll/animals?animal=doc&color=black). La dernire partie de la premire ligne indique que le client utilise le standard HTTP 1.0. La deuxime ligne est len-tte Connection qui indique que la connexion ne doit pas tre ferme tant que la requte na pas t traite. La troisime ligne est len-tte User-Agent qui donne des informations sur le programme qui a gnr la demande. La ligne suivante dfinit len-tte Host et indique le nom et le port de lhte sur le serveur qui est contact pour constituer la connexion. La dernire ligne est un en-tte Accept qui numre les types de donnes que le client accepte en rponse.

Activit dun serveur HTTP


La nature client/serveur des navigateurs Web peut sembler, tort, simple implmenter. Pour la majorit des utilisateurs, la rcupration dinformations sur le Web est une procdure ne ncessitant que quelques clics de souris. Certains utilisateurs ont quelques notions de la syntaxe HTML et de la nature client/ serveur des protocoles utiliss. Ceci est gnralement suffisant pour la cration de sites Web simples en mode page. Les crateurs de pages Web plus complexes

27-4

Guide du dveloppeur

Activit dun serveur HTTP

ont accs de nombreuses options pour automatiser la recherche et la prsentation des informations au format HTML. Avant de construire une application serveur Web, il est utile de comprendre comment le client effectue une requte et comment le serveur y rpond.

Composition des requtes client


Lorsquun lien hypertexte HTML est slectionn (ou lorsque lutilisateur indique une URL), le navigateur lit les informations sur, entre autres, le protocole, le domaine spcifi, le chemin daccs aux informations, la date et lheure, lenvironnement systme et le navigateur lui-mme. Il compose ensuite une requte. Par exemple, pour afficher une page dimages base sur des critres reprsents par des boutons lcran, le client peut gnrer cette URL :
http://www.TSite.com/art/gallery.dll/animals?animal=dog&color=black

qui dcrit un serveur HTTP dans le domaine www.TSite.com. Le client contacte www.TSite.com, se connecte au serveur HTTP et lui transmet une requte. La requte est semblable celle-ci :
GET /art/gallery.dll/animals?animal=dog&color=black HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/3.0b4Gold (WinNT; I) Host: www.TSite.com:1024 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

Traitement des requtes client par le serveur


Le serveur Web reoit une requte du client et effectue diverses oprations en fonction de sa configuration. Si le serveur reconnat la partie /gallery.dll de la requte comme un programme, il transfre ce programme des informations sur la requte. La faon dont les informations sur la requ te sont passes au programme dpend du type dapplication serveur Web : Si le programme est un programme CGI (Common Gateway Interface), le serveur passe directement les informations contenues dans la requte au programme CGI. Le serveur attend lexcution du programme. Lorsque le programme CGI se termine, il retransmet le contenu au serveur. Si le programme est de type WinCGI, le serveur ouvre un fichier et y crit les informations de requte. Il excute ensuite le programme Win-CGI en lui transmettant lemplacement du fichier contenant la description de la demande du client et lemplacement du fichier que le programme Win-CGI doit utiliser pour crer le contenu. Le serveur attend lexcution du programme. Lorsque le programme se termine, le serveur lit le fichier de contenu cr par le programme Win-CGI. Si le programme est une DLL, le serveur la charge si ncessaire et passe les informations contenues dans la requte la DLL, sous forme de structure. Le

Cration dapplications Internet

27-5

Types dapplications serveur Web

serveur attend lexcution du programme. Lorsque la DLL se referme, elle retransmet le contenu au serveur. Dans ces trois cas, le programme agit sur la requte et effectue les actions demandes par le programmeur : accder aux bases de donnes, faire des recherches ou des calculs simples, crer ou slectionner des documents HTML, etc.

Rponses aux requtes client


Lorsquune application serveur Web a fini de traiter une requte client, elle construit une page de code HTML (ou autre contenu MIME) et la transmet au client (via le serveur) qui laffiche. La mthode retenue pour lenvoi de la rponse dpend aussi du type du programme : Lorsquun script Win-CGI se termine, il construit une page HTML, la place dans un fichier, stocke les informations de rponse dans un autre fichier et transmet lemplacement de ces deux fichiers au serveur. Le serveur ouvre ensuite ces fichiers et envoie la page HTML au client. Lorsquune DLL se termine, elle passe la page HTML et les informations de rponse au serveur, qui les transmet au client. Le fait de crer une application serveur Web en tant que DLL rduit la charge de travail du systme en diminuant le nombre de processus et daccs disque requis pour rpondre une requte.

Types dapplications serveur Web


Que vous utilisiez lagent Web ou WebSnap, vous pouvez crer cinq types dapplications serveur Web. De plus, vous pouvez crer un excutable dbogueur dapplication Web, qui intgre le serveur Web votre application afin de pouvoir dboguer la logique de lapplication. Lexcutable dbogueur dapplication Web ne sert quau dbogage. Lors du dploiement de votre application, vous devez la faire migrer vers lun des cinq autres types. Chacun des cinq types dapplication serveur Web utilise un type particulier de descendant de TWebApplication, TWebRequest et de TWebResponse :
Tableau 27.2 Composants des applications serveur Web Objet application
TISAPIApplication TISAPIApplication TCGIApplication TCGIApplication

Type dapplication
DLL Microsoft Server (ISAPI) DLL Netscape Server (NSAPI) DLL Serveur Apache Application console CGI Application Windows CGI

Objet requte
TISAPIRequest TISAPIRequest TCGIRequest TWinCGIRequest

Objet rponse
TISAPIResponse TISAPIResponse TApacheResponse TCGIResponse TWinCGIResponse

TApacheApplication TApacheRequest

27-6

Guide du dveloppeur

Dbogage dapplications serveur

ISAPI et NSAPI
Une application serveur Web ISAPI ou NSAPI est une DLL qui est charge par le serveur Web. Les informations de requte client sont transmises la DLL sous forme de structure et values par les objets TISAPIApplication, qui crent les objets TISAPIRequest et TISAPIResponse. Chaque message de requte est automatiquement trait dans un thread dexcution distinct.

Apache
Une application serveur Web Apache est une DLL qui est charge par le serveur Web. Les informations de requte client sont transmises la DLL sous forme de structure et values par les objets TApacheApplication, qui crent les objets TApacheRequest et TApacheResponse. Chaque message de requte est automatiquement trait dans un thread distinct.

CGI autonome
Une application serveur Web CGI autonome est une application console qui reoit les informations de requte client sur lentre standard et transmet les rsultats au serveur sur la sortie standard. Les donnes sont valu es par lobjet TCGIApplication, qui cre le rpartiteur, et par les objets TCGIRequest et TCGIResponse. Chaque message de requte est trait dans une instance distincte de lapplication.

Win-CGI autonome
Une application serveur Web Win-CGI autonome est une application Windows qui reoit les informations de requte client depuis un fichier de configuration (INI) cr par le serveur et crit les rsultats dans un fichier que le serveur transmet au client. Le fichier INI est valu par lobjet TCGIApplication, qui cre le rpartiteur, et par les objets TWinCGIRequest et TWinCGIResponse. Chaque message de requte est trait dans une instance distincte de lapplication.

Dbogage dapplications serveur


Le dbogage des applications serveur Web prsente des problmes spcifiques car lexcution de ces applications est influence par les messages quelles reoivent du serveur Web. Lancer votre application depuis lEDI nest pas suffisant, car cela ne tiendrait pas compte du serveur Web et votre application ne trouverait pas les messages de requtes quelle attend. Les sections suivantes dcrivent les techniques utilisables pour dboguer des applications serveur Web .

Cration dapplications Internet

27-7

Dbogage dapplications serveur

Utilisation du dbogueur dapplication Web


Le dbogueur dapplication Web permet de suivre simplement les requtes et rponses HTTP ainsi que les temps de rponse. Le dbogueur dapplication Web se substitue au serveur Web. Une fois lapplication dbogue, vous pouvez la convertir en lun des types dapplication Web support et linstaller sur un serveur Web commercial. Pour utiliser le dbogueur dapplication Web, vous devez commencer par crer votre application Web comme excutable dbogueur dapplication Web. Que vous utilisiez lagent Web ou WebSnap, lexpert qui cre votre application serveur Web le propose comme option lors du dmarrage de lapplication. Cela cre une application serveur Web qui est galement un serveur COM. Pour davantage dinformations sur la conception dapplications serveur Web en utilisant lagent Web, voir chapitre 28, Utilisation de lagent Web. Pour davantage dinformations sur lutilisation de WebSnap, voir chapitre 29, Utilisation de WebSnap.

Dmarrage de lapplication avec le dbogueur dapplication Web


Une fois votre application serveur Web conue, vous pouvez lexcuter et la dboguer de la manire suivante :

1 Votre projet tant ouvert dans lEDI, dfinissez les points darrt comme pour dboguer nimporte quel excutable. 2 Choisissez Excuter|Excuter. Cela affiche la fentre console du serveur COM qui constitue votre application serveur Web. A la premire excution de votre application, elle recense le serveur COM afin que le dbogueur dapplication Web puisse y accder. 3 Slectionnez Outils|Dbogueur dapplication Web. 4 Choisissez le bouton D marrer. Cela affiche la page ServerInfo dans votre navigateur par dfaut. 5 La page ServerInfo propose une liste droulante de tous les excutables dbogueur dapplication Web recenss. Slectionnez votre application dans la liste droulante. Si vous ne la trouvez pas dans la liste droulante, essayez de dmarrer votre application comme excutable. Votre application doit tre excute au moins une fois pour se recenser. Si vous ne trouvez toujours pas votre application dans la liste droulante, essayez de ractualiser la page Web (en effet, parfois le navigateur Web cache cette page, ce qui empche de voir les modifications rcentes). 6 Une fois votre application slectionne dans la liste droulante, choisissez le bouton de dmarrage. Cela dmarre votre application dans le dbogueur dapplication Web, qui vous donne des dtails sur les messages de requte et de rponse changs entre votre application et le dbogueur dapplication Web.

27-8

Guide du dveloppeur

Dbogage dapplications serveur

Conversion de votre application vers un autre type dapplication serveur Web


Une fois achev la mise au point de votre application serveur Web, vous devez la convertir vers un autre type dapplication Web avant de pouvoir linstaller dans un serveur Web commercial. Les tapes suivantes dcrivent la manire deffectuer cette conversion :

1 Dans lEDI choisissez Projet|Ajouter un nouveau projet. Cela ouvre un nouveau projet sans fermer le projet en cours (votre application serveur Web). 2 Excutez lexpert permettant de crer une application agent Web ou WebSnap et choisissez le type dapplication crer. 3 Choisissez Voir|Gestionnaire de projet pour afficher le gestionnaire de projet. 4 Dans le gestionnaire de projet, faites glisser toutes les units constituant votre application serveur Web de lancien projet vers celui que vous venez dajouter. Ne dplacez pas les units qui implmentent la fentre console.
Vous disposez maintenant dune application serveur Web du type appropri.

Dbogage dapplications Web sous forme de DLL


Les applications ISAPI, NSAPI et Apache sont en fait des DLL qui contiennent des points dentre prdfinis. Le serveur Web passe les messages de requte lapplication en faisant des appels ces points dentre. Comme ces applications sont des DLL, vous devrez dfinir les paramtres dexcution de votre application de telle faon quelle lance le serveur. Pour configurer les paramtres dexcution de votre application, choisissez Excuter|Paramtres et initialisez les zones Application hte et Paramtres dexcution pour spcifier lexcutable du serveur Web et les ventuels paramtres ncessaires son excution. Pour davantage dinformations sur ces valeurs, consultez la documentation de votre serveur Web.
Remarque

Certains serveurs Web ncessitent dautres modifications pour que vous ayez le droit de lancer lapplication hte de cette manire. Pour davantage dinformations, consultez la documentation de votre serveur Web. Si vous utilisez Windows 2000 avec IIS 5, vous trouverez des dtails sur toutes les modifications ncessaires pour configurer correctement vos droits ladresse suivante : http://community.borland.com/article/0,1410,23024,00.html Une fois renseignes les zones Application hte et Paramtres dexcution, vous pouvez dfinir vos points darrt afin que lorsque le serveur passe un message de requte votre DLL, un point darrt soit activ et que vous puissiez effectuer le dbogage normalement.

Astuce

Remarque

Avant de lancer le serveur Web avec les paramtres dexcution de votre application, vrifiez qu il nest pas dj ouvert.

Cration dapplications Internet

27-9

Dbogage dapplications serveur

Dbogage sous Windows NT


Sous Windows NT, vous devez avoir certains droits dutilisateur pour pouvoir dboguer une DLL. Dans le gestionnaire des utilisateurs, ajoutez votre nom aux listes accordant les droits pour : Ouvrir une session en tant que service Agir en tant que composante du systme dexploitation Gnrer des audits de scurit

Dbogage sous Windows 2000


Sous Windows 2000, vous accordez les mme droits de la manire suivante :

1 Dans la zones Outils dadministration du panneau de configuration, choisissez Stratgie de scurit locale. Dveloppez Stratgies locales et slectionnez Attribution des droits utilisateur. Dans le volet de droite, double-cliquez sur Agir en tant que partie du systme dexploitation. 2 Slectionnez Ajouter pour ajouter un utilisateur la liste, ajoutez votre compte utilisateur en cours. 3 Redmarrez pour que les modifications prennent effet.

27-10

Guide du dveloppeur

28
Chapitre 28

Chapitre

Utilisation de lagent Web

Les composants agent Web (placs dans longlet Internet de la palette des composants) vous permettent de crer des gestionnaires dvnements qui sont associs une URL spcifique. Une fois le traitement achev, il est possible de construire par programme des documents HTML ou XML et de les transfrer au client. Vous pouvez utiliser les composants agent Web pour le dveloppement dapplications multiplates-formes. Souvent, le contenu des pages Web provient de bases de donnes. Vous pouvez utiliser des composants Internet pour grer automatiquement les connexions aux bases de donnes, en permettant une seule DLL de grer simultanment plusieurs connexions de bases de donnes adaptes aux threads. Les sections suivantes de ce chapitre expliquent comment utiliser les composants agent Web pour crer une application serveur Web.

Cration dapplications serveur Web avec lagent Web


Pour crer une nouvelle application serveur Web en utilisant larchitecture agent Web :

1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, choisissez longlet Nouveau et slectionnez Application serveur Web. 3 Dans la bote de dialogue qui saffiche, vous pouvez slectionner un type dapplication serveur Web :
ISAPI et NSAPI : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web. Len-tte de la bibliothque est galement inclus dans le fichier projet et les entres ncessaires dans les listes des clauses uses et exports du fichier projet.

Utilisation de lagent Web

28-1

Cration dapplications serveur Web avec lagent Web

Apache : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web Apache. Len-tte de la bibliothque est galement inclus dans le fichier projet et les entres ncessaires dans les listes des clauses uses et exports du fichier projet. Excutable autonome CGI : la slection de ce type dapplication configure votre projet comme une application en mode console et ajoute les entres ncessaires la clause uses du fichier projet. Excutable autonome Win-CGI : si vous slectionnez ce type dapplication, le projet est configur comme une application Windows et ajoute les entres ncessaires la clause uses du fichier projet. Excutable dbogueur dapplication Web : la slection de ce type dapplication configure un environnement permettant de dvelopper et de tester des applications serveur Web. Ce type dapplication nest pas conu pour tre dploy. Choisissez le type dapplication serveur Web qui communique avec le type de serveur Web que votre application utilisera. Ceci cre un nouveau projet configur pour utiliser les composants Internet et contenant un module Web vide.

Module Web
Le module Web (TWebModule) est un descendant de TDataModule ; il sutilise de la mme faon pour offrir un contrle centralis pour les rgles de gestion et les composants non visuels dans lapplication Web. Ajoutez tout gnrateur de contenu que votre application utilise pour gnrer les messages de rponse. Il peut sagir de gnrateurs de contenu intgrs, tels que TPageProducer, TDataSetPageProducer, TDataSetTableProducer, TQueryTableProducer et TInetXPageProducer ou de descendants de TCustomContentProducer que vous avez crs vous-mme. Si votre application gnre des messages de rponse incluant des donnes extraites dune base de donnes, vous pouvez ajouter des composants daccs aux donnes ou des composants particuliers pour crire un serveur Web qui fait office de client dans une application de bases de donnes multiniveaux. Le module Web ne se contente pas de stocker les composants non visuels et des rgles de gestion : il fait aussi office de rpartiteur en associant les messages de requte HTTP reus aux lments daction qui gnrent les rponses ces requtes. Vous avez peut-tre dj un module de donnes paramtr avec les composants non visuels et les rgles de gestion que vous souhaitez utiliser dans votre application Web. Vous pouvez alors remplacer le module Web par ce module de donnes : il suffit de supprimer le module Web gnr automatiquement et de le remplacer par votre module de donnes. Ajoutez ensuite un composant TWebDispatcher votre module de donnes pour quil puisse rpartir les messages de requte vers les lments daction, comme le ferait un module Web.

28-2

Guide du dveloppeur

Structure dune application agent Web

Si vous voulez modifier la faon dont les lments daction sont choisis pour rpondre aux messages de requte HTTP reus, drivez un nouveau composant rpartiteur de TCustomWebDispatcher et ajoutez-le au module de donnes. Votre projet ne peut contenir quun rpartiteur. Il peut sagir soit du module Web automatiquement gnr lorsque vous crez le projet, soit du composant TWebDispatcher que vous ajoutez au module de donnes qui remplace le module Web. Si un second module de donnes contenant un rpartiteur est cr lors de lexcution, lapplication serveur Web gnrera une erreur.
Remarque

Le module Web que vous paramtrez en phase de conception est en fait un modle. Dans les applications ISAPI et NSAPI, chaque message de requ te cre un thread distinct. Une instance du module Web et de son contenu est cre dynamiquement pour chaque thread. Le module Web dune application serveur Web base de DLL est mis en mmoire cache pour une utilisation ultrieure afin damliorer les temps de rponse. Ltat du rpartiteur et sa liste dactions ne sont pas rinitialiss entre deux requtes. Si vous activez ou dsactivez des lments daction en cours dexcution, vous obtiendrez des rsultats imprvisibles lorsque ce module sera utilis pour les requtes client suivantes.

Attention

Objet application Web


Le projet prpar pour votre application Web contient une variable globale du nom de Application. Application est un descendant de TWebApplication (soit TISAPIApplication, soit TCGIApplication) appropri pour le type dapplication que vous crez. Il sexcute en rponse aux messages de requte HTTP reus par le serveur Web.
Attention

Nincluez pas lunit forms dans la clause uses du projet aprs lunit CGIApp ou ISAPIApp. Forms dclare en effet une autre variable globale du nom dApplication et, si elle apparat aprs lunit CGIApp ou ISAPIApp, Application sera initialise comme un objet de type erron.

Structure dune application agent Web


Lorsque lapplication Web reoit un message de requte HTTP, elle cre un objet TWebRequest pour reprsenter le message de requte HTTP et un objet TWebResponse pour reprsenter la rponse qui doit tre retourne. Lapplication transmet ensuite ces objets au rpartiteur Web (le module Web ou un composant TWebDispatcher). Le rpartiteur Web contrle le droulement de lapplication serveur Web. Il gre un ensemble dlments daction (TWebActionItem) qui sait comment ragir certains messages de requte HTTP. Le rpartiteur identifie les lments daction ou les composants rpartition automatique aptes rpondre au message de requte HTTP et transmet les objets requte et rponse au gestionnaire identifi pour quil lance les oprations demandes ou formule un message de rponse.

Utilisation de lagent Web

28-3

Rpartiteur Web

Le rpartiteur est dcrit plus en dtail dans la section Rpartiteur Web la page 28-4.
Figure 28.1 Structure dune application serveur

Les lments daction grent la lecture de la requte et lassemblage dun message de rponseLes composants gnrateur de contenu spcialiss aident les lments daction gnrer dynamiquement le contenu des rponses de messagepouvant inclure du code HTML personnalis ou un autre contenu MIME. Les gnrateurs de contenu se servent dautres gnrateurs de contenu ou descendants de THTMLTagAttributes, pour crer le contenu du message de rponse. Pour plus dinformations sur les gnrateurs de contenu, voir Gnration du contenu des messages de rponse la page 28-14. Si vous crez le client Web dans une application de base de donnes multiniveau, votre application serveur Web peut inclure dautres composants rpartition automatique qui reprsentent des informations de bases de donnes codes en XML et des classes de manipulation de base de donnes codes en javascript. Si vous crez un serveur qui implmente un service Web, votre application serveur Web peut contenir un composant dauto-rpartition qui transmet les messages utilisant le protocole SOAP un excutant qui les interprte et les excute. Le rpartiteur fait appel ces composants rpartition automatique pour traiter le message de requte aprs avoir essay tous ses lments daction. Lorsque tous les lments daction (ou composants rpartition automatique) ont cr leur rponse en remplissant lobjet TWebResponse, le rpartiteur transmet le rsultat lapplication Web qui le transmet en retour au client via le serveur Web.

Rpartiteur Web
Si vous utilisez un module Web, il agit comme un rpartiteur Web. Si vous utilisez un module de donnes existant, vous devez lui ajouter un composant (TWebDispatcher). Le rpartiteur gre un ensemble dlments daction qui savent

28-4

Guide du dveloppeur

Rpartiteur Web

comment rpondre certains types de messages de requte. Lorsque lapplication Web transmet un objet requte et un objet rponse au rpartiteur, il choisit un ou plusieurs lments daction pour rpondre la requte.

Ajout dactions au rpartiteur


Ouvrez lditeur daction depuis linspecteur dobjets en cliquant sur les points de suspension de la proprit Actions du rpartiteur. Il est possible dajouter des lments daction au rpartiteur en cliquant sur le bouton Ajouter dans lditeur daction. Ajoutez des actions au rpartiteur pour rpondre aux diffrentes mthodes de requte ou URI de destination. Vous pouvez paramtrer vos lments daction de diverses faons. Vous pouvez commencer par les lments daction qui font un prtraitement des requtes et terminer par une action par dfaut qui vrifie que la rponse est complte et lenvoie ou retourne un code derreur. Vous pouvez aussi ajouter un lment daction pour chaque type de requte, auquel cas chaque lment daction traitera entirement la requte. Les lments daction sont dcrits en dtail la section Elments daction la page 28-6.

Rpartition des messages de requte


Lorsque le rpartiteur reoit la requte client, il gnre un vnement BeforeDispatch. Ceci permet votre application de faire un prtraitement du message de requte avant quil ne soit vu par les lments daction. Ensuite, le rpartiteur recherche dans sa liste dlments daction un lment qui corresponde la partie chemin de lURL de destination du message de requte et sachant fournir le service spcifi comme mthode du message de requte. Pour ce faire, il compare les proprits PathInfo et MethodType de lobjet TWebRequest avec ces mmes proprits dans llment daction. Lorsque le rpartiteur trouve llment daction recherch, il dclenche cet lment daction, qui effectue lune des oprations suivantes : Il fournit le contenu de la rponse et envoie la rponse ou signale que la requte est compltement traite. Il ajoute des informations la rponse puis permet dautres lments daction de finir le travail. Il transmet la requte dautres lments daction. Aprs avoir vrifi tous ses lments daction, si le message nest pas trait, le rpartiteur vrifie tous les composants rpartition automatique spcialement recenss nutilisant pas dlment daction. Ces composants sont propres aux applications de bases de donnes multiniveaux, dcrites dans la section Construction des applications Web avec InternetExpress la page 25-38.

Utilisation de lagent Web

28-5

Elments daction

Si, aprs contrle de tous les lments daction et des composants rpartition automatique spcialement recenss, le message de requte nest pas trait, le rpartiteur appelle llment daction par dfaut. Il nest pas ncessaire que cet lment daction corresponde lURL de destination ou la mthode de requte. Si le rpartiteur atteint la fin de la liste dactions (y compris lventuelle action par dfaut) et quaucune action na t dclenche, rien nest retourn au serveur. Le serveur met alors fin la connexion avec le client. Si la requ te est traite par les lments daction, le rpartiteur gnre un vnement AfterDispatch. Ceci reprsente la dernire possibilit pour votre application de vrifier que la rponse a t gnre et de faire les modifications requises.

Elments daction
Chaque lment daction (TWebActionItem) effectue une tche prcise en rponse un type spcifique de message de requte. Les lments daction peuvent rpondre entirement une requte ou ny rpondre que partiellement et laisser dautres lments daction finir le travail. Les lments daction peuvent envoyer le message de rponse HTTP pour la requte, ou simplement prparer une partie de la rponse, que dautres lments daction termineront. Si une rponse est complte par les lments daction mais non envoye, lapplication serveur Web envoie le message de rponse.

Choix du dclenchement des lments daction


La plupart des proprits dun lment daction indiquent le moment auquel le rpartiteur doit le slectionner pour grer un message de requte HTTP. Pour dfinir les proprits dun lment daction, vous devez dabord ouvrir lditeur daction : slectionnez la proprit Actions du rpartiteur dans linspecteur dobjets et cliquez sur les points de suspension. Lorsquune action est slectionne dans lditeur, ses proprits peuvent tre modifies dans linspecteur dobjets.

URL de destination
Le rpartiteur compare la valeur de la proprit PathInfo dun lment daction celle de la proprit PathInfo du message de requte. La valeur de cette proprit doit tre le chemin daccs lURL pour toutes les requtes que llment daction est prt grer. Par exemple dans cette URL
http://www.TSite.com/art/gallery.dll/mammals?animal=dog&color=black

si la partie /gallery.dll indique lapplication serveur Web, le chemin daccs est


/mammals

28-6

Guide du dveloppeur

Elments daction

Utilisez les informations de chemin daccs pour indiquer o votre application Web doit rechercher des informations au moment de traiter des requtes ou pour subdiviser votre serveur Web en sous-services logiques.

Type de mthode de requte


La proprit MethodType dun lment daction indique quels types de messages de requte il peut traiter. Le rpartiteur compare la proprit MethodType dun lment daction la proprit MethodType du message de requ te. MethodType peut avoir les valeurs suivantes :
Tableau 28.1 Valeur
mtGet mtHead mtPost mtPut mtAny

Valeurs de MethodType Signification


La requte demande que les informations associes lURI de destination soient retournes dans un message de rponse. La requte demande les proprits den-tte dune rponse, comme dans le cas du traitement dune requte mtGet, mais omet le contenu de la rponse. La requte fournit les informations mettre dans lapplication Web. La requte demande que la ressource associe lURI de destination soit remplace par le contenu du message de requte. Llment daction correspond tout type de mthode de requte, y compris mtGet, mtHead, mtPut et mtPost.

Activation et dsactivation des lments daction


Chaque lment daction possde une proprit Enabled qui permet de lactiver et de le dsactiver. En mettant Enabled False, vous dsactivez llment daction, qui nest plus pris en compte par le rpartiteur lors de la recherche dun lment daction capable de grer une requ te. Un gestionnaire dvnement BeforeDispatch peut dfinir quels lments daction doivent traiter une requte en modifiant la proprit Enabled des lments daction avant que le rpartiteur ne commence sa recherche.
Attention

Si vous modifiez la proprit Enabled dune action lors de lexcution, vous risquez dobtenir des rsultats imprvisibles pour les requtes suivantes. Si lapplication serveur Web est une DLL qui met en cache les modules Web, ltat initial ne sera pas rinitialis pour la requte suivante. Utilisez lvnement BeforeDispatch pour vous assurer que tous les lments daction sont correctement initialiss.

Choix dun lment daction par dfaut


Un seul lment daction peut tre llment daction par dfaut. Llment daction par dfaut est choisi en mettant sa proprit Default True. Lorsque vous mettez la proprit Default dun lment daction True, la proprit Default du prcdent lment daction par dfaut (sil en existait un) passe False. Lorsque le rpartiteur recherche dans sa liste dlments daction celui qui peut grer la requ te, il conserve en mmoire le nom de llment daction par dfaut.

Utilisation de lagent Web

28-7

Elments daction

Si la requ te na pas t entirement honore lorsque le rpartiteur atteint la fin de la liste dlments daction, il excute llment daction par dfaut. Le rpartiteur ne vrifie pas les proprits PathInfo et MethodType de llment daction par dfaut. Il ne vrifie pas non plus la proprit Enabled de llment daction par dfaut. Vous pouvez ainsi vous assurer que llment daction par dfaut nest appel qu en dernier recours en mettant sa proprit Enabled False. Llment daction par dfaut doit tre prt grer toute requte dtecte, mme si ce nest quen retournant un code derreur signalant une URI ou une valeur de proprit MethodType non valide. Si llment daction par dfaut ne peut pas traiter la requ te, aucune rponse nest transmise au client Web.
Attention

Si vous modifiez la proprit Default dune action lors de lexcution, vous risquez dobtenir des rsultats imprvisibles pour la requte active. Si la proprit Default dune action ayant dj t dclenche passe True, cette action ne sera pas rvalue et le rpartiteur ne la dclenchera pas lorsqu il atteindra la fin de la liste dactions.

Rponse aux messages de requte avec des lments daction


Le plus gros du travail de lapplication serveur Web est effectu par les lments daction lors de leur excution. Lorsque le rpartiteur Web dclenche un lment daction, ce dernier peut rpondre au message de requte en cours de deux manires : Si un composant gnrateur est associ llment daction comme valeur de sa proprit Producer, ce gnrateur affecte automatiquement le contenu (Content) du message de rponse laide de sa mthode Content. La page Internet de la palette de composants inclut une srie de composants gnrateur de contenu qui permettent dlaborer une page HTML pour le contenu du message de rponse. Une fois que le gnrateur a affect un contenu de rponse (si un gnrateur est associ), llment daction reoit un vnement OnAction. Le gestionnaire dvnement OnAction reoit lobjet TWebRequest qui reprsente le message de requte HTTP et un objet TWebResponse permettant de remplir les informations de rponse. Si le contenu de llment daction peut tre gnr par un seul gnrateur de contenu, il est plus simple daffecter le gnrateur de contenu comme valeur de la proprit Producer de llment daction. Toutefois, tout gnrateur de contenu demeure accessible partir du gestionnaire dvnement OnAction. Le gestionnaire dvnement OnAction offre une souplesse supplmentaire, qui vous permet dutiliser plusieurs gnrateurs de contenu, daffecter des proprits de message de rponse, etc. Le composant gnrateur de contenu et le gestionnaire dvnement OnAction peuvent utiliser tous les objets et toutes les mthodes de bibliothque dexcution pour rpondre aux messages de requte. Ils peuvent accder des bases de donnes, faire des calculs, construire ou slectionner des documents HTML, etc. Pour plus dinformations sur la gnration de contenu de rponse laide de

28-8

Guide du dveloppeur

Accs aux informations de requtes client

composants gnrateur de contenu, voir Gnration du contenu des messages de rponse la page 28-14.

Envoi de la rponse
Un gestionnaire dvnement OnAction peut renvoyer la rponse au client Web laide des mthodes de lobjet TWebResponse. Cependant, si aucun lment daction nenvoie la rponse au client, elle sera envoye par lapplication serveur Web si le dernier lment daction ayant analys la requte indique que la requte a t traite.

Utilisation de plusieurs lments daction


Vous pouvez rpondre une requte depuis un seul lment daction ou rpartir le travail entre plusieurs lments daction. Si llment daction nlabore pas compltement le message de rponse, il doit indiquer cet tat dans le gestionnaire dvment OnAction en mettant le paramtre Handled False. Si de nombreux lments daction se partagent la tche de rpondre aux messages de requte et que chacun met Handled False, pensez vrifier que llment daction par dfaut laisse le paramtre Handled True, faute de quoi aucune rponse ne serait envoye au client Web. Lorsque plusieurs lments daction se partagent la gestion du message de requte, il faut que le gestionnaire dvnement OnAction de llment daction par dfaut ou que le gestionnaire dvnement AfterDispatch du rpartiteur vrifie que toutes les tches ont bien t effectues. Si ce nest pas le cas, il devra dfinir le code derreur adquat.

Accs aux informations de requtes client


Lorsquun message de requte HTTP est reu par lapplication serveur Web, les en-ttes de la requte client sont chargs dans les proprits dun objet TWebRequest. Dans les applications NSAPI et ISAPI, le message de requ te est encapsul par un objet TISAPIRequest. Les applications Console CGI utilisent les objets TCGIRequest, alors que les applications Windows CGI utilisent les objets TWinCGIRequest. Les proprits de lobjet requte sont en lecture seule. Vous pouvez les utiliser pour recueillir toutes les informations disponibles dans la requte client.

Proprits contenant des informations den-tte de requte


La plupart des proprits dun objet requte contiennent des informations sur la requte provenant de len-tte de requte HTTP. Toutes les requ tes, cependant, ne fournissent pas une valeur pour toutes les proprits. De plus, certaines requtes peuvent inclure des champs den-tte qui napparaissent pas dans une proprit de lobjet requte, car le standard HTTP est en volution permanente. Pour obtenir la valeur dun champ den-tte de requte qui napparat pas

Utilisation de lagent Web

28-9

Accs aux informations de requtes client

comme lune des proprits de lobjet requte, utilisez la mthode GetFieldByName.

Proprits identifiant la destination


La destination complte du message de requte est fournie par la proprit URL. En rgle gnrale, il sagit dune URL qui peut se dcomposer en un protocole (HTTP), un Host (systme serveur), un ScriptName (application serveur), un PathInfo (emplacement sur lhte) et un Query. Chacune de ces parties est reflte dans sa propre proprit. Le protocole est toujours HTTP, Host et ScriptName identifient lapplication serveur Web. Le rpartiteur utilise la partie PathInfo lorsquil associe des lments daction aux messages de requte. La partie Query est utilise par certaines requtes pour spcifier des dtails sur les informations demandes. Sa valeur est elle aussi analyse pour vous dans la proprit QueryFields.

Proprits dcrivant le client Web


La requte inclut en outre plusieurs proprits qui fournissent des informations sur son origine. Il peut sagir de ladresse e-mail de lexpditeur (proprit From) ou de lURI dorigine du message (proprit Referer ou RemoteHost). Si la requte a un contenu et que ce contenu ne provient pas du mme URI que la requte, la source de ce contenu est indique par la proprit DerivedFrom. Vous pouvez galement connatre ladresse IP du client (proprit RemoteAddr) et le nom et la version de lapplication ayant envoy la requte (proprit UserAgent ).

Proprits identifiant le but de la requte


La proprit Method est une chane dcrivant ce que le message de requte demande lapplication serveur. Le standard HTTP 1.1 dfinit les mthodes suivantes :
Valeur
OPTIONS GET HEAD POST PUT DELETE TRACE

Informations demandes
Informations sur les options de communication disponibles. Informations identifies par la proprit URL. Informations den-tte issues dun message GET quivalent, sans le contenu de la rponse. Lapplication serveur doit mettre les donnes incluses dans la proprit Content, de la faon approprie. Lapplication serveur doit remplacer la ressource indique par la proprit URL par les donnes de la proprit Content. Lapplication serveur doit supprimer ou masquer la ressource identifie par la proprit URL. Lapplication serveur doit confirmer la rception de la requte.

La proprit Method peut indiquer toute autre mthode que le client Web demande au serveur.

28-10

Guide du dveloppeur

Cration de messages de rponse HTTP

Il nest pas ncessaire que lapplication serveur Web fournisse une rponse pour toutes les valeurs possibles de la proprit Method. Le standard HTTP exige cependant quelle sache rpondre aux requtes GET et HEAD. La proprit MethodType indique si la valeur de Method est GET (mtGet), HEAD (mtHead), POST (mtPost), PUT (mtPut) ou une autre chane (mtAny). Le rpartiteur fait correspondre la valeur de la proprit MethodType avec celle de la proprit MethodType de tous les lments daction.

Proprits dcrivant la rponse attendue


La proprit Accept indique les types de support que le client Web accepte comme contenu du message de rponse. La proprit IfModifiedSince indique si le client ne souhaite que les informations modifies rcemment. La proprit Cookie inclut des informations dtat (gnralement ajoutes par lapplication) qui peuvent modifier la rponse.

Proprits dcrivant le contenu


La plupart des requtes nincluent aucun contenu car elles ne font que demander des informations. Certaines requtes, cependant, telles que les requtes POST, fournissent un contenu que lapplication serveur Web doit utiliser. Le type de support du contenu est prcis dans la proprit ContentType et sa longueur lest dans la proprit ContentLength. Si le contenu du message a t cod (par compression des donnes, par exemple), cette information figure dans la proprit ContentEncoding. Le nom et le numro de version de lapplication ayant gnr le contenu sont indiqus dans la proprit ContentVersion. La proprit Title fournit elle aussi, parfois, des renseignements sur le contenu.

Contenu dun message de requte HTTP


En plus des champs den-tte, certains messages de requte incluent une partie contenu que lapplication serveur Web doit traiter. Par exemple, une requte POST peut comporter des informations qui doivent tre ajoutes une base de donnes gre par lapplication serveur Web. La valeur non traite du contenu est fournie par la proprit Content. Si le contenu peut tre rparti dans des champs spars par le caractre &, cette version sera disponible dans la proprit ContentFields.

Cration de messages de rponse HTTP


Lorsque lapplication serveur Web cre un objet TWebRequest pour un message de requ te HTTP reu, elle cre aussi un objet TWebResponse correspondant pour reprsenter le message de rponse qui sera envoy en retour. Dans les applications NSAPI et ISAPI, le message de rponse est encapsul par un objet TISAPIResponse. Les applications GCI Console utilisent les objets TCGIResponse et les applications Windows CGI utilisent les objets TWinCGIResponse.

Utilisation de lagent Web

28-11

Cration de messages de rponse HTTP

Les lments daction qui gnrent la rponse la requte client renseignent les proprits de lobjet rponse. Dans certains cas, il suffit de retourner un code derreur ou de passer la requte une autre URI. Mais dans dautres cas, il faut parfois effectuer des calculs tels que llment daction doit aller chercher des informations dautres sources puis les regrouper avant de les prsenter au format final. La plupart des messages de requte ncessitent une rponse, mme sil ne sagit que dindiquer au client que lopration demande a t effectue.

Informations den-tte de rponse


La plupart des proprits de lobjet TWebResponse reprsentent les informations den-tte du message de rponse HTTP retourn au client Web. Un lment daction dfinit ces proprits partir de son gestionnaire dvnement OnAction. Il nest pas ncessaire que tous les messages de rponse contiennent une valeur pour toutes les proprits de len-tte. Les proprits qui doivent tre renseignes dpendent de la nature de la requte et du statut de la rponse.

Indication du statut de la rponse


Tout message de rponse doit inclure un code indiquant le statut de la rponse. Vous pouvez spcifier ce code en dfinissant la proprit StatusCode. Le standard HTTP dfinit des codes de statut la signification prdfinie. De plus, vous pouvez dfinir vos propres codes de statut avec les valeurs possibles inutilises. Un code de statut est un numro trois chiffres dans lequel le chiffre le plus significatif indique la classe de la rponse, de la faon suivante : 1xx : Information (la requte a t reue mais na pas t entirement traite). 2xx : Succs (la requte a t reue, comprise et accepte). 3xx : Redirection (le client doit intervenir pour complter la requte). 4xx : Erreur du client (la requte est incomprhensible ou ne peut tre traite). 5xx : Erreur du serveur (la requ te est valide mais le serveur na pas pu la traiter). Une chane est associe chaque code de statut ; elle donne la signification de ce code de statut. Elle se trouve dans la proprit ReasonString. Pour les codes de statut prdfinis, il nest pas ncessaire de dfinir la proprit ReasonString. Si vous crez vos propres codes de statut, cependant, pensez dfinir la proprit ReasonString.

Indication dattente dune action du client


Lorsque le code de statut est compris entre 300 et 399, le client doit lancer une action pour que lapplication serveur Web puisse traiter la requte en entier. Si vous devez rediriger le client vers une autre URI, ou indiquer quune nouvelle URI a t cre pour traiter cette requte, utilisez la proprit Location. Si le client doit fournir un mot de passe pour poursuivre, dfinissez la proprit WWWAuthenticate.

28-12

Guide du dveloppeur

Cration de messages de rponse HTTP

Description de lapplication serveur


Certaines proprits den-tte de rponse dcrivent les capacits de lapplication serveur Web. La proprit Allow indique les mthodes auxquelles elle peut rpondre. La proprit Server contient le nom et la version de lapplication servant gnrer la rponse. La proprit Cookies peut contenir des informations dtat concernant lutilisation par le client de lapplication serveur qui sont incluses dans les messages de requte ultrieurs.

Description du contenu
Plusieurs proprits dcrivent le contenu de la rponse. ContentType fournit le type de support de la rponse, ContentVersion le numro de version de ce support. ContentLength indique la longueur de la rponse. Si le contenu est cod (par compression des donnes, par exemple), indiquez-le dans la proprit ContentEncoding. Si le contenu provient dune autre URI, indiquez-le dans la proprit DerivedFrom. Si la valeur du contenu tient compte de la date, utilisez les proprits LastModified et Expires pour indiquer si le contenu est toujours valide. La proprit Title peut fournir des informations descriptives sur le contenu.

Dfinition du contenu de la rponse


Dans certains cas, la rponse au message de requte est entirement contenue dans les proprits den-tte de la rponse. La plupart du temps, cependant, un lment daction assigne un contenu au message de rponse. Ce contenu peut tre des informations statiques stockes dans un fichier ou des informations gnres par llment daction ou son gnrateur de contenu. Vous pouvez dfinir le contenu du message de rponse laide des proprits Content et ContentStream. La proprit Content est une chane. Les chanes Delphi ne sont pas limites des valeurs littrales, aussi la valeur de la proprit Content peut-elle tre une srie de commandes HTML, un contenu graphique ou tout type de contenu MIME. Utilisez la proprit ContentStream si le contenu du message de rponse peut tre lu dans un flux. Par exemple, si le message de rponse doit envoyer le contenu dun fichier, utilisez un objet TFileStream pour la proprit ContentStream. Comme avec la proprit Content, ContentStream peut fournir une chane de commandes HTML ou un autre contenu de type MIME. Si vous utilisez la proprit ContentStream, ne lib rez pas le flux vous-mme : lobjet rponse Web le librera automatiquement.
Remarque

Si la valeur de la proprit ContentStream nest pas nil, la proprit Content est ignore.

Utilisation de lagent Web

28-13

Gnration du contenu des messages de rponse

Envoi de la rponse
Si vous tes sr que le traitement du message de requte est termin, vous pouvez envoyer une rponse directement depuis le gestionnaire dvnementOnAction. Lobjet rponse offre deux mthodes denvoi de rponses : SendResponse et SendRedirect. Appelez SendResponse pour envoyer une rponse avec le contenu et les proprits den-tte de lobjet TWebResponse. Si votre action doit se limiter orienter le client Web vers une autre URI, utilisez la mthode SendRedirect, plus efficace. Si aucun des gestionnaires dvnements nenvoie de rponse, lapplication Web lenvoie lorsque le rpartiteur se referme. Cependant, si aucun lment daction nindique quil a trait la rponse, lapplication ferme la connexion au client Web sans envoyer de rponse.

Gnration du contenu des messages de rponse


Delphi met votre disposition plusieurs objets qui aideront vos lments daction gnrer un contenu pour les messages de rponse HTTP. Vous pouvez utiliser ces objets pour gnrer des chanes de commandes HTML enregistres dans un fichier ou transmises directement au client Web. Vous pouvez crer vos propres gnrateurs de contenu en les drivant de TCustomContentProducer ou de lun de ses descendants. TCustomContentProducer offre une interface gnrique pour la cration de contenus de type MIME dans un message de rponse HTTP. Ses descendants incluent des gnrateurs de page et des gnrateurs de tableau : Les gnrateurs de page peuvent rechercher dans les documents HTML des balises spciales quils remplacent par du code HTML spcifique. Ils sont dcrits dans la section suivante. Les gnrateurs de tableau crent des commandes HTML partir des informations contenues dans un ensemble de donnes. Ils sont dcrits dans Utilisation des bases de donnes dans les rponses la page 28-18.

Utilisation du composant gnrateur de page


Les gnrateurs de page (TPageProducer et des descendants) convertissent un modle HTML en remplaant les balises HTML transparentes par du code HTML personnalis. Vous pouvez garder sous la main un jeu de modles de rponses qui seront remplis par les gnrateurs de page lorsque vous devrez rpondre un message de requte HTTP. Vous pouvez chaner des gnrateurs de page pour construire de faon itrative un document HTML par traitements successifs des balises HTML transparentes.

28-14

Guide du dveloppeur

Gnration du contenu des messages de rponse

Modles HTML
Un modle HTML est une suite de commandes HTML et de balises HTML transparentes. Une balise HTML transparente est au format :
<#Nom_de_balise Param1=Valeur1 Param2=Valeur2 ...>

Les crochets (< et >) dfinissent la porte de la balise. Le signe # vient immdiatement aprs le crochet ouvrant, sans espace entre les deux. Il indique au gnrateur de page que la chane qui suit est une balise HTML transparente. Le nom de la balise suit immdiatement le signe dise, sans espace entre les deux. Le nom de la balise peut tre tout identificateur valide ; il identifie le type de conversion reprsent par la balise. Aprs un nom de balise, une balise HTML transparente peut parfois comporter des paramtres fournissant des informations sur la conversion effectuer. Chaque paramtre est au format Paramtre=Valeur. Aucun espace ne doit figurer entre le nom du paramtre, le signe gal et la valeur. Les paramtres sont spars par des espaces. Les crochets (< et >) rendent la balise transparente pour les navigateurs HTML qui ne reconnaissent pas la syntaxe #Nom_de_balise. Bien que vous puissiez crer vos propres balises HTML transparentes pour reprsenter tout type dinformations traites par votre gnrateur de page, plusieurs noms de balises associs des valeurs du type de donnes TTag sont mis votre disposition. Ces noms de balise prdfinis corrrespondent aux commandes HTML susceptibles de varier dun message de rponse lautre. Ils sont dcrits dans le tableau suivant :
Nom de la balise
Link Image Table

Valeur de TTag
tgLink tgImage tgTable

La balise est convertie en :


Lien hypertexte. Le rsultat est une squence HTML commenant par la balise <A> et se terminant par </A>. Graphique. Le rsultat est une balise HTML <IMG>. Tableau HTML. Le rsultat est une squence HTML commenant par la balise <TABLE> et se terminant par la balise </TABLE>. Graphique contenant des zones sensibles. Le rsultat est une squence HTML commenant par la balise <MAP> et se terminant par </MAP>. Objet ActiveX incorpor. Le rsultat est une squence HTML commenant par la balise <OBJECT> et se terminant par la balise </OBJECT>. DLL compatible Netscape. Le rsultat est une squence HTML commenant par la balise <EMBED> et se terminant par la balise </EMBED>.

ImageMap

tgImageMap

Object

tgObject

Embed

tgEmbed

Tout autre nom de balise est associ tgCustom. Le gnrateur de page noffre aucun traitement spcifique des noms de balises prdfinis. Ils sont simplement fournis pour aider vos applications structurer le processus de conversion des tches les plus frquentes.

Utilisation de lagent Web

28-15

Gnration du contenu des messages de rponse

Remarque

Les noms de balises prdfinis tiennent compte de la diffrence entre majuscules et minuscules.

Choix du modle HTML


Les gnrateurs de page vous proposent plusieurs faons pour dsigner le modle HTML. Vous pouvez donner la proprit HTMLFile le nom du fichier contenant le modle HTML. Vous pouvez donner la proprit HTMLDoc le nom dun objet TStrings contenant le modle HTML. Si vous utilisez lune de ces proprits pour dsigner le modle, vous pouvez gnrer les commandes HTML converties en appelant la mthode Content. Vous pouvez galement appeler la mthode ContentFromString pour convertir directement un modle HTML compos dune seule chane passe dans un paramtre, ou appeler la mthode ContentFromStream pour lire le modle HTML depuis un flux. Ainsi, par exemple, vous pourriez placer vos modles HTML dans un champ mmo dune base de donnes et, laide de la mthode ContentFromStream, obtenir les commandes HTML converties en lisant le modle depuis un objet TBlobStream.

Conversion des balises HTML transparentes


Le gnrateur de page convertit le modle HTML lorsque vous appelez lune de ses mthodes Content. Lorsque la mthode Content dtecte une balise HTML transparente, elle dclenche un vnement OnHTMLTag. Vous devez crire un gestionnaire dvnement pour dfinir le type de balise dtect et la remplacer par un contenu personnalis. Si vous ne crez pas de gestionnaire dvnement OnHTMLTag pour le gnrateur de page, les balises HTML transparentes sont remplaces par des chanes vides.

Utilisation du gnrateur de page depuis un lment daction


Un exemple dutilisation dun composant gnrateur de page est dutiliser la proprit HTMLFile pour spcifier un fichier contenant un modle HTML. Le gestionnaire dvnement OnAction appelle la mthode Content pour convertir le modle en squence HTML finale :
procedure WebModule1.MyActionEventHandler(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin PageProducer1.HTMLFile := Accueil.html; Response.Content := PageProducer1.Content; end;

Accueil.html est un fichier contenant ce modle HTML :


<HTML> <HEAD><TITLE>Notre nouveau site Web</TITLE></HEAD> <BODY> Hello <#UserName>! Bienvenue sur notre site. </BODY> </HTML>

28-16

Guide du dveloppeur

Gnration du contenu des messages de rponse

Le gestionnaire dvnement OnHTMLTag remplace la balise personnalise (<#UserName>) dans le code HTML lors de lexcution :
procedure WebModule1.PageProducer1HTMLTag(Sender : TObject;Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if CompareText(TagString,UserName) = 0 then ReplaceText := TPageProducer(Sender).Dispatcher.Request.Content; end;

Si le contenu du message de requ te tait la chane Alain, la valeur de Response.Content sera


<HTML> <HEAD><TITLE>Notre nouveau site Web</TITLE></HEAD> <BODY> Bonjour Alain ! Bienvenue sur notre site. </BODY> </HTML> Remarque

Cet exemple utilise un gestionnaire dvnement OnAction pour appeler le gnrateur de contenu et assigner le contenu de message de rponse. Vous navez pas besoin dcrire un gestionnaire dvnement OnAction si vous assignez la proprit HTMLFile du gnrateur de page lors de la conception. Dans ce cas, vous pouvez simplement assigner PageProducer1 comme valeur de la proprit Producer de llment daction pour obtenir le mme effet que le gestionnaire dvnement OnAction ci-dessus.

Chanage de gnrateurs de page


Le texte de substitution venant du gestionnaire dvnement OnHTMLTag ne doit pas ncessairement tre la squence HTML finale que vous voulez utiliser dans le message de rponse HTTP. Vous pouvez utiliser plusieurs gnrateurs de page, auquel cas le rsultat de lun sera pass au suivant. La faon la plus simple de chaner des gnrateurs de page consiste associer chaque gnrateur de page un lment daction particulier, tous les lments daction disposant des mmes PathInfo et MethodType. Le premier lment daction dfinit le contenu du message de rponse Web partir de son gnrateur de contenu, mais son gestionnaire dvnement OnAction veille ce que le message ne soit pas considr comme trait. Llment daction suivant utilise la mthode ContentFromString de son gnrateur associ pour manipuler le contenu du message de rponse Web, etc. Les lments daction qui suivent le premier lment daction utilisent un gestionnaire dvnement comme suit :
procedure WebModule1.Action2Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducer2.ContentFromString(Response.Content); end;

Prenons comme exemple une application qui affiche des pages de calendrier en rponse des messages de requ te indiquant le mois et lanne afficher. Chaque page de calendrier contient une image suivie de lanne et du mois,

Utilisation de lagent Web

28-17

Utilisation des bases de donnes dans les rponses

placs entre des images des mois prcdent et suivant, puis du calendrier luimme. Limage finale aurait laspect suivant :

Le format gnral du calendrier rside dans un fichier de modle laspect suivant :


<HTML> <Head></HEAD> <BODY> <#MonthlyImage> <#TitleLine><#MainBody> </BODY> </HTML>

Le gestionnaire dvnement OnHTMLTag du premier gnrateur de page recherche le mois et lanne dans le message de requte. Au moyen de ces informations et du fichier de modle, il : Remplace <#MonthlyImage> par <#Image Month=Janvier Year=1997>. Remplace <#TitleLine> par <#Calendar Month=Dcembre Year=1996 Size=Small> Janvier 1997 <#Calendar Month=Fvrier Year=1997 Size=Small>. Remplace <#MainBody> par <#Calendar Month=Janvier Year=1997 Size=Large>. Le gestionnaire dvnement OnHTMLTag du gnrateur de page suivant utilise le contenu cr par le premier gnrateur de page et remplace la balise <#Image Month=Janvier Year=1997> par la balise HTML <IMG> approprie. Un troisime gnrateur de page convertit les balises #Calendar en tableaux HTML.

Utilisation des bases de donnes dans les rponses


La rponse un message de requte HTTP peut inclure des informations extraites dune base de donnes. Les gnrateurs de contenu spcialiss de la page Internet sont capables de gnrer du code HTML pour reprsenter les enregistrements dune base de donnes dans un tableau HTML. Sous une approche diffrente, les composants spciaux de la page InternetExpress de la palette de composants vous permettent dlaborer des serveurs Web faisant partie dune application de base de donnes multiniveau. Voir Construction des applications Web avec InternetExpress la page 25-38, pour plus de dtails.

28-18

Guide du dveloppeur

Utilisation des bases de donnes dans les rponses

Ajout dune session au module Web


Les applications console CGI et les applications Win-CGI sont lances en rponse des messages de requte HTTP. Lorsque vous manipulez des bases de donnes dans des applications de ce type, vous pouvez utiliser la session par dfaut pour grer vos connexions aux bases de donnes car chaque message de requ te possde sa propre instance de lapplication. Chaque instance de lapplication possde sa propre session par dfaut. Cependant, lorsque vous crez une application NSAPI ou ISAPI, chaque message de requte est gr dans un thread distinct dune instance dapplication. Pour empcher que les connexions aux bases de donnes dautres threads ne se parasitent, vous devez donner une session distincte chaque thread. Chaque message de requte dans une application ISAPI ou NSAPI gnre un nouveau thread. Le module Web de ce thread est dynamiquement gnr lors de lexcution. Ajoutez un objet TSession au module Web pour grer les connexions aux bases de donnes pour le thread qui contient le module Web. A lexcution, une instance distincte du module Web est gnre pour chacun des threads. Chacun de ces modules contient lobjet session. Chaque session doit avoir un nom distinct pour que les threads qui grent les messages de requte ne parasitent pas leur connexion aux bases de donnes respectives. Pour que les objets session de chaque module sattribuent dynamiquement un nom unique, dfinissez la proprit AutoSessionName de lobjet session. Chaque session sattribuera dynamiquement un nom unique et dfinira la proprit SessionName de tous les ensembles de donnes du module de faon ce quelle fasse rfrence ce nom unique. Ceci permet linteraction des threads de requ te avec la base de donnes, sans interfrences avec les autres messages de requte. Pour plus dinformations sur les sessions, voir Gestion des sessions de bases de donnes la page 20-18.

Reprsentation HTML dune base de donnes


Les commandes HTML offertes par les composants gnrateur de contenu spcialis de la page Internet de la palette des composants dpendent des enregistrements contenus dans lensemble de donnes. Il existe deux types de gnrateurs de contenu orients donnes : Le gnrateur de page ensemble de donnes, qui formate les champs dun ensemble de donnes en texte dun document HTML. Les gnrateurs de tableau, qui formatent les enregistrements dun ensemble de donnes sous forme de tableau HTML.

Utilisation des gnrateurs de page ensemble de donnes


Les gnrateurs de page ensemble de donnes fonctionnent comme les autres composants gnrateur de page : ils convertissent un modle incluant des balises HTML transparentes en une reprsentation HTML finale. Cependant, ils prsentent la particularit de pouvoir convertir les balises dont le nom

Utilisation de lagent Web

28-19

Utilisation des bases de donnes dans les rponses

correspond celui dun champ dun ensemble de donnes en la valeur courante de ce champ. Pour plus dinformations sur lutilisation gnrale des gnrateurs de page, voir Utilisation du composant gnrateur de page la page 28-14. Pour utiliser un gnrateur de page ensemble de donnes, ajoutez un composant TDataSetPageProducer au module Web et attribuez sa proprit DataSet lensemble de donnes dont les valeurs de champ doivent tre affiches dans le contenu HTML. Crez un modle HTML qui dcrit le rsultat de votre gnrateur de page ensemble de donnes. Pour chaque valeur de champ afficher, incluez une balise de la forme
<#NomChamp>

dans le modle HTML, o NomChamp spcifie le nom du champ de lensemble de donnes dont la valeur doit tre affiche. Lorsque votre application appelle la mthode Content, ContentFromString ou ContentFromStream, le gnrateur de page ensemble de donnes remplace les balises reprsentant les champs par les valeurs courantes de ces derniers.

Utilisation des gnrateurs de tableau


La page Internet de la palette des composants offre deux composants qui permettent de crer un tableau HTML reprsentant les enregistrements dun ensemble de donnes : Legnrateur de tableau ensemble de donnes, qui formate les champs dun ensemble de donnes en texte dun document HTML. Legnrateur de tableau requte, qui excute une requte aprs avoir initialis les paramtres fournis par le message de requte et formate lensemble de donnes obtenu en un tableau HTML. A partir de lun ou lautre des gnrateurs de tableau, vous pouvez personnaliser laspect dun tableau HTML obtenu en indiquant ses proprits de couleur, de bordure, de type de sparateur, etc. Pour dfinir les proprits dun gnrateur de tableau la conception, double-cliquez sur le composant gnrateur de tableau pour afficher la bote de dialogue Editeur de rponses.

Choix des attributs de tableau


Les gnrateurs de tableau utilisent lobjet THTMLTableAttributes pour dcrire laspect visuel du tableau HTML qui affiche les enregistrements de lensemble de donnes. Lobjet THTMLTableAttributes inclut les proprits de largeur et despacement du tableau dans le document HTML, ainsi que sa couleur de fond, lpaisseur de la bordure, lalignement du texte dans les cellules et lespacement des cellules. Ces proprits sont toutes converties en options de la balise HTML <TABLE> cre par le gnrateur de tableau. Spcifiez ces proprits lors de la conception dans linspecteur dobjets. Slectionnez lobjet gnrateur de tableau et dveloppez la proprit TableAttributes pour afficher les proprits de lobjet THTMLTableAttributes. Vous pouvez galement spcifier ces proprits par programmation lexcution.

28-20

Guide du dveloppeur

Utilisation des bases de donnes dans les rponses

Choix des attributs de lignes


En plus des attributs de tableau, vous pouvez spcifier lalignement et la couleur du fond des lignes affichant des donnes. La proprit RowAttributes est un objet THTMLTableRowAttributes. Spcifiez ces proprits lors de la conception dans linspecteur dobjets, en dveloppant la proprit RowAttributes. Vous pouvez galement spcifier ces proprits par programmation lexcution. Il est galement possible de modifier le nombre de lignes du tableau HTML en utilisant la proprit MaxRows.

Choix des attributs de colonnes


Si vous connaissez, au moment de la conception, lensemble de donnes placer dans le tableau, vous pouvez utiliser lditeur de colonnes pour personnaliser le contenu et les attributs daffichage des colonnes. Slectionnez le composant gnrateur de tableau et faites un clic sur le bouton droit de la souris. Dans le menu contextuel, choisissez Editeur de colonnes. Ceci vous permet dajouter, de supprimer et de dplacer les colonnes du tableau. Vous pouvez dfinir les champs placer et les proprits daffichage des colonnes dans linspecteur dobjets aprs les avoir slectionnes dans lditeur de colonnes. Si le nom de lensemble de donnes figure dans le message de requte HTTP, vous ne pouvez pas dfinir les champs placer depuis lditeur de colonnes en phase de conception. Vous pouvez cependant personnaliser les colonnes par programmation lors de lexcution en dfinissant les objets THTMLTableColumn correspondants et en utilisant les mthodes de la proprit Columns pour ajouter ces colonnes au tableau. Si vous ne vous servez pas de la proprit Columns, le gnrateur de tableau crera des colonnes par dfaut adaptes aux champs de lensemble de donnes, mais ne spcifiera aucune caractristique daffichage.

Incorporation de tableaux dans un document HTML


Vous pouvez incorporer le tableau HTML reprsentant votre ensemble de donnes dans un document HTML laide des proprits Header et Footer du gnrateur de tableau. La proprit Header permet dindiquer quelles informations doivent tre affiches avant le tableau, alors que Footer spcifie ce qui vient aprs. Il est possible dutiliser un autre gnrateur de contenu (tel quun gnrateur de tableau) pour crer les valeurs des proprits Header et Footer. Lorsque vous incorporez votre tableau dans un document distinct, il est possible dajouter une lgende au tableau laide des proprits Caption et CaptionAlignment.

Configuration dun gnrateur de tableau ensemble de donnes


TDataSetTableProducer est un gnrateur de tableau qui permet de crer un tableau HTML pour un ensemble de donnes. Dfinissez la proprit DataSet de TDataSetTableProducer pour dsigner lensemble de donnes contenant les enregistrements afficher. Contrairement la procdure normale pour la plupart

Utilisation de lagent Web

28-21

Utilisation des bases de donnes dans les rponses

des objets orients donnes dune application de bases de donnes conventionnelle, la proprit DataSource na pas tre dfinie. Ceci sexplique par le fait que TDataSetTableProducer gnre sa propre source de donnes en interne. Vous pouvez choisir la valeur de DataSet en phase de conception si votre application Web affiche toujours des enregistrements issus du mme ensemble de donnes. Vous devez dfinir la proprit DataSet lors de lexcution si lensemble de donnes varie en fonction des informations contenues dans le message de requte HTTP.

Configuration dun gnrateur de tableau requte


Vous pouvez gnrer un tableau HTML pour afficher les rsultats dune requte, dans lequel les paramtres de recherche viennent du message HTTP. Dsignez lobjet TQuery qui utilise ces paramtres comme proprit Query dun composant TQueryTableProducer. Si le message est une requte GET, les paramtres de recherche sont situs dans les champs Query de lURL fournie comme destination du message de requte HTTP. Si le message est une requte POST, ces paramtres sont dans le contenu du message de requte. Lorsque vous appelez la mthode Content de TQueryTableProducer, elle excute la requte laide des paramtres figurant dans lobjet requte. Elle formate ensuite un tableau HTML pour reprsenter les enregistrements dans lensemble de donnes obtenu. Comme avec tout gnrateur de tableau, vous pouvez personnaliser les proprits daffichage ou de contenu des colonnes du tableau HTML. Il est galement possible dincorporer le tableau dans un autre document HTML.

28-22

Guide du dveloppeur

29
Chapitre 29

Chapitre

Utilisation de WebSnap

WebSnap tend lagent Web avec de nouveaux composants, des experts et des vues qui simplifient la conception dapplications Web contenant des pages Web complexes orientes donnes. WebSnap gre plusieurs modules ainsi que les scripts ct serveur, ce qui simplifie le dveloppement en quipe. Les composants rpartiteur grent automatiquement les requ tes pour le contenu des pages, la validation des formulaires HTML et les requtes dimages dynamiques. De nouveaux composants, les adaptateurs, permettent de dfinir une interface sous forme de scripts avec les rgles de gestion de votre application. Ainsi, lobjet TDataSetAdapter permet de crer des composants ensembles de donnes manipulables par scripts. Vous pouvez utiliser de nouveaux composants gnrateur pour concevoir rapidement des formulaires ou des tableaux complexes orients donnes ou utiliser XSL pour gnrer une page. Le composant session vous permet de conserver une trace des utilisateurs finaux. Le composant liste dutilisateurs permet de grer des utilisateurs, des mots de passes et des droits daccs. Lexpert application Web permet de gnrer rapidement une application personnalise avec les composants dont vous avez besoin. Lexpert module de page Web vous permet de crer un module dfinissant une nouvelle page de votre application. Lexpert module de donnes Web vous permet de crer un conteneur pour des composants rutiliss dans votre application Web. Les vues de module de page peuvent visualiser le rsultat dun script ct serveur sans avoir excuter lapplication. Longlet Prvisualisation affiche la page dans un navigateur incorpor. La vue Rsultat HTML affiche le HTML gnr. Les vues Arborescence XSL et Arborescence XML simplifient la manipulation du XML et du XSL. Pour grer une quipe de dveloppeurs, vous pouvez utiliser la gestion multimodule de WebSnap afin de dcomposer une application en units dveloppables sparment. Lors de la cration dun nouveau module de page, lexpert module de page peut crer un fichier modle externe. Ce fichier modle

Utilisation de WebSnap

29-1

Cration dapplications serveur Web avec WebSnap

externe peut tre modifi hors de lEDI et test sans avoir recompiler lapplication. Les sections suivantes de ce chapitre dcrivent comme utiliser les composants WebSnap pour crer une application serveur Web.

Cration dapplications serveur Web avec WebSnap


Pour crer une nouvelle application serveur Web utilisant larchitecture WebSnap :

1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, slectionnez longlet WebSnap et choisissez Application WebSnap. 3 La bote de dialogue qui saffiche attend les informations suivantes :
Le type de serveur Le type de module dapplication Web Les options de module dapplication Web Les composants de lapplication

Type de serveur
Slectionnez lun des types suivants dapplication serveur Web : ISAPI et NSAPI : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web. Len-tte de la bibliothque est galement inclus dans le fichier projet, ainsi que les entres ncessaires dans les listes des clauses uses et exports du fichier projet. Apache : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web Apache. Len-tte de la bibliothque est galement inclus dans le fichier projet, ainsi que les entres ncessaires dans les listes des clauses uses et exports du fichier projet. Excutable autonome CGI : la slection de ce type dapplication configure votre projet comme une application en mode console et ajoute les entres ncessaires la clause uses du fichier projet. Excutable autonome Win-CGI : si vous slectionnez ce type dapplication, le projet est configur comme une application Windows et ajoute les entres ncessaires la clause uses du fichier projet. Excutable dbogueur dapplication Web : la slection de ce type dapplication configure un environnement permettant de dvelopper et de tester des applications serveur Web. Ce type dapplication nest pas conu pour tre dploy.

29-2

Guide du dveloppeur

Cration dapplications serveur Web avec WebSnap

Choisissez le type dapplication serveur Web qui communique avec le type de serveur Web que votre application utilisera.

Types de module dapplication Web


Le module dapplication Web permet un contrle centralis des rgles de gestion et des composants non-visuels dune application Web. Il y a deux types de modules dapplication Web : Module de page. La slection de ce type de module cre une page de contenu. Le module de page contient un gnrateur de page charg de gnrer le contenu dune page. Le gnrateur de page affiche sa page associe quand les informations de chemin daccs (pathinfo) de la requte HTTP correspondent au nom de la page. Ce peut tre la page par dfaut si la zone pathinfo est vide. Module de donnes. La slection de ce type de module de donnes ne cre pas de contenu de page. Ce module est utilis comme conteneur pour des composants partags par dautres modules : par exemple, les composants de bases de donnes utiliss par plusieurs modules de page Web.

Options des modules dapplication Web


Si vous slectionnez un module dapplication de type module de page, vous pouvez associer un nom la page en renseignant la zone Nom de page de la bote de dialogue. A lexcution, linstance de ce module peut tre place dans un cache ou retire de la mmoire quand la requte a t traite. Vous pouvez choisir le comportement adopt en utilisant les options de la zone Mise en mmoire cache. Vous pouvez galement dfinir dautres options du module de page via le bouton Options de page. Vous pouvez les choisir parmi les catgories suivantes : Gnrateur. Le type de gnrateur de la page peut tre lun des suivants : AdapterPageProducer, DataSetPageProducer, InetXPageProducer, PageProducer ou XSLPageProducer. Si le gnrateur de page slectionn gre les scripts, utilisez la liste droulante Moteur de script pour slectionner le type de langage utilis pour les scripts de la page.
Remarque

Le type AdapterPageProducer ne gre que JScript. HTML. Quand le type de gnrateur slectionn utilise un modle HTML, ce groupe est visible. XSL. Quand le type de gnrateur slectionn utilise un modle XSL (comme TXSLPageProducer), ce groupe est visible. Nouveau fichier. Cochez cette option si vous voulez quun fichier modle soit cr et gr comme faisant partie de lunit. Le fichier modle gr apparat alors dans le gestionnaire de projet et utilise le mme nom et le mme emplacement que le fichier source de lunit. Ne cochez pas cette option si

Utilisation de WebSnap

29-3

Cration dapplications serveur Web avec WebSnap

vous voulez utiliser les proprits du composant gnrateur (en gnral, les proprits HTMLDoc et HTMLFile). Modle. Si loption Nouveau fichier est coche, choisissez le contenu par dfaut du fichier modle en utilisant la liste droulante Modle. Le modle D faut affiche le titre de lapplication, le titre de la page et un lien hypertexte vers les pages publies. Page. Saisissez le nom de la page et le titre du module de page. Le nom de page est utilis pour rfrencer la page dans une requte HTTP ou dans la logique mme de lapplication. Le titre est le nom que lutilisateur final voit quand la page est affiche dans un navigateur. Publi. Cochez cette option pour rpondre automatiquement aux requtes HTTP dont le paramtre pathinfo correspond au nom de la page. Nom de connexion requis. Cochez cette option pour obliger lutilisateur sidentifier avant de pouvoir accder la page.

Composants dapplication
Les composants dapplication fournissent les fonctionnalits de lapplication Web. Si, par exemple, vous utilisez un composant rpartiteur dadaptateur, celui-ci gre automatiquement la validation des formulaires HTML et renvoie automatiquement les images gres dynamiquement. Un rpartiteur de page affiche automatiquement le contenu dune page quand la zone pathinfo dune requte HTTP contient le nom de la page. La slection du bouton Composants affiche une bote de dialogue dans laquelle vous pouvez slectionner un ou plusieurs composants dapplication : Adaptateur dapplication. Contient des informations sur lapplication comme le titre. Le type par dfaut est TApplicationAdapter. Adaptateur utilisateur final. Contient des informations sur lutilisateur, comme le nom, les droits daccs et sil est connect. Le type par dfaut est TEndUserAdapter. Vous pouvez galement slectionner TEndUserSessionAdapter. Rpartiteur de page. Examine la valeur de la zone pathinfo de la requte HTTP et appelle le module de page appropri pour renvoyer le contenu dune page. Le type par dfaut est TPageDispatcher. Rpartiteur dadaptateur. Gre automatiquement la validation des formulaires HTML et les requtes dimage dynamique en appelant des composants action adaptateur ou champs. Le type par dfaut est TAdapterDispatcher. Actions de rpartition. Vous permet de dfinir une collection dlments action pour grer les requtes bases sur pathinfo et le type de mthode. Les lments action appellent des vnements dfinis par lutilisateur ou demandent le contenu des composants gnrateur de page. Le type par dfaut est TWebDispatcher.

29-4

Guide du dveloppeur

Modules Web

Service de localisation de fichiers. Permet de contrler le chargement de fichiers modle et de fichiers include de scripts pendant lexcution de lapplication Web. Le type par dfaut est TLocateFileService. Service de sessions. Sutilise pour stocker des informations sur un utilisateur final qui sont ncessaires pour un court laps de temps. Les sessions vous permettent par exemple de garder la trace des utilisateurs connects et de dconnecter automatiquement un utilisateur aprs une certaine priode dinactivit. Le type par dfaut est TSessionService. Service de liste dutilisateurs. Stocke une liste des utilisateurs autoriss, de leurs mot de passe et droits daccs. Le type par dfaut est TWebUserList. Pour chacun de ces composants, les types de composant lists sont les types par dfaut livrs avec Delphi. Les utilisateurs peuvent crer leur propres types de composant ou utiliser des composants proposs par des tiers.

Modules Web
Il y a quatre types de modules Web : TWebAppPageModule TWebAppDataModule TWebPageModule TWebDataModule

Le module application Web (TWebAppPageModule ou TWebAppDataModule) sert de conteneur aux composants de lapplication qui remplissent des fonctions portant sur lapplication prise comme un tout : la rpartition des requ tes, le gestion des sessions ou la gestion de la liste des utilisateurs. Une application ne peut contenir quun seul module dapplication de ce type. Le module de page Web (TWebPageModule) fournit le contenu dune page alors que le module de donnes Web (TWebDataModule) sert de conteneur des composants utiliss dans divers endroits de votre application. Vous pouvez ventuellement inclure plusieurs modules de pages Web ou modules de donnes Web dans le module dapplication Web.

Modules de donnes Web


Comme les modules de donnes standard, un module de donnes Web sert de conteneur des composants de la palette. Les modules de donnes fournissent une surface de conception dans laquelle ajouter, retirer ou slectionner des composants. Lors de lexcution de lapplication, un module de donnes ne cre pas de fentre. Le module de donnes Web diffre dun module de donnes standard par la structure de lunit et les interfaces quil implmente.

Utilisation de WebSnap

29-5

Modules Web

Utilisez un module de donnes Web comme conteneur pour les composants partags par votre application. Vous pouvez, par exemple, placer un composant ensemble de donnes dans un module de donnes et y accder depuis : un module de page affichant une grille, et un module de page affichant un formulaire de saisie.

Structure de lunit dun module de donnes Web


Les modules de donnes standard ont une variable appele la variable de fiche qui est utilise pour accder lobjet module de donnes. Les modules de donnes Web proposent la place une fonction. Elle a le mme rle. Cependant, comme les applications WebSnap peuvent tre multithreads et avoir plusieurs instances dun module traitant simultanment plusieurs requtes, cette fonction est implmente de manire renvoyer la bonne instance. Cette unit recense galement un fabricant. Le fabricant spcifie comment le module doit tre gr par lapplication WebSnap. Par exemple, des indicateurs spcifient sil faut placer le module dans un cache afin de le rutiliser ou sil faut dtruire le module aprs le traitement dune requte.

Interfaces implmentes par un module de donnes Web


Un module de donnes Web implmente les interfaces suivantes : INotifyWebActivate. Cette interface est appele quand le module est activ pour traiter une requte Web et avant la dsactivation du module aprs traitement de la requte Web. IWebVariablesContainer. Cette interface est appele durant lexcution dun script afin de rsoudre les rfrences de variables. Le rpartiteur dadaptateur appelle galement cette interface pour rechercher les actions dadaptation et les champs rfrencs dans une requte HTTP. IGetScriptObject. Cette interface est appele pour obtenir limplmentation par le module de IDispatch. Lobjet renvoy est linterface entre le module et le moteur de script actif. IIteratorObjectSupport . Cette interface est utilise pour parcourir tous les objets du module accessibles par script.

Modules de page Web


Le module de page est associ un composant gnrateur de page. A la rception dune requte, le rpartiteur de page analyse la requte et appelle le module de page appropri afin de traiter la requte et renvoyer le contenu de la page. Comme les modules de donnes Web, les modules de page Web servent de conteneur des composants. La diffrence tant que le module de page Web sert lui gnrer une page Web.

29-6

Guide du dveloppeur

Modules Web

Composant gnrateur de page


Les modules de page Web ont une proprit qui identifie le composant gnrateur de page responsable de la gnration du contenu de la page. Les experts WebSnap ajoutent automatiquement un gnrateur lors de la cration dun module de page Web. Vous pouvez ultrieurement changer de composant gnrateur de page en dposant un autre gnrateur provenant de la palette WebSnap. Cependant, si le module de page utilise un fichier modle, assurezvous que le contenu du fichier est compatible avec le composant gnrateur.

Nom de page
Les modules de page Web ont un nom de page qui sert rfrencer la page dans une requte HTTP ou dans la logique de lapplication. Un fabricant dans lunit du module de page Web spcifie le nom de page pour le module de page Web.

Modle de gnrateur
La plupart des gnrateurs de page utilisent un modle. Gnralement, les modles HTML contiennent du code HTML statique mlang des balises transparentes ou du script excut ct serveur. Quand les gnrateurs de page crent leur contenu, ils remplacent les balises transparentes par les valeurs appropries et excutent les scripts serveur afin de gnrer le HTML qui est affich dans le navigateur du client. XSLPageProducer constitue une exception. Il utilise des modles XSL, qui contiennent du XSL et non du HTML. Les modles XSL ne grent pas les balises transparentes ou les scripts serveur. Les modules de page Web peuvent avoir un fichier modle associ qui est gr comme faisant partie de lunit. Un fichier modle gr apparat dans le gestionnaire de projet et utilise le mme nom et le mme emplacement que le fichier source de lunit. Si le module de page Web na pas de fichier modle associ, ce sont les proprits du composant gnrateur qui spcifient le modle.

Interfaces implmentes par le module de page Web


Un module de page Web implmente toutes les interfaces dun module de donnes Web plus les interfaces suivantes : IDefaultPageFileName. Le concepteur de surface WebSnap utilise cette interface pour vrifier quun module de page utilise le bon fichier modle. ISetWebContentOptions. Le concepteur de surface WebSnap utilise cette interface pour contrler le contenu gnr par le module de page. Ainsi, une option permet de rcuprer le contenu avant lexcution de scripts ASP. IGetProducerComponent . Le concepteur de surface WebSnap utilise cette interface pour obtenir le composant gnrateur associ au module de page. IProducerEditorViewSupport. Le concepteur de surface WebSnap utilise cette interface pour obtenir des informations sur les vues de lditeur quil doit afficher quand le module de page est actif. Les vues de lditeur disponibles sont : Script HTML, Prvisualiser, Rsultat HTML, Arborescence XSL et Arborescence XML.

Utilisation de WebSnap

29-7

Adaptateurs

IPageResult. Cette interface donne accs au rsultat gnr par un module de page. Cette interface gre trois types de rsultat : Contenu HTTP, Redirection HTTP et Page Include. IGetDefaultAction. Cette interface rcupre lventuelle action dadaptation associe au module de page.

Modules dapplication Web


Le module dapplication Web implmente des interfaces qui ne sont pas implmentes par TWebPageModule ou TWebDataModule.

Interfaces implmentes par un module de donnes dapplication Web


Un module de donnes dapplication Web implmente toutes les interfaces dun module de donnes Web en plus des suivantes : IGetWebAppServices. Rcupre linterface avec le gestionnaire de requtes de lapplication Web. IGetWebAppComponents. Rcupre linterface avec les composants de niveau application (AdapterDispatcher, PageDispatcher, SessionsService et EndUserAdapter).

Interfaces implmentes par un module de page dapplication Web


Un module de page dapplication Web implmente toutes les interfaces dun module de donnes Web et dun module de page Web.

Adaptateurs
Les adaptateurs permettent de crer une interface avec les donnes de lapplication. Ils vous permettent dinsrer du code en langage de script dans une page et de rcuprer des informations en appelant les adaptateurs depuis le code script. Vous pouvez, par exemple, utiliser un adaptateur pour dfinir les champs de donnes afficher dans une page HTML. Une page HTML scripte peut alors contenir du contenu HTML et des instructions en script qui rcupre la valeur de ces champs.

Champs
Les champs sont des composants quutilise le gnrateur de page pour rcuprer des donnes de votre application afin den afficher le contenu dans une page Web. Les champs peuvent galement servir rcuprer une image. Dans ce cas, le champ renvoie ladresse de limage crite dans la page Web. Quand une page affiche son contenu, une requte envoye lapplication Web demande au rpartiteur dadaptateur de rechercher limage relle depuis le composant champ.

29-8

Guide du dveloppeur

Gnrateurs de page

Actions
Les actions sont des composants qui excutent des commandes pour ladaptateur. Quand un gnrateur de page gnre sa page, le langage de script appelle les composants action dadaptation pour renvoyer le nom de laction ainsi que tous les paramtres ncessaires lexcution de la commande. Par exemple, soit un bouton dun formulaire HTML devant supprimer une ligne dune table. Il renvoie dans la requte HTTP le nom de laction associ au bouton et un paramtre indiquant le numro de ligne. Le rpartiteur dadaptateur recherche le composant action ainsi nomm et lui transmet le numro de ligne comme paramtre de laction.

Erreurs
Les adaptateurs grent une liste des erreurs se produisant lors de lexcution dune action. Les gnrateurs de page peuvent accder cette liste afin de les afficher dans la page Web renvoye par lapplication lutilisateur final.

Enregistrements
Certains composants adaptateur, comme TDataSetAdapter, reprsentent plusieurs lignes. Ladaptateur propose alors une interface de scriptage qui permet de parcourir les lignes. Certains adaptateurs grent la pagination et ne permettent de parcourir que les lignes de la page en cours.

Gnrateurs de page
Vous pouvez utiliser les gnrateurs de page afin de produire le contenu pour un module de page Web. Vous pouvez aussi utiliser des gnrateurs comme dans des applications WebBroker, en associant le gnrateur un lment daction dun rpartiteur Web. Lutilisation des modules de page Web offre les avantages suivants : La possibilit de prvisualiser la disposition des pages sans avoir excuter lapplication. Lassociation entre un nom de page et un module permet au rpartiteur de page dappeler automatiquement le gnrateur de page.

Modles
Les gnrateurs proposent les fonctionnalits suivantes : Ils gnrent du contenu HTML. Ils peuvent rfrencer un fichier externe en utilisant la proprit HTMLfile ou une chane interne avec la proprit HTMLDoc.

Utilisation de WebSnap

29-9

Utilisation de scripts serveur avec WebSnap

Sils sont utiliss en association avec un module de page Web, le modle peuttre un fichier associ une unit. Ils gnrent dynamiquement du HTML qui peut tre insr dans le modle en utilisant des balises transparentes ou du scriptage actif. Les balises transparentes sutilisent de la mme manire que dans une application agent Web. Pour plus dinformations, voir Conversion des balises HTML transparentes la page 28-16. La gestion du scriptage actif vous permet dincorporer du code JavaScript ou VBscript dans la page HTML.

Utilisation de scripts serveur avec WebSnap


Les modles de gnrateur de page peuvent utiliser du code crit avec des langages de script comme JScript ou VBScript. Le gnrateur de page excute le script en rponse une demande du contenu du gnrateur. Comme cest lapplication Web qui value le script, on parle de script serveur (ou de script ct serveur) par opposition au script ct client qui est excut par le navigateur.

Scriptage actif
WebSnap utilise le scriptage actif pour implmenter les scripts serveur. Le scriptage actif est une technologie cre par Microsoft permettant lutilisation dun langage de script par des objets dapplication via des interfaces COM. Microsoft fournit deux langages de script, VBScript et JScript. La gestion dautres langages est propose par dautres fournisseurs.

Moteur de script
La proprit ScriptEngine du gnrateur de page identifie le moteur de script qui doit valuer les scripts placs dans un modle.

Blocs de script
Les blocs de script sont dlimits par <% et %>. Le moteur de script value tout texte plac lintrieur dun bloc de script. Le rsultat est intgr au contenu du gnrateur de page. Le gnrateur de page crit le texte plac hors dun bloc de script aprs avoir traduit les balises transparentes incorpores. Les blocs de script peuvent galement contenir du texte, ce qui permet de dfinir le texte en sortie laide de conditions ou de boucles. Par exemple, le bloc JScript suivant gnre une liste de cinq lignes numrotes :
<ul> <% for (i=0;i<5;i++) { %> <li>Item <% Response.Write(i) %></li> <% } %> </ul>

29-10

Guide du dveloppeur

Utilisation de scripts serveur avec WebSnap

Le bloc de script suivant donne un rsultat quivalent :


<ul> <% for (i=0;i<5;i++) { %> <li>Item <%=i %></li> <% } %> </ul>

Le dlimiteur <%= est un raccourci de Response.Write.

Cration de scripts
Les dveloppeurs peuvent profiter des caractristiques de WebSnap pour gnrer des scripts automatiquement.

Experts modles
Lors de la cration dune nouvelle application WebSnap ou dun module de page, les experts WebSnap proposent une zone Modle qui permet de slectionner le contenu initial dun modle de module de page. Par exemple, le modle nomm Dfaut gnre du code JScript affichant le titre de lapplication, le nom de la page et des liens vers les pages publies.

TAdapterPageProducer
TAdapterPageProducer produit des formulaires et des tableaux en gnrant du HTML et du code JScript. Le code JScript gnr appelle les objets adaptateurs pour rcuprer la valeur des champs, les paramtres des champs image et les paramtres daction.

Modification et visualisation des scripts


Le concepteur de surface WebSnap propose une visualisation des modules de page Web qui permet de prvisualiser une page scripte. Utilisez la vue Rsultat HTML pour afficher le HTML produit par lexcution du script. Utilisez longlet Prvisualiser pour afficher le rsultat dans un navigateur. Si le module de page Web utilise TAdapterPageProducer, longlet Script HTML est galement propos. Cet onglet affiche le HTML et le code JScript gnr par lobjet TAdapterPageProducer. Consultez cette vue pour voir comment crire des scripts construisant des formulaires HTML afin dafficher des champs adaptateur et dexcuter des actions dadaptation.

Comment inclure un script dans une page


Un modle peut inclure un script depuis un fichier ou depuis une autre page. Pour inclure un script se trouvant dans un fichier, utilisez linstruction suivante :
<!-- #include file="nomfichier.html" -->

Utilisation de WebSnap

29-11

Utilisation de scripts serveur avec WebSnap

Quand le modle inclut un script contenu dans une autre page, le script est valu par la page qui inclut le script. Utilisez le code suivant pour inclure une version non value de page1.
<!-- #include page="page1" -- >

Objets scriptables
Les objets scriptables sont des objets VCL ou CLX qui peuvent tre rfrencs par un script. Pour que des objets VCL ou CLX soient accessibles par script, vous devez recenser une interface IDispatch avec lobjet dans le moteur de script actif. Les objets suivants sont manipulables par script : Application. Lobjet application (qui peut tre null) donne accs ladaptateur dapplication du module dapplication Web. Le bloc de code JScript suivant crit le titre de lapplication :
<%= Application.Title %>

EndUser. Lobjet EndUser donne accs ladaptateur utilisateur final du module dapplication Web. Le bloc de code JScript suivant crit le nom de lutilisateur final :
<%= EndUser.DisplayName %>

Session. Lobjet session donne accs lobjet session du module dapplication Web. Le bloc de code JScript suivant crit lID de la session :
<%= Session.SessionID %>

Pages. Les objets page (Pages) donnent accs aux pages de lapplication. Le bloc de code JScript suivant crit des liens vers toutes les pages publies :
<% e = new Enumerator(Pages) for (; !e.atEnd(); e.moveNext()) { if (e.item().Published) { Response.Write(<A HREF=" + e.item().HREF +"> + e.item().Title + </A>) } } %>

Remarquez que la page prvisualisation de lditeur naffiche pas un rsultat correct pour ce bloc de script. En effet, les objets pages sont toujours vides la conception car les fabricants de module de page Web nont pas t recenss. Modules. Les objets module donnent accs aux modules de lapplication. Le bloc de code JScript suivant crit le contenu dun champ adaptateur dans un module nomm DM :
<%= Modules.DM.Adapter1.Field1.DisplayText %>

Page. Lobjet Page donne accs la page en cours. Le bloc de code JScript suivant crit le titre de la page en cours :
<%= Page.Title %>

29-12

Guide du dveloppeur

Rpartition des requtes

Producer. Lobjet Producer donne accs au gnrateur de page du module de page Web. Le bloc de code JScript suivant value une balise transparente avant dcrire le contenu :
<% Producer.Write(Voici une balise <#TAG>) %>

Remarquez que la page prvisualisation de lditeur naffiche pas un rsultat correct pour ce bloc de script. En effet, les gestionnaires dvnements qui gnralement remplacent les balises transparentes ne sont excuts que lorsque lapplication sexcute. Response. Lobjet Response donne accs WebResponse. Utilisez cet objet quand vous voulez viter demployer la substitution de balises.
<% Response.Write(Hello World!) %>

Request. Lobjet Request donne accs WebRequest. Le bloc de code JScript suivant crit le pathinfo.
<%= Request.PathInfo %>

Objets adaptateur. Il est possible de rfrencer sans qualification tous les composants de ladaptateur de la page en cours. Pour les adaptateurs dautres modules, utilisez une qualification avec les objets modules. Le bloc de code JScript suivant affiche la valeur du champ FirstName de toutes les lignes de Adapter1 :
<% e = new Enumerator(Adapter1.Records) %> <% for (; !e.atEnd(); e.moveNext()) %> <% { %> <p><%= Adapter1.FirstName.DisplayText %> <% } %>

Rpartition des requtes


Quand une application WebSnap reoit un message de requte HTTP, elle cre un objet TWebRequest pour reprsenter le message de requte HTTP et un objet TWebResponse pour reprsenter la rponse qui doit tre renvoye.

WebContext
Avant de traiter la requte, le module dapplication Web initialise un objet WebContext (de type TWebContext). WebContext est une variable thread qui donne un accs global aux variables utilises par les composants traitant la requte. Par exemple, WebContext contient les objets TWebResponse et TWebRequest ainsi que les objets adaptateur de requte et de rponse dcrits plus bas dans cette section.

Utilisation de WebSnap

29-13

Rpartition des requtes

Composants rpartiteur
Les composants rpartiteur du module dapplication Web contrlent le flux de lapplication. Les rpartiteurs dterminent comment traiter certains types de messages de requte HTTP en analysant la requte HTTP. Le composant rpartiteur dadaptateur (TAdapterDispatcher) recherche un champ de contenu ou un champ de requte qui identifie un composant action dadaptation ou un composant dadaptation de champ image. Si le rpartiteur dadaptateur trouve un composant, il transmet le contrle au composant. Le composant rpartiteur Web (TWebDispatcher) gre une collection des lments action (TWebActionItem) qui savent grer certains types de messages de requte HTTP. Le rpartiteur Web recherche un lment action correspondant la requte. Sil en trouve un, il transmet le contrle cet lment action. Le rpartiteur Web recherche galement les composants dauto-rpartition qui peuvent grer la requ te. Le composant rpartiteur de page (TPageDispatcher) examine la proprit PathInfo de lobjet TWebRequest, en y recherchant le nom dun module de page Web recens. Si le rpartiteur trouve le nom dun module de page Web, il transmet le contrle ce module de page Web.

Fonctions dun rpartiteur dadaptateur


Le composant rpartiteur dadaptateur gre automatiquement la validation des formulaires HTML et les requtes dimage dynamique en appelant des composants action dadaptation et des composants champ.

Utilisation de composants dadaptation pour gnrer du contenu


Pour que les applications WebSnap excutent automatiquement les actions dadaptation et rcuprent les images dynamiques depuis les champs dadaptation, il faut que le contenu HTML soit construit correctement. Si le contenu HTML nest pas construit correctement, la requte HTTP correspondante ne contient pas les informations dont le rpartiteur dadaptateur a besoin pour appeler les composants action dadaptation et champ. Afin de limiter les erreurs lors de la construction de la page HTML, les composants adaptateur indiquent le nom et la valeur que doivent prendre les lments HTML. Les composants adaptateur ont des mthodes pour obtenir le nom et la valeur des champs cachs qui doivent apparatre dans un formulaire HTML utilis pour actualiser des champs dadaptation. Gnralement les gnrateurs de page utilisent des scripts serveur pour obtenir des composants adaptateur les noms et les valeurs puis gnrent le HTML en les utilisant. Par exemple, le script suivant construit un lment <IMG> qui rfrence le champ Graphic de Adapter1 :
<img src="<%=Adapter1.Graphic.Image.AsHREF%>" alt="<%=Adapter1.Graphic.DisplayText%>">

29-14

Guide du dveloppeur

Rpartition des requtes

Quand lapplication Web value le script, lattribut src HTML contiendra les informations ncessaires lidentification du champ ainsi que les paramtres dont le composant champ peut avoir besoin pour rcuprer limage. Le HTML rsultat aura la forme suivante :
<img src="?_lEspece No=90090&__id=DM.Adapter1.Graphic" alt="(GRAPHIC)">

Quand le navigateur envoie lapplication Web une requte HTTP pour obtenir cette image, le rpartiteur dadaptateur est capable de dterminer que le champ Graphic de Adapter1 dans le module DM, doit tre appel avec le paramtre Espece No=90090. Le rpartiteur dadaptateur appelle le champ Graphic pour crire la rponse HTTP approprie. Le script suivant construit un lment <A> faisant rfrence laction EditRow de Adapter1 dans la page appele Details :
<a href="<%=Adapter1.EditRow.LinkToPage("Details", Page.Name).AsHREF%>">Edit...</a>

Le HTML rsultant a la forme suivante :


<a href="?&_lEspece No=90310&__sp=Edit&__fp=Grid&__id=DM.Adapter1.EditRow">Edit...</a>

Quand lutilisateur final clique sur ce lien hypertexte et que le navigateur envoie une requte HTTP, le rpartiteur dadaptateur peut dterminer que laction EditRow de Adapter1 dans le module DM, doit tre appele avec le paramtre Espece No=903010. Le rpartiteur dadaptateur indique galement que la page Edit doit tre affiche si laction est correctement excute et que la page Grid doit tre affiche si lexcution de laction choue. Il appelle ensuite laction EditRow pour rechercher la ligne modifier et la page nomme Edit est appele pour gnrer une rponse HTTP. La figure suivante illustre comment les composants adaptateur sont utiliss pour gnrer du contenu.
Figure 29.1 Flux de la gnration du contenu

Utilisation de WebSnap

29-15

Rpartition des requtes

Requtes et rponses des adaptateurs


Quand le rpartiteur dadaptateur reoit la requte du client, il cre des objets requte et rponse dadaptation pour stocker des informations sur la requte HTTP. Les objets requte et rponse dadaptation sont stocks dans le WebContext afin de pouvoir y accder lors du traitement de la requte. Le rpartiteur dadaptateur cre deux types dobjet requte dadaptation : action et image. Il cre lobjet requte action lors de lexcution dune action dadaptation. Il cre lobjet requte dimage pour obtenir une image dun champ adaptateur. Lobjet rponse dadaptation est utilis par le composant adaptateur pour indiquer la rponse une action dadaptation ou une requte image dadaptation. Il y a deux types dobjet rponse dadaptation : action et image.

Requtes action
Lobjet requte action est responsable de la dcomposition de la requte HTTP afin dobtenir les informations n cessaires lexcution dune action dadaptation. Les types dinformations ncessaires lexcution dune action dadaptation peuvent tre : Le nom du composant. Identifie le composant action dadaptation. Le mode dadaptation. Les adaptateurs peuvent dfinir un mode. Par exemple, TDataSetAdapter gre les modes modification, insertion et consultation. Une action dadaptation peut sexcuter diffremment selon le mode. Par exemple, avec TDataSetAdapter, laction Apply ajoute un nouvel enregistrement en mode insertion et actualise lenregistrement en mode modification. Page de russite. La page de russite indique la page afficher si laction arrive sexcuter. Page dchec. Indique la page afficher en cas derreur lors de lexcution de laction. Paramtres de requte action. Identifie les paramtres ncessaires laction dadaptation. Par exemple, laction Apply de TDataSetAdapter a besoin de la valeur de cl identifiant lenregistrement actualiser. Valeurs de champ dadaptation. Ce sont les valeurs des champs dadaptation transmis dans la requte HTTP lors de la validation dun formulaire HTML. Les valeurs de champ peuvent tre les nouvelles valeurs saisies par lutilisateur final, les valeurs initiales du champ dadaptation ou des fichiers tlchargs. Cls denregistrement . Si un formulaire HTML apporte des modifications plusieurs enregistrements, les cls utilises par le composant action dadaptation sont ncessaires pour identifier de manire unique chacun des enregistrements afin que laction dadaptation soit effectue sur chaque enregistrement. Par exemple, quand laction Apply de TDataSetAdapter est effectue sur plusieurs enregistrements, les cls denregistrement sont utilises pour rechercher chaque enregistrement de lensemble de donnes avant dactualiser les champs de lensemble de donnes.

29-16

Guide du dveloppeur

Rpartition des requtes

Rponse action
Lobjet rponse action gnre une rponse HTTP pour le composant action dadaptation. Laction dadaptation indique le type de rponse en initialisant les proprits de lobjet ou en appelant des mthodes de lobjet action rponse. Les proprits sont : Options de redirection. Les options de redirection indiquent sil faut effectuer une redirection HTTP au lieu de renvoyer un contenu HTML. Statut dexcution. Linitialisation du statut dexcution russi fait que la rponse action par dfaut devient le contenu de la page de russite dfinie par la requte action. Parmi les mthodes de rponses action : RespondWithPag. Laction dadaptation appelle cette mthode quand un module de page Web particulier doit gnrer la rponse. RespondWithComponent. Laction dadaptation appelle cette mthode quand la rponse doit provenir du module de page Web contenant ce composant. RespondWithURL. Laction dadaptation appelle cette mthode quand la rponse est une redirection vers lURL spcifie. Quand la rponse est une page, lobjet rponse action tente dutiliser le rpartiteur de page pour gnrer le contenu de la page. Sil ne trouve pas le rpartiteur de page, il appelle directement le module de page Web. La figure suivante illustre comment les objets rponse action et requte action traitent une requte.
Figure 29.2 Requte et rponse action

Requte dimage
Lobjet requte dimage est responsable de la dcomposition de la requ te HTTP afin dobtenir les informations dont a besoin le champ dadaptation dimage

Utilisation de WebSnap

29-17

Rpartition des requtes

pour gnrer une image. Les informations reprsentes par la requte dimage sont : Nom du composant. Identifie le composant champ dadaptation. Paramtres de requte dimage. Identifie les paramtres ncessaires. Par exemple, lobjet TDataSetAdapterImageField a besoin des valeurs de cl ncessaires lidentification de lenregistrement contenant limage.

Rponse image
Lobjet rponse image contient lobjet TWebResponse. Les champs dadaptation rpondent une requte dadaptation en crivant une image dans lobjet rponse Web. La figure suivante illustre comment les champs dadaptation dimage rpondent une requte.
Figure 29.3 Rponse une requte dimage

Rpartition des lments daction


Le rpartiteur Web (TWebDispatcher) recherche dans sa liste dlments daction celui qui : correspond la partie Pathinfo du message de requte de lURL cible ; peut fournir le service spcifi par la mthode du message de requte. Pour ce faire, il compare les proprits PathInfo et MethodType de lobjet TWebRequest avec les proprits de mme nom des lments daction. Quand le rpartiteur trouve llment daction appropri, il provoque le dclenchement de llment daction. Quand llment daction est dclench, il effectue lune des oprations suivantes : Il remplit le contenu de la rponse et envoie la rponse, ou signale que la requte a t entirement traite.

29-18

Guide du dveloppeur

Rpartition des requtes

Il ajoute du contenu la rponse, puis permet dautres lments daction de poursuivre le travail. Il dlgue la requte dautres lments daction. Une fois que le rpartiteur a vrifi tous les lments daction, si le message na pas t correctement trait, il recherche dans les composants dauto-rpartition recenss nutilisant pas dlments daction. Ces composants sont spcifiques aux applications de bases de donnes multiniveaux. Si le message de requ te nest toujours pas entirement trait, le rpartiteur appelle llment daction par dfaut. Il nest pas ncessaire que llment daction par dfaut corresponde lURL cible ou la mthode de la requte.

Fonctions du rpartiteur de page


Quand le rpartiteur de page reoit une requ te dun client, il dtermine le nom de page en vrifiant la partie Pathinfo du message de requ te de lURL cible. Si elle nest pas vide, le rpartiteur de page en utilise le dernier mot comme nom de page. Si la partie pathinfo est vide, le rpartiteur de page tente de dterminer un nom de page par dfaut. Si la proprit DefaultPage du rpartiteur de page contient un nom de page, le rpartiteur utilise ce nom comme nom de page par dfaut. Si la proprit DefaultPage nest pas renseigne et si le module dapplication Web est un module de page, le rpartiteur de page utilise le nom de module de lapplication Web comme nom de page par dfaut. Si le nom de page nest pas vide, le rpartiteur de page recherche un module de page Web ayant le nom correspondant. Sil trouve un module de page Web, il appelle ce module pour gnrer une rponse. Si le nom de page est vide, ou si le rpartiteur de page ne trouve pas un module de page Web, le rpartiteur de page dclenche une exception. La figure suivante illustre comment le rpartiteur de page rpond une requte.
Figure 29.4 Rpartition dune page

Utilisation de WebSnap

29-19

Tutoriel WebSnap

Tutoriel WebSnap
La section suivante dcrit les tapes de la conception dune application WebSnap. Ralisez ce tutoriel pour vous familiariser avec larchitecture WebSnap et ses nouveaux concepts en incorporant les nouveaux composants rpartiteur et adaptateur dans un module de page Web. Lapplication WebSnap illustre la manire dutiliser les composants HTML WebSnap pour concevoir une application qui permet de modifier le contenu dune table.

Cration dune nouvelle application


Pour crer une nouvelle application WebSnap :

Etape 1. Dmarrage de lexpert application WebSnap


1 Dmarrez Delphi et choisissez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, slectionnez longlet WebSnap et choisissez Application WebSnap. 3 Dans la bote de dialogue Nouvelle application WebSnap :
Slectionnez Excutable dbogueur dapplication Web. Dans la zone CoClasse, saisissez CountryTutorial. Slectionnez Module Page comme type de composant. Dans la zone Nom de page, saisissez Home.

4 Choisissez OK.

Etape 2. Enregistrement des fichiers gnrs et du projet


Pour enregistrer les fichiers units Pascal et le projet :

1 2 3 4 5
Remarque

Slectionnez Fichier|Tout enregistrer. Dans la zone Nom de fichier, entrez HomeU.pas et choisissez OK. Dans la zone Nom de fichier, entrez CountryU.pas et choisissez OK. Dans la zone Nom de fichier, entrez CountryTutorial.dpr et choisissez OK. Choisissez OK.

Enregistrez lunit et le projet dans le mme rpertoire car lapplication recherche le fichier HomeU.html dans le mme rpertoire que lexcutable.

Etape 3. Spcification du titre de lapplication


Le titre de lapplication est le nom affich dans le navigateur de lutilisateur final. Pour spcifier le titre de lapplication :

1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre du gestionnaire de projet, dveloppez CountryTutorial.exe et double-cliquez sur lentre HomeU. 3 Dans la fentre de linspecteur dobjets (en bas gauche), slectionnez ApplicationAdapter dans la liste droulante.

29-20

Guide du dveloppeur

Tutoriel WebSnap

4 Dans longlet Proprits, saisissez Tutoriel Country dans la zone ApplicationTitle. 5 Cliquez sur longlet Prvisualiser dans la fentre de lditeur. Le titre de lapplication est affich en haut de la page.

Cration de la page CountryTable


Un module de page Web va servir dfinir une page publie et servir de conteneur aux composants de donnes.

Etape 1. Ajout dun nouveau module


Pour ajouter un nouveau module :

1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, slectionnez longlet WebSnap et choisissez Module de page WebSnap. 3 Dans la bote de dialogue, choisissez AdapterPageProducer comme valeur pour la liste Type de gnrateur. 4 Dans la zone Nom de page, saisissez CountryTable. 5 Laissez vide les autres champs, et laissez aux slections leur valeur par dfaut. 6 Choisissez OK.

Etape 2. Enregistrement du nouveau module


Enregistrez lunit dans le rpertoire du fichier projet. A lexcution de lapplication, elle recherche le fichier CountryTableU.html dans le mme rpertoire que lexcutable.

1 Slectionnez Fichier|Enregistrer. 2 Dans la zone Nom de fichier, entrez CountryTableU.pas et choisissez OK.

Ajout des composants de donnes au module CountryTable


Un composant TTable fournit les donnes du tableau HTML. Le composant TDataSetAdapter permet au script serveur daccder au composant TTable.

Etape 1. Ajout des composants orients donnes


1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre du gestionnaire de projet, dveloppez CountryTutorial.exe et double-cliquez sur lentre CountryTableU. 3 Slectionnez Voir|Arborescence dobjets. La fentre vue arborescente de lobjet (ct gauche) devient active. 4 Slectionnez longlet AccsBD de la palette doutils.

Utilisation de WebSnap

29-21

Tutoriel WebSnap

5 Slectionnez un composant Table (cliquez dessus avec le bouton gauche de la souris et maintenez-le enfonc) et faites glisser le composant dans la fentre vue arborescente de lobjet. 6 Slectionnez un composant Session (cliquez dessus avec le bouton gauche de la souris et maintenez-le enfonc) et faites glisser le composant dans la fentre vue arborescente de lobjet. 7 Slectionnez le composant Session dans la fentre vue arborescente de lobjet. Cela affiche les valeurs du composant Session dans la fentre Inspecteur dobjets. 8 Dans linspecteur dobjets, initialisez la proprit AutoSessionName True. 9 Slectionnez le composant Table dans la fentre vue arborescente de lobjet. Cela affiche les valeurs du composant Table dans la fentre Inspecteur dobjets. 10 Dans linspecteur dobjets, initialisez les proprits suivantes :

Remarque

Active True. DatabaseName DBDEMOS. Dans la proprit Name, saisissez Country. TableName country.db.

Le composant Session est ncessaire car nous utilisons le composant BDE (TTable) dans une application multithread.

Etape 2. Spcification du champ cl


Le champ cl est utilis pour identifier les enregistrements dune table. Cela devient important lors de lajout dune page de modification lapplication. Pour spcifier un champ cl :

1 Dans la fentre vue arborescente de lobjet, dveloppez les nuds Session et DBDemos, et slectionnez le nud country.db. Ce nud correspond au composant table Country. 2 Cliquez avec le bouton droit de la souris sur le nud country.db et slectionnez Editeur de champs. 3 Cliquez avec le bouton droit de la souris dans la fentre diteur de CountryTable.Country et slectionnez la commande Ajouter tous les champs. 4 Slectionnez le champ Name dans la liste des champs ajouts. 5 Dans linspecteur dobjets, dveloppez la proprit ProviderFlags. 6 Initialisez la proprit pfInKey True.

Etape 3. Ajout dun composant adaptateur


Pour rendre les donnes dun composant TTable accessibles aux scripts ct serveur, vous devez inclure un composant DataSetAdapter (TDataSetAdapter). Pour ce faire :

1 Slectionnez longlet WebSnap de la palette doutils.

29-22

Guide du dveloppeur

Tutoriel WebSnap

2 Slectionnez le composant DataSetAdapter (cliquez dessus avec le bouton gauche de la souris et maintenez-le enfonc) et faites glisser le composant dans la fentre vue arborescente de lobjet. 3 Dans linspecteur dobjets, modifiez les proprits suivantes :
Initialisez DataSet Country. Dans la proprit Name, saisissez Adapter.

Cration dune grille pour afficher les donnes


Le AdapterPageProducer permet dexploiter les scripts ct serveur afin de construire rapidement un tableau HTML.

Etape 1. Ajout dune grille


Pour ajouter une grille afin dafficher les donnes de la table :

1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre du gestionnaire de projet, dveloppez CountryTutorial.exe et double-cliquez sur lentre CountryTableU. 3 Slectionnez Voir|Arborescence dobjets. Le fentre vue arborescente de lobjet (ct gauche) devient active. 4 Dveloppez le composant AdapterPageProducer. 5 Cliquez avec le bouton droit de la souris sur lentre WebPageItems et choisissez Nouveau composant. 6 Dans la fentre Ajout de composant Web, slectionnez AdapterForm, puis choisissez OK. Un composant AdapterForm1 apparat dans la fentre vue arborescente de lobjet. 7 Cliquez avec le bouton droit de la souris sur AdapterForm1 et choisissez Nouveau composant. 8 Dans la fentre Ajout de composant Web, slectionnez AdapterGrid, puis choisissez OK. Un composant AdapterGrid1 apparat dans la fentre vue arborescente de lobjet. 9 Dans linspecteur dobjets, initialisez la proprit Adapter Adapter. 10 Pour prvisualiser la page, slectionnez longlet CountryTableU.pas dans la fentre diteur de code et choisissez en bas longlet Prvisualiser. Si longlet Prvisualiser napparat pas, faites dfiler les onglets. 11 Slectionnez longlet Script HTML pour visualiser le code JScript g nr par les composants WebSnap.

Etape 2. Ajout de commandes de modification la grille


Les utilisateurs peuvent avoir besoin de modifier le contenu de la table. Pour permettre aux utilisateurs de faire des changements (modification, ajout ou suppression de ligne), ajoutez des composants commande.

Utilisation de WebSnap

29-23

Tutoriel WebSnap

Pour ajouter des composants commande :

1 Dans la fentre vue arborescente de lobjet pour CountryTable, dveloppez le composant AdapterPageProducer et toutes ses branches. 2 Cliquez avec le bouton droit de la souris sur le composant AdapterGrid1 et choisissez Nouveau composant. Une entre AdapterCommandColumn1 est ajoute au composant AdapterGrid1. 3 Cliquez avec le bouton droit de la souris sur AdapterCommandColumn1 et choisissez Ajouter des commandes. 4 Slectionnez les commandes DeleteRow, EditRow et NewRow puis choisissez OK. 5 Pour prvisualiser la page, cliquez sur longlet Prvisualiser en bas de lditeur de code.

Ajout dune fiche de modification


Crez un module de page Web qui va servir de fiche de modification de la table country.

Etape 1. Ajout dun nouveau module


Pour ajouter un nouveau module de page WebSnap :

1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, slectionnez longlet WebSnap et choisissez Module de page WebSnap. 3 Dans la bote de dialogue, choisissez AdapterPageProducer comme valeur pour la liste Type de gnrateur. 4 Dans la zone Nom de page, saisissez CountryForm. 5 Ne cochez pas la case Publi. 6 Laissez vide les autres champs et laissez aux slections leur valeur par dfaut. 7 Choisissez OK.

Etape 2. Enregistrement du nouveau module


Enregistrez lunit dans le rpertoire du fichier projet. A lexcution de lapplication, elle recherche le fichier CountryFormU.html dans le mme rpertoire que lexcutable.

1 Slectionnez Fichier|Enregistrer. 2 Dans la zone Nom de fichier, entrez CountryFormU.pas et choisissez OK.

29-24

Guide du dveloppeur

Tutoriel WebSnap

Etape 3. Utilisation de lunit CountryTableU


Ajoutez lunit CountryTableU la clause uses afin de permettre au module daccder au composant adaptateur :

1 Slectionnez Fichier|Utiliser lunit. 2 Slectionnez la CountryTableU dans la liste et choisissez OK.

Etape 4. Ajout des zones de saisie


Ajoutez des composants au composant AdapterPageProducer afin de gnrer les zones de saisie dans le formulaire HTML. Pour ajouter des zones de saisie :

1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre vue arborescente de lobjet, dveloppez CountryTutorial.exe et double-cliquez sur lentre CountryFormU. 3 Slectionnez Voir|Arborescence dobjets. La fentre vue arborescente de lobjet (ct gauche) devient active. 4 Dans la fentre vue arborescente de lobjet, dveloppez le composant AdapterPageProducer, cliquez avec le bouton droit de la souris sur WebPageItems et choisissez Nouveau composant. 5 Slectionnez AdapterForm puis choisissez OK. Une entre AdapterForm1 apparat dans la fentre vue arborescente de lobjet. 6 Cliquez avec le bouton droit de la souris sur WebPageItems et choisissez Nouveau composant. 7 Slectionnez AdapterFieldGroup puis choisissez OK. Une entre AdapterFieldGroup1 apparat dans la fentre vue arborescente de lobjet. 8 Dans linspecteur dobjets, initialisez la proprit Adapter CountryTable.Adapter. 9 Pour prvisualiser la page, cliquez sur longlet Prvisualiser en bas de lditeur de code.

Etape 5. Ajout de boutons


Ajoutez des composants au composant AdapterPageProducer afin de gnrer les boutons de validation dans le formulaire HTML. Pour ajouter des composants :

1 Dans la fentre vue arborescente de lobjet, dveloppez le composant AdapterPageProducer et toutes ses branches. 2 Cliquez avec le bouton droit de la souris sur AdapterForm1 et choisissez Nouveau composant. 3 Slectionnez AdapterCommandGroup puis choisissez OK. Une entre AdapterCommandGroup1 apparat dans la fentre vue arborescente de lobjet. 4 Dans linspecteur dobjets, initialisez la proprit DisplayComponent AdapterFieldGroup1.

Utilisation de WebSnap

29-25

Tutoriel WebSnap

5 Cliquez avec le bouton droit de la souris sur lentre AdapterCommandGroup1 et choisissez Ajouter des commandes. 6 Slectionnez les commandes Cancel, Apply et Refresh Row puis choisissez OK. 7 Pour prvisualiser la page, slectionnez longlet CountryTableU.pas dans la fentre diteur de code et choisissez en bas longlet Prvisualiser. Si longlet Prvisualiser napparat pas, faites dfiler les onglets.

Etape 6. Liaisons des actions du formulaire la page de la grille


Quand lutilisateur clique sur un bouton, une action dadaptation est excute. Pour spcifier la page afficher une fois laction dadaptation excute :

1 Dans la fentre vue arborescente de lobjet, dveloppez AdapterCommandGroup1 afin dafficher les entres CmdCancel, CmdApply et CmdRefreshRow. 2 Slectionnez CmdCancel. Dans linspecteur dobjets, saisissez CountryTable dans la proprit PageName. 3 Slectionnez CmdApply. Dans linspecteur dobjets, saisissez CountryTable dans la proprit PageName.

Etape 7. Liaison des actions de la grille la page formulaire


Pour spcifier la page afficher quand une action dadaptation est excute en choisissant un bouton de la grille :

1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre vue arborescente de lobjet, dveloppez CountryTutorial.exe et double-cliquez sur lentre CountryTableU. 3 Dans la fentre vue arborescente de lobjet, dveloppez le composant AdapterPageProducer et toutes ses branches afin dafficher les entres CmdNewRow, CmdEditRow et CmdDeleteRow. Ces entres apparaissent en dessous de lentre AdapterCommandColumn1. 4 Slectionnez CmdNewRow. Dans linspecteur dobjets, saisissez CountryForm dans la proprit PageName. 5 Slectionnez CmdEditRow. Dans linspecteur dobjets, saisissez CountryForm dans la proprit PageName. 6 Pour vrifier que lapplication fonctionne et que tous les boutons effectuent une action, excutez lapplication.
Remarque

Il ny a pas dindication sur les erreurs de bases de donnes, par exemple un type incorrect. Pour le vrifier, essayez dajouter un nouveau pays avec un code incorrect (par exemple abc) dans le champ Area.

29-26

Guide du dveloppeur

Tutoriel WebSnap

Ajout de la gestion des erreurs


Pour signaler les erreurs lutilisateur final, ajoutez un composant AdapterErrorList qui sert afficher une liste des erreurs qui se sont produites lors de lexcution des actions dadaptation qui modifient la table country.

Etape 1. Ajout de la gestion des erreurs la grille


Dans la fentre vue arborescente de lobjet pour CountryTable, dveloppez le composant AdapterPageProducer et toutes ses branches afin dafficher AdapterForm1.

1 Cliquez avec le bouton droit de la souris sur AdapterForm1 et choisissez Nouveau composant. 2 Slectionnez AdapterErrorList puis choisissez OK. Une entre AdapterErrorList1 apparat dans la fentre vue arborescente de lobjet. 3 Dplacez AdapterErrorList1 au-dessus de AdapterGrid1 (en le faisant glisser ou en utilisant la flche oriente vers le haut dans la barre doutils de la vue arborescente de lobjet). 4 Dans linspecteur dobjets, initialisez la proprit Adapter Adapter.

Etape 2. Ajout de la gestion des erreurs au formulaire


1 Dans la fentre vue arborescente de lobjet pour CountryTable, dveloppez le composant AdapterPageProducer et toutes ses branches afin dafficher AdapterForm1. 2 Cliquez avec le bouton droit de la souris sur AdapterForm1 et choisissez Nouveau composant. 3 Slectionnez AdapterErrorList puis choisissez OK. Une entre AdapterErrorList1 apparat dans la fentre vue arborescente de lobjet. 4 Dplacez AdapterErrorList1 au-dessus de AdapterGrid1 (en le faisant glisser ou en utilisant la flche oriente vers le haut dans la barre doutils de la vue arborescente de lobjet). 5 Dans linspecteur dobjets, initialisez la proprit Adapter CountryTable.Adapter.

Etape 3. Test de la gestion derreurs


Pour tester la gestion derreur de la grille :

1 Excutez lapplication et placez-vous sur la page CountryTable. 2 Dmarrez une autre instance de votre navigateur et placez-vous sur la page CountryTable. 3 Cliquez sur le bouton DeleteRow pour la premire ligne de la grille. 4 Sans rafrachir dans le second navigateur, cliquez sur le bouton DeleteRow pour la premire ligne de la grille.

Utilisation de WebSnap

29-27

Tutoriel WebSnap

5 Un message derreur est affich au-dessus de la grille.


Pour tester la gestion derreur du formulaire :

1 Excutez lapplication et placez-vous sur la page CountryTable. 2 Choisissez le bouton EditRow. 3 La page CountryForm est affiche. 4 Changez la zone Area en abc et choisissez le bouton Apply. 5 Un message derreur est affich au-dessus du premier champ.

Excution de lapplication
Une fois lapplication termine, pour lexcuter :

1 Slectionnez Excuter|Excuter. Une fentre est alors affiche. Les applications Excutable dbogueur dapplication Web sont des serveurs COM, la fentre qui apparat alors est la fentre console du serveur COM. A la premire excution du projet, les objets COM pouvant tre utiliss directement par le dbogueur dapplication Web sont recenss. 2 Slectionnez Outils|Dbogueur dapplication Web. 3 Cliquez sur le lien URL par dfaut pour afficher la page ServerInfo. La page ServerInfo affiche le nom de tous les excutables dbogueur dapplication Web recenss. 4 Slectionnez CountryTutorial dans la liste droulante et choisissez le bouton Go.

29-28

Guide du dveloppeur

30
Chapitre 30

Chapitre

Utilisation de documents XML

XML (Extensible Markup Language) est un langage de balisage pour la description de donnes structures. Il ressemble au HTML, cette diffrence prs que les balises dcrivent la structure des informations et non leurs caractristiques daffichage. Les documents XML proposent un moyen simple, sous forme de texte, de stocker des informations qui peuvent tre simplement modifies ou recherches. Ils sont souvent utiliss comme format standard et transportable pour les donnes dapplications Web, les communication businessto-business, etc. Les documents XML donnent une vue hirarchise du corps des donnes. Les balises dun document XML dcrivent le rle et la signification de chaque lment de donnes, comme le montre le document suivant qui dcrit une collection dactions boursires :
<?xml version="1.0" standalone='yes' ?> <!DOCTYPE stockholdings SYSTEM sth.dtd> <StockList> <Stock exchange=NASDAQ> <name>Inprise (Borland)</name> <price>15.375</price> <symbol>INPR</symbol> <shares>100</shares> </Stock> <Stock exchange=NYSE> <name>Pfizer</name> <price>42.75</price> <symbol>PFE</symbol> <shares type=preferred>25</shares> </Stock> </StockList>

Cet exemple illustre des lments typiques dun document XML. La premire ligne est une instruction de traitement. Elle donne des informations sur la manire dinterprter le fichier mais ne contient aucune donne.

Utilisation de documents XML

30-1

Utilisation du modle DOM

La seconde ligne, qui commence avec la balise <!DOCType>, est une dclaration de type de document. Elle nomme la structure du document et rfrence un autre fichier (sth.dtd) qui dcrit cette structure. Dans ce cas, la structure est dfinie par un fichier DTD (Document Type Definition, dfinition de type de document). Il existe dautres types de fichiers dcrivant la structure dun document XML : XDR (Reduced XML Data) et XSD (XML schemas). Les lignes restantes sont organises de manire hirarchique avec un seul nud racine (la balise <StockList>). Chaque nud de la hirarchie contient soit un ensemble de nuds enfant, soit une valeur texte. Certaines balises (les balises <Stock> et <shares>) contiennent des attributs qui sont des paires Nom=Valeur donnant des dtails sur la manire dinterprter la balise. Mme sil est possible de travailler directement sur le texte dun document XML, les applications utilisent gnralement des outils spcifiques pour analyser et modifier les donnes. Le W3C dfinit un ensemble dinterfaces standard pour reprsenter un document XML analys, appel le modle dobjet document (DOM, Document Object Model). Divers diteurs proposent des analyseurs XML qui implmentent les interfaces DOM afin de vous permettre dinterprter et de modifier plus facilement les documents XML. Delphi propose plusieurs outils pour manipuler les documents XML. Ces outils utilisent un analyseur DOM fournis par un tiers et simplifient lutilisation des documents XML. Ce chapitre dcrit ces outils.
Remarque

Outre les outils dcrits dans ce chapitre, Delphi dispose de composants et doutils assurant la conversion de documents XML en paquets de donnes afin de les intgrer dans larchitecture de base de donnes Delphi. Pour davantage dinformations sur les outils dintgration de documents XML dans des applications de bases de donnes, voir chapitre 26, Utilisation de XML dans les applications de bases de donnes.

Utilisation du modle DOM


DOM ( Document Object Model) est un ensemble dinterfaces standard dfinissant la manire de reprsenter un document XML analys. Delphi est livr avec deux implmentations de DOM (celle de Microsoft et celle dIBM). De plus, il propose un mcanisme de recensement qui vous permet dintgrer Delphides implmentations de DOM proposes par dautres fournisseurs. Lunit XMLDOM contient la dclaration de toutes les interfaces DOM dfinies dans la spcification W3C XML DOM niveau 2. Chaque fournisseur DOM utilise une implmentation de ces interfaces. Pour utiliser limplmentation Microsoft, incluez lunit MSXMLDOM dans votre clause uses. Comme limplmentation Microsoft utilise COM, vous devez galement recenser la bibliothque msxml.dll comme serveur COM. Vous pouvez utiliser Regsvr32.exe pour recenser cette DLL. Pour utiliser limplmentation IBM, incluez lunit IBMXMLDOM dans votre clause uses.

30-2

Guide du dveloppeur

Utilisation des composants XML

Pour utiliser dautres implmentations de DOM, vous devez crer une unit qui inclut une fonction renvoyant linterface de niveau le plus lev (IDOMImplementation). Votre unit doit recenser cette fonction en appelant la procdure globale RegisterDOMImplementation. Certains fournisseurs proposent des extensions aux interfaces standard DOM. Pour pouvoir utiliser ces extensions, lunit XMLDOM dfinit galement une interface IDOMNodeEx. IDOMNodeEx est un descendant de linterface standard IDOMNode qui inclut les plus utiles de ces extensions. Vous pouvez manipuler directement les interfaces DOM pour analyser et modifier des documents XML. Appelez simplement la fonction GetDOM pour obtenir une interface IDOMImplementation que vous pouvez utiliser comme point de dpart.
Remarque

Pour une description dtaille des interfaces DOM, voir les dclarations dans lunit XMLDOM, la documentation de votre fournisseur DOM ou les spcifications fournies par le site Web W3C (www.w3.org). Vous pouvez choisir dutiliser les classes XML Delphi plutt que de manipuler directement les interfaces DOM. Elles sont dcrites ci-dessous

Utilisation des composants XML


Delphi dfinit diverses classes et interfaces pour manipuler les documents XML. Elles simplifient le processus de chargement, de modification et denregistrement des documents XML.

Utilisation de TXMLDocument
Le composant TXMLDocument sert de point de dpart lutilisation dun document XML. Les tapes suivantes dcrivent comment utiliser TXMLDocument pour manipuler directement un document XML :

1 Ajoutez un composant TXMLDocument dans votre fiche ou votre module de donnes. TXMLDocument apparat dans la page Internet de la palette des composants. 2 Initialisez la proprit DOMVendor afin de spcifier limplmentation de DOM que vous souhaitez que le composant utilise pour analyser et modifier un document XML. Linspecteur dobjets liste tous les fournisseurs DOM recenss. Pour davantage dinformations sur les implmentations DOM, voir Utilisation du modle DOM la page 30-2. 3 Selon votre implmentation, vous pouvez initialiser la proprit ParseOptions pour configurer comment limplmentation sous-jacente de DOM analyse le document XML.

Utilisation de documents XML

30-3

Utilisation des composants XML

4 Si vous manipulez un document XML, spcifiez le document de la faon suivante :


Si le document XML est stock dans un fichier, initialisez la proprit FileName avec le nom de ce fichier. Vous pouvez spcifier le document XML sous forme de chane au lieu dutiliser un fichier grce la proprit XML.

5 Initialisez la proprit Active True.


Quand vous disposez dun objet TXMLDocument actif, vous pouvez parcourir la hirarchie de ses nuds en lisant ou en modifiant leur valeur. Le nud racine de cette hirarchie est accessible via la proprit DocumentElement.

Utilisation des nuds XML


Quand un document XML a t analys par une implmentation de DOM, les donnes quil reprsente sont accessibles via une hirarchie de nuds. Chaque nud correspond un lment balis du document. Par exemple, tant donn le code XML suivant :
Component palette<?xml version="1.0" standalone='yes' ?> <!DOCTYPE stockholdings SYSTEM sth.dtd> <StockList> <Stock exchange=NASDAQ> <name>Inprise (Borland)</name> <price>15.375</price> <symbol>INPR</symbol> <shares>100</shares> </Stock> <Stock exchange=NYSE> <name>Pfizer</name> <price>42.75</price> <symbol>PFE</symbol> <shares type=preferred>25</shares> </Stock> </StockList>

TXMLDocument gnre la hirarchie de nuds suivante : la racine de la hirarchie est le nud StockList. StockList contient deux nuds enfant qui correspondent aux deux balises Stock. Chacun de ces nuds enfant a quatre nuds enfant (name, price, symbol et shares). Ces quatre nuds enfant sont des nuds feuille, ou nuds terminaux. Le texte quils contiennent apparat comme valeur de chaque nud feuille.
Remarque

Cette division en nuds peut varier selon la manire dont limplmentation de DOM gnre les nuds pour un document XML. En particulier, un analyseur DOM traite tous les lments baliss comme des nuds internes. Des nuds supplmentaires (de type nud texte) sont crs pour les valeurs des nuds name, price, symbol et shares. Ces nuds texte apparaissent alors comme des enfants des nuds name, price, symbol et shares.

30-4

Guide du dveloppeur

Utilisation des composants XML

Pour accder chaque nud, utilisez une interface IXMLNode en partant du nud racine qui est la valeur de la proprit DocumentElement du composant document XML.

Utilisation de la valeur dun nud


Etant donn une interface IXMLNode, vous pouvez vrifier si elle reprsente un nud interne ou un nud feuille en testant la valeur de la proprit IsTextElement. Si elle reprsente un nud feuille, vous pouvez lire ou crire sa valeur en utilisant la proprit Text. Si elle reprsente un nud interne, vous pouvez accder ses nuds enfant en utilisant la proprit ChildNodes. Ainsi, par exemple, en utilisant le document XML prcdent, vous pouvez lire la valeur de laction Inprise de la manire suivante :
InpriseStock := XMLDocument1.DocumentElement.ChildNodes[0]; Price := InpriseStock.ChildNodes['price'].Text;

Utilisation des attributs dun nud


Si le nud a des attributs, vous pouvez les manipuler en utilisant la proprit Attributes. Vous pouvez lire ou crire la valeur des attributs en spcifiant un nom dattribut existant. Vous pouvez ajouter de nouveaux attributs en spcifiant le nom du nouvel attribut lorsque vous initialisez la proprit Attributes :
InpriseStock := XMLDocument1.DocumentElement.ChildNodes[0]; InpriseStock.ChildNodes['shares'].Attributes['type'] := 'common';

Ajout et suppression de nuds enfant


Vous pouvez ajouter des nuds enfant en utilisant la mthode AddChild . AddChild cre de nouveau nuds correspondants aux lments baliss du document XML. De tels nuds sont appeles nuds lment. Pour crer un nouveau nud lment, spcifiez le nom qui doit apparatre dans la nouvelle balise et, ventuellement, la position o le nouveau nud doit apparatre. Par exemple, le code suivant ajoute une nouvelle cotation au document prcdent :
var NewStock: IXMLNode; ValueNode: IXMLNode; begin NewStock := XMLDocument1.DocumentElement.AddChild('stock'); NewStock.Attributes['exchange'] := 'NASDAQ'; ValueNode := NewStock.AddChild('name'); ValueNode.Text := 'Cisco Systems' ValueNode := NewStock.AddChild('price'); ValueNode.Text := '62.375'; ValueNode := NewStock.AddChild('symbol'); ValueNode.Text := 'CSCO'; ValueNode := NewStock.AddChild('shares');

Utilisation de documents XML

30-5

Abstraction de documents XML avec lexpert liaison de donnes

ValueNode.Text := '25'; end;

Une version redfinie de AddChild vous permet de spcifier le domaine dappellation dans lequel le nom de balise est dfini. Vous pouvez supprimer des nuds enfant en utilisant les mthodes de la proprit ChildNodes. ChildNodes est une interface IXMLNodeList qui gre les enfants dun nud. Vous pouvez utiliser sa mthode Delete pour supprimer un seul nud enfant qui est identifi par sa position ou par son nom. Par exemple, le code suivant supprime la dernire cotation numre dans le document prcdent :
StockList := XMLDocument1.DocumentElement; StockList.ChildNodes.Delete(StockList.ChildNodes.Count - 1);

Abstraction de documents XML avec lexpert liaison de donnes


Mme sil est possible de manipuler un document XML en utilisant uniquement le composant TXMLDocument et linterface IXMLNode pour parcourir les nuds du document, ou mme dutiliser uniquement les interfaces DOM (sans mme utiliser TXMLDocument), vous pouvez crire du code beaucoup plus simple et plus lisible en utilisant lexpert Liaison de donnes XML. Lexpert Liaison de donnes XML part dun schma XML ou dun fichier de donnes et gnre un ensemble dinterfaces correspondantes. Soit, par exemple, les donnes XML suivantes :
<customer id=1> <name>Mark</name> <phone>(831) 431-1000</phone> </customer>

Lexpert Liaison de donnes XML gnre linterface suivante (ainsi que la classe qui limplmente) :
ICustomer = interface(IXMLNode) property id: Integer read Getid write Setid; property name: DOMString read Getname write Setname; property phone: DOMString read Getphone write Setphone; function Getid: Integer; function Getname: DOMString; function Getphone: DOMString; procedure Setid(Value: Integer); procedure Setname(Value: DOMString); procedure Setphone(Value: DOMString); end;

Chaque nud enfant est associ une proprit dont le nom correspond au nom de la balise du nud enfant et dont la valeur est linterface du nud enfant (si lenfant est un nud interne) ou la valeur du nud enfant (pour les nuds feuille). Chaque attribut de nud est galement associ une proprit, le nom de la proprit tant le nom de lattribut et sa valeur tant celle de lattribut.

30-6

Guide du dveloppeur

Abstraction de documents XML avec lexpert liaison de donnes

Outre la cration des interfaces (et des classes dimplmentation) pour chaque lment balis du document XML, lexpert cre une fonction globale pour obtenir une interface sur le nud racine. Si, par exemple, le code XML prcdent provient dun document dont le nud racine est la balise <Customers>, lexpert Liaison de donnes cre la routine globale suivante :
function GetCustomers(XMLDoc: TXMLDocument): ICustomers;

Lutilisation des interfaces gnres simplifie votre code car il reflte plus directement la structure du document XML. Ainsi, au lieu dcrire du code comme le suivant :
CustName := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes['name'].Value;

Votre code peut avoir la forme suivante :


CustName := GetCustomers(XMLDocument1)[0].Name;

Remarquez que les interfaces gnres par lexpert Liaison de donnes descendent toutes de IXMLNode. Cela signifie que vous pouvez toujours ajouter ou supprimer des nuds enfant comme si vous nutilisiez pas lexpert Liaison de donnes (voir Ajout et suppression de nuds enfant la page 30-5.) De plus, quand les nuds enfant reprsentent des lments rpts (tous les enfants dun nud ayant le mme type), le nud parent dispose de deux mthodes Add et Insert, pour ajouter dautres rptitions. Ces mthodes sont plus simples que AddChild car il nest pas ncessaire de spcifier le type de nud crer.

Utilisation de lexpert Liaison de donnes XML


Pour utiliser lexpert Liaison de donnes :

1 Choisissez Fichier|Nouveau|Autre et slectionnez licne intitule Expert Liaison de donnes XML dans la page Nouveaux. 2 Lexpert Liaison de donnes XML saffiche. 3 Dans la premire page de lexpert :
Spcifiez le document XML ou le schma pour lequel vous voulez gnrer les interfaces. Ce peut tre un document XML, un fichier de dfinition de type (.dtd), un fichier de donnes XML abrges (.xdr) ou un fichier schma XML (.xsd).

4 Choisissez le bouton Options pour spcifier la stratgie de nomenclature que doit utiliser lexpert lors de la gnration des interfaces et des classes dimplmentation ainsi que les correspondances par dfaut entre les types dfinis dans le schma et les types de donnes Pascal. 5 Passez la seconde page de lexpert. Cette page vous permet de fournir des informations dtailles sur chaque type de nud du document ou du schma. A gauche, se trouve une vue arborescente montrant tous les types de nuds du document. Pour les nuds complexes (les nuds ayant des enfants), la vue arborescente peut tre dveloppe pour afficher les lments enfant. Quand vous slectionnez un nud dans cette vue arborescente, le volet de

Utilisation de documents XML

30-7

Abstraction de documents XML avec lexpert liaison de donnes

droite de la bote de dialogue affiche des informations sur ce nud et vous permet de spcifier comme lexpert doit le traiter. La zone Nom de la source affiche le nom du type de nud dans le schma XML. La zone Type de donnes affiche le type de la valeur du nud comme spcifie par le schma XML. La zone Documentation vous permet dassocier des commentaires au schma dcrivant lutilisation ou la fonction du nud. Si lexpert gnre du code pour le nud slectionn (cest--dire sil sagit dun type complexe pour lequel lexpert gnre une interface et une classe dimplmentation ou sil sagit dun des nuds enfant dun type complexe pour lequel lexpert gnre une proprit dans linterface du type complexe), vous pouvez utiliser la case cocher Gnrer la liaison pour spcifier si lexpert doit grer du code pour ce nud. Si vous ne cochez pas la case, lexpert ne gnre pas linterface et la classe dimplmentation pour un type complexe et ne cre pas de proprit dans linterface parent pour un nud enfant ou un attribut. La section Options de liaison vous permet de contrler le code gnr par lexpert pour llment slectionn. Pour tous les nuds, vous pouvez spcifier le Nom didentifiant (le nom de linterface gnre ou de la proprit). De plus, pour les interfaces, vous devez indiquer celle qui reprsente le nud racine du document. Pour les nuds reprsentant des proprits, vous pouvez spcifier le type de la proprit et, si la proprit nest pas une interface, sil sagit dune proprit en lecture seule.

6 Une fois spcifi le code que lexpert doit gnrer pour chaque nud, passez la troisime page. Cette page vous permet de choisir certaines options globales contrlant comment lexpert gnre le code, vous permet de prvisualiser le code qui sera gnr et vous permet de demander conserver vos options pour des utilisations ultrieures.
Pour prvisualiser le code gnr par lexpert, slectionnez une interface dans la liste Rcapitulatif des liaisons et visualisez la dfinition dinterface dans la zone Prvisualisation du code. Utilisez la zone Paramtres de liaison des donnes pour indiquer comment lexpert doit enregistrer vos choix. Vous pouvez stocker vos choix comme annotations dans un fichier schma associ au document (le fichier schma spcifi dans la premire page de la bote de dialogue) ou vous pouvez nommer un fichier schma autonome utilis uniquement par lexpert.

7 Quand vous choisissez Terminer, lexpert Liaison de donnes gnre une nouvelle unit dfinissant les interfaces et les classes dimplmentation pour tous les types de nuds de votre document XML. De plus, il cre une fonction globale qui attend un objet TXMLDocument et renvoie linterface sur le nud racine de la hirarchie de donn es.

30-8

Guide du dveloppeur

Abstraction de documents XML avec lexpert liaison de donnes

Utilisation du code gnr par lexpert Liaison de donnes XML


Quand lexpert a gnr lensemble dinterfaces et de classes dimplmentation, vous pouvez les utiliser pour manipuler des documents XML correspondants la structure du document ou du schma fourni lexpert. Tout comme pour lutilisation des composants XML intgrs livrs avec Delphi, votre point de dpart est le composant TXMLDocument qui apparat dans la page Internet de la palette des composants. Pour manipuler un document XML, suivez les tapes ci-aprs :

1 Placez un composant TXMLDocument dans votre fiche ou votre module de donnes. 2 Liez le TXMLDocument un document XML en initialisant la proprit FileName (vous pouvez aussi utiliser lexcution une chane XML avec la proprit XML). 3 Dans votre code, appelez la fonction globale gnre par lexpert pour obtenir une interface sur le nud racine du document XML. Si, par exemple, llment racine du document XML est la balise <StockList>, lexpert gnre par dfaut une fonction GetStockListType, qui renvoie une interface IStockListType :
var StockList: IStockListType; begin StockList := GetStockListType(XMLDocument1);

4 Cette interface a des proprits qui correspondent aux sous-nuds de llment racine du document ainsi que des proprits qui correspondent aux attributs de cet lment racine. Vous pouvez les utiliser pour parcourir la hirarchie du document XML, modifier les donnes du document, etc. 5 Pour enregistrer les modifications effectues en utilisant les interfaces gnres par lexpert, appelez la mthode SaveToFile du composant TXMLDocument ou lisez sa proprit XML.

Utilisation de documents XML

30-9

30-10

Guide du dveloppeur

31
Chapitre 31

Chapitre

Utilisation de services Web

Les services Web sont des applications modulaires autonomes qui peuvent tre publies et invoques travers un rseau (comme le Web). Les services Web proposent des interfaces bien dfinies qui dcrivent les services fournis. Les services Web sont conus pour permettre un couplage flexible entre client et serveur. Cest--dire que limplmentation du serveur nimpose pas au client lutilisation dune plate-forme ou dun langage de programmation spcifique. Non seulement les interfaces sont dfinies en restant neutre quant au langage, mais elles sont galement conues pour utiliser diffrents mcanismes de communication. La gestion par Delphi des services Web est conue pour fonctionner en utilisant le protocole SOAP (Simple Object Access Protocol). SOAP est un protocole standard allg dfinissant lchange dinformations dans un environnement dcentralis et distribu. Il utilise le XML pour encoder des appels de procdures distantes et utilise gnralement HTTP comme protocole de communication. Pour davantage dinformations sur SOAP, voir ses spcifications ladresse suivante :
http://www.w3.org/TR/SOAP/ Remarque

Mme si la gestion par Delphi des services Web est base sur lutilisation de SOAP et dHTTP, le modle est suffisamment souple pour tre tendu afin dutiliser dautres protocoles dencodage ou de communications. La technologie base sur SOAP propose par Delphi est disponible pour le moment sous Windows et elle sera ultrieurement implmente sous Linux, afin de servir de base des applications distribues multiplates-formes. Il ny a pas de runtime client particulier installer comme cest le cas pour des applications distribues utilisant CORBA. Comme cette technologie repose sur des messages HTTP ; elle a cet avantage dtre disponible sur diverses machines. La gestion des services Web constitue le sommet de larchitecture multiplate-forme dapplications serveur Web de Delphi. Vous pouvez utiliser Delphi pour concevoir aussi bien des serveurs implmentant des services Web que des clients appelant ces serveurs. Si vous

Utilisation de services Web

31-1

Conception de serveurs grant les services Web

utilisez Delphi pour crer les applications client et serveur, il est possible de partager entre elles une mme unit dfinissant les interfaces des services Web. De plus, vous pouvez avec Delphi crire des clients pour tout serveur qui implmente des services Web rpondant aux messages SOAP ou des serveurs Delphi publiant des services Web utilisables par des clients quelconques. Si le client ou le serveur nest pas crit en utilisant Delphi, vous pouvez publier ou importer les informations dcrivant les interfaces disponibles et la manire de les appeler en utilisant un document WSDL (Web Service Definition Language). Ct serveur, votre application peut publier un document WSDL dcrivant votre service Web. Ct client, un expert peut importer un document WSDL publi afin de vous proposer les dfinitions dinterfaces et les informations de connexion dont vous avez besoin.

Conception de serveurs grant les services Web


Dans Delphi, les serveurs qui grent les services Web sont conus en utilisant des interfaces invocables. Ces interfaces sont des interfaces compiles afin de contenir des informations de type lexcution (RTTI). Ces informations sont utilises pour interprter les appels de mthodes entrant des clients afin de pouvoir les rpartir correctement. Outre les interfaces invocables, et les classes qui les implmentent, le serveur a besoin de deux composants : un rpartiteur et un invocateur. Le rpartiteur (THTTPSoapDispatcher) est un composant dauto-rpartition qui reoit les messages SOAP entrant et les transmet linvocateur. Linvocateur (THTTPSoapPascalInvoker) interprte le message SOAP, identifie linterface invocable auquel il fait rfrence, excute lappel et assemble le message de rponse.
Remarque

THTTPSoapDispatcher et THTTPSoapPascalInvoker sont conus pour rpondre des messages HTTP contenant une requte SOAP. Cependant, larchitecture sousjacente est suffisamment gnrale pour quelle puisse grer dautres protocoles en lui substituant dautres composants rpartiteur et invocateur. Une fois votre interface invocable et les classes dimplmentation recenses, le rpartiteur et linvocateur grent automatiquement tous les messages qui identifient ces interfaces dans len-tte SOAP Action du message de requte HTTP.

Conception dun serveur service Web


Suivez les tapes suivantes pour concevoir une application serveur qui implmente un service Web :

1 Dfinissez les interfaces constituant votre service Web. Ces dfinitions dinterface doivent tre des interfaces invocables. Il est judicieux de crer vos dfinitions dinterface dans des units distinctes de celles contenant les classes dimplmentation. Ainsi, lunit qui dfinit les interfaces peut tre incluse la fois dans lapplication serveur et lapplication client. Dans la section initialisation de cette unit, ajoutez du code pour recenser les interfaces. Pour

31-2

Guide du dveloppeur

Conception de serveurs grant les services Web

davantage dinformations sur la conception et le recensement dinterfaces invocables, voir Dfinition des interfaces invocables la page 31-4.

2 Si votre interface utilise des types complexes (non-scalaires), vous devez vous assurer quils peuvent tre transmis correctement. Lapplication service Web ne peut les grer quen utilisant des objets spciaux contenant des informations de type lexcution (RTTI) qui dcrivent leur structure. Pour davantage dinformations sur la cration et le recensement dobjets servant reprsenter des types complexes, voir Utilisation de types complexes dans des interfaces invocables la page 31-5. 3 Dfinissez et implmentez les classes qui implmentent les interfaces invocables dfinies ltape 1. Pour chaque classe dimplmentation, il peut tre ncessaire de crer une procdure de fabrication qui instancie la classe. Dans la section initialisation de lunit, ajoutez du code pour recenser la classe dimplmentation. Ce processus est dcrit dans la section Cration et recensement de limplmentation la page 31-6. 4 Si votre application dclenche une exception lors dune tentative dexcution dune requte SOAP, lexception est automatiquement encode dans un paquet derreur SOAP qui est renvoy la place du rsultat de lappel de mthode. Si vous voulez fournir davantage dinformations quun simple message derreur, vous pouvez crer vos propres classes dexception qui sont encodes et transmises au client. Pour davantage dinformations sur ce sujet, voir Cration de classes dexception personnalises pour les services Web la page 31-7. 5 Choisissez Fichier|Nouveau|Autre puis, dans la page Services Web, doublecliquez sur licne application service Web. Choisissez le type dapplication serveur Web que doit implmenter votre service Web. Pour davantage dinformations sur les diffrents types dapplications serveur Web, voir Types dapplications serveur Web la page 27-6. 6 Lexpert gnre une nouvelle application service Web qui inclut un composant invocateur (THTTPSOAPPascalInvoker) et un composant rpartiteur (THTTPSoapDispatcher). Linvocateur assure la conversion entres les messages SOAP et les mthodes des interfaces que vous avez dfinies ltape 1. Le rpartiteur rpond automatiquement aux messages SOAP entrant et les transmet linvocateur. Vous pouvez utiliser sa proprit WebDispatch pour identifier les messages de requ te HTTP que gre votre application. Cela suppose linitialisation de la proprit PathInfo pour indiquer la partie chemin daccs de toute URL dirige sur votre application, ainsi que la proprit MethodType afin dindiquer len-tte de mthode des messages de requte. 7 Choisissez Projet|Ajouter au projet et ajoutez votre application serveur Web les units cres lors des tapes 1 4. 8 Si vous voulez que votre application puisse fonctionner avec des clients qui nont pas t conus avec Delphi, publiez un document WSDL dfinissant vos interfaces et la manire de les appeler. Pour davantage dinformations sur la gnration dun document WSDL dcrivant votre application service Web, voir Gnration de documents WSDL pour une application service Web la page 31-8.

Utilisation de services Web

31-3

Conception de serveurs grant les services Web

Dfinition des interfaces invocables


Pour crer une interface invocable, il vous suffit de compiler une interface avec loption de compilation {$M+}. Le descendant dune interface invocable est galement invocable. Par contre, si une interface invocable drive dune autre interface qui ne lest pas, les clients de votre serveur service Web ne peuvent appeler que les mthodes dfinies par linterface invocable ou par ses descendants. Les mthodes hrites dun anctre non-invocable ne sont pas compiles avec des informations de type et de ce fait ne peuvent tre appeles par les clients. Delphi dfinit une interface invocable de base, IInvokable, qui peut servir de base toute interface expose aux clients par un serveur service Web. IInvokable est identique linterface de base ( IInterface) si ce nest quelle est compile en utilisant loption de compilation {$M+} afin quelle, et tout ses descendants, soient compils avec des informations de type lexcution. Par exemple, le code suivant dfinit une interface invocable contenant deux mthodes pour coder et dcoder des valeurs numriques :
IEncodeDecode = interface(IInvokable) [{C527B88F-3F8E-1134-80e0-01A04F57B270}] function EncodeValue(Value: Integer): Double; stdcall; function DecodeValue(Value: Double): Integer; stdcall; end;

Pour quune application service Web puisse utiliser cette interface invocable, elle doit tre recense dans le registre dinvocation. Sur le serveur, lentre du registre dinvocation permet aux composants invocateur (THTTPSOAPPascalInvoker) didentifier la classe dimplmentation utiliser pour lexcution des appels de linterface. Dans les applications client, une entre du registre dinvocation permet aux composants de rechercher les informations identifiant linterface invocable et la manire de lappeler. Dans la section initialisation de lunit dfinissant linterface, ajoutez du code pour recenser linterface dans le registre dinvocation. Pour accder au registre dinvocation, ajoutez lunit InvokeRegistry la clause uses de votre unit. Lunit InvokeRegistry dclare une variable globale, InvRegistry, qui stocke en mmoire un catalogue de toutes les interfaces invocables recenses, de leurs classes dimplmentation et des fabricants qui crent des instances de ces classes dimplmentation. Une fois termine, lunit qui dfinit linterface doit ressembler ce qui suit :
unit EncodeDecode; interface type IEncodeDecode = interface(IInvokable) [{C527B88F-3F8E-1134-80e0-01A04F57B270}] function EncodeValue(Value: Integer): Double; stdcall; function DecodeValue(Value: Double): Integer; stdcall; end; implementation

31-4

Guide du dveloppeur

Conception de serveurs grant les services Web

uses InvokeRegistry; initialization InvRegistry.RegisterInterface(TypeInfo(IEncodeDecode)); end.

Les interfaces de services Web doivent avoir un domaine dappellation pour pouvoir sidentifier parmi toutes les interfaces possibles de tous les services Web, donc lors du recensement dune interface dans le registre dinvocation, un domaine dappellation est gnr automatiquement pour linterface. Le domaine dappellation par dfaut est cr partir dune chane qui identifie lapplication de manire unique (la variable AppNamespacePrefix), le nom de linterface et le nom de lunit dans laquelle elle est dfinie.
Astuce

Il est judicieux dutiliser, pour dfinir les interfaces invocables, une unit distincte de celle utilise pour les classes dimplmentation des interfaces. Cette unit peut ainsi tre incluse la fois dans lapplication serveur et dans lapplication client. Comme le domaine dappellation gnr contient le nom de lunit dans laquelle linterface est dfinie, le partage de la mme unit dans les applications serveur et client permet dutiliser automatiquement le mme domaine dappellation.

Utilisation de types complexes dans des interfaces invocables


Le composant invocateur (THTTPSOAPPascalInvoker) sait automatiquement comment transmettre les types scalaires aux interfaces invocables. Il est galement capable de grer des tableaux dynamiques partir du moment ou ils sont recenss dans le registre des classes distantes (voir ci-dessous). Cependant, vous devez fournir une gestion supplmentaire si vous voulez transmettre des donnes ayant un type plus complexe : tableaux statiques, interfaces, enregistrements, ensembles ou classes. Cette gestion est assure par une classe qui contient des informations de type lexcution quutilise linvocateur pour effectuer la conversion entre donnes du flux SOAP et valeurs types. Utilisez TRemotable comme classe de base pour dfinir une classe reprsentant un type de donnes complexe dune interface invocable. Si par exemple, il vous faut transmettre comme paramtre un enregistrement, il faut dfinir un descendant de TRemotable dans lequel chaque membre de lenregistrement est une proprit publie de la nouvelle classe. Si la valeur de votre descendant de TRemotable reprsente un type scalaire dun document WSDL qui ne correspond pas un type scalaire Pascal Objet, utilisez la place TRemotableXS comme classe de base. TRemotableXS est un descendant de TRemotable qui introduit deux nouvelles mthodes pour assurer la conversion entre votre nouvelle classe et sa reprsentation sous forme de chane. Fournissez ces mthodes en surchargeant les mthodes XSToNative et NativeToXS. Dans la section initialisation de lunit qui dfinit le descendant de TRemotable, vous devez recenser la classe dans le registre des classe distantes. Pour accder au registre des classes distantes, vous devez inclure lunit InvokeRegistry la clause uses. Cette unit dclare une variable globale, RemClassRegistry, qui stocke un catalogue de toutes les classes distantes recenses et indique pour chacune si leurs valeurs sont transmises sous forme de chanes. Par exemple, la ligne

Utilisation de services Web

31-5

Conception de serveurs grant les services Web

suivante provient de lunit XSBuiltIns. Elle recense TXSDateTime, un descendant de TRemotable qui reprsente des valeurs TDateTime :
RemClassRegistry.RegisterXSClass(TXSDateTime, XMLSchemaNameSpace, dateTime, True);

Le premier paramtre est le nom du descendant de TRemotable. Le deuxime est un identificateur de ressource uniforme (URI) qui identifie de manire unique le domaine dappellation de la nouvelle classe. Si vous spcifiez une chane vide, le registre peut gnrer lURI votre place. Le troisime paramtre est le nom du type de donnes que la classe reprsente. Si vous spcifiez une chane vide, le registre utilise simplement le nom de la classe. Le dernier paramtre indique si la valeur de linstance de classe peut tre transmise sous forme de chane (cest-dire si vous avez implment les mthodes XSToNative et NativeToXS).
Astuce

Il est judicieux dimplmenter et de recenser les descendants de TRemotable dans une unit distincte du reste de votre application serveur, y compris des units qui dclarent et recensent les interfaces invocables. Vous pouvez, ainsi, utiliser lunit dfinissant votre type la fois dans le client et dans le serveur et vous pouvez galement utiliser le type dans plusieurs interfaces. Si vous utilisez des tableaux dynamiques pour les paramtres, vous navez pas besoin de crer une classe distante pour les reprsenter, mais vous devez les recenser dans le registre des classes distantes. Si, par exemple, votre interface utilise un type comme le suivant :
type TDateTimeArray = array of TXSDateTime;

Vous devez ajouter le recensement suivant la section initialisation de lunit dans laquelle vous dclarez le tableau dynamique :
RemClassRegistry.RegisterXSInfo(TypeInfo(TDateTimeArray), MyNameSpace, DTarray, False);

Les paramtres sont identiques ceux utiliss par RegisterXSClass, sauf pour le premier qui est un pointeur sur les informations de type du tableau dynamique la place dune rfrence la classe.

Cration et recensement de limplmentation


Le moyen le plus simple dcrire limplmentation dune interface invocable consiste crer une classe drivant de TInvokableClass. Ajoutez la dclaration de classe, y compris les interfaces invocables que vous grez, puis appuyez sur Ctrl+Maj+C pour obtenir lachvement de classe. Les membres de linterface apparaissent dans votre dclaration de classe et les mthodes vides sont places dans la section implmentation de lunit. Par exemple, la dclaration de la classe dimplmentation de linterface dclare dans la section Dfinition des interfaces invocables peut ressembler :
TEncodeDecode = class(TInvokableClass, IEncodeDecode) protected function EncodeValue(Value: Integer): Double; stdcall; function DecodeValue(Value: Double): Integer; stdcall; end;

31-6

Guide du dveloppeur

Conception de serveurs grant les services Web

Dans la section implmentation de lunit dclarant cette classe, remplissez les mthodes EncodeValue et DecodeValue. Une fois la classe dimplmentation cre, vous devez la recenser dans le registre dinvocation. Ce registre utilise cela pour identifier la classe qui implmente une interface recense et pour la rendre utilisable par le composant invocateur quand il a besoin dappeler linterface. Pour recenser la classe dimplmentation, ajoutez un appel la mthode RegisterInvokableClass de la variable globale InvRegistry dans la section initialisation de votre unit dimplmentation :
InvRegistry.RegisterInvokableClass(TEncodeDecode);

Vous pouvez galement crer des classes dimplmentation qui ne drivent pas de TInvokableClass. Cependant, vous devez dans ce cas fournir une procdure de fabrication quutilise le registre dinvocation pour crer des instances de votre classe. La procdure de fabrication doit tre de type TCreateInstanceProc . Elle renvoie une instance de votre classe dimplmentation. Si la procdure cre une nouvelle instance, lobjet doit se librer lui-mme quand le compteur de rfrence ses interfaces devient nul, en effet le registre dinvocation ne libre pas explicitement les instances dobjet. Sinon, autre solution, la procdure de fabrication peut renvoyer une rfrence une instance globale partag e par tous les appelants. Le code suivant illustre cette dernire approche :
procedure CreateEncodeDecode(out obj: TObject); begin if FEncodeDecode = nil then begin FEncodeDecode := TEncodeDecode.Create; {enregistre une rfrence linterface afin que linstance globale ne se libre pas elle-mme } FEncodeDecodeInterface := FEncodeDecode as IEncodeDecode; end; obj := FEncodeDecode; { renvoie linstance globale } end;

Quand vous utilisez une procdure de fabrication, fournissez la procdure de fabrication comme second paramtre de la mthode RegisterInvokableClass :
InvRegistry.RegisterInvokableClass(TEncodeDecode, CreateEncodeDecode);

Cration de classes dexception personnalises pour les services Web


Si lorsqu elle tente dexcuter une requte SOAP, votre application service Web dclenche une exception, les informations sur cette exception sont automatiquement codes dans un paquet derreur SOAP qui est renvoy la place du rsultat de lappel de mthode. Lapplication client dclenche alors lexception. Par dfaut, lapplication client dclenche juste une exception gnrique (Exception)avec le message derreur contenu dans le paquet derreur SOAP. Vous pouvez cependant transmettre des informations complmentaires sur lexception en utilisant une classe dexception drivant de ERemotableException. La valeur de toutes les proprits publies ajoutes votre classe dexception sont places

Utilisation de services Web

31-7

Conception de serveurs grant les services Web

dans le paquet derreur SOAP afin que le client puisse dclencher une exception quivalente. Pour utiliser un descendant de ERemotableException, vous devez le recenser dans le registre des classes distantes. Cest--dire que vous devez, dans lunit qui dfinit votre descendant de ERemotableException, ajouter lunit InvokeRegistry la clause uses et appeler la mthode RegisterXSClass de la variable globale RemClassRegistry. Si le client utilise la mme unit que celle qui dfinit et recense votre descendant de ERemotableException , lorsquil reoit le paquet derreur SOAP, il dclenche automatiquement une instance de la classe dexception approprie en initialisant toutes ses proprits avec les valeurs contenues dans le paquet derreur SOAP.

Gnration de documents WSDL pour une application service Web


Si vous incluez les mmes units qui dfinissent et recensent vos interfaces invocables, les classes qui reprsentent les informations des types complexes et vos exceptions distantes dans une application client Delphi, celle-ci peut gnrer des appels utilisant votre service Web. Il vous suffit juste de spcifier lURL o est installe lapplication service Web. Cependant, vous pouvez choisir de proposer votre service Web une gamme plus large de clients. Vous pouvez, par exemple, avoir des clients qui ne sont pas crits avec Delphi. Si vous dployez plusieurs versions de votre application serveur, vous pouvez prfrer ne pas utiliser une seule URL code en dur pour le serveur mais laisser plutt le client rechercher dynamiquement lemplacement du serveur. Dans ces cas, vous pouvez publier un document WSDL dcrivant les types et interfaces de votre service Web, ainsi que des informations sur la manire de les appeler. Pour publier un document WSDL dcrivant votre service Web, ajoutez simplement un composant TWSDLHTMLPublish votre module Web. TWSDLHTMLPublish est un composant dauto-rpartition, ce qui signifie quil rpond automatiquement aux messages entrant qui demandent une liste des documents WSDL pour votre service Web. Utilisez la proprit WebDispatch pour spcifier le chemin dinformation que les clients URL doivent utiliser pour accder la liste des documents WSDL. Les navigateurs Web peuvent alors demander une liste de documents WSDL en spcifiant une URL qui est constitue de lemplacement de lapplication serveur suivie du chemin spcifi par la proprit WebDispatch. Cette URL a la forme suivante :
http://www.myco.com/MyService.dll/WSDL Astuce

Si vous voulez utiliser un fichier WSDL physique la place, vous pouvez afficher le document WSDL dans votre navigateur Web puis lenregistrer afin de gnrer le fichier document WSDL. Il nest pas ncessaire de publier le document WSDL depuis la mme application que celle implmentant votre service Web. Pour crer une application qui publie simplement le document WSDL, omettez les units contenant les objets dimplmentation et nincluez que les units dfinissant et recensant les

31-8

Guide du dveloppeur

Conception de clients pour les services Web

interfaces invocables, les classes distantes qui reprsentent des types complexes et toutes les exceptions distantes. Par dfaut, quand vous publiez un document WSDL, il indique que les services sont disponibles la mme adresse que celle publiant le document WSDL (mais avec un chemin diffrent). Si vous dployez plusieurs versions de votre application service Web ou si vous dployez votre document WSDL depuis une application diffrente de celle qui implmente le service Web, vous devez modifier le document WSDL afin quil contienne des informations jour sur lemplacement du service Web. Pour changer lURL, utilisez ladministrateur WSDL. Vous devez tout dabord activer ladministrateur. Pour ce faire, initialisez la proprit AdminEnabled du composant TWSDLHTMLPublish True. Aprs, lorsque vous utilisez votre navigateur pour afficher la liste des documents WSDL, elle contient un bouton permettant galement de les administrer. Utilisez ladministrateur WSDL pour spcifier les emplacements (URL) o vous avez dploy votre application service Web.

Conception de clients pour les services Web


Delphi permet la conception de clients appelant des services Web utilisant une liaison de type SOAP. Ces services Web peuvent tre fournis par un serveur cr avec Delphi, ou par tout autre serveur dfinissant ses services Web dans un document WSDL. Si le serveur na pas t crit avec Delphi, vous devez tout dabord importer le document WSDL dcrivant le serveur. Ce processus est dcrit plus bas. Si le serveur a t crit en utilisant Delphi, il nest pas ncessaire dutiliser un document WSDL : il suffit dajouter votre projet les units qui dfinissent les interfaces invocables que vous souhaitez utiliser, ainsi que les units dfinissant les classes distantes reprsentant des types complexes ou des exceptions distantes que le service Web peut dclencher.
Remarque

Pour davantage dinformations sur la cration des units dfinissant une interface invocable dans un serveur de services Web Delphi, voir Dfinition des interfaces invocables la page 31-4. Pour davantage dinformations sur la cration dune unit dfinissant une classe distante pour un type complexe, voir Utilisation de types complexes dans des interfaces invocables la page 31-5. Pour davantage dinformations sur la cration dune unit dfinissant une exception distante, voir Cration de classes dexception personnalises pour les services Web la page 31-7.

Importation de documents WSDL


Avant de pouvoir utiliser un service Web qui na pas t crit avec Delphi, vous devez importer un document WSDL (ou un fichier schma XML) qui dfinit le service. Limportateur de service Web cre une unit qui dfinit et recense les interfaces et les types dont vous avez besoin.

Utilisation de services Web

31-9

Conception de clients pour les services Web

Pour utiliser limportateur de service Web, choisissez Fichier|Nouveau|Autre et, dans la page Services Web, double-cliquez sur licne de limportateur de services Web. Dans la bote de dialogue qui est affiche, spcifiez le nom de fichier du document WSDL (ou dun fichier schma XML) ou spcifiez lURL o est publie ce document. Quand vous cliquez sur le bouton Gnrer, limportateur cre de nouvelles units qui dfinissent et recensent les interfaces invocables pour les oprations dfinies dans le document, ainsi que pour les classes distantes correspondant aux types dfinis par le document. Si le document WSDL, ou le fichier schma XML, utilise des identificateurs qui sont galement des mots rservs Pascal Objet, limportateur adapte automatiquement leur nom afin que le code gnr soit compilable. Quand des types complexes sont dclars en ligne, limportateur ajoute du code pour dfinir et recenser les classes distantes correspondantes dans la mme unit que linterface invocable qui les utilise. Sinon, les types sont dfinis et recenss dans une unit distincte.

Appel des interfaces invocables


Pour appeler une interface invocable, lapplication client doit inclure toutes les units dfinissant les interfaces invocables et toutes les classes distantes implmentant des types complexes. Si le serveur est conu avec Delphi, ce sont les mmes units que celles utilises par lapplication serveur pour dfinir et recenser ces interfaces et ces classes. Il est prfrable dutiliser les mmes units, car lorsque vous recensez une interface invocable ou une classe distante, un identificateur de ressource uniforme (URI) lui est attribu pour lidentifier de manire unique. Cette URI est construite partir du nom de linterface (ou de la classe) et du nom de lunit dans laquelle elle est dfinie. Si le client et le serveur ne recensent pas linterface (ou la classe) en utilisant la mme URI, ils ne peuvent communiquer. Si vous nutilisez pas la mme unit, le code qui recense linterface et la classe dimplmentation doit spcifier explicitement une URI de domaine dappellation pour sassurer que le client et le serveur utilisent le mme domaine dappellation. Si le serveur nest pas conu avec Delphi ou si vous ne voulez pas utiliser pour le client la mme unit que celle utilise par le serveur, ces units peuvent tre cres par limportateur de services Web. Quand lapplication client dispose dune dclaration de linterface invocable, crez une instance de THTTPRio pour linterface voulue :
X := THTTPRio.Create(nil);

Fournissez ensuite lobjet THTTPRio les informations permettant didentifier linterface du serveur et de localiser le serveur. Il y a deux manires de spcifier ces informations : Si le serveur a t conu avec Delphi, lidentification de linterface du serveur se fait automatiquement en se basant sur lURI gnre lors du recensement de linterface. Il suffit donc dinitialiser la proprit URL afin dindiquer lemplacement du serveur. La partie chemin daccs de cette URL doit

31-10

Guide du dveloppeur

Conception de clients pour les services Web

correspondre au chemin daccs spcifi au composant rpartiteur du module Web du serveur :


X.URL := http://www.myco.com/MyService.dll/SOAP/;

Si le serveur na pas t conu en utilisant Delphi, THTTPRio doit rechercher dans un document WSDL lURI de linterface, information qui doit tre place dans len-tte Soap Action, ainsi que lemplacement du serveur. Pour ce faire, utilisez les proprits Service et Port de WSDLLocation :
X.WSDLLocation := Cryptography.wsdl; X.Service := Cryptography; X.Port := SoapEncodeDecode;

Vous pouvez ensuite utiliser loprateur as pour transtyper linstance de THTTPRio en linterface invocable. En procdant ainsi, cela cre dynamiquement en mmoire une vtable pour linterface associe, ce qui permet deffectuer les appels de linterface :
InterfaceVariable := X as IEncodeDecode; Code := InterfaceVariable.EncodeValue(5);

THTTPRio dpend du registre dinvocation pour obtenir des informations sur linterface invocable. Si lapplication client na pas de registre dinvocation ou si linterface invocable nest pas recense, THTTPRio ne peut pas construire la vtable en mmoire.

Utilisation de services Web

31-11

31-12

Guide du dveloppeur

32
Chapitre 32

Chapitre

Utilisation des sockets

Les composants socket vous permettent de crer une application pouvant communiquer avec dautres systmes par TCP/IP et ses protocoles associs. A laide des sockets, vous pouvez lire et crire sur des connexions dautres machines sans vous soucier des dtails concernant le logiciel rseau sous-jacent. Les sockets offrent des connexions bases sur le protocole TCP/IP et sont assez gnriques pour fonctionner avec des protocoles tels que User Datagram Protocol (UDP), Xerox Network System (XNS), DECnet de Digital ou la famille IPX/SPX de Novell. Lutilisation des sockets vous permet dcrire des applications serveur ou client qui lisent et crivent sur des systmes distants. Une application serveur ou client est en gnral ddie un service unique tel que HTTP (Hypertext Transfer Protocol) ou FTP (File Transfer Protocol). En utilisant les sockets serveur, une application offrant lun de ces services peut se lier aux applications client qui souhaitent utiliser ce service. Les sockets client permettent une application utilisant lun de ces services de se lier des applications serveur offrant ce service.

Implmentation des services


Les sockets offrent lun des composants dont vous avez besoin pour crer des applications serveur ou client. Pour beaucoup de services, tels que HTTP ou FTP, des serveurs dvelopps par diverses socits sont disponibles. Certains sont mme fournis en standard avec le systme dexploitation, ce qui vous vite den crer un vous-mme. Cependant, si vous dsirez affiner la faon dont le service est implment (pour obtenir, par exemple, une meilleure intgration de votre application et de la communication rseau) ou si aucun serveur nest disponible pour le service prcis dont vous avez besoin, vous devrez crer votre propre application serveur ou client. Par exemple, lorsque vous manipulez des ensembles de donnes distribus, vous pouvez crer une couche pour communiquer avec des bases de donnes sur les systmes distants.

Utilisation des sockets

32-1

Types de connexions par socket

Description des protocoles de services


Avant de crer un serveur ou un client rseau, vous devez comprendre le service que votre application offrira ou utilisera. La majorit des services ont des protocoles standard que votre application doit supporter. Si vous crez une application rseau pour un service standard tel que HTTP, FTP, Finger ou Time, vous devez comprendre les protocoles utiliss pour communiquer avec les systmes distants. Consultez la documentation se rapportant au service que vous comptez offrir ou utiliser. Si vous offrez un nouveau service pour une application qui communique avec des systmes distants, la premire tape consiste concevoir le protocole de communication pour les serveurs et les clients de ce service. Quels messages sont envoys ? Comment ces messages sont-ils structurs ? Comment les informations sont-elles codes ?

Communication avec les applications


Souvent, votre application serveur ou client offre une couche entre le logiciel rseau et lapplication qui utilise le service. Par exemple, un serveur HTTP est plac entre Internet et lapplication serveur Web qui fournit le contenu et gre les messages de demandes HTTP. Les sockets sont linterface entre votre application serveur ou client et le logiciel rseau. Vous devez fournir linterface entre votre application et les clients qui lutilisent. Vous pouvez copier lAPI dun autre serveur standard (comme Apache) ou vous pouvez concevoir et publier votre propre API.

Services et ports
La plupart des services standard sont associs, par convention, des numros de ports prcis. Nous tudierons plus tard ces numros de ports. Pour linstant, considrez le numro de port comme un code numrique pour ce service. Si vous implmentez un service standard, les objets socket Linux fournissent des mthodes de recherche de numro de port pour le service. Si vous offrez un service nouveau, vous pouvez spcifier son numro de port dans un fichier / etc/services. Voir votre documentation Linux, pour davantage dinformations sur la configuration dun fichier de services.

Types de connexions par socket


Les connexions par socket peuvent tre scindes en trois groupes principaux indiquant la faon dont la connexion a t ouverte et le type de connexion : Connexions client Connexions dcoute Connexions serveur

32-2

Guide du dveloppeur

Description des sockets

Lorsque la connexion au socket client est effective, la connexion serveur est identique une connexion client. Les deux extrmits ont les mmes possibilits et reoivent des vnements de mme type. Seule la connexion dcoute est fondamentalement diffrente, car elle ne comporte quune extrmit.

Connexions client
Les connexions client connectent un socket client sur le systme local un socket serveur sur un systme distant. Les connexions client sont lances par le socket client. En premier lieu, le socket client doit dcrire le socket serveur auquel il souhaite se connecter. Le socket client recherche ensuite le socket serveur et, lorsquil la trouv, demande une connexion. Le socket serveur peut ne pas tablir immdiatement la connexion. Les sockets serveur grent une file dattente des demandes de clients et tablissent la connexion lorsquils le peuvent. Lorsque le socket serveur accepte la connexion du client, il envoie au socket client une description complte du socket serveur auquel il se connecte et la connexion est finalise par le client.

Connexions dcoute
Les sockets serveur ne localisent pas les clients : ils gnrent des demiconnexions passives qui restent lcoute des requtes des clients. Les sockets serveur associent une file dattente leurs connexions dcoute ; la file dattente enregistre les requtes de connexion lorsquelles lui parviennent. Lorsque le socket serveur accepte une demande de connexion client, il forme un nouveau socket pour se connecter au client pour que la connexion dcoute reste ouverte afin daccepter dautres requtes de clients.

Connexions serveur
Les connexions serveur sont formes par des sockets serveur lorsque le socket dcoute accepte une requte du client. La description du socket serveur ayant effectu la connexion au client est envoye au client lorsque le serveur accepte la connexion. La connexion est tablie lorsque le socket client reoit cette description et effectue vritablement la connexion.

Description des sockets


Les sockets permettent votre application de communiquer avec des systmes distants par le biais dun rseau. Chaque socket peut tre considr comme un point de terminaison dans une connexion rseau. Il possde une adresse qui spcifie : le systme sur lequel il sexcute ; les types dinterfaces quil comprend ; le port quil utilise pour la connexion.

Utilisation des sockets

32-3

Description des sockets

Une description complte dune connexion par socket inclut les adresses du socket chaque extrmit de la connexion. Vous pouvez dcrire ladresse de chaque extrmit du socket en fournissant lhte ou ladresse IP et le numro de port. Avant de faire une connexion par socket, vous devez dcrire compltement les sockets formant ses extrmits. Certaines informations sont disponibles sur le systme excutant votre application. Par exemple, il nest pas ncessaire de dcrire ladresse IP locale dun socket client car elle est dans le systme dexploitation. Les informations fournir dpendent du type de socket implment. Les sockets client doivent dcrire le serveur auquel ils souhaitent se connecter. Les sockets serveur dcoute doivent dcrire le port reprsentant le service quils offrent.

Description des htes


Lhte est le systme qui excute lapplication contenant le socket. Vous pouvez dcrire les htes un socket en fournissant son adresse IP, qui consiste en une chane de quatre valeurs numriques au format Internet standard, par exemple :
123.197.1.2

Un systme peut grer plusieurs adresses IP. Les adresses IP sont difficiles mmoriser. Lalternative consiste utiliser le nom de lhte. Les noms dhtes sont des alias dadresses IP exprimes au format URL (Uniform Resource Locator). Une chane dURL comporte un nom de domaine et un service, par exemple :
http://www.ASite.com

La majorit des intranets fournit des noms dhtes pour les adresses IP des systmes sur Internet. Pour dterminer le nom dhte ventuellement associ une adresse IP, excutez la commande suivante depuis la ligne de commande :
nslookup IPADDRESS

O IPADDRESS est ladresse IP qui vous intresse. Si votre adresse IP locale na pas de nom dhte et que vous en souhaitez une, contactez votre administrateur rseau. Les sockets serveur nont pas besoin de spcifier dhtes. Ladresse IP locale peut tre obtenue auprs du systme. Si le systme local gre plusieurs adresses IP, les sockets coutent les requtes client sur toutes ces adresses en mme temps. Lorsquun socket serveur accepte une connexion, le socket client indique ladresse IP du systme distant. Les sockets client doivent spcifier les htes distants en fournissant leur nom ou leur adresse IP.

32-4

Guide du dveloppeur

Utilisation des composants socket

Choix entre le nom de lhte et son adresse IP


La majorit des applications utilise un nom dhte pour dsigner un systme. Les noms dhtes sont en effet plus faciles mmoriser. De plus, les serveurs peuvent changer ladresse IP ou le systme associ un nom dhte prcis. Le fait dutiliser les noms dhtes permet au socket client de trouver le site abstrait reprsent par le nom dhte mme sil a chang dadresse IP. Si le nom de lhte vous est inconnu, le socket client doit spcifier le systme serveur par son adresse IP. Ce processus donne des recherches plus rapides car, lorsque vous spcifiez un nom dhte, le socket doit rechercher ladresse IP associe ce nom pour localiser le systme serveur.

Utilisation des ports


Mme si une adresse IP contient assez dinformations pour trouver le systme lautre bout de la connexion socket, vous devez galement indiquer un numro de port sur ce systme. Sans les numros de port, un systme ne pourrait former quune connexion la fois. Les numros de port sont des identificateurs uniques permettant un ordinateur daccepter plusieurs connexions simultanes en attribuant chaque connexion un numro de port distinct. Nous avons dcrit prcdemment les numros de port comme des codes numriques pour les services implments par les applications rseau. Il sagit dune convention permettant aux connexions serveur dcoute de se librer sur un numro de port fixe pour quelles puissent tre trouves par les sockets client. Les sockets serveur coutent sur le numro de port associ au service quils offrent. Lorsqu ils acceptent une connexion un socket client, ils crent une connexion socket distincte utilisant un autre numro de port attribu arbitrairement. De cette faon, la connexion dcoute peut rester vigilante sur le numro de port associ au service. Les sockets client utilisent un numro de port local arbitraire car ils nont pas besoin dtre dtects par les autres sockets. Ils spcifient le numro de port du socket serveur auquel ils dsirent se connecter pour pouvoir trouver lapplication serveur. Souvent, ce numro de port est spcifi indirectement en nommant le service souhait.

Utilisation des composants socket


La page Internet de la palette des composants propose trois composants socket permettant votre application rseau de constituer des connexions avec dautres machines et de lire ou dcrire des informations travers cette connexion. Ce sont : TcpServer TcpClient UdpSocket

Utilisation des sockets

32-5

Utilisation des composants socket

Des objets socket sont associs chacun de ces composants socket, et reprsentent lextrmit dune connexion socket existante. Les composants socket utilisent les objets socket pour encapsuler les appels du socket serveur pour que votre application nait pas connatre les dtails de ltablissement de la connexion ou de la gestion des messages du socket Si vous souhaitez personnaliser les dtails des connexions quun composant socket effectue pour vous, vous pouvez utiliser les proprits, les vnements et les mthodes des objets socket.

Obtenir des informations sur la connexion


Une fois la connexion tablie avec le socket client ou serveur, vous pouvez utiliser lobjet socket client ou serveur associ votre composant socket pour obtenir des informations sur la connexion. Utilisez les proprits LocalHost et LocalPort pour dterminer ladresse et le numro de port utiliss par le socket client ou serveur local ; utilisez les proprits RemoteHost et RemotePort pour dterminer ladresse et le numro de port utiliss par le socket client ou serveur distant. Utilisez la mthode GetSocketAddr pour construire une adresse de socket correcte partir du nom dhte et du numro de port. Vous pouvez utiliser la mthode LookupPort pour rechercher le numro de port. Utilisez la mthode LookupProtocol pour rechercher le numro de protocole. Utilisez la mthode LookupHostName pour dterminer le nom dhte partir de ladresse IP de la machine hte. Pour visualiser le trafic rseau entrant ou sortant par le socket, utilisez les proprits BytesSent et BytesReceived.

Utilisation de sockets client


Ajoutez un composant socket client (TTcpClient ou UdpSocket) votre fiche ou votre module de donnes pour transformer votre application en client TCP/IP ou UDP. Les sockets client vous permettent de spcifier le socket serveur auquel vous souhaitez vous connecter et le service que vous attendez de ce serveur. Lorsque vous avez dcrit la connexion voulue, vous pouvez utiliser le composant socket client pour tablir la connexion au serveur. Chaque composant socket client utilise un seul objet socket client pour reprsenter lextrmit client dune connexion.

Dsignation du serveur souhait


Les composants socket client ont de nombreuses proprits qui vous permettent de spcifier le systme serveur et le port auxquels vous souhaitez vous connecter. Utilisez la proprit RemoteHost pour spcifier le serveur hte distant par son nom dhte ou son adresse IP. En plus du systme serveur, vous devez spcifier le port du systme serveur sur lequel votre socket client se connectera. Vous pouvez utiliser la proprit RemotePort pour spcifier ce numro de port directement ou indirectement en nommant le service de destination.

32-6

Guide du dveloppeur

Utilisation des composants socket

Formation de la connexion
Lorsque les proprits de votre composant socket client dcrivent le serveur auquel vous souhaitez vous connecter, vous pouvez former la connexion lexcution en appelant la mthode Open. Si vous souhaitez que votre application forme automatiquement la connexion son ouverture, mettez la proprit Active True lors de la conception, laide de linspecteur dobjets.

Obtention dinformations sur la connexion


Lorsque vous avez ouvert une connexion dcoute avec votre socket serveur, vous pouvez utiliser lobjet socket serveur associ votre composant socket serveur pour obtenir des informations sur la connexion. Utilisez les proprits LocalHost et LocalPort pour dterminer ladresse et le numro de port utiliss par les sockets client et serveur pour former les extrmits de la connexion. Utilisez la proprit Handle pour obtenir un handle sur la connexion socket utiliser lorsque vous faites des appels de socket.

Fermeture de la connexion
Lorsque vous avez fini de communiquer avec une application serveur sur la connexion socket, vous pouvez fermer la connexion en appelant la mthode Close. La connexion peut galement tre ferme depuis le serveur. Si cest le cas, vous en tes inform par un vnement OnDisconnect.

Utilisation de sockets serveur


Ajoutez un composant socket serveur (TTcpServer ou UdpSocket) votre fiche ou votre module de donnes pour transformer votre application en serveur IP. Les sockets serveur vous permettent de spcifier le service que vous offrez ou le port que vous utilisez pour couter les requ tes client. Vous pouvez utiliser le composant socket serveur pour couter et accepter les requtes de connexion client. Chaque composant socket serveur utilise un seul objet socket serveur pour reprsenter lextrmit serveur dune connextion dcoute. Il utilise galement un objet socket serveur comme extrmit serveur de chaque connexion active avec un socket client qui a t accepte par le serveur.

Dsignation du port
Pour que votre socket serveur puisse couter les requtes de connexion client, vous devez spcifier un port dcoute. Vous pouvez spcifier ce port laide de la proprit LocalPort. Si votre application serveur offre un service standard associ par convention un numro de port prcis, vous pouvez aussi spcifier le nom du service laide de la proprit LocalPort. Il est recommand dutiliser plutt le nom du service car il est facile de faire des fautes de saisie en entrant le numro de port.

Utilisation des sockets

32-7

Rponse aux vnements socket

Ecoute des requtes client


Lorsque vous avez dfini le numro de port de votre composant socket serveur, vous pouvez former une connexion dcoute lexcution en appelant la mthode Open. Si vous souhaitez que cette connexion soit forme automatiquement au lancement de lapplication, mettez la proprit Active True lors de la conception, laide de linspecteur dobjets.

Connexion aux clients


Un composant socket serveur dcoute accepte automatiquement les requtes de connexion des clients leur rception. Vous en recevez chaque fois automatiquement la notification dans un vnement OnAccept.

Fermeture des connexions serveur


Lorsque vous souhaitez fermer la connexion dcoute, appelez la mthode Close ou dfinissez la proprit Active False. Ceci ferme toutes les connexions tablies avec les applications client, annule les connexions en attente non encore acceptes et met fin la connexion dcoute, aprs quoi votre composant socket serveur naccepte pas de nouvelles connexions. Lorsque les clients TCP mettent fin leur connexion votre socket serveur, vous en tes inform par un vnement OnDisconnect.

Rponse aux vnements socket


Quand vous crivez des applications utilisant les sockets, vous pouvez crire ou lire dans le socket nimporte o dans le programme. Vous pouvez crire en utilisant les mthodes SendBuf, SendStream ou Sendln lorsque le socket a t ouvert. Vous pouvez lire depuis le socket en utilisant les mthodes ReceiveBufet Receiveln. Les vnements OnSendet RecvBuf sont dclenchs chaque fois que quelque chose a t crit ou lu dans le socket. Ils peuvent tre utiliss pour le filtrage. Chaque fois que vous lisez ou crivez, un vnement de lecture ou dcriture est dclench. Les sockets client et les sockets serveur g nrent tous deux des vnements derreurs lorsqu ils reoivent des messages derreur mis par la connexion. Les composants socket reoivent galement deux vnements au cours de louverture et de la terminaison de la connexion. Si votre application doit influer sur louverture du socket, vous devez utiliser les mthodes SendBuf et ReceiveBuf pour rpondre ces vnements client ou vnements serveur.

32-8

Guide du dveloppeur

Rponse aux vnements socket

Evnements derreurs
Les sockets client et serveur gnrent un vnement OnError lorsquils reoivent un message derreur mis par la connexion. Vous pouvez crire un gestionnaire dvnement OnError pour rpondre ces messages derreur. Le gestionnaire dvnement reoit des informations sur : lobjet socket ayant reu la notification derreur ; ce que le socket tentait de faire lorsque lerreur sest produite ; le code derreur fourni par le message derreur. Vous pouvez rpondre lerreur dans le gestionnaire dvnement et mettre le code derreur 0 pour empcher le socket de dclencher une exception.

Evnements client
Lorsquun socket client ouvre une connexion, les vnements suivants se produisent : Le socket est paramtr et initialis pour la notification dvnements. Un vnement OnCreateHandle se produit une fois que le serveur et le serveur socket sont crs. A ce moment, lobjet socket accessible par la proprit Handle peut fournir des informations sur le serveur ou client socket qui sera lautre extrmit de la connexion. Ceci est la premire possibilit dobtenir le numro de port utilis pour la connexion, qui peut diffrer du numro de port des sockets dcoute qui ont accept la connexion. La demande de connexion est accepte par le serveur et gre par le socket client. Un vnement de notification OnConnect se produit aprs ltablissement de la connexion.

Evnements serveur
Les composants socket serveur forment deux types de connexions : les connexions dcoute et les connexions aux applications client. Le socket serveur reoit des vnements lors de la formation de ces deux types de connexions.

Evnements dcoute
Juste avant que la connexion dcoute soit forme, lvnement OnListening se produit. Vous pouvez utiliser la proprit Handle pour modifier le socket avant quil ne soit ouvert pour lcoute. Par exemple, si vous souhaitez restreindre les adresses IP que le serveur utilise pour les coutes, vous pouvez le faire dans un gestionnaire dvnement OnListening.

Utilisation des sockets

32-9

Lectures et critures sur des connexions socket

Evnements de connexions client


Lorsquun socket serveur accepte une demande de connexion client, les vnements suivants se produisent : Un vnement OnAccept se produit, et transmet le nouvel objet TTcpClient au gestionnaire dvnement. Ceci est le premier point lorsque vous pouvez utiliser les proprits de TTcpClient pour obtenir des informations sur lextrmit serveur de la connexion un client. Si BlockMode est bmThreadBlocking, un vnement OnGetThread se produit. Si vous souhaitez fournir votre propre descendant de TServerSocketThread, vous pouvez en crer un dans un gestionnaire dvnement OnCreateServerSocketThread ; celui-ci sera utilis la place de TServerSocketThread. Si vous voulez effectuer une initialisation du thread ou des appels dAPI avant que le thread ne commence lire ou crire via la connexion, vous devez galement utiliser le gestionnaire dvnement OnGetThread. Le client termine la connexion et un vnement OnAccept se produit. Si vous utilisez un serveur non bloquant, vous pouvez alors commencer les lectures et les critures sur la connexion socket.

Lectures et critures sur des connexions socket


Lune des raisons pour lesquelles vous formez des connexions socket avec dautres machines est de pouvoir lire et crire des informations par le biais de ces connexions. Le type dinformations que vous lisez et crivez, ainsi que le moment auquel vous les lisez ou les crivez, dpendent du service associ la connexion socket. Les lectures et les critures sur sockets peuvent se drouler en mode asynchrone pour ne pas bloquer lexcution dautre code dans votre application rseau. Ceci sappelle une connexion non bloquante. Vous pouvez galement former des connexions bloquantes, lors desquelles votre application attend la fin de la lecture ou de lcriture avant dexcuter les instructions suivantes.

Connexions non bloquantes


Les connexions non bloquantes lisent et crivent de faon asynchrone, de sorte que le transfert de donnes ne bloque pas lexcution de code dans votre application rseau. Pour crer une connexion non bloquante pour les sockets client et serveur, initialisez la proprit BlockMode bmNonBlocking. Lorsque la connexion est non bloquante, la lecture et lcriture dvnements informent votre socket de la tentative de lecture et dcriture dinformations par le socket de lautre extrmit de la connexion.

32-10

Guide du dveloppeur

Lectures et critures sur des connexions socket

Lecture et criture dvnements


Les sockets non bloquants gnrent des vnements de lecture et dcriture lorsquil est ncessaire de lire ou dcrire via la connexion. Avec les sockets client, vous pouvez rpondre ces notifications dans un gestionnaire dvnement OnReceive ou OnSend. Lobjet socket associ la connexion socket est transmis comme paramtre aux gestionnaires dvnements en lecture et criture. Cet objet socket propose plusieurs mthodes pour lire ou crire via la connexion. Pour lire via la connexion de socket, utilisez les mthodes ReceiveBuf ou Receiveln. Pour crire via la connexion de socket, utilisez les mthodes SendBuf, SendStream ou Sendln.

Connexions bloquantes
Lorsque la connexion est bloquante, votre socket doit initier la lecture ou lcriture sur la connexion, plutt quattendre la notification manant de la connexion socket. Utilisez un socket bloquant lorsque votre ct de la connexion dcide du moment o doivent seffectuer les lectures et les critures. Pour les sockets client, initialisez la proprit BlockMode bmBlocking pour former une connexion bloquante. En fonction de ce dont est capable votre application client, il peut tre recommand de crer un nouveau thread dexcution pour les lectures ou les critures, de telle sorte que votre application puisse continuer lexcution du code dans dautres threads tout en attendant la fin des lectures ou des critures sur la connexion. Pour les sockets serveur, mettez la proprit BlockMode bmBlocking ou bmThreadBlocking pour former une connexion bloquante. Etant donn que les connexions bloquantes interrompent lexcution de tout autre code lorsque le socket attend que des informations soient crites ou lues sur la connexion, les composants de socket serveur gnrent toujours un nouveau thread dexcution pour chaque connexion client lorsque BlockMode est bmThreadBlocking. Quand BlockMode est bmBlocking, lexcution du programme est bloqu jusqu ce quune nouvelle connexion soit tablie.

Utilisation des sockets

32-11

32-12

Guide du dveloppeur

IV
Partie IV

Partie

Dveloppement dapplications COM

Les chapitres de cette partie prsentent les concepts ncessaires la construction dapplications COM : contrleurs Automation, serveurs Automation, contrles ActiveX et applications COM+.
Remarque

La prise en charge des clients COM est disponible dans toutes les ditions de Delphi. Nanmoins, vous avez besoin de ldition Professionnelle ou Entreprise pour crer des serveurs.

Dveloppement dapplications COM

33
Chapitre 33

Chapitre

Prsentation des technologies COM

Delphi fournit des experts et des classes qui facilitent limplmentation dapplications bases sur COM (Component Object Model) de Microsoft. Grce ces experts, vous pouvez crer des classes et des composants bass sur COM que vous utiliserez dans des applications, ou vous pouvez crer des clients ou des serveurs COM compltement fonctionnels qui implmentent des objets COM sophistiqus, des serveurs Automation (y compris, des objets Active Server), des contrles ActiveX ou des fiches ActiveForms.
Remarque

Les composants COM tels que ceux situs sur les pages ActiveX, COM+ et Servers de la palette des composants ne sont pas disponibles dans les applications CLX. Cette technologie est spcifique Windows et nest pas multiplate-forme. COM est un modle de composant logiciel indpendant du langage, conu pour permettre linteraction entre des composants logiciel et des applications sexcutant dans Windows. Laspect majeur de COM est quil permet la communication entre les composants, entre les applications et entre clients et serveurs par le biais dinterfaces clairement dfinies. Les interfaces reprsentent pour les clients un moyen dobtenir lexcution les fonctionnalits prises en charge par un composant COM. Pour que votre composant fournisse des fonctionnalits supplmentaires, il suffit dajouter une autre interface ces fonctionnalits. Les applications peuvent accder aux interfaces des composants COM sils figurent sur le mme ordinateur que les applications ou, sils figurent sur un autre ordinateur du rseau, laide dun mcanisme appel Distributed COM ou DCOM. Pour plus dinformations sur les clients, les serveurs et les interfaces, voir Composantes dune application COM la page 33-3. Ce chapitre prsente les concepts gnraux de la technologie sur laquelle sappuient lAutomation et les contrles ActiveX. Les chapitres suivants traiteront en dtail de la cration dobjets Automation et de contrles ActiveX dans Delphi.

Prsentation des technologies COM

33-1

COM, spcification et implmentation


COM est la fois une spcification et une implmentation. La spcification COM dfinit comment des objets sont crs et comment ils communiquent entre eux. Selon cette spcification, les objets COM peuvent tre crits dans diffrents langages, excuts dans diffrents espaces de processus et sur diffrentes platesformes. Tant que les objets adhrent la spcification, ils peuvent communiquer. Cela vous permet dintgrer le code de composants existants de nouveaux composants implments dans des langages orients objet. Limplmentation COM est construite dans le sous-systme Win32, qui fournit de nombreux services intgrs supportant la spcification crite. La bibliothque COM contient un ensemble dinterfaces standard dfinissant la fonctionnalit interne dun objet COM et un petit ensemble de fonctions API pour la cration et la gestion des objets COM. Lorsque vous utilisez dans votre application les experts de Delphi et les objets de la VCL, vous utilisez limplmentation Delphi de la spcification COM. En outre, Delphi fournit quelques enveloppes pour les services COM dont les fonctionnalits ne sont pas implmentes directement, comme les documents Active.Ces enveloppes sont dfinies dans lunit ComObj et les dfinitions API se trouvent dans lunit AxCtrls.
Remarque

Les objets et les langages des interfaces Delphi sont conformes la spcification COM. Limplmentation Delphi de la spcification COM utilise un ensemble de classes appel cadre de travail Delphi ActiveX (DAX). Ces classes se trouvent dans les units AxCtrls, OleCtrls et OleServer. En outre, linterface Pascal lAPI COM se trouve dans ActiveX.pas et ComSvcs.pas.

Extensions de COM
COM a volu et a t tendu au-del des services COM de base. COM sert de fondement dautres technologies, comme lAutomation, les contrles ActiveX, les documents Active et les annuaires Active. Pour plus de dtails, voir Extensions de COM la page 33-10. En outre, si vous travaillez dans un environnement distribu important, vous pouvez crer des objets COM transactionnels. Avant Windows 2000, ces objets ne faisaient pas partie de COM, mais sexcutaient dans lenvironnement Microsoft Transaction Server (MTS). Avec larrive de Windows 2000, cette gestion est intgre dans COM+. Les objets transactionnels sont dcrits en dtail dans le chapitre 39, Cration dobjets MTS ou COM+. Delphi fournit des experts permettant dimplmenter facilement des applications qui incorporent toutes ces technologies dans lenvironnement Delphi. Pour plus de dtails, voir Implmentation des objets COM laide dexperts la page 33-19.

33-2

Guide du dveloppeur

Composantes dune application COM

Composantes dune application COM


Quand vous implmentez une application COM, vous fournissez ceci : Interface COM Le moyen par lequel un objet expose ses services aux clients. Un objet COM fournit une interface pour chaque ensemble de mthodes. Attention : les proprits COM ne sont pas identiques aux proprits des objets VCL. Les proprits COM utilisent toujours des mthodes daccs en lecture/criture. Serveur COM Un module, EXE, DLL ou OCX, contenant le code dun objet COM. Les implmentations dobjets rsident sur les serveurs. Un objet COM implmente une ou plusieurs interfaces. Le code appelant les interfaces afin dobtenir du serveur les services demands. Les clients savent ce quils veulent obtenir du serveur (via linterface) ; les clients ne savent pas comment en interne le serveur fournit les services. Delphi facilite le processus de cration de client en vous permettant dinstaller des serveurs COM (tel qu un document Word ou une diapositive PowerPoint) en tant que composants sur la palette de composants. Cela vous permet de vous connecter au serveur et de vous lier ses vnements en utilisant linspecteur dobjets.

Client COM

Interfaces COM
Les clients COM communiquent avec des objets par le biais dinterfaces COM. Les interfaces sont des groupes de routines, lies par la logique ou par la smantique, qui assurent la communication entre le fournisseur dun service (objet serveur) et ses clients. Voici la reprsentation standard dune interface COM :
Figure 33.1 Une interface COM

Par exemple, chaque objet COM implmente linterface de base, IUnknown, qui indique au client les interfaces disponibles sur lobjet COM. Les objets peuvent avoir plusieurs interfaces, o chacune implmente une fonctionnalit. Linterface est le moyen de mettre disposition du client le service fourni par lobjet, sans lui donner les dtails de limplmentation sur la faon dont ce service est fourni. Les aspects majeurs des interfaces COM sont les suivants : Une fois publies, les interfaces sont immuables ; cest--dire qu elles ne changent plus. Une interface permet daccder un ensemble prcis de

Prsentation des technologies COM

33-3

Composantes dune application COM

fonctions. Les fonctionnalits supplmentaires sont fournies par le biais dinterfaces supplmentaires. Par convention, les identificateurs dinterfaces COM commencent par un I majuscule suivi dun nom symbolique dfinissant linterface, comme IMalloc ou IPersist. Lidentification unique des interfaces est garantie par un GUID (Globally Unique Identifier), qui est un nombre alatoire de 128 bits. Les GUID utiliss pour identifier les interfaces sont appels IID (Identificateurs dinterfaces). Ils permettent dliminer les conflits de noms entre diffrentes versions dun produit ou diffrents produits. Les interfaces sont indpendantes du langage. Vous pouvez utiliser nimporte quel langage pour implmenter une interface COM, condition que ce langage supporte les structures de pointeurs et puisse appeler une fonction via un pointeur, de faon explicite ou implicite. Les interfaces ne sont pas elles-mmes des objets ; elles fournissent laccs un objet. Donc, les clients nont pas accs directement aux donnes ; ils accdent aux donnes par le biais dun pointeur dinterface. Windows 2000 ajoute une couche supplmentaire dindirection connue en tant quintercepteur partir duquel il fournit des fonctionnalits COM+ telles que lactivation justin-time et le regroupement dobjets. Les interfaces sont toujours drives de linterface de base, IUnknown. Les interfaces peuvent tre rediriges par COM via des proxy pour permettre aux appels de mthodes de linterface de seffectuer entre diffrents threads, processus et machines en rseau, sans que les objets client ou serveur ne soient jamais informs de la redirection. Pour plus dinformations, voir Serveurs en processus, hors processus et distants la page 33-7.

Linterface COM de base, IUnknown


Les objets COM doivent tous supporter linterface fondamentale, appele IUnknown, un typedef du type dinterface de base IInterface. IUnknown contient les routines suivantes : QueryInterface AddRef et Release Fournit des pointeurs sur dautres interfaces supportes par lobjet. Mthodes simples de dcompte de rfrences qui permettent un objet de contrler sa dure de vie et de se supprimer lui-mme lorsque le client na plus besoin de son service.

Les clients obtiennent des pointeurs sur dautres interfaces via la mthode QueryInterface de IUnknown. QueryInterface connat chaque interface de lobjet serveur et peut donner au client un pointeur vers linterface demande. Lorsquil reoit un pointeur vers une interface, le client est assur de pouvoir appeler nimporte quelle mthode de linterface. Les objets contrlent leur propre dure de vie grce aux mthodes AddRef et Release de IUnknown, qui sont de simples mthodes de dcompte de rfrences.

33-4

Guide du dveloppeur

Composantes dune application COM

Tant que le dcompte de rfrences est diffrent de zro, lobjet reste en mmoire. D s quil atteint zro, limplmentation de linterface peut en toute scurit disposer du ou des objets sous-jacents.

Pointeurs dinterface COM


Un pointeur dinterface est un pointeur de 32 bits vers une instance dobjet qui pointe, son tour, vers limplmentation de chaque mthode de linterface. Limplmentation est accde via un tableau de pointeurs vers ces mthodes, appel vtable. Les vtables sont similaires au mcanisme utilis pour grer les fonctions virtuelles sous Pascal Objet. A cause de cette similitude, le compilateur peut rsoudre les appels de mthode de linterface de la mme manire quil rsout les appels des mthodes de classes Pascal Objet. La vtable est partage par toutes les instances dune classe objet, et pour chaque instance de lobjet, le code de lobjet alloue une deuxime structure contenant ses donnes prives. Le pointeur dinterface du client, est alors un pointeur vers le pointeur vers la vtable, comme le montre le diagramme suivant.
Figure 33.2 Vtable d interface

Dans Windows 2000 et toutes les versions ultrieures de Windows, quand un objet sexcute sous COM+, un niveau supplmentaire dindirection est fourni entre le pointeur dinterface et le pointeur vtable. Le pointeur dinterface disponible sur le client pointe sur un intercepteur, qui son tour pointe sur la vtable. Cela permet COM+ de fournir des services comme lactivation just-intime, par lequel le serveur peut tre dsactiv et ractiv dynamiquement dune faon opaque pour le client. COM+ garantit que lintercepteur se comporte comme sil tait un pointeur vtable ordinaire.

Serveurs COM
Un serveur COM est une application ou une bibliothque qui fournit des services une application ou bibliothque client. Un serveur COM est constitu dun ou de plusieurs objets COM, un objet COM tant un ensemble de proprits (donnes membre ou contenu) et de mthodes (fonctions membre). Les clients ne savent pas comment lobjet COM effectue son service ; limplmentation de lobjet est encapsule. Un objet met ses services disposition par le biais de ses interfaces comme dcrit prcdemment.

Prsentation des technologies COM

33-5

Composantes dune application COM

En outre, les clients nont pas besoin de savoir o rside lobjet COM. COM fournit un accs transparent quel que soit lemplacement de lobjet. Quand il demande un service un objet COM, le client transmet un identificateur de classe (CLSID) COM. Un CLSID est juste un GUID qui rfrence un objet COM. COM utilise ce CLSID, recens dans le registre systme, pour localiser limplmentation approprie du serveur. Une fois le serveur localis, COM amne le code en mmoire, et fait instancier par le serveur une instance de lobjet pour le client. Ce processus est gr indirectement par un objet spcial appel un fabricant (bas sur les interfaces) qui cre sur demande des instances dobjet. Au minimum, un serveur COM doit effectuer ceci : Recenser des entres dans le registre systme pour associer le module serveur lidentificateur de classe (CLSID). Implmenter un objet fabricant de classe, qui fabrique un autre objet partir dun CLSID particulier. Exposer le fabricant dobjet COM. Fournir un mcanisme de dchargement grce auquel un serveur qui ne sert pas de client pourra tre supprim de la mmoire.
Remarque

Les experts de Delphi automatisent la cration des objets et des serveurs COM comme dcrit dans Implmentation des objets COM laide dexperts la page 33-19.

CoClasses et fabricants de classes


Un objet COM est une instance dune CoClasse, qui est une classe implmentant une ou plusieurs interfaces COM. Lobjet COM fournit les services dfinis par ses interfaces. Les CoClasses sont instancies par un type dobjet spcial, appel un fabricant de classe. Chaque fois que des services dun objet sont demands par un client, un fabricant de classe cre une instance de cet objet pour ce client particulier. Gnralement, si un autre client demande les services de lobjet, le fabricant de classe cre une autre instance de lobjet pour ce deuxime client. Les clients peuvent galement se lier des objets COM en cours dexcution qui se recensent eux-mmes pour le grer. Une CoClasse doit possder un fabricant de classe et un identificateur de classe (CLSID) de sorte quil puisse tre instanci en externe, cest--dire pour un autre module. Lutilisation de ces identificateurs uniques pour les CoClasses implique quelles peuvent tre mises jour chaque fois que de nouvelles interfaces sont implmentes dans leur classe. Une nouvelle interface peut modifier ou ajouter des mthodes sans affecter les versions antrieures, ce qui est un problme courant lorsquon utilise des DLL. Les experts de Delphi prennent en compte lattribution didentificateurs de classe, limplmentation et linstanciation des fabricants de classe.

33-6

Guide du dveloppeur

Composantes dune application COM

Serveurs en processus, hors processus et distants


Avec COM, un client na pas besoin de savoir o rside un objet, il suffit de faire un appel une interface de lobjet. COM accomplit les tapes ncessaires cet appel. Ces tapes sont diffrentes selon que lobjet rside dans le mme processus que le client, dans un autre processus sur la machine du client ou sur une autre machine du rseau. Ces diffrents types de serveurs sont dcrits ici : Serveur en processus Une bibliothque (DLL) sexcutant dans le mme espace processus que le client, par exemple, un contrle ActiveX incorpor dans une page Web visualise sous Internet Explorer ou Netscape. Le contrle ActiveX est alors tlcharg sur la machine du client et appel dans le mme processus que le navigateur Web. Le client communique avec le serveur en processus grce des appels directs linterface COM. Serveur hors processus (ou serveur local) Une autre application (EXE) sexcutant dans un espace processus diffrent mais sur la mme machine que le client. Par exemple, une feuille de calcul Excel incorpore dans un document Word constitue deux applications distinctes tournant sur la mme machine. Le serveur local utilise COM pour communiquer avec le client. Serveur distant Une DLL ou une autre application sexcutant sur une machine diffrente de celle du client. Par exemple, une application Delphi de base de donnes connecte un serveur dapplication sur une autre machine du rseau. Le serveur distant utilise des interfaces COM distribues (DCOM) pour accder aux interfaces et communiquer avec le serveur dapplication. Comme illustr dans la figure suivante, pour les serveurs en processus, les pointeurs sur les interfaces de lobjet sont dans le mme espace processus que le client, et COM fait des appels directs dans limplmentation de lobjet.
Figure 33.3 Serveurs en processus

Remarque

Cela nest pas toujours vrai avec COM+. Quand le client appelle un objet dans un contexte diffrent, COM+ intercepte lappel afin quil se comporte comme lappel dun serveur hors processus (voir plus bas) mme si le serveur est en

Prsentation des technologies COM

33-7

Composantes dune application COM

processus. Pour davantage dinformations sur lutilisation de COM+, voir chapitre 39, Cration dobjets MTS ou COM+. Comme illustr dans la figure suivante, quand le processus est soit diffrent, soit sur une autre machine, COM utilise un proxy pour initier les appels de procdure distants. Le proxy rside dans le mme processus que le client, de sorte que vu du client, tous les appels des interfaces semblent pareils. Le proxy intercepte lappel du client et le transmet l o lobjet rel sexcute. Le mcanisme qui permet aux clients daccder aux objets dun espace processus diffrent, ou mme dune machine diffrente, comme sils se trouvaient dans leur propre processus, est appel le marshaling.
Figure 33.4 Serveurs hors processus et distants

La diffrence entre les serveurs hors processus et serveurs distants est le type de communication inter-processus utilis. Le proxy utilise COM pour communiquer avec un serveur hors processus et COM distribu (DCOM) pour communiquer avec une machine distante. DCOM transfre de manire transparente une demande dobjet local dans lobjet distant sexcutant sur une autre machine.
Remarque

Pour les appels de procdure distantes, DCOM utilise le protocole RPC fourni par lenvironnement de calcul distribu (DCE) de Open Source. Pour la scurit distribue, DCOM utilise le protocole de scurit NT LAN Manager (NTLM). Pour les services dannuaire, DCOM utilise DNS (Domain Name System).

Le mcanisme du marshaling
Le marshaling est le mcanisme qui permet un client de faire des appels aux fonctions de linterface dobjets distants qui se trouvent dans un autre processus ou sur une autre machine. Le marshaling Prend un pointeur dinterface dans le processus du serveur et rend un pointeur de proxy disponible au code dans le processus du client. Prend les arguments dun appel linterface passs depuis le client et les place dans lespace processus de lobjet distant.

33-8

Guide du dveloppeur

Composantes dune application COM

Pour tout appel linterface, le client met les arguments sur une pile et met un appel une fonction via le pointeur dinterface. Si lappel lobjet nest pas en processus, il est pass au proxy. Celui-ci compresse les arguments dans un paquet de marshaling et transmet la structure lobjet distant. Le stub de lobjet dcompresse le paquet, place les arguments sur la pile et appelle limplmentation de lobjet. Lobjet recre lappel du client dans son propre espace dadressage. Le type de marshaling dpend de ce que lobjet COM implmente. Les objets peuvent utiliser le mcanisme de marshaling standard fourni par linterface IDispatch. Cest un mcanisme de marshaling gnrique qui permet la communication via un appel standard une procdure distante (RPC). Pour plus de dtails sur linterface IDispatch, voir Interfaces dAutomation la page 36-13. Quand lobjet nimplmente pas IDispatch, sil se limite lui-mme aux types compatibles Automation et sil a une bibliothque de types recense, COM fournit automatiquement la gestion du marshaling. Les applications qui ne se limitent pas eux-mmes aux types compatibles automation ou recensent une bibliothque de types doivent fournir leur propre marshaling. Le marshaling est fourni par le biais dune implmentation de linterface IMarshal, ou en utilisant une DLL proxy/stub gnre sparment. Delphi ne prend pas en charge la gnration automatique des DLL proxy/stub.

Agrgation
Dans certains cas, un objet serveur peut utiliser un autre objet COM pour effectuer certaines de ces fonctions. Par exemple, un objet de gestion de stock peut utiliser un objet commande spar pour grer les commandes des clients. Si lobjet de gestion de stock veut prsenter une interface de commande au client, il y a un problme. Mme si le client ayant une interface stock peut appeler QueryInterface pour obtenir linterface commande, quand lobjet commande a t cr, il ne connat pas lobjet gestion de stock et ne peut lui renvoyer une interface stock en rponse un appel de QueryInterface. Un client qui a linterface commande ne peut revenir dans linterface stock. Pour viter ce problme, certains objets COM grent lagrgation. Quand lobjet gestion de stock cre une instance de lobjet commande, il lui transmet une copie de sa propre interface IUnknown. Lobjet commande peut ensuite utiliser cette interface IUnknown et grer les appels de QueryInterface qui demandent une interface, comme linterface stock, quil ne gre pas. Quand cela se produit, les deux objets pris ensemble sappellent un agrgat. Lobjet commande est appel lobjet interne (ou objet contenu) de lagrgat et lobjet stock est appel lobjet externe. Pour pouvoir se comporter comme objet externe dun agrgat, un objet COM doit crer lobjet interne en utilisant lAPI Windows CoCreateInstance ou CoCreateInstanceEx, en lui transmettant comme paramtre un pointeur IUnknown que lobjet interne peut utiliser pour les appels de QueryInterface. Pour crer un objet qui puisse se comporter comme objet interne dun agrgat, il doit descendre de TContainedObject. Quand lobjet est cr, linterface IUnknown de lobjet externe est transmise au constructeur afin quelle puisse tre utilise par la mthode QueryInterface pour les appels que lobjet interne ne peut pas traiter.

Remarque

Prsentation des technologies COM

33-9

Extensions de COM

Clients COM
Les clients peuvent toujours interroger les interfaces dun objet COM pour dterminer ce qu il est capable de faire. Tous les objets COM permettent aux clients de demander les interfaces connues. De plus, si le serveur gre linterface IDispatch, les clients peuvent demander au serveur des informations sur les mthodes gres par le serveur. Les objets serveurs nont pas dattentes concernant lutilisation de ses objets par le client. De mme, les clients nont pas besoin de savoir comment (ou mme si) un objet fournit les services ; ils sen remettent simplement sur les objets serveurs pour fournir les services quils annoncent via leurs interfaces. Il y a deux types de clients COM : les contrleurs et les conteneurs. Un contrleur lance le serveur et interagit avec lui via son interface. Il demande des services de lobjet COM ou il le pilote comme processus distinct. Les conteneurs accueillent des contrles visuels ou des objets qui apparaissent dans linterface utilisateur du conteneur. Ils utilisent des interfaces prdfinies pour ngocier les problmes daffichage avec les objets serveur. Il est impossible davoir une relation conteneur sur DCOM ; par exemple, les contrles visuels qui apparaissent dans linterface utilisateur du conteneur doivent tre localiss localement. En effet, les contrles sont supposs se dessiner eux-mmes, ce qui ncessite quils puissent accder aux ressources GDI locales. Delphi facilite le dveloppement dun contrleur Automation en permettant dimporter la bibliothque de types ou un contrle ActiveX dans un composant enveloppe de telle manire que les objets serveur apparaissent comme les autres composants VCL. Pour des dtails sur ce processus, voir chapitre 35, Cration de clients COM.

Extensions de COM
COM a t initialement conu pour fournir une fonctionnalit de communication de base et permettre lenrichissement de cette fonctionnalit via des extensions. COM lui-mme a tendu sa fonctionnalit premire en dfinissant des ensembles spcialiss dinterfaces couvrant des besoins spcifiques. Le tableau suivant est un rsum de certaines des extensions de services que COM fournit actuellement. Les sections suivantes dcrivent ces services en dtail. Serveurs Automation LAutomation dsigne la capacit dune application contrler par programme les objets dune autre application. Les serveurs Automation sont les objets qui peuvent tre contrls par dautres excutables lexcution. Les contrles ActiveX sont des serveurs en processus COM spcialiss, gnralement conus pour tre incorpors dans une application client. Les contrles proposent des comportements et des vnements la conception et lexcution.

Contrles ActiveX

33-10

Guide du dveloppeur

Extensions de COM

Pages Active Server

Les pages Active Server sont des scripts qui gnrent des pages HTML. Le langage de script contient des structures permettant la cration et lexcution dobjets Automation, cest--dire quune page Active Server se comporte comme un contrleur Automation Objets supportant la liaison et lincorporation, le glisserdplacer, ldition visuelle et lactivation in-situ. Les documents Word et les feuilles de calcul Excel sont des exemples de documents Active.

Documents Active

Objets Objets capable de rpondre un grand nombre de clients. Ils transactionnels proposent des caractristiques comme lactivation juste--temps, les transactions, le regroupement de ressources et des services de scurit. Ces caractristiques taient initialement gres par MTS, mais ont t intgres dans COM avec larrive de COM+. Bibliothques de types Collection de structures de donnes statiques, souvent enregistres en tant que ressource, fournissant des informations de type dtailles sur un objet et ses interfaces. Les clients des serveurs Automation, les contrles ActiveX et les objets transactionnels ont besoin des informations de type.

Le diagramme page suivante montre les relations entre les extensions de COM et la faon dont elles drivent de COM.
Figure 33.5 Technologies COM

Les objets COM peuvent tre visuels ou non visuels. Certains sexcutent dans le mme espace processus que leurs clients ; dautres peuvent sexcuter dans des

Prsentation des technologies COM

33-11

Extensions de COM

processus diffrents ou sur des machines distantes si les objets assurent le marshaling. Le tableau suivant rcapitule les types dobjets COM que vous pouvez crer, sils sont visuels, les espaces processus dans lesquels ils peuvent sexcuter, le marshaling quils fournissent et sils ont besoin dune bibliothque de types.
Tableau 33.1 Objet
Document Active Automation

Exigences des objets COM Objet visuel ?


Habituellement

Espace processus
En processus ou hors processus En processus, hors processus ou distant En processus En processus pour MTS, tous pour COM+ En processus

Communication
Verbes OLE

Biblioth que de types


Non

Parfois

Marshaling automatique via linterface IDispatch (pour les serveurs hors processus ou distants) Marshaling automatique via linterface IDispatch Marshaling automatique via une bibliothque de types Pas de marshaling requis pour les serveurs en processus Marshaling automatique via une bibliothque de types ; sinon, marshaling manuel via des interfaces personnalises

Requise pour le marshaling automatique Requise Requise

Contrle ActiveX MTS ou COM+

Habituellement Parfois

Objet interface personnalis Autre objet interface personnalis

Facultativement

Recommande

Facultativement

En processus, hors processus ou distant

Recommande

Serveurs Automation
LAutomation dsigne la capacit dune application contrler par programme les objets dune autre application, comme une macro qui peut manipuler plusieurs applications la fois. Le client dun objet Automation est appel contrleur Automation, et lobjet serveur manipul est appel objet Automation. LAutomation peut tre utilise sur des serveurs en processus, locaux ou distants. LAutomation prsente deux caractristiques : Lobjet Automation dfinit un ensemble de proprits et de commandes, et dcrit ses capacits via les descriptions de type. Pour ce faire, il doit disposer dun moyen de fournir des informations sur les interfaces de lobjet, les mthodes des interfaces et les arguments de ces mthodes. Gnralement, ces informations se trouvent dans des bibliothques de types. Le serveur Automation peut aussi gnrer des informations dynamiquement quand elles lui sont demandes via son interface IDispatch interface (voir plus bas).

33-12

Guide du dveloppeur

Extensions de COM

Les objets Automation rendent ces mthodes accessibles pour que dautres applications puissent les utiliser. Pour cela, ils implmentent linterface IDispatch. Cest par le biais de cette interface quun objet peut exposer toutes ses mthodes et proprits. Et cest par le biais de la mthode primaire de cette interface que les mthodes de lobjet peuvent tre appeles, une fois quelles ont t identifies grce aux informations de type. Les dveloppeurs utilisent souvent lAutomation pour crer et utiliser des objets OLE non visuels qui sexcutent dans nimporte quel espace processus, car linterface Automation IDispatch automatise le processus de marshaling. En revanche, lAutomation limite les types que vous pouvez utiliser. Pour obtenir une liste de types compatibles avec les bibliothques de types en gnral, et dinterfaces Automation en particulier, voir Types autoriss la page 34-13. Pour plus dinformations sur lcriture dun serveur Automation, voir chapitre 36, Cration de serveurs COM simples.

Pages Active Server


La technologie ASP (pages Active Server) vous permet dcrire des scripts simples, appels pages Active Server qui peuvent tre excutes par les clients via un serveur Web. A la diffrence des contrles ActiveX qui sexcutent sur le client, les pages Active Server sexcutent sur le serveur et renvoient les pages HTML rsultantes aux clients. Les pages Active Server sont crites en JScript ou en VBscript. Le script est excut chaque fois que le serveur charge la page Web. Ce script peut alors lancer un serveur Automation incorpor (ou un Bean Java Entreprise). Vous pouvez, par exemple, crire un serveur Automation pour se connecter une base de donnes, ce serveur accdant des donnes qui sont actualises chaque fois que le client charge la page Web. Les experts Delphi facilitent la cration dun objet Active Server qui est un objet Automation spcialement conu pour travailler avec une page Active Server. Pour plus dinformations sur la cration et lutilisation de ces types dobjets, voir chapitre 37, Cration dune page Active Server.

Contrles ActiveX
ActiveX est une technologie qui permet aux composants COM, particulirement aux contrles, dtre plus compacts et efficaces. Cela est particulirement important pour les contrles conus pour des applications Intranet qui ncessitent leur tlchargement par le client avant de les utiliser. Les contrles ActiveX sont des contrles visuels qui sexcutent uniquement comme des serveurs en processus et qui peuvent sintgrer dans une application conteneur ActiveX. Ce ne sont pas des applications compltes par eux-mmes, vous pouvez les voir comme des contrles OLE prfabriqus qui sont rutilisables dans diverses applications. Les contrles ActiveX ont une interface

Prsentation des technologies COM

33-13

Extensions de COM

utilisateur apparente et reposent sur lutilisation dinterfaces prdfinies pour ngocier les entres/sorties et les questions daffichage avec le conteneur hte. Les contrles ActiveX utilisent lAutomation pour exposer leurs proprits, mthodes et vnements. Leurs fonctionnalits incluent la capacit dclencher des vnements, la liaison aux sources de donnes et la gestion de licence. Les contrles ActiveX sutilisent parfois dans un site Web comme objets interactifs placs dans une page Web. Ainsi, ActiveX est devenu un standard particulirement destin des contenus interactifs pour le Web, y compris lutilisation de documents ActiveX employs pour visualiser des documents non HTML via un navigateur Web. Pour plus dinformations sur la technologie ActiveX, voir le site Web de Microsoft. Les experts de Delphi facilitent la cration des contrles ActiveX. Pour plus dinformations sur la cration et lutilisation de ces types dobjets, voir chapitre 38, Cration dun contrle ActiveX.

Documents Active
Les documents Active (appels auparavant documents OLE) sont un ensemble de services COM supportant la liaison et lincorporation, le glisser-dplacer et ldition visuelle. Les documents Active intgrent de faon transparente des donnes ou des objets de diffrents formats, par exemple des clips sonores, des feuilles de calcul, du texte et des images. Contrairement aux contrles ActiveX, les documents Active ne sont pas limits aux serveurs en processus ; ils peuvent tre utiliss dans des applications interprocessus. A la diffrence des objets Automation, qui ne sont presque jamais visuels, les objets document Active peuvent tre visuellement actifs dans une autre application. Ils sont associs deux types de donnes : les donnes de reprsentation utilises pour laffichage visuel lcran ou sur un priphrique de sortie, et les donnes natives utilises pour modifier lobjet. Les objets document Active peuvent tre des conteneurs ou des serveurs de documents. Bien que Delphi ne fournisse pas dexpert pour crer automatiquement des documents Active, vous pouvez utiliser la classe TOleContainer de la VCL pour supporter la liaison et lincorporation dans les documents Active existants. Vous pouvez aussi utiliser TOleContainer comme base dun conteneur de document Active. Pour crer des objets pour les serveurs de documents Active, utilisez une des classes de base COM de la VCL et implmentez les interfaces appropries ce type dobjet, en fonction des services que lobjet doit grer. Pour plus dinformations sur la cration et lutilisation de serveurs de documents Active, voir le site Web Microsoft.
Remarque

Bien que la spcification des documents Active contienne une gestion intgre du marshaling des applications processus crois, les documents Active ne

33-14

Guide du dveloppeur

Extensions de COM

sexcutent pas sur des serveurs distants car les types quils utilisent (handles de fentre, de menu, etc.) sont spcifiques un systme sur une machine donne.

Objets transactionnels
Delphi utilise le terme objets transactionnels pour dsigner des objets qui exploitent les services de transaction, la scurit et la gestion des ressources proposes par MTS (pour les versions de Windows antrieures Windows 2000) ou COM+ (pour Windows 2000 et plus). Ces objets sont conus pour travailler dans des environnements distribus importants. Les services de transaction garantissent la fiabilit assurant que des activits sont toujours acheves ou annules (le serveur ne sarrte jamais en ayant fait la moiti dune activit). Les services de scurit vous permettent dexposer diffrents niveaux de services diffrentes classes de clients. La gestion des ressources permet un objet de rpondre davantage de clients en regroupant les ressources et en ne gardant des objets actifs que sils sont utiliss. Pour permettre au systme de proposer ces services, lobjet doit implmenter linterface IObjectControl. Pour accder aux services, les objets transactionnels utilisent une interface appele IObjectContext qui est cre leur usage par MTS ou COM+. Avec MTS, lobjet serveur doit tre conu dans une bibliothque (DLL) qui est installe dans lenvironnement dexcution MTS. Cest--dire que lobjet serveur est un serveur en processus qui sexcute dans lespace de processus dexcution MTS. Avec COM+, cette restriction ne sapplique plus car tous les appels COM sont redirigs par un intercepteur. Pour les clients, les diffrences entre MTS et COM+ sont transparentes. Les serveurs MTS ou COM+ rassemblent les objets transactionnels dans le mme espace de processus. Dans MTS, ce groupe est appel un paquet MTS, alors que dans COM+ il est appel application COM+. Une mme machine peut excuter plusieurs paquets MTS (ou applications COM+), chacun sexcutant dans son propre espace de processus. Pour les clients, les objets transactionnels apparaissent semblables aux autres objets serveur COM. Le client na pas besoin de savoir quoi que ce soit sur les transactions, la scurit ou lactivation juste--temps, sauf sil dmarre lui-mme une transaction. MTS et COM+ proposent un outil distinct pour administrer les objets transactionnels. Cet outil vous permet de configurer les objets des paquets ou des applications COM+, de visualiser les paquets ou les applications COM+ installs dans une machine ou de modifier les attributs des objets, surveiller et grer les transactions, mettre des objets la disposition des clients, etc. Dans MTS, cet outil sappelle explorateur MTS. Dans COM+ cest le gestionnaire de composants COM+.

Prsentation des technologies COM

33-15

Extensions de COM

Bibliothques de types
Les bibliothques de types offrent un moyen dobtenir davantage dinformations de type sur un objet que les interfaces de lobjet. Les bibliothques de types contiennent les informations ncessaires sur les objets et leurs interfaces, comme les interfaces associes tels objets (tant donn le CLSID), les fonctions membre de chaque interface et les arguments requis par ces fonctions. Vous pouvez obtenir les informations de type en interrogeant une instance dun objet pendant qu elle sexcute ou, en chargeant et en lisant les bibliothques de types. Grce ces informations, vous pouvez implmenter un client qui utilise un objet souhait, en sachant exactement les fonctions membre dont vous avez besoin, et ce quil faut passer ces fonctions. Les clients des serveurs Automation, des contrles ActiveX et des objets transactionnels sattendent disposer de ces informations de type. Tous les experts Delphi gnrent automatiquement une bibliothque de types (mme si cest facultatif avec lexpert objet COM). Vous pouvez voir ou modifier ces informations de type en utilisant lditeur de bibliothques de types comme dcrit au chapitre 34, Utilisation des bibliothques de types. Cette section dcrit le contenu dune bibliothque de types, comment la crer, quand lutiliser et comment y accder. Pour les dveloppeurs souhaitant partager des interfaces travers divers langages, la section se termine par des suggestions sur lutilisation des outils de gestion de bibliothques de types.

Contenu dune bibliothque de types


Les bibliothques de types contiennent des informations de type qui indiquent quelles interfaces existent et dans quels objets COM, ainsi que le type et le nombre darguments des mthodes dinterface. Ces descriptions incluent les identificateurs uniques de CoClasses (CLSID) et dinterfaces (IID), pour que lutilisateur y accde de faon correcte, ainsi que les identificateurs de rpartition (dispID) pour les mthodes et proprits dinterface Automation. Les bibliothques de types peuvent aussi contenir les informations suivantes : une description des informations personnalises de type associes aux interfaces personnalises des routines exportes par le serveur Automation ou ActiveX mais qui ne sont pas des mthodes dinterface des informations concernant lnumration, les enregistrements (structures), les unions, les alias et les types des donnes des modules des rfrences aux descriptions de types issues dautres bibliothques de types

Cration de bibliothques de types


Avec les outils de dveloppement traditionnels, vous crez des bibliothques de types en crivant des scripts en IDL (Interface Definition Language) ou en ODL (Object Description Language), puis en compilant ces scripts. En revanche,

33-16

Guide du dveloppeur

Extensions de COM

Delphi gnre automatiquement une bibliothque de types lorsque vous crez un objet COM (contrles ActiveX, objets Automation, modules de donnes distant, etc.) en utilisant lun des experts des pages ActiveX et Multiniveau de la bote de dialogue Nouveaux Elments. Vous pouvez dcider de ne pas gnrer de bibliothque de types si vous utilisez lexpert objet COM. Vous pouvez galement crer une bibliothque de types en slectionnant Fichier|Nouveau| Autre, longlet ActiveX, puis Bibliothque de types. Vous pouvez ensuite voir la bibliothque de types en utilisant lditeur de bibliothques de types Delphi. Il est facile de modifier la bibliothque de types laide de lditeur de bibliothques de types et Delphi met automatiquement jour le fichier TLB correspondant quand la bibliothque de types est enregistre. Si vous modifiez les interfaces et les CoClasses cres en utilisant un expert, lditeur de bibliothques de types actualise galement les fichiers dimplmentation. Pour plus dinformations sur lutilisation de lditeur de bibliothques de types pour crire des interfaces et des CoClasses, voir chapitre 34, Utilisation des bibliothques de types.

Quand utiliser les bibliothques de types


Il est important de crer une bibliothque de types pour chaque ensemble dobjets qui est prsent aux utilisateurs finaux, par exemple, Les contrles ActiveX ncessitent une bibliothque de types, qui doit tre incluse en tant que ressource dans la DLL qui contient les contrles ActiveX. Les objets exposs qui grent la liaison de vtable des interfaces personnalises doivent tre dcrits dans une bibliothque de types car les rfrences la vtable sont lies la compilation. Les clients importent depuis la bibliothque de types les informations sur les interfaces et utilisent ces informations pour compiler. Pour plus de dtails sur les vtables et les liaisons effectues lors de la compilation, voir Interfaces dAutomation la page 36-13. Les applications qui implmentent des serveurs Automation doivent fournir une bibliothque de types pour que les clients puissent faire une liaison immdiate. Les objets instancis depuis des classes qui grent linterface IProvideClassInfo tels que tous les descendants de la classe VCL TTypedComObject, doivent possder une bibliothque de types. Les bibliothques de types ne sont pas ncessaires mais utiles pour identifier les objets OLE utilisables par glisser-dplacer. Si vous dfinissez des interfaces usage exclusivement interne (au sein dune application), il nest pas ncessaire de crer une bibliothque de types.

Accs aux bibliothques de types


En rgle gnrale, une bibliothque de types fait partie dun fichier de ressource (.res) ou dun fichier autonome lextension .tlb. Quand elle est place dans un fichier ressource, la bibliothque de types peut tre lie un serveur (.DLL, .OCX ou .EXE).

Prsentation des technologies COM

33-17

Extensions de COM

Lorsquune bibliothque de types a t cre, les scruteurs dobjets, les compilateurs et les outils similaires peuvent y accder par des interfaces spciales :
Interface
ITypeLib ITypeLib2 ITypeInfo

Description
Fournit des m thodes pour accder la description dune bibliothque de types. Augmente ITypeLib pour inclure la gestion des chanes de documentation, les donnes personnalises et des statistiques sur la bibliothque de types. Fournit la description de chaque objet dune bibliothque de types. Par exemple, un navigateur utilise cette interface pour extraire des informations sur les objets de la bibliothque de types. Augmente ITypeInfo pour accder des informations supplmentaires de la bibliothque de types, comme les mthodes daccs aux lments de donnes personnaliss. Fournit un moyen rapide daccder aux informations dont le compilateur a besoin lors de la liaison avec une interface.

ITypeInfo2

ITypeComp

Delphi peut importer et utiliser des bibliothques de types venant dautres applications en choisissant Projet|Importer une bibliothque de types. La plupart des classes de la VCL employes pour les applications COM supportent les interfaces essentielles utilises pour stocker et rcuprer les informations de types partir des bibliothques de types et des instances actives dun objet. La classe TTypedComObject de la VCL supporte les interfaces qui fournissent des informations de type et sutilise comme une fondation pour lenvironnement objet ActiveX.

Avantages des bibliothques de types


Mme si votre application ne ncessite pas de bibliothque de types, considrez les avantages suivants : La vrification des types peut se faire lors de la compilation. Vous pouvez utiliser la liaison immdiate avec lautomation (ce qui remplace les appels par le biais de variants) et les contrleurs qui ne grent pas les vtables ou les interfaces doubles peuvent coder les dispID lors de la compilation pour amliorer les performances de lapplication. Les scruteurs de types peuvent parcourir la bibliothque. Les clients pourront donc voir les caractristiques de vos objets. La fonction RegisterTypeLib peut tre utilise pour recenser vos objets prsents dans la base de donnes de recensement. La fonction UnRegisterTypeLib peut tre utilise pour dsinstaller compltement la bibliothque de types dune application du registre. Laccs local au serveur est acclr car lautomation utilise les informations de la bibliothque de types pour regrouper les paramtres qui sont passs un objet dun autre processus.

33-18

Guide du dveloppeur

Implmentation des objets COM laide dexperts

Utilisation des outils de bibliothques de types


Les outils permettant de manipuler des bibliothques de types sont indiqus ci-dessous. Loutil TLIBIMP (importation de bibliothque de types), qui cre des fichiers dinterface Delphi (fichiers _TLB.pas) partir de bibliothques de types est intgr dans lditeur de bibliothques de types. TLIBIMP offre des options de configuration supplmentaires non disponibles dans lditeur de bibliothques de types. TRegSvr est un outil pour recenser et drecenser les serveurs et les bibliothques de types, fourni avec Delphi. Le source de TRegSvr est disponible sous la forme dun exemple dans le rpertoire Demos. Le compilateur Microsoft IDL (MIDL) compile les scripts IDL pour crer une bibliothque de types. RegSvr32.exe est un utilitaire standard de Windows pour recenser et drecenser les serveurs et les bibliothques de types. OLEView est un outil de visualisation de bibliothque de types disponible sur le site Web de Microsoft.

Implmentation des objets COM laide dexperts


Delphi facilite lcriture de serveurs COM en fournissant des experts qui grent nombre des problmes poss. Delphi propose des experts distincts permettant de crer : Un simple objet COM Un objet Automation Un contrle ActiveX Un objet Active Server ( incorporer dans une page Active Server) Un contrle ActiveX Une fiche ActiveX Un objet transactionnel Une page de proprits Une bibliothque de types Une bibliothque ActiveX

Les experts grent beaucoup des problmes intervenant dans la cration de chaque type dobjet. Ils fournissent les interfaces COM requises pour chaque type dobjet. Comme le montre la figure 33.6, avec un simple objet COM, lexpert implmente la seule interface COM obligatoire, IUnknown, qui fournit un pointeur dinterface vers lobjet.
Figure 33.6 Interface dun objet COM simple

Prsentation des technologies COM

33-19

Implmentation des objets COM laide dexperts

Lexpert objet COM propose galement une implmentation de IDispatch si vous spcifiez que vous crez un objet grant un descendant de IDispatch. Comme le montre la figure 33.7, pour les objets Automation et Active Server, lexpert implmente IUnknown et IDispatch, qui fournissent le marshaling automatique.
Figure 33.7 Interfaces dun objet Automation

Comme le montre la figure 33.8, pour les objets contrles ActiveX et fiches ActiveX, lexpert implmente toutes les interfaces requises par les contrles ActiveX : IUnknown, IDispatch, IOleObject, IOleControl, etc. Pour obtenir la liste complte des interfaces, reportez-vous la page de rfrence de lobjet TActiveXControl.
Figure 33.8 Interfaces dun contrle ActiveX

33-20

Guide du dveloppeur

Implmentation des objets COM laide dexperts

Le tableau suivant numre les divers experts et les interfaces quils implmentent :
Tableau 33.2 Expert
serveur COM

Experts Delphi qui implmentent des objets COM, Automation et ActiveX Interfaces implment es
IUnknown (et IDispatch si vous slectionnez une interface par dfaut qui descend de IDispatch)

Ce que fait lexpert


Exporte les routines ncessaires pour grer le recensement du serveur, le recensement des classes, le chargement et le dchargement du serveur et linstanciation des objets. Cre et gre les fabricants de classes pour les objets implments sur le serveur. Fournit les entres de registre pour lobjet spcifiant le modle de thread slectionn. Dclare les mthodes qui implmentent linterface slectionne et fournit un squelette dimplmentation que vous devez complter. Fournit une bibliothque de types, si elle est demande. Vous permet de slectionner une interface arbitraire qui est recense dans la bibliothque de types et de limplmenter. Pour cela, vous devez utiliser une bibliothque de types. Effectue les actions dun expert serveur COM (dcrit plus haut) plus : Implmente linterface que vous spcifiez, double ou de rpartition.Fournit, si cest demand, une gestion par le serveur de la gnration dvnements. Fournit automatiquement une bibliothque de types. Effectue les actions dun expert objet Automation (dcrit plus haut) et gnre facultativement une page .ASP qui peut tre charge dans un navigateur Web. Vous laisse dans lditeur de bibliothques de types pour que vous puissiez modifier les proprits et les m thodes de lobjet, si ncessaire. Restitue les lments intrinsques ASP sous la forme de proprits afin de pouvoir disposer facilement dinformations sur lapplication ASP et le message HTTP qui la dmarre.

serveur Automation

IUnknown, IDispatch

objet Active Server

IUnknown, IDispatch, (IASPObject)

Prsentation des technologies COM

33-21

Implmentation des objets COM laide dexperts

Tableau 33.2 Expert


contrle ActiveX

Experts Delphi qui implmentent des objets COM, Automation et ActiveX (suite) Interfaces implment es
IUnknown, IDispatch, IPersistStreamInit, IOleInPlaceActiveObject, IPersistStorage, IViewObject, IOleObject, IViewObject2, IOleControl, IPerPropertyBrowsing, IOleInPlaceObject, ISpecifyPropertyPages Mmes interfaces que contrle ActiveX

Ce que fait lexpert


Effectue les actions de lexpert Automation (dcrites plus haut) plus : Gnre uneCoClasse qui correspond au contrle VCL sur lequel est bas le contrle ActiveX et qui implmente toutes les interfaces ActiveX. Vous laisse dans lditeur de code source pour que vous puissiez modifier la classe dimplmentation. Effectue les actions de lexpert contrle ActiveX, plus : Cre un descendant de TActiveForm qui prend la place de la classe VCL prexistante dans lexpert contrle ActiveX. Cette nouvelle classe vous permet de concevoir la fiche active de la m me manire que vous concevez une application Windows. Ajoute une nouvelle unit au projet en cours contenant la dfinition de lobjet MTS ou COM+. Il insre des GUID propritaires dans la bibliothque de types afin que Dephi puisse installer correctement lobjet et vous laisse dans lditeur de bibliothque de types pour que vous puissiez dfinir linterface que lobjet expose aux clients. Vous devez installer lobjet sparment aprs lavoir gnr. Cre une nouvelle page de proprits que vous pouvez concevoir dans le concepteur de fiche. Cre un objet vnement COM+ que vous pouvez dfinir en utilisant lditeur de bibliothque de types. A la diffrence des autres experts, lexpert objet vnement COM+ ne cre pas dunit dimplmentation car les objets vnement nont pas dimplmentation (elle est fournie par les rcepteurs dvnements des clients). Cre une nouvelle bibliothque de types et lassocie au projet actif. Cre une nouvelle DLL ActiveX ou serveur COM et expose les fonctions dexportation ncessaires.

ActiveForm

objet transactionnel

IUnknown, IDispatch, IObjectControl

page de proprits objet vnement COM+

IUnknown, IPropertyPage

Aucune par dfaut

bibliothque de types bibliothque ActiveX

Aucune par dfaut Aucune par dfaut

Si vous voulez, vous pouvez ajouter dautres objets COM (ou refaire une implmentation existante). Pour ajouter un nouvel objet, il est plus simple dutiliser lexpert une seconde fois. En effet, lexpert met en place lassociation entre la bibliothque de types et une classe dimplmentation, ainsi les

33-22

Guide du dveloppeur

Implmentation des objets COM laide dexperts

modifications effectues dans lditeur de bibliothques de types sont automatiquement appliques lunit dimplmentation.

Code gnr par les experts


DAXLes experts Delphi gnrent des classes qui drivent du modle ActiveX Delphi (DAX). En dpit de son nom, DAX gre tous les types dobjet COM et pas uniquement les contrles ActiveX. Les classes de ce modle fournissent limplmentation sous-jacente des interfaces COM aux objets que vous crez en utilisant un expert. La figure suivante illustre les objets du modle DAX :
Figure 33.9 Modle ActiveX Delphi

Chaque expert gnre une unit dimplmentation qui implmente votre objet serveur COM. Lobjet serveur COM (lobjet implmentation) descend de lune des classe DAX :
Tableau 33.3 Expert
serveur COM

Classes de base DAX utilises par les classes dimplmentation gnres Classe de base DAX
TTypedCOMObject

Gestion h rit e
Gestion des interfaces IUnknown ISupportErrorInfo. Gestion de lagrgation, des exceptions OLE, de la convention dappel safecall et des conventions sur les interfaces doubles. Gestion de la lecture des informations des bibliothques de types. Tout ce qui est fourni par TTypedCOMObject, plus : Gestion de linterface IDispatch. Gestion de lauto-marshaling.

Serveur Automation Serveur Active Object

TAutoObject

Prsentation des technologies COM

33-23

Implmentation des objets COM laide dexperts

Tableau 33.3 Expert

Classes de base DAX utilises par les classes dimplmentation gnres (suite) Classe de base DAX
TActiveXControl

Gestion h rit e
Tout ce qui est fourni par TAutoObject, plus : Gestion de lincorporation dans un conteneur. Gestion de lactivation in-situ. Gestion des proprits et des pages de proprits. La capacit de dlguer un contrle fentre associ quil cre. Tout ce qui est fourni par TAutoObject, sauf quil fonctionne avec un descendant TActiveForm au lieu dune autre classe de contrle fentr. Tout ce qui est fourni par TAutoObject, plus : Gestion de linterface IObjectControl. Gestion des interfaces IUnknown et ISupportErrorInfo. Gestion de lagrgation, des exceptions OLE, de la convention dappel safecall et des conventions sur les interfaces doubles. Gestion de linterface IPropertyPage.

contrle ActiveX

ActiveForm

TActiveFormControl

objets MTS page de proprits

TMTSAutoObject TPropertyPage (utilise TActiveXPropertyPage en interne)

Une hirarchie dobjets fabricant de classe correspond aux classes de la figure 33.9 et gre la cration de ces objets COM. Lexpert ajoute du code la section initialisation de votre unit dimplmentation pour instancier le fabricant de classe appropri votre classe dimplmentation. Les experts gnrent galement une bibliothque de types et son unit associe, qui porte un nom de la forme Projet1_TLB. Lunit Project1_TLB contient les dfinitions dont votre application a besoin pour utiliser les types et les interfaces dfinis dans la bibliothque de types. Pour davantage dinformations sur le contenu de ce fichier, voir Code gnr par limportation des informations dune bibliothque de types la page 35-5. Vous pouvez modifier linterface gnre par lexpert en utilisant lditeur de bibliothques de types. Si vous le faites, la classe dimplmentation est automatiquement actualise pour reflter vos modifications. Il vous suffit juste de remplir le corps des mthodes gnres pour complter limplmentation.

33-24

Guide du dveloppeur

34
Chapitre 34

Chapitre

Utilisation des bibliothques de types

Ce chapitre dcrit comment crer et modifier des bibliothques de types en utilisant lditeur de bibliothques de types Delphi. Les bibliothques de types sont des fichiers incluant des informations sur les types de donnes, les interfaces, les fonctions membre et les classes dobjet exposs par un objet COM. Les bibliothques de types permettent didentifier le type des objets et des interfaces disponibles sur un serveur. Pour une prsentation dtaille du rle et de lutilisation des bibliothques de types, voir Bibliothques de types la page 33-16 Une bibliothque de types peut contenir les lments suivants : Des informations sur les types de donnes personnaliss, dont les alias, les numrations, les structures et les unions. Les descriptions dun ou de plusieurs lments COM, par exemple une interface, une dispinterface ou une CoClasse. Ces descriptions sont appeles informations de types. Les descriptions des constantes et mthodes dfinies dans les units externes. Des rfrences aux descriptions de type situes dans dautres bibliothques de types. Quand vous incluez une bibliothque de types dans une application COM ou une bibliothque ActiveX, vous mettez la disposition dautres applications et outils de programmation des informations sur les objets de votre application via les outils et les interfaces de la bibliothque de types. Avec les outils de dveloppement traditionnels, vous crez des bibliothques de types en crivant des scripts utilisant le langage IDL (Interface Definition Language) ou ODL (Object Description Language), puis en excutant ce script via un compilateur. Lditeur de bibliothques de types automatise ce processus, simplifiant ainsi la cration ou la modification de vos bibliothques de types.

Utilisation des bibliothques de types

34-1

Lditeur de bibliothques de types

Quand vous crez un serveur COM de type quelconque (contrle ActiveX, objet Automation, module de donnes distant, etc.) en utilisant les experts Delphi, lexpert gnre automatiquement une bibliothque de types (mme si dans le cas de lexpert objet COM, cela est optionnel). Lessentiel de votre travail de personnalisation de lobjet gnr commence dans la bibliothque de types. Cest l o vous dfinissez les proprits et mthodes quelle expose ses clients : vous modifiez linterface de la CoClasse gnre par lexpert en utilisant lditeur de bibliothques de types. Lditeur de bibliothques de types actualise automatiquement lunit dimplmentation de votre objet afin quil soit juste ncessaire de remplir le corps des mthodes gnres. Vous pouvez aussi utiliser lditeur de bibliothques de types Delphi dans le dveloppement dapplications CORBA (Common Object Request Broker Architecture). Avec les outils CORBA traditionnels, vous devez dfinir les interfaces dobjets en dehors de votre application, laide du langage CORBA IDL (Interface Definition Language). Vous excutez ensuite un utilitaire qui gnre du code stub-et-squelette partir de cette dfinition. Toutefois, Delphi gnre le stub, le squelette et le code IDL automatiquement. Vous pouvez facilement modifier votre interface laide de lditeur de bibliothques de typesDelphi se chargeant de mettre automatiquement jour les fichiers source correspondants.

Lditeur de bibliothques de types


Lditeur de bibliothques de types est un outil permettant aux dveloppeurs dexaminer et de crer les informations de type sur les objets COM. Lutilisation de lditeur de bibliothques de type permet de simplifier considrablement le dveloppement dobjets COM en centralisant la dfinition des interfaces, des CoClasses et des types, lobtention de GUID pour les nouvelles interfaces, lassociation dinterfaces des CoClasses, lactualisation des units dimplmentation, etc.
Remarque

Lditeur de bibliothques de types est galement utilis pour dfinir des interfaces CORBA dans des projets utilisant lobjet CORBA ou lexpert module de donnes CORBA.

34-2

Guide du dveloppeur

Lditeur de bibliothques de types

Lditeur de bibliothques de types produit deux types de fichiers reprsentant le contenu dune bibliothque de types :
Tableau 34.1 Fichier
Fichier .TLB

Fichiers de lditeur de bibliothques de types Description


Cest le fichier binaire de la bibliothque de types. Par dfaut, vous navez pas besoin dutiliser ce fichier car la bibliothque de types est automatiquement compile dans lapplication sous la forme dune ressource. Cependant vous pouvez utiliser ce fichier pour compiler explicitement la bibliothque de types dans un autre projet ou pour dployer la bibliothque de types sparment du fichier .exe ou .ocx. Pour plus dinformations, voir Ouverture dune bibliothque de types existante la page 34-22 et Dploiement des bibliothques de types la page 34-30. Remarque : si vous utilisez lditeur de bibliothques de types pour des interfaces CORBA, lditeur de bibliothques de types ne cre pas le fichier .tlb. Cette unit interprte le contenu de la bibliothques de types pour son utilisation par lapplication. Elle contient toutes les dclarations dont lapplication a besoin pour utiliser les lments dfinis dans la bibliothque de types. Mme si vous pouvez ouvrir ce fichier dans lditeur de code, vous ne devez jamais le modifier : il est gr automatiquement par lditeur de bibliothques de types et vos modifications seraient crases par lditeur de bibliothques de types. Pour plus de dtails sur le contenu de ce fichier, voir Code gnr par limportation des informations dune bibliothque de types la page 35-5. Remarque : si vous utilisez lditeur de bibliothques de types pour des interfaces CORBA, cette unit dfinit les objets stub et squelette ncessaires lapplication CORBA.

Unit _TLB

Composants de lditeur de bibliothques de types


Les principaux lments de lditeur de bibliothques de types sont dcrits dans le tableau suivant.
Tableau 34.2 Partie
Barre doutils

Composants de lditeur de bibliothques de types Description


Comprend des boutons vous permettant dajouter la bibliothque de types de nouveaux types, CoClasses, interfaces et membres dinterface. La barre doutils propose galement des boutons pour actualiser lunit dimplmentation, recenser la bibliothque de types et enregistrer un fichier IDL avec les informations de la bibliothques de types. Affiche tous les lments existant dans la bibliothque de types. Quand vous cliquez sur un lment du volet liste des objets, il affiche les pages adaptes cet objet. Affiche les erreurs de syntaxe si vous essayez dajouter des types illgaux la bibliothque de types. Affichent des informations sur lobjet slectionn. Les pages affiches dpendent du type dobjet slectionn.

Volet liste des objets Barre dtat Pages

Utilisation des bibliothques de types

34-3

Lditeur de bibliothques de types

Ces lments sont illustrs dans le tableau suivant qui prsente lditeur de bibliothques de types affichant les informations de type pour un objet COM nomm cyc.
Figure 34.1 Lditeur de bibliothques de types

Barre doutils
La barre doutils de lditeur de bibliothques de types, situe en haut, contient des boutons sur lesquels vous cliquez pour ajouter de nouveaux objets la bibliothque de types. Le premier groupe de boutons vous permet dajouter des lments la bibliothque de types. Quand vous cliquez sur un bouton de la barre doutils, licne de cet lment apparat dans le volet liste des objets. Vous pouvez alors personnaliser ses attributs dans le volet de droite. Selon le type dicne slectionne, diffrentes pages dinformations apparaissent droite. Le tableau suivant numre les lments quil est possible dajouter une bibliothque de types :
Ic ne Signification
Une description dinterface. Une description de dispinterface. (ne sutilise pas pour la dfinition dinterface CORBA) Une CoClasse.

34-4

Guide du dveloppeur

Lditeur de bibliothques de types

Ic ne

Signification
Une num ration. Un alias. Un enregistrement. Une union. Un module.

Quand vous slectionnez un des lments lists ci-dessus, dans le volet liste des objets, le second groupe de boutons affiche les membres autoriss pour cet lment. Par exemple, quand vous slectionnez Interface, les icnes de mthode et de proprit deviennent disponibles dans le second groupe car vous pouvez ajouter des proprits et des mthodes une dfinition dinterface. Quand vous slectionnez une numration, le second groupe de boutons naffiche que le membre constante car cest le seule membre utilisable pour spcifier les informations dun type numration. Le tableau suivant numre les membres quil est possible dajouter aux lments du volet liste des objets :
Ic ne Signification
Une m thode de linterface, de la dispinterface ou un point dentre dun module. Une proprit dune interface ou dune dispinterface. Une proprit en criture seule (disponible dans la liste droulante du bouton proprit). Une proprit en lecture-criture (disponible dans la liste droulante du bouton proprit). Une proprit en lecture seule (disponible dans la liste droulante du bouton proprit). Un champ dun enregistrement ou dune union. Une constante dune numration ou dun module.

Dans le troisime groupe de boutons, vous pouvez actualiser, recenser ou exporter la bibliothque de types (lenregistrer dans un fichier), comme dcrit

Utilisation des bibliothques de types

34-5

Lditeur de bibliothques de types

dans la section Enregistrement et recensement des informations dune bibliothque de types la page 34-28.

Volet liste des objets


Le volet liste des objets affiche tous les lments de la bibliothque de types en cours dans une vue arborescente. La racine de larborescence reprsente la bibliothque de types, elle est reprsente par licne suivante :

Descendant du nud bibliothque de types, vous trouvez les lments de la bibliothque de types :
Figure 34.2 Le volet liste des objets

Quand vous slectionnez lun de ces lments (y compris la bibliothque de types), les pages dinformations de types droite sont actualises pour nafficher que les informations pertinentes pour cet lment. Vous pouvez utiliser ces pages pour modifier la dfinition et les proprits de llment slectionn. Vous pouvez manipuler les lments du volet liste des objets en cliquant avec le bouton droit de la souris afin dafficher le menu contextuel du volet liste des objets. Ce menu propose des commandes qui vous permettent dutiliser le presse-papiers Windows pour dplacer ou copier des lments, dajouter de nouveaux lments ou de personnaliser laspect de lditeur de bibliothques de types.

Barre dtat
Lors de la modification ou de lenregistrement dune bibliothque de types, les erreurs de syntaxe, les erreurs de traduction et les avertissements sont affichs dans le volet barre dtat. Si, par exemple, vous spcifiez un type non g r par lditeur de bibliothques de types, vous obtiendrez une erreur de syntaxe. Pour une liste complte des types grs par lditeur de bibliothques de types, voir Types autoriss la page 34-13.

Les pages dinformations de type


Quand vous slectionnez un lment dans le volet liste des objets, les pages des informations de type qui apparaissent dans lditeur de bibliothques de types sont celles autorises pour lobjet slectionn.

34-6

Guide du dveloppeur

Lditeur de bibliothques de types

Le tableau suivant indique les pages affiches selon llment slectionn dans le volet liste des objets :
El ment de type dinformation
Bibliothque de type

Page dinformation de type


Attributs Utilise Indicateurs Texte

Contenu de la page
Nom, version et GUID de la bibliothque de types ainsi que des informations liant la bibliothque de types laide. Liste des autres bibliothques de types contenant des dfinitions dont celle-ci dpend. Indicateurs dterminant comment dautres applications peuvent utiliser la bibliothque de types. Toutes les dfinitions et dclarations dfinissant la bibliothque de types mme (voir lexplication ci-dessous). Nom, version et GUID de linterface, le nom de linterface dont elle descend et des informations liant linterface laide. Indicateurs spcifiant si linterface est cache, double, compatible Automation et/ou extensible. Les dfinitions et dclarations de linterface (voir lexplication ci-dessous) Nom, version et GUID de la dispinterface, le nom de linterface dont elle descend et des informations liant linterface laide. Indicateurs spcifiant si la dispinterface est cache, double et/ou extensible. Les dfinitions et dclarations de la dispinterface (voir lexplication ci-dessous). Nom, version et GUID de la CoClasse et des informations la liant laide. Une liste des interfaces que la CoClasse implmente ainsi que leurs attributs. Les attributs des objets transactionnels (modle de transaction, appel de synchronisation, activation juste temps, groupement dobjets, etc. Contient galement les attributs des objets vnement COM+. Indicateurs spcifiant divers attributs de la CoClasse, y compris la manire dont les clients peuvent crer et utiliser des instances, si elle est visible pour les utilisateurs dans un navigateur, si cest un contrle ActiveX, et si elle peut tre agrge (comme partie dun composite). Les dfinitions et dclarations de la CoClasse (voir lexplication ci-dessous). Nom, version et GUID de lnumration et des informations la liant laide. Les dfinitions et dclarations du type num r (voir lexplication ci-dessous). Nom, version et GUID du type que lalias reprsente et des informations le liant laide. Les dfinitions et dclarations de lalias (voir lexplication cidessous)

Interface

Attributs Indicateurs Texte

Dispinterface

Attributs

Indicateurs Texte CoClasse Attributs Implmente COM+

Indicateurs

Texte Enumration Attributs Texte Alias Attributs Texte

Utilisation des bibliothques de types

34-7

Lditeur de bibliothques de types

El ment de type dinformation

Page dinformation de type

Contenu de la page
Nom, version et GUID de lenregistrement et des informations le liant laide. Les dfinitions et dclarations de lenregistrement (voir lexplication ci-dessous) Nom, version et GUID de lunion et des information la liant laide. Les dfinitions et dclarations de lunion (voir lexplication ci-dessous). Nom, version, GUID et DLL associe du module, et des informations le liant laide. Les dfinitions et dclarations du module (voir lexplication ci-dessous). Nom, identificateur de rpartition ou point dentre de DLL et des informations liant la mthode laide. Type de valeur renvoye par la mthode et une liste de tous les paramtres avec leur type et tous les modificateurs. Indicateurs spcifiant comment les clients peuvent visualiser et utiliser la m thode, si cest la mthode par dfaut de linterface et si elle est remplaable. Les dfinitions et dclarations de la mthode (voir lexplication ci-dessous). Nom, identificateur de rpartition, type de mthode daccs la proprit (lecture ou criture) et des informations la liant laide. Type de valeur renvoye par la mthode daccs et une liste de tous les paramtres avec leur type et tous les modificateurs. Indicateurs spcifiant comment les clients peuvent visualiser et utiliser la proprit, si cest la proprit par dfaut de linterface, si elle est remplaable, si elle peut tre lie, etc. Les dfinitions et dclarations de la mthode daccs la proprit (voir lexplication ci-dessous). Nom, valeur et type (pour les constantes de module) et des informations liant la constante laide. Indicateurs spcifiant comment les clients peuvent visualiser et utiliser la constante, si elle reprsente une valeur par dfaut, si la constante peut tre lie, etc. Les dfinitions et dclarations de la constante (voir lexplication ci-dessous). Nom, type et des informations liant le champ laide Indicateurs spcifiant comment les clients peuvent visualiser et utiliser le champ, sil reprsente une valeur par dfaut, si le champ peut tre li, etc. Les dfinitions et dclarations du champ (voir lexplication cidessous).

Enregistrement Attributs Texte Union Attributs Texte Module Attributs Texte Mthode Attributs Paramtres Indicateurs

Texte Proprit Attributs

Paramtres

Indicateurs

Texte Constante Attributs Indicateurs

Texte Champ Attributs Indicateurs

Texte

34-8

Guide du dveloppeur

Lditeur de bibliothques de types

Remarque

Pour davantage dinformations sur les diverses options dfinissables dans les pages dinformations de type, voir laide en ligne de lditeur de bibliothques de types. Vous pouvez utiliser chacune des pages dinformations de type pour visualiser ou modifier les valeurs quelles affichent. La plupart des pages organisent les informations dans un ensemble de contrles afin que vous puissiez saisir des valeurs ou les slectionner sans avoir connatre la syntaxe des dclarations correspondantes. Cela vite beaucoup derreurs de saisie quand vous sp cifiez une valeur comprise dans un ensemble dtermin. Cependant, vous pouvez trouver plus efficace de saisir directement la dclaration. Pour ce faire, utilisez la page Texte. Tous les lments des bibliothques de types disposent dune page Texte qui affiche la syntaxe de llment. Cette syntaxe utilise un sous-ensemble du langage Microsoft IDL (Interface Definition) ou Pascal Objet. Les modifications effectues dans les autres pages de llment sont refltes ici. Si vous ajoutez du code directement dans la page Texte, les modifications sont refltes dans les autres pages de lditeur de bibliothques de types. Lditeur de bibliothques de types gnre des erreurs de syntaxe si vous ajoutez des identificateurs qui ne sont pas grs par lditeur ; lditeur ne gre actuellement que les identificateurs associs la gestion de bibliothques (et pas ceux associs la gestion RPC ou les constructions utilises par le compilateur Microsoft IDL pour la gnration de code C++ ou la gestion du marshalling).

Elments dune bibliothque de types


Au premier abord, linterface dune bibliothque de types peut sembler un peu complexe. Cela est du au fait quelle prsente des informations sur un grand nombre dlments, chacun ayant des caractristiques spcifiques. Cependant, la plupart de ces caractristiques sont communes tous les lments. Ainsi, chaque lment (dont la bibliothque de types) dispose des caractristiques suivantes : Un nom utilis pour dcrire llment et dsigner llment dans du code. Un GUID (identificateur global unique) qui est une valeur globalement unique de 128 bits utilise par COM pour identifier llment. Cette valeur doit toujours tre fournie pour la bibliothque de types, les CoClasses et les interfaces. Sinon elle est facultative. Un numro de version, qui distingue diffrentes versions de llment. Cette information est toujours facultative, mais elle doit tre spcifie pour les CoClasses et les interfaces car certains outils ne peuvent les utiliser si elles nont pas un numro de version. Des informations liant llment une rubrique daide. Elles sont constitues dune chane daide, dun contexte daide ou dune valeur de contexte de chane daide. Le contexte daide est utilis avec le systme daide classique Windows si la bibliothque daide dispose dun fichier daide autonome propre. Le contexte de chane daide est utilis quand laide est fournie par une DLL distincte. Le contexte daide ou le contexte de chane daide fait

Utilisation des bibliothques de types

34-9

Lditeur de bibliothques de types

rfrence un fichier daide ou une DLL dont le nom est spcifi dans la page Attributs de la bibliothque de types. Ces informations sont toujours facultatives.

Interfaces
Linterface dcrit les mthodes (et les proprits exprimes comme fonctions get/ set) dun objet auquel il faut daccder via une table de fonction virtuelle (VTable). Si une interface est dfinie comme double, ce qui est le cas par dfaut, une dispinterface est galement implique et peut tre atteinte via lautomation OLE. Par dfaut, la bibliothque de types marque toutes les interfaces ajoutes comme double. Il est possible dattribuer des membres aux interfaces : des mthodes et des proprits. Elles apparaissent dans le volet liste des objets comme enfant du nud interface. Les proprits des interfaces sont reprsentes par les mthodes get et set utilises pour lire et crire les donnes sous-jacentes de la proprit. Elles sont reprsentes dans la vue arborescente par des icnes spciales qui indiquent leur fonction.
Remarque

Si une proprit est spcifie comme Ecriture par rfrence, cela signifie quelle est transmise comme pointeur et non comme valeur. Certaines applications, comme Visual Basic, utilisent si possible lcriture par rfrence pour optimiser les performances. Pour passer une proprit uniquement par rfrence plutt que par valeur, utilisez le type de proprit Par rfrence seulement. Pour transmettre la proprit par adresse et par valeur, slectionnez Lecture | Ecriture | Ecriture par rfrence. Pour activer ce menu, slectionnez dans la barre doutils la flche en regard de licne de la proprit. Une fois les proprits et mthodes ajoutes en utilisant les boutons de la barre doutils ou le menu contextuel du volet liste des objets, vous pouvez dcrire leur syntaxe et leurs attributs en slectionnant la proprit ou la mthode et en utilisant les pages dinformations de type. La page Attributs vous permet dattribuer un nom la proprit ou mthode et un identificateur de rpartition (afin de pouvoir lappeler en utilisant IDispatch). Pour les proprits, vous pouvez galement attribuer un type. La signature de fonction est cre en utilisant la page Paramtres qui vous permet dajouter, de supprimer ou dorganiser les paramtres, de dfinir leur type et les modificateurs et de spcifier le type de retour de la fonction.

Remarque

Les membres des interfaces qui veulent dclencher des exceptions doivent renvoyer un HRESULT et spcifier un paramtre de valeur renvoye (PARAM_RETVAL) pour la valeur rellement renvoye. Dclarez ces mthodes en utilisant la convention dappel safecall. Si vous attribuez des proprits et des mthodes une interface, elles sont implicitement attribues sa CoClasse associe. Cest pour cela que lditeur de bibliothques de types ne vous permet pas dajouter directement des mthodes ou des proprits une CoClasse.

34-10

Guide du dveloppeur

Lditeur de bibliothques de types

Dispinterfaces
Les interfaces sont plus frquemment utilises que les dispinterfaces pour dcrire les proprits et mthodes dun objet. Les dispinterfaces sont accessibles uniquement au travers dune liaison dynamique alors que les interfaces peuvent aussi utiliser une liaison statique grce une vtable. Vous pouvez ajouter des proprits et mthodes aux dispinterfaces comme pour les interfaces. Cependant, quand vous crez une proprit pour une dispinterface, vous ne pouvez spcifier le type de fonction ou le type des paramtres.

CoClasses
Une CoClasse dcrit un objet COM unique qui implmente une ou plusieurs interfaces. Quand vous dfinissez une CoClasse, vous devez spcifier linterface implmente qui est celle par dfaut pour lobjet et, de manire facultative, la dispinterface qui est la source par dfaut des vnements. Il nest pas possible dajouter directement des proprits ou mthodes une CoClasse dans lditeur de bibliothques de types. Les proprits et mthodes sont exposes aux clients par les interfaces, qui sont associes la CoClasse avec la page Implmente.

Dfinitions de types
Les numrations, les alias, les enregistrements et les unions dclarent des types qui peuvent ensuite tre utiliss ailleurs dans la bibliothque de types. Les numrations sont constitues dune liste de constantes numriques. Ces constantes sont gnralement des valeurs entires au format dcimal ou hexadcimal. Par dfaut, la valeur de base est zro. Vous pouvez ajouter des constantes une numration en la slectionnant dans le volet liste des objets, puis en choisissant le bouton Constante de la barre doutils ou en slectionnant la commande Nouveau|Const dans le menu contextuel du volet liste des objets.
Remarque

Il est fortement conseill de spcifier une chane daide pour les numrations. Voici un exemple dentre dun type numration pour un bouton de souris qui inclut une chane daide pour chacun des lments de lnumration :
mbLeft = 0 [helpstring mbLeft]; mbRight = 1 [helpstring mbRight]; mbMiddle = 3 [helpstring mbMiddle];

Un alias dfinit un alias (une dfinition de type) pour un type. Un alias permet de dfinir des types sutilisant dans dautres types, par exemple des enregistrements ou des unions. Associez lalias au type sous-jacent en spcifiant lattribut Type dans la page Attributs. Un enregistrement est constitu de la liste des membres de la structure, ou champs. Une union est un enregistrement ayant seulement une partie de type variant. Comme un enregistrement, une union est constitue de la liste des membres de la structure, ou champs. Mais, la diffrence des membres dun enregistrement, tous les membres dune union occupent le mme emplacement physique, il nest donc possible de stocker quune seule valeur logique.

Utilisation des bibliothques de types

34-11

Lditeur de bibliothques de types

Ajoutez les champs un enregistrement ou une union en le slectionnant dans le volet liste des objets puis en choisissant le bouton Champ de la barre doutils ou en utilisant le menu contextuel du volet liste des objets. Chaque champ dispose dun nom et dun type que vous pouvez spcifier en slectionnant le champ et en attribuant les valeurs dans la page Attributs. Les enregistrements et les unions peuvent tre dfinis avec un repre optionnel. Les membres peuvent tre de nimporte quel type prdfini. Vous pouvez aussi spcifier un type en utilisant un alias avant de dfinir lenregistrement.

Modules
Un module dfinit un groupe de fonctions, gnralement un ensemble de points dentre de DLL. Vous dfinissez un module en : Spcifiant la DLL quil reprsente dans la page Attributs. Ajoutant des mthodes et des constantes en utilisant la barre doutils ou le menu contextuel du volet liste des objets. Vous devez ensuite spcifier les attributs de chaque mthode ou constante en la slectionnant dans le volet liste des objets, puis en dfinissant les valeurs dans la page Attributs. Pour les mthodes de module, vous devez spcifier dans la page Attributs un nom et un point dentre dans la DLL. Dclarez les paramtres de la fonction et le type de valeur renvoy dans la page Paramtres. Pour les constantes de module, utilisez la page Attributs pour spcifier le nom, le type et la valeur.
Remarque

Lditeur de bibliothques de types ne gnre aucune dclaration ou implmentation associe un module. La DLL spcifie doit tre cre dans un projet spar.

Utilisation de lditeur de bibliothques de types


En utilisant lditeur de bibliothques de types, vous pouvez crer de nouvelles bibliothques de types ou modifier des bibliothques existantes. Gnralement un concepteur dapplication utilise lexpert pour crer les objets qui sont exposs dans la bibliothques de types et laisse Delphi gnrer automatiquement la bibliothque de types. La bibliothque de types gnre automatiquement est ensuite ouverte dans lditeur de bibliothques de types afin de dfinir (ou modifier) les interfaces, dajouter des dfinitions de types, etc. Cependant, mme si vous nutilisez pas lexpert pour dfinir les objets, vous pouvez utiliser lditeur de bibliothques de types pour dfinir une nouvelle bibliothque de types. Dans ce cas, vous devez crer vous-mme les classes dimplmentation car lditeur de bibliothques de types ne gnre pas de code pour les CoClasses qui nont pas t associes par lexpert une bibliothque de types. Lditeur supporte un sous-ensemble de types autoriss et de SafeArray dans une bibliothque de types comme dcrit ci-dessous.

34-12

Guide du dveloppeur

Lditeur de bibliothques de types

Vous pouvez effectuer les oprations suivantes dans une bibliothque de types : Cration dune nouvelle bibliothque de types Ouverture dune bibliothque de types existante Ajout dune interface une bibliothque de types Modification dune interface Ajout de proprits et de mthodes une bibliothque de types Ajout dune CoClasse une bibliothque de types Ajout dune interface une CoClasse Ajout dune numration une bibliothque de types Ajout dun alias une bibliothque de types Ajout dun enregistrement ou dune union une bibliothque de types Ajout dun module une bibliothque de types Enregistrement et recensement des informations dune bibliothque de types

Types autoriss
Dans lditeur de bibliothques de types, vous utilisez des identificateurs de types diffrents, selon que vous travaillez en IDL ou en Pascal Objet. Spcifiez le langage que vous voulez utiliser dans la bote de dialogue Options denvironnement. Les types suivants sont autoriss dans une bibliothque de types pour le dveloppement COM. La colonne Compatible Automation sp cifie si le type peut tre utilis par une interface dont lindicateur Automation ou Dispinterface est activ. COM utilise automatiquement le marshalling pour les types suivants via la bibliothque de types.
Type Pascal
Smallint Integer Single Double Currency TDateTime WideString IDispatch SCODE WordBool OleVariant IUnknown Shortint Byte Word LongWord

Type IDL
short long single double CURRENCY DATE BSTR IDispatch SCODE VARIANT_BOOL VARIANT IUnknown byte unsigned char unsigned short unsigned long

Type variant
VT_I2 VT_I4 VT_R4 VT_R8 VT_CY VT_DATE VT_BSTR VT_DISPATCH VT_ERROR VT_BOOL VT_VARIANT VT_UNKNOWN VT_I1 VT_UI1 VT_UI2 VT_UI4

Compatible Automation
Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Non Oui Oui* Oui*

Description
entier sign sur 2 octets entier sign sur 4 octets Rel sur 4 octets Rel sur 8 octets Montaire Date Chane binaire Pointeur sur une interface IDispatch Code derreur OLE Vrai = -1, faux = 0 Variant OLE Pointeur sur une interface IUnknown Entier sign sur 1 octet Entier non sign sur 1 octet Entier non sign sur 2 octets Entier non sign sur 4 octets

Utilisation des bibliothques de types

34-13

Lditeur de bibliothques de types

Type Pascal
Int64 Largeuint SYSINT SYSUINT HResult Pointer SafeArray PChar PWideChar

Type IDL
__int64 uint64 int unsigned int HRESULT SAFEARRAY LPSTR LPWSTR

Type variant
VT_I8 VT_UI8 VT_INT VT_UINT VT_HRESULT VT_PTR -> VT_VOID VT_SAFEARRAY VT_LPSTR VT_LPWSTR

Compatible Automation
Non Non Oui* Oui* Non Non Non Non Non

Description
Entier sign sur 8 octets Entier non sign sur 8 octets Entier dpendant du systme (Win32=Integer) Entier non sign dpendant du systme Code derreur 32 bits Pointeur non typ Tableau protg OLE Pointeur sur un Char Pointeur sur un WideChar

* Word, LongWord, SYSINT et SYSUINT sont compatibles Automation dans la plupart des applications, mais ils peuvent ne pas ltre dans des anciennes applications.

Remarque

Le type Byte (VT_UI1) est compatible avec lAutomation, mais il nest pas autoris dans un Variant ou un OleVariant car de nombreux serveurs Automation ne grent pas correctement cette valeur. Outre ces types, toute interface ou type dfini dans la bibliothque ou dans les bibliothques rfrences peut sutiliser dans une dfinition de bibliothque de types. Lditeur de bibliothques de types stocke les informations de type dans le fichier (.TLB) de bibliothque de types gnre sous forme binaire. Si un paramtre est de type Pointer, lditeur de bibliothques de types le convertit gnralement en paramtre variable. Quand la bibliothque de types est enregistre, les indicateurs IDL des ElemDesc associs aux paramtres variable sont marqus IDL_FIN ou IDL_FOUT. Souvent, les indicateurs IDL ElemDesc ne sont pas marqu s par IDL_FIN ni par IDL_FOUT lorsque le type est prcd dun pointeur. De mme, sil sagit de dispinterfaces, les indicateurs IDL ne sont gnralement pas utiliss. Dans ces situations, on peut voir ct de lidentificateur de variable un commentaire comme {IDL_None} ou {IDL_In}. Ces commentaires sont utiliss lors de lenregistrement dune bibliothque de types, pour marquer correctement les indicateurs IDL.

Les SafeArray
COM requiert que les tableaux soient transmis via un type de donnes spcial appel SafeArray. Vous pouvez crer et dtruire les SafeArrays en appelant des fonctions COM particulires, et tous les lments dun SafeArray doivent tre de types compatibles automation-valides. Le compilateur Delphi dispose dinformations intgres sur les SafeArrays COM et appellera automatiquement lAPI COM pour crer, copier et dtruire des SafeArrays.

34-14

Guide du dveloppeur

Lditeur de bibliothques de types

Dans lditeur de bibliothques de types, un SafeArray doit spcifier son type de composant. Par exemple, la ligne suivante de la page Texte dclare une mthode avec un paramtre SafeArray avec un lment de type Integer :
procedure HighLightLines(Lines: SafeArray of Integer);R Remarque

Mme si vous devez spcifier le type de llment lors de la dclaration dun type SafeArray dans lditeur de bibliothques de types, la dclaration du fichier unit _TLB gnr nindique pas le type de llment.

Utilisation de la syntaxe Pascal Objet ou IDL


La page Texte de lditeur de bibliothques de types peut afficher vos informations de type de deux manire diffrentes : En utilisant une extension de la syntaxe Pascal Objet. En utilisant le langage Microsoft IDL.
Remarque

Si vous travaillez sur un objet CORBA, vous ne devez utiliser aucune de ces syntaxes mais employer la place lIDL CORBA. Pour slectionner le langage utilis, il vous suffit de modifier un paramtre de la bote de dialogue Options denvironnement. Choisissez Outils|Options denvironnement, et spcifiez Pascal ou IDL comme langage de lditeur dans la page Bibliothques de types de la bote de dialogue.

Remarque

Le choix de la syntaxe Pascal Objet ou IDL affecte galement les choix disponibles dans la page Attributs des paramtres. Comme cest gnralement le cas pour les applications Pascal Objet, les identificateurs des bibliothques de types ne distinguent pas les majuscules des minuscules. Ils peuvent avoir jusqu 255 caractres et doivent commencer par une lettre ou un caractre de soulignement (_).

Spcifications des attributs


Le Pascal Objet a t tendu pour que les bibliothques de types puissent contenir des spcifications dattributs. Les spcifications dattributs sont entoures de crochets droits et sont spares par des virgules. Chaque spcification dattribut est constitue dun nom dattribut suivi (le cas chant) dune valeur.

Utilisation des bibliothques de types

34-15

Lditeur de bibliothques de types

Le tableau suivant est la liste des noms dattributs et des valeurs correspondantes.
Tableau 34.3
aggregatable appobject bindable control custom default defaultbind defaultcollection defaultvtbl dispid displaybind dllname dual helpfile helpstringdll helpcontext helpstring helpstringcontext hidden immediatebind lcid licensed nonbrowsable nonextensible oleautomation predeclid propget

Syntaxe des attributs Exemple


[aggregatable] [appobject] [bindable] [control] [custom {7B5687A1-F4E9-11D1-92A8-00C04F8C8FC4} 0] [default] [defaultbind] [defaultcollection] [defaultvtbl] [dispid] [displaybind] [dllname Helper.dll] [dual] [helpfile c:\help\myhelp.hlp] [helpstringdll c:\help\myhelp.dll] [helpcontext 2005] [helpstring Interface Paye] [helpstringcontext $17] [hidden] [immediatebind] [lcid $324] [licensed] [nonbrowsable] [nonextensible] [oleautomation] [predeclid] [propget]

Nom dattribut

Sapplique
typeinfo typeinfo dune CoClasse membres, sauf membres dune CoClasse bibliothque de types, typeinfo tout membres dune CoClasse membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse membres dune CoClasse membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse typeinfo dun module typeinfo dune interface bibliothque de types bibliothque de types tout sauf membres et param tres dune CoClasse tout sauf membres et param tres dune CoClasse tout sauf membres et param tres dune CoClasse tout sauf des paramtres membres, sauf membres dune CoClasse bibliothque de types bibliothque de types, typeinfo dune CoClasse membres, sauf membres dune CoClasse typeinfo dune interface typeinfo dune interface typeinfo membres, sauf membres dune CoClasse

34-16

Guide du dveloppeur

Lditeur de bibliothques de types

Tableau 34.3
propput propputref public readonly replaceable requestedit restricted source uidefault

Syntaxe des attributs (suite) Exemple


[propput] [propputref] [public] [readonly] [replaceable] [requestedit] [restricted] [source] [uidefault] [usesgetlasterror] [uuid {7B5687A1-F4E9-11D1-92A8-00C04F8C8FC4} ] [vararg] [version 1.1]

Nom dattribut

Sapplique
membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse typeinfo dun alias membres, sauf membres dune CoClasse tout sauf membres et param tres dune CoClasse membres, sauf membres dune CoClasse tout sauf des paramtres tous les membres membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse bibliothque de types, typeinfo (obligatoire) membres, sauf membres dune CoClasse bibliothque de types, typeinfo

usesgetlasterror uuid vararg version

Syntaxe pour une interface


La syntaxe Pascal Objet pour dclarer les informations de type dune interface est de la forme :
nominterface = interface[(baseinterface)] [attributs] listefonctions [listemthodeproprit] end;

Par exemple, le texte suivant est la dclaration dune interface avec deux mthodes et une proprit :
Interface1 = interface (IDispatch) [uuid {7B5687A1-F4E9-11D1-92A8-00C04F8C8FC4}, version 1.0] function Calculate(optional seed:Integer=0): Integer; procedure Reset; procedure PutRange(Range: Integer) [propput, dispid $00000005]; stdcall; function GetRange: Integer;[propget, dispid $00000005]; stdcall; end;

La syntaxe Microsoft IDL correspondante est :


[uuid {5FD36EEF-70E5-11D1-AA62-00C04FB16F42},version 1.0] interface Interface1 :IDispatch {

Utilisation des bibliothques de types

34-17

Lditeur de bibliothques de types

long Calculate([in, optional, defaultvalue(0)] long seed); void Reset(void); [propput, id(0x00000005)] void _stdcall PutRange([in] long Value); [propput, id(0x00000005)] void _stdcall getRange([out, retval] long *Value); };

Syntaxe pour une interface de rpartition


La syntaxe Pascal Objet pour dclarer les informations de type dune dispinterface est de la forme :
nomdispinterface = dispinterface [attributs] listefonctions [listeproprits] end;

Par exemple, le texte suivant est la dclaration dune dispinterface avec les mmes mthodes et la mme proprit que pour linterface prcdente :
MyDispObj = dispinterface [uuid {5FD36EEF-70E5-11D1-AA62-00C04FB16F42}, version 1.0, helpstring dispatch interface for MyObj] function Calculate(seed:Integer): Integer [dispid 1]; procedure Reset [dispid 2]; property Range: Integer [dispid 3]; end;

La syntaxe Microsoft IDL correspondante est :


[uuid {5FD36EEF-70E5-11D1-AA62-00C04FB16F42}, version 1.0, helpstring dispatch interface for MyObj] dispinterface Interface1 { methods: [id(1)] int Calculate([in] int seed); [id(2)] void Reset(void); properties: [id(3)] int Value; };

Syntaxe pour une CoClasse


La syntaxe Pascal Objet pour dclarer les informations de type dune CoClasse est de la forme :
nomclasse = coclass(nominterface[attributsinterface], ...); [attributs];

Par exemple, le texte suivant est la dclaration dune coclasse pour linterface IMyInt et la dispinterface DmyInt :
myapp = coclass(IMyInt [source], DMyInt); [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, version 1.0, helpstring A class, appobject]

34-18

Guide du dveloppeur

Lditeur de bibliothques de types

La syntaxe Microsoft IDL correspondante est :


[uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, version 1.0, helpstring A class, appobject] coclass myapp { methods: [source] interface IMyInt); dispinterface DMyInt; };

Syntaxe pour une numration


La syntaxe Pascal Objet pour dclarer les informations de type dune numration est de la forme :
nomnumration = ([attributs] listenumration);

Par exemple, le texte suivant est la dclaration dun type numr avec trois valeurs :
location = ([uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, helpstring emplacement de la cabine] Inside = 1 [helpstring Dans le pavillon]; Outside = 2 [helpstring A lextrieur du pavillon]; Offsite = 3 [helpstring Loin du pavillon];);

La syntaxe Microsoft IDL correspondante est :


[uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, helpstring emplacement de la cabine] typedef enum { [helpstring Dans le pavillon] Inside = 1, [helpstring A lextrieur du pavillon] Outside = 2, [helpstring Loin du pavillon] Offsite = 3 } location;

Syntaxe pour un alias


La syntaxe Pascal Objet pour dclarer les informations de type dun alias est de la forme :
nomalias = typebase[attributs];

Par exemple, le texte suivant est la dclaration dun DWORD comme alias dun entier :
DWORD = Integer [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}];

La syntaxe Microsoft IDL correspondante est :


[uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}] typedef long DWORD;

Utilisation des bibliothques de types

34-19

Lditeur de bibliothques de types

Syntaxe pour un enregistrement


La syntaxe Pascal Objet pour dclarer les informations de type dun enregistrement est de la forme :
nomenregistrement = record [attributs] listechamps end;

Par exemple, le texte suivant est la dclaration dun enregistrement :


Tasks = record [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, helpstring Description de la tche] ID: Integer; StartDate: TDate; EndDate: TDate; Ownername: WideString; Subtasks: safearray of Integer; end;

La syntaxe Microsoft IDL correspondante est :


[uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, helpstring Description de la tche] typedef struct { long ID; DATE StartDate; DATE EndDate; BSTR Ownername; SAFEARRAY (int) Subtasks; } Tasks;

Syntaxe pour une union


La syntaxe Pascal Objet pour dclarer les informations de type dune union est de la forme :
nomunion = record [attributs] case Integer of 0: field1; 1: field2; ... end;

Par exemple, le texte suivant est la dclaration dune union :


MyUnion = record [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, helpstring description dun lment] case Integer of 0: (Name: WideString); 1: (ID: Integer); 3: (Value: Double); end;

La syntaxe Microsoft IDL correspondante est :


[uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, helpstring description dun lment] typedef union {

34-20

Guide du dveloppeur

Lditeur de bibliothques de types

BSTR Name; long ID; double Value; } MyUnion;

Syntaxe pour un module


La syntaxe Pascal Objet pour dclarer les informations de type dun module est de la forme :
nommodule = module constantes pointsentre end;

Par exemple, le texte suivant est la dclaration des informations de type dun module :
MyModule = module [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, dllname circle.dll] PI: Double = 3.14159; function area(radius: Double): Double [ entry 1 ]; stdcall; function circumference(radius: Double): Double [ entry 2 ]; stdcall; end;

La syntaxe Microsoft IDL correspondante est :


[uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, dllname(circle.dll)] module MyModule { double PI = 3.14159; [entry(1)] double _stdcall area([in] double radius); [entry(2)] double _stdcall circumference([in] double radius); };

Cration dune nouvelle bibliothque de types


Vous pouvez souhaiter crer une bibliothque de types qui soit indpendante dun objet COM particulier. Vous pouvez par exemple dfinir une bibliothque de types contenant des dfinitions de types que vous utilisez dans dautres bibliothques de types. Vous pouvez, pour ce faire, crer une bibliothque de types contenant les dfinitions de base et lajouter dans la page Utilise des autres bibliothques. Vous pouvez galement crer une bibliothque de types pour un objet qui na pas encore t implment. Quand la bibliothque de types contient les dfinitions dinterface, vous pouvez utiliser lexpert objet COM pour gnrer une CoClasse et limplmentation. Pour crer une nouvelle bibliothque de types,

1 Choisissez Fichier|Nouveau|Autre afin douvrir la bote de dialogue Nouveaux lments. 2 Choisissez la page ActiveX. 3 Slectionnez licne Bibliothque de types. 4 Choisissez OK.

Utilisation des bibliothques de types

34-21

Lditeur de bibliothques de types

Lditeur de bibliothques de types saffiche en demandant le nom de la bibliothque de types.

5 Entrez le nom de la bibliothque de types. Poursuivez en ajoutant les lments de la bibliothque de types.

Ouverture dune bibliothque de types existante


Si vous utilisez les experts pour crer un contrle ActiveX, un objet Automation, une fiche active, un objet Active Server, un objet COM, un objet transactionnel, un module de donnes distant ou un module de donnes transactionnel, une bibliothque de types est automatiquement cre avec une unit dimplmentation. De plus, des bibliothques de types sont associes dautres logiciels (serveurs) installs sur votre systme. Pour ouvrir une bibliothque de types existante indpendant dun projet,

1 Choisissez Fichier|Ouvrir dans le menu principal de lEDI. 2 Dans la bote de dialogue Ouvrir, initialisez la liste Type Bibliothques de types. 3 Slectionnez la bibliothque de types souhaite et choisissez Ouvrir.
Pour ouvrir une bibliothque de types associe au projet en cours,

1 Choisissez Voir|Bibliothque de types


Remarque

Si vous utilisez lexpert objet CORBA, vous pouvez galement utiliser Voir| Bibliothque de types pour modifier les interfaces dobjet CORBA. Ce que vous voyez alors nest pas proprement dit une bibliothque de types, mais vous lutilisez de la mme manire. Vous pouvez maintenant ajouter des interfaces, CoClasses et dautres lments la bibliothque de types (numrations, proprits ou mthodes, etc.).

Remarque

Les modifications effectues aux informations de bibliothque de types laide de lditeur de bibliothque de types peuvent se reflter automatiquement dans la classe dimplmentation associe. Si vous prfrez au pralable revoir les modifications, vrifiez que la bote de dialogue est active. Elle est active par dfaut et ce paramtrage peut tre modifi avec loption daffichage des mises jour avant le rafrachissement prsente sur la page Outils|Options denvironnement|Bibliothque de types. Pour plus dinformations, voir Bote de dialogue Appliquer les mises jour la page 34-28. Quand vous crivez des applications client, il nest pas ncessaire douvrir la bibliothque de types. Vous avez juste besoin de lunit Projet_TLB cre par lditeur de bibliothques de types et pas de la bibliothque de types mme. Il est possible dajouter directement ce fichier dans un projet client ou, si la bibliothque de types est recense sur votre systme, vous pouvez utiliser la bote de dialogue Importation de bibliothque de types (Projet|Importation de bibliothque de types).

Astuce

34-22

Guide du dveloppeur

Lditeur de bibliothques de types

Ajout dune interface une bibliothque de types


Pour ajouter une interface,

1 Dans la barre doutils, cliquez sur licne Interface.


Une interface est ajoute dans le volet liste des objets et vous pouvez en saisir le nom.

2 Entrez le nom de linterface.


La nouvelle interface a les attributs par dfaut que vous pouvez modifier selon vos besoins. Vous pouvez ajouter des proprits (reprsentes par des fonctions get/set) et des mthodes afin de dfinir le rle de linterface.

Modification dune interface en utilisant la bibliothque de types


Il y a plusieurs manires de modifier une interface ou une dispinterface une fois cre. Vous pouvez modifier les attributs de linterface en utilisant la page des informations de type contenant les informations que vous voulez modifier. Slectionnez linterface dans le volet liste des objets, puis utilisez les contrles de la page approprie des informations de type. Par exemple, vous pouvez changer linterface parent en utilisant la page Attributs ou utiliser la page Indicateurs pour spcifier si cest ou non une interface double. Vous pouvez modifier directement la dclaration de linterface en slectionnant linterface dans le volet liste des objets et en modifiant les dclarations de la page Texte. Vous pouvez ajouter des proprits et mthodes linterface (voir la section suivante). Vous pouvez modifier les proprits et mthodes dj dfinies dans linterface en modifiant leurs informations de type. Vous pouvez lassocier une CoClasse en slectionnant la CoClasse dans le volet liste des objets puis en cliquant avec le bouton droit de la souris dans la page Implmente et en choisissant Insertion dinterface.
Remarque

Si vous utilisez la bibliothque de types pour ajouter une interface CORBA, la plupart des informations de la page Attributs sont inapplicables. Vous navez pas non plus besoin de la page Indicateurs. Si linterface est associe une CoClasse gnre par un expert, vous pouvez demander lditeur de bibliothques de types dappliquer les modifications au fichier implmentation en utilisant le bouton Rafrachir limplmentation de la barre doutils.Si la bote de dialogue Appliquer les mises jour est active, lditeur de bibliothques de types vous prvient avant de mettre jour les sources lorsque vous enregistrez la bibliothque de types et vous avertit de problmes ventuels. Par exemple, si vous renommez une interface dvnement

Utilisation des bibliothques de types

34-23

Lditeur de bibliothques de types

par erreur, vous obtenez dans votre fichier source un avertissement du type suivant :
En raison de la prsence de variables dinstance dans votre fichier dimplmentation, Delphi na pas pu mettre jour le fichier pour reflter la modification du nom de linterface dvnement. Bien que Delphi ait mis jour la bibliothque de types, vous devez mettre jour le fichier dimplmentation manuellement.

Un commentaire TODO prcde cet avertissement dans le fichier source.


Attention

Si vous ignorez cet avertissement et le commentaire TODO, le code ne se compile pas.

Ajout de proprits et mthodes une interface ou dispinterface


Pour ajouter des membres une interface ou une dispinterface

1 Slectionnez linterface et choisissez licne Proprit ou Mthode dans la barre doutils. Si vous ajoutez une proprit, vous pouvez cliquer directement dans licne Proprit pour crer une proprit en lecture/criture (avec des fonctions get et set), ou cliquez sur la flche vers le bas pour afficher un menu des types de proprits.
Les membres mthode daccs la proprit ou le membre mthode sont ajouts au volet liste des objets et vous pouvez en saisir le nom.

2 Saisissez le nom du membre.


Le nouveau membre contient les valeurs par dfaut pour les pages Attributs, Paramtres et Indicateurs ; vous pouvez les modifier pour les adapter vos besoins. Par exemple, dans le cas dune proprit, vous utiliserez la page Attributs pour spcifier le type. Si vous ajoutez une mthode, vous utiliserez la page Paramtres pour en spcifier les paramtres. Vous pouvez galement ajouter des mthodes et proprits directement dans la page Texte laide de la syntaxe Pascal ou IDL. Par exemple, si vous utilisez la syntaxe Pascal, vous pouvez saisir les dclarations de proprits suivantes dans la page Texte dune interface :
Interface1 = interface(IDispatch) [ uuid {5FD36EEF-70E5-11D1-AA62-00C04FB16F42}, version 1.0, dual, oleautomation ] function AutoSelect: Integer [propget, dispid $00000002]; safecall; // Ajouter ceci function AutoSize: WordBool [propget, dispid $00000001]; safecall; // et ceci procedure AutoSize(Value: WordBool) [propput, dispid $00000001]; safecall; // Et ceci end;

Si vous utilisez IDL, vous pouvez ajouter les mmes dclarations de la manire suivante :
[ uuid(5FD36EEF-70E5-11D1-AA62-00C04FB16F42), version(1.0), dual, oleautomation

34-24

Guide du dveloppeur

Lditeur de bibliothques de types

] interface Interface1: IDispatch { // Ajoutez tout ce qui se trouve entre les accolades [propget, id(0x00000002)] HRESULT _stdcall AutoSelect([out, retval] long Value ); [propget, id(0x00000003)] HRESULT _stdcall AutoSize([out, retval] VARIANT_BOOL Value ); [propput, id(0x00000003)] HRESULT _stdcall AutoSize([in] VARIANT_BOOL Value ); };

Une fois des membres ajouts une interface en utilisant la page Texte de linterface, les membres apparaissent comme lments distincts dans le volet liste des objets. Chaque membre dispose de ses propres pages Attributs, Indicateurs et Paramtres. Vous pouvez modifier chaque nouvelle proprit ou mthode en la slectionnant dans le volet liste des objets et en utilisant ses pages ou en effectuant les modifications directement dans la page Texte. Si linterface est associe une CoClasse gnre par un expert, vous pouvez demander lditeur de bibliothques de types dappliquer les modifications au fichier implmentation en utilisant le bouton Rafrachir de la barre doutils. Lditeur de bibliothques de types ajoute les nouvelles mthodes la classe dimplmentation afin de reflter les nouveaux membres. Vous pouvez ensuite rechercher les nouvelles mthodes dans le code source de lunit dimplmentation et remplir leurs corps afin de complter limplmentation. Si la bote de dialogue Appliquer les mises jour est active, lditeur de bibliothques de types vous prvient avant de mettre jour les sources lorsque vous enregistrez la bibliothque de types et vous avertit de problmes ventuels.

Ajout dune CoClasse une bibliothque de types


Le moyen le plus simple dajouter une CoClasse un projet consiste choisir Fichier|Nouveau|Autre dans le menu principal de lEDI et dutiliser lexpert appropri dans les pages ActiveX ou Multi-niveaux de la bote de dialogue Nouveaux lments. Cette approche est pratique car non seulement la CoClasse et son interface sont ajoutes la bibliothque de types, mais lexpert ajoute une unit dimplmentation et actualise le fichier projet pour inclure la nouvelle unit dimplmentation dans sa clause uses. Si vous nutilisez pas un expert, vous pouvez tout de mme crer une CoClasse en choisissant licne CoClasse dans la barre doutils puis en spcifier ses attributs. Gnralement, vous spcifierez son nom (dans la page Attributs) et utiliserez la page Indicateurs pour spcifier si la CoClasse est un objet application, si elle reprsente un contrle ActiveX, etc.
Remarque

Si vous ajoutez une CoClasse une bibliothque de types en utilisant la barre doutils au lieu de lexpert, vous devez gnrer vous-mme limplmentation pour la CoClasse et lactualiser manuellement chaque fois que vous modifiez un lment de lune des interfaces de la CoClasse. Il nest pas possible dajouter directement des membres une CoClasse. Cest implicitement que vous ajoutez des membres quand vous ajoutez une interface la CoClasse.

Utilisation des bibliothques de types

34-25

Lditeur de bibliothques de types

Ajout dune interface une CoClasse


Les CoClasses sont dfinies par les interfaces quelles prsentent aux clients. Mme si vous pouvez ajouter un nombre quelconque de proprits et de mthodes la classe dimplmentation dune CoClasse, les clients ne voient que les proprits et mthodes qui sont exposes par les interfaces associes la CoClasse. Pour associer une interface une CoClasse, cliquez avec le bouton droit de la souris dans la page Implmente de la classe et choisissez Insrer une interface pour afficher une liste des interfaces dans laquelle choisir. Cette liste contient les interfaces dfinies dans la bibliothque de types en cours et celles dfinies dans toutes les bibliothques de types rfrences par celle-ci. Choisissez une interface que la classe doit implmenter. Linterface est ajoute la page avec son GUID et dautres attributs. Si la CoClasse a t gnre par un expert, lditeur de bibliothques de types actualise automatiquement la classe dimplmentation pour y placer le squelette des mthodes (y compris les mthodes daccs aux proprits) pour toutes les interfaces ajoutes de cette manire.Si la bote de dialogue Appliquer les mises jour est active, lditeur de bibliothques de types vous prvient avant de mettre jour les sources lorsque vous enregistrez la bibliothque de types et vous avertit de problmes ventuels.

Ajout dune numration une bibliothque de types


Pour ajouter une numration une bibliothque de types,

1 Dans la barre doutils, choisissez licne Enumration.


Un type numration dont vous pouvez saisir le nom est ajout dans le volet liste des objets.

2 Saisissez le nom du membre.


La nouvelle numration est vide et sa page Attributs contient les attributs par dfaut que vous pouvez modifier. Ajoutez des valeurs lnumration en cliquant sur le bouton Nouvelle constante. Slectionnez ensuite chaque valeur numre et assignez-lui un nom (et ventuellement une valeur) laide de la page Attributs. Une fois une numration ajoute, le nouveau type peut tre utilis par la bibliothque de types ou par toute bibliothque de types qui y fait rfrence dans sa page Utilise. Vous pouvez, par exemple, utiliser lnumration comme type dune proprit ou dun paramtre.

Ajout dun alias une bibliothque de types


Pour ajouter un alias une bibliothque de types :

1 Dans la barre doutils, choisissez licne Alias.


Un type alias dont vous pouvez saisir le nom est ajout dans le volet liste des objets.

34-26

Guide du dveloppeur

Lditeur de bibliothques de types

2 Saisissez le nom de lalias.


Par dfaut, le nouvel alias correspond au type Integer. Utilisez la page Attributs pour choisir la place le type que lalias doit reprsenter. Une fois un alias ajout, le nouveau type peut tre utilis par la bibliothque de types ou par toute bibliothque de types qui y fait rfrence dans sa page Utilise. Vous pouvez, par exemple, utiliser lalias comme type dune proprit ou dun paramtre.

Ajout dun enregistrement ou dune union une bibliothque de types


Pour ajouter un enregistrement ou une union une bibliothque de types :

1 Dans la barre doutils, choisissez le bouton Enregistrement ou le bouton Union.


Le type dlment choisi dont vous pouvez saisir le nom est ajout dans le volet liste des objets.

2 Saisissez le nom de lenregistrement ou de lunion.


A ce stade, lenregistrement ou lunion ne contient pas de champ.

3 Ayant slectionn lenregistrement ou lunion dans le volet liste des objets, choisissez le bouton Champ dans la barre doutils. Spcifiez le nom et le type du champ en utilisant la page Attributs. 4 Rptez ltape 3 pour chaque champ ncessaire.
Une fois lenregistrement ou lunion dfini, le nouveau type peut tre utilis par la bibliothque de types ou par toute bibliothque de types qui y fait rfrence dans sa page Utilise. Vous pouvez, par exemple, utiliser lenregistrement ou lunion comme type dune proprit ou dun paramtre.

Ajout dun module une bibliothque de types


Pour ajouter un module une bibliothque de types :

1 Dans la barre doutils, choisissez licne Module.


Le module slectionn dont vous pouvez saisir le nom est ajout dans le volet liste des objets.

2 Saisissez le nom du module 3 Dans la page Attributs, spcifiez le nom de la DLL dont le module reprsente les points dentre. 4 Ajoutez des mthodes de la DLL spcifie ltape 3 en choisissant le bouton Mthode dans la barre doutils puis en utilisant la page Attributs pour dcrire la mthode. 5 Ajoutez les constantes que le module doit dfinir en choisissant le bouton Constante de la barre doutils. Pour chaque constante, spcifiez le nom, le type et une valeur.

Utilisation des bibliothques de types

34-27

Lditeur de bibliothques de types

Enregistrement et recensement des informations dune bibliothque de types


Aprs avoir modifi une bibliothque de types, vous devez enregistrer et recenser les informations de la bibliothque de types. Lenregistrement de la bibliothque de types actualise : Le fichier bibliothque de types binaire (dextension .tlb). Le fichier unit Projet_TLB qui reprsente son contenu. Le code dimplmentation de toutes les CoClasses gnres par un expert.
Remarque Remarque

La bibliothque de types est stocke dans un fichier binaire distinct (.TLB), mais elle est galement lie au serveur (.EXE, DLL ou .OCX). Si vous utilisez lditeur de bibliothques de types pour des interfaces CORBA, lunit Projet_TLB.pas dfinit les objets stub et squelette ncessaires lapplication CORBA. Lditeur de bibliothques de types vous propose plusieurs options pour stocker les informations de la bibliothque de types. Loption utilise dpend de ltape en cours de limplmentation de la bibliothque de types : Enregistrer pour enregistrer le fichier .TLB et lunit Projet_TLB sur disque. Rafrachir pour actualiser uniquement en mmoire les units de la bibliothque de types. Recenser pour ajouter une entre au registre Windows de votre systme pour la bibliothque de types. Cela est effectu automatiquement lors du recensement du serveur auquel le fichier .TLB est associ. Exporter pour enregistrer un fichier .IDL contenant les dfinitions de types et dinterfaces avec la syntaxe IDL. Toutes les mthodes dcrites ci-dessus effectuent une vrification de la syntaxe. Quand vous rafrachissez, recensez ou enregistrez la bibliothque de types, Delphi actualise automatiquement lunit dimplmentation de toutes les CoClasses cres en utilisant un expert. Vous pouvez, de manire facultative, vrifier les modifications avant leur application, si loption Appliquer les modifications de lditeur de bibliothques de types est active.

Bote de dialogue Appliquer les mises jour


La bote de dialogue Appliquer les mises jour apparat lorsque vous actualisez, recensez ou enregistrez la bibliothque de types si vous avez slectionn loption daffichage des mises jour avant le rafraichissement dans la page Outils| Options denvironnement |Bibliothque de types (option active par dfaut). Si cette option nest pas active, lditeur de bibliothques de types met automatiquement jour les sources de lobjet associ lorsque vous apportez des modifications dans lditeur. Si elle est active, vous pouvez vous opposer aux modifications proposes lorsque vous actualisez, enregistrez ou recensez la bibliothque de types. La bote de dialogue Appliquer les mises jour vous avertit derreurs ventuelles et insre des commentaires TODO dans le fichier source. Par

34-28

Guide du dveloppeur

Lditeur de bibliothques de types

exemple, si vous renommez un vnement par erreur, vous obtenez dans votre fichier source un avertissement du type suivant :
En raison de la prsence de variables dinstance dans votre fichier dimplmentation, Delphi na pas pu mettre jour le fichier pour reflter la modification du nom de linterface dvnement. Bien que Delphi ait mis jour la bibliothque de types, vous devez mettre jour le fichier dimplmentation manuellement.

Un commentaire TODO prcde cet avertissement dans le fichier source.


Remarque

Si vous ignorez cet avertissement et le commentaire TODO, le code nest pas compil.

Enregistrement dune bibliothque de types


Lenregistrement dune bibliothque de types effectue les actions suivantes : Vrification de la syntaxe. Enregistrement des informations dans un fichier .TLB. Enregistrement des informations dans une unit Projet_TLB. Demande au gestionnaire de module de lEDI dactualiser limplmentation si la bibliothque de types est associe une CoClasse gnre par un expert.

Pour enregistrer la bibliothque de types, choisissez Fichier|Enregistrer dans le menu principal de Delphi.

Rafrachissement de la bibliothque de types


Le rafrachissement dune bibliothque de types effectue les actions suivantes : Vrification de la syntaxe. Gnration, uniquement en mmoire, des units Delphi de la bibliothque de types. Lunit nest pas enregistre sur disque. Demande au gestionnaire de module de lEDI dactualiser limplmentation si la bibliothque de types est associe une CoClasse gnre par un expert. Pour rafrachir la bibliothque de types, choisissez licne Rafrachir dans la barre doutils de lditeur de bibliothques de types.
Remarque

Si vous avez renomm ou supprim des lments de la bibliothque de types, le rafrachissement de limplmentation peut crer des entres en double. Dans ce cas, vous devez dplacer le code pour corriger lentre et supprimer les doublons. De mme, si vous supprimez des lments de la bibliothque de types, le rafrachissement de limplmentation ne les retire pas des CoClasses (partant du principe que vous voulez juste les rendre invisibles aux clients). Vous devez supprimer ces lments manuellement dans lunit dimplmentation quand ils ne sont plus ncessaires.

Recensement dune bibliothque de types


Il nest gnralement pas ncessaire de recenser explicitement une bibliothque de types car elle est automatiquement recense quand vous recensez votre application serveur COM (voir Recensement dun objet COM la page 36-18). Cependant, si vous crez une bibliothque de types en utilisant lexpert

Utilisation des bibliothques de types

34-29

Dploiement des bibliothques de types

bibliothque de types, elle nest pas associe un objet serveur. Dans ce cas, vous pouvez la recenser directement en utilisant la barre doutils. Le recensement dune bibliothque de types effectue les actions suivantes : Vrification de la syntaxe. Ajout aux registres Windows dune entre pour la bibliothque de types. Pour recenser la bibliothque de types, choisissez licne Recenser de la barre doutils de lditeur de bibliothques de types.

Exportation dun fichier IDL


Lexportation dune bibliothque de types effectue les actions suivantes : Vrification de la syntaxe. Cration dun fichier IDL contenant les informations de dclaration de type. Ce fichier dcrit les informations de type avec le langage IDL CORBA ou en IDL Microsoft. Pour exporter une bibliothque de types, choisissez licne Exporter dans la barre doutils de lditeur de bibliothques de types.

Dploiement des bibliothques de types


Par dfaut, quand une bibliothque de types a t cre comme partie dun projet de serveur ActiveX ou Automation, elle est automatiquement lie comme ressource dans le fichier .DLL, .OCX ou EXE. Vous pouvez cependant, si vous le prfrez, dployer votre application avec la bibliothque de types sous la forme dun fichier .TLB distinct, car Delphi gre la bibliothque de types Historiquement, les bibliothques de types des applications Automation taient stockes dans un fichier distinct dextension .TLB. Actuellement, dans les applications Automation standard, les bibliothques de types sont compiles directement dans le fichier .OCX ou .EXE. Le systme dexploitation suppose que la bibliothque de types est la premire ressource dans le fichier excutable (.OCX ou .EXE). Quand vous souhaitez proposer dautres dveloppeurs dapplications laccs la bibliothque de types, elle peut se prsenter sous les formes suivantes : Une ressource. Cette ressource doit avoir le type TYPELIB et un identificateur entier. Si vous choisissez de gnrer une bibliothque de types avec un compilateur de ressources, elle doit tre dclare de la manire suivante dans le fichier ressource (.RC) :
1 typelib mylib1.tlb 2 typelib mylib2.tlb

Il peut y avoir plusieurs ressources bibliothque de types dans une bibliothque ActiveX. Les dveloppeurs dapplications utilisent un compilateur

34-30

Guide du dveloppeur

de ressource pour ajouter le fichier .TLB leurs propres bibliothques ActiveX. Un fichier binaire autonome. Le fichier .TLB gnr par lditeur de bibliothques de types est un fichier binaire.

Utilisation des bibliothques de types

34-31

34-32

Guide du dveloppeur

35
Chapitre 35

Chapitre

Cration de clients COM

Les clients COM sont des applications qui utilisent un objet COM implment par une autre application ou bibliothque. Les types les plus courants sont les applications qui contrlent des serveurs Automation (ce sont les contrleurs Automation) et les applications qui accueillent un contrle ActiveX (ce sont les conteneurs ActiveX). Au premier abord, ces deux types de clients COM semblent trs diffrents : un contrleur Automation standard lance un serveur EXE externe et met des commandes que le serveur traite pour lui. Le serveur Automation est gnralement non visuel et hors processus. Dun autre ct, le client ActiveX standard accueille un contrle visuel en lutilisant comme vous pouvez utiliser les contrles de la palette des composants. Les serveurs ActiveX sont toujours des serveurs en processus. Cependant, la ralisation de ces deux types de clients COM est tonnamment similaire : lapplication client obtient une interface pour lobjet serveur et en utilise les proprits et mthodes. Delphi simplifie beaucoup cela en vous permettant denvelopper la CoClasse serveur dans un composant du client que vous pouvez mme installer dans la palette des composants. Des exemples de tels composants enveloppe apparaissent dans deux pages de la palette des composants : des enveloppes ActiveX exemple apparaissent dans la page ActiveX et des objets Automation exemple apparaissent dans la page Serveurs. Quand vous crivez un client COM, vous devez comprendre linterface que le serveur expose aux clients, exactement comme vous devez comprendre les proprits et mthodes dun composant de la palette des composants pour pouvoir lutiliser dans votre application. Cette interface (ou cet ensemble dinterfaces) est dtermine par lapplication serveur et se trouve gnralement publie dans une bibliothque de types. Pour des informations spcifiques sur les interfaces publies par une application serveur spcifique, vous devez consulter la documentation de cette application. Mme si vous ne choisissez pas denvelopper un objet serveur et de linstaller dans la palette des composants, vous devez rendre sa dfinition dinterface

Cration de clients COM

35-1

Importation des informations dune bibliothque de types

accessible votre application. Pour ce faire, vous pouvez importer les informations de la bibliothque de types du serveur.
Remarque

Vous pouvez galement interroger directement les informations de type en utilisant lAPI COM, mais Delphi ne propose pas de gestion particulire de ce processus. Certaines anciennes technologies COM comme OLE ne proposent pas les informations de type dans une bibliothque de types. Elles reposent la place sur un ensemble standard dinterfaces prdfinies. Elles sont prsentes dans Cration de clients pour les serveurs nayant pas une bibliothque de types la page 35-17.

Importation des informations dune bibliothque de types


Pour que votre application client dispose des informations sur le serveur COM, vous devez importer les informations dcrivant le serveur qui sont stockes dans la bibliothque de types du serveur. Votre application peut ensuite utiliser les classes gnres pour contrler lobjet serveur. Il y a deux manires dimporter les informations dune bibliothque de types : Vous pouvez utiliser la bote de dialogue Importation de bibliothque de types pour importer toutes les informations disponibles sur le type de serveur, les objets et les interfaces. Cest la mthode la plus gnrale, car elle vous permet dimporter des informations de toute bibliothque de types et peut, facultativement, crer des composants enveloppe pour toutes les CoClasses de la bibliothque de types pouvant tre cres et qui nont pas les indicateurs Hidden, Restricted ou PreDeclID. Vous pouvez utiliser la bote de dialogue Importation dActiveX si vous importez la bibliothque de types dun contrle ActiveX. Cela importe les mmes informations de type, mais ne cre des composants enveloppe que pour les CoClasses qui reprsentent des contrles ActiveX. Vous pouvez utiliser lutilitaire en ligne de commande tlibimp.exe qui fournit des options de configuration supplmentaires non disponibles partir de lEDI. Une bibliothque de types gnre laide dun expert est automatiquement importe en utilisant le mcanisme de llment de menu Importer une bibliothque de types. Indpendamment de la mthode utilise pour importer les informations de la bibliothque de types, la bote de dialogue cre une unit de nom NomBibTypes_TLB, o NomBibTypes est le nom de la bibliothque de types. Ce fichier contient des dclarations pour les classes, types et interfaces dfinis dans la bibliothque de types. En lincluant dans votre projet, ces dfinitions deviennent accessibles votre application afin de pouvoir crer des objets et appeler leurs interfaces. Ce fichier peut tre recr par lEDI de temps en temps ; de ce fait, des modifications manuelles apportes au fichier ne sont pas recommandes.

35-2

Guide du dveloppeur

Importation des informations dune bibliothque de types

Outre lajout des dfinitions de types lunit NomBibTypes_TLB, la bote de dialogue peut galement crer des classes enveloppe VCL pour toutes les CoClasses dfinies dans la bibliothque de types. Quand vous utilisez la bote de dialogue Importation de bibliothque de types, ces classes enveloppe sont facultatives. Quand vous utilisez la bote de dialogue Importation dActiveX, elles sont toujours gnres pour toutes les CoClasses reprsentant des contrles. Les classes enveloppe gnres reprsentent les CoClasses de votre application et exposent les proprits et mthodes de ses interfaces. Si une CoClasse gre les interfaces de cration dvnements (IConnectionPointContainer et IConnectionPoint), la classe enveloppe VCL cre un collecteur dvnements afin que vous puissiez affecter des gestionnaires dvnements aux vnements aussi facilement que pour les autres composants. Si vous demandez dans la bote de dialogue dinstaller les classes VCL g nres dans la palette des composants, vous pouvez utiliser linspecteur dobjets pour affecter des valeurs aux proprits et aux gestionnaires dvnements.
Remarque

La bote de dialogue Importation de bibliothque de types ne cre par de classe enveloppe pour les objets vnement COM+. Pour crire un client rpondant aux vnements gnrs par un objet vnement COM+, vous devez crer le collecteur dvnements par code. Ce processus est dcrit dans Gestion des vnements COM+ la page 35-16. Pour davantage de dtails sur le code gnr quand vous importez une bibliothque de types, voir Code gnr par limportation des informations dune bibliothque de types la page 35-5.

Utilisation de la bote de dialogue Importation de bibliothque de types


Pour importer une bibliothque de types :

1 Choisissez Projet|Importer une bibliothque de types. 2 Slectionnez la bibliothque de types dans la liste.
La bote de dialogue rpertorie toutes les bibliothques recenses sur ce systme. Si la bibliothque de types nest pas dans la liste, choisissez le bouton Ajouter, trouvez et slectionnez le fichier de la bibliothque de types et choisissez OK et rptez ltape 2. Remarquez que la bibliothque de types peut tre un fichier bibliothque de types autonome (.tlb, .olb) ou un serveur fournissant une bibliothque de types (.dll, .ocx, .exe).

3 Si vous voulez gnrer un composant VCL qui encapsule une CoClasse de la bibliothque de types, cochez la case Gnrer le Wrapper de composant. Si vous ne gnrez pas le composant, vous pouvez toujours utiliser la CoClasse en utilisant les dfinitions de lunit NomBibTypes_TLB. Cependant vous avez alors crire vos propres appels pour crer lobjet serveur et, si ncessaire, configurer un collecteur dvnements.
La bote de dialogue Importation de bibliothque de types nimporte que les CoClasses ayant lindicateur CanCreate activ et nayant pas les indicateurs

Cration de clients COM

35-3

Importation des informations dune bibliothque de types

Hidden, Restricted ou PreDeclID activs. Ces indicateurs peuvent tre redfinis au moyen de lutilitaire en ligne de commande tlibimp.exe.

4 Si vous ne voulez pas installer le composant gnr dans la palette des composants, choisissez Crer lunit. Cela gnre lunit NomBibTypes_TLB et, si vous avez coch loption Gnrer le Wrapper de composant ltape 3, y ajoute les dclarations du composant enveloppe. Cela entrane la sortie de la bote de dialogue Importation de bibliothque de types. 5 Si vous voulez installer dans la palette des composants le composant enveloppe gnr, slectionnez la page de la palette dans laquelle vous voulez placer le composant et choisissez Installer. Cela gnre lunit NomBibTypes_TLB, comme le bouton Crer lunit, puis cela affiche la bote de dialogue Installation de composant qui vous permet de spcifier le paquet (existant ou nouveau) dans lequel placer le composant. Ce bouton est gris si aucun composant ne peut tre cr pour la bibliothque de types.
Quand vous sortez de la bote de dialogue Importation de bibliothque de types, lunit NomBibTypes_TLB apparat dans le rpertoire spcifi par loption Rpertoire unit. Ce fichier contient les dclarations pour les lments dfinis dans la bibliothque de types, ainsi que pour les composants enveloppe gnrs si vous avez coch loption Gnrer le Wrapper de composant. De plus, si vous avez install le composant enveloppe gnr, lobjet serveur dfini par la bibliothque de types a t ajout la palette des composants. Vous pouvez utiliser linspecteur dobjets pour dfinir les proprits du serveur ou crire un gestionnaire dvnement. Si vous ajoutez le composant dans une fiche ou un module de donnes, vous pouvez cliquer dessus la conception avec le bouton droit de la souris pour voir sa page de proprits (sil en a une).
Remarque

La page Serveurs de la palette de composants contient un certain nombre dexemples de serveurs Automation qui ont t imports de cette manire.

Utilisation de la bote de dialogue Importation dActiveX


Pour importer un contrle ActiveX :

1 Choisissez Composant|Importer un contrle ActiveX. 2 Slectionnez la bibliothque de types dans la liste.


La bote de dialogue rpertorie toutes les bibliothques recenses dfinissant un contrle ActiveX (cest un sous-ensemble de la liste de bibliothques de types affiche par la bote de dialogue Importation de bibliothque de types). Si la bibliothque de types nest pas dans la liste, choisissez le bouton Ajouter, trouvez et slectionnez le fichier de la bibliothque de types, choisissez OK et rptez ltape 2. Remarquez que la bibliothque de types peut tre un fichier bibliothque de types autonome (.tlb, .olb) ou un serveur ActiveX (.dll, .ocx).

3 Si vous ne voulez pas installer le contrle ActiveX dans la palette des composants, choisissez Crer lunit. Cela gnre lunit NomBibTypes_TLB et y ajoute la dclaration de ses envelopppes de composants. Cela entrane la sortie de la bote de dialogue Importation dActiveX.

35-4

Guide du dveloppeur

Importation des informations dune bibliothque de types

4 Si vous voulez installer le contrle dans la palette des composants, slectionnez la page de la palette dans laquelle vous voulez placer le composant et choisissez Installer. Cela gnre lunit NomBibTypes_TLB, comme le bouton Crer lunit, puis cela affiche la bote de dialogue Installation de composant qui vous permet de spcifier le paquet (existant ou nouveau) dans lequel placer le composant
Quand vous sortez de la bote de dialogue Importation dActiveX, lunit NomBibTypes_TLB apparat dans le rpertoire spcifi par loption Rpertoire unit. Ce fichier contient les dclarations pour les lments dfinis dans la bibliothque de types, ainsi que pour le composant enveloppe gnr pour le contrle ActiveX.
Remarque

A la diffrence de la bote de dialogue Importation de bibliothque de types o cest facultatif, la bote de dialogue Importation dActiveX gnre toujours un composant enveloppe. En effet, comme cest un contrle visuel, un contrle ActiveX a besoin de lassistance supplmentaire du composant enveloppe pour pouvoir sadapter aux fiches VCL. Si vous installez le composant enveloppe gnr, il y a un contrle ActiveX dans la palette des composants. Vous pouvez utiliser linspecteur dobjets pour dfinir ses proprits ou crire des gestionnaires dvnements. Si vous ajoutez le contrle dans une fiche ou un module de donnes, vous pouvez cliquer dessus la conception avec le bouton droit de la souris pour voir sa page de proprits (sil en a une).

Remarque

La page ActiveX de la palette des composants contient un certain nombre dexemples de contrles ActiveX imports de cette manire.

Code gnr par limportation des informations dune bibliothque de types


Une fois une bibliothque de types importe, vous pouvez visualiser lunit NomBibTypes_TLB gnre. En haut, vous trouverez les lments suivants : Les dclarations des constantes donnant des noms symboliques aux GUIDS de la bibliothque de types, ses interfaces et ses CoClasses. Le nom de ces constantes est gnr comme suit : Le GUID de la bibliothque de types de la forme LBID_NomBibTypes, o NomBibTypes est le nom de la bibliothque de types. Le GUID dune interface a la forme IID_NomInterface, o NomInterface est le nom de linterface. Le GUID dune dispinterface a la forme DIID_NomInterface, o NomInterface est le nom de la dispinterface. Le GUID dune CoClasse a la forme CLASS_NomClasse, o NomClasse est le nom de la CoClasse. Des dclarations des CoClasses de la bibliothque de types. Elles correspondent chaque CoClasse de son interface par dfaut.

Cration de clients COM

35-5

Contrle dun objet import

Des dclarations pour les interfaces et dispinterfaces de la bibliothque de types. Des dclarations pour une classe crateur pour chaque CoClasse dont linterface par dfaut gre les liaisons par Vtable. La classe crateur a deux mthodes de classe, Create et CreateRemote, qui peuvent sutiliser pour instancier la CoClasse localement (Create) ou distance (CreateRemote). Ces mthodes renvoient linterface par dfaut de la CoClasse. Ces dclarations fournissent ce qu il faut pour crer des instances de la CoClasse et accder son interface. Il vous faut ajouter le fichier NomBibTypes_TLB.pas gnr la clause uses de lunit dans laquelle vous voulez effectuer le lien avec une CoClasse et appeler ses interfaces.
Remarque

Cette portion de lunit NomBibTypes_TLB est galement gnre quand vous utilisez lditeur de bibliothques de types ou lutilitaire en ligne de commande TLIBIMP. Si vous voulez utiliser un contrle ActiveX, vous avez galement besoin de la classe enveloppe VCL gnre en plus des dclarations dcrites ci-dessus. Lenveloppe VCL gre les problmes de gestion de fentre du contrle. Vous pouvez galement avoir dautres classes enveloppe VCL gnres pour dautres CoClasses avec la bote de dialogue Importation de bibliothque de types. Ces enveloppes VCL simplifient la cration dobjets serveur et lappel de leurs mthodes. Elles sont particulirement recommandes si vous voulez que votre application client rponde aux vnements. Les dclarations pour les enveloppes VCL gnres apparaissent en bas de la section interface. Les composants enveloppe des contrles ActiveX sont des descendants de TOleControl. Les composants enveloppe pour les objets Automation descendent de TOleServer. Le composant enveloppe gnr ajoute les proprits, mthodes et vnements exposs par linterface de la CoClasse. Vous pouvez utiliser ce composant comme vous utilisez tous les autres composants VCL.

Attention

Vous ne devez pas modifier lunit gnre NomBibTypes_TLB. Elle est rgnre chaque fois que la bibliothque de types est rafrachie, ce qui crase toutes les modifications. Pour des informations les plus jour, voir les commentaires placs dans lunit gnre automatiquement NomBibTypes_TLB.

Remarque

Contrle dun objet import


Aprs avoir import les informations de la bibliothque de types, vous tes prts commencer programmer avec les objets imports. La manire de procder dpend pour partie des objets, et dautre part du choix de crer des composants enveloppe.

35-6

Guide du dveloppeur

Contrle dun objet import

Utilisation des composants enveloppe


Si vous avez gnr un composant enveloppe pour lobjet serveur, lcriture de lapplication COM nest pas trs diffrente de celle dune application contenant des composants VCL. Les vnements de lobjet serveur sont dj encapsuls dans le composant VCL. Il vous suffit juste daffecter des gestionnaires dvnements, de dfinir des valeurs de proprits et dappeler des mthodes. Pour utiliser les proprits, mthodes et vnements de lobjet, voir la documentation de lobjet serveur. Le composant enveloppe fournit automatiquement une interface double quand cest possible. Delphi dtermine la forme de la VTable partir des informations de la bibliothque de types. De plus, le nouveau composant hrite de sa classe de base des proprits et mthodes importantes.

Enveloppes ActiveX
Vous devez toujours utiliser un composant enveloppe pour accueillir des contrles ActiveX car le composant enveloppe intgre la fentre du contrle dans le modle VCL. Le contrle ActiveX hrite de TOleControl des proprits et mthodes qui vous permettent daccder linterface sous-jacente ou dobtenir des informations sur le contrle. Cependant, la plupart des applications nen nont pas besoin. Vous utilisez la place le contrle import comme vous utiliseriez tout autre contrle VCL. Gnralement, les contrles ActiveX proposent une page de proprits qui vous permet de dfinir leurs proprits. Les pages de proprits sont similaires aux diteurs que certains composants affichent quand vous double-cliquez dessus dans le concepteur de fiche. Pour afficher la page de proprits dun contrle ActiveX, cliquez dessus avec le bouton droit de la souris et choisissez Proprits. La manire dont vous utilisez les contrles ActiveX imports est dtermine par lapplication serveur. Cependant, les contrles ActiveX utilisent un ensemble standard de notifications quand ils reprsentent les donnes dun champ de base de donnes. Pour davantage dinformations sur la manire daccueillir des contrles ActiveX orients donnes, voir Utilisation de contrles ActiveX orients donnes la page 35-9.

Enveloppes des serveurs Automation


Les enveloppes des objets Automation vous permettent de contrler comment vous voulez constituer la connexion avec lobjet serveur : La proprit ConnectKind indique si le serveur est local ou distant et si vous voulez vous connecter avec un serveur en cours dexcution ou si une nouvelle instance doit tre lance. Pour se connecter avec un serveur distant, vous devez spcifier le nom de la machine en utilisant la proprit RemoteMachineName.

Cration de clients COM

35-7

Contrle dun objet import

Une fois la valeur de ConnectKind spcifie, il y a trois manires de connecter le composant au serveur : Une connexion explicite au serveur en appelant la mthode Connect du composant. Vous pouvez indiquer au composant de se connecter automatiquement avec le serveur au dmarrage de votre application en initialisant la proprit AutoConnect True. Vous navez pas besoin de vous connecter explicitement au serveur. Le composant cre automatiquement une connexion quand vous utilisez lune des proprits et mthodes du serveur par le biais du composant. Vous appelez les mthodes ou utilisez les proprits comme pour tout autre composant :
TServerComponent1.FaireUneChose;

Il est facile de g rer les vnements car vous pouvez utiliser linspecteur dobjets pour crire des gestionnaires dvnements. Toutefois, vous devez faire attention car les gestionnaires dvnements de votre composant ont des paramtres lgrement diffrents de ceux dfinis pour les vnements de la bibliothque de types. Plus prcisment, les types pointeurs (paramtres var et pointeur dinterface) sont changs en Variants. Vous devez explicitement transtyper les paramtres var dans le type sous-jacent avant de leur affecter une valeur. Les pointeurs dinterface peuvent tre transtyps dans le type dinterface appropri en utilisant loprateur as.Par exemple, lexemple de code suivant est le gestionnaire dvnement pour lvnement OnNewWorkBook de ExcelApplication. Le gestionnaire dvnement a un paramtre qui fournit linterface dune autre CoClasse (ExcelWorkbook). Cependant, linterface nest pas transmise comme un pointeur dinterface ExcelWorkBook, mais comme un OleVariant.
procedure TForm1.XLappNewWorkbook(Sender: TObject; var Wb:OleVariant); begin { Remarque : le OleVariant de linterface est transtyp dans le type adquat } ExcelWorkbook1.ConnectTo((iUnknown(wb) as ExcelWorkbook)); end;

Dans cet exemple, le gestionnaire dvnement affecte le classeur un composant ExcelWorkbook (ExcelWorkbook1). Cela illustre la manire de connecter un composant enveloppe une interface existante en utilisant la mthode ConnectTo. La mthode ConnectTo est ajoute au code gnr du composant enveloppe. Les serveurs qui ont un objet application exposent une mthode Quit pour cet objet afin de permettre aux clients de terminer la connexion. Gnralement Quit expose des fonctionnalits quivalentes lutilisation du menu Fichier pour la sortie de lapplication. Du code pour lappel de la mthode Quit est gnr dans la mthode Disconnect de votre composant. Il est possible dappeler la mthode Quit sans paramtre. Le composant enveloppe a galement une proprit AutoQuit. AutoQuit oblige le contrleur appeler Quit quand le composant est libr. Si vous voulez dconnecter un autre moment, ou si la mthode Quit ncessite des paramtres, vous devez lappeler explicitement. Quit apparat comme mthode publique du composant gnr.

35-8

Guide du dveloppeur

Contrle dun objet import

Utilisation de contrles ActiveX orients donnes


Quand vous utilisez un contrle ActiveX orient donnes dans une application Delphi, vous devez lassocier la base de donnes dont il reprsente les donnes. Pour ce faire, vous avez besoin dun composant source de donnes tout comme pour les contrles orients donnes VCL. Une fois le contrle ActiveX orient donnes plac dans le concepteur de fiche, affectez sa proprit DataSource la source de donnes qui reprsente lensemble de donnes souhait. Une fois la source de donnes spcifie, vous pouvez utiliser lditeur de liaisons de donnes de contrle ActiveX pour lier la proprit de liaison aux donnes du contrle un champ de lensemble de donnes. Pour afficher lditeur de liaisons de donnes de contrle ActiveX, cliquez avec le bouton droit de la souris dans le contrle ActiveX orient donnes pour afficher le menu contextuel. Outre les habituelles options du menu Fiche, la commande Liaison de donnes apparat. Slectionnez cette option pour afficher lditeur de liaisons de donnes qui numre tous les champs de la source de donnes et les proprits pouvant tre lies du contrle ActiveX. Pour lier un champ une proprit :

1 Dans lditeur de liaisons de donnes de contrle ActiveX, slectionnez un champ et un nom de proprit.
Nom de champ numre les champs de la base de donnes et Nom de proprit numre les proprits du contrle ActiveX qui peuvent tre lies un champ de base de donnes. Le dispID de la proprit est entre parenthses, par exemple Value(12).

2 Choisissez Lier et OK.


Remarque

Aucune proprit napparat dans la bote de dialogue si le contrle ActiveX ne contient pas de proprits orients donnes. Pour activer une liaison de donnes simple pour une proprit dun contrle ActiveX, utilisez la bibliothque de types comme indiqu dans Activation de la liaison de donnes simple avec la bibliothque de types la page 38-12. Lexemple suivant parcourt les tapes de lutilisation dun contrle ActiveX orient donnes dans le conteneur Delphi. Cet exemple utilise le contrle calendrier Microsoft disponible si Microsoft Office 97 est install sur votre systme.

1 Dans le menu principal Delphi, choisissez Composant|Importer un contrle ActiveX. 2 Slectionnez un contrle ActiveX orient donnes comme Microsoft Calendar control 8.0, changez son nom de classe en TCalendarAXControl puis choisissez Installer. 3 Dans la bote de dialogue Installation de composant, choisissez OK pour ajouter le contrle au paquet utilisateur par dfaut, cela rend le contrle accessible depuis la palette.

Cration de clients COM

35-9

Contrle dun objet import

4 Choisissez Tout fermer puis Fichier|Nouveau| Application pour commencer une nouvelle application. 5 Dposez dans la fiche un objet TCalendarAXControl de la page ActiveX que vous venez dajouter la palette. 6 Depuis la page AccsBD, dposez dans la fiche des objets DataSource et Table. 7 Slectionnez lobjet DataSource et initialisez sa proprit DataSet Table1. 8 Slectionnez lobjet Table et effectuez les oprations suivantes :
Initialisez la proprit DatabaseName DBDEMOS Initialisez la proprit TableName EMPLOYEE.DB Initialisez la proprit Active True

9 Slectionnez lobjet TCalendarAXControl et initialisez sa proprit DataSource DataSource1. 10 Slectionnez lobjet TCalendarAXControl, cliquez avec le bouton droit de la souris et choisissez Liaisons de donnes pour ouvrir lditeur de liaisons de donnes de contrle ActiveX.
Nom de champ numre les champs de la base de donnes et Nom de proprit numre les proprits du contrle ActiveX qui peuvent tre lies un champ de base de donnes. Le dispID de la proprit est entre parenthses.

11 Slectionnez le champ HireDate et la proprit Value, choisissez Lier puis OK.


Le nom de champ et la proprit sont maintenant lis.

12 Depuis longlet ContrleBD, dposez un objet DBGrid dans la fiche et initialisez sa proprit DataSource DataSource1. 13 Depuis longlet ContrleBD, dposez un objet DBNavigator dans la fiche et initialisez sa proprit DataSource DataSource1. 14 Excutez lapplication. 15 Testez lapplication comme suit :
Le champ HireDate tant affich dans lobjet DBGrid, parcourez la base de donnes en utilisant le navigateur de donnes. Les dates changent dans le contrle ActiveX quand vous vous dplacez dans la base de donnes.

Exemple : impression dun document avec Microsoft Word


Les tapes suivantes illustrent la manire de crer un contrleur Automation imprimant un document avec Microsoft Word 8 dOffice 97. Avant de commencer : Crez un nouveau projet compos dune fiche, dun bouton et dune bote de dialogue Ouvrir (TOpenDialog). Ces contrles constituent le contrleur Automation.

35-10

Guide du dveloppeur

Contrle dun objet import

Etape 1 : Prparation de Delphi pour cet exemple


Pour vous faciliter la tche, Delphi fournit dans la palette de composants de nombreux serveurs courants, comme Word, Excel et PowerPoint. Pour illustrer limportation dun serveur, nous utilisons Word. Puisquil existe dj sur la palette de composants, la premire tape consiste supprimer le paquet contenant Word afin de linstaller sur la palette. Ltape 4 dcrit comment rtablir la palette de composants dans son tat ordinaire. Pour supprimer Word de la palette de composants,

1 Choisissez Composant|Installer des paquets. 2 Cliquez sur les composants serveur Automation exemple de Borland et choisissez Supprimer.
La page Serveurs de la palette de composants ne contient plus aucun serveur fourni avec Delphi (si aucun autre serveur na t import, la page Serveurs disparat galement).

Etape 2 : importation de la bibliothque de types Word


Pour importer la bibliothque de types Word,

1 Choisissez Projet|Importer une bibliothque de types. 2 Dans la bote de dialogue dimportation de bibliothque de types, 1 Slectionnez la bibliothque dobjets Microsoft Office 8.0.
Si Word (version 8) nest pas dans la liste, choisissez le bouton Ajouter, puis dans le dossier Program Files\Microsoft Office\Office, slectionnez le fichier de la bibliothque de types de Word, MSWord8.olb, choisissez Ajouter et slectionnez Word (Version 8) dans la liste.

2 Dans Page de palette, choisissez Serveurs. 3 Choisissez Installer.


La bote de dialogue dinstallation apparat. Slectionnez longlet Dans nouveaux paquets et tapez WordExample pour crer un nouveau paquet contenant cette bibliothque de types.

3 Retournez Serveurs dans Page de palette, slectionnez WordApplication et placez-le sur une fiche. 4 Ecrivez un gestionnaire dvnement pour lobjet bouton, comme dcrit ltape suivante.

Etape 3 : utilisation dun objet interface VTable ou de rpartition pour contrler Microsoft Word
Vous pouvez employer un objet interface VTable ou de rpartition pour contrler Microsoft Word.

Cration de clients COM

35-11

Contrle dun objet import

Utilisation dun objet interface VTable


En dposant une instance de lobjet WordApplication dans la fiche, vous pouvez accder facilement au contrle en utilisant un objet interface VTable. Pour ce faire, vous devez simplement appeler les mthodes de la classe que vous venez de crer. Pour Word, il sagit de la classe TWordApplication.

1 Slectionnez le bouton, double-cliquez sur son gestionnaire dvnement OnClick et spcifiez le code de gestion dvnement suivant :
procedure TForm1.Button1Click(Sender: TObject); var FileName: OleVariant; begin if OpenDialog1.Execute then begin FileName := OpenDialog1.FileName; WordApplication1.Documents.Open(FileName, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam); WordApplication1.ActiveDocument.PrintOut( EmptyParam,EmptyParam,EmptyParam, EmptyParam, EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam); end; end;

2 Gnrez et excutez le programme, en cliquant sur le bouton, Word vous demande le fichier imprimer.

Utilisation dun objet interface de rpartition


Vous pouvez galement utiliser une interface de rpartition avec liaison tardive. Pour utiliser un objet interface de rpartition, il faut crer et initialiser lobjet Application en utilisant la classe enveloppe de rpartition _ApplicationDisp comme suit. Remarquez que les mthodes de linterface de rpartition sont dcrites dans le source comme renvoyant des interfaces Vtable, alors quen fait vous devez les transtyper en interfaces de rpartition.

1 Slectionnez le bouton, double-cliquez sur son gestionnaire dvnement OnQuit et spcifiez le code de gestion dvnement suivant :
procedure TForm1.Button1Click(Sender: TObject); var MyWord : _ApplicationDisp; FileName : OleVariant; begin if OpenDialog1.Execute then begin FileName := OpenDialog1.FileName;

35-12

Guide du dveloppeur

Contrle dun objet import

MyWord := CoWordApplication.Create as _ApplicationDisp; (MyWord.Documents as DocumentsDisp).Open(FileName,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam); (MyWord.ActiveDocument as _DocumentDisp).PrintOut(EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam); MyWord.Quit(EmptyParam,EmptyParam,EmptyParam); end; end;

2 Gnrez et excutez le programme, en cliquant sur le bouton, Word vous demande le fichier imprimer.

Etape 4 : nettoyage de lexemple


A la fin de cet exemple, vous pouvez rtablir Delphi dans son tat initial.

1 Supprimez les objets de cette page Serveurs : 1 2 3 4 1 2 3 4


Choisissez Composant|Installer des paquets. Dans la liste, slectionnez le paquet WordExample et choisissez Supprimer. Confirmez en choisissant Oui. Sortez de la bote de dialogue Installer des paquets en choisissant OK. Choisissez Composant|Installer des paquets. Cliquez sur Ajouter. Dans la bote de dialogue affiche, choisissez dclaxserver50.bpl. Sortez de la bote de dialogue Installer des paquets en choisissant OK.

2 Retournez dans le paquet Composants Serveur automation exemple Borland :

Ecriture de code client bas sur les dfinitions de la bibliothque de types


Si vous tes oblig dutiliser un composant enveloppe pour accueillir un contrle ActiveX, vous pouvez par contre crire un contrleur Automation en utilisant uniquement les dfinitions de la bibliothque de types qui apparaissent dans lunit NomBibTypes_TLB. Ce processus est un tout petit peu plus compliqu que si vous laissez un composant enveloppe faire le travail, en particulier si vous avez besoin de rpondre aux vnements.

Connexion un serveur
Avant de pouvoir piloter un serveur Automation depuis votre application contrleur, vous devez obtenir une rfrence sur une interface qu il gre. Gnralement, vous vous connectez au serveur via son interface principale. Par exemple vous vous connectez Microsoft Word via le composant WordApplication.

Cration de clients COM

35-13

Contrle dun objet import

Si linterface principale est une interface double, vous pouvez utiliser les objets crateur du fichier NomBibTypes_TLB.pas. Les classes de crateur portent le mme nom que la CoClasse sans le prfixe Co. Vous pouvez vous connecter un serveur situ sur la mme machine en appelant la mthode Create ou un serveur situ sur une autre machine en utilisant la mthode CreateRemote. Comme Create et CreateRemote sont des mthodes de classe, vous navez pas besoin dune instance de la classe de crateur pour les appeler.
MyInterface := CoServerClassName.Create; MyInterface := CoServerClassName.CreateRemote(Machine1);

Create et CreateRemote renvoient linterface par dfaut de la CoClasse. Si linterface par dfaut est une interface de rpartition, il ny a pas de classe crateur gnre pour la CoClasse. Vous devez la place, appeler la fonction globale CreateOleObject , en lui transmettant le GUID de la CoClasse (il y a une constante pour ce GUID dfinie en haut de lunit _TLB). CreateOleObject renvoie un pointeur IDispatch pour linterface par dfaut.

Contrle dun serveur Automation en utilisant une interface double


Aprs avoir utilis la classe crateur gnre automatiquement pour vous connecter au serveur, appelez les mthodes de linterface. Par exemple :
var MyInterface : _Application; begin MyInterface := CoWordApplication.Create; MyInterface.DoSomething;

Linterface et la classe crateur sont dfinies dans lunit NomBibTypes_TLB gnre automatiquement quand vous importez une bibliothque de types. Pour des informations sur les interfaces doubles, voir Interfaces doubles la page 36-14.

Contrle dun serveur Automation en utilisant une interface de rpartition


Gnralement, vous utilisez linterface double pour contrler le serveur Automation, comme dcrit ci-dessus. Toutefois, il se peut que vous deviez contrler un serveur Automation avec un objet interface de rpartition sil ny a pas dinterface double disponible. Pour appeler les mthodes dune interface de rpartition :

1 Connectez-vous au serveur, en utilisant la fonction globale CreateOleObject. 2 Utilisez loprateur as pour transtyper linterface IDispatch renvoye par CreateOleObject en une interface de rpartition pour la CoClasse. Ce type dispinterface est dclar dans lunit NomBibTypes_TLB. 3 Contrlez le serveur Automation en appelant les mthodes de la dispinterface. Vous pouvez utiliser autrement les interfaces de rpartition en les affectant un Variant . En affectant linterface renvoye par CreateOleObject un Variant, vous pouvez tirer profit de la gestion intgre des interfaces que propose le type Variant . Appelez simplement les mthodes de linterface et cest le Variant qui

35-14

Guide du dveloppeur

Contrle dun objet import

gre automatiquement les appels IDispatch, la rcupration de lidentificateur de rpartition et les appels de mthode appropris. Le type Variant possde une gestion intgre permettant lappel des interfaces de rpartition, via ses mthodes
var. V: Variant; begin V:= CreateOleObject(TheServerObject); V.NomMthode; { appelle la mthode spcifie } ...

Un avantage de lutilisation de Variants est quil nest pas ncessaire dimporter la bibliothque de types car les Variants utilisent uniquement les mthodes standard de IDispatch pour appeler le serveur. La contrepartie, cest que les Variants sont plus lents car ils utilisent une liaison dynamique lexcution. Pour davantage dinformations sur les interfaces de rpartition, voir Interfaces dAutomation la page 36-13.

Gestion des vnements dans un contrleur Automation


Lorsque vous gnrez un composant enveloppe pour un objet dont vous importez la bibliothque de types, vous pouvez rpondre aux vnements en utilisant simplement les vnements ajouts au composant gnr. Nanmoins, si vous nutilisez pas un composant enveloppe (ou si le serveur utilise des vnements COM+), vous devez crire vous-mme le code du collecteur dvnements.

Gestion des vnements Automation par code


Avant de pouvoir grer les vnements, vous devez dfinir un collecteur dvnements. Cest une classe qui implmente linterface de rpartition des vnements qui est dfinie dans la bibliothque de types du serveur. Pour crire le collecteur dvnements, crez un objet qui implmente linterface de rpartition des vnements :
TServerEventsSink = class(TObject, _TheServerEvents) ...{ dclarez ici les mthodes de _TheServerEvents } end;

Quand vous disposez dune instance de votre collecteur dvnements, vous devez informer lobjet serveur de son existence afin que le serveur puisse lappeler. Pour ce faire, appelez la procdure globale InterfaceConnect en lui transmettant : Linterface du serveur qui gnre les vnements. Le GUID de linterface vnement que gre votre collecteur dvnements. Une interface IUnknown pour votre collecteur dvnements. Une variable qui reoit un Longint reprsentant la connexion entre le serveur et votre collecteur dvnements.
{MyInterface est linterface serveur que vous obtenez quand vous vous connectez au serveur } InterfaceConnect(MyInterface, DIID_TheServerEvents, MyEventSinkObject as IUnknown, cookievar);

Cration de clients COM

35-15

Contrle dun objet import

Aprs avoir appel InterfaceConnect, votre collecteur dvnements est connect et reoit les appels du serveur quand des vnements se produisent. Vous devez terminer la connexion avant de librer le collecteur dvnements. Pour ce faire, appelez la procdure globale InterfaceDisconnect en lui transmettant les mmes paramtres, sauf linterface de votre collecteur dvnements (le paramtre final tant en entre et non plus en sortie) :
InterfaceDisconnect(MyInterface, DIID_TheServerEvents, cookievar); Remarque

Vous devez tre certain que le serveur a libr sa connexion avec votre collecteur dvnements avant de librer le collecteur. Comme vous ne savez pas comment le serveur rpond la notification de dconnexion initie par InterfaceDisconnect , cela peut entraner une condition si vous librez votre collecteur dvnements immdiatement aprs lappel. Le moyen le plus simple de vous prmunir contre cela est que votre collecteur dvnements gre son propre compteur de rfrences qui nest pas dcrment tant que le serveur na pas libr linterface du collecteur dvnements.

Gestion des vnements COM+


Avec COM+, les serveurs utilisent un objet utilitaire spcial pour gnrer des vnements la place dun groupe dinterfaces spciales (IConnectionPointContainer et IConnectionPoint). Donc, vous ne pouvez pas utiliser un collecteur dvnements qui descend de TEventDispatcher. TEventDispatcher est conue pour fonctionner avec des interfaces, pas avec des objets vnement COM+. Au lieu de dfinir un collecteur dvnements, votre application client dfinit un objet abonn. Comme les collecteurs dvnements, les objets abonn fournissent limplmentation de linterface vnement. Ils sont diffrents des collecteurs dvnements car ils dcrivent un objet vnement particulier et non une connexion avec un point de connexion dun serveur. Pour dfinir un objet abonn, utilisez lexpert objet COM en slectionnant linterface de lobjet vnement que vous voulez implmenter. Lexpert gnre une unit dimplmentation avec des squelettes de mthodes que vous pouvez renseigner pour crer vos gestionnaires dvnements. Pour davantage dinformations sur lutilisation de lexpert objet COM pour implmenter une interface existante, voir Utilisation de lexpert objet COM la page 36-2.
Remarque

Vous pouvez avoir ajouter linterface de lobjet vnement dans le registre en utilisant lexpert si elle napparat pas dans la liste des interfaces que vous pouvez implmenter. Une fois lobjet abonn cr, vous devez vous abonner linterface de lobjet vnement ou individuellement aux mthodes (vnements) de cette interface. Vous pouvez souscrire trois types dabonnements : Abonnements temporaires. Comme les collecteurs dvnements habituels, les abonnements temporaires sont lis la dure de vie de linstance dobjet. Quand lobjet abonn est libr, labonnement sarrte et COM+ ne lui transmet plus les vnements.

35-16

Guide du dveloppeur

Cration de clients pour les serveurs nayant pas une bibliothque de types

Abonnements permanents. Ils sont lis la classe de lobjet et non une instance dobjet spcifique. Quand lvnement se produit, COM recherche ou dmarre un processus de lobjet abonn et appelle son gestionnaire dvnement. Les objets en processus (DLL) utilisent ce type dabonnement. Abonnements par utilisateur. Ces abonnements offrent une version plus scurise des abonnements temporaires. Lobjet abonn et lobjet serveur qui dclenchent les vnements doivent tre excuts avec le mme compte utilisateur sur la mme machine.
Remarque

Les objets qui sabonnent des vnements COM+ doivent tre installs dans une application COM+.

Cration de clients pour les serveurs nayant pas une bibliothque de types
Certaines technologies COM plus anciennes comme OLE (Object Linking and Embedding) ne fournissent pas les informations de type dans une bibliothque de types. Elles utilisent la place un jeu standard dinterfaces prdfinies. Pour crire des clients accueillant de tels objets, vous pouvez utiliser les composants TOleContainer. Ce composant apparat dans la page Systme de la palette des composants. TOleContainer se comporte comme le site daccueil dun objet Ole2. Il implmente linterface IOleClientSite et, de manire facultative, IOleDocumentSite. La communication est gre en utilisant des verbes OLE. Pour utiliser TOleContainer :

1 Placez un composant TOleContainer dans votre fiche. 2 Initialisez la proprit AllowActiveDoc True si vous voulez pouvoir accueillir un document actif. 3 Initialisez la proprit AllowInPlace pour indiquer si lobjet accueilli doit apparatre dans le TOleContainer ou dans une fentre spare. 4 Ecrivez des gestionnaires dvnements pour rpondre quand lobjet est activ, dsactiv, dplac ou redimensionn. 5 Pour lier lobjet TOleContainer la conception, cliquez avec le bouton droit de la souris et choisissez Insrer un objet. Dans la bote de dialogue Insertion dobjet, choisissez lobjet serveur accueillir. 6 Vous avez plusieurs moyens de lier lobjet TOleContainer lexcution, selon la manire dont vous voulez identifier lobjet serveur. La mthode CreateObject attend un identificateur de programme, CreateObjectFromFile attend le nom dun fichier dans lequel lobjet a t enregistr, CreateObjectFromInfo attend un record contenant des informations sur la manire de crer lobjet ou CreateLinkToFile qui attend le nom dun fichier dans lequel lobjet a t enregistr et effectue une liaison et non une incorporation.

Cration de clients COM

35-17

Cration de clients pour les serveurs nayant pas une bibliothque de types

7 Une fois lobjet li, vous pouvez accder son interface en utilisant la proprit OleObjectInterface. Cependant, comme la communication avec les objets Ole2 tait base sur les verbes OLE, vous prfrerez probablement envoyer des commandes au serveur en utilisant la mthode DoVerb. 8 Quand vous voulez librer lobjet serveur, appelez la mthode DestroyObject.

35-18

Guide du dveloppeur

36
Chapitre 36

Chapitre

Cration de serveurs COM simples

Delphi dispose dexperts pour vous aider crer divers objets COM. Les objets COM les plus simples sont des serveurs qui exposent des proprits et des mthodes (et ventuellement des vnements) via une interface par dfaut que leurs clients peuvent appeler.
Remarque

Automation et les serveurs COM ne sont pas disponibles dans les applications CLX. Cette technologie nest utilise que sur Windows et nest pas multiplateforme. Deux experts, en particulier, simplifient le processus de cration dobjets COM simples : L expert objet COM construit un objet COM lger dont linterface par dfaut descend de IUnknown ou qui implmente une interface dj recense dans votre systme. Cet expert offre la plus grande flexibilit dans les types dobjets COM quil est possible de crer. L expert objet Automation cre un objet Automation simple dont linterface par dfaut descend de IDispatch. IDispatch introduit un mcanisme de marshaling standard et gre la liaison tardive des appels dinterfaces.

Remarque

COM dfinit de nombreuses interfaces standard et des mcanismes pour grer des situations spcifiques. Les experts Delphi automatisent les oprations les plus courantes. Cependant, certaines tches, comme le marshaling personnalis ne sont gres par aucun expert Delphi. Pour des informations ce propos et sur dautres technologies qui ne sont pas explicitement gres par Delphi, reportezvous la documentation Microsoft Developers Network (MSDN). Le site Web Microsoft propose galement des informations jour sur la gestion COM.

Prsentation de la cration dun objet COM


Que vous utilisiez lexpert objet Automation pour crer un nouveau serveur Automation ou lexpert objet COM pour crer dautres types dobjets COM, le processus suivre est le mme.

Cration de serveurs COM simples

36-1

Conception dun objet COM

Il implique les tapes suivantes :

1 Conception de lobjet COM. 2 Utilisation de lexpert objet COM ou de lexpert objet Automation pour crer lobjet serveur. 3 Dfinition de linterface que lobjet expose aux clients. 4 Recensement de lobjet COM. 5 Test et dbogage de lapplication.

Conception dun objet COM


Quand vous concevez un objet COM, vous devez choisir les interfaces COM que vous voulez implmenter. Vous pouvez crire des objets COM pour implmenter une interface qui a dj t dfinie ou vous pouvez dfinir une nouvelle interface que votre objet doit implmenter. De plus, votre objet peut grer plusieurs interfaces. Pour des informations sur les interfaces COM standard que vous pouvez g rer, voir la documentation MSDN. Pour crer un objet COM qui implmente une interface existante, utilisez lexpert objet COM. Pour crer un objet COM qui implmente une nouvelle interface que vous dfinissez, utilisez lexpert objet COM ou lexpert objet Automation. Lexpert objet COM peut gnrer une nouvelle interface par dfaut qui descend de IUnknown, lexpert objet Automation attribue lobjet une interface par dfaut qui descend de IDispatch. Indpendamment de lexpert utilis, vous pouvez toujours employer ultrieurement lditeur de bibliothques de types pour modifier linterface parent de linterface par dfaut que lexpert a gnr. Outre le choix des interfaces grer, vous devez dcider si lobjet COM est un serveur en ou hors processus ou un serveur distant. Pour les serveurs en processus, les serveurs hors processus et les serveurs distants qui utilisent une bibliothque de types, COM vous dlgue les donnes. Sinon, vous devez choisir comment transmettre les donnes aux serveurs hors processus. Pour des informations sur les types de serveurs, voir Serveurs en processus, hors processus et distants la page 33-7.

Utilisation de lexpert objet COM


Lexpert objet COM effectue les oprations suivantes : Cration dune nouvelle unit. Dfinition dune nouvelle classe qui descend de TCOMObject et configure le constructeur du fabricant de classe. Pour davantage dinformations sur la classe de base, voir Code gnr par les experts la page 33-23.

36-2

Guide du dveloppeur

Utilisation de lexpert objet COM

Facultativement, ajout au projet dune bibliothque de types et ajout de lobjet et de son interface la bibliothque de types. Avant de crer un objet COM, crez ou ouvrez le projet de lapplication contenant les fonctionnalits implmenter. Le projet peut tre, selon vos besoins, une application ou une bibliothque ActiveX. Pour afficher lexpert objet COM :

1 Choisissez Fichier|Nouveau|Autre pour ouvrir la bote de dialogue Nouveaux lments. 2 Slectionnez la page ActiveX. 3 Double-cliquez sur licne Objet COM.
Dans lexpert, vous devez spcifier les informations suivantes : Nom de CoClasse. Cest le nom de lobjet tel quil apparat aux clients. La classe cre pour implmenter votre objet porte ce nom prfix par un T. Si vous choisissez de ne pas implmenter une interface existante, lexpert attribue votre CoClasse une interface par dfaut portant ce nom prfix par un I. Interface implmente. Par dfaut, lexpert attribue votre objet une interface par dfaut qui descend de IUnknown. Aprs tre sorti de lexpert, vous devez utiliser lditeur de bibliothques de types pour ajouter des proprits et mthodes cette interface. Cependant, vous pouvez aussi slectionner une interface prdfinie que votre objet va implmenter. Choisissez le bouton Liste dans lexpert objet COM pour afficher lexpert de slection dinterface qui vous permet de slectionner parmi toutes les interfaces doubles ou personnalises dfinies dans une bibliothque de types recense sur votre systme. Linterface que vous slectionnez devient linterface par dfaut de votre nouvelle CoClasse. Lexpert ajoute toutes les mthodes de cette interface la classe dimplmentation gnre, ainsi il ne vous reste plus qu remplir le corps des mthodes dans lunit dimplmentation. Si vous slectionnez une interface existante, linterface nest pas ajoute la bibliothque de types de votre projet. Cela signifie que lors du dploiement de lobjet, vous devez galement dployer la bibliothque de types qui dfinit linterface. Instancie. Sauf si vous crez un serveur en processus, vous devez indiquer comment COM lance lapplication qui accueille votre objet COM. Si votre application implmente plusieurs objets COM, vous devez utiliser la mme mthode dinstanciation pour tous. Pour des informations sur les valeurs possibles, voir Types dinstanciation des objets COM la page 36-5. Modle de thread. Gnralement, le client demande votre objet de participer diffrents threads dexcution. Vous pouvez spcifier comment COM srialise ces threads quand il appelle votre objet. Le choix du modle de thread dtermine comment lobjet est recens. Cest vous dassurer la gestion de thread implique par le modle choisi. Pour des informations sur les valeurs possibles, voir Choix dun modle de thread la page 36-6. Pour des informations sur la manire de grer les threads dans votre application, voir chapitre 9, Ecriture dapplications multithreads.

Cration de serveurs COM simples

36-3

Utilisation de lexpert objet Automation

Bibliothque de types. Vous pouvez dcider si vous voulez inclure une bibliothque de types pour votre objet. Cela est recommand pour deux raisons : elle vous permet dutiliser lditeur de bibliothques de types pour dfinir les interfaces, et donc actualiser lessentiel de limplmentation, et cela donne aux clients un moyen simple dobtenir des informations sur votre objet et ses interfaces. Si vous implmentez une interface existante, Delphi requiert lutilisation dune bibliothque de types par votre projet. Cest la seule faon de fournir laccs la dclaration dinterface originale. Pour des informations sur les bibliothques de types, voir Bibliothques de types la page 33-16 et chapitre 34, Utilisation des bibliothques de types. Marshaling. Si vous voulez vous confiner aux types compatibles Automation et si vous choisissez de crer une bibliothque de types, vous pouvez laisser COM grer pour vous le marshaling quand vous ne gnrez pas un serveur en processus. En indiquant linterface de votre objet comme tant OleAutomation dans la bibliothque de types, vous permettez COM de dfinir pour vous les proxys et stubs et de grer le passage de paramtres entre les frontires de processus. Pour davantage dinformations, voir Le mcanisme du marshaling la page 33-8. Vous ne pouvez spcifier que linterface est compatible Automation que si vous crez une nouvelle interface. Si vous slectionnez une interface existante, ses attributs sont dj spcifis dans sa bibliothque de types. Si linterface de votre objet nest pas marque comme OleAutomation, vous devez soit crer un serveur en processus ou crire votre propre code de marshaling. Vous pouvez, si vous le souhaitez, ajouter une description de votre objet COM. Cette description apparat pour lobjet dans la bibliothques de types si vous en crez une.

Utilisation de lexpert objet Automation


Lexpert objet Automation effectue les oprations suivantes : Cration dun nouvelle unit. Dfinition dune nouvelle classe qui descend de TCOMObject et configure le constructeur du fabricant de classe. Pour davantage dinformations sur la classe de base, voir Code gnr par les experts la page 33-23. Ajout au projet dune bibliothque de types et ajout de lobjet et de son interface la bibliothque de types. Avant de crer un objet Automation, crez ou ouvrez le projet de lapplication contenant les fonctionnalits implmenter. Le projet peut tre, selon vos besoins, une application ou une bibliothque ActiveX. Pour afficher lexpert objet Automation :

1 Choisissez Fichier|Nouveau |Autre. 2 Slectionnez la page ActiveX. 3 Double-cliquez sur licne Objet Automation.

36-4

Guide du dveloppeur

Utilisation de lexpert objet Automation

Dans lexpert, vous devez spcifier les informations suivantes : Nom de CoClasse. Cest le nom de lobjet tel quil apparat aux clients. La classe cre pour implmenter votre objet porte ce un nom prfix par un T. Si vous choisissez de ne pas implmenter une interface existante, lexpert attribue votre CoClasse une interface par dfaut portant ce nom prfix par un I. Instancie. Sauf si vous crez un serveur en processus, vous devez indiquer comment COM lance lapplication qui accueille votre objet COM. Si votre application implmente plusieurs objets COM, vous devez utiliser la mme mthode dinstanciation pour tous. Pour des informations sur les valeurs possibles, voir Types dinstanciation des objets COM la page 36-5. Modle de thread. Gnralement, le client demande votre objet de participer diffrents threads dexcution. Vous pouvez spcifier comment COM srialise ces threads quand il appelle votre objet. Le choix du modle de thread dtermine comment lobjet est recens. Cest vous dassurer la gestion de thread implique par le modle choisi. Pour des informations sur les valeurs possibles, voir Choix dun modle de thread la page 36-6. Pour des informations sur la manire de grer les threads dans votre application, voir chapitre 9, Ecriture dapplications multithreads. Gnrer le code de support dvnement Vous devez indiquer si vous voulez que votre objet gnre des vnements pour les clients pouvant y rpondre. Lexpert peut fournir la gestion des interfaces ncessaires pour gnrer des vnements et la distribution des appels aux gestionnaires dvnements des clients. Pour des informations sur le fonctionnement des vnements et la manire de les implmenter, voir Exposition dvnements aux clients la page 36-11. Vous pouvez, si vous le souhaitez, ajouter une description de votre objet COM. Cette description apparat pour lobjet dans la bibliothques de types. Lobjet Automation implmente une interface double qui gre la liaison prcoce ( la compilation) via la VTable et la liaison tardive ( lexcution) via linterface IDispatch. Pour davantage dinformations, voir Interfaces doubles la page 36-14.

Types dinstanciation des objets COM


La plupart des experts COM attendent que vous spcifiez le mode dinstanciation de lobjet. Linstanciation dtermine le nombre dinstances de votre objet que les clients peuvent crer dans un seul excutable. Par exemple, si vous spcifiez le modle Instance unique, une fois quun client a instanci votre objet, COM rend lapplication invisible ; ainsi dautres clients doivent lancer leurs propres instances de lapplication. Comme cela affecte la visibilit globale de votre application, le mode dinstanciation doit tre le mme pour tous les objets de votre application qui peuvent tre instancis par les clients. Cela signifie que vous ne pouvez pas crer un objet de lapplication en utilisant le mode Instance unique alors quun autre de la mme application utilise le mode Instance multiple.

Cration de serveurs COM simples

36-5

Utilisation de lexpert objet Automation

Remarque

Le mode dinstanciation est ignor lorsque votre objet COM est uniquement utilis en tant que serveur en processus. Lorsque votre application COM cre un nouvel objet COM, il peut avoir un des types dinstanciation suivants :
Instanciation
Interne

Signification
Lobjet ne peut tre cr que de manire interne. Une application externe ne peut pas crer dinstance de lobjet directement. Une application externe ne peut pas crer directement une instance de lobjet mme si votre application peut le crer et en transmettre une interface aux clients. Permet aux clients de ne crer quune seule instance de lobjet pour chaque excutable (application), ainsi la cration de plusieurs instances entrane le lancement de plusieurs instances de lapplication. Chaque client dispose de sa propre instance ddie de lapplication serveur. Cette option est souvent utilise pour les applications MDI (interface documents multiples). Spcifie que plusieurs client peuvent crer des instances de lobjet dans le mme espace de processus. Chaque fois quun client demande un service, une instance spare du serveur est cre : cest--dire quil peut y avoir plusieurs instances dans un seul excutable.

Instance unique

Instances multiples

Choix dun modle de thread


Lors de la cration dun objet laide de lexpert, slectionnez le modle de thread que votre objet peut grer. En ajoutant la gestion des threads votre objet COM, vous pouvez augmenter ses performances, car plusieurs clients peuvent accder simultanment votre application. Le tableau suivant numre les diffrents modles de thread que vous pouvez spcifier.
Tableau 36.1
Single

Modles de thread pour les objets COM Description


Le serveur ne gre pas les threads. COM srialise les demandes des clients afin que lapplication ne reoive quune seule demande la fois. COM sassure quun seul thread client peut appeler lobjet la fois. Tous les appels des clients utilisent le thread dans lequel lobjet a t cr.

Modle de thread

Avantages et inconv nients


Les clients sont traits un par un, il nest donc pas ncessaire de grer les threads. Pas de gains en performances. Les objets peuvent accder en toute scurit leurs propres donnes dinstance mais les donnes globales doivent tre protges en utilisant des sections critiques ou une autre forme de srialisation. Les variables locales du thread sont fiables entre plusieurs appels. Certains gains en performances.

Apartment (ou apartment thread unique)

36-6

Guide du dveloppeur

Utilisation de lexpert objet Automation

Tableau 36.1

Modles de thread pour les objets COM (suite) Description


Les objets peuvent recevoir des appels dun nombre quelconque de threads tout moment.

Modle de thread
Libre (galement appel apartment threads multiples)

Avantages et inconv nients


Les objets doivent protger toutes les donnes de linstance et les donnes globales en utilisant des sections critiques ou une autre forme de srialisation. Les variables locales des threads ne sont pas fiables entre plusieurs appels. Maximum de performances et de souplesse. Nimpose pas lapplication de grer les threads pour les param tres spcifis pour les appels sortants. Vous devez vous protger des conflits de thread impliquant des donnes globales ou les donnes dinstance sont accdes par plusieurs m thodes. Ce modle ne doit pas tre utilis avec les objets ayant une interface utilisateur (contrles visuels). Ce modle est disponible uniquement avec COM+. Dans COM, il est remplac par le modle Apartment.

Les deux

Identique au modle Libre mais les appels sortants (par exemple, les callbacks) sont assurs de sexcuter dans le mme thread.

Neutre

Plusieurs clients peuvent appeler lobjet dans diffrents threads en mme temps, mais COM sassure que deux appels nentrent pas en conflit.

Remarque

Les variables locales sont toujours fiables (sauf celles des callbacks) indpendamment du modle de thread. En effet, les variables locales sont stockes dans la pile et chaque thread dispose de sa propre pile. Les variables locales des callbacks peuvent ntre pas fiables si vous utilisez le modle libre. Le modle de thread que vous choisissez dans lexpert dtermine comment lobjet est publi dans le registre. Vous devez tre certain que limplmentation de lobjet est conforme au modle de thread choisi. Pour des informations gnrales sur lcriture de code adapt aux threads, voir chapitre 9, Ecriture dapplications multithreads. Pour les serveurs en processus, linitialisation du modle de thread dans lexpert dfinit la cl du modle de thread dans lentre de registre CLSID. Les serveurs hors processus sont recenss comme EXE, et Delphi initialise COM pour le modle de thread le plus lev ncessaire. Par exemple, si un EXE contient un objet thread libre, il est initialis pour les threads libres, ce qui signifie quil peut fournir la gestion attendue pour tous les objets thread libre ou apartment contenus dans lEXE. Pour redfinir manuellement le comportement de thread dun EXE, utilisez la variableCoInitFlags dcrite dans laide en ligne.

Cration de serveurs COM simples

36-7

Utilisation de lexpert objet Automation

Ecriture dun objet grant le modle de thread libre


Utilisez le modle de thread libre au lieu du modle apartment chaque fois que lobjet doit tre accd par plusieurs threads. Considrons, par exemple, une application client connecte un objet sur une machine distante. Lorsque le client distant appelle une mthode sur cet objet, le serveur reoit lappel sur un thread appartenant au groupe de threads de la machine serveur. Le thread recevant effectue lappel localement sur lobjet rel et, lobjet supportant le modle de thread libre, le thread peut effectuer un appel direct dans lobjet. Si, au aurait aurait client. contraire, lobjet avait support le modle de thread apartment, lappel d tre transfr au thread dans lequel lobjet a t cr et le rsultat d tre transfr en retour dans le thread recevant avant de revenir au Cette approche ncessite des mcanismes de marshaling supplmentaires.

Pour supporter le modle de thread libre, vous devez considrer la faon dont chaque mthode accdera aux donnes dinstance. Si la mthode est crite pour des donnes dinstance, vous devez utiliser les sections critiques, ou tout autre forme de srialisation, pour protger les donnes dinstance. En outre, la srialisation des appels critiques est moins lourde que lexcution du code de marshaling de COM. Remarquez que si les donnes dinstance sont accessibles en lecture seulement, la srialisation nest pas ncessaire. Les serveurs en processus thread libre peuvent amliorer leurs performances en se comportant comme objet extrieur dun agrgat avec le marshaler thread libre. Le marshaler thread libre propose un raccourci pour la gestion standard COM du thread quand une DLL thread libre est appele par un hte (un client) qui nutilise pas de thread libre. Pour effectuer lagrgation avec le marshaler thread libre, vous devez : Appeler CoCreateFreeThreadedMarshaler, en lui transmettant linterface IUnknown de votre objet qui doit utiliser le marshaler thread libre rsultant :
CoCreateFreeThreadedMarshaler(self as IUnknown, FMarshaler);

Cette ligne affecte linterface du marshaler thread libre un membre de classe, FMarshaler. En utilisant lditeur de bibliothques de types, ajoutez linterface IMarshal lensemble des interfaces que votre CoClasse implmente. Dans la mthode QueryInterface de votre objet, dlguez tous les appels de IDD_IMarshal au marshaler thread libre (stock dans FMarshaler ci-dessus).
Attention

Le marshaler thread libre viole les rgles normales du marshaling COM pour permettre une meilleure efficacit. Il doit tre utilis avec prudence. En particulier, il ne doit tre agrg quavec des objets thread libre dans des serveurs en processus et ne doit tre instanci que par lobjet qui lutilise (et pas par un autre thread).

36-8

Guide du dveloppeur

Dfinition de linterface dun objet COM

Ecriture dun objet supportant le modle de thread apartment


Pour implmenter le modle de thread apartment ( thread unique), il est ncessaire de suivre certaines rgles : Le premier thread de lapplication qui a t cr est le thread principal de COM. Cest habituellement le thread sur lequel WinMain a t appel. Ce doit tre galement le dernier thread dsinitialiser COM. Chaque thread du modle de thread apartment doit possder une boucle de messages et la file des messages doit tre vrifie frquemment. Lorsquun thread obtient un pointeur sur une interface COM, les mthodes de cette interface ne peuvent tre appeles que depuis ce thread. Le modle apartment thread unique est un moyen terme entre la solution qui consiste ne fournir aucun support des threads et celle qui assure le support complet du multi-thread dans le modle libre. Un serveur conforme au modle apartment est la garantie que le serveur srialise les accs toutes ses donnes globales (par exemple, son nombre dobjets). En effet, diffrents objets peuvent tenter daccder aux donnes globales depuis diffrents threads. Cependant, les donnes des instances de lobjet sont scurises, car les mthodes sont toujours appeles sur le mme thread. Habituellement, les contrles destins aux navigateurs Web utilisent le modle de thread apartment, car les applications navigateur initialisent toujours leurs threads en tant quapartment.

Ecriture dun objet supportant le modle de thread neutre


Avec COM+, vous pouvez utiliser un autre modle de thread, mi-chemin entre thread libre et thread apartment : le modle neutre. Comme le modle de thread libre, ce modle permet plusieurs threads daccder simultanment votre objet. Il ny a pas de marshaling supplmentaire pour transfrer au thread dans lequel lobjet a t cr. Cependant votre objet est assur de ne pas recevoir dappels contradictoires. Lcriture dun objet utilisant le modle de thread neutre respecte sensiblement les mme rgles que lcriture dun objet grant le modle de thread apartment, sauf quil nest pas ncessaire de protger les donnes de linstance des conflits de threads, elles peuvent tre accdes par diffrentes mthodes de linterface de lobjet. Toutes les donnes dinstance qui ne peuvent tre accdes que par une seule mthode dinterface sont automatiquement adaptes aux threads.

Dfinition de linterface dun objet COM


Quand vous utilisez un expert pour crer un objet COM, lexpert cre automatiquement une bibliothque de types (sauf si vous avez demand le contraire dans lexpert objet COM). La bibliothque de types permet aux applications hte de dterminer ce que lobjet peut faire. Elle vous permet galement de dfinir linterface de lobjet en utilisant lditeur de bibliothques de types. Les interfaces que vous dfinissez dans lditeur de bibliothques de

Cration de serveurs COM simples

36-9

Dfinition de linterface dun objet COM

types dfinissent les proprits, mthodes et vnements que votre objet expose aux clients.
Remarque

Si vous slectionnez une interface existante dans lexpert objet COM, vous navez pas besoin dajouter des proprits ou des mthodes. La dfinition de linterface est importe depuis la bibliothque de types dans laquelle linterface est dfinie. Il vous suffit alors de trouver les mthodes de linterface importe dans lunit dimplmentation et de remplir leur corps.

Ajout dune proprit linterface de lobjet


Quand vous ajoutez une proprit linterface de votre objet en utilisant lditeur de bibliothques de types, il ajoute automatiquement une mthode pour lire la valeur de la proprit et/ou une mthode pour dfinir la valeur de la proprit. Lditeur de bibliothques de types, ajoute son tour ces mthodes votre classe dimplmentation et cre dans lunit dimplmentation des squelettes de mthodes que vous devez complter. Pour ajouter une proprit linterface de votre objet

1 Dans lditeur de bibliothques de types, slectionnez linterface par dfaut de lobjet.


Linterface par dfaut porte le mme nom que lobjet mais prfix par la lettre I. Pour dterminer linterface par dfaut, dans lditeur de bibliothques de types, choisissez la CoClasse, slectionnez la page Implmente et recherchez dans la liste des interfaces implmentes celle indique comme Dfaut.

2 Pour exposer une proprit en lecture/criture, cliquez sur le bouton Proprit de la barre doutils ; vous pouvez aussi cliquer sur la flche ct de ce bouton dans la barre doutils, puis sur le type de proprit exposer. 3 Dans la page Attributs, spcifiez le nom et le type de la proprit. 4 Dans la barre doutils, choisissez le bouton Rafrachir.
Une dfinition et les squelettes dimplmentation des mthodes daccs la proprit sont insrs dans lunit dimplmentation de lobjet.

5 Dans lunit dimplmentation, recherchez les mthodes daccs de la proprit. Elles ont un nom de la forme Get_NomProprit et Set_NomProprit. Ajoutez du code qui rcupre ou dfinit la valeur de la proprit de votre objet. Ce code peut simplement appeler une fonction existante de lapplication, accder une donne membre ajoute la dfinition de lobjet ou implmenter autrement la proprit.

36-10

Guide du dveloppeur

Dfinition de linterface dun objet COM

Ajout dune mthode linterface de lobjet


Quand vous ajoutez une mthode linterface de votre objet en utilisant lditeur de bibliothques de types, il ajoute les mthodes la classe dimplmentation et cre dans lunit dimplmentation des squelettes de mthode complter. Pour exposer une mthode via linterface de votre objet :

1 Dans lditeur de bibliothques de types, slectionnez linterface par dfaut de lobjet.


Linterface par dfaut porte le mme nom que lobjet mais prfix par la lettre I. Pour dterminer linterface par dfaut, dans lditeur de bibliothques de types, choisissez la CoClasse, slectionnez la page Implmente et recherchez dans la liste des interfaces implmentes celle indique comme Dfaut.

2 Choisissez le bouton Mthode. 3 Dans la page Attributs, spcifiez le nom de la mthode. 4 Dans la page Paramtres, spcifiez le type de valeur renvoye par la mthode et ajoutez les paramtres appropris. 5 Dans la barre doutils, choisissez le bouton Rafrachir. 6 Une dfinition et le squelette de limplmentation de la mthode sont insrs dans lunit dimplmentation de lobjet. 7 Dans lunit dimplmentation, trouvez la mthode qui vient dtre insre. La mthode est entirement vide. Remplissez le corps de la mthode pour effectuer lopration que reprsente la mthode.

Exposition dvnements aux clients


Il y a deux types dvnements quun objet COM peut gnrer : les vnements classiques et les vnements COM+. Les vnements COM+ ncessitent la cration dun objet vnement spar en utilisant lexpert objet vnement et lajout de code pour appeler cet objet vnement depuis votre objet serveur. Pour davantage dinformations sur la gnration dobjets vnement, voir Gnration dvnements dans COM+ la page 39-20. Vous pouvez utiliser lexpert pour grer lessentiel du travail de cration des vnements classiques. Ce processus est dcrit ci-dessous.
Remarque

Lexpert objet COM ne gnre pas de code de gestion des vnements. Si vous voulez que votre objet gnre des vnements classiques, utilisez lexpert objet Automation. Pour que votre objet gnre des vnements, vous devez effectuer les oprations suivantes :

1 Dans lexpert Automation, cochez la case Insrer le code de support dvnement.

Cration de serveurs COM simples

36-11

Dfinition de linterface dun objet COM

Lexpert cre un objet qui contient une interface Events en plus de linterface par dfaut. Cette interface Events a un nom de la forme INomCoClasseEvents. Cest une interface en sortie (source) : cela signifie que cette interface ne doit pas tre implmente par votre objet mais par les clients, elle est appele par votre objet (vous pouvez le constater en slectionnant la CoClasse, allez sur la page Implmente, vous constaterez que la colonne Source indique True pour linterface Events). Outre linterface Events, lexpert ajoute linterface IConnectionPointContainer la dclaration de votre classe dimplmentation et plusieurs membres de classe pour grer les vnements. Parmi ces nouveaux membres de classe, les plus importants sont FConnectionPoint et FConnectionPoints. Ils implmentent les interfaces IConnectionPoint et IConnectionPointContainer en utilisant des classes VCL prdfinies. FConnectionPoint est gre par une autre mthode que lexpert ajoute, EventSinkChanged.

2 Dans lditeur de bibliothques de types, slectionnez linterface en sortie Events de votre objet (elle a un nom de la forme INomCoClasseEvents) 3 Cliquez sur le bouton Mthode de la barre doutils de lditeur de bibliothques de types. Chaque mthode ajoute linterface Events reprsente un gestionnaire dvnement que le client doit implmenter. 4 Dans la page Attributs, spcifiez le nom du gestionnaire dvnement, par exemple MonEvenement. 5 Dans la barre doutils, choisissez le bouton Rafrachir.
Limplmentation de votre objet contient maintenant tout ce quil faut pour accepter les rcepteurs dvnements des clients et grer une liste des interfaces appeler quand lvnement se produit. Pour appeler ces interfaces, vous pouvez crer une mthode pour gnrer chaque vnement dans les clients.

6 Dans lditeur de code, ajoutez une mthode votre objet pour dclencher chaque vnement. Par exemple :
unit ev; interface uses ComObj, AxCtrls, ActiveX, Project1_TLB; type TMyAutoObject = class (TAutoObject,IConnectionPointContainer, IMyAutoObject) private . . . public procedure Initialize; override; procedure Fire_MonEvenement; { Ajoutez une mthode pour dclencher lvnement}

36-12

Guide du dveloppeur

Interfaces dAutomation

7 Codez la mthode ajoute ltape prcdente afin quelle parcourt tous les rcepteurs dvnements grs dans le membre FConnectionPoint de votre objet :
procedure TMyAutoObject.Fire_MonEvenement; var I: Integer; EventSinkList: TList; EventSink: IMyAutoObjectEvents; begin if FConnectionPoint <> nil then begin EventSinkList :=FConnectionPoint.SinkList; {obtenir la liste des rcepteurs client } for I := 0 to EventSinkList.Count - 1 do begin EventSink := IUnknown(FEvents[I]) as IMyAutoObjectEvents; EventSink.MyEvent; end; end; end;

8 A chaque fois que vous avez besoin de dclencher lvnement pour que les clients soient informs de son occurrence, appelez la mthode qui distribue lvnement tous les rcepteurs dvnements :
if EventOccurs then Fire_MonEvenement; { Appelez la mthode cre pour dclencher des vnements.}

Gestion des vnements dans un objet Automation


Pour quun serveur gre les vnements COM classiques, il doit proposer une dfinition dune interface de sortie implmente par un client. Cette interface en sortie contient tous les gestionnaires dvnements que le client doit implmenter pour rpondre aux vnements du serveur. Quand un client a implment linterface vnement en sortie, il informe de son souhait dtre notifi des vnements en interrogeant linterface IConnectionPointContainer du serveur. Linterface IConnectionPointContainer renvoie linterface IConnectionPoint du serveur qui est utilise par le client comme pointeur pour son implmentation des gestionnaires dvnements (cest que lon appelle un rcepteur). Le serveur gre une liste de tous les rcepteurs des clients et appelle leurs mthodes quand un vnement se produit, comme dcrit ci-dessous.

Interfaces dAutomation
Lexpert objet Automation implmente par dfaut une interface double ce qui signifie que lobjet Automation gre : La liaison tardive lexcution, via son interface IDispatch. Elle est implmente comme une interface de rpartition ou dispinterface.

Cration de serveurs COM simples

36-13

Interfaces dAutomation

La liaison prcoce la compilation, ce qui seffectue directement en appelant lune des fonctions membre de la table de fonction virtuelle (VTable). Cest ce que lon appelle une interface personnalise.
Remarque

Les interfaces gnres par lexpert objet COM qui ne descendent pas de IDispatch ne grent que les appels de la VTable.

Interfaces doubles
Une interface double est la fois une interface personnalise et une dispinterface. Elle est implmente en tant quinterface VTable COM qui drive de IDispatch. Pour les contrleurs qui accdent lobjet uniquement lexcution, la dispinterface est disponible. Pour les objets qui peuvent tirer profit de la liaison la compilation, cest linterface VTable, la plus efficace, qui est utilise. Les interfaces doubles offrent les avantages combins des interfaces VTable et des dispinterfaces : Pour les interfaces VTable, le compilateur fait une vrification de type et fournit des messages derreurs plus informatifs. Pour les contrleurs Automation qui ne peuvent pas obtenir dinformation de type, la dispinterface fournit laccs lobjet lexcution. Pour les serveurs en processus, vous bnficiez dun accs rapide via les interfaces VTable. Pour les serveurs hors processus, COM effectue le marshaling des donnes la fois pour les interfaces VTable et pour les dispinterfaces. COM fournit une implmentation proxy/stub gnrique qui peut raliser le marshaling de linterface en fonction des informations contenues dans une bibliothque de types. Pour davantage dinformations sur le marshaling, voir Marshaling des donnes la page 36-16. Le diagramme page suivante dcrit linterface IMyInterface dun objet grant une interface double nomme IMyInterface. Les trois premires entres de la VTable dune interface double font rfrence linterface IUnknown, les quatre suivantes font rfrence linterface IDispatch, les autres sont des entres COM pour laccs direct aux membres de linterface personnalise.

36-14

Guide du dveloppeur

Interfaces dAutomation

Figure 36.1 VTable dune interface double

Interfaces de rpartition
Les contrleurs Automation sont des clients qui utilisent linterface COM IDispatch pour accder aux objets du serveur COM. Le contrleur doit dabord crer lobjet, puis demander linterface IUnknown de lobjet un pointeur sur son interface IDispatch. IDispatch garde en interne la trace des mthodes et des proprits par le biais dun identificateur de rpartition (dispID), qui est un numro didentification propre chaque membre interface. Grce IDispatch, un contrleur rcupre les informations de type de lobjet pour linterface de rpartition, puis associe les noms des membres interface aux dispID spcifiques. Ces dispID sont accessibles lexcution et les contrleurs y accdent en appelant la mthode GetIDsOfNames de IDispatch. Lorsquil connat le dispID, le contrleur peut appeler la mthode Invoke de IDispatch pour excuter le code requis (proprit ou mthode), en regroupant les paramtres de la proprit ou de la mthode dans lun des paramtres de la mthode Invoke. Invoke a une signature fixe dfinie lors de la compilation, qui lui permet daccepter des arguments varis lors de lappel dune mthode dinterface. Limplmentation de lobjet automation de Invoke doit alors dgrouper les paramtres, appeler la proprit ou la mthode et grer les ventuelles erreurs. Lorsque la proprit ou la mthode revient, lobjet retransmet la valeur renvoye au contrleur. Cette procdure est appele liaison diffre car le contrleur se lie la proprit ou la mthode lors de lexcution de lapplication plutt que lors de sa compilation.

Cration de serveurs COM simples

36-15

Marshaling des donnes

Remarque

Lors de limportation dune bibliothque de types, Delphi requiert des dispID lors de la gnration du code, permettant de cette faon aux classes enveloppe gnres dappeler Invoke sans appeler GetIDsOfNames. Cela peut augmenter de manire significative les performances dexcution des contrleurs.

Interfaces personnalises
Les interfaces personnalises sont des interfaces dfinies par lutilisateur qui permettent aux clients dappeler les mthodes de linterface en fonction de leur ordre dans la VTable et du type des arguments. La VTable contient les adresses de toutes les proprits et mthodes qui sont membres de lobjet, y compris les fonctions membre des interfaces quil supporte. Si lobjet ne supporte pas IDispatch, les entres correspondant aux membres des interfaces personnalises de lobjet suivent immdiatement celles des membres de IUnknown. Si lobjet possde une bibliothque de types, vous pouvez accder linterface personnalise via sa disposition VTable, que vous pouvez obtenir laide de lditeur de bibliothques de types. Si lobjet possde une bibliothque de types et gre IDispatch, un client peut aussi obtenir les dispID de linterface IDispatch et se lier directement un dplacement de la VTable. Limportateur de la bibliothque de types de Delphi (TLIBIMP) extrait les dispIDs limportation, ce qui vite aux clients qui utilisent les enveloppes de dispinterfaces dappeler GetIDsOfNames; ces informations figurent dj dans le fichier _TLB. Toutefois, les clients doivent quand mme appeler Invoke.

Marshaling des donnes


Pour les serveurs hors processus et distants, vous devez prendre en compte la faon dont COM effectue le marshaling des donnes hors du processus en cours. Vous pouvez effectuer le marshaling : Automatiquement, en utilisant linterface IDispatch. Automatiquement, en crant une bibliothque de types avec votre serveur et en marquant linterface avec le drapeau dAutomation OLE. COM sait comment raliser le marshaling de tous les types compatibles Automation de la bibliothque de types et peut implmenter les proxys et les stubs pour vous. Certaines restrictions de types sont ncessaires pour permettre le marshaling automatique. Manuellement, en implmentant toutes les mthodes de linterface IMarshal. Cela sappelle le marshaling personnalis.
Remarque

La premire mthode, lutilisation de IDispatch est uniquement disponible sur les serveurs Automation. La seconde mthode est automatiquement disponible sur tous les objets crs par les experts et utilisant une bibliothque de types.

36-16

Guide du dveloppeur

Marshaling des donnes

Types compatibles avec lAutomation


Les rsultats de fonctions et les types des paramtres des mthodes dclars dans les interfaces duales et de rpartition doivent tre des types compatibles Automation. Les types suivants sont compatibles Automation OLE : Les types autoriss prdfinis, comme Smallint, Integer, Single, Double et WideString. Pour la liste complte, voir Types autoriss la page 34-13. Les types numration dfinis dans une biblioth que de types. Les types numration compatibles Automation OLE sont stocks dans des valeurs 32 bits et sont traits comme des valeurs de type Integer pour la transmission des paramtres. Les types interface dfinis dans une bibliothque de types qui sont scuriss Automation OLE, cest--dire drivs de IDispatch et contenant seulement des types compatibles Automation OLE. Les types dispinterface dfinis dans une bibliothque de types. Tout type enregistrement personnalis dfini dans la bibliothque de types. IFont, IStrings et IPicture. Les objets utilitaires doivent tre instancis pour que correspondent un IFont un TFont un IStrings un TStrings un IPicture un TPicture Les experts contrle ActiveX et ActiveForm crent automatiquement ces objets utilitaires lorsque cest ncessaire. Pour utiliser les objets utilitaires, appelez respectivement les routines globales GetOleFont, GetOleStrings, GetOlePicture.

Restrictions de type pour le marshaling automatique


Pour quune interface supporte le marshaling automatique (aussi appel marshaling Automation ou marshaling de bibliothque de types), les restrictions suivantes sont ncessaires. Lorsque vous modifiez votre objet Automation en utilisant lditeur de bibliothques de types, celui-ci applique les restrictions suivantes : Les types doivent tre compatibles pour la communication interplate-forme. Par exemple, vous ne pouvez pas utiliser de structure de donnes (autrement quen implmentant un autre objet proprit), ni dargument non sign, ni dAnsiStrings, etc. Les types chane doivent tre transfrs en tant que chanes larges (BSTR). PChar et AnsiString ne peuvent pas subir de marshaling en toute scurit. Tous les membres dune interface double doivent passer un HRESULT comme valeur de retour de fonction. Si la mthode est dclare par le biais de la convention dappel safecall, cette condition est impose automatiquement, avec le type de retour dclar converti en paramtre de sortie.

Cration de serveurs COM simples

36-17

Recensement dun objet COM

Les membres dune interface duale qui ont besoin de renvoyer dautres valeurs doivent spcifier ces paramtres en tant que var ou out, en indiquant un paramtre de sortie pour renvoyer la valeur de la fonction.
Remarque

Une faon doutrepasser les restrictions des types Automation est dimplmenter une interface IDispatch distincte et une interface personnalise. Vous pouvez ainsi utiliser tous les types darguments. Cela signifie que les clients COM ont la possibilit dutiliser linterface personnalise, laquelle les contrleurs Automation peuvent encore accder. Mais, dans ce cas, il faut implmenter manuellement le code de marshaling.

Marshaling personnalis
Gnralement, vous utiliserez le marshaling automatique dans les serveurs hors processus et distants parce que cest le plus simple : COM fait le travail votre place. Cependant, vous pouvez dcider de fournir un marshaling personnalis si vous pensez que ses performances seront suprieures. Si sous implmentez votre propre marshaling personnalis, vous devez grer linterface IMarshal. Pour davantage dinformations sur cette approche, voir la documentation Microsoft.

Recensement dun objet COM


Un objet serveur peut tre recens comme serveur en ou hors processus. Pour davantage dinformations sur ces types de serveur, voir Serveurs en processus, hors processus et distants la page 33-7.
Remarque

Pour retirer lobjet COM de votre systme, vous devez commencer par annuler son recensement.

Recensement dun serveur en processus


Pour recenser un serveur en processus (DLL ou OCX) : Choisissez Excuter|Recenser le serveur ActiveX. Pour annuler le recensement dun serveur en processus : Choisissez Excuter|D recenser le serveur ActiveX.

Recensement dun serveur hors processus


Pour recenser un serveur hors processus : Excutez le serveur avec loption de ligne de commande /regserver. Pour spcifier les options de la ligne de commande, utilisez la bote de dialogue Excuter|Paramtres. Vous pouvez galement recenser le serveur en lexcutant.

36-18

Guide du dveloppeur

Test et dbogage de lapplication

Pour annuler le recensement dun serveur hors processus : Excutez le serveur avec loption de ligne de commande /unregserver. Vous pouvez galement utiliser la commande tregsvr depuis la ligne de commande ou excuter regsvr32.exe depuis le systme dexploitation.
Remarque

Si le serveur COM doit fonctionner dans COM+, vous devez linstaller dans une application COM+ au lieu de le recenser (linstallation de lobjet dans une application COM+ se charge automatiquement du recensement). Pour des informations sur la manire dinstaller un objet dans une application COM+, voir Installation dobjets transactionnels la page 39-24.

Test et dbogage de lapplication


Pour tester et dboguer une application serveur COM :

1 Si ncessaire, activez les informations de dbogage en utilisant la page Compilateur de la bote de dialogue Projet|Options. Activez aussi Dbogage intgr dans le dialogue Outils|Options du dbogueur. 2 Pour un serveur en processus, choisissez Excuter|Paramtres, entrez le nom du contrleur Automation dans la zone Application hte, puis choisissez OK. 3 Choisissez Excuter|Excuter. 4 Dfinissez des points darrts dans le serveur Automation. 5 Utilisez le contrleur Automation pour interagir avec le serveur Automation.
Le serveur Automation fait une pause quand les points darrts sont rencontrs.
Remarque

Comme autre approche, si vous crivez aussi le contrleur Automation, vous pouvez dboguer dans un serveur en processus en activant le support interprocessus COM. Utilisez la page Gnral de la bote de dialogue obtenue par Outils|Options du dbogueur pour activer le support inter-processus.

Cration de serveurs COM simples

36-19

36-20

Guide du dveloppeur

37
Chapitre 37

Chapitre

Cration dune page Active Server

Si vous utilisez lenvironnement Microsoft Internet Information Server (IIS) pour proposer vos pages Web, vous pouvez utiliser ASP (Active Server Pages) pour crer des applications client-serveur Web dynamiques. ASP vous permet dcrire un script qui est appel chaque fois que le serveur charge la page Web. Ce script peut, son tour, appeler des objets Automation pour obtenir des informations quil peut inclure dans une page HTML gnre. Vous pouvez, par exemple, crire un serveur Automation Delphi pour se connecter une base de donnes et utiliser ce contrle pour accder aux donnes qui sont ainsi actualises chaque fois que le serveur charge la page Web. Pour le client, ASP apparat comme un document standard HTML qui peut tre visualis par les utilisateurs de toute plate-forme disposant dun navigateur Web. Les applications ASP sont similaires aux applications crites en utilisant la technologie courtier Web Delphi. Pour davantage dinformations sur la technologie courtier Web, voir chapitre 27, Cration dapplications Internet. Cependant ASP est diffrent car il spare la conception de linterface utilisateur de limplmentation des rgles de gestion et de la logique complexe dune application. La conception de linterface utilisateur est gre par la page Active Server. Cest essentiellement un document HTML, mais elle peut contenir des scripts incorpors qui appellent des objets ASP pour fournir au document le contenu qui reflte les rgles de gestion ou la logique de lapplication. La logique de lapplication est encapsule par des objets Active Server qui exposent des mthodes simples la page Active Server en lui fournissant le contenu dont elle a besoin.
Remarque

Mme si ASP prsente lavantage de sparer la conception de linterface utilisateur de la logique de lapplication, grande chelle ses performances sont limites. Pour des sites Web devant satisfaire un trs grand nombre de clients, il est recommand dutiliser la place une approche exploitant la technologie courtier Web.

Cration dune page Active Server

37-1

Cration dun objet Active Server

Les scripts des pages Active Server et les objets Automation incorpors dans une page peuvent utiliser les lments intrinsques ASP (des objets prdfinis qui fournissent des informations sur lapplication en cours, les messages HTTP du navigateur, etc). Ce chapitre dcrit comment crer un objet Active Server en utilisant lexpert objet Active Server Delphi. Ce contrle Automation spcial peut ensuite tre appel par une page Active Server et lui fournir son contenu. Voici les tapes de la cration dun objet Active Server : Cration dun objet Active Server pour lapplication. Dfinition de linterface dun objet Active Server. Recensement dun objet Active Server. Test et dbogage dune application ASP.

Cration dun objet Active Server


Un objet Active Server est un objet Automation qui accde toutes les informations de lapplication ASP et aux messages HTTP quelle utilise pour communiquer avec les navigateurs. Il descend de TASPObject ou de TASPMTSObject(qui son tour descend de TAutoObject), et il gre les protocoles dAutomation, en sexposant pour tre utilis par dautres applications ou par le script dans la page Active Server. Pour crer un objet Active Server, utilisez lexpert Objet Active Server. Votre projet dobjet Active Server peut prendre, selon vos besoins, la forme dun excutable (exe) ou dune bibliothque (dll). Cependant vous devez tenir compte des inconvnients lis lutilisation dun serveur hors processus. Ces inconvnients sont prsents dans la section Cration dASP pour des serveurs en et hors processus la page 37-8. Pour afficher lexpert dobjet Active Server :

1 Choisissez Fichier|Nouveau|Autre. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne Objet Active Server.
Dans lexpert, spcifiez le nom du nouvel objet Active Server et spcifiez les modles et de thread qu il faut grer. Ces paramtres dterminent comment lobjet peut tre appel. Vous devez crire limplmentation de telle manire quelle soit conforme au modle (par exemple, en vitant les conflits de thread). Les modles dinstanciation et de thread impliquent les mmes choix que pour les autres objets COM. Pour davantage dinformations, voir Types dinstanciation des objets COM la page 36-5 et Choix dun modle de thread la page 36-6. Ce qui rend unique lobjet Active Server est sa capacit accder aux informations relatives lapplication ASP et aux messages HTTP changs entre la page Active Server et les navigateurs client Web. Laccs ces informations se fait via les lments intrinsques ASP.

37-2

Guide du dveloppeur

Cration dun objet Active Server

Vous pouvez, dans lexpert, spcifier comment votre objet y accde en spcifiant loption Type dActive Server : Si vous utilisez IIS 3 ou IIS 4, vous pouvez utiliser Mthodes dvnement de niveau page. Avec ce modle, votre objet implmente les mthodes OnStartPage et OnEndPage appeles au chargement/dchargement de la page Active Server. Quand lobjet est charg, il obtient automatiquement une interface IScriptingContext quil utilise pour accder aux lments intrinsques ASP. Ces interfaces sont leur tour refltes sous la forme de proprits hrites de la classe de base (TASPObject). Si vous utilisez IIS5 ou plus, utilisez le type Contexte dobjet. Avec ce modle, votre objet obtient une interface IObjectContext quil utilise pour accder aux lments intrinsques ASP. L encore, ces interfaces sont leur tour refltes sous la forme de proprits hrites de la classe de base (TASPMTSObject). Lavantage de cette approche tient ce que lobjet accde tous les autres services proposs par IObjectContext. Pour accder linterface IObjectContext, appelez simplement GetObjectContext (dfinie dans lunit mtx) de la manire suivante :
ObjectContext := GetObjectContext;

Pour davantage dinformations sur les services accessibles via IObjectContext, voir chapitre 39, Cration dobjets MTS ou COM+. Vous pouvez demander lexpert de gnrer une page .ASP simple pour accueillir le nouvel objet Active Server. La page gnre contient un script minimaliste (crit en VBScript) qui cre votre objet Active Server partir de son ProgID et indique o vous pouvez appeler ses mthodes. Ce script appelle Server.CreateObject pour dmarrer votre objet Active Server.
Remarque

Mme si le script de test gnr utilise VBScript, une page Active Server peut galement contenir du code Jscript. Lorsque vous sortez de lexpert, une nouvelle unit est ajoute au projet en cours ; elle contient la dfinition de lobjet Active Server. De plus, lexpert ajoute un projet de bibliothque de types et ouvre lditeur de bibliothque de types. Vous pouvez alors exposer les proprits et mthodes de linterface via la bibliothque de type comme indiqu dans Dfinition de linterface dun objet COM la page 36-9. Quand vous crivez limplmentation des proprits et mthodes de votre objet, vous pouvez tirer profit des lments intrinsques ASP (dcrit ci-dessous) pour obtenir des informations sur lapplication ASP et les messages HTTP quelle utilise pour communiquer avec les navigateurs. Comme tout autre objet Automation, lobjet Active Server implmente une interface double, qui gre aussi bien la liaison prcoce ( la compilation) via la VTable et la liaison tardive ( lexcution) via linterface IDispatch. Pour davantage dinformations sur les interfaces doubles, voir Interfaces doubles la page 36-14.

Cration dune page Active Server

37-3

Cration dun objet Active Server

Utilisation des lments intrinsques ASP


Les objets intrinsques ASP sont un ensemble dobjets COM fournis par ASP aux objets qui sexcutent dans une page Active Server. Ils permettent votre objet Active Server daccder aux informations refltant les messages changs entre votre application et le navigateur Web ainsi quun moyen de stocker des informations partages par tous les objets Active Server appartenant une mme application ASP. Pour simplifier laccs ces objets, la classe de base de votre objet Active Server les prsente sous la forme de proprits. Pour une description complte de ces objets, reportez-vous la documentation Microsoft. Les rubriques suivantes vous en donnent une prsentation rapide.

Application
On accde lobjet Application via une interface IApplicationObject. Il reprsente toute lapplication ASP, dfinie comme tant lensemble de tous les fichiers .asp dun mme rpertoire virtuel et de ses sous-rpertoires. Lobjet Application peut tre partag par plusieurs clients, il propose donc une gestion du verrouillage que vous devez utiliser pour empcher des conflits de threads. IApplicationObject propose les membres suivants :
Tableau 37.1 Membres de linterface IApplicationObject Signification
Enumre tous les objets ajouts lapplication en utilisant les commandes de script. Cette interface a deux mthodes Remove et RemoveAll que vous pouvez utiliser pour supprimer un objet de la liste ou bien tous les objets. Enumre tous les objets ajouts lapplication avec la balise <OBJECT>. Empche dautres clients de verrouiller lobjet Application jusqu lappel de Unlock. Tous les clients doivent appeler Lock avant daccder la mmoire partage (par exemple, les proprits). Libre le verrou plac en utilisant la mthode Lock. Se produit la sortie de lapplication, aprs lvnement Session_OnEnd. Les seuls lments intrinsques alors disponibles sont Application et Server. Ce gestionnaire dvnement doit tre crit en VBScript ou en JScript. Se produit avant la cration dune nouvelle session (avant Session_OnStart). Les seuls lments intrinsques alors disponibles sont Application et Server. Ce gestionnaire dvnement doit tre crit en VBScript ou en JScript.

Proprit , mthode ou v nement


Proprit Contents

Proprit StaticObjects Mthode Lock

Mthode Unlock Evnement Application_OnEnd

Evnement Application_OnStart

37-4

Guide du dveloppeur

Cration dun objet Active Server

Request
On accde lobjet Request via une interface IRequest . Il donne des informations sur le message de requte HTTP qui a entran louverture de la page Active Server. IRequest propose les membres suivants :
Tableau 37.2 Membres de linterface IRequest Signification
Indique la valeur de tous les champs du certificat client qui a t envoy avec le message HTTP. Indique la valeur de tous les en-ttes de cookie du message HTTP. Indique la valeur des lments de fiche dans le corps HTTP. Il est possible dy accder par nom. Indique la valeur de toutes les variables de la chane de requte de len-tte HTTP. Indique la valeur de diverses variables denvironnement. Ces variables reprsentent la plupart des variables courantes dun en-tte HTTP. Indique le nombre doctets dans le corps de la requte. Cest la limite suprieure du nombre doctets renvoys par la mthode BinaryRead. Rcupre le contenu dun message Post. Appelez la mthode en spcifiant le nombre maximum doctets lire. Le contenu rsultant est renvoy dans un tableau Variant doctets. Aprs avoir appel BinaryRead vous ne pouvez plus utiliser la proprit Form.

Proprit , mthode ou v nement


Proprit ClientCertificate Proprit Cookies Proprit Form Proprit QueryString Proprit ServerVariables

Proprit TotalBytes

Mthode BinaryRead

Response
On accde lobjet Response via une interface IResponse. Il vous permet de spcifier des informations sur le message de rponse HTTP renvoy au navigateur client. IResponse propose les membres suivants :
Tableau 37.3 Membres de linterface IResponse Signification
Dtermine la valeur des tous les en-ttes de cookie du message HTTP. Indique si la sortie de la page est place dans un tampon. Si cest le cas, le serveur nenvoie la rponse au client quaprs avoir trait tous les scripts serveur de la page en cours. Dtermine si des serveurs proxy peuvent placer dans un cache la sortie de la rponse. Ajoute le nom du jeu de caractres len-tte de type de contenu.

Proprit , mthode ou v nement


Proprit Cookies Proprit Buffer

Proprit CacheControl Proprit Charset

Cration dune page Active Server

37-5

Cration dun objet Active Server

Tableau 37.3

Membres de linterface IResponse (suite) Signification


Spcifie le type de contenu HTTP du corps du message de rponse. Spcifie combien de temps la rponse peut rester dans le cache dun navigateur avant dexpirer. Spcifie lheure et la date dexpiration de la rponse. Indique si le client nest plus connect au serveur. Dfinit la valeur du champ pics-label de len-tte de rponse. Indique ltat de la rponse. Cest la valeur dun en-tte de status HTTP. Ajoute un en-tte HTTP de nom et de valeur spcifis. Ajoute une chane la fin de lentre de lhistorique du serveur Web pour cette requte. Ecrit des informations brutes (non interprtes) dans le corps du message de rponse. Efface tout le HTML plac dans le tampon. Arrte le traitement du fichier .asp et renvoie le rsultat en cours. Envoie immdiatement tout ce que contient le tampon de sortie. Envoie un message de rponse de redirection qui renvoie le navigateur client sur une autre URL. Ecrit, sous forme de chane, une variable dans la sortie HTTP en cours.

Proprit , mthode ou v nement


Proprit ContentType Proprit Expires Proprit ExpiresAbsolute Proprit IsClientConnected Proprit Pics Proprit Status Mthode AddHeader Mthode AppendToLog Mthode BinaryWrite Mthode Clear Mthode End Mthode Flush Mthode Redirect Mthode Write

Session
On accde lobjet Session via une interface ISessionObject. Il vous permet de stocker des variables qui subsistent durant toute linteraction dun client avec lapplication ASP. Ces variables ne sont donc pas libres quand le client passe dune page une autre dans lapplication ASP mais uniquement quand le client sort de lapplication. ISessionObject propose les membres suivants :
Tableau 37.4 Membres de linterface ISessionObject Signification
Enumre tous les objets ajouts la session en utilisant la balise <OBJECT>. Vous pouvez accder toute variable de la liste par son nom ou appeler les mthodes Remove ou RemoveAll de lobjet Contents pour supprimer des valeurs. Enumre tous les objets ajouts la session avec la balise <OBJECT>.

Proprit , mthode ou v nement


Proprit Contents

Proprit StaticObjects

37-6

Guide du dveloppeur

Cration dun objet Active Server

Tableau 37.4

Membres de linterface ISessionObject (suite) Signification


Spcifie le code de page utiliser pour mettre en correspondance les symboles. Diffrentes localisations peuvent utiliser des pages de code diffrentes. Spcifie lidentificateur de localisation utiliser pour interprter des contenus chane. Indique lidentificateur de session du client en cours. Spcifie la dure (en minutes) durant laquelle la session subsiste sans une requte (ou une ractualisation) du client avant la fin de lapplication. Dtruit la session et libre ses ressources. Se produit lors de labandon ou du dpassement de dlai dune session. Les seuls lments intrinsques alors disponibles sont Application, Server et Session. Ce gestionnaire dvnement doit tre crit en VBScript ou en JScript. Se produit lors de la cration par le serveur dune nouvelle session (aprs Application_OnStart mais avant lexcution du script de la page Active Server). Tous les lments intrinsques sont alors disponibles. Ce gestionnaire dvnement doit tre crit en VBScript ou en JScript.

Proprit , mthode ou v nement


Proprit CodePage

Proprit LCID Proprit SessionID Proprit Timeout

Mthode Abandon Evnement Session_OnEnd

Evnement Session_OnStart

Server
On accde lobjet Server via une interface IServer. Il propose divers utilitaires pour crire votre application ASP. IServer propose les membres suivants :
Tableau 37.5 Membres de linterface IServer Signification
Identique la proprit Timeout de lobjet Session. Instancie lobjet Active Server spcifi. Excute le script dun fichier .asp spcifi. Renvoie un objet ASPError qui dcrit la condition derreur. Code une chane en vue de son utilisation dans un en-tte HTML, en remplaant les caractres rservs par les constantes symboliques appropries. Associe un rpertoire virtuel spcifi (un rpertoire absolu dans le serveur en cours ou un chemin relatif la page en cours) un chemin daccs physique. Envoie toutes les informations dtat en cours une autre page Active Server pour traitement. Applique les rgles de codage dune URL, y compris les caractres dchappement, la chane spcifie

Proprit , mthode ou v nement


Proprit ScriptTimeout Mthode CreateObject Mthode Execute Mthode GetLastError Mthode HTMLEncode

Mthode MapPath

Mthode Transfer Mthode URLEncode

Cration dune page Active Server

37-7

Recensement dun objet Active Server

Cration dASP pour des serveurs en et hors processus


Vous pouvez utiliser Server.CreateObject dans une page ASP pour dmarrer un serveur en ou hors processus en fonction de vos besoins. Gnralement les serveurs en processus sont plus couramment utiliss. A la diffrence de la plupart des serveurs en processus, un objet Active Server ne sexcute pas dans lespace de processus du client mais dans celui de IIS. Cela signifie que le client na pas besoin de tlcharger votre application (comme cest, par exemple, le cas avec des objets ActiveX). Les composants DLL en processus sont plus rapides et plus fiables que des serveurs hors processus, il est donc prfrable de les utiliser du ct serveur. Comme les serveurs hors processus sont moins fiables, IIS est frquemment configur pour interdire lutilisation dexcutables hors processus. Dans ce cas, la cration dun serveur hors processus par votre objet Active Server produit une erreur de la forme suivante :
Server object error ASP 0196 Cannot launch out of process component /path/outofprocess_exe.asp, line 11

De plus, comme les composants hors processus crent souvent des processus de serveur individuels pour chaque instance dobjet, ils sont plus lents que les applications CGI. Ils ne supportent pas aussi bien les redploiements que les composants DLL. Si les performances et le redploiement sont des priorits, il est fortement conseill dutiliser des composants en processus. Cependant les sites Intranet qui ont un trafic faible ou modr peuvent utiliser un composant hors processus sans affecter les performances globales du site. Pour des informations gnrales sur les serveurs en et hors processus, voir Serveurs en processus, hors processus et distants la page 33-7.

Recensement dun objet Active Server


Vous pouvez recenser lobjet ASP comme serveur en ou hors processus, mais les serveurs en processus sont plus frquemment utiliss.
Remarque

Si vous voulez retirer lobjet ASP de votre systme, vous devez commencer par annuler son recensement, puis retirer ses entres dans le registre Windows.

Recensement dun serveur en processus


Pour recenser un serveur en processus (DLL ou OCX) : Choisissez Excuter|Recenser le serveur ActiveX. Pour annuler le recensement dun serveur en processus : Choisissez Excuter|D recenser le serveur ActiveX.

37-8

Guide du dveloppeur

Test et dbogage dune application ASP

Recensement dun serveur hors processus


Pour recenser un serveur hors processus : Excutez le serveur avec loption de ligne de commande /regserver. Pour spcifier les options de la ligne de commande, vous pouvez utiliser la bote de dialogue Excuter|Paramtres. Vous pouvez galement recenser le serveur en lexcutant. Pour annuler le recensement dun serveur hors processus : Excutez le serveur avec loption de ligne de commande /unregserver.

Test et dbogage dune application ASP


Le dbogage dun serveur en processus comme un objet Active Server se fait comme celui dune DLL. Vous choisissez une application hte qui charge la DLL et dbogez de manire habituelle. Pour tester et dboguer un objet Active Server :

1 Activez, si ncessaire, les informations de dbogage en utilisant la page Compilateur de la bote de dialogue Projet|Options. Activez galement le dbogage intgr dans la bote de dialogue Outils|Options du dbogueur. 2 Choisissez Excuter|Paramtres, entrez le nom de votre serveur Web dans la zone Application hte et choisissez OK. 3 Choisissez Excuter|Excuter. 4 Dfinissez des points darrt dans limplmentation de lobjet Active Server. 5 Utilisez le navigateur Web pour interagir avec lobjet ASP.
Le dbogueur sarrte quand les points darrt sont atteints.

Cration dune page Active Server

37-9

37-10

Guide du dveloppeur

38
Chapitre 38

Chapitre

Cration dun contrle ActiveX

Un contrle ActiveX est un composant logiciel qui peut sintgrer toute application hte acceptant les contrles ActiveX (comme C++Builder, Delphi, Visual Basic, Internet Explorer et, avec un complment, Netscape Navigator) et en tendre les fonctionnalits. Les contrles ActiveX implmentent un ensemble particulier dinterfaces qui permettent cette intgration. Ainsi, Delphi est fourni avec plusieurs contrles ActiveX : graphes, tableurs ou graphiques. Vous pouvez ajouter ces contrles la palette des composants de lEDI et les utiliser comme tout composant VCL standard en les dposant dans des fichiers et en dfinissant leurs proprits avec linspecteur dobjets. Vous pouvez galement dployer sur le Web un contrle ActiveX, en le rfrenant dans des documents HTML et en le visualisant dans un navigateur Web grant ActiveX. Delphi propose des experts qui permettent de crer deux types de contrles ActiveX : Des contrles ActiveX qui encapsulent des classes VCL. En encapsulant une classe VCL, vous pouvez convertir les composants existants en contrles ActiveX ou en crer de nouveaux, les tester localement puis les convertir en contrles ActiveX. Gnralement, les contrles ActiveX sont conus pour sintgrer dans une application plus importante. Des fiches actives. Les fiches actives (ActiveForms) vous permettent dutiliser le concepteur de fiche pour crer un contrle plus labor qui se comporte comme une bote de dialogue ou mme comme une application complte. Vous dveloppez une fiche active de la mme manire qu une application Delphi normale. Les fiches actives sont gnralement conues en vue dun dploiement sur le Web. Ce chapitre est une prsentation gnrale de la faon de crer un contrle ActiveX dans lenvironnement Delphi. Vous ny trouverez pas les dtails complets de lcriture des contrles ActiveX sans utiliser dexperts. Pour cela,

Cration dun contrle ActiveX

38-1

Prsentation de la cration dun contrle ActiveX

consultez la documentation Microsoft Developers Network (MSDN) ou recherchez sur le site Web de Microsoft des informations sur ActiveX.

Prsentation de la cration dun contrle ActiveX


Crer des contrles ActiveX avec Delphi ressemble beaucoup la cration de contrles ou de fiches ordinaires. Par contre, cest trs diffrent de la cration des autres objets COM o vous commencez par dfinir linterface de lobjet, puis compltez ensuite limplmentation. Pour crer des contrles ActiveX (autres que les fiches actives), il faut inverser ce processus, er partir de limplmentation dun contrle VCL puis gnrer linterface et la bibliothque de types une fois que le contrle est cod. Pour la cration de fiches actives, linterface et la bibliothque de types sont crs en mme temps que la fiche, puis vous utilisez le concepteur de fiche pour implmenter la fiche. Une fois achev, un contrle ActiveX est compos dun contrle VCL qui fournit limplmentation sous-jacente, un objet COM qui encapsule le contrle VCL et une bibliothque de types qui numre les proprits, mthodes et vnements de lobjet COM. Pour crer un nouveau contrle ActiveX (autre quune fiche active), effectuez les tapes suivantes :

1 Concevez et crez le contrle VCL personnalis qui sera la base de votre contrle ActiveX. 2 Utilisez lexpert contrle ActiveXpour crer un contrle ActiveX partir du contrle VCL cr ltape 1. 3 Utilisez lexpert de page proprits ActiveXpour crer une ou plusieurs pages de proprits pour le contrle (facultatif). 4 Associez une page de proprits un contrle ActiveX (facultatif). 5 Recensez le contrle ActiveX. 6 Testez le contrle ActiveX avec toutes les applications cible possibles. 7 Dployez le contrle ActiveX sur le Web (facultatif).
Pour crer une nouvelle fiche active, effectuez les tapes suivantes :

1 Utilisez lexpert ActiveForm pour crer une fiche active, qui apparat comme une fiche vide dans lEDI et lenveloppe ActiveX associe cette fiche. 2 Utilisez le concepteur de fiche pour ajouter des composants votre fiche active et implmenter son comportement comme vous lutiliseriez pour une fiche ordinaire. 3 Suivez les tapes 3-7 prcdentes pour donner la fiche active une page de proprits, la recenser et la dployer sur le Web.

38-2

Guide du dveloppeur

Prsentation de la cration dun contrle ActiveX

Elments dun contrle ActiveX


Un contrle ActiveX implique plusieurs lments qui ont chacun une fonction spcifique. Ces lments sont un contrle VCL, un objet enveloppe COM correspondant qui expose des proprits, des mthodes, des vnements, et une ou plusieurs bibliothques de types associes.

Contrle VCL
Dans Delphi, limplmentation sous-jacente un contrle ActiveX est un contrle VCL. Quand vous crez un contrle ActiveX, vous devez commencer par concevoir ou choisir le contrle VCL partir duquel vous aller construire votre contrle ActiveX. Le contrle VCL sous-jacent doit tre un descendant de TWinControl car il doit disposer dune fentre qui peut tre accueillie par lapplication hte. Quand vous crez une fiche active, cet objet est un descendant de TActiveForm.
Remarque

Lexpert contrle ActiveX numre les descendants TWinControl dans lesquels vous pouvez choisir pour crer un contrle ActiveX. Nanmoins, cette liste ne propose pas tous les descendants TWinControl. Certains contrles sont rpertoris comme incompatibles avec ActiveX (en utilisant la procdure RegisterNonActiveX) et napparaissent pas dans cette liste.

Enveloppe ActiveX
Le vritable objet COM est un objet ActiveX qui encaspule le contrle VCL. Pour les fiches actives, cette classe est toujours TActiveFormControl. Pour les autres contrles ActiveX, elle a un nom de la forme TVCLClassX, o TVCLClass est le nom de la classe du contrle VCL. Ainsi, par exemple, lenveloppe ActiveX de TButton se nommerait TButtonX . La classe enveloppe est un descendant de TActiveXControl, qui gre les interfaces ActiveX. Lenveloppe ActiveX en hrite, ce qui lui permet de retransmettre les messages Windows au contrle VCL et daccueillir sa fentre dans lapplication hte. Lenveloppe ActiveX expose les proprits et mthodes du contrle VCL aux clients en utilisant son interface par dfaut. Lexpert implmente automatiquement la plupart des proprits et mthodes de classe enveloppe et dlgue les appels de mthode au contrle VCL sous-jacent. Lexpert fournit galement la classe enveloppe les mthodes qui dclenchent les vnements du contrle VCL dans les clients et affecte ces mthodes aux gestionnaires dvnements du contrle VCL.

Bibliothque de types
Lexpert contrle ActiveX gnre automatiquement une bibliothque de types qui contient les dfinitions de type pour la classe enveloppe, son interface par dfaut et toutes les dfinitions de type ncessaires. Ces informations de type permettent au contrle dinformer les applications htes de ses services. Vous pouvez visualiser et modifier ces informations en utilisant lditeur de bibliothques de

Cration dun contrle ActiveX

38-3

Conception dun contrle ActiveX

types. Mme si ces informations sont stockes dans un fichier bibliothque binaire spar (dextension .TLB), elles sont galement compiles automatiquement sous forme de ressources dans la DLL du contrle ActiveX.

Page de proprits
Vous pouvez ventuellement attribuer votre contrle ActiveX une page de proprits. La page de proprits permet lutilisateur de lapplication hte (le client) de visualiser et de modifier les proprits du contrle. Vous pouvez regrouper plusieurs proprits dans une page ou utiliser une page pour proposer une interface de type bote de dialogue une proprit. Pour davantage dinformations sur la manire de crer des pages de proprits, voir Cration dune page de proprits pour un contrle ActiveX la page 38-13.

Conception dun contrle ActiveX


Lors de la conception dun contrle ActiveX, vous commencez par crer un contrle VCL personnalis. Il sert de base votre contrle ActiveX. Pour des informations sur la cration de contrles personnaliss, voir la partie V, Cration de composants personnaliss. Quand vous concevez le contrle VCL, noubliez pas quil va tre incorpor dans une autre application : ce contrle nest pas une application en lui-mme. De ce fait, vous devez viter de concevoir des bote de dialogue trop sophistiqu es. Gnralement, votre but est de concevoir un contrle simple qui travaille lintrieur dune application principale et en respecte les rgles. De plus, vous devez vous assurer que les types de toutes les proprits et mthodes que votre contrle expose aux clients sont compatibles avec lAutomation, car linterface du contrle ActiveX doit grer IDispatch. Lexpert najoute linterface de la classe enveloppe que les mthodes ayant des paramtres dont le type est compatible avec lAutomation. Pour une liste des types compatibles avec lAutomation, voir Types autoriss la page 34-13. Les experts implmentent toutes les interfaces ActiveX ncessaires en utilisant la classe enveloppe COM. Ils reprsentent galement toutes les proprits, mthodes et vnements compatibles avec lAutomation via linterface par dfaut de la classe enveloppe. Quand lexpert a gnr la classe COM enveloppe et son interface, vous pouvez utiliser lditeur de bibliothques de types pour modifier linterface par dfaut ou augmenter la classe enveloppe en implmentant dautres interfaces.

Gnration dun contrle ActiveX partir dun contrle VCL


Pour gnrer un contrle ActiveX partir dun contrle VCL, utilisez lexpert contrle ActiveX. Les proprits, mthodes et vnements du contrle VCL deviennent les proprits, mthodes et vnements du contrle ActiveX.

38-4

Guide du dveloppeur

Gnration dun contrle ActiveX partir dun contrle VCL

Avant dutiliser lexpert contrle ActiveX, vous devez choisir le contrle VCL qui fournit limplmentation sous-jacente du contrle ActiveX gnr. Pour afficher lexpert contrle ActiveX :

1 Choisissez Fichier|Nouveau pour ouvrir la bote de dialogue Nouveaux lments. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne Contrle ActiveX.
Dans lexpert, slectionnez le nom du contrle VCL encapsul par le nouveau contrle ActiveX. La bote de dialogue numre tous les contrles disponibles, cest--dire les descendants TWinControl qui ne sont pas recenss comme incompatibles avec ActiveX en utilisant la procdure RegisterNonActiveX.
Astuce

Si vous ne voyez pas le contrle souhait dans la liste droulante, vrifiez si vous lavez install dans lEDI ou ajoutez son unit votre projet. Une fois le contrle slectionn, lexpert gnre automatiquement un nom pour la coclasse, lunit dimplmentation de lenveloppe ActiveX et le projet de bibliothque ActiveX. Si un projet de bibliothque ActiveX est dj ouvert et quil ne contient pas dobjet vnement COM+, ce projet est automatiquement utilis. Vous pouvez modifier ces noms dans lexpert sauf si vous avez dj un projet de bibliothque ActiveX ouvert, auquel cas le nom du projet nest pas modifiable. Lexpert utilise toujours le modle de thread Apartment. Cela ne pose pas de problme si votre projet ActiveX ne contient quun seul contrle. Cependant, si vous ajoutez dautres objets votre projet, cest vous dassurer la gestion des threads. Lexpert vous permet galement de configurer diverses options du contrle ActiveX : Licence de conception : Vous pouvez faire recenser votre contrle pour vous assurer que les utilisateurs du contrle ne peuvent pas louvrir en conception ou lexcution, sauf sils disposent dune cl de licence pour le contrle. Informations de version : Vous pouvez inclure dans le contrle ActiveX des informations de version, comme le copyright ou une description du fichier. Ces informations peuvent tre visualises par un navigateur. Certains clients htes comme Visual Basic 4.0 exigent des informations de version pour accueillir le contrle ActiveX. Spcifiez les informations de version en choisissant Projet|Options et en slectionnant la page Informations de version. Bote A propos : Vous pouvez demander lexpert de gnrer une fiche spare qui implmente une bote de dialogue A propos pour le contrle. Les utilisateurs de lapplication hte peuvent afficher cette bote de dialogue A propos dans un environnement de dveloppement. Par dfaut, la bote de dialogue A propos contient le nom du contrle ActiveX, une image, les informations de copyright et un bouton OK. Vous pouvez modifier cette fiche que lexpert ajoute votre projet.

Cration dun contrle ActiveX

38-5

Gnration dun contrle ActiveX bas sur une fiche VCL

Quand vous sortez de lexpert, il gnre les lments suivants : Un fichier projet de bibliothque ActiveX qui contient le code ncessaire pour dmarrer un contrle ActiveX. Gnralement, vous ne modifierez pas ce fichier. Une bibliothque de types qui dfinit une CoClasse pour le contrle, linterface quelle expose aux clients et les dfinitions de types qui leurs sont ncessaires. Pour davantage dinformations sur la bibliothque de types, voir chapitre 34, Utilisation des bibliothques de types. Une unit dimplmentation ActiveX qui dfinit et implmente le contrle ActiveX, un descendant de TActiveXControl. Ce contrle ActiveX est une implmentation entirement fonctionnelle qui ne ncessite aucun travail de votre part. Vous pouvez cependant modifier cette classe si vous voulez personnaliser les proprits, mthodes et vnements que le contrle ActiveX expose aux clients. Une unit et une fiche de bote de dialogue A propos, si vous lavez demand. Un fichier .LIC, si vous avez demand une licence.

Gnration dun contrle ActiveX bas sur une fiche VCL


A la diffrence des autres contrles ActiveX, les fiches actives ne sont pas dabord conues puis encapsules dans une classe enveloppe ActiveX. A la place, lexpert ActiveForm gnre une fiche vide que vous concevez aprs coup quand lexpert vous laisse dans le concepteur de fiche. Lorsquune fiche ActiveForm est dploye sur le Web, Delphi cre une page HTML pour contenir la rfrence la fiche ActiveForm et spcifier son emplacement dans la page. La fiche ActiveForm peut ensuite tre affiche et excute depuis un navigateur Web. Dans le navigateur Web, la fiche se comporte comme une fiche autonome Delphi. Elle peut contenir nimporte quel composant VCL ou ActiveX, y compris des contrles VCL personnaliss. Pour dmarrer lexpert ActiveForm :

1 Choisissez Fichier|Nouveau pour ouvrir la bote de dialogue Nouveaux lments. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne ActiveForm.
Lexpert ActiveForm ressemble lexpert contrle ActiveX mais vous ne spcifiez pas le nom de la classe VCL encapsuler. En effet, les fiches actives sont toujours bases sur TActiveForm. Comme dans lexpert contrle ActiveX, vous pouvez changer les noms par dfaut de la CoClasse, de lunit dimplmentation et du projet de bibliothque ActiveX. De mme lexpert vous permet dindiquer si vous voulez que votre

38-6

Guide du dveloppeur

Licences des contrles ActiveX

fiche active ncessite une licence, si elle doit contenir des informations de version et si vous voulez une fiche A propos. Quand vous sortez de lexpert, il gnre : Un fichier projet de bibliothque ActiveX qui contient le code ncessaire pour dmarrer un contrle ActiveX. Gnralement, vous ne modifierez pas ce fichier. Une bibliothque de types qui dfinit une CoClasse pour le contrle, linterface quelle expose aux clients et les dfinitions de types qui leurs sont ncessaires. Pour davantage dinformations sur la bibliothque de types, voir chapitre 34, Utilisation des bibliothques de types. Une fiche qui drive de TActiveForm. Cette fiche apparat dans le concepteur de fiche, ce qui vous permet de concevoir visuellement comment la fiche active apparatra aux clients. Son implmentation apparat dans lunit dimplmentation gnre. Dans la section initialisation de lunit dimplmentation, un fabricant de classe est cr, et il configure TActiveFormControl comme lenveloppe ActiveX de cette fiche. Une unit et une fiche de bote de dialogue A propos, si vous lavez demand. Un fichier .LIC, si vous avez demand une licence. Arriv l, vous pouvez ajouter des contrles la fiche et la concevoir votre guise. Une fois le projet ActiveForm conu et compil dans une bibliothque ActiveX (dextension OCX), vous pouvez dployer le projet sur votre serveur Web et Delphi cre une page HTML test contenant une rfrence la fiche active.

Licences des contrles ActiveX


Attribuer une licence un contrle ActiveX consiste fournir une cl de licence la conception et grer la cration dynamique de licences pour les contrles crs lexcution. Pour fournir des licences de conception, lexpert ActiveX cre une cl pour le contrle, stocke dans un fichier dextension LIC portant le mme nom que le projet. Ce fichier .LIC est ajout au projet. Lutilisateur du contrle doit disposer dune copie du fichier .LIC pour pouvoir utiliser le contrle dans son environnement de dveloppement. Chaque contrle dun projet pour lequel la case Licence de conception est coche dispose dune entre distincte dans le fichier LIC. Pour grer les licences lexcution, la classe enveloppe implmente deux mthodes, GetLicenseString et GetLicenseFilename. Elles renvoient, respectivement, la chane de licence du contrle et le nom du fichier .LIC. Quand une application hte tente de crer un contrle ActiveX, le fabricant de classe du contrle appelle ces mthodes et compare la chane renvoye par GetLicenseString la chane stocke dans le fichier .LIC.

Cration dun contrle ActiveX

38-7

Personnalisation de linterface du contrle ActiveX

Les licences dexcution pour Internet Explorer ncessitent un niveau supplmentaire dindirection, car lutilisateur peut visualiser le code source HTML de toutes les pages Web et un contrle ActiveX est copi sur son ordinateur avant quil ne soit affich. Pour crer des licences dexcution pour les contrles utiliss sous Internet Explorer, vous devez dabord gnrer un fichier paquet de licence (fichier LPK) et lincorporer dans la page HTML qui contient le contrle. Le fichier LPK est essentiellement un tableau de CLSID et de cls de licence.
Remarque

Pour gnrer le fichier LPK, utilisez lutilitaire LPK_TOOL.EXE, que vous pouvez tlcharger partir du site Web de Microsoft (www.microsoft.com). Pour incorporer le fichier LPK dans une page Web, utilisez les objets HTML, <OBJECT> et <PARAM>, comme suit :
<OBJECT CLASSID="clsid:6980CB99-f75D-84cf-B254-55CA55A69452"> <PARAM NAME="LPKPath" VALUE="ctrllic.lpk"> </OBJECT>

Le CLSID identifie lobjet en tant que paquet de licence et PARAM spcifie lemplacement relatif du fichier paquet de licence par rapport la page HTML. Lorsque Internet Explorer essaie dafficher la page Web contenant le contrle, il analyse le fichier LPK, extrait la cl de licence et, si celle-ci correspond la licence du contrle (renvoye par GetLicenseString), il restitue le contrle dans la page. Si plusieurs fichiers LPK sont inclus dans une page Web, Internet Explorer ne prend en compte que le premier. Pour plus dinformations, effectuez des recherches sur la dfinition de licences de contrles ActiveX sur le site Web de Microsoft.

Personnalisation de linterface du contrle ActiveX


Les experts contrle ActiveX et ActiveForm gnrent une interface par dfaut pour la classe enveloppe du contrle ActiveX. Cette interface par dfaut expose simplement les proprits, mthodes et vnements du contrle VCL dorigine ou de la fiche, avec les exceptions suivantes : Les proprits orientes donnes napparaissent pas. Comme les contrles ActiveX ont une autre manire dassocier des contrles aux donnes que les contrles VCL, lexpert ne convertit pas les proprits relatives aux donnes. Pour des informations sur la manire dobtenir des contrles ActiveX orients donnes, voir Activation de la liaison de donnes simple avec la bibliothque de types la page 38-12. Les proprits, mthodes ou vnements dont le type nest pas compatible avec lAutomation napparaissent pas. Vous pouvez les ajouter linterface du contrle ActiveX une fois que lexpert a termin. Vous pouvez ajouter, modifier ou supprimer les proprits, mthodes et vnements dun contrle ActiveX en modifiant la bibliothque de types. Vous pouvez utiliser lditeur de bibliothques de types comme dcrit dans le chapitre 34, Utilisation des bibliothques de types.Noubliez pas que si vous

38-8

Guide du dveloppeur

Personnalisation de linterface du contrle ActiveX

ajoutez des vnements, ils doivent tre ajouts linterface Events et non linterface par dfaut du contrle ActiveX.
Remarque

Vous pouvez ajouter des proprits non publies linterface de votre contrle ActiveX. De telles proprits peuvent tre dfinies lexcution et apparaissent dans lenvironnement de dveloppement, mais les modifications effectues ne sont pas persistantes. Donc, si lutilisateur du contrle modifie la valeur de la proprit la conception, les modifications ne sont pas prises en compte dans le contrle lexcution. Si la source est un objet VCL alors que la proprit nest pas dj publie, vous pouvez rendre la proprit persistente en crant un descendant de lobjet VCL et en publiant la proprit dans le descendant. Vous ntes pas oblig dexposer toutes les proprits, mthodes et vnements du contrle VCL aux applications htes. Vous pouvez utiliser lditeur de bibliothques de types pour les retirer des interfaces que lexpert a gnr. Quand vous retirez des proprits et mthodes dune interface en utilisant lditeur de bibliothques de types, lditeur ne les retire pas de la classe dimplmentation correspondante. Editez la classe enveloppe ActiveX dans lunit dimplmentation pour les en retirer une fois que vous avez modifi linterface dans lditeur de bibliothques de types.

Attention Astuce

Toutes les modifications effectues dans la bibliothque de types sont perdues si vous rgnrez le contrle ActiveX depuis le contrle ou la fiche VCL dorigine. Il est judicieux de tester les mthodes que lexpert ajoute votre classe enveloppe ActiveX. Cela vous donne lopportunit de vrifier o lexpert a omis des proprits orientes donnes ou des mthodes incompatibles avec lAutomation ; mais cela vous donne galement loccasion de dtecter les mthodes pour lesquelles lexpert na pas pu gnrer une implmentation. Ces mthodes apparaissent dans limplmentation avec un commentaire indiquant le problme.

Ajout de proprits, mthodes et vnements supplmentaires


Vous pouvez ajouter au contrle des proprits, mthodes et vnements supplmentaires par le biais de lditeur de bibliothques de types. La dclaration est automatiquement ajoute lunit dimplmentation, au fichier de bibliothque de types (TLB) et lunit de bibliothque de types du contrle. Ce que Delphi ajoute rellement dpend de ce que vous avez ajout : proprit ou mthode ou si vous avez ajout un vnement.

Ajout de proprits et de mthodes


La classe enveloppe ActiveX implmente les proprits dans son interface en utilisant des mthodes daccs en lecture et en criture. Cest--dire que la classe enveloppe a des proprits COM qui apparaissent dans une interface comme des mthodes get et/ou set. A la diffrence des proprits VCL, vous ne voyez pas une dclaration de proprit dans linterface des proprits COM. Vous ne voyez que les mthodes qui sont indiques comme mthodes daccs la proprit. Quand vous ajoutez une proprit linterface par dfaut du contrle ActiveX, la dfinition de la classe enveloppe (qui apparat dans le fichier unit _TLB

Cration dun contrle ActiveX

38-9

Personnalisation de linterface du contrle ActiveX

actualis par lditeur de bibliothques de types) est augmente dune ou deux nouvelles mthodes (une mthode get et/ou une mthode set). Vous devez implmenter comme si vous aviez ajout une mthode linterface, la classe enveloppe est augmente dune mthode correspondante que vous devez implmenter. Lajout de proprits linterface de la classe enveloppe revient donc ajouter des mthodes : le squelette de nouvelles implmentations de mthodes complter est ajout la dfinition de la classe enveloppe.
Remarque

Pour davantage dinformations sur ce qui apparat dans le fichier unit _TLB gnr, voir Code gnr par limportation des informations dune bibliothque de types la page 35-5. Par exemple, soit une proprit Caption de type TCaption dans lobjet VCL sousjacent. Pour ajouter cette proprit linterface de lobjet, entrez ce qui suit quand vous ajoutez une proprit linterface via lditeur de bibliothques de types :
property Caption: TCaption read Get_Caption write Set_Caption;

Delphi ajoute les dclarations suivantes la classe enveloppe :


function Get_Caption: WideString; safecall; procedure Set_Caption(const Value: WideString); safecall;

De plus, il ajoute les squelettes de mthodes dimplmentation suivants que vous devez complter :
function TButtonX.Get_Caption: WideString; begin end; procedure TButtonX.Set_Caption(Value: WideString); begin end;

Gnralement, vous pouvez implmenter ces mthodes par simple dlgation au contrle VCL associ auquel vous avez accs en utilisant le membre FDelphiControl de la classe enveloppe :
function TButtonX.Get_Caption: WideString; begin Result := WideString(FDelphiControl.Caption); end; procedure TButtonX.Set_Caption(const Value: WideString); begin FDelphiControl.Caption := TCaption(Value); end;

Dans certains cas, vous avez besoin dajouter du code pour convertir les types de donnes COM en types natifs Pascal Objet. Lexemple prcdent le fait en utilisant le transtypage.
Remarque

Comme les mthodes dune interface Automation sont dclares safecall, vous navez pas besoin dimplmenter le code dexception COM pour ces mthodes. Le compilateur Delphi gre cela pour vous en gnrant autour du corps des mthodes safecall le code permettant de capturer les exceptions Delphi et de les convertir en structures dinformation et en codes de retour des erreurs COM.

38-10

Guide du dveloppeur

Personnalisation de linterface du contrle ActiveX

Ajout dvnement
Le contrle ActiveX peut dclencher des vnements dans son conteneur de la mme manire quun objet automation dclenche des vnements dans ses clients. Ce mcanisme est dcrit dans Exposition dvnements aux clients la page 36-11. Si le contrle VCL que vous utilisez comme base pour votre contrle ActiveX a des vnements publis, lexpert ajoute automatiquement le traitement de la liste dvnements client la classe enveloppe ActiveX et dfinit la dispinterface de sortie que les clients doivent implmenter pour rpondre aux vnements. Pour ajouter un vnement dans lditeur de bibliothques de types, slectionnez linterface dvnement et cliquez sur licne de mthode. Ajoutez ensuite manuellement la liste de paramtres que vous voulez inclure par le biais de la page des paramtres. Dclarez ensuite une mthode dans la classe dimplmentation qui soit de mme type que le gestionnaire de lvnement dans le contrle VCL sous-jacent. Cela nest pas gnr automatiquement car Delphi ne sait pas quel gestionnaire dvnement vous utilisez :
procedure KeyPressEvent(Sender: TObject; var Key: Char);

Implmentez cette mthode pour utiliser le rcepteur dvnements de lapplication hte stock dans le membre FEvents de la classe enveloppe :
procedure TButtonX.KeyPressEvent(Sender: TObject; var Key: Char); var TempKey: Smallint; begin TempKey := Smallint(Key); {transtypage dans un type compatible OleAutomation } if FEvents <> nil then FEvents.OnKeyPress(TempKey) Key := Char(TempKey); end; Remarque

Si vous dclenchez des vnements dans un contrle ActiveX, vous navez pas besoin de parcourir une liste de rcepteurs dvnements car le contrle na quune seule application hte. Le processus est plus simple quavec la plupart des serveurs Automation. Enfin, vous devez attribuer ce gestionnaire dvnement au contrle VCL sousjacent afin quil soit appel quand lvnement se produit. Vous effectuez cette affectation dans la mthode InitializeControl :
procedure TButtonX.InitializeControl; begin FDelphiControl := Control as TButton; FDelphiControl.OnClick := ClickEvent; FDelphiControl.OnKeyPress := KeyPressEvent; end;

Cration dun contrle ActiveX

38-11

Personnalisation de linterface du contrle ActiveX

Activation de la liaison de donnes simple avec la bibliothque de types


Avec la liaison de donnes simple, vous pouvez lier une proprit de votre contrle ActiveX un champ dune base de donnes. Pour ce faire, le contrle ActiveX doit communiquer son application hte la valeur que reprsente le champ de donnes et quand elle est modifie. Vous activez cette communication en dfinissant les indicateurs de liaison de la proprit avec lditeur de bibliothques de types. Si vous spcifiez quune proprit est lie, quand un utilisateur modifie la proprit (par exemple, un champ dune base de donnes), le contrle notifie son conteneur (lapplication client hte) que la valeur a t modifie et demande que lenregistrement de la base de donnes soit actualis. Le conteneur interagit avec la base de donnes, puis notifie le contrle de la russite ou de lchec de lactualisation de lenregistrement.
Remarque

Cest lapplication conteneur accueillant votre contrle ActiveX qui est responsable de la connexion avec la base de donnes des proprits spcifies comme orients donnes dans la bibliothque de types. Pour des informations sur lcriture dun tel conteneur avec Delphi, voir Utilisation de contrles ActiveX orients donnes la page 35-9. Utilisez la bibliothque de types pour activer la liaison de donnes simple,

1 Dans la barre doutils, cliquez sur la proprit lier. 2 Choisissez la page Indicateurs. 3 Slectionnez les attributs de liaison suivants :
Attributs de liaison
Bindable

Description
Indique que la proprit supporte la liaison de donnes. Si elle est marque bindable, la proprit notifie son conteneur quand sa valeur a t modifie. Indique que la proprit supporte la notification OnRequestEdit. Cela permet au contrle de demander au conteneur si sa valeur peut tre modifie par lutilisateur. Indique que le conteneur peut montrer aux utilisateurs que cette proprit est bindable. Indique la proprit bindable qui reprsente le mieux lobjet. Les proprits qui ont cet attribut de liaison par dfaut doivent avoir aussi lattribut bindable. On ne peut pas spcifier plusieurs proprits de ce type dans une dispinterface. Chacune des proprits bindable dune fiche peut bnficier de ce comportement. Quand ce bit est dfini, toutes les modifications sont notifies. Les bits Bindable et Request Edit doivent tre dfinis pour que cet attribut prenne effet.

Request Edit

Display Bindable Default Bindable

Immediate Bindable

4 Cliquez sur le bouton Rafrachir de la barre doutils pour actualiser la bibliothque de types.

38-12

Guide du dveloppeur

Cration dune page de proprits pour un contrle ActiveX

Pour pouvoir tester un contrle dont la liaison de donnes est active, vous devez dabord le recenser. Par exemple, pour lier un contrle TEdit aux donnes dun contrle ActiveX, crez le contrle ActiveX partir dun TEdit, puis modifiez les indicateurs de la proprit Text en Bindable, Display Bindable, Default Bindable et Immediate Bindable. Une fois le contrle recens et import, il peut tre utilis pour afficher les donnes.

Cration dune page de proprits pour un contrle ActiveX


Une page de proprits est une bote de dialogue similaire linspecteur dobjets Delphi qui permet aux utilisateurs de modifier les proprits dun contrle ActiveX. Un dialogue de page de proprits sert regrouper plusieurs proprits dun contrle afin de les modifier ensemble ou grer des proprits complexes. En gnral, les utilisateurs accdent la page des proprits en cliquant sur le contrle ActiveX avec le bouton droit de la souris et en choisissant Proprits. Le processus de cration dune page de proprits est similaire celui dune fiche :

1 Cration dune nouvelle page de proprits. 2 Ajout de contrles la page de proprits. 3 Association des contrles de la page de proprits aux proprits dun contrle ActiveX. 4 Connexion de la page de proprits au contrle ActiveX.
Remarque

Quand des proprits sont ajoutes un contrle ActiveX ou une fiche ActiveForm, vous devez publier les proprits dont vous voulez quelles persistent. Si ces proprits ne sont pas publies dans le contrle VCL sousjacent, vous devez crer un descendant personnalis du contrle VCL qui redclare les proprits comme publies, et utiliser lexpert contrle ActiveX pour crer le contrle ActiveX partir de cette classe drive.

Cration dune nouvelle page de proprits


Pour crer une nouvelle page de proprits, utilisez lexpert Page proprits. Pour crer une nouvelle page de proprits,

1 Choisissez Fichier|Nouveau. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne Page proprits.
Lexpert cre une nouvelle fiche et lunit dimplmentation de la page de proprits. La fiche est un descendant de TPropertyPage qui vous permet dassocier la fiche avec le contrle ActiveX dont il modifie les proprits.

Cration dun contrle ActiveX

38-13

Cration dune page de proprits pour un contrle ActiveX

Ajout de contrles une page de proprits


Vous devez ajouter la page de proprits un contrle pour chaque proprit du contrle ActiveX auquel lutilisateur doit avoir accs. Par exemple, la figure suivante illustre la configuration de la page de proprits pour un contrle ActiveX MaskEdit.
Figure 38.1 Page de proprits MaskEdit en mode conception

La bote liste permet lutilisateur de slectionner parmi une liste de modles exemple. Les contrles de saisie permettent lutilisateur de tester le masque avant de lappliquer au contrle ActiveX.

Association des contrles de la page de proprits aux proprits du contrle ActiveX


Une fois tous les contrles ncessaires ajouts la page de proprits, il faut associer chaque contrle la proprit correspondante. Cette association seffectue en ajoutant du code lunit implmentant la page de proprits. Prcisment, il faut ajouter du code aux mthodes UpdatePropertyPage et UpdateObject.

Actualisation de la page de proprits


Ajoutez du code la mthode UpdatePropertyPage pour mettre jour le contrle de la page de proprits quand les proprits du contrle ActiveX changent. Vous devez ajouter du code la mthode UpdatePropertyPage pour actualiser la page de proprits avec les valeurs en cours des proprits du contrle ActiveX. Vous pouvez accder au contrle ActiveX en utilisant la proprit OleObject de la page de proprits qui est un OleVariant contenant linterface du contrle ActiveX. Par exemple, le code suivant actualise le contrle bote de saisie (InputMask) de la page de proprits avec la valeur en cours de la proprit EditMask du contrle ActiveX:
procedure TPropertyPage1.UpdatePropertyPage; begin { Update your controls from OleObject } InputMask.Text := OleObject.EditMask; end;

38-14

Guide du dveloppeur

Recensement dun contrle ActiveX

Remarque

Il est galement possible dcrire une page de proprits qui reprsente plusieurs contrles ActiveX. Dans ce cas, nutilisez pas la proprit OleObject. Vous devez, la place, parcourir la liste des interfaces qui est gre par la proprit OleObjects.

Actualisation de lobjet
Ajoutez du code la mthode UpdateObject pour mettre jour la proprit quand lutilisateur modifie les contrles de la page de proprits. Vous devez ajouter du code la mthode UpdateObject afin de dfinir la nouvelle valeur des proprits du contrle ActiveX. Utilisez la proprit OleObject pour accder au contrle ActiveX. Par exemple, le code suivant affecte la proprit EditMask dun contrle ActiveX en utilisant la valeur du contrle bote de saisie (InputMask) de la page de proprits :
procedure TPropertyPage1.UpdateObject; begin {Mettre jour OleObject partir de votre contrle } OleObject.EditMask := InputMask.Text; end;

Connexion dune page de proprits un contrle ActiveX


Pour connecter une page de proprits un contrle ActiveX,

1 Ajoutez DefinePropertyPage, avec la constante GUID de la page de proprits comme paramtre, limplmentation de la mthode DefinePropertyPages dans limplmentation des contrles de lunit. Par exemple,
procedure TButtonX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); begin DefinePropertyPage(Class_PropertyPage1); end;

La constante GUID, Class_PropertyPage1, de la page de proprits peut tre trouve dans lunit des pages de proprits. Le GUID est dfini dans lunit dimplmentation de la page de proprits ; il est gnr automatiquement par lexpert Page proprits.

2 Ajoutez lunit de la page de proprits la clause uses de lunit dimplmentation des contrles.

Recensement dun contrle ActiveX


Une fois le contrle ActiveX cr, il faut le recenser afin que dautres applications puissent le trouver et lutiliser. Pour recenser un contrle ActiveX : Choisissez Excuter|Recenser le serveur ActiveX.

Cration dun contrle ActiveX

38-15

Test dun contrle ActiveX

Remarque

Avant de retirer un contrle ActiveX de votre systme, vous devez annuler son recensement. Pour annuler le recensement dun contrle ActiveX : Choisissez Excuter|D recenser le serveur ActiveX. Comme alternative, vous pouvez utiliser tregsvr sur la ligne de commande ou excuter le regsvr32.exe du systme dexploitation.

Test dun contrle ActiveX


Pour tester votre contrle, ajoutez-le un paquet et importez-le comme contrle ActiveX. Cette procdure ajoute le contrle ActiveX la palette des composants de Delphi. Vous pouvez alors dposer le contrle dans une fiche et le tester. Votre contrle doit galement tre test avec toutes les applications cible utilisant ce contrle. Pour dboguer le contrle ActiveX, slectionnez Excuter|Paramtres et entrez le nom de lapplication client dans la bote de saisie Application hte. Les paramtres sappliquent ensuite lapplication hte. La slection de Excuter|Excuter dmarre lapplication hte ou client et permet de dfinir des points darrts dans le contrle.

Dploiement dun contrle ActiveX sur le Web


Avant de pouvoir utiliser dans des clients Web les contrles ActiveX que vous avez crs, ils doivent tre dploys sur le serveur Web. A chaque fois que vous modifiez le contrle ActiveX, vous devez le recompiler et le redployer afin que les applications client voient les modifications. Avant de dployer un contrle ActiveX, vous devez disposer dun serveur Web rpondant aux messages du client. Pour dployer un contrle ActiveX :

1 Slectionnez Projet|Options de dploiement Web. 2 Dans la page Projet, dfinissez dans la zone Rpertoire destination lemplacement de la DLL du contrle ActiveX (sous la forme dun chemin sur le serveur Web). Cela peut tre un chemin daccs local ou un chemin daccs UNC, par exemple, C:\INETPUB\wwwroot. 3 Dfinissez dans URL destination, lemplacement sur le serveur Web (sous la forme dune URL) de la DLL du contrle ActiveX (sans le nom de fichier), par exemple, http://mymachine.inprise.com/. Voir la documentation de votre serveur Web pour davantage dinformations sur la manire de procder. 4 Dfinissez dans Rpertoire HTML lemplacement (sous la forme dun chemin daccs) o doit tre plac le fichier HTML contenant une rfrence au

38-16

Guide du dveloppeur

Dploiement dun contrle ActiveX sur le Web

contrle ActiveX, par exemple, C:\INETPUB\wwwroot. Ce chemin daccs peut tre un chemin daccs standard ou un chemin daccs UNC.

5 Dfinissez les options de dploiement Web souhaites, comme dcrit dans Paramtrage des options la page 38-17. 6 Choisissez OK. 7 Choisissez Projet|Dploiement Web.
Cela cre la base du code de dploiement contenant le contrle ActiveX dans une bibliothque ActiveX (ayant lextension OCX). Selon les options que vous avez spcifies, cette base du code de dploiement peut aussi contenir un fichier cabinet (ayant lextension CAB) ou dinformation (ayant lextension INF). La bibliothque ActiveX est place dans le rpertoire destination spcifi ltape 2. Le fichier HTML porte le mme nom que le projet mais avec lextension .HTM. Il est cr dans le rpertoire HTML spcifi ltape 4. Le fichier HTML contient une URL faisant rfrence la bibliothque ActiveX lemplacement spcifi ltape 3.
Remarque

Si vous voulez placer ces fichiers sur votre serveur Web, utilisez un utilitaire externe comme ftp.

8 Appelez votre navigateur Web grant ActiveX et visualisez la page HTML ainsi cre.
Quand cette page HTML est visualise dans le navigateur Web, la fiche ou le contrle est affich et excut comme application incorpore dans le navigateur. Cest--dire que la bibliothque sexcute dans le mme processus que lapplication navigateur.

Paramtrage des options


Avant de dployer un contrle ActiveX, vous devez spcifier les options de dploiement Web qui doivent tre employes pour crer la bibliothque ActiveX. Les options de dploiement Web comprennent des paramtres comme : Dployer les fichiers supplmentaires : Si votre contrle ActiveX dpend dautres paquets ou fichiers, vous pouvez indiquer si ceux-ci doivent tre dploys avec le projet. Par dfaut, ces fichiers utilisent les mmes options que celles dfinies pour le projet mme, mais vous pouvez redfinir ce paramtrage en utilisant les onglets Paquets et Fichiers supplmentaires. Quand vous incluez les paquets et fichiers supplmentaires, Delphi cre un fichier dextension .INF (pour INFormation). Ce fichier spcifie les divers fichiers ncessaires tlcharger et configurer pour pouvoir excuter la bibliothque ActiveX. La syntaxe des fichiers INF accepte lutilisation dURL pointant sur les paquets ou fichiers supplmentaires tlcharger. Utiliser la compression de fichier CAB : Un cabinet est un seul fichier, portant gnralement lextension CAB, qui stocke les fichiers compresss dans une bibliothque de fichiers. La compression de ces fichiers rduit, en gnral,

Cration dun contrle ActiveX

38-17

Dploiement dun contrle ActiveX sur le Web

considrablement les temps de tlchargement (jusqu 70%). Lors de linstallation, le navigateur dcompresse les fichiers stocks dans une archive et les copie sur le systme de lutilisateur. Les fichiers que vous dployez peuvent tre des archives .CAB compresses. Chaque fichier dploy peut tre un fichier compress CAB. Vous pouvez spcifier que la bibliothque ActiveX utilise la compression de fichier CAB dans longlet Projet de la bote de dialogue Options de dploiement Web. Informations de version : Vous pouvez demander inclure les informations de version dans le contrle ActiveX. Ces informations sont dfinies dans la page Informations de version de la bote de dialogue Options du projet. Parmi ces informations, il y a le numro de version qui peut tre actualis automatiquement chaque fois que vous dployez votre contrle ActiveX. Si vous incluez dautres paquets ou fichiers, leurs ressources dinformations de version peuvent galement tre ajoutes au fichier INF. Si vous choisissez dajouter des fichiers supplmentaires ou si vous utilisez la compression de fichier CAB, la bibliothque ActiveX rsultant peut prendre la forme dun fichier OCX, dun fichier CAB contenant un fichier OCX ou dun fichier INF. Le tableau suivant rsume le rsultat obtenu avec les diffrentes combinaisons.
Paquets et/ou fichiers suppl mentaires
Non Non Oui Oui

Compression de fichier CAB


Non Oui Non Oui

Rsultat
Un fichier bibliothque ActiveX (OCX). Un fichier CAB contenant un fichier bibliothque ActiveX. Un fichier INF, un fichier bibliothque ActiveX et tous les paquets et/ou fichiers supplmentaires. Un fichier INF, un fichier CAB contenant un fichier bibliothque ActiveX et un fichier CAB pour chacun des fichiers et paquets supplmentaires.

38-18

Guide du dveloppeur

39
Chapitre 39

Chapitre

Cration dobjets MTS ou COM+

Delphi utilise le terme objet transactionnel pour dsigner des objets qui utilisent les services de transaction, la scurit et la gestion des ressources proposs par Microsoft Transaction Server (MTS) (pour les versions de Windows antrieures Windows 2000) ou par COM+ (pour Windows 2000 ou plus). Ces objets sont conus pour fonctionner dans un environnement distribu important. Ils ne sont pas disponibles dans les applications multiplate-formes cause de leur dpendance par rapport la technologie spcifique Windows. Delphi propose un expert qui cre des objets transactionnels afin que vous puissiez tirer profit des avantages des attributs COM+ ou de lenvironnement MTS. Ces possibilits rendent particulirement simple la cration et limplmentation de clients et de serveurs COM, en particulier les serveurs distants.
Remarque

Pour les applications de bases de donnes, Delphi propose galement un module de donnes transactionnel. Pour davantage dinformations, voir chapitre 25, Cration dapplications multiniveaux. Les objets transactionnels procurent un certain nombre de services de base, tels que : Gestion des ressources systme, y compris processus, threads et connexions aux bases de donnes, afin que votre application serveur puisse grer de nombreux utilisateurs simultans. Initialisation et contrle des transactions automatiques afin que votre application soit fiable. Cration, excution et suppression des composants serveur si ncessaire. Utilisation de la scurit en fonction des rles afin que seuls les utilisateurs autoriss puissent accder votre application. Gestion des vnements afin que les clients puissent rpondre des conditions se produisant sur le serveur (COM+ uniquement).

Cration dobjets MTS ou COM+

39-1

Principe des objets transactionnels

En fournissant ces services fondamentaux, MTS ou COM+ vous laisse vous concentrer sur ce qui est spcifique votre propre application distribue. La technologie utilise (MTS ou COM+) dpend du serveur sur lequel vous excutez votre application. Pour les clients, la diffrence entre les deux (ou mme le fait que lobjet serveur utilise lun de ces services) est transparente, sauf si le client manipule explicitement des services transactionnels via une interface spciale.

Principe des objets transactionnels


Habituellement, les objets transactionnels sont de petite taille et servent des fonctions de gestion particulires. Ils peuvent implmenter les rgles de gestion dune application, en fournissant les vues et les transformations de ltat de lapplication. Considrons lexemple dune application mdicale destine un mdecin. Les enregistrements mdicaux stocks dans plusieurs bases de donnes donnent ltat permanent de lapplication, par exemple lhistorique de la sant des patients. Les objets transactionnels mettent jour cet tat afin quil reflte les modifications qui lui sont apportes, par exemple les nouveaux patients, les rsultats danalyses sanguines ou les fichiers des radiographies. Les objets transactionnels diffrent des autres objets COM en ce quils utilisent un ensemble dattributs fournis par MTS ou COM+ pour grer les situations se produisant dans un environnement de calcul distribu. Certains de ces attributs imposent que lobjet transactionnel implmente linterface IObjectControl. IObjectControl dfinit des mthodes qui sont appeles quand lobjet est activ ou dsactiv et qui vous permettent de grer des ressources telles que les connexions aux bases de donnes. Elle est galement ncessaire pour le regroupement dobjets, dcrit dans Regroupement dobjets la page 39-9.
Remarque

Si vous utilisez MTS, vos objets transactionnels doivent implmenter IObjectControl. Avec COM+, IObjectControl nest pas obligatoire, mais reste fortement conseille. Lexpert Objet transactionel fournit un objet qui drive de IObjectControl. Le client dun objet transactionnel est appel un client de base. Pour un client de base, un objet transactionnel nest pas diffrent dun autre objet COM. Avec MTS, lobjet transactionnel doit tre gnr dans une bibliothque (DLL) installe dans lenvironnement dexcution MTS (lexcutable MTS, mtxex.exe). Cela signifie que lobjet serveur est excut dans lespace de processus dexcution MTS. Lexcutable MTS peut tre excut dans le mme processus que le client de base, dans un processus distinct de la mme machine ou comme processus serveur distant sur une machine distincte. Avec COM+, lapplication serveur na pas besoin dtre un serveur en processus. Comme les diffrents services ne sont pas intgrs dans les bibliothques COM, il ny a pas besoin dun processus MTS spar pour intercepter les appels adresss au serveur. Cest COM (ou plus exactement COM+) qui se charge de la gestion des ressources, des transactions, etc. Nanmoins, lapplication serveur doit toujours tre installe, mais cette fois dans une application COM+.

39-2

Guide du dveloppeur

Principe des objets transactionnels

La connexion entre le client de base et lobjet transactionnel est gre par un proxy ct client et par un stub ct serveur, comme pour tous les serveurs hors processus. Les informations sur la connexion sont gres par le proxy. La connexion entre le client de base et le proxy reste ouverte aussi longtemps que le client demande la connexion au serveur. De ce fait, le client crot quil bnficie dun accs continu au serveur. En ralit, le proxy peut dsactiver et ractiver lobjet, conservant des ressources pour que les autres clients puissent utiliser la connexion. Pour plus dinformations sur lactivation et la dsactivation, voir Activation juste--temps la page 39-4.

Contraintes dun objet transactionnel


En sus des exigences de COM, un objet transactionnel doit respecter les contraintes suivantes : Lobjet doit avoir un fabricant de classe standard. Il est fourni automatiquement par lexpert quand vous crez lobjet. Le serveur doit prsenter son objet classe en exportant la mthode standard DllGetClassObject. Le code effectuant ceci est gnr par lexpert. Toutes les interfaces et les coclasses du composant doivent tre dcrites par une bibliothque de types, fournie par lexpert. Vous pouvez ajouter des mthodes et proprits la bibliothque de types en utilisant lditeur de bibliothques de types. La bibliothque de types est utilise par lexplorateur MTS ou le gestionnaire de composants COM+ pour en extraire les informations concernant les composants installs au cours de lexcution. Le serveur peut exporter uniquement les interfaces utilisant le marshalling COM standard automatiquement fourni par lexpert Objet transactionnel. La gestion Delphi des objets transactionnels ne permet pas le marshalling manuel des interfaces personnalises. Toutes les interfaces doivent tre implmentes sous la forme dinterfaces doubles qui utilisent la gestion automatique du marshalling par COM. Le serveur doit exporter la fonction DllRegisterServer et effectuer lautorecensement de ses CLSID, ProgID, interfaces et bibliothque de types dans cette routine. Tout cela est fourni par lexpert objet transactionnel. Si vous utilisez MTS et non COM+, les conditions suivantes sappliquent en plus : MTS ncessite que le composant soit une DLL. Les serveurs implments en tant quexcutables (fichiers .EXE) ne peuvent pas sexcuter dans lenvironnement dexcution MTS. Lobjet doit implmenter linterface IObjectControl. La gestion de cette interface est ajoute automatiquement par lexpert objet transactionnel. Un serveur excut dans lespace de processus MTS ne peut pas sagrger des objets COM qui ne sont pas excuts dans MTS.

Cration dobjets MTS ou COM+

39-3

Gestion des ressources

Gestion des ressources


Il est possible dadministrer les objets transactionnels afin de grer au mieux les ressources utilises par votre application. Ces ressources sont aussi bien la mmoire utilise par les instances dobjets elles-mmes que toutes les ressources quelles utilisent (comme les connexions aux bases de donnes). Gnralement, vous dterminez la manire dont votre application gre les ressources par la faon dont vous installez et configurez votre objet. Vous pouvez configurer votre objet transactionnel afin quil b nficie des caractristiques suivantes : Activation juste--temps Regroupement des ressources Regroupement dobjets (COM+ uniquement) Mais, pour que votre objet puisse pleinement bnficier des avantages de ces services, vous devez utiliser linterface IObjectContext pour indiquer quel moment les ressources peuvent tre libres en toute scurit.

Accs au contexte dun objet


Comme tout objet COM, un objet transactionnel doit tre cr avant dtre utilis. Les clients COM crent un objet en appelant la fonction CoCreateInstance de la bibliothque COM. Chaque objet transactionnel doit correspondre un objet de contexte. Cet objet de contexte est implment automatiquement par MTS et COM+. Il est utilis pour grer lobjet transactionnel. Linterface de lobjet de contexte est IObjectContext. Pour accder la majorit des mthodes de lobjet de contexte, vous pouvez utiliser la proprit ObjectContext de lobjet TMtsAutoObject. Par exemple, vous pouvez utiliser la proprit ObjectContext comme suit :
if ObjectContext.IsCallerInRole (Manager) ...

Il existe une autre faon daccder lobjet de contexte : utiliser les mthodes de lobjet TMtsAutoObject :
if IsCallerInRole (Manager) ...

Vous pouvez utiliser lune ou lautre des mthodes prcdentes. Cependant, il existe un lger avantage utiliser les mthodes TMtsAutoObject plutt qu faire rfrence la proprit ObjectContext lorsque vous testez votre application. Pour la prsentation de ces diffrences, voir D bogage et test des objets transactionnels la page 39-23.

Activation juste--temps
La capacit dun objet tre dsactiv et ractiv alors que des clients continuent lui faire rfrence est nomme activation juste--temps. Vu du client, il existe une seule instance de lobjet partir du moment o le client la cre et jusquau

39-4

Guide du dveloppeur

Gestion des ressources

moment o il la libre. En ralit, il se peut que lobjet ait t dsactiv et ractiv de nombreuses fois. Les objets pouvant tre ainsi dsactivs, les clients peuvent continuer de faire rfrence un objet pendant un temps indtermin sans affecter les ressources du systme. Lorsquun objet devient dsactiv, toutes les ressources de lobjet sont libres. Ainsi quand un objet est dsactiv, sa connexion la base de donnes est libre et utilisable par dautres clients. Un objet transactionnel est cr ltat dsactiv et ne devient actif qu la rception dune requte dun client. Quand lobjet transactionnel est cr, un objet de contexte est galement cr. Cet objet de contexte existe pendant lintgralit de la dure de vie de lobjet transactionnel correspondant, pendant un ou plusieurs cycles de ractivation. Lobjet de contexte, accessible via linterface IObjectContext permet de conserver une trace de lobjet quand il est dsactiv ou pendant les transactions de coordination. Les objets transactionnels sont dsactivs ds que cela peut se faire sans risque. Cest la dsactivation ds-que-possible. Un objet transactionnel est dsactiv lorsquun des vnements suivants se produit : Lobjet demande la dsactivation avec SetComplete ou SetAbort : Un objet appelle la mthode SetComplete de IObjectContext lorsquil a termin son travail avec succs et qu il na pas besoin de sauver ltat interne de lobjet pour un prochain appel du client. Un objet appelle SetAbort pour indiquer quil ne peut terminer son travail avec succs et que ltat de lobjet na pas besoin dtre sauv, cest--dire que lobjet reprend ltat quil avait avant la transaction. Souvent, les objets sont conus sans tat, ce qui signifie que les objets sont dsactivs aprs le retour de toutes les mthodes. Une transaction est valide ou annule : Lorsqu une transaction sur un objet est valide ou annule, lobjet est dsactiv. Parmi ces objets dsactivs, les seuls qui continuent exister sont ceux qui des clients hors transaction sont en train de faire rfrence. Les prochains appels ces objets les ractivent et les font sexcuter dans la prochaine transaction. Le dernier client libre lobjet : Bien s r, lorsquun client libre lobjet, il est dsactiv et lobjet de contexte galement.
Remarque

Quand vous installez un objet transactionnel sous COM+ depuis lEDI, vous pouvez spcifier si lobjet utilise lactivation juste--temps en utilisant la page COM+ de lditeur de bibliothques de types. Slectionnez lobjet (CoClasse) dans lditeur de bibliothques de types, allez sur la page COM+ et cochez ou non la case Activation Just In Time. Sinon, un administrateur systme peut spcifier cet attribut en utilisant le gestionnaire de composants COM+ ou lExplorateur MTS (ladministrateur systme peut galement redfinir tous les paramtres que vous avez spcifis en utilisant lditeur de bibliothques de types).

Regroupement des ressources


Comme les ressources systme inactives libres lors de la dsactivation, les ressources libres sont disponibles pour dautres objets serveur. Ainsi, une

Cration dobjets MTS ou COM+

39-5

Gestion des ressources

connexion une base de donnes qui nest plus utilise par un objet serveur peut tre rutilise par un autre client. Cest ce que lon appelle le regroupement des ressources. Les ressources regroupes sont gres par un fournisseur de ressources. Un fournisseur de ressources place les ressources dans un cache, afin que les objets transactionnels installs ensemble puissent les partager. Le fournisseur de ressources gre galement les informations dtat partages non permanentes. Ainsi, les fournisseurs de ressources fonctionnent de la mme manire que les gestionnaires de ressources (comme SQL Server) mais sans garantir la permanence. Pour crire vos objets transactionnels, vous pouvez utiliser deux types de fournisseurs de ressources dj dfinis : Les fournisseurs de ressources base de donnes Le gestionnaire de proprits partages Avant que dautres objets puissent utiliser des ressources regroupes, vous devez explicitement les librer.

Fournisseurs de ressources base de donnes


Louverture et la fermeture de connexions de bases de donnes est une opration qui demande du temps. En utilisant un fournisseur de ressources pour regrouper les connexions de bases de donnes, votre objet peut rutiliser des connexions de bases de donnes au lieu den crer de nouvelles. Si, par exemple, vous utilisez une rfrence de base de donnes et un composant de mise jour de la base dans une application de gestion des clients, vous pouvez installer ces composants ensembles. Ainsi, ils peuvent partager les connexions de bases de donnes. De cette manire, votre application na pas besoin davoir un grand nombre de connexions et les nouvelles instances dobjets peuvent accder aux donnes plus rapidement en utilisant une connexion dj ouverte mais inutilise. Si vous utilisez les composants BDE pour vous connecter aux donnes, le fournisseur de ressources est le moteur de bases de donnes Borland (BDE). Ce fournisseur de ressources est disponible uniquement quand votre objet transactionnel est install dans MTS. Pour activer le fournisseur de ressources, utilisez le programme dadministration BDE pour activer loption MTS POOLING dans la zone de configuration Systme/Init. Si vous utilisez les composants base de donnes ADO pour vous connecter vos donnes, le fournisseur de ressources est fourni par ADO.
Remarque

Il ny a pas de fournisseur de ressources prdfini si vous utilisez les composants InterbaseExpress pour accder vos donnes. Pour les modules de donnes transactionnels distants, les connexions sont automatiquement intgres dans des objets transactions et le fournisseur de ressources peut automatiquement rcuprer et rutiliser les connexions.

39-6

Guide du dveloppeur

Gestion des ressources

Gestionnaire de proprits partages


Le gestionnaire de proprits partages est un fournisseur de ressources que vous pouvez utiliser pour partager un tat entre plusieurs objets au sein dun processus serveur. Le gestionnaire de proprits partages vous vite lajout votre application dune grande quantit de code pour grer les donnes partages : le gestionnaire de proprits partages conserve ltat des objets en implmentant des verrous et des smaphores afin de protger des accs simultans les proprits partages. Le gestionnaire de proprits partages vite les conflits de noms en utilisant des groupes de proprits partages qui tablissent des domaines dappellation uniques pour les proprits partages quils contiennent. Pour utiliser la ressource gestionnaire de proprits partages, utilisez dabord la fonction daide CreateSharedPropertyGroup pour crer un groupe de proprits partages. Ensuite, vous pouvez crire et lire toutes les proprits de ce groupe. En utilisant un groupe de proprits partages, les informations de ltat sont sauvegardes au travers de toutes les dsactivations de lobjet transactionnel. En outre, les informations dtat peuvent tre partages entre tous les objets transactionnels installs dans le mme paquet. Vous pouvez installer les objets transactionnels dans un paquet comme dcrit dans Installation dobjets transactionnels la page 39-24. Pour que les objets puissent partager un tat, ils doivent sexcuter dans le mme processus. Si vous voulez que des instances de diffrents composants partagent des proprits, vous devez installer les composants dans le mme paquet MTS ou la mme application COM+. Mais comme les administrateurs risquent de dplacer les composants dun paquet un autre, le plus sr est de limiter lutilisation dun groupe de proprits partages aux instances des composants dfinies dans la mme DLL ou le mme EXE. Les composants partageant des proprits doivent avoir le mme attribut dactivation. Si deux composants du mme paquet ont des attributs dactivation diffrents, ils ne pourront gnralement pas partager de proprits. Par exemple, si un composant est configur pour sexcuter dans un processus client et lautre dans un processus serveur, leurs objets sexcuteront habituellement dans des processus diffrents, mme sils appartiennent au mme paquet MTS ou la mme application COM+. Lexemple suivant illustre la manire dajouter du code pour grer le gestionnaire de proprits partages dans un objet transactionnel.

Exemple : partage de proprits entre les instances dun objet transactionnel


Lexemple suivant cre un groupe de proprits appel MyGroup afin quil contienne les proprits partager entre les objets et les instances des objets. Cet exemple illustre le partage dune proprit appele Counter. Il utilise la fonction utilitaire CreateSharedPropertyGroup pour crer le gestionnaire du groupe de proprits et le groupe de proprits, puis la mthode CreateProperty de lobjet Group pour crer la proprit Counter.

Cration dobjets MTS ou COM+

39-7

Gestion des ressources

Pour obtenir la valeur dune proprit, utilisez la mthode PropertyByName de lobjet Group, comme ci-dessous. Vous pouvez galement utiliser la mthode PropertyByPosition .
unit Unit1; interface uses MtsObj, Mtx, ComObj, Project2_TLB; type Tfoobar = class(TMtsAutoObject, Ifoobar) private Group: ISharedPropertyGroup; protected procedure OnActivate; override; procedure OnDeactivate; override; procedure IncCounter; end; implementation uses ComServ; { Tfoobar } procedure Tfoobar.OnActivate; var Exists: WordBool; Counter: ISharedProperty; begin Group := CreateSharedPropertyGroup(MyGroup); Counter := Group.CreateProperty(Counter, Exists); end; procedure Tfoobar.IncCounter; var Counter: ISharedProperty; begin Counter := Group.PropertyByName[Counter]; Counter.Value := Counter.Value + 1; end; procedure Tfoobar.OnDeactivate; begin Group := nil; end; initialization TAutoObjectFactory.Create(ComServer, Tfoobar, Class_foobar, ciMultiInstance, tmApartment); end.

Libration des ressources


Vous tes responsable de la libration des ressources dun objet. Habituellement, vous le faites en appelant les mthodes SetComplete et SetAbort de IObjectContext aprs avoir servi la demande de chaque client. Ces mthodes librent les ressources alloues par le fournisseur de ressources. Au mme moment, vous devez librer les rfrences toutes les autres ressources, y compris les rfrences aux autres objets (notamment les objets

39-8

Guide du dveloppeur

Support transactionnel MTS et COM+

transactionnels et les objets de contexte) ainsi que la mmoire occupe par toutes les instances du composant (libration du composant). La seule fois o vous omettrez ces appels, cest lorsque vous voudrez maintenir ltat entre les appels client. Pour plus dinformations, voir Objets avec tat et sans tat la page 39-12.

Regroupement dobjets
Tout comme vous pouvez regrouper des ressources, vous pouvez avec COM+ regrouper des objets. Quand un objet est dsactiv, COM+ appelle la mthode CanBePooled de linterface, qui indique que lobjet peut tre regroup afin dtre rutilis. Si CanBePooled renvoie True, au lieu dtre dtruit quand il est dsactiv, lobjet est dplac dans le groupe dobjets. Il y reste pour une dure limite durant laquelle il est disponible si un client en fait la demande. Cest seulement quand le groupe dobjets est vide quune nouvelle instance de lobjet est cre. Les objets qui renvoient False ou qui ne grent pas linterface IObjectControl sont dtruits quand il sont dsactivs. Le regroupement dobjets nest pas disponible avec MTS. MTS appelle CanBePooled comme indiqu, mais le regroupement nest pas effectu. Si votre objet est utilis uniquement avec COM+ et si vous voulez utiliser le regroupement dobjets, dfinissez la proprit Pooled True. Mme si la mthode CanBePooled dun objet renvoie True, il peut tre configur afin que COM+ ne le place pas dans le regroupement dobjets. Si vous installez lobjet transactionnel dans COM+ depuis lEDI, vous pouvez spcifier si COM+ doit essayer de regrouper lobjet en utilisant la page COM+ de lditeur de bibliothques de types. Slectionnez lobjet (la coclasse) dans lditeur de bibliothques de types, allez sur la page COM+ et cochez ou non la case Pooling dobjets. Par ailleurs, un administrateur systme peut spcifier cet attribut en utilisant le gestionnaire de composant COM+. De la mme faon, vous pouvez configurer la dure durant laquelle un objet dsactiv reste dans le regroupement dobjets avant dtre libr. Pour ce faire, utilisez le paramtre Dlai maxi de cration dans la page COM+ de lditeur de bibliothques de types. Ici encore, ladministrateur systme peut spcifier cet attribut en utilisant le gestionnaire de composants COM+.

Support transactionnel MTS et COM+


Le support des transactions qui donne aux objets transactionnels leur nom permet de grouper des actions au sein des transactions. Par exemple, dans une application de dossiers mdicaux, si vous avez un composant Transfert pour transfrer des dossiers dun mdecin lautre, vous pouvez avoir vos mthodes Ajouter et Supprimer dans la mme transaction. De cette faon, soit lintgralit de Transfert fonctionne, soit il peut tre ramen son tat prcdent. Les transactions simplifient les corrections derreurs dans les applications devant accder plusieurs bases de donnes.

Cration dobjets MTS ou COM+

39-9

Support transactionnel MTS et COM+

Les transactions garantissent ce qui suit : Toutes les mises jour dune mme transaction sont soit valides, soit annules et ramenes leur tat prcdent. Cest ce que lon appelle atomicit . Une transaction est une transformation correcte de ltat dun systme, en maintenant les invariants de cet tat. Cest ce que lon appelle consistance. Les transactions simultanes ne voient pas les rsultats partiels et non valids les unes des autres afin de ne pas crer dincohrences dans ltat de lapplication. Cest ce que nous appelons isolation. Les gestionnaires de ressources utilisent des protocoles de synchronisation bass sur les transactions pour isoler les travaux non valids des transactions actives. Les mises jour valides des ressources gres (comme les enregistrements dune base de donnes) survivent aux pannes, y compris les pannes de communication, les pannes de processus et les pannes systme des serveurs. Cest ce que nous appelons durabilit. Louverture dune transaction vous permet de rcuprer ltat durable aprs des pannes survenues sur les supports disque. Lobjet de contexte associ lobjet indique sil sexcute dans une transaction et, si cest le cas, lidentit de la transaction. Quand un objet fait partie dune transaction, les services proposs par les gestionnaires de ressources et les fournisseurs de ressources sexcutent galement dans la transaction. Les fournisseurs de ressources utilisent lobjet de contexte pour proposer des services base de transaction. Par exemple, quand un objet excut dans une transaction alloue une connexion de base de donnes en utilisant le fournisseur de ressources ADO ou BDE, la connexion est automatiquement intgre dans la transaction. Toutes les modifications de bases de donnes effectues en utilisant cette connexion font galement partie de la transaction et sont donc soit valides ou annules avec la transaction. Le travail de plusieurs objets peut tre ralis lintrieur dune seule transaction. Permettre un objet de rsider dans sa propre transaction ou de faire partie dun groupe dobjets plus large appartenant une seule transaction est lun des avantages les plus importants de MTS et COM+. Cela permet dutiliser un objet de diffrentes manires ; ainsi le concepteur dapplications peut rutiliser le code dans dautres applications sans rcrire la logique de lapplication. En fait, les dveloppeurs peuvent dterminer comment les objets sont utiliss dans les transactions au moment de linstallation de lobjet transactionnel. Ils peuvent modifier le comportement de transaction simplement en ajoutant un objet un paquet MTS diffrent ou une autre application COM+. Pour davantage dinformations sur linstallation des objets transactionnels, voir Installation dobjets transactionnels la page 39-24.

Attributs transactionnels
Chaque objet transactionnel a un attribut transactionnel stock dans le catalogue MTS ou recens dans COM+.

39-10

Guide du dveloppeur

Support transactionnel MTS et COM+

Delphi permet de dfinir lattribut transactionnel la conception en utilisant lexpert objet transactionnel ou lditeur de bibliothques de types. Chaque attribut transactionnel peut tre dfini par une des valeurs suivantes : Requiert une transaction Les objets doivent sexcuter dans la porte dune transaction. Lorsquun nouvel objet est cr, son contexte hrite de la transaction du contexte du client. Si le client na pas de contexte transactionnel, un nouveau contexte transactionnel est automatiquement cr pour lobjet. Les objets doivent sexcuter dans leurs propres transactions. Lorsquun nouvel objet est cr, une nouvelle transaction est cre automatiquement pour lobjet, que son client ait ou non une transaction. Un objet ne sexcute jamais dans la porte de la transaction de son client. Au contraire, le systme cre toujours des transactions indpendantes pour les nouveaux objets. Les objets peuvent sexcuter dans la porte des transactions de leur client. Lorsquun nouvel objet est cr, son contexte hrite de la transaction du contexte du client. Cela permet plusieurs objets dtre rassembls dans une mme transaction. Si le client na pas de transaction, le nouveau contexte est galement cr sans transaction. Les objets ne sexcutent pas dans la porte des transactions. Lorsquun nouvel objet est cr, son objet de contexte est cr sans transaction, que son client ait ou non une transaction. Cette option est disponible uniquement avec COM+. La signification de cette option change selon que lobjet est install dans MTS ou dans COM+. Avec MTS, cette option a le mme effet que Transactions ignores pour COM+. Dans COM+, non seulement lobjet de contexte est cr dans transaction, mais cette valeur empche lactivation de lobjet si le client a dj une transaction.

Requiert une nouvelle transaction

Supporte les transactions

Transactions ignores

Ne supporte pas les transactions

Initialisation de lattribut transactionnel


Vous pouvez dfinir un attribut transactionnel la cration de lobjet transactionnel en utilisant lexpert objet transactionnel. Vous pouvez galement dfinir (ou modifier) lattribut transactionnel en utilisant lditeur de bibliothques de types. Pour modifier lattribut transactionnel en utilisant lditeur de bibliothques de types :

1 Choisissez Voir|Bibliothque de types pour ouvrir lditeur de bibliothques de types. 2 Slectionnez la classe correspondant lobjet transactionnel. 3 Cliquez dans la page COM+ et choisissez lattribut transactionnel souhait.

Cration dobjets MTS ou COM+

39-11

Support transactionnel MTS et COM+

Attention

Quand vous spcifiez lattribut transactionnel, Delphi insre un GUID spcial pour lattribut spcifi comme donne personnalise dans la bibliothque de types. Cette valeur nest pas reconnue en dehors de Delphi. Elle na deffet que si vous installez lobjet transactionnel depuis lEDI. Sinon, un administrateur systme doit dfinir cette valeur en utilisant lexplorateur MTS ou le gestionnaire de composants COM+. Si lobjet transactionnel est dj install, vous devez tout dabord le dsinstaller puis le rinstaller quand vous modifiez lattribut transactionnel. Pour ce faire, utilisez Excuter|Installer les objets MTS ou Excuter|Installer les objets COM+.

Remarque

Objets avec tat et sans tat


Comme tous les objets COM, les objets transactionnels sont capables de maintenir un tat interne au cours de leurs multiples interactions avec un client. Par exemple, un client peut dfinir la valeur dune proprit lors dun appel et sattendre ce que cette valeur reste inchange lors de lappel suivant. Un tel objet est dit avec tat. Les objets transactionnels peuvent galement tre sans tat, ce qui signifie que lobjet ne maintient aucun tat intermdiaire pendant lattente du prochain appel dun client. Lorsquune transaction est valide ou annule, tous les objets qui taient inclus dans la transaction sont dsactivs, ce qui fait quils perdent ltat quils avaient acquis au cours de la transaction. Cest un des mcanismes qui garantissent lisolation des transactions et la cohrence des donnes ; cela libre galement les ressources du serveur pour leur utilisation par dautres transactions. La fin dune transaction permet de dsactiver un objet et de rcuprer ses ressources. Pour davantage dinformations sur la manire dont ltat de lobjet est libr, voir la section suivante. Conserver ltat dun objet impose que cet objet reste activ, conservant ainsi des ressources potentiellement utiles, comme des connexions de bases de donnes.

Contrle de larrt des transactions


Un objet transactionnel utilise les mthodes de IObjectContext comme le montre le tableau suivant pour dterminer la faon dont se termine une transaction. Ces mthodes, avec lattribut transactionnel du composant, vous permettent dengager un ou plusieurs objets dans une transaction.
Tableau 39.1 M thode
SetComplete

M thodes de IObjectContext pour la gestion des transactions Description


Indique que lobjet a termin son travail avec succs pour la transaction. Lobjet est dsactiv aprs le retour de la m thode entre la premire dans le contexte. Lobjet est ractiv lors du prochain appel ncessitant son excution. Indique que le travail de lobjet ne pourra jamais tre valid. Lobjet est dsactiv au retour de la mthode entre la premire dans le contexte. Lobjet est ractiv lors du prochain appel ncessitant son excution.

SetAbort

39-12

Guide du dveloppeur

Support transactionnel MTS et COM+

Tableau 39.1 M thode

M thodes de IObjectContext pour la gestion des transactions (suite) Description


Indique que le travail de lobjet nest pas obligatoirement termin mais que les mises jour transactionnelles peuvent tre valides dans leur forme actuelle. Utilisez cela pour conserver ltat entre les multiples appels dun client tout en permettant lachvement des transactions. Lobjet nest pas dsactiv jusqu ce quil appelle SetComplete ou SetAbort. EnableCommit est ltat par dfaut lorsquun objet est activ. Cest pourquoi un objet doit toujours appeler SetComplete ou SetAbort avant de retourner dune mthode, sauf si vous voulez que lobjet conserve son tat interne pour le prochain appel dun client. Indique que le travail de lobjet est incohrent et quil ne peut se terminer tant que lobjet na pas reu de nouveaux appels de mthodes de la part du client. Appelez cette mthode avant de rendre le contrle au client afin de conserver ltat entre plusieurs appels client tout en conservant la transaction active. DisableCommit empche lobjet de se dsactiver et de librer ses ressources au retour de lappel dune mthode. Lorsquun objet a appel DisableCommit, si un client tente de valider la transaction avant que lobjet ait appel EnableCommit ou SetComplete, la transaction est annule.

EnableCommit

DisableCommit

Dmarrage des transactions


Il est possible de contrler les transactions de trois manires : Elles peuvent tre contrles par le client. Les clients ont un contrle direct sur les transactions en utilisant un objet contexte de transaction (en employant linterface ITransactionContext). Elles peuvent tre contrles par le serveur. Les serveurs peuvent contrler explicitement les transactions en crant pour elles un objet contexte. Quand le serveur cre ainsi un objet, lobjet cr est automatiquement engag dans la transaction en cours. Les transactions peuvent se produire automatiquement comme rsultat des attributs transactionnels de lobjet. Il est possible de dclarer les objets transactionnels de telle manire que leurs objets sexcutent toujours dans une transaction, sans tenir compte de la manire dont les objets sont crs. De cette manire, les objets nont pas besoin dinclure la moindre logique de gestion des transactions. Cette caractristique rduit galement la charge des applications client. Les clients nont pas besoin de dmarrer une transaction uniquement parce que le composant quelles utilisent en a besoin.

Dfinition dun objet transaction ct client


Une application base sur le client de base peut contrler le contexte transactionnel via linterface ITransactionContextEx. Lexemple de code suivant montre comment une application client peut utiliser CreateTransactionContextEx

Cration dobjets MTS ou COM+

39-13

Support transactionnel MTS et COM+

pour crer le contexte transactionnel. Cette mthode renvoie une interface vers cet objet. Cet exemple insre lappel au contexte transactionnel dans un appel de OleCheck, ncessaire car les mthodes de IObjectContext sont exposes directement par Windows et ne sont donc pas dclares safecall.
procedure TForm1.MoveMoneyClick(Sender: TObject); begin Transfer(CLASS_AccountA, CLASS_AccountB, 100); end; procedure TForm1.Transfer(DebitAccountId, CreditAccountId: TGuid; Amount: Currency); var TransactionContextEx: ITransactionContextEx; CreditAccountIntf, DebitAccountIntf: IAccount; begin TransactionContextEx := CreateTransactionContextEx; try OleCheck(TransactionContextEx.CreateInstance(DebitAccountId, IAccount, DebitAccountIntf)); OleCheck(TransactionContextEx.CreateInstance(CreditAccountId, IAccount, CreditAccountIntf)); DebitAccountIntf.Debit(Amount); CreditAccountIntf.Credit(Amount); except TransactionContextEx.Abort; raise; end; TransactionContextEx.Commit; end;

Dfinition dun objet transaction ct serveur


Pour contrler le contexte transactionnel depuis le serveur, crez une instance dObjectContext. Dans lexemple suivant, la mthode Transfer est dans lobjet transactionnel. En utilisant ObjectContext de cette faon, linstance de lobjet que nous sommes en train de crer hrite de tous les attributs transactionnels de lobjet qui le cre. Lappel est insr dans un appel de OleCheck car les mthodes de IObjectContext sont exposes directement par Windows et ne sont donc pas dclares safecall.
procedure TAccountTransfer.Transfer(DebitAccountId, CreditAccountId: TGuid; Amount: Currency); var CreditAccountIntf, DebitAccountIntf: IAccount; begin try OleCheck(ObjectContext.CreateInstance(DebitAccountId, IAccount, DebitAccountIntf)); OleCheck(ObjectContext.CreateInstance(CreditAccountId, IAccount, CreditAccountIntf)); DebitAccountIntf.Debit(Amount); CreditAccountIntf.Credit(Amount); except DisableCommit;

39-14

Guide du dveloppeur

Scurit en fonction des rles

raise; end; EnableCommit; end;

Dlais des transactions


Le dlai des transactions dfinit la dure (exprime en secondes) durant laquelle une transaction peut rester active. Les transactions toujours vivantes aprs ce dlai sont automatiquement annules par le systme. Par dfaut, cette valeur est de 60 secondes. Vous pouvez dsactiver le dlai des transactions en spcifiant la valeur 0, cela peut tre utile lors du dbogage des objets transactionnels. Pour dfinir la temporisation sur votre ordinateur :

1 Dans lexplorateur MTS ou le gestionnaire de composants COM+, slectionnez Computer, My Computer.


Par dfaut, My Computer correspond au systme local.

2 Cliquez avec le bouton droit de la souris et choisissez Properties, puis longlet Options.
Longlet Options est utilis pour dfinir la proprit Transaction timout (dlai de transaction) pour le systme.

3 Changez la valeur de la proprit timeout 0 pour dsactiver les dlais de transaction. 4 Choisissez OK pour enregistrer la configuration.
Pour davantage dinformations sur le dbogage des applications MTS, voir D bogage et test des objets transactionnels la page 39-23.

Scurit en fonction des rles


MTS et COM+ offrent une scurit en fonction des rles dans laquelle vous attribuez un rle chaque groupe dutilisateurs. Par exemple, notre application mdicale pourrait dfinir un rle pour les mdecins, un pour les techniciens radiologues et un pour les patients. Vous dfinissez des autorisations pour chaque composant et chaque interface de composant en assignant des rles. Par exemple, dans une application mdicale, seuls les mdecins seraient autoriss voir tous les dossiers mdicaux, les techniciens radio ne verraient que les radiographies, et les patients leur propre dossier. Habituellement, les rles sont dfinis au cours du dveloppement de lapplication et ils sont attribus chaque paquet MTS ou chaque application COM+. Ils sont ensuite assigns des utilisateurs spcifiques lorsque lapplication est dploye. Les administrateurs peuvent configurer les rles en utilisant lexplorateur MTS ou le gestionnaire de composants COM+.

Cration dobjets MTS ou COM+

39-15

Prsentation de la cration des objets transactionnels

Si vous voulez contrler laccs des blocs de code et non des objets entiers, vous pouvez proposer une scurit plus affine en utilisant la mthode IsCallerInRole de IObjectContext. Cette mthode ne fonctionne que si la scurit est active, ce qui peut tre test en appelant la mthode IsSecurityEnabled de IObjectContext. Ces mthodes sont automatiquement ajoutes comme mthodes de votre objet transactionnel. Par exemple :
if IsSecurityEnabled then { Tester si la scurit est active } begin if IsCallerInRole(Mdecin) then { Tester le rle de lappelant } begin { Excuter lappel normalement. } end else { Si ce nest pas un mdecin, effectuer lopration approprie en ce cas. } end end else { La scurit nest pas active, effectuer lopration approprie } end; Remarque

Pour les applications ncessitant une scurit renforce, les objets contexte implmentent linterface ISecurityProperty dont les mthodes permettent dobtenir lidentificateur de scurit Windows (SID) de lappelant direct et crateur de lobjet ainsi que le SID des clients utilisant lobjet.

Prsentation de la cration des objets transactionnels


La cration des objets transactionnels suit le processus suivant :

1 Utilisez lexpert objet transactionnel pour crer lobjet transactionnel. 2 Ajoutez les mthodes et proprits linterface de lobjet en utilisant lditeur de bibliothques de types. Pour des informations sur lajout de proprits et de mthodes en utilisant lditeur de bibliothques de types, voir chapitre 34, Utilisation des bibliothques de types. 3 Quand vous implmentez les mthodes de lobjet, vous pouvez utiliser linterface IObjectContext pour grer les transactions, la persistance de ltat et la scurit. De plus, si vous transmettez des rfrences dobjet, vous devez bien faire attention ce quelles soient correctement gres (voir Transfert de rfrences dobjets la page 21). 4 Dbogez et testez lobjet transactionnel. 5 Installez lobjet transactionnel dans un paquet MTS ou une application COM+. 6 Administrez vos objets en utilisant lexplorateur MTS ou le gestionnaire de composants COM+.

39-16

Guide du dveloppeur

Utilisation de lexpert objet transactionnel

Utilisation de lexpert objet transactionnel


Utilisez lexpert objet transactionnel pour crer un objet COM exploitant la gestion des ressources, le traitement des transactions et la scurit en fonction de rles que propose MTS ou COM+. Pour afficher lexpert objet transactionnel

1 Choisissez Fichier|Nouveau|Autre. 2 Slectionnez longlet libell Multi-niveaux. 3 Cliquez deux fois sur licne Objet transactionnel.
Dans lexpert, vous devez spcifier : Le modle de thread afin dindiquer comment les applications client peuvent appeler linterface de votre objet. Le modle de thread dtermine comment lobjet sera recens. Vous devez tre certain que limplmentation de votre objet est conforme au modle slectionn. Pour plus dinformations sur les modles de threads, voir Choix dun modle de thread pour un objet transactionnel la page 39-18. Un modle de transaction. Si votre objet notifie les clients des vnements. La gestion des vnements est propose uniquement pour les vnements classiques, pas pour les vnements COM+. Lorsque vous suivez cette procdure, une nouvelle unit est ajoute au projet en cours, elle contient la dfinition de lobjet transactionnel. De plus, lexpert ajoute une bibliothque de types au projet et louvre dans lditeur de bibliothques de types. Vous pouvez alors exposer les proprits et les mthodes de linterface par le biais de la bibliothque de types. Vous exposez linterface comme vous exposeriez nimporte quel objet Automation comme dcrit dans Dfinition de linterface dun objet COM la page 36-9. Lobjet transactionnel implmente une interface double, qui supporte la fois la liaison prcoce ( la compilation), via la vtable, et la liaison tardive ( lexcution), via linterface IDispatch. Lobjet transactionnel gnr implmente les mthodes de linterface IObjectControl, Activate, Deactivate et CanBePooled. Il nest pas absolument ncessaire dutiliser lexpert objet transactionnel. Vous pouvez convertir tout objet Automation en un objet transactionnel COM+ (et tout objet Automation en processus, en un objet transactionnel MTS) en utilisant la page COM+ de lditeur de bibliothques de types, puis en installant lobjet dans un paquet MTS ou une application COM+. Cependant, lexpert objet transactionnel propose certains avantages : Il implmente automatiquement linterface IObjectControl, et ajoute les vnements OnActivate et OnDeactivate aux objets afin que vous puissiez crer des gestionnaires dvnements qui rpondent lactivation ou la dsactivation de lobjet.

Cration dobjets MTS ou COM+

39-17

Utilisation de lexpert objet transactionnel

Il gnre automatiquement une proprit ObjectContext pour simplifier laccs de lobjet aux mthodes de IObjectContext afin de contrler lactivation et les transactions.

Choix dun modle de thread pour un objet transactionnel


Les environnements dexcution MTS et COM + grent les threads votre place. Les objets transactionnels ne doivent pas crer de threads. Ils ne doivent jamais terminer un thread qui fait un appel dans une DLL. Lorsque vous spcifiez le modle de thread en utilisant lexpert objet transactionnel, vous spcifiez comment les objets seront attribus aux threads lors de lexcution des mthodes.
Tableau 39.2
Unique

Modles de thread pour les objets transactionnels Description


Pas de gestion des threads. Les demandes client sont srialises par le mcanisme dappel. Tous les objets dun composant thread unique s excutent dans le thread principal. Cela est compatible avec le modle de thread COM par dfaut utilis pour les composants ne possdant pas dattribut de registre Modle de thread et pour les composants COM non rentrants. Lexcution des mthodes est srialise entre tous les objets dun composant et entre tous les composants dun processus. Chaque objet est assign un thread apartment, dont la dure quivaut la dure de vie de lobjet ; cependant, plusieurs threads peuvent tre utiliss pour plusieurs objets. Cest le modle concurrentiel COM standard. Chaque apartment est li un thread spcifique et possde une pompe messages Windows.

Modle de thread

Avantages et inconv nients


Permet aux composants dutiliser des bibliothques non rentrantes. Capacits dvolution extrmement limites. Les composants thread unique et avec tat sont prdisposs aux verrous mortels. Vous pouvez liminer ce problme en utilisant des objets sans tat et en appelant SetComplete avant de revenir de chacune des mthodes.

Apartment (ou apartment thread unique)

Apporte une nette amlioration des accs simultans par rapport au modle de thread unique. Deux objets peuvent sexcuter simultanment du moment quils appartiennent des activits diffrentes. Semblable lapartment COM, mais les objets peuvent tre distribus dans plusieurs processus.

Remarque

Ces modles de threads sont semblables ceux dfinis par les objets COM. Cependant, comme MTS et COM+ fournissent une meilleure gestion des threads, la signification de chaque modle de thread diffre. Dautre part, le modle libre ne sapplique pas aux objets transactionnels cause de la gestion intgre des activits.

39-18

Guide du dveloppeur

Utilisation de lexpert objet transactionnel

Activits
Outre le modle de thread, les objets transactionnels supporte les accs simultans via les activits. Les activits sont enregistres dans le contexte de lobjet et lassociation entre un objet et une activit ne peut tre modifie. Une activit comprend lobjet transactionnel cr par le client de base, ainsi que tous les objets transactionnels crs par cet objet et ses descendants. Ces objets peuvent tre distribus dans un ou plusieurs processus sexcutant sur un ou plusieurs ordinateurs. Par exemple, une application destine des mdecins peut possder un objet transactionnel ajoutant des mises jour et supprimant des enregistrements dans plusieurs bases de donnes mdicales, chacune reprsente par un objet diffrent. Cet objet dajout peut utiliser galement dautres objets, comme un objet de rception qui enregistre la transaction. Il en rsulte plusieurs objets transactionnels qui sont, soit directement, soit indirectement, sous le contrle du client de base. Ces objets appartiennent tous la mme activit. MTS et COM+ suivent le flux dexcution dans chaque activit, en empchant quun phnomne de paralllisme naltre malencontreusement ltat de lapplication. Le rsultat de cette fonctionnalit est lunicit du thread logique dexcution pour toute une srie dobjets potentiellement distribuables. Grce ce thread logique unique, les applications sont nettement plus faciles crire. Lorsquun objet transactionnel est cr partir dun contexte existant, en utilisant soit un objet contexte transactionnel ou un objet contexte, le nouvel objet devient membre de la mme activit. Autrement dit, le nouveau contexte hrite de lidentificateur dactivit du contexte utilis pour le crer. Il ne peut y avoir quun seul thread logique dexcution pour une mme activit. Ce comportement est semblable celui dun modle de thread apartment COM, mais les objets peuvent tre distribus dans plusieurs processus. Lorsquun client de base fait appel une activit, toutes les autres demandes de travail dans cette activit (par exemple, celles provenant dun autre thread client) sont bloques jusqu ce que le thread dexcution initial revienne vers le client. Avec MTS, chaque objet transactionnel appartient une activit. Avec COM+, vous pouvez configurer la manire dont lobjet participe aux activits en initialisant la synchronisation dappel. Les options suivantes sont disponibles :
Tableau 39.3 Option
Dsactive

Options dappel de synchronisation Signification


COM+ naffecte pas dactivit lobjet mais il peut les hriter du contexte de lappelant. Si lappelant na pas de transaction ou de contexte dobjet, lobjet nest pas attribu une activit. Cela donne la m me chose que si lobjet nest pas install dans une application COM+. Cette option ne doit pas tre utilise si lun des objets de lapplication utilise un gestionnaire de ressources ou si lobjet gre les transactions ou lactivation juste--temps. COM+ naffecte jamais lobjet une activit quel que soit le statut de son appelant. Cette option ne doit pas tre utilise si lun des objets de lapplication utilise un gestionnaire de ressources ou si lobjet gre les transactions ou lactivation juste--temps.

Non gre

Cration dobjets MTS ou COM+

39-19

Gnration dvnements dans COM+

Tableau 39.3 Option


G r e

Options dappel de synchronisation (suite) Signification


COM+ affecte lobjet nappartient pas une tre utilise si lun des ressources ou si lobjet la mme activit que lappelant. Si lappelant activit, lobjet non plus. Cette option ne doit pas objets de lapplication utilise un gestionnaire de gre les transactions ou lactivation juste--temps.

Obligatoire

COM+ affecte toujours lobjet une activit, en crant une activit si ncessaire. Cette option doit tre utilise si lattribut transactionnel est Support ou Requiert. COM+ affecte toujours lobjet une nouvelle activit distincte de celle de lappelant.

Nouveau Obligatoire

Gnration dvnements dans COM+


Avant COM+, les serveurs Automation utilisaient un ensemble dinterfaces spciales pour gnrer des vnements. COM+ introduit un nouveau systme de gestion des vnements. Ce nest plus lobjet serveur qui gre les vnements en mmorisant les clients qui doivent tre notifis et en appelant leurs interfaces quand des vnements se produisent. Cest le systme sous-jacent, COM+, qui gre ce processus.
Remarque

Les objets transactionnels installs dans COM+ peuvent continuer utiliser lancien systme de gestion des vnements. Nanmoins, laisser COM+ grer le processus offre une plus grande flexibilit. Ainsi, quand COM+ gre les vnements, le client peut tre un serveur en processus qui est dmarr par COM+ quand lvnement se produit. Quand un objet COM+ gnre des vnements, il ne le fait pas directement. Il utilise pour cela un objet vnement associ qui a t spcifiquement cr pour gnrer des vnements. Lobjet COM+ appelle son objet vnement quand il veut dclencher un vnement. Quand cela se produit, COM+ appelle tous les clients qui ont manifest leur intrt pour cet objet vnement particulier.

Utilisation de lexpert objet vnement


Vous pouvez crer des objets vnements en utilisant lexpert objet vnement. Lexpert commence par vrifier si le projet en cours contient du code dimplmentation. En effet, les projets contenant des objets vnement COM+ ne doivent contenir aucune implmentation. Ils ne peuvent contenir que des dfinitions dobjets vnement (vous pouvez, par contre, placer plusieurs objets vnement COM+ dans un mme projet). Pour afficher lexpert objet vnement :

1 Choisissez Fichier|Nouveau. 2 Slectionnez longlet libell ActiveX. 3 Double-cliquez sur licne Objet vnement COM+.

39-20

Guide du dveloppeur

Transfert de rfrences dobjets

Dans lexpert vnement, spcifiez le nom de lobjet vnement, le nom de linterface qui dfinit les gestionnaires dvnements et, de manire facultative, une brve description des vnements. Quand vous sortez, lexpert cre un projet contenant une bibliothque de types qui dfinit votre objet vnement et son interface. Utilisez lditeur de bibliothques de types pour dfinir les mthodes de cette interface. Ces mthodes sont les gestionnaires dvnements que les clients implmentent pour rpondre aux vnements. Le projet objet vnement inclut le fichier projet unit _ATL pour importer les modles de classes ATL et lunit _TLB pour dfinir les informations de la bibliothque de types. Il ne contient aucune unit dimplmentation car les objets vnement COM+ nont pas dimplmentation. Limplmentation de linterface est la charge du client. Quand lobjet serveur appelle un objet vnement COM+, COM+ intercepte lappel et le distribue aux clients recenss. Comme les objets vnement COM+ nont pas besoin dobjet implmentation, une fois que vous avez dfini linterface de lobjet dans lditeur de bibliothques de types, il vous suffit de compiler le projet et de linstaller dans COM+ COM+ impose certaines restrictions sur les interfaces des objets vnement. Linterface dfinie dans lditeur de bibliothques de types pour lobjet vnement doit respecter les rgles suivantes : Linterface de lobjet vnement doit driver de IDispatch. Les noms de mthode doivent tre uniques pour toutes les interfaces de lobjet vnement. Les mthodes de linterface de lobjet vnement doivent toutes renvoyer une valeur HRESULT. Le modificateur de toutes les paramtres de mthode doit tre blank.

Dclenchement dvnement en utilisant un objet vnement COM+


Quand un vnement se produit, votre objet COM+ doit appeler lobjet vnement et lui demande de dclencher lvnement dans les clients recenss. Pour ce faire, il cre une instance de lobjet vnement et appelle la mthode correspondant lvnement :
Remarque

Les objets dclenchant des vnements COM+ doivent tre, comment les objets vnement mmes, installs dans une application COM+.

Transfert de rfrences dobjets


Remarque

Les informations sur le transfert de rfrences dobjets sappliquent uniquement MTS, et pas COM+. Ce mcanisme est requis sous MTS car il est ncessaire de garantir que tous les pointeurs sur des objets sexcutant sous MTS sont routs

Cration dobjets MTS ou COM+

39-21

Transfert de rfrences dobjets

par le biais dintercepteurs. Puisque les intercepteurs sont construits dans COM+, vous navez pas besoin de transmettre des rfrences dobjets. Dans MTS, vous pouvez passer des rfrences un objet (par exemple, pour les utiliser en tant que callback) uniquement par un des moyens suivants : Avec le retour dune interface de cration dun objet, comme CoCreateInstance (ou son quivalent), ITransactionContext.CreateInstance ou IObjectContext.CreateInstance. Avec un appel QueryInterface. Avec une mthode ayant appel SafeRef pour obtenir la rfrence de lobjet. Une rfrence un objet obtenue par un des moyens prcdents est appele rfrence scurise. Les mthodes invoques en utilisant des rfrences scurises sexcuteront toujours dans le contexte convenable. Les appels qui utilisent des rfrences scurises doivent toujours tre transmis lenvironnement dexcution MTS afin quil gre les options de contexte et permette aux objets transactionnels davoir des dures de vie indpendantes des rfrences client. Les rfrences scurises ne sont pas ncessaires avec COM+.

Utilisation de la mthode SafeRef


Un objet peut utiliser la fonction SafeRef pour obtenir une rfrence scurise sur lui-mme afin de la transmettre hors de son contexte. La fonction SafeRef est dfinie dans lunit Mtx. En entre, SafeRef attend : Une rfrence lID de linterface (RIID) que lobjet en cours veut transmettre un autre objet ou un client. Une rfrence linterface IUnknown de lobjet en cours. SafeRef renvoie un pointeur sur linterface spcifie par le paramtre RIID, qui est scuris pour passer hors du contexte de lobjet en cours. Elle renvoie nil si lobjet demande une rfrence scurise sur un objet autre que lui-mme, ou si linterface requise par le paramtre RIID nest pas implmente. Lorsquun objet MTS souhaite transmettre une auto-rfrence vers un client ou vers un autre objet (par exemple, pour lutiliser en tant que callback), il doit toujours appeler SafeRef dabord et passer ensuite la rfrence renvoye par cet appel. Un objet ne doit jamais passer de pointeur self, ni dauto-rfrence obtenue par un appel interne QueryInterface, un client ou tout autre objet. Une fois une telle rfrence transmise hors du contexte de lobjet, ce nest plus une rfrence valide. Appeler SafeRef sur une rfrence dj scurise renvoie la rfrence scurise inchange, mais le compteur de rfrences sur linterface est incrment. Lorsquun client appelle QueryInterface sur une rfrence scurise, la rfrence renvoye au client est galement scurise. Un objet qui obtient une rfrence scurise doit librer la rfrence scurise lorsquelle ne lui est plus ncessaire.

39-22

Guide du dveloppeur

Dbogage et test des objets transactionnels

Pour plus de dtails concernant SafeRef, voir la rubrique SafeRef de la documentation MTS.

Callbacks
Les objets peuvent faire des callbacks aux clients et aux autres objets transactionnels. Par exemple, vous pouvez avoir un objet qui cre un autre objet. Lobjet crateur peut transmettre lobjet cr une rfrence lui-mme ; lobjet cr peut ensuite utiliser cette rfrence pour appeler lobjet qui la cr. Si vous choisissez dutiliser les callbacks, tenez compte des restrictions suivantes : Un callback au client de base ou un autre paquet ncessite, sur le client, une scurit au niveau des accs. De plus, le client doit tre un serveur DCOM. Lintroduction de coupe-feux doit bloquer les callbacks vers le client. Le travail effectu par le callback sexcute dans lenvironnement de lobjet qui est appel. Il peut faire partie de la mme transaction, dune transaction diffrente ou daucune transaction. Dans MTS, lobjet crateur doit appeler SafeRef et transmettre la rfrence renvoye lobjet cr en vue de se rappeler lui-mme.

Dbogage et test des objets transactionnels


Vous pouvez dboguer les objets transactionnels locaux et distants. Lors du dbogage des objets transactionnels, vous pouvez dsactiver la temporisation des transactions. Le dlai des transactions dfinit la dure (exprime en secondes) durant laquelle une transaction peut rester active. Les transactions toujours vivantes aprs ce dlai sont automatiquement annules par le systme. Par dfaut, cette valeur est de 60 secondes. Vous pouvez dsactiver le dlai des transactions en spcifiant la valeur 0 ; cela peut tre utile lors du dbogage. Pour plus dinformations sur le dbogage distant, voir la rubrique Dbogage distant dans laide en ligne Lors du test de lobjet transactionnel, vous pouvez commencer par le tester hors de lenvironnement MTS, afin que votre environnement de test soit plus simple. Lorsque vous dveloppez un serveur, vous ne pouvez pas le reconstruire lorsquil est encore en mmoire. Il se peut que vous obteniez une erreur du compilateur, du style Impossible dcrire dans une DLL alors que lexcutable est charg. Pour lviter, vous pouvez dfinir les proprits du paquet MTS ou de lapplication COM+ pour arrter le serveur lorsquil est inactif. Pour arrter le serveur lorsquil est inactif :

1 Dans lexplorateur MTS ou le gestionnaire de composants COM+, cliquez avec le bouton droit de la souris sur le paquet MTS ou lapplication COM+ dans lequel est install votre objet transactionnel et choisissez Proprits.

Cration dobjets MTS ou COM+

39-23

Installation dobjets transactionnels

2 Slectionnez longlet Avanc.


Cet onglet dtermine si le processus serveur associ au paquet sexcute toujours ou sil sarrte aprs un certain laps de temps.

3 Changez le dlai en 0, ce qui arrte le serveur ds quil ny a plus de client servir. 4 Choisissez OK pour enregistrer la configuration.
Remarque

Lors des tests hors de lenvironnement MTS, vous ne devez pas faire de rfrence directe lObjectProperty de TMtsObject. TMtsObject implmente des mthodes, comme SetComplete et SetAbort, dont lappel est scuris lorsque le contexte de lobjet est nil.

Installation dobjets transactionnels


Les applications MTS consistent en un groupe dobjets MTS en processus sexcutant dans une instance unique de lexcutable MTS (EXE). Un groupe dobjets COM sexcutant tous dans le mme processus est appel un paquet. Sur une machine unique peuvent sexcuter plusieurs paquets diffrents, chaque paquet sexcutant dans un EXE MTS spar. Dans COM+, vous manipulez le mme groupe, appel une application COM+ Dans une application COM+, les objets nont pas besoin dtre en processus et il ny a pas denvironnement dexcution spar. Vous pouvez grouper les composants de votre application dans un seul paquet MTS ou une application COM+ afin quils sexcutent dans un seul processus. Vous pouvez aussi distribuer vos composants dans des paquets MTS ou des applications COM+ diffrentes pour partager votre application entre plusieurs processus ou plusieurs machines. Pour installer des objets transactionnels dans un paquet MTS ou une application COM+ :

1 Si votre systme gre COM+, choisissez Excuter|Installer les objets COM+. Si votre systme ne gre pas COM+ mais que MTS est install, choisissez Excuter|Installer les objets MTS. Si votre systme ne gre ni MTS ni COM+, vous ne verrez pas doption de menu proposant dinstaller les objets transactionnels. 2 Dans la bote de dialogue Installer lobjet, cochez les objets installer. 3 Si vous installez des objets MTS, choisissez le bouton Paquet pour obtenir une liste des paquets MTS dans votre systme. Si vous installez des objets COM+, choisissez le bouton Application. Indiquez le paquet MTS ou lapplication COM+ dans lequel vous installez vos objets. Vous pouvez choisir Dans nouveau paquet ou Dans nouvelle application pour crer un nouveau paquet MTS ou une nouvelle application COM+ dans lequel installer les objets. Choisissez Dans un paquet existant ou Dans une application existante pour installer les objets dans un paquet MTS ou une application COM+ qui existe dj.

39-24

Guide du dveloppeur

Administration dobjets transactionnels

4 Choisissez OK pour rafrachir le catalogue, ce qui rend les objets accessibles lors de lexcution.
Les paquets MTS peuvent contenir des composants issus de plusieurs DLL, et des composants issus de la mme DLL peuvent tre installs dans diffrents paquets. Cependant, un mme composant ne peut tre distribu entre plusieurs paquets. De mme, des applications COM+ peuvent contenir des composants issus de plusieurs excutables et diffrents composants dun mme excutable peuvent tre installs dans diffrentes applications COM+.
Remarque

Vous pouvez galement installer lobjet transactionnel en utilisant le gestionnaire de composants COM+ ou lexplorateur MTS. Faites bien attention dans ce cas utiliser les mmes paramtres pour lobjet que ceux apparaissant dans la page COM+ de lditeur de bibliothques de types. Ces paramtres ne sont pas appliqus automatiquement si vous ninstallez pas lobjet depuis lEDI.

Administration dobjets transactionnels


Une fois des objets transactionnels installs, vous pouvez administrer ces objets dexcution en utilisant lexplorateur MTS (sils sont installs dans un paquet MTS) ou le gestionnaire de composants COM+ (sils sont installs dans une application COM+). Ces deux outils sont identiques, si ce nest que lexplorateur MTS agit sur lenvironnement dexcution MTS alors que le gestionnaire de composants COM+ agit sur les objets COM+. Le gestionnaire de composants COM+ et lexplorateur MTS permettent de grer et de dployer les objets transactionnels en utilisant une interface graphique. En utilisant ces outils, vous pouvez : Configurer les objets transactionnels, les paquets MTS ou les applications COM+ et les rles. Visualiser les proprits des composants dun paquet ou dune application COM+ et visualiser les paquets MTS ou les applications COM+ installs sur un ordinateur. Surveiller et grer les transactions pour les objets placs dans des transactions. Dplacer des paquets MTS ou des applications COM+ dune machine une autre. Permettre un client local dutiliser un objet transactionnel distant. Pour davantage dinformations sur ces outils, reportez-vous au Guide de ladministrateur Microsoft appropri.

Cration dobjets MTS ou COM+

39-25

39-26

Guide du dveloppeur

V
PartieV

Partie

Cration de composants personnaliss

Les chapitres de cette partie prsentent les concepts ncessaires la conception et limplmentation de composants personnaliss dans Delphi.

Cration de composants personnaliss

40
Chapitre 40

Chapitre

Prsentation gnrale de la cration dun composant

Ce chapitreest une prsentation gnrale de la conception des composants et du processus dcriture des composants pour les applications Delphi. Vous devez toutefois tre familier de Delphi et de ses composants standard. VCL et CLX Composants et classes Comment crer un composant ? Contenu dun composant ? Cration dun nouveau composant Test des composants non installs

Pour des informations sur linstallation de nouveaux composants, voir Installation de paquets de composants la page 11-6.

VCL et CLX
Les composants de Delphi rsident dans deux hirarchies de classes appeles la bibliothque des composants visuels (Visual Component Library, VCL) et la bibliothque des composants multiplates-formes (Component Library for Cross Platform, CLX). La figure suivante prsente la relation qui existe entre les classes slectionnes qui composent la VCL. La hirarchie CLX est similaire celle de la VCL, mais les contrles Windows sont appels des widgets (par exemple, TWinControl est appel TWidgetControl), et il existe dautres diffrences. Pour plus de dtails sur les hirarchies de classes et les relations dhritage entre classes, voir chapitre 41, Programmation oriente objet et criture des composants. Pour obtenir un aperu des diffrences entre la VCL et la CLX, voir CLX et VCL la page 10-6 et reportez-vous la rfrence en ligne de la CLX pour plus de dtails sur les composants.

Prsentation gnrale de la cration dun composant

40-1

Composants et classes

La classe TComponent est lanctre partag de chaque composant de la VCL et la CLX. TComponent fournit les proprits et les vnements de base ncessaires au fonctionnement dun composant dans Delphi. Les diffrentes branches de la bibliothque offrent dautres possibilits plus spcialises.
Figure 40.1 Hirarchie des classes de la bibliothque de composants visuels

Lorsque vous crez un composant, vous lajoutez la VCL ou la CLX en drivant une nouvelle classe de lun des types de classes existant dans la hirarchie.

Composants et classes
Comme les composants sont des classes, les crateurs de composants manipulent les objets un niveau diffrent de celui des dveloppeurs dapplications. La cration de nouveaux composants ncessite de driver de nouvelles classes. Brivement, il existe deux diffrences principales entre la cration des composants et leur utilisation dans des applications. Pour la cration de composants, Vous avez accs des parties de la classe qui sont inaccessibles aux programmeurs dapplications. Vous ajoutez de nouvelles parties (des proprits, par exemple) aux composants. A cause de ces diffrences, il faut prendre en compte un plus grand nombre de conventions, et rflchir la manire dont les dveloppeurs dapplications vont utiliser les composants.

40-2

Guide du dveloppeur

Comment crer un composant ?

Comment crer un composant ?


Nimporte quel lment de programme manipul lors de la phase de conception peut constituer un composant. La cration dun composant consiste driver une nouvelle classe partir dune classe existante. Vous pouvez driver un nouveau composant de nimporte quel composant existant, mais les mthodes les plus courantes pour crer des composants sont les suivantes : Modification de contrles existants Cration de contrles fentrs Cration de contrles graphiques Sous-classement de contrles Windows Cration de composants non visuels

Le tableau suivant prsente les diffrents types de composants et les classes que vous utiliserez comme point de dpart pour chacun deux.
Tableau 40.1 Pour
Modifier un composant existant

Points de dpart de la cration de composants Dmarrez avec le type suivant


Nimporte quel composant existant tel que TButton ou TListBox, ou un type de composant abstrait tel que TCustomListBox TWinControl (TWidgetControl dans CLX) TGraphicControl Tout contrle Windows (VCL) ou widget (CLX) TComponent

Crer un contrle fentr (ou widget CLX) Crer un contrle graphique Sous-classer un contrle Crer un composant non visuel

Vous pouvez aussi driver des classes qui ne sont pas des composants et ne peuvent pas tre manipules dans une fiche. Delphi inclut de nombreuses classes de ce type, telles que TRegIniFile et TFont.

Modification de contrles existants


Le moyen le plus simple de crer un composant est de modifier un composant existant. Vous pouvez driver un nouveau composant depuis un composant quelconque de Delphi. Certains contrles, tels les botes liste et les grilles, possdent plusieurs variantes dun thme de base. Dans ce cas, la VCL et la CLX comprennent un type de classe abstraite (son nom contient le mot custom, comme TCustomGrid) partir de laquelle il est possible de driver les versions personnalises. Vous pouvez, par exemple, crer un type particulier de bote liste ne possdant pas certaines proprits de la classe TListBox. Comme il nest pas possible de retirer (masquer) une proprit hrite dune classe anctre, il faut driver le composant dun lment situ avant TListBox dans la hirarchie. Au lieu de vous forcer commencer depuis la classe abstraite TWinControl (ou TWidgetControl dans la CLX) et rinventer toutes les fonctions de bote liste, la VCL ou la CLX fournit

Prsentation gnrale de la cration dun composant

40-3

Comment crer un composant ?

TCustomListBox, qui implmente toutes les proprits des botes liste mais ne les rend pas toutes publiques. En drivant un composant partir de lune des classes abstraites telles que TCustomListBox, vous rendez publiques uniquement les proprits que vous souhaitez mettre disposition dans votre composant et vous laissez les autres protges. Le chapitre 42, Cration de proprits, explique la publication des proprits hrites. Le chapitre 48, Modification dun composant existant, et le chapitre 50, Personnalisation dune grille, montrent des exemples de modification de contrles existants.

Cration de contrles fentrs


Les contrles fentrs de la VCL et de la CLX sont des objets qui apparaissent lexcution et avec lesquels lutilisateur peut interagir. Chaque contrle fentr possde un handle de fentre, accessible via sa proprit Handle, qui permet au systme dexploitation de lidentifier et dagir sur lui. Dans le cas dutilisation de contrles VCL, le handle permet au contrle de recevoir la focalisation de saisie et peut tre transmis aux fonctions de lAPI Windows. Dans la CLX, ces contrles sont des contrles bass sur des widgets. Chaque contrle widget possde un handle, accessible via sa proprit Handle, identifiant le widget sousjacent. Tous les contrles fentrs descendent de la classe TWinControl (TWidgetControl dans la CLX). Ils incluent la plupart des contrles fentrs standard, tels les boutons poussoirs, les botes liste et les botes de saisie. Bien que vous puissiez driver un contrle original (un qui nest reli aucun contrle existant) directement de TWinControl (TWidgetControl dans la CLX), Delphi fournit pour cela le composant TCustomControl. TCustomControl est un contrle fentr spcialis qui permet de raliser facilement des images visuelles complexes. Le chapitre 50, Personnalisation dune grille , prsente un exemple de cration dun contrle fentr.

Cration de contrles graphiques


Si votre contrle na pas besoin de recevoir la focalisation de saisie, vous pouvez en faire un contrle graphique. Les contrles graphiques sont semblables aux contrles fentrs, mais ils ne possdent pas de handle de fentre et consomment donc moins de ressources systme. Les composants comme TLabel, qui ne reoivent jamais la focalisation de saisie, sont des contrles graphiques. Bien que ces contrles ne puissent pas recevoir la focalisation, vous pouvez les crer afin quils ragissent aux messages souris. Delphi supporte la cration de contrles personnaliss par lintermdiaire du composant TGraphicControl. TGraphicControl est une classe abstraite drive de TControl. Bien quil soit possible de driver des contrles directement de TControl, il est prfrable de les driver de TGraphicControl, qui procure un canevas de dessin et sur Windows gre les messages WM_PAINT ; il vous suffit de surcharger la mthode Paint .

40-4

Guide du dveloppeur

Contenu dun composant ?

Le chapitre 49, Cration dun composant graphique, montre un exemple de cration dun contrle graphique.

Sous-classement de contrles Windows


En programmation Windows traditionnelle, vous crez des contrles personnaliss en dfinissant une nouvelle classe fentre et en lenregistrant dans Windows. La classe fentre (semblable aux objets ou aux classes dans la programmation oriente objet). Vous pouvez baser une nouvelle classe fentre sur une classe existante : cette opration est appele sous-classement. Vous pouvez ensuite placer votre contrle dans une bibliothque dynamiquement lie (DLL), comme les contrles Windows standard, puis lui fournir une interface. Avec Delphi vous pouvez crer une enveloppe de composant autour de nimporte quelle classe fentre existante. Ainsi, si vous possdez dj une bibliothque de contrles personnaliss que vous souhaitez utiliser dans vos applications Delphi, vous pouvez crer des composants Delphi se comportant comme ces contrles et driver de nouveaux contrles partir deux, comme vous le feriez avec nimporte quel composant. Pour consulter des exemples de sous-classement des contrles Windows, reportez-vous aux composants de lunit StdCtls qui reprsentent les contrles Windows standard, comme TEdit. Pour consulter des exemples CLX, voir QStdCtls.

Cration de composants non visuels


Les composants non visuels sont utiliss en tant quinterfaces pour des lments comme les bases de donnes (TDataSet ou TSQLConnection) et les horloges systme (TTimer), et en tant que marques de rservation pour des botes de dialogue (TCommonDialog (VCL) ou TDialog (CLX) et ses descendants). La plupart des composants que vous crivez sont des contrles visuels. les composants non visuels peuvent tre drivs directement de TComponent, la classe abstraite de base de tous les composants.

Contenu dun composant ?


Pour que vos composants sintgrent de manire s re lenvironnement de Delphi, vous devez suivre certaines conventions. Cette section traite des sujets suivants : Suppression des dpendances Proprits, mthodes et vnements Encapsulation des graphiques Recensement

Prsentation gnrale de la cration dun composant

40-5

Contenu dun composant ?

Suppression des dpendances


Une des qualits qui favorisent lutilisation des composants est le caractre illimit des oprations que lon peut programmer dans leur code. Par nature, les composants peuvent tre incorpors aux applications avec diverses combinaisons, dans des ordres ou des contextes diffrents. Les composants doivent tre conus pour pouvoir fonctionner dans nimporte quelle situation, sans condition pralable. La proprit Handle des composants TWinControl constitue un excellent exemple de suppression des dpendances dans les composants. Si vous avez dj crit des applications Windows, vous savez que lun des points les plus complexes traiter et les plus susceptibles de gnrer des erreurs lors de lexcution dun programme est linterdiction daccder une fentre ou un contrle avant de lavoir cr par un appel la fonction API CreateWindow. Les contrles fentrs de Delphi vitent cette difficult en garantissant quun handle de fentre correct sera toujours disponible ds que ncessaire. En utilisant une proprit pour reprsenter le handle de fentre, le contrle peut vrifier si la fentre a t cre ; si le handle nest pas correct, le contrle cre une fentre et renvoie son handle. Ainsi, chaque fois que le code dune application accde la proprit Handle, il est sr dobtenir un handle correct. En les librant des tches darrire-plan telles que la cration des fentres, les composants Delphi permettent aux dveloppeurs de se concentrer sur ce quils veulent vraiment raliser. Pour transmettre un handle de fentre une fonction API, il nest pas ncessaire de vrifier que le handle existe ni de crer la fentre. Le programmeur est certain que les oprations vont se drouler correctement et na pas besoin de le contrler sans cesse. Bien que la cration de composants sans dpendances soit un peu plus longue, le temps qui y est consacr est gnralement trs utile. Non seulement cela vite aux dveloppeurs rptitions et travail fastidieux, mais cela rduit la quantit de documentation et de support.

Proprits, mthodes et vnements


En dehors de limage visible que lutilisateur du composant manipule dans le concepteur de fiches, les attributs les plus courants dun composant sont les proprits, les vnements et les mthodes. Un chapitre est consacr chacun deux, mais ce qui suit prsente certaines raisons de les utiliser.

Proprits
Les proprits donnent au dveloppeur dapplications lillusion de dfinir ou de lire la valeur dune variable, tout en permettant au concepteur de composants de dissimuler la structure de donnes sous-jacente ou de dfinir un traitement spcial lorsque la valeur est accde.

40-6

Guide du dveloppeur

Contenu dun composant ?

Lutilisation des proprits prsente plusieurs avantages : Les proprits sont disponibles au moment de la conception. Le dveloppeur dapplications peut dfinir ou modifier les valeurs initiales des proprits sans crire de code. Les proprits peuvent contrler les valeurs ou les formats au moment o le dveloppeur les dfinit. La validation de la saisie pendant la conception empche de commettre des erreurs. Le composant peut construire les valeurs appropries la demande. Lerreur de programmation la plus frquente est de rfrencer une variable qui na t initialise. En reprsentant les donnes par une proprit, vous tes s r quune valeur leur est toujours disponible sur demande. Les proprits vous permettent de cacher les donnes sous une interface simple et cohrente. Vous pouvez modifier la faon dont les informations sont structures dans une proprit sans que ce changement ne soit peru par les dveloppeurs dapplications. Le chapitre 42, Cration de proprits, explique comment ajouter des proprits vos composants.

Evnements
Un vnement est une proprit spciale qui appelle du code, pendant lexcution, en rponse une saisie ou une autre opration. Les vnements permettent aux dveloppeurs dassocier des blocs de code spcifiques des actions sp cifiques, telles des manipulations de la souris ou des frappes au clavier. Le code qui sexcute lorsquun vnement survient est appel le gestionnaire de lvnement. Les vnements permettent aux dveloppeurs dapplications de spcifier des rponses diffrentes en fonction des actions possibles sans avoir crer de nouveaux composants. Le chapitre 43, Cration dvnements, explique comment implmenter des vnements standard et comment en dfinir de nouveaux.

Mthodes
Les mthodes de classes sont des fonctions et procdures qui oprent sur une classe plutt que sur des instances particulires de cette classe. Par exemple, les mthodes constructeur de composants (Create) sont toutes des mthodes de classes. Les mthodes de composants sont des procdures et fonctions qui oprent sur les instances des composants elles-mmes. Les dveloppeurs dapplications utilisent des mthodes pour que les composants effectuent des actions particulires ou renvoient des valeurs non contenues par des proprits. Comme elles ncessitent une excution de code, les mthodes ne sont disponibles quau moment de lexcution. Elles sont utiles pour plusieurs raisons : Les mthodes encapsulent la fonctionnalit dun composant dans lobjet mme o rsident les donnes.

Prsentation gnrale de la cration dun composant

40-7

Contenu dun composant ?

Les mthodes peuvent cacher des procdures compliques sous une interface simple et cohrente. Un dveloppeur dapplications peut appeler la mthode AlignControls dun composant sans savoir comment elle fonctionne ni si elle diffre de la mthode AlignControls dun autre composant. Les mthodes permettent de mettre jour plusieurs proprits avec un seul appel. Le chapitre 44, Cration de mthodes, explique comment ajouter des mthodes vos composants.

Encapsulation des graphiques


Delphi simplifie les graphiques Windows en encapsulant les diffrents outils graphiques dans un canevas. Le canevas reprsente la surface de dessin dune fentre ou dun contrle ; il contient dautres classes telles quun crayon, un pinceau et une police de caractres. Un canevas est semblable un contexte de priphrique Windows, mais il prend sa charge toutes les oprations de gestion. Si vous avez dj crit une application Windows graphique, vous connaissez les contraintes imposes par linterface graphique Windows (GDI), comme les limites sur le nombre de contextes de priphriques disponibles et lobligation de restaurer ltat initial des objets graphiques avant de les dtruire. Avec Delphi, vous navez pas besoin de vous en proccuper. Pour dessiner sur une fiche ou tout autre composant, il suffit daccder la proprit Canvas du composant. Pour personnaliser un crayon ou un pinceau, il faut dfinir une couleur ou un style. Lorsque vous avez termin, Delphi dispose des ressources. Delphi conserve les ressources en mmoire cache pour viter de les recrer, si votre application utilise frquemment le mme type de ressources. Vous pouvez toujours accder linterface GDI Windows, mais votre code sera beaucoup plus simple et sexcutera plus rapidement si vous utilisez le canevas intgr aux composants Delphi. Les fonctionnalits graphiques sont dcrites en dtail au chapitre 45, Graphiques et composants. Lencapsulation des graphiques CLX fonctionne dune manire diffrente. Un canevas est plutt un dispositif de dessin. Pour dessiner sur une fiche ou un autre composant, accdez la proprit Canvas du composant. Canvas est une proprit et cest aussi un objet appel TCanvas. TCanvas englobe un dispositif de dessin Qt accessible via la proprit Handle. Vous pouvez utiliser le handle pour accder aux fonctions de la bibliothque graphique Qt de bas niveau. Si vous voulez personnaliser un crayon ou un pinceau, dfinissez sa couleur et son style. Lorsque vous avez termin, Kylix libre les ressources. La CLX met aussi en mmoire cache les ressources. Vous pouvez utiliser le canevas construit dans les composants CLX par drivation. La faon dont les images graphiques fonctionnent dans le composant dpend du canevas de lobjet partir duquel votre composant est driv.

40-8

Guide du dveloppeur

Cration dun nouveau composant

Recensement
Avant de pouvoir installer vos composants dans lEDI de Delphi, vous devez les recenser. Le recensement indique Delphi o placer le composant sur la palette des composants. Vous pouvez aussi personnaliser la manire dont Delphi stocke les composants dans le fichier fiche. Le recensement est dcrit dans le chapitre 47, Accessibilit des composants au moment de la conception.

Cration dun nouveau composant


Vous pouvez crer un nouveau composant de deux faons : Utilisation de lexpert composant Cration manuelle dun composant Vous pouvez utiliser lune ou lautre de ces mthodes pour crer un composant aux fonctions minimales, prt tre install dans la palette des composants. Aprs linstallation, vous pouvez placer votre nouveau composant sur une fiche et le tester la fois en mode conception et en mode excution. Vous pouvez ensuite ajouter dautres fonctionnalits au composant, mettre jour la palette des composants et poursuivre les tests. Il y a quelques tapes de base suivre chaque fois que vous crez un nouveau composant. Elles sont dcrites ci-aprs ; pour les autres exemples prsents dans ce document, nous supposerons que vous savez effectuer ces tapes.

1 Cration dune unit pour le nouveau composant. 2 Drivation du composant partir dun type de composant existant. 3 Ajout de proprits, mthodes et vnements. 4 Recensement de votre composant dans Delphi. 5 Cration dun fichier daide pour le composant et ses proprits, mthodes et vnements. 6 Cration dun paquet (bibliothque dynamiquement lie sp ciale) pour pouvoir installer le composant dans lEDI de Delphi.
Lorsque vous avez termin, le composant complet est constitu des fichiers suivants : Un Un Un Un Un fichier fichier fichier fichier fichier paquet (.BPL) ou un fichier collection de paquets (.DPC) paquet compil (.DCP) unit compile (.DCU) bitmap pour la palette (.DCR) daide (.HLP)

La cration dun fichier daide lattention des utilisateurs de composants est facultative.

Prsentation gnrale de la cration dun composant

40-9

Cration dun nouveau composant

Les chapitres du reste de la partie V expliquent tous les aspects de la construction des composants et offrent des exemples complets dcriture de plusieurs sortes de composants.

Utilisation de lexpert composant


Lexpert composant simplifie les premires tapes de cration dun composant. Lorsque vous utilisez lexpert composant, il suffit de spcifier : La Le La Le Le Le classe partir de laquelle le composant est driv nom de classe du nouveau composant page de la palette des composants o vous voulez quil apparaisse nom de lunit dans laquelle le composant est cr chemin daccs cette unit nom du paquet dans lequel vous voulez placer le composant

Lexpert composant excute les oprations que vous excuteriez pour crer manuellement un composant : Cration dune unit Drivation du composant. Recensement du composant. Lexpert composant ne peut pas ajouter de composant une unit existante. Cela ne peut se faire que manuellement. Pour ouvrir lexpert composant, choisissez lune de ces deux mthodes : Choisissez Composant|Nouveau composant. Choisissez Fichier|Nouveau|Autre et double-cliquez sur Composant
Figure 40.2 Lexpert composant

Remplissez les champs de lexpert composant :

1 Dans Type anctre, spcifiez la classe partir de laquelle vous drivez le nouveau composant.
Remarque

Dans la liste droulante, de nombreux composants sont prsents deux fois avec des noms dunit diffrents, un pour la VCL et lautre pour la CLX. Les units sp cifiques la CLX commencent par Q (telles que QGraphics au lieu de Graphics). Veillez driver partir du bon composant.

40-10

Guide du dveloppeur

Cration dun nouveau composant

2 Dans Nom de classe, spcifiez le nom de classe de votre nouveau composant. 3 Dans Page de palette, spcifiez la page de la palette dans laquelle vous voulez installer le composant. 4 Dans Nom de fichier unit, spcifiez le nom de lunit dans laquelle vous voulez dclarer la classe du composant. 5 Si lunit nest pas dans le chemin de recherche, modifiez ce dernier.
Pour placer un composant dans un paquet nouveau ou non, cliquez sur Composant|Installer et spcifiez le paquet dans la bote de dialogue qui apparat.
Attention

Si vous drivez un composant dune classe de la VCL ou de la CLX dont le nom commence par custom (comme TCustomControl), ne tentez pas de le placer sur une fiche avant davoir surcharg toute mthode abstraite du composant initial. Delphi ne peut pas crer dinstance dune classe ayant des proprits ou des mthodes abstraites. Pour voir le code source de votre unit, cliquez sur Voir lunit (si lexpert composant est dj ferm, ouvrez le fichier unit dans lditeur de code en slectionnant Fichier|Ouvrir). Delphi cre une nouvelle unit contenant la dclaration de classe et la procdure Register, et ajoute une clause uses qui comprend toutes les units Delphi standard. Lunit ressemble cela dans le cas dune drivation partir de TCustomControl dans lunit Controls :
unit MyControl; interface uses Windows, Messages, SysUtils, Classes, Controls; type TMyControl = class(TCustomControl) private { dclarations prives } protected { dclarations protges } public { dclarations publiques } published { dclarations publies } end; procedure Register; implementation procedure Register; begin RegisterComponents(Samples, [TMyControl]); end; end.

Prsentation gnrale de la cration dun composant

40-11

Cration dun nouveau composant

Dans le cas dune drivation partir de TCustomControl dans lunit QControls, la seule diffrence est la clause uses qui ressemble ceci :
uses Windows, Messages, SysUtils, Classes, QControls;

Aux endroits o la CLX utilise des units distinctes, celles-ci sont remplaces par des units de mme nom prfixes par un Q ; Controls est remplac par QControls.

Cration manuelle dun composant


Le moyen le plus simple de crer un composant est dutiliser lexpert composant. Cependant, vous pouvez effectuer manuellement les mmes tapes. Pour crer un composant manuellement, suivez ces tapes :

1 Cration dun fichier unit 2 Drivation du composant 3 Recensement du composant

Cration dun fichier unit


Une unit est un module de code Pascal Objet compil sparment. Delphi emploie les units pour plusieurs raisons. Chaque fiche possde sa propre unit et la plupart des composants (ou des groupes logiques de composants) possdent aussi leurs propres units Lorsque vous crez un composant, vous crez une nouvelle unit pour ce composant ou bien vous lajoutez une unit existante. Pour crer une unit, choisissez Fichier|Nouveau et double-cliquez sur Unit. Delphi cre un nouveau fichier unit et louvre dans lditeur de code. Pour ouvrir une unit existante, choisissez Fichier|Ouvrir et slectionnez lunit de code source dans laquelle vous voulez ajouter vos composants.
Remarque

Lorsque vous ajoutez un composant une unit, vrifiez que cette unit ne contient que du code de composant. Lajout dun code de composant une unit qui contient, par exemple, une fiche, provoquera des erreurs dans la palette des composants. Une fois lunit, nouvelle ou existante, dfinie pour le composant, vous pouvez driver la classe composant.

Drivation du composant
Chaque composant est une classe drive de TComponent, de lun de ses descendants plus spcialiss (tels que TControl ou TGraphicControl) ou dune classe composant existante. Comment crer un composant ? la page 40-3 indique les classes driver pour obtenir les diffrentes sortes de composants. La drivation des classes est explique plus en dtail dans la section Dfinition de nouvelles classes la page 41-1.

40-12

Guide du dveloppeur

Cration dun nouveau composant

Pour driver un composant, ajoutez une dclaration de type objet la partie interface de lunit qui contiendra le composant. Une classe composant simple est un composant non visuel descendant directement de TComponent. Pour crer une classe composant simple, ajoutez la dclaration de classe suivante la partie interface de votre unit composant :
type TNewComponent = class(TComponent) end;

Pour linstant, le nouveau composant ne fait rien de plus que TComponent. Cest juste un squelette sur lequel vous allez btir votre nouveau composant.

Recensement du composant
Le recensement est une opration simple qui indique Delphi les composants ajouter la bibliothque des composants et les pages de la palette sur lesquelles ils doivent apparatre. Pour une prsentation plus dtaille du processus de recensement, voir chapitre 47, Accessibilit des composants au moment de la conception. Pour recenser un composant,

1 Ajoutez une procdure nomme Register la partie interface de lunit du composant. Register na pas de paramtres, la dclaration est donc trs simple :
procedure Register;

Si vous ajoutez un composant une unit qui contient dj des composants, elle doit dj avoir la procdure Register dclare, afin que vous nayiez pas changer la dclaration.

2 Ecrivez la procdureRegister dans la partie implmentation de lunit, en appelant RegisterComponents pour chaque composant que vous voulez recenser. RegisterComponents est une procdure qui prend deux paramtres : le nom dune page de palette de composants et un ensemble de types de composants. Si vous ajoutez un composant un recensement existant, vous pouvez soit ajouter le nouveau composant lensemble dans linstruction existante, soit ajouter une nouvelle instruction qui appelle RegisterComponents.
Pour recenser un composant appel TMyControl et le placer sur la page Exemples de la palette, vous devrez ajouter la procdure Register suivante lunit contenant la dclaration de TMyControl :
procedure Register; begin RegisterComponents(Samples, [TNewControl]); end;

Cette procdure Register place TMyControl sur la page Exemples de la palette des composants.

Prsentation gnrale de la cration dun composant

40-13

Test des composants non installs

Une fois le composant recens, vous pouvez le compiler dans un paquet (voir chapitre 47, Accessibilit des composants au moment de la conception) et linstaller sur la palette des composants.

Test des composants non installs


Vous pouvez tester le comportement dun composant lexcution avant de linstaller sur la palette des composants. Cette technique est particulirement utile pour le dbogage des composants nouvellement crs, mais vous pouvez lutiliser pour tester nimporte quel composant, que celui-ci apparaisse ou non sur la palette des composants. Pour plus dinformations sur le test des composants dj installs, voir Test des composants installs la page 40-15. Vous pouvez tester un composant non install en mulant les actions excutes par Delphi quand le composant est slectionn dans la palette et plac dans une fiche. Pour tester un composant non install,

1 Ajoutez le nom de lunit du composant la clause uses de lunit fiche. 2 Ajoutez un champ objet la fiche pour reprsenter le composant.
Il sagit l dune des diffrences principales entre votre faon dajouter des composants et celle utilise par Delphi. Vous ajoutez le champ objet la partie publique la fin de la dclaration de type de fiche. Delphi lajouterait audessus, dans la partie de la dclaration de type quil gre. Il ne faut jamais ajouter de champs la partie gre par Delphi de la dclaration de type de fiche. Les lments de cette partie correspondent ceux stocks dans le fichier fiche. Lajout de noms de composants qui nexistent pas sur la fiche peut rendre invalide le fichier de la fiche.

3 Attachez un gestionnaire lvnement OnCreate de la fiche. 4 Construisez le composant dans le gestionnaire OnCreate de la fiche.
Lors de lappel au constructeur du composant, vous devez transmettre un paramtre spcifiant le propritaire du composant (le composant charg de la destruction du composant au moment opportun). Il faut pratiquement toujours transmettre Self comme propritaire. Dans une mthode, Self reprsente une rfrence sur lobjet contenant la mthode. Dans ce cas, dans le gestionnaire OnCreate de la fiche, Self reprsente la fiche.

5 Initialisez la proprit Parent.


La dfinition de la proprit Parent est toujours la premire opration effectuer aprs la construction dun contrle. Le parent est le composant qui contient visuellement le contrle ; le plus souvent cest sur la fiche que le contrle apparat, mais il peut aussi sagir dune bote groupe ou dun volet. Normalement, il faut donner Parent la valeur Self, cest- dire la fiche. Dfinissez toujours Parent avant les autres proprits du contrle.

40-14

Guide du dveloppeur

Test des composants installs

Attention

Si votre composant nest pas un contrle (cest--dire si TControl nest pas un de ses anctres), passez cette tape. Si vous dfinissez accidentellement la proprit Parent de la fiche ( la place de celle du composant) la valeur Self, vous pouvez provoquer un problme du systme dexploitation.

6 Dfinissez toutes les autres proprits de composant, comme vous le souhaitez.


Supposons que vous souhaitiez tester un nouveau composant de type TMyControl dans une unit appele MyControl. Crez un nouveau projet, puis effectuez les tapes ncessaires pour avoir une unit fiche qui ressemble ceci :
unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, MyControl; { 1. Ajouter NewTest la clause uses } type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public Declarations } MyControl1: TMyControl1; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin MyControl1 := TMyControl.Create(Self); { 4. Construire le composant } MyControl1.Parent := Self; { 5. Dfinir la proprit Parent si le composant est // un contrle } MyControl1.Left := 12; { 6. Dfinir dautres proprits... ) ...continuer si ncessaire} end; end.

{ 3. Attacher un gestionnaire OnCreate }

{ 2. Ajouter un champ objet }

Test des composants installs


Vous pouvez tester le comportement dun composant la conception aprs son installation sur la palette des composants. Cette technique est particulirement utile pour le dbogage des composants nouvellement crs, mais vous pouvez lutiliser pour tester nimporte quel composant, que celui-ci apparaisse ou non sur la palette des composants. Pour plus dinformations sur le test des composants qui nont pas encore t installs, voir Test des composants non installs la page 40-14.

Prsentation gnrale de la cration dun composant

40-15

Test des composants installs

Le test de vos composants aprs linstallation vous permet de dboguer le composant qui gnre seulement des exceptions la conception lorquil est dpos sur une fiche. Testez un composant install en excutant une seconde instance de Delphi :

1 A partir de lenvironnement de dveloppement intgr de Delphi, slectionnez Projet|Options|et sur la page Rpertoires/Conditions, affectez la zone Sources de dbogage le fichier source du composant. 2 Slectionnez ensuite Outils| Options du dbogueur. Sur la page Exceptions du langage, activez les exceptions suivre. 3 Ouvrez le fichier source du composant et dfinissez des points darrt. 4 Slectionnez Excuter|Paramtres et affectez au champ Application hte le nom et lemplacement du fichier excutable de Delphi. 5 Dans la bote de dialogue Paramtres dexcution, cliquez sur le bouton Charger pour dmarrer une seconde instance de Delphi. 6 Dposez ensuite les composants tester sur la fiche, ce qui devrait provoquer larrt sur les points darrt dfinis dans le source.

40-16

Guide du dveloppeur

41
Chapitre 41

Chapitre

Programmation oriente objet et criture des composants

Si vous avez crit des applications avec Delphi, vous savez dj quune classe contient la fois du texte et du code, et que les classes sont manipulables aussi bien au moment de la conception qu lexcution. Cest ainsi que vous tes devenu utilisateur de composants. Lorsque vous crez de nouveaux composants, votre approche des classes nest pas celle du dveloppeur dapplications standard. Vous essayez de cacher les travaux internes du composant aux dveloppeurs qui vont les utiliser. En choisissant les anctres appropris vos composants, en concevant des interfaces qui exposent seulement les proprits et les mthodes dont les dveloppeurs ont besoin, en suivant les autres conseils de ce chapitre, vous pourrez crer des composants rutilisables parfaitement maniables. Avant de commencer crer des composants, vous devez comprendre les sujets suivants qui se rapportent la programmation oriente objet (OOP) : Dfinition de nouvelles classes Anctres, descendants et hirarchies des classes Contrle des accs Rpartition des mthodes Membres abstraits dune classe Classes et pointeurs

Dfinition de nouvelles classes


La diffrence entre un concepteur de composants et un dveloppeur dapplications est la suivante : le concepteur de composants cre de nouvelles classes et le dveloppeur dapplications manipule les instances de ces classes.

Programmation oriente objet et criture des composants

41-1

Dfinition de nouvelles classes

Une classe est dabord un type. Comme programmeur, vous travaillez sans arrt avec les types et les instances, mme si vous ne parlez pas en ces termes. Par exemple, vous crez des variables dun certain type, par exemple Integer. Les classes sont habituellement plus complexes que de simples types de donnes, mais elles fonctionnent de la mme faon : en affectant diffrentes valeurs aux instances dun mme type, vous effectuez diffrentes tches. Par exemple, il est courant de crer une fiche contenant deux boutons appels OK et Annuler. Chacun correspond une instance de la classe TButton, mais, en attribuant une valeur diffrente leurs proprits Caption et diffrents gestionnaires leurs vnements OnClick, vous faites se comporter diffremment les deux instances.

Drivation de nouvelles classes


Deux raisons peuvent vous amener driver une nouvelle classe : Modifier les valeurs par dfaut dune classe pour viter les rptitions Ajout de nouvelles capacits une classe Lobjectif est le mme dans ces deux cas : crer des objets rutilisables. Si vous concevez vos objets en ayant en tte leur rutilisation, vous gagnerez un temps considrable. Attribuez vos classes des valeurs par dfaut exploitables mais rendez-les personnalisables.

Modifier les valeurs par dfaut dune classe pour viter les rptitions
Dans tout programme, les rptitions superflues sont proscrire. Si vous vous surprenez rpter les mmes lignes de code, vous serez sans doute amen les placer part dans une sous-routine ou fonction, ou encore construire une bibliothque de routines utilisables par un autre programme. Le mme raisonnement sapplique aux composants. Si vous modifiez frquemment les mmes proprits ou si vous appelez les mmes mthodes, vous crerez sans doute un nouveau composant qui effectue ces tches par dfaut. Par exemple, supposons qu chaque cration dune nouvelle application, vous ajoutez une bote de dialogue accomplissant une fonction dtermine. Bien quil soit simple de recrer chaque fois cette bote de dialogue, cest superflu. Vous pouvez concevoir la bote de dialogue une fois pour toute, dfinir ses proprits puis installer le composant enveloppe associ dans la palette des composants. En faisant du dialogue un composant rutilisable, non seulement vous liminez une tche rptitive mais renforcez la standardisation et minimisez les erreurs qui peuvent tre occasionnes par chaque nouvelle cration de la bote de dialogue. Le chapitre 48, Modification dun composant existant, montre un exemple qui modifie les proprits par dfaut dun composant.
Remarque

Si vous voulez ne modifier que les proprits publies dun composant existant ou enregistrer des gestionnaires dvnement spcifiques un composant ou un groupe de composants, vous pourrez accomplir ceci plus facilement en crant un modle de composant.

41-2

Guide du dveloppeur

Anctres, descendants et hirarchies des classes

Ajout de nouvelles capacits une classe


Une raison classique de crer de nouveaux composants est lajout de fonctionnalits qui ne se trouvent pas dans les composants existants. Pour cela, vous drivez le nouveau composant partir dun composant existant ou partir dune classe de base abstraite, comme TComponent ou TControl. Drivez votre nouveau composant partir de la classe contenant le sousensemble le plus proche des caractristiques recherches. Vous pouvez ajouter des fonctionnalits une classe, mais vous ne pouvez pas en soustraire. Par consquent, si une classe de composant contient des proprits que vous ne souhaitez pas inclure dans la vtre, effectuez la drivation partir de lanctre de ce composant. Par exemple, pour ajouter des fonctionnalits une bote liste, vous devez driver un nouveau composant partir de TListBox. Mais, si vous souhaitez ajouter de nouvelles fonctionnalits et exclure certaines de celles des botes liste standard, il vous faut driver votre bote liste de lanctre de TListBox, TCustomListBox. Recrez (ou rendez visibles) les fonctionnalits de la bote liste que vous voulez, puis ajoutez vos propres fonctionnalits. Le chapitre 50, Personnalisation dune grille , montre un exemple qui personnalise une classe abstraite de composant.

Dclaration dune nouvelle classe de composant


Outre les composants standard, Delphi fournit de nombreuses classes abstraites qui serviront de base pour driver de nouveaux composants. Le tableau 40.1 la page 40-3 montre les classes que vous pouvez utiliser pour crer vos propres composants. Pour dclarer une nouvelle classe de composant, ajoutez une dclaration de classe au fichier unit du composant. Voici la dclaration dun composant graphique simple :
type TSampleShape = class(TGraphicControl) end;

Une dclaration de des proprits, des dclaration comme dpart pour lajout

composant acheve comprend gnralement la dclaration vnements et des mthodes avant le end. Mais une celle ci-dessus est aussi admise et reprsente un point de de fonctionnalits votre composant.

Anctres, descendants et hirarchies des classes


Les dveloppeurs dapplications peuvent se servir du fait que chaque contrle a des proprits Top et Left qui dterminent son emplacement sur la fiche. Pour eux, il importe peu que tous les contrles aient hrit ces proprits dun anctre commun, TControl. Mais, lorsque vous crivez un composant, vous devez savoir

Programmation oriente objet et criture des composants

41-3

Contrle des accs

partir de quelle classe vous le drivez de faon ce quil reoive en hritage les lments que vous souhaitez. Vous devez galement connatre toutes les fonctionnalits dont hrite votre composant de manire les exploiter sans avoir les recrer vous-mme. La classe partir de laquelle vous effectuez la drivation est lanctre immdiat. Chaque composant hrite de son anctre immdiat, et lui-mme de son anctre immdiat. Toutes les classes dont hrite un composant sont les anctres de ce composant ; le composant est un descendant de ces anctres. Lensemble des relations anctre-descendant de lapplication constitue les hirarchies des classes. Dans cette hirarchie, chaque gnration contient plus que ses anctres puisquune classe hrite de tout ce que contiennent ses anctres et ajoute de nouvelles proprits et de nouvelles mthodes, ou redfinit celles qui existent. Si vous ne spcifiez aucun anctre immdiat, Delphi drive votre composant partir de lanctre par dfaut, TObject. TObject est le dernier anctre de toutes les classes de la hirarchie dobjets. La rgle gnrale du choix de lobjet de dpart de la drivation est simple : prenez lobjet qui contient le plus possible ce que vous voulez inclure dans votre nouvel objet, mais qui ne comprend rien de ce que vous ne voulez pas dans le nouvel objet. Vous pouvez toujours ajouter des choses vos objets, mais vous ne pouvez pas en retirer.

Contrle des accs


Il existe cinq niveaux de contrle daccs, galement appel visibilit, aux proprits, mthodes et champs. La visibilit dtermine quel code peut accder quelles parties de la classe. En spcifiant la visibilit, vous dfinissez linterface de vos composants. montre les niveaux de visibilit, en allant du plus restrictif au plus accessible:
Tableau 41.1 Visibilit
private protected

Niveaux de visibilit dun objet Signification


Accessible uniquement au code de lunit o est dfinie la classe. Accessible au code de ou des units o sont dfinis la classe et ses descendants. Accessible tout le code. Accessible tout le code. Les informations dautomatisation sont gnres. Accessible tout le code et depuis linspecteur dobjets.

Utilis pour
Masquer les dtails dimplmentation. Dfinition de linterface avec le concepteur des composants. Dfinition de linterface dexcution. Automatisation OLE seulement.

public automated

published

Dfinition de linterface de conception.

41-4

Guide du dveloppeur

Contrle des accs

Dclarez les membres en private si vous voulez quils ne soient disponibles que dans la classe o ils ont t dfinis. Dclarez-les en protected si vous voulez quils ne soient disponibles que dans cette classe et ses descendants. Souvenezvous que si un membre est disponible nimporte o dans un fichier unit, il est disponible partout dans ce fichier. Ainsi, si vous dfinissez deux classes dans la mme unit, elles pourront accder lune ou lautre des mthodes prives. Et si vous drivez une classe dans une unit diffrente de son anctre, toutes les classes de la nouvelle unit pourront accder aux mthodes protges de lanctre.

Masquer les dtails dimplmentation


Dclarer private une partie dune classe rend cette partie invisible au code situ hors du fichier unit de la classe. Dans lunit qui contient la dclaration, le code peut accder cette partie comme si elle tait publique. Voici un exemple qui montre comment le fait de dclarer une donne membre private empche les utilisateurs daccder aux informations. La liste montre les deux units de fiche VCL. Chaque fiche a un gestionnaire pour son vnement OnCreate qui affecte une valeur la donne membre private. Le compilateur autorise laffectation la donne membre uniquement dans la fiche o elle a t dclare.
unit HideInfo; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs; type TSecretForm = class(TForm) procedure FormCreate(Sender: TObject); private FSecretCode: Integer; end; var SecretForm: TSecretForm; implementation procedure TSecretForm.FormCreate(Sender: TObject); begin FSecretCode := 42; end; end. unit TestHide; { dclare une nouvelle fiche } { dclare la partie prive } { dclare une donne membre private }

{ ceci se compile correctement } { fin de lunit } { il sagit du fichier fiche principal }

interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, HideInfo; { utilise lunit avec TSecretForm } type TTestForm = class(TForm) procedure FormCreate(Sender: TObject); end; var

Programmation oriente objet et criture des composants

41-5

Contrle des accs

TestForm: TTestForm; implementation procedure TTestForm.FormCreate(Sender: TObject); begin SecretForm.FSecretCode := 13; end; end.

{ le compilateur sarrte avec // "Identificateur de champ attendu" }

{ fin de lunit}

Bien quun programme utilisant lunit HideInfo puisse utiliser des objets de type TSecretForm, il ne peut pas accder la donne membre FSecretCode dans aucun de ces objets.

Dfinition de linterface avec le concepteur des composants


Dclarer protected une partie dune classe rend cette partie uniquement visible par cette classe et par ses descendants (et par les autres classes qui partagent leurs fichiers unit). Vous pouvez utiliser les dclarations protected pour dfinir linterface de conception des composants dune classe. Les units de lapplication ne peuvent pas accder aux parties protected, mais les classes drives le peuvent. Cela signifie que les concepteurs des composants peuvent modifier la faon dont fonctionne une classe sans rendre apparents ces dtails aux dveloppeurs dapplications.
Remarque

Une erreur commune consiste essayer daccder aux mthodes protges dun gestionnaire dvnement. Les gestionnaires dvnements sont gnralement des mthodes de la fiche, et non du composant qui reoit lvnement. Par consquent, ils naccdent pas aux mthodes protges du composant ( moins que le composant ne soit dclar dans la mme unit que la fiche).

Dfinition de linterface dexcution


Dclarer public une partie dune classe rend cette partie visible par tout code qui dispose dun accs global cette classe. Les parties publiques sont disponibles lensemble du code lors de lexcution, et constituent par l-mme linterface dexcution. Linterface dexcution sert aux lments qui sont sans signification ou inappropris au moment de la conception ; comme les proprits contenant des informations uniquement disponibles lexcution ou accessibles uniquement en lecture. Les mthodes destines tre appeles par les dveloppeurs dapplications doivent galement tre publiques. Voici un exemple montrant deux proprits accessibles uniquement en lecture et dclares comme faisant partie de linterface dexcution dun composant :
type TSampleComponent = class(TComponent) private FTempCelsius: Integer;

{ les dtails de limplmentation sont privs }

41-6

Guide du dveloppeur

Rpartition des mthodes

function GetTempFahrenheit: Integer; public property TempCelsius: Integer read FTempCelsius; { les proprits sont publiques } property TempFahrenheit: Integer read GetTempFahrenheit; end; function TSampleComponent.GetTempFahrenheit: Integer; begin Result := FTempCelsius * 9 div 5 + 32; end;

Dfinition de linterface de conception


Dclarer published une partie dune classe rend publique cette partie et gnre galement les informations de types lexcution. Entre autres rles, les informations de types lexcution permettent linspecteur dobjets daccder aux proprits et aux vnements. Parce quils apparaissent dans linspecteur dobjets, les parties published dune classe dfinissent linterface de conception de cette classe. Linterface de conception doit inclure toutes les caractristiques dune classe quun dveloppeur dapplications peut vouloir personnaliser au moment de la conception, tout en excluant toutes les proprits qui dpendent dune information spcifique issue de lenvironnement dexcution. Les proprits accessibles en lecture uniquement ne peuvent pas faire partie de linterface de conception car le dveloppeur dapplications ne peut pas leur affecter des valeurs directement. Les proprits accessibles en lecture uniquement doivent donc tre dclares public plutt que published. Voici lexemple dune proprit published nomme Temperature. De ce fait, elle apparat dans linspecteur dobjets au moment de la conception.
type TSampleComponent = class(TComponent) private FTemperature: Integer; { les dtails dimplmentation sont privs } published property Temperature: Integer read FTemperature write FTemperature; { peut scrire ! } end;

Rpartition des mthodes


Le terme de Dispatch fait rfrence la faon dont un programme dtermine o il doit rechercher une mthode de classe lorsquil rencontre un appel cette mthode. Le code qui appelle une mthode de classe ressemble tout autre appel de fonction. Mais les classes ont des faons diffrentes de rpartir les mthodes.

Programmation oriente objet et criture des composants

41-7

Rpartition des mthodes

Les trois types de rpartition de mthodes sont Statique Virtuel Dynamique

Mthodes statiques
Toutes les mthodes sont statiques moins que vous ne les dclariez spcifiquement autrement. Les mthodes statiques fonctionnent comme des procdures ou des fonctions normales. Le compilateur dtermine ladresse exacte de la mthode et la lie au moment de la compilation. Le premier avantage des mthodes statiques est quelles sont rparties trs rapidement. Comme le compilateur peut dterminer ladresse exacte de la mthode, il la lie directement. Les mthodes virtuelles et dynamiques, au contraire, utilisent des moyens indirects pour donner ladresse de leurs mthodes lors de lexcution, ce qui prend davantage de temps. Une mthode statique ne change pas lorsquelle est hrite dune classe descendante. Si vous dclarez une classe comprenant une mthode statique, puis drivez une nouvelle classe partir de celle-ci, la classe drive partage exactement la mme mthode la mme adresse. Cela signifie que vous ne pouvez pas redfinir des mthodes statiques. Une mthode statique ralise toujours la mme chose quelle que soit la classe qui y est appele. Si vous dclarez une mthode dans une classe drive ayant le mme nom quune mthode statique dans la classe anctre, la nouvelle mthode remplace simplement celle hrite dans la classe drive.

Exemple de mthodes statiques


Dans le code suivant, le premier composant dclare deux mthodes statiques. Le deuxime dclare deux mthodes statiques de mme nom qui remplacent les mthodes hrites du premier composant.
type TFirstComponent = class(TComponent) procedure Move; procedure Flash; end; TSecondComponent = class(TFirstComponent) procedure Move; { diffrent de la mthode hrite, malgr la mme dclaration } function Flash(HowOften: Integer): Integer; { cest aussi diffrent } end;

Mthodes virtuelles
Les mthodes virtuelles emploient un mcanisme de rpartition plus compliqu et plus souple que les mthodes statiques. Une mthode virtuelle peut tre redfinie dans des classes descendantes, mais est toujours appele dans la classe anctre. Ladresse dune mthode virtuelle nest pas dtermine lors de la

41-8

Guide du dveloppeur

Rpartition des mthodes

compilation ; la place, lobjet o la mthode est dfinie donne ladresse lors de lexcution. Pour quune mthode soit virtuelle, ajoutez la directive virtual aprs la dclaration de la mthode. La directive virtual cre une entre dans le tableau de mthode virtuelle, de lobjet, ou VMT, qui contient les adresses de toutes les mthodes virtuelles dun type objet. Lorsque vous drivez une nouvelle classe dune classe existante, la nouvelle classe a son propre VMT, qui comprend toutes les entres provenant du VMT de lanctre plus toutes les mthodes virtuelles supplmentaires dclares dans la nouvelle classe.

Surcharge des mthodes


Surcharger une mthode signifie ltendre ou la redfinir plutt que la remplacer. Une classe descendante peut surcharger toutes ses mthodes virtuelles hrites. Pour surcharger une mthode dans une classe descendante, ajoutez la directive override la fin de la dclaration de mthode. La surcharge dune mthode provoque une erreur de compilation si La mthode nexiste pas dans la classe anctre. La mthode de lanctre du mme nom est statique. Les dclarations ne sont pas identiques (le numro et le type des paramtres arguments diffrent). Le code suivant montre la dclaration de deux composants simples. Le premier dclare trois mthodes, chacune avec un type de rpartition diffrent. Lautre, driv du premier, remplace la mthode statique et surcharge les mthodes virtuelles.
type TFirstComponent = class(TCustomControl) procedure Move; { mthode statique } procedure Flash; virtual; { mthode virtuelle } procedure Beep; dynamic; { mthode virtuelle dynamique } end; TSecondComponent = class(TFirstComponent) procedure Move; { dclare une nouvelle mthode } procedure Flash; override; { surcharge la mthode hrite } procedure Beep; override; { surcharge la mthode hrite } end;

Mthodes dynamiques
Les mthodes dynamiques sont des mthodes virtuelles avec un mcanisme de rpartition lgrement diffrent. Comme les mthodes dynamiques nont pas dentres dans le tableau de mthode virtuelle de lobjet, elles peuvent rduire la taille de la mmoire consomme par les objets. Cependant les mthodes de rpartition dynamiques sont quelque peu plus lentes que les mthodes de rpartition virtuelles normales. Si une mthode est frquemment appele, ou si

Programmation oriente objet et criture des composants

41-9

Membres abstraits dune classe

son excution ncessite un temps court, vous devrez probablement la dclarer virtuelle plutt que dynamique. Les objets doivent stocker les adresses de leurs mthodes dynamiques. Mais plutt que de recevoir les entres dans le tableau de mthode virtuelle, les mthodes dynamiques sont indiques sparment. La liste des mthodes dynamiques contient des entres uniquement pour les mthodes introduites ou surcharges par une classe particulire (le tableau de mthode virtuelle, linverse, comprend toutes les mthodes virtuelles de lobjet, la fois hrites et introduites). Les mthodes dynamiques hrites sont rparties en cherchant chaque liste de mthode dynamique de lanctre, en allant en arrire dans larborescence de lhritage. Pour rendre une mthode dynamique, ajoutez la directive dynamic aprs la dclaration de mthode.

Membres abstraits dune classe


Lorsquune mthode est dclare abstract dans une classe anctre, vous devez la surfacer (cest--dire la redclarer et limplmenter) dans tout composant descendant avant dutiliser le nouveau composant dans les applications. Delphi ne peut crer dinstance dune classe contenant des membres abstraits. Pour plus dinformations sur le surfaage des constituants hrits des classes, voir chapitre 42, Cration de proprits, et chapitre 44, Cration de mthodes.

Classes et pointeurs
Chaque classe (et par consquent chaque composant) est en fait un pointeur. Le compilateur drfrence automatiquement les pointeurs de classe votre place, aussi navez-vous gnralement pas besoin de vous poser ces questions. Le statut des classes en tant que pointeurs devient important lorsque vous passez une classe comme paramtre. En gnral, vous transmettrez les classes par valeur plutt que par rfrence. Car les classes sont dj des pointeurs, cest--dire des rfrences ; transmettre une classe par rfrence serait transmettre une rfrence une rfrence.

41-10

Guide du dveloppeur

42
Chapitre 42

Chapitre

Cration de proprits

Les proprits sont la partie la plus visible des composants. Le dveloppeur dapplications a la possibilit de les voir et de les manipuler au moment de la conception et dispose dun retour immdiat au fur et mesure que ragissent les composants dans le concepteur de fiches. Les proprits conues correctement facilitent lutilisation de vos composants par dautres personnes et leur maintenance par vous-mme. Pour utiliser de faon optimale les proprits de vos composants, vous devez connatre les points suivants : Pourquoi crer des proprits ? Types de proprits Publication des proprits hrites Dfinition des proprits Cration de proprits tableau Stockage et chargement des proprits

Pourquoi crer des proprits ?


Du point de vue du dveloppeur dapplications, les proprits ressemblent des variables. Les dveloppeurs peuvent dfinir ou lire les valeurs des proprits comme sil sagissait de champs. La seule opration interdite avec une proprit et autorise avec une variable consiste la transmettre comme paramtre var. Les proprits ont une puissance bien sup rieure celle de simples champs car Les dveloppeurs dapplications peuvent dfinir des proprits au moment de la conception. Contrairement aux mthodes, qui ne sont accessibles qu lexcution, les proprits permettent au dveloppeur de personnaliser les composants avant lexcution de lapplication. Les proprits apparaissent dans linspecteur dobjets, ce qui simplifie le travail du programmeur ; au lieu de traiter plusieurs paramtres pour construire un objet, il laisse Delphi lire

Cration de proprits

42-1

Types de proprits

des valeurs dans linspecteur dobjets. Linspecteur dobjets valide les affectations des valeurs aux proprits ds quelles sont effectues. Les proprits peuvent masquer les dtails de limplmentation. Par exemple, des donnes stockes de faon interne sous une forme crypte peuvent apparatre non cryptes en tant que la valeur dune proprit ; bien que la valeur puisse tre un simple nombre, le composant peut rechercher cette valeur dans une base de donnes ou effectuer des calculs complexes afin de la rcuprer. Les proprits permettent dassocier des oprations complexes une simple affectation ; ce qui apparat comme laffectation dun champ correspond en fait un appel de mthode et cette dernire peut accomplir peu prs nimporte quelle tche. Les proprits peuvent tre virtuelles. Ce qui parat tre une seule proprit pour le dveloppeur dapplications peut tre implment de manire diffrente dans des composants diffrents. Un exemple simple est la proprit Top que tous les contrles possdent. Lattribution dune nouvelle valeur Top na pas pour seul effet de modifier une valeur mmorise ; elle provoque aussi le dplacement et le raffichage du contrle. Les effets de la dfinition dune proprit ne se limitent pas ncessairement un composant unique ; par exemple, donner la valeur True la proprit Down dun turbobouton a pour effet dattribuer la valeur False tous les autres turboboutons du mme groupe.

Types de proprits
Une proprit peut avoir un type quelconque. Les divers types sont affichs de manire diffrente dans linspecteur dobjets, ce qui valide laffectation des proprits effectues au moment de la conception.
Tableau 42.1
Simple

Affichage des proprits dans linspecteur dobjets Traitement de linspecteur d objets


Les proprits de type num rique, caractre et chane apparaissent dans linspecteur dobjets comme des nombres, caractres et chanes. Le dveloppeur dapplications peut modifier directement la valeur de ces proprits. Les proprits de type num r (y compris le type Boolean) apparaissent comme des chanes ditables. Le dveloppeur peut galement passer en revue toutes les valeurs possibles en double-cliquant sur la colonne contenant la valeur et il existe une liste droulante montrant toutes les valeurs possibles. Les proprits de type ensemble apparaissent dans linspecteur dobjets comme des ensembles. En double-cliquant sur la proprit, le dveloppeur peut dvelopper lensemble et traiter chacun des lments comme une valeur boolenne (true si cet lment appartient lensemble).

Type de proprit

Enumr

Ensemble

42-2

Guide du dveloppeur

Publication des proprits hrites

Tableau 42.1
Objet

Affichage des proprits dans linspecteur dobjets (suite) Traitement de linspecteur d objets
Les proprits qui sont elles-mmes des classes ont souvent leur propre diteur de proprits, qui est spcifi dans la procdure de recensement du composant. Si la classe dune proprit a ses propres proprits publies (published), linspecteur dobjets permet au dveloppeur dtendre la liste (en double-cliquant) afin dinclure ces proprits et de les modifier individuellement. Les proprits doivent descendre de TPersistent. Les proprits tableau doivent disposer dun diteur de proprits spcifique. Linspecteur dobjets ne dispose daucune fonction intgre permettant de modifier les proprits de ce type. Vous pouvez spcifier un diteur de proprits lorsque vous recensez vos composants.

Type de proprit

Tableau

Publication des proprits hrites


Tous les composants hritent des proprits de leurs classes anctre. Lorsque vous drivez un composant partir dun composant existant, le nouveau composant hrite de toutes les proprits de lanctre immdiat. Si vous effectuez la drivation partir dune des classes abstraites, aucune des proprits hrites nest published, la plupart sont protected ou public. Pour rendre disponible dans linspecteur dobjets une proprit protected ou private au moment de la conception, vous devez redclarer published la proprit. Redclarer une proprit signifie ajouter la dclaration dune proprit hrite la dclaration de la classe descendante. Si vous drivez un composant VCL de TWinControl, par exemple, il hrite de la proprit protge DockSite. En redclarant DockSite dans votre nouveau composant, vous pouvez changer le niveau de protection en public ou publi. Le code suivant montre une redclaration de DockSite en publi, le rendant disponible lors de la conception.
type TSampleComponent = class(TWinControl) published property DockSite; end;

Lorsque vous redclarez une proprit, vous spcifiez uniquement le nom de la proprit, non le type ni les autres informations dcrites ci-dessous dans D finition des proprits. Vous pouvez aussi dclarer de nouvelles valeurs par dfaut et spcifier si la proprit est ou non stocke. Les redclarations peuvent augmenter la visibilit dune proprit, mais pas la rduire. Vous pouvez ainsi rendre une proprit protge publique, mais vous ne pouvez pas masquer une proprit publique en la redclarant protge.

Cration de proprits

42-3

Dfinition des proprits

Dfinition des proprits


Cette section montre comment dclarer de nouvelles proprits et explique certaines conventions respectes par les composants standard. Ces rubriques comprennent : Dclaration des proprits Stockage interne des donnes Accs direct Mthodes daccs Valeurs par dfaut dune proprit

Dclaration des proprits


Une proprit est dclare dans la dclaration de sa classe composant. Pour dclarer une proprit, vous devez spcifier les trois lments suivants : Le nom de la proprit. Le type de la proprit. Les mthodes utilises pour lire et crire la valeur de la proprit. Si aucune mthode dcriture nest dclare, la proprit est accessible uniquement en lecture. Les proprits dclares dans une section published de la dclaration de classe du composant sont modifiables dans linspecteur dobjets lors de la conception. La valeur dune proprit published est enregistre avec le composant dans le fichier fiche. Les proprits dclares dans une section public sont accessibles lexcution et peuvent tre lues ou dfinies par le code du programme. Voici une dclaration typique pour une proprit appele Count.
type TYourComponent = class(TComponent) private FCount: Integer; { utilis pour le stockage interne } procedure SetCount (Value: Integer); { mthode dcriture } public property Count: Integer read FCount write SetCount; end;

Stockage interne des donnes


Il nexiste aucune restriction quant au stockage des donnes dune proprit. Toutefois, les composants Delphi respectent gnralement les conventions suivantes : Les donnes des proprits sont stockes dans des champs. Les champs utiliss pour stocker les donnes dune proprit sont dclars private et ne peuvent tre accdes qu partir du composant lui-mme. Les composants drivs doivent utiliser la proprit hrite ; ils ne ncessitent pas un accs direct au stockage interne des donnes de la proprit.

42-4

Guide du dveloppeur

Dfinition des proprits

Les identificateurs de ces champs sont composs de la lettre F suivie du nom de la proprit. Par exemple, la donne brute de la proprit Width dfinie pour TControl est stocke dans un champ appel FWidth. Le principe qui sous-tend ces conventions est le suivant : seules les mthodes dimplmentation dune proprit doivent pouvoir accder aux donnes associes cette proprit. Si une mthode ou une autre proprit a besoin de changer ces donnes, elle doit le faire via la proprit et non directement par un accs aux donnes stockes. Cela garantit que limplmentation dune proprit hrite puisse tre modifie sans invalider les composants drivs.

Accs direct
Laccs direct est le moyen le plus simple daccder aux donnes dune proprit. Autrement dit, les parties read et write de la dclaration dune proprit spcifient que laffectation ou la lecture de la valeur de la proprit seffectue directement dans le champ de stockage interne sans appel une mthode daccs. Laccs direct est utile lorsque vous voulez rendre une proprit accessible dans linspecteur dobjets, mais que vous ne voulez pas que le changement de sa valeur dclenche un processus immdiatement. En gnral, vous dfinirez un accs direct pour la partie read dune dclaration de proprit et utiliserez une mthode daccs pour la partie write. Cela permet de mettre jour ltat du composant lorsque la valeur de la proprit change. La dclaration de type composant suivante montre une proprit qui utilise laccs direct pour les parties read et write.
type TSampleComponent = class(TComponent) private { le stockage interne est priv } FMyProperty: Boolean; { dclare la donne membre pour contenir la valeur } published { rend la proprit disponible la conception } property MyProperty: Boolean read FMyProperty write FMyProperty; end;

Mthodes daccs
Vous pouvez spcifier une mthode daccs plutt quun champ dans les parties read et write dune dclaration de proprit. Les mthodes daccs doivent tre protected, et sont habituellement dclares comme virtual ; cela autorise les composants descendants surcharger limplmentation de la proprit. Evitez de rendre publiques les mthodes daccs. Les conserver protected vous prmunit contre toute modification accidentelle dune proprit par un dveloppeur dapplications qui appellerait ces mthodes. Voici une classe qui dclare trois proprits en utilisant le spcificateur dindex, qui autorise aux trois proprits davoir les mmes mthodes daccs en lecture et en criture :
type TSampleCalendar = class(TCustomGrid)

Cration de proprits

42-5

Dfinition des proprits

public property Day: Integer index 3 read GetDateElement write SetDateElement; property Month: Integer index 2 read GetDateElement write SetDateElement; property Year: Integer index 1 read GetDateElement write SetDateElement; private function GetDateElement(Index: Integer): Integer; { remarquez le paramtre Index } procedure SetDateElement(Index: Integer; Value: Integer);

Comme chaque lment de la date (day, month et year) est un int et comme la dfinition de chacun requiert le codage de la date lorsquelle est dfinie, le code vite la duplication en partageant les mthodes de lecture et dcriture pour les trois proprits. Vous navez besoin que dune seule mthode pour lire un lment date et une autre pour crire llment date. Voici la mthode read qui obtient llment date :
function TSampleCalendar.GetDateElement(Index: Integer): Integer; var AYear, AMonth, ADay: Word; begin DecodeDate(FDate, AYear, AMonth, ADay); { dcompose la date code en lments } case Index of 1: Result := AYear; 2: Result := AMonth; 3: Result := ADay; else Result := -1; end; end;

Voici la mthode write qui dfinit llment date appropri :


procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); var AYear, AMonth, ADay: Word; begin if Value > 0 then { tous les lments doivent tre positifs begin DecodeDate(FDate, AYear, AMonth, ADay); { prend les lments date actuels case Index of { dfinit le nouvel lment selon Index 1: AYear := Value; 2: AMonth := Value; 3: ADay := Value; else Exit; end; FDate := EncodeDate(AYear, AMonth, ADay); { code la date modifie Refresh; { actualise le calendrier visible end; end;

} } }

} }

Mthode read
La mthode read dune proprit est une fonction qui naccepte aucun paramtre (sauf pour ce qui est mentionn ci-aprs) et renvoie une valeur du mme type que la proprit. Par convention, le nom de la fonction est Get suivi du nom de la proprit. Par exemple, la mthode read pour une proprit intitule Count

42-6

Guide du dveloppeur

Dfinition des proprits

serait GetCount . La mthode read manipule les donnes internes afin de gnrer une valeur de la proprit respectant le type demand. Les seules exceptions la rgle aucun paramtre sont les proprits tableau et les proprits qui utilisent un spcificateur dindex (voir Cration de proprits tableau la page 42-8), pour lesquelles cet index est transmis comme paramtre. Utilisez des spcificateurs dindex pour crer une mthode read unique partage par plusieurs proprits. Pour plus dinformations sur les spcificateurs dindex, consultez le Guide du langage Pascal Objet. Si vous ne dclarez aucune mthode read, la proprit fonctionne uniquement en criture. Les proprits fonctionnant en criture uniquement sont trs rares.

Mthode write
La mthode write dune proprit est une procdure acceptant un seul paramtre (sauf pour ce qui est mentionn ci-aprs) du mme type que la proprit. Le paramtre peut tre transmis par rfrence ou par valeur et peut porter le nom de votre choix. Par convention, le nom de la mthode write est Set suivi du nom de la proprit. Par exemple, la mthode write dune proprit intitule Count serait SetCount. La valeur transmise en paramtre devient la nouvelle valeur de la proprit ; la mthode write doit accomplir les manipulations ncessaires pour placer les donnes concernes lemplacement de stockage interne de la proprit. Les seules exceptions la rgle paramtre unique sont les proprits tableau et les proprits qui utilisent un spcificateur dindex, pour lesquelles cet index est transmis comme second paramtre. Utilisez des spcificateurs dindex pour crer une mthode read unique partage par plusieurs proprits. Pour plus dinformations sur les spcificateurs dindex, consultez le Guide du langage Pascal Objet. Si vous ne dclarez aucune mthode write, la proprit fonctionne uniquement en lecture. Les mthodes write testent normalement si une nouvelle valeur diffre de la valeur actuelle avant de modifier la proprit. Par exemple, voici une mthode write simple dune proprit de type entier appele Count stockant sa valeur courante dans un champ appel FCount .
procedure TMyComponent.SetCount(Value: Integer); begin if Value <> FCount then begin FCount := Value; Update; end; end;

Valeurs par dfaut dune proprit


Lorsque vous dclarez une proprit, vous pouvez dclarer une valeur par dfaut. Delphi utilise cette valeur par dfaut pour dterminer si une proprit doit tre stocke dans un fichier fiche. Si vous ne donnez pas de valeur par dfaut une proprit, Delphi stocke toujours cette proprit.

Cration de proprits

42-7

Cration de proprits tableau

Pour spcifier une valeur par dfaut pour une proprit, ajoutez la directive default la dclaration (ou la redclaration) de la proprit, suivie par la valeur par dfaut. Par exemple,
property Cool Boolean read GetCool write SetCool default True; Remarque

Dclarer une valeur par dfaut pour une proprit na pas pour effet de dfinir cette proprit par cette valeur. La mthode constructeur du composant doit initialiser la valeur des proprits lorsque cest ncessaire. Toutefois, comme les objets initialisent toujours leurs champs 0, il nest pas ncessaire que le constructeur initialise les proprits entires 0, les proprits chanes null ni les proprits boolennes False.

Spcification daucune valeur par dfaut


Lorsque vous redclarez une proprit, vous pouvez indiquer que la proprit ne possde pas de valeur par dfaut, mme si une telle valeur est dfinie pour la proprit reue en hritage. Pour indiquer quune proprit na pas de valeur par dfaut, ajoutez la directive nodefault la dclaration de la proprit. Par exemple,
property FavoriteFlavor string nodefault;

Lorsque vous dclarez une proprit pour la premire fois, vous ntes pas oblig de spcifier nodefault car, dans ce cas, labsence de valeur par dfaut a la mme signification. Voici la dclaration dun composant qui comprend une proprit boolenne unique appele IsTrue dont la valeur par dfaut est True. La dclaration cidessous (dans la section implmentation de lunit) reprsente le constructeur qui initialise la proprit.
type TSampleComponent = class(TComponent) private FIsTrue: Boolean; public constructor Create(AOwner: TComponent); override; published property IsTrue: Boolean read FIsTrue write FIsTrue default True; end; constructor TSampleComponent.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelle le constructeur hrit } FIsTrue := True; { dfinit la valeur par dfaut } end;

Cration de proprits tableau


Certaines proprits se prtent lindexation. Par exemple, la proprit Lines de TMemo est la liste indexe des chanes qui constituent le texte du mmo et vous pouvez la traiter comme un tableau de chanes. Lines fournit un accs un

42-8

Guide du dveloppeur

Cration de proprits pour les sous-composants

lment particulier (une chane) dans un ensemble plus large de donnes (le texte du mmo). Les proprits tableau sont dclares comme les autres proprits. Les seules diffrences sont les suivantes : La dclaration de la proprit doit comprendre un ou plusieurs index ayant chacun un type dfini. Les index peuvent avoir nimporte quel type. Les parties read et write de la dclaration de la proprit, lorsquelles sont spcifies, doivent tre des mthodes. Il ne peut sagir de champs. Les mthodes read et write dune proprit tableau acceptent des paramtres supplmentaires correspondant aux index. Les paramtres doivent respecter lordre et le type des index spcifis dans la dclaration. Bien quils se ressemblent, il existe quelques diffrences importantes entre les tableaux et les proprits tableau. Contrairement aux indices dun tableau, lindex dune proprit tableau nest pas obligatoirement de type entier. Par exemple, vous pouvez indexer une proprit en utilisant une chane. En outre, vous ne pouvez rfrencer quun seul lment dune proprit et non une plage dlments. Lexemple suivant est la dclaration dune proprit renvoyant une chane en fonction de la valeur dun index de type entier.
type TDemoComponent = class(TComponent) private function GetNumberName(Index: Integer): string; public property NumberName[Index: Integer]: string read GetNumberName; end; function TDemoComponent.GetNumberName(Index: Integer): string; begin Result := Inconnu; case Index of -MaxInt..-1: Result := Ngatif; 0: Result := Zro; 1..100: Result := Petit; 101..MaxInt: Result := Grand; end; end;

Cration de proprits pour les sous-composants


Par dfaut, quand la valeur dune proprit est un autre composant, vous affectez une valeur cette proprit en ajoutant une instance de lautre composant dans la fiche ou le module de donnes, puis en affectant ce composant comme valeur de la proprit. Nanmoins, il est galement possible pour votre composant de crer sa propre instance de lobjet qui implmente la valeur de la proprit. Un tel composant ddi est appel un sous-composant.

Cration de proprits

42-9

Cration de proprits pour les sous-composants

Les sous-composants peuvent reprsenter tout objet persistant (tout descendant de TPersistent). A linverse des composants distincts qui peuvent tre affects comme valeur dune proprit, les proprits publies des sous-composants sont enregistres avec le composant qui les cre. Pour que cela fonctionne, les conditions suivantes doivent tre satisfaites : Le propritaire (Owner) du sous-composant doit tre le composant qui le cre et lutilise comme valeur dune proprit publie. Pour les sous-composants qui sont des descendants de TComponent, vous pouvez raliser cela en dfinissant la proprit Owner du sous-composant. Pour les autres souscomposants, vous devez redfinir la mthode GetOwner de lobjet persistant afin quelle renvoie le composant de cration. Si le sous-composant est un descendant de TComponent, il doit indiquer quil est un sous-composant en appelant la mthode SetSubComponent. Gnralement, cet appel est effectu par le propritaire quand il cre le souscomposant ou par le constructeur du sous-composant. Gnralement, les proprits dont les valeurs sont des sous-composants sont en lecture seule. Si vous permettez la modification dune proprit dont la valeur est un sous-composant, la mthode de dfinition de proprit doit librer le sous-composant quand un autre composant est affect la proprit. En outre, le composant r-instancie souvent son sous-composant lorsque la proprit est dfinie nil. Sinon, ds quun autre composant est affect la proprit, le souscomposant ne peut plus tre restaur la conception. Lexemple suivant illustre une telle mthode de dfinition dune proprit dont la valeur est un composant TTimer :
procedure TDemoComponent.SetTimerProp(Value: TTimer); begin if Value <> FTimer then begin if Value <> nil then begin if (FTimer <> nil and FTimer.Owner = self then FTimer.Free; FTimer := Value; FTimer,FreeNotification(self); end else { valeur nil } begin if FTimer.Owner <> self then { FTimer := TTimer.Create(self); FTimer.SetSubComponent(True); FTimer.FreeNotification(self); } end; end; end;

Notez que la mthode de dfinition de proprit ci-dessus a appel la mthode FreeNotification du composant affect la proprit. Cet appel garantit que le composant reprsentant la valeur de la proprit envoie une notification sil est

42-10

Guide du dveloppeur

Cration de proprits pour les interfaces

sur le point dtre dtruit. Il envoie cette notification en appelant la mthode Notification. Vous grez cet appel en redfinissant la mthode Notification, comme suit :
procedure TDemoComponent.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent = FTimer) then FTimer := nil; end;

Cration de proprits pour les interfaces


Vous pouvez utiliser une interface en tant que valeur dune proprit publie. Nanmoins, le mcanisme par lequel votre composant reoit les notifications de limplmentation de cette interface diffre. Dans la rubrique prcdente, la mthode de dfinition de proprit a appel la mthode FreeNotification du composant qui a t affect en tant que valeur de la proprit. Cela a permis au composant deffectuer la mise jour lui-mme quand le composant reprsentant la valeur de la proprit a t libr. Nanmoins, quand la valeur dune proprit est une interface, vous navez pas accs au composant qui implmente cette interface. En consquence, vous ne pouvez pas appeler sa mthode FreeNotification. Pour grer cette situation, vous pouvez appeler la mthode ReferenceInterface de votre composant :
procedure TDemoComponent.SetMyIntfProp(const Value: IMyInterface); begin ReferenceInterface(FIntfField, opRemove); FIntfField := Value; ReferenceInterface(FIntfField, opInsert); end;

Lappel de la mthode ReferenceInterface avec une interface spcifie fait la mme chose que lappel de la mthode FreeNotification dun autre composant. Ainsi, aprs lappel de la mthode ReferenceInterface partir de la mthode de dfinition de proprit, vous pouvez redfinir la mthode Notification pour grer les notifications depuis limplmenteur de linterface:
procedure TDemoComponent.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Assigned(MyIntfProp)) and (AComponent.IsImplementorOf(MyInftProp)) then MyIntfProp := nil; end;

Notez que le code Notification affecte nil la proprit MyIntfProp, et pas le champ priv (FIntfField). Cela garantit que Notification appelle la mthode de dfinition de proprit, qui appelle ReferenceInterface pour retirer la demande de notification qui a t tablie quand la valeur de la proprit a t pralablement dfinie. Toutes les affectations de la proprit dinterface doivent tre effectues par le biais de la mthode de dfinition de proprit.

Cration de proprits

42-11

Stockage et chargement des proprits

Stockage et chargement des proprits


Delphi stocke les fiches et leurs composants dans des fichiers fiche (.dfm dans la VCL et .xfm dans la CLX). Un fichier fiche stocke les proprits dune fiche et de ses composants. Lorsque les dveloppeurs Delphi ajoutent leurs fiches les composants que vous avez crits, vos composants doivent tre capables denregistrer leurs proprits dans le fichier fiche lors de sa sauvegarde. De mme, lorsquils sont chargs dans Delphi ou excuts comme lments dune application, vos composants doivent tre capables de se restituer eux-mmes partir du fichier fiche. La plupart du temps, vous naurez rien faire pour que vos composants fonctionnent avec un fichier fiche car la fonction de stockage et de chargement dune reprsentation fait partie du comportement reu en hritage par tous les composants. Toutefois, dans certaines circonstances, vous pouvez souhaiter modifier le stockage dun composant ou son initialisation au chargement. Cest pourquoi il est conseill de comprendre les mcanismes sous-jacents. Les aspects du stockage de proprits qu il est ncessaire dexpliquer sont les suivants : Utilisation du mcanisme de stockage et de chargement Spcification des valeurs par dfaut Dtermination du stockage Initialisation aprs chargement Stockage et chargement des proprits non publies

Utilisation du mcanisme de stockage et de chargement


La description dune fiche est la liste des proprits de la fiche accompagne dune liste semblable pour chacun de ses composants. Chaque composant, y compris la fiche elle-mme, est responsable du stockage et du chargement de sa propre description. Lorsquil se stocke lui-mme, un composant crit implicitement les valeurs de toutes ses proprits publiques ou publies si celles-ci sont diffrentes de leurs valeurs par dfaut, en respectant lordre dans lequel ont t dclares ces valeurs. Au chargement, le composant commence par se construire lui-mme, toutes les proprits rcuprant leurs valeurs par dfaut, puis il lit les valeurs stockes des proprits dont les valeurs ne correspondent pas aux valeurs par dfaut. Ce mcanisme implicite rpond la plupart des besoins des composants et ne ncessite aucune intervention particulire de la part de lauteur du composant. Nanmoins, il existe plusieurs moyens de personnaliser le processus de stockage et de chargement pour rpondre aux besoins particuliers dun composant.

42-12

Guide du dveloppeur

Stockage et chargement des proprits

Spcification des valeurs par dfaut


Les composants Delphi ne stockent la valeur des proprits que si elles diffrent des valeurs par dfaut. Sauf indication contraire, Delphi suppose quune proprit na pas de valeur par dfaut, ce qui a pour consquence que le composant stocke toujours la proprit, quelle que soit sa valeur. Pour spcifier une valeur par dfaut pour une proprit, ajoutez la directive default et la nouvelle valeur par dfaut la fin de la dclaration de la proprit. Vous pouvez galement spcifier une valeur par dfaut en redclarant une proprit. En fait, lattribution dune autre valeur par dfaut est lune des raisons qui peut vous amener redclarer une proprit.
Remarque

La spcification dune valeur par dfaut na pas pour effet dattribuer cette valeur la proprit lorsque lobjet est cr. Le constructeur du composant doit sen charger. Une proprit dont la valeur nest pas dfinie par le constructeur du composant, a la valeur zro, ou la valeur affiche par la proprit quand son stockage en mmoire est 0. Par dfaut, les nombres valent donc 0, les boolens False, les pointeurs nil, etc. En cas de doute, affectez une valeur dans la mthode du constructeur. Le code suivant montre la dclaration dun composant qui attribue une valeur par dfaut la proprit Align, ainsi que limplmentation du constructeur du composant qui affecte cette valeur. Dans notre exemple, le nouveau composant est un cas particulier du composant volet standard utilis en tant que barre dtat dans une fentre. Il doit donc implicitement saligner sur la bordure infrieure de son propritaire.
type TStatusBar = class(TPanel) public constructor Create(AOwner: TComponent); override; published property Align default alBottom; end;

{ surcharge pour dfinir la // nouvelle valeur par dfaut }

{ redclare avec la nouvelle valeur par dfaut }

constructor TStatusBar.Create(AOwner: TComponent); begin inherited Create(AOwner); { effectue une initialisation hrite } Align := alBottom; { affecte une nouvelle valeur par dfaut Align } end;

Dtermination du stockage
Vous pouvez choisir si Delphi stocke ou non chacune des proprits de vos composants. Par dfaut, sont stockes toutes les proprits de la partie published de la dclaration de classe. Vous pouvez choisir de ne pas stocker une proprit ou de dsigner une fonction qui dtermine dynamiquement le stockage de la proprit.

Cration de proprits

42-13

Stockage et chargement des proprits

Pour contrler le stockage par Delphi dune proprit, ajoutez la directive stored la dclaration de proprit, suivie par true, false ou le nom dune fonction boolenne. Le code suivant montre un composant avec la dclaration de trois nouvelles proprits. La premire est toujours stocke, la deuxime ne lest jamais et la troisime est stocke selon la valeur dune fonction boolenne :
type TSampleComponent = class(TComponent) protected function StoreIt: Boolean; public published property Important: Integer stored True; property Unimportant: Integer stored False; property Sometimes: Integer stored StoreIt; end;

{ toujours stocke } { jamais stocke } { dpend de la valeur de la fonction }

Initialisation aprs chargement


Aprs quun composant a lu les valeurs de toutes ses proprits dans sa description stocke, il appelle une mthode virtuelle appele Loaded, qui effectue toutes les initialisations ncessaires. Lappel de Loaded sexcute avant que ne saffichent la fiche et ses contrles, ainsi vous navez pas vous soucier du scintillement de lcran provoqu par ces initialisations. Pour initialiser un composant aprs le chargement des valeurs des proprits, vous devez surcharger la mthode Loaded.
Remarque

La premire opration accomplir dans une mthode Loaded consiste appeler la mthode Loaded reue en hritage. Ceci afin dtre sr que toutes les proprits reues en hritage sont correctement initialises avant deffectuer linitialisation de votre propre composant. Le code suivant provient du composant TDatabase. Aprs chargement, la base de donnes essaie de rtablir toutes les connexions ouvertes au moment du stockage, et spcifie comment grer toutes les exceptions qui se produisent pendant la connexion.
procedure TDatabase.Loaded; begin inherited Loaded; try if FStreamedConnected then Open else CheckSessionName(False); except if csDesigning in ComponentState then Application.HandleException(Self) else raise; end; end;

{ appelle dabord la mthode hrite } { rtablit les connexions }

{ lors de la conception... } { permet Delphi de grer lexception } { sinon, redclenche }

42-14

Guide du dveloppeur

Stockage et chargement des proprits

Stockage et chargement des proprits non publies


Par dfaut, seules les proprits publies sont charges et enregistres avec un composant. Cependant, il est possible de charger et denregistrer des proprits non publies. Ceci permet dobtenir des proprits persistantes napparaissant pas dans linspecteur dobjets. Cela permet aussi le stockage et le chargement des valeurs de proprits par les composants, valeurs de proprits que Delphi ne sait pas comment lire ni crire car elles sont trop complexes. Par exemple, lobjet TStrings ne peut pas compter sur le comportement automatique de Delphi pour stocker et charger les chanes quil reprsente et doit utiliser le mcanisme suivant. Vous pouvez enregistrer des proprits non publies en ajoutant du code indiquant Delphi comment charger et enregistrer la valeur de proprit. Pour crire votre propre code afin de charger et denregistrer des proprits, utilisez les tapes suivantes :

1 Cration de mthodes pour le stockage et le chargement de valeurs de proprits. 2 Redfinition de la mthode DefineProperties, en transmettant ces mthodes un objet filer.

Cration de mthodes pour le stockage et le chargement de valeurs de proprits


Pour stocker et charger des proprits non publies, vous devez dabord crer une mthode afin de stocker la valeur de proprit et une autre mthode pour la charger. Deux possibilits soffrent vous : Crer une mthode de type TWriterProc afin de stocker la valeur de proprit et une mthode de type TReaderProc pour la charger. Cette approche vous permet de profiter des capacits intgres de Delphi concernant lenregistrement et le chargement de types simples. Si la valeur de votre proprit est construite partir de types que Delphi sait enregistrer et charger, utilisez cette approche. Crer deux mthodes de type TStreamProc , une pour stocker et une pour charger la valeur de proprit. TStreamProc accepte un flux comme argument et vous pouvez utiliser les mthodes du flux afin dcrire et lire les valeurs de proprits. Prenons pour exemple une proprit reprsentant un composant cr lexcution. Delphi sait comment crire cette valeur, mais ne le fait pas automatiquement car le composant nest pas cr dans le concepteur de fiches. Puisque le systme de flux peut ds prsent charger et enregistrer des composants, vous pouvez utiliser la premire approche. Les mthodes suivantes chargent et stockent le composant cr dynamiquement qui reprsente la valeur dune proprit appele MyCompProperty :
procedure TSampleComponent.LoadCompProperty(Reader: TReader); begin

Cration de proprits

42-15

Stockage et chargement des proprits

if Reader.ReadBoolean then MyCompProperty := Reader.ReadComponent(nil); end; procedure TSampleComponent.StoreCompProperty(Writer: TWriter); begin Writer.WriteBoolean(MyCompProperty <> nil); if MyCompProperty <> nil then Writer.WriteComponent(MyCompProperty); end;

Redfinition de la mthode DefineProperties


Aprs avoir cr des mthodes de stockage et de chargement de la valeur de proprit, vous pouvez redfinir la mthode DefineProperties du composant. Delphi appelle cette mthode lors du chargement ou du stockage du composant. Dans la mthode DefineProperties, vous devez appeler la mthode DefineProperty ou DefineBinaryProperty du filer en cours, en lui transmettant la mthode utiliser pour le chargement ou lenregistrement de la valeur de proprit. Si vos mthodes de chargement et de stockage sont des types TWriterProc et TReaderProc, vous appelez alors la mthode DefineProperty du filer. Si vous avez cr des mthodes de type TStreamProc, appelez plutt DefineBinaryProperty. Peu importe la mthode utilise pour dfinir la proprit, vous lui transmettez les mthodes enregistrant et chargeant votre valeur de proprit ainsi quune valeur boolenne indiquant si la valeur de proprit doit tre crite ou non. Sil peut sagir dune valeur hrite ou si elle a une valeur par dfaut, il nest pas ncessaire de lcrire. Soit par exemple la mthode LoadCompProperty du type TReaderProc et la mthode StoreCompProperty du type TWriterProc, vous redfiniriez DefineProperties de la manire suivante :
procedure TSampleComponent.DefineProperties(Filer: TFiler); function DoWrite: Boolean; begin if Filer.Ancestor <> nil then { recherche lanctre pour une valeur hrite } begin if TSampleComponent(Filer.Ancestor).MyCompProperty = nil then Result := MyCompProperty <> nil else if MyCompProperty = nil or TSampleComponent(Filer.Ancestor).MyCompProperty.Name <> MyCompProperty.Name then Result := True else Result := False; end else { aucune valeur hrite-- cherche la valeur par dfaut (nil) } Result := MyCompProperty <> nil; end; begin inherited; { autorise la dfinition des proprits par les classes de base} Filer.DefineProperty(MyCompProperty, LoadCompProperty, StoreCompProperty, DoWrite); end;

42-16

Guide du dveloppeur

43
Chapitre 43

Chapitre

Cration dvnements

Un vnement est un lien entre une occurrence du systme (une action de lutilisateur ou un changement de focalisation, par exemple) et le fragment de code qui assure effectivement la rponse. Le code de rponse est le gestionnaire de lvnement, dont lcriture est presque toujours du ressort du dveloppeur de lapplication. Grce aux vnements, les dveloppeurs peuvent personnaliser le comportement des composants sans avoir besoin de modifier les classes ellesmmes. Cela sappelle la dlgation. Les vnements associs aux actions utilisateur les plus usuelles (par exemple, les actions de la souris) sont intgrs dans les composants standard, mais vous pouvez aussi dfinir de nouveaux vnements. Pour tre capable de crer des vnements dans un composant, vous devez avoir compris ce qui suit : Quest-ce qu un vnement ? Implmentation des vnements standard Dfinition de vos propres vnements Les vnements tant implments en tant que proprits, il vaut mieux avoir bien compris le chapitre 42, Cration de proprits, avant de crer ou de modifier les vnements dun composant.

Quest-ce quun vnement ?


Un vnement est un mcanisme qui tablit un lien entre une occurrence et une partie de code. Plus prcisment, un vnement est un pointeur de mthodequi pointe sur une mthode dans une instance de classe spcifique. Du point de vue du dveloppeur dapplications, lvnement est simplement un nom reli une occurrence du systme, comme OnClick, auquel du code peut tre attach. Par exemple, un bouton-poussoir appel Button1 dispose dune mthode OnClick. Par dfaut, Delphi gnre lvnement appel Button1Click dans la fiche contenant le bouton et lassocie lvnement OnClick. Lorsquun

Cration dvnements

43-1

Quest-ce quun vnement ?

vnement clic de souris se produit sur le bouton, ce dernier appelle la mthode associe OnClick qui est pour notre exemple Button1Click. Pour crire un vnement, vous devez comprendre ceci :
Lutilisateur clique sur Button1 Occurrence Button1.OnClick pointe sur Form1.Button1Click Evnement Form1.Button1Click sexcute Gestionnaire dvnement

Les Les Les Les Les

vnements sont des pointeurs de mthodes. vnements sont des proprits. types dvnements sont des types de pointeurs de mthodes. types gestionnaire dvnement sont des procdures. gestionnaires dvnements sont facultatifs.

Les vnements sont des pointeurs de mthodes


Delphi utilise les pointeurs de mthodes pour implmenter les vnements. Un pointeur de mthode est un type particulier de pointeur qui pointe sur une mthode sp cifique situ e dans une instance dobjet. En tant quauteur de composant, vous pouvez voir les pointeurs de mthodes comme des marques de rservation. Aprs la dtection dun vnement par votre code, vous appelez la mthode (si elle existe) dfinie par lutilisateur pour grer cet vnement. Les pointeurs de mthodes fonctionnent comme les autres types procduraux, mais ils maintiennent un pointeur cach sur un objet. Quand le dveloppeur dapplications associe un gestionnaire un vnement du composant, lassociation ne seffectue pas seulement avec une mthode ayant un nom particulier, mais avec une mthode dune instance dobjet particulire. Cet objet est gnralement la fiche contenant le composant, mais ce nest pas toujours le cas. Tous les contrles, par exemple, hritent dune mthode dynamique appele Click pour la gestion des vnements de clic avec la souris :
procedure Click; dynamic;

Limplmentation de Click appelle le gestionnaire utilisateur des vnements lis aux clics de la souris, sil existe. Si lutilisateur a affect un gestionnaire lvnement OnClick dun contrle, le fait de cliquer sur ce dernier gnre lappel de la mthode. Si aucun gestionnaire nest affect, rien ne se produit.

Les vnements sont des proprits


Ces composants utilisent les proprits pour implmenter les vnements. Mais, contrairement la plupart des proprits, les proprits vnement ne font pas appel des mthodes pour implmenter leurs parties read et write. Elles utilisent plutt un champ de classe de mme type que la proprit.

43-2

Guide du dveloppeur

Quest-ce quun vnement ?

Par convention, le nom de la donne membre est le mme que celui de la proprit prcd de la lettre F. Par exemple, le pointeur de la mthode OnClick est stock dans une donne membre intitule FOnClick de type TNotifyEvent ; la dclaration de la proprit de lvnement OnClick ressemble ceci :
type TControl = class(TComponent) private FOnClick: TNotifyEvent;

{ dclare une donne membre pour contenir // le pointeur de mthode }

protected property OnClick: TNotifyEvent read FOnClick write FOnClick; end;

Pour en savoir davantage sur TNotifyEvent et sur les autres types dvnements, voir la prochaine section, Les types dvnements sont des types de pointeurs de mthodes. Comme pour toute autre proprit, vous pouvez dfinir ou modifier la valeur dun vnement au moment de lexcution. Lavantage principal des vnements implments sous la forme de proprits est que lutilisateur de composant peut lui associer un gestionnaire au moment de la conception laide de linspecteur dobjets.

Les types dvnements sont des types de pointeurs de mthodes


Comme un vnement est un pointeur sur un gestionnaire dvnement, le type dune proprit vnement correspond ncessairement un pointeur de mthode. De mme, tout code utilis comme gestionnaire dvnement doit tre de type mthode dobjet. Toutes les mthodes gestionnaire dvnement sont des procdures. Pour tre compatible avec un vnement dun type particulier, une mthode gestionnaire dvnement doit avoir le mme nombre de paramtres, les paramtres tant de mme type et transmis dans le mme ordre. Delphi dfinit des types de mthode pour tous les vnements standard. Lorsque vous crez vos propres vnements, vous pouvez utiliser un type existant sil est appropri ou dfinir votre propre type.

Les types gestionnaire dvnement sont des procdures


Bien que le compilateur vous permet de dclarer des types pointeur de mthode qui sont des fonctions, vous ne devrez jamais le faire pour la gestion dvnements. Comme une fonction vide renvoie un rsultat non dfini, un gestionnaire dvnement vide qui tait une fonction ne pourra pas toujours tre correct. Pour cette raison, tous vos vnements et leurs gestionnaires dvnements associs doivent tre des procdures. Bien quun gestionnaire dvnement ne puisse pas tre une fonction, vous pouvez toujours obtenir les informations partir du code du dveloppeur de lapplication en utilisant les paramtres var. Lorsque vous effectuerez ceci,

Cration dvnements

43-3

Quest-ce quun vnement ?

vrifiez que vous affectez une valeur correcte au paramtre avant dappeler le gestionnaire afin de ne pas rendre obligatoire la modification de la valeur par le code de lutilisateur. Un exemple de transmission des paramtres var un gestionnaire dvnement est fourni par lvnement OnKeyPress, de type TKeyPressEvent. TKeyPressEvent dfinit deux paramtres, lun indiquant lobjet ayant gnr lvnement et lautre la touche enfonce :
type TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;

Normalement, le paramtre Key contient le caractre tap par lutilisateur. Toutefois dans certaines circonstances, lutilisateur de composant peut souhaiter changer ce caractre. Par exemple, pour forcer tous les caractres en majuscules dans un diteur. Dans un cas comme celui-l, lutilisateur doit dfinir le gestionnaire suivant pour grer les frappes de touches :
procedure TForm1.Edit1KeyPressed(Sender: TObject; var Key: Char); begin Key := UpCase(Key); end;

Vous pouvez galement utiliser les paramtres var pour permettre lutilisateur de surcharger la gestion par dfaut.

Les gestionnaires dvnements sont facultatifs


Lorsque vous crez des composants, noubliez pas que les dveloppeurs qui les utilisent ne vont pas forcment leur associer des gestionnaires. Cela signifie que lexcution de vos composants ne doit pas chouer ni gnrer derreur parce que lutilisateur na pas associ un gestionnaire un vnement. Le mcanisme pour appeler un gestionnaire et grer les vnements, alors que lutilisateur na pas associ de gestionnaire, est dcrit dans Appel de lvnement la page 43-9.) Des vnements se produisent en permanence dans une application GUI. Le simple fait de dplacer le pointeur de la souris sur un composant visuel envoie de nombreux messages de dplacement de la souris que le composant traduit en vnements OnMouseMove. Dans la plupart des cas, les dveloppeurs ne veulent pas grer les vnements dplacement de souris et il ne faut pas que cela pose un problme. Aussi, les composants que vous crez doivent possder des gestionnaires pour ces vnements. Mais surtout, les dveloppeurs dapplications peuvent crire le code quils veulent dans un gestionnaire dvnement. Les gestionnaires dvnements des composants de la VCL et de la CLX sont crits de faon minimiser le risque de gnration derreurs. Evidemment, vous ne pouvez pas empcher les erreurs de logique dans le code de lapplication, mais vous pouvez vous assurer que les structures de donnes sont initialises avant que les vnements ne soient appels, de sorte que les dveloppeurs ne tentent pas daccder des donnes incorrectes.

43-4

Guide du dveloppeur

Implmentation des vnements standard

Implmentation des vnements standard


Les contrles fournis avec Delphi hritent des vnements correspondant aux occurrences les plus courantes. Ces vnements sont appels vnements standard. Bien que tous ces vnements soient intgrs aux contrles standard, ils sont souvent dclars protected, pour que les dveloppeurs ne puissent pas leur associer de gestionnaire. Lorsque vous crez un contrle, vous pouvez choisir de rendre visibles certains vnements aux utilisateurs de votre contrle. Les trois points suivants sont prendre en compte pour incorporer des vnements standard dans vos contrles : Identification des vnements standard Rendre visibles des vnements Changement de la gestion des vnements standard

Identification des vnements standard


Il existe deux catgories dvnements standard : ceux dfinis pour tous les contrles et ceux dfinis uniquement pour les contrles fentrs standard.

Evnements standard pour tous les contrles


Les vnements de base sont dfinis dans la classe TControl. Tous les contrles, quils soient fentrs, graphiques ou personnaliss, hritent de ces vnements. Les vnements suivants sont disponibles pour lensemble des contrles : OnClick OnDblClick OnDragDrop OnDragOver OnEndDrag OnMouseDown OnMouseMove OnMouseUp

Les vnements standard disposent de mthodes virtuelles protges, dclares dans TControl, dont les noms correspondent aux noms des vnements. Par exemple, les vnements OnClick appellent une mthode nomme Click, et les vnements OnEndDrag appellent une mthode nomme DoEndDrag.

Evnements standard pour les contrles standard


Outre les vnements communs tous les contrles, les contrles fentrs standard (ceux descendant de TWinControl dans la VCL et de TWidgetControl dans la CLX) disposent des vnements suivants : OnEnter OnKeyUp OnKeyDown OnExit OnKeyPress

Comme les vnements standard de TControl, les vnements des contrles fentrs disposent de mthodes correspondantes. Les vnements de touches standard prsents ci-dessus rpondent toutes les frappes de touches normales.

Cration dvnements

43-5

Implmentation des vnements standard

Remarque VCL

Pour rpondre aux frappes de touches spciales (comme la touche Alt), vous devez rpondre au message WM_GETDLGCODE ou CM_WANTSPECIALKEYS de Windows. Voir chapitre 46, Gestion des messages, pour plus dinformations sur lcriture de gestionnaires de messages.

Rendre visibles des vnements


Les vnements standard de TControl et TWinControl (TWidgetControl dans la CLX) sont dclars protected, de mme que les mthodes correspondantes. Si vous hritez de lune de ces classes abstraites et voulez rendre leurs vnements accessibles lexcution ou pendant la conception, vous devez redclarer les vnements soit public, soit published. La redclaration dune proprit sans spcifier dimplmentation conserve les mmes mthodes dimplmentation en ne modifiant que leur niveau de protection. Vous pouvez donc prendre en compte un vnement dfini dans TControl mais non visible, et le rendre visible en le dclarant public ou published. Par exemple, pour crer un composant qui rende visible en mode conception lvnement OnClick, ajoutez les lignes suivantes la dclaration de classe du composant.
type TMyControl = class(TCustomControl) published property OnClick; end;

Changement de la gestion des vnements standard


Pour modifier la faon dont votre composant rpond un certain type dvnement, vous pouvez tre tent dcrire un fragment de code pour lassocier lvnement en question. Cest prcisment ce que ferait le dveloppeur dapplications. Mais lorsque vous crez un composant, vous devez faire en sorte que lvnement reste disponible pour les dveloppeurs qui vont utiliser le composant. Cest ce qui justifie les mthodes protges de limplmentation associes chaque vnement standard. En surchargeant la mthode dimplmentation, vous pouvez modifier la gestion interne de lvnement et en appelant la mthode reue en hritage, vous prservez la gestion standard, y compris la gestion de lvnement par le code du dveloppeur dapplications. Lordre dans lequel vous appelez les mthodes est significatif. En rgle gnrale, vous appelez dabord la mthode hrite pour que le gestionnaire dvnement du dveloppeur dapplications sexcute avant vos modifications (et parfois, empche lexcution de vos modifications). Toutefois, dans certaines situations, vous voulez excuter votre code avant dappeler la mthode hrite. Par exemple, si le code reu en hritage dpend dune faon ou dune autre de ltat de composant et si votre

43-6

Guide du dveloppeur

Dfinition de vos propres vnements

code agit sur cet tat, vous devez dabord effectuer ces changements dtat avant dautoriser le code de lutilisateur y rpondre. Supposons que vous crivez un composant et que vous souhaitez modifier la faon dont il rpond aux clics de souris. Au lieu dassocier un gestionnaire lvnement OnClick, comme le ferait le dveloppeur dapplications, surchargez la mthode protge Click :
procedure click override { dclaration forward }

procedure TMyControl.Click; begin inherited Click; { excute la gestion standard, y compris lappel au gestionnaire} ... { vos modifications sinsrent ici} end;

Dfinition de vos propres vnements


Il est relativement rare de dfinir des vnements entirement nouveaux. Toutefois, il peut arriver quun comportement compltement diffrent soit introduit par un composant et il faut alors lui dfinir un vnement. Voici les tapes qui interviennent dans la dfinition dun vnement : Dclenchement de lvnement Dfinition du type de gestionnaire Dclaration de lvnement Appel de lvnement

Dclenchement de lvnement
Vous avez besoin de savoir ce qui a dclench lvnement. Pour certains vnements, la rponse est vidente. Par exemple, un vnement associ lenfoncement du bouton de souris se produit lorsque lutilisateur clique avec le bouton gauche de la souris provoquant lenvoi par Windows dun message WM_LBUTTONDOWN lapplication. La rception de ce message provoque lappel de la mthode MouseDown dun composant qui son tour appelle le code que lutilisateur a associ lvnement OnMouseDown. Nanmoins, certains vnements sont lis de faon moins vidente des occurrences externes moins spcifiques. Par exemple, une barre de dfilement dispose dun vnement OnChange qui peut tre dclench par plusieurs occurrences, telles des frappes de touche, des clics de souris, ou des modifications dans dautres contrles. Lorsque vous dfinissez vos vnements, assurez-vous que les occurrences appellent tous les vnements appropris.

Deux sortes dvnements


Les deux sortes doccurrences pour lesquelles vous pouvez tre amen dfinir des vnements sont les interactions utilisateur et les modifications dtat. Les

Cration dvnements

43-7

Dfinition de vos propres vnements

vnements de type interaction utilisateur sont pratiquement toujours dclenchs par un message issu de Windows indiquant que lutilisateur a agi sur votre composant dune faon qui peut ncessiter une rponse de votre part. Les vnements de modification dtat peuvent aussi tre le fait de messages issus de Windows (par exemple, des changements de focalisation ou dactivation). Cependant, ils peuvent galement survenir la suite dune modification de proprit ou de lexcution dune autre partie de code. Vous disposez dun contrle total sur le dclenchement des vnements que vous avez vous-mme dfinis. Dfinissez les vnements avec soin de sorte que les dveloppeurs soient capables de les comprendre et de les utiliser.

Dfinition du type de gestionnaire


Aprs avoir dtect que lun de vos vnements sest produit, vous devez dfinir la faon de le grer. Cela implique que vous devez dterminer le type du gestionnaire dvnement. Dans la plupart des cas, les gestionnaires dvnements que vous dfinissez vous-mme seront des notifications simples ou spcifiques des vnements particuliers. Il est galement possible de rcuprer de linformation en provenance du gestionnaire.

Notifications simples
Un vnement de type notification ne fait quindiquer quun vnement particulier sest produit sans fournir aucune information sur le moment et lendroit o il sest produit. Les notifications utilisent le type TNotifyEvent, qui vhiculent un paramtre unique correspondant lmetteur de lvnement. Les seuls lments connus du gestionnaire associ une notification sont donc le type dvnement et le composant impliqu. Par exemple, les vnements clic de souris sont des notifications. Lorsque vous crivez un gestionnaire pour un vnement de ce type, vous ne rcuprez que deux informations : le fait quun clic sest produit et le composant impliqu. Une notification est un processus sens unique. Il nexiste aucun mcanisme pour renvoyer une information en retour ou pour inhiber la gestion dune notification.

Gestionnaires dvnements spcifiques


Dans certains cas, savoir quun vnement sest produit et connatre le composant impliqu nest pas suffisant. Par exemple, si lvnement correspond lenfoncement dune touche, le gestionnaire voudra savoir quelle est cette touche. Dans un cas comme celui-l, vous devez disposer dun gestionnaire qui accepte des paramtres pour ces informations supplmentaires. Si votre vnement a t gnr en rponse un message, les paramtres transmis au gestionnaire dvnement seront vraisemblablement issus des paramtres du message.

43-8

Guide du dveloppeur

Dfinition de vos propres vnements

Renvoi dinformations partir du gestionnaire


Comme tous les gestionnaires dvnements sont des procdures, la seule faon de renvoyer des informations partir dun gestionnaire consiste faire appel un paramtre var. Vos composants peuvent utiliser les informations ainsi rcupres pour dterminer le traitement ventuel dun vnement aprs lexcution du gestionnaire de lutilisateur. Par exemple, tous les vnements lis aux touches (OnKeyDown, OnKeyUp et OnKeyPress) transmettent par rfrence la valeur de la touche enfonce dans un paramtre intitul Key. Le gestionnaire dvnement peut changer Key de faon donner limpression lapplication quune touche diffrente est implique dans lvnement. Cela permet par exemple de forcer en majuscules les caractres taps.

Dclaration de lvnement
Une fois dtermin le type de votre gestionnaire dvnement, vous pouvez dclarer le pointeur de mthode et la proprit pour lvnement. Noubliez pas dattribuer un nom lvnement qui soit la fois significatif et descriptif pour que lutilisateur puisse comprendre son rle. Dans la mesure du possible, choisissez des noms de proprits qui ressemblent ceux de composants dj dfinis.

Les noms dvnement dbutent par On


Dans Delphi, les noms de la plupart des vnements commencent par On. Il sagit dune simple convention ; le compilateur nimpose pas cette restriction. Linspecteur dobjets dtermine quune proprit est un vnement en examinant le type de la proprit : toutes les proprits de type pointeur de mthode sont interprtes comme des vnements et apparaissent donc dans la page Evnements. Les dveloppeurs sattendent trouver les vnements dans la liste alphabtique lendroit des noms commenant par On. Vous risquez dintroduire une certaine confusion en utilisant une autre convention.
Remarque

Exception principale cette rgle : les nombreux vnements qui se produisent avant ou aprs certaines occurrences commencent par Before ou After.

Appel de lvnement
Il est prfrable de centraliser tous les appels un vnement. Autrement dit, crez une mthode virtuelle dans votre composant qui appelle le gestionnaire dvnement de lapplication (sil a t dfini) et qui fournit une gestion par dfaut. Le fait de rassembler tous les appels un vnement en un seul endroit vous permet dtre sr quun programmeur, qui drive un nouveau composant partir du vtre, pourra personnaliser la gestion de lvnement en surchargeant cette mthode sans avoir parcourir votre code pour reprer les endroits o lvnement est appel.

Cration dvnements

43-9

Dfinition de vos propres vnements

Deux autres considrations sont prendre en compte concernant lappel de lvnement : Les gestionnaires vides doivent tre valides. Les utilisateurs peuvent surcharger la gestion par dfaut.

Les gestionnaires vides doivent tre valides


Vous ne devez jamais crer une situation dans laquelle un gestionnaire dvnement vide provoque une erreur, ou dans laquelle le bon fonctionnement dun composant dpend dune rponse spcifique provenant du code de gestion dun vnement dans lapplication. Un gestionnaire vide doit produire le mme effet quun gestionnaire absent. Aussi, le code pour appeler le gestionnaire dvnement dans une application doit ressembler ceci :
if Assigned(OnClick) then OnClick(Self); ... { excute la gestion par dfaut }Il ne doit en aucun cas ressembler ceci : if Assigned(OnClick) then OnClick(Self) else { excute la gestion par dfaut};

Les utilisateurs peuvent surcharger la gestion par dfaut


Pour certains types dvnements, les dveloppeurs peuvent vouloir remplacer la gestion par dfaut ou mme supprimer lensemble des rponses. Pour permettre cela, vous devez transmettre au gestionnaire un argument par rfrence et vrifier si le gestionnaire renvoie une certaine valeur. Cela reste dans la ligne de laffirmation quun gestionnaire vide doit produire le mme effet quun gestionnaire absent : puisquun gestionnaire vide ne modifie en rien la valeur des arguments passs par rfrence, la gestion par dfaut se droule toujours aprs lappel du gestionnaire vide. Par exemple, lors de la gestion des vnements frappe de touches, le dveloppeur dapplications peut omettre la gestion par dfaut de la frappe de touches du composant en attribuant le caractre null (#0) au paramtre var Key. La logique de programmation sous-jacente est la suivante :
if Assigned(OnKeyPress) then OnKeyPress(Self, Key); if Key <> #0 then ... { excute la gestion par dfaut}

Le code rel est lgrement diffrent car il prend galement en compte les messages Windows mais la logique reste la mme. Par dfaut, le composant appelle le gestionnaire dfini par lutilisateur avant dexcuter la gestion standard. Si le gestionnaire dfini par lutilisateur attribue le caractre null Key, le composant omet lexcution de la gestion par dfaut.

43-10

Guide du dveloppeur

44
Chapitre 44

Chapitre

Cration de mthodes

Les mthodes des composants sont des procdures et des fonctions intgres dans la structure dune classe. Il nexiste pratiquement aucune restriction sur ce que peuvent raliser les mthodes dun composant, mais Delphi nen respecte pas moins un certain nombre de standards quil est prfrable de suivre. Ce sont : Eviter les interdpendances Noms des mthodes Protection des mthodes Rendre virtuelles des mthodes Dclaration des mthodes

En gnral, les composants ne doivent pas contenir beaucoup de mthodes et vous devez chercher minimiser le nombre des mthodes appeles par une application. Il est prfrable dencapsuler sous la forme de proprits des caractristiques quil serait tentant dimplmenter sous forme de mthodes. Les proprits fournissent une interface qui sinscrit parfaitement dans lenvironnement Delphi et sont accessibles au moment de la conception.

Eviter les interdpendances


Lorsque vous crivez un composant, vous devez rduire au minimum les conditions pralables imposes aux dveloppeurs. Dans toute la mesure du possible, les dveloppeurs doivent pouvoir faire ce quils veulent de votre composant, et tout moment. Il existe des situations o vous ne pourrez rpondre cette exigence mais le but nen demeure pas moins de sen approcher au plus prs. La liste suivante donne quelques indications sur ce quil faut viter : Les mthodes quun utilisateur doit obligatoirement appeler pour utiliser un composant.

Cration de mthodes

44-1

Noms des mthodes

Les mthodes qui doivent sexcuter selon un ordre dfini. Les mthodes qui placent le composant dans un tat ou un mode pour lequel certains vnements ou certaines mthodes deviennent incorrectes. La meilleure faon de grer les situations de ce type est de fournir le moyen den sortir. Par exemple, si lappel dune mthode a pour effet de placer votre composant dans un tat o lappel dune autre mthode savre incorrect, vous devez modifier cette seconde mthode de telle manire que si elle est appele alors que le composant se trouve dans un tat impropre, elle corrige cet tat avant dexcuter son propre code principal. Faute de mieux, vous devrez dclencher une exception si lutilisateur appelle une mthode non valide. En dautres termes, si vous gnrez une situation dans laquelle il existe des interdpendances entre certaines parties de votre code, il est de votre responsabilit de vous assurer qu une utilisation incorrecte du code nengendre pas de problme. Un message davertissement, par exemple, est prfrable une fin dexcution anormale si lutilisateur na pas respect ces interdpendances.

Noms des mthodes


Delphi nimpose aucune restriction quant la faon de nommer les mthodes et leurs paramtres. Toutefois, certaines conventions facilitent lexploitation des mthodes par les dveloppeurs dapplications. Souvenez-vous que larchitecture mme dun composant a son influence sur les diffrents types de personnes qui pourront utiliser ce composant. Si vous avez lhabitude dcrire du code qui ne sadresse qu un nombre restreint de programmeurs, vous ne vous tes sans doute jamais interrog sur le choix du nom des entits que vous manipulez. Il est souhaitable de choisir des noms comprhensibles car vos composants sadressent tous, y compris ceux qui ne connaissent pas bien votre code (ou qui matrisent imparfaitement la programmation). Voici quelques suggestions pour dfinir des noms de mthode comprhensibles : Choisissez des noms descriptifs. Utilisez des verbes daction. Un nom tel que CollerPressepapiers est plus explicite que Coller ou CP. Les noms de fonctions doivent reflter la nature de ce quelles renvoient. Bien quil puisse paratre vident, vous programmeur, que le rle dune fonction intitule X soit de renvoyer la coordonne horizontale dun lment, un nom tel que ObtenirPositionHorizontale sera compris par tout le monde. Comme dernire considration, assurez-vous que votre mthode ait rellement besoin dtre cre comme telle. Que le nom de votre mthode puisse tre un verbe est un bon repre. Si ce nest pas le cas, demandez-vous sil ne serait pas prfrable de transformer votre mthode en proprit.

44-2

Guide du dveloppeur

Protection des mthodes

Protection des mthodes


Toutes les parties des classes, y compris les champs, les mthodes et les proprits, ont diffrents niveaux de protection ou de visibilit, comme lexplique Contrle des accs la page 41-4. Il est facile de choisir le niveau qui convient. La plupart des mthodes crites dans vos composants sont publiques ou protges. Il ny a gnralement pas lieu de dclarer une mthode private, moins quelle soit rellement spcifique ce type de composant, au point que mme les composants drivs ne peuvent pas y accder.

Mthodes qui doivent tre publiques


Toutes les mthodes qui peuvent tre appeles par les dveloppeurs dapplications doivent tre dclares public. Noubliez pas que la plupart des appels aux mthodes ont lieu dans les gestionnaires dvnements, aussi les mthodes doivent viter de gaspiller les ressources systme ou de placer le systme dexploitation dans un tat o il nest plus en mesure de rpondre lutilisateur.
Remarque

Les constructeurs et destructeurs sont toujours dclars public.

Mthodes qui doivent tre protges


Toute mthode dimplmentation dun composant doit tre dclare protected afin dempcher les applications de les appeler un moment inopportun. Si vous avez dfini des mthodes qui doivent demeurer inaccessibles au code, tout en restant accessibles aux classes drives, vous devez les dclarer protected. Par exemple, supposons une mthode dont lexcution dpend de linitialisation pralable dune donne. Si cette mthode est dclare publique, il peut arriver que les applications tentent de lappeler avant linitialisation de la donne. Mais, en la dclarant protected, les applications ne peuvent le faire directement. Vous pouvez alors dfinir dautres mthodes publiques qui se chargent dinitialiser la donne avant dappeler la mthode protected. Les mthodes dimplmentation des proprits doivent tre dclares comme virtuelles et protected. Les mthodes ainsi dclares permettent aux dveloppeurs dapplications de surcharger limplmentation des proprits, augmentant leurs fonctionalits ou les remplaant compltement. De telles proprits sont compltement polymorphes. Instaurer un accs protected ces mthodes garantit que les dveloppeurs ne pourront pas les appeler par accident ni modifier la proprit par inadvertance.

Cration de mthodes

44-3

Rendre virtuelles des mthodes

Mthodes abstraites
Une mthode est parfois dclare abstract dans un composant Delphi. Dans la VCL et la CLX, les mthodes abstraites se produisent habituellement dans les classes dont les noms commencent par custom, comme dansTCustomGrid. De telles classes sont elles-mmes abstraites, au sens o elles ne servent qu la drivation de classes descendantes. Bien que vous puissiez crer un objet instance dune classe contenant un membre abstrait, ce nest pas recommand. Lappel du membre abstrait entrane une exception EAbstractError. La directive abstract est utilise pour indiquer des parties de classes qui doivent tre surfaces et dfinies dans des composants descendants ; cela force les crivains de composants redclarer le membre abstrait dans des classes descendantes avant que des instances actuelles de la classe puissent tre cres.

Rendre virtuelles des mthodes


Vous rendrez virtuelles les mthodes lorsque vous souhaitez que des types diffrents puissent excuter des codes diffrents en rponse au mme appel de mthode. Si vous crez des composants pour quils soient exploitables par les dveloppeurs dapplications directement, vous voudrez probablement rendre non virtuelles vos mthodes. Dautre part, si vous crez des composants abstraits desquels dautres composants vont driver, vous devez envisager de rendre virtuelles les mthodes ajoutes. De cette faon, les composants drivs pourront surcharger les mthodes virtuelles reues en hritage.

Dclaration des mthodes


La dclaration dune mthode dans un composant ne diffre en rien de celle dune mthode dune autre classe. Pour dclarer une nouvelle mthode dans un composant, vous devez : Ajouter la dclaration la dclaration de type du composant dans le fichier en-tte de ce dernier. Implmenter la mthode dans la partie implementation de lunit du composant. Le code suivant montre un composant qui dfinit deux nouvelles mthodes, lune est dclare protected static et lautre public et virtual.
type TSampleComponent = class(TControl) protected procedure MakeBigger;

{ dclare la mthode protected static }

44-4

Guide du dveloppeur

Dclaration des mthodes

public function CalculateArea: Integer; virtual; end; implementation procedure TSampleComponent.MakeBigger; begin Height := Height + 5; Width := Width + 5; end; function TSampleComponent.CalculateArea: Integer; begin Result := Width * Height; end;

{ dclare la mthode public virtual }

{ implmente la premire mthode}

{ implmente la deuxime mthode}

Cration de mthodes

44-5

44-6

Guide du dveloppeur

45
Chapitre 45

Chapitre

Graphiques et composants

Windows fournit une puissante interface GDI (Graphics Device Interface) servant dessiner des graphiques indpendamment des priphriques. Malheureusement, GDI impose au programmeur des contraintes supplmentaires telles que la gestion des ressources graphiques. Delphi prend en charge toutes ces tches GDI ingrates, vous laisse vous concentrer sur le travail productif, vous pargnant les recherches de handles perdus ou de ressources non restitues. De mme que toute partie de lAPI Windows, vous pouvez appeler les fonctions GDI directement depuis votre application Delphi. Toutefois, vous vous rendrez vite compte que lutilisation de lencapsulation Delphi des fonctions graphiques est un moyen plus efficace et plus rapide de crer des graphiques. Les rubriques de cette section comprennent : Prsentation des graphiques Utilisation du canevas Travail sur les images Bitmaps hors cran Rponse aux changements

Prsentation des graphiques


Delphi encapsule diffrents niveaux les fonctions GDI de Windows. Le programmeur qui crit des composants doit comprendre comment ceux-ci affichent leurs images lcran. Lorsque vous appelez directement les fonctions GDI, vous devez disposer dun handle sur un contexte de p riphrique dans lequel vous avez slectionn des outils de dessin comme les crayons, les pinceaux et les fontes. Aprs avoir trac vos images, vous devez remettre le contexte de priphrique dans son tat initial avant de le restituer.
Remarque CLX

Les fonctions GDI sont spcifiques Windows et ne sappliquent pas aux applications multiplates-formes CLX.

Graphiques et composants

45-1

Prsentation des graphiques

Pour vous pargner la gestion de vos graphiques un niveau dtaill, Delphi fournit une interface la fois simple et complte : il sagit de la proprit Canvas des composants. Le canevas garantit qu un contexte de priphrique valide est disponible et restitue le contexte lorsquil est inutilis. Il dispose galement de proprits spcifiques pour reprsenter la fonte, le crayon et le pinceau en cours. Le canevas gre toutes ces ressources votre place et vous navez donc pas le souci de crer, de slectionner ou de restituer les lments comme le handle dun crayon. Vous navez qu indiquer au canevas le crayon utiliser et il se charge du reste. Lun des avantages de laisser Delphi grer les ressources graphiques votre place est que Delphi peut mettre en mmoire cache les ressources en vue dun usage ultrieur, ce qui acclre considrablement les oprations rptitives. Par exemple, supposons quun programme cre, utilise puis restitue un outil crayon dun certain type plusieurs fois de suite, vous devez rpter ces tapes chaque fois que vous lutilisez. Comme Delphi stocke en mmoire cache les ressources graphiques, il y a une forte probabilit quun outil que vous utilisez de faon rptitive se trouve dans la mmoire cache. Aussi, au lieu de recrer loutil en question, Delphi se contentera de rutiliser celui qui existe dj. Par exemple, vous pouvez imaginer une application avec des dizaines de fiches ouvertes et des centaines de contrles. Chacun de ces contrles peut prsenter une ou plusieurs proprits TFont. Comme cela peut gnrer des centaines ou des milliers dinstances dobjets TFont, la plupart des applications nutiliseront que deux ou trois handles de fontes grce un cache de fontes. Voici deux exemples montrant quel point le code Delphi manipulant des graphiques peut tre simple. Le premier utilise les fonctions GDI standard pour dessiner une ellipse jaune borde de bleu comme le ferait dautres outils de dveloppement. Le second utilise un canevas pour dessiner la mme ellipse dans une application crite avec Delphi.
procedure TMyWindow.Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); var PenHandle, OldPenHandle: HPEN; BrushHandle, OldBrushHandle: HBRUSH; begin PenHandle := CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); { cre un crayon bleu } OldPenHandle := SelectObject(PaintDC, PenHandle); { dit DC dutiliser le crayon bleu } BrushHandle := CreateSolidBrush(RGB(255, 255, 0)); { cre un pinceau jaune } OldBrushHandle := SelectObject(PaintDC, BrushHandle); { dit DC dutiliser le pinceau // jaune } Ellipse(HDC, 10, 10, 50, 50); { dessine lellipse } SelectObject(OldBrushHandle); { restaure le pinceau original } DeleteObject(BrushHandle); { supprime le pinceau jaune } SelectObject(OldPenHandle); { restaure le crayon original } DeleteObject(PenHandle); { dtruit le crayon bleu } end; procedure TForm1.FormPaint(Sender: TObject); begin with Canvas do begin

45-2

Guide du dveloppeur

Utilisation du canevas

Pen.Color := clBlue; Brush.Color := clYellow; Ellipse(10, 10, 50, 50); end; end;

{ cre le crayon bleu } { cre le pinceau jaune } { trace lellipse }

Utilisation du canevas
La classe canevas encapsule les contrles graphiques plusieurs niveaux, allant des fonctions de haut niveau (pour dessiner des lignes, des formes et du texte) aux proprits de niveau intermdiaire pour manipuler les fonctionnalits de dessin du canevas ; et dans la VCL, offre un accs de bas niveau au GDI Windows. Le tableau suivant rsume les possibilits du canevas.
Tableau 45.1 Niveau
Haut

Rsum des possibilits du canevas Op ration


Dessin de lignes et de formes Affichage et mesure de texte Remplissage de zones

Outils
Mthodes comme MoveTo, LineTo, Rectangle et Ellipse Mthodes TextOut, TextHeight, TextWidth et TextRect Mthodes FillRect et FloodFill Proprits Pen, Brush et Font Proprit Pixels. Mthodes Draw, StretchDraw, BrushCopy et CopyRect ; proprit CopyMode Proprit Handle

Intermdiaire

Personnalisation de texte et des graphiques Manipulation de pixels Copie et fusion dimages

Bas

Appel des fonctions GDI de Windows

Pour plus dinformations sur les classes canevas, leurs mthodes et leurs proprits, reportez-vous laide en ligne.

Travail sur les images


Dans Delphi, la part la plus importante de votre travail sur les graphiques se limitera au dessin direct sur le canevas des composants et des fiches. Mais Delphi fournit galement les moyens de grer les images graphiques indpendantes, comme les bitmaps, les mtafichiers et les icnes, en assurant dans le mme temps la gestion automatique des palettes. Les trois sujets suivants sont ncessaires la comprhension du travail sur les images dans Delphi : Utilisation dune image, dun graphique ou dun canevas Chargement et stockage des graphiques Gestion des palettes

Graphiques et composants

45-3

Travail sur les images

Utilisation dune image, dun graphique ou dun canevas


Il existe trois sortes de classes dans Delphi intervenant sur les graphiques : Un canevas reprsente une surface de dessin point par point dans une fiche, un contrle graphique, une imprimante ou un bitmap. Un canevas est toujours une proprit de quelque chose dautre, jamais une classe autonome. Un graphique reprsente une image graphique telle quelle se trouve dans un fichier ou une ressource, comme un bitmap, une icne ou un mtafichier. Delphi dfinit les classes TBitmap, TIcon et TMetafile, toutes descendants de lobjet gnrique TGraphic. Vous pouvez aussi dfinir vos propres classes graphiques. En dfinissant une interface standard minimale pour tous les graphiques, TGraphic fournit un mcanisme simple destin aux applications pour quelles puissent exploiter facilement les diffrentes sortes de graphiques disponibles. Une image est le conteneur dun graphique, elle peut donc contenir nimporte quelle classe graphique. Autrement dit, un lment de type TPicture peut contenir un bitmap, une icne, un mtafichier, un type de graphique dfini par lutilisateur, et lapplication y accde dune seule faon par lintermdiaire de la classe image. Par exemple, un contrle image dispose dune proprit Picture, de type TPicture, qui le rend capable dafficher les images de plusieurs sortes de graphiques. Souvenez-vous qu une classe image a toujours un graphique et quun graphique peut avoir un canevas. Le seul graphique standard ayant un canevas est TBitmap. Normalement, lorsque vous avez affaire une image, vous travaillez uniquement avec les constituants de la classe graphique exposs via TPicture. Si vous voulez accder aux constituants spcifiques de la classe graphique elle-mme, vous pouvez faire rfrence la proprit Graphic de limage.

Chargement et stockage des graphiques


Toutes les images et tous les graphiques de Delphi peuvent charger leurs images partir dun fichier et les stocker en retour dans ce mme fichier (ou dans un autre). Ceci peut seffectuer tout moment.
Remarque CLX

Vous pouvez aussi charger des images partir dun fichier et les enregistrer dans une source MIME Qt ou un objet flux en cas de cration de composants CLX. Pour charger une image dans un objet image partir dun fichier, appelez la mthode LoadFromFile de lobjet image. Pour enregistrer une image dans un fichier partir dun objet image, appelez la mthode SaveToFile de lobjet image. LoadFromFile et SaveToFile acceptent le nom dun fichier comme seul paramtre. LoadFromFile utilise lextension du fichier pour dterminer le type dobjet graphique cr ou charg. SaveToFile utilise le type de fichier appropri au type dobjet graphique enregistr.

45-4

Guide du dveloppeur

Travail sur les images

Pour charger un bitmap dans lobjet image dun contrle image, par exemple, vous devez transmettre le nom du fichier bitmap la mthode LoadFromFile de lobjet image :
procedure TForm1.LoadBitmapClick(Sender: TObject); begin Image1.Picture.LoadFromFile(RANDOM.BMP); end;

Lobjet image reconnat .bmp comme extension par dfaut des fichiers bitmap, elle cre donc le graphique en tant que TBitmap, avant dappeler la mthode LoadFromFile du graphique. Puisque le graphique est un bitmap, limage est charge depuis le fichier en tant que bitmap.

Gestion des palettes


Pour les composants VCL, lorsque lexcution fait intervenir un priphrique supportant les palettes (typiquement un mode vido 256 couleurs), Delphi assure automatiquement la ralisation des palettes. Si un contrle dispose dune palette, vous pouvez utiliser deux mthodes hrites de TControl pour contrler la faon dont Windows prend en compte la palette. Les points suivants sont prendre en compte lorsque vous travaillez avec des palettes : Spcification dune palette pour un contrle Rponse aux changements de palette La plupart des contrles nont pas besoin de palette. Toutefois, dans le cas des contrles contenant des images graphiques riches en couleurs (tels que le contrle image) une interaction entre Windows et le pilote de priphrique cran peut tre ncessaire pour afficher correctement le contrle. Dans Windows, ce processus est appel ralisation de palettes. La ralisation de palettes est le processus mis en uvre pour que la fentre en avant-plan utilise la totalit de la palette qui lui est associe. Quant aux fentres en arrire-plan, elles exploitent autant que possible les couleurs de leurs palettes propres, lapproximation des couleurs manquantes se faisant en prenant la couleur disponible la plus proche dans la palette relle. Windows effectue un travail permanent de ralisation des palettes au fur et mesure que les fentres sont dplaces davant en arrire-plan.
Remarque

Delphi nassure ni la cration, ni la maintenance des palettes autres que celles des bitmaps. Toutefois, si vous disposez dun handle de palette, les contrles Delphi peuvent se charger de sa gestion.

Spcification dune palette pour un contrle


Pour spcifier la palette dun contrle VCL, vous devez surcharger la mthode GetPalette du contrle pour qu elle renvoie le handle de la palette.

Graphiques et composants

45-5

Bitmaps hors cran

Le fait de spcifier la palette dun contrle a deux consquences pour votre application : Cela informe lapplication que la palette de votre contrle doit tre ralise. Cela dsigne la palette utiliser pour cette ralisation.

Rponse aux changements de palette


Si votre contrle VCL spcifie une palette en surchargeant GetPalette, Delphi se chargera de rpondre automatiquement aux messages de palette en provenance de Windows. La mthode qui gre les messages de palette est PaletteChanged. Le rle primaire de PaletteChanged est de dterminer sil est ncessaire de raliser les palettes des contrles en avant et arrire-plan. Windows gre la ralisation des palettes en faisant en sorte que la fentre la plus en avant dispose de la palette davant-plan, la rsolution des couleurs des autres fentres se faisant laide des palettes darrire-plan. Delphi va mme plus loin car il ralise les palettes des contrles dune fentre en respectant lordre de tabulation. Seul cas o vous voudrez peut-tre redfinir ce comportement : lorsquun contrle, autre que le premier dans lordre de tabulation, doit rcuprer la palette davant-plan.

Bitmaps hors cran


Lorsque vous dessinez des images graphiques complexes, une technique de programmation graphique habituelle consiste crer dabord un bitmap hors cran, puis dessiner limage dans ce bitmap et copier ensuite la totalit de limage du bitmap vers sa destination finale lcran. Lutilisation dune image hors-cran rduit le scintillement caus par un trac rptitif lcran. Dans Delphi, la classe bitmap qui reprsente les images point par point stockes dans les ressources et les fichiers, peut galement fonctionner en tant quimage hors cran. Les points suivants sont prendre en compte lorsque vous travaillez avec des bitmaps hors cran : Cration et gestion des bitmaps hors cran. Copie des images bitmap.

Cration et gestion des bitmaps hors cran


Lorsque vous crez des images graphiques complexes, vous devez gnralement viter de les dessiner directement sur le canevas qui apparat lcran. Au lieu de les dessiner sur le canevas dune fiche ou dun contrle, vous devez plutt construire un objet bitmap puis dessiner sur son canevas avant de copier la totalit de limage sur le canevas de lcran.

45-6

Guide du dveloppeur

Rponse aux changements

La mthode Paint dun contrle graphique est un exemple dutilisation typique dun bitmap hors cran. Comme avec tout objet temporaire, lobjet bitmap doit tre protg par un bloc try..finally :
type TFancyControl = class(TGraphicControl) protected procedure Paint; override; end;

{ surcharge la mthode Paint }

procedure TFancyControl.Paint; var Bitmap: TBitmap; { variable temporaire pour le bitmap hors cran } begin Bitmap := TBitmap.Create; { construit lobjet bitmap } try { draw on the bitmap } { copy the result into the controls canvas } finally Bitmap.Free; { dtruit lobjet bitmap } end; end;

Copie des images bitmap


Delphi fournit quatre moyens pour copier des images dun canevas un autre. Selon leffet recherch, vous pouvez appeler diffrentes mthodes. Le tableau suivant rsume les mthodes de copie dimage des objets canevas.
Tableau 45.2 M thodes de copie des images Appelez cette m thode
Draw StretchDraw CopyRect BrushCopy

Pour cr er cet effet


Copie dun graphique entier. Copie et redimensionnement dun graphique. Copie dune partie dun canevas. Copie dun bitmap avec effets.

Rponse aux changements


Tous les objets graphiques, y compris les canevas et les objets dont ils sont propritaires (crayons, pinceaux et fontes), disposent dvnements intgrs pour rpondre aux changements. Grce ces vnements, vous pouvez faire en sorte que vos composants (ou les applications qui les utilisent) rpondent aux changements en redessinant leurs images. Sagissant dobjets graphiques, la rponse aux changements est particulirement importante si ces objets sont publis comme lments accessibles de linterface de conception de vos composants. La seule faon dtre certain que laspect dun

Graphiques et composants

45-7

Rponse aux changements

composant au moment de la conception corresponde aux proprits dfinies dans linspecteur dobjets consiste rpondre aux changements apports aux objets. Pour rpondre aux modifications dun objet graphique, vous devez associer une mthode lvnement OnChange de sa classe. Le composant forme publie les proprits reprsentant le crayon et le pinceau quil utilise pour tracer sa forme. Le constructeur du composant associe une mthode lvnement OnChange de chacun, ce qui a pour effet de provoquer le rafrachissement de limage du composant si le crayon ou le pinceau est modifi :
type TShape = class(TGraphicControl) public procedure StyleChanged(Sender: TObject); end; implementation constructor TShape.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelle toujours le constructeur hrit ! Width := 65; Height := 65; FPen := TPen.Create; { construit le crayon FPen.OnChange := StyleChanged; { affecte la mthode lvnement OnChange FBrush := TBrush.Create; { construit le pinceau FBrush.OnChange := StyleChanged; { affecte la mthode lvnement OnChange end; procedure TShape.StyleChanged(Sender: TObject); begin Invalidate(); end;

} } } }

{ dtruit et redessine le composant }

45-8

Guide du dveloppeur

46
Chapitre 46

Chapitre

Gestion des messages

La gestion des messages envoys par Windows aux applications est lune des cls de la programmation Windows traditionnelle. Delphi gre la plupart des messages standard votre place. Mais, vous aurez peut-tre grer des messages que Delphi ne prend pas en compte, ou encore crer puis grer vos propres messages. Les composants CLX ne grent pas les messages Windows mais vous pouvez crer des gestionnaires de messages pour vos propres messages. Il y a trois aspects prendre en considration lorsque vous travaillez avec des messages : Comprhension du systme de gestion des messages Modification de la gestion des messages Cration de nouveaux gestionnaires de messages

Comprhension du systme de gestion des messages


Toutes les classes Delphi disposent dun mcanisme intgr pour grer les messages : ce sont les mthodes de gestion des messages ou gestionnaires de messages. Lide sous-jacente aux gestionnaires de messages est la suivante : un objet reoit des messages quil rpartit selon le message en appelant une mthode choisie dans un ensemble de mthodes spcifiques. Un gestionnaire par dfaut est appel si aucune mthode nest dfinie pour le message. Le diagramme suivant illustre le fonctionnement du systme de rpartition de message :
Evnement MainWndProc WndProc Dispatch Gestionnaire

La bibliothque des composants visuels dfinit un systme de rpartition des messages qui convertit tous les messages Windows (y compris ceux dfinis par lutilisateur) destins une classe spcifique en appels des mthodes. Pour la CLX, le systme de rpartition ne comprend pas MainWndProc et WndProc.

Gestion des messages

46-1

Comprhension du systme de gestion des messages

Vous naurez sans doute jamais besoin de modifier le mcanisme de rpartition des messages. En revanche, vous aurez crire des mthodes de gestion des messages. Voir D claration dune nouvelle mthode de gestion dun message la page 46-7, pour plus de dtails sur ce sujet.

Que contient un message Windows ?


Remarque

Cette information sapplique uniquement lcriture de composants VCL. Un message Windows est un enregistrement de donnes contenant plusieurs donnes membres exploitables. Le plus important est celui qui contient une valeur de la taille dun entier identifiant le message. Windows dfinit de nombreux messages et lunit Messages dclare tous leurs identificateurs. Un paramtre contient 16 bits, lautre 32 bits. Vous voyez souvent du code Windows qui fait rfrence ces valeurs avec wParam et lParam, comme paramtre de type word et paramtre de type long. Souvent, chaque paramtre contient une information, qui fait rfrence un mot de poids fort dans le paramtre de type long. A lorigine, un programmeur Windows devait mmoriser le contenu de chaque paramtre ou consulter lAPI Windows. Microsoft a rcemment donn un nom aux paramtres. Ces dcomposeurs de message ainsi appels simplifient la comprhension des informations accompagnant chaque message. Par exemple, les paramtres pour le message WM_KEYDOWN maintenant appels nVirtKey et lKeyData, donnent plus dinformations spcifiques que wParam et lParam. Pour chaque type de message, Delphi dfinit un type denregistrement qui donne un nom mnmonique chaque paramtre. Les messages souris transmettent par exemple les coordonnes x et y de lvnement souris dans le paramtre de type long, une dans le mot de poids fort, et lautre dans le mot de poids faible. Avec lutilisation de la structure souris-message, vous navez pas vous soucier du mot dont il sagit, car vous faites rfrence aux paramtres par les noms XPos et YPos au lieu de lParamLo et lParamHi.

Rpartition des messages


Remarque

Cette information sapplique uniquement lcriture de composants VCL. Lorsquune application cre une fentre, elle recense une procdure fentre avec le modle Windows. La procdure fentre reprsente la routine qui gre les messages pour la fentre. Habituellement, la procdure fentre contient une instruction longue case avec des entres pour chaque message devant tre gr par la fentre. Noubliez pas que fentre dans ce sens signifie seulement quelque chose sur lcran : chaque fentre, chaque contrle, etc. A chaque fois que vous crez un nouveau type de fentre, vous devez crer une procdure fentre complte. Delphi simplifie la rpartition des messages de plusieurs manires : Chaque composant hrite dun systme complet de rpartition de message.

46-2

Guide du dveloppeur

Modification de la gestion des messages

Le systme de rpartition de message dispose dune gestion par dfaut. Vous ne dfinissez de gestionnaire que pour les messages auxquels vous souhaitez spcifiquement rpondre. Vous pouvez modifier des parties de la gestion de message en vous appuyant sur les mthodes reues en hritage pour la majeure partie du traitement. Le bnfice le plus vident de cette rpartition de message est le suivant : tout moment, vous pouvez envoyer nimporte quel message nimporte quel composant. Si le composant na pas de gestionnaire dfini pour ce message, le systme de gestion par dfaut sen charge, gnralement en ignorant le message.

Suivi du flux des messages


La mthode MainWndProc est recense par Delphi comme procdure de fentre pour tous les types de composants dune application. MainWndProc contient un bloc de gestion des exceptions qui transmet la structure du message en provenance de Windows la mthode virtuelle WndProc, grant les exceptions ventuelles laide de la mthode HandleException de la classe application. MainWndProc est une mthode non virtuelle qui neffectue aucune gestion particulire des messages. Cette gestion a lieu dans WndProc, chaque type de composant ayant la possibilit de surcharger cette mthode pour rpondre ses besoins spcifiques. Les mthodes WndProc vrifient les conditions spciales qui peuvent affecter le traitement et interceptent, sil le faut, les messages non souhaits. Par exemple, lorsque vous faites glisser un composant, celui-ci ignore les vnements du clavier, et la mthode WndProc de TWinControl ne transmet ces vnements que si lutilisateur ne fait pas glisser le composant. Enfin, WndProc appelle Dispatch, une mthode non virtuelle hrite de TObject, qui dtermine la mthode appeler pour grer le message. Dispatch utilise la donne membre Msg de lenregistrement du message pour dterminer comment rpartir le message particulier. Si le composant dfinit un gestionnaire pour ce message, Dispatch appelle cette mthode. Si aucun gestionnaire nest dfini, Dispatch appelle DefaultHandler.

Modification de la gestion des messages


Remarque

Cette information sapplique uniquement lcriture de composants VCL.


Avant de modifier la gestion des messages de vos composants, vous devez tre

certain de ce que vous voulez effectivement faire. Delphi convertit la plupart des messages en vnements que lauteur ou lutilisateur du composant peut grer. Plutt que de modifier le comportement dfinissant la gestion du message, vous voudrez gnralement modifier le comportement dfinissant la gestion de lvnement. Pour modifier la gestion dun message dans les composants VCL, vous devez surcharger la mthode qui gre ce message. En outre, dans certaines

Gestion des messages

46-3

Modification de la gestion des messages

circonstances, vous pouvez empcher un composant de grer un message en interceptant ce message.

Surcharge de la mthode du gestionnaire


Pour modifier la faon dont un composant gre un message en particulier, vous devez surcharger la mthode qui le gre. Si le composant ne gre pas le message en question, vous devez dclarer une nouvelle mthode de gestion du message. Pour surcharger la mthode de gestion dun message, dclarez une nouvelle mthode dans votre composant avec le mme index de message que la mthode surcharge. Nutilisez pas la directive override ; vous devez utiliser la directive message et un index de message correspondant. Remarquez quil nest pas ncessaire que le nom de la mthode et le type du paramtre var simple correspondent la mthode surcharge. Seul lindex de message est significatif. Pour plus de clart, cependant, il est prfrable de suivre la convention dappel des mthodes de gestion de message aprs les messages quelles grent. Par exemple, pour surcharger la gestion du message WM_PAINT dun composant, redclarez la mthode WMPaint :
type TMyComponent = class(...) procedure WMPaint(var Message: TWMPaint); message WM_PAINT; end;

Utilisation des paramtres dun message


Une fois lintrieur dune mthode de gestion de message, votre composant peut accder tous les paramtres de la structure du message. Puisque le paramtre pass au gestionnaire message est un paramtre var, le gestionnaire peut modifier la valeur du paramtre si cest ncessaire. Le seul paramtre qui change frquemment est le champ Result du message : il sagit de la valeur renvoye par lappel de SendMessage qui a mis le message.
Remarque

Cette information sapplique uniquement lcriture de composants VCL. Comme le type du paramtre Message transmis la mthode de gestion dpend du message gr, vous devez vous reporter la documentation des messages Windows pour connatre le nom et la signification de chaque paramtre. Si pour une raison ou pour une autre, vous avez vous rfrer aux paramtres dun message en utilisant lancienne convention dappellation (WParam, LParam, etc.), vous devez transtyper Message vers le type gnrique TMessage, qui utilise ces noms de paramtres.

46-4

Guide du dveloppeur

Cration de nouveaux gestionnaires de messages

Interception des messages


Dans certaines circonstances, vous pouvez souhaiter que certains messages soient ignors par vos composants. Autrement dit, vous voulez empcher le composant de rpartir un message son gestionnaire. Pour intercepter un message de cette faon, vous devez surcharger la mthode virtuelle WndProc. Pour les composants VCL, la mthode WndProc slectionne les messages avant de les transmettre la mthode Dispatch qui, son tour, dtermine la mthode qui gre le message. En surchargeant WndProc, votre composant a la possibilit de filtrer certains messages avant quils ne soient transmis. La surcharge de WndProc pour un contrle driv de TWinControl ressemble ceci :
procedure TMyControl.WndProc(var Message: TMessage); begin { test pour dterminer la poursuite du traitement } inherited WndProc(Message); end;

Le composant TControl dfinit des plages entires de messages lis la souris quil filtre lorsquun utilisateur fait glisser puis lche un contrle. Une mthode WndProc surcharge peut agir par deux moyens : Elle peut filtrer des plages entires de messages au lieu de spcifier un gestionnaire pour chacun deux. Elle peut inhiber totalement la rpartition des messages de faon ce que les gestionnaires ne soient jamais appels. Pour la CLX, un contrle peut tre driv de TWidgetControl et vous pourriez redfinir EventFilter au lieu de WndProc. Voici une partie de la mthode WndProc pour TControl, par exemple :
procedure TControl.WndProc(var Message: TMessage); begin if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then if Dragging then { gestion spcifique dune opration glisser } DragMouseMsg(TWMMouse(Message)) else { gestion normale des autres oprations } end; { autrement gestion normale } end;

Cration de nouveaux gestionnaires de messages


Puisque Delphi fournit des gestionnaires pour la plupart des messages standard, vous avez dfinir de nouveaux gestionnaires de message uniquement lorsque vous dfinissez vous-mmes vos propres messages. Pour travailler avec des messages dfinis par lutilisateur, nous allons tudier les deux points suivants :

Gestion des messages

46-5

Cration de nouveaux gestionnaires de messages

Dfinition de vos propres messages Dclaration dune nouvelle mthode de gestion dun message Les composants CLX ne grent pas les messages Windows mais vous pouvez crer des gestionnaires de messages pour vos propres messages. Notez que vous ne pouvez pas crer des gestionnaires de messages pour les vnements Qt car ce sont des objets et non des identificateurs de messages.

Dfinition de vos propres messages


De nombreux composants standard dfinissent des messages pour leur usage interne. Dfinir des messages peut servir mettre des informations qui ne sont pas prises en compte par les messages standard ou notifier un changement dtat. Vous pouvez dfinir vos propres messages dans la VCL et la CLX. La dfinition dun message est un processus deux tapes :

1 Dclaration dun identificateur de message 2 Dclaration dun type enregistrement de message

Dclaration dun identificateur de message


Un identificateur de message est une constante de la taille dun entier. Windows se rserve pour son propre usage les messages dont le numro est infrieur 1 024. Lorsque vous dclarez vos propres messages, vous devez donc toujours dbuter par un numro suprieur. La constante WM_APP reprsente le numro de dpart pour les messages dfinis par lutilisateur. Lorsque vous dfinissez un identificateur de message, utilisez WM_APP. Notez que certains contrles Windows standard utilisent des messages compris dans la plage des messages utilisateur. Entre autres contrles, il y a les botes liste, les botes options, les botes de saisie et les boutons de commande. Si vous drivez un composant partir de lun deux et si vous voulez lui associer un nouveau message, vrifiez le contenu du lunit Messages pour voir quels messages Windows sont dj dfinis pour ce contrle. Le code suivant dfinit deux messages utilisateur :
const WM_MYFIRSTMESSAGE = WM_APP + 400; WM_MYSECONDMESSAGE = WM_APP + 401;

Dclaration dun type enregistrement de message


Si vous voulez attribuer un nom explicite aux paramtres de votre message, vous devez dclarer un type enregistrement pour le message. Lenregistrement de message correspond au type du paramtre transmis la mthode de gestion du message. Si vous nutilisez pas les paramtres du message ou si vous souhaitez utiliser lancienne notation (wParam, lParam, etc.), utilisez lenregistrement de message implicite, TMessage.

46-6

Guide du dveloppeur

Cration de nouveaux gestionnaires de messages

Pour dclarer un type enregistrement de message, respectez les conventions suivantes :

1 Nommez le type enregistrement daprs le message en rajoutant le prfixe T son nom. 2 Donnez au premier champ de lenregistrement le nom Msg et le type TMsgParam. 3 Dfinissez les deux octets suivants pour quils correspondent au paramtre Word, et les deux suivants inutiliss.
ou Dfinissez les quatre octets suivants pour quils correspondent au paramtre Longint.

4 Ajoutez un dernier champintitul Result de type Longint.


Par exemple, voici un enregistrement de message pour tous les messages de souris, TWMMouse, qui utilisent un enregistrement variant pour dfinir deux ensembles de noms pour les mmes paramtres.
type TWMMouse = record Msg: TMsgParam; Keys: Word; case Integer of 0: { XPos: Integer; YPos: Integer); 1: { Pos: TPoint; Result: Longint); end;

( en premier, lidentificateur du message ) ( voici wParam ) ( deux manires de voir lParam ) ( soit les coordonnes x et y... )

( ... soit un simple point ) ( et enfin, la donne membre rsultat )

Dclaration dune nouvelle mthode de gestion dun message


Deux circonstances vous amnent dclarer de nouvelles mthodes de gestion des messages : Votre composant a besoin de g rer un message Windows qui nest pas pris en compte par les composants standard. Vous avez dfini votre propre message et vous souhaitez lutiliser avec vos composants. Pour dclarer la mthode de gestion dun message, suivez les tapes ci-aprs :

1 Dclarez la mthode dans une partie protected de la dclaration de la classe du composant. 2 Faites de la mthode une procdure. 3 Nommez la mthode suivant le message quelle gre en supprimant les caractres de soulignement de son nom.

Gestion des messages

46-7

Cration de nouveaux gestionnaires de messages

4 Transmettez un seul paramtre var appel Message, du type dfini par lenregistrement du message. 5 A lintrieur de limplmentation de la mthode message, crivez le code de gestion spcifique au composant. 6 Appelez le gestionnaire de message transmis en hritage.
Voici la dclaration, par exemple, dun gestionnaire de message pour un message utilisateur intitul CM_CHANGECOLOR.
const CM_CHANGECOLOR = WM_APP + 400; type TMyComponent = class(TControl) protected procedure CMChangeColor(var Message: TMessage); message CM_CHANGECOLOR; end; procedure TMyComponent.CMChangeColor(var Message: TMessage); begin Color := Message.lParam; inherited; end;

46-8

Guide du dveloppeur

47
Chapitre 47

Chapitre

Accessibilit des composants au moment de la conception

Ce chapitre dcrit les tapes permettant de rendre les composants que vous crez accessibles dans lEDI. Rendre vos composants accessibles la conception est un processus qui ncessite plusieurs tapes : Recensement des composants Ajout de bitmaps la palette Fournir laide pour vos composants Ajout dditeurs de proprits Ajout dditeurs de composants Compilation des composants en paquets

Toutes les tapes ne sappliquent pas tous les composants. Par exemple, si vous ne dfinissez ni proprit ni vnement nouveau, il nest pas ncessaire de fournir de laide. Le recensement et la compilation sont les seules tapes obligatoires. Une fois que vos composants ont t recenss et compils en paquets, ils peuvent tre distribu s dautres dveloppeurs et installs dans lEDI. Pour plus dinformations sur linstallation des paquets dans lEDI, voir Installation de paquets de composants la page 11-6.

Recensement des composants


Le recensement fonctionne en ayant lunit de compilation comme base. Si vous crez plusieurs composants dans la mme unit de compilation, ils seront tous recenss en mme temps. Pour recenser un composant, ajoutez une procdure Register lunit. Dans la procdure Register, vous recensez les composants et dterminez leur emplacement sur la palette des composants.

Accessibilit des composants au moment de la conception

47-1

Recensement des composants

Remarque

Si vous crez votre composant en choisissant Composant|Nouveau Composant dans lEDI, le code requis pour recenser votre composant est automatiquement ajout. Les tapes dun recensement manuel de composant sont : Dclaration de la procdure Register Ecriture de la procdure Register

Dclaration de la procdure Register


Le recensement implique lcriture dune procdure unique dans lunit, qui doit tre nomme Register. La procdure Register doit apparatre dans la partie interface de lunit et, contrairement au reste du Pascal Objet, son nom tient compte des diffrences majuscules/minuscules. Le code suivant montre la prsentation dune seule unit qui cre et recense des nouveaux composants :
unit MyBtns; interface type ... procedure Register; implementation ... procedure Register; begin ... end; end.

{ dclarez vos composants ici } { ceci doit apparatre dans la section interface } { limplmentation de composant vient ici }

{ recense les composants }

Dans la procdure Register, appelez RegisterComponents pour chaque composant que vous souhaitez ajouter la palette des composants. Si lunit contient plusieurs composants, vous pouvez les recenser en une seule fois.

Ecriture de la procdure Register


Dans la procdure Register dune unit contenant des composants, vous devez recenser chaque composant que vous voulez ajouter la palette des composants. Si lunit contient plusieurs composants, vous pouvez les recenser en une seule fois. Pour recenser un composant, appelez la procdure RegisterComponents pour chacune des pages de la palette auxquelles vous souhaitez ajouter des composants. RegisterComponents ncessite trois informations importantes :

1 Spcification des composants 2 Spcification de la page de palette 3 Utilisation de la fonction RegisterComponents

47-2

Guide du dveloppeur

Recensement des composants

Spcification des composants


Dans la procdure Register, transmettez les noms de composant dans un tableau ouvert, que vous pouvez construire dans lappel RegisterComponents.
RegisterComponents(Miscellaneous, [TMyComponent]);

Vous pourriez aussi recenser plusieurs composants en mme temps sur la mme page ou recenser des composants sur des pages diffrentes, comme dans le code suivant :
procedure Register; begin RegisterComponents(Miscellaneous, [TFirst, TSecond]); { deux sur cette page... } RegisterComponents(Assorted, [TThird]); { ...un sur une autre... } RegisterComponents(LoadStr(srStandard), [TFourth]); { ...et un sur la page Standard } end;

Spcification de la page de palette


Le nom de la page de palette est une chane. Si le nom que vous donnez pour la page de palette nexiste pas, Delphi cre une nouvelle page avec ce nom. Delphi stocke les noms des pages standard dans des ressources liste de chanes afin que les versions internationales du produit puissent nommer les pages dans leur langue. Si vous voulez installer un composant dans lune des pages standard, vous obtiendrez la chane du nom de cette page en appelant la fonction LoadStr et en transmettant la constante reprsentant la ressource chane de cette page (par exemple srSystem pour la page Systme).

Utilisation de la fonction RegisterComponents


Dans la procdure Register, appelez RegisterComponents pour recenser les composants dans le tableau des classes. RegisterComponents est une fonction qui prsente deux paramtres : le nom de page de palette des composants et le tableau des classes de composants. Mettez le nom de la page sur la palette des composants, o les composants doivent apparatre, dans le paramtre Page. Si la page nomme existe dj, les composants sont ajouts cette page. Si elle nexiste pas, Delphi cre une nouvelle page palette ayant ce nom. Appelez RegisterComponents depuis limplmentation de la procdure Register dans une des units qui dfinit les composants personnaliss. Les units dfinissant les composants doivent alors tre compiles en un paquet et ce dernier doit tre install avant lajout des composants personnaliss la palette des composants.
procedure Register; begin RegisterComponents(System, [TSystem1, TSystem2]); RegisterComponents(MyCustomPage,[TCustom1, TCustom2]); end;

{ajout la page system } { nouvelle page }

Accessibilit des composants au moment de la conception

47-3

Ajout de bitmaps la palette

Ajout de bitmaps la palette


Chaque composant fait appel un bitmap pour le reprsenter dans la palette. Si vous ne spcifiez pas de bitmap, Delphi utilise un bitmap par dfaut. Puisque les bitmaps dune palette ne sont ncessaires qu la conception, ils ne sont pas compils lintrieur de lunit du composant. En revanche, ils doivent tre fournis dans un fichier de ressources Windows portant le mme nom que lunit, mais avec lextension .DCR (dynamic component resource). Vous pouvez crer ce fichier de ressources en utilisant un diteur dimages dans Delphi. Chaque bitmap doit tre un carr de 24 pixels de ct. Pour chaque composant installer, vous devez fournir un fichier de bitmaps, et dans chaque fichier de bitmaps, un bitmap pour chaque composant recens. Limage bitmap a le mme nom que le composant. Conservez le fichier de bitmaps dans le mme rpertoire que les fichiers compils, afin que Delphi puisse localiser ces bitmaps lorsquil installe les composants dans la palette. Par exemple, si vous crez un composant appel TMyControl dans une unit nomme ToolBox, vous devez crer un fichier de ressources appel TOOLBOX.DCR contenant un bitamp nomm TMYCONTROL. Les noms des ressources ne tiennent pas compte des diffrences majuscules/minuscules, mais sont en majuscules par convention.

Fournir laide pour vos composants


Lorsque vous slectionnez un composant standard dans une fiche, ou une proprit ou un vnement dans linspecteur dobjets, vous pouvez appuyer sur F1 pour obtenir de laide concernant cet lment. Les dveloppeurs pourront accder au mme type dinformation sur vos composants si vous crez les fichiers daide appropris. Vous pouvez fournir un fichier daide de faible encombrement pour dcrire vos composants et votre fichier daide devient partie intgrante du systme daide global de Delphi. Voir Cration du fichier daide la page 47-4 pour des informations sur la manire de composer le fichier daide utiliser avec un composant.

Cration du fichier daide


Vous pouvez utiliser loutil de votre choix pour crer les fichiers daide Windows (au format .rtf). Delphi inclut le Microsoft Help Workshop, qui compile les fichiers daide et contient un guide en ligne destin lauteur du systme daide. Vous y trouverez toutes les informations ncessaires la cration des systmes daide.

47-4

Guide du dveloppeur

Fournir laide pour vos composants

La composition de fichiers daide pour les composants seffectue en plusieurs tapes : Cration des entres Aide contextuelle des composants Ajout des fichiers daide des composants

Cration des entres


Pour que laide associe votre composant fonctionne de faon transparente avec celle des autres composants de la bibliothque, vous devez respecter les conventions suivantes :

1 Chaque composant doit avoir une rubrique daide.


La rubrique associe au composant doit montrer dans quelle unit est dclar le composant et fournir une brve description du composant. La rubrique du composant doit proposer des liens vers des fentres secondaires dcrivant la position du composant dans la hirarchie des objets et rpertorier lensemble de ses proprits, vnements et mthodes. Les dveloppeurs dapplications accderont cette rubrique en slectionnant le composant dans une fiche et en appuyant sur F1. Pour avoir un exemple dune rubrique associe un composant, positionnez-vous sur un composant quelconque dans une fiche et appuyez sur F1. La rubrique de composant doit avoir une note de bas de page # avec une valeur unique de rubrique. La note de bas de page # identifie de manire unique chaque rubrique du systme daide. La rubrique associe au composant doit avoir une note de bas de page K (qui indique les mots cl de recherche) comprenant le nom de la classe du composant. Par exemple, la note de bas de page des mots cls pour le composant TMemo contient TMemo. La rubrique associe au composant doit galement comprendre une note de bas de page $ qui indique le titre de la rubrique. Le titre apparat dans la bote de dialogue des rubriques, la bote de dialogue Signet et la fentre Historique.

2 Chaque composant doit inclure les rubriques de navigation secondaires suivantes :


Une rubrique de hirarchie offrant des liens vers chaque anctre du composant appartenant sa hirarchie. Une liste de toutes les proprits disponibles dans le composant, avec des liens vers les entres dcrivant ces proprits. Une liste de tous les vnements disponibles dans le composant, avec des liens vers les entres dcrivant ces vnements. Une liste de toutes les mthodes disponibles dans le composant, avec des liens vers les entres dcrivant ces mthodes. Les liens vers les classes dobjets, les proprits ou les vnements dans le systme daide de Delphi peuvent tre raliss laide de Alinks. Alink opre

Accessibilit des composants au moment de la conception

47-5

Fournir laide pour vos composants

la liaison vers une classe dobjet en utilisant le nom de classe de lobjet suivi dun caractre de soulignement et de la chane object. Par exemple, pour raliser un lien vers lobjet TCustomPanel, utilisez le code suivant :
!AL(TCustomPanel_object,1)

Pour raliser un lien vers une proprit, une mthode ou un vnement, faites prcder son nom par celui de lobjet qui limplmente et par un caractre de soulignement. Par exemple, pour raliser un lien vers la proprit Text implmente par TControl, utilisez le code suivant :
!AL(TControl_Text,1)

Pour voir un exemple de rubriques de navigation secondaires, affichez laide dun composant quelconque et cliquez sur les liens tiquets hirarchie, proprits, mthodes ou vnements.

3 Chaque proprit, vnement ou mthode dclar lintrieur du composant doit avoir une rubrique.
Une rubrique dcrivant une proprit, un vnement ou une mthode doit indiquer la dclaration de llment et dcrire son rle. Les dveloppeurs dapplications accderont cette rubrique en slectionnant llment dans linspecteur dobjets et en appuyant sur F1, ou en plaant le curseur dans lditeur de code sur le nom de llment et en appuyant sur F1. Pour avoir un exemple de rubrique associe une proprit, slectionnez un lment quelconque dans linspecteur dobjets et appuyez sur F1. Les rubriques de proprit, dvnement et de mthode doivent inclure une note de bas de page K qui indique le nom de la proprit, de lvnement et de la mthode, son nom et celui du composant. Ainsi, la proprit Text de TControl prsente la note de bas de page K suivante :
Text,TControl;TControl,Text;Text,

Les rubriques de proprit, de mthode ou dvnement doivent galement comporter une note de bas de page $ indiquant le titre de la rubrique, tel que TControl.Text. Toutes ces rubriques doivent disposer dun identificateur de rubrique unique la rubrique, entr sous la forme dune note de bas de page #.

Aide contextuelle des composants


Chaque rubrique de composant, de proprit, de mthode et dvnement doit avoir une note de bas de page A. La note de bas de page A permet dafficher la rubrique lorsque lutilisateur slectionne un composant et appuie sur F1, ou lorsquil slectionne une proprit ou un vnement dans linspecteur dobjets et appuie sur F1. Les notes de bas de page A doivent suivre certaines conventions dappellation : Si la rubrique daide est destine un composant, la note de bas de page A comprend deux entres spares par un point-virgule selon la syntaxe suivante :
ComponentClass_Object;ComponentClass

o ComponentClass est le nom de la classe du composant.

47-6

Guide du dveloppeur

Ajout dditeurs de proprits

Si la rubrique daide est destine une proprit ou un vnement, la note de bas de page A comprend trois entres spares par des points-virgules selon la syntaxe suivante :
ComponentClass_Element;Element_Type;Element

o ComponentClass est le nom de la classe du composant, Element est le nom de la proprit, de la mthode ou de lvnement et Type est la proprit, la mthode ou lvnement Par exemple, en supposant une proprit BackgroundColor dun composant TMyGrid, la note de bas de page A est
TMyGrid_BackgroundColor;BackgroundColor_Property;BackgroundColor

Ajout des fichiers daide des composants


Pour ajouter votre fichier daide Delphi, utilisez lutilitaire OpenHelp (appel oh.exe) situ dans le rpertoire bin ou en utilisant Aide|Personnaliser dans lEDI. Vous obtiendrez des informations sur le fichier OpenHelp.hlp sur lutilisation de OpenHelp, ainsi que sur lajout de votre fichier daide au systme daide.

Ajout dditeurs de proprits


Linspecteur dobjets permet par dfaut de modifier tous les types de proprits. Vous pouvez toutefois crer un diteur pour des proprits spcifiques en lcrivant et en le recensant. Vous pouvez recenser les diteurs de proprits afin quils sappliquent uniquement aux proprits des composants dont vous tes lauteur, ou toutes les proprits du type spcifi. A la base, un diteur de proprits peut oprer selon deux modes : affichage sous la forme dune chane texte permettant lutilisateur la modification de la valeur courante ; affichage dune bote de dialogue permettant des modifications dune autre sorte. Selon la proprit en cours de modification, vous pourrez faire appel lun ou lautre mode. Lcriture dun diteur de proprit se droule en cinq tapes :

1 2 3 4 5

Drivation dune classe diteur de proprits Modification de la proprit sous une forme textuelle Modification globale de la proprit Spcification des attributs de lditeur Recensement de lditeur de proprits

Drivation dune classe diteur de proprits


La VCL et la CLX dfinissent plusieurs sortes dditeurs de proprits, tous descendant de TPropertyEditor. Lorsque vous crez un diteur de proprits, votre classe diteur de proprits peut descendre directement de TPropertyEditor ou dun des types dditeurs de proprits dcrits dans le tableau suivant. Les classes de lunit DesignEditors peuvent tre utilises dans les applications VCL

Accessibilit des composants au moment de la conception

47-7

Ajout dditeurs de proprits

et CLX. Nanmoins, certaines classes diteur de proprit fournissent des botes de dialogue spcialises et sont ainsi spcialises VCL ou CLX. Elles peuvent tre trouves respectivement dans les units WinEditors et CLXEditors.
Remarque

Ce qui est absolument ncessaire pour un diteur de proprit est quil drive de TBasePropertyEditor et quil prenne en charge linterface IProperty. Nanmoins, TPropertyEditor fournit une implmentation par dfaut de linterface IProperty. La liste du tableau suivant nest pas complte. Les units WinEditors et CLXEditors dfinissent galement certains diteurs spcialiss utiliss exclusivement par certaines proprits comme le composant Name. Les diteurs de proprits ci-dessous sont les plus utiles aux concepteurs de proprits dfinies par lutilisateur.
Tableau 47.1 Type
TOrdinalProperty TIntegerProperty TCharProperty TEnumProperty TFloatProperty TStringProperty TSetElementProperty TSetProperty

Types d diteurs de propri ts prdfinis Proprit s modifiables


Tous les diteurs de valeurs ordinales (proprits de type entier, caractres, num r) sont des descendants de TOrdinalProperty. Tous les types entiers y compris ceux prdfinis ainsi que les intervalles utilisateur. Le type Char et les intervalles de valeurs Char tels que A..Z. Tous les types numrs. Tous les nombres virgule flottante. Toutes les chanes. Les lments des ensembles comme valeurs boolennes. Tous les ensembles. Les ensembles ne sont pas directement modifiables mais peuvent tre dvelopps sous la forme dune liste de proprits que sont les lments de lensemble. Classes. Affiche le nom de la classe et se dveloppe pour afficher les proprits de la classe. Pointeurs sur des mthodes, le plus souvent des vnements. Les composants de la mme fiche. Ne permet pas la modification des proprits des composants, mais peut pointer sur un composant spcifique de type compatible. Les couleurs dun composant. Montre si possible les constantes de couleurs ou dfaut leurs valeurs en hexadcimal. Une liste droulante affiche les constantes de couleurs. Un double-clic a pour effet douvrir la bote de dialogue de slection des couleurs. Les noms de fontes. La liste droulante affiche toutes les fontes actuellement installes. Les fontes. Autorise le dveloppement des proprits dune fonte particulire et offre laccs la bote de dialogue des fontes.

TClassProperty TMethodProperty TComponentProperty

TColorProperty

TFontNameProperty TFontProperty

Lexemple suivant montre la dclaration dun diteur de proprits simple nomm TMyPropertyEditor :
type TFloatProperty = class(TPropertyEditor) public function AllEqual: Boolean; override;

47-8

Guide du dveloppeur

Ajout dditeurs de proprits

function GetValue: string; override; procedure SetValue(const Value: string); override; end;

Modification de la proprit sous une forme textuelle


Toutes les proprits doivent fournir une reprsentation de type chane de leurs valeurs en vue de leur affichage dans linspecteur dobjets. Dans le cas de la plupart des proprits, le dveloppeur pourra saisir une nouvelle valeur lors de la conception. Les classes diteur de proprits fournissent des mthodes virtuelles que vous pouvez surcharger afin de convertir le texte de la proprit en sa valeur relle. Les mthodes surcharger sont GetValue et SetValue. Votre diteur de proprits hrite galement dun ensemble de mthodes utilises pour affecter et lire diffrentes sortes de valeurs comme le montre le tableau suivant.
Tableau 47.2 M thodes pour lire et crire les valeurs des proprits M thode Get
GetFloatValue GetMethodValue GetOrdValue GetStrValue

Type de proprit
Virgule flottante Pointeur de m thode (vnement) Type ordinal Chane

M thode Set
SetFloatValue SetMethodValue SetOrdValue SetStrValue

Lorsque vous surchargez une mthode GetValue, appelez lune des mthodes Get. Lorsque vous surchargez SetValue, appelez lune des mthodes Set.

Affichage de la valeur de la proprit


La mthode GetValue de lditeur de proprits renvoie une chane reprsentant la valeur en cours de la proprit. Linspecteur dobjets utilise cette chane dans la colonne des valeurs pour cette proprit. Par dfaut, GetValue renvoie inconnu. Pour fournir une reprsentation sous une forme chane, vous devez surcharger la mthode GetValue de lditeur de proprits. Si la proprit nest pas une valeur chane, votre mthode GetValue doit convertir la valeur en une chane.

Dfinition de la valeur de la proprit


La mthode SetValue de lditeur de proprits accepte la chane saisie dans linspecteur dobjets, la convertit dans le type appropri, et dfinit la proprit. Si la chane nest pas une valeur convenant la proprit, SetValue doit dclencher et ignorer la valeur. Pour lire la valeur dune proprit, vous devez surcharger la mthode SetValue de lditeur de proprits. SetValue doit convertir la chane et la valider avant dappeler une des mthodes.

Accessibilit des composants au moment de la conception

47-9

Ajout dditeurs de proprits

Voici les mthodes GetValue et SetValue de TIntegerProperty. Integer est de type ordinal, ainsi GetValue appelle GetOrdValue et convertit le rsultat en chane. SetValue convertit la chane en entier, effectue certains calculs dintervalle et appelle SetOrdValue.
function TIntegerProperty.GetValue: string; begin with GetTypeData(GetPropType)^ do if OrdType = otULong then // non sign Result := IntToStr(Cardinal(GetOrdValue)) else Result := IntToStr(GetOrdValue); end; procedure TIntegerProperty.SetValue(const Value: string); procedure Error(const Args: array of const); begin raise EPropertyError.CreateResFmt(@SOutOfRange, Args); end; var L: Int64; begin L := StrToInt64(Value); with GetTypeData(GetPropType)^ do if OrdType = otULong then begin if (L < Cardinal(MinValue)) or (L > Cardinal(MaxValue)) then Error([Int64(Cardinal(MinValue)), Int64(Cardinal(MaxValue))]); end else if (L < MinValue) or (L > MaxValue) then Error([MinValue, MaxValue]); SetOrdValue(L); end;

Les spcificits des exemples particuliers sont moins importantes quen principe : GetValue convertit la valeur en chane ; SetValue convertit la chane et valide la valeur avant dappeler une des mthodes Set.

Modification globale de la proprit


Si vous le souhaitez, vous pouvez fournir une bote de dialogue pour la dfinition de la proprit. Lutilisation la plus courante des diteurs de proprits concerne les proprits qui sont des classes. Un exemple est la proprit Font, qui a une bote de dialogue diteur associe permettant au dveloppeur de choisir tous les attributs de fonte en mme temps. Pour fournir une bote de dialogue de dfinition globale de la proprit, surchargez la mthode Edit de la classe diteur de proprits. Les mthodes Edit utilisent les mmes mthodes Get et Set utilises dans les mthodes GetValue et SetValue ; une mthode Edit appelle la fois une mthode Get et une mthode Set. Comme lditeur est spcifique du type, il est

47-10

Guide du dveloppeur

Ajout dditeurs de proprits

habituellement inutile de convertir les valeurs des proprits en chanes. Lditeur traite gnralement la valeur telle quelle a t rcupre. Lorsque lutilisateur clique sur le bouton ... ct de la proprit, ou doubleclique sur la colonne des valeurs, linspecteur dobjets appelle la mthode Edit de lditeur de proprits. Pour votre implmentation de la mthode Edit, suivez ces tapes :

1 Construisez lditeur que vous utilisez pour cette proprit. 2 Lisez la valeur en cours et attribuez-la la proprit en utilisant une mthode Get. 3 Lorsque lutilisateur slectionne une nouvelle valeur, attribuez cette valeur la proprit en utilisant une mthode Set. 4 Dtruisez lditeur.
Les proprits Color trouves dans la plupart des composants utilisent la bote de dialogue de couleur standard Windows comme diteur de proprits. Voici la mthode Edit issue de TColorProperty, qui appelle la bote de dialogue et utilise le rsultat :
procedure TColorProperty.Edit; var ColorDialog: TColorDialog; begin ColorDialog := TColorDialog.Create(Application); { construit lditeur try ColorDialog.Color := GetOrdValue; { utilise la valeur existante if ColorDialog.Execute then { si lutilisateur valide la bote de dialogue par OK... SetOrdValue(ColorDialog.Color); { ...utilise le rsultat pour dfinir la valeur finally ColorDialog.Free; { dtruit lditeur } end; end;

} } } }

Spcification des attributs de lditeur


Lditeur de proprits doit fournir les informations permettant linspecteur dobjets de dterminer les outils afficher. Par exemple, linspecteur a besoin de savoir si la proprit a des sous-proprits, ou sil doit afficher la liste des valeurs possibles de la proprit. Pour spcifier les attributs de lditeur, vous devez surcharger sa mthode GetAttributes.

Accessibilit des composants au moment de la conception

47-11

Ajout dditeurs de proprits

GetAttributes renvoie un ensemble de valeurs de type TPropertyAttributes qui peut inclure une ou plusieurs des valeurs suivantes :
Tableau 47.3 Indicateur
paValueList paSubProperties paDialog paMultiSelect paAutoUpdate

Indicateurs des attributs des diteurs de proprits Mthode associ e


GetValues GetProperties Edit N/D SetValue

Signification si inclus
Lditeur peut fournir une liste de valeurs numres. La proprit dispose de sous-proprits quil est possible dafficher. Lditeur peut afficher une bote de dialogue permettant de modifier globalement la proprit. La proprit doit safficher lorsque lutilisateur slectionne plusieurs composants. Mise jour du composant aprs chaque modification au lieu dattendre lapprobation de la valeur. Linspecteur dobjets doit trier la liste de valeurs. La valeur de la proprit ne peut tre modifie lors de la conception. Active llment de menu Revenir hrit dans le menu contextuel de linspecteur dobjets. Cet lment de menu demande lditeur dannuler la valeur en cours de la proprit et de revenir une valeur par dfaut ou standard pralablement tablie. La valeur na pas besoin dtre affiche. Linspecteur dobjets utilise toute sa largeur pour le nom de proprit. Linspecteur dobjets rcupre les valeurs de toutes les sous-proprits chaque modification de la valeur de la proprit. La valeur est une rfrence quelque chose dautre. Utilis conjointement avec paSubProperties, lobjet rfrenc devrait tre affich comme sous-proprits de cette proprit.

paSortList paReadOnly paRevertable

N/D N/D N/D

paFullWidthName

N/D

paVolatileSubProp erties paReference

GetProperties

GetComponentValue

Les proprits Color sont plus polyvalentes que la plupart des autres proprits, lutilisateur dispose de plusieurs moyens pour slectionner une couleur dans linspecteur dobjets : il peut taper une valeur, slectionner dans une liste ou faire appel lditeur personnalis. Cest pourquoi la mthode GetAttributes de TColorProperty, inclut plusieurs attributs dans la valeur quelle renvoie :
function TColorProperty.GetAttributes: TPropertyAttributes; begin Result := [paMultiSelect, paDialog, paValueList, paRevertable]; end;

47-12

Guide du dveloppeur

Ajout dditeurs de proprits

Recensement de lditeur de proprits


Lorsque lditeur de proprits est cr, vous devez le recenser dans Delphi. Le recensement dun diteur de proprits associe un type de proprit et un diteur spcifique. Vous pouvez recenser un diteur pour toutes les proprits dun type particulier ou juste pour une proprit particulire dun type de composant particulier. Pour recenser un diteur de proprits, appelez une procdure RegisterPropertyEditor. RegisterPropertyEditor prend quatre paramtres : Un pointeur de type information dcrivant le type de la proprit modifier. Il sagit toujours dun appel la fonction intgre TypeInfo, telle que TypeInfo(TMyComponent). Le type du composant auquel sapplique cet diteur. Si ce paramtre est nil, lditeur sapplique toutes les proprits dun type donn. Le nom de la proprit. Ce paramtre nest significatif que si le paramtre qui le prcde spcifie un type particulier de composant. Dans ce cas, vous pouvez spcifier une proprit de ce type auquel sapplique lditeur. Le type dditeur de proprits utiliser pour modifier la proprit spcifie. Voici un extrait de la procdure qui recense les diteurs des composants standard inclus dans la palette :
procedure Register; begin RegisterPropertyEditor(TypeInfo(TComponent), nil, , TComponentProperty); RegisterPropertyEditor(TypeInfo(TComponentName), TComponent, Name, TComponentNameProperty); RegisterPropertyEditor(TypeInfo(TMenuItem), TMenu, , TMenuItemProperty); end;

Les trois instructions de cette procdure couvrent les diffrentes utilisations de RegisterPropertyEditor : La premire instruction est la plus typique. Elle recense lditeur de proprits TComponentProperty pour toutes les proprits de type TComponent (ou les descendants de TComponent qui nont pas dditeur sp cifique recens). Habituellement, vous crez un diteur sappliquant un type particulier, puis vous souhaitez lutiliser pour lensemble des proprits de ce type. Cest pourquoi le deuxime et le troisime paramtres ont pour valeurs respectives nil et une chane vide. La deuxime instruction est le type de recensement le plus spcifique. Elle recense un diteur pour une proprit spcifique et pour un type sp cifique de composant. Dans notre exemple, lditeur sapplique la proprit Name (de type TComponentName) de tous les composants.

Accessibilit des composants au moment de la conception

47-13

Catgories de proprit

La troisime instruction est plus sp cifique que la premire, et moins que la deuxime. Elle recense un diteur pour toutes les proprits de type TMenuItem pour les composants de type TMenu.

Catgories de proprit
Dans lIDE, linspecteur dobjets vous permet de masquer et dafficher slectivement des proprits bases sur les catgories de proprit. Les proprits des nouveaux composants personnaliss peuvent rentrer dans ce schma en recensant des proprits par catgories. Faites ceci lors du recensement du composant en appelant RegisterPropertyInCategory ou RegisterPropertiesInCategory. Utilisez RegisterPropertyInCategory pour recenser une seule proprit. Utilisez RegisterPropertiesInCategory pour recenser plusieurs proprits dans un seul appel de fonction. Ces fonctions sont dfinies dans lunit DesignIntf. Notez quil nest pas obligatoire de recenser des proprits ni que toutes les proprits dun composant personnalis soient recenses lorsque quelques-unes le sont. Toute proprit non explicitement associe une catgorie est incluse dans la catgorie TMiscellaneousCategory. De telles proprits sont affiches ou masques dans linspecteur dobjets selon cette catgorisation par dfaut. En plus de ces deux fonctions de recensement de proprits, il existe une fonction IsPropertyInCategory. Cette fonction est utile pour la cration dutilitaires de localisation, dans laquelle vous devez dterminer si une proprit est recense dans une catgorie de proprit donne.

Recensement dune proprit la fois


Vous pouvez recenser une proprit la fois et lassocier une catgorie de proprit en utilisant la fonction RegisterPropertyInCategory. RegisterPropertyInCategory est fournie dans quatre variations surcharges, chacune proposant un ensemble diffrent de critres pour lidentification de la proprit dans le composant personnalis associ la catgorie de proprit. La premire variation vous permet didentifier la proprit selon son nom. La ligne ci-aprs recense une proprit associe laffichage visuel du composant, en identifiant la proprit par son nom, AutoSize.
RegisterPropertyInCategory(Visual, AutoSize);

La deuxime variation identifie la proprit en utilisant le type de classe de composant et le nom de proprit caractristiques. Lexemple ci-aprs recense (dans la catgorie THelpCategory) une proprit appele HelpContext dun composant de la classe personnalise TMyButton.
RegisterPropertyInCategory(Help and Hints, TMyButton, HelpContext);

La troisime variation identifie la proprit en utilisant son type au lieu de son nom. Lexemple ci-aprs recense une proprit base sur son type, Integer.
RegisterPropertyInCategory(Visual, TypeInfo(Integer));

47-14

Guide du dveloppeur

Catgories de proprit

La dernire variation utilise la fois le type de la proprit et son nom pour identifier la proprit. Lexemple ci-aprs recense une proprit base sur une combinaison de son type, TBitmap et de son nom, Pattern.
RegisterPropertyInCategory(Visual, TypeInfo(TBitmap), Pattern);

Consultez la section Spcification de catgories de proprits pour une liste des catgories de proprits disponibles et une brve description de leur utilisation.

Recensement de plusieurs proprits en une seule fois


Vous pouvez recenser plusieurs proprits en une seule fois et les associer une catgorie de proprit en utilisant la fonction RegisterPropertiesInCategory. RegisterPropertiesInCategory est fournie dans trois variations surcharges, chacune proposant un ensemble diffrent de critres pour lidentification de la proprit dans le composant personnalis associ la catgorie de proprit. La premire variation vous permet didentifier des proprits en fonction du nom ou du type de proprit. La liste est transmise sous la forme dun tableau de constantes. Dans lexemple ci-aprs, toute proprit ayant pour nom Text ou qui appartient une classe de type TEdit est recense dans la catgorie Localizable.
RegisterPropertiesInCategory(Localizable, [Text, TEdit]);

La deuxime variation vous permet de limiter les proprits recenses celles qui appartiennent un composant spcifique. La liste des proprits recenser comprend seulement les noms, pas les types. Par exemple, le code suivant recense un nombre de proprits dans la catgorie Help and Hints pour tous les composants :
RegisterPropertiesInCategory(Help and Hints, TComponent, [HelpContext, Hint, ParentShowHint, ShowHint]);

La troisime variation vous permet de limiter les proprits recenses celles possdant un type spcifique. Comme avec la seconde variation, la liste des proprits recenser peut ninclure que les noms :
RegisterPropertiesInCategory(Localizable, TypeInfo(String), [Text, Caption]);

Consultez la section Spcification de catgories de proprits pour obtenir une liste des catgories de proprit disponibles ainsi quune brve description de leur utilisation.

Spcification de catgories de proprits


Lorsque vous recensez les proprits dans une catgorie, vous pouvez utiliser la chane de votre choix pour le nom de la catgorie. Si vous utilisez une chane qui na pas encore t utilise, linspecteur dobjets gnre une nouvelle classe de catgorie de proprits avec ce nom. Vous pouvez nanmoins recenser des

Accessibilit des composants au moment de la conception

47-15

Catgories de proprit

proprits dans des catgories intgres. Les catgories de proprits intgres sont dcrites dans le tableau suivant :
Tableau 47.4 Cat gorie
Action Database

Catgories de proprits Usage


Proprits relatives aux actions dexcution ; les proprits Enabled et Hint de TEdit se trouvent dans cette catgorie. Proprits relatives aux oprations de bases de donnes ; les proprits DatabaseName et SQL de TQuery se trouvent dans cette catgorie. Proprits relatives aux oprations de glisser-dplacer et dancrage ; les proprits DragCursor et DragKind de TImage se trouvent dans cette catgorie. Proprits relatives lutilisation de laide en ligne ou des conseils ; les proprits HelpContext et Hint de TMemo se trouvent dans cette catgorie. Proprits relatives laffichage visuel dun contrle la conception ; les proprits Top et Left de TDBEdit se trouvent dans cette catgorie. Proprits relatives aux oprations obsoltes ; les proprits Ctl3D et ParentCtl3D de TComboBox se trouvent dans cette catgorie. Proprits relatives lassociation ou la liaison dun composant un autre ; la proprit DataSet de TDataSource se trouve dans cette catgorie. Proprits relatives aux localisations internationales ; les proprits BiDiMode et ParentBiDiMode de TMainMenu se trouvent dans cette catgorie. Proprits qui peuvent ncessiter des modifications dans les versions localises dune application. De nombreuses proprits chane (comme Caption) font partie de cette catgorie ainsi que les proprits qui dterminent la taille et la position des contrles. Proprits relatives laffichage visuel dun contrle lexcution ; les proprits Align et Visible de TScrollBox se trouvent dans cette catgorie. Proprits relatives la saisie de donnes (il nest pas ncessaire quelles soient relatives aux oprations de bases de donnes) ; les proprits Enabled et ReadOnly de TEdit se trouvent dans cette catgorie. Proprits qui ne rentrent pas dans une catgorie ou nont pas besoin dtre mises dans des catgories (et les proprits non explicitement recenses dans une catgorie spcifique) ; les proprits AllowAllUp et Name de TSpeedButton se trouvent dans cette catgorie.

Drag, Drop, and Docking Help and Hints

Layout Legacy Linkage

Locale

Localizable

Visual

Input

Miscellaneous

Utilisation de la fonction IsPropertyInCategory


Une application peut rechercher les proprits recenses existantes afin de dterminer si une proprit donne est toujours recense dans une catgorie indique. Ceci peut tre particulirement utile dans des situations telles quun utilitaire de localisation qui vrifie la catgorisation des proprits afin de prparer ses oprations de localisation. Deux variations surcharges de la

47-16

Guide du dveloppeur

Ajout dditeurs de composants

fonction IsPropertyInCategory sont disponibles, autorisant diffrents critres afin de dterminer si une proprit se trouve dans une catgorie. La premire variation vous permet de baser le critre de comparaison sur une combinaison du type de classe du composant propritaire et du nom de la proprit. Dans la ligne de commande ci-aprs, pour que IsPropertyInCategory renvoie True, la proprit doit appartenir un descendant de TCustomEdit, avoir le nom Text et se trouver dans la catgorie de proprit Localizable.
IsItThere := IsPropertyInCategory(Localizable, TCustomEdit, Text);

La deuxime variation vous permet de baser le critre de comparaison sur une combinaison du nom de classe du composant propritaire et du nom de la proprit. Dans la ligne de commande ci-aprs, pour que IsPropertyInCategory renvoie True, la proprit doit tre un descendant de TCustomEdit, avoir le nomText, et se trouver dans la catgorie de proprit Localizable.
IsItThere := IsPropertyInCategory(Localizable, TCustomEdit, Text);

Ajout dditeurs de composants


Les diteurs de composants dterminent ce qui se passe lorsque vous doublecliquez sur le composant dans le concepteur et ajoutent des commandes au menu contextuel qui apparat lorsque vous cliquez sur le composant avec le bouton droit. Ils peuvent galement copier votre composant dans le Pressepapiers Windows dans des formats personnaliss. Si vous nattribuez pas dditeur vos composants, Delphi utilise lditeur de composants par dfaut. Ce dernier est implment par la classe TDefaultEditor. TDefaultEditor najoute aucun nouvel lment au menu contextuel dun composant. Lorsque vous double-cliquez sur le composant, TDefaultEditor recherche ses proprits et gnre le premier gestionnaire dvnement trouv ou sy rend. Pour ajouter des lments au menu contextuel, modifier le comportement du composant lorsque vous double-cliquez dessus ou ajouter de nouveaux formats de Presse-papiers, drivez une nouvelle classe partir de TComponentEditor et recensez-la pour quelle soit utilise avec votre composant. Dans vos mthodes surcharges, vous pouvez utiliser la proprit Component de TComponentEditor pour accder au composant en cours de modification. Lajout dun diteur de composants personnalis comprend plusieurs tapes : Ajout dlments au menu contextuel Modification du comportement suite un double-clic Ajout de formats de Presse-papiers Recensement dun diteur de composants

Accessibilit des composants au moment de la conception

47-17

Ajout dditeurs de composants

Ajout dlments au menu contextuel


Lorsque lutilisateur clique avec le bouton droit sur le composant, les mthodes GetVerbCount et GetVerb de lditeur de composants sont appeles pour construire un menu contextuel. Vous pouvez surcharger ces mthodes pour ajouter des commandes (verbes) au menu contextuel. Lajout dlments au menu contextuel requiert ces tapes : Spcification dlments de menu Implmentation des commandes

Spcification dlments de menu


Surchargez la mthode GetVerbCount pour renvoyer le nombre de commandes que vous ajoutez au menu contextuel. Surchargez la mthode GetVerb pour renvoyer les chanes qui doivent tre ajoutes pour chacune de ces commandes. Lorsque vous surchargez GetVerb, ajoutez un et commercial (&) dans une chane afin que le caractre suivant apparaisse soulign dans le menu contextuel et fasse office de touche de raccourci pour la slection de llment du menu. Veillez ajouter des points de suspension (...) la fin dune commande si elle fait apparatre une bote de dialogue. GetVerb possde un paramtre unique pour indiquer lindex de la commande. Le code suivant surcharge les mthodes GetVerbCount et GetVerb pour ajouter deux commandes au menu contextuel.
function TMyEditor.GetVerbCount: Integer; begin Result := 2; end; function TMyEditor.GetVerb(Index: Integer): String; begin case Index of 0: Result := &DoThis ...; 1: Result := Do&That; end; end; Remarque

Veillez ce que votre mthode GetVerb renvoie une valeur pour chaque index possible indiqu par GetVerbCount.

Implmentation des commandes


Lorsque la commande fournie par GetVerb est slectionne dans le concepteur, la mthode ExecuteVerb est appele. Pour chaque commande que vous spcifiez dans la mthode GetVerb, implmentez une action dans la mthode ExecuteVerb. Vous pouvez accder au composant en cours de modification laide de la proprit Component de lditeur. Par exemple, la mthode ExecuteVerb suivante implmente les commandes de la mthode GetVerb de lexemple prcdent.
procedure TMyEditor.ExecuteVerb(Index: Integer);

47-18

Guide du dveloppeur

Ajout dditeurs de composants

{ instantie lditeur } { si lutilisateur valide la // bote de dialogue par OK... } MyComponent.FThisProperty := MySpecialDialog.ReturnValue;{ ...utilise la valeur } MySpecialDialog.Free; { dtruit lditeur } end; 1: That; { appelle la mthode That } end; end;

var MySpecialDialog: TMyDialog; begin case Index of 0: begin MyDialog := TMySpecialDialog.Create(Application); if MySpecialDialog.Execute then;

Modification du comportement suite un double-clic


Lorsque vous double-cliquez sur le composant, la mthode Edit du composant est appele. Par dfaut, la mthode Edit excute la premire commande ajoute au menu contextuel. Ainsi, dans lexemple prcdent, le fait de double-cliquer sur le composant excute la commande DoThis. Mme si lexcution de la premire commande est gnralement une bonne ide, vous pouvez modifier ce comportement par dfaut. Par exemple, vous pouvez dfinir un comportement diffrent si : vous najoutez aucune commande au menu contextuel ; vous souhaitez afficher une bote de dialogue qui combine plusieurs commandes lorsque lutilisateur double-clique sur le composant. Surchargez la mthode Edit pour spcifier un nouveau comportement lorsque lutilisateur double-clique sur le composant. Par exemple, la mthode Edit suivante appelle une bote de dialogue de fontes lorsque lutilisateur doubleclique sur le composant :
procedure TMyEditor.Edit; var FontDlg: TFontDialog; begin FontDlg := TFontDialog.Create(Application); try if FontDlg.Execute then MyComponent.FFont.Assign(FontDlg.Font); finally FontDlg.Free end; end; Remarque

Si vous souhaitez quun double-clic sur le composant affiche lditeur de code dun gestionnaire dvnement, utilisez TDefaultEditor comme classe de base pour votre diteur de composants au lieu de TComponentEditor. Puis, au lieu de surcharger la mthode Edit, surchargez la mthode protge TDefaultEditor.EditProperty. EditProperty recherche les gestionnaires dvnement

Accessibilit des composants au moment de la conception

47-19

Ajout dditeurs de composants

du composant et affiche le premier quil trouve. Vous pouvez modifier ce comportement pour visualiser un vnement particulier. Par exemple :
procedure TMyEditor.EditProperty(PropertyEditor: TPropertyEditor; Continue, FreeEditor: Boolean) begin if (PropertyEditor.ClassName = TMethodProperty) and (PropertyEditor.GetName = OnSpecialEvent) then // DefaultEditor.EditProperty(PropertyEditor, Continue, FreeEditor); end;

Ajout de formats de Presse-papiers


Par dfaut, lorsque lutilisateur choisit Copier lorsquun composant est slectionn dans lEDI, le composant est copi dans le format interne de Delphi. Il peut ensuite tre coll dans une autre fiche ou module de donnes. Votre composant peut copier dautres formats dans le Presse-papiers en surchargeant la mthode Copy. Par exemple, la mthode Copy suivante permet un composant TImage de copier son image dans le Presse-papiers. Cette image est ignore par lEDI de Delphi, mais peut tre colle dans dautres applications.
procedure TMyComponent.Copy; var MyFormat : Word; AData,APalette : THandle; begin TImage(Component).Picture.Bitmap.SaveToClipBoardFormat(MyFormat, AData, APalette); ClipBoard.SetAsHandle(MyFormat, AData); end;

Recensement dun diteur de composants


Une fois que lditeur de composants est dfini, il peut tre recens pour tre utilis avec une classe composant particulire. Un diteur de composants recens est cr pour chaque composant de cette classe lorsquil est slectionn dans le concepteur de fiche. Pour associer un diteur de composants une classe composant, appelez RegisterComponentEditor. RegisterComponentEditor adopte le nom de la classe composant qui utilise lditeur et le nom de la classe diteur de composants que vous avez dfinie. Par exemple, linstruction suivante recense une classe diteur de composants nomme TMyEditor en vue de son utilisation avec tous les composants de type TMyComponent :
RegisterComponentEditor(TMyComponent, TMyEditor);

Placez lappel RegisterComponentEditor dans la procdure Register o vous recensez votre composant. Par exemple, si un nouveau composant nomm TMyComponent et son diteur de composants TMyEditor sont tous les deux

47-20

Guide du dveloppeur

Compilation des composants en paquets

implments dans la mme unit, le code suivant recense le composant et son association lditeur de composants.
procedure Register; begin RegisterComponents(Miscellaneous, [TMyComponent); RegisterComponentEditor(classes[0], TMyEditor); end;

Compilation des composants en paquets


Une fois vos composants recenss, vous devez les compiler en paquets avant de les installer dans lEDI. Un paquet peut contenir un ou plusieurs composants ainsi que des diteurs de proprits personnaliss. Pour plus dinformations sur les paquets, voir chapitre 11, Utilisation des paquets et des composants. Pour crer et compiler un paquet, voir Cration et modification de paquets la page 11-7. Placez les units de code source de vos composants personnaliss dans la liste Contains du paquet. Si vos composants dpendent dautres paquets, incluez ces derniers dans la liste Requires. Pour installer vos composants dans lEDI, voir Installation de paquets de composants la page 11-6.

Accessibilit des composants au moment de la conception

47-21

47-22

Guide du dveloppeur

48
Chapitre 48

Chapitre

Modification dun composant existant

Le moyen le plus simple de crer un composant consiste le driver dun composant qui ralise la presque totalit des fonctions souhaites et lui apporter ensuite quelques modifications. Lexemple de ce chapitre modifie le composant mmo standard pour crer un mmo qui ne fait pas de saut de ligne par dfaut. La valeur de la proprit WordWrap du composant mmo est initialise True. Si vous utilisez frquemment des mmos neffectuant pas de saut de ligne, vous pouvez crer un nouveau composant mmo qui ne fait pas de saut de ligne par dfaut.
Remarque

Pour modifier les proprits publies ou enregistrer des gestionnaires dvnements spcifiques pour un composant existant, il est souvent plus simple dutiliser un modle de composant plutt que de crer une classe. La modification dun composant existant se fait en deux tapes : Cration et recensement du composant Modification de la classe composant

Cration et recensement du composant


La cration dun composant dbute toujours de la mme faon : vous crez une unit, puis drivez et recensez une classe composant avant de linstaller dans la palette des composants. Ce processus est dcrit dans Cration dun nouveau composant la page 40-9. Pour notre exemple, suivez la procdure gnrale de cration dun composant en tenant compte des spcificits suivantes : Nommez lunit du composant Memos.

Modification dun composant existant

48-1

Modification de la classe composant

Drivez un nouveau type de composant appel TWrapMemo, descendant de TMemo. Recensez TWrapMemo sur la page Exemples de la palette des composants. Le fichier en-tte que vous obtenez doit ressembler ceci :
unit Memos; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, StdCtrls; type TWrapMemo = class(TMemo) end; procedure Register; implementation procedure Register; begin RegisterComponents(Samples, [TWrapMemo]); end; end.

Si vous compilez et installez maintenant le nouveau composant, il se comportera exactement comme son anctre, TMemo. Dans la section suivante, vous effectuerez une simple modification votre composant.

Modification de la classe composant


Une fois la nouvelle classe composant cre, vous pouvez lui apporter presque toutes les modifications que vous voulez. Dans notre exemple, vous allez changer la valeur par dfaut dune proprit du composant mmo. Cela implique deux changements mineurs dans la classe composant : Surcharge du constructeur. Spcification de la nouvelle valeur par dfaut de la proprit. Le constructeur dfinit la valeur de la proprit. La valeur par dfaut indique Delphi quelles valeurs stocker dans le fichier fiche (.dfm pour la VCL et .xfm pour la CLX). Delphi ne stocke que les valeurs qui diffrent de la valeur par dfaut, cest pourquoi il est important deffectuer les deux tapes.

Surcharge du constructeur
Lorsque vous placez un composant dans une fiche au moment de la conception ou lorsquune application en cours dexcution construit un composant, le constructeur du composant dfinit les valeurs des proprits. Quand un composant est charg depuis un fichier fiche, lapplication dfinit toutes les proprits qui ont t modifies lors de la conception.

48-2

Guide du dveloppeur

Modification de la classe composant

Remarque

Lorsque vous surchargez un constructeur, le nouveau constructeur doit appeler le constructeur reu en hritage avant toute autre action. Pour plus dinformations, voir Surcharge des mthodes la page 41-9. Dans notre exemple, votre nouveau composant doit surcharger le constructeur transmis en hritage par TMemo en attribuant la valeur False la proprit WordWrap. Pour ce faire, ajoutez le constructeur surcharg la prdclaration, puis crivez le nouveau constructeur dans la partie implmentation de lunit :
type TWrapMemo = class(TMemo) public { les constructeurs sont toujours publics } constructor Create(AOwner: TComponent); override; { cette syntaxe est toujours // identique } end; constructor TWrapMemo.Create(AOwner: TComponent); { ceci va aprs limplmentation } begin inherited Create(AOwner); { Faites TOUJOURS ceci en premier ! } WordWrap := False; { dfinit la nouvelle valeur dsire } end;

Vous pouvez maintenant installer le nouveau composant sur la palette des composants et lajouter une fiche. Remarquez que la proprit WordWrap est dornavant initialise False. Si vous changez une valeur de proprit initiale, vous devez aussi dsigner cette valeur comme tant celle par dfaut. Si vous chouez faire correspondre la valeur dfinie par le constructeur celle spcifie par dfaut, Delphi ne peut pas stocker, ni restaurer la valeur correcte.

Spcification de la nouvelle valeur par dfaut de la proprit


Lorsque Delphi stocke la description dune fiche dans un fichier fiche, il ne stocke que les valeurs des proprits diffrentes des valeurs par dfaut. La taille du fichier fiche reste minime et le chargement est plus rapide. Si vous crez une proprit ou si vous changez la valeur par dfaut dune proprit existante, cest une bonne ide de mettre jour la dclaration de la proprit en y incluant la nouvelle valeur par dfaut. Les fichiers fiche ainsi que le chargement et les valeurs par dfaut sont expliqus en dtail dans le chapitre 47, Accessibilit des composants au moment de la conception. Pour changer la valeur par dfaut dune proprit, redclarez le nom de la proprit, suivi de la directive default et de la nouvelle valeur par dfaut. Il nest pas ncessaire de redclarer la proprit entire mais uniquement le nom et la valeur par dfaut. Pour le composant mmo de saut la ligne automatique, redclarez la proprit WordWrap dans la partie published de la dclaration dobjet, avec la valeur False par dfaut :
type TWrapMemo = class(TMemo)

Modification dun composant existant

48-3

Modification de la classe composant

published property WordWrap default False; end;

Spcifier la valeur par dfaut de la proprit naffecte en rien le fonctionnement du composant. Vous devez toujours initialiser la valeur dans le constructeur du composant. La redclaration de la valeur par dfaut assure que Delphi connat quand WordWrap doit tre crit dans le fichier fiche.

48-4

Guide du dveloppeur

49
Chapitre 49

Chapitre

Cration dun composant graphique

Un contrle graphique est un composant simple. Un contrle purement graphique ne reoit jamais la focalisation et na donc pas besoin de handle de fentre. Les utilisateurs peuvent quand mme manipuler le contrle avec la souris, mais il ny a pas dinterface clavier. TShape, le composant graphique prsent dans ce chapitre, correspond au composant forme inclus dans la page Supplment de la palette des composants. Bien que le composant que nous allons crer soit identique au composant forme standard, vous devrez lui donner un nom diffrent pour viter des doublons didentificateur. Ce chapitre appelle son composant forme TSampleShape et illustre toutes les tapes de sa cration : Cration et recensement du composant Publication des proprits hrites Ajout de fonctionnalits graphiques

Cration et recensement du composant


La cration dun composant dbute toujours de la mme faon. Vous crez une unit et vous recensez le composant avant de linstaller dans la palette des composants. Ce processus est dcrit dans Cration dun nouveau composant la page 40-9. Pour cet exemple, suivez la procdure gnrale de cration dun composant en tenant compte de ces spcifits : Appelez lunit du composant Shapes. Drivez un nouveau type de composant appel TSampleShape, descendant de TGraphicControl. Recensez TSampleShape sur la page Exemples de la palette des composants.

Cration dun composant graphique

49-1

Publication des proprits hrites

Lunit que vous obtenez doit ressembler ceci :


unit Shapes; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms; type TSampleShape = class(TGraphicControl) end; procedure Register; implementation procedure Register; begin RegisterComponent(Samples, [TSampleShape]); end; end.

Publication des proprits hrites


Lorsque vous drivez un type de composant, vous choisissez parmi les proprits et les vnements dclars dans la partie protected de la classe anctre ceux que vous voulez rendre disponibles aux utilisateurs du nouveau composant. TGraphicControl publie toutes les proprits qui permettent au composant de fonctionner en tant que contrle, donc les seules fonctionnalits que vous devez publier sont celles dont vous avez besoin pour rpondre aux vnements de souris et aux oprations glisser-dplacer. La publication des proprits et des vnements reus en hritage est explique dans Publication des proprits hrites la page 42-3 et Rendre visibles des vnements la page 43-6. Ces deux processus impliquent la redclaration du nom des proprits dans la partie published de la dclaration de classe. Sagissant de notre contrle forme, vous devez publier les trois vnements associs la souris ainsi que les deux proprits associes aux oprations glisser-dplacer :
type TSampleShape = class(TGraphicControl) published property DragCursor; { proprits glisser-dplacer } property DragMode; property OnDragDrop; { vnements glisser-dplacer } property OnDragOver; property OnEndDrag; property OnMouseDown; { vnements de souris } property OnMouseMove; property OnMouseUp; end;

Le contrle forme de notre exemple rend les interactions associes la souris et aux oprations glisser-dplacer accessibles lutilisateur.

49-2

Guide du dveloppeur

Ajout de fonctionnalits graphiques

Ajout de fonctionnalits graphiques


Lorsque votre composant graphique a t dclar et quont t publies toutes les proprits reues en hritage que vous voulez rendre disponibles, vous pouvez ajouter les fonctionnalits graphiques qui caractriseront votre composant :

1 Dtermination de ce qui doit tre dessin. 2 Dessin de limage du composant.


En outre, sagissant du contrle forme de notre exemple, vous allez ajouter certaines proprits qui serviront aux dveloppeurs dapplications pour personnaliser lapparence du contrle lors de la conception.

Dtermination de ce qui doit tre dessin


Un contrle graphique est capable de changer son apparence pour reflter un changement de condition, y compris une intervention de lutilisateur. Un contrle graphique qui aurait toujours le mme aspect ne devrait pas tre un composant. Si vous voulez une image statique, importez une image au lieu dutiliser un contrle. Gnralement, lapparence dun contrle graphique dpend de plusieurs proprits. Par exemple, le contrle jauge dispose de proprits qui dterminent sa forme et son orientation et si la reprsentation de la progression est numrique ou graphique. De mme, notre contrle forme doit disposer dune proprit qui dtermine le type de forme quil doit dessiner. Pour donner votre contrle une proprit qui dtermine la forme dessine, ajoutez une proprit intitule Shape. Ce processus se droule en trois tapes :

1 Dclaration du type de la proprit. 2 Dclaration de la proprit. 3 Ecriture de la mthode dimplmentation.


La cration de proprit est explique en dtail chapitre 42, Cration de proprits

Dclaration du type de la proprit


Lorsque vous dclarez une proprit dont le type est dfini par lutilisateur, le type de la proprit doit tre dclar avant la classe qui inclut cette proprit. Les types numrs sont frquemment employs par les proprits. Sagissant de notre contrle forme, vous aurez besoin dun type numr avec un lment dfini pour chaque forme que le contrle est en mesure de dessiner. Ajoutez la dfinition de type suivante avant la dclaration de classe du contrle forme.
type TSampleShapeType = (sstRectangle, sstSquare, sstRoundRect, sstRoundSquare, sstEllipse, sstCircle); TSampleShape = class(TGraphicControl) { existe dj }

Cration dun composant graphique

49-3

Ajout de fonctionnalits graphiques

Vous pouvez maintenant utiliser ce type pour dclarer une nouvelle proprit dans la classe.

Dclaration de la proprit
Gnralement, pour dclarer une proprit, vous dclarez un champ priv pour stocker les donnes de la proprit puis vous spcifiez les mthodes pour lire et/ ou crire sa valeur. Souvent, la mthode pour lire la valeur nest pas ncessaire car un simple pointage sur la valeur stocke suffit. Sagissant de notre contrle forme, vous aurez dclarer un champ contenant la forme courante, puis dclarer une proprit qui lit ce champ et lcrit via un appel de mthode. Ajoutez les dclarations suivantes dans TSampleShape :
type TSampleShape = class(TGraphicControl) private FShape: TSampleShapeType; { donne membre pour contenir la valeur de la proprit } procedure SetShape(Value: TSampleShapeType); published property Shape: TSampleShapeType read FShape write SetShape; end;

Il ne vous reste plus qu ajouter limplmentation de SetShape.

Ecriture de la mthode dimplmentation


Lorsque la partie read ou write dune dfinition de proprit utilise une mthode plutt quun accs direct aux donnes stockes de la proprit, vous devez implmenter ces mthodes. Ajoutez limplmentation de la mthode SetShape la partie implmentation de lunit :
procedure TSampleShape.SetShape(Value: TSampleShapeType); begin if FShape <> Value then { ignore sil ny a pas eu de changement } begin FShape := Value; { stocke la nouvelle valeur } Invalidate; { force le dessin avec la nouvelle forme } end; end;

Surcharge du constructeur et du destructeur


Pour changer les valeurs par dfaut des proprits et initialiser les classes appartenant votre composant, vous devez surcharger le constructeur et le destructeur reus en hritage. Dans les deux cas, noubliez pas dappeler la mthode reue en hritage.

49-4

Guide du dveloppeur

Ajout de fonctionnalits graphiques

Modification des valeurs par dfaut des proprits


La taille par dfaut dun contrle graphique tant rduite, vous pouvez modifier sa largeur et sa hauteur dans le constructeur. La modification des valeurs par dfaut des proprits est aborde plus en dtail chapitre 48, Modification dun composant existant. Dans notre exemple, le contrle forme dfinit sa taille par un carr de 65 pixels de ct. Ajoutez le constructeur surcharg dans la dclaration de la classe composant :
type TSampleShape = class(TGraphicControl) public constructor Create(AOwner: TComponent); override end;

{ constructeurs toujours publics } { surcharger la directive }

1 Redclarez les proprits Height et Width avec leurs nouvelles valeurs par dfaut :
type TSampleShape = class(TGraphicControl) published property Height default 65; property Width default 65; end;

2 Ecrivez le nouveau constructeur dans la partie implmentation de lunit :


constructor TSampleShape.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelle toujours le constructeur hrit } Width := 65; Height := 65; end;

Publication du crayon et du pinceau


Par dfaut, un canevas dispose dun crayon fin et noir et dun pinceau plein et blanc. Pour permettre aux dveloppeurs de changer le crayon et le pinceau, vous devez leur fournir des classes pour les manipuler lors de la conception, puis copier les classes dans le canevas lors des oprations de dessin. Des classes telles quun crayon ou un pinceau auxiliaire sont appeles classes ayant un propritaire car elles appartiennent au composant qui est responsable de leur cration et de leur destruction. La gestion des classes ayant un propritaire se droule en quatre tapes :

1 2 3 4

Dclaration des champs de la classe. Dclaration des proprits daccs. Initialisation des classes ayant un propritaire. Dfinition des proprits des classes ayant un propritaire.

Cration dun composant graphique

49-5

Ajout de fonctionnalits graphiques

Dclaration des champs de classe


Chaque classe appartenant un composant doit avoir un champ dclar dans ce composant. Le champ de classe garantit que le composant dispose toujours dun pointeur sur lobjet qui lui appartient afin de lui permettre de le dtruire avant de se dtruire lui-mme. Gnralement, un composant initialise les objets dont il est propritaire dans son constructeur et les dtruit dans son destructeur. Les champs de classe des objets ayant un propritaire sont presque toujours dclars private. Si des applications (ou dautres composants) ont besoin daccder aux objets ayant un propritaire, vous devez pour cela dclarer des proprits publies ou publiques. Ajoutez des champs de classe pour le crayon et le pinceau de votre contrle forme :
type TSampleShape = class(TGraphicControl) private { les donnes membres sont presque toujours prives } FPen: TPen; { donne membre pour lobjet crayon } FBrush: TBrush; { donne membre pour lobjet pinceau } end;

Dclaration des proprits daccs


Vous pouvez fournir les accs aux objets appartenant un composant en dclarant des proprits de mme type que ces objets. Cela offre aux dveloppeurs un moyen daccder aux objets lors de la conception ou de lexcution. Gnralement, la partie read de la proprit ne fait que rfrencer le champ de classe, alors que la partie write appelle une mthode qui permet au composant de ragir aux changements apports lobjet. Ajoutez des proprits votre contrle forme pour fournir les accs aux champs du crayon et du pinceau. Vous allez galement dclarer les mthodes pour ragir aux changements de crayon ou de pinceau.
type TSampleShape = class(TGraphicControl) private { ces mthodes doivent tre prives } procedure SetBrush(Value: TBrush); procedure SetPen(Value: TPen); published { les rend disponible lors de la conception } property Brush: TBrush read FBrush write SetBrush; property Pen: TPen read FPen write SetPen; end;

Vous devez ensuite crire les mthodes SetBrush et SetPen dans la partie implmentation de lunit :
procedure TSampleShape.SetBrush(Value: TBrush); begin FBrush.Assign(Value); { remplace le pinceau existant par le paramtre } end;

49-6

Guide du dveloppeur

Ajout de fonctionnalits graphiques

procedure TSampleShape.SetPen(Value: TPen); begin FPen.Assign(Value); { remplace le crayon existant par le paramtre } end;

Affecter directement le contenu de Value FBrush...


FBrush := Value;

...craserait le pointeur interne de FBrush, ferait perdre de la mmoire et crerait une srie de problmes de proprit.

Initialisation des classes ayant un propritaire


Si vous ajoutez des classes dans votre composant, le constructeur de ce dernier doit les initialiser pour que lutilisateur puisse interagir avec ces objets lors de lexcution. De mme, le destructeur du composant doit galement dtruire les objets appartenant au composant avant de dtruire ce dernier. Comme vous avez dclar un crayon et un pinceau dans le contrle forme, vous devez les initialiser dans le constructeur du contrle forme et les dtruire dans son destructeur :

1 Construisez le crayon et le pinceau dans le constructeur du contrle forme :


constructor TSampleShape.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelle toujours le contrle hrit } Width := 65; Height := 65; FPen := TPen.Create; { construit le crayon } FBrush := TBrush.Create; { construit le pinceau } end;

2 Ajoutez le destructeur surcharg dans la dclaration de la classe composant :


type TSampleShape = class(TGraphicControl) public { les destructeurs sont toujours publics} constructor Create(AOwner: TComponent); override; destructor Destroy; override; { ne pas oublier la surcharge de directive } end;

3 Ecrivez le nouveau destructeur dans la partie implmentation de lunit :


destructor TSampleShape.Destroy; begin FPen.Free; FBrush.Free; inherited Destroy; end;

{ dtruit lobjet crayon } { dtruit lobjet pinceau } { appelle aussi toujours le destructeur hrit }

Dfinition des proprits des classes ayant un propritaire


Lune des dernires tapes de la gestion des classes crayon et pinceau consiste provoquer un nouveau dessin du contrle forme si le crayon ou le pinceau est modifi. Comme les classes crayon et pinceau disposent toutes les deux dun

Cration dun composant graphique

49-7

Ajout de fonctionnalits graphiques

vnement OnChange, vous pouvez crer une mthode dans le contrle forme et faire pointer les deux vnements OnChange sur cette mthode. Ajoutez la mthode suivante au contrle forme et effectuez la mise jour du constructeur du composant pour affecter aux vnements du crayon et du pinceau cette nouvelle mthode :
type TSampleShape = class(TGraphicControl) published procedure StyleChanged(Sender: TObject); end; implementation constructor TSampleShape.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelez toujours Width := 65; Height := 65; FPen := TPen.Create; FPen.OnChange := StyleChanged; { affecte la mthode FBrush := TBrush.Create; FBrush.OnChange := StyleChanged; { affecte la mthode end;

le constructeur hrit }

{ construit le crayon lvnement OnChange { construit le pinceau lvnement OnChange

} } } }

procedure TSampleShape.StyleChanged(Sender: TObject); begin Invalidate; { efface et redessine le composant } end;

Ces modifications faites, le composant se redessine pour reflter tout changement du crayon ou du pinceau.

Dessin de limage du composant


Lessentiel dun contrle graphique se rsume sa faon de dessiner son image lcran. Le type abstrait TGraphicControl dfinit une mthode appele Paint que vous devez surcharger pour peindre limage voulue dans votre contrle. La mthode Paint de votre contrle forme doit accomplir plusieurs tches : Utiliser le crayon et le pinceau slectionns par lutilisateur. Utiliser la forme slectionne. Ajuster les coordonnes pour que les carrs et les cercles utilisent une largeur et une hauteur identiques. La surcharge de la mthode Paint ncessite deux tapes :

1 Ajout de Paint dans la dclaration du composant. 2 Insertion de la mthode Paint dans la partie implmentation de lunit.

49-8

Guide du dveloppeur

Ajout de fonctionnalits graphiques

Sagissant de notre contrle forme, vous devez ajouter la dclaration suivante la dclaration de classe :
type TSampleShape = class(TGraphicControl) protected procedure Paint; override; end;

Vous devez ensuite crire la mthode dans la partie implmentation de lunit :


procedure TSampleShape.Paint; begin with Canvas do begin Pen := FPen; { copie le crayon du composant } Brush := FBrush; { copie le pinceau du composant } case FShape of sstRectangle, sstSquare: Rectangle(0, 0, Width, Height); { dessine les rectangles et carrs } sstRoundRect, sstRoundSquare: RoundRect(0, 0, Width, Height, Width div 4, Height div 4); { dessine des formes // arrondies } sstCircle, sstEllipse: Ellipse(0, 0, Width, Height); { dessine des formes arrondies } end; end; end;

Paint est appele chaque fois que le contrle doit mettre jour son image. Les contrles sont dessins lorsquils saffichent pour la premire fois ou lorsquune fentre qui se trouvait au-dessus disparat. En outre, vous pouvez forcer le dessin en appelant Invalidate, comme le fait la mthode StyleChanged.

Adaptation du dessin de la forme


Le contrle forme standard effectue une tche supplmentaire que ne fait pas encore le contrle forme de notre exemple : il gre les carrs et les cercles ainsi que les rectangles et les ellipses. Pour ce faire, vous devez crire le code qui trouve le ct le plus petit et centre limage. Voici une mthode Paint parfaitement adapte aux carrs et aux ellipses :
procedure TSampleShape.Paint; var X, Y, W, H, S: Integer; begin with Canvas do begin Pen := FPen; Brush := FBrush; W := Width; H := Height;

{ copie le crayon { copie le pinceau { utilise la largeur { utilise la hauteur

du du du du

composant composant composant composant

} } } }

Cration dun composant graphique

49-9

Ajout de fonctionnalits graphiques

if W < H then S := W else S := H; { enregistre du plus petit pour les cercles/carrs } case FShape of { ajuste la hauteur, la largeur et la position sstRectangle, sstRoundRect, sstEllipse: begin X := 0; { lorigine est langle suprieur gauche de ces formes Y := 0; end; sstSquare, sstRoundSquare, sstCircle: begin X := (W - S) div 2; { centre horizontalement... Y := (H - S) div 2; { ...puis verticalement W := S; { utilise la dimension la plus petite pour la largeur... H := S; { ...et pour la hauteur end; end; }

} } } }

case FShape of sstRectangle, sstSquare: Rectangle(X, Y, X + W, Y + H); { dessine les rectangles et les carrs } sstRoundRect, sstRoundSquare: RoundRect(X, Y, X + W, Y + H, S div 4, S div 4); { dessine des formes arrondies } sstCircle, sstEllipse: Ellipse(X, Y, X + W, Y + H); { dessine les formes arrondies } end; end; end;

49-10

Guide du dveloppeur

50
Chapitre 50

Chapitre

Personnalisation dune grille

Delphi fournit plusieurs composants abstraits que vous pouvez utiliser comme points de dpart pour personnaliser vos composants. Les grilles et les botes liste sont les plus importants. Dans ce chapitre, nous allons voir comment crer un petit calendrier en partant du composant grille de base TCustomGrid. La cration du calendrier ncessite les tapes suivantes : Cration et recensement du composant Publication des proprits hrites Modification des valeurs initiales Redimensionnement des cellules Remplissage des cellules Navigation de mois en mois et danne en anne Navigation de jour en jour

Le composant calendrier rsultant est pratiquement identique au composant TCalendar contenu dans la page Exemples de la palette des composants.

Cration et recensement du composant


La cration dun composant dbute toujours de la mme faon. Vous crez une unit et vous recensez le composant avant de linstaller dans la palette des composants. Ce processus est dcrit dans Cration dun nouveau composant la page 40-9. Dans cet exemple, suivez la procdure gnrale de cration dun composant, avec les spcificits suivantes : Appelez lunit du composant CalSamp. Drivez un nouveau type de composant appel TSampleCalendar, descendant de TCustomGrid.

Personnalisation dune grille

50-1

Publication des proprits hrites

Recensez TSampleCalendar dans la page Exemples de la palette des composants. Lunit rsultante drivant de TCustomGrid dans la VCL devrait ressembler ceci :
unit CalSamp; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TSampleCalendar = class(TCustomGrid) end; procedure Register; implementation procedure Register; begin RegisterComponents(Samples, [TSampleCalendar]); end; end.

Si la drivation seffectue partir de la version CLX de TCustomGrid, seule la clause uses est diffrente, elle prsente alors les units CLX. Si vous installez le composant calendrier maintenant, vous verrez quil apparat sur la page Exemples. Les seules proprits disponibles sont les proprits de contrle les plus basiques. Ltape suivante consiste rendre disponible certaines des proprits plus spcialises aux utilisateurs du calendrier.
Remarque

Bien que vous puissiez installer le composant calendrier exemple que vous venez de compiler, nessayez pas de le placer tout de suite sur une fiche. Le composant TCustomGrid contient une mthode DrawCell abstraite qui doit tre redclare avant que les objets dinstance puissent tre crs. La surcharge de la mthode DrawCell est dcrite dans Remplissage des cellules.

Publication des proprits hrites


Le composant grille abstrait, TCustomGrid, fournit de nombreuses proprits protected. Vous pouvez choisir parmi ces proprits celles que vous voulez rendre accessibles aux utilisateurs du contrle calendrier. Pour rendre accessibles aux utilisateurs de vos composants les proprits protges quils reoivent en hritage, vous devez redclarer ces proprits dans la partie published de la dclaration de vos composants. Sagissant du contrle calendrier, vous devez publier les proprits et les vnements, comme ci-dessous :
type TSampleCalendar = class(TCustomGrid)

50-2

Guide du dveloppeur

Modification des valeurs initiales

published property property property property property property property property property property property property property property property end;

Align; { proprits publies } BorderStyle; Color; Font; GridLineWidth; ParentColor; ParentFont; OnClick; { vnements publis } OnDblClick; OnDragDrop; OnDragOver; OnEndDrag; OnKeyDown; OnKeyPress; OnKeyUp;

Il existe bien dautres proprits ne sappliquant pas un calendrier qui sont publiables, par exemple la proprit Options qui permet lutilisateur de choisir les lignes de la grille dessiner. Si vous installez le composant calendrier modifi dans la palette des composants et lutilisez dans une application, vous trouverez bien dautres proprits et vnements oprationnels. Nous allons maintenant commencer ajouter de nouvelles fonctionnalits au composant.

Modification des valeurs initiales


Un calendrier est essentiellement une grille avec un nombre fixe de lignes et de colonnes, ne contenant pas ncessairement des dates. Les proprits ColCount et RowCount de la grille nont donc pas t publies, car il est peu probable que les utilisateurs du calendrier voudront afficher autre chose que les sept jours de la semaine. Vous devez nanmoins dfinir les valeurs initiales de ces proprits en fonction des sept jours de la semaine. Pour changer les valeurs initiales des proprits du composant, vous devez surcharger le constructeur afin quil affecte les valeurs voulues. Le constructeur doit tre virtuel. Souvenez-vous que vous devez ajouter le constructeur la partie public de la dclaration de la classe du composant, puis crire le nouveau constructeur dans la partie implmentation de lunit du composant. La premire instruction du nouveau constructeur doit toujours tre un appel au constructeur hrit.
type TSampleCalendar = class(TCustomGrid public constructor Create(AOwner: TComponent); override; end; constructor TSampleCalendar.Create(AOwner: TComponent);

Personnalisation dune grille

50-3

Redimensionnement des cellules

begin inherited Create(AOwner); { appelle le constructeur hrit } ColCount := 7; { toujours 7 jours/semaine } RowCount := 7; { toujours 6 semaines plus les titres } FixedCols := 0; { aucun libell de ligne } FixedRows := 1; { une ligne pour les noms de jour } ScrollBars := ssNone; { pas de dfilement ncessaire } Options := Options - [goRangeSelect] + [goDrawFocusSelected]; {dsactive la slection // dintervalle } end;

Le calendrier a dornavant sept colonnes et sept lignes, avec la ligne de titre fixe (ou qui ne dfile pas).

Redimensionnement des cellules


VCL

Lorsquun utilisateur ou une application modifie la taille dune fentre ou dun contrle, Windows envoie le message WM_SIZE la fentre ou au contrle concern pour lui permettre dajuster les paramtres ncessaires afin de dessiner ultrieurement son image dans la nouvelle taille. Votre composant VCL peut rpondre ce message en modifiant la taille des cellules de faon ce quelles sinscrivent dans les limites du contrle. Pour rpondre au message WM_SIZE, vous devez ajouter au composant une mthode de gestion du message. La cration dune mthode de gestion de message est dcrite en dtail dans Cration de nouveaux gestionnaires de messages la page 46-5. Dans notre exemple, le contrle calendrier devant rpondre au message WM_SIZE, vous devez ajouter au contrle une mthode protge appele WMSize et indexe par le message WM_SIZE, puis crire la mthode de calcul de la taille des cellules qui permettra toutes dtre visibles :
type TSampleCalendar = class(TCustomGrid) protected procedure WMSize(var Message: TWMSize); message WM_SIZE; end; procedure TSampleCalendar.WMSize(var Message: TWMSize); var GridLines: Integer; { variable locale temporaire } begin GridLines := 6 * GridLineWidth; { calcule de taille combine de toutes les lignes } DefaultColWidth := (Message.Width - GridLines) div 7; { dfinit la nouvelle largeur // de cellule par dfaut } DefaultRowHeight := (Message.Height - GridLines) div 7; { ainsi que sa hauteur } end;

Maintenant lorsque le calendrier est redimensionn, il affiche toutes les cellules dans la taille maximum avec laquelle ils peuvent rentrer dans le contrle.

50-4

Guide du dveloppeur

Remplissage des cellules

CLX

Dans la CLX, les changements de taille dune fentre ou dun contrle sont notifis automatiquement par un appel la mthode protge BoundsChanged. Votre composant CLX peut rpondre cette notification en modifiant la taille des cellules afin qu elles tiennent toutes dans les limites du contrle. Dans ce cas, le contrle calendrier doit redfinir BoundsChanged afin qu elle calcule la taille de cellule adquate pour que toutes les cellules soient visibles avec la nouvelle taille :
type TSampleCalendar = class(TCustomGrid) protected procedure BoundsChanged; override; end; procedure TSampleCalendar.BoundsChanged; var GridLines: Integer; begin GridLines := 6 * GridLineWidth; { calcul de la taille DefaultColWidth := (Width - GridLines) div 7; { nouvelle DefaultRowHeight := (Height - GridLines) div 7;{ nouvelle inherited; { appelle la mthode hrite } end;

{ variable locale temporaire } combine de toutes les lignes } largeur de cellule par dfaut } hauteur de cellule par dfaut }

Remplissage des cellules


Un contrle grille se remplit cellule par cellule. Sagissant du calendrier, cela revient calculer une date (si elle existe) pour chaque cellule. Le dessin par dfaut des cellules de la grille sopre dans une mthode virtuelle intitule DrawCell. Pour remplir le contenu des cellules de la grille, vous devez surcharger la mthode DrawCell. Les cellules de titre de la ligne fixe sont ce quil y a de plus facile remplir. La bibliothque dexcution contient un tableau avec lintitul raccourci des jours et il vous faut donc insrer lintitul appropri chaque colonne :
type TSampleCalendar = class(TCustomGrid) protected procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override; end; procedure TSampleCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); begin if ARow = 0 then Canvas.TextOut(ARect.Left, ARect.Top, ShortDayNames[ACol + 1]); { utilise les chanes RTL } end;

Personnalisation dune grille

50-5

Remplissage des cellules

Suivi de la date
Pour que le contrle calendrier soit utile, les utilisateurs ainsi que les applications doivent disposer dun moyen de dfinir la date, le mois et lanne. Delphi stocke les dates et les heures dans des variables de type TDateTime. TDateTime est une reprsentation numrique encode des dates et des heures particulirement pratique pour tre manipule par un programme mais peu commode interprter par un utilisateur. Vous pouvez donc stocker la date du calendrier sous une forme encode et fournir un accs direct cette valeur lors de lexcution, mais vous pouvez aussi fournir les proprits Day, Month et Year que lutilisateur du composant peut dfinir lors de la conception. Le suivi de la date dans le calendrier comprend les traitements suivants : Stockage interne de la date Accs au jour, au mois et lanne Gnration des numros de jours Slection du jour en cours

Stockage interne de la date


Pour stocker la date du calendrier, vous devez avoir un champ contenant la date, ainsi quune proprit accessible lexcution seulement qui fournit un accs cette date. Lajout de la date interne au calendrier requiert trois tapes :

1 Dclarez une donne membre prive pour contenir la date :


type TSampleCalendar = class(TCustomGrid) private FDate: TDateTime;

2 Initialisez la donne membre date dans le constructeur :


constructor TSampleCalendar.Create(AOwner: TComponent); begin inherited Create(AOwner); { dj ici } { dautres initialisations ici } FDate := Date; { prend la date active du RTL } end;

3 Dclarez une proprit lexcution pour accder la date encode :


Vous aurez besoin dune mthode pour dfinir la date car sa dfinition entrane la mise jour de limage sur lcran du contrle :
type TSampleCalendar = class(TCustomGrid) private procedure SetCalendarDate(Value: TDateTime); public

50-6

Guide du dveloppeur

Remplissage des cellules

property CalendarDate: TDateTime read FDate write SetCalendarDate; procedure TSampleCalendar.SetCalendarDate(Value: TDateTime); begin FDate := Value; { dfinit la nouvelle valeur date } Refresh; { met jour limage lcran } end;

Accs au jour, au mois et lanne


Une date encode numriquement est adapte aux applications, mais lutilisateur prfrera manipuler jour, mois et anne. En crant des proprits, vous offrez un accs aux dates stockes et encodes numriquement. Les lments dune date (jour, mois, anne) sont des entiers. La modification de chacun dentre eux ncessite lencodage de la date. Vous pouvez viter la duplication du code en partageant les mthodes dimplmentation entre les trois proprits. Autrement dit, vous pouvez crire deux mthodes, lune pour lire un lment et lautre pour lcrire, et utiliser ces mthodes pour lire et crire les trois proprits. Pour fournir un accs lors de la conception aux lments jour, mois et anne, procdez de la faon suivante :

1 Dclarez les trois proprits, en attribuant chacune un numro unique dindex :


type TSampleCalendar = class(TCustomGrid) public property Day: Integer index 3 read GetDateElement write SetDateElement; property Month: Integer index 2 read GetDateElement write SetDateElement; property Year: Integer index 1 read GetDateElement write SetDateElement;

2 Dclarez et crivez les mthodes dimplmentation, dfinissant les diffrents lments pour chaque valeur dindex :
type TSampleCalendar = class(TCustomGrid) private function GetDateElement(Index: Integer): Integer; { notez le paramtre Index } procedure SetDateElement(Index: Integer; Value: Integer); function TSampleCalendar.GetDateElement(Index: Integer): Integer; var AYear, AMonth, ADay: Word; begin DecodeDate(FDate, AYear, AMonth, ADay); { clate la date encode en lments } case Index of 1: Result := AYear; 2: Result := AMonth; 3: Result := ADay; else Result := -1; end; end;

Personnalisation dune grille

50-7

Remplissage des cellules

procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); var AYear, AMonth, ADay: Word; begin if Value > 0 then { tous les lments doivent tre positifs begin DecodeDate(FDate, AYear, AMonth, ADay);{ rcupre les lments courants de la date case Index of { dfinit le nouvel lment selon lindex 1: AYear := Value; 2: AMonth := Value; 3: ADay := Value; else Exit; end; FDate := EncodeDate(AYear, AMonth, ADay); { encodage de la date modifie Refresh; { mise jour du calendrier visible end; end;

} } }

} }

Vous pouvez maintenant dfinir le jour, le mois et lanne du calendrier lors de la conception partir de linspecteur dobjets, ou lexcution partir du code. Bien que vous nayez pas encore ajout le code pour dessiner les dates dans les cellules, vous disposez maintenant de toutes les donnes ncessaires.

Gnration des numros de jours


Insrer les numros des jours dans le calendrier ncessite plusieurs considrations. Le nombre de jours dans le mois dpend la fois du mois et de lanne. Le jour de la semaine qui dbute le mois dpend aussi du mois et de lanne. Utilisez la fonction IsLeapYear pour dterminer si lanne est bissextile. Utilisez le tableau MonthDays dans lunit SysUtils pour obtenir le nombre de jours dans le mois. Une fois rcupres les informations concernant les annes bissextiles et le nombre de jours par mois, vous pouvez calculer lendroit de la grille o sinsre chaque date. Le calcul dpend du premier jour du mois. Comme vous devez considrer le dcalage du premier jour du mois, par rapport lorigine de la grille, pour chaque cellule remplir, le meilleur choix consiste calculer ce nombre aprs chaque changement de mois ou danne, et de sy reporter chaque fois. Vous pouvez stocker cette valeur dans un champ de classe, puis mettre jour ce champ chaque modification de la date. Pour remplir les cellules avec les numros de jour appropris, procdez de la faon suivante :

1 Ajoutez la classe une donne membre dcalage du premier jour du mois, ainsi quune mthode pour mettre jour la valeur de cette donne membre :
type TSampleCalendar = class(TCustomGrid) private FMonthOffset: Integer; protected procedure UpdateCalendar; virtual; end;

{ stocke le dcalage }

{ proprit pour laccs au dcalage }

50-8

Guide du dveloppeur

Remplissage des cellules

procedure TSampleCalendar.UpdateCalendar; var AYear, AMonth, ADay: Word; FirstDate: TDateTime; { date du premier jour du mois begin if FDate <> 0 then { ne calcule le dcalage que si la date est valide begin DecodeDate(FDate, AYear, AMonth, ADay); { rcupre les lments de la date FirstDate := EncodeDate(AYear, AMonth, 1); { date du premier jour du mois FMonthOffset := 2 - DayOfWeek(FirstDate); { gnre le dcalage dans la grille end; Refresh; { toujours repeindre le contrle end;

} } } } } }

2 Ajoutez les instructions au constructeur et aux mthodes SetCalendarDate et SetDateElement qui appellent la nouvelle mthode de mise jour chaque changement de date :
constructor TSampleCalendar.Create(AOwner: TComponent); begin inherited Create(AOwner); { existait dj } { dautres initialisations ici } UpdateCalendar; { dfinit le bon dcalage } end; procedure TSampleCalendar.SetCalendarDate(Value: TDateTime); begin FDate := Value; { existait dj } UpdateCalendar; { appelait prcdemment Refresh } end; procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); begin FDate := EncodeDate(AYear, AMonth, ADay); { encode la date modifie } UpdateCalendar; { appelait prcdemment Refresh } end; end;

3 Ajoutez une mthode au calendrier renvoyant le numro du jour partir des coordonnes ligne/colonne dune cellule qui lui sont transmises :
function TSampleCalendar.DayNum(ACol, ARow: Integer): Integer; begin Result := FMonthOffset + ACol + (ARow - 1) * 7; { calcule le jour pour cette cellule} if (Result < 1) or (Result > MonthDays[IsLeapYear(Year), Month]) then Result := -1; { renvoie -1 si incorrect } end;

Noubliez pas dajouter la dclaration de DayNum la dclaration de type du composant.

4 Vous pouvez dsormais calculer lendroit o saffichent les dates, et mettre jour DrawCell pour remplir les cellules :
procedure TCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); var

Personnalisation dune grille

50-9

Navigation de mois en mois et danne en anne

TheText: string; TempDay: Integer; begin if ARow = 0 then { sil sagit de la ligne de titre ...} TheText := ShortDayNames[ACol + 1] { utilise le nom du jour } else begin TheText := ; { cellule vide par dfaut } TempDay := DayNum(ACol, ARow); { rcupre le numro pour cette cellule } if TempDay <> -1 then TheText := IntToStr(TempDay); { utilise ce numro sil est // valide } end; with ARect, Canvas do TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2, Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText); end;

Si maintenant vous rinstallez le composant calendrier et le placez dans une fiche, les informations correspondant au mois en cours apparatront.

Slection du jour en cours


Maintenant que les numros des jours saffichent dans les cellules du calendrier, il devient intressant de savoir positionner la surbrillance sur le jour en cours. Comme la slection se positionne implicitement sur la cellule situe en haut et gauche, vous devez dfinir les proprits Row et Column au moment de la construction initiale du calendrier ainsi qu chaque changement de date. Pour positionner la slection dans la cellule du jour en cours, modifiez la mthode UpdateCalendar pour dfinir Row et Column avant dappeler Refresh :
procedure TSampleCalendar.UpdateCalendar; begin if FDate <> 0 then begin { existing statements to set FMonthOffset } Row := (ADay - FMonthOffset) div 7 + 1; Col := (ADay - FMonthOffset) mod 7; end; Refresh; { dj ici } end;

Notez que vous rutilisez la variable ADay prcdemment dfinie lors du dcodage de la date.

Navigation de mois en mois et danne en anne


Les proprits sont particulirement utiles pour manipuler les composants, en particulier lors de la conception. Mais lorsque des manipulations frquentes ou instinctives font intervenir plusieurs proprits, il parat judicieux de fournir des mthodes pour les grer. Le passage au mois suivant dans notre calendrier est un exemple de ce type. Le bouclage sur les douze mois avec lincrmentation de lanne est la fois une caractristique simple et commode pour le programmeur qui utilise le composant.

50-10

Guide du dveloppeur

Navigation de jour en jour

Le seul inconvnient lencapsulation des manipulations les plus frquentes sous la forme de mthodes est le suivant : les mthodes ne sont accessibles qu lexcution. Nanmoins, de telles manipulations ne sont fastidieuses que lorsquelles sont souvent rptes, ce qui est rarement le cas au moment de la conception. Sagissant du calendrier, ajoutez les quatre mthodes suivantes pour grer le passage de mois en mois et danne en anne. Chacune de ces mthodes utilise la fonction IncMonth de faon lgrement diffrente pour incrmenter ou dcrmenter CalendarDate de mois en mois ou danne en anne. Aprs avoir incrment ou dcrment CalendarDate, dcodez la valeur de la date pour remplir les proprits Year, Month et Day avec les nouvelles valeurs correspondantes .
procedure TCalendar.NextMonth; begin DecodeDate(IncMonth(CalendarDate, 1), Year, Month, Day); end; procedure TCalendar.PrevMonth; begin DecodeDate(IncMonth(CalendarDate, -1), Year, Month, Day); end; procedure TCalendar.NextYear; begin DecodeDate(IncMonth(CalendarDate, 12), Year, Month, Day); end; procedure TCalendar.PrevYear; begin DecodeDate(CalendarDate, -12), Year, Month, Day); end;

Noubliez pas dajouter les dclarations des nouvelles mthodes la dclaration de la classe. Dsormais, si vous crez une application qui utilise le composant calendrier, vous pourrez facilement implmenter le passage de mois en mois ou danne en anne.

Navigation de jour en jour


A lintrieur dun mme mois, il existe deux moyens vidents pour naviguer parmi les jours. Le premier consiste utiliser les touches de direction et le deuxime rpondre aux clics de la souris. Le composant grille standard les gre tous les deux indistinctement en tant que clics de souris. Autrement dit, le dplacement avec les touches de direction est pris en compte comme un clic sur une cellule adjacente. Le processus de navigation de jour en jour comprend : Dplacement de la slection Fourniture dun vnement OnChange Exclusion des cellules vides

Personnalisation dune grille

50-11

Navigation de jour en jour

Dplacement de la slection
Le comportement reu en hritage dune grille gre le dplacement de la slection en rponse aux touches de direction enfonces ou aux clics de souris. Pour modifier le jour slectionn, vous devez modifier le comportement implicite. Pour grer les dplacements lintrieur du calendrier, vous devez surcharger la mthode Click de la grille. Lorsque vous surchargez une mthode telle que Click, en dpendance troite avec les interactions de lutilisateur, vous devez pratiquement toujours inclure un appel la mthode reue en hritage pour ne pas perdre le comportement standard. Le code suivant est une mthode Click surcharge pour la grille calendrier. Noubliez pas dajouter la dclaration de Click TSampleCalendar, en incluant aprs la directive override.
procedure TSampleCalendar.Click; var TempDay: Integer; begin inherited Click; { noubliez pas dappeler la mthode hrite ! } TempDay := DayNum(Col, Row); { rcupre le numro du jour de la cellule clique } if TempDay <> -1 then Day := TempDay; { change le jour sil est valide } end;

Fourniture dun vnement OnChange


Les utilisateurs de votre calendrier ont maintenant la possibilit de changer la date. Il parat donc judicieux de rpondre ces changements. Ajoutez un vnement OnChange TSampleCalendar.

1 Dclarez lvnement ainsi quun champ pour le stocker et une mthode virtuelle pour lappeler :
type TSampleCalendar = class(TCustomGrid) private FOnChange: TNotifyEvent; protected procedure Change; dynamic; published property OnChange: TNotifyEvent read FOnChange write FOnChange;

2 Ecrivez la mthode Change :


procedure TSampleCalendar.Change; begin if Assigned(FOnChange) then FOnChange(Self); end;

50-12

Guide du dveloppeur

Navigation de jour en jour

3 Ajoutez les instructions appelant Change la fin des mthodes SetCalendarDate et SetDateElement :
procedure TSampleCalendar.SetCalendarDate(Value: TDateTime); begin FDate := Value; UpdateCalendar; Change; { seule nouvelle instruction } end; procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); begin { instructions dfinissant les valeurs des lments } FDate := EncodeDate(AYear, AMonth, ADay); UpdateCalendar; Change; { ceci est nouveau } end; end;

Les applications qui utilisent le composant calendrier peuvent maintenant rpondre aux changements en associant des gestionnaires lvnement OnChange.

Exclusion des cellules vides


Tel quil est actuellement, le calendrier dplace la slection vers une cellule vide sans changer la date. Il devient intressant dempcher la slection des cellules vides. Pour dterminer si une cellule est slectionnable, vous devez surcharger la mthode SelectCell de la grille. SelectCell est une fonction qui accepte deux paramtres ligne et colonne et qui renvoie une valeur boolenne indiquant si la cellule spcifie est slectionnable. Vous pouvez surcharger SelectCell pour quelle renvoie False si la cellule ne contient pas une date valide :
function TSampleCalendar.SelectCell(ACol, ARow: Longint): Boolean; begin if DayNum(ACol, ARow) = -1 then Result := False { -1 indique une date incorrecte } else Result := inherited SelectCell(ACol, ARow); { sinon, utilise la valeur hrite } end;

Dsormais, si lutilisateur clique sur une cellule vide ou tente de sy dplacer laide des touches de direction, le calendrier ne modifie pas la slection en cours.

Personnalisation dune grille

50-13

50-14

Guide du dveloppeur

51
Chapitre 51

Chapitre

Contrles orients donnes

Lorsque vous souhaitez vous connecter avec des bases de donnes, travaillez avec les contrles orients donnes. Cest grce ces contrles que lapplication tablit un lien avec une partie spcifique dune base de donnes. Parmi les contrles sensibles aux donnes de Delphi, citons les libells, les botes de saisie, les botes liste, les botes options, les contrles de rfrence et les grilles. Vous avez galement la possibilit de construire vos propres contrles orients donnes. Pour plus dinformations sur lutilisation des contrles orients donnes, voir chapitre 15, Utilisation de contrles de donnes. Il existe diffrents niveaux dorientation donnes. Le plus lmentaire fonctionne en lecture seulement, permet de scruter des donnes et reflte ltat dune base de donnes. Lorientation donnes modifiables, permettant de modifier les donnes, est plus complexe car lutilisateur peut changer les valeurs stockes dans la base en manipulant le contrle. Notez galement que le degr dimplication de la base de donnes peut varier du cas le plus simple, un lien tabli avec un seul champ, aux cas plus complexes faisant intervenir des contrles enregistrements multiples. Ce chapitre illustre dabord le cas le plus simple, en crant un contrle en lecture simple qui est li un seul champ dun ensemble de donnes. Le contrle spcifique utilis sera le calendrier TSampleCalendar cr dans le chapitre 50, Personnalisation dune grille. Vous pouvez aussi utiliser le contrle calendrier standard de la page Exemples de la palette des composants, TCalendar. Ce chapitre continue ensuite avec une explication sur la manire de faire dun nouveau contrle pour scruter les donnes un contrle de modification des donnes.

Contrles orients donnes

51-1

Cration dun contrle pour scruter les donnes

Cration dun contrle pour scruter les donnes


La cration dun contrle calendrier orient donnes, que ce soit un contrle en lecture seulement ou un contrle grce auquel lutilisateur peut changer les donnes sous-jacentes, fait intervenir les tapes suivantes : Cration et recensement du composant Ajout du lien aux donnes Rponse aux changements de donnes

Cration et recensement du composant


La cration dun composant dbute toujours de la mme faon. Vous crez une unit et vous recensez le composant avant de linstaller dans la palette des composants. Ce processus est dcrit dans Cration dun nouveau composant la page 40-9. Pour notre exemple, suivez la procdure gnrale de cration dun composant en tenant compte des spcificits suivantes : Appelez lunit du composant DBCal. Drivez une nouvelle classe composant appele TDBCalendar, drive du composant VCL TSampleCalendar. Le chapitre 50, Personnalisation dune grille , montre comment crer le composant TSampleCalendar. Recensez TDBCalendar dans la page Exemples de la palette des composants. Lunit que vous obtenez doit ressembler ceci :
unit DBCal; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Grids, Calendar; type TDBCalendar = class(TSampleCalendar) end; procedure Register; implementation procedure Register; begin RegisterComponents(Samples, [TDBCalendar]); end; end.

Vous pouvez prsent commencer transformer le nouveau calendrier en scruteur de donnes.

51-2

Guide du dveloppeur

Cration dun contrle pour scruter les donnes

Fonctionnement du contrle en lecture seulement


Puisque votre calendrier scruteur de donnes ne fonctionnera quen lecture (par rapport aux donnes), il est opportun de rendre le contrle lui-mme accessible en lecture seulement. Ainsi, lutilisateur ne sattendra pas voir rpercuter dans la base de donnes une modification quil aurait apport au contrle. Rendre le calendrier accessible en lecture seulement fait intervenir deux tapes : Ajout de la proprit ReadOnly. Autorisation des mises jour ncessaires. Si vous dmarrez avec le composant TCalendar de la page Exemples de Delphi au lieu de TSampleCalendar, le contrle a dj une proprit ReadOnly. Vous pouvez donc ignorer ces tapes.

Ajout de la proprit ReadOnly


En ajoutant une proprit ReadOnly, vous fournissez le moyen de rendre le contrle accessible en lecture seulement au moment de la conception. Si la valeur de cette proprit est True, toutes les cellules du contrle perdront la capacit tre slectionnes.

1 Ajoutez la dclaration de la proprit ainsi quune donne membre private pour contenir la valeur :
type TDBCalendar = class(TSampleCalendar) private FReadOnly: Boolean; public constructor Create(AOwner: TComponent); override;

{ champ de stockage interne } { doit surcharger pour dfinir // les valeurs par dfaut }

published property ReadOnly: Boolean read FReadOnly write FReadOnly default True; end; constructor TDBCalendar.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelez toujours le constructeur hrit ! } FReadOnly := True; { dfinit la valeur par dfaut } end;

2 Surchargez la mthode SelectCell pour inhiber la slection si le contrle est accessible en lecture seulement. Lutilisation de SelectCell est explique dans Exclusion des cellules vides la page 50-13.
function TDBCalendar.SelectCell(ACol, ARow: Longint): Boolean; begin if FReadOnly then Result := False { slection impossible si accs en // lecture seule } else Result := inherited SelectCell(ACol, ARow); { sinon, utilise la mthode hrite } end;

Contrles orients donnes

51-3

Cration dun contrle pour scruter les donnes

Noubliez pas dajouter la dclaration de SelectCell la dclaration de la classe de TDBCalendar, et ajoutez la directive override. Si vous ajoutez maintenant le calendrier une fiche, vous vous rendez compte que le composant ignore les clics de souris et les frappes de touches. Et il ne met plus jour la position de la slection lorsque vous changez la date.

Autorisation des mises jour ncessaires


Le calendrier accessible en lecture seulement utilise la mthode SelectCell pour effectuer toutes sortes de modifications, y compris laffectation de valeurs aux proprits Row et Col. La mthode UpdateCalendar dfinit Row et Col chaque changement de date mais, dans la mesure o SelectCell nautorise aucune modification, la position de la slection reste inchange, mme si la date est modifie. Pour outrepasser cette interdiction de toute modification, vous devez ajouter au calendrier un indicateur boolen interne et nautoriser les modifications que si la valeur de cet indicateur est true :
type TDBCalendar = class(TSampleCalendar) private FUpdating: Boolean; { indicateur priv usage interne } protected function SelectCell(ACol, ARow: Longint): Boolean; override; public procedure UpdateCalendar; override; { notez la directive override } end; function TDBCalendar.SelectCell(ACol, ARow: Longint): Boolean; begin if (not FUpdating) and FReadOnly then Result := False { slection possible si mise // jour } else Result := inherited SelectCell(ACol, ARow); { sinon, utilise la mthode hrite } end; procedure TDBCalendar.UpdateCalendar; begin FUpdating := True; { dfinit lindicateur pour permettre les mises jour } try inherited UpdateCalendar; { mise jour habituelle } finally FUpdating := False; { rinitialise toujours lindicateur } end; end;

Le calendrier nautorise toujours pas les modifications directes de lutilisateur mais les modifications de la date effectues via les proprits de date sont prises en compte. Vous disposez maintenant dun contrle en lecture seulement tout fait oprationnel. Vous voil prt ajouter les fonctionnalits servant scruter les donnes.

51-4

Guide du dveloppeur

Cration dun contrle pour scruter les donnes

Ajout du lien aux donnes


La connexion entre un contrle et une base de donnes est gre par une classe appele lien de donnes. La classe lien de donnes, qui connecte un contrle un seul champ dune base de donnes, est TFieldDataLink (VCL ou CLX). Il existe galement des liens de donnes vers des tables entires. Un contrle orient donnes est propritaire de sa classe lien de donnes. Autrement dit, le contrle est responsable de la construction et de la destruction du lien de donnes. Pour des dtails sur la gestion des classes ayant un propritaire, voir chapitre 49, Cration dun composant graphique. Pour tablir un lien de donnes en tant que classe ayant un propritaire, respectez ces tapes :

1 Dclaration du champ de classe de la classe 2 Dclaration des proprits daccs 3 Initialisation du lien de donnes

Dclaration du champ de classe


Un composant utilise un champ pour chacune des classes dont il est le propritaire, comme cela est expliqu dans Dclaration des champs de classe la page 49-6. Dans ce cas, le calendrier a besoin dun champ de type TFieldDataLink pour son lien de donnes. Dclarez un champ pour le lien de donnes du calendrier :
type TDBCalendar = class(TSampleCalendar) private FDataLink: TFieldDataLink; end;

Avant de compiler lapplication, vous devez ajouter DB et DBCtrls la clause uses de lunit.

Dclaration des proprits daccs


Tout contrle orient donnes dispose dune proprit DataSource indiquant la classe source de donnes qui fournit les donnes au contrle. En outre, un contrle qui accde un champ unique a besoin dune proprit DataField pour spcifier ce champ dans la source de donnes. Contrairement aux proprits daccs des classes ayant un propritaire que nous avons vues avec lexemple du chapitre 49, Cration dun composant graphique, ces proprits daccs ne donnent pas accs aux classes ayant un propritaire elles-mmes, mais plutt aux proprits correspondantes de la classe ayant un propritaire. Autrement dit, vous allez crer des proprits qui autorisent le contrle et son lien de donnes partager la mme source et le mme champ.

Contrles orients donnes

51-5

Cration dun contrle pour scruter les donnes

Dclarez les proprits DataSource et DataField ainsi que leurs mthodes dimplmentation, puis crivez ces mthodes en tant que simples botes lettres vers les proprits correspondantes de la classe lien de donnes :

Exemple de dclaration des proprits daccs


type TDBCalendar = class(TSampleCalendar) private { les mthodes dimplmentation sont private ... function GetDataField: string; { renvoie le nom du champ de donnes function GetDataSource: TDataSource; { renvoie une rfrence sur la source de donnes procedure SetDataField(const Value: string); { affecte le nom du champ de donnes procedure SetDataSource(Value: TDataSource); { affecte une nouvelle source de donnes published { rend les proprits accessibles lors de la conception property DataField: string read GetDataField write SetDataField; property DataSource: TDataSource read GetDataSource write SetDataSource; end; function TDBCalendar.GetDataField: string; begin Result := FDataLink.FieldName; end; function TDBCalendar.GetDataSource: TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBCalendar.SetDataField(const Value: string); begin FDataLink.FieldName := Value; end; procedure TDBCalendar.SetDataSource(Value: TDataSource); begin FDataLink.DataSource := Value; end; } } } } } }

Maintenant que sont tablis les liens entre le calendrier et son lien de donnes, il reste une tape importante franchir. Vous devez construire la classe lien de donnes au moment de la construction du contrle calendrier et le dtruire avant de dtruire ce mme contrle.

Initialisation du lien de donnes


Un contrle orient donnes doit avoir accs son lien de donnes pendant toute sa dure de vie, il doit donc construire lobjet lien de donnes dans son propre constructeur et le dtruire avant de se dtruire lui-mme. Surchargez les mthodes Create et Destroy du calendrier pour construire et dtruire lobjet lien de donnes :
type TDBCalendar = class(TSampleCalendar) public { les constructeurs et destructeurs sont toujours publics }

51-6

Guide du dveloppeur

Cration dun contrle pour scruter les donnes

constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; constructor TDBCalendar.Create(AOwner: TComponent); begin FDataLink := TFieldDataLink.Create; { construit lobjet lien de donnes } FDataLink.Control := self; { informe le lien de donnes sur le calendrier } FReadOnly := True; { existe dj } end; destructor TDBCalendar.Destroy; begin FDataLink.Free; { dtruit toujours dabord les objets ayant un propritaire... } inherited Destroy; { ...puis appelle le destructeur hrit } end;

Vous avez maintenant un lien de donnes complet. Il vous reste indiquer au contrle les donnes quil doit lire dans le champ li. La section suivante vous explique comment procder.

Rponse aux changements de donnes


Lorsquun contrle a un lien de donnes et les proprits prcisant la source et le champ des donnes, il doit rpondre aux changements des donnes de ce champ provoqus soit par un dplacement vers un autre enregistrement, soit par une modification du champ. Les classes lien de donnes ont toutes un vnement intitul OnDataChange. Lorsque la source de donnes indique un changement dans ses donnes, lobjet lien de donnes appelle le gestionnaire attach son vnement OnDataChange. Pour mettre jour un contrle en rponse une modification des donnes, vous devez attacher un gestionnaire lvnement OnDataChange du lien de donnes. Dans notre exemple, vous allez ajouter une mthode au calendrier, puis la dsigner comme gestionnaire de lvnement OnDataChange du lien de donnes. Dclarez et implmentez la mthode DataChange, puis associez-la lvnement OnDataChange dans le constructeur. Dans le destructeur, dtachez le gestionnaire OnDataChange avant de dtruire lobjet.
type TDBCalendar = class(TSampleCalendar) private { this is an internal detail, so make it private } procedure DataChange(Sender: TObject); { doit avoir des paramtres corrects pour // lvnement } end; constructor TDBCalendar.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelle toujours dabord le constructeur hrit } FReadOnly := True; { existe dj }

Contrles orients donnes

51-7

Cration dun contrle de modification de donnes

FDataLink := TFieldDataLink.Create; FDataLink.OnDataChange := DataChange; end;

{ construit lobjet lien de donnes } { attache le gestionnaire lvnement }

destructor TDBCalendar.Destroy; begin FDataLink.OnDataChange := nil; { dtache le gestionnaire avant de dtruire lobjet } FDataLink.Free; { dtruit toujous dabord les objets ayant un propritaire... } inherited Destroy; { ...puis appelle le destructeur hrit } end; procedure TDBCalendar.DataChange(Sender: TObject); begin if FDataLink.Field = nil then { sil ny a pas de champ attribu... } CalendarDate := 0 { ...dfinit une date incorrecte } else CalendarDate := FDataLink.Field.AsDateTime; { sinon, dfinit le calendrier par la // date } end;

Vous avez maintenant un contrle de parcours des donnes.

Cration dun contrle de modification de donnes


Lorsque vous crez un contrle permettant de modifier les donnes, vous crez et recensez le composant puis lui ajoutez un lien de donnes, comme pour les contrles permettant de scruter les donnes. Vous devez galement rpondre aux changements de donnes dans le champ sous-jacent, mais vous devez prendre en considration quelques points supplmentaires. Par exemple, vous souhaitez sans doute que votre contrle rponde aux vnements clavier et souris. Votre contrle doit rpondre lorsque lutilisateur change le contenu du contrle. Lorsque lutilisateur quitte le contrle, les changements effectus dans le contrle doivent tre rpercuts dans lensemble de donnes. Le contrle permettant la modification des donnes dcrit ici est le mme que le contrle calendrier dcrit dans la premire partie de ce chapitre. Le contrle est modifi de telle sorte quil permette ldition en plus de la consultation des donnes du champ li. Voici les tapes suivre pour modifier un contrle existant et en faire un contrle permettant la modification des donnes : Modification de la valeur par dfaut de FReadOnly. Gestion des messages lis la souris ou au clavier. Mise jour de la classe lien de donnes sur un champ. Modification de la mthode Change. Mise jour de lensemble de donnes.

51-8

Guide du dveloppeur

Cration dun contrle de modification de donnes

Modification de la valeur par dfaut de FReadOnly


Comme il sagit dun contrle permettant la modification des donnes, la proprit ReadOnly doit tre False par dfaut. Pour quelle soit False, modifiez la valeur de FReadOnly dans le constructeur :
constructor TDBCalendar.Create(AOwner: TComponent); begin FReadOnly := False; { dfinit la valeur par dfaut } end;

Gestion des messages lis la souris ou au clavier


Lorsque lutilisateur commence se servir du contrle, celui-ci reoit de Windows les messages indiquant la manipulation de la souris (WM_LBUTTONDOWN, WM_MBUTTONDOWN, ou WM_RBUTTONDOWN), ou le message indiquant la manipulation du clavier (WM_KEYDOWN). En cas dutilisation de la CLX, la notification provient du systme dexploitation sous la forme dvnements systme. Pour permettre un contrle de rpondre ces messages, vous devez crire les gestionnaires des rponses ces messages. Rponse aux messages indiquant la manipulation de la souris Rponse aux messages indiquant la manipulation du clavier

Rponse aux messages indiquant la manipulation de la souris


Une mthode MouseDown est une mthode protge de lvnement OnMouseDown dun contrle. Le contrle lui-mme appelle MouseDown en rponse au message Windows indiquant la manipulation de la souris. Lorsque vous surchargez la mthode MouseDown hrite, vous pouvez inclure du code apportant dautres rponses en plus de lappel lvnement OnMouseDown. Pour surcharger MouseDown , ajoutez la mthode MouseDown la classe TDBCalendar :
type TDBCalendar = class(TSampleCalendar); protected procedure MouseDown(Button: TButton, Shift: TShiftState, X: Integer, Y: Integer); override; end; procedure TDBCalendar.MouseDown(Button: TButton; Shift: TShiftState; X, Y: Integer); var MyMouseDown: TMouseEvent; begin if not ReadOnly and FDataLink.Edit then inherited MouseDown(Button, Shift, X, Y) else

Contrles orients donnes

51-9

Cration dun contrle de modification de donnes

begin MyMouseDown := OnMouseDown; if Assigned(MyMouseDown then MyMouseDown(Self, Button, Shift, X, Y); end; end;

Lorsque MouseDown rpond un message indiquant la manipulation de la souris, la mthode MouseDown hrite est appele uniquement si la proprit ReadOnly du contrle est False et si lobjet lien de donnes est en mode dition, cest--dire si le champ peut tre modifi. Si le champ ne peut tre modifi, le code mis par le programmeur dans le gestionnaire de lvnement OnMouseDown , sil en existe un, est excut.

Rponse aux messages indiquant la manipulation du clavier


Une mthode KeyDown est une mthode protge de lvnement OnKeyDown dun contrle. Le contrle lui-mme appelle KeyDown en rponse au message Windows indiquant la manipulation du clavier. Lorsque vous surchargez la mthode KeyDown hrite, vous pouvez inclure le code qui apporte dautres rponses en plus de lappel lvnement OnKeyDown. Pour surcharger KeyDown, suivez ces instructions :

1 Ajoutez une mthode KeyDown la classe TDBCalendar :


type TDBCalendar = class(TSampleCalendar); protected procedure KeyDown(var Key: Word; Shift: TShiftState; X: Integer; Y: Integer); override; end;

2 Implmentez la mthode KeyDown :


procedure KeyDown(var Key: Word; Shift: TShiftState); var MyKeyDown: TKeyEvent; begin if not ReadOnly and (Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_END, VK_HOME, VK_PRIOR, VK_NEXT]) and FDataLink.Edit then inherited KeyDown(Key, Shift) else begin MyKeyDown := OnKeyDown; if Assigned(MyKeyDown) then MyKeyDown(Self, Key, Shift); end; end;

Lorsque KeyDown rpond un message indiquant la manipulation du clavier, la mthode KeyDown hrite est appele uniquement si la proprit ReadOnly du contrle vaut False, si la touche appuye est une des touches de dplacement du curseur et si lobjet lien de donnes est en mode dition, cest--dire si le champ peut tre modifi. Si le champ ne peut tre modifi ou si une autre touche a t

51-10

Guide du dveloppeur

Cration dun contrle de modification de donnes

presse, le code mis par le programmeur dans le gestionnaire de lvnement OnKeyDown, sil en existe un, est excut.

Mise jour de la classe lien de donnes sur un champ


Il existe deux types de modification des donnes : Le changement de la valeur dun champ doit se rpercuter dans le contrle orient donnes Le changement dans le contrle orient donnes doit se rpercuter dans la valeur du champ Le composant TDBCalendar a dj une mthode DataChange qui gre les modifications de la valeur du champ dans lensemble de donnes en assignant cette valeur la proprit CalendarDate. La mthode DataChange est le gestionnaire de lvnement OnDataChange. Ainsi le composant calendrier est capable de g rer le premier type de modification des donnes. De manire semblable, la classe lien de donnes sur un champ a aussi un vnement OnUpdateData qui se produit lorsque lutilisateur modifie le contenu du contrle orient donnes. Le contrle calendrier a une mthode UpdateData qui devient le gestionnaire de lvnement OnUpdateData. UpdateData assigne au champ lien de donnes la valeur modifie dans le contrle orient donnes.

1 Pour rpercuter dans la valeur du champ une modification effectue sur la valeur du calendrier, ajoutez une mthode UpdateData la section private du composant calendrier :
type TDBCalendar = class(TSampleCalendar); private procedure UpdateData(Sender: TObject); end;

2 Implmentez la mthode UpdateData :


procedure UpdateData(Sender: TObject); begin FDataLink.Field.AsDateTime := CalendarDate; calendrier } end;

{ dfinit le champ lien par la date du

3 Dans le constructeur de TDBCalendar, affectez la mthode UpdateData lvnement OnUpdateData :


constructor TDBCalendar.Create(AOwner: TComponent); begin inherited Create(AOwner); FReadOnly := True; FDataLink := TFieldDataLink.Create; FDataLink.OnDataChange := DataChange; FDataLink.OnUpdateData := UpdateData; end;

Contrles orients donnes

51-11

Cration dun contrle de modification de donnes

Modification de la mthode Change


La mthode Change du TDBCalendar est appele chaque fois quest dfinie une nouvelle valeur de date. Change appelle le gestionnaire de lvnement OnChange, sil existe. Lutilisateur du composant peut crire du code dans le gestionnaire de lvnement OnChange afin de rpondre aux modifications de la date. Lorsque la date du calendrier change, lensemble de donnes sous-jacent doit tre averti de ce changement. Vous pouvez le faire en surchargeant la mthode Change et en ajoutant une ligne de code de plus. Voici les tapes suivre :

1 Ajoutez une nouvelle mthode Change au composant TDBCalendar :


type TDBCalendar = class(TSampleCalendar); private procedure Change; override; end;

2 Ecrivez la mthode Change, appelant la mthode Modified qui informe lensemble de donnes que celles-ci ont chang, puis appelle la mthode Change hrite :
procedure TDBCalendar.Change; begin FDataLink.Modified; inherited Change; end;

{ appelle la mthode Modified } { appelle la mthode Change hrite }

Mise jour de lensemble de donnes


A ce point, une modification dans le contrle orient donnes a chang les valeurs dans la classe du lien de donnes sur un champ. La dernire tape de la cration dun contrle permettant la modification des donnes consiste mettre jour lensemble de donnes avec la nouvelle valeur. Cela doit se produire aprs que la personne ayant chang la valeur du contrle quitte ce contrle en cliquant lextrieur de celui-ci ou en appuyant sur la touche. Ce processus fonctionne de manire diffrente dans la VCL et la CLX.
VCL

La VCL possde des ID de message dfinis pour les oprations sur les contrles. Par exemple, le message CM_EXIT est envoy au contrle lorsque lutilisateur quitte celui-ci. Vous pouvez crire un gestionnaire qui rponde ce message. Et ensuite, lorsque lutilisateur quitte le contrle, la mthode CMExit, gestionnaire du message CM_EXIT, rpondra en mettant jour lenregistrement dans lensemble de donnes avec les valeurs modifies dans la classe lien de donnes sur un champ. Pour plus dinformations sur les gestionnaires de messages, voir chapitre 46, Gestion des messages. Pour mettre jour lensemble de donnes depuis un gestionnaire de message, suivez ces instructions :

51-12

Guide du dveloppeur

Cration dun contrle de modification de donnes

1 Ajoutez le gestionnaire de message au composant TDBCalendar :


type TDBCalendar = class(TSampleCalendar); private procedure CMExit(var Message: TWMNoParams); message CM_EXIT; end;

2 Implmentez la mthode CMExit afin quelle ressemble ceci :


procedure TDBCalendar.CMExit(var Message: TWMNoParams); begin try FDataLink.UpdateRecord; {indiquer au lien de donnes dactualiser la base de donnes } except on Exception do SetFocus; { si chec, ne pas perdre la focalisation } end; inherited; end; CLX

Dans la CLX, TWidgetControl possde une mthode DoExit protge qui est appele quand la focalisation en saisie quitte le contrle. Cette mthode appelle le gestionnaire de lvnement OnExit. Vous pouvez redfinir cette mthode pour actualiser lenregistrement dans lensemble de donnes avant la gnration du gestionnaire dvnement OnExit. Pour mettre jour lensemble de donnes quand lutilisateur quitte le contrle, suivez les tapes ci-aprs :

1 Ajoutez un overrride la mthode DoExit du composant TDBCalendar :


type TDBCalendar = class(TSampleCalendar); private procedure DoExit; override; end;

2 Implmentez la mthode DoExit afin quelle ressemble ceci :


procedure TDBCalendar.CMExit(var Message: TWMNoParams); begin try FDataLink.UpdateRecord; {indiquer au lien de donnes dactualiser la base de donnes } except on Exception do SetFocus; { si chec, ne pas perdre la focalisation } end; inherited; { laisser la mthode hrite gnrer un vnement OnExit } end;

Contrles orients donnes

51-13

51-14

Guide du dveloppeur

52
Chapitre 52

Chapitre

Transformation dune bote de dialogue en composant

Il est pratique de transformer une bote de dialogue frquemment sollicite en un composant que vous pourrez ajouter dans la palette des composants. Ainsi, vos composants bote de dialogue fonctionneront exactement comme ceux des botes de dialogue standard. Lobjectif ici est de crer un composant simple quun utilisateur peut ajouter un projet et dont il peut dfinir les proprits lors de la conception. La transformation dune bote de dialogue en composant ncessite les tapes suivantes :

1 2 3 4

Dfinition de linterface du composant Cration et recensement du composant Cration de linterface du composant Test du composant

A lexcution, le composant enveloppe de Delphi, associ la bote de dialogue cre et excute celle-ci en lui transmettant les donnes spcifies par lutilisateur. Le composant bote de dialogue est donc la fois rutilisable et personnalisable. Dans ce chapitre, vous allez voir comment crer un composant enveloppe autour de la fiche gnrique A propos de... disponible dans le rfrentiel dobjets de Delphi.
Remarque

Copiez les fichiers ABOUT.PAS et ABOUT.DFM dans votre rpertoire de travail. Il ny a pas grand chose dire concernant la conception de la bote de dialogue enveloppe par un composant. Dans un tel contexte, nimporte quelle fiche peut fonctionner comme une bote de dialogue.

Transformation dune bote de dialogue en composant

52-1

Dfinition de linterface du composant

Dfinition de linterface du composant


Avant de crer le composant pour votre bote de dialogue, vous devez dcider de la faon dont il sera utilis par les dveloppeurs. Vous devez crer une interface entre votre bote de dialogue et les applications qui lutilisent. Par exemple, considrons les proprits des composants associs aux botes de dialogue standard. Elles autorisent le dveloppeur dfinir ltat initial de la bote de dialogue, tel que le titre ou le paramtrage initial des contrles, et renvoient toutes les informations ncessaires lorsque la bote de dialogue se ferme. Les seules interactions directes ne se produisent qu avec les proprits du composant enveloppe et pas avec les contrles individuels de la bote de dialogue. Linterface doit donc contenir suffisamment dinformations pour que la fiche bote de dialogue saffiche selon les indications du dveloppeur et quelle renvoie les informations ncessaires lapplication. Les proprits du composant enveloppe peuvent tre vues comme les donnes permanentes dune bote de dialogue transitoire. Dans le cas de votre bote A propos de, aucune information nest renvoye. Les proprits de lenveloppe contiennent donc uniquement les informations ncessaires pour afficher correctement la bote A propos de. Puisquil y a quatre champs distincts dans cette bote sur lesquels lapplication peut agir, il vous faut fournir quatre proprits de type chane pour les paramtrer.

Cration et recensement du composant


La cration dun composant dbute toujours de la mme faon. Vous crez une unit et vous recensez le composant avant de linstaller dans la palette des composants. Ce processus est dcrit dans Cration dun nouveau composant la page 40-9. Pour notre exemple, suivez la procdure gnrale de cration dun composant en tenant compte des spcificits suivantes : Nommez lunit du composant AboutDlg. Drivez un nouveau type de composant appel TAboutBoxDlg, descendant de TComponent . Recensez TAboutBoxDlg sur la page Exemples de la palette des composants. Lunit que vous obtenez doit ressembler ceci :
unit AboutDlg; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms; type TAboutBoxDlg = class(TComponent) end; procedure Register; implementation

52-2

Guide du dveloppeur

Cration de linterface du composant

procedure Register; begin RegisterComponents(Samples, [TAboutBoxDlg]); end; end.

Pour linstant, le nouveau composant possde uniquement les fonctionnalits intgres TComponent. Cest le composant non visuel le plus simple. Dans la section suivante, vous allez crer linterface entre le composant et la bote de dialogue.

Cration de linterface du composant


Voici les tapes ncessaires la cration de linterface du composant :

1 Inclusion de lunit de la fiche 2 Ajout des proprits de linterface 3 Ajout de la mthode Execute

Inclusion de lunit de la fiche


Pour que votre composant enveloppe puisse initialiser et afficher la bote de dialogue envelopp e, vous devez ajouter les fichiers de lunit de la fiche dans la clause uses de lunit du composant enveloppe. Ajoutez About la clause uses de lunit AboutDlg. La clause uses ressemble maintenant ceci :
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, About;

Lunit fiche dclare toujours une instance de la classe de la fiche. Dans le cas de la bote A propos de, la classe de la fiche est TAboutBox, et lunit About doit inclure la dclaration suivante :
var AboutBox: TAboutBox;

Ainsi en ajoutant About la clause uses, vous rendez disponible AboutBox au composant enveloppe.

Ajout des proprits de linterface


Avant de poursuivre, vous devez dterminer les proprits de votre composant enveloppe ncessaires pour permettre aux dveloppeurs dutiliser votre bote de dialogue en tant que composant dans leurs applications. Puis, ajoutez les dclarations de ces proprits la dclaration de classe du composant. Les proprits dun composant enveloppe sont sensiblement plus simples crire que celles dun composant standard. Souvenez-vous que vous ne faites que crer des donnes permanentes que lenveloppe et la bote de dialogue peuvent

Transformation dune bote de dialogue en composant

52-3

Cration de linterface du composant

changer. En dfinissant ces donnes sous la forme de proprits, vous donnez aux dveloppeurs la possibilit de dfinir des donnes au moment de la conception qui, lors de lexcution, seront transmises par lenveloppe la bote de dialogue. La dclaration dune proprit dinterface ncessite deux ajouts la dclaration de classe du composant : Un champ de classe priv qui est une variable utilise par lenveloppe pour stocker la valeur de la proprit. La dclaration published de la proprit elle-mme qui indique son nom et le champ utiliser pour le stockage. De telles proprits dinterface nont pas besoin de mthodes daccs. Elles accdent directement aux donnes stockes. Par convention, le champ qui stocke la valeur de la proprit porte le mme nom que la proprit, mais prcd de la lettre F. Le champ et la proprit doivent avoir le mme type. Par exemple, la dclaration dune proprit dinterface de type entier appele Year, est la suivante :
type TMyWrapper = class(TComponent) private FYear: Integer; { donne membre pour les donnes de la proprit Year } published property Year: Integer read FYear write FYear; { la proprit et son stockage } end;

Sagissant de votre bote A propos de, vous devez disposer de quatre proprits de type string pour le nom du produit, les informations de version, les informations de copyright et les commentaires ventuels.
type TAboutBoxDlg = class(TComponent) private FProductName, FVersion, FCopyright, FComments: string; { dclare les donnes membres } published property property property property end; ProductName: string read FProductName write FProductName; Version: string read FVersion write FVersion; Copyright: string read FCopyright write FCopyright; Comments: string read FComments write FComments;

Si vous installez votre composant dans la palette des composants et si vous le placez dans une fiche, vous pourrez dfinir les proprits, et ces valeurs apparatront de faon permanente dans la fiche. Ainsi, lors de lexcution de la bote de dialogue quil enveloppe, le composant pourra les utiliser.

Ajout de la mthode Execute


Il vous reste dfinir dans linterface du composant les moyens douvrir la bote de dialogue et de rcuprer un rsultat lorsquelle se ferme. Comme pour les composants des botes de dialogue standard, vous utiliserez une fonction

52-4

Guide du dveloppeur

Cration de linterface du composant

boolenne appele Execute qui renvoie True si lutilisateur clique sur OK, ou False sil annule la bote de dialogue. La dclaration de la mthode Execute ressemble toujours ceci :
type TMyWrapper = class(TComponent) public function Execute: Boolean; end;

Limplmentation minimale de la mthode Execute doit construire la fiche de la bote de dialogue, puis afficher celle-ci en tant que bote de dialogue modale avant de renvoyer True ou False, selon la valeur renvoye par ShowModal. Voici limplmentation minimale de la mthode Execute pour une fiche bote de dialogue de type TMyDialogBox :
function TMyWrapper.Execute: Boolean; begin DialogBox := TMyDialogBox.Create(Application); try Result := (DialogBox.ShowModal = IDOK); finally DialogBox.Free; end; end;

{ construit la fiche } { excute; dfinit le rsultat selon la //faon de fermer } { restitue la fiche }

Notez lutilisation dun bloc try..finally qui vrifie que lapplication restitue lobjet bote de dialogue mme si une exception se produit. En gnral, lorsque vous construisez un objet de cette manire, vous devez utiliser un bloc try..finally pour protger le bloc de code et tre sr que lapplication libre toutes les ressources quelle alloue. En pratique, il y a davantage de code dans le bloc try..finally. Plus spcifiquement, avant lappel ShowModal, le composant enveloppe doit dfinir certaines proprits de la bote de dialogue en fonction de ses propres proprits dinterface. A linverse, quand ShowModal rend la main, le composant enveloppe dfinit certaines de ses proprits dinterface en fonction du rsultat de lexcution de la bote de dialogue. Dans le cas de la bote A propos de, vous devez utiliser les quatre proprits dinterface du composant enveloppe pour dfinir le contenu des libells de la bote de dialogue. Comme cette dernire ne renvoie aucune information lapplication, il ny a rien de particulier faire aprs lappel ShowModal. Dans la partie publique de la classe TAboutDlg, ajoutez la dclaration pour la mthode Execute :
type TAboutDlg = class(TComponent) public function Execute: Boolean; end; function TAboutBoxDlg.Execute: Boolean;

Transformation dune bote de dialogue en composant

52-5

Test du composant

begin AboutBox := TAboutBox.Create(Application); { construit la bote A propos de try if ProductName = then { si le nom du produit est vide... ProductName := Application.Title; { ...utilise la place le titre de lapplication AboutBox.ProductName.Caption := ProductName; { copie le nom du produit AboutBox.Version.Caption := Version; { copie les infos de version AboutBox.Copyright.Caption := Copyright; { copie les infos de copyright AboutBox.Comments.Caption := Comments; { copie les commentaires AboutBox.Caption := About + ProductName; { dfinit le titre de la bote with AboutBox do begin ProgramIcon.Picture.Graphic := Application.Icon; { copie licne Result := (ShowModal = IDOK); { excute et dfinit le rsultat end; finally AboutBox.Free; { restitue la bote de dialogue A propos de end; end;

} } } } } } } } } }

Test du composant
Une fois le composant bote de dialogue install, vous pouvez lutiliser comme nimporte quelle autre bote de dialogue commune, en le plaant sur une fiche et en lexcutant. Un moyen rapide de vrifier le fonctionnement de la bote A propos de consiste ajouter un bouton de commande dans une fiche et excuter la bote de dialogue lorsque lutilisateur clique sur ce bouton. Par exemple, si vous avez cr une bote de dialogue A propos de, et si vous lavez ajout la palette des composants, vous pouvez tester son fonctionnement en suivant les tapes ci-dessous :

1 Crez un nouveau projet. 2 Placez un composant A propos de dans la fiche principale. 3 Placez un bouton de commande dans la fiche. 4 Double-cliquez sur le bouton de commande pour crer un gestionnaire dvnements vide. 5 Dans le gestionnaire dvnements, entrez la ligne de code suivante :
AboutBoxDlg1.Execute;

6 Excutez lapplication.
Lorsque la fiche principale apparat, cliquez sur le bouton de commande. La bote A propos de saffiche avec licne projet par dfaut et Project1 comme titre. Choisissez OK pour fermer la bote de dialogue. Vous pouvez pousser plus loin le test du fonctionnement du composant en dfinissant les diffrentes proprits du composant A propos de et en excutant une nouvelle fois lapplication.

52-6

Guide du dveloppeur

Index
Symboles
&, caractre 3-21, 6-38 ... (points de suspension), bouton 15-25 .DLL Apache 13-12 dploiement 13-11 installation 13-6 .DLL, fichiers cration 5-10 prdfinies 6-31 recensement 6-32 actions de rpartition 29-4 actions, 6-20 Actions, proprit 28-5 activation juste--temps 39-4 39-5 Active Server Pages 37-1 Active, proprit client, sockets 32-7 ensembles de donnes 18-5 serveur, sockets 32-8 sessions 20-20 ActiveAggs, proprit 23-16 ActiveFlag, proprit 16-22 ActiveForms 38-1, 38-6 crer 38-2 ActiveX 33-13, 38-1 applications Web 33-14 compar ASP 37-8 ou InternetExpress 25-36 25-37 ActiveX , page de la palette de composants 3-33, 3-34 ActiveX Data Objects Voir ADO ActiveX, contrles 33-23 incorporation dans le document HTML 28-15 ActiveX, page de la palette de composants 35-5 ActnList, unit 6-32 actualisation actions 6-30 adaptateur utilisateur final 29-4 adaptateurs actions 29-9 applications Web 29-8 champs 29-8 enregistrements 29-9 erreurs 29-9 adaptateurs dapplication 29-4 adaptateurs Web actions 29-9 champs 29-8 enregistrements 29-9 erreurs 29-9 AdapterPageProducer 29-3 Add, mthode chanes 3-58 menus 6-46 persistantes, colonnes 15-22 AddAlias, mthode 20-28 AddFieldDef, mthode 18-45 AddFontResource, fonction 13-16 AddIndexDef, mthode 18-45 AddObject, mthode 3-59 AddParam, mthode 18-62 AddPassword, m thode 20-25 AddRef, m thode 4-22, 4-26, 4-27 IUnknown 33-4 Address, proprit client, sockets 32-6 TSocketConnection 25-29 AddStandardAlias, mthode 20-28 AddStrings, mthode 3-58 ADO 14-2, 18-2, 21-1, 21-2, 21-3 composants 21-121-22 prsentation 21-2 dploiement 13-7 fournisseurs 21-3, 21-4 fournisseurs de ressources 39-6 stockages de donnes 21-3, 21-4 transactions implicites 21-7 21-8 ADO, connexions 21-321-9 dpassement de dlais 21-6 vnements 21-821-9 se connecter aux stockages de donnes 21-321-8 ADO, ensembles de donnes 21-1021-19 connexion 21-11 fichiers de donnes 21-16 21-17 ADO, objets objet connexion 21-5 Recordset 21-1121-12 ADO, page de la palette de composants 3-33, 14-2, 21-2 ADOExpress 21-1 adressage absolu 10-11 adresses connexions par socket 32-3, 32-4 adresses IP noms dhte 32-5
Index

A
A propos de, bote de dialogue 52-2, 52-3 ajout de proprits 52-4 abonnements par utilisateur 35-17 permanents 35-17 temporaires 35-16 Abort, procdure empcher les modifications 18-23 AbortOnKeyViol, proprit 20-60 AbortOnProblem, proprit 20-60 About, unit 52-3 AboutDlg, unit 52-2 abstract, classes 40-3 acclrateurs 3-21, 6-38 accs aux donnes composants 5-11, 14-1 mcanismes 5-115-12, 14-114-2, 18-218-3 multiplates-formes 13-8, 14-2 accs aux donnes, composants threads 9-5 AccsBD, page de la palette de composants 3-32, 14-2, 25-3 Acquire, mthode 9-8 Action 6-19 Action, proprit 3-20 ActionBand 6-20 ActionLink, proprit 3-20 actions 6-266-56 actualisation 6-30 adaptateurs Web 29-9 classes dactions 6-30 excution 6-28

I-1

ADT, champs 19-26, 19-27 19-29 affichage 15-26, 19-27 aplanissement 15-26 champs persistants 19-28 affectation des touches 12-9 affectations variables objet 3-11 Affecter donnes locales, commande 23-16 affichage en tableau (grilles) 3-48 AfterApplyUpdates, vnement 23-38, 24-9 AfterCancel, vnement 18-24 AfterClose, vnement 18-5 AfterConnect, vnement 17-3, 25-32 AfterDelete, vnement 18-23 AfterDisconnect, vnement 17-4, 25-33 AfterDispatch, vnement 28-6, 28-9 AfterEdit, vnement 18-20 AfterGetRecords, vnement 24-9 AfterInsert, vnement 18-21 AfterOpen, vnement 18-5 AfterPost, vnement 18-24 AfterScroll, vnement 18-6 agent Web 5-13, 27-127-2 AggFields, proprit 23-16 Aggregates, proprit 23-14, 23-16 agrgation 33-9 ensembles de donnes client 23-1323-16 interfaces 4-25 agrgats maintenus 14-18, 23-1323-16 champs agrgat 19-12 oprateurs de synthse 23-14 sous-totaux 23-15 spcification 23-1423-15 valeurs 23-16 aide aide 5-31 aide contextuelle 3-48 bulles daide 3-48 conseils daide 3-48 informations de type 34-9 aide en ligne 47-4 aide par mot cl 5-29 Ajout de champs, bote de dialogue 19-5 I-2

Ajouter linterface, commande 25-19 Ajouter au rfrentiel, commande 5-22 alias BDE 20-3, 20-15, 20-28 20-30 cration 20-28 locaux 20-28 spcification 20-15, 20-1620-17 suppression 20-29 diteur de bibliothques de types 34-11, 34-19, 34-26 34-27 AliasName, proprit 20-15 Align, proprit 3-20, 6-4 barres dtat 3-47 contrles texte 7-8 volets 6-49 Alignment, proprit 3-38 barres dtat 3-48 champs 19-13 contrles de texte format 3-35 contrles mmo orients donnes 15-10 en-ttes de colonne 15-24 grilles de dcision 16-13 grilles de donnes 15-23 mmos 3-35 AllowAllUp, proprit 3-39 boutons outil 6-53 turboboutons 6-51 AllowDelete, proprit 15-33 AllowGrayed, proprit 3-40 AllowInsert, proprit 15-33 alTop, constante 6-49 Anchor, proprit 3-20 ancrage 7-4 annes bissextiles 50-8 ANSI, jeu de caractres 12-3 AnsiChar 4-43 AnsiString 4-45 Apache, applications 27-7 dboguer 27-9 Apache, DLL 13-11, 27-7 dploiement 13-12 apartment, modle de thread 36-9 Append, mthode 18-21, 18-23 Insert et 18-22 AppendRecord, mthode 18-25 application niveau triple Voir applications multiniveaux

application de rpartition de sockets 25-10, 25-15, 25-29 Application, variable 6-3, 28-3 applications agent Web 28-128-22 Apache 27-7, 28-2, 29-2 applications client Web 25-3625-48 base de donnes 14-1 client/serveur 25-1 protocoles de rseau 20-17 COM 5-15, 36-136-19 cration 3-25 dploiement 13-1 distribues 39-1 fichiers 13-3 graphiques 40-8, 45-1 informations dtat 3-47 ISAPI 27-7, 28-1, 29-2 MDI 5-2 MTS 5-16 multiniveaux 25-125-48 prsentation 25-4 multiplates-formes 10-1 10-34 cration 10-1 multithreads 9-1 NSAPI 27-7, 28-1, 28-2, 29-2 portage 10-19 ralisation de palettes 45-5, 45-6 SDI 5-2 serveur Web 5-12, 5-13, 29-2 service 5-4 tutoriel WebSnap 29-20 WebSnap 29-129-28 applications base de fichiers 14-1014-12 ensembles de donnes client 23-3923-42 applications niveau double 14-3, 14-10, 14-14 applications niveau unique 14-3, 14-10, 14-14 base de fichiers 14-11 applications Apache crer 28-2, 29-2 applications bidirectionnelles mthodes 12-8 proprits 12-6 applications client bibliothques de types 34-22, 35-235-6 COM 33-10, 35-135-18

Guide du dveloppeur

comme applications serveur Web 25-36 cration 25-2625-35 crer 35-135-18 fourniture de requtes 24-7 objets transactionnels 39-2 protocoles de rseau 20-17 services Web 31-931-11 simples 25-37 applications client simples 25-2 applications client/serveur 5-11 applications COM 33-3, 33-19 applications COM+ 39-7, 39-24 applications console 5-4 applications de bases de donnes 5-11, 14-1 base de fichiers 14-10 14-12, 21-1621-17, 23-39 23-42 architecture 14-614-17, 25-36 dploiement 13-7 distribues 5-12 mise lchelle 14-13 multiniveaux 25-4 portage 10-29 XML et 26-126-12 applications distantes TCP/IP 32-1 applications distribues base de donnes 5-12 MTS et COM+ 5-16, 39-1 applications GUI 3-25 applications internationales 12-1 abrviations et 12-10 conversion des saisies clavier 12-9 localisation 12-13 applications ISAPI crer 28-1, 29-2 applications Linux 10-1 applications multiniveaux 14-3, 14-15 applications Web 25-36 25-48 construction 25-38, 25-3925-48 avantages 25-2 composants 25-3 construction 25-1225-35 dploiement 13-11 licences serveur 25-3 paramtres 23-33 prsentation 25-4

rappels 25-20 relations matre/dtail 25-22 applications multiplates-formes 3-32 applications multithreads sessions 20-14, 20-3220-34 applications NSAPI crer 28-1, 28-2, 29-2 applications portables 10-1 10-34 applications serveur COM 36-136-19 multiniveaux 25-5 recensement 25-13, 25-25 25-26 services Web 31-231-9 applications serveur agent Web 28-1 accs aux bases de donnes 28-18 ajouter un projet 28-3 architecture 28-3 cration de rponses 28-8 crer 28-128-3 envoi de donnes aux 28-11 envoi de fichiers 28-13 gestion dvnements 28-5, 28-7, 28-9 gestion des connexions de base de donnes 28-19 interrogation de tables 28-22 modles 28-3 de rponse 28-15 prsentation 28-128-4 rpartiteur Web 28-5 applications serveur Web 5-12, 5-13, 27-127-10, 28-2, 29-2 crer 29-2 dboguer 27-7 emplacements des ressources 27-3 multiniveaux 25-3825-48 prsentation 27-627-10 standards 27-3 types 27-6 applications service 5-45-9 code exemple 5-5, 5-7 exemple 5-7 applications Web ActiveX 33-14, 38-1, 38-16 38-18 clients multiniveaux 25-37 adaptateurs 29-8 ASP 37-1

base de donnes 25-3625-48 objet 28-3 applications WebSnap prsentation 29-129-28 applications Windows 10-1 Apply, mthode 20-52 ApplyRange, mthode 18-40 ApplyUpdates, mthode 10-33, 20-38 ensembles de donnes BDE 20-41 ensembles de donnes client 21-14, 23-8, 23-24, 23-2423-25, 24-4 fournisseurs 23-25, 24-4, 24-9 TDatabase 20-40 TXMLTransformClient 26-11 AppServer, proprit 23-39, 24-3, 25-20, 25-33 arborescence XML 29-1 arborescence XSL 29-1 Arc, mthode 8-4 architecture applications BDE 20-120-2 applications de bases de donnes 14-614-17, 20-1 20-2 client 25-5 serveur 25-6 applications serveur agent Web 28-3 multiniveau 25-5, 25-6 base sur le Web 25-36 architecture multiniveau 25-5, 25-6 arrt des threads 9-12 Arrire-plan 6-23 arrire-plan 12-10 transparent 12-10 as, mot rserv liaison anticipe 25-34 AS_ApplyUpdates, mthode 24-4 AS_DataRequest, mthode 24-4 AS_Execute, mthode 24-4 AS_GetParams, mthode 24-4 AS_GetProviderNames, mthode 24-4 AS_GetRecords, mthode 24-4 AS_RowRequest, mthode 24-4 ASCII, tables 20-6 ASP 37-137-9 compar ActiveX 37-8

Index

I-3

compar au courtier Web 37-1 documents HTML 37-1 lments intrinsques 37-2 37-3, 37-437-7 gnration de pages 37-3 interface utilisateur 37-1 langage de script 37-3 objet Application 37-4 objet Request 37-5 objet Response 37-537-6 objet Server 37-7 objet Session 37-637-7 performances 37-1 script 33-13 Assign, m thode listes de chanes 3-58 AssignedValues, proprit 15-25 AssignValue, mthode 19-19 Associate, proprit 3-37 atomicit transactions 14-5, 39-10 Attributes, proprit paramtres 18-54, 18-62 TADOConnection 21-7 attributs diteurs de proprits 47-11 attributs dactivation 39-7 attributs de champs 19-15 19-17 affectation 19-16 suppression 19-16 attributs de transaction modules de donnes MTS 25-17 attributs des champs dans les paquets de donnes 24-7 attributs transactionnels 39-10 39-12 dfinir 39-11 audit de code modles 5-3 AutoCalcFields, proprit 18-26 AutoComplete, proprit 25-8 AutoDisplay, proprit 15-10, 15-11 AutoEdit, proprit 15-6 AutoHotKeys, proprit 6-38 Automation compatibilit de type 34-13 descriptions de types 33-12 IDispatch, interface 36-15 interfaces 36-1336-16 I-4
Guide du dveloppeur

liaison tardive 36-15 objets Active Server 37-2 optimisation 33-18 vrification de types 36-14 AutoPopup, proprit 6-55 AutoSelect, proprit 3-35 AutoSessionName, proprit 20-20, 20-34, 28-19 AutoSize, proprit 3-20, 3-35, 6-5, 13-15, 15-9 .AVI, fichiers 8-34 AVI clips 3-51

B
balises HTML transparentes conversion 28-16 paramtres 28-15 prdfinies 28-15 syntaxe 28-15 balises transparentes pour HTML prdfinition 25-4725-48 bandes daction 6-19, 6-21 Bands, proprit 3-41, 6-54 barre doutils 6-21 barre de dfilement fentres du texte 7-87-9 barres dtat 3-47 internationalisation 12-9 barres doutils 3-40, 6-19, 6-48 ajout 6-516-53 ajout de volets comme 6-49 6-51 conception 6-486-56 dfinition des marges 6-50 dsactivation des boutons 6-52 insertion de boutons 6-49, 6-51, 6-52 listes dactions 6-20 masques 6-55 menus contextuels 6-55 outil de dessin par dfaut 6-50 transparentes 6-52, 6-54 turboboutons 3-39 barres de dfilement 3-36 barres de progression 3-48 barres gradues 3-36 barres gradues horizontales 3-37 barres gradues verticales 3-37 barres multiples 3-41, 6-48 ajout 6-536-54 conception 6-486-56

configuration 6-54 masques 6-55 bascules 6-51, 6-53 base de donnes composants 20-320-4 base de donnes locale accs 20-6 support BDE 20-620-8 base de donnes, pilotes dbExpress 22-4 bases de donnes 5-11, 14-1 14-6, 51-1 base de fichiers 14-3 accs aux 18-1 accs non autoris 17-4 ajout de donnes 18-25 alias et 20-16 applications Web et 28-18 choix 14-3 connexion 17-117-16 connexion aux 14-4, 17-4 17-6 connexions implicites 17-2 gnration de rponses HTML 28-1828-22 identification 20-1520-17 nom 20-16 proprits daccs 51-551-6 relationnelles 14-1 scurit 14-414-5 transactions 14-514-6 types 14-3 bases de donnes locales 14-3 alias 20-28 renommer les tables 20-8 bases de donnes relationnelles 14-1 .bashrc 10-17 BatchMove, mthode 20-8 BDE alias 20-3, 20-15, 20-18, 20-2820-30 cration 20-28 disponibilit 20-29 requtes htrognes 20-11 spcification 20-1620-17 suppression 20-29 appels API 20-1, 20-5 connexions aux bases de donnes 20-1420-18 ensemble de donnes 20-2 20-3 fermeture des connexions 20-22

fournisseurs de ressources 39-6 gestion des connexions 20-22 mises jour en mmoire cache gestion des erreurs 20-43 noms de pilotes 20-15 oprations groupes 20-55 20-60 ouverture de connexions de bases de donnes 20-22 pilotes 20-1, 20-15 pilotes ODBC 20-18 proprits de la connexion par dfaut 20-21 rcupration des donnes 20-11 requtes htrognes 20-10 20-11 sessions 20-18 transactions implicites 20-34 types de table 20-6 utilitaires 20-6220-63 Voir moteur de bases de donnes Borland BDE, ensembles de donnes 14-1 BDE, page de la palette de composants 3-33, 14-1 BDEalias spcification 20-15 BeforeApplyUpdates, vnement 23-37, 24-9 BeforeCancel, vnement 18-24 BeforeClose, vnement 18-5 BeforeConnect, vnement 17-3, 25-32 BeforeDelete, vnement 18-23 BeforeDisconnect, vnement 17-4, 25-33 BeforeDispatch, vnement 28-5, 28-7 BeforeEdit, vnement 18-20 BeforeGetRecords, vnement 24-9 BeforeInsert, vnement 18-21 BeforeOpen, vnement 18-5 BeforePost, vnement 18-24 BeforeScroll, vnement 18-6 BeforeUpdateRecord, vnement 20-38, 20-46, 23-26, 24-13 BeginDrag, mthode 7-1 BeginRead, mthode 9-9 BeginTrans, mthode 17-7

BeginWrite, mthode 9-9 Beveled 3-38 BevelKind, proprit 3-24 bibliothque Qt 10-25 bibliothques contrles personnaliss 40-5 bibliothques de types 33-11, 33-12, 33-16, 33-19, 34-1 34-31 accs 33-17 ajout de proprits et mthodes 34-2434-25 avantages 33-18 contenu 33-16, 34-1, 35-5 35-6 contrles ActiveX 38-3 cration 33-16 crer 34-2134-22 dployer 34-3034-31 drecensement 33-19 enregistrer 34-29 exporter au format IDL 34-30 gnres par les experts 34-2 IDL et ODL 33-16 importer 35-235-6 inclure comme ressource 34-3034-31 navigateurs 33-18 objets Active Server 37-3 objets transactionnels 39-3 optimisation des performances 34-10 outils 33-19 ouvrir 34-22 quand les utiliser 33-17 recensement 33-19 recensement des objets 33-18 recenser 34-29 types autoriss 34-1334-15 unit _TLB 34-3, 34-22, 35-2, 35-535-6, 36-16 visualisation 33-19 bibliothques javascript 25-38, 25-4025-41 emplacement 25-40, 25-41 bin rpertoire 10-18 BinaryOp, m thode 4-33 biseaux 3-51 bitmap, objets 8-3 bitmaps 3-50, 8-198-20, 45-4 ajout aux composants 47-4 ajout du dfilement 8-18 apparition dans lapplication 8-2

association aux chanes 3-59, 7-14 barres doutils 6-52 chargement 45-5 compars aux contrles graphiques 49-3 dans les cadres 6-17 dfilement 8-18 dfinition de la taille initiale 8-18 dessin sur 8-19 destruction 8-22 vnements dessins par le propritaire 7-17 hors cran 45-645-7 internationalisation 12-11 pinceaux 8-9 proprits des pinceaux 8-8, 8-9 remplacement 8-21 ScanLine, proprit 8-10 surfaces de dessin 45-4 temporaires 8-18, 8-19 vides 8-18 BLOB 15-10, 15-11 BLOB, champs 15-2, 15-3 affichage des graphiques 15-11 affichage des valeurs de champs 15-10, 15-11 extraction la demande 24-6 BLOBS mise en cache 20-4 BlockMode, proprit 32-10, 32-11 bmBlocking 32-11 BMPDlg, unit 8-22 bmThreadBlocking 32-11 Bof, proprit 18-7, 18-8, 18-10 bote dtat des threads 9-13 botes options 3-42, 15-2, 15-13 de rfrence 15-24 dessines par le propritaire 7-13 measure-item, vnements de type 7-16 styles de variant 7-14 orientes donnes 15-12 15-15 botes options de rfrence 15-3, 15-1315-15 champs de rfrence 15-14 dans les grilles de donnes 15-24 I-5

Index

remplissage 15-24 sources de donnes secondaires 15-14 botes peindre 3-26, 3-51 botes de dialogue 52-152-6 communes 3-52 cration 52-1 dfinition de ltat initial 52-2 diteurs de proprit comme 47-10 internationalisation 12-9, 12-11 multipages 3-46 standard Windows 52-2 cration 52-2 excution 52-4 botes de dialogue communes 52-1 botes de dialogue multipages 3-46 botes de dialogue standard 3-52, 52-2 cration 52-2 excution 52-4 botes graphiques 15-2 botes groupe 3-44 botes liste 3-41, 15-2, 15-13, 50-1 dplacement des lments 7-3 dessines par le propritaire 7-13 draw-item, vnements 7-17 measure-item, vnements de type 7-16 styles de variant 7-14 glissement des lments 7-2, 7-3 orientes donnes 15-12 15-15 proprits de stockage exemple 6-10 remplissage 15-12 botes liste de cases cocher 3-41 botes liste de rfrence 15-3, 15-1315-15 champs de rfrence 15-14 sources de donnes secondaires 15-14 Bookmark, proprit 18-11 BookmarkValid, mthode 18-11 boolennes valeurs 51-4 I-6

BorderWidth, proprit 3-45 bordures volets 3-45 boucle des messages threads 9-5 boutons 3-383-40 affectation de glyphes aux 6-50 ajout aux barres doutils 6-49, 6-51, 6-52 dsactivation sur les barres doutils 6-52 et barres doutils 6-48 navigateur 15-33 boutons bitmap 3-39 boutons outil 6-52 ajout dimages 6-52 dans plusieurs lignes 6-52 dsactivation 6-52 tat initial, dfinition 6-52 forcer le passage la ligne 6-52 groupe/interrompre le groupe 6-53 obtenir de laide avec 6-55 utilisation comme bascules 6-53 boutons radio 3-40, 15-3 orients donnes 15-16 15-17 regroupement 3-44 slection 15-16 boutons souris 8-25 clic 8-26, 8-27 vnements de dplacement souris et 8-27 relchs 8-27 .BPL, fichiers 11-1, 13-3 Brush, proprit 3-51, 8-4, 8-8, 45-3 BrushCopy, mthode 45-3, 45-7 bulles daide 3-48 ButtonAutoSize, proprit 16-11 ButtonStyle, proprit grilles de donnes 15-23, 15-24, 15-25 ByteType 4-48

C
cabinets 38-18 CacheBlobs, proprit 20-4 CachedUpdates, proprit 10-33, 20-37 cadres 6-14, 6-156-18

et modles de composants 6-16, 6-17 graphiques 6-17 partage et distribution 6-18 ressources 6-17 calendriers 50-150-13 ajout de dates 50-550-10 dfinition des proprits et vnements 50-2, 50-7, 50-11 en lecture seule 51-351-4 manipulation 50-1050-13 redimensionnement 50-4 slection du jour en cours 50-10 CanBePooled, mthode 39-9 Cancel, mthode 18-21, 18-24, 21-21 Cancel, proprit 3-39 CancelBatch, mthode 10-33, 21-14, 21-16 CancelRange, mthode 18-40 CancelUpdates, mthode 10-33, 20-38, 21-14, 23-7 canevas 40-8, 45-2, 45-3 ajout de formes 8-118-12, 8-15 dessin 8-4 dessin de lignes 8-6, 8-10 8-11, 8-298-30 changement de la largeur du crayon 8-6 gestionnaires dvnements 8-27 outils de dessin par dfaut 49-5 palettes 45-545-6 prsentation 8-18-4 proprits communes, mthodes 8-4 rafrachissement de lcran 8-2 CanModify, proprit ensembles de donnes 15-6, 18-20, 18-44 grilles de donnes 15-29 requtes 20-12 Canvas, proprit 3-51, 40-8 Caption, proprit 3-21 botes groupe et groupes de boutons radio 3-44 en-ttes de colonne 15-24 entres incorrectes 6-36 grilles de dcision 16-13 libells 3-47

Guide du dveloppeur

caractre & 3-21, 6-38 caractre de fin de fichier 10-16 caractres 42-2 caractres accentus 12-10 caractres de fin de ligne 10-16 caractres tendus routines de bibliothque dexcution 4-47 caractres larges 12-4 caractres multi-octets (MBCS) 10-20, 10-25 carrs, dessin 49-9 cases cocher 3-40, 15-2 orientes donnes 15-15 15-16 cassettes vido 8-35 Cast, m thode 4-31 CastTo, mthode 4-32 CDaudio, disques 8-34 CellDrawState, fonction 16-14 CellRect, mthode 3-49 Cells, fonction 16-14 Cells, proprit 3-49 cellules de grille 3-49 CellValueArray, fonction 16-14 cercles, dessin 49-9 CGI, applications 13-12 CGI, programmes 27-5, 27-6, 27-7 chane, champs taille 19-7 chanes 4-42, 42-2, 42-8 association de graphiques 7-15 comptage de rfrences 4-45, 4-52 conversions PChar 4-52 conversions sur 2 octets 12-3 corruption de la mmoire 4-54 dclaration et initialisation 4-50 directives de compilation 4-54 fichiers 4-62 jeux de caractres tendus 4-55 longues 4-45 mlange et conversion de types 4-51 paramtres variables 4-54 position de dpart 7-10 prsentation des types 4-43 renvoi 42-9 routines

bibliothque dexcution 4-46 distinction minuscules/ majuscules 4-48 support des caractres multi-octets 4-48 taille 7-10 traduction 12-2, 12-9, 12-11 tri 12-10 tronquer 12-4 variables locales 4-52, 4-53 chanes courtes 4-44 chanes tendues 4-45 chanes longues 4-45 champ, objets 19-119-32 accs aux valeurs 19-23 19-24 dfinition 19-6 dynamiques 19-219-3 ou persistants 19-2 vnements 19-18 persistants 19-319-19 ou dynamiques 19-2 proprits 19-2, 19-1319-18 excution 19-15 partage 19-15 proprits daffichage et ddition 19-13 suppression 19-1219-13 champs 19-119-32 activation 19-19 adaptateurs Web 29-8 affectation de valeurs 18-25 affichage des listes 17-15 affichage des valeurs 15-12, 19-20 ajout aux fiches 8-288-29 bases de donnes 51-5, 51-7 cachs 24-5 colonnes persistantes et 15-20 cration 19-6 dfinition des limites de donnes 19-2419-26 enregistrements de message 46-7 extraction de donnes 19-20 formats par dfaut 19-17 lecture seule 15-6 mise jour des valeurs 15-6 modification des valeurs 15-6 options mutuellement exclusives 15-3 proprits 19-2

saisie de donnes 18-22, 19-17 types de donnes abstraites 19-2619-32 valeurs null 18-25 valeurs par dfaut 19-24 champs agrgat 19-7, 23-16 affichage 19-12 dfinition 19-12 champs BLOB obtenir les valeurs 20-4 champs boolens 15-2, 15-15 champs cachs 24-5 champs calculs 18-2618-27, 19-7 affectation de valeurs 19-9 champs de rfrence et 19-11 dfinition 19-819-10 ensembles de donnes client 23-13 champs de donnes 19-7 dfinition 19-719-8 champs de rfrence 15-14, 19-7, 19-3119-32 dans les grilles de donnes 15-24 dfinition 19-1019-11 fourniture de valeurs par programme 19-11 mise en mmoire cache des valeurs 19-11 performances 19-11 spcification 15-24 champs en lecture seule 15-6 champs mmo 15-2, 15-10 texte format 15-11 champs mmo texte formats 15-3 champs numriques formatage 19-17 champs persistants 15-18, 19-3 19-19 ADT, champs 19-28 affichage des listes 19-5, 19-6 attribution de nom 19-6 cration 19-4 cration de tables 18-45 dfinition 19-6 ensembles de donnes, champs 18-43 modification de lordre 19-6 paquets de donnes 24-5 proprits 19-1319-18 retour des champs dynamiques 19-4 I-7

Index

suppression 19-1219-13 tableau, champs 19-2919-30 types de donnes 19-7 types spciaux 19-6, 19-7 Change, mthode 51-12 ChangeBounds, proprit 10-24 ChangeCount, proprit 10-33, 20-37, 23-7 ChangedTableName, proprit 20-60 CHANGEINDEX 23-9 changement fichiers projet 2-3 ChangeScale, proprit 10-24 Char, type de donnes 4-43, 12-3 chargement graphiques 45-4 Chart FX 13-5 CHECK, contrainte 24-15 Checked, proprit 3-40 CheckSynchronize routine 9-5 chemin de recherche 10-18 chemins (URL) 27-3 Chord, mthode 8-4 cibles, listes dactions 6-20 classe de conversion 4-684-71 classe lien de donnes sur un champ 51-11 classes 4-1, 40-2, 41-1, 42-3 abstraites 40-3 accs 41-441-7, 49-6 anctre 41-341-4 par dfaut 41-4 cration 41-1 dfinition 40-12, 41-241-3 mthodes statiques et 41-8 mthodes virtuelles et 41-9 drivation de nouvelles 41-241-3, 41-9 drives 41-8 descendantes 41-341-4, 41-8, 41-9 diteurs de proprits comme 47-7 hritage 41-8 hirarchie 41-4 instanciation 41-2 par dfaut 41-4 partie protge 41-6 partie publie 41-7 partie publique 41-6 proprits comme 42-3

transmission comme paramtres 41-10 classes anctres 3-6, 3-9 classes crateur CoClasses 35-6, 35-14 classes drives 3-9 classes descendantes redfinition des mthodes 41-8, 41-9 classes distantes exceptions 31-731-8 recenser 31-5 clause uses 10-7 cl, champs 18-38 multiples 18-37, 18-38 Clear, mthode champs 19-19 listes de chanes 3-58, 3-59 ClearSelection, mthode 7-11 cls de licence 38-7 cls partielles dfinition des portes 18-38 recherche 18-34 clic, vnements 8-26, 8-27, 43-8 Click, mthode 43-2 surcharge 43-7, 50-12 client action 6-19 client, applications architecture 25-5 interfaces 32-2 multiniveaux 25-2, 25-5 simples 25-2 sockets et 32-1 utilisateur, interfaces 25-1 client, connexions 32-2, 32-3 acceptation de requtes 32-8 numros de port 32-5 ouverture 32-7 client, requtes 27-527-6 client, sockets 32-3, 32-632-7 affectation dhtes 32-4 connexion aux serveurs 32-9 demande de services 32-6 gestion dvnements 32-9 identification des serveurs 32-6 messages derreur 32-8 proprits 32-6 clients Voir applications client clients, listes dactions 6-20 Clipboard 7-10 objets graphiques 8-3 test de la prsence des images 8-24 Clipbrd, unit 7-9

clips audio 8-33 clips AVI 8-31, 8-34 clips vido 8-31, 8-33 CloneCursor, mthode 23-17 Close, mthode composants de connexion 17-4 connexions de bases de donnes 20-22 ensembles de donnes 18-5 sessions 20-20 CloseDatabase, mthode 20-22 CloseDataSets, mthode 17-14 CLSID 33-6, 33-16 fichier licence de paquet 38-8 CLX 3-1 applications 10-1 constructeurs dobjets 10-15 dploiement 13-6 et VCL 10-6 clx60.bpl 13-6 CM_EXIT, message 51-12 CMExit, mthode 51-12 CoClasses 33-6 actualiser 34-23 CLSID 33-6 composants enveloppe 35-1, 35-3 limitations 35-2 contrles ActiveX 38-5 crer 34-21, 35-6, 35-13 35-14 dclarations 35-5 diteur de bibliothques de types 34-11, 34-18, 34-25 34-26 instanciation 33-6 nom 36-3, 36-5 code 44-4 optimisation 8-16 portable 10-17 code assembleur 10-23 code indpendant de la position (PIC) 10-11, 10-23 code portable 10-19 code relogeable 10-23 code source dition 2-3 rutilisation 6-14 visualisation gestionnaires dvnements spcifiques 3-29 codes caractres sur plusieurs octets 12-3

I-8

Guide du dveloppeur

cohrence transactions 14-5 ColCount, proprit 15-33 collecteur dvnements 35-15 colonnes 3-48 tat par dfaut 15-18, 15-25 grilles de dcision 16-12 inclusion dans les tables HTML 28-21 persistantes 15-18, 15-20 15-21 cration 15-2115-25 insertion 15-22 modification de lordre 15-22 suppression 15-22 proprits 15-20, 15-23 15-24 redfinition 15-25 suppression 15-19 colonnes dynamiques 15-19 proprits 15-19 Color, proprit 3-21, 3-47, 3-51 crayons 8-6 en-ttes de colonne 15-24 grilles de dcision 16-13 grilles de donnes 15-23 pinceaux 8-8 ColorChanged, proprit 10-24 Cols, proprit 3-49 Columns, proprit 3-42, 15-21 grilles 15-18 groupes de boutons radio 3-45 ColWidths, proprit 3-49, 7-16 COM 5-15, 33-2 applications 33-19 distribues 5-15 clients 33-3, 33-10, 34-22, 35-135-18 conteneurs 33-10, 35-1 contrleurs 33-10, 35-1 experts 33-19, 36-1 extensions 33-2 comparaison des technologies 33-11 interfaces 33-3, 36-3, 36-9 Automation 36-1336-16 dcompte de rfrences 33-5 dfinition 33-3 drivation 33-4 identificateurs de rpartition 36-15 implmentation 33-6

informations de type 33-16 interfaces doubles 36-14 36-15 marshaling 33-8 modifier 36-13 optimisation 33-18 pointeur dinterface 33-5 modification des interfaces 34-2334-25 proxy 33-8 spcification 33-2 technologies 33-11 types de serveurs 33-5 COM+ 5-16, 25-7, 33-11, 33-15, 39-1, 39-1939-20 voir aussi objets transactionnels compar 39-2 crer des objets vnement 39-21 dclenchement dvnements 39-21 vnements 35-1635-17, 39-2039-21 expert objet vnement 39-2039-21 objets vnement 39-20 pointeurs dinterface 33-5 serveurs en processus 33-7 synchronisation dappel 39-1939-20 transactions 25-21 COM, bibliothque 33-2 COMCTL32.DLL 6-48 CommandCount, proprit 17-14, 21-8 commande, objets 21-1921-22 itration sur les 17-14 commandes ADO 21-8, 21-19 21-22 annulation 21-2021-21 asynchrone 21-21 excution 21-20 itration sur les 17-14 paramtres 21-2121-22 rcupration de donnes 21-21 spcification 21-1921-20 commandes, listes dactions 6-20 Commands, proprit 17-14, 21-8

CommandText, proprit 18-51, 21-17, 21-18, 21-19, 21-21, 22-7, 22-8, 23-38 CommandTimeout, proprit 21-6, 21-21 CommandType, proprit 21-17, 21-18, 21-19, 22-6, 22-7, 22-8, 23-38 Commit, mthode 17-9 CommitTrans, mthode 17-9 CommitUpdates, mthode 10-33, 20-38, 20-41 communes, botes de dialogue 52-1 communication entre niveaux 25-10 communications 32-1 protocoles 20-17, 27-3, 32-2 standards 27-3 communications business-to-business XML 30-1 commutateurs de commandes 10-16 Compare, mthode 4-35 CompareBookmarks, mthode 18-11 CompareOp, mthode 4-36 compilateur directives 10-22 compilation conditionnelle 10-20, 10-22 compilation du code 2-5 composant de bases de donnes temporaires 20-23 composant enveloppe 52-2 composant rpartiteur dadaptateur 29-4 composant texte statique 3-47 composants 3-2, 3-133-23, 41-1, 42-3 abstraits 40-3 aide la dcision 16-1 aide en ligne 47-4 ajout lunit existante 40-12 ajout la palette de composants 47-1 ajout aux units 40-12 applications Web 29-4 classes drives 40-12, 49-2 cration 40-2, 40-9 dpendances 40-6 double-clic 47-17, 47-19 47-20 gnrateurs de page 29-7 I-9

Index

gestion mmoire 3-13 initialisation 42-14, 49-7, 51-6 installation 3-34, 11-611-7, 47-21 interfaces 41-4, 41-6, 52-2 conception 41-7 excution 41-6 menus contextuels 47-17, 47-1847-19 modification 48-148-4 modifier les donnes 51-8 51-13 multiplates-formes 3-32 non visuels 3-53, 40-5, 40-13, 52-3 orients donnes 51-1 palette des bitmaps 47-4 paquets 47-21 personnalisation 40-3, 42-1 personnaliss 3-34, 6-14 prsentation 40-1 propritaire 3-13 proprits communes 3-20 3-22, 3-233-24 recensement 40-13, 47-2 redimensionnement 3-38 regroupement 3-443-46 renommer 3-83-9 rpartiteur 29-14 rpondre aux vnements 51-7 ressources, libration 52-5 scruter les donnes 51-2 51-7 standard 3-323-34 test 40-14, 40-15 tests 52-6 composants adaptateurs 29-14 composants application, applications Web 29-4 composants base de donnes 5-11, 20-1420-18 application des mises jour en m moire cache 20-40 identification des bases de donnes 20-1520-17 partags 20-18 sessions et 20-1420-15, 20-23 temporaires interruption 20-23 composants calendrier 3-44 composants connexion base de donnes I-10

dans les modules de donnes distants 25-6 implicite 20-3 DataSnap 25-5, 25-2725-35 fermeture des connexions 25-33 protocoles 25-1025-12, 25-27 composants daide la dcision 14-18, 16-1, 16-20 affectation des donnes 16-516-7 ajout 16-316-5 allocation de mmoire 16-21 options de conception 16-9 prsentation 16-116-2 composants de base de donnes 20-320-4 composants de connexion base de donnes 14-914-10, 17-117-16, 20-320-4 accs aux mtadonnes 17-14 17-16 ADO 21-321-9 dbExpress 22-322-6 excution des commandes SQL 17-1117-13, 21-6 implicite 17-2, 21-3 implicites 20-15 instructions par connexion 22-3 liaison 21-321-5, 22-3 22-6 bases de donnes BDE 20-1420-18 implicites 20-22 liaison 20-1520-17 DataSnap 14-16, 25-3 composants enveloppe contrles ActiveX 35-7, 35-935-10 initialisation 52-3 objets Automation 35-735-8 exemple 35-1035-13 objets COM 35-1, 35-2, 35-3, 35-735-13 composants menu 6-34 composants personnaliss 3-34 composants rpartiteur 29-4 adaptateurs 29-14 composants standard 3-323-34 compression des donnes TSocketConnection 25-29 comptage de rfrences

interfaces 4-254-28 objets COM 4-22 ComputerName, proprit 25-28 concepteur de liaisons de champs 18-41 concepteur de menus 3-31, 6-336-34 menu contextuel 6-42 conception applications 2-2 ConfigMode, proprit 20-29 Connected, proprit 17-3 composants de connexion 17-4 Connection, proprit 21-4, 21-11 ConnectionBroker 23-30 ConnectionName, proprit 22-5 ConnectionObject, proprit 21-5 ConnectionString, proprit 17-2, 17-5, 21-4, 21-11 ConnectionTimeout, proprit 21-6 ConnectOptions, proprit 21-5 connexion, bote de dialogue 17-5 connexion, composants DataSnap 25-26 gestion des connexions 25-32 ouverture des connexions 25-32 connexions base de donnes 17-317-6 asynchrones 21-521-6 attribution de nom 22-5 22-6 fermeture 20-22 gestion 20-22 limiter 25-9 ouverture 20-20, 20-22 persistantes 20-21 protocoles de rseaux 20-17 regroupement 25-7 temporaires 20-23 client 32-3 CORBA 25-12, 25-31 DCOM 25-10, 25-28 fermeture 25-33 HTTP 25-1125-12, 25-30

Guide du dveloppeur

ouverture 25-32, 32-7 protocoles 25-1025-12, 25-27 serveurs 20-17 serveurs de base de donnes 17-3 SOAP 25-12, 25-30 TCP/IP 25-1025-11, 25-29, 32-232-3 connexions ADO asynchrones 21-521-6 excution des commandes 21-6 connexions aux bases de donnes persistantes 20-21 connexions bloquantes 32-11 connexions non bloquantes ou 32-10 gestion dvnements 32-10 connexions dcoute 32-2, 32-3, 32-8, 32-9 numros de port 32-5 connexions de base de donnes regroupement 25-7, 39-6 connexions de bases de donnes 17-317-6 conservation 17-3 fermeture 17-4, 17-4 limiter 25-9 connexions nommes 22-522-6 affectation dun nouveau nom aux 22-6 ajout 22-6 chargement lexcution 22-5 suppression 22-6 connexions non bloquantes 32-1032-11 connexions bloquantes ou 32-10 connexions par socket 32-2 32-3 envoi/rception dinformations 32-10 fermeture 32-7 multiples 32-5 ouverture 32-8 points de terminaison 32-3 types 32-2 connexions socket extrmits 32-6 connexions Web 25-1125-12 conseils daide 3-48

conservation des annulations 21-7 conservation des validations 21-7 consistance transactions 39-10 console, applications CGI 27-7 CONSTRAINT, contrainte 24-15 ConstraintErrorMessage, proprit 19-13, 19-25, 19-26 Constraints, proprit 6-5, 23-9, 24-15 constructeur de requtes 18-51 constructeur SQL 18-51 constructeurs 3-12, 40-14, 42-13, 44-3, 50-3, 50-4, 50-5, 51-6 multiplates-formes 10-25 multiples 6-10 objets ayant un propritaire et 49-6, 49-7 surcharge 48-2 constructeurs dobjets 10-15 Contains, liste (paquets) 11-7, 11-10 Content, mthode gnrateurs de page 28-16 Content, proprit rponse Web, objets 28-13 ContentFromStream, mthode gnrateurs de page 28-16 ContentFromString, mthode gnrateurs de page 28-16 ContentStream, proprit rponse Web, objets 28-13 contextes de priphriques 8-2, 40-8, 45-1 contextes objet ASP 37-3 ContextHelp 5-33 contraintes contrles 6-46-5 donnes 19-2419-26 cration 19-2419-25 dsactivation 23-36 ensembles de donnes client 23-823-9, 23-35 23-36 importation 19-2519-26, 23-36, 24-15 contraintes de donnes Voir contraintes contrat de licence 13-17 contrle de versions 2-6

ContrleBD, page de la palette de composants 3-32, 14-17, 15-1, 15-2 contrles 3-2, 3-133-23 changement 40-3 dplacement dans les 3-21, 3-24 dessin 49-7, 49-9, 50-4 dessins par le propritaire 7-13, 7-15 dessin 7-15, 7-17 dimensionnement 7-16 vnements 7-15 styles 7-14 diteur 7-7 diteur de texte format 7-7 fentrs 40-4 forme 49-7 graphiques 40-4, 45-4 compars aux bitmaps vs. 49-3 cration 40-4, 49-3 dessin 49-3 enregistrement des ressources systme 40-4 vnements 45-7 mmo 7-7 options daffichage 3-21 orients donnes 15-115-36 palettes et 45-545-6 personnaliss 40-5 bibliothques 40-5 position 3-20 pour modifier les donnes 51-851-13 pour scruter les donnes 51-251-7 prexistants 40-5 rception de la focalisation 40-4 redessin 50-5 redimensionnement 45-7, 50-4 regroupement 3-443-46 standard affichage des donnes 15-5, 19-20, 19-2019-21 taille 3-20 contrles ActiveX 13-5, 33-10, 33-11, 33-13, 33-24, 35-10, 38-138-18 ajouter des vnements 38-938-10

Index

I-11

ajouter des mthodes 38-9 38-10 ajouter des proprits 38-9 38-10 applications Web 33-14 bibliothques de types 33-17, 38-3 bote propos 38-5 composants enveloppe 35-6, 35-7, 35-935-10 conception 38-4 crer 38-2, 38-7 crer partir dun contrle VCL 38-438-7 dbogage 38-16 dploiement Web 38-16 38-18 lments 38-338-4 expert 38-7 expert contrle ActiveX 38-438-6 gnrer 38-2 gestion des vnements 38-11 implmentation 38-3 importer 35-435-5 informations de version 38-5 interfaces 38-838-13 licence 38-5, 38-738-8 modle de thread 38-5 orients donnes 35-9, 38-8, 38-1238-13 pages de proprits 35-7, 38-4, 38-1338-15 proprits persistantes 38-13 recenser 38-1538-16 types compatibles Automation 38-4, 38-8 contrles animation 3-51, 8-31 8-33 exemple 8-32 contrles ddition 15-915-10 slection de texte 7-9, 7-10 contrles de redimensionnement 3-38 contrles de saisie 3-343-36 contrles de texte format 3-36, 15-11 proprits 3-35 contrles de texte multiligne 15-10, 15-11 contrles dessins par le propritaire 3-59 botes liste 3-42, 3-43 contrles enfant 3-21 I-12

contrles en-ttes 3-46 contrles graphiques 49-1 49-10 dessin 49-849-10 contrles haut-bas 3-37 contrles incrmenteur 3-37 contrles liste 3-413-44 contrles mmo proprits 3-35 contrles onglets 3-46 contrles orients donnes 14-17, 15-115-36, 19-20, 51-1 affichage des donnes 15-7 15-8 dans les grilles 15-18, 15-32 valeurs actuelles 15-9 affichage des graphiques 15-11 association des ensembles de donnes 15-315-4 cration 51-251-13 dsactivation de laffichage 15-7, 18-10 destruction 51-6 dition 18-20 fonctionnalits communes 15-2 grilles 15-17 insertion denregistrements 18-22 lecture seule 15-9 liste 15-215-3 modification 15-515-7 pour modifier les donnes 51-851-13 pour scruter les donnes 51-251-7 rafrachissement des donnes 15-8 rponse aux changements 51-7 reprsentation des champs 15-9 saisie de donnes 19-17 contrles pages 3-46 contrles pages, ajout de pages 3-46 contrles parent 3-21 contrles texte 3-343-36 contrleurs Automation 33-12, 35-1, 35-1335-17, 36-15 crer des objets 35-1335-14 vnements 35-1535-17

exemple 35-1035-13 interfaces de rpartition 35-1435-15 interfaces doubles 35-14 controlling Unknown 4-26, 4-28 ControlType, proprit 16-10, 16-17 convention dappel safecall 34-10 conventions dappel donnes membres 43-3 vnements 43-9 mthodes 44-2 proprits 42-6 types denregistrement de message 46-7 conversion complexe 4-67 monnaies 4-69 conversion des monnaies exemple 4-69 conversion des monnaies europennes 4-71 conversion des temps 4-66 conversions chane 4-52 PChar 4-52 valeurs des champs 19-21 19-22 conversions des euros 4-69 Convert, fonction 4-64, 4-65, 4-67, 4-68, 4-71 coordonnes position de dessin actuelle 8-26 Copier (rfrentiel dobjets) 5-23 CopyFile, fonction 4-58 CopyFrom, fonction 4-64 CopyMode, proprit 45-3 CopyRect, mthode 8-4, 45-3, 45-7 CopyToClipboard, mthode 7-10 contrles mmo orients donnes 15-10 graphiques 15-11 CORBA 4-19 applications de bases de donnes multiniveaux 25-12 connexion aux serveurs dapplications 25-31 CORBA, connexions 25-12, 25-31

Guide du dveloppeur

correspondances entre claviers 12-11 ct serveur 29-10 couleurs crayons 8-6 internationalisation et 12-10 Count, proprit listes de chanes 3-57 TSessionList 20-33 courtage de connexions 25-31 courtier dobjets 25-31 courtier de donnes 23-30, 25-1 courtiers XML 25-4225-44 crayons 8-6, 49-5 changement 49-7 couleurs 8-6 largeur 8-6 modes de dessin 8-30 obtenir leur position 8-8 paramtres par dfaut 8-6 pinceaux 8-5 position, dfinition 8-8, 8-26 style 8-7 CREATE TABLE 17-12 Create, mthode 3-12 CreateDataSet, mthode 18-46 CreateFile, fonction 4-58 CreateObject, mthode 37-3 CreateParam, mthode 23-34 CreateSharedPropertyGroup 39-7 CreateSuspended, paramtre 9-12 CreateTable, m thode 18-46 CreateWidget, proprit 10-25 cration dun module de page Web 29-24 Crer un ensemble de donnes, commande 18-46 Crer un sous-menu, commande (menu Concepteur) 6-39, 6-42 Crer une table, commande 18-46 crtl.dcu 13-7 cryptage TSocketConnection 25-29 cubes de dcision 16-7, 16-10 affichage des donnes 16-10, 16-12 DimensionMap 16-8 dimensions pagines 16-23 dimensions, ouverture/ fermeture 16-10 tat perfor 16-10 vnements 16-8

forage 16-5 gestion de la mmoire 16-9 obtention de donnes 16-5 options de conception 16-9 paramtres de dimensions 16-22 pivotement 16-5 rafrachissement 16-8 sous-totaux 16-5 Currency, proprit champs 19-13 curseurs 18-6 bidirectionnel 18-57 clonage 23-17 dplacement 18-8, 18-33, 18-34 avec des conditions 18-12 sur la dernire ligne 18-7, 18-9 sur la premire ligne 18-7, 18-10 liaison 18-41, 22-13 synchronisation 18-48 unidirectionnels 18-58 curseurs bidirectionnels 18-57 curseurs de glissement 7-2 curseurs unidirectionnels 18-58 CursorChanged, proprit 10-24 CursorType, proprit 21-14 CurValue, proprit 24-13 Custom, proprit 25-47 CustomConstraint, proprit 19-13, 19-25, 23-9 CutToClipboard, mthode 7-10 contrles mmo orients donnes 15-10 graphiques 15-11

D
Data, proprit 23-6, 23-16, 23-18, 23-41 Database, paramtre 22-4 DatabaseCount, proprit 20-24 DatabaseName, proprit 17-2, 20-3, 20-16 requtes htrognes 20-10 Databases, proprit 20-24 DataChange, mthode 51-11 DataCLX 10-6 DataField, proprit 15-12, 51-5, 51-6 botes listes de rfrence et botes options de rfrence 15-14

DataRequest, mthode 23-38, 24-4 DataSet, proprit fournisseurs 24-2 grilles de donnes 15-19 DataSetCount, proprit 17-14 DataSetField, proprit 18-43 DataSets, proprit 17-14 DataSnap, page de la palette de composants 3-33, 25-3, 25-7 DataSource, proprit botes listes de rfrence et botes options de rfrence 15-14 contrles orients donnes 51-5, 51-6 grilles de donnes 15-19 navigateurs de donnes 15-36 requtes 18-55 DataSource, proprits contrles ActiveX 35-9 DataType, proprit paramtres 18-53, 18-54, 18-61 date, champs formatage 19-17 dates composants calendrier 3-44 internationalisation 12-10 saisie 3-44 DateTimePicker, composant 3-44 DAX 33-2, 33-2333-24 Day, proprit 50-6 DB/2, pilote dploiement 13-10 dBASE, tables 20-6 ajout denregistrements 18-22, 18-23 DBChart, composant 14-18 DBCheckBox, composant 15-2, 15-1515-16 DBComboBox, composant 15-2, 15-1215-13 DBConnection, proprit 23-20 DBCtrlGrid, composant 15-3, 15-3215-33 proprits 15-33 dbDirect, page de la palette de composants 14-2 DBEdit, composant 15-2, 15-9 15-10 DBEdit, contrles 15-2 I-13

Index

multiligne 15-10 texte format 15-11 dbExpress 10-2610-32, 13-8, 14-2, 22-122-2 composants 22-122-21 dbogage 22-1922-21 dploiement 22-1 mtadonnes 22-1422-19 pilotes 22-4 dbExpress, applications 13-11 dbExpress, page de la palette de composants 3-32, 22-2 DBGrid, composant 15-2, 15-1815-32 vnements 15-31 proprits 15-23 DBGridColumns, composant 15-18 DBImage, composant 15-2, 15-11 DBListBox, composant 15-2, 15-1215-13 DBLogDlg, unit 17-5 DBLookupComboBox, composant 15-3, 15-1315-15 DBLookupListBox, composant 15-3, 15-1315-15 DBMemo, composant 15-2, 15-10 DBNavigator, composant 15-2, 15-3315-36 DBRadioGroup, composant 15-3, 15-1615-17 DBRichEdit, composant 15-3, 15-11 DBSession, proprit 20-4 DBText, composant 15-2, 15-9 dbxconnections.ini 22-5, 22-5 22-6 dbxdrivers.ini 22-4 DCOM 33-8 applications InternetExpress 25-41 applications multiniveaux 25-10 connexion au serveur dapplications 23-31, 25-28 connexions 25-10 distribution dapplications 5-15 DCOM, connexions 25-28 DCOMCnfg.exe 25-41 .DCP, fichiers 11-13 .DCR, fichiers 47-4 .DCU, fichiers 11-2, 11-13 I-14
Guide du dveloppeur

DDL 17-11, 18-50, 18-57, 20-9, 22-12 Dbogage 27-10 dbogage applications dbExpress 22-1922-21 applications serveur Web 27-7 contrles ActiveX 38-16 objets Active Server 37-9 objets COM 36-19 objets transactionnels 39-23 39-24 dbogage du code 2-5 dbogueur dapplications Web 27-8, 28-2, 29-2 dbogueur intgr 2-5 Decision Cube, page de la palette de composants 14-18, 16-1 dclarations classes 41-10, 49-6 protges 41-6 publiques 41-6 published 41-7 gestionnaires dvnements 43-6, 50-12 gestionnaires de messages 46-6, 46-8 mthodes 8-16, 44-4 dynamiques 41-10 publiques 44-3 statiques 41-8 virtuelles 41-9 nouveaux types de composants 41-3 proprits 42-3, 42-442-7, 42-8, 42-14, 49-4 stockes 42-14 types dfinis par lutilisateur 49-3 variables exemple 3-11 dclarations de type et objets 3-11 proprits 49-3 types numrs 8-13 dclencheurs 14-6 DECnet 32-1 dcompte de rfrences COM interfaces 33-5 objets COM 33-4 default directive 42-13, 48-3 mot rserv 42-8

Default, proprit lments daction 28-7 DEFAULT_ORDER 23-9 DefaultColWidth, proprit 3-49 DefaultDatabase, proprit 21-4 DefaultDrawing, proprit 15-30 DefaultExpression, proprit 19-24, 23-9 DefaultHandler, mthode 46-3 DefaultPage, proprit 29-19 DefaultRowHeight, proprit 3-49 Dfaut, case cocher 5-3 dfinition classes 41-241-3 dfinitions dindex 18-45 copie 18-46 dfinitions de champs 18-45 copie 18-46 dfinitions de types diteur de bibliothques de types 34-1134-12 dlai, vnements 9-11 DELETE, instruction 20-46, 20-49 DELETE, instructions 24-11 Delete, mthode 18-23 listes de chanes 3-58, 3-59 DeleteAlias, mthode 20-29 DeleteFile, fonction 4-56 DeleteFontResource, fonction 13-16 DeleteIndex, mthode 23-11 DeleteRecords, mthode 18-48 DeleteSQL, proprit 20-46 DeleteTable, mthode 18-47 Delphi cadre ActiveX (DAX) 33-23 33-24 cadre de travail ActiveX (DAX) 33-2 Delta, proprit 23-6, 23-24 dnomination sessions de base de donnes 28-19 $DENYPACKAGEUNIT, directive de compilation 11-11 dplacements fichiers 4-63 dploiement applications 13-1 applications CLX 13-6

applications de bases de donnes 13-7 applications gnralistes 13-1 applications MIDAS 13-11 contrles ActiveX 13-5 dbExpress 22-1 DLL, fichiers 13-6 fichiers paquet 13-3 fontes 13-15 moteur de bases de donnes Borland 13-9 Web, applications 13-11 dploiement Web contrles ActiveX 38-16 38-18 DEPLOY 13-9, 13-10, 13-16, 13-17 drfrencement de pointeurs dobjet 41-10 drivation de classes 41-241-3, 41-9 ds que possible, dsactivation 25-8 dsactivation ds-que-possible 39-5 dsancrage des contrles 7-7 DESIGNONLY, directive de compilation 11-11 dessin dimages 45-7 dessin des contrles 49-7, 49-9, 50-4 Destroy, mthode 3-12 destructeurs 3-12, 44-3, 51-6 objets ayant un propritaire et 49-6, 49-7 dtail, fiches 15-17 dtails imbriqus 18-43, 19-30 19-31, 25-22 extraction la demande 24-6 dveloppement multiplate-forme 6-19, 6-21 DeviceType proprit 8-33 .DFM, fichiers 10-2, 12-11, 42-12 gnration 12-14 fichiers .DFM 3-8 gnration 3-8 Dialogues, page de la palette de composants 3-33 dictionnaire de donnes 19-15 19-17, 20-6020-62 contraintes 24-15 dictionnaire des donnes 25-3 diffrence majuscules/ minuscules

index 23-10 DimensionMap, proprit 16-8 Dimensions, proprit 16-13 Direction, proprit paramtres 18-54, 18-61 directives 10-22 $ELSEIF 10-22 $ENDIF 10-22 $H (compilateur) 4-44, 4-54 $IF 10-22 $IFDEF 10-20 $IFEND 10-22 $IFNDEF 10-21 $LIBPREFIX, compilateur 5-10 $LIBSUFFIX, compilateur 5-10 $LIBVERSION, compilateur 5-10 $P (compilateur) 4-54 $V (compilateur) 4-55 $X (compilateur) 4-55 compilation conditionnelle 10-20 default 42-13, 48-3 du compilateur $MESSAGE 10-23 dynamic 41-10 override 41-9 protected 43-6 public 43-6 published 42-3, 43-6, 52-4 relatives aux chanes 4-54 stored 42-14 virtual 41-9 directives de compilation bibliothques 5-10 chanes 4-54 spcifiques au paquet 11-11 directives de compilation, chanes et types caractre 4-54 Directory, directive 13-12 DirtyRead 17-10 DisableCommit, mthode 39-13 DisableConstraints, mthode 23-36 DisableControls, mthode 15-7 DisabledImages, proprit 6-52 Dispatch, mthode 46-3, 46-5 dispID 33-16, 36-15 liaison 36-16 dispinterfaces 25-34, 36-13, 36-14, 36-1536-16 bibliothques de types 34-11 liaison dynamique 34-11

DisplayFormat, proprit 15-30, 19-13, 19-18 DisplayLabel, proprit 15-20, 19-13 DisplayWidth, proprit 15-19, 19-13 Dissocier attributs, commande 19-17 DLL 10-11, 10-17 HTTP, serveurs 27-5, 27-6 incorporation dans le document HTML 28-15 internationalisation 12-12, 12-14 MTS 39-2 paquets 11-1, 11-2 serveurs COM 33-7 modles de thread 36-7 DllGetClassObject 39-3 DllRegisterServer 39-3 DML 17-11, 18-50, 18-57, 20-9 .DMT, fichiers 6-43, 6-44 document actif 35-17 Document Object Model Voir DOM DocumentElement, proprit 30-4 documents Active 33-11, 33-15 documents HTML ActiveForms 38-6 applications InternetExpress 25-39 ASP 37-1 bases de donnes et 28-18 contrles ActiveX 38-1 ensembles de donnes 28-21 feuilles de style 25-46 gnrateurs de page 28-14 28-18 gnrateurs de table 28-20 28-22 incorporation de tables 28-21 modles 25-45, 25-4725-48, 28-1528-16 documents XML 26-1, 30-1 30-9 composants 30-330-4, 30-9 conversion en paquets de donnes 26-126-9 gnrer les interfaces 30-6 nud racine 30-4, 30-7, 30-9 nuds 30-2, 30-430-6 attributs 26-6, 30-5 enfants 30-530-6
Index

I-15

fichiers de transformation 26-1 mappage vers des champs 26-2 proprits 30-6 valeurs 30-5 publication dinformations de base de donnes 26-10 DoExit, mthode 51-13 DOM 30-2, 30-230-3 implmentations 30-2 utilisation 30-3 domaines dappellation interfaces invocables 31-5 donnes Voir aussi enregistrements accs 51-1 affichage 19-20, 19-2019-21 dans les grilles 15-18, 15-32 dsactivation de laffichage 15-7 valeurs actuelles 15-9 affichage seulement 15-9 analyse 14-18, 16-2 tablissement de rapports 14-18 formats, internationalisation 12-10 impression 14-18 modification 18-2018-26 reprsentation graphique 14-18 saisie de 18-22 synchronisation des fiches 15-4 valeurs par dfaut 15-12, 19-24 donnes membres 3-2 donnes membres classe 49-4 dclaration 49-6 donnes membres de classe nommer 43-3 double-clics composants 47-17 rponse aux 47-1947-20 Down, proprit 3-39 turboboutons 6-50 .DPK, fichiers 11-2, 11-7 .DPL, fichiers 11-2, 11-13 DragCursor, proprit 3-21 DragMode, proprit 3-21, 7-1 grilles 15-23 Draw, mthode 8-4, 45-3, 45-7 DrawShape 8-16 I-16

drintf, unit 20-61 DriverName, proprit 20-15, 22-4 DropConnections, mthode 20-15, 20-23 DropDownCount, proprit 3-42, 15-13 DropDownMenu, proprit 6-55 DropDownRows, proprit botes options de rfrence 15-15 grilles de donnes 15-23, 15-25 DTD, fichier 30-2 durabilit transactions 14-5, 39-10 dynamic, directives 41-10 dynamiques, champs 19-219-3

E
E/S de fichier types 4-59 EAbort 4-17 EBX registre 10-24 cran rafrachissement 8-2 rsolution 13-13 programmation 13-13, 13-14 criture des paramtres de proprit 42-7, 47-9 Edit, contrle 3-34 Edit, m thode 18-20, 47-10, 47-12 diteur daction ajout dactions 28-5 changement dactions 28-6 diteur de bibliothque de types serveurs dapplications 25-19 diteur de bibliothques types numrs 34-11 diteur de bibliothques de types 34-234-30 34-17 actualiser 34-29 ajout dalias 34-2634-27 ajout denregistrements et dunions 34-27 ajout de CoClasses 34-25 34-26 ajout de modules 34-27 ajout de proprits et mthodes 34-2434-25

ajout de types numrs 34-26 ajouter des interfaces 34-23 alias 34-11, 34-19 attributs de liaison 38-12 barre dtat 34-6 barre doutils 34-434-6 CoClasses 34-11, 34-18 composants 34-334-9 dfinitions de types 34-11 34-12 dispinterfaces 34-11 lments 34-934-12 caractristiques communes 34-934-10 enregistrement et recensement des informations de type 34-2834-30 enregistrements 34-20 enregistrements et unions 34-1134-12 interfaces 34-1034-11 interfaces de rpartition 34-18 messages derreur 34-6, 34-9 modification des interfaces 34-2334-25 modules 34-12, 34-21 ouverture de bibliothques 34-22 page COM+ 39-5 page Texte 34-9, 34-24 pages dinformations de type 34-634-9 alias 34-7 bibliothques de types 34-7 champs 34-8 CoClasses 34-7 constantes 34-8 dispinterfaces 34-7 enregistrements 34-8 numrations 34-7 interfaces 34-7 mthodes 34-8 modules 34-8 proprits 34-8 unions 34-8 Pascal Objet ou IDL 34-13, 34-1534-21 slectionner des lments 34-6 syntaxe 34-13, 34-1534-21 types num rs 34-19

Guide du dveloppeur

unions 34-20 volet liste des objets 34-6 diteur de chane de connexion 21-4 diteur de champs 5-21, 19-4 application dattributs de champ 19-16 barre de titre 19-5 boutons de navigation 19-5 cration de champs persistants 19-4 dfinition densembles dattributs 19-15 liste de champs 19-5 modification de lordre des colonnes 15-23 suppression densembles dattributs 19-16 suppression de champs persistants 19-12 diteur de code 2-4 affichage 47-19 gestionnaire dvnement 3-29 ouverture des paquets 11-9 prsentation 2-4 diteur de collection de paquets 11-14 diteur de collection de paramtres 18-53, 18-60 diteur de colonnes cration de colonnes persistantes 15-21 modification de lordre des colonnes 15-22 suppression de colonnes 15-22 diteur de CommandText 18-52 diteur de connexion 22-522-6 diteur de cube de dcision 16-816-9 contrle de la mmoire 16-9 paramtres de dimensions 16-8 diteur de fichiers dindex 20-7 Editeur de liaisons de donnes de contrle ActiveX 35-9 diteur de liste dactions 6-20 diteur de liste de chanes affichage 15-12 diteur de masque de saisie 19-17 diteur de pages Web 25-45 25-46

diteur de proprits de bases de donnes 20-16 affichage des paramtres de connexion 20-17 diteur de requte de dcision 16-6 diteur de texte format, contrles 3-34 proprits 3-35 diteur du gestionnaire dactions 6-21, 6-22, 6-24 diteur SQL de mise jour 20-4720-48 page Options 20-47 page SQL 20-48 diteurs de composants 47-17 47-21 par dfaut 47-17 recensement 47-20 diteurs de proprits 3-27, 42-3, 47-7 attributs 47-11 botes de dialogue comme 47-10 comme classes drives 47-7 recensement 47-1347-14 EditFormat, proprit 15-30, 19-13, 19-18 dition code 2-3 dition de masque, contrles 3-34 EditKey, mthode 18-32, 18-35 EditMask, proprit 19-17 champs 19-13 EditRangeEnd, mthode 18-39 EditRangeStart, mthode 18-39 lments action rpartiteurs Web 29-18 lments daction 28-3, 28-4, 28-628-9 activation et dsactivation 28-7 ajout 28-5 chanage 28-9 gnrateurs de page et 28-16 gestionnaires dvnements 28-4 par dfaut 28-6, 28-7 prcaution de changement 28-3 slection 28-6, 28-7 lments de menu 6-366-38 ajout 6-36, 6-46 dfinition 6-33

dfinition des proprits 6-41 dplacement 6-39 emplacements 6-42 imbrication 6-38 lettres soulignes 6-38 lignes de sparation 6-37 modification 6-41 noms 6-36, 6-45 regroupement 6-37 slection 7-11 suppression 6-37, 6-42 lments Web proprits 25-4625-47 Ellipse, mthode 8-5, 8-11, 45-3 ellipses dessin 8-11, 49-9 $ELSEIF directive 10-22 Embed , balise HTML (<EMBED>) 28-15 EmptyDataSet, mthode 18-48, 23-32 EmptyStr, variable 4-50 EmptyTable, mthode 18-47 EnableCommit, mthode 39-13 EnableConstraints, mthode 23-36 EnableControls, mthode 15-7 Enabled, proprit contrles orients donnes 15-8 lments daction 28-7 menus 6-46, 7-11 sources de donnes 15-4, 15-6 turboboutons 6-50 EnabledChanged, proprit 10-24 encapsulation 3-6 EndRead, mthode 9-9 EndWrite, mthode 9-9 enregistrement graphiques 45-4 Enregistrement de modle, bote de dialogue 6-45 enregistrements adaptateurs Web 29-9 affichage 15-32 ajout 18-2118-23, 18-25 oprations groupes 20-57 ajout la fin 18-23 ajouts oprations groupes 20-9 compars aux objets 3-5 copie I-17

Index

oprations groupes 20-9, 20-58 critres de recherche 18-12, 18-13 dplacement dans les 15-33, 18-618-10, 18-19 diteur de bibliothques de types 34-1134-12, 34-20, 34-27 filtrage 18-1418-18 itration dans les 18-9 lecture 22-9, 23-3123-32 asynchrone 21-13 marquage 18-1118-12 mise jour 18-2518-26, 24-924-13 partir de documents XML 26-1126-12 ensembles de donnes client 23-2423-29 filtrage des mises jour 24-12 identification des tables 24-13 multiples 24-7 oprations groupes 20-9, 20-57 paquets delta 24-9, 24-10 requtes et 20-12 rafrachissement 15-8, 23-3623-37 recherche 18-1218-14, 18-3218-35 rgularisation des mises jour 23-27 ritration de recherches 18-35 suppression 18-23, 18-47 18-48 oprations groupes 20-9, 20-58 synchronisation de lenregistrement en cours 18-48 tri 18-3018-32 validation 15-7, 18-24 la fermeture des ensembles de donnes 18-24 grilles de donnes 15-30 Enregistrer attributs, commande 19-15 Enregistrer comme modle, commande (menu Concepteur) 6-42, 6-45 I-18
Guide du dveloppeur

ensemble de donnes BDE 20-220-3 ensemble de donnes BDE support de base de donnes locale 20-620-8 types 20-2 ensembles 42-2 ensembles donglets 3-46 ensembles de donnes 14-8, 18-118-64 ADO 21-1021-19 ajout denregistrements 18-21 18-23, 18-25 annulation des modifications 18-2418-25 BDE 20-220-14 catgories 18-2718-29 champs 18-2 composants daide la dcision 16-516-7 cration 18-4418-47 curseurs 18-6 documents HTML 28-21 dition 18-2018-21 tats 18-318-4 fermeture 18-5 sans dconnexion 17-13 validation des enregistrements 18-24 filtrage denregistrements 18-14 18-18 fournisseurs 24-2 itration sur les 17-14 lecture seule mise jour 20-12 ligne en cours 18-6 marquage denregistrements 18-11 18-12 modes 18-318-4 modification de donnes 18-2018-26 navigation dans les 15-33, 18-618-10, 18-19 non indexs 18-25 ouverture 18-5 personnaliss 18-3 procdures stockes 18-28, 18-5818-64 recherche 18-1218-14 cls partielles 18-34 colonnes multiples 18-13, 18-14

extension dune recherche 18-35 utilisation dindex 18-13, 18-14, 18-3218-35 requtes 18-27, 18-4918-58 suppression denregistrements 18-23 tables 18-27, 18-2918-48 unidirectionnels 22-122-21 validation des enregistrements 18-24 ensembles de donnes ADO excution des commandes 21-22 lecture asynchrone 21-13 mises jour groupes 21-13 21-16 recherches indexes 18-32 ensembles de donnes BDE 18-2, 20-220-14 application des mises jour en mmoire cache 20-41 bases de donnes 20-320-4 composants daide la dcision 16-5 copie 20-58 oprations groupes 20-55 20-60 sessions 20-320-4 ensembles de donnes client 23-123-42, 25-3 annulation des modifications 23-6 application des mises jour 23-2423-25 applications base de fichiers 23-3923-42 avec ensembles de donnes unidirectionnels 22-12 champs calculs 23-13 chargement de fichiers 23-40 connexion aux autres ensembles de donnes 14-1214-16, 23-2923-38 contraintes 23-823-9, 23-3523-36 dsactivation 23-36 copie des donnes 23-16 23-18 cration de tables 23-39 23-40 dploiement 13-7 dition 23-6

enregistrement des modifications 23-7 filtrage denregistrements 23-3 23-6 fournisseurs et 23-2923-38 fourniture de requtes 23-3823-39 fusion des donnes 23-17 fusion des modifications 23-41 index 23-923-12 ajout 23-10 limitation des enregistrements 23-34 23-35 mise jour des enregistrements 23-24 23-29 navigation 23-2 paramtres 23-3223-35 partage de donnes 23-17 permutation dindex 23-11 rafrachissement des enregistrements 23-36 23-37 recherches indexes 18-32 regroupement de donnes 23-1123-12 rsolution des erreurs de mise jour 23-25, 23-27 23-29 sauvegarde des fichiers 23-4123-42 spcification de fournisseurs 23-3023-31 suppression dindex 23-11 synthse des donnes 23-13 23-16 types 23-2123-22 ensembles de donnes daide la dcision 16-516-7 ensembles de donnes de type procdure stocke Voir procdures stockes ensembles de donnes de type requte Voir requtes ensembles de donnes de type table Voir tables ensembles de donnes destination, dfinition 20-56 ensembles de donnes en lecture seule

mise jour 14-12 ensembles de donnes non indexs 18-22, 18-25 ensembles de donnes source, dfinition 20-56 ensembles de donnes unidirectionnels 22-122-21 connexion aux serveurs 22-3 excution des commandes 22-1022-12 liaison 22-622-9 limites 22-1 modification de donnes 22-12 prparation 22-922-10 rcupration de mtadonnes 22-1422-19 rcupration des donnes 22-9 types 22-222-3 ensembles de donnes, champs 19-26, 19-3019-31 affichage 15-28 persistants 18-43 en-ttes de message (HTTP) 27-3, 27-4 de rponse 28-13 de requte 28-9 HTTP, requtes 27-4 en-ttes de colonne 3-46, 15-20, 15-24 entre, paramtres 18-59 entre/sortie, paramtres 18-60 enveloppes 40-5, 52-2 initialisation 52-3 enveloppes de composant 40-5 environnement de traduction intgr 12-14 EOF, marqueur 4-63 Eof, proprit 18-7, 18-8, 18-9 EPasswordInvalid 4-19 EReadError 4-62 ERemotableException 31-8 erreurs adaptateurs Web 29-9 override, directive et 41-9 erreurs de compilation override, directive et 41-9 erreurs de mise jour messages de rponse 25-44 rsolution 23-25, 23-27 23-29, 24-10, 24-13 ErrorAddr, variable 4-18 vnement, objets 9-10

vnements 3-283-31, 10-24, 40-7, 43-143-10 accs 43-6 aide sur 47-4 association des gestionnaires 3-29 attente d 9-10 champ, objets 19-18 clic 43-1, 43-2 COM 36-11, 36-13 COM+ 35-1635-17, 39-20 39-21 connexion 17-5 connexions ADO 21-821-9 contrles graphiques 45-7 contrles orients donnes activation 15-8 contrleurs Automation 35-11, 35-15 35-17 courtiers XML 25-44 dfinition de nouveaux 43-743-10 dlai 9-11 et objets 3-11 gestion des messages 46-3, 46-6 gestionnaires par dfaut 43-10 grilles de dcision 16-14 grilles de donnes 15-31 15-32 hrits 43-5 implmentation 43-2 interfaces 36-12 multiplates-formes 10-25 niveau application 6-4 nommer 43-9 objets Automation 36-5 objets COM 36-1136-13 composants enveloppe 35-3 par dfaut 3-29 partags 3-30 rcuprer 43-3 rpondre aux 51-7 signalement 9-10 sources de donnes 15-5 souris glisser-dplacer 7-17-4 systme 3-4 types 3-3 utilisateur 3-4 vnements clavier 43-4, 43-10 internationalisation 12-9 I-19

Index

vnements de connexion 17-5 vnements souris 8-258-27, 49-2 dfinis 8-25 informations dtat 8-25 paramtres 8-25 test 8-28 vnements standard 43-543-7 vnements, renommer par erreur 34-29 EventFilter 6-6, 46-5 volutivit 14-13 EWriteError 4-62 Exception 4-18 exceptions 4-54-18, 10-17, 44-2, 46-3, 52-5 classes 4-14 composant 4-15 dclenchement 4-18 dfinies par lutilisateur 4-17 gestion 4-6 imbriques 4-7 instances 4-12 interfaces COM 34-10 redclenchement 4-14 rponse aux 4-5 RTL 4-9, 4-10 silencieuses 4-17 threads 9-6 Voir aussi gestion des exceptions Exclusive, proprit 20-6 ExecProc, mthode 18-63, 22-11 ExecSQL, mthode 18-56, 18-57, 22-11 objets mise jour 20-53 Execute, mthode 52-4 commandes ADO 21-20, 21-22 composants de connexion 17-1117-12 dialogues 3-52 ensembles de donnes client 23-33, 24-4 fournisseurs 24-4 TBatchMove 20-59 threads 9-4 ExecuteOptions, proprit 21-13 ExecuteTarget, mthode 6-32 exemple "techniques de dessin" 8-258-30 Exemples, page de la palette de composants 3-33, 3-34 Expandable, proprit 15-27 Expanded, proprit I-20

colonnes 15-26, 15-27 grilles de donnes 15-23 expert ActiveForms 38-638-7 expert console 5-4 expert liaison de donnes XML 30-630-9 expert objet Active Server 37-2 37-3 experts 5-22 applications WebSnap 29-1 29-28 bibliothques de types 34-2134-22 COM 36-1 composant 40-10 contrles ActiveX 38-438-6, 38-7 expert console 5-4 liaison de donnes XML 30-630-9 Module de donnes CORBA 25-1825-19 Module de donnes distant 25-1525-16 Module de donnes MTS 25-1625-17 Module de donnes SOAP 25-1725-18 objet COM 33-21 objets Automation 36-436-9 objets COM 34-21, 36-2 36-4, 36-9 objets transactionnels 39-17 39-20 pages de proprits 38-13 Ressource DLL 12-11 services Web 31-3 explorateur de bases de donnes 20-16, 20-62 explorateur MTS 39-25 explorateur SQL 20-62, 25-3 dfinition des ensembles de donnes 19-16 Expression, proprit 23-14 ExprText, proprit 19-12 Extensible Markup Language Voir XML extraction la demande 23-32 extrmits connexions socket 32-6

F
fabricants 29-6 fabricants de classes 33-6, 36-2, 36-4

facteur de conversion 4-69 familles de conversion 4-65 exemple de cration 4-65 familles de conversion, recensement 4-66 FastNet, page de la palette de composants 3-33 fentre classe 40-5 contrles 40-4 gestion de message 50-4 handles 40-4, 40-6 fentres redimensionnement 3-38 FetchAll, m thode 10-33, 20-38 FetchBlobs, mthode 23-32, 24-4 FetchDetails, mthode 23-32, 24-4 FetchOnDemand, proprit 23-32 FetchParams, mthode 23-33, 24-4 feuilles de style 25-46 fiche principale 6-1 fiches 2-2, 3-25 accs depuis dautres fiches 3-10 affichage 6-7 ajout aux projets 3-9, 6-16-2 ajout de champs aux 8-28 8-29 ajout de rfrences dunit 6-2 comme types dobjets 3-6 3-8 cration lors de lexcution 6-7 dtail 15-17 en composants 52-1 fichiers 10-2 gestion mmoire 6-7 instanciation 3-6 liaison 6-2 modales 6-6 navigation entre les contrles 3-21, 3-24 non modales 6-6, 6-8 partager des gestionnaires dvnements 8-16 principales 6-1 proprits de requte exemple 6-10 rcupration des donnes depuis 6-106-13 rfrencement 6-2

Guide du dveloppeur

synchronisation des donnes 15-4 tables matre-dtail 15-17 transmission darguments aux 6-96-10 utilisation des variables locales pour crer 6-8 variable globale pour 6-7 fiches actives applications multiniveaux 25-37 en tant quapplication Web de base de donnes 25-38 ou InternetExpress 25-36 fiches HTML HTML fiches 25-45 fiches matre-dtail 15-17 exemple 18-4118-42 fichier dindex 20-7 fichier dindex MDX 20-7 fichier LIC 38-7 fichier LPK 38-8 fichier paquet licence 38-8 fichiers 4-554-64 chanes 4-62 copie 4-58 copie doctets depuis 4-64 dplacements 4-63 criture vers 4-61 envoi par le Web 28-13 graphiques 8-208-22, 45-4 handles 4-58, 4-59, 4-61 lecture depuis 4-61 manipulation 4-554-64 modes 4-61 position 4-63 recherche 4-56 renommer 4-58 ressource 6-476-48 routines API Windows 4-59 bibliothque dexcution 4-55 routines date-heure 4-58 suppression 4-56 taille 4-63 types E/S 4-59 sans type 4-59 texte 4-59 typs 4-59 types incompatibles 4-59 Voir aussi flux de fichier fichiers .TLB 34-30

fichiers ADTG 21-16 fichiers CAB 38-18 fichiers de collection de paquets 11-14 fichiers de configuration 10-17 fichiers de contrle de rseau 20-27 fichiers de traitement par lots 10-16 fichiers de transformation 26-1 26-7 nuds dfinis par lutilisateur 26-6, 26-826-9 TXMLTransform 26-7 TXMLTransformClient 26-10 TXMLTransformProvider 26-9 fichiers du projet distribution 2-6 fichiers excutables 10-17 internationalisation 12-12, 12-14 serveurs COM 33-7 modles de thread 36-7 fichiers fiche 3-17, 10-2, 12-14 fichiers IDL crer 34-30 fichiers ini 10-9 fichiers objet partag 10-11, 10-17 fichiers palette des bitmaps 47-4 fichiers paquet 13-3 fichiers projet changement 2-3 fichiers ressource chargement 6-47 fichiers ressources et bibliothques de types 33-18 fichiers source changement 2-3 paquets 11-2, 11-7, 11-9, 11-13 fichiers XML 21-16 FieldByName, mthode 18-37, 19-24 FieldCount, proprit champs persistants 15-20 FieldDefs, proprit 18-45 FieldKind, proprit 19-13 FieldName, proprit 19-6, 19-13, 25-46 champs persistants 15-20 grilles de dcision 16-13 grilles de donnes 15-24

Fields, proprit 19-23 FieldValues, proprit 19-23 FileAge, fonction 4-58 FileExists, fonction 4-56 FileGetDate, fonction 4-58 FileName, proprit ensembles de donnes client 14-11, 23-40, 23-42 FileSetDate, fonction 4-58 FillRect, m thode 8-5, 45-3 Filter, proprit 18-15, 18-16 18-17 Filtered, proprit 18-15 FilterGroup, proprit 21-14, 21-15 FilterOnBookmarks, mthode 21-12 FilterOptions, proprit 18-18 filtres 18-1418-18 activation/ dsactivation 18-15 champs vierges 18-16 comparaison de chanes 18-18 dfinition 18-1518-18 dfinition lexcution 18-18 distinction majuscules/ minuscules 18-18 ensembles de donnes client 23-323-5 utilisation de paramtres 23-3423-35 oprateurs 18-17 options des champs texte 18-18 portes ou 18-35 requtes et 18-15 utilisation de signets 21-12 21-13 filtres de donnes 18-1418-18 activation/ dsactivation 18-15 champs vierges 18-16 dfinition 18-1518-18 dfinition lexcution 18-18 ensembles de donnes client 23-323-5 oprateurs 18-17 requtes et 18-15 utilisation de signets 21-12 21-13 finally, mot rserv 45-7, 52-5 FindClose, procdure 4-56 FindDatabase, mthode 20-23 FindFirst, fonction 4-56 I-21

Index

FindFirst, mthode 18-19 FindKey, mthode 18-32, 18-34 EditKey ou 18-35 FindLast, mthode 18-19 FindNearest, mthode 18-32, 18-34 FindNext, fonction 4-56 FindNext, mthode 18-19 FindPrior, mthode 18-19 FindResourceHInstance, fonction 12-13 FindSession, mthode 20-33 First Impression 13-5 First, mthode 18-7 FixedColor, proprit 3-49 FixedCols, proprit 3-49 FixedOrder, proprit 3-41, 6-54 FixedRows, proprit 3-49 FixedSize, proprit 3-41 FlipChildren, mthode 12-8 FloodFill, mthode 8-5, 45-3 flux 3-63 flux de fichier 4-604-64 cration 4-60 E/S de fichier 4-604-64 exceptions 4-62 fin de marqueur 4-63 flux de composant 4-60 modification de la taille 4-63 obtenir un handle 4-58 ouverture 4-60 portables 4-59 TMemoryStream 4-60 focalisation 3-19, 40-4 champs 19-19 dplacement 3-37 focalisation dentre champs 19-19 focalisation de saisie 40-4 FocusControl, mthode 19-19 FocusControl, proprit 3-47 fonctionnalits Windows non portables 10-10 fonctions 40-7 API Windows 40-4 vnements et 43-3 graphiques 45-1 lecture des proprits 47-9, 47-11 nommer 44-2 proprits de lecture 42-6 Windows API 45-1 fonctions membres 3-3

Font, proprit 3-21, 3-35, 3-47, 8-4, 45-3 contrles mmo orients donnes 15-10 en-ttes de colonne 15-24 grilles de donnes 15-24 FontChanged, proprit 10-24 fontes 13-15 hauteur de 8-5 Footer, proprit 28-21 FOREIGN KEY, contrainte 24-15 Format, proprit 16-13 formatage des donnes applications internationales 12-10 formats personnaliss 19-18 formats de donnes par dfaut 19-17 personnalisation 19-18 formats montaires 12-10 formes 3-51, 8-118-12, 8-15 dessin 8-11, 8-15 pourtour 8-6 remplissage 8-8, 8-9 remplissage avec la proprit bitmap 8-9 formes gomtriques dessin 49-9 Formula One 13-5 Found, proprit 18-19 fournisseurs 24-124-16 application des mises jour 24-5, 24-924-13 filtrage des mises jour 24-12 association des documents XML 24-3 association des ensembles de donnes 24-2 association avec des documents XML 26-9 contraintes de donnes 24-15 distants 23-30, 24-3, 25-6, 25-7 ensembles de donnes client et 23-2923-38 vnements du client 24-14 externes 14-13, 23-22, 23-29, 24-2 fourniture de donnes des documents XML 26-10 26-12 gestion des erreurs 24-13 internes 23-22, 23-29, 24-2

locaux 23-30, 24-3 utilisation dobjet de mise jour 20-12 XML 26-926-10 fournisseurs densembles de donnes 14-14 fournisseurs de ressources 39-6 ADO 39-6 BDE 39-6 fourniture 24-1, 25-4 FrameRect, mthode 8-5 FReadOnly 51-9 Free, mthode 3-12, 10-15 FreeBookmark, mthode 18-11 FromCommon 4-69

G
$G, directive de compilation 11-11, 11-13 GDI, applications 40-8, 45-1 gnrateurs de contenu 28-4, 28-14 gestion dvnements 28-16, 28-17, 28-18 gnrateurs de page 28-14 28-18, 29-6, 29-9 chanage 28-17 composants 29-7 conversion de modles 28-16 gestion dvnements 28-16, 28-17, 28-18 modles 29-7 HTML 29-9 orients donnes 28-19 types 29-3 gnrateurs de page ensemble de donnes 28-19 conversion de valeurs de champ 28-20 gnrateurs de table 28-20 28-22 dfinition de proprits 28-20 gestion de la mmoire composants de dcision 16-9 gestion des exceptions 4-54-18 blocs de protection de ressources 4-8 cration dun gestionnaire 4-11 dclaration de lobjet 4-18 excution du code de nettoyage 4-5 flux de contrle 4-6 gestionnaires par dfaut 4-13

I-22

Guide du dveloppeur

instructions 4-11 porte 4-13 prsentation 4-54-18 protection des allocations de ressources 4-7 protection des blocs de code 4-5 TApplication 4-16 Voir aussi exceptions gestion mmoire composants 3-13 fiches 6-7 interfaces 4-27 objets COM 4-22 gestionnaire dactions 6-18, 6-19, 6-20, 6-21, 6-24 gestionnaire daide 5-25, 5-26 5-35 gestionnaire de composants COM+ 39-25 gestionnaire de projet 6-2 gestionnaire de proprits partages 39-7 exemple 39-739-8 gestionnaires dvnements 3-8, 3-283-31, 10-24, 40-7, 51-7 affichage de lditeur de code 47-19 association des vnements 3-29 contrles dessins par le propritaire 7-15 dclarations 43-6, 50-12 dfinition 3-28 dessin de lignes 8-27 criture 3-9, 3-28, 3-29 menus 3-31, 7-12 comme modles 6-45 mthodes 43-3, 43-5, 43-6 surcharge 43-6 paramtres 43-3, 43-8, 43-9, 43-10 notification dvnements 43-8 partage 8-16 partags 3-293-31 pointeurs 43-3, 43-9 rechercher 3-29 redfinir 43-10 rponse aux clics de bouton 8-14 Sender, paramtre 3-30 suppression 3-31 transmission de paramtres par rfrence 43-10

types 43-3 GetAliasDriverName, mthode 20-30 GetAliasNames, mthode 20-30 GetAliasParams, mthode 20-30 GetAttributes, mthode 47-11 GetBookmark, mthode 18-11 GetConfigParams, mthode 20-30 GetData, mthode champs 19-20 GetDatabaseNames, mthode 20-30 GetDriverNames, mthode 20-30 GetDriverParams, mthode 20-30 GetFieldByName, mthode 28-10 GetFieldNames, mthode 17-15, 20-30 GetFloatValue, mthode 47-9 GetGroupState, mthode 23-12 GetHandle 5-28 GetHelpFile 5-28 GetHelpStrings 5-28 GetIDsOfNames, mthode 36-15 GetIndexNames, mthode 17-16, 18-30 GetMethodValue, mthode 47-9 GetNextPacket, mthode 10-33, 20-38, 23-31, 23-32, 24-4 GetOptionalParam, mthode 23-18, 24-7 GetOrdValue, mthode 47-9 GetPalette, mthode 45-5, 45-6 GetParams, mthode 24-4 GetPassword, mthode 20-26 GetProcedureNames, mthode 17-15 GetProcedureParams, mthode 17-16 GetProperties, mthode 47-12 GetRecords, mthode 24-4, 24-8 GetSessionNames, mthode 20-33 GetStoredProcNames, mthode 20-30 GetStrValue, mthode 47-9 GetTableNames, mthode 17-15, 20-30 GetValue, mthode 47-9 GetVersionEx, fonction 13-16 GetViewerName 5-27

GetXML, mthode 26-11 glisser-ancrer 3-22, 3-24, 7-4 7-7 glisser-dplacer 3-21, 7-17-4 DLL 7-4 vnements 49-2 obtention dinformations dtat 7-4 personnalisation 7-3 pointeur de la souris 7-4 Global Offset Table (GOT) 10-23 Glyph, proprit 3-39, 6-50 GNU assembleur 10-20 utilitaire make 10-17 GotoBookmark, mthode 18-11 GotoCurrent, m thode 18-48 GotoKey, mthode 18-32, 18-33 GotoNearest, mthode 18-33, 18-34 Graph Custom Control 13-5 graphes de dcision 16-14 16-20 changement du type de graphe 16-18 comportements lexcution 16-21 cration 16-14 dfinition des sries de donnes 16-1916-20 tats de pivotement 16-10 tats en cours des pivots 16-10 modles 16-18 options daffichage 16-16 personnalisation 16-1716-19 prsentation 16-15 Graphic, proprit 8-19, 8-22, 45-4 graphiques 45-145-8 affichage 3-50 ajout au document HTML 28-15 ajout de contrles 8-18 association aux chanes 3-59 changement des images 8-21 chargement 8-20, 45-4, 45-5 coller 8-24 complexes 45-6 conteneurs 45-4 contrles dessins par le propritaire 7-13 copie 8-23 dans les cadres 6-17 dessin 8-4 I-23

Index

dessin de lignes 8-108-11, 8-298-30 gestionnaires dvnements 8-27 enregistrement 8-21 exemple "techniques de dessin" 8-258-30 fichiers 8-208-22 fonctions, appel 45-1 formats de fichiers 8-3 indpendants 45-3 des priphriques 45-1 internationalisation 12-10 lignes dessin changement de la largeur du crayon 8-6 lignes dessines 8-6 mthodes 45-3, 45-4, 45-7 copie dimages 45-7 palettes 45-5 outils de dessin 45-2, 45-8, 49-5 changement 49-7 prsentation 45-1 prsentation de la programmation 8-18-4 redessiner les images 45-7 redimensionnement 8-21, 15-11, 45-7 remplacement 8-21 stockage 45-4 suppression 8-23 types dobjets 8-38-4 graphiques dfilables 8-18 graphiques, objets threads 9-5 GridLineWidth, proprit 3-49 grilles 3-483-49, 15-3, 50-1, 50-2, 50-5, 50-12 affichage des donnes 15-18, 15-19, 15-32 ajout de donnes 18-22 dessin 15-30 tat par dfaut 15-18 restauration 15-25 insertion de colonnes 15-21 modification de donnes 15-7, 15-2915-30 modification de lordre des colonnes 15-22 obtention de valeurs 15-20 options lexcution 15-28 15-29

orientes donnes 15-17, 15-32 personnalisation 15-1915-25 suppression de colonnes 15-19, 15-22 grilles de chanes 3-49 grilles de couleurs 8-6 grilles de dcision 16-11 affichage des donnes 16-13 comportements lexcution 16-21 cration 16-11 tats de pivotement 16-10 tats en cours des pivots 16-10 vnements 16-14 modification de lordre des colonnes/lignes 16-12 prsentation 16-12 proprits 16-13 grilles de donnes 15-2, 15-3, 15-17, 15-1815-32 affichage des donnes 15-18, 15-19, 15-32 ADT, champs 15-26 tableau, champs 15-26 dessin 15-30 tat par dfaut 15-18 restauration 15-25 vnements 15-3115-32 insertion de colonnes 15-21 modification de donnes 15-7, 15-2915-30 modification de lordre des colonnes 15-22 obtention de valeurs 15-20 options lexcution 15-28 15-29 personnalisation 15-1915-25 proprits 15-33 suppression de colonnes 15-19, 15-22 grilles dessines 3-48 grilles tabulaires 15-32 groupe de turboboutons ajout aux barres doutils 6-49 regroupement 6-50 Grouped, proprit boutons outil 6-53 groupes de discussion 1-3 groupes de proprits partages 39-7 groupes radio 3-44 GroupIndex, proprit 3-39 menus 6-46

turboboutons 6-50 GroupLayout, proprit 16-11 Groups, proprit 16-11 GUID 4-23, 33-4, 34-9 gnration 4-24

H
$H, directive de compilation 4-44, 4-54 Handle, proprit 4-61, 10-25, 32-7, 40-4, 40-6, 45-3 contexte de priphrique 8-2 HandleException 4-16 HandleException, mthode 46-3 handles connexions par socket 32-7 modules ressource 12-13 HandleShared, proprit 20-18 HandlesTarget, mthode 6-32 HasConstraints, proprit 19-14 HasFormat, mthode 7-11, 8-24 Header, proprit 28-21 Height, proprit 3-20, 3-24, 6-4 botes liste 15-13 TScreen 13-14 HelpContext 5-32, 5-33 HelpContext, proprit 3-48 HelpFile 5-33 HelpFile, proprit 3-48 HelpIntfs.pas 5-26 HelpKeyword 5-32, 5-33 HelpSystem 5-32, 5-33 HelpType 5-32, 5-33 hritage 3-6, 3-9 hritage de classe 3-93-13, 41-8 hrites proprits 49-2, 50-2 H riter (rfrentiel dobjets) 5-23 heure internationalisation 12-10 heure, champs formatage 19-17 heures saisie 3-44 hirarchie (classes) 41-4 Hint, proprit 3-48 Hints, proprit 15-36 HorzScrollBar 3-36 Host, proprit client, sockets 32-6 TSocketConnection 25-29 HostName, proprit TCorbaConnection 25-31 htes 25-29, 32-4

I-24

Guide du dveloppeur

adresses 32-4 URL 27-3 HotImages, proprit 6-52 HotKey, proprit 3-37 HTML modles par dfaut 25-45, 25-47 HTML, commandes 28-15 gnration 28-16 informations de base de donnes 28-19 HTML, documents 27-5 gnrateurs de page ensemble de donnes 28-19 HTTP, messages de rponse 27-6 HTML, modles gnrateurs de page WebSnap 29-9 HTML, tables 28-15, 28-21 cration 28-2028-22 dfinition des proprits 28-20 lgendes 28-21 HTMLDoc, proprit 25-45, 28-16 HTMLFile, proprit 28-16 HTTP 27-3 applications multiniveaux 25-1125-12 code de statut 28-12 connexion au serveur dapplications 25-30 en-ttes de message 27-3 en-ttes de rponse 28-13, 37-6 en-ttes de requte 27-4, 28-9, 37-5 prsentation 27-427-6 SOAP 31-1 HTTP, messages de rponse Voir messages de rponse HTTP, messages de requte Voir messages de requte httpd.conf 13-12 httpsrvr.dll 25-11, 25-15, 25-30 HyperHelp, visualiseur 5-25

I
IApplicationObject, interface 37-4 IAppServer, interface 23-37, 23-39, 24-324-4, 25-625-10 appel 25-33 extension 25-19

fournisseurs distants 24-3 fournisseurs locaux 24-3 informations dtat 25-23 transactions 25-21 XML, courtiers 25-39 icon objets graphiques 8-4 icne 6-23 icnes 3-50, 45-4 barres doutils 6-52 vues arborescentes 3-43 IConnectionPoint, interface 36-13 IConnectionPointContainer, interface 36-13 ICustomHelpViewer 5-25, 5-26, 5-27, 5-28 implmentation 5-26 ID de contexte 5-29 IDataIntercept, interface 25-29 IDefaultPageFileName 29-7 identificateurs donnes membres de classe 43-3 vnements 43-9 incorrects 6-36 mthodes 44-2 paramtres de proprit 42-6 types denregistrement de message 46-7 idogrammes 12-3 abrviations et 12-10 caractres 12-4 IDispatch, interface 33-9, 33-20, 36-13, 36-1536-16 automation 33-13 identificateurs 36-16 IDL (Interface Definition Language) 33-16, 33-19, 34-1 diteur de bibliothques de types 34-9 IDL, compilateur 33-19 IDOMImplementation 30-3 IETF, protocoles et standards 27-3 IExtendedHelpViewer 5-26, 5-29 $IFDEF, directive 10-20 $IFEND, directive 10-22 $IFNDEF, directive 10-21 IGetDefaultAction 29-8 IGetProducerComponent 29-7 IGetScriptObject 29-6 IGetWebAppComponents 29-8 IGetWebAppServices 29-8

IHelpManager 5-26, 5-33 IHelpSelector 5-26, 5-30 IHelpSystem 5-26, 5-33, 5-34 IID 33-4 IInterface, interface 4-22, 4-26, 4-27 implmente dans TInterfacedObject 4-22 IInvokable 4-29, 31-4 IIS 37-1 version 37-3 IIteratorObjectSupport 29-6 Image, balise HTML (<IMG>) 28-15 ImageIndex, proprit 6-52, 6-54 ImageList 6-22 ImageMap , balise HTML (<MAP>) 28-15 images 3-50, 8-18, 15-2, 45-3, 45-345-6 affichage 3-50 ajout 8-18 ajout aux menus 6-40 boutons outil 6-52 changement 8-21 chargement 8-20 contrles 8-17 pour 8-2 dans les cadres 6-17 dfilement 8-18 dessin 45-7, 49-8 effacement 8-23 enregistrement 8-21 internationalisation 12-10 pinceaux 8-9 r-affichage 8-3 remplacement 8-21 renforcement du contrle des 7-14 Images, proprit boutons outil 6-52 IMalloc, interface 4-19 IMarshal, interface 36-16, 36-18 IME 12-9 ImeMode, proprit 12-9 ImeName, proprit 12-9 implmentation dvnements 43-2 implements, mot cl 4-24, 4-25 $IMPLICITBUILD, directive de compilation 11-11 importateur de services Web 31-10

Index

I-25

Importation dActiveX, commande 35-2 Importation de bibliothque de types, commande 35-2 ImportedConstraint, proprit 19-14, 19-25 $IMPORTEDDATA, directive de compilation 11-11 Importer un contrle ActiveX, commande 35-4 Importer une bibliothque de types, commande 35-3 impression 3-61 Increment, proprit 3-37 Indent, proprit 3-43, 6-50, 6-52, 6-54 index 18-3018-43, 42-9 actions groupes 20-57, 20-58 affichage des listes 17-16, 18-30 ensembles de donnes client 23-923-12 portes 18-35 recherche sur des cls partielles 18-34 regroupement de donnes 23-1123-12 relations matre/dtail 18-41 spcification 18-3118-32 suppression 23-11 tables dBASE 20-720-8 tri denregistrements 18-30 18-32 tri des enregistrements 23-9 index NDX 20-7 index primaires actions groupes 20-57, 20-58 index, mot rserv 50-7 Index, proprit champs 19-14 IndexDefs, proprit 18-45 IndexFieldCount, proprit 18-31 IndexFieldNames, proprit 18-32, 22-8 IndexName et 18-32 IndexFields, proprit 18-31 IndexFiles, proprit 20-7 IndexName, proprit 20-7, 22-8, 23-11 IndexFieldNames et 18-32 IndexOf, mthode 3-57, 3-58 indicateurs 51-4 I-26

Indy Clients, page de la palette de composants 3-33 Indy Divers, page de la palette de composants 3-34 Indy - Serveurs, page de la palette de composants 3-34 INFINITE, constante 9-11 information dtat gestion 39-6 proprits partages 39-7 transactions 39-12 information de types lexcution 41-7 informations dtat 3-47 communication 25-2325-24 communiquer 24-9 vnements souris 8-25 informations de connexion spcification 17-5 informations de schma 22-14 22-19 champs 22-1722-18 index 22-18 procdures stockes 22-16 22-17, 22-19 tables 22-16 informations de type 33-16 aide 34-9 importer 35-235-6 informations de types dispinterfaces 36-14 interface IDispatch 36-15 informations de version informations de type 34-9 informatique nomade 14-17 Informix, pilotes dploiement 13-10 INI, fichiers Win-CGI, programmes 27-7 initialisation composants 42-14, 49-7 mthodes 42-14 threads 9-3 InitWidget, proprit 10-25 INotifyWebActivate 29-6 Insrer depuis le modle, commande (menu Concepteur) 6-42, 6-43 Insrer depuis une ressource, commande (menu Concepteur) 6-42, 6-47 Insrer le code de support dvnement, option 36-11 Insrer, commande (menu Concepteur) 6-42

INSERT 17-13 INSERT, instruction 20-46, 20-50 INSERT, instructions 24-11 Insert, mthode 18-21, 18-22 Append et 18-22 chanes 3-58 menus 6-46 Insertion de modle, bote de dialogue 6-44 Insertion depuis une ressource, bote de dialogue 6-47 InsertObject, mthode 3-59 InsertRecord, mthode 18-25 InsertSQL, proprit 20-46 inspecteur dobjets 3-8, 3-27, 42-2, 47-7 aide sur 47-4 modification des proprits de tableau 42-3 slection des menus 6-43 Installer les objets COM+, commande de menu 39-24 Installer les objets MTS commande de menu 39-24 InstallShield Express 2-6, 13-1 dploiement applications 13-2 BDE 13-9 paquets 13-3 SQL Links 13-10 instanciation modules de donnes CORBA 25-18 modules de donnes distants 25-16 instructions daffectation 42-2 instructions SQL ensembles de donnes daide la dcision 16-5 ensembles de donnes de dcision et 16-6 fournies par le client 23-38, 24-7 fournies par le fournisseur 24-13 gnration fournisseurs 24-4, 24-11 24-12 TSQLDataSet 22-9 objets mise jour 20-46 20-51 paramtres 17-12 SQL transparent 20-35

Guide du dveloppeur

IntegralHeight, proprit 3-42, 15-13 intgrit des donnes 14-6, 24-15 intgrit rfrentielle 14-6 InterBase Express dploiement 13-7 InterBase, page de la palette de composants 3-33, 14-2 InterBase, pilote dploiement 13-10 InterBaseExpress 10-28 intercepteurs 33-5 interface de document multiple 5-15-3 interface de document unique 5-15-3 Interface Definition Language (IDL) 33-19, 34-1 interface, mot cl 4-19 interfaces 4-194-29, 34-17, 41-4, 41-6, 52-2, 52-3 agrgation 4-24, 4-25 ajouter des mthodes 36-11 ajouter des proprits 36-10 applications distribues 4-28 Automation 36-1336-16 bibliothques de types 35-6, 36-10 bibliothques de types et 33-12 caractristiques du langage 4-19 CLSID 4-28 code exemple 4-20, 4-24, 4-26 COM 4-28, 5-15, 33-1, 33-3, 34-1034-11, 35-1, 36-3, 36-936-16 dclarations 35-6 vnements 36-12 composants 4-27 comptage de rfrences 4-22, 4-23, 4-254-28 conception 41-7 controlling Unknown 4-26, 4-28 CORBA 4-28 Ctrl+Maj+G 4-24 de rpartition 36-13, 36-15 36-16 compatibilit de type 36-17 dlgation 4-24 drivation 4-22

destruction dobjets 4-26 DII (Dynamic Invocation Interface) 4-29 DOM 30-2 doubles 36-1436-15 compatibilit de type 36-17 paramtres 36-18 diteur de bibliothques de types 34-1034-11, 34-17, 36-10 lments de programme non visuels 40-5 en sortie 36-12, 36-13 excution 41-6 extension du modle dhritage simple 4-19, 4-20 gestion de la dure de vie 4-22, 4-26 gestion mmoire 4-23, 4-26 IID 4-23, 4-28 IInterface, implmentation 4-22 implmentation 33-6 implmenter 36-3 internationalisation 12-9, 12-11, 12-14 interrogation dynamique 4-22 invocables 4-29, 31-2, 31-4 31-5 liaison anticipe 25-34 liaison dynamique 4-23, 34-11 liaison tardive 25-33 liaisons dynamiques 36-13 marshaling 4-29 modules de donnes Web 29-6 modules de page Web 29-7 nuds XML 30-5 objets vnement COM+ 39-21 objets externes 4-25 objets internes 4-25 oprateur as 4-23 optimisation du code 4-27 partage entre les classes 4-20 personnalises 36-16 polymorphisme 4-20 prsentation 4-194-29 procdures 4-21 proprits 42-11 proprits, dclaration 52-3 rutilisation du code 4-24

serveurs dapplications 25-1925-21, 25-33 services Web 31-1 SOAP 4-28 systme daide 5-26 TComponent 4-27 utilisation 4-194-29 interfaces COM exceptions 34-10 interfaces de rpartition appels de mthodes 35-14 35-15 bibliothques de types 34-11 diteur de bibliothques de types 34-18 interfaces de types 33-18 interfaces doubles appels de mthodes 35-14 MTS 39-17 objets Active Server 37-3 optimisation 33-18 interfaces du composant cration 52-3 proprits, dclaration 52-3 interfaces et WebSnap 29-6, 29-7 interfaces invocables 4-29, 31-2, 31-431-5 appeler 31-1031-11 dfinition 31-2 domaine dappellation 31-5 implmenter 31-631-7 recenser 31-4 URI 31-10 interfaces utilisateur 3-25, 14-1714-18 disposition 6-46-5 fiches 6-16-2 organisation des donnes 15-815-9, 15-17 InternalCalc, champs 19-7, 23-13 index et 23-11 internationalisation des applications 12-1 Internet serveurs 27-127-10 Internet Engineering Task Force 27-3 Internet Information Server (IIS) 37-1 version 37-3 Internet, page de la palette de composants 3-33 I-27

Index

Internet, standards et protocoles 27-3 InternetExpress 5-14, 25-38 25-48 ou fiches actives 25-3625-37 InternetExpress, page de la palette de composants 3-33 intranets noms dhte 32-4 InTransaction, proprit 17-8 Invalidate, mthode 49-9 Invoke, mthode 36-15 IObjectContext, interface 33-15, 37-3, 39-4, 39-5 arrter une transaction 39-12 IObjectControl, interface 33-15, 39-2 IOleClientSite, interface 35-17 IOleDocumentSite, interface 35-17 IP, adresses 32-4, 32-6 htes 32-4 noms dhte 32-4 IPageResult 29-8 IPaint, interface 4-20 IPersist, interface 4-19 IProducerEditorViewSupport 2 9-7 IProvideClassInfo, interface bibliothques de types 33-17 IProviderSupport, interface 24-2 IPX/SPX, protocoles 32-1 IRequest, interface 37-5 IResponse, interface 37-5 IRotate, interface 4-21 is, mot rserv 3-11 ISAPI, applications 27-7 dboguer 27-9 messages de requte 28-3 ISAPI, DLL 13-11 IsCallerInRole 39-16 IsCallerInRole, mthode 25-7 IScriptingContext, interface 37-3 ISecurityProperty, interface 39-16 IServer, interface 37-7 ISessionObject, interface 37-6 ISetWebContentOptions 29-7 isolation transactions 14-5, 39-10 ISpecialWinHelpViewer 5-26 IsSecurityEnabled 39-16 IsValidChar, mthode 19-20 ItemHeight, proprit 3-42 botes options 15-13 I-28

botes liste 15-13 ItemIndex, proprit 3-41 groupes de boutons radio 3-45 Items, proprit botes liste 3-41 contrles radio 15-16 groupes de boutons radio 3-44 ITypeComp 33-18 ITypeComp, interface 33-18 ITypeInfo 33-18 ITypeInfo, interface 33-18 ITypeInfo2 33-18 ITypeLib 33-18 ITypeLib, interface 33-18 ITypeLib2 33-18 IUnknown, interface 4-28, 33-3, 33-4, 33-19 contrleurs Automation 36-15 IVarStreamable 4-384-39 IWebVariablesContainer 29-6 IXMLNode 30-430-6, 30-7

KeyExclusive, proprit 18-34, 18-39 KeyField, proprit 15-14 KeyFieldCount, proprit 18-34 KeyViolTableName, proprit 20-60 KeywordHelp 5-33 Kind, proprit boutons bitmap 3-39 Kylix 10-1

L
label 40-4 langage de dfinition de donnes 17-11, 18-50, 22-12 langage de manipulation de donnes 17-11, 18-50 Last, mthode 18-7 Layout, proprit 3-39 -LEchemin, directive de compilation 11-13 lecteurs de cassettes audio-numriques 8-34 lecteurs multimdia 3-26, 8-33 8-35 exemple 8-35 lecture des paramtres de proprit 47-9 lecture incrmentale 23-31, 25-23 lecture seule proprits 41-6 Left, proprit 3-20, 3-23, 3-24, 6-4 LeftCol, proprit 3-49 LeftPromotion, mthode 4-34, 4-36 Length, fonction 4-51 lettres de lecteurs 10-17 liaison anticipe 25-34 liaison de donnes 38-12 liaison de fiche 6-2 liaison de vtable liaison immdiate COM 33-17 liaison dynamique 25-33 liaison prcoce Automation 36-14 liaison statique 25-34 COM 33-17 liaison tardive 25-33 Automation 36-13, 36-15 libells 3-47, 12-10, 15-2 colonnes 15-20 libration des ressources 52-5

J
jeux de caractres 4-47, 12-2, 12-212-4 ANSI 12-3 conversions sur plusieurs octets 12-3 OEM 12-3 ordres de tri internationaux 12-10 par dfaut 12-2 sur plusieurs octets 12-3 jeux de caractres ANSI 4-43 journal de modifications 23-6, 23-24, 23-41 annulation des modifications 23-6 enregistrement des modifications 23-7 juste temps, activation 25-8

K
K, notes de bas de page (systme daide) 47-5 KeepConnection, proprit 17-4, 17-14, 20-21 KeepConnections, proprit 20-15, 20-21 KeyDown, mthode 51-10

Guide du dveloppeur

libmidas.dcu 13-7 $LIBPREFIX, directive 5-10 LibraryName, proprit 22-4 libre, modle de thread 36-8 $LIBSUFFIX, directive 5-10 $LIBVERSION, directive 5-10 licence Internet Explorer 38-8 licence dutilisation 13-17 liens de donnes 51-551-7 initialisation 51-6 liens hypertextes ajout au document HTML 28-15 liens symboliques 10-18 lignes 3-48 adaptateurs Web 29-9 dessin 8-6, 8-10, 8-108-11, 8-298-30 changement de la largeur du crayon 8-6 dessin de gestionnaires dvnements 8-27 effacement 8-30 grilles de dcision 16-12 lignes de sparation (menus) 6-37 limites des rectangles 8-11 Lines, proprit 3-35, 42-8 LineSize, proprit 3-37 LineTo, mthode 8-5, 8-8, 8-10, 45-3 Link, balise HTML (<A>) 28-15 Linux 10-1 environnement dexploitation 10-16 rpertoires 10-18 List, proprit 20-33 liste Contains (paquets) 47-21 liste Requires (paquets) 47-21 listes chanes 3-543-59 utilisation dans les threads 9-5 listes dactions 3-30, 6-19, 6-21, 6-266-56 listes de chanes 3-543-59 court terme 3-55 long terme 3-55 ajout dobjets 7-15 ajout dune chane 3-58 contrles dessins par le propritaire 7-147-15 copie 3-58 cration 3-553-56

dplacement dune chane 3-58 dessines par le propritaire 7-13 criture dans un fichier 3-54 lecture depuis un fichier 3-54 objets associs 3-59 parcourir 3-57 position 3-57 positionnement 3-58 recherche de chanes 3-57 sous-chanes 3-57 suppression dune chane 3-58 tri 3-58 listes de fichiers dplacement des lments 7-3 glissement des lments 7-2, 7-3 listes de recherche (systme daide) 47-5 listes droulantes dans les grilles de donnes 15-24 listes modifiables 10-9 ListField, proprit 15-14 ListSource, proprit 15-14 -LNchemin, directive de compilation 11-13 Loaded, mthode 42-14 LoadFromFile, mthode chanes 3-54 ensembles de donnes ADO 21-17 ensembles de donnes client 14-11, 23-40 graphiques 8-20, 45-4 LoadFromStream, mthode ensembles de donnes client 23-40 LoadParamListItems, procdure 17-16 LoadParamsFromIniFile, mthode 22-5 LoadParamsOnConnect, proprit 22-5 Local SQL 20-10 requtes htrognes 20-10 locales 12-2 formats des donnes et 12-10 modules ressource 12-11 LocalHost, proprit client, sockets 32-7 localisation 12-1, 12-14

des applications 12-2 ressources 12-11, 12-12, 12-14 LocalPort, proprit client, sockets 32-7 Locate, mthode 18-12 Lock, mthode 9-8 LockType, proprit 21-14 LogChanges, proprit 23-6, 23-41 LoginPrompt, proprit 17-5 Lookup, mthode 18-13 LookupCache, proprit 19-11 LookupDataSet, proprit 19-11, 19-14 LookupKeyFields, proprit 19-11, 19-14 LookupResultField, proprit 19-14 lParam, paramtre 46-2 LPK_TOOL.EXE 38-8 -LUpaquet, directive de compilation 11-13

M
MainMenu, composant 6-34 Man, pages 5-25 mappages XML 26-226-4 dfinition 26-4 Mappings, proprit 20-58 Margin, proprit 3-39 marshaler thread libre 36-8 marshaling 33-8 IDispatch, interface 33-13 interface IDispatch 36-16 interfaces COM 33-8, 36-4, 36-1636-18 personnalis 36-18 MasterFields, proprit 18-41, 22-13 MasterSource, proprit 18-41, 22-13 Max, proprit barres de progression 3-48 barres gradues 3-37 MaxDimensions, proprit 16-22 MaxLength, proprit 3-35 contrles mmo orients donnes 15-10 contrles orients donnes de texte format 15-11 MaxRecords, proprit 25-42 MaxRows, proprit 28-21
Index

I-29

MaxStmtsPerConn, proprit 22-3 MaxSummaries, proprit 16-22 MaxTitleRows, proprit 15-27 MaxValue, proprit 19-14 MBCS 4-47 MDAC 13-7 MDI, applications 5-15-3 cration 5-2 menus fusion 6-466-47 spcification du menu actif 6-46 Memo, contrle 3-34 mmoire composants daide la dcision 16-21 conservation 41-9 mmoire cache ressources 45-2 mmoire dynamique 3-63 mmos 42-8 Menu 6-19 Menu, proprit 6-46 menus 6-336-46 accs aux commandes 6-38 affichage 6-41, 6-42 ajout 6-356-41 dautres applications 6-47 droulants 6-386-39 ajout dimages 6-40 dplacement dlments 6-40 dplacement parmi 6-42 enregistrement comme modles 6-43, 6-446-45 gestion des vnements 3-31, 6-45 internationalisation 12-9, 12-11 modles 6-35, 6-42, 6-43 6-46 chargement 6-43 suppression 6-44 noms 6-35 rutilisation 6-42 surgissants 7-127-13 menus contextuels ajout dlments 47-1847-19 barres doutils 6-55 concepteur de menus 6-42 menus droulants 6-386-39 affichage 6-41 menus droulants et 6-38 menus, listes dactions 6-20

MergeChangeLog, mthode 23-8, 23-41 $MESSAGE, directive 10-23 message de requte HTTP 29-13 messages 10-24, 46-146-8, 50-4 clavier 51-9 dcomposeur 46-2 dfinis 46-2 dfinis par lutilisateur 46-5, 46-8 enregistrements types, dclaration 46-6 gestion 46-346-5 gestionnaires 46-1, 46-3, 50-4, 50-5 cration 46-546-8 dclarations 46-6, 46-8 par dfaut 46-3 surcharge 46-4 identificateurs 46-6 souris 51-9 Windows 6-5 messages derreur internationalisation 12-11 messages de frappes de touches 43-6 messages de rponse 28-3, 37-5 contenu 28-13, 28-1428-22 cration 28-1128-13, 28-14 28-22 envoi 28-9, 28-14 informations den-tte 28-1228-13 informations de base de donnes 28-1828-22 informations de statut 28-12 rponse aux 28-13 messages de requte 28-3, 37-5 contenu 28-11 courtier XML 25-43 lments daction 28-6 HTTP, prsentation 27-5 27-6 informations den-tte 28-9 28-11 rpartition 28-5 rponse aux 28-828-9 traitement 28-5 types 28-10 messages lis au clavier 51-9 messages souris 46-2 messages WM_PAINT 8-2 mesures conversion 4-64 mtadonnes 17-1417-16

dbExpress 22-1422-19 modification 22-1222-13 obtention auprs des fournisseurs 23-32 mtafichiers 3-50, 8-1, 8-20, 45-4 quand les utiliser 8-4 Method, proprit 28-10 mthodes 3-3, 8-16, 40-7, 44-1, 50-11 ajouter aux interfaces 36-11 appel 43-6, 44-3, 49-4 dclaration 8-16, 44-4 dynamiques 41-10 publiques 44-3 statique 41-8 virtuelles 41-9 dessin 49-8, 49-9 et objets 3-5, 3-8 gestion des messages 46-1, 46-5 gestionnaires dvnements 43-3, 43-5, 43-6 surcharge 43-6 graphiques 45-3, 45-4, 45-7 palettes 45-5, 45-6 hrites 43-6 initialisation 42-14 nommer 44-2 pointeurs 43-9 proprits et 42-542-7, 44-1, 44-2, 49-4 protges 44-3 publiques 44-3 redfinition 41-8, 41-9 rpartition 41-7 suppression 3-31 surcharge 41-9, 46-3, 50-12 virtuelles 41-8, 44-4 mthodes dynamiques 41-9 mthodes statiques 41-8 mthodes virtuelles 41-8 MethodType, proprit 28-7, 28-11 Microsoft Server DLL 27-7 Microsoft Server, DLL 27-7 messages de requte 28-3 Microsoft SQL Server, pilote dploiement, pilote 13-10 Microsoft Transaction Server 5-16, 39-1 midas.dll 23-1, 25-3 midaslib.dcu 25-3 MIDI, fichiers 8-35

I-30

Guide du dveloppeur

MIDL gnration de fichiers en-tte 33-19 gnration du code proxy/ stub 33-19 Voir aussi IDL mime 8-23 MIME, messages 27-6 Min, proprit barres de progression 3-48 barres gradues 3-37 MinSize, proprit 3-38 MinValue, proprit 19-14 mise jour des donnes 25-43 25-44 mise jour des enregistrements 25-4325-44 mises jour en cache 23-18 23-29 ensembles de donnes client 23-19, 23-2423-29 application des mises jour 23-2423-25 erreurs de mise jour 23-2723-29 objets mise jour 23-22 prsentation 23-2023-21 relations matre/dtail 23-22 mises jour en cascade 24-7 mises jour en mmoire cache BDE 20-3720-55 application 20-3920-43 tables multiples 20-46, 20-51 gestion derreur 20-43 20-45 ensembles de donnes clients application tables multiples 20-46, 20-51 mises jour groupes 21-13 21-16 annulation 21-16 application 21-1521-16 mises jour places en mmoire cache ADO 21-1321-16 annulation 21-16 application 21-1521-16 ensembles de donnes client 14-1214-16 erreurs de mise jour 24-13 transactions 17-7 fournisseurs 24-924-10

MM, film 8-34 modales, fiches 6-6 mode ddition 18-20 annulation 18-21 Mode, proprit 20-57 crayons 8-6 modle "briefcase" 14-17 modle "dconnect" 14-17 modle de thread 39-18 apartment 36-9 contrles ActiveX 38-5 libre 36-8 modles 5-22, 5-24 applications serveur agent Web 28-3 composant 6-14 gnrateurs 29-7 gnrateurs de page 29-7 graphes de dcision 16-18 menus 6-35, 6-42, 6-436-46 chargement 6-43 programmation 5-3 modles de code 5-3 modles de composants 6-14, 41-2 et cadres 6-16, 6-17 modles de projet 5-24 modles de thread 36-636-9 objets COM 36-3, 36-5 registres 36-7 modles HTML 25-4725-48 modles threading modules de donnes CORBA 25-19 modules de donnes distants 25-15 modules de donnes MTS 25-16 modes de dessin 8-30 Modification de graphe, bote de dialogue 16-18 modification des proprits tableau 42-3 modification du code 2-4 modification en mmoire cache BDE appliquer 20-12 mise jour densembles en lecture seule 20-12 ensembles de donnes clients appliquer 20-12 mise jour densembles en lecture seule 20-12 Modified, m thode 51-12 Modified, proprit 3-35

Modifiers, proprit 3-37 ModifyAlias, mthode 20-29 ModifySQL, proprit 20-46 module base de donnes 20-63 Module de donnes CORBA, expert 25-1825-19 Module de donnes distant, expert 25-15, 25-1525-16 Module de donnes MTS, expert 25-1625-17 Module de donnes SOAP, expert 25-1725-18 modules 40-12 diteur de bibliothques de types 34-12, 34-21, 34-27 modules dapplication Web interfaces interfaces modules Web 29-8 modules de donnes 14-7, 25-6, 29-6 accs depuis des fiches 5-21 applications serveur agent Web 28-4 applications Web et 28-2, 28-3 composants base de donnes 20-18 cration 5-17 distant ou standard 5-17 distants Voir modules de donnes distants modification 5-17 sessions 20-20 Web 29-3, 29-5 modules de donnes CORBA instanciation 25-18 modles threading 25-19 modules de donnes distants 5-21, 25-3, 25-6, 25-13, 25-1525-19 enfant 25-25 instanciation 25-16 modle threading 25-16 modles threading 25-15 multiples 25-2425-25, 25-3525-36 parent 25-25 regroupement 25-9 sans tat 25-8, 25-9, 25-23 25-24 modules de donnes MTS attributs de transaction 25-17 modles threading 25-16

Index

I-31

modules de donnes transactionnels 25-6 connexions de base de donnes 25-6 regroupement 25-7 connexions de bases de donnes 25-9 interface 25-20 scurit 25-10 modules de donnes Web 29-5 interfaces 29-6 structure 29-6 modules de fusion 13-4 modules de page 29-3, 29-7 Web 29-6 modules de page Web 29-3, 29-6 interfaces 29-7 modules ressource 12-11, 12-12 modules Web 28-228-3, 28-4, 29-529-8 types 29-5 mois, renvoyer actuel 50-8 Moniteur SQL 20-62 monnaie internationalisation 12-10 Month, proprit 50-6 MonthCalendar, composant 3-44 moteur de bases de donnes Borland 5-11, 14-1, 18-2, 20-1 dploiement 13-9, 13-17 mises jour en mmoire cache 20-3720-55 rcupration des donnes 18-56, 20-2, 20-3 Web, applications 13-11 moteurs de bases de donnes tiers 13-8 motifs 8-9 de remplissage 8-8 motifs de remplissage 8-9 mots cls 47-5 protected 43-6 mots de passe connexions implicites et 20-15 tables dBASE 20-2420-27 tables Paradox 20-2420-27 MouseDown, mthode 51-9 MouseToCell, mthode 3-49 .MOV, fichiers 8-34 Move, mthode listes de chanes 3-58, 3-59 MoveBy, mthode 18-8 I-32

MoveCount, proprit 20-59 MoveFile, fonction 4-58 MovePt 8-30 MoveTo, mthode 8-5, 8-8, 45-3 moyennes cubes de dcision 16-5 .MPG, fichiers 8-34 MTS 5-16, 25-7, 33-11, 33-15, 39-1 voir aussi objets transactionnels applications de bases de donnes multiniveaux 25-725-9 compar COM+ 39-2 contraintes 39-3 environnement dexcution 39-2 libration des ressources 39-8 rfrences dobjets 39-21 39-23 serveurs en processus 39-2 transactions 25-21 multibarres 6-48, 6-53 multimdia 8-35 multiniveaux architecture base sur le Web 25-36 architecture des applications 25-5, 25-6 multiniveaux, applications 25-125-48 Multi-niveaux, page (Nouveaux lments, bote de dialogue) 25-3 multi-octets jeux de caractres 12-3 multiplates-formes cration des applications 10-1 multiplates-formes, applications 10-110-34 MultiSelect, proprit 3-42 multitche 10-18 multithread, applications 9-1 multitraitement threads 9-1 mutuellement exclusifs, options 6-50 MyBase 23-39

N
Name, proprit champs 19-14 lments de menu 3-31

paramtres 18-61 navigateur 15-2, 15-3315-36, 18-6, 18-7 activation/dsactivation des boutons 15-34, 15-35 boutons 15-34 dition 18-21 panneaux dinformations 15-36 partage entre ensembles de donnes 15-36 suppression de donnes 18-23 navigateur de base de donnes 15-2, 15-3315-36, 18-6, 18-7 activation/dsactivation des boutons 15-34, 15-35 boutons 15-34 dition 18-21 panneaux dinformations 15-36 suppression de donnes 18-23 NetCLX 5-13, 10-7 NetFileDir, proprit 20-27 Netscape Server, DLL 27-7 messages de requte 28-3 NewValue, proprit 20-44, 24-13 Next, mthode 18-8 NextRecordSet, mthode 18-64, 22-10 niveau disolement des transactions 17-1017-11 spcification 17-11 transactions locales 20-36 niveaux 25-1 niveaux de regroupement 23-12 agrgats maintenus 23-15 nom de dmarrage du service 5-8 nom de page 29-7 nombres 42-2 internationalisation 12-10 valeurs de proprit 42-13 noms dhte 32-4 adresses IP 32-5 noms de chemins 10-18 noms de connexion 22-522-6 changement 22-6 dfinition 22-6 suppression 22-6 noms de pilotes 20-15 non modales, fiches 6-6, 6-8

Guide du dveloppeur

norme UCS 10-25 NOT NULL UNIQUE, contrainte 24-15 NOT NULL, contrainte 24-15 notes de dernire minute 13-17 notification dvnements 6-5, 6-6, 43-8 notifications systme 10-24 NotifyID 5-27 Nouveau champ, bote de dialogue 19-6 dfinition de champs 19-8, 19-10, 19-12 Dfinition de la rfrence 19-7 Champ rsultat 19-11 Champs cl 19-10 Cls de rfrence 19-10 Ensemble de donnes 19-10 Proprits du champ 19-6 Type 19-7 Type de champ 19-7 Nouveau, commande 40-12 Nouveaux lments, dialogue 5-22, 5-23, 5-24 Nouvel objet thread, bote de dialogue 9-2 Nouvelle application WebSnap 29-2 NSAPI, applications 27-7 dboguer 27-9 messages de requte 28-3 NumericScale, proprit 18-54, 18-61 numros de contexte (aide) 3-48 NumGlyphs, proprit 3-39

O
Object , balise HTML (<OBJECT>) 28-15 ObjectBroker, proprit 25-28, 25-29, 25-30, 25-32 ObjectName, proprit TCorbaConnection 25-31 Objects, proprit 3-49 listes de chane 7-17 listes de chanes 3-59 ObjectView, proprit 15-26, 18-43, 19-27 objet de mise jour fournisseurs et 20-12 objet, champs 19-2619-32 types 19-26 objets 3-1, 3-53-13, 4-1

accs 3-93-10 cration 3-12 dclarations de type 3-11 dfinition 3-5 destruction 3-12 vnements et 3-8 glisser-dplacer 7-1 hritage 3-93-13 image 45-4 instances multiples 3-6 instanciation 3-6 non visuels 3-12 personnalisation 3-9 proprits 3-5 temporaires 45-7 TObject 3-15 utilitaires 3-53 Voir aussi objets COM objets abonns 35-1635-17 abonnements par utilisateur 35-17 abonnements permanents 35-17 abonnements temporaires 35-16 objets Active Server 37-137-9 crer 37-237-8 dbogage 37-9 recenser 37-837-9 serveurs en processus 37-8 serveurs hors processus 37-8 objets adapts aux threads 9-5 objets ADO 21-1 DataSpace RDS 21-19 Recordset 21-10 objets Automation 33-12 composants enveloppe 35-7 35-8 exemple 35-1035-13 experts 36-436-9 Voir aussi objets COM objets ayant un propritaire 49-549-8 initialisation 49-7 objets COM 33-3, 33-5, 33-9, 36-136-19 composants enveloppe 35-1, 35-2, 35-3, 35-735-13 conception 36-2 crer 36-136-18 dbogage 36-19 dfinition 33-3 experts 36-236-4, 36-9 gestion de la dure de vie 4-22

interfaces 36-936-16 mise jour 33-6 recenser 36-1836-19 vrification de type 33-16, 33-18 objets externes 33-9 objets internes 33-9 objets mise jour 20-45, 20-53, 23-22 excution 20-5220-54 instructions SQL 20-46 20-51 multiples 20-5120-54 paramtres 20-4820-49, 20-53, 20-5420-55 requtes 20-5420-55 objets non visuels 3-12 objets orients threads 9-5 objets partags 10-25 objets requte informations den-tte 28-4 objets sans tat 39-12 objets scriptables 29-12 objets socket Windows clients 32-6 sockets client 32-6 sockets serveur 32-7 objets temporaires 45-7 objets thread initialisation 9-3 objets transactionnels 33-11, 33-15, 39-139-25 activits 39-1939-20 administrer 33-15, 39-25 bibliothques de types 39-3 callbacks 39-23 caractristiques 39-239-3 contraintes 39-3 crer 39-1639-20 dbogage 39-2339-24 expert 39-1739-20 gestion des ressources 39-4 39-9 installer 39-2439-25 regroupement des connexions de base de donnes 39-6 scurit 39-1539-16 transactions 39-5 .OCX, fichiers 13-5 ODBC, pilotes utilisation avec ADO 21-1, 21-2, 21-3 utilisation avec le BDE 20-18

Index

I-33

ODL (Object Description Language) 33-16, 34-1 OEM, jeux de caractres 12-3 OEMConvert, proprit 3-35 OldValue, proprit 20-44, 24-13 OLE conteneurs 3-26 fusion de menus 6-46 OLE Automation voir Automation OLE DB 21-1, 21-2, 21-3 OleObject, proprit 38-14, 38-15 OLEView 33-19 OnAccept, vnement 32-8 serveur, sockets 32-10 sockets serveur 32-10 OnAction, vnement 28-8 OnAfterPivot, vnement 16-10 OnBeforePivot, vnement 16-10 OnBeginTransComplete, vnement 17-7, 21-9 OnCalcFields, vnement 18-26, 19-8, 19-9, 23-13 OnCellClick, vnement 15-31 OnChange, vnement 19-18, 45-7, 49-7, 50-12, 51-12 OnClick, vnement 3-39, 43-1, 43-3, 43-5 boutons 3-7 menus 3-31 OnClientDisconnect, vnement 32-8 OnColEnter, vnement 15-31 OnColExit, vnement 15-31 OnColumnMoved, vnement 15-23, 15-31 OnCommitTransComplete, vnement 17-9, 21-9 OnConnect, vnement client, sockets 32-9 OnConnectComplete, vnement 21-8 OnConnecting, vnement sockets serveur 32-9 OnConstrainedResize, vnement 6-5 OnCreate, vnement 40-14 OnDataChange, vnement 15-5, 51-7, 51-11 OnDataRequest, vnement 23-38, 24-4, 24-14

OnDblClick, vnement 15-31, 43-5 OnDecisionDrawCell, vnement 16-14 OnDecisionExamineCell, vnement 16-14 OnDeleteError, vnement 18-23 OnDisconnect, vnement 21-9 client, sockets 32-7 OnDragDrop, vnement 7-3, 15-31, 43-5 OnDragOver, vnement 7-2, 15-31, 43-5 OnDrawCell, vnement 3-48 OnDrawColumnCell, vnement 15-30, 15-31 OnDrawDataCell, vnement 15-31 OnDrawItem, vnement 7-17 OnEditButtonClick, vnement 15-25, 15-31 OnEditError, vnement 18-20 OnEndDrag, vnement 7-3, 15-31, 43-5 OnEndPage, m thode 37-3 OnEnter, vnement 15-31, 43-5 OnError, vnement sockets 32-9 OnExecuteComplete, vnement 21-9 OnExit, vnement 15-31, 51-13 OnFilterRecord, vnement 18-15, 18-1718-18 OnGetData, vnement 24-9 OnGetDataSetProperties, vnement 24-7 OnGetTableName, vnement 20-12, 23-26, 24-14 OnGetText, vnement 19-18 OnGetThread, vnement 32-10 onglets draw-item, vnements 7-17 styles dessins par le propritaire 7-14 OnHandleActive, vnement client, sockets 32-9 OnHTMLTag, vnement 25-48, 28-16, 28-17, 28-18 OnIdle, gestionnaire dvnement 9-5 OnInfoMessage, vnement 21-9 OnKeyDown, vnement 15-31, 43-5, 51-10

OnKeyPress, vnement 15-31, 43-5 OnKeyUp, vnement 15-31, 43-5 OnLayoutChange, vnement 16-10 OnLogin, vnement 17-5 OnMeasureItem, vnement 7-16 OnMouseDown, vnement 8-25, 8-26, 43-5, 51-9 paramtres transmis 8-25 OnMouseMove, vnement 8-25, 8-27, 43-5 paramtres transmis 8-25 OnMouseUp, vnement 8-15, 8-25, 8-27, 43-5 paramtres transmis 8-25 OnNewDimensions, vnement 16-10 OnNewRecord, vnement 18-21 OnPaint, vnement 3-51, 8-2 OnPassword, vnement 20-15, 20-26 OnPopup, vnement 7-12 OnPostError, vnement 18-24 OnReceive 32-11 OnReconcileError, vnement 10-33, 20-37, 23-25, 23-28 OnRefresh, vnement 16-8 OnRequestRecords, vnement 25-43 OnResize, vnement 8-3 OnRollbackTransComplete, vnement 17-10, 21-9 OnScroll, vnement 3-36 OnSend 32-11 OnSetText, vnement 19-18 OnStartDrag, vnement 15-31 OnStartPage, mthode 37-3 OnStartup, vnement 20-20 OnStateChange, vnement 15-5, 16-10, 18-4 OnSummaryChange, vnement 16-10 OnTerminate, vnement 9-7 OnTitleClick, vnement 15-31 OnTranslate, vnement 26-8 OnUpdateData, vnement 15-5, 24-9, 24-10

I-34

Guide du dveloppeur

OnUpdateError, vnement 10-33, 20-37, 20-4320-45, 23-27, 24-13 OnUpdateRecord, vnement 20-38, 20-42 20-43, 20-46, 20-53 OnValidate, vnement 19-18 OnWillConnect, vnement 17-6, 21-8 Open, mthode composants de connexion 17-3 ensembles de donnes 18-5 requtes 18-56 serveur, sockets 32-8 sessions 20-20 OpenDatabase, mthode 20-20, 20-22 OpenSession, mthode 20-33 OpenString 4-46 oprateurs de chane 4-55 oprations avec effet 45-7 oprations groupes 20-820-9, 20-5520-60 ajout de donnes 20-57 bases de donnes diffrentes 20-58 copie densembles de donnes 20-58 excution 20-59 gestion derreur 20-60 mappage des types de donnes 20-5820-59 mise jour de donnes 20-57 mise en place 20-5520-56 modes 20-9, 20-57 suppression denregistrements 20-58 optimisation des ressources systme 40-4 optimisation du code 8-16 interfaces 4-27 options modules dapplication Web 29-3 Options de dploiement Web, bote de dialogue 38-17 Options de page du module dapplication 29-3 options du compilateur 5-3 options du projet 5-3 par dfaut 5-3 Options du projet, bote de dialogue 5-3 Options, proprit 3-49

fournisseurs 24-624-7 grilles de dcision 16-14 grilles de donnes 15-28 TSQLClientDataSet 23-20 Oracle, pilotes dploiement 13-10 Oracle8 limites de cration des tables 18-46 ORDER BY, clause 18-30 ordre de tri 12-10 dcroissant 23-10 dfinition 18-32 ensembles de donnes client 23-9 TSQLTable 22-8 ordre des tabulations 3-24 Orientation, proprit barres gradues 3-37 grilles de donnes 15-33 Origin, proprit 8-29, 19-14 outils de conception 2-2 outils de dessin 45-2, 45-8, 49-5 affectation par dfaut 6-50 changement 8-14, 49-7 gestion de plusieurs outils dans une application 8-13 test 8-13 outils de traduction 12-1 ouverture de session connexions SOAP 25-31 Web, connexions 25-30 Overload, proprit 20-13 override, directive 41-9 Owner, proprit 3-13, 40-14 OwnerDraw proprit 7-14

P
$P, directive de compilation 4-54 PacketRecords, proprit 10-33, 20-38, 23-31 pages Active Server 37-9 documents HTML 37-1 interface utilisateur 37-1 pages de code 12-3 pages de proprits 38-15 actualiser 38-14 actualiser les contrles ActiveX 38-15 ajouter des contrles 38-14 38-15 associer aux proprits dun contrle ActiveX 38-14

contrles ActiveX 35-7, 38-4, 38-15 contrles imports 35-5 crer 38-1338-15 expert 38-13 pages Web producteur de page InternetExpress 25-44 25-48 PageSize, proprit 3-37 Paint, mthode 45-7, 49-8, 49-9 palette de composants 3-32 AccsBD, page 14-2, 25-3 ADO, page 14-2, 21-2 ajout de composants 11-6, 47-1, 47-4 BDE, page 14-1 cadres 6-16 ContrleBD, page 14-17 dbDirect, page 14-2 Decision Cube, page 14-18 InterBase, page 14-2 page AccsBD 3-32 page ActiveX 3-34 page ADO 3-33 page BDE 3-33 page ContrleBD 15-1, 15-2 page DataSnap 3-33, 25-3, 25-7 page dbExpress 3-32, 22-2 page Decision Cube 16-1 page Dialogues 3-33 page Exemples 3-33, 3-34 page FastNet 3-33 page Indy - Clients 3-33 page Indy - Divers 3-34 page Indy - Serveurs 3-34 page InterBase 3-33 page Internet 3-33 page InternetExpress 3-33 page QReport 3-33 page Serveurs 3-33, 3-34 page Standard 3-32 page Supplment 3-32 page Systme 3-32 page Win 3.1 3-33 page Win32 3-32 pages 3-32 PaletteChanged, mthode 45-6 PaletteChanged, proprit 10-24 palettes 45-545-6 comportement par dfaut 45-6 spcification 45-5 PanelHeight, proprit 15-33 I-35

Index

Panels, proprit 3-48 PanelWidth, proprit 15-33 panneaux dinformations 3-48, 15-36 PAnsiChar 4-46 PAnsiString 4-51 paquet chargement dynamique 11-4 paquets 11-111-16, 47-21 collections 11-14 compilation 11-1111-13 options 11-11 composants 47-21 conception 11-1, 11-511-7 cration 5-10, 11-711-13 dploiement dapplications 11-3, 11-14 directives de compilation 11-11 DLL 11-1, 11-2 excution 11-1, 11-311-5, 11-8 extensions de noms de fichiers 11-1 fichiers source 11-2, 11-13 installation 11-611-7 internationalisation 12-12, 12-14 liste Contains 11-7, 11-10, 47-21 liste Requires 11-7, 11-8, 11-10, 47-21 modification 11-8 options 11-8 paramtres par dfaut 11-8 personnaliss 11-5 rfrencement 11-4 rfrences dupliques 11-10 Seulement en conception, option 11-8 utilisation 5-10 utilisation dans des applications 11-311-5 paquets derreur SOAP 31-7 paquets de donnes 26-5 actualiser les enregistrements modifis 24-7 champs 24-5 conversion en documents XML 26-126-9 copie 23-1623-17 informations dfinies par lapplication 23-18, 24-7 lecture 23-3123-32, 24-8 24-9 I-36

lecture seule 24-6 limitation des modifications client 24-6 mappage vers des documents XML 26-2 modification 24-8 proprits des champs 24-7 unicit des enregistrements 24-5 XML 25-36, 25-38, 25-42 dition 25-43 lecture 25-4225-43 paquets delta 24-9, 24-10 filtrage des mises jour 24-12 modification 24-9, 24-10 24-11 XML 25-42, 25-4325-44 paquets MTS 39-7, 39-24 par dfaut classe anctre 41-4 gestionnaires message 46-3 options du projet 5-3 valeurs 15-12 valeurs de proprit 42-7 modification 48-2, 48-3 spcification 42-13 spcification des valeurs proprit par dfaut 42-13 par rfrence seulement proprits dinterface COM 34-10 Paradox, tables 20-6 ajout denregistrements 18-22, 18-23 rcupration des index 18-31 renommer 20-8 ParamBindMode, proprit 20-13 ParamByName, mthode procdures stockes 18-62 requtes 18-54 ParamCheck, proprit 18-52, 22-13 Parameters, proprit 21-22 TADOCommand 21-22 TADOQuery 18-52 TADOStoredProc 18-60 paramtrage des requtes 18-50, 18-5218-54 cration lexcution 18-54 la conception 18-53

paramtres classes comme 41-10 de courtiers XML 25-43 de proprit 42-6, 42-7 de lecture 42-6, 42-9 de tableau 42-9 criture 42-9 ensembles de donnes client 23-3223-35 filtrage denregistrements 23-34 23-35 entre 18-59 entre/sortie 18-60 vnements souris 8-25, 8-26 gestionnaires dvnements 43-3, 43-8, 43-9 HTML, balises 28-15 interfaces doubles 36-18 messages 46-2, 46-6 modes de liaison 20-13 rsultat 18-60 sortie 18-59, 23-33 TXMLTransformClient 26-10 paramtres de connexion 20-1620-17 ADO 21-4 dbExpress 22-4, 22-6 informations de connexion 17-5, 21-4 paramtres de localisation 4-48 paramtres optionnels 23-18, 24-8 ParamName, proprit 25-46 Params, proprit ensembles de donnes client 23-33, 23-34 procdures stockes 18-60 requtes 18-52, 18-54 TDatabase 20-16 TSQLConnection 22-4 XML, courtiers 25-43 ParamType, proprit 18-53, 18-61 ParamValues, proprit 18-54 Parent, proprit 40-14 ParentColumn, proprit 15-28 ParentShowHint, proprit 3-48 partage des fiches et des dialogues 5-225-25 partage des fichiers source 10-15 partie publie des classes 41-7 Pascal Objet 10-25 prsentation 3-4

Guide du dveloppeur

PasteFromClipboard, mthode 7-10 contrles mmo orients donnes 15-10 graphiques 15-11 PathInfo, proprit 28-6 .PCE, fichiers 11-14 PChar 4-46 conversions chane 4-52 PDOXUSRS.NET 20-27 Pen, proprit 8-4, 8-6, 45-3 PenPos, proprit 8-4, 8-8 PENWIN.DLL 11-12 priphriques mdia 8-33 permanence fournisseurs de ressources 39-6 permissions de fichiers 10-17 persistantes, colonnes 15-18, 15-2015-21 cration 15-2115-25 insertion 15-22 modification de lordre 15-22 suppression 15-19, 15-22 personnalisation de composants 42-1 PickList, proprit 15-24, 15-25 picture, objets 8-3 Picture, proprit 3-50, 8-18 dans les cadres 6-17 Pie, mthode 8-5 pilote de base de donnes BDE 20-3 pilotes de bases de donnes BDE 20-1, 20-15 pilotes ODBC utilisation avec le BDE 20-1, 20-17 pinceaux 8-88-10, 49-5 bitmap, proprit 8-9 changement 49-7 couleurs 8-8 styles 8-9 pivots de dcision 16-1016-11 boutons de dimension 16-11 comportement lexcution 16-20 orientation 16-11 proprits 16-11 Pixel, proprit 8-4, 45-3 pixels lecture et dfinition 8-10 Pixels, proprit 8-5, 8-10 pmCopy, constante 8-30 pmNotXor, constante 8-30

pointeur dinterface 33-5 pointeur de la souris glisser-dplacer 7-4 pointeurs classe 41-10 mthode 43-3 valeurs de proprit par dfaut 42-13 pointeurs de m thodes 43-2, 43-3, 43-9 points de suspension (...) bouton, dans les grilles 15-25 Polygon, m thode 8-5, 8-12 polygones 8-12 dessin 8-12 polylignes 8-10, 8-11 dessin 8-10 Polyline, mthode 8-5, 8-11 polymorphisme 3-2, 3-6 PopupMenu, composant 6-34 PopupMenu, proprit 7-12 Port, proprit serveur, sockets 32-7 TSocketConnection 25-29 portable code 10-19 portage dapplications 10-1 10-34 porte (objets) 3-93-10 portes 18-3518-40 annulation 18-40 application 18-40 filtres ou 18-35 index et 18-35 limites 18-38 modification 18-39 spcification 18-3618-39 valeurs null 18-37, 18-38 ports 32-5 client, sockets 32-6, 32-7 connexions multiples 32-5 serveur, sockets 32-7 services et 32-2 Position, proprit 3-37, 3-48 Post, mthode 18-24 Edit et 18-21 pourtours, dessiner 8-6 Precision, proprit champs 19-14 paramtres 18-54, 18-61 Prepared, proprit ensembles de donnes unidirectionnels 22-10 procdures stockes 18-63 requtes 18-56

Presse-papiers 7-9, 15-10 effacement de la slection 7-11 formats ajout 47-17, 47-20 graphiques et 8-228-24 objets graphiques 15-11 test du contenu 7-11 PRIMARY KEY, contrainte 24-15 Prior, mthode 18-8 priorits utilisation de threads 9-3 utilisation des threads 9-1 Priority, proprit 9-3 private 3-10 private, section 4-2 PrivateDir, proprit 20-28 ProblemCount, proprit 20-60 ProblemTableName, proprit 20-60 ProcedureName, proprit 18-59 procdures 40-7, 43-3 nommer 44-2 paramtres de proprit 47-13 procdures stockes 14-6, 18-28, 18-5818-64 affichage des listes 17-15 BDE 20-3, 20-1320-14 liaison des paramtres 20-13 cration 22-12 dbExpress 22-822-9 excution 18-63 paramtres 18-5918-62 la conception 18-60 18-62 densembles de donnes client 23-34 excution 18-62 proprits 18-6118-62 prparation 18-63 redfinies 20-13 spcification de la base de donnes 18-58 procdures stockes redfinies 20-13 processus 10-18 processus lents utilisation de threads 9-1 processus parallles threads 9-1 producteurs de page I-37

Index

orients donnes 25-44 25-48 profondeur de couleurs 13-13 programmation 13-15 programmation oriente objet 3-53-13, 41-141-10 dclarations 41-3, 41-10 classes 41-6, 41-7 mthodes 41-8, 41-9, 41-10 dfinition 3-5 hritage 3-9 programmation oriente objet (POO) 3-2 programmation, modles 5-3 programmes CGI crer 28-2, 29-2 programmes dinstallation 13-2 programmes Win-CGI crer 28-2, 29-2 projets ajout de fiches 6-16-2 Proportional, proprit 8-3 proprits 3-3, 42-142-14 accs 42-542-7 aide sur 47-4 ajouter aux interfaces 36-10 botes de dialogue standard 52-2 chargement 42-14 COM 33-3, 34-10 par rfrence seulement 34-10 comme classes 42-3 composants enveloppe 52-3 contrles ActiveX 38-13 contrles de texte format 3-35 dclaration 42-3, 42-442-7, 42-8, 42-14, 49-4 stockes 42-14 types dfinis par lutilisateur 49-3 criture seule 42-7 en lecture seule 51-3 et objets 3-5 vnements et 43-1, 43-2 grilles de dcision 16-13 hrites 42-3, 49-2, 50-2 publication 42-3 HTML, tables 28-20 initialisation 3-273-28 interfaces 42-11 lecture seule 41-6, 41-7, 42-7 mise jour 40-8 I-38

modification 47-7, 48-2, 48-3 du texte 47-9 nodefault 42-8 prsentation 40-6 prives 42-5 publication 50-2 read et write 42-5 redclaration 42-13, 43-6 sous-composants 42-9 spcification des valeurs 42-13, 47-9 stockage 42-13 stockage de donnes interne 42-4, 42-7 stockage et chargement des proprits non publies 42-1542-16 tableau 42-3, 42-8, 42-9 types 42-2, 42-9, 47-9, 49-3 valeurs par dfaut 42-7, 42-13 redfinition 48-2, 48-3 visualisation 47-9 proprits bidirectionnelles 10-10 proprits de type chane 4-45 proprits du parent 3-21 protected directive 43-6 vnements 43-6 mot cl 42-3, 43-6 protected, section 4-2 protg 3-10 protge partie des classes 41-6 protocole (Digital) 32-1 protocoles choix 25-10 composants connexion 25-1025-12 connexion, composants 25-27 connexions de rseau 20-17 Internet 27-3, 32-1 slection 25-1025-12 Provider, proprit 21-4 ProviderFlags, proprit 24-5, 24-12 ProviderName, proprit 14-14, 23-30, 24-4, 25-27, 25-42, 26-10 proxy 33-8 objets transactionnels 39-3 PString 4-51 public 3-10 directive 43-6 mot cl 43-6

proprits 42-12 public, section 4-2 publication proprits exemple 49-2, 50-2 publi 3-10 publique partie de classes 41-6 published 42-3 directive 42-3, 43-6, 52-4 mot cl 43-6 proprits 42-12, 42-13 PVCS Version Manager 2-6 PWideChar 4-46 PWideString 4-51

Q
QReport, page de la palette de composants 3-33 Qt, bibliothque 10-25 qualificateurs 3-93-10 Query, proprit objets mise jour 20-54 QueryInterface, mthode 4-22, 4-26, 4-28, 33-9 IUnknown 33-4

R
raccourcis ajout aux menus 6-38 raccourcis clavier 3-37 ajout aux menus 6-38 raise, mot rserv 4-18 rappels applications multiniveaux 25-20 limitation 25-12 rapports 14-18 .RC, fichiers 6-47 RDSConnection, proprit 21-19 Read, mthode TFileStream 4-62 read, m thode 42-6 read, mot rserv 42-9, 49-4 ReadBuffer, mthode TFileStream 4-62 ReadCommitted 17-10 README 13-16, 13-17 ReadOnly, proprit 3-35, 51-3, 51-9, 51-10 champs 19-14 contrles mmo orients donnes 15-10

Guide du dveloppeur

contrles orients donnes 15-6 contrles orients donnes de texte format 15-11 grilles de donnes 15-24, 15-30 tables 18-44 ralisation de palettes 45-5, 45-6 ReasonString, proprit 28-12 ReceiveBuf, mthode 32-8 Receiveln, mthode 32-8 recensement applications serveur 25-13 composants 40-13 diteurs de composants 47-20 diteurs de proprits 47-13 47-14 familles de conversion 4-65 objets Active Server 37-8 37-9 objets COM 36-1836-19 recensement des objets de laide 5-31 rcepteurs dvnements 36-13 recherche incrmentale 15-12 recherches indexes 18-13, 18-14, 18-3218-35 RecNo, proprit ensembles de donnes client 23-3 Reconcile, mthode 10-33, 20-38 RecordCount, proprit TBatchMove 20-59 Recordset, proprit 21-11, 21-21 RecordsetState, proprit 21-12 RecordStatus, proprit 21-14, 21-15 Rectangle, mthode 8-5, 8-11, 45-3 rectangles coins arrondis 8-12 dessin 8-11, 49-9 Rcuprer les paramtres, commande 23-33 redclaration des proprits 43-6 redfinition des mthodes 41-8, 41-9 redessin des contrles 50-5 redimensionnement de contrles graphiques 45-7

redimensionnement des contrles 13-14, 50-4 Reduced XML Data file Voir XDR, fichier rfrence, champs 19-26 affichage 15-28 rfrences fiches 6-2 paquets 11-4 rfrences circulaires 6-3 rfrences croises 16-216-3, 16-11 plusieurs dimensions 16-3 une dimension 16-3 dfinition 16-2 valeurs rcapitulatives 16-3 rfrences scurises 39-22 rfrentiel 5-225-25, 6-14 ajout dlments 5-22 utiliser des lments 5-23 5-24 rfrentiel dobjets 5-225-25, 6-14 ajout dlments 5-22 composants base de donnes 20-18 sessions 20-20 spcification dun rpertoire partag 5-23 utiliser des lments 5-23 5-24 Rfrentiel, dialogue 5-22 Refresh, m thode 15-8, 23-36 RefreshLookupList, proprit 19-11 RefreshRecord, mthode 23-37, 24-4 Register, mthode 8-3 Register, procdure 40-13, 47-2 RegisterComponents, procdure 11-6, 40-13, 47-2 RegisterConversionType, fonction 4-65, 4-66 RegisterHelpViewer 5-35 RegisterNonActiveX, procdure 38-3 RegisterPooled, procdure 25-9 RegisterPropertyEditor, procdure 47-13 RegisterTypeLib, fonction bibliothques de types 33-18 RegisterViewer, fonction 5-31 registre 10-17, 12-10 registre dinvocation 31-4, 31-7

registre des classes distantes 31-5, 31-8 registre EBX 10-11 rgles dentreprise 25-2, 25-14 rgles de gestion ASP 37-1 objets transactionnels 39-2 regroupement dobjets 39-9 modules de donnes distants 25-9 regroupement de composants 3-443-46 regroupement de ressources 39-539-8 REGSERV32.EXE 13-5 relations matre/dtail 15-17, 18-4018-43, 18-5518-56 applications multiniveaux 25-22 ensembles de donnes client 23-22 ensembles de donnes unidirectionnels 22-13 index 18-41 intgrit rfrentielle 14-6 mises jour en cascade 24-7 suppressions en cascade 24-7 tables imbriques 18-43, 25-22 Release, m thode 4-22, 4-26, 4-27 IUnknown 33-4 TCriticalSection 9-8 RemotePort, proprit client, sockets 32-6 RemoteServer, proprit 23-30, 25-27, 25-32, 25-40, 25-42, 26-10 RemoveAllPasswords, mthode 20-25 RemovePassword, mthode 20-25 RenameFile, fonction 4-58, 4-59 rpartiteur dadaptateur 29-4 rpartiteur de page 29-4 rpartiteur Web 28-2, 28-428-6 objets rpartition automatique 28-5 objets auto-rpartis 25-43 rpartiteurs de page 29-19 lments action 29-18 rpartiteurs de page 29-19 rpartiteurs Web lments action 29-18 I-39

Index

rpartition des requtes WebSnap 29-13 RepeatableRead 17-11 rpertoire initial 10-17 rpertoires Linux 10-18 rponse action 29-17 rponses actions 29-17 adaptateurs 29-16 images rponses HTTP images 29-18 rponses HTTP actions 29-17 RepositoryID, proprit 25-28 Request for Comment (RFC), documents 27-3 RequestLive, proprit 20-11 RequestRecords, mthode 25-43 requte, partie (URL) 27-3 requtes 18-27, 18-4918-58 adaptateurs 29-16 BDE 20-2, 20-920-12 ensembles de rsultats dynamiques 20-11 20-12 simultanes 20-19 curseurs bidirectionnels 18-57 curseurs unidirectionnels 18-58 ensembles de rsultats 18-57 excution 20-53 excution des instructions 18-57 filtrage et 18-15 htrognes 20-1020-11 HTML tables 28-22 images requtes HTTP images 29-17 objets mise jour 20-54 20-55 optimisation 18-56, 18-58 paramtres 18-50 paramtres 18-5218-54 densembles de donnes client 23-34 dfinition lexcution 18-54 dfinition la conception 18-53 liaison 18-52 nomms 18-52 non nomms 18-52 I-40

proprits 18-5318-54 relations matre/ dtail 18-5518-56 prparation 18-56 relations matre/ dtail 18-5518-56 rpartition 29-13 spcification 18-5018-52, 22-7 spcification de la base de donnes 18-49 Web, applications 28-22 requtes action HTML 29-16 requtes dimage 29-17 requtes de dcision dfinition 16-6 requtes htrognes 20-10 20-11 Local SQL 20-10 requtes SQL 18-5018-52 chargement depuis un fichier 18-51 copie 18-51 ensembles de rsultats 18-57 excution des instructions 18-57 modification 18-51 objets mise jour 20-53 optimisation 18-58 paramtres 18-5218-54, 20-4820-49 dfinition lexcution 18-54 dfinition la conception 18-53 liaison 18-52 relations matre/ dtail 18-5518-56 prparation 18-56 Requires, liste (paquets) 11-7, 11-8, 11-10 rseaux connexion aux bases de donnes 20-17 ResetEvent, mthode 9-10 rsolution 24-1, 25-4 ResolveToDataSet, proprit 24-5 resourcestring, mot rserv 12-11 Ressource DLL basculement dynamique 12-13 expert 12-11

ressource, fichiers 6-476-48 ressources 40-8, 45-1 chanes 12-11 isolement 12-11 libration 52-5 localisation 12-11, 12-12, 12-14 systme, conservation 40-4 systme, optimisation 40-4 ressources en mmoire cache 45-2 RestoreDefaults, mthode 15-25 Result, paramtre 46-7 rsultat HTML, vue 29-1 rsultat, paramtres 18-60 Resume, mthode 9-12 retour la ligne 7-8 retour automatique 7-8 ReturnValue, proprit 9-10 RevertRecord, mthode 10-33, 20-38, 23-7 RFC, documents 27-3 RightPromotion, m thode 4-34, 4-36 rles scurit en fonction des rles 39-15 Rollback, mthode 17-10 RollbackTrans, mthode 17-10 root rpertoire 10-18 RoundRect, mthode 8-5, 8-12 RowAttributes, proprit 28-21 RowCount, proprit 15-15, 15-33 RowHeights, proprit 3-49, 7-16 RowRequest, mthode 24-4 Rows, proprit 3-49 RowsAffected, proprit 18-57 RPC 33-9 RTL 10-7 RTTI 41-7 interfaces invocables 31-2 $RUNONLY, directive de compilation 11-11

S
SafeArray 34-14 safecall, convention dappel 38-10 SafeRef, mthode 39-22 SaveConfigFile, mthode 20-29 SavePoint, proprit 23-7 SaveToFile, mthode 8-21

Guide du dveloppeur

chanes 3-54 ensembles de donnes ADO 21-16 ensembles de donnes client 14-11, 23-41, 23-42 graphiques 45-4 SaveToStream, mthode ensembles de donnes client 23-42 ScaleBy, proprit TCustomForm 13-14 Scaled, proprit TCustomForm 13-14 ScanLine, proprit bitmap 8-10 bitmap, exemple 8-19 ScktSrvr.exe 25-10, 25-15, 25-29 SCM 5-4 Screen, variable 6-4, 12-9 scriptage 29-10 ScriptAlias, directive 13-12 scripts actifs 29-10 gnration dans WebSnap 29-11 modifier 29-11 scripts (URL) 27-3 scripts actifs 29-10 scripts ct serveur, scripts serveur 29-10 scripts de connexion 17-417-6 scripts shell 10-16 scripts Web 29-10 ScrollBars, proprit 3-49, 7-8 contrles mmo orients donnes 15-10 SDI, applications 5-15-3 sections critiques 9-8 prcaution dutilisation 9-8, 9-9 Sections, proprit 3-46 scurit applications multiniveaux 25-2 bases de donnes 14-414-5, 17-417-6 tables locales 20-2420-27 connexions SOAP 25-30 connexions Web 25-11, 25-30 DCOM 25-41 modules de donnes transactionnels 25-7, 25-10 objets transactionnels 39-15 39-16

recensement pour les connexions socket 25-10 Seek, mthode ensembles de donnes ADO 18-32 segments de ligne connects 8-10, 8-11 SELECT, instructions 18-50 SelectAll, mthode 3-36 SelectCell, mthode 50-13, 51-4 Slection de menu, bote de dialogue 6-43 Selection, proprit 3-49 Slectionner un menu, commande (menu Concepteur) 6-42 slectionneur daide 5-34 slectionneurs daide 5-31 SelectKeyword 5-30 SelEnd, proprit 3-37 Self, paramtre 40-14 SelLength, proprit 3-36, 7-10 SelStart, proprit 3-36, 3-37, 7-10 SelText, proprit 3-36, 7-10 SendBuf, mthode 32-8 Sender, paramtre 3-30 exemple 8-7 Sendln, mthode 32-8 SendStream, mthode 32-8 sensibilit la casse 10-16 sparateur de chemin de recherche 10-18 sparateurs 3-38 sparateurs de classeur 3-46 ServerGUID, proprit 25-27 ServerName, proprit 25-27 ServerType, proprit 32-10 serveur dapplications architecture 25-6 serveur, applications interfaces 32-2 services 32-1 serveur, connexions 32-2, 32-3 numros de port 32-5 serveur, sockets 32-7 acceptation de clients 32-10 acceptation de requtes client 32-7 gestion dvnements 32-9 messages derreur 32-8 spcification 32-6 serveurs 20-17 Internet 27-127-10 serveurs ActiveX

bibliothques de types 33-16 optimisation 33-18 vrification de type 33-18 serveurs Automation 33-10, 33-12 voir aussi objets COM accder aux objets 36-15 serveurs COM 33-3, 33-5, 36-1 36-19 conception 36-2 distants 33-7 en processus 33-7 hors processus 33-7 serveurs dapplications 14-16, 25-1, 25-1325-21 criture 25-14 fermeture des connexions 25-33 identification 25-27 interface 25-1925-21 interfaces 25-33 modules de donnes distants 5-21 modules de donnes multiples 25-2425-25 ouverture des connexions 25-32 rappels 25-20 recensement 25-2525-26 serveurs de base de donnes 5-11, 17-3 connexion 14-914-10 contraintes 19-24, 19-25 19-26, 24-15 description 17-3 types 14-3 serveurs de base de donnes distants 14-3 serveurs distants 20-10, 33-7 accs non autoris 17-4 maintenir les connexions 20-21 serveurs en processus 33-7 ActiveX 33-13 ASP 37-8 MTS 39-2 serveurs hors processus 33-7 ASP 37-8 serveurs SQL connexion aux 14-4 serveurs types 29-2 serveurs Web 37-7 dboguer dboguer 28-2, 29-2 types I-41

Index

types de Web 29-2 Serveurs, page de la palette de composants 3-33, 3-34 Service Control Manager 5-4 service de liste dutilisateurs 29-5 services 5-45-9 code exemple 5-5, 5-7 demande de 32-6 dsinstallation 5-4 exemple 5-7 implmentation 32-132-2, 32-7 installation 5-4 ports et 32-2 proprits de nom 5-8 rseau, serveurs 32-1 service 5-6 services de support 1-3 services Web 31-131-11 classes dimplmentation 31-6 31-7 recenser 31-7 clients 31-931-11 domaine dappellation 31-5 exceptions 31-731-8 expert 31-3 serveurs 31-231-9 conception 31-231-3 types complexes 31-531-6 Session, variable 20-4, 20-18 SessionName, proprit 20-4, 20-14, 20-32, 28-19 sessions 20-1820-34 activation 20-2020-21 applications multithreads 20-14, 20-32 20-34 bases de donnes associes 20-23 bases de donnes et 20-14 20-15 connexions aux bases de donnes implicites 20-15 cration 20-31, 20-33 dfaut 20-14, 20-1820-19 dnomination 28-19 ensemble de donnes 20-4 tat en cours 20-20 fermeture 20-20 fermeture des connexions 20-22 gestion des alias 20-28 gestion des connexions 20-22 I-42

mthodes 20-15 mots de passe 20-24 multiples 20-14, 20-31, 20-3220-34 nom 20-32 ouverture de connexions 20-22 par dfaut 20-4 proprits de la connexion par dfaut 20-21 ractivation 20-21 rcupration des informations 20-3020-31 Web, applications 28-19 Sessions variable 20-33 Sessions, proprit 20-33 Sessions, variable 20-19 SetAbort 39-8 SetAbort, mthode 39-5, 39-12 SetBrushStyle, mthode 8-9 SetComplete 39-8 SetComplete, mthode 25-20, 39-5, 39-12 SetData, mthode 19-20 SetEvent, mthode 9-10 SetFields, mthode 18-25 SetFloatValue, mthode 47-9 SetKey, mthode 18-33 EditKey ou 18-35 SetLength, procdure 4-51 SetMethodValue, mthode 47-9 SetOptionalParam, mthode 23-18 SetOrdValue, mthode 47-9 SetPenStyle, mthode 8-7 SetProvider, mthode 23-30 SetRange, mthode 18-38 SetRangeEnd, mthode 18-37 SetRange ou 18-38 SetRangeStart, mthode 18-36 SetRange ou 18-38 SetSchemaInfo, mthode 22-14 SetStrValue, mthode 47-9 SetValue, mthode 47-9 SGBD 25-1 SGBDR 14-3, 25-1 Shape, proprit 3-51 shift, tat des touches 8-25 ShortCut, proprit 6-38 ShortString 4-44 Show, mthode 6-7, 6-9 ShowAccelChar, proprit 3-47 ShowButtons, proprit 3-43 ShowFocus, proprit 15-33 ShowHint, proprit 3-48, 15-36

ShowHintChanged, proprit 10-24 ShowLines, proprit 3-43 ShowModal, mthode 6-7 ShowRoot, proprit 3-43 ShutDown 5-27 signalement dvnements 9-10 signaux 10-17 signets 18-1118-12 filtrage denregistrements 21-12 21-13 prise en charge par type densembles de donnes 18-11 Simple Object Access Protocol voir SOAP site dancrage 7-6 site Web (support Delphi) 1-3 Size, proprit champs 19-14 paramtres 18-54, 18-61 SOAP 31-1 applications multiniveaux 25-12 connexion des serveurs dapplications 25-30 connexions 25-12, 25-30 modules de donnes 25-6 socket connexions 25-29 socket, composants 32-5 socket, connexions ouverture 32-7 socket, objets clients 32-7 sockets 32-132-11 acceptation des requtes client 32-3 affectation dhtes 32-4 connexions 25-1025-11 description 32-3 criture dans 32-11 fourniture dinformations 32-4 gestion dvnements 32-8 32-10 gestion des erreurs 32-9 gestionnaire dvnement 32-11 implmentation des services 32-132-2, 32-7 lecture depuis 32-11 lecture/criture 32-1032-11 rseau, adresses 32-3, 32-4

Guide du dveloppeur

sockets client objets socket Windows 32-6 sockets serveur objets socket Windows 32-7 SoftShutDown 5-27 Sorted, proprit 3-42, 15-13 SortFieldNames, proprit 22-8 sortie, paramtres 18-59, 23-33 sources de dcision 16-10 vnements 16-10 proprits 16-10 sources de donnes 14-7, 15-3 15-5 activation 15-4 dsactivation 15-4 vnements 15-5 SourceXml, proprit 26-7 SourceXmlDocument, proprit 26-7 SourceXmlFile, proprit 26-7 souris vnements 8-258-27 souris, vnements glisser-dplacer 7-1 sous-classement des contrles Windows 40-5 sous-composants proprits 42-9 sous-menus 6-38 Spacing, proprit 3-39 SparseCols, proprit 16-10 SparseRows, proprit 16-10 SPX/IPX 20-17 SQL 14-3, 20-9 excution des commandes 17-1117-13 local 20-10 normes 24-15 standards diteur de requte de dcision 16-7 SQL Links 13-9, 20-1 dploiement 13-10, 13-17 fichiers de pilote 13-10 pilotes 20-10, 20-17, 20-35 SQL local 20-11 SQL transparent 20-34, 20-35 20-36 SQL, instructions excution 22-1022-12 SQL, proprit 18-5018-51 modification 18-56 SQLConnection, proprit 22-3, 22-20 SQLPASSTHRUMODE 20-35

Standard, page de la palette de composants 3-32 StartTransaction, mthode 17-7, 17-8 State, proprit 3-40 colonnes de grille 15-19 ensembles de donnes 18-3, 19-9 grilles 15-18, 15-21 StatusCode, proprit 28-12 StatusFilter, proprit 10-33, 20-37, 21-14, 23-7, 23-23, 24-10 StdConvs, unit 4-65, 4-67 Step, proprit 3-48 StepBy, mthode 3-48 StepIt, mthode 3-48 stockages de donnes 21-3 stored, directive 42-14 StoredProcName, proprit 18-59 StrByteType 4-48 Stretch, proprit 15-11 StretchDraw, mthode 8-5, 45-3, 45-7 string, mot rserv 4-45 type par dfaut 4-44 types de proprit 4-45 Strings, proprit 3-57 StrNextChar, fonction 10-20 Structured Query Language Voir SQL stThreadBlocking, constante 32-10 stubs objets transactionnels 39-3 Style, proprit 3-42 botes options 3-42, 15-13 botes liste 3-42 boutons outil 6-53 crayons 8-6 lments Web 25-46 pinceaux 3-51, 8-9 variants dessins par le propritaire 7-14 StyleChanged, proprit 10-24 StyleRule, proprit 25-47 styles 10-7 Styles, proprit 25-47 StylesFile, proprit 25-47 Subtotals, proprit 16-13 Supplment, page de la palette de composants 3-32 support de stockage 3-63 support dveloppeur 1-3 support technique 1-3

SupportCallbacks, proprit 25-20 Suppression de modles, bote de dialogue 6-44 suppressions en cascade 24-7 Supprimer des modles, commande (menu Concepteur) 6-42, 6-44 Supprimer une table, commande 18-47 Supprimer, commande (menu Concepteur) 6-42 surcharge mthodes 41-9, 46-3, 50-12 Suspend, mthode 9-12 Sybase, pilote dploiement 13-10 synchronisateur criture exclusive et lecture multiple 9-9 prcaution dutilisation 9-9 synchronisation dappel 39-19 39-20 synchronisation des donnes sur plusieurs fiches 15-4 Synchronize, mthode 9-5 systme daide 5-25, 47-4 fichiers 47-4 interfaces 5-26 mots cls 47-5 recensement des objets 5-31 systme de gestion de bases de donnes distant 14-3 systme, vnements 10-24 Systme, page de la palette de composants 3-32 systmes daide boutons outil 6-55 systmes de gestion de bases de donnes 25-1

T
Table , balise HTML (<TABLE>) 28-15 TableAttributes, proprit 28-20 tableau, champs 19-26, 19-29 19-30 affichage 15-26, 19-27 aplanissement 15-26 champs persistants 19-29 19-30 tableaux 42-3, 42-8 protgs 34-15 TableName, proprit 18-29, 18-45, 22-8
Index

I-43

TableOfContents 5-30 tables 18-27, 18-2918-48 affichage dans les grilles 15-19 affichage des listes 17-15 bases sur BDE recherches indexes 18-32 BDE 20-2, 20-520-9 ajout denregistrements 20-9 copie denregistrements 20-9 droits daccs 20-620-7 fermeture 20-5 liaisons 20-5 mise jour denregistrements 20-9 oprations groupes 20-820-9 suppression denregistrements 20-9 verrouillage exclusif 20-7 composants daide la dcision et 16-3 cration 18-4418-47 champs persistants 18-45 index 18-45 dbExpress 22-722-8 dfinition 18-4518-46 dfinitions de champs et dindex 18-45 prchargement 18-46 grilles non orientes donnes 3-48 imbriques 18-43 index 18-3018-43 insertion denregistrements 18-21 18-23, 18-25 lecture seule 18-44 portes 18-3518-40 recherche 18-3218-35 relations matre/ dtail 18-4018-43 spcification de la base de donnes 18-29 suppression 18-47 synchronisation 18-48 tri 18-30, 22-8 vidage 18-4718-48 tables Access transactions locales 20-36 tables dBASE accs aux donnes 20-10 DatabaseName 20-4 I-44

index 20-7 protection par mot de passe 20-2420-27 renommer 20-8 transactions locales 20-36 tables de problmes 20-60 tables en lecture seule 18-44 tables FoxPro transactions locales 20-36 tables imbriques 18-43, 19-30 19-31, 25-22 tables InterBase 20-10 tables Oracle 20-13 tables Paradox 20-4 accs aux donnes 20-10 actions groupes 20-60 DatabaseName 20-4 fichiers de contrle de rseau 20-27 protection par mot de passe 20-2420-27 rpertoires 20-2720-28 transactions locales 20-36 TableType, proprit 18-45, 20-6 TabOrder, proprit 3-24 Tabs, proprit 3-46 TabStop, proprit 3-24 TabStopChanged, proprit 10-25 TAction 6-23 TActionClientItem 6-25 TActionList 6-20, 6-21 TActionMainMenuBar 6-18, 6-20, 6-21, 6-22, 6-24 TActionManager 6-18, 6-21, 6-22 TActionToolBar 6-18, 6-20, 6-21, 6-22, 6-24 TActiveForm 38-3, 38-6 TAdapterDispatcher 29-14 TAdapterPageProducer 29-11 TADOCommand 21-2, 21-8, 21-10, 21-1921-22 TADOConnection 14-9, 17-1, 21-2, 21-321-9, 21-11 se connecter aux stockages de donnes 21-321-5 TADODataSet 21-2, 21-10, 21-1721-19 TADOQuery 21-2, 21-10 commande SQL 21-19 TADOStoredProc 21-2, 21-10 TADOTable 21-2, 21-10 Tag, proprit 19-14

TApacheApplication 27-7 TApacheRequest 27-7 TApacheResponse 27-7 TApplication 5-26, 5-33, 10-7 TApplicationEvents 6-4 TASM code 10-20 TASPObject 37-2 TBatchMove 20-5520-60 gestion derreur 20-60 TBCDField formatage par dfaut 19-18 TBDEClientDataSet 20-3 TBDEDataSet 18-2 TBevel 3-51 TBitmap 45-4 TBrush 3-51 tbsCheck, constante 6-53 TCalendar 50-1 TCanvas utilisation 3-61 TCGIApplication 27-7 TCGIRequest 27-7 TCGIResponse 27-7 TCharProperty, type 47-8 TClassProperty, type 47-8 TClientDataSet 5-21, 23-22 TClientSocket 32-6 TColorProperty, type 47-8 TComObject agrgation 4-26 TComponent 3-13, 3-16, 40-5 TComponentProperty, type 47-8 TControl 3-18, 3-20, 40-4, 43-5, 43-6 vnements communs 3-22 proprits communes 3-20 TConvType, valeurs 4-65 TConvTypeInfo 4-69 TCoolBand 3-41 TCoolBar 6-48 TCorbaConnection 25-31 TCorbaDataModule 25-6 TCP/IP 20-17, 32-1 applications multiniveaux 25-1025-11 clients 32-6 connexion au serveur dapplications 25-29 serveurs 32-7 TCurrencyField formatage par dfaut 19-18 TCustomADODataSet 18-2 TCustomClientDataSet 18-2

Guide du dveloppeur

TCustomContentProducer 28-14 TCustomControl 40-4 TCustomEdit 10-9 TCustomGrid 50-1, 50-2 TCustomIniFile 3-59 TCustomizeDlg 6-24 TCustomListBox 40-4 TCustomVariantType 4-314-39 TDatabase 14-9, 17-1, 20-3, 20-1420-18 instances temporaires 20-23 interruption 20-23 proprit DatabaseName 20-3 TDataSet 18-1 descendants 18-218-3 TDataSetProvider 24-1, 24-2 TDataSetTableProducer 28-21 TDataSource 15-315-5 TDateField formatage par dfaut 19-18 TDateTime, type 50-6 TDateTimeField formatage par dfaut 19-18 TDBChart 14-18 TDBCheckBox 15-2, 15-15 15-16 TDBComboBox 15-2, 15-12, 15-1215-13 TDBCtrlGrid 15-3, 15-3215-33 proprits 15-33 TDBEdit 15-2, 15-915-10 TDBGrid 15-2, 15-1815-32 vnements 15-31 proprits 15-23 TDBGridColumns 15-18 TDBImage 15-2, 15-11 TDBListBox 15-2, 15-12, 15-12 15-13 TDBLookupComboBox 15-3, 15-12, 15-1315-15 TDBLookupListBox 15-3, 15-12, 15-1315-15 TDBMemo 15-2, 15-10 TDBNavigator 15-2, 15-33 15-36, 18-6, 18-7 TDBRadioGroup 15-3, 15-16 15-17 TDBRichEdit 15-3, 15-11 TDBText 15-2, 15-9 TDCOMConnection 25-28 TDecisionCube 16-1, 16-5, 16-7 vnements 16-8 TDecisionDrawState 16-14

TDecisionGraph 16-1, 16-2, 16-14 instanciation 16-14 TDecisionGrid 16-1, 16-2, 16-11 vnements 16-14 instanciation 16-11 proprits 16-13 TDecisionPivot 16-1, 16-2, 16-3, 16-1016-11 proprits 16-11 TDecisionQuery 16-1 TDecisionQuery, composant 16-5, 16-6 TDecisionSource 16-1, 16-10 vnements 16-10 proprits 16-10 TDefaultEditor 47-17 TDependency_object 5-8 TDragObject 7-3, 7-4 TDragObjectEx 7-4 technologie MSI 13-4 TEnumProperty, type 47-8 termes du contrat de licence logicielle 13-16 Terminate, mthode 9-6 Terminated, proprit 9-6 test composants 40-14, 40-15 valeurs 42-7 tests composants 52-6 TEvent 9-10 Text, proprit 3-35, 3-42, 3-48 texte contrles dessins par le propritaire 7-13 copier, couper, coller 7-10 dans les contrles 7-7 impression 3-36 internationalisation 12-9 lecture de la droite vers la gauche 12-6 rechercher 3-36 slection 7-9, 7-10 suppression 7-11 travail sur le texte 7-77-13 texte statique 3-47 TextHeight, mthode 8-5, 45-3 TextOut, mthode 8-5, 45-3 TextRect, mthode 8-5, 45-3 TextWidth, mthode 8-5, 45-3 TField 18-2, 19-119-32 vnements 19-18 mthodes 19-19 proprits 19-2, 19-1319-18

excution 19-15 TFieldDataLink 51-5 TFiler 4-60 TFileStream 3-63, 4-60 E/S de fichier 4-604-64 TFloatField formatage par dfaut 19-18 TFloatProperty, type 47-8 TFMTBcdField formatage par dfaut 19-18 TFontNameProperty, type 47-8 TFontProperty, type 47-8 TForm proprits des barres de dfilement 3-36 TForm, composant 3-6 TFrame 6-15 TGraphic 45-4 TGraphicControl 40-4, 49-2 THeaderControl 3-46 thread neutre 36-9 thread VCL principal 9-4 OnTerminate, vnement 9-7 Thread, bote dtat 9-13 thread, fonction 9-4 thread, objets 9-2 dfinition 9-2 limites 9-2 ThreadID, proprit 9-13 threads 9-19-13 activits 39-19 arrt 9-6, 9-12 attente dvnements 9-10 attente de 9-10 BDE et 20-14 blocage de lexcution 9-8 boucle des messages et 9-5 composants daccs aux donnes 9-5 coordination 9-4, 9-79-11 cration 9-12 espace de processus 9-4 viter les accs simultans 9-8 exceptions 9-6 excution 9-12 graphiques, objets 9-5 identificateurs 9-13 initialisation 9-3 ISAPI/NSAPI, programmes 28-3, 28-19 libration 9-3, 9-4 limites du nombre de 9-12 priorits 9-1, 9-3 redfinition 9-12 I-45

Index

renvoi de valeurs 9-10 sections critiques 9-8 utilisation de listes 9-5 VCL, thread 9-4 verrouillage des objets 9-8 threads de service 5-6 threads en suspens 9-12 threads multiples attente de 9-10 threadvar 9-6 THTMLTableAttributes 28-20 THTMLTableColumn 28-21 THTTPRio 31-10 THTTPSoapDispatcher 31-2, 31-3 THTTPSOAPPascalInvoker 31-3 THTTPSoapPascalInvoker 31-2 TIBCustomDataSet 18-2 TIBDatabase 14-10, 17-1 TickMarks, proprit 3-37 TickStyle, proprit 3-37 TIcon 45-4 TImage dans les cadres 6-17 TImageList 6-52 timers 3-26 TIniFile 3-59 TIntegerProperty, type 47-8, 47-10 TInterfacedObject 4-26 drivation de 4-23 implmentation de IInterface 4-22 liaison dynamique 4-23 TInvokableClass 31-6 TInvokeableVariantType 4-41 4-42 TISAPIApplication 27-7 TISAPIRequest 27-7 TISAPIResponse 27-7 Title, proprit grilles de donnes 15-24 TKeyPressEvent, type 43-4 TLabel 3-47, 40-4 .TLB, fichiers 33-17, 34-3 TLIBIMP 33-19, 35-6, 36-16 tlibimp.exe 35-2 TListBox 40-3 TLocalConnection 23-30 TMainMenu 6-21 TMemIniFile 3-59, 10-9 TMemoryStream 3-63 TMessage 46-4, 46-6 TMetafile 45-4 TMethodProperty, type 47-8 I-46

TMsg 6-6 TMTSDataModule 25-6 TMultiReadExclusiveWriteSync hronizer 9-9 TNestedDataSet 18-43 TNotifyEvent 43-8 TObject 3-13, 4-1, 41-4 ToCommon 4-69 ToggleButton 10-9 TOleContainer 35-1735-18 documents Active 33-14 TOleControl 35-6, 35-7 TOleServer 35-6 Top, proprit 3-20, 3-23, 3-24, 6-4, 6-49 TopRow, proprit 3-49 TOrdinalProperty, type 47-8 touches daccs rapide 3-37 TPageControl 3-46 TPageDispatcher 29-14 TPageProducer 28-14 TPaintBox 3-51 TPanel 3-45, 6-48 tpHigher, constante 9-3 tpHighest, constante 9-3 TPicture, type 45-4 tpIdle, constante 9-3 tpLower, constante 9-3 tpLowest, constante 9-3 tpNormal, constante 9-3 TPopupMenu 6-55 TPrinter 3-61 utilisation 3-61 TPropertyAttributes 47-12 TPropertyEditor, classe 47-7 TPropertyPage 38-13 tpTimeCritical, constante 9-3 TPublishableVariantType 4-42 TQuery 20-2, 20-920-12 ensembles de donnes de dcision et 16-6 TQueryTableProducer 28-22 traduction 12-9 outils 12-1 traduction des chanes de caractres 12-2, 12-9, 12-11 conversions sur 2 octets 12-3 traitement distribu des donnes 25-2 transaction, param tres niveau disolement 17-11 transactions 14-514-6, 17-6 17-11 achvement 17-917-10 ADO 21-721-8, 21-9

conservation des annulations 21-7 conservation des validations 21-7 annulation 17-917-10 application des mises jour 17-7, 25-21 applications multiniveaux 25-21 atomicit 14-5 automatiques 39-13 BDE 20-3420-36 contrle 20-3420-36 implicites 20-34 cohrence 14-5 composes de plusieurs objets 39-10 contrles par le client 39-13 contrles par le serveur 39-13, 39-14 contrler 39-13 dlai maximum 39-15, 39-23 dmarrage 17-717-8 durabilit 14-5 IAppServer 25-21 imbriques 17-7 validation 17-9 isolation 14-5 isolement niveaux 17-1017-11 locales 20-36 mises jour en mmoire cache 20-39 modules de donnes MTS 25-17 modules de donnes transactionnels 25-8, 25-21 MTS et COM+ 39-939-15 objets transactionnels 39-5 se chevauchant 17-8 sur plusieurs bases de donnes 39-9 tables locales 17-7 terminer 39-1239-13 transaction, composants 17-8 utilisation de commandes SQL 17-6, 20-35 validation 17-9 transactions locales 20-36 transfert services Web 31-5 transfert denregistrements 52-2 TransformGetData, proprit 26-10 TransformRead, proprit 26-9

Guide du dveloppeur

TransformSetParams, proprit 26-11 TransformWrite, proprit 26-9 TransIsolation, proprit 17-11 transactions locales 20-36 Transliterate, proprit 19-14, 20-56 transparence des barres doutils 6-52, 6-54 Transparent, proprit 3-47 TReader 4-60 TRegIniFile 10-9 TRegistry 3-59 TRegistryIniFile 3-59 TRegSvr 13-5, 33-19 TRemotable 31-5 TRemoteDataModule 25-6 triangles 8-12 try, mot rserv 45-7, 52-5 TScrollBox 3-36, 3-45 TSearchRec 4-56 TService_object 5-8 TSession 20-1820-34 ajout 20-31, 20-32 TSetElementProperty, type 47-8 TSetProperty, type 47-8 TSharedConnection 25-35 TSoapDataModule 25-6 TSocketConnection 25-29 TSpinEdit, contrle 3-37 TSQLClientDataSet 22-2 TSQLConnection 14-10, 17-1, 22-322-6 contrle des messages 22-20 liaison 22-322-6 TSQLDataSet 22-2, 22-7, 22-8 TSQLMonitor 22-20 TSQLQuery 22-2, 22-7 TSQLStoredProc 22-2, 22-8 TSQLTable 22-2, 22-8 TSQLTimeStampField formatage par dfaut 19-18 TStoredProc 20-3, 20-1320-14 TStream 3-63 TStringList 3-543-59, 5-28 TStringProperty, type 47-8 TStrings 3-543-59 TStringStream 3-63 TTabControl 3-46 TTable 20-2, 20-520-9 ensembles de donnes de dcision et 16-6 TTcpServer 32-7 TThread 9-2 TThreadList 9-5, 9-8

TTimeField formatage par dfaut 19-18 TToolBar 6-21, 6-48, 6-51 TToolButton 6-48 TTreeView 3-43 TTypedComObject bibliothques de types ncessaires 33-17 TUpdateSQL 20-45 fournisseurs et 20-12 turboboutons 3-39 affectation de glyphes 6-50 ajout aux barres doutils 6-51 centrage 6-49 tat initial, dfinition 6-50 gestionnaires dvnements 8-14 modes de fonctionnement 6-49 pour les outils de dessin 8-14 regroupement 6-51 utilisation comme bascules 6-51 tutoriel WebSnap 29-20 TVarData, enregistrement 4-30 TWebActionItem 28-3 TWebAppDataModule 29-5 TWebApplication 27-6 TWebAppPageModule 29-5 TWebConnection 25-30 TWebContext 29-13 TWebDataModule 29-5, 29-8 TWebDispatcher 29-14, 29-18 TWebPageModule 29-5, 29-8 TWebRequest 27-6 TWebResponse 27-6, 28-3 TWidgetControl 10-7 TWinCGIRequest 27-7 TWinCGIResponse 27-7 TWinControl 3-19, 10-7, 12-9, 40-4, 43-5 vnements communs 3-25 proprits communes 3-23 TWriter 4-60 TWSDLHTMLPublish 31-8 TXMLDocument 30-330-4, 30-9 TXMLTransform 26-726-9 documents source 26-7 TXMLTransformClient 26-10 26-12 paramtres 26-10 TXMLTransformProvider 24-1, 24-2, 26-926-10

type de terminal 10-17 type, mot rserv 8-13 typeinfo 34-1 types bibliothques de types 34-1334-15 Char 12-3 dfinis par lutilisateur 49-3 enregistrement de message 46-6 ensemble 42-2 numrs 42-2, 49-3 dclaration 8-13 gestionnaires dvnements 43-3 modules Web 29-5 proprits 42-2, 42-9, 47-9 services Web 31-531-6 simples 42-2 types caractre 4-43, 12-3 types compatibles Automation 36-1736-18 types de champs conversion 19-2119-22 surcharge 19-18 types de donnes champs persistants 19-7 types num rs diteur de bibliothques de types 34-11, 34-19, 34-26

U
UDP, protocole 32-1 un--plusieurs, relations 18-41, 22-13 UnaryOp, mthode 4-36 UndoLastChange, mthode 23-7 Unicode, caractres 4-43, 12-4 chanes 4-45, 4-47 UniDirectional, proprit 18-58 unions diteur de bibliothques de types 34-1134-12, 34-20, 34-27 unit de base 4-65, 4-67 units accs depuis dautres units 3-10 ajout de composants 40-12 existantes ajout de composants 40-12 inclusion de paquets 11-4 units de conversion 4-65 units de mesure 4-66 units de temprature 4-67
Index

I-47

Unlock, mthode 9-8 UnlockList, mthode 9-8 UnregisterPooled, procdure 25-9 UnRegisterTypeLib, fonction dsinstallation des bibliothques de dsinstallation 33-18 UPDATE, instruction 20-46, 20-50 UPDATE, instructions 24-11 UpdateBatch, mthode 10-33, 21-14, 21-15 UpdateCalendar, mthode 51-4 UpdateMode, proprit 24-11 ensembles de donnes client 23-26 UpdateObject, mthode 38-14, 38-15 UpdateObject, proprit 20-12, 20-37, 20-46, 20-51 UpdatePropertyPage, mthode 38-14 UpdateRecordTypes, proprit 10-33, 20-37, 23-23 UpdatesPending, proprit 10-33, 20-37 UpdateStatus, proprit 10-33, 20-37, 21-14, 23-23, 24-10 UpdateTarget, mthode 6-32 URI URL ou 27-4 URL 27-3 bibliothques javascript 25-40, 25-41 connexions SOAP 25-31 connexions Web 25-30 IP, adresses 32-4 noms dhte 32-4 URI ou 27-4 Web, navigateurs 27-5 URL, proprit 25-30, 25-31, 28-10, 31-10 USEPACKAGE, macro 11-8 uses, clause 3-10 ajout de modules de donnes 5-21 viter les rfrences circulaires 6-3 inclusion de paquets 11-4 UTF-8 jeu de caractres 10-20 utilisateur, interfaces enregistrement unique 15-8 isolation 14-7 I-48

plusieurs enregistrements 15-17 Utiliser lunit, commande 5-21, 6-2 utilitaire dadministration BDE 20-16, 20-63 utilitaire make 10-17 utilitaires de conversion 4-64

V
$V, directive de compilation 4-55 valeurs 42-2 boolennes 42-2, 42-13 default, proprit 42-13 donnes par dfaut 15-12 proprit par dfaut 42-7 redfinition 48-2, 48-3 test 42-7 valeurs boolennes 51-4 valeurs de rfrence 15-21 valeurs des axes 16-16 valeurs logiques 15-2, 15-15 valeurs null portes 18-37 valeurs rcapitulatives 16-21 agrgats maintenus 23-16 graphes de dcision 16-16 rfrences croises 16-3 validation des saisies de donnes 19-19 validation en deux phases 25-21 Value, proprit agrgats 23-16 champs 19-20 paramtres 18-53, 18-54, 18-61, 18-62 ValueChecked, proprit 15-15 Values, proprit groupes radio 15-16 ValueUnchecked, proprit 15-15, 15-16 var, mot rserv gestionnaires dvnements 43-3 variables dclaration exemple 3-11 et objets 3-11 objet 3-11 variables locales aux threads 9-6 OnTerminate, vnement 9-7 variables objet 3-11 variants personnaliss 4-294-42

variants personnaliss 4-29 4-42 activation 4-39 chargement et enregistrement des valeurs 4-384-39 copie 4-37 cration 4-29, 4-314-39 criture dutilitaires 4-39 4-40 effacement 4-374-38 mmoire 4-37 mthodes 4-404-42 oprateurs de comparaison 4-354-36 oprateurs unaires 4-364-37 oprations binaires 4-33 4-35 proprits 4-404-42 stockage des donnes 4-30 4-31, 4-34, 4-37 transtypage 4-314-33, 4-34, 4-40 VCL 40-140-2 branche TComponent 3-16 branche TControl 3-18 branche TObject 3-15 branche TPersistent 3-16 branche TWinControl 3-19 objets 3-1 portage dapplications 10-3 10-18 prsentation 3-13-25 thread principal 9-4 VCL30, paquet PENWIN.DLL 11-12 VCL30, paquets 11-1 VCL40, paquet 11-10 vcl60.bpl 13-6 VendorLib, proprit 22-4 verrouillage des objets imbrication des appels 9-8 threads 9-8 verrouillage exclusif tables 20-7 VertScrollBar 3-36 vido analogique 8-34 violations daccs chanes 4-50 violations dintgrit 20-60 violations de cls 20-60 virtual directive 41-9 tables de mthode 41-9 virtuelles

Guide du dveloppeur

mthodes 41-8, 44-4 diteurs de proprits 47-9 proprits comme 42-2 visibilit 3-10 Visible, proprit 3-3 barres doutils 6-55 barres multiples 6-55 champs 19-14 menus 6-46 VisibleButtons, proprit 15-34, 15-35 VisibleChanged, proprit 10-25 VisibleColCount, proprit 3-49 VisibleRowCount, proprit 3-49 VisiBroker ORB 25-15 VisualCLX 10-6 visualiseurs daide 5-25 VisualSpeller Control 13-5 volets 3-38 ajout de turboboutons 6-49 aligns sur le haut de la fiche 6-49 biseauts 3-51 redimensionnement 3-38 turboboutons 3-39 volets biseauts 3-51 vtable 33-5 vtables classes crateur 35-6, 35-14 composants enveloppe 35-7 dispinterfaces 34-11 interfaces doubles 36-14 pointeur dinterface COM 33-5 vues arborescentes 3-43

W
W3C 30-2 WaitFor, mthode 9-10, 9-11 WantReturns, proprit 3-35 WantTabs, proprit 3-35 contrles mmo orients donnes 15-10 contrles orients donnes de texte format 15-11 .WAV, fichiers 8-35 wchar_t widechar 10-25 $WEAKPACKAGEUNIT, directive de compilation 11-11 Web modules de donnes 29-3 serveurs 27-127-10

Web Service Definition Language voir WSDL Web, applications ASP 33-13 dploiement 13-11 Web, connexions 25-30 Web, dploiement applications multiniveaux 25-38 Web, modules ajout de sessions de base de donnes 28-19 DLL et, prcaution 28-3 Web, navigateurs 27-4 URL 27-5 Web, pages 27-4 Web, rpartiteur gestion des requtes 28-3, 28-9 slection dlments daction 28-6, 28-7 Web, serveurs 25-38 client, requtes et 27-5 WebContext 29-13 WebDispatch, proprit 25-43 WebPageItems, proprit 25-45 WebSnap 27-127-2 tutoriel 29-20 WideChar 4-43, 4-45 widechar 10-25 widestrings 10-25 widget Qt 10-15 WidgetDestroyed, proprit 10-25 widgets 3-19, 10-7, 10-25 Width, proprit 3-20, 3-48, 6-4 colonnes de grille de donnes 15-19 crayons 8-6 grilles de donnes 15-24 TScreen 13-14 Win 3.1, page de la palette de composants 3-33 WIN32 10-21 Win32, page de la palette de composants 3-32 WIN64 10-21 Win-CGI, programmes 27-5, 27-6, 27-7 INI, fichiers 27-7 Windows botes de dialogue standard 52-2 cration 52-2 excution 52-4

contextes de priphriques 40-8, 45-1 contrles, sous-classement 40-5 fonctions API 40-4, 45-1 GDI (Graphics Device Interface) 8-1 messages 10-19 portage dapplications 10-3 10-18 support de la largeur du crayon 8-7 Windows NT dbogage dapplications serveur Web 27-10 wininet.dll 25-30, 25-31 WM_APP, constante 46-6 WM_KEYDOWN, message 51-9 WM_LBUTTONBUTTON, message 51-9 WM_MBUTTONDOWN, message 51-9 WM_PAINT, message 46-4 WM_PAINT, messages 8-2 WM_RBUTTONDOWN, message 51-9 WM_SIZE, message 50-4 WndProc, mthode 46-5 WordWrap, proprit 3-35, 7-8, 48-1 contrles mmo orients donnes 15-10 wParam, paramtre 46-2 Wrap, proprit 6-52 Wrapable, proprit 6-52 Write, mthode TFileStream 4-62 write, mthode 42-7 write, mot rserv 42-9, 49-4 WriteBuffer, mthode TFileStream 4-62 WSDL 31-2 fichiers 31-8 importer 31-931-10 publier 31-831-9

X
$X, directive de compilation 4-55 XDR, fichier 30-2 Xerox Network System (XNS) 32-1 .xfm, fichiers 10-2 fichiers .xfm 3-8 XML 25-4225-44, 26-1, 30-1
Index

I-49

analyseurs 30-2 applications de bases de donnes 26-126-12 dclaration de type de document 30-2 mappages 26-226-4 dfinition 26-4 schma 30-2 SOAP 31-1 traitement des instructions 30-1

XML Schema Data file Voir XSD, fichier XML, courtiers 25-39 messages HTTP 25-43 XMLBroker, proprit 25-46 XMLDataFile, proprit 24-3, 26-9 XMLDataSetField, proprit 25-46 XMLMapper 26-2, 26-426-7 XSD, fichier 30-2

Y
Year, proprit 50-6

Z
-Z, directive de compilation 11-13 zro terminal chanes tendues 4-45

I-50

Guide du dveloppeur

You might also like