Vous êtes sur la page 1sur 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 TADOCo